当前位置: 移动技术网 > IT编程>数据库>Mysql > Mysql的binlog日志与mysqlbinlog命令

Mysql的binlog日志与mysqlbinlog命令

2020年01月08日  | 移动技术网IT编程  | 我要评论

binlog相关

mysql 的二进制日志 binlog 可以说是 mysql 最重要的日志,它记录了所有的 ddl 和 dml 语句(除了数据查询语句select、show等),以事件形式记录,还包含语句所执行的消耗的时间,mysql的二进制日志是事务安全型的。binlog 的主要目的是复制和恢复。

binlog日志的两个最重要的使用场景
mysql主从复制:mysql replication在master端开启binlog,master把它的二进制日志传递给slaves来达到master-slave数据一致的目的
数据恢复:通过使用 mysqlbinlog工具来使恢复数据


总体的关于binlog的参数如下

sync_binlog = 1
log-bin = mysql-bin
binlog_format = row
expire_logs_days = 10
binlog_cache_size =4m
max_binlog_cache_size =8m
max_binlog_size =1024m

相关参数讲解

log-bin
决定了msyql 的binlog的名字,⽣成的binlog名字为mysql-bin.000001


binlog_format
规定binlog的格式, binlog有三种格式statement, row以及mixed,默认使⽤默认使⽤statement(5.7.7之前),建议使⽤row格式(5.7.7之后默认)


expire_logs_days
过期时间


binlog_do_db
此参数表示只记录指定数据库的⼆进制⽇志


binlog_ignore_db
此参数表示不记录指定的数据库的⼆进制⽇志


sync_binlog
在提交n次事务后,进⾏binlog的落盘, 0为不进⾏强⾏的刷新操作,⽽是由⽂件系统控制刷新⽇志⽂件
如果是在线交易和帐有关的数据建议设置成1, 如果是其它数据可以保持为0即可。


max_binlog_size
binlog⽂件的最⼤值,默认和最⼤是1gb,并不能严格限定⼆进制⽂件的⼤⼩


max_binlog_cache_size 表示的是binlog 能够使⽤的最⼤cache 内存⼤⼩
当我们执⾏多语句事务的时候 所有session的使⽤的内存超过max_binlog_cache_size的值时
就会报错: “multi-statement transaction required more than 'max_binlog_cache_size' bytes ofstorage”

mysqlbinlog格式

statment格式
特点:记录每⼀条数据的sql,将执⾏的每⼀条sql记录在binlog中,减少⽇志量,节省io,提⾼性能。
缺点:某些sql中的函数⽆法使⽤,⽐如sysdate(),在同步过程中会出现⽆法同步的问题。
mixed格式
特点:⼀般的语句使⽤sql语句来记录,遇到特殊的语句使⽤row格式来记录,保证数据的⼀致性和复制的准确性。
row格式
特点: binlog中仅仅记录哪⼀条记录被修改,不记录dml的sql语句,会详细记录每⼀行的更改细节,不会出现⽆法复制的问题。
缺点:因为要记录每⼀条修改记录的⽇志,所以⼤量占⽤磁盘io和⼤量使⽤硬盘空间。

注:将二进制日志格式设置为row时,有些更改仍然使用基于语句的格式,包括所有ddl语句,例如create table, alter table,或 drop table。

开启binlog

由于log_bin是个只读系统变量,不能动态的修改,只能再my.cnf里[mysqld]模块添加log-bin 配置,表示启用binlog,如果没有给定值,写成 log-bin=,则默认名称为主机名。(注:名称若带有小数点,则只取第一个小数点前的部分作为名称)

[mysqld]
log-bin=mysql-bin

此方法需要重启数据库方能生效,如果想临时关掉binlog而又不想重启数据库,可以使用sql_log_bin,sql_log_bin 是一个动态变量,修改该变量时,可以只对当前会话生效(session),也可以是全局的(global),当全局修改这个变量时,只会对新的会话生效(这意味当对当前会话也不会生效),因此一般全局修改了这个变量后,都要把原来的所有连接 kill 掉,全局只在mariadb 5.5之前和mysql 5.6.22之前生效,后面的版本都已经不支持全局,因为太危险了。
用处:
当还原数据库的时候,如果不关闭二进制日志,那么你还原的过程仍然会记录在二进制日志里面,不仅浪费资源,那么增加了磁盘的容量,还没有必要(特别是利用二进制还原数据库的时候)所以一般还原的时候会选择关闭二进制日志,可以通过修改配置文件,重启关闭二进制日志。
也可以动态命令关闭sql_log_bin,然后导入数据库。

set sql_log_bin=0;# 设为0后,在当前会话上执行的语句都不记录binlog
set sql_log_bin=1; # 取消限制

常用的binlog命令

# 是否启用binlog日志
show variables like 'log_bin';

# 查看详细的日志配置信息
show global variables like '%log%';

# 查看binlog的目录
show global variables like "%log_bin%";

# 查看当前服务器使用的biglog文件及大小
show binary logs;

# 查看最新一个binlog日志文件名称和position
show master status;

# 清除所有的binlog⽂件,并且重置为⼀个
reset master

清理binlog日志

自动清理:
通过binlog参数(expire_logs_days )来实现mysql⾃动删除binlog

show binary logs;
show variables like 'expire_logs_days';
set global expire_logs_days=3; # 过期删除,单位是天

手动清理:

1、使⽤reset master 重置binlog⽂件(#reset master后,会造成slave⽆法找到master的严重后果)

2、直接rm本地删除binlog

# 查看正在使用的binlog
show master status;

直接使⽤rm 命令删除不是当前使⽤的binlog(切记不要删除正在使⽤的binlog)

 

mysqlbinlog命令

root@localhost localhost 15:23:43 (none)>show global variables like "%log_bin%";
+---------------------------------+-----------------------------+
| variable_name | value |
+---------------------------------+-----------------------------+
| log_bin | on |
| log_bin_basename | /data/mysql/mysql-bin |
| log_bin_index | /data/mysql/mysql-bin.index |
| log_bin_trust_function_creators | on |
| log_bin_use_v1_row_events | off |
+---------------------------------+-----------------------------+
5 rows in set (0.00 sec)

root@localhost localhost 15:29:21 test1>show global variables like "binlog_format";
+---------------+-------+
| variable_name | value |
+---------------+-------+
| binlog_format | row |
+---------------+-------+
1 row in set (0.01 sec)

root@localhost localhost 15:25:06 abc>create database test1;
query ok, 1 row affected (0.00 sec)

root@localhost localhost 15:25:28 abc>use test1;
database changed
root@localhost localhost 15:25:34 test1>create table `abc` (
-> `id` int(11) not null auto_increment,
-> `c1` int(11) default null,
-> primary key (`id`),
-> key `shouji` (`c1`) using btree
-> ) engine=innodb auto_increment=1 default charset=utf8;
query ok, 0 rows affected (0.01 sec)

root@localhost localhost 15:26:12 test1>insert into abc(c1) values (1);
query ok, 1 row affected (0.13 sec)

root@localhost localhost 15:26:23 test1>insert into abc(c1) values (2),(3);
query ok, 2 rows affected (0.02 sec)
records: 2 duplicates: 0 warnings: 0

root@localhost localhost 15:26:43 test1>delete from abc where id=2;
query ok, 1 row affected (0.00 sec)

root@localhost localhost 15:26:58 test1>select * from abc;
+----+------+
| id | c1 |
+----+------+
| 1 | 1 |
| 3 | 3 |
+----+------+
2 rows in set (0.00 sec)

root@localhost localhost 15:47:38 test1>show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| file | position | binlog_do_db | binlog_ignore_db | executed_gtid_set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 | 1361 | | | 0f943fa6-3117-11ea-a98d-005056b351ef:1-5 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

root@localhost localhost 15:48:27 test1>show binlog events in 'mysql-bin.000001'\g;
*************************** 1. row ***************************
log_name: mysql-bin.000001
pos: 4
event_type: format_desc
server_id: 1007231
end_log_pos: 123
info: server ver: 5.7.19-log, binlog ver: 4
*************************** 2. row ***************************
log_name: mysql-bin.000001
pos: 123
event_type: previous_gtids
server_id: 1007231
end_log_pos: 150
info:
*************************** 3. row ***************************
log_name: mysql-bin.000001
pos: 150
event_type: gtid
server_id: 1007231
end_log_pos: 211
info: set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:1'
*************************** 4. row ***************************
log_name: mysql-bin.000001
pos: 211
event_type: query
server_id: 1007231
end_log_pos: 304
info: create database test1
*************************** 5. row ***************************
log_name: mysql-bin.000001
pos: 304
event_type: gtid
server_id: 1007231
end_log_pos: 365
info: set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:2'
*************************** 6. row ***************************
log_name: mysql-bin.000001
pos: 365
event_type: query
server_id: 1007231
end_log_pos: 629
info: use `test1`; create table `abc` (
`id` int(11) not null auto_increment,
`c1` int(11) default null,
primary key (`id`),
key `shouji` (`c1`) using btree
) engine=innodb auto_increment=1 default charset=utf8
*************************** 7. row ***************************
log_name: mysql-bin.000001
pos: 629
event_type: gtid
server_id: 1007231
end_log_pos: 690
info: set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:3'
*************************** 8. row ***************************
log_name: mysql-bin.000001
pos: 690
event_type: query
server_id: 1007231
end_log_pos: 759
info: begin
*************************** 9. row ***************************
log_name: mysql-bin.000001
pos: 759
event_type: table_map
server_id: 1007231
end_log_pos: 803
info: table_id: 220 (test1.abc)
*************************** 10. row ***************************
log_name: mysql-bin.000001
pos: 803
event_type: write_rows
server_id: 1007231
end_log_pos: 843
info: table_id: 220 flags: stmt_end_f
*************************** 11. row ***************************
log_name: mysql-bin.000001
pos: 843
event_type: xid
server_id: 1007231
end_log_pos: 870
info: commit /* xid=52 */
*************************** 12. row ***************************
log_name: mysql-bin.000001
pos: 870
event_type: gtid
server_id: 1007231
end_log_pos: 931
info: set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:4'
*************************** 13. row ***************************
log_name: mysql-bin.000001
pos: 931
event_type: query
server_id: 1007231
end_log_pos: 1000
info: begin
*************************** 14. row ***************************
log_name: mysql-bin.000001
pos: 1000
event_type: table_map
server_id: 1007231
end_log_pos: 1044
info: table_id: 220 (test1.abc)
*************************** 15. row ***************************
log_name: mysql-bin.000001
pos: 1044
event_type: write_rows
server_id: 1007231
end_log_pos: 1093
info: table_id: 220 flags: stmt_end_f
*************************** 16. row ***************************
log_name: mysql-bin.000001
pos: 1093
event_type: xid
server_id: 1007231
end_log_pos: 1120
info: commit /* xid=53 */
*************************** 17. row ***************************
log_name: mysql-bin.000001
pos: 1120
event_type: gtid
server_id: 1007231
end_log_pos: 1181
info: set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:5'
*************************** 18. row ***************************
log_name: mysql-bin.000001
pos: 1181
event_type: query
server_id: 1007231
end_log_pos: 1250
info: begin
*************************** 19. row ***************************
log_name: mysql-bin.000001
pos: 1250
event_type: table_map
server_id: 1007231
end_log_pos: 1294
info: table_id: 220 (test1.abc)
*************************** 20. row ***************************
log_name: mysql-bin.000001
pos: 1294
event_type: delete_rows
server_id: 1007231
end_log_pos: 1334
info: table_id: 220 flags: stmt_end_f
*************************** 21. row ***************************
log_name: mysql-bin.000001
pos: 1334
event_type: xid
server_id: 1007231
end_log_pos: 1361
info: commit /* xid=54 */
21 rows in set (0.00 sec)

 

下面是mysqlbinlog命令的参数,摘自官方文档

选项名称描述引用弃用
使用base-64编码打印二进制日志条目    
使用指定的网络接口连接到mysql server    
二进制日志最大事件大小    
字符集的安装目录    
用于测试和调试。有关适用的默认值和其他详细信息,请参见文本 5.7.5  
仅列出该数据库的条目    
编写调试日志    
程序退出时打印调试信息    
程序退出时打印调试信息,内存和cpu统计信息    
身份验证插件使用    
除了通常的选项文件,还读取命名的选项文件    
只读命名的选项文件    
选项组后缀值    
禁用二进制日志记录    
不要显示提供的gtid集中的任何组    
读取二进制日志文件,即使打开或未正确关闭    
如果mysqlbinlog读取了无法识别的二进制日志事件,则会输出警告    
从服务器请求rsa公钥 5.7.23  
显示帮助信息并退出    
显示登录注释的十六进制转储    
mysql服务器所在的主机    
仅在处理来自此会话的二进制日志更新时,导致服务器使用幂等模式 5.7.0  
仅显示提供的gtid集中的组    
在指定目录中为load data准备本地临时文件    
从.mylogin.cnf中读取登录路径选项    
不读取选项文件    
跳过日志中的前n个条目    
指定要保留的打开文件描述符的数量    
连接服务器时使用的密码    
安装插件的目录    
用于连接的tcp / ip端口号    
打印默认选项    
使用的连接协议    
将事件以原始(二进制)格式写入输出文件    
从mysql主服务器读取二进制日志,而不是读取本地日志文件    
从mysql服务器而不是本地日志文件中读取二进制日志    
直接输出到命名文件    
从基于行的格式编写的日志中播放时,为数据库创建重写规则。可多次使用 5.7.1  
不要以旧(4.1之前)格式向服务器发送密码 5.7.4 5.7.5
仅提取由具有给定服务器id的服务器创建的那些事件    
告诉mysqlbinlog当mysqld编写的server-id-bits设置为小于最大值时,如何解释二进制日志中的服务器id;仅受mysql cluster版本的mysqlbinlog支持    
包含rsa公钥的文件的路径名 5.7.23  
在输出中添加set names charset_name语句    
用于共享内存连接的共享内存的名称    
仅显示日志中包含的语句    
不要打印任何gtid。从包含gtid的二进制日志写入转储文件时使用此功能    
unix套接字文件或windows命名管道使用    
启用连接加密 5.7.3  
包含受信任的ssl证书颁发机构列表的文件 5.7.3  
包含受信任的ssl证书颁发机构证书文件的目录 5.7.3  
包含x.509证书的文件 5.7.3  
连接加密的允许密码 5.7.3  
包含证书吊销列表的文件    
包含证书吊销列表文件的目录    
包含x.509密钥的文件 5.7.3  
与服务器连接的所需安全状态 5.7.11  
根据服务器证书的公用名身份验证主机名 5.7.3  
从第一个事件中读取时间戳等于或晚于datetime参数的二进制日志    
从位置等于或大于参数的第一个事件读取二进制日志    
在时间戳等于或大于datetime参数的第一个事件时停止读取二进制日志    
读取最后一个二进制日志文件后保持与服务器的连接    
连接到服务器时要报告的从服务器id    
在第一个事件中停止读取二进制日志,且位置等于或大于参数    
允许的tls协议进行加密连接 5.7.10  
不要在从mysql服务器请求的二进制日志的结尾处停止,而要继续打印到最后一个二进制日志的结尾    
连接服务器时要使用的mysql用户名    
将行事件重建为sql语句    
验证二进制日志中的校验和    

 

[root@localhost mysql]# mysqlbinlog mysql-bin.000001 >/data/tmp/mysqlbinlog.sql
[root@localhost mysql]# cat /data/tmp/mysqlbinlog.sql
/*!50530 set @@session.pseudo_slave_mode=1*/;
/*!50003 set @old_completion_type=@@completion_type,completion_type=0*/;
delimiter /*!*/;
# at 4
#200107 15:45:15 server id 1007231  end_log_pos 123     start: binlog v 4, server v 5.7.19-log created 200107 15:45:15 at startup
# warning: this binlog is either in use or was not closed properly.
rollback/*!*/;
binlog '
czcuxg9/xg8adwaaahsaaaabaaqans43lje5lwxvzwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaalnxreezgnaagaegaebaqeegaaxwaegggaaaaicagcaaaacgokkioaejqa
aejxkj0=
'/*!*/;
# at 123
#200107 15:45:15 server id 1007231  end_log_pos 150     previous-gtids
# [empty]
# at 150
#200107 15:45:53 server id 1007231  end_log_pos 211     gtid    last_committed=0    sequence_number=1    rbr_only=no
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:1'/*!*/;
# at 211
#200107 15:45:53 server id 1007231  end_log_pos 304     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383153/*!*/;
set @@session.pseudo_thread_id=3/*!*/;
set @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
set @@session.sql_mode=1344274432/*!*/;
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\c utf8mb4 *//*!*/;
set @@session.character_set_client=224,@@session.collation_connection=224,@@session.collation_server=224/*!*/;
set @@session.lc_time_names=0/*!*/;
set @@session.collation_database=default/*!*/;
create database test1
/*!*/;
# at 304
#200107 15:46:38 server id 1007231  end_log_pos 365     gtid    last_committed=1    sequence_number=2    rbr_only=no
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:2'/*!*/;
# at 365
#200107 15:46:38 server id 1007231  end_log_pos 629     query    thread_id=3    exec_time=0    error_code=0
use `test1`/*!*/;
set timestamp=1578383198/*!*/;
create table `abc` (
`id` int(11) not null auto_increment,
`c1` int(11) default null,
primary key (`id`),
key `shouji` (`c1`) using btree
 ) engine=innodb auto_increment=1 default charset=utf8
/*!*/;
# at 629
#200107 15:47:15 server id 1007231  end_log_pos 690     gtid    last_committed=2    sequence_number=3    rbr_only=yes
/*!50718 set transaction isolation level read committed*//*!*/;
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:3'/*!*/;
# at 690
#200107 15:47:15 server id 1007231  end_log_pos 759     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383235/*!*/;
begin
/*!*/;
# at 759
#200107 15:47:15 server id 1007231  end_log_pos 803     table_map: `test1`.`abc` mapped to number 220
# at 803
#200107 15:47:15 server id 1007231  end_log_pos 843     write_rows: table id 220 flags: stmt_end_f

binlog '
gzcuxhn/xg8alaaaacmdaaaaanwaaaaaaaeabxrlc3qxaanhymmaagmdaai=
gzcuxh5/xg8akaaaaesdaaaaanwaaaaaaaeaagac//wbaaaaaqaaaa==
'/*!*/;
# at 843
#200107 15:47:15 server id 1007231  end_log_pos 870     xid = 52
commit/*!*/;
# at 870
#200107 15:47:23 server id 1007231  end_log_pos 931     gtid    last_committed=3    sequence_number=4    rbr_only=yes
/*!50718 set transaction isolation level read committed*//*!*/;
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:4'/*!*/;
# at 931
#200107 15:47:23 server id 1007231  end_log_pos 1000     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383243/*!*/;
begin
/*!*/;
# at 1000
#200107 15:47:23 server id 1007231  end_log_pos 1044     table_map: `test1`.`abc` mapped to number 220
# at 1044
#200107 15:47:23 server id 1007231  end_log_pos 1093     write_rows: table id 220 flags: stmt_end_f

binlog '
izcuxhn/xg8alaaaabqeaaaaanwaaaaaaaeabxrlc3qxaanhymmaagmdaai=
izcuxh5/xg8amqaaaeueaaaaanwaaaaaaaeaagac//wcaaaaagaaapwdaaaaawaaaa==
'/*!*/;
# at 1093
#200107 15:47:23 server id 1007231  end_log_pos 1120     xid = 53
commit/*!*/;
# at 1120
#200107 15:47:30 server id 1007231  end_log_pos 1181     gtid    last_committed=4    sequence_number=5    rbr_only=yes
/*!50718 set transaction isolation level read committed*//*!*/;
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:5'/*!*/;
# at 1181
#200107 15:47:30 server id 1007231  end_log_pos 1250     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383250/*!*/;
begin
/*!*/;
# at 1250
#200107 15:47:30 server id 1007231  end_log_pos 1294     table_map: `test1`.`abc` mapped to number 220
# at 1294
#200107 15:47:30 server id 1007231  end_log_pos 1334     delete_rows: table id 220 flags: stmt_end_f

binlog '
kjcuxhn/xg8alaaaaa4faaaaanwaaaaaaaeabxrlc3qxaanhymmaagmdaai=
kjcuxib/xg8akaaaadyfaaaaanwaaaaaaaeaagac//wcaaaaagaaaa==
'/*!*/;
# at 1334
#200107 15:47:30 server id 1007231  end_log_pos 1361     xid = 54
commit/*!*/;
set @@session.gtid_next= 'automatic' /* added by mysqlbinlog */ /*!*/;
delimiter ;
# end of log file
/*!50003 set completion_type=@old_completion_type*/;
/*!50530 set @@session.pseudo_slave_mode=0*/;

发现有很多base64编码的binlog语句,比如

binlog '
czcuxg9/xg8adwaaahsaaaabaaqans43lje5lwxvzwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaalnxreezgnaagaegaebaqeegaaxwaegggaaaaicagcaaaacgokkioaejqa
aejxkj0=
'/*!*/;
这样的,这就需要加上--base64-output=decode-rows --verbose来解成一个sql语句。
[root@localhost mysql]# mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001 >/data/tmp/mysqlbinlog2.sql
[root@localhost mysql]# cat /data/tmp/mysqlbinlog2.sql
/*!50530 set @@session.pseudo_slave_mode=1*/;
/*!50003 set @old_completion_type=@@completion_type,completion_type=0*/;
delimiter /*!*/;
# at 4
#200107 15:45:15 server id 1007231  end_log_pos 123     start: binlog v 4, server v 5.7.19-log created 200107 15:45:15 at startup
# warning: this binlog is either in use or was not closed properly.
rollback/*!*/;
# at 123
#200107 15:45:15 server id 1007231  end_log_pos 150     previous-gtids
# [empty]
# at 150
#200107 15:45:53 server id 1007231  end_log_pos 211     gtid    last_committed=0    sequence_number=1    rbr_only=no
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:1'/*!*/;
# at 211
#200107 15:45:53 server id 1007231  end_log_pos 304     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383153/*!*/;
set @@session.pseudo_thread_id=3/*!*/;
set @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
set @@session.sql_mode=1344274432/*!*/;
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\c utf8mb4 *//*!*/;
set @@session.character_set_client=224,@@session.collation_connection=224,@@session.collation_server=224/*!*/;
set @@session.lc_time_names=0/*!*/;
set @@session.collation_database=default/*!*/;
create database test1
/*!*/;
# at 304
#200107 15:46:38 server id 1007231  end_log_pos 365     gtid    last_committed=1    sequence_number=2    rbr_only=no
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:2'/*!*/;
# at 365
#200107 15:46:38 server id 1007231  end_log_pos 629     query    thread_id=3    exec_time=0    error_code=0
use `test1`/*!*/;
set timestamp=1578383198/*!*/;
create table `abc` (
`id` int(11) not null auto_increment,
`c1` int(11) default null,
primary key (`id`),
key `shouji` (`c1`) using btree
 ) engine=innodb auto_increment=1 default charset=utf8
/*!*/;
# at 629
#200107 15:47:15 server id 1007231  end_log_pos 690     gtid    last_committed=2    sequence_number=3    rbr_only=yes
/*!50718 set transaction isolation level read committed*//*!*/;
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:3'/*!*/;
# at 690
#200107 15:47:15 server id 1007231  end_log_pos 759     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383235/*!*/;
begin
/*!*/;
# at 759
#200107 15:47:15 server id 1007231  end_log_pos 803     table_map: `test1`.`abc` mapped to number 220
# at 803
#200107 15:47:15 server id 1007231  end_log_pos 843     write_rows: table id 220 flags: stmt_end_f
### insert into `test1`.`abc`
### set
###   @1=1
###   @2=1
# at 843
#200107 15:47:15 server id 1007231  end_log_pos 870     xid = 52
commit/*!*/;
# at 870
#200107 15:47:23 server id 1007231  end_log_pos 931     gtid    last_committed=3    sequence_number=4    rbr_only=yes
/*!50718 set transaction isolation level read committed*//*!*/;
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:4'/*!*/;
# at 931
#200107 15:47:23 server id 1007231  end_log_pos 1000     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383243/*!*/;
begin
/*!*/;
# at 1000
#200107 15:47:23 server id 1007231  end_log_pos 1044     table_map: `test1`.`abc` mapped to number 220
# at 1044
#200107 15:47:23 server id 1007231  end_log_pos 1093     write_rows: table id 220 flags: stmt_end_f
### insert into `test1`.`abc`
### set
###   @1=2
###   @2=2
### insert into `test1`.`abc`
### set
###   @1=3
###   @2=3
# at 1093
#200107 15:47:23 server id 1007231  end_log_pos 1120     xid = 53
commit/*!*/;
# at 1120
#200107 15:47:30 server id 1007231  end_log_pos 1181     gtid    last_committed=4    sequence_number=5    rbr_only=yes
/*!50718 set transaction isolation level read committed*//*!*/;
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:5'/*!*/;
# at 1181
#200107 15:47:30 server id 1007231  end_log_pos 1250     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383250/*!*/;
begin
/*!*/;
# at 1250
#200107 15:47:30 server id 1007231  end_log_pos 1294     table_map: `test1`.`abc` mapped to number 220
# at 1294
#200107 15:47:30 server id 1007231  end_log_pos 1334     delete_rows: table id 220 flags: stmt_end_f
### delete from `test1`.`abc`
### where
###   @1=2
###   @2=2
# at 1334
#200107 15:47:30 server id 1007231  end_log_pos 1361     xid = 54
commit/*!*/;
set @@session.gtid_next= 'automatic' /* added by mysqlbinlog */ /*!*/;
delimiter ;
# end of log file
/*!50003 set completion_type=@old_completion_type*/;
/*!50530 set @@session.pseudo_slave_mode=0*/;

这样就能看出来具体的sql了。

还可以根据时间来筛选语句:

[root@localhost mysql]# mysqlbinlog --base64-output=decode-rows -v --start-datetime="2020-01-07 15:47:14" --stop-datetime="2020-01-07 15:47:24" mysql-bin.000001 >/data/tmp/mysqlbinlog3.sql
[root@localhost mysql]# cat /data/tmp/mysqlbinlog3.sql
/*!50530 set @@session.pseudo_slave_mode=1*/;
/*!50003 set @old_completion_type=@@completion_type,completion_type=0*/;
delimiter /*!*/;
# at 4
#200107 15:45:15 server id 1007231  end_log_pos 123     start: binlog v 4, server v 5.7.19-log created 200107 15:45:15 at startup
# warning: this binlog is either in use or was not closed properly.
rollback/*!*/;
# at 629
#200107 15:47:15 server id 1007231  end_log_pos 690     gtid    last_committed=2    sequence_number=3    rbr_only=yes
/*!50718 set transaction isolation level read committed*//*!*/;
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:3'/*!*/;
# at 690
#200107 15:47:15 server id 1007231  end_log_pos 759     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383235/*!*/;
set @@session.pseudo_thread_id=3/*!*/;
set @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
set @@session.sql_mode=1344274432/*!*/;
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\c utf8mb4 *//*!*/;
set @@session.character_set_client=224,@@session.collation_connection=224,@@session.collation_server=224/*!*/;
set @@session.lc_time_names=0/*!*/;
set @@session.collation_database=default/*!*/;
begin
/*!*/;
# at 759
#200107 15:47:15 server id 1007231  end_log_pos 803     table_map: `test1`.`abc` mapped to number 220
# at 803
#200107 15:47:15 server id 1007231  end_log_pos 843     write_rows: table id 220 flags: stmt_end_f
### insert into `test1`.`abc`
### set
###   @1=1
###   @2=1
# at 843
#200107 15:47:15 server id 1007231  end_log_pos 870     xid = 52
commit/*!*/;
# at 870
#200107 15:47:23 server id 1007231  end_log_pos 931     gtid    last_committed=3    sequence_number=4    rbr_only=yes
/*!50718 set transaction isolation level read committed*//*!*/;
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:4'/*!*/;
# at 931
#200107 15:47:23 server id 1007231  end_log_pos 1000     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383243/*!*/;
begin
/*!*/;
# at 1000
#200107 15:47:23 server id 1007231  end_log_pos 1044     table_map: `test1`.`abc` mapped to number 220
# at 1044
#200107 15:47:23 server id 1007231  end_log_pos 1093     write_rows: table id 220 flags: stmt_end_f
### insert into `test1`.`abc`
### set
###   @1=2
###   @2=2
### insert into `test1`.`abc`
### set
###   @1=3
###   @2=3
# at 1093
#200107 15:47:23 server id 1007231  end_log_pos 1120     xid = 53
commit/*!*/;
set @@session.gtid_next= 'automatic' /* added by mysqlbinlog */ /*!*/;
delimiter ;
# end of log file
/*!50003 set completion_type=@old_completion_type*/;
/*!50530 set @@session.pseudo_slave_mode=0*/;

 

根据位置筛选,比我我们上面用show binlog events in 'mysql-bin.000001'\g;看到的有条删除类型的语句

*************************** 20. row ***************************
   log_name: mysql-bin.000001
        pos: 1294
 event_type: delete_rows
  server_id: 1007231
end_log_pos: 1334
       info: table_id: 220 flags: stmt_end_f

 

[root@localhost mysql]# mysqlbinlog --base64-output=decode-rows -v  --stop-position="1334" mysql-bin.000001 >/data/tmp/mysqlbinlog4.sql

you have new mail in /var/spool/mail/root
[root@localhost mysql]# cat /data/tmp/mysqlbinlog4.sql
/*!50530 set @@session.pseudo_slave_mode=1*/;
/*!50003 set @old_completion_type=@@completion_type,completion_type=0*/;
delimiter /*!*/;
# at 4
#200107 15:45:15 server id 1007231  end_log_pos 123     start: binlog v 4, server v 5.7.19-log created 200107 15:45:15 at startup
# warning: this binlog is either in use or was not closed properly.
rollback/*!*/;
# at 123
#200107 15:45:15 server id 1007231  end_log_pos 150     previous-gtids
# [empty]
# at 150
#200107 15:45:53 server id 1007231  end_log_pos 211     gtid    last_committed=0    sequence_number=1    rbr_only=no
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:1'/*!*/;
# at 211
#200107 15:45:53 server id 1007231  end_log_pos 304     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383153/*!*/;
set @@session.pseudo_thread_id=3/*!*/;
set @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
set @@session.sql_mode=1344274432/*!*/;
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\c utf8mb4 *//*!*/;
set @@session.character_set_client=224,@@session.collation_connection=224,@@session.collation_server=224/*!*/;
set @@session.lc_time_names=0/*!*/;
set @@session.collation_database=default/*!*/;
create database test1
/*!*/;
# at 304
#200107 15:46:38 server id 1007231  end_log_pos 365     gtid    last_committed=1    sequence_number=2    rbr_only=no
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:2'/*!*/;
# at 365
#200107 15:46:38 server id 1007231  end_log_pos 629     query    thread_id=3    exec_time=0    error_code=0
use `test1`/*!*/;
set timestamp=1578383198/*!*/;
create table `abc` (
`id` int(11) not null auto_increment,
`c1` int(11) default null,
primary key (`id`),
key `shouji` (`c1`) using btree
 ) engine=innodb auto_increment=1 default charset=utf8
/*!*/;
# at 629
#200107 15:47:15 server id 1007231  end_log_pos 690     gtid    last_committed=2    sequence_number=3    rbr_only=yes
/*!50718 set transaction isolation level read committed*//*!*/;
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:3'/*!*/;
# at 690
#200107 15:47:15 server id 1007231  end_log_pos 759     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383235/*!*/;
begin
/*!*/;
# at 759
#200107 15:47:15 server id 1007231  end_log_pos 803     table_map: `test1`.`abc` mapped to number 220
# at 803
#200107 15:47:15 server id 1007231  end_log_pos 843     write_rows: table id 220 flags: stmt_end_f
### insert into `test1`.`abc`
### set
###   @1=1
###   @2=1
# at 843
#200107 15:47:15 server id 1007231  end_log_pos 870     xid = 52
commit/*!*/;
# at 870
#200107 15:47:23 server id 1007231  end_log_pos 931     gtid    last_committed=3    sequence_number=4    rbr_only=yes
/*!50718 set transaction isolation level read committed*//*!*/;
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:4'/*!*/;
# at 931
#200107 15:47:23 server id 1007231  end_log_pos 1000     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383243/*!*/;
begin
/*!*/;
# at 1000
#200107 15:47:23 server id 1007231  end_log_pos 1044     table_map: `test1`.`abc` mapped to number 220
# at 1044
#200107 15:47:23 server id 1007231  end_log_pos 1093     write_rows: table id 220 flags: stmt_end_f
### insert into `test1`.`abc`
### set
###   @1=2
###   @2=2
### insert into `test1`.`abc`
### set
###   @1=3
###   @2=3
# at 1093
#200107 15:47:23 server id 1007231  end_log_pos 1120     xid = 53
commit/*!*/;
# at 1120
#200107 15:47:30 server id 1007231  end_log_pos 1181     gtid    last_committed=4    sequence_number=5    rbr_only=yes
/*!50718 set transaction isolation level read committed*//*!*/;
set @@session.gtid_next= '0f943fa6-3117-11ea-a98d-005056b351ef:5'/*!*/;
# at 1181
#200107 15:47:30 server id 1007231  end_log_pos 1250     query    thread_id=3    exec_time=0    error_code=0
set timestamp=1578383250/*!*/;
begin
/*!*/;
# at 1250
#200107 15:47:30 server id 1007231  end_log_pos 1294     table_map: `test1`.`abc` mapped to number 220
# at 1294
#200107 15:47:30 server id 1007231  end_log_pos 1334     delete_rows: table id 220 flags: stmt_end_f
### delete from `test1`.`abc`
### where
###   @1=2
###   @2=2
rollback /* added by mysqlbinlog */ /*!*/;
set @@session.gtid_next= 'automatic' /* added by mysqlbinlog */ /*!*/;
delimiter ;
# end of log file
/*!50003 set completion_type=@old_completion_type*/;
/*!50530 set @@session.pseudo_slave_mode=0*/;

其他选项可以根据需求添加使用。

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网