目录

1. xtrabackup工具介绍

2. xtrabackup备份恢复过程

3. 利用xtrabackup进行完全备份

4. 通过xtrabackup完全恢复数据库

5. xtrabackup针对海量数据的备份优化

1. xtrabackup工具介绍

        xtrabackup是Percona公司开发的一款基于InnoDB的在线热备工具,具有开源、免费、支持在线热备,备份恢复速度快,占用磁盘空间小等特点,并且支持不同情况下的多种备份形式。xtrabackup的官方下载地址为 http://www.percona.com/software/percona-xtrabackup。

        Xtrabackup采用yum在线安装方式,或者下载rpm包安装均可,可从 https://www.percona.com/downloads/percona-release/ 下载Xtrabackup的yum源,我这里下载的是 percona-release-1.0-26.noarch.rpm。

安装yum源:
[root@localhost app]# rpm -ivh percona-release-1.0-26.noarch.rpm
测试安装库:
[root@localhost app]# yum list percona-xtrabackup*
通过yum方式安装percona-xtrabackup:
[root@localhost app]# yum -y install mysql-community-libs-compat.x86_64
[root@localhost app]# yum install percona-xtrabackup-80.x86_64

        xtrabackup有两个主要的工具:xtrabackup,innobackupex,Percona XtraBackup 8.0 对MySQL8.0,XtraBackup2.4继续支持MySQL5.6和5.7,同时移除了innobackupex命令。

mysql8.0的安装方式

# 1. 安装最新Percona仓库配置工具
dnf install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm

# 2. 启用MySQL 8.0专用仓库(核心步骤)
percona-release setup ps80

# 3. 清理缓存并安装XtraBackup 8.0(完全匹配你的数据库)
dnf clean all && dnf makecache
dnf install -y percona-xtrabackup-80

        Xtrabackup是根据my.cnf配置文件来获取备份的文件,同时,需要连接到数据库和datadir操作权限。

2. xtrabackup备份恢复过程

        在InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件。事务日志会存储每一个InnoDB表数据的记录修改。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。

(1)、备份过程

        xrabackup在启动时会记住log sequence number(LSN),并且复制所有的数据文件。复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。这时,xrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。xirobackup必须持续的做这个操作,是因为事务日志是会轮转重复的写入,并且事务日志可以被重用。所以xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来。上面就是xtrabackup的备份过程。

(2)、恢复过程

        接下来是准备(prepare)过程。在这个过程中,xtrabackup使用之前复制的事务日志,对各个数据文件执行灾难恢复(就像MySQL刚启动时要做的一样)。当这个过程结束后,数据库就可以做恢复还原了。

        在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不是回滚到xtrabackup刚开始时的点。类似Oracle的,InnoDB的prepare过程可以称为recover(恢复),MyISAM的数据复制过程可以称为restore(还原)

3. 利用xtrabackup进行完全备份

创建备份用户:

grant reload,lock tables,relication client,create tablespace,super on *.*\ to bakuser@'172.16.213.%' identified by '123456';

进行全库备份:

xtrabackup --defaults-file=/etc/my.cnf --user=DBUSER --host=SERVER --password=DBUSERPASS --backup --target-dir= /path/to/BACKUP-DIR

常见参数如下:

--defaults-file 仅从指定的配置文件读取参数
--backup备份操作,备份到target-dir指定的目录
-u, --user=name 备份时使用的mysql用户名
-H, --host=name 备份时连接的数据库IP地址
-P, --port 备份时指定的连接端口
-p, --password 备份时mysql用户的密码
-S, --socket 备份时连接的mysql库的socket文件

步骤:

  1. 在/etc/my.cnf中配置:
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid file=/var/run/mysqld/mysqld.pid
  1. 创建备份文件的位置 mkdir /data2/backup
  2. 执行备份文件的命令,localhost下可不用写 --host
xtrabackup --defaults-file=/etc/my.cnf --backup --user=root --password='123456' --target-dir=/data2/backup
  1. 备份文件展示

4. 通过xtrabackup完全恢复数据库

        恢复数据库分为prepare数据库和恢复数据文件两个步骤。

        在备份完成后, 数据尚且不能直接用于恢复操作, 因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务, 而且备份过程中可能还有数据的更改动作, 此时xtrabackup_logfile就可派上用场了。xtrabackup会解析该文件, 对事务已经提交但数据还没有写入的部分, 进行redo重做; 将已经写到数据文件,但未提交的事务通过undo进行回滚, 最终使得数据文件处于一致性状态。

(1) Prepare过程:

[root@mysqlserver backup]# xtrabackup --host=localhost --user=root --password='root@mySQL123' --port=3306 --prepare--target-dir=/data2/backup

        执行Prepare成功后, 这个完全备份就可以被用来还原数据库了。

        prepare的过程, 其实是读取备份文件夹中的配置文件, 然后xtrabackup重做已提交事务, 回滚未提交事务,之后数据就被写到了备份的数据文件(innodb文件)中, 并重建日志文件。

        注意, 在恢复数据库之前, 数据库应该是出于关闭状态。

(2) 恢复过程

[root@mysqlserver backup]# xtrabackup --host=localhost --user=root --password='root@mySQL123' --port=3306 --datadir=/var/lib/mysql --copy-back --target-dir=/data2/backup

        --copy-back表示做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir。

        此过程会把/data2/backup下面的备份文件拷贝到datadir参数指定的路径下,需要注意, datadir目录必须为空。

实操演示

  • 假如删除了数据库
  cd /var/lib/mysql
  rm -rf ./*
  • 进行恢复数据库
[root@mysqlserver backup]# xtrabackup --host=localhost --user=root --password='root@mySQL123' --port=3306 --prepare--target-dir=/data2/backup

显示ok则表示prepare成功

  • 进行数据备份操作
[root@mysqlserver backup]# xtrabackup --host=localhost --user=root --password='root@mySQL123' --port=3306 --datadir=/var/lib/mysql --copy-back --target-dir=/data2/backup

--copy-back 吧备份文件数据拷贝到mysql对应的文件

  • 执行命令显示ok则恢复成功

注意一定要修改一下权限

chown -R mysql:mysql /var/lib/mysql
5. xtrabackup针对海量数据的备份优化

使用流特性,需要指定--stream选项,使用xbstream备份:(推荐方法)

[root@mysqlserver xtrabackup]# xtrabackup --defaults-file=/etc/my.cnf --user=root --password='root@mySQL123' --compress-threads=8 --backup --stream=xbstream --parallel=4 | gzip > /data2/xtrabackup/mysqlbak1.xb.gz

备份到远程主机:

[root@mysqlserver xtrabackup]# xtrabackup --defaults-file=/etc/my.cnf --user=root --password='root@mySQL123' --compress-threads=8 --backup--stream=xbstream --parallel=4 | ssh 172.16.213.80 "gzip >/mnt/mysqlbak1.xb.gz"

可用参数:

--parallel=4: 加速备份参数,这个选项会指定xtrabackup备份文件的IO线程数。

--compress-threads 备份压缩的并行线程,默认为1

/mnt/mysqlbak1.xb.gz是远程主机213.80上面的路径。

提取xbstream流,解压文件方式如下:

[root@mysqlserver xtrabackup]# gzip -d -c mysqlbak2.xb.gz | xbstream -x -v -C xtrabackup_backupfiles

其中xtrabackup_backupfiles表示将压缩包解压到这个目录下。

  • gzip -d -c:流式解压.gz 包,输出数据流、保留源文件
  • |:管道传输数据流
  • xbstream -x -v -C:解包专用备份格式,详细输出,存入指定目录
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐