恢复MySQL!是我的条件反射,PXB开源的力量...
作者:mmseoamin日期:2024-04-27

📢📢📢📣📣📣

哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验

一位上进心十足的【大数据领域博主】!😜😜😜

中国DBA联盟(ACDU)成员,目前服务于工业互联网

擅长主流Oracle、MySQL、PG、高斯及Greenplum运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。

✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞

❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

文章目录

    • 📣 1.PXB的安装
    • 📣 2.全备和恢复
      • ✨ 2.1 环境准备
      • ✨ 2.2 全量备份
      • ✨ 2.3 全备的恢复
      • 📣 3.增量备份和恢复
        • ✨ 3.1 全量备份
        • ✨ 3.2 一级增量备份
        • ✨ 3.3 二级增量备份
        • ✨ 3.4 恢复数据
        • 📣 4.压缩备份与还原

          Xtrabackup 是由 Percona 公司提供的一款 MySQL 数据库备份恢复工具

          📣 1.PXB的安装

          rpm -ivh percona-xtrabackup-80-8.0.35-30.1.el7.x86_64.rpm --nodeps --force

          which xtrabackup

          xtrabackup --version

          常用选项:

          –host 指定主机

          –user 指定用户名

          –password 指定密码

          –port 指定端口

          –databases 指定数据库

          –incremental 创建增量备份

          –incremental-basedir 指定包含完全备份的目录

          –incremental-dir 指定包含增量备份的目录

          –apply-log 对备份进行预处理操作

          –defaults-file 指定默认配置文件,默认是读取/etc/my.cf

          恢复MySQL!是我的条件反射,PXB开源的力量...,在这里插入图片描述,第1张

          📣 2.全备和恢复

          Percona Xtrabackup 8.0版本移除了 innobackupex 命令

          innobackupex且只能备份 8.0 以下版本的 MySQL,实际中使用 xtrabackup 命令来备份8.0的版本

          2.4 版本支持 MySQL 5.11 , 5.5, 5.6 和 5.7 的版本

          –说明:

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

          “准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

          在实现“准备”的过程中,xtrabackup 通常还可以使用–use-memory 选项来指定其可以使用的内存的大小,默认通常为 100M。如果有足够的内存可用,可以多划分一些内存给 prepare 的过程,以提高其完成速度。

          xtrabackup 命令的–copy-back 选项用于执行恢复操作,其通过复制所有数据相关的文件至 mysql 服务器 DATADIR 目录中来执行恢复过程。

          最后一步也可以使用 OS 的 cp 命令来替代!!

          当数据恢复至 DATADIR 目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,

          如 mysql, 否则,在启动 mysqld 之前还需要事先修改数据文件的属主和属组。

          ✨ 2.1 环境准备

          create database ceshi character set utf8mb4;

          create table ceshi.articles (id int primary key auto_increment,content longtext not null) ENGINE=InnoDB;

          insert into ceshi.articles (id,content) values (11,‘hahahahahaha’),(12,‘xixixixixix’),(13,‘aiaiaiaia’),(14,‘hohoahaoaooo’);

          mysql> select * from ceshi.articles;
          +----+--------------+
          | id | content      |
          +----+--------------+
          | 11 | hahahahahaha |
          | 12 | xixixixixix  |
          | 13 | aiaiaiaia    |
          | 14 | hohoahaoaooo |
          +----+--------------+
          4 rows in set (0.00 sec)
          

          ✨ 2.2 全量备份

          mkdir -p /bk/

          xtrabackup -uroot -proot -S/var/lib/mysql/mysql.sock --backup --target-dir=/bk/full

          xtrabackup -uroot -proot -S/var/lib/mysql/mysql.sock --backup --target-dir=/bk/full_$(date +%Y%m%d)

          –说明:

          比如MySQL版本为MySQL 8.0.28版本,Percona XtraBackup版本也是下载8.0.28版本,如果不匹配不过,根据官方文档,Percona XtraBackup 8.0.21开始,新增了–no-server-version-check 参数。

          此参数控制是否将源系统版本与 Percona XtraBackup 版本进行比较。

          为了区分全备,可以使用full_$(date +%Y%m%d)来作为备份目录

          恢复MySQL!是我的条件反射,PXB开源的力量...,在这里插入图片描述,第2张

          ✨ 2.3 全备的恢复

          第一步:xtrabackup --prepare --target-dir=/bk/full

          恢复MySQL!是我的条件反射,PXB开源的力量...,在这里插入图片描述,第3张

          第二步:此时关闭数据库

          systemctl stop mysqld

          mysqladmin shutdown -uroot -proot

          第三步:copy-back

          [root@centos79 ~]# cd /var/lib

          [root@centos79 lib]# tar -cf mysql.tar mysql

          [root@centos79 lib]# mv mysql.tar /opt

          [root@centos79 lib]# rm -rf /var/lib/mysql/*

          xtrabackup --copy-back --target-dir=/bk/full --datadir=/var/lib/mysql

          –说明:

          不要直接删除mysql的数据目录,一般tar之后转移到其他目录,防止恢复失败

          要压缩整个目录,可以使用以下命令:

          tar -cf archive.tar directory

          恢复MySQL!是我的条件反射,PXB开源的力量...,在这里插入图片描述,第4张

          重启MySQL
          chown -R mysql:mysql /var/lib/mysql
          mysqld_safe &  --二进制环境
          systemctl start mysqld  --rpm环境
          登陆MySQL
          mysql -uroot -p
          mysql> select * from ceshi.articles;
          +----+--------------+
          | id | content      |
          +----+--------------+
          | 11 | hahahahahaha |
          | 12 | xixixixixix  |
          | 13 | aiaiaiaia    |
          | 14 | hohoahaoaooo |
          +----+--------------+
          4 rows in set (0.01 sec)
          --以上全备全部成功,恢复OK
          

          📣 3.增量备份和恢复

          需要注意的是,增量备份仅能应用于 InnoDB 或 XtraDB 表,对于 MyISAM 表而言,执行增量备份时其实进行的是完全备份。

          “准备”(prepare)增量备份与完全备份有着一些不同,尤其要注意的是:

          (1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

          (2)基于所有的备份将未提交的事务进行“回滚”。

          在增量备份命令中,–incremental-basedir 指的是上一次的增量备份所在的目录。若是一级增量备份,则指向全备的目录。

          恢复MySQL!是我的条件反射,PXB开源的力量...,在这里插入图片描述,第5张

          ✨ 3.1 全量备份

          先进行全备:

          mkdir -p /backup

          xtrabackup -uroot -proot -S/var/lib/mysql/mysql.sock --backup --target-dir=/backup/full

          –插入数据

          insert into ceshi.articles (id,content) values (110,‘bbbbbbb’),(111,‘ccccc’),(112,‘aaaaaa’),(113,‘dddddddd’);

          ✨ 3.2 一级增量备份

          xtrabackup -uroot -proot -S/var/lib/mysql/mysql.sock --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full

          解释:

          target-dir=/backup/inc1中的inc1目录不用自己创建

          –incremental-basedir=/backup增备份是在全备的基础上做得,这个参数是填全备的路径,全备和增备的目录要分开,不能放在一起。

          ✨ 3.3 二级增量备份

          xtrabackup -uroot -proot -S/var/lib/mysql/mysql.sock --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1

          –说明:

          incremental-basedir=/inc1/inc1,这里的参数是参照增备1里备份的,所以这个参数是填增备1的路径。

          备份好后会在/backup出现3个目录,一个是全备的数据,还有个增备1的数据,还有个增备2的数据。

          [root@centos79 ~]# ll /backup

          total 12

          drwxr-x— 6 root root 4096 Apr 15 05:58 full

          drwxr-x— 6 root root 4096 Apr 15 06:01 inc1

          drwxr-x— 6 root root 4096 Apr 15 06:05 inc2

          ✨ 3.4 恢复数据

          1.准备还原命令:

          xtrabackup --prepare --apply-log-only --target-dir=/backup/full/

          xtrabackup --prepare --apply-log-only --target-dir=//backup/full/ --incremental-dir=/backup/inc1/

          xtrabackup --prepare --target-dir=/backup/full/ --incremental-dir=/backup/inc2/

          2.恢复数据

          模拟删除数据库

          mysql> drop database ceshi;

          systemctl stop mysqld

          rm -rf /var/lib/mysql/*

          xtrabackup --copy-back --target-dir=/backup/full --datadir=/var/lib/mysql

          3.再次确认恢复到数据
          [root@centos79 ~]# chown -R mysql:mysql /var/lib/mysql
          [root@centos79 ~]# systemctl start mysqld
          [root@centos79 ~]# mysql -uroot -p
          Enter password: 
          Welcome to the MySQL monitor.  Commands end with ; or \g.
          Your MySQL connection id is 8
          Server version: 8.0.35 MySQL Community Server - GPL
          Copyright (c) 2000, 2023, Oracle and/or its affiliates.
          Oracle is a registered trademark of Oracle Corporation and/or its
          affiliates. Other names may be trademarks of their respective
          owners.
          Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
          mysql> select * from ceshi.articles;
          +------+--------------+
          | id   | content      |
          +------+--------------+
          |   11 | hahahahahaha |
          |   12 | xixixixixix  |
          |   13 | aiaiaiaia    |
          |   14 | hohoahaoaooo |
          |  110 | bbbbbbb      |
          |  111 | ccccc        |
          |  112 | aaaaaa       |
          |  113 | dddddddd     |
          | 1110 | bbbbbbb      |
          | 1111 | ccccc        |
          | 1112 | aaaaaa       |
          | 1113 | dddddddd     |
          +------+--------------+
          12 rows in set (0.00 sec)
          

          恢复MySQL!是我的条件反射,PXB开源的力量...,在这里插入图片描述,第6张

          📣 4.压缩备份与还原

          选项即可 此外,在执行本地备份时,

          还可以使用–parallel=4选项对多个文件进行并行复制。此选项用于指定在复制时启动的线程数目。

          当然,在实际进行备份时要利用此功能的便利性,也需要

          启用 innodb_file_per_table 选项或共享的表空间通过 innodb_data_file_path 选项存储在多个 ibdata 文件中。

          xtrabackup -uroot -proot -S/var/lib/mysql/mysql.sock --backup --parallel=4 --compress --compress-threads=4 --stream=xbstream > /bk/jeames_full_backup.qp --no-server-version-check

          解释:

          如果要加速压缩,可以使用–compress-threads=4 ,使用四个线程同时进行压缩

          compress就是压缩的命令,因为数据库的备份的数据比较大,占用的空间也比较多,而压缩就能减少文件大小

          恢复MySQL!是我的条件反射,PXB开源的力量...,在这里插入图片描述,第7张

          解压工具是qpress
          [root@centos79 opt]# tar -xvf qpress-11-linux-x64.tar
          qpress
          [root@centos79 opt]# mv qpress /usr/bin/qpress
          [root@centos79 opt]# which qpress
          /usr/bin/qpress
          xbstream -x < /bk/jeames_full_backup.qp -C /bk
          #解压操作
          [root@centos79 opt]# rpm -ivh zstd-1.5.5-1.el7.x86_64.rpm
          [root@centos79 opt]# zstd --version
          *** Zstandard CLI (64-bit) v1.5.5, by Yann Collet ***
          xtrabackup --parallel 4 --decompress --target-dir=/bk
          find /bk/ -name '*.qp' | xargs rm -f  --删除原来的压缩包
          解压的原来的文件不会被删除,可以使用 --remove-original选项清除
          #恢复操作
          xtrabackup --prepare --target-dir=/bk/full
          --此时关闭数据库 systemctl stop mysqld
          xtrabackup --copy-back --target-dir=/bk/full --datadir=/var/lib/mysql
          chown -R mysql:mysql /var/lib/mysql