1. percona-xtrabackup官网

  https://docs.percona.com/percona-xtrabackup/8.0/

  需要特别注意percona-xtrabackup版本支持的mysql版本,选择不同的版本来处理,如percona-xtrabackup2.4不支持mysql8.0之后的版本

 

 

 

 

2. 生产环境mysql(8.0.27)docker安装,所以percona-xtrabackup也使用docker进行启动备份

  2.1.  docker pull percona-xtrabackup

  2.2.  docker inspect percona-xtrabackup

    

   xtrabackup 备份mysql8.0以下需要选择对应的版本,8.0以上向下兼容

   --no-server-version-check参数不进行版本校验

  常用参数:

   --user=USER #指定备份用户,不指定的话为当前系统用户
   --password=PASSWD #指定备份用户密码
   --port=PORT #指定数据库端口
   --defaults-group=GROUP-NAME #在多实例的时候使用
   --host=HOST #指定备份的主机,可以为远程数据库服务器
   --apply-log #回滚日志
   --database #指定需要备份的数据库,多个数据库之间以空格分开
   --defaults-file #指定mysql的配置文件
   --copy-back #将备份数据复制回原始位置
   --incremental #增量备份,后面跟要增量备份的路径
   --incremental-basedir=DIRECTORY #增量备份时使用指向上一次的增量备份所在的目录
   --incremental-dir=DIRECTORY #增量备份还原的时候用来合并增量备份到全量,用来指定全备路径
   --redo-only #对增量备份进行合并
   --rsync #加快本地文件传输,适用于non-InnoDB数据库引擎。不与--stream共用
   --safe-slave-backup
   --no-timestamp #生成的备份文件不以时间戳为目录.

3. 全量备份,有两种启动方式(docker使用percona-xtrabackup不要使用--restart参数,因为不需要保持启动状态,如果使用--restart参数启动容器,会报错xtraback-logfile已存在)

  3.1.  docker create方式

    docker create --name xtraBackup \

          -e TZ=Asia/Shanghai \

          --network host \
          --volumes-from mgrNode1\
          -v /home/workspace/xtraBackup/backup:/backup \
          percona/percona-xtrabackup \
          xtrabackup --backup --datadir=/var/lib/mysql/ --target-dir=/backup \
          --user=root --password=123456 --port=3306 --host=192.168.0.104 --socket=/var/run/mysqld/mysqld.sock --no-server-version-check

    docker start -ai xtraBackup

 

    其中--volumes-from表示和docker mysql容器使用相同的容器卷信息,而--datadir是docker容器内mysql数据存放的地方,--socket是启动时套接字信息,因为我的mysql容器使用的host网络,所以这里我也用了host网络保持通信,备份信息可以查看xtrabackup_checkpoints文件

    

  3.2. docker run方式

    docker run -e TZ=Asia/Shanghai \
          --name xtraBackup \
          --volumes-from mgrNode1 \
          -v /home/workspace/xtraBackup/backup:/backup \
          --network host\
          percona/percona-xtrabackup \
          xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/backup \
          --user=root --password=123456 --port=3306 --host=192.168.0.104 --no-server-version-check

其它可能用到的属性:

--socket表示源mysql的mysql.sock路径

--skip-ssl表示以非SSL方式连接数据库。

4. 除了全量备份,日常生产环境大多使用增量备份

    docker run -e TZ=Asia/Shanghai \

          --name xtraBackup \
          --volumes-from mgrNode1 \
          -v /home/workspace/xtraBackup/backup:/backup \
          -v /home/workspace/xtraBackup/Inc/:/inc \
          --network host\
          percona/percona-xtrabackup \
          xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/inc --incremental-basedir=/backup \
          --user=root --password=123456 --port=3306 --host=192.168.0.104 --no-server-version-check

     其中--incremental-basedir是增量备份的基础,可以是全备的数据,也可以是增备的数据

  同时可以加上日期变量,来进行定时任务,比如每周日全量备份,每周1-6增量备份,这样可以每天删除前面的日志,同时明确周日的备份就是全备,周1-6就是增备,当然也可以有其它策略,示例

    yestoday=`date -d -1day +%Y_%m_%d`
    today=`date +%Y_%m_%d`

    docker run -e TZ=Asia/Shanghai \

          --name xtraBackup \
          --volumes-from mgrNode1 \
          -v /home/workspace/xtraBackup/$yestoday:/backup \
          -v /home/workspace/xtraBackup/$today:/inc \
          --network host\
          percona/percona-xtrabackup \
          xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/inc --incremental-basedir=/backup/ \
          --user=root --password=123456 --port=3306 --host=192.168.0.104 --no-server-version-check

  创建crontab定时任务,

    00 23 * * 1-6 /home/workspace/incXtraBackup.sh
    00--第几分
    23--23点
    *--每天
    *--每月

5. 备份还原

  在执行备份还原之前,需要关闭mysql服务器,不能恢复到正在运行的mysql示例的数据目录

  5.1. 全量备份还原

    模拟故障:

       docker stop mysql

       cd /home/workspace/mysql/data

       rm ./* -rf

    5.1.1. 准备备份

      因为我们进行备份操作时可能事务正在执行,准备这一步的目的是为了通过日志将日志数据还原成一致的可用的数据,一共有两个步骤,1是把已提交的事务写入数据文件,2是回滚未提交的事务    

      docker run -e TZ=Asia/Shanghai \
            --name xtraBackup \
            --volumes-from mgrNode1 \
            -v /home/workspace/xtraBackup/backup:/backup \

            -v /home/workspace/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \

            --network host\
            percona/percona-xtrabackup \
            xtrabackup --defaults-file=/etc/mysql/conf.d/my.cnf --prepare --apply-log-only --target-dir=/backup \
            --user=root --password=123456 --port=3306 --host=192.168.0.104 --no-server-version-check

      坑1:Error: datadir must be specified

        意思是在默认配置文件my.cnf中没有找到datadir配置项,需要添加my.cnf的映射

      坑2:xtrabackup: Error: --defaults-file must be specified first on the command line

        意思是该配置项必须放在命令行的首位

      其中--defaults-file表示使用mysql默认配置文件

        --apply-log-only,因为备份时未提交的事务可能正在进行中,并且很可能会在下一次增量备份中提交,使用该项来防止事务回滚阶段,如果打算将备份作为增量备份的基础,应在准备备份时使用该项,否则将无法对其进行增量备份

    5.1.2.恢复备份  

      docker run -e TZ=Asia/Shanghai \
            --name xtraBackup \
            --volumes-from mysql \
            -v /home/workspace/xtraBackup/backup:/backup \
            -v /home/workspace/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
            percona/percona-xtrabackup \
            xtrabackup --defaults-file=/etc/mysql/conf.d/my.cnf --copy-back --target-dir=/backup \
            --user=root --password=123456 --port=3306 --host=192.168.0.104 --no-server-version-check

      docker start mysql

  5.2.增量备份还原

    步骤:需要先准备全量备份,再准备增量备份,再进行恢复

    5.2.1.准备全量备份

      docker run -e TZ=Asia/Shanghai \
            --name xtraBackup \
            --volumes-from mgrNode1 \
            -v /home/workspace/xtraBackup/backup:/backup \

            -v /home/workspace/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \

            --network host\
            percona/percona-xtrabackup \
            xtrabackup --defaults-file=/etc/mysql/conf.d/my.cnf --prepare --apply-log-only --target-dir=/backup \
            --user=root --password=123456 --port=3306 --host=192.168.0.104 --no-server-version-check

    5.2.2.准备增量备份     

      docker run -e TZ=Asia/Shanghai \
            --name xtraBackup \
            --volumes-from mysql \
            -v /home/workspace/xtraBackup/inc:/inc \
            -v /home/workspace/xtraBackup/backup:/backup \
            -v /home/workspace/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
            percona/percona-xtrabackup \
            xtrabackup --defaults-file=/etc/mysql/conf.d/my.cnf --prepare --apply-log-only --target-dir=/backup --incremental-dir=/inc \
            --user=root --password=123456 --port=3306 --host=192.168.0.104 --no-server-version-check

    5.2.3.恢复备份

      docker run -e TZ=Asia/Shanghai \
            --name xtraBackup \
            --volumes-from mysql \
            -v /home/workspace/xtraBackup/backup:/backup \
            -v /home/workspace/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
            percona/percona-xtrabackup \
            xtrabackup --defaults-file=/etc/mysql/conf.d/my.cnf --copy-back --target-dir=/backup \
            --user=root --password=123456 --port=3306 --host=192.168.0.104 --no-server-version-check

    docker start mysql

6.压缩备份

  压缩备份主要是使用--compress选项进行压缩,如使用lz4压缩算法--compress=lz4,使用--decompress进行解压缩,同时可以指定线程数--compress-threads=4 等等,其余差不多

7.部分备份

  部分备份可以备份单独的表或者库,如--tables,--databases,使用正则表达式匹配相应的表或者库,同时可以指定文件目录,但是恢复的时候不能使用-copy-back,应使用导入表,同时不建议在运行部分备份后进行增量备份,详情可参考官网partial backups目录下的选择项进行相应的处理