基于Innobackupex的不完全恢复

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

有关Innobackupex的备份恢复的知识点请参考以下链接:
        Innobackupex 全备数据库
        使用mysqlbinlog提取二进制日志
        基于Innobackupex的全备恢复
        基于Innobackupex的增备及恢复
        基于Innobackupex的完全恢复

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

2、演示备份过程

a、创建演示环境
[email protected][(none)]> show variables like ‘version‘;  --当前MySQL版本
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| version       | 5.6.12-log |
+---------------+------------+

[email protected]localhost[(none)]> reset master;
Query OK, 0 rows affected (0.03 sec)

[email protected][(none)]> use tempdb;  

[email protected][tempdb]> create table tb(id smallint,val varchar(20));  

[email protected][tempdb]> insert into tb  values(1,‘fullbak‘);  

--创建一个全备
SHELL> innobackupex --user=robin -password=xxx --port=3606 --socket=/tmp/mysql3606.sock --defaults-file=/etc/my3606.cnf \
> /hotbak/full --no-timestamp   

b、创建一个增备
--在创建增备前插入一条记录到tb
[email protected][tempdb]> insert into tb values(2,‘Incbak‘);  

SHELL> innobackupex --user=robin -password=xxx --port=3606 --socket=/tmp/mysql3606.sock --defaults-file=/etc/my3606.cnf \
> --incremental /hotbak/inc --incremental-basedir=/hotbak/full --no-timestamp  

--再次新增一条记录
[email protected][tempdb]> insert into tb values(3,‘pointrecover‘);
Query OK, 1 row affected (0.01 sec)

--记下当前的时间点用于后续的不完全恢复
[email protected][tempdb]> system date;
Thu Dec 25 11:53:54 CST 2014

--模拟误操作
[email protected][tempdb]> truncate table tb;
Query OK, 0 rows affected (0.01 sec)

c、再次全备
SHELL> innobackupex --user=robin -password=xxx --port=3606 --socket=/tmp/mysql3606.sock --defaults-file=/etc/my3606.cnf > /hotbak/full2 --no-timestamp

--全备后新增一张表
[email protected][tempdb]> create table tb_after_truncate(id int,val varchar(20));
Query OK, 0 rows affected (0.02 sec)

3、演示恢复过程

--下面理清一下思路:
--当前备份情况: 全备+增备+全备
--我们在增备之后truncate了表tb,然后又创建了一个全备,新建了一个表tb_after_truncate。
--此时我们需要将数据库恢复到truncate(误操作)之前
--解决方案:我们需要利用第一次的全备+增备+binglog来恢复到truncate前,当前第二次全备用不上。

a、先做基于全备的apply,注意,此时使用了--redo-only
SHELL> innobackupex --apply-log --redo-only --user=robin -password=xxx --port=3606 \
> --defaults-file=/etc/my3606.cnf /hotbak/full   

b、基于增备的apply,
--此时没有--redo-only,如果有多个增备,仅仅最后一个增备无需指定--redo-only
SHELL> innobackupex --apply-log --user=robin -password=xxx --port=3606 --defaults-file=/etc/my3606.cnf \
> /hotbak/full --incremental-dir=/hotbak/inc   

c、进行copy back
SHELL> mysqldown -P3606     --copy back前关闭实例
SHELL> netstat -nltp|grep mysql|grep 3606  

SHELL>  mv /data/inst3606/data3606 /data/inst3606/data3606bk
SHELL>  mkdir -p /data/inst3606/data3606  

SHELL> innobackupex --user=robin -password=xxx --port=3606 --copy-back /hotbak/full --defaults-file=/etc/my3606.cnf
SHELL> chown -R mysql:mysql /data/inst3606/data3606    

d、启动恢复后的实例
SHELL> mysqld_safe --defaults-file=/etc/my3606.cnf &

SHELL> mysql -uroot -pxxx -P3606 -S /tmp/mysql3606.sock > -e "select * from tempdb.tb"
Warning: Using a password on the command line interface can be insecure.
+------+---------+
| id   | val     |
+------+---------+
|    1 | fullbak |
|    2 | Incbak  |
+------+---------+

--获取增量之后的log position
SHELL> cd /hotbak/inc/
SHELL> more xtrabackup_binlog_info
inst3606bin.000001      774

--这里使用了stop-datetime去将日志追加到truncate之前
SHELL> mysqlbinlog /data/inst3606/log/bin/inst3606bin.000001 --start-position=774 --stop-datetime="2014-12-25 11:53:54" > |mysql -urobin -pxxx -P3606 -S /tmp/mysql3606.sock

--验证结果如下,可以看到已经恢复到truncate之前了
SHELL> mysql -uroot -pxxx -P3606 -S /tmp/mysql3606.sock > -e "select * from tempdb.tb"
Warning: Using a password on the command line interface can be insecure.
+------+--------------+
| id   | val          |
+------+--------------+
|    1 | fullbak      |
|    2 | Incbak       |
|    3 | pointrecover |
+------+--------------+

--如果我们需要继续恢复后面的事务,我们可以找出truncate前后位置,然后跳过这个position
SHELL> mysqlbinlog /data/inst3606/log/bin/inst3606bin.000001 --start-datetime="2014-12-25 11:53:54"|grep truncate -A5
truncate table tb
/*!*/;
# at 1180
#141225 11:55:35 server id 3606  end_log_pos 1260 CRC32 0x12f55fc5   Query  thread_id=928   exec_time=0   error_code=0
SET TIMESTAMP=1419479735/*!*/;
/*!\C latin1 *//*!*/;
--
create table tb_after_truncate(id int,val varchar(20))
/*!*/;
# at 1392
#141225 13:06:47 server id 3606  end_log_pos 1415 CRC32 0xf956f311      Stop
DELIMITER ;
# End of log file

--我们找出的position为1260,跳过1260之前的继续追加binlog
SHELL> mysqlbinlog /data/inst3606/log/bin/inst3606bin.000001 --start-position=1260 > |mysql -urobin -pxxx -P3606 -S /tmp/mysql3606.sock

--验证追加后的结果,可以看到表tb_after_truncate存在
[[email protected] ~]$ mysql -uroot -pxxx -P3606 -S /tmp/mysql3606.sock > -e "desc tempdb.tb_after_truncate"
Warning: Using a password on the command line interface can be insecure.
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| val   | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

4、小结
a、不完全恢复(时点恢复)与完全恢复操作方式上基本等同
b、不完全恢复我们需要确定需要恢复到的时间点或binlog position
c、一旦确定了需要恢复的时间点,选择自上一次全备以来所有备份来进行恢复
d、恢复完成后再使用binlog日志追加到确定的时间点
e、追加binlog日志可以基于position,也可以基于datetime

f、也可以跳过故障点,继续追加后面的binlog日志至最新,如本文尾部的演示

时间: 2024-10-04 00:01:52

基于Innobackupex的不完全恢复的相关文章

基于Innobackupex的完全恢复

对于MySQL的完全恢复,我们可以借助于Innobackupex的多重备份加上binlog来将数据库恢复到故障点.这里的完全恢复是相对于时点恢复(也叫不完全恢复).本文主要演示了基于Innobackupex如何做一个完全恢复,供大家参考. 有关Innobackupex的备份恢复的知识点请参考以下链接:        Innobackupex 全备数据库        使用mysqlbinlog提取二进制日志        基于Innobackupex的全备恢复         基于Innobac

基于Innobackupex的全备恢复

对于MySQL数据库的热备,xtrabackup是大多数DBA朋友们的选择.xtrabackup内嵌了一个innobackupex可用于热备MySQL数据库.本文描写叙述了基于innobackupex这个工具全备下的恢复并给出演示供大家參考. 有关Innobackupex的全备可參考:Innobackupex 全备数据库 1.Innobackupex恢复原理    After creating a backup, the data is not ready to be restored. The

基于cancel的不完全恢复

实验:基于cancel的不完全恢复 实验环境查看 lsnrctl status select open_mode from v$database; --监听与数据库状态 show parameter recovery; select flashback_on from v$database; archive log list; --闪回与归档的配置 1)准备环境:RMAN全库备份 RMAN> backup as compressed backupset full database; --压缩备份

基于Innobackupex的增备及恢复

MySQL的热备(物理备份)可以采取全备加增量备份的方式来减轻数据库I/O压力及系统资源的占用.增量备份主要是以全备或增量备份为基础,备份那些变更过的页面.其备份的原理是基于一个不断增长的LSN序列,这个LSN与Oracle的SCN类似.在恢复期间,我们需要将已提交的事务前滚,未提交的事务回滚.本文主要描述了增量备份及增量恢复. 1.增备的相关知识点    As not all information changes between each backup, the incremental ba

Mysql 基于innobackupex 的备份&恢复

备份,对于任何数据库,任何系统都是重中之重.针对Mysql,我选择percona xtrabackup软件.我更喜欢物理层面的热备份.而不是逻辑层面的备份(mysqldump),当然很多情况,也要定期做mysqldump备份.增加一个安全的备份选择. 关于如何下载安装percona xtrabackup,请参考: http://blog.51cto.com/hsbxxl/2107388 先看看innobackupex常用参数 --compact        创建一个不包含第二索引(除了主键之外

基于Innobackupex的MySQL备份脚本

Innobackupex是Xtrabackup的一部分,其实质也是调用xtrabackup.主要的不同是Xtrabackup除了支持innodb引擎外还支持xtradb引擎.本文主要封装了Innobackupex到shell脚本进行定期备份,供大家参考. 1.脚本描述a.支持增量备份以及全备b.需要传递到备份脚本(如备份路径,连接相关参数等)c.基于周日,周三的全量备份,其他增量备份d.可根据需要调整脚本,比如压缩备份的文件夹以及rsync等 2.脚本内容 ###################

Xtrabackup 流备份与恢复

Xtrabackup是MySQL数据库的备份不可多得的工具之一.提供了全备,增备,数据库级别,表级别备份等等.最牛X的还有不落盘的备份,即流备份方式.对于服务器上空间不足,或是搭建主从,直接使用流式备份大大简化了备份后的压缩复制所带来的更多开销.Xtrabackup支持tar格式以及xbstream格式的流备份.本文即是对此展开的相关描述. 1.基于tar格式备份a.备份到本地# innobackupex --stream=tar  /tmp >/backup/bak.tar          

冷备手工完全恢复(recover database,recover tablespace,recover datafile)

冷备手工完全恢复 1.   手工完全恢复三种级别: recover database: 所有或大部分datafile丢失,一般是在mount状态完成.recover tablespace:    非关键表空间损坏,表空间下某些数据文件不能访问,一般是在open下完成.recover datafile: 单一或少数数据文件损坏,可以在mount或open 状态完成.四个关键文件:1)system01.dbf, 2) undo tablespace,3)control file 4)current

oracle数据库完全恢复和不完全恢复以及执行用户管理辈分恢复

比较完全恢复和不完全恢复: 一.完全恢复:将数据库恢复到当前最新状态,包括直至请求恢复时进行的所有已提交的数据更改 二.不完全恢复:将数据库恢复到请求恢复操作之前指定的过去时间点 一.完全恢复过程 下面的步骤说明了执行完全恢复期间要采取的操作: 1. 通过备份还原损坏或丢失的文件. 2. 根据需要应用增量备份.归档重做日志文件和联机重做日志文件中的更改.将重做日志更改应用于数据文件,直到到达当前联机日志,并且重新输入了最新的事务处理.在整个过程中会生成还原块.这称为前滚或高速缓存恢复. 3. 此