MySQL备份恢复xtrabackup
https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/
https://www.cnblogs.com/xingxia/articles/mysql_data_migration.html
1、使用Xtrabackup全备份当前数据库,使用Xtrabackup备份不会锁表(对innodb不会锁表,但对MyISAM的备份同样需要加表锁)。mysqldump是逻辑备份,备份和恢复比较慢。
https://www.cnblogs.com/linuxk/p/9372990.html
yum -y install perl perl-Digest-MD5
rpm -ivh percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm
rpm -ivh percona-xtrabackup-test-24-2.4.21-1.el7.x86_64.rpm
rpm -ivh percona-xtrabackup-24-debuginfo-2.4.21-1.el7.x86_64.rpm
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
常用选项:
--host 指定要备份数据的地址
--user 指定要备份数据的用户名
--password 指定要备份数据的密码
--port 指定端口
--databases 指定数据库
--incremental 创建一个增量备份,同时需要指定 --incremental-basedir
--incremental-basedir 指定包含完全备份的目录
--incremental-dir 指定包含增量备份的目录,表示还原时增量备份的目录
--apply-log 对备份进行预处理操作,一般情况下,在备份完成后,数据还不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态,该选项主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件来确保数据文件处于一致性状态。
--redo-only 不回滚未提交事务,在合并增量备份时使用,但不包括对最后一个增量备份的合并。
--copy-back 恢复备份目录,即在还原时用于将备份数据文件拷贝到MySQL的datadir下。
还原时注意事项:
1.在做恢复前,必须先关闭备库,即在做恢复时,对应数据库应该处于关闭状态。
2.备库 datadir 目录必须为空,即要先清空备库。
3.恢复完成后,由于恢复的文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,如:chown -R mysql:mysql /var/lib/mysql
4.--force-non-empty-directories:指定该参数时候,使得innobackupex
使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中创建如下文件:
1. xtrabackup_info:innobackupex工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN(log sequence number日志序列号),BINLOG的位置等。
2. xtrabackup_checkpoints:备份类型(如全量或增量)、备份状态(如是否已经为prepared状态)和LSN范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
3. xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复
4. backup-my.cnf:备份命令用到的配置选项信息
5. xtrabackup_logfile:备份生成的日志文件
说明:Xtrabackup备份不会锁表(仅针对innodb不会锁表,但对MyISAM的备份同样需要加表锁)
mysql -u root -p'Mysql@123'
做一次全量备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password='Mysql@123' --parallel=16 /backup/ #不需要指定备份日期,会自动创建日期目录,如:2021-02-25_11-26-38
或使用
xtrabackup --defaults-file=/etc/my.cnf --user=root --password='Mysql@123' --backup --target-dir=/backup/2021-02-25 # 不会自动创建备份日期目录
在从库上恢复(注意从库上需要有/etc/my.cnf,另外server-id不能与主库相同):
innobackupex --apply-log /backup/2021-02-25_11-26-38/ #先合并数据,使数据文件处于一致性的状态,即先提交完成的事务,回滚未完成的事务。
innobackupex --copy-back --defaults-file=/etc/my.cnf /backup/2021-02-25_11-26-38/ # 恢复
chown -R mysql:mysql /data/mysql # 默认还原出来的数据文件属组是root,需要修改,否则启动mysql时日志会报:The innodb_system data file 'ibdata1' must be writable
systemctl start mysql
在主库上创建同步用户slave:
grant replication slave on *.* to slave@'%' identified by 'Slave@123' with grant option;
查看全备份中xtrabackup_info,可获取到master_log_file和master_log_pos,/backup/2021-02-25_11-29-07/xtrabackup_info
mysql> change master to master_host='192.168.171.71',master_user='slave',master_password='Slave@123',master_log_file='mysql-bin.000007',master_log_pos=591996590;
mysql> start slave;
mysql> show slave status \G
说明:mysql-bin.xxxx 这个数量是可以达到2^31 -1(2亿+),所以不用担心binlog数很快达到最大值。
全备+增量备份后数据恢复演示
1、第一次全量备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password='Mysql@123' --parallel=8 /backup/base/
2、第一次修改数据
create table t001 (name varchar(12) not null,sex varchar(10) not null);
insert t001 values('lilei','male');
3、第一次增量备份
innobackupex --user=root --password='Mysql@123' --parallel=8 --default-file=/etc/my.cnf --incremental /backup/inc --incremental-basedir=/backup/base/2021-02-26_09-41-06
4、第二次修改数据
insert t001 values('hanmm','female');
5、第二次增量备份(基于第一次增量备份做)
innobackupex --user=root --password='Mysql@123' --parallel=8 --default-file=/etc/my.cnf --incremental /backup/inc --incremental-basedir=/backup/inc/2021-02-26_09-49-31
6、第三次修改数据
mysql> insert t001 values('zhangs','male');
7、第三次增量备份(基于第二次增量备份做)
innobackupex --user=root --password='Mysql@123' --parallel=8 --default-file=/etc/my.cnf --incremental /backup/inc --incremental-basedir=/backup/inc/2021-02-26_09-53-00
8、将全量、增量数据 同步到目标备库上
# scp -rp /backup/ root@192.168.171.72:/
9、在目标备库上恢复数据
以下操作均在目标备库上操作
1>、停止数据库,并清空datadir
# systemctl stop mysqld
# rm -rf /var/lib/mysql/*
2>、预准备完全备份,--apply-log --redo-only,同步已经提交事务且不回滚未提交事务
innobackupex --apply-log --redo-only /backup/base/2021-02-26_09-41-06
3>、合并第1次增量备份到完全备份,同步已提交,且不回滚未提交事务。
innobackupex --apply-log --redo-only /backup/base/2021-02-26_09-41-06 --incremental-dir=/backup/inc/2021-02-26_09-49-31
4>、合并第2次增量备份到完全备份
innobackupex --apply-log --redo-only /backup/base/2021-02-26_09-41-06 --incremental-dir=/backup/inc/2021-02-26_09-53-00
5>、合并第3次增量备份到全备份(假设 第3次为最后一次增量,则不要加 --redo-only)
innobackupex --apply-log /backup/base/2021-02-26_09-41-06 --incremental-dir=/backup/inc/2021-02-26_10-46-48
6>、恢复数据
innobackupex --default-file=/etc/my.cnf --copy-back /backup/base/2021-02-26_09-41-06
7>、启动数据库
# chown -R mysql:mysql /var/lib/mysql
# systemctl restart mysqld
--apply-log-only 参数(only 指的就是只回放 redo log 阶段,跳过 undo 阶段),避免未完成事务的回滚。
--apply-log 对备份进行预处理操作,回滚未提交的事务及同步已经提交的事务至数据文件来确保数据文件处于一致性状态。
--redo-only 不回滚未提交事务,在合并增量备份时与--apply-log 一起使用。
redo-only除最后一次增量备份外,前面的增量备份在合并的时候都需要加上这个参数,即只进行前滚,不回滚,在备份进行时有事务未提交,很可能在下次增量备份的时候提交。如果执行了回滚,后面的备份将无法使用。redo是物理日志,记录数据库页的改变,全备事务未提交,redo只写了一半的事务数据,假使是个大事务,
需要写多个数据页,前M个数据页已写完,事务还没提交,增备的时候写完后面N个数据页,这样完整的事务是M+N的数据页,由于前M个数据页LSN未更新,增备的时候是不会备份这M个数据页的,如果应用undo,这样全备的M个数据页就会被回滚丢失,完整的事务就不是M+N个数据页了,只有增备的N个数据页,这样就丢失了M个数据页的数据。
总结:在还原时,做全量与各个增量合并时。正确的做法应该是除了最后一个增量备份外,之前的合并都要加 apply-log-only(或 --apply-log --redo-only )参数。
https://blog.csdn.net/weixin_34210740/article/details/92968372