ROW 格式binlog 在MySQL5.6上的数据恢复实验

ROW 格式的binlog 在MySQL5.6上的数据恢复实验


5.6和5.7版本的MySQL,有个参数binlog_row_image,默认值为FULL,表示记录的是全部的binlog操作日志(仅在binlog_format=ROW时候生效)。此外binlog_row_image还可以是minimal,表示binlog记录的就只是影响后的行。如此一来使用ROW格式就能节约很多的磁盘空间。

因此,我们服务器上就可以直接设置binlog_format=ROW格式了,至于binlog_row_image设置为FULL还是minimal,各位就自行考虑了。

环境版本如下:

> SELECT @@version
+-------------+
| @@version   |
|-------------|
| 5.6.34-log  |
+-------------+

> SELECT @@binlog_format;
+-------------------+
| @@binlog_format   |
|-------------------|
| ROW               |
+-------------------+

假设我们的操作都是在一个库里面执行的,MySQL服务器上只跑了这一个hellodb业务的数据库。

如果数据库多的话,还会增大恢复的难度,如下事例(下面的grant操作实例不够明显,但是差不多就是那个操作步骤):

step1  准备一个全量备份:

mysqldump --flush-logs -A > /root/all.sql

step2  手工误操作删除部分数据

> use hellodb;
> delete from scores where `StuID`=8 AND `ID`=14;
# 模拟误操作删了1条用户数据,然后上报需要回滚操作。

此时还有个线程,执行了 grant all on *.* to ‘abc‘@‘%‘; 假设这个grant操作的是管理员正常的操作。

> delete from scores where `StuID`=5 AND `ID`=10;
# 模拟再次误操作删了1条用户数据,然后上报需要回滚操作。

........
........
在我们发现操作错了,到汇报这期间,还要很多用户的正常操作,也造成了数据库的一些更新。例如下面这条插入的记录。
........
INSERT INTO students VALUES(100,‘www‘,100,‘F‘,3,5);
........
........

step3  mysql停机

/etc/init.d/mysql stop

step4 导出相关的binlog

cd /data/mysql

看下最近的binlog文件,假如我这里看到的是 mysql.0000010 这个文件。

# 先导出一份binlog文件,
mysqlbinlog --base64-output=decode-rows -vv mysql.000010 > /root/1.sql

vi /root/1.sql 找到刚才我们误操作的部分,类似如下(下面被我添加了部分注释):

BEGIN  ---> 这个BEGIN-COMMIT要删除
/*!*/;
# at 662771   --->  注意这个Postion,回滚要用到
#170116 15:21:31 server id 106  end_log_pos 662826 CRC32 0xc2733cd6     Table_map: `hellodb`.`scores` mapped to number 156
# at 662826
#170116 15:21:31 server id 106  end_log_pos 662873 CRC32 0x0d302d22     Delete_rows: table id 156 flags: STMT_END_F
### DELETE FROM `hellodb`.`scores`
### WHERE
###   @1=14 /* INT meta=0 nullable=0 is_null=0 */
###   @2=8 /* INT meta=0 nullable=0 is_null=0 */
###   @3=4 /* SHORTINT meta=0 nullable=0 is_null=0 */
###   @4=57 /* TINYINT meta=0 nullable=1 is_null=0 */
# at 662873
#170116 15:21:31 server id 106  end_log_pos 662904 CRC32 0x7bda6198     Xid = 1136
COMMIT/*!*/;

# at 662904  ---> 这个BEGIN COMMIT要保留,这个是用户的正常操作的sql
#170116 15:21:42 server id 106  end_log_pos 663027 CRC32 0xa7dc153b     Query   thread_id=10    exec_time=0     error_code=0
SET TIMESTAMP=1484551302/*!*/;
grant all on *.* to ‘abc‘@‘%‘
/*!*/;
# at 663027
#170116 15:21:49 server id 106  end_log_pos 663102 CRC32 0xa7570f25     Query   thread_id=10    exec_time=0     error_code=0
SET TIMESTAMP=1484551309/*!*/;

BEGIN  ---> 这个BEGIN-COMMIT要删除
/*!*/;
# at 663102  --->  注意这个Postion,回滚要用到
#170116 15:21:49 server id 106  end_log_pos 663157 CRC32 0x20b81986     Table_map: `hellodb`.`scores` mapped to number 156
# at 663157
#170116 15:21:49 server id 106  end_log_pos 663204 CRC32 0x26d9f8b8     Delete_rows: table id 156 flags: STMT_END_F
### DELETE FROM `hellodb`.`scores`     
### WHERE
###   @1=10 /* INT meta=0 nullable=0 is_null=0 */
###   @2=5 /* INT meta=0 nullable=0 is_null=0 */
###   @3=7 /* SHORTINT meta=0 nullable=0 is_null=0 */
###   @4=63 /* TINYINT meta=0 nullable=1 is_null=0 */
# at 663204
#170116 15:21:49 server id 106  end_log_pos 663235 CRC32 0x81f9c1d6     Xid = 1138
COMMIT/*!*/;
# at 663235
#170116 15:22:59 server id 106  end_log_pos 663310 CRC32 0xb3b0508d     Query   thread_id=10    exec_time=0     error_code=0
SET TIMESTAMP=1484551379/*!*/;

BEGIN ---> 这个BEGIN-COMMIT要保留,这个是用户的正常操作的sql
/*!*/;
# at 663310   --->  注意这个Postion,回滚要用到
#170116 15:22:59 server id 106  end_log_pos 663373 CRC32 0x17a48bfc     Table_map: `hellodb`.`students` mapped to number 152
# at 663373
#170116 15:22:59 server id 106  end_log_pos 663424 CRC32 0x0acbd405     Write_rows: table id 152 flags: STMT_END_F
### INSERT INTO `hellodb`.`students`
### SET
###   @1=100 /* INT meta=0 nullable=0 is_null=0 */
###   @2=‘www‘ /* VARSTRING(150) meta=150 nullable=0 is_null=0 */
###   @3=100 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @4=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @5=3 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @6=5 /* INT meta=0 nullable=1 is_null=0 */
# at 663424
#170116 15:22:59 server id 106  end_log_pos 663455 CRC32 0x1f37c970     Xid = 1139
COMMIT/*!*/;

step5 准备恢复的数据

mysqlbinlog mysql.000010 --stop-position=662771 > /root/22.sql                            # 导出step2中第一个DELETE前的数据
mysqlbinlog mysql.000010 --start-position=662904  --stop-position=663027 > /root/33.sql   # 导出step2中这个正常的grant授权操作语句
mysqlbinlog mysql.000010 --start-position=663310  > /root/44.sql                          # 导出step2中的那个正常的INSERT操作及其后面的全部SQL操作

step6 开始恢复数据

/etc/init.d/mysql start 
mysql < /root/all.sql 
mysql < /root/22.sql
mysql < /root/33.sql
mysql < /root/44.sql

step7 检查恢复后结果

> use hellodb;
> SELECT * from students where `StuID`=100 AND `Name`=‘www‘;
+---------+--------+-------+----------+-----------+-------------+
|   StuID | Name   |   Age | Gender   |   ClassID |   TeacherID |
|---------+--------+-------+----------+-----------+-------------|
|     100 | www    |   100 | F        |         3 |           5 |
+---------+--------+-------+----------+-----------+-------------+
> SELECT * from scores where `StuID`=8 AND `ID`=14;
+------+---------+------------+---------+
|   ID |   StuID |   CourseID |   Score |
|------+---------+------------+---------|
|   14 |       8 |          4 |      57 |
+------+---------+------------+---------+
> SELECT * from scores where `StuID`=5 AND `ID`=10;
+------+---------+------------+---------+
|   ID |   StuID |   CourseID |   Score |
|------+---------+------------+---------|
|   10 |       5 |          7 |      63 |
+------+---------+------------+---------+

可以看到恢复的效果不错。

时间: 2024-10-12 02:03:53

ROW 格式binlog 在MySQL5.6上的数据恢复实验的相关文章

MySQL Row格式Binlog的解析(1)

用MySQL 行格式的复制的Slave经常会遇到复制出错1062和1032 错误,一般是镜像异常宕机导致主从复制数据不一致所致,但是有些库本身很大,重建成本很大,并且这些库的数据一致性用户可能都不是太关心的,所以之前的处理办法一般是遇到主键冲突的就跳过,遇到找不到key的就用mysqlbinlog解析一下 把数据补出来,但是这种方法太人肉话,处理起来很慢,所以之前做过一个自动修数据的工具,也是解析binlog日志,然后生成SQL语句去执行. 做这个工具还有另外一个用途,既然能解析BINLOG日志

【20180507】MySQL主从在线修改从库binlog格式从STATEMENT更改成ROW格式

需求 公司内部有几十套基于传统复制的MySQL主从实例,而且binlog的格式都是STATEMENT格式.在接手这些MySQL主从实例之后就有考虑过想将binlog格式更改成ROW格式.而这次则是因为我们elk上面一个第三方工具需要解析和监听binlog信息,并且只能解析ROW格式的binlog,借此机会正好将公司部分MySQL主从复制实例的binlog格式更改成ROW格式. ROW和STATEMENT比对 row格式 优点:就是能够完全保证主从数据的一致性,不会出现因为在SQL中使用MySQL

MySQL Binlog Mixed模式记录成Row格式

概念: binlog format有三种形式:Statement.Mixed.Row,具体的信息可以自行到网上搜查. 分析(本文碰到的案例): 查看MySQL binlog format [email protected] : dba_test 02:33:39>show variables like 'binlog_format%';                                                                                

mysql binlog row格式查看

MySQL 5.1开始,binlog支持row-based的格式,默认情况下只能看到一些经过base-64编码的信息,如 DELIMITER /*!*/; # at 7493962 #090827 5:25:03 server id 1 end_log_pos 0 Start: binlog v 4, server v 5.1.26-rc-community-log created 090827 5:25:03 BINLOG ' L6iVSg8BAAAAZgAAAAAAAAAAAAQANS4xL

Mysql5.6上安装Magento

找了家外贸公司,网站架在magento 1.6.2. 为了迎合公司需要,在本地安装一份供学习使用.在安装环节一直报错说Innodb没有安装. 因为本地环境使用很久了,可以很确定支持Innodb. 那肯定是magento版本的问题,打了了一个php5.4的patch(我的是php5.5),不行 又Google了一番....终于发现: Mysql5.6版本摒弃了“have_innodb”这个变量. 而我们看这个代码/app/code/core/Mage/Install/Model/Installer

手机上dwg格式图纸传到电脑上怎么转换成PDF格式?

手机上dwg格式图纸传到电脑上怎么转换成PDF格式?相信大家都知道dwg格式是CAD文件输出的一种格式,一般经常使用的就是将CAD图纸转换成PDF格式,那么将手机上的dwg格式的CAD图纸文件应该如何进行操作呢?今天小编就要来教教大家手机上的dwg格式图纸传到电脑上应该怎么转换成PDF格式的全部操作步骤,希望能够帮助到大家! 步骤一:我们要打开我们桌面上的CAD转换器,如果您电脑上面没有这一款CAD转换器的话,您就可以打开您电脑上面的浏览器搜索进入官网上面下载,小编是用的就是这款"迅捷CAD转换

[转] MySQL &quot;replace into&quot; 的坑 (5.5 ROW格式)

MySQL 对 SQL 有很多扩展,有些用起来很方便,但有一些被误用之后会有性能问题,还会有一些意料之外的副作用,比如 REPLACE INTO. 比如有这样一张表: 1 2 3 4 5 6 7 8 CREATE TABLE `auto` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `k` int(10) unsigned NOT NULL, `v` varchar(100) DEFAULT NULL, `extra` varchar(200

centos 6.6 上mysql5.1主从同步基础实验

注意本次主从服务器上面均一yum安装mysql主从安装mysql shell> yum -y install mysql mysql-server /etc/init.d/mysqld start #初始化数据库,并启动数据库 主服务器上面 添加以下配置 server-id=1 log-bin=mysql-bin #这个一定得设置,否则没有日志的话,从数据库上会报错 [[email protected] etc]# service mysqld stopStopping mysqld: [ OK

对存在过期 binlog 的 MySQL5.7 添加从服务器

数据库版本:MySQL 5.7原数据库:mysql01从数据库:mysql02 原数据库配置文件 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid server-id=1 gtid_mode=on enforce_gtid_consistency=on log_bin b