mysqldump基于docker容器实现数据库备份与恢复

3,041 阅读2分钟
数据备份与还原

mysqldump基于docker容器实现数据库备份与恢复

环境描述:
mydb 源数据库容器
myddb2 新数据库容器
创建源数据库容器
docker run --name mydb -p 3333:3306 -e MYSQL_ROOT_PASSWORD=123 -v /data/mydb/data:/var/lib/mysql -v /data/mydb/conf/my.cnf:/etc/my.cnf  --privileged=true -d mariadb
创建新数据库容器
docker run --name mydb -p 3334:3306 -e MYSQL_ROOT_PASSWORD=123 -v /data/mydb2/data:/var/lib/mysql -v /data/mydb2/conf/my.cnf:/etc/my.cnf  --privileged=true -d mariadb
源数据库中添加数据(现实环境不需要)
docker cp hellodb_innodb.sql mydb:/  	#hellodb_innodb.sql 一个sql语句文件
进入源数据库
docker exec -it mydb bash
mysql -uroot -p< hellodb_innodb.sql	#导入数据
#查看二进制日志状态
show global variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON 	|
+---------------+-------+
备份源库数据
# mysqldump -uroot -p --all-databases --lock-all-tables --master-data=2 > /all.sql
Enter password: 123

#--lock-all-tables表示锁表操作,保证备份期间无数据变动
#--master-data=2将备份时的二进制日志进行表示为注释语句添加至all.sql中
查看备份开始的二进制日志文件是哪个
因为docker容器中不方便查看all.sql文件,所以拷贝all.sql到宿主机环境
~]# pwd
/root
# docker cp mydb:/all.sql .
# less all.sql 
......
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=8960;
......
将这些sql操作导出至增量文件
# mysqlbinlog --start-position=8960 /var/lib/mysql/mysql-bin.000003 > incre.sql
# 结合二进制日志还原到时间点当前这一刻时需要使用
#增量文件incre.sql复制到宿主机(也可以尝试mydb容器复制到mydb2容器)
~]# pwd
/root
# docker cp incre.sql mydb2:/	#复制到宿主机,还原数据需要使用
将源库修改写入磁盘
> INSERT INTO students (Name,Age,Gender,ClassID,TeacherID) VALUES('foo',173,'M',3,7);
> flush privileges;

==========================数据备份完成===================================

数据还原到新数据库
将备份的.sql文件拷贝至新数据库
# docker cp incre.sql mydb2:/
# docker exec -it mydb2 bash
关闭二进制日志
> set sql_bin_log=off;
# session层面关闭二进制日志,减少还原操作IO负担
# 注意mysql用户需要对all.sql有读取权限
导入备份的sql文件
> source /all.sql;  # 此时的数据仅仅为备份点时的数据
结合二进制日志还原到时间点当前这一刻
mysqlbinlog --start-position=8960 /var/lib/mysql/mysql-bin.000003 > incre.sql

===========================数据还原完成===================================