docker容器中如何备份mysql,基础环境:MySQL8.0.19、Xtrabackup80_8.0.13、Docker18.09.9、Centos7
全量备份是备份全部数据: 备份过程时间长,占用空间大(对数据库的第一次更新一定要采用全量备份,后续的备份就可以采用增量备份); 增量备份是只备份变化的那部分数据: 备份时间短,占用空间小(比如一周做一次全量备份,一天做一次增量备份)。
安装MySQL
拉取镜像
docker pull mysql8-xtrabackup:1.0.0
注:mysql8-xtrabackup镜像为自己构建的镜像
启动容器
#创建目录 mkdir -p /home/lemon/mysql8/conf mkdir -p /home/lemon/mysql8/log mkdir -p /home/lemon/mysql8/data mkdir -p /home/lemon/backup #启动mysql docker run -p 3306:3306 --name lemon-mysql8 \ -v /home/lemon/mysql8/conf:/etc/mysql/conf.d \ -v /home/lemon/mysql8/log:/var/log/mysql \ -v /home/lemon/mysql8/data:/var/lib/mysql \ -v /home/lemon/backup:/var/mysql/backup \ -v /etc/localtime:/etc/localtime:ro \ -e MYSQL_ROOT_PASSWORD=1qazse4 -d mysql8-xtrabackup:1.0.0 \ --lower_case_table_names=1 --skip-name-resolve
注:/home/lemon/backup:/var/mysql/backup 备份文件存放位置
全量
备份
- 进入容器
docker exec -it lemon-mysql8 /bin/bash 或者docker exec -it -u root lemon-mysql8 /bin/bash
- 备份命令
xtrabackup \ --user=root \ --port=3306 \ --password=1qazse4 \ --backup \ --target-dir=/var/mysql/backup/all \ --datadir=/var/lib/mysql
注:target-dir: 备份文件存放位置; datadir: mysql的data地址
恢复
先执行prepare才能进行恢复
xtrabackup --prepare --target-dir=/var/mysql/backup/all
注:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据 文件仍处理不一致状态。
删除目标数据库data下的所有文件
rm -rf /var/lib/mysql/*
注:如果不请空,会恢复失败,提醒Original data directory /var/lib/mysql is not empty!
将数据拷贝到目标数据库目录下
xtrabackup --copy-back --target-dir=/var/mysql/backup/all --datadir=/var/lib/mysql
重启MySQL
docker restart lemon-mysql8
增量
备份
- 命令
xtrabackup \ --host=192.168.0.151 --user=root --port=3306 --password=1qazse4 \ --backup \ --target-dir=/var/mysql/backup/incremental \ --incremental-basedir=/var/mysql/backup/all
注:target-dir:增量备份地址 incremental-basedir:上一次全量备份地址
恢复
准备上一次全量备份,需要执行–prepare,防止回滚阶段
xtrabackup --prepare --apply-log-only --target-dir=/var/mysql/backup/all
还原第一个增量备份
xtrabackup --prepare --apply-log-only --target-dir=/var/mysql/backup/all \ --incremental-dir=/var/mysql/backup/incremental
还原最后一个增量备份
xtrabackup --prepare --target-dir=/var/mysql/backup/all \ --incremental-dir=/var/mysql/backup/incremental
注:--apply-log-only除最后一个以外的所有增量应使用
删除目标数据库data下的所有文件
rm -rf /var/lib/mysql/*
恢复(同全量备份恢复)
xtrabackup --copy-back --target-dir=/var/mysql/backup/all --datadir=/var/lib/mysql
重启MySQL
docker restart lemon-mysql8
自动备份脚本
配置文件
- backup.cnf
#mysql配置信息 mysql_host= mysql_port=3306 mysql_user=root mysql_password=hunanhuamei123 #数据库data目录 mysql_data_path=/var/lib/mysql #全量备份数据存放目录 full_backup_path=/var/mysql/backup/full/ #最后一次全量备份坐标文件名称 full_back_last_index_file=last.pid #增量备份数据存放目录 inc_backup_path=/var/mysql/backup/inc/
全量备份脚本
执行备份脚本
docker exec -it -u root lemon-mysql8 /bin/bash -c “cd /var/mysql/backup && ./full_backup.sh”
全量备份定时任务
auto_full_backup.sh全量备份定时任务脚本
docker exec -i -u root lemon-mysql8 /bin/bash -c "cd /var/mysql/backup && ./full_backup.sh"
注:docker exec -i (去掉-t)因为-t是指分配一个伪终端。这里不需要分配伪终端。
定时任务
每周日的23:30点执行全量备份:30 23 * * 0 /home/auto_full_backup.sh注:*/1 * * * * /home/auto_full_backup.sh >> /home/auto_full_backup.log 2>&1每分钟执行一次,验证是否正常运行
增量备份脚本
执行命令
docker exec -it -u root lemon-mysql8 /bin/bash -c “cd /var/mysql/backup && ./inc_backup.sh”
增量备份定时任务
auto_inc_backup.sh增量备份定时任务脚本
docker exec -i -u root lemon-mysql8 /bin/bash -c "cd /var/mysql/backup && ./inc_backup.sh"
定时任务
每天的23:00点执行增量备份:0 23 * * * /home/auto_full_backup.sh注:增量备份是基于全量备份,所以必须先有全量备份,第一次手动全量备份或者在设置定时任务时时间上注意下
补充
- –prepare增量备份的步骤与完全备份的步骤不同。在完全备份中,执行两种类型的操作以使数据库保持一致:已提交的事务相对于数据文件从日志文件中重放,未提交的事务被回滚。在准备增量备份时,必须跳过未提交事务的回滚,因为在备份时未提交的事务可能正在进行中,并且很有可能将在下一次增量备份中提交。您应该使用该 –apply-log-only选项来防止回滚阶段。
- Percona XtraBackup不支持使用相同的增量备份目录来准备备份的两个副本。不要–prepare使用相同的增量备份目录(–incremental-dir的值)运行超过一次。