1、安装xtrabackup
下载:
安装依赖包
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev
yum localinstall percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm -y
备份原理(物理备份):
非事务表: 直接锁表拷贝数据文件,属于温备份
事务表(支持事务) 不锁表,拷贝数据页,最终以数据文件的方式保存下来,并把
一部分redo 和undo一起备份,属于热备。
xtrabackup(xbk) 在innodb 表备份恢复的流程
0、xbk备份执行时的瞬间,立即触发ckpt操作,把已提交的数据脏页刷写道磁盘,并记录此时的LSN号;
1、备份过程中,拷贝磁盘数据页,并且记录备份过程中产生的redo和undo数据一起拷贝走,也就是checkpoint LSN 之后的日志;
2、在恢复之前,模拟innodb "自动故障恢复“ 的过程,将redo(前滚)与undo(后滚)日志进行应用;
3、恢复过程是把备份的数据拷贝到数据目录下
备份命令:
innobackupex --user=root --password='123' --host='192.168.1.141' --no-timestamp /tmp/xbk/`date +%Y%m%d`
z注意:如何mysql的配置文件默认不是/etc/my.cnf,在innobackupex 命令后面需要紧跟--defaults-file参数,否则会报错。
3、修改mysql的数据目录的权限
chown -R mysql.mysql /data/mysql/
4、 启动mysql
5、验证是否恢复
增量备份:
全量备份:
innobackupex --defaults-file=/etc/my.cnf --host=192.168.1.141 --user=root --password='123' --no-timestamp /tmp/xbk/20190620
第一次备份:
innobackupex --defaults-file=/etc/my.cnf --host=192.168.1.141 --user=root --password=‘123' --no-timestamp --incremental /tmp/xbk/inc1 --incremental-basedir=/tmp/xbk/20190620 &>/tmp/inc1.log
第二次备份:
innobackupex --defaults-file=/etc/my.cnf --host=192.168.1.141 --user=root --password='123' --no-timestamp --incremental /tmp/xbk/inc2 --incremental-basedir=/tmp/xbk/inc2 &>/tmp/inc2.log
第三次备份:
innobackupex --defaults-file=/etc/my.cnf --host=192.168.1.141 --user=root --password='123' --no-timestamp --incremental /tmp/xbk/inc3 --incremental-basedir=/tmp/xbk/inc2 &> /tmp/inc3.log
增量恢复:
增量恢复方案:
需要注意的几点要求:
1、增量不能单独恢复;
2、增量必须按照顺序合并到全备中(LSN号码);
3、所有备份都必须要 添加 参数--apply-log 进行整理备份
4、部分备份需要只redo不undo (添加--redo-only)
开始恢复:
1、没有合并之前全备整理(--redo-only)
innobackupex --apply-log --redo-only /tmp/xbk/20160920
2、合并并整理第一次增量备份
innobackupex --apply-log --redo-only --incremental-dir=/tmp/xbk/inc1 /tmp/xbk/20190620/
3、检查第一次增量备份是否成功(查看全备份中last_lsn 是否与inc1 中的last_lsn号一样);
[root@s9 ~]# more /tmp/xbk/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 463412246
to_lsn = 488331312
last_lsn = 488331321
compact = 0
recover_binlog_info = 0
flushed_lsn = 488331321
[root@s9 ~]# more /tmp/xbk/20190620/xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 488331312
last_lsn = 488331321
compact = 0
recover_binlog_info = 0
flushed_lsn = 488331321
4、合并与整理第二次增量备份到全备份中
innobackupex --apply-log --redo-only --incremental-dir=/tmp/xbk/inc2 /tmp/xbk/20190620
5、检查第二次合并是否成功
[root@s9 ~]# more /tmp/xbk/20190620/xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 538193205
last_lsn = 538193214
compact = 0
recover_binlog_info = 0
flushed_lsn = 538193214
[root@s9 ~]# more /tmp/xbk/inc2/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 488331312
to_lsn = 538193205
last_lsn = 538193214
compact = 0
recover_binlog_info = 0
flushed_lsn = 538193214
6、第三次增量备份整理合并
innobackupex --apply-log --incermental-dir=/tmp/xbk/inc3 /tmp/xbk/20190620/
7、检查第三次增量整理是否成功
[root@s9 ~]# more /tmp/xbk/inc2/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 488331312
to_lsn = 538193205
last_lsn = 538193214
compact = 0
recover_binlog_info = 0
flushed_lsn = 538193214
[root@s9 ~]# more /tmp/xbk/20190620/xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 563100438
last_lsn = 563100447
compact = 0
recover_binlog_info = 0
flushed_lsn = 563100447
[root@s9 ~]# more /tmp/xbk/inc3/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 538193205
to_lsn = 563100438
last_lsn = 563100447
compact = 0
recover_binlog_info = 0
flushed_lsn = 563100447
[root@s9 ~]#
8、全备份的终极整理
innobackupex --apply-log /tmp/xbk/20190620
9、使用第三次增量备份之后的binlog进行恢复
9.1 判断binlog的起点
cat /tmp/xbk/inc3/xtrabackup_binlog_info
binlog.000001 75968070 1df18ff9-8bf5-11e9-8dc1-000c2985543e:1-40,
9.2 确定终点
>show binary logs;
> show binlog events in 'binlog.000001';
9.3 截取二进制日志
mysqlbinlog --skip-gtids --include-gtid='df8a6757-9335-11e9-a63a-000c2985543e:41-153' > /data/mysql/binlog.000001 > /tmp/bin.sql
10、恢复数据
10.1 准备新环境进行恢复
10.2 xbk文件进行恢复
cp -rf /tmp/xbk/20190620 /data/mysql
chown -R mysql.mysql /data/mysql
10.3 启动新的数据库实例
10.4 测试恢复情况
10.5 恢复二进制日志
mysql -uroot -h192.168.1.145 -p
> source /tmp/bin.log
10.6 再次查看数据是否恢复到故障之前的状态
思考: 如何总的备份数据量很大500以上,但是误删了一个20M的小表。如何快速恢复?
思路:对没有误删操作的表可以使用重新导入表空间的方式来快速恢复正常的大表。
alter table t_name discard tablespace;
alter table t_name import tablespace;
表空间传输注意事项:
1)、mysql版本必须是5.6及以上版本;
2)、使用独立表空间,(innodb_file_per_table=1)
3)、原库和目标库之间page size 必须一致
4)、当表做导入操作时,该表只能进行只读操作
思路: 使用mydumper 进行备份
流式化备份
1、非压缩模式的备份 --stream=tar 备份到/data/backup 目录
innobackupex --defaults-file=/etc/my.cnf --no-timestamp --user=root --password=123 --host=mysql_server_ip --stream=tar /tmp > /data/backup/all.tar
2、压缩模式
innobackupex --defaults-file=/etc/my.cnf --host=mysql_server_ip --user=root \
--password=123 --no-timestamp --stream=tar /tmp | gzip - > /data/backup/all.tar.gz
3、远程备份
注意:设置ssh 使用key验证登录,不能输密码
innobackupex --defaults-file=/etc/my.cnf --host=mysql_server_ip --user=root \
--password=123 --no-timestamp --stream=tar /tmp | gzip | ssh root@backup_server_ip \
"cat - > /data/backup/all.tar.gz"