简介:
Xtrabackup是由percona提供的mysql数据库备份工具,可以对Innodb数据库做热备
特点:
(1)备份过程快速、可靠
(2)备份过程不会打断正在执行的事务
(3)能够基于压缩等功能节约磁盘空间和流量
(4)自动实现备份检验
(5)还原速度快
准备工作:
1.安装xtrabackup(在percona官网下载rpm包)
# yum install percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm
2.创建最小权限用户
MariaDB [(none)]>grant reload,lock tables,replication client on *.* to 'backupuser'@'localhost' identified by 'backuppassword';
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.04 sec)
开始备份:(模拟线上环境)
1.完全备份(生成的备份目录为2015-04-09_02-35-22)
# innobackupex --user=backupuser --password=backuppassword /backup/
若显示以下内容即为备份成功:
150409 02:35:25 innobackupex: Connection to database server closed
150409 02:35:25 innobackupex: completed OK!
若显示以下错误信息:在my.cnf文件[mysqld] 中添加innodb_log_file_size = 5M
InnoDB: Error: log file ./ib_logfile0 is of different size 5242880 bytes
InnoDB: than specified in the .cnf file 50331648 bytes!
innobackupex: Error: The xtrabackup child process has died at /usr/bin/innobackupex line 2672.
2.在数据库插入数据,模拟msyqld正常线上运行第一天
MariaDB [(none)]> create database xx;
Query OK, 1 row affected (0.00 sec)
3.执行增量备份(生成2015-04-09_02-59-13,此时--incremental-basedir则应该指为完全备份的目录2015-04-09_02-35-22)
注意:增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份
# innobackupex --incremental /backup/ --incremental-basedir=/backup/2015-04-09_02-35-22/
显示以下信息即为增量备份成功:
innobackupex: MySQL binlog position: filename 'mysql-bin.000001', position 324
150409 02:59:18 innobackupex: Connection to database server closed
150409 02:59:18 innobackupex: completed OK!
4.再次在数据库插入数据,模拟mysqld正常线上运行第二天
MariaDB [(none)]> create database yy;
Query OK, 1 row affected (0.00 sec)
5.再次执行增量备份(生成2015-04-09_03-00-38,此时--incremental-basedi则应该指为上一次增量备份的目录2015-04-09_02-59-13)
# innobackupex --incremental /backup/ --incremental-basedir=/backup/2015-04-09_02-59-13/
6.再次在数据库插入数据,模拟mysqld正常线上运行第三天
MariaDB [(none)]> create database zz;
Query OK, 1 row affected (0.00 sec)
7.模拟事故,停掉mysqld,删除/data目录下的数据
注意:线上环境应该将二进制日志文件(binlog)和数据文件分开存放;
# service mysqld stop
说明:因为此处实验我并没有将二进制日志文件和数据分开存放,所以我先将二进制日志复制到其他目录再删除数据
# cp mysql-bin.000001 /backup/
# rm /data/* -rf
8.查看上一次增量备份,二进制日志最后记录position的位置
# cat /backup/2015-04-09_03-00-38/xtrabackup_binlog_info
mysql-bin.000001 479
9.导出二进制日志,从最后备份的position开始
# mysqlbinlog mysql-bin.000001 --start-position="479">/backup/binlog.sql
恢复数据:
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态
“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。
(2)基于所有的备份将未提交的事务进行“回滚”。
此时备份目录下的所有文件:
按排列顺序:完全备份文件 第一次增量备份文件 第二次增量备份文件 导出的部分二进制日志文件 所有的二进制日志文件
1.整理合并备份文件
# innobackupex --apply-log --redo-only /backup/2015-04-09_02-35-22/
将第一个增量备份合并到完全备份中
# innobackupex --apply-log --redo-only /backup/2015-04-09_02-35-22/ --incremental-dir=/backup/2015-04-09_02-59-13/
将第二个增量备份合并到完全备份中
# innobackupex --apply-log --redo-only /backup/2015-04-09_02-35-22/ --incremental-dir=/backup/2015-04-09_03-00-38/
注意:假如我们在每周日晚上00:00点做完全备份,在周1-周6晚上00:00点做增量备份,刚好有用户一直在00:00点前一直在操作,并且在00:01分才提交事务,所以为了避免系统自动将备份时候未提交的事务做回滚操作,所以我们需要加上--redo-only参数,让其只提交事务,而不回滚事务。到最后系统会判定哪些是需要回滚的操作执行回滚
2.恢复操作
# innobackupex --copy-back /backup/2015-04-09_02-35-22/
3.改变恢复后数据目录(/data)下文件的属主属组为msyql
# chown -R mysql.mysql /data/*
4.查看数据库有备份的内容有无恢复
# service mysqld start
可以看到备份的数据已经恢复
5.通过二进制日志恢复未来得及备份的数据
# mysql <binlog.sql
可以看到未来的及备份的数据也通过二进制日志恢复
-------------------------------完成。-------------------------------------