xtrabackup是由percona提供的mysql数据库备份工具,是一款开源的能够对innodb和xtradb数据库进行热备的工具。
xtrabackup对InnoDB支持热备,完全备份和增量备份;对MyISAM引擎支持温备,完全备份
一、特点: ①备份过程快速、可靠; ②备份过程不会打断正在执行的事务; ③能够基于压缩等功能节约磁盘空间和流量; ④自动实现备份检验; ④还原速度快;
二、安装: yum -y install percona-xtrabackup-2.3.4-1.el6.x86_64.rpm 安装XtraBackup后,会生成如下几个工具: innobackupex:这个是其实是下面三个工具的一个perl脚本封装,可以备份MyISAM, InnoDB, XtraDB表。但在处理MyISAM表时需要施加一个全局的读锁。通常使用该工具来作备份 xtrabackup:只能备份InnoDB和XtraDB数据。 xbcrypt:用来加密或解密备份的数据。 xbstream:用来解压或压缩xbstream格式的压缩文件。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| [iyunv@node1 ~]# yum -y install percona-xtrabackup-2.3.4-1.el6.x86_64.rpm
...
Installed:
percona-xtrabackup.x86_64 0:2.3.4-1.el6
Dependency Installed:
libev.x86_64 0:4.03-3.el6 mysql-libs.x86_64 0:5.1.73-5.el6_6 perl-DBD-MySQL.x86_64 0:4.013-3.el6
Complete!
[iyunv@node1 ~]# rpm -ql percona-xtrabackup
/usr/bin/innobackupex
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/share/doc/percona-xtrabackup-2.3.4
/usr/share/doc/percona-xtrabackup-2.3.4/COPYING
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz
|
三、innobackupex的常用选项 --host:指定数据库服务器地址 --port:指定连接到数据库服务器的哪个端口 --socket:连接本地数据库时使用的套接字路径 --no-timestamp:在使用innobackupex进行备份时,可使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据 --default-files:可通过此选项指定其它的配置文件;但是使用时必须放于所有选项的最前面 --incremental:指定创建增量备份 --incremental-basedir:指定基于哪个备份做增量备份 --apply-log:应用xtrabackup_logfile文件,重做已提交的事务,回滚未提交的事务 --redo-only:只重做已提交的事务,不准加滚 --use-memory:在“准备”阶段可提供多少内存以加速处理,默认是100M --copy-back:恢复备份至数据库服务器的数据目录 --compact:压缩备份 --stream={tar|xbstream}:对备份的数据流式化处理
四、备份的实现 1、完全备份(注意:xtrabackup不会备份二进制文件) innobackupex --user=DBUSER --host=SERVER --password=DBUSERPASS /path/to/BACKUP-DIR
如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户: mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’bkpuser’@’localhost' identified by 's3cret';
mysql> FLUSH PRIVILEGES;
使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中。
在备份的同时,innobackupex还会在备份目录中创建如下文件: ①xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息。例如: backup_type = full-backuped from_lsn = 0 to_lsn = 1291135 每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。 ②xtrabackup_binlog_info:mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。 ③xtrabackup_logfile:xtrabackup会把备份开始以后增加的事务日志复制到此文件中 ④xtrabackup_info:有关此次备份的各种详细信息 ⑤backup-my.cnf:备份命令用到的配置选项信息; 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| #以下备份和原始数据位于同一主机上,纯粹为演示方便,实际环境中尽量分开
[iyunv@node1 ~]# innobackupex /backup #执行完全备份
...
160305 07:44:45 [00] Writing backup-my.cnf
160305 07:44:45 [00] ...done
160305 07:44:45 [00] Writing xtrabackup_info
160305 07:44:45 [00] ...done
xtrabackup: Transaction log of lsn (1827871) to (1827871) was copied.
160305 07:44:45 completed OK!
[iyunv@node1 ~]# ls /backup
2016-03-05_07-44-42
[iyunv@node1 ~]# cd /backup/2016-03-05_07-44-42/
[iyunv@node1 2016-03-05_07-44-42]# ls
backup-my.cnf hellodb ibdata1 library mysql performance_schema test testdb
xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile
[iyunv@node1 2016-03-05_07-44-42]# man innobackupex
[iyunv@node1 2016-03-05_07-44-42]# cat xtrabackup_binlog_info
mysql-bin.000007 326 0-1-30
[iyunv@node1 2016-03-05_07-44-42]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 1827871
last_lsn = 1827871
compact = 0
recover_binlog_info = 0
[iyunv@node1 2016-03-05_07-44-42]# cat xtrabackup_info
uuid = 13334d2d-e263-11e5-b40f-000c2940359d
name =
tool_name = innobackupex
tool_command = /backup
tool_version = 2.3.4
ibbackup_version = 2.3.4
server_version = 10.0.13-MariaDB-log
start_time = 2016-03-05 07:44:42
end_time = 2016-03-05 07:44:45
lock_time = 0
binlog_pos = filename 'mysql-bin.000007', position '326', GTID of the last change '0-1-30'
innodb_from_lsn = 0
innodb_to_lsn = 1827871
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N
|
2、增量备份
我们知道,innodb会维护一个redo log file(即事务日志文件),它会记录每个innodb表数据的修改。每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。 xtrabackup会在后台开启一个log-copying的线程,该线程会对redo log file进行监视,并把从LSN(Xtrabackup在启动时会从redo log file中获取最近一次的checkpoint对应的log sequence number)开始增加的数据块(日志记录)不断的复制到叫xtrabackup_logfile的文件中。这个操作会在整个备份过程中一直进行,这也是为什么xtrabackup能对innodb表进行增量备份和热备的原因。
innobackupex --incremental /data/backups --incremental-basedir=DIR --incremental:指定创建增量备份
--incremental-basedir:基于哪个备份目录做增量备份,第一次增量备份应指向完全备份目录,后续增量备份应指向上一次的增量备份目录 此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据 第一个增量备份目录中的xtrabackup_checkpoints内容可能类似: backup_type = incremental from_lsn = 1291135 to_lsn = 1352113 我们也可使用--incremental-lsn选项直接指定LSN来做增量备份: innobackupex --incremental /data/backups --incremental-lsn=最近一次备份的to_lsn 因此,第二个增量备份也可写作: innobackupex --incremental /data/backups --incremental-lsn=1352113 注意:增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。 1
2
3
4
| MariaDB [(none)]> use electronic
Database changed
MariaDB [electronic]> create table computer (Brand char(15) not null primary key,Quantify int);
Query OK, 0 rows affected (0.31 sec)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| [iyunv@node1 ~]# innobackupex --incremental /backup --incremental-basedir=/backup/2016-03-05_07-44-42/
...
MySQL binlog position: filename 'mysql-bin.000007', position '638', GTID of the last change '0-1-32'
160305 08:43:47 [00] Writing backup-my.cnf
160305 08:43:47 [00] ...done
160305 08:43:47 [00] Writing xtrabackup_info
160305 08:43:47 [00] ...done
xtrabackup: Transaction log of lsn (1831879) to (1831879) was copied.
160305 08:43:47 completed OK!
[iyunv@node1 ~]# ls /backup
2016-03-05_07-44-42 2016-03-05_08-43-41
[iyunv@node1 ~]# cd /backup/2016-03-05_08-43-41/
[iyunv@node1 2016-03-05_08-43-41]# ls
backup-my.cnf hellodb ibdata1.meta mysql test xtrabackup_binlog_info xtrabackup_info
electronic ibdata1.delta library performance_schema testdb xtrabackup_checkpoints xtrabackup_logfile
[iyunv@node1 2016-03-05_08-43-41]# ls electronic/
computer.frm computer.ibd.delta computer.ibd.meta db.opt
[iyunv@node1 2016-03-05_08-43-41]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1827871
to_lsn = 1831879
last_lsn = 1831879
compact = 0
recover_binlog_info = 0
|
1
2
3
4
| MariaDB [(none)]> use electronic
Database changed
MariaDB [electronic]> create table computer (Brand char(15) not null primary key,Quantify int);
Query OK, 0 rows affected (0.31 sec)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| [iyunv@node1 ~]# innobackupex --incremental /backup --incremental-lsn=1831879 #可基于lsn号做增量备份
[iyunv@node1 ~]# ls /backup
2016-03-05_07-44-42 2016-03-05_08-43-41 2016-03-05_09-24-41
[iyunv@node1 ~]# cd /backup/2016-03-05_09-24-41/
[iyunv@node1 2016-03-05_09-24-41]# ls
backup-my.cnf electronic ibdata1.delta library performance_schema testdb xtrabackup_checkpoints xtrabackup_logfile
commodity hellodb ibdata1.meta mysql test xtrabackup_binlog_info xtrabackup_info
[iyunv@node1 2016-03-05_09-24-41]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1831879
to_lsn = 1837327
last_lsn = 1837327
compact = 0
recover_binlog_info = 0
|
3、“准备”(prepare)备份 在备份完成后,数据尚且不能直接用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务,而且备份过程中可能还有数据的更改动作,此时xtrabackup_logfile就可派上用场了。xtrabackup会解析该文件,对事务已经提交但数据还没有写入的部分,进行redo重做;将已经写到数据文件,但未提交的事务通过undo进行回滚,从而使得数据文件处于一致性状态。此功能是通过使用innobakupex命令的 --apply-log 选项实现的;另外,一个事务在前一个备份中没有提交,但可能在其后的备份中提交了,innobakupex命令的 --redo-only 选项表示只能redo,不能回滚,此选项在合并增量备份中需要用到(最后一个除外)。 执行步骤: innobackupex --apply-log --redo-only BASE-DIR innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1 #合并第一个增量备份 innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2 #合并最后一个增量备份 innobackupex --apply-log BASE-DIR #合并所有增量备份后对所有未提交的事务进行回滚 其中BASE-DIR指的是完全备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,依次类推。 注意:增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。
4、从备份中恢复数据(数据恢复完毕后最好做一次完全备份)注意:恢复不用启动MySQL innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。 innobackupex --copy-back /path/to/BACKUP-DIR 如果执行正确,其输出信息的最后几行通常如下: innobackupex: Starting to copy InnoDB log files innobackupex: in '/backup/2012-04-07_08-17-03' innobackupex: back to original InnoDB log directory '/mydata/data' innobackupex: Finished copying back files.
120407 09:36:10 innobackupex: completed OK! 要确保如上信息的最行一行出现“innobackupex: completed OK!”。 注意: 恢复之前,mysql服务必须停止 恢复之前,数据目录必须为空,--copy-back不会覆盖已存在的文件,除非添加选项--force-non-empty-directories 当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。如: chown -R mysql:mysql /mydata/data/ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| #还原备份
MariaDB [(none)]> drop database hellodb;
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000007 | 1067 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> exit
Bye
[iyunv@node1 ~]# service mysqld stop
Shutting down MySQL.. SUCCESS!
[iyunv@node1 ~]# cat /backup/2016-03-05_09-24-41/xtrabackup_binlog_info
mysql-bin.000007 942 0-1-34
[iyunv@node1 ~]# mysqlbinlog /mysql-binlog/mysql-bin.000007 | less
...
# at 980
#160305 9:52:24 server id 1 end_log_pos 1067 Query thread_id=15 exec_time=0 error_code=0
SET TIMESTAMP=1457142744/*!*/;
drop database hellodb
...
[iyunv@node1 ~]# mysqlbinlog --start-position=942 --stop-position=980 /mysql-binlog/mysql-bin.000007 > /tmp/mysql.sql
[iyunv@node1 ~]# innobackupex --apply-log --redo-only /backup/2016-03-05_07-44-42
...
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1827871
160305 10:04:42 completed OK!
[iyunv@node1 ~]# innobackupex --apply-log --redo-only /backup/2016-03-05_07-44-42 --incremental-dir=/backup/2016-03-05_08-43-41
...
[iyunv@node1 ~]# innobackupex --apply-log /backup/2016-03-05_07-44-42 --incremental-dir=/backup/2016-03-05_09-24-41
...
160305 10:09:45 completed OK!
[iyunv@node1 ~]# innobackupex --apply-log /backup/2016-03-05_07-44-42
...
[iyunv@node1 ~]# innobackupex --copy-back /backup/2016-03-05_07-44-42/
...
160305 10:28:43 [01] Copying ./xtrabackup_info to /mydata/data/xtrabackup_info
160305 10:28:43 [01] ...done
160305 10:28:43 completed OK!
[iyunv@node1 ~]# ls /mydata/data
commodity hellodb ib_logfile0 library node1.err test xtrabackup_binlog_pos_innodb
electronic ibdata1 ib_logfile1 mysql performance_schema testdb xtrabackup_info
[iyunv@node1 ~]# chown -R mysql.mysql /mydata/data
[iyunv@node1 ~]# vim /etc/my.cnf
...
[mysqld]
...
skip-networking
...
[iyunv@node1 ~]# service mysqld start
Starting MySQL.. SUCCESS!
[iyunv@node1 ~]# mysql < /tmp/mysql.sql
[iyunv@node1 ~]# vim /etc/my.cnf
...
[mysqld]
...
skip-networking #去掉该行
[iyunv@node1 ~]# service mysqld reload
SUCCESS! Reloading service MySQL
|
5、Xtrabackup的“流”及“备份压缩”功能 Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅需要使用--stream选项即可。 例如:innobackupex --stream=tar /backup | gzip > /backup/`date +%F_%H-%M-%S`.tar.gz 甚至也可以使用类似如下命令将数据备份至其它服务器: innobackupex --stream=tar /backup | ssh user@www.magedu.com "cat - > /backups/`date +%F_%H-%M-%S`.tar" 此外,在执行备份时,还可以使用 --parallel 选项对多个文件进行并行复制。此选项用于指定在复制时启动的线程数目。当然,在实际进行备份时要利用此功能的便利性,也需要启用innodb_file_per_table选项或共享的表空间通过innodb_data_file_path选项存储在多个ibdata文件中。对某一数据库的多个文件的复制无法利用到此功能。其简单使用方法如下: innobackupex --parallel /path/to/backup 同时,innobackupex备份的数据文件也可以存储至远程主机,这可以使用--remote-host选项来实现: innobackupex --remote-host=root@www.magedu.com /path/IN/REMOTE/HOST/to/backup
6、导入或导出单张表 默认情况下,InnoDB表不能通过直接复制表文件的方式在mysql服务器之间进行移植,即便使用了innodb_file_per_table选项。而使用Xtrabackup工具可以实现此种功能,不过,此时需要“导出”表的mysql服务器启用了innodb_file_per_table选项(严格来说,是要“导出”的表在其创建之前,mysql服务器就启用了innodb_file_per_table选项),并且“导入”表的服务器同时启用了innodb_file_per_table和innodb_expand_import选项。 ①“导出”表 导出表是在备份的prepare阶段进行的,因此,一旦完全备份完成,就可以在prepare过程中通过--export选项将某表导出了: innobackupex --apply-log --export /path/to/backup 此命令会为每个innodb表的表空间创建一个以.exp结尾的文件,这些以.exp结尾的文件则可以用于导入至其它服务器。 ②“导入”表 要在mysql服务器上导入来自于其它服务器的某innodb表,需要先在当前服务器上创建一个跟原表表结构一致的表,而后才能实现将表导入: mysql> CREATE TABLE mytable (...) ENGINE=InnoDB; 然后将此表的表空间删除: mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE; 接下来,将来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器的数据目录,然后使用如下命令将其“导入”: chown mysql.mysql mytable.ibd mytable.exp #导入之前先修改其属主属组 mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;
7、使用Xtrabackup对数据库进行部分备份 Xtrabackup也可以实现部分备份,即只备份某个或某些指定的数据库或某数据库中的某个或某些表。但要使用此功能,必须启用 innodb_file_per_table 选项,即每张表保存为一个独立的文件。同时,其也不支持--stream选项,即不支持将数据通过管道传输给其它程序进行处理。 此外,还原部分备份跟还原全部数据的备份也有所不同,即不能通过简单地将prepared的部分备份使用 --copy-back 选项直接复制回数据目录,而是要通过导入表的方向来实现还原,如果表较多的话就比较麻烦。当然,有些情况下,部分备份也可以直接通过--copy-back进行还原,但这种方式还原而来的数据多数会产生数据不一致的问题,因此,不推荐使用这种方式。 ①创建部分备份 有三种方式:正则表达式(--include), 枚举表文件(--tables-file)和列出要备份的数据库(--databases)。 (a)使用--include 要求为其指定要备份的表的完整名称,即形如databasename.tablename innobackupex --include='^mydatabase[.]mytable' /path/to/backup (b)使用--tables-file 此选项的参数需要是一个文件名,此文件中每行包含一个要备份的表的完整名称; echo -e 'magedu.tb1\nmagedu.tb2' > /tmp/tables.txt innobackupex --tables-file=/tmp/tables.txt /path/to/backup (c)使用--databases 此选项接受的参数为数据库名,如果要指定多个数据库,彼此间需要以空格隔开;同时,在指定某数据库时,也可以只指定其中的某张表。此外,此选项也可以接受一个文件为参数,文件中每一行为一个要备份的对象。如: innobackupex --databases="hellodb testdb" /path/to/backup ②整理(preparing)部分备份 prepare部分备份的过程类似于导出表的过程,要使用--export选项进行: innobackupex --apply-log --export /path/to/partial/backup 此命令执行过程中,innobackupex会调用xtrabackup命令从数据字典中移除缺失的表,因此,会显示出许多关于“表不存在”类的警告信息。同时,也会显示出为备份文件中存在的表创建.exp文件的相关信息。 ③还原部分备份 还原部分备份的过程跟导入表的过程相同。当然,也可以通过直接复制prepared状态的备份直接至数据目录中实现还原,不过此时要求数据目录处于一致状态。
8、压缩备份 innobackup通过 --compack 选项提供了压缩备份的功能,压缩备份以忽略辅助索引为代价来获取更小的备份体积,因此,在“准备”备份的阶段会花更多的时间重建辅助索引。 注意:压缩备份不支持“统一表空间”,只支持“单独表空间”(innodb-file-per-table) 创建压缩备份: innobackupex --compact /data/backups 若压缩成功,则备份目录的xtrabackup_checkpoints文件中会有一行“compact = 1”; “准备”压缩备份:需要指定 --rebuild-indexed 选项 innobackupex --apply-log --rebuild-indexes /data/backups/2013-02-01_10-29-48
|