安装xtrabackup工具包
-
几个percona官方yum源
-
下载yum源
-
安装yum源
$ rpm -ivh percona-release-1.0-9.noarch.rpm 警告:percona-release-1.0-9.noarch.rpm: 头V4 DSA/SHA1 Signature, 密钥 ID cd2efd2a: NOKEY 准备中... ################################# [100%] 正在升级/安装... 1:percona-release-1.0-9 ################################# [100%] * Enabling the Percona Original repository <*> All done!
-
测试安装库
$ yum list percona-xtrabackup* 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * epel: hkg.mirror.rackspace.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com * webtatic: us-east.repo.webtatic.com 已安装的软件包 percona-xtrabackup.x86_64 2.3.10-1.el7 @percona-release-x86_64 可安装的软件包 percona-xtrabackup-22.x86_64 2.2.13-1.el7 percona-release-x86_64 percona-xtrabackup-22-debuginfo.x86_64 2.2.13-1.el7 percona-release-x86_64 percona-xtrabackup-24.x86_64 2.4.25-1.el7 percona-release-x86_64 percona-xtrabackup-24-debuginfo.x86_64 2.4.25-1.el7 percona-release-x86_64 percona-xtrabackup-80.x86_64 8.0.28-20.1.el7 percona-release-x86_64 percona-xtrabackup-80-debuginfo.x86_64 8.0.28-20.1.el7 percona-release-x86_64 percona-xtrabackup-debuginfo.x86_64 2.3.10-1.el7 percona-release-x86_64 percona-xtrabackup-test.x86_64 2.3.10-1.el7 percona-release-x86_64 percona-xtrabackup-test-22.x86_64 2.2.13-1.el7 percona-release-x86_64 percona-xtrabackup-test-24.x86_64 2.4.25-1.el7 percona-release-x86_64 percona-xtrabackup-test-80.x86_64 8.0.28-20.1.el7 percona-release-x86_64
通过yum方式安装percona-xtrabackup
yum install percona-xtrabackup-24 -y
如何通过Xtrabackup进行备份
$ rpm -ql percona-xtrabackup-24
/usr/bin/innobackupex
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/lib64/xtrabackup/plugin/keyring_file.so
/usr/lib64/xtrabackup/plugin/keyring_vault.so
/usr/share/doc/percona-xtrabackup-24-2.4.25
/usr/share/doc/percona-xtrabackup-24-2.4.25/LICENSE
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz
xtrabackup工具介绍
xtrabackup有两个主要的工具:xtrabackup、innobackupex。
xtrabackup只能备份InnoDB和XtraDB两种数据表,而且只有ibd文件,frm文件它不管,恢复时就需要DBA提供frm ,同时,xtrabackup做备份的时候不能备份表结构、触发器等等。
innobackupex是perl脚本对xtrabackup的封装和功能扩展。 innobackupex可以备份和恢复MyISAM、 InnoDB和XtraDB表以及frm文件,所以我们使用innobackupex来备份MySQL数据库。
Xtrabackup以及innobackupex是根据my.cnf配置文件来获取备份的文件,同时,需要连接到数据库和datadir操作权限。
需要注意的是:innobackupex在备份MyISAM表之前要对全库进行加READ LOCK,会阻塞写操作,若备份是在从库上进行的话会影响主从同步,造成延迟。对InnoDB表备份不会阻塞读写。
xtrabackup备份恢复过程
在InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件。事务日志会存储每一个InnoDB表数据的记录修改。
当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。
对于innoDB引擎
xtrabackup在启动时会记住log sequence number(LSN),并且复制所有的数据文件。
复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。这时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。xtrabackup必须持续的做这个操作,是因为事务日志是会轮转重复的写入,并且事务日志可以被重用。所以xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来。
对于MyISAM引擎
Innobackupex会启动xtrabackup,xtrabackup准备复制数据文件前,首选执行FLUSH TABLES WITH READ LOCK来阻止新的写入进来,同时把MyISAM表数据刷到硬盘上,然后开始复制MyISAM数据文件,文件复制完成,最后释放锁。
上面就是xtrabackup的备份过程。
接下来是准备(prepare)过程。
在这个过程中,xtrabackup使用之前复制的事务日志,对各个数据文件执行灾难恢复(就像MySQL刚启动时要做的一样)。
当这个过程结束后,数据库就可以做恢复还原了。
备份MyISAM和InnoDB表最终会处于一致,在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不是回滚到xtrabackup刚开始时的点。这个时间点与执行FLUSH TABLES WITH READ LOCK的时间点相同,所以MyISAM表数据与InnoDB表数据是同步的。类似Oracle的,InnoDB的prepare过程可以称为recover(恢复),MyISAM的数据复制过程可以称为restore(还原)。
利用xtrabackup进行完全备份
innobackupex的常用选项:
-
--host:指定数据库服务器地址
-
--port:指定连接到数据库服务器的哪个端口
-
--socket:连接本地数据库时使用的套接字路径
-
--no-timestamp:在使用innobackupex进行备份时,可使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;
如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据
-
--default-files:可通过此选项指定其它的配置文件;但是使用时必须放于所有选项的最前面
-
--incremental:指定创建增量备份
-
--incremental-basedir:指定基于哪个备份做增量备份
-
--apply-log:应用xtrabackup_logfile文件,重做已提交的事务,回滚未提交的事务
-
--redo-only:只重做已提交的事务,不准加滚
-
--use-memory:在“准备”阶段可提供多少内存以加速处理,默认是100M
-
--copy-back:恢复备份至数据库服务器的数据目录
-
--compact:压缩备份
-
--stream={tar|xbstream}:对备份的数据流式化处理
-
--databases :指定备份的数据库,不指定则表示全库备份 多个数据库用空格隔开,用引号引起来
-
--parallel: 备份的线程
通过innobackupex 进行全备份的过程
-
创建备份用户
grant reload,lock tables,replication client,create tablespace,super on *.* to bakuser@'172.16.213.%' identified by '123456';
-
进行全库备份
innobackupex --user=DBUSER --host=SERVER --password=DBUSERPASS --socket=path /path/to/BACKUP-DIR
使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间戳命名的目录中。
-
一个全备份例子:
innobackupex --default-file=/etc/my.cnf --user=root --password=111111 --socket=/var/lib/mysql/mysql.sock /data/full/
- /data/full/是将备份存放的目录。
- innobackupex或者xtrabackup通过--user和--password连接到数据库服务,
- --defaults-file指定mysql配置文件目录。
-
增量备份例子:
innobackupex --default-file=/etc/my.cnf --incremental --incremental-basedir=/data/full/2022-05-02_12-46-23 --user=root --password=111111 --no-timestamp /data/full/123
- --incremental :以增量的方式备份
- --incremental-basedir=/data/full/2022-05-02_12-46-23 :指定以某个备份为基准做增量备份
- --no-timestamp: 不以时间来命名
- /data/full/123 :备份就会存在123这个文件夹里
在备份的同时,innobackupex还会在备份目录中创建如下文件:
xtrabackup_checkpoints:内容如下:
- backup_type = full-backuped #备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)
- from_lsn = 0 #备份起始的LSN(日志序列号),每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
- to_lsn = 119232396 #备份结束的LSN(日志序列号)
- xtrabackup_binlog_info:mysql服务器当前正在使用的二进制日志文件及至备份此刻为止二进制日志事件的位置。
xtrabackup_logfile:事务日志记录文件,用于在prepared阶段进行redo重做和日志回滚。
xtrabackup_info:有关此次备份的各种详细信息
backup-my.cnf:备份命令用到的配置选项信息
Innobackupex完全备份Mysql步骤
- 首先会启动一个xtrabackup_log后台检测的进程,实时检测mysql redo的变化,一旦发现redo有新的日志写入,立刻将日志写入到日志文件xtrabackup_logfile中
- 复制innodb的数据文件和系统表空间文件idbdata1到对应的以默认时间戳为备份目录的地方。
- 复制结束后,执行flush table with read lock操作。
- 复制.frm,MYI,MYD文件。
- 并且在这一时刻获得binary log 的位置。
- 将表进行解锁unlock tables。
- 停止xtrabackup_log进程。
通过Innobackupex完全恢复数据库
全库恢复过程
这一阶段会启动xtrabackup内嵌的innodb实例,将xtrabackup日志xtrabackup_Log进行回放,将提交的事务信息变更应用到innodb数据或表空间,同时回滚未提交的事务。
prepare数据库
在备份完成后,数据尚且不能直接用于恢复操作
因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务,而且备份过程中可能还有数据的更改动作
此时xtrabackup_logfile就可派上用场了。
xtrabackup会解析该文件,对事务已经提交但数据还没有写入的部分,进行redo重做;
将已经写到数据文件,但未提交的事务通过undo进行回滚,最终使得数据文件处于一致性状态。
Prepare过程是通过使用innobakupex命令的 --apply-log
选项实现的;
innobackupex --apply-log /data/full/123/
成功则会输出:
InnoDB: Shutdown completed; log sequence number 2777128
220502 13:43:19 completed OK!
成功后,这个完全备份就可以被用来还原数据库了。
prepare的过程,其实是读取备份文件夹中的配置文件,然后innobackupex重做已提交事务,回滚未提交事务,之后数据就被写到了备份的数据文件(innodb文件)中,并重建日志文件。
恢复数据库
使用innobackupex --copy-back
来还原备份(recovery)
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/full/123/
innobackupex会根据my.cnf的配置,将所有备份数据复制到my.cnf里面指定的datadir路径下。
如果恢复成功,最后会有如下提示:
innobackupex: Finished copying back files.
220502 13:47:50 completed OK!
注意:
- datadir必须是为空的,innobackupex --copy-back不会覆盖已存在的文件
- 还原时需要先关闭mysql服务,如果服务是启动的,那么就不能还原到datadir。
修改权限启动数据库
默认情况下是通过root用户恢复的数据,所以mysql数据文件夹目录是root权限,需要修改文件的所有者和权限:
chown -R mysql:mysql /var/lib/mysql
最后启动数据库即可。
xtrabackup增量备份
所谓的增量,一定是在已有全量的基础之上的,不然是没有任何意义的。
innobackupex增量备份过程中的"增量"处理,其实主要是相对innodb而言,对myisam和其他存储引擎而言,它仍然是全拷贝(全备份)
"增量"备份的过程主要是通过拷贝innodb中有变更的"页"(这些变更的数据页指的是"页"的LSN大于xtrabackup_checkpoints中给定的LSN)。
增量备份是基于全备的,第一次增备的数据必须要基于上一次的全备,之后的每次增备都是基于上一次的增备,最终达到一致性的增备。增量备份的过程如下,和全备的过程类似,区别仅在第2步。
xtrabackup增量备份
在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份是基于上一次的增量备份,以此类推。
#全备份:
$ innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysqld.sock /data/backup/full/
#第一次增量备份:
$ innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysqld.sock --incremental /data/backup/incremental/ --incremental-basedir=/data/backup/full/2018-05-21_12-04-52 --parallel=2
#第二次增量备份:
$ innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysqld.sock --incremental /data/backup/incremental/ --incremental-basedir=/data/backup/incremental/2018-05-21_12-11-18/ --parallel=2
xtrabackup增量备份的恢复
增量备份的恢复大体为3个步骤:
- 恢复完全备份
- 恢复增量备份到完全备份(开始恢复的增量备份要添加
--redo-only
参数,到最后一次增量备份去掉--redo-only参数) - 对整体的完全备份进行恢复,回滚那些未提交的数据
xtrabackup增量备份的恢复过程
-
恢复完全备份(注意这里一定要加--redo-only参数,该参数的意思是只应用xtrabackup日志中已提交的事务数据,不回滚还未提交的数据)一个事务在前一个备份中没有提交,但可能在其后的备份中提交了,这种情况就需要--redo-only参数。
innobackupex --apply-log --redo-only /data/backup/full/2018-05-21_12-04-52/
-
将增量备份1应用到完全备份
innobackupex --apply-log --redo-only /data/backup/full/2018-05-21_12-04-52/ --incremental-dir=/data/backup/incremental/2018-05-21_12-11-18/
-
将增量备份2应用到完全备份(注意恢复最后一个增量备份时需要去掉--redo-only参数,回滚xtrabackup日志中那些还未提交的数据)
innobackupex --apply-log /data/backup/full/2018-05-21_12-04-52/ --incremental-dir=/data/backup/incremental/2018-05-21_14-28-40/
-
把所有合在一起的完全备份整体进行一次apply操作,回滚未提交的数据:
innobackupex --apply-log /data/backup/full/2018-05-21_12-04-52/
-
把恢复完的备份复制到数据库目录文件中,修改属主属组,然后启动mysql数据库,检测数据正确性
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/backup/full/2018-05-21_12-04-52/
chown -R mysql:mysql /var/lib/mysql
xtrabackup针对海量数据的备份优化
使用流特性,需要指定--stream
选项,使用tar备份:(推荐方法)
$ innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysqld.sock --stream=tar /data/backup/tgz --parallel=4 | gzip > / data/backup/tgz/mysqlbak1.tar.gz
备份到远程主机:
$ innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysqld.sock --stream=tar /data/backup/tgz|ssh [email protected] "gzip >/data/backup/tgz/mysqlbak1.tar.gz"
可用参数:
--parallel=4:加速备份,这个选项会指定xtrabackup备份文件的线程数。
提取tar流,需要加i
参数
tar -xizvf mysqlbak1.tar.gz
通过xtrabackup进行mysql备份恢复例子
-
对mysql的cmsdb库进行备份
$ innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --databases=cmsdb --stream=tar /data/back_data/ 2>/data/back_data/cmsdb.log | gzip >/data/back_data/cmsdb.tar.gz
说明:
- --database=cmsdb :单独对cmsdb数据库做备份 ,若是不添加此参数那就那就是对全库做备份
- 2>/data/back_data/cmsdb.log 输出信息写入日志中
- gzip >/data/back_data/cmsdb.tar.gz 打包压缩存储到该文件中
-
此处可以写个脚本做备份(backup.sh)
#!/bin/sh echo "开始备份..."`date` log=cmsdb_`date +%y%m%d%H%M`.log str=cmsdb_`date +%y%m%d%H%M`.tar.gz innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --database=cmsdb --stream=tar /data/back_data/ 2>/data/back_data/$log | gzip >/data/back_data/$str echo "备份完毕..."`date`
-
恢复数据
- 先停止数据库:
service mysqld stop
- 解压
tar -izxvf cmsdb.tar.gz -C /data/back_data/db/
(没有db ,需要mkdir /data/back_data/db/) - 恢复
innobackupex --defaults-file=/etc/my.cnf --user=root --password --apply-log /data/back_data/db/
innobackupex --defaults-file=/etc/my.cnf --user=root --password --copy-back /data/back_data/db/
- 修改属主属组
chown -R mysql.mysql /var/lib/mysql/*
- 重启数据库
service mysqld restart
- 先停止数据库:
注意
当执行完增量备份恢复后就无法基于前者做增量了,最好是执行完恢复操作后再次进行全备,并在此基础上进行增量。
如果在恢复过的全备基础上进行增量备份,在恢复的时候,会报如下错