基于Innobackupex的不完全恢复

基于Innobackupex的不完全恢复
2014年12月26日 14:15:57
阅读数:3259
    对于MySQL的不完全恢复,我们可以借助于Innobackupex的多重备份加上binlog来将数据库恢复到任意时刻。这里的不完全恢复(也叫时点恢复)是相对于完全恢复。本文主要演示了基于Innobackupex如何做一个不完全恢复,供大家参考。

    有关Innobackupex的备份恢复的知识点请参考以下链接:

1、不完全恢复的概念
    不完全恢复,即时点恢复,是指使用备份加上binlog日志将数据库恢复到任意指定的时间点。
    不完全恢复依赖于完整的数据库备份与binlog备份,只要2者存在,任意数据丢失,误操作,都可以恢复到任意指定的时间点。
    不完全恢复的概念不限于热备与逻辑备份(mysqldump)方式,都可以实现不完全恢复。

2、演示备份过程
[sql] view plain copy
print?
  1. a、创建演示环境  
  2. robin@localhost[(none)]> show variables like 'version';  --当前MySQL版本  
  3. +---------------+------------+  
  4. | Variable_name | Value      |  
  5. +---------------+------------+  
  6. | version       | 5.6.12-log |  
  7. +---------------+------------+  
  8.   
  9. robin@localhost[(none)]> reset master;  
  10. Query OK, 0 rows affected (0.03 sec)  
  11.   
  12. robin@localhost[(none)]> use tempdb;    
  13.    
  14. robin@localhost[tempdb]> create table tb(id smallint,val varchar(20));    
  15.    
  16. robin@localhost[tempdb]> insert into tb  values(1,'fullbak');    
  17.   
  18. --创建一个全备  
  19. SHELL> innobackupex --user=robin -password=xxx --port=3606 --socket=/tmp/mysql3606.sock --defaults-file=/etc/my3606.cnf \     
  20. > /hotbak/full --no-timestamp     
  21.   
  22. b、创建一个增备  
  23. --在创建增备前插入一条记录到tb  
  24. robin@localhost[tempdb]> insert into tb values(2,'Incbak');    
  25.    
  26. SHELL> innobackupex --user=robin -password=xxx --port=3606 --socket=/tmp/mysql3606.sock --defaults-file=/etc/my3606.cnf \     
  27. > --incremental /hotbak/inc --incremental-basedir=/hotbak/full --no-timestamp    
  28.   
  29. --再次新增一条记录  
  30. robin@localhost[tempdb]> insert into tb values(3,'pointrecover');  
  31. Query OK, 1 row affected (0.01 sec)  
  32.   
  33. --记下当前的时间点用于后续的不完全恢复  
  34. robin@localhost[tempdb]> system date;  
  35. Thu Dec 25 11:53:54 CST 2014  
  36.   
  37. --模拟误操作  
  38. robin@localhost[tempdb]> truncate table tb;  
  39. Query OK, 0 rows affected (0.01 sec)  
  40.   
  41. c、再次全备  
  42. SHELL> innobackupex --user=robin -password=xxx --port=3606 --socket=/tmp/mysql3606.sock --defaults-file=/etc/my3606.cnf \  
  43. > /hotbak/full2 --no-timestamp  
  44.   
  45. --全备后新增一张表  
  46. robin@localhost[tempdb]> create table tb_after_truncate(id int,val varchar(20));  
  47. Query OK, 0 rows affected (0.02 sec)  
3、演示恢复过程
[sql] view plain copy
print?
  1. --下面理清一下思路:  
  2. --当前备份情况: 全备+增备+全备  
  3. --我们在增备之后truncate了表tb,然后又创建了一个全备,新建了一个表tb_after_truncate。  
  4. --此时我们需要将数据库恢复到truncate(误操作)之前  
  5. --解决方案:我们需要利用第一次的全备+增备+binglog来恢复到truncate前,当前第二次全备用不上。  
  6.   
  7. a、先做基于全备的apply,注意,此时使用了--redo-only     
  8. SHELL> innobackupex --apply-log --redo-only --user=robin -password=xxx --port=3606 \     
  9. > --defaults-file=/etc/my3606.cnf /hotbak/full     
  10.   
  11. b、基于增备的apply,    
  12. --此时没有--redo-only,如果有多个增备,仅仅最后一个增备无需指定--redo-only     
  13. SHELL> innobackupex --apply-log --user=robin -password=xxx --port=3606 --defaults-file=/etc/my3606.cnf \     
  14. > /hotbak/full --incremental-dir=/hotbak/inc     
  15.   
  16. c、进行copy back    
  17. SHELL> mysqldown -P3606     --copy back前关闭实例     
  18. SHELL> netstat -nltp|grep mysql|grep 3606    
  19.   
  20. SHELL>  mv /data/inst3606/data3606 /data/inst3606/data3606bk    
  21. SHELL>  mkdir -p /data/inst3606/data3606    
  22.    
  23. SHELL> innobackupex --user=robin -password=xxx --port=3606 --copy-back /hotbak/full --defaults-file=/etc/my3606.cnf     
  24. SHELL> chown -R mysql:mysql /data/inst3606/data3606      
  25.    
  26. d、启动恢复后的实例     
  27. SHELL> mysqld_safe --defaults-file=/etc/my3606.cnf &  
  28.   
  29. SHELL> mysql -uroot -pxxx -P3606 -S /tmp/mysql3606.sock \  
  30. > -e "select * from tempdb.tb"  
  31. Warning: Using a password on the command line interface can be insecure.  
  32. +------+---------+  
  33. | id   | val     |  
  34. +------+---------+  
  35. |    1 | fullbak |  
  36. |    2 | Incbak  |  
  37. +------+---------+  
  38.   
  39. --获取增量之后的log position  
  40. SHELL> cd /hotbak/inc/  
  41. SHELL> more xtrabackup_binlog_info  
  42. inst3606bin.000001      774  
  43.   
  44. --这里使用了stop-datetime去将日志追加到truncate之前  
  45. SHELL> mysqlbinlog /data/inst3606/log/bin/inst3606bin.000001 --start-position=774 --stop-datetime="2014-12-25 11:53:54" \  
  46. > |mysql -urobin -pxxx -P3606 -S /tmp/mysql3606.sock  
  47.   
  48. --验证结果如下,可以看到已经恢复到truncate之前了  
  49. SHELL> mysql -uroot -pxxx -P3606 -S /tmp/mysql3606.sock \  
  50. > -e "select * from tempdb.tb"  
  51. Warning: Using a password on the command line interface can be insecure.  
  52. +------+--------------+  
  53. | id   | val          |  
  54. +------+--------------+  
  55. |    1 | fullbak      |  
  56. |    2 | Incbak       |  
  57. |    3 | pointrecover |  
  58. +------+--------------+  
  59.   
  60. --如果我们需要继续恢复后面的事务,我们可以找出truncate前后位置,然后跳过这个position  
  61. SHELL> mysqlbinlog /data/inst3606/log/bin/inst3606bin.000001 --start-datetime="2014-12-25 11:53:54"|grep truncate -A5  
  62. truncate table tb  
  63. /*!*/;  
  64. # at 1180  
  65. #141225 11:55:35 server id 3606  end_log_pos 1260 CRC32 0x12f55fc5   Query  thread_id=928   exec_time=0   error_code=0  
  66. SET TIMESTAMP=1419479735/*!*/;  
  67. /*!\C latin1 *//*!*/;  
  68. --  
  69. create table tb_after_truncate(id int,val varchar(20))  
  70. /*!*/;  
  71. # at 1392  
  72. #141225 13:06:47 server id 3606  end_log_pos 1415 CRC32 0xf956f311      Stop  
  73. DELIMITER ;  
  74. # End of log file  
  75.   
  76. --我们找出的position为1260,跳过1260之前的继续追加binlog  
  77. SHELL> mysqlbinlog /data/inst3606/log/bin/inst3606bin.000001 --start-position=1260 \  
  78. > |mysql -urobin -pxxx -P3606 -S /tmp/mysql3606.sock  
  79.   
  80. --验证追加后的结果,可以看到表tb_after_truncate存在  
  81. [mysql@app ~]$ mysql -uroot -pxxx -P3606 -S /tmp/mysql3606.sock \  
  82. > -e "desc tempdb.tb_after_truncate"  
  83. Warning: Using a password on the command line interface can be insecure.  
  84. +-------+-------------+------+-----+---------+-------+  
  85. | Field | Type        | Null | Key | Default | Extra |  
  86. +-------+-------------+------+-----+---------+-------+  
  87. | id    | int(11)     | YES  |     | NULL    |       |  
  88. | val   | varchar(20) | YES  |     | NULL    |       |  
  89. +-------+-------------+------+-----+---------+-------+  
4、小结
a、不完全恢复(时点恢复)与完全恢复操作方式上基本等同
b、不完全恢复我们需要确定需要恢复到的时间点或binlog position
c、一旦确定了需要恢复的时间点,选择自上一次全备以来所有备份来进行恢复
d、恢复完成后再使用binlog日志追加到确定的时间点
e、追加binlog日志可以基于position,也可以基于datetime
f、也可以跳过故障点,继续追加后面的binlog日志至最新,如本文尾部的演示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值