命令记不住

登陆

Mysql 的物理备份 xtrabackup

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-MySQL

1.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.rpm
https://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.rpm
yum -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-timestamp

innobackupex --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/full

2.恢复备份:

前提:
1、被恢复的目录是空
2、被恢复的数据库的实例是关闭

systemctl stop mysqld

创建新目录

[root@db01 backup]# mkdir /data/mysql1

3.数据授权

chown -R mysql.mysql /data/mysql1

4.恢复备份

[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 = 0

1.合并所有备份

full + inc1  + inc2   =====>恢复周二晚上23:00

2.截取周二 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/full

3.截取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.sql

4.恢复备份

[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;
推荐阅读