广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中binlog的示例分析
  • 161
分享到

MySQL中binlog的示例分析

2023-06-15 11:06:28 161人浏览 八月长安
摘要

这篇文章主要介绍MySQL中binlog的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、binlog简介binlog即binary log,二进制日志文件。它记录了数据库所有执行的DDL和DML语句(除了

这篇文章主要介绍MySQL中binlog的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一、binlog简介

binlog即binary log,二进制日志文件。它记录了数据库所有执行的DDL和DML语句(除了数据查询语句select、show等),以事件形式记录并保存在二进制文件中。

binlog主要有两个应用场景,一是用于复制,master把它的二进制日志传递给slaves来达到master-slave数据一致的目的。二是用于数据恢复,例如还原备份后,可以重新执行备份后新产生的binlog,使得数据库保持最新状态。除去这两个主要用途外,binlog可以用于异构系统之间数据的交互,binlog完整保存了一条记录的前项和后项记录,可以用DTS服务,将Mysql数据以准实时的方式抽取到底层数据平台,比如HBaseHivespark等,打通OLTP和OLAP。

binlog日志可以选择三种模式,分别是 STATEMENTROWMIXED,下面简单介绍下这三种模式:

  • STATEMENT:基于sql语句的复制,每一条会修改数据的sql语句会记录到binlog中。该模式下产生的binlog日志量会比较少,但可能导致主从数据不一致。

  • ROW:基于行的复制,不记录每一条具体执行的SQL语句,仅需记录哪条数据被修改了,以及修改前后的样子。该模式下产生的binlog日志量会比较大,但优点是会非常清楚的记录下每一行数据修改的细节,主从复制不会出错。

  • Mixed:混合模式复制,以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,mysql会根据执行的SQL语句选择日志保存方式。

binlog模式在MySQL 5.7.7之前,默认为 STATEMENT,在之后的版本中,默认为ROW。这里建议采用ROW模式,因为ROW模式更安全,可以清楚记录每行数据修改的细节。

二、binlog相关参数

binlog默认情况下是不开启的,不过一般情况下,初始化的时候建议在配置文件中增加log-bin参数来开启binlog。

# 配置文件中增加log-bin配置[mysqld]log-bin = binlog# 不指定路径默认在data目录下,也可以指定路径[mysqld]log-bin = /data/mysql/logs/binlog# 查看数据库是否开启了binlogshow 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也有很多,下面介绍下部分常用的语句:

MySQL中binlog的示例分析

三、解析binlog内容

前面说过,所有对数据库的修改都会记录在binglog中。但binlog是二进制文件,无法直接查看,想要更直观的观测它就要借助mysqlbinlog命令工具了,下面的内容主要介绍如何使用mysqlbinlog来解析binlog日志内容。

为了故事的顺利发展,我们首先切换下binlog,然后创建测试库、测试表,执行插入数据,更新数据。这些前置操作暂不展示,下面我们来看下如何解析并查看生成的binlog内容:

# 本次解析基于MySQL8.0版本,实例已开启gtid,模式为ROW[root@Centos logs]# mysqlbinlog  --no-defaults --base64-output=decode-rows -vv binlog.000013;;......#200708 16:52:09 server id 1003306  end_log_pos 1049 CRC32 0xbcf3De39   Query   thread_id=85    exec_time=0     error_code=0    Xid = 1514use `bindb`;SET TIMESTAMP=1594198329;SET @@session.explicit_defaults_for_timestamp=1;;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;# original_commit_timestamp=1594198365741300 (2020-07-08 16:52:45.741300 CST)# immediate_commit_timestamp=1594198365741300 (2020-07-08 16:52:45.741300 CST);;;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=0SET 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 ###   @2=1001 ###   @3='from1' ###   @4=1594198365 ###   @5=1594198365 ### INSERT INTO `bindb`.`bin_tb`### SET###   @1=2 ###   @2=1002 ###   @3='dfsfd' ###   @4=1594198365 ###   @5=1594198365 ...# at 1486#200708 16:52:45 server id 1003306  end_log_pos 1517 CRC32 0x0437e777   Xid = 1515COMMIT;...# at 1596#200708 16:54:35 server id 1003306  end_log_pos 1681 CRC32 0x111539b6   Query   thread_id=85    exec_time=0     error_code=0SET 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 ###   @2=1005 ###   @3='dsfsdg' ###   @4=1594198365 ###   @5=1594198365 ### SET###   @1=5 ###   @2=1005 ###   @3=NULL ###   @4=1594198365 ###   @5=1594198475 ### UPDATE `bindb`.`bin_tb`### WHERE###   @1=6 ###   @2=1006 ###   @3='fgd' ###   @4=1594198365 ###   @5=1594198365 ### SET###   @1=6 ###   @2=1006 ###   @3=NULL ###   @4=1594198365 ###   @5=1594198475 ...# at 1939#200708 16:54:35 server id 1003306  end_log_pos 1970 CRC32 0x632a82b7   Xid = 1516COMMIT;SET @@SESSION.GTID_NEXT= 'AUTOMATIC'  ;DELIMITER ;# End of log file;;# 可以看出,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
在指定库中恢复指定位点间的操作

以上是“MySQL中binlog的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中binlog的示例分析

本文链接: https://www.lsjlt.com/news/280111.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中binlog的示例分析
    这篇文章主要介绍MySQL中binlog的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、binlog简介binlog即binary log,二进制日志文件。它记录了数据库所有执行的DDL和DML语句(除了...
    99+
    2023-06-15
  • 针对mysql不同binlog模式的示例分析
    这篇文章主要为大家展示了“针对mysql不同binlog模式的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“针对mysql不同binlog模式的示例分析...
    99+
    2022-10-18
  • mysql中innobackupex备份和binlog日志完全恢复的示例分析
    小编给大家分享一下mysql中innobackupex备份和binlog日志完全恢复的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去...
    99+
    2022-10-18
  • MYSQL中Profile的示例分析
    这篇文章主要介绍MYSQL中Profile的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MYSQL--Profile分析在分析一条SQL语句的时候,发现在SQL语句的末尾或...
    99+
    2022-10-19
  • MySQL中Mysqld_multi的示例分析
    这篇文章将为大家详细讲解有关MySQL中Mysqld_multi的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Mysqld_multi多实例  &nb...
    99+
    2022-10-18
  • mysql中between的示例分析
    这篇文章将为大家详细讲解有关mysql中between的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql between的边界范围between 的范围是包含两边的边界值eg: id be...
    99+
    2023-06-15
  • mysql中MVVC的示例分析
    这篇文章将为大家详细讲解有关mysql中MVVC的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql中MVVC的示例分析1、作用放弃简单地行级锁,可视为行级锁的变种,提升并发性能。在很多情况...
    99+
    2023-06-15
  • mysql中charset=utf8的示例分析
    这篇文章主要介绍了mysql中charset=utf8的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、先来查看一个建表语句cre...
    99+
    2022-10-18
  • MySQL中锁定的示例分析
    这篇文章主要介绍了MySQL中锁定的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 1. 伪事务 前面已经介绍了...
    99+
    2022-10-19
  • mysql中replace into的示例分析
    这篇文章给大家分享的是有关mysql中replace into的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。mysql 的replace into实例详解1、...
    99+
    2022-10-18
  • MySQL中权限的示例分析
    小编给大家分享一下MySQL中权限的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言很多文章中会说,数据库的权限按...
    99+
    2022-10-18
  • MySQL中Query Cache的示例分析
    小编给大家分享一下MySQL中Query Cache的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、原理概述Query Cache就是把“查询返回的结...
    99+
    2023-06-20
  • MySQL Cluster的示例分析
    MySQL Cluster的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 1.背景 MySQL的cluster方案有很多官方和第...
    99+
    2022-10-19
  • MySQL锁的示例分析
    这篇文章主要为大家展示了“MySQL锁的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL锁的示例分析”这篇文章吧。MySQL 锁机制1、MySI...
    99+
    2022-10-19
  • mysql中水平分割的示例分析
    这篇文章给大家分享的是有关mysql中水平分割的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、说明按记录进分分割,不同的记录可以分开保存,每个子表的列数相同。2、优点表关联基本能够在数据库端全部完成;...
    99+
    2023-06-15
  • MySQL实例crash的示例分析
    这篇文章主要介绍MySQL实例crash的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!【问题描述】我们生产环境有一组集群的多台MySQL服务器(MySQL 5.6.21),...
    99+
    2022-10-18
  • mysql分表分区的示例分析
    这篇文章给大家介绍mysql分表分区的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。面对当今大数据存储,设想当mysql中一个表的总记录超过1000W,会出现性能的大幅度下降吗...
    99+
    2022-10-19
  • MySQL中高可用的示例分析
    这篇文章给大家分享的是有关MySQL中高可用的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、MHA对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还...
    99+
    2023-06-20
  • MySQL中子查询的示例分析
    这篇文章主要介绍了MySQL中子查询的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、子查询定义   定义:  子查询允许把一个查询嵌套在另一个查询当中。...
    99+
    2023-06-20
  • Mysql中行级锁的示例分析
    小编给大家分享一下Mysql中行级锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 我们首...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作