
Mysql的物理备份xtrabackup
MySQL物理备份工具- xtrabackup (XBK)(Xbackup)
1.xtrabackup安装
1.1 安装依赖包:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL1.2 下载软件并安装
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpmhttps://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpmyum -y install percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
2.备份命令介绍:
xtrabackup innobackupex ****** # 会自动读取/etc/my.cnf文件。
3.备份方式(物理备份)
(1)对于非Innodb表(比如 myisam)是直接,锁表cp数据文件,属于一种温备份。
(2)对于Innodb的表(支持事务的),不锁表,拷贝数据页,最终以数据文件的方式保存下来,把redo和undo一并备走,属于热备方式。面试题:
xbk在innodb表备份恢复的流程
- 0、xbk备份执行的瞬间,立即触发ckpt,已提交的数据脏页,从内存刷写到磁盘,并记录此时的LSN号
- 1、备份时,拷贝磁盘数据页,并且记录备份过程中产生的redo和undo一起拷贝走,也就是checkpoint LSN之后的日志
- 2、在恢复之前,模拟Innodb“自动故障恢复”的过程,将redo(前滚)与undo(回滚)进行应用
- 3、恢复过程是cp 备份到元数据目录下
4.innobackupex全备
innobackupex --user=root --password=123 /backup自主定制备份路径名
--no-timestampinnobackupex --user=root --password=123 --no-timestamp /backup/full备份集中多出来的文件:
-rw-r----- 1 root root 24 Jun 29 09:59 xtrabackup_binlog_info -rw-r----- 1 root root 119 Jun 29 09:59 xtrabackup_checkpoints -rw-r----- 1 root root 489 Jun 29 09:59 xtrabackup_info -rw-r----- 1 root root 2560 Jun 29 09:59 xtrabackup_logfile(1)
xtrabackup_binlog_info:(备份时刻的binlog位置)[root@db01 full]# cat xtrabackup_binlog_info mysql-bin.000003 536749记录的是备份时刻,
binlog的文件名字和当时的结束的position,可以用来作为截取binlog时的起点。(2)
xtrabackup_checkpoints:backup_type = full-backuped from_lsn = 0 上次所到达的LSN号(对于全备就是从0开始,对于增量有别的显示方法) to_lsn = 160683027 备份开始时间(ckpt)点数据页的LSN last_lsn = 160683036 备份结束后,redo日志最终的LSN compact = 0 recover_binlog_info = 0(1)备份时刻,立即将已经commit过的,内存中的数据页刷新到磁盘(CKPT).开始备份数据,数据文件的LSN会停留在to_lsn位置。
(2)备份时刻有可能会有其他的数据写入,已备走的数据文件就不会再发生变化了。
(3)在备份过程中,备份软件会一直监控着redo的undo,如果一旦有变化会将日志也一并备走,并记录LSN到last_lsn。从
to_lsn ----> last_lsn就是,备份过程中产生的数据变化.
5.innobackupex全备的恢复
1.准备备份(
Prepared)
将redo进行重做,已提交的写到数据文件,未提交的使用undo回滚掉。模拟了CSR的过程[root@db01 ~]# innobackupex --apply-log /backup/full2.恢复备份:
前提:
1、被恢复的目录是空
2、被恢复的数据库的实例是关闭systemctl stop mysqld创建新目录
[root@db01 backup]# mkdir /data/mysql13.数据授权
chown -R mysql.mysql /data/mysql14.恢复备份
[root@db01 full]# cp -a /backup/full/* /data/mysql1/5.启动数据库
vim /etc/my.cnf datadir=/data/mysql1 [root@db01 mysql1]# chown -R mysql.mysql /data/mysql1 [root@db01 mysql1]# systemctl start mysqld
6.innobackupex 增量备份(incremental)
(1)增量备份的方式,是基于上一次备份进行增量。
(2)增量备份无法单独恢复。必须基于全备进行恢复。
(3)所有增量必须要按顺序合并到全备中。1.增量备份命令
(1)删掉原来备份
略.
(2)全备(周日)[root@db01 backup]# innobackupex --user=root --password --no-timestamp /backup/full >&/tmp/xbk_full.log(3)模拟周一数据变化
db01 [(none)]>create database cs charset utf8; db01 [(none)]>use cs db01 [cs]>create table t1 (id int); db01 [cs]>insert into t1 values(1),(2),(3); db01 [cs]>commit;(4)第一次增量备份(周一)
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/full /backup/inc1 &>/tmp/inc1.log(5)模拟周二数据
db01 [cs]>create table t2 (id int); db01 [cs]>insert into t2 values(1),(2),(3); db01 [cs]>commit;(6)周二增量
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/inc1 /backup/inc2 &>/tmp/inc2.log(7)模拟周三数据变化
db01 [cs]>create table t3 (id int); db01 [cs]>insert into t3 values(1),(2),(3); db01 [cs]>commit; db01 [cs]>drop database cs;2.恢复到周三误drop之前的数据状态
恢复思路 :
0.prepared备份细节?
--apply-log Prepare a backup in BACKUP-DIR by applying the transaction log file named "xtrabackup_logfile" located in the same directory. Also, create new transaction logs. The InnoDB configuration is read from the file "backup-my.cnf". --redo-only This option should be used when preparing the base full backup and when merging all incrementals except the last one. This forces xtrabackup to skip the "rollback" phase and do a "redo" only. This is necessary if the backup will have incremental changes applied to it later. See the xtrabackup documentation for details.从
to_lsn ----> last_lsn就是,备份过程中产生的数据变化.[root@db01 backup]# cat full/xtrabackup_checkpoints backup_type = full-backuped from_lsn = 0 to_lsn = 193224106 last_lsn = 193224115 compact = 0 recover_binlog_info = 0 [root@db01 backup]# cat inc1/xtrabackup_checkpoints backup_type = incremental from_lsn = 193224106 to_lsn = 193230292 last_lsn = 193230301 compact = 0 recover_binlog_info = 0 [root@db01 backup]# cat inc2/xtrabackup_checkpoints backup_type = incremental from_lsn = 193230292 to_lsn = 193237888 last_lsn = 193237897 compact = 0 recover_binlog_info = 01.合并所有备份
full + inc1 + inc2 =====>恢复周二晚上23:002.截取周二 23:00 到drop binlog
7.innobackupex 增量恢复
1.恢复思路:
(1)full+inc1+inc2 (2)需要将inc1 inc2 按顺序去合并到full中 (3)分步骤进行--apply-log (3.1) full 准备 只应用redo,不应用undo (3.2) inc1 备份合并到full中,并且apply-log,只应用redo,不应用undo (3.3) inc2 备份合并到full中,并且apply-log,redo和undo都要应用 (3.4) 合并所有备份之后再次对full 备份 apply-log ,redo和undo都要应用2.准备备份
(1) apply-log全备[root@db01 backup]# innobackupex --apply-log --redo-only /backup/full(2) inc1 合并全备
[root@db01 backup]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full(3) inc2 合并全备
[root@db01 backup]# innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full(4) 全备的最终的准备
[root@db01 backup]# innobackupex --apply-log /backup/full3.截取binlog
[root@db01 backup]#cat inc2/xtrabackup_binlog_info mysql-bin.000025 1196 3413f1ef-ee30-11e8-aeb5-000c29e5974b:1-18, 36dbc733-f24d-11e8-8988-000c2966cef5:1-3, 3e2b249e-595c-11e9-9a35-000c293d3ec1:1-9, e19b2919-aa86-11e9-ab68-000c293d3ec1:1-5 db01-[(none)]>show binlog events in 'mysql-bin.000025'; +------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+ | mysql-bin.000025 | 4 | Format_desc | 6 | 123 | Server ver: 5.7.20-log, Binlog ver: 4 | | mysql-bin.000025 | 1165 | Xid | 6 | 1196 | COMMIT /* xid=58 */ | | mysql-bin.000025 | 1196 | Gtid | 6 | 1261 | SET @@SESSION.GTID_NEXT= 'e19b2919-aa86-11e9-ab68-000c293d3ec1:6' | | mysql-bin.000025 | 1261 | Query | 6 | 1355 | use `cs`; create table t3 (id int) | | mysql-bin.000025 | 1355 | Gtid | 6 | 1420 | SET @@SESSION.GTID_NEXT= 'e19b2919-aa86-11e9-ab68-000c293d3ec1:7' | | mysql-bin.000025 | 1420 | Query | 6 | 1490 | BEGIN | | mysql-bin.000025 | 1490 | Table_map | 6 | 1533 | table_id: 275 (cs.t3) | | mysql-bin.000025 | 1533 | Write_rows | 6 | 1583 | table_id: 275 flags: STMT_END_F | | mysql-bin.000025 | 1583 | Xid | 6 | 1614 | COMMIT /* xid=78 */ | | mysql-bin.000025 | 1614 | Gtid | 6 | 1679 | SET @@SESSION.GTID_NEXT= 'e19b2919-aa86-11e9-ab68-000c293d3ec1:8' | | mysql-bin.000025 | 1679 | Query | 6 | 1765 | drop database cs |'e19b2919-aa86-11e9-ab68-000c293d3ec1:6-7' [root@db01 backup]#mysqlbinlog --skip-gtids --include-gtids='e19b2919-aa86-11e9-ab68-000c293d3ec1:6-7' /data/binlog/mysql-bin.000025 >/backup/bin.sql4.恢复备份
[root@db01 backup]#mkdir /data/mysql2 [root@db01 backup]#cp -a /backup/full/* /data/mysql2/ [root@db01 backup]#chown -R mysql.mysql /data/mysql2/ [root@db01 backup]#vim /etc/my.cnf [mysqld] basedir=/server/tools/mysql #datadir=/data/mysql1 datadir=/data/mysql2 [root@db01 backup]#systemctl start mysqld ++++++++++++++++++++++++++++++++ db01-[cs]>use cs ------------------------------ db01-[cs]>source /backup/bin.sql
8.innobackupex备份集中单独恢复表
drop table city; create table city like city_bak; alter table city discard tablespace; cp /backup/full/world/city.ibd /application/mysql/data/world/ chown -R mysql.mysql /application/mysql/data/world/city.ibd alter table city import tablespace;