lemon
文章6
标签4
分类4
Docker中MySQL8备份(Xtrabackup8)

Docker中MySQL8备份(Xtrabackup8)

docker容器中如何备份mysql,基础环境:MySQL8.0.19、Xtrabackup80_8.0.13、Docker18.09.9、Centos7

全量备份是备份全部数据: 备份过程时间长,占用空间大(对数据库的第一次更新一定要采用全量备份,后续的备份就可以采用增量备份); 增量备份是只备份变化的那部分数据: 备份时间短,占用空间小(比如一周做一次全量备份,一天做一次增量备份)。

安装MySQL

  1. 拉取镜像

    docker pull mysql8-xtrabackup:1.0.0

    注:mysql8-xtrabackup镜像为自己构建的镜像

  2. 启动容器

    #创建目录
    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 备份文件存放位置

全量

备份

  1. 进入容器
    docker exec -it lemon-mysql8 /bin/bash  或者docker exec -it -u root lemon-mysql8 /bin/bash
  2. 备份命令
    xtrabackup \
    --user=root \
    --port=3306 \
    --password=1qazse4 \
    --backup \
    --target-dir=/var/mysql/backup/all \
    --datadir=/var/lib/mysql

    注:target-dir: 备份文件存放位置; datadir: mysql的data地址

恢复

  1. 先执行prepare才能进行恢复

    xtrabackup --prepare --target-dir=/var/mysql/backup/all

    注:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据 文件仍处理不一致状态。

  2. 删除目标数据库data下的所有文件

    rm -rf /var/lib/mysql/*

    注:如果不请空,会恢复失败,提醒Original data directory /var/lib/mysql is not empty!

  3. 将数据拷贝到目标数据库目录下

    xtrabackup --copy-back --target-dir=/var/mysql/backup/all --datadir=/var/lib/mysql
  4. 重启MySQL

    docker restart lemon-mysql8

增量

备份

  1. 命令
    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:上一次全量备份地址

恢复

  1. 准备上一次全量备份,需要执行–prepare,防止回滚阶段

    xtrabackup --prepare --apply-log-only --target-dir=/var/mysql/backup/all
  2. 还原第一个增量备份

    xtrabackup --prepare --apply-log-only --target-dir=/var/mysql/backup/all \
    --incremental-dir=/var/mysql/backup/incremental
  3. 还原最后一个增量备份

    xtrabackup --prepare --target-dir=/var/mysql/backup/all \
    --incremental-dir=/var/mysql/backup/incremental

    注:--apply-log-only除最后一个以外的所有增量应使用

  4. 删除目标数据库data下的所有文件

    rm -rf /var/lib/mysql/*
  5. 恢复(同全量备份恢复)

    xtrabackup --copy-back --target-dir=/var/mysql/backup/all --datadir=/var/lib/mysql
  6. 重启MySQL

    docker restart lemon-mysql8

自动备份脚本

配置文件

  1. 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/

全量备份脚本

  1. full_backup.sh全量备份脚本

  2. 执行备份脚本
    docker exec -it -u root lemon-mysql8 /bin/bash -c “cd /var/mysql/backup && ./full_backup.sh”

全量备份定时任务

  1. 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是指分配一个伪终端。这里不需要分配伪终端。

  2. 定时任务
    每周日的23:30点执行全量备份:30 23 * * 0 /home/auto_full_backup.sh

    注:*/1 * * * * /home/auto_full_backup.sh >> /home/auto_full_backup.log 2>&1每分钟执行一次,验证是否正常运行

增量备份脚本

  1. inc_backup.sh增量备份脚本

  2. 执行命令
    docker exec -it -u root lemon-mysql8 /bin/bash -c “cd /var/mysql/backup && ./inc_backup.sh”

增量备份定时任务

  1. auto_inc_backup.sh增量备份定时任务脚本

    docker exec -i -u root lemon-mysql8 /bin/bash -c "cd /var/mysql/backup && ./inc_backup.sh"
  2. 定时任务
    每天的23:00点执行增量备份:0 23 * * * /home/auto_full_backup.sh

    注:增量备份是基于全量备份,所以必须先有全量备份,第一次手动全量备份或者在设置定时任务时时间上注意下

补充

  1. –prepare增量备份的步骤与完全备份的步骤不同。在完全备份中,执行两种类型的操作以使数据库保持一致:已提交的事务相对于数据文件从日志文件中重放,未提交的事务被回滚。在准备增量备份时,必须跳过未提交事务的回滚,因为在备份时未提交的事务可能正在进行中,并且很有可能将在下一次增量备份中提交。您应该使用该 –apply-log-only选项来防止回滚阶段。
  2. Percona XtraBackup不支持使用相同的增量备份目录来准备备份的两个副本。不要–prepare使用相同的增量备份目录(–incremental-dir的值)运行超过一次。

参考

Percona XtraBackup 官方文档