- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章解析MySQL binlog由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
binlog即binary log,二进制日志文件。它记录了数据库所有执行的DDL和DML语句(除了数据查询语句select、show等),以事件形式记录并保存在二进制文件中.
binlog主要有两个应用场景,一是用于复制,master把它的二进制日志传递给slaves来达到master-slave数据一致的目的。二是用于数据恢复,例如还原备份后,可以重新执行备份后新产生的binlog,使得数据库保持最新状态。除去这两个主要用途外,binlog可以用于异构系统之间数据的交互,binlog完整保存了一条记录的前项和后项记录,可以用DTS服务,将MySQL数据以准实时的方式抽取到底层数据平台,比如HBase、Hive、Spark等,打通OLTP和OLAP.
binlog日志可以选择三种模式,分别是 STATEMENT、 ROW、 MIXED,下面简单介绍下这三种模式:
binlog模式在MySQL 5.7.7之前,默认为 STATEMENT,在之后的版本中,默认为ROW。这里建议采用ROW模式,因为ROW模式更安全,可以清楚记录每行数据修改的细节.
binlog默认情况下是不开启的,不过一般情况下,初始化的时候建议在配置文件中增加log-bin参数来开启binlog.
1
2
3
4
5
6
7
8
9
10
|
# 配置文件中增加log-bin配置
[mysqld]
log-bin = binlog
# 不指定路径默认在data目录下,也可以指定路径
[mysqld]
log-bin =
/data/mysql/logs/binlog
# 查看数据库是否开启了binlog
show variables like
'log_bin%'
;
|
开启binlog后,还需注意一些与binlog相关的参数,下面简单介绍下相关参数:
binlog_format 设置binlog模式,建议设为ROW.
binlog_do_db 此参数表示只记录指定数据库的二进制日志,默认全部记录,一般情况下不建议更改.
binlog_ignore_db 此参数表示不记录指定的数据库的二进制日志,同上,一般不显式指定.
expire_logs_days 此参数控制二进制日志文件保留天数,默认值为0,表示不自动删除,可设置为0~99。可根据实际情况设置,比如保留15天或30天。MySQL8.0版本可用binlog_expire_logs_seconds参数代替.
max_binlog_size 控制单个二进制日志大小,当前日志文件大小超过此变量时,执行切换动作。此参数的最大和默认值是1GB,该设置并不能严格控制Binlog的大小,尤其是Binlog比较靠近最大值而又遇到一个比较大事务时,为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的所有SQL都记录进当前日志,直到事务结束。一般情况下可采取默认值.
log_bin_trust_function_creators 当二进制日志启用后,此参数就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINE或ALTER ROUTINE特权之外的SUPER权限。建议设置为1.
sync_binlog 控制MySQL服务端将二进制日志同步到磁盘的频率,默认值为1。 设置为0,表示MySQL不控制binlog的刷新,由文件系统自己控制它的缓存的刷新; 设置为1,表示每次事务提交,MySQL都会把binlog刷下去,这是最安全的设置,但由于磁盘写入次数增加,可能会对性能产生负面影响; 设置为n,其中n为0或1以外的值,在进行n次事务提交以后,Mysql将执行一次fsync之类的磁盘同步指令,将Binlog文件缓存刷新到磁盘。 推荐设置为1,出于性能考虑也可酌情调整.
关于binlog操作与管理相关的SQL也有很多,下面介绍下部分常用的语句:
前面说过,所有对数据库的修改都会记录在binglog中。但binlog是二进制文件,无法直接查看,想要更直观的观测它就要借助mysqlbinlog命令工具了,下面的内容主要介绍如何使用mysqlbinlog来解析binlog日志内容.
为了故事的顺利发展,我们首先切换下binlog,然后创建测试库、测试表,执行插入数据,更新数据。这些前置操作暂不展示,下面我们来看下如何解析并查看生成的binlog内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
# 本次解析基于MySQL8.0版本,实例已开启gtid,模式为ROW
[root@centos logs]# mysqlbinlog
--no-defaults --base64-output=decode-rows -vv binlog.000013
/*!50530
SET
@@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003
SET
@OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
...
...
#200708 16:52:09 server id 1003306 end_log_pos 1049 CRC32 0xbcf3de39 Query thread_id=85 exec_time=0 error_code=0 Xid = 1514
use `bindb`/*!*/;
SET
TIMESTAMP
=1594198329/*!*/;
SET
@@session.explicit_defaults_for_timestamp=1/*!*/;
/*!80013
SET
@@session.sql_require_primary_key=0*//*!*/;
CREATE
TABLE
`bin_tb` (
`increment_id`
int
(11)
NOT
NULL
AUTO_INCREMENT COMMENT
'自增主键'
,
`stu_id`
int
(11)
NOT
NULL
COMMENT
'学号'
,
`stu_name`
varchar
(20)
DEFAULT
NULL
COMMENT
'学生姓名'
,
`create_time`
timestamp
NOT
NULL
DEFAULT
CURRENT_TIMESTAMP
COMMENT
'创建时间'
,
`update_time`
timestamp
NOT
NULL
DEFAULT
CURRENT_TIMESTAMP
ON
UPDATE
CURRENT_TIMESTAMP
COMMENT
'修改时间'
,
PRIMARY
KEY
(`increment_id`)
) ENGINE=InnoDB
DEFAULT
CHARSET=utf8 COMMENT=
'测试binlog'
/*!*/;
#
at
1049
#200708 16:52:45 server id 1003306 end_log_pos 1128 CRC32 0xf19ea0a9 GTID last_committed=2 sequence_number=3 rbr_only=yes original_committed_timestamp=1594198365741300 immediate_commit_timestamp=1594198365741300 transaction_length=468
/*!50718
SET
TRANSACTION
ISOLATION
LEVEL
READ
COMMITTED
*//*!*/;
# original_commit_timestamp=1594198365741300 (2020-07-08 16:52:45.741300 CST)
# immediate_commit_timestamp=1594198365741300 (2020-07-08 16:52:45.741300 CST)
/*!80001
SET
@@session.original_commit_timestamp=1594198365741300*//*!*/;
/*!80014
SET
@@session.original_server_version=80019*//*!*/;
/*!80014
SET
@@session.immediate_server_version=80019*//*!*/;
SET
@@SESSION.GTID_NEXT=
'0032d819-2d32-11ea-91b5-5254002ae61f:24883'
/*!*/;
#
at
1128
#200708 16:52:45 server id 1003306 end_log_pos 1204 CRC32 0x5b4b03db Query thread_id=85 exec_time=0 error_code=0
SET
TIMESTAMP
=1594198365/*!*/;
BEGIN
/*!*/;
#
at
1204
#200708 16:52:45 server id 1003306 end_log_pos 1268 CRC32 0xd4755d50 Table_map: `bindb`.`bin_tb` mapped
to
number 139
#
at
1268
#200708 16:52:45 server id 1003306 end_log_pos 1486 CRC32 0x274cf734 Write_rows:
table
id 139 flags: STMT_END_F
###
INSERT
INTO
`bindb`.`bin_tb`
###
SET
### @1=1 /*
INT
meta=0 nullable=0 is_null=0 */
### @2=1001 /*
INT
meta=0 nullable=0 is_null=0 */
### @3=
'from1'
/* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @4=1594198365 /*
TIMESTAMP
(0) meta=0 nullable=0 is_null=0 */
### @5=1594198365 /*
TIMESTAMP
(0) meta=0 nullable=0 is_null=0 */
###
INSERT
INTO
`bindb`.`bin_tb`
###
SET
### @1=2 /*
INT
meta=0 nullable=0 is_null=0 */
### @2=1002 /*
INT
meta=0 nullable=0 is_null=0 */
### @3=
'dfsfd'
/* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @4=1594198365 /*
TIMESTAMP
(0) meta=0 nullable=0 is_null=0 */
### @5=1594198365 /*
TIMESTAMP
(0) meta=0 nullable=0 is_null=0 */
...
#
at
1486
#200708 16:52:45 server id 1003306 end_log_pos 1517 CRC32 0x0437e777 Xid = 1515
COMMIT
/*!*/;
...
#
at
1596
#200708 16:54:35 server id 1003306 end_log_pos 1681 CRC32 0x111539b6 Query thread_id=85 exec_time=0 error_code=0
SET
TIMESTAMP
=1594198475/*!*/;
BEGIN
/*!*/;
#
at
1681
#200708 16:54:35 server id 1003306 end_log_pos 1745 CRC32 0x6f0664ee Table_map: `bindb`.`bin_tb` mapped
to
number 139
#
at
1745
#200708 16:54:35 server id 1003306 end_log_pos 1939 CRC32 0xfafe7ae8 Update_rows:
table
id 139 flags: STMT_END_F
###
UPDATE
`bindb`.`bin_tb`
###
WHERE
### @1=5 /*
INT
meta=0 nullable=0 is_null=0 */
### @2=1005 /*
INT
meta=0 nullable=0 is_null=0 */
### @3=
'dsfsdg'
/* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @4=1594198365 /*
TIMESTAMP
(0) meta=0 nullable=0 is_null=0 */
### @5=1594198365 /*
TIMESTAMP
(0) meta=0 nullable=0 is_null=0 */
###
SET
### @1=5 /*
INT
meta=0 nullable=0 is_null=0 */
### @2=1005 /*
INT
meta=0 nullable=0 is_null=0 */
### @3=
NULL
/* VARSTRING(60) meta=60 nullable=1 is_null=1 */
### @4=1594198365 /*
TIMESTAMP
(0) meta=0 nullable=0 is_null=0 */
### @5=1594198475 /*
TIMESTAMP
(0) meta=0 nullable=0 is_null=0 */
###
UPDATE
`bindb`.`bin_tb`
###
WHERE
### @1=6 /*
INT
meta=0 nullable=0 is_null=0 */
### @2=1006 /*
INT
meta=0 nullable=0 is_null=0 */
### @3=
'fgd'
/* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @4=1594198365 /*
TIMESTAMP
(0) meta=0 nullable=0 is_null=0 */
### @5=1594198365 /*
TIMESTAMP
(0) meta=0 nullable=0 is_null=0 */
###
SET
### @1=6 /*
INT
meta=0 nullable=0 is_null=0 */
### @2=1006 /*
INT
meta=0 nullable=0 is_null=0 */
### @3=
NULL
/* VARSTRING(60) meta=60 nullable=1 is_null=1 */
### @4=1594198365 /*
TIMESTAMP
(0) meta=0 nullable=0 is_null=0 */
### @5=1594198475 /*
TIMESTAMP
(0) meta=0 nullable=0 is_null=0 */
...
#
at
1939
#200708 16:54:35 server id 1003306 end_log_pos 1970 CRC32 0x632a82b7 Xid = 1516
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*/;
# 可以看出,binlog中详细记录了每条sql执行产生的变化,
并且包括执行时间、pos位点、server_id等系统值。
|
关于mysqlbinlog工具的使用技巧还有很多,例如只解析对某个库的操作或者某个时间段内的操作等。简单分享几个常用的语句,更多操作可以参考官方文档.
mysqlbinlog --no-defaults --base64-output=decode-rows -vv binlog.000013 > /tmp/bin13.sql 将解析到的SQL导入文件中 。
mysqlbinlog --no-defaults --base64-output=decode-rows -vv --database=testdb binlog.000013 只解析某个库的操作 。
mysqlbinlog --no-defaults --base64-output=decode-rows -vv --start-datetime=“2020-01-11 01:00:00” --stop-datetime=“2020-01-11 23:59:00” binlog.000008 解析指定时间段内的操作 。
mysqlbinlog --no-defaults --base64-output=decode-rows -vv --start-position=204136360 --stop-position=204136499 binlog.000008 解析指定pos位点内的操作 。
mysqlbinlog --no-defaults --start-position=204136360 --stop-position=204136499 binlog.000008 | mysql -uroot -pxxxx testdb 在指定库中恢复指定位点间的操作 。
不知不觉写的挺长了,本文讲述了各类binlog相关知识点,希望你读完会对binlog有更深的认识。其实最重要的还是实践,只有多学多用才能更好的掌握。这么硬核的知识,希望大家用到的时候可以拿来读读,欢迎各位转发分享,让更多人看到.
以上就是解析MySQL binlog的详细内容,更多关于MySQL binlog的资料请关注我其它相关文章! 。
原文链接:https://blog.csdn.net/wangkun_j/article/details/107246462 。
最后此篇关于解析MySQL binlog的文章就讲到这里了,如果你想了解更多关于解析MySQL binlog的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我一直在使用 AJAX 从我正在创建的网络服务中解析 JSON 数组时遇到问题。我的前端是一个简单的 ajax 和 jquery 组合,用于显示从我正在创建的网络服务返回的结果。 尽管知道我的数据库查
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我在尝试运行 Android 应用程序时遇到问题并收到以下错误 java.lang.NoClassDefFoundError: com.parse.Parse 当我尝试运行该应用时。 最佳答案 在这
有什么办法可以防止etree在解析HTML内容时解析HTML实体吗? html = etree.HTML('&') html.find('.//body').text 这给了我 '&' 但我想
我有一个有点疯狂的例子,但对于那些 JavaScript 函数作用域专家来说,它看起来是一个很好的练习: (function (global) { // our module number one
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我需要编写一个脚本来获取链接并解析链接页面的 HTML 以提取标题和其他一些数据,例如可能是简短的描述,就像您链接到 Facebook 上的内容一样。 当用户向站点添加链接时将调用它,因此在客户端启动
在 VS Code 中本地开发时,包解析为 C:/Users//AppData/Local/Microsoft/TypeScript/3.5/node_modules/@types//index而不是
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我被赋予了将一种语言“翻译”成另一种语言的工作。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。我在哪里可以了解更多关于词法分析和解析器的信息? 最佳答案 如果你想对这个主题产生“情绪化
您好,我在解析此文本时遇到问题 { { { {[system1];1;1;0.612509325}; {[system2];1;
我正在为 adobe after effects 在 extendscript 中编写一些代码,最终变成了 javascript。 我有一个数组,我想只搜索单词“assemble”并返回整个 jc3_
我有这段代码: $(document).ready(function() { // }); 问题:FB_RequireFeatures block 外部的代码先于其内部的代码执行。因此 who
背景: netcore项目中有些服务是在通过中间件来通信的,比如orleans组件。它里面服务和客户端会指定网关和端口,我们只需要开放客户端给外界,服务端关闭端口。相当于去掉host,这样省掉了些
1.首先贴上我试验成功的代码 复制代码 代码如下: protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 X
【PHP代码】 复制代码 代码如下: $stmt = mssql_init('P__Global_Test', $conn) or die("initialize sto
在SQL查询分析器执行以下代码就可以了。 复制代码代码如下: declare @t varchar(255),@c varchar(255) declare table_cursor curs
前言 最近练习了一些前端算法题,现在做个总结,以下题目都是个人写法,并不是标准答案,如有错误欢迎指出,有对某道题有新的想法的友友也可以在评论区发表想法,互相学习🤭 题目 题目一: 二维数组中的
我是一名优秀的程序员,十分优秀!