基于时间点与位置恢复

利用二进制日志可以实现基于时间与位置的恢复,例如由于误操作删除了一张表,这时候完全恢复是没用的,因为日志里面还是存在错误语句,我们需要的是恢复到误操作之前的状态,然后跳过误操作数据,再恢复后面操作语句
假定需要往里数据库中插入两条数据,但由于误操作,两条插入语句中间删除了条数据,而这条数据不应该删除的。

create database cai; //创建新数据了 
创建表 ,并且写入两行化
开启二进制日志
完全备份一次
mysqladmin -u root -p flush-log  //生成日志文件,此内容为添加的zhangsan,lisi的信息
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002 > /opt/info.txt  //将二进制文件解密后生成生一个新的文本文件.txt

MySQL 基于时间点与位置恢复

当觉得操作有风险的时候可以考录是用基于时间点恢复日志 当然还是要开启二进制日志

MySQL 基于时间点与位置恢复

解密后生成的文本
mysqlbinlog --no-defaults --bases64-output=decode-rows -v mysql-bin.000002 >/opt/info.txt   //把解密后二进制文件重新生成一个文本文档
vim /opt/infon.txt  //查看里面需要的参数
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
........./////省略  
时间点 操作了对info表进行了添加
# at 341  //标记号 也可以居位置标记号恢复 也可也基于时间点恢复
180707 12:05:31 server id 1  end_log_pos 391 CRC32 0x7a99109e  Write_rows: table id 108 flags: STMT_END_F
### INSERT INTO `cai`.`info`
### SET
###   @1='xiaokeai01'
###   @2=88.00
# at 391
#180707 12:05:31 server id 1  end_log_pos 422 CRC32 0x8be308f6  Xid = 35
错误标记号 时间点
# at 609
#180707 12:06:12 server id 1  end_log_pos 657 CRC32 0xe5821dc6  Delete_rows: table id 108 flags: STMT_END_F
### DELETE FROM `cai`.`info`
### WHERE
###   @1='zhangsan'
###   @2=88.00
# at 657
正确操作 标记号 时间点
# at 875
#180707 12:06:16 server id 1  end_log_pos 925 CRC32 0x60ef5b40  Write_rows: table id 108 flags: STMT_END_F
### INSERT INTO `cai`.`info`
### SET
###   @1='xiaokeai02'
###   @2=88.00
# at 925

基于时间点进行恢复

mysqlbinlog --no-defaults --stop-datetime='2018-07-07 12:06:12' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p  //基于时间恢复 从开头到指定的时间停止 之前的都会执行操作
mysqlbinlog --no-defaults --start-datetime='2018-07-07 12:06:16' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p  //基于正确的时间恢复 从指定的时间点到结尾都会执行操作

MySQL 基于时间点与位置恢复
MySQL 基于时间点与位置恢复

基于行号恢复
mysqlbinlog --no-defaults --stop-position='558' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p  //错误操作 从开头的内容一直碰到 指定的错误行号便会停下 之前的都会执行
mysqlbinlog --no-defaults --stop-position='558' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p  //正确操作 从指定的正确的行号到结尾都会执行
# at 558  //标记号  stop--position='558' 
#180707 12:06:12 server id 1  end_log_pos 609 CRC32 0xcf4ae275  Table_map: `cai`.`info` mapped to number 108
# at 609 ///误删标记行开始
#180707 12:06:12 server id 1  end_log_pos 657 CRC32 0xe5821dc6  Delete_rows: table id 108 flags: STMT_END_F
### DELETE FROM `cai`.`info`
### WHERE
###   @1='zhangsan'
###   @2=88.00
# at 657  //正确行开始 start 

MySQL 基于时间点与位置恢复