MySQL备份工具之xtrabakcup使用
一、xtrabackup介绍
Xtrabackup是percona的一个开源项目,可以热备份innodb,XtraDB,和MyISAM(会锁表),可以看做是mysql商业备份工具InnoDB Hotbackup的免费替代品。
Xtrabackup安装完成后有4个可执行文件,其中2个比较重要的备份工具是innobackupex、xtrabackup
1)xtrabackup只能备份InnoDB和XtraDB两种数据库表,支持在线热备份,可以在不加锁的情况下备份Innodb数据表,不过此工具不能操作MyiSAM引擎表
2)innobackupex 是一个封装xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。
3)xbcrypt 加密解密备份工具
4)xbstream 流传打包传输工具,类似tar
Xtrabackup优点
1. 备份速度快,物理备份可靠
2. 备份过程不会打断正在执行的事务(无需锁表)
3. 能够基于压缩等功能节约磁盘空间和流量
4. 自动备份校验
5. 还原速度快
6. 可以流传将备份传输到另外一台机器上
7. 在不增加服务器负载的情况备份数据
二、innobackupex参数
innobackupex参数:
2.1 常用选项:
--user:该选项表示备份账号
--password:该选项表示备份的密码
--port:该选项表示备份数据库的端口
--host:该选项表示备份数据库的地址
--socket:该选项表示mysql.sock所在位置,以便备份进程登录mysql
--stream:该选项表示流式备份的格式,backup完成之后以指定格式到STDOUT,目前只支持tar和xbstream
--defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置,否则会报错
--no-timestamp:该选项可以表示不创建一个时间戳目录来存储备份,指定到自己想要的备份文件夹
--databases:该选项接受的参数为数据库名,如果要指定多个数据库,彼此间需要以空格隔开,同时,在指定某数据库时,
也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份
所有innodb表
--compact:该选项表示创建一份没有辅助索引的紧凑的备份
--compress:该选项表示压缩innodb数据文件的备份
--decompress:该选项表示解压--compress选项压缩的文件
--compress-threads:该选项表示并行压缩worker线程的数量
--defaults-group:该选项表示从配置文件读取的组,innobakcupex多个实例部署时使用
--export:这个选项表示开启可导出单独的表之后再导入其他Mysql中
--redo-only:--apply-log组, 强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要
--use-memory:该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量
--include:该选项表示使用正则表达式匹配表的名字[db.tb],要求为其指定匹配要备份的表的完整名称,
即databasename.tablename。
--apply-log:该选项表示同xtrabackup的--prepare参数一样。一般情况下,在备份完成后,数据尚且不能用于恢复操
作因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时
数据文件仍处理不一致状态。--apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据
文件使数据文件处于一致性状态。
--slave-info:该选项表示对slave进行备份的时候使用,打印出master的名字和binlog pos,同样将这些信息以
change master的命令写入xtrabackup_slave_info文件。可以通过基于这份备份启动一个从库
-safe-slave-backup:该选项表示为保证一致性复制状态,这个选项停止SQL线程并且等到show status中的slave_open_temp_tables为0的时候开始备份,如果没有打开临时表,bakcup会立刻开始,否则SQL线程启动或者关闭知道没有打开的临时表。如果slave_open_temp_tables在--safe-slave-backup-timeount(默认300秒)秒之后不为0,从库sql线程会在备份完成的时候重启
--parallel=#:指定备份时拷贝多个数据文件并发的进程数,默认值为1
--rsync:该选项表示通过rsync工具优化本地传输,当指定这个选项,innobackupex使用rsync拷贝非Innodb文件
而替换cp,当有很多DB和表的时候会快很多,不能--stream一起使用
高级选项:
--incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir
--incremental-dir:该选项表示增量备份的目录
--incremental-force-scan:该选项表示创建一份增量备份时,强制扫描所有增量备份中的数据页
--incremental-lsn:该选项表示指定增量备份的LSN,与--incremental选项一起使用
--incremental-basedir:该选项表示基于某一目录进行增量备份,与--incremental同时使用
2.2 普通全量备份和还原
备份:
[root@host-39-108-217-12 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 /opt/backup/xtrabackup/
恢复:
1.利用--apply-log,通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
[root@host-39-108-217-12~]# innobackupex --apply-log /opt/backup/xtrabackup/2018-06-28_17-36-07/
2.要先保证mysql的data目录为空,这里需要手动data目录下所有文件或者移除到其它目录下
[root@host-39-108-217-12 xtrabackup]# rm -rf /var/lib/mysql/data/*
3.恢复
[root@host-39-108-217-12 ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /opt/backup/xtrabackup/2018-06-28_17-36-07/
2.3 普通增量备份和还原
1.新建三个目录,一个全备目录,一个增量目录1,一个增量目录2
[root@host-39-108-217-12 backup]# ll
drwxr-xr-x 2 root root 4096 Jun 29 09:33 full-backup
drwxr-xr-x 2 root root 4096 Jun 29 09:33 incremental-backup1
drwxr-xr-x 2 root root 4096 Jun 29 09:33 incremental-backup2
2.全量备份,这里举例所有库,也可以是指定几个库或者单个表
[root@host-39-108-217-12 ~]# innobackupex --defaults-file --user=root --password=123456 /opt/backup/full-backup/
注:time nnobackupex --defaults-file --user=root --password=123456 /opt/backup/full-backup/
备份完成后会有如下提示,并且time命令会产生改命令耗时时间:
real 0m2.254s
user 0m0.114s
sys 0m0.088s
3.创建test1库,在全量备份的基础上再进行增量备份1
MariaDB [(none)]> create database zhang1;
[root@host-39-108-217-12 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental-basedir=/opt/backup/full-backup/2018-06-29_10-05-08/ --incremental /opt/backup/incremental-backup1/
4.创建test2库,在增量备份1的基础上再进行增量备份2
MariaDB [(none)]> create database zhang2;
[root@host-39-108-217-12 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental-basedir=/opt/backup/incremental-backup1/2018-06-29_10-07-53/ --incremental /opt/backup/incremental-backup2/
5.查看备份文件
全备下的文件
[root@host-39-108-217-12 backup]# cat full-backup/2018-06-29_10-05-08/xtrabackup_checkpoints
backup_type = full-backuped #状态为全备
from_lsn = 0 #开始的lsn
to_lsn = 14312609 #结束的lsn
last_lsn = 14312609
compact = 0
recover_binlog_info = 0
第一次增量备份下的文件
[root@host-39-108-217-12 backup]# cat incremental-backup1/2018-06-29_10-07-53/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 14312609
to_lsn = 14312609
last_lsn = 14312609
compact = 0
recover_binlog_info = 0
第二次增量备份下的文件
[root@host-39-108-217-12 backup]# cat incremental-backup2/2018-06-29_10-10-38/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 14312609
to_lsn = 14312609
last_lsn = 14312609
compact = 0
recover_binlog_info = 0
6.查看当前数据库有哪些库
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| zabbix |
| zhang1 |
| zhang2 |
+--------------------+
================================================================================================
7.还原
[root@host-39-108-217-12 ~]# systemctl stop mariadb #停止数据库
[root@host-39-108-217-12 ~]# rm -rf /var/lib/mysql/data/* #删除数据库存放数据目录下的所有文件
1.第一次还原:
[root@host-39-108-217-12 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log --redo-only /opt/backup/full-backup/2018-06-29_10-05-08/
2.第二次还原,带增量备份1
[root@host-39-108-217-12 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log --redo-only /opt/backup/full-backup/2018-06-29_10-05-08/ --incremental-dir=/opt/backup/incremental-backup1/2018-06-29_10-07-53/
3.第三次还原,带增量备份2
[root@host-39-108-217-12 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log --redo-only /opt/backup/full-backup/2018-06-29_10-05-08/ --incremental-dir=/opt/backup/incremental-backup2/2018-06-29_10-10-38/
4.利用--apply-log,通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
[root@host-39-108-217-12 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log /opt/backup/full-backup/2018-06-29_10-05-08/
5.进行一次全量还原
[root@host-39-108-217-12 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --copy-back /opt/backup/full-backup/2018-06-29_10-05-08/
注:
--incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir
--incremental-dir:该选项表示增量备份的目录
--incremental-force-scan:该选项表示创建一份增量备份时,强制扫描所有增量备份中的数据页
--incremental-lsn:该选项表示指定增量备份的LSN,与--incremental选项一起使用
--incremental-basedir:该选项表示基于某一目录进行增量备份,与--incremental同时使用
--apply-log:通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
--redo-only:强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要,增量备份需要使用该命令
6.还原之后,查看数据库情况
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| zabbix |
| zhang1 |
| zhang2 |
+--------------------+
7 rows in set (0.00 sec)
至此:数据库恢复成功!!!
2.4 普通全量压缩备份和还原
备份(--stream):
[root@host-39-108-217-12 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --stream=tar /opt/backup/xtrabackup/ | gzip >/opt/backup/xtrabackup/db_`date +%F`.tar.gz
恢复:
1.解压:
[root@host-39-108-217-12 xtrabackup]# tar axf db_2018-06-28.tar.gz
注:打包压缩备份,注意:--compress不能和--stream=tar一起使用
2.利用--apply-log,通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
[root@host-39-108-217-12 xtrabackup]# innobackupex --apply-log /opt/backup/xtrabackup/
3.要先保证mysql的data目录为空,这里需要手动data目录下所有文件或者移除到其它目录下
[root@host-39-108-217-12 xtrabackup]# rm -rf /var/lib/mysql/data/*
4.恢复
[root@host-39-108-217-12 xtrabackup]# innobackupex --defaults-file=/etc/my.cnf --copy-back /opt/backup/xtrabackup/
2.5.如何为mysql从库进行备份
一般来说,线上生产环境往往都不是单实例,而是高可用集群,一主一从、一主多从等等,通常主库提供服务,从库做备份。
那么,如何利用innobackupex工具为从库进行备份呢?
[root@host-39-108-217-12 full-backup]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --slave-info --safe-slave-backup --parallel=5 /opt/backup/full-backup/
三、xtrabackup参数
xtrabackup参数:
--apply-log-only:prepare备份的时候只执行redo阶段,用于增量备份
--backup:创建备份并且放入--target-dir目录中
--compact:创建一份没有辅助索引的紧凑备份
--compress:压缩所有输出数据,包括事务日志文件和元数据文件