5.7新特性:mysql打开binlog的SQL记录,排查问题更快捷

MySQL 5.7引入了新的特性`binlog_rows_query_log_events`,开启后在binlog中可以看到Row格式的SQL语句,极大地简化了问题排查和数据恢复的过程。通过`mysqlbinlog`工具,可以方便地解析并查看SQL操作,特别是对于INSERT, UPDATE, DELETE等操作,使得跟踪数据库变化变得更加直观。" 116560492,7479038,Scala大数据编程:函数式聚合操作详解,"['大数据开发', '函数式编程', '数据统计', '编程语言']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.7版本中,我们又有了一个新的功能:
binlog_rows_query_log_events 
默认关闭 ,可选打开,建议打开,还是比较有用的。可以看到row格式下的sql语句,方便排查问题和恢复数据。 

 

(1)首先是先从binlog中恢复出来。
/usr/local/mysql/3308/bin/mysqlbinlog /log/binlog/3308/bin.000006 -vv >/tmp/ss.sql

# at 6433161
#160726 16:30:48 server id 3308161  end_log_pos 6433226 CRC32 0xf8016d90        GTID    last_committed=124      sequence_number=125
SET @@SESSION.GTID_NEXT= 'e08d636f-47de-11e6-af3d-0050569e70f2:150'/*!*/;
# at 6433226
#160726 16:30:48 server id 3308161  end_log_pos 6433299 CRC32 0xce9b4c6e        Query   thread_id=40    exec_time=0     error_code=0
SET TIMESTAMP=1469521848/*!*/;
BEGIN
/*!*/;
# at 6433299
#160726 16:30:48 server id 3308161  end_log_pos 6433353 CRC32 0xd3574f25        Rows_query
# insert into t values(2,'ujuj')            可以直接还原原生SQL语句。
# at 6433353
#160726 16:30:48 server id 3308161  end_log_pos 6433401 CRC32 0x0cde3e29        Table_map: `tmp_2`.`t` mapped to number 160
# at 6433401
#160726 16:30:48 server id 3308161  end_log_pos 6433446 CRC32 0x5c3dc545        Write_rows: table id 160 flags: STMT_END_F

BINLOG '
uB+XVx2BejIANgAAAEkqYgCAAB5pbnNlcnQgaW50byB0IHZhbHVlcygyLCd1anVqJyklT1fT
uB+XVxOBejIAMAAAAHkqYgAAAKAAAAAAAAEABXRtcF8yAAF0AAIDDwJjAAMpPt4M
uB+XVx6BejIALQAAAKYqYgAAAKAAAAAAAAEAAgAC//wCAAAABHVqdWpFxT1c
'/*!*/;
### INSERT INTO `tmp_2`.`t`
### SET
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
###   @2='ujuj' /* VARSTRING(99) meta=99 nullable=1 is_null=0 */

直接就是SQL语句。非常使用,坏处就是binlog又变大了。


那么我们可以得到一个方便的SQL执行情况:
[root@test11 ~]# more /tmp/ss.sql | grep --ignore-case "Rows_query" -A5 -B4
SET TIMESTAMP=1469521816/*!*/;
BEGIN
/*!*/;
# at 6432924
#160726 16:30:16 server id 3308161  end_log_pos 6432992 CRC32 0xc007f27f     Rows_query
# update dept set loc='boston' where deptno=40
# at 6432992
#160726 16:30:16 server id 3308161  end_log_pos 6433045 CRC32 0x38b0706c     Table_map: `test`.`dept` mapped to number 130
# at 6433045
#160726 16:30:16 server id 3308161  end_log_pos 6433130 CRC32 0xb1098c91     Update_rows: table id 130 flags: STMT_END_F
--
SET TIMESTAMP=1469521848/*!*/;
BEGIN
/*!*/;
# at 6433299
#160726 16:30:48 server id 3308161  end_log_pos 6433353 CRC32 0xd3574f25     Rows_query
# insert into t values(2,'ujuj')
# at 6433353
#160726 16:30:48 server id 3308161  end_log_pos 6433401 CRC32 0x0cde3e29     Table_map: `tmp_2`.`t` mapped to number 160
# at 6433401
#160726 16:30:48 server id 3308161  end_log_pos 6433446 CRC32 0x5c3dc545     Write_rows: table id 160 flags: STMT_END_F

 

可以更加简单:
[root@test11 ~]# more /tmp/ss.sql | grep --ignore-case "Rows_query" -A2
#160726 16:30:16 server id 3308161  end_log_pos 6432992 CRC32 0xc007f27f     Rows_query
# update dept set loc='boston' where deptno=40
# at 6432992
--
#160726 16:30:48 server id 3308161  end_log_pos 6433353 CRC32 0xd3574f25     Rows_query
# insert into t values(2,'ujuj')
# at 6433353

 

直接过滤出来SQL:
[root@test11 ~]# more /tmp/ss.sql | grep --ignore-case "Rows_query" -A2 | grep -E 'insert|update|delete'
# update dept set loc='boston' where deptno=40
# insert into t values(2,'ujuj')
这种方法只能过滤出,insert,update,delete操作。

 

但是对于create,drop,alter等操作,就无法过滤出来。
来个完整的:
more /tmp/ss.sql | grep -E 'insert|update|delete|alter|drop|create|use'
create table bonus
create table salgrade ( grade int,losal int,hisal int )
create table cust (cno int primary key,lname varchar(30),fname varchar(30),sex char(1),height int,weight int)
create table cust (cno int primary key auto_increment,lname varchar(30),fname varchar(30),sex char(1),height int,weight int)
create index idx_test_1 on cust(sex,height,lname,fname)
drop index idx_test_1 on cust
create index idx_test_1 on cust(sex,lname,fname)
drop index idx_test_1 on cust
create index idx_test_1 on cust(sex,height)
drop index idx_test_1 on cust
create index idx_test_1 on cust(sex,height,lname,fname,cno)
drop index idx_test_1 on cust
create index idx_test_1 on cust(sex,lname,fname,cno)
drop index idx_test_1 on cust
create index idx_test_1 on cust(height,lname,fname,cno,sex,weight)
# update dept set loc='boston' where deptno=40
# insert into t values(2,'ujuj')
drop database tmp_2
create database tmp
use `tmp`/*!*/;
create table t(id int)
# insert into t values(2),(12)
# delete from t where id=2
alter table t add column name varchar(30)
alter table t add primary key(id)
alter table t drop primary key

过滤出来use,主要是获取schema。基本可以做任何事情了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值