Mysql的备份神器xtrabackup
Xtrabackup优点
- 直接备份innodb底层数据文件,导出不需要转换,速度快
- 备份过程不会打断正在执行的事务(无需锁表)
- 能够基于压缩等功能节约磁盘空间和流量
- 自动备份校验,容易做增量备份
- 还原速度快
- 可以流传将备份传输到另外一台机器上
- 在不增加服务器负载的情况备份数据
假如要热备份,要同时备份frm文件、ibd文件、binlog文件、redo log文件等,因为这些文件在运行的时候要一致,比如ibd文件是数据库的数据文件所落的数据页(B+tree),但这里面在动态的时候不会有所有的数据,因为mysql有预写日志的特性,因为数据刚进来的时候是先进redo log文件和binlog文件,然后再等redo log刷盘的时候再刷到ibd文件,所以只备份ibd文件不全也不一致。但把frm和ibd文件一起备份也不行,因为redo log里还是有新数据没进去;但一次性把所有的都拷贝走行不行?也不行!你就算是同时点的复制粘贴,但是所有的文件也是有先后的,也会造成数据不一致,因为不是同一个节拍。同时在不同版本的数据库和操作系统上还有兼容性问题,所以说热备整体拷走所有文件是不可行的。
必须冷备,影响业务也要冷备
原理
拷贝ibd文件的时候,去监听缓存里的redo log,这样就可以知道在落盘的时候做了哪些修改,之后就可以对ibd文件做处理,就不会前一半后一半不一致的情况,然后复制完ibd文件,把这段时间监听的redo log再落盘,也就是相当于全量+增量的备份。
- 启动redo log监听线程,开始收集redo log
- 拷贝ibd数据文件
- 传输完停止收集redo log,期间所收集到的redo log就是拷贝ibd文件又增加的数据
- 加FTWRL锁拷贝元数据frm,但是frm文件是没有log的,不像ibd文件有redo log,也就是在拷贝frm文件过程中加了字段或者索引,这时候就会导致文件不一致,这时候加全局锁,也就是说物理热备有一小段是温备。
XtraBackup 8.0支持mysql 8.0
XtraBackup 2.4支持mysql 5.1、5.5、5.6、5.7
下载地址
//2.4版本 https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/ //8.0版本 https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
安装测试
wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.22/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm
//执行安装 rpm -ivh --nodeps --force percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm
使用命令
Xtrabackup中主要包含两个工具: xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构; innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。 常用选项: --host 指定主机 --user 指定用户名 --password 指定密码 --port 指定端口 --databases 指定数据库 --incremental 创建增量备份 --incremental-basedir 指定包含完全备份的目录 --incremental-dir 指定包含增量备份的目录 --apply-log 对备份进行预处理操作 一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。 --redo-only 不回滚未提交事务 --copy-back 恢复备份目录
//备份 innobackupex --user=root --password=123456 bakdir/
innobackupex --user=root --password=afdd3b5116776455 --databases=752548_ichengyun /usr/local/src/ //指定了数据库
//还原(停止mysqld服务) innobackupex --copy-back bakdir/xxxx-xx-xx/ //增量备份 innobackupex --usesr=root --password=123456 --incremental bakdir / --incremental-basedir=‘/bakdir/xxxx-xx-xx’ //第一个bakdir是输出的路径 ,第二个之前的备份,在第二个base之前基础的增量 //增量备份合并至全量备份 innobackupex --apply-log bakdir/xxxx-xx-xx/ --incremental-dir=bakdir/YYYY-YY-YY/ //第一个是之前的全量,第二个是增量备份,增量合并到全量后,第二个dir下的文件就没用了
注意:备份时需启动MySQL,恢复时需关闭MySQL,清空mysql数据目录且不能重新初始化,恢复数据后应该立即进行一次完全备份
//执行完成后的成功状态 211026 16:01:33 [00] Writing /usr/local/src/2021-10-26_16-01-30/xtrabackup_info 211026 16:01:33 [00] ...done xtrabackup: Transaction log of lsn (33186147) to (33186147) was copied. 211026 16:01:34 completed OK!
//查看备份完成后的目录 [root@S859680 2021-10-26_16-06-04]# ll 总用量 75880 drwxr-x--- 2 root root 4096 10月 26 16:06 752548_ichengyun -rw-r----- 1 root root 481 10月 26 16:06 backup-my.cnf #备份用到的配置选项信息文件 -rw-r----- 1 root root 77594624 10月 26 16:06 ibdata1 -rw-r----- 1 root root 26 10月 26 16:06 xtrabackup_binlog_info #mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件 -rw-r----- 1 root root 138 10月 26 16:06 xtrabackup_checkpoints #备份的类型、状态和LSN状态信息文件 -rw-r----- 1 root root 508 10月 26 16:06 xtrabackup_info -rw-r----- 1 root root 2560 10月 26 16:06 xtrabackup_logfile #备份的日志文件
注意:恢复的时候不能启动MySQL
innobackupex命令的--copy-back选项用于恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。
innobackupex --copy-back /usr/local/src/2021-10-26_16-09-26
当数据恢复至DATADIR目录以后,还需要确保所有的数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。如:
chown -R mysql.mysql /mydata/data/
主从同步备份恢复流程
一、全量备份
[root@master backups]# innobackupex --user=root --password=123456 --host=127.0.0.1 /backups/ //在master上进行全库备份
二、从库同步增量恢复
[root@slave ~]# /etc/init.d/mysqld stop //停止slave上的mysql Shutting down MySQL.. SUCCESS!
[root@slave tools] wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.22/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm //下载 rpm -ivh --nodeps --force percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm //安装
[root@master backups]# scp -r 2021-10-26_16-09-26/ root@192.168.1.1:/backups/ //从master上拷贝备份数据
[root@slave tools]# innobackupex --apply-log /backups/2021-10-26_16-09-26/ //合并数据,使数据文件处于一致性的状态 180729 23:18:23 innobackupex: Starting the apply-log operation IMPORTANT: Please check that the apply-log run completes successfully. At the end of a successful apply-log run innobackupex prints "completed OK!". innobackupex version 2.4.9 based on MySQL server 5.7.13 Linux (x86_64) (revision id: a467167cdd4) xtrabackup: cd to /backups/2021-10-26_16-09-26/ xtrabackup: This target seems to be not prepared yet. InnoDB: Number of pools: 1 xtrabackup: xtrabackup_logfile detected: size=8388608, start_lsn=(3127097) ...... InnoDB: FTS optimize thread exiting. InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 3129915 180729 23:18:30 completed OK!
[root@slave ~]# rm -rf /usr/local/mysql/data/ //在slave上删除原有的数据 [root@slave ~]# vim /etc/my.cnf //配置my.cnf的数据目录路径,否则会报错,要和master一致 datadir=/usr/local/mysql/data [root@slave ~]# innobackupex --copy-back /backups/2021-10-26_16-09-26/ //在slave上数据恢复 180729 23:32:03 innobackupex: Starting the copy-back operation IMPORTANT: Please check that the copy-back run completes successfully. At the end of a successful copy-back run innobackupex prints "completed OK!". ...... 180729 23:32:08 completed OK! //恢复正常
[root@slave ~]# ll /usr/local/mysql/data/ //slave上查看数据目录,可以看到数据已经恢复,但是属主会有问题,需要进行修改,所以一般使用mysql的运行用户进行恢复,否则需要进行修改属主和属组信息 total 188432 -rw-r----- 1 root root 79691776 Jul 29 23:32 ibdata1 -rw-r----- 1 root root 50331648 Jul 29 23:32 ib_logfile0 -rw-r----- 1 root root 50331648 Jul 29 23:32 ib_logfile1 -rw-r----- 1 root root 12582912 Jul 29 23:32 ibtmp1 drwxr-x--- 2 root root 20 Jul 29 23:32 kim drwxr-x--- 2 root root 4096 Jul 29 23:32 mysql drwxr-x--- 2 root root 4096 Jul 29 23:32 performance_schema drwxr-x--- 2 root root 20 Jul 29 23:32 repppp drwxr-x--- 2 root root 4096 Jul 29 23:32 wordpress -rw-r----- 1 root root 482 Jul 29 23:32 xtrabackup_info [root@slave ~]# chown -R mysql.mysql /usr/local/mysql/data/ //修改属主属组 [root@slave ~]# /etc/init.d/mysqld start //启动mysql Starting MySQL. SUCCESS!
全库备份与恢复三步曲:
- innobackupex全量备份,并指定备份目录路径
- 在恢复前,需要使用--apply-log参数先进行合并数据文件,确保数据的一致性要求
- 恢复时,直接使用--copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径
进一步学习链接:https://www.cnblogs.com/linuxk/p/9372990.html
关于阿里云RDS物理备份数据使用xtrabackup工具恢复到本地mysql当中,请参考阿里云文档:https://help.aliyun.com/knowledge_detail/41817.html?spm=5176.11065259.1996646101.searchclickresult.53d420cclqekK3