xtrabackup备份mysql
innobackupex是xtrabackup内封装的一个脚本,里面能针对不同版本的mysql使用不同的脚本命令,以及针对myisam引擎和innodb引擎的处理,处理myisam要自己添加读锁。
mysql用户备份需要的权限
RELOAD, LOCK TABLES (除非指定 --no-lock 参数) 以便具备 flush tables with read lock 能力
REPLICATION CLIENT 具备获得二进制日志文件备份能力
CREATE TABLESPACE 具备恢复整个表空间,并导入表的能力
SUPER 用于启动/关闭从服务器复制线程环境
innobackupex命令参数
--user //指定备份mysql的mysql用户
--password //指定myqsl用户密码
--defaults-file // 指定要备份的mysql实例的my.cnf文件,如果默认为/etc/my.cnf,次参数可以省略。
--no-timestamp //自定义生成目录,此目录先前不存在
--use-memory=4G // 此参数用来控制备份所使用到的内存大小,默认为100M! 一般与--apply-log一起使用。
--apply-log // 备份好后的数据并不能立即用于恢复,因为这些刚备份的数据里包含了未提交的数据,需要回滚,undo操作,也包括的已 完成的事务在重做日志文件中 并没有写入数据文件中,redo操作,保证数据文件的一致性。重做已经提交的事务和回滚未提交的事务.
--copy-back //用于恢复备份数据的
--redo-only //在做增量恢复时,增量备份的数据文件需要redo日志文件中的已提交的事务。此参数将会合并全备和增量备份的数据文件,最后一次 增量备份不需要此参 数。
--compress //压缩选项,此选项不兼容--stream=tar,只兼容--stream=xbstream。
--slave-info // 在备份从服务器时,使用此参数能记录master的日志和偏移量,用于做一个新的从服务器。一般情况下的全备份,master二进制日志文件以及偏移点会记录在 xtrabackup_binlog_info这个文件中。
--database //只备份指定数据库
--socket //指定mysql套接字文件位置
--host //指定mysql主机
--port //指定mysql端口
--stream=[tar] //支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中
--incremental-basedir 需要指定之前完整备份的目录
--incremental 将会在改目录下生成新的目录用于存放增量备份数据
完全备份过程:
1.第一种是让innobackupex自己在backup目录下生成备份目录,第二种自定义生成备份目录
1.[root@localhost ~]# innobackupex --user=root --password=666666 /backup/ 2.[root@localhost 2015-08-07_14-51-50]# innobackupex --user=root --password=666666 --no-timestamp /backup/`date +%F-%H-%M-%S
成功标志
150807 14:51:53 innobackupex: Connection to database server closed
150807 14:51:53 innobackupex: completed OK!
2. 查看事务终止线程的标志点,/backup/2015-08-07-14-57-56/xtrabackup_checkpoints
[root@localhost 2015-08-07_14-51-50]# cat xtrabackup_checkpoints backup_type = full-backuped from_lsn = 0 to_lsn = 3425959 last_lsn = 3425959 compact = 0 [root@localhost 2015-08-07_14-51-50]#
3.可以模拟在mysql中的表中插入数据,提交事务。
mysql> insert into student (name) values ('david'); Query OK, 1 row affected, 1 warning (0.10 sec) mysql> insert into student (name) values ('jane'); Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from student; +----+-------+-----+------+ | id | name | age | Cid | +----+-------+-----+------+ | 1 | sean | 22 | 6 | | 5 | alice | 0 | NULL | | 6 | tom | 0 | NULL | | 7 | david | 0 | NULL | | 8 | jane | 0 | NULL | +----+-------+-----+------+ 5 rows in set (0.00 sec)
4.删除所有数据库模拟损坏
[root@localhost 2015-08-07_14-51-50]# innobackupex --copy-back /backup/2015-08-07_14-51-50/
5.如果不做增量备份,要恢复的话需要执行--apply-log,这项必须要执行,让未提交的事务回滚,让已提交的事务重做。
[root@localhost 2015-08-07_14-51-50]# innobackupex --apply-log /backup/2015-08-07_14-51-50/
6.然后恢复,只恢复到备份那一刻已经提交事务。
注意事项:1.因为是全库恢复,需要保证mysql的datadir指定目录下面为空,否则会报错。
2.关闭msyql ,否则会影响数据的准确性,有些没提交的事务还原时,也会被恢复。
3.修改数据库目录为mysql权限
[root@localhost 2015-08-07_14-51-50]# innobackupex --user=root --password=666666 --copy-back /backup/2015-08-07_14-51-50/
[root@localhost mydata]# chown -R mysql:mysql ./*
mysql> select * from student;
+----+-------+-----+------+
| id | name | age | Cid |
+----+-------+-----+------+
| 1 | sean | 22 | 6 |
| 5 | alice | 0 | NULL |
| 6 | tom | 0 | NULL |
+----+-------+-----+------+
5 rows in set (0.00 sec)
7.如果做增量备份,增量备份实在全备份的基础上进行备份的,只支持 innodb 引擎, MyISAM 引擎无法实现增量备份。
这里从第3步的基础上做增量备份。
--incremental-basedir 需要指定之前完整备份的目录,
--incremental 将会在改目录下生成新的目录用于存放增量备份数据
[root@localhost backup]# innobackupex --user=root --password=666666 --incremental /backup/ --incremental-basedir=/backup/2015-08-07_14-51-50/
[root@localhost backup]# ll total 8 drwxr-xr-x 9 root root 4096 Aug 7 15:16 2015-08-07_14-51-50 //完全备份目录 drwxr-xr-x 9 root root 4096 Aug 7 16:15 2015-08-07_16-15-46 //增量备份目录 [root@localhost backup]#
//查看checkpoints,可以看出是从3425959这个点的事务开始到3432586这个点的事务结束。
[root@localhost 2015-08-07_16-15-46]# cat xtrabackup_checkpoints backup_type = incremental from_lsn = 3425959 to_lsn = 3432586 last_lsn = 3432586 compact = 0
8.做第二次增量备份,之前模拟插入数据通第3步操作这次事务不提交。
mysql> insert into student (name) values ('bruce'); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from student; +----+-------+-----+------+ | id | name | age | Cid | +----+-------+-----+------+ | 1 | sean | 22 | 6 | | 5 | alice | 0 | NULL | | 6 | tom | 0 | NULL | | 7 | david | 0 | NULL | | 8 | jane | 0 | NULL | | 10 | bruce | 0 | NULL | +----+-------+-----+------+ 6 rows in set (0.00 sec)
9.做第二次增量备份,这里incremental-basedir指向第一次备份的路径
[root@localhost backup]# innobackupex --user=root --password=666666 --incremental /backup/ --incremental-basedir=/backup/2015-08-07_16-15-46/
// 查看chekpoints因为没有进行提交事务所以,事务起始点和结束点都没变
[root@localhost 2015-08-07_16-44-04]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 3432586
to_lsn = 3432586
last_lsn = 3432586
compact = 0
10.增量备份恢复,分别对全备份和第一次增量备份执行--apply-log --redo-only 对以二次也就是最后一次增量备份执行--apply-log
[root@localhost backup]# innobackupex --apply-log --user=root --password=666666 --redo-only /backup/2015-08-07_14-51-50/ [root@localhost backup]# innobackupex --apply-log --redo-only /backup/2015-08-07_14-51-50/ --incremental-dir=/backup/backup/2015-08-07_16-15-46/ [root@localhost backup]# innobackupex --apply-log /backup/2015-08-07_14-51-50/ --incremental-dir=/backup/2015-08-07_16-44-04/
11.执行完10的操作接着就恢复和全恢复命令一样,因为上面的操作将增量备份的内容整合到第一个备份的文件中,注意修改数据文件属主为mysql。
[root@localhost backup]# innobackupex --copy-back /backup/2015-08-07_14-51-50/