一. Xtrabackup介绍
XtraBackup由数据库软件服务企业percona提供的一款热备工具,除了能够支持常见的innodb、myisam存储引擎外,还支持XtraDB引擎(在innodb存储引擎基础上开发).
XtraBackup的几个优点:
a. 备份集高校、完整、可用
b. 备份任务执行过程中不会阻塞事务
c. 节省磁盘空间,降低网络带宽占用
d. 备份集自动验证机制
e. 恢复更快二. xtrabackup-24-2.4.8安装
1. 安装依赖rpm包
[root@mysql ~]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
warning: libev-4.15-1.el6.rf.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 6b8d79e6: NOKEY
Preparing... ########################################### [100%]
1:libev ########################################### [100%]
[root@mysql ~]# rpm -ivh MySQL-shared-compat-5.6.36-1.linux_glibc2.5.x86_64.rpm
warning: MySQL-shared-compat-5.6.36-1.linux_glibc2.5.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing... ########################################### [100%]
1:MySQL-shared-compat ########################################### [100%]
[root@mysql ~]# rpm -ivh perl-DBD-MySQL-4.013-3.el6.x86_64.rpm
warning: perl-DBD-MySQL-4.013-3.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
1:perl-DBD-MySQL ########################################### [100%]
2. 安装xtabackup
[root@mysql ~]# rpm -ivh percona-xtrabackup-24-2.4.8-1.el6.x86_64.rpm
warning: percona-xtrabackup-24-2.4.8-1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing... ########################################### [100%]
1:percona-xtrabackup-24 ########################################### [100%]
[root@mysql ~]# xtrabackup --version
xtrabackup version 2.4.8 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 97330f7)
三. 使用xtrabackup
Xtrabackup命令有两种模式
--backup:创建备份集
--prepare:准备备份集
前者是为了备份,后者是为了恢复。
1. 使用xtrabackup命令备份数据库
[mysql@mysql ~]# xtrabackup --defaults-file=/u01/my3306/my.cnf --user='xtrabk' --password='mysqld' --socket=/u01/my3306/run/mysql.sock --backup --target-dir=/backup/bak/bak_20180110
--backup:指定当前的操作模式,backup即是要创建备份集
--target-dir:指定备份集的存储路径,如果指定的路径不存在,那么xtrabackup会自动创建,而如果目录存在,需要确保该目录为空,否则xtrabackup在备份时会抛出异常。
--defaults-file:从mysql的选项文件中读取参数,最重要的是获取到datadir的参数值。另外xtrabackup的参数也可以放在这个文件中,这样就不用每次执行都去指定参数了。
备份过程解析:
step1. 查找数据文件的路径,搜集innodb相关的信息
xtrabackup: cd to /u01/my3306/data
xtrabackup: open files limit requested 65535, set to 65535
xtrabackup: using the following InnoDB configuration:
xtrabackup: innodb_data_home_dir = /u01/my3306/log/iblog
xtrabackup: innodb_data_file_path = ibdata1:32M;ibdata2:16M:autoextend
xtrabackup: innodb_log_group_home_dir = /u01/my3306/log/iblog
xtrabackup: innodb_log_files_in_group = 4
xtrabackup: innodb_log_file_size = 1048576000
step2.复制文件
180110 05:10:54 [01] Copying /u01/my3306/log/iblog/ibdata1 to /backup/bak/bak_20180110/ibdata1
180110 05:10:54 >> log scanned up to (119285621)
180110 05:10:55 >> log scanned up to (119285621)
180110 05:10:55 [01] ...done
180110 05:10:55 [01] Copying /u01/my3306/log/iblog/ibdata2 to /backup/bak/bak_20180110/ibdata2
180110 05:10:56 >> log scanned up to (119285621)
180110 05:10:56 [01] ...done
180110 05:10:56 [01] Copying ./falcon_links/alert.ibd to /backup/bak/bak_20180110/falcon_links/alert.ibd
180110 05:10:56 [01] ...done
180110 05:10:56 [01] Copying ./dashboard/dashboard_screen.ibd to /backup/bak/bak_20180110/dashboard/dashboard_screen.ibd
180110 05:10:56 [01] ...done
180110 05:10:56 [01] Copying ./dashboard/tmp_graph.ibd to /backup/bak/bak_20180110/dashboard/tmp_graph.ibd
180110 05:10:56 [01] ...done
180110 05:10:56 [01] Copying ./dashboard/dashboard_graph.ibd to /backup/bak/bak_20180110/dashboard/dashboard_graph.ibd
180110 05:10:56 [01] ...done
180110 05:10:56 [01] Copying ./easydo/auth_permission.ibd to /backup/bak/bak_20180110/easydo/auth_permission.ibd
step3. 备份完成180110 05:11:04 Finished backing up non-InnoDB tables and files
180110 05:11:04 [00] Writing /backup/bak/bak_20180110/xtrabackup_binlog_info
180110 05:11:04 [00] ...done
180110 05:11:04 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '119285621'
xtrabackup: Stopping log copying thread.
.180110 05:11:04 >> log scanned up to (119285621)
180110 05:11:05 Executing UNLOCK TABLES
180110 05:11:05 All tables unlocked
180110 05:11:05 Backup created in directory '/backup/bak/bak_20180110/'
MySQL binlog position: filename 'binlog.000008', position '18726254'
180110 05:11:05 [00] Writing /backup/bak/bak_20180110/backup-my.cnf
180110 05:11:05 [00] ...done
180110 05:11:05 [00] Writing /backup/bak/bak_20180110/xtrabackup_info
180110 05:11:05 [00] ...done
xtrabackup: Transaction log of lsn (119285621) to (119285621) was copied.
180110 05:11:05 completed OK!
备份集:
[mysql@mysql bak_20180110]# ls -ll
total 49220
-rw-r----- 1 root root 434 Jan 10 05:11 backup-my.cnf
drwxr-x--- 2 root root 4096 Jan 10 05:11 cheungssh
drwxr-x--- 2 root root 4096 Jan 10 05:11 dashboard
drwxr-x--- 2 root root 4096 Jan 10 05:11 db_monitor
drwxr-x--- 2 root root 4096 Jan 10 05:11 easydo
drwxr-x--- 2 root root 4096 Jan 10 05:11 falcon_links
drwxr-x--- 2 root root 4096 Jan 10 05:11 falcon_portal
drwxr-x--- 2 root root 4096 Jan 10 05:11 graph
-rw-r----- 1 root root 33554432 Jan 10 05:10 ibdata1
-rw-r----- 1 root root 16777216 Jan 10 05:10 ibdata2
drwxr-x--- 2 root root 4096 Jan 10 05:11 myblog
drwxr-x--- 2 root root 4096 Jan 10 05:11 mysql
drwxr-x--- 2 root root 4096 Jan 10 05:11 performance_schema
drwxr-x--- 2 root root 4096 Jan 10 05:11 test
drwxr-x--- 2 root root 4096 Jan 10 05:11 uic
-rw-r----- 1 root root 23 Jan 10 05:11 xtrabackup_binlog_info
-rw-r----- 1 root root 117 Jan 10 05:11 xtrabackup_checkpoints
-rw-r----- 1 root root 575 Jan 10 05:11 xtrabackup_info
-rw-r----- 1 root root 2560 Jan 10 05:11 xtrabackup_logfile
2. innobackupex命令
innobackup与xtrabackup的区别:
a. inno备份包含myisam引擎的表(performance、myisam),但备份时会加锁
b. inno会备份库信息(db.opt文件)即frm表(.frm文件)结构
c. innodb备份的backup-my.cnf文件记录innodb的一些参数
d. inno备份binlog相关信息
所以一般使用innobackupex进行数据库备份
使用innobackupex备份数据库
[mysql@mysql ~]# innobackupex --defaults-file=/u01/my3306/my.cnf --user='root' --password='mysqld' --socket=/u01/my3306/run/mysql.sock /backup/bak
--备份集
与xtrabackup不同,innobackupex并不需要特别明确目录,只需要指定父目录,innobackupex会自动在其中创建带有备份时间的子目录。如果不希望让innobackupex自动创建子目录,可以通过—no-timestamp禁用,这样备份集就会保存在指定的路径下。
[mysql@mysql 2018-01-10_05-28-34]# ls -ll
total 49220
-rw-r----- 1 root root 434 Jan 10 05:28 backup-my.cnf
drwxr-x--- 2 root root 4096 Jan 10 05:28 cheungssh
drwxr-x--- 2 root root 4096 Jan 10 05:28 dashboard
drwxr-x--- 2 root root 4096 Jan 10 05:28 db_monitor
drwxr-x--- 2 root root 4096 Jan 10 05:28 easydo
drwxr-x--- 2 root root 4096 Jan 10 05:28 falcon_links
drwxr-x--- 2 root root 4096 Jan 10 05:28 falcon_portal
drwxr-x--- 2 root root 4096 Jan 10 05:28 graph
-rw-r----- 1 root root 33554432 Jan 10 05:28 ibdata1
-rw-r----- 1 root root 16777216 Jan 10 05:28 ibdata2
drwxr-x--- 2 root root 4096 Jan 10 05:28 myblog
drwxr-x--- 2 root root 4096 Jan 10 05:28 mysql
drwxr-x--- 2 root root 4096 Jan 10 05:28 performance_schema
drwxr-x--- 2 root root 4096 Jan 10 05:28 test
drwxr-x--- 2 root root 4096 Jan 10 05:28 uic
-rw-r----- 1 root root 23 Jan 10 05:28 xtrabackup_binlog_info --记录备份时的二进制日志文件位置
-rw-r----- 1 root root 117 Jan 10 05:28 xtrabackup_checkpoints --记录lsn以及备份类型
-rw-r----- 1 root root 542 Jan 10 05:28 xtrabackup_info
-rw-r----- 1 root root 2560 Jan 10 05:28 xtrabackup_logfile --备份日志文件,记录备份操作过程中数据库的变更
innobackupex在备份时会调用xtrabackup命令备份innodb的表,然后再备份其他非innodb存储引擎的表,但是无法备份memory引擎表。
四. 增量备份
对于Xtrabackup,只有innodb引擎表对象才有真正意义上的增量备份,其他如myisam/csv这类引擎的表对象,其实都是完整备份。因为只有innodb有lsn(日志序列号)。
Innodb的每个页都保存有LSN,这个序号能标识该页最后修改时间,增量备份正事基于这个lsn而来,每次增量备份xtrabackup都会在备份集中创建一个xtrabackup_checkpoints的文件,这个文件的内容就记录了最后修改的lsn序列号。创建增量备份集时,只需要从上次的备份集中找到xtrabackup_checkpoints文件,读取最新的lsn,而后在创建增量时,选择比lsn大于这个序号的页,以及这期间产生的二进制日志。
1. 增量备份示例:
--备份前先做修改操作
mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> create table test(id int,name varchar(32));
Query OK, 0 rows affected (0.12 sec)
mysql> insert into test values(1,'test');
Query OK, 1 row affected (0.00 sec)
mysql> alter table test add column names varchar(32);
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
--进行增量备份
[root@mysql ~]# innobackupex --defaults-file=/u01/my3306/my.cnf --user=root --password=mysqld --socket=/u01/my3306/run/mysql.sock --incremental --incremental-basedir=/backup/bak/2018-01-10_05-28-34 /backup/bak/backup_rec
--Incremental:类型为增量备份
--incremental-basedir:指定一个全量备份的路径,作为增量备份的基础
备份集:
[mysql@mysql 2018-01-10_05-38-47]# ls -ll
total 1020
-rw-r----- 1 root root 434 Jan 10 05:38 backup-my.cnf
drwxr-x--- 2 root root 4096 Jan 10 05:38 cheungssh
drwxr-x--- 2 root root 4096 Jan 10 05:38 dashboard
drwxr-x--- 2 root root 4096 Jan 10 05:38 db_monitor
drwxr-x--- 2 root root 4096 Jan 10 05:38 easydo
drwxr-x--- 2 root root 4096 Jan 10 05:38 falcon_links
drwxr-x--- 2 root root 4096 Jan 10 05:38 falcon_portal
drwxr-x--- 2 root root 4096 Jan 10 05:38 graph
-rw-r----- 1 root root 950272 Jan 10 05:38 ibdata1.delta
-rw-r----- 1 root root 44 Jan 10 05:38 ibdata1.meta
-rw-r----- 1 root root 16384 Jan 10 05:38 ibdata2.delta
-rw-r----- 1 root root 44 Jan 10 05:38 ibdata2.meta
drwxr-x--- 2 root root 4096 Jan 10 05:38 myblog
drwxr-x--- 2 root root 4096 Jan 10 05:38 mysql
drwxr-x--- 2 root root 4096 Jan 10 05:38 performance_schema
drwxr-x--- 2 root root 4096 Jan 10 05:38 test
drwxr-x--- 2 root root 4096 Jan 10 05:38 uic
-rw-r----- 1 root root 23 Jan 10 05:38 xtrabackup_binlog_info
-rw-r----- 1 root root 123 Jan 10 05:38 xtrabackup_checkpoints
-rw-r----- 1 root root 629 Jan 10 05:38 xtrabackup_info
-rw-r----- 1 root root 2560 Jan 10 05:38 xtrabackup_logfile
--对于innodb的表,增量备份中多了两个扩展名为.meta,.delta的文件,这两个文件用来记录表对象的元数据,比如说页的大小、是否压缩过。
增量备份过程中,如果知道了备份开始时的lsn,其实根本就不需要指定已有的备份集路径了,只是就算备份的过程中不需要,恢复的时候也要用到2. 增量备份工作机制
Xtrabackup的本质是基于innodb的故障恢复(creash-recovry)机制,它先复制innodb的数据文件,当然复制的时候由于数据仍有可能正在读写,复制出的文件可能是不一致的状态,所以它在备份的过程中需要定时扫描日志并做记录,而后通过事务的日志文件执行故障恢复,使文件恢复到一个一致性状态,是数据库达到可用状态。
这里面的核心是innodb维护的重做日志,当启动innodb时,它会检查数据文件及其事务日志,然后执行两步操作:应用提供了的事务日志到数据文件,并回滚未提交事务所做的修改。类似于oracle故障恢复的过程。
Xtrabackup会在启动时先记录下当前的日志序列号(lsn),然后开始复制数据,如果文件较大,那么复制可能会花费一段时间,如果再次期间数据库发生了更改,那么它们实际上就是不同的时间点数据库的状态。在同一个时间内,xtrabackup运行一个后台进程,监控着事务日志文件,并复制新发生的更改。这项操作在备份恢复的过程中一直执行,即log scanning to,以确保记录下所有备份期间数据库新发生的修改。接下来是准备进程(prepare process),在这一步中,xtrabackup对复制的数据文件执行故障恢复,将数据库恢复到可用状态。
Innobackupex封装自动执行的操作,已备份myisam表以及其相关的.frm文件,也会自动调用xtrabackup,借助其完成innodb引擎数据文件的复制,而后会执行flush tables with read lock语句刷新myisam表并持有相关锁,以避免此期间myisam的表发生修改,知道复制完myisam相关文件后,就会释放锁。
备份的innodb表和myisam表应该是一致的,因为在预备(recovery)进程之后innodb的数据也已经前滚到了备份完成的时间点,而非备份开始的是简单。这个时间点就是执行flush tables with read lock的时间点。
五. 执行恢复
从大的类别来看,恢复分为两类,全量恢复和增量恢复。而对于XtraBackup恢复操作来说,有两个命令,xtraback和innobackupex。其次在实现上又将恢复分为两个步骤
准备恢复(prerare):即为恢复做准备,就是说备份集不能直接拿来用,因为中间可能存在未提交或未回滚的事务,数据文件不一致或缺失相关的文件,所以需要一个对备份集做准备的过程。
a. 对于xtrabackup来说,对应的参数为—prepare。Xtrabackup命令有两种模式,backup模式和prepare模式。
b. 对于innobackupex来说 ,对应的参数是—apply-log,即应用日志。Innobackupex在执行时会调用xtrabackup命令,因此也涉及到xtrabackup的—prepare模式。
执行恢复(copy-back):xtrabackup没有与执行恢复相关的参数,只有备份集的恢复准备工作。
Innoback命令则提供了专用的回复参数—copy-back,功能即是将制定的备份集恢复到指定的datadir目录。
1. 模拟故障
[mysql@mysql my3306]# mv data databak
2. 进行恢复
--对全量恢复做恢复的准备工作
[mysql@mysql ~]# innobackupex --defaults-file=/u01/my3306/my.cnf --apply-log --redo-only /backup/bak/2018-01-10_05-28-34
Apply-log:从指定的选项文件中读取配置信息并应用日志,即对备份集做恢复的准备工作,如果要做恢复,本参数必须制定。
read-only:如果进行准备工作的备份集操作完成后,还有其他增量备份集待处理,那么必须指定该参数。本参数会强制xtrabckup只应用redo而不回滚。如果没有增量备份则无需指定。另外,恢复时是不需要指定用户名和密码等参数的。
--继续指定innobackupex命令,应用增量备份,这次要操作的增量备份就是最后一份,因此不需要再指定—read-only参数。
mysql@mysql ~]# innobackupex --defaults-file=/u01/my3306/my.cnf --apply-log /backup/bak/2018-01-10_05-28-34 --incremental-dir=/backup/bak/backup_rec/2018-01-10_05-38-47
incremental-dir:指定要处理的增量备份集路径
注意在恢复的过程中不能随意中断该任务,否则可能会导致备份集不一致。可以在恢复前把备份集也进行备份。
--建议再执行一次innobackupex –apply-log,第一次准备是为了是数据文件达到一致性的状态,第二次则是为了创建innodb的专用日志文件,因为这些文件不会备份,当然mysql在启动过程中可以自动创建,但相对较慢[mysql@mysql ~]# innobackupex --defaults-file=/u01/my3306/my.cnf --apply-log /backup/bak/2018-01-10_05-28-34
--执行恢复
[mysql@mysql ~]# innobackupex --defaults-file=/u01/my3306/my.cnf --copy-back /backup/bak/2018-01-10_05-28-34
--检查数据
mysql> select * from test;
+------+------+-------+
| id | name | names |
+------+------+-------+
| 1 | test | NULL |
+------+------+-------+
1 row in set (0.00 sec)
六. 打包压缩备份集
[mysql@mysql ~]$ innobackupex --defaults-file=/u01/my3306/my.cnf --user=root --password=mysqld --socket=/u01/my3306/run/mysql.sock --stream=tar /tmp |gzip -> /backup/bak/xtrea_fullbackup.tar.gz
流格式标准输出的数据会被临时保存到/tmp目录,通过管道符将其压缩为.gzip格式。