Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点:
(1)备份过程快速、可靠;(2)备份过程不会打断正在执行的事务;(3)能够基于压缩等功能节约磁盘空间和流量;(4)自动实现备份检验;(5)还原速度快;
一、下载和安装
XtraBackup现在最新版本为2.1.5,官方也提供了2.0的版本可供下载,官方链接地址:http://www.percona.com/software/percona-xtrabackup;可以下载源码编译安装,也可以下载适合的RPM包或使用yum进行安装。由于没有需要特殊定制的,因此建议直接使用RPM安装即可。
安装方法一:
下载RPM安装包:
wget http://www.percona.com/downloads/XtraBackup/LATEST/RPM/rhel6/x86_64/percona-xtrabackup-2.1.5-680.rhel6.x86_64.rpm
安装依赖:
[root@localhost ~]# yum install -y perl-DBD-MySQL perl-DBI perl-Time-HiRes libaio*
安装:
[root@localhost ~]# rpm -ivh percona-xtrabackup-2.1.5-680.rhel6.x86_64.rpm
Preparing... ########################################### [100%]
1:percona-xtrabackup ########################################### [100%]
安装方法二:
安装percona源:
[root@localhost ~]# rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
使用yum安装percona-xtrabackup:
[root@localhost ~]# yum -y install percona-xtrabackup
查看安装结果:
[root@iZ2zeh44pi6rlahxj7s9azZ mnt ]# rpm -qa |grep xtrabackup
percona-xtrabackup-2.1.5-680.rhel6.x86_64
[root@iZ2zeh44pi6rlahxj7s9azZ mnt ]# rpm -ql percona-xtrabackup-2.1.5-680.rhel6.x86_64
/usr/bin/innobackupex
/usr/bin/innobackupex-1.5.1
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/bin/xtrabackup_55
/usr/bin/xtrabackup_56
/usr/share/doc/percona-xtrabackup-2.1.5
/usr/share/doc/percona-xtrabackup-2.1.5/COPYING
安装方法三:
二进制包安装:
进入网站选择的合适的二进制包https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.2/binary/
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.2/binary/tarball/percona-xtrabackup-2.3.2-Linux-x86_64.tar.gz
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]# tar -xvf percona-xtrabackup-2.3.2-Linux-x86_64.tar.gz
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]# cd percona-xtrabackup-2.3.2-Linux-x86_64
[root@iZ2zeh44pi6rlahxj7s9azZ percona-xtrabackup-2.3.2-Linux-x86_64]# cp bin/innobackupex /usr/bin
[root@iZ2zeh44pi6rlahxj7s9azZ percona-xtrabackup-2.3.2-Linux-x86_64]# cp bin/xtrabackup* /usr/bin
安装相关插件(重要)
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#yum install perl-DBI -y
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#yum install perl-DBD-MySQL -y
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#yum install perl-Time-HiRes -y
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#yum install perl-IO-Socket-SSL –y
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#yum install perl-Time-HiRes libaio*
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#yum install perl-TermReadKey.x86_64 -y
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#wget https://www.percona.com/downloads/perconatoolkit/3.0.3/binary/redhat/7/x86_64/percona-toolkit-3.0.3-1.el7.x86_64.rpm
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#rpm -ivh percona-toolkit-3.0.3-1.el7.x86_64.rpm
Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备份innodb, xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
二、使用xtrabackup实现对MySQL的备份:
2.1 完全备份:
基本语法1(信息尽量不全,顺序也很重要):
# innobackupex --defaults-file=/etc/my.cnf --user=user_name --host=IP --password='password' --port=dk
/data/backup
基本语法2:
xtrabackup --backup --target-dir=/data/backup/
用户所具备的权限(insert、select、create、super、process、create table space、replication client、reload、lock tables):
mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cret';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;
(1)还不支持mysql最新版的
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.19-log |
+------------+
1 row in set (0.00 sec)
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#innobackupex --user=root --host=127.0.0.1 --password='abc123' -P3307 --defaults-file=/data/my3307/my.cnf /data/backup/
170802 11:26:37 innobackupex: Starting the backup operation
IMPORTANT: Please check that the backup run completes successfully.
At the end of a successful backup run innobackupex
prints "completed OK!".
170802 11:26:37 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;host=127.0.0.1;port=3307;mysql_socket=/data/my3307/run/mysql.sock' as 'root' (using password: YES).
170802 11:26:37 version_check Connected to MySQL server
170802 11:26:37 version_check Executing a version check against the server...
170802 11:26:37 version_check Done.
170802 11:26:37 Connecting to MySQL server host: 127.0.0.1, user: root, password: set, port: 3307, socket: /data/my3307/run/mysql.sock
Error: Unsupported server version: '5.7.19-log'. Please report a bug at https://bugs.launchpad.net/percona-xtrabackup
(2)
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.37 |
+-----------+
1 row in set (0.00 sec)
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]# innobackupex --user=root --host=127.0.0.1 /data/backup/
170802 11:25:27 innobackupex: Starting the backup operation
IMPORTANT: Please check that the backup run completes successfully.
At the end of a successful backup run innobackupex
prints "completed OK!".
170802 11:25:27 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;host=127.0.0.1;mysql_socket=/var/lib/mysql/mysql.sock' as 'root' (using password: NO).
···
170802 11:25:31 version_check Done.
170802 11:25:31 Connecting to MySQL server host: 127.0.0.1, user: root, password: not set, port: 0, socket:
170802 11:25:33 Executing UNLOCK TABLES
170802 11:25:33 All tables unlocked
170802 11:25:33 Backup created in directory '/data/backup//2017-08-02_11-25-27'
170802 11:25:33 [00] Writing backup-my.cnf
170802 11:25:33 [00] ...done
170802 11:25:33 [00] Writing xtrabackup_info
170802 11:25:33 [00] ...done
xtrabackup: Transaction log of lsn (1626133) to (1626133) was copied.
170802 11:25:33 completed OK!
结果:
[root@iZ2zeh44pi6rlahxj7s9azZ backup]# ls
2017-08-02_14-05-03
[root@iZ2zeh44pi6rlahxj7s9azZ backup]# cd 2017-08-02_14-05-03/
[root@iZ2zeh44pi6rlahxj7s9azZ 2017-08-02_14-05-03]# ls
backup-my.cnf ibdata1 mysql performance_schema test xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile
各文件说明:
(1)xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;
每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
(2)xtrabackup_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置等信息。
(3)backup-my.cnf —— 备份命令用到的配置选项信息;
在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。
2.2增量备份:
[root@iZ2zeh44pi6rlahxj7s9azZ backup]# xtrabackup --backup --target-dir=/data/backup/inc1 --incremental-basedir=/data/backup
注:--target-dir=/data/backup/inc1 为增量备份所在的目录
--incremental-basedir=/data/backup 为增量备份之前备份的目录
[root@iZ2zeh44pi6rlahxj7s9azZ backups]# innobackupex --defaults-file=/etc/my.cnf --user=root --host=127.0.0.1 --incremental /data/backups/inc1 --incremental-basedir=/data/backups/2017-08-02_15-51-39/
注:--incremental-basedir=/data/backups/2017-08-02_15-51-39/ 全备目录
--incremental /data/backups/inc1 是增量备份目录
出现
completed OK!即成功
170802 15:10:15 [00] ...done
170802 15:10:15 [00] Writing xtrabackup_info
170802 15:10:15 [00] ...done
xtrabackup: Transaction log of lsn (1739172) to (1739172) was copied.
170802 15:10:15
completed OK!
[root@iZ2zeh44pi6rlahxj7s9azZ backup]# ls
backup-my.cnf ibdata1
inc1 mysql performance_schema test xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile
分别查看xtrabackup_checkpoints文件可查看backup_type以及二进制日志的情况
[root@iZ2zeh44pi6rlahxj7s9azZ inc1]# vim /data/backup/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 1710465
last_lsn = 1710465
compact = 0
recover_binlog_info = 0
[root@iZ2zeh44pi6rlahxj7s9azZ inc1]# vim /data/backup/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1710465
to_lsn = 1739172
last_lsn = 1739172
compact = 0
recover_binlog_info = 0
2.3恢复(备份合并后mysql服务器停掉)
语法1:
[root@iZ2zeh44pi6rlahxj7s9azZ backup]# xtrabackup --copy-back --target-dir=/data/backup/
语法2(合并增量备份到全量备份,然后利用合并后全量备份恢复):
第一步是在所有备份目录下重做已提交的日志
[root@iZ2zeh44pi6rlahxj7s9azZ backups]# innobackupex --apply-log --redo-only BASE-DIR
[root@iZ2zeh44pi6rlahxj7s9azZ backups]# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
[root@iZ2zeh44pi6rlahxj7s9azZ backups]# innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
BASE-DIR是指全备目录,INCREMENTAL-DIR-1是指第一次的增量备份,INCREMENTAL-DIR-2是指第二次的增量备份,以此类推。要注意的是:最后一步的增量备份并没有--redo-only选项
第二步
回滚未完成的日志
innobackupex --apply-log BASE-DIR
拷贝(默认为/var/lib/mysql,可以用--datadir=''指定)
[root@iZ2zeh44pi6rlahxj7s9azZ mysql]# innobackupex --copy-back /data/backups/2017-08-02_15-51-39/
出现
completed OK!即为成功
170802 15:31:46 [01] Copying ./test/test2.ibd to /var/lib/mysql/test/test2.ibd
170802 15:31:46 [01] ...done
170802 15:31:46 [01] Copying ./test/test2.frm to /var/lib/mysql/test/test2.frm
170802 15:31:46 [01] ...done
170802 15:31:46 completed OK!
赋权:
chown -R mysql:mysql /var/lib/mysql
增量备份的恢复也是按照语法恢复,不同的是target-dir
二进制包卸载方法:
[root@iZ2zeh44pi6rlahxj7s9azZ backup]# cd /usr/bin
[root@iZ2zeh44pi6rlahxj7s9azZ bin]# rm -rf innobackupex
[root@iZ2zeh44pi6rlahxj7s9azZ bin]# rm -rf xtrabackup*
--defaults-file 同xtrabackup的--defaults-file参数,指定配置文件的位置
--apply-log 对xtrabackup的--prepare参数的封装
--copy-back做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir ;
--remote-host=HOSTNAME通过ssh将备份数据存储到进程服务器上;
--stream=[tar]备份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定--stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件)。
在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。
--tmpdir=DIRECTORY当有指定--remote-host or --stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir
--redo-only --apply-log组,强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要。
--use-memory=#该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量
--throttle=IOS同xtrabackup的--throttle参数
--sleep=是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册 ;
--compress[=LEVEL]对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;
--include=REGEXP对 xtrabackup参数--tables的封装,也支持ibbackup。备份包含的库表,例如:--include="test.*",意思是要备份 test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:test1和test2,则写 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"。
--databases=LIST列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份;
--uncompress解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;
--slave-info备份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET 指定mysql.sock所在位置,以便备份进程登录mysql.
测试: