您的位置:首页 > 数据库 > MySQL

MySQL备份利器之Xtrabackup--恢复

2013-08-21 17:57 701 查看
三:恢复

3.1 全备‍‍‍‍‍‍‍‍‍‍‍‍

3.1.1全备恢复理论

‍‍‍‍‍‍‍‍‍
1)准备阶段:在全备完成后,还不能直接被用于恢复。因为可能还有些未提交的事务,
‍‍‍‍‍‍‍‍‍‍‍‍‍或者有些事务还没有被重做。做这些挂起的操作时为了保证数据文件的一致性。这也是准备
阶段的一个目的。一旦这些操作完成了,数据就可以被应用了。

$ innobackupex --apply-log /path/to/BACKUP-DIR

这里你还可以加入--use-memory 选项来确保内存,因为这个准备阶段的进程会消耗很多
内存

$ innobackupex --apply-log --use-memory=4G /path/to/BACKUP-DIR

2)恢复阶段:在准备阶段完成后,通过--copy-back 选项来完成把备份恢复到服务器的
datadir 目录下。

$ innobackupex --copy-back /path/to/BACKUP-DIR

3)在启动mysql 服务器前,先将文件的所有者更改一下

$ chown -R mysql:mysql /var/lib/mysql

3.1.2 全备恢复案例
1)innobackupex --apply-log /home/mysqlbackup/2013-02-19_12-20-49
2)删除原来的数据目录,此处即为/home/mysql/mysqldata/3306/。(但是要保留my.cnf)
3)innobackupex --defaults-file=/home/mysql/mysqldata/3306/my.cnf --copy-back
/home/mysqlbackup/2013-02-19_12-20-49
其中/home/mysqlbackup/2013-02-19_12-20-49 为全备文件
增量备份的恢复
1)增量备份恢复的理论
1)prepare 阶段
与全备的prepare 阶段有所不同,这个阶段需要注意更多的问题:
A)在每一个增量备份上只有已经提交的事务才能被重做。这个过程是将全备的内
容与增量备份的内容合在一起。
B)为了能够应用这些备份数据,那些没有被提交的事务必须被回滚掉。
----------------------------------------------------------------------------------------------------------------------
注意:如果你在一个基准备份中应用和提交的事务和回滚了未提交的事务,你
将不能增加那些增加的部分了。如果你在一个增量备份中做了以上两个操作,
你将不能从这个时刻开始添加数据。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
􀁺 innobackupex --apply-log --redo-only /基准备份的目录(即之前全备的那个目录)
􀁺 innobackupex --apply-log --redo-only /基准备份--incremental-dir=/第一个增量备份的目

􀁺 innobackupex --apply-log /基准备份--incremental-dir=/第二个增量备份的目录
􀁺 innobackupex --apply-log /基准备份
----------------------------------------------------------------------------------------------------------------------
注意:在进行最后一次增量备份的应用时,不用--redo-only 参数了。这是因为如
果应用了,下次还有下一个增量备份需要prepare 时,就不能被应用了,这符合
上面的两条原则
----------------------------------------------------------------------------------------------------------------------
2)Restore 阶段
在完成了增量备份的prepare 阶段,现在的基准目录(base+incremental=full)就像是做
了一个全备的目录。可以同直接进行restore:
􀁺 innobackupex --copy-back /基准目录
2)增量备份恢复的案例
----------------------------------------------------------------------------------------------------------------
全备(基准):/home/mysqlbackup/2013-02-19_12-20-49/
第一次增备:/home/inc1/2013-02-20_10-25-19/
第二次增备:/home/inc2/2013-02-20_10-35-48
----------------------------------------------------------------------------------------------------------------

1)应用基准
[root@localhost home]#innobackupex -apply-log --redo-only
/home/mysqlbackup/2013-02-19_12-20-49/
2)应用第一个增量备份
[root@localhost home]#innobackupex -apply-log --redo-only
/home/mysqlbackup/2013-02-19_12-20-49/--incremental-dir=/home/inc1/2013-02-20_1
0-25-19
3)应用第二个增量备份
[root@localhost home]#innobackupex -apply-log
/home/mysqlbackup/2013-02-19_12-20-49/--incremental-dir=/home/inc2/2013-02-20_1
0-35-48
4)再次应用基准
[root@localhost home]#innobackupex -apply-log
/home/mysqlbackup/2013-02-19_12-20-49/
5)恢复
[root@game7 3306]# innobackupex
--defaults-file=/home/mysql/mysqldata/3306/my.cnf
--copy-back /home/mysqlbackup/2013-02-19_12-20-49/

时间点恢复
基于时间点恢复的理论
通过innobackupex 和mysql 服务的二进制日志文件可以进行基于时间点的恢复,将数据
库恢复到历史的某个状态。二进制日志中保存着对数据库的操作细节,就像Oracle 中的redo
log 一样。这次,你可以用一个历史备份加上二进制日志来将数据库恢复到某个时刻。
可以通过innobackupex 做一次全备
$ innobackupex /path/to/backup --no-timestamp
接下来,就准备恢复的日志应用
$ innobackupex --apply-log /path/to/backup
假设某个时刻已经过去了,想恢复数据库到该时刻,应先知道当前的二进制日志情况
mysql> SHOW BINARY LOGS;
mysql> SHOW MASTER STATUS;
第一个Query 将会告诉你包含了哪些二进制日志文件,第二个Query 将会告诉你哪个二
进制日志文件时当前正在使用,和当前的日志位置点。
之后,你可以通过之前做的备份中的xtrabackup_binlog_info 文件,知道备份到的日志
编号及日志位置
$ cat /path/to/backup/xtrabackup_binlog_info
将数据库通过之前做的备份进行恢复
$ innobackupex --copy-back /path/to/backup
此时数据已达到了某个时刻,此时可以应用之前得到的信息,再运用mysqlbinlog 工具
进行基于时间点的恢复

基于时间点恢复的案例
1)建立一个快照,通过全备的方法
root@game7 home]# innobackupex --user=root --password=123456
--defaults-file=/usr/local/mysql/data/3306/my.cnf /home/backup/full
--no-timestamp
2)进行应用
innobackupex --apply-log /home/backup/full/
3)查询当前的日志位置状态量
mysql> show master logs;
+------------------+-------------------+
| Log_name | File_size |
+------------------+-------------------+
| mysql-bin.000001 | 1092 |
| mysql-bin.000002 | 106 |
+------------------+--------------------+
4)到备份目录中去查看它的日志位置状态量
[root@game7 full]# cat xtrabackup_binlog_info
mysql-bin.000001 803
5)进行恢复
innobackupex --defaults-file=/usr/local/mysq/data/3306/my.cnf
--copy-back /home/backup/full/
此时,数据库已经恢复到mysql-bin.000001 803 这个状态了。。。。。。。。
6)进行基于时间点得恢复
[root@game7 test]# mysqlbinlog /home/mysql/mysqllog/3306/mysql-bin.000001
/home/mysql/mysqllog/3306/mysql-bin.000002 --start-position=803>mybinlog.sql
此时,会生成一个mybinlog.sql 文件,这个文件就是803 之后的所有操作的日志(里面
全都是sql 语句)
7)进入mysql 客户端,然后执行mybinlog.sql,就可以实现恢复到最新状态
mysql>source mybinlog.sql
8)查看数据表,证明已经恢复到最新状态了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息