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/

 

 

 

  

 

posted @ 2015-08-07 18:25  看天空  阅读(267)  评论(0编辑  收藏  举报