一. xtrabackup 介绍
Xtrabackup 是一个对 InnoDB 做数据备份的工具, 支持在线热备份 (备份时不影响数据读写) 它由 percona 提供的 MySQL 数据库备份工具, 据官方介绍, 这也是世界上惟一一款开源的能够对 innodb 和 xtradb 数据库进行热备的工具.
特点:
(1)备份过程快速, 可靠;
(2)备份过程不会打断正在执行的事务;
(3)能够基于压缩等功能节约磁盘空间和流量;
(4)自动实现备份检验;
(5)还原速度快;
注意: xtrabackup 只能备份 InnoDB 和 XtraDB 两种数据表, 而不能备份 MyISAM 数据表 但是 innobackupex: 是将 xtrabackup 进行封装的 perl 脚本, 提供了备份 myisam 表的能力.
二. 下载安装 xtrabackup
2.1 下载 xtrabackup 的 rpm 包
https://www.percona.com/downloads/XtraBackup/LATEST/
2.2 安装相关依赖包
[root@zha ~]# yum install -y prel-DBD-MySQL perl-DBI perl-Time-HiRes libaio*
2.3 安装 xtrabackup 的 rpm 包
- [root@zha ~]# rpm -ivh percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm
- warning: percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
- Preparing... ########################################### [100%]
- 1:percona-xtrabackup-24 ########################################### [100%]
如果报错:
- [root@zha ~]# rpm -ivh percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm
- warning: percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
- error: Failed dependencies:
- libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.11-1.el6.x86_64
提示缺少 libev 的 rpm 包
http://rpm.pbone.net/index.php3?stat=26&dist=74&size=74692&name=libev-4.15-1.el6.rf.x86_64.rpm(livev 包下载地址)
安装 libev 包再安装 xtrabackup 即可
- [root@zha ~]# 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%]
2.4 查看安装结果:
- [root@zha ~]# rpm -qa | grep xtrabackup
- percona-xtrabackup-24-2.4.11-1.el6.x86_64
- [root@zha ~]# rpm -ql percona-xtrabackup-24-2.4.11-1.el6.x86_64
- /usr/bin/innobackupex
- /usr/bin/xbcloud
- /usr/bin/xbcloud_osenv
- /usr/bin/xbcrypt
- /usr/bin/xbstream
- /usr/bin/xtrabackup
- /usr/lib64/xtrabackup/plugin/keyring_file.so
- /usr/lib64/xtrabackup/plugin/keyring_vault.so
- /usr/share/doc/percona-xtrabackup-24-2.4.11
- /usr/share/doc/percona-xtrabackup-24-2.4.11/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
Xtrabackup 中主要包含两个工具:
xtrabackup: 是用于热备份 innodb, xtradb 表中数据的工具, 不能备份其他类型的表, 也不能备份数据表结构;
innobackupex: 是将 xtrabackup 进行封装的 perl 脚本, 提供了备份 myisam 表的能力.
三. 使用 xtrabackup 对 MySQL 完全备份
3.1 完全备份
语法: innobackupex --user = 用户名 --password = 密码 备份目录位置
如果报错: Can't load'/usr/local/lib64/perl5/auto/DBD/MySQL/MySQL.so' for module DBD::MySQL: libmysqlclient.so.18: 无法打开共享对象 at /usr/bin/innobackupex line 18
需要拷贝 libmysqlclient.so.18 至 / usr/lib64
- cp /usr/local/MySQL/lib/libmysqlclient.so.18 /usr/lib64/
- # 完全备份到 / mysql_backup / 目录下
- [root@zha ~]# innobackupex --user=root /mysql_backup/
- 180504 17:28:28 completed OK! (出现 ok 即可)
备份后的文件: 在备份的同时, 备份数据会在备份目录下创建一个以当前日期时间为名字的目录存放备份文件.
查看备份后的数据
各文件说明:
(1)xtrabackup_checkpoints -- 备份类型 (如完全或增量), 备份状态(如是否已经为 prepared 状态) 和 LSN(日志序列号)范围信息;
每个 InnoDB 页 (通常为 16k 大小) 都会包含一个日志序列号, 即 LSN.LSN 是整个数据库系统的系统版本号, 每个页面相关的 LSN 能够表明此页面最近是如何发生改变的.
(2)xtrabackup_binlog_info -- MySQL 服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置.
(3)xtrabackup_binlog_pos_innodb -- 二进制日志文件及用于 InnoDB 或 XtraDB 表的二进制日志文件的当前 position.
(4)xtrabackup_binary -- 备份中用到的 xtrabackup 的可执行文件;
(5)backup-my.cnf -- 备份命令用到的配置选项信息;
在使用 innobackupex 进行备份时, 还可以使用 --no-timestamp 选项来阻止命令自动创建一个以时间命名的目录; 如此一来, innobackupex 命令将会创建一个 BACKUP-DIR 目录来存储备份数据.
准备 (prepare) 一个完全备份
一般情况下, 在备份完成后, 数据尚且不能用于恢复操作, 因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务. 因此, 此时数据文件仍处理不一致状态."准备" 的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态.
- [root@zha 2018-05-04_17-28-25]# innobackupex --apply-log /mysql_backup/2018-05-04_17-28-25/
- 180504 17:38:38 completed OK!
在实现 "准备" 的过程中, innobackupex 通常还可以使用 - use-memory 选项来指定其可以使用的内存的大小, 默认通常为 100M. 如果有足够的内存可用, 可以多划分一些内存给 prepare 的过程, 以提高其完成速度.
3.2 完全备份恢复
- # 复制目录到 / zha 下
- [root@zha ~]# cp -r /mysql_backup/2018-05-04_17-28-25/ /zha (以防玩脱)
- # 模拟数据库故障(关闭数据库并删除数据文件)
- [root@zha ~]# /etc/init.d/mysqld stop
- Shutting down MySQL. [ OK ]
- [root@zha ~]# cd /usr/local/MySQL/data/
- [root@zha data]# ls
- ibdata1 MySQL-bin.000001 performance_schema
- ib_logfile0 MySQL-bin.000002 test
- ib_logfile1 MySQL-bin.000003 zha
- MySQL MySQL-bin.index zha.err
- [root@zha data]# rm -rf *
- [root@zha data]# ls (数据已经没有了)
- # 恢复
- [root@zha data]# innobackupex --copy-back /mysql_backup/2018-05-04_17-28-25/
- 180504 18:04:14 completed OK!
如果报错 Error: datadir must be specified. 意思是(在默认配置文件 /etc/my.cnf 中, 没有找到 datadir 配置项)
- VIM /etc/my.cnf # 加入 datadir 配置项即可
- datadir = /usr/local/MySQL/data
- # 再次查看 / data 目录, 数据已经恢复
- [root@zha data]# ls
- ibdata1 performance_schema
- ib_logfile0 xtrabackup_info
- ib_logfile1 xtrabackup_master_key_id
- ibtmp1 zha
- MySQL
- # 修改权限启动 MySQL
- [root@zha ~]# chown -R MySQL:MySQL /usr/local/MySQL/data/
- [root@zha ~]# /etc/init.d/mysqld start
- Starting MySQL.. [ OK ]
四. 使用 xtrabackup 对 MySQL 增量备份
4.1 创建测试库, 表, 然后插入测试数据
- MySQL> create database test character set utf8;
- Query OK, 1 row affected (0.00 sec)
- MySQL> use test;
- Database changed
- MySQL> create table test (id int(10) not null,name varchhar(20));
- Query OK, 0 rows affected (0.03 sec)
- MySQL> insert into test values(1,'chenjiaxin');
- Query OK, 1 row affected (0.01 sec)
- MySQL> insert into test values(1,'陈嘉欣');
- Query OK, 1 row affected (0.00 sec)
- MySQL> select * from test;
- +----+------------+
- | id | name |
- +----+------------+
- | 1 | chenjiaxin |
| 1 | 陈嘉欣 |
- +----+------------+
- 2 rows in set (0.00 sec)
- MySQL> exit;
- Bye
- # 第一次完全备份
- [root@zha ~]# innobackupex --user=root --database=test --no-timestamp /mysql_backup/
- 180504 18:35:39 completed OK!
- # 第二次添加数据
- MySQL> use test;
- Database changed
- MySQL> insert into test values(2,'test');
- Query OK, 1 row affected (0.04 sec)
- MySQL> exit;
- Bye
- # 第一次增量备份
- [root@zha mysql_backup]# innobackupex --user=root --database=test --no-timestamp --incremental-basedir=/mysql_backup/ --incremental /test2
- 180504 18:48:24 completed OK!
- # --incremental-basedir=/data/backup_db/test_incre 第一次增备指定全备路径
- # --incremental 参数说明这是一次增备, 并指定增备路径
4.2 统计大小, 验证是否为增量备份
- [root@zha /]# du -sh /mysql_backup/
- 69M /mysql_backup/
- [root@zha /]# du -sh /test2/
- 1.5M /test2/
至此增量备份已经完成!
注意: 第二次增备是在第一次增备的基础上, 所以 --incremental-basedir 指定的是第一次增备目录, 最后指定的第二次增备目录
- [root@zha /]# cd /test2/
- [root@zha test2]# cat xtrabackup_checkpoints
- backup_type = incremental # backup_type 提示: 这是一次增备
- from_lsn = 1599830 #from_lsn 提示: 从上次结束开始 1599380
- to_lsn = 1600863 #from_lsn 提示: 到 1600863 结束
- last_lsn = 1600863
- compact = 0
- recover_binlog_info = 0
来源: http://www.linuxidc.com/Linux/2018-11/155151.htm