xtrabackup应用总结
Xtrabackup介绍
xtrbackup简介
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex
(1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
(2)innobackupex-1.5.1则封装了xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁
(3)使用帮助:http://www.percona.com/docs/wiki/percona-xtrabackup:start
xtrbackup优势
(1)备份过程快速、可靠;
(2)备份过程不会打断正在执行的事务;
(3)能够基于压缩等功能节约磁盘空间和流量;
(4)自动实现备份检验;
(5)还原速度快
(6)支持增量备份MySQL
(7)比较容易的创建主从同步
(8)备份MySQL时不会增大服务器负载
xtrabackup备份InnoDB原理
XtraBackup基于InnoDB的crash-recovery功能进行备份。
crash-recovery是这样的:
InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件,事务日志文件会存储每一个InnoDB表数据的更改记录。当 InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:1.应用已经提交的事务日志到数据文件;2.将事务日志里还未提交的更改回滚。
xtrabackup在启动时会记住 log sequence number(LSN,每条事务记录的唯一编号),并且复制所有的数据文件,复制过程需要一段时间,所以这段时间数据库的更改就会使备份文件和实际数据不一致。xtrabackup解决此问题的方式是,xtrabackup会开启一个后台进程,用于监视事务日志,并将备份期间事务日志里的更改记录下来。
以上是xtrabackup备份的过程,恢复的第一步是准备(prepare)过程。在此过程,xtrabackup根据所记录的事务日志里的变化,模仿InnoDB启动时的动作对数据进行‘崩溃恢复’,执行完这个过程后,数据就可以用于还原数据库了。
但是以上机制只能备份和恢复Innodb引擎的表,对于myisam表,precona 将xtrabackup通过perl封装成innobackupex脚本,此脚本提供了对myisam表的备份支持。innobackupex脚本会在 xtrabackup执行完InnoDB表的备份后,执行flush tables with read lock 来阻止对数据库的写入,并对myisam相关文件进行备份,最后释放锁。
Xtrabackup部署
版本选择
Xtrabackup 2.1.x版本的支持MySQL 5.5 and 5.6 servers
Xtrabackup 2.0.x版本的支持MySQL 5.0, 5.1, 5.5 and 5.6 servers
系统环境
[root@mysql]# cat /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m [root@mysql]# uname -r 2.6.32-504.el6.x86_64 [root@mysql]# uname -m x86_64
安装部署
[root@mysql]# rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm [root@mysql]# yum install percona-xtrabackup -y [root@mysql]# rpm -qa mysql-server mysql-server-5.1.73-5.el6_6.i686 [root@mads ~]# rpm -qa *backup* percona-xtrabackup-20-2.0.8-587.rhel6.i686
Xtrabackup应用实战(备份还原)
全量备份
1)创建当天备份数据保存的路径 mkdir -p /backup/mysql/full/2015-05-07
2)全量备份服务器的数据(不压缩) innobackupex --user=root --password=strong --host=localhost --port=3306 --defaults-file=/etc/my.cnf /backup/mysql/full/2015-05-07/ [root@mysql ]# ls -al total 10280 drwxr-xr-x 4 root root 4096 Jul 13 06:32 . drwxr-xr-x 3 root root 4096 Jul 13 06:31 .. -rw-r--r-- 1 root root 260 Jul 13 06:31 backup-my.cnf -rw-r----- 1 root root 10485760 Jul 13 06:31 ibdata1 drwxr-xr-x 2 root root 4096 Jul 13 06:32 mysql drwxr-xr-x 2 root root 4096 Jul 13 06:32 test -rw-r--r-- 1 root root 10 Jul 13 06:32 xtrabackup_binary -rw-r--r-- 1 root root 4 Jul 13 06:32 xtrabackup_binlog_info -rw-r----- 1 root root 73 Jul 13 06:32 xtrabackup_checkpoints -rw-r----- 1 root root 2560 Jul 13 06:32 xtrabackup_logfile 注: backup-my.cnf: 备份命令用到的配置选项信息 xtrabackup_binlog_info: 备份时所用的二进制日志信息(记录了在备份时,正在用的二进制日志文件及pos值,这个在数据恢复时用) xtrabackup_checkpoints: 备份的信息(备份类型(完全或增量)、备份状态(是否已经为prepared状态)、LSN(日志序列号)范围信息),可以查看此备份是全备份还是增量备份 xtrabackup_info: xtrabackup相关的信息
全量备份恢复
1) 停止mysql [root@mysqll]# service mysql stop 2) 模拟数据丢失 [root@lmysql]# mv /var/lib/mysql /var/lib/mysql_bak 3) 用已有的全量备份文件进行数据恢复 通过--apply-log指明将日志应用到数据文件上 [root@localhost full]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --apply-log /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ [root@localhost full]# chown -R mysql:mysql /var/lib/mysql # 修改所有者,所属组 [root@localhost full]# service mysql start # 启动mysql [root@localhost full]# mysql -u root -p # 登录查看数据是否恢复 Enter password: MariaDB [(none)]> show databases; # 发现数据已经恢复 +------------------------+ | Database | +------------------------+ | information_schema | |mysql | | performance_schema | | test_db | +------------------------+
增量备份
1)开启二进制日志 [root@localhost ~]# vi /etc/my.cnf [mysqld] datadir="/var/lib/mysql" log-bin=/data/mysql/log/mysql-bin [root@localhost ~]# service mysql restart 2)增量备份是建立在全量备份的基础上的所以先确保有一次全量备份,全量备份前面已经介绍 3) 我们往数据库中添加数据,进行第一次增量备份 MariaDB [test_db]> insert into test_table1 values(6,'xiaoming'); Query OK, 1 row affected (0.00 sec) MariaDB [test_db]> select * from test_table1; +------+----------+ | id | name | +------+----------+ | 1 | zhangsan | | 2 | lisi | | 3 | wangwu | | 4 | zhaoliu | | 5 | guqi | | 6 | xiaoming | +------+----------+ 6 rows in set (0.00 sec) [root@localhost ~]# mkdir -p /backup/mysql/increment/2015-05-07 # 创建增量备份保存的路径 4) 进行第一次增量备份 [root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --incremental-force-scan --incremental /backup/mysql/increment/2015-05-07 --incremental-basedir=/backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ # 第一次增量备份 (如果是mariadb不添加--incremental-force-scan参数可能会因为不支持FLUSH CHANGED_PAGE_BITMAPS而报错导致增量备份失败) 第一次增量备份生成的文件夹为/backup/mysql/increment/2015-05-07/2015-05-07_18-41-41/ 5) 再次往数据表中插入内容 MariaDB [test_db]> insert into test_table1 values(7,'xiaohong'); Query OK, 1 row affected (0.05 sec) 6)进行第二次增量备份 [root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --incremental-force-scan --incremental /backup/mysql/increment/2015-05-07 --incremental-basedir=/backup/mysql/increment/2015-05-07/2015-05-07_18-41-41/ 第二次增量备份生成的文件夹为/backup/mysql/increment/2015-05-07/2015-05-07_18-48-32/ 7)查看最后一次增量备份时所对应的二进制日志及位置 [root@localhost ~]# cat /backup/mysql/increment/2015-05-07/2015-05-07_18-48-32/xtrabackup_binlog_info mysql-bin.000001 833 0-1-3 MariaDB [(none)]> show master status -> ; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 833 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) # 可以看到如果没有在增量备份后再对数据库进行增删改操作。则从增量备份中得出的信息和从二进制日志中看到的是一样的。
增量还原
恢复增量备份 增量备份的还原操作跟完整的还原有点不一样,首先必须使用--apply-log --redo-only对完整备份的目录及所有增量备份目录进行操作,然后就可以像还原完整备份时的操作了。(apply increment log to full data) 1 模拟数据丢失 [root@localhost ~]# service mysql stop [root@localhost ~]# rm -rf /var/lib/mysql [root@localhost ~]# mkdir /var/lib/mysql 2 通过--apply-log --redo-only指明将日志应用到数据文件上 [root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --apply-log --redo-only /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ 3 把第一次增量备份的数据应用到全量备份上 [root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --apply-log --redo-only /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ --incremental-dir=/backup/mysql/increment/2015-05-07/2015-05-07_18-41-41/ 4 把第二次增量备份的数据应用到全量备份上 [root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --apply-log --redo-only /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ --incremental-dir=/backup/mysql/increment/2015-05-07/2015-05-07_18-48-32/ 5 恢复数据(这里和全量备份的恢复相同了) [root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --copy-back /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ 6 更改权限,启动服务,登录mysql,查看数据是否恢复 [root@localhost ~]# chown -R mysql:mysql /var/lib/mysql [root@localhost ~]# service mysql start MariaDB [test_db]> select * from test_table1; +------+----------+ | id | name | +------+----------+ | 1 | zhangsan | | 2 | lisi | | 3 | wangwu | | 4 | zhaoliu | | 5 | guqi | | 6 | xiaoming | | 7 | xiaohong | +------+----------+ 7 rows in set (0.00 sec) # 数据已经恢复
补充
增量备份常用参数说明
--redo-only # 将一个增量备份与全备份进行合并,形成一个新的全备份(之后用这个新的全备份进行数据的恢复) --incremental # 指定进行增量备份 --incremental-basedir # 进行增量备份时,用来指定上一次的备份(全备份或上一次的增量备份) --incremental-dir # 数据恢复时,用来指定上一次的备份(全备份或上一次的增量备份) --user= # 指定数据库备份用户 --password= # 指定数据库备份用户密码 --port= # 指定数据库端口 --host= # 指定备份主机 --socket= # 指定socket文件路径 --databases= # 备份指定数据库,多个空格隔开,如--databases="dbname1 dbname2",不加备份所有库 --defaults-file= # 指定my.cnf配置文件 --apply-log # 日志回滚 --incremental= # 增量备份,后跟增量备份路径 --incremental-basedir= # 增量备份,指上次增量备份路径 --redo-only # 合并全备和增量备份数据文件 --copy-back # 将备份数据复制到数据库,数据库目录要为空 --no-timestamp # 生成备份文件不以时间戳为目录名 --stream= # 指定流的格式做备份,--stream=tar,将备份文件归档 --remote-host=user@ip DST_DIR # 备份到远程主机
待完善内容
- 整理完善备份还原案例
- 全备、增量备份及还原脚本的编写
- 备份数据校验及检测机制
- 完善的流程说明文档
出处:http://www.cnblogs.com/madsnotes/
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。