MySQL二进制日志相关问题详解

 

本文出处: 
(保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他)

 

今天无意中发现了一个云栖社区举行的MySQL“第一季:挑战玄惭之 慢SQL性能优化赛”,在测试服务器上执行其测试脚本写入数据的时候报错提示如下,
Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes of storage,increase this mysqld variable and try agagin

MySQL二进制日志相关问题详解

 提示max_binlog_cache_size空间不足,因为开启了二进制日志,之前是默认设置没有大批量的事务性操作,没有遇到该问题,这一次一开始就遇到一个较大的事务性操作就失败了。
之后修改binlog_cache_size的大小之后,问题解决。

 

由于使用的是默认的innodb引擎,开启了二进制日志,
对于事务性的操作,是要事物完成的时候写入二进制日志,事物提交之前,执行的写入性操作会被缓存起来,直到整个事物完成,mysqld进程会将整个事物写入二进制日志。
当事物开始的时候,会按照binlog_cache_size系统变量指定的值分配内容空间,如果指定的binlog_cache_size缓存空间不够,执行的事务性操作回滚并提示失败。

MySQL二进制日志相关问题详解

 

 

顺便总结一下二进制日志(binary log)以及其相关参数信息

什么是二进制日志?
  用来记录操作MySQL数据库中的写入性操作(增删改,但不包括查询),相当于sqlserver中的完整恢复模式下的事务日志文件。
二进制日志的作用?
  1,用于复制,配置了主从复制的时候,主服务器会将其产生的二进制日志发送到slave端,slave端会利用这个二进制日志的信息在本地重做,实现主从同步
  2,用户恢复,MySQL可以在全备和差异备份的基础上,利用二进制日志进行基于时间点或者事物Id的恢复操作。原理雷同于主从复制的日志重做。
 

二进制日志(binary log)的相关参数信息

1,开启二进制日志
 开启二进制日志,需要指定一个log-bin参数的路径,比如:log_bin=/var/lib/mysql/mysql-bin
 开始二进制日志之后会自动生成一个管理二进制日志的log_bin_index文件。log_bin选项也显示为on,也即开启了二进制日志。

 MySQL二进制日志相关问题详解

 

2,二进制日志文件的格式

  二进制日志的格式由参数binlog_format控制,二进制日志有三种模式,基于语句(statement)的,基于行的(row),以及结合前两者的混合模式(mixed)
 基于语句的二进制功能有一些硬伤(个人认为),比如同样的update语句中的利用当前时间的now更新操作,在主服务器和从服务器上同样都是获取当前时间,主从复制得到的结果是不一样的。
 基于行的二进制日志模式解决了基于语句的一些缺陷,但是某些情况下回产生大量的日志,比如一个update操作更新了100W行数据,如果是基于行的二进制日志,结果就是产生了100W条日志
 基于混合模式的,结合上述两种方式的优点。
 可以在配置文件中设置:binlog_format = MIXED

 MySQL二进制日志相关问题详解

 

3,二进制日志的记录时机

 二进制日志记录可以使同步的,也即事物提交之后就写入二进制日志,也可以是异步的,由操作系统的磁盘缓存觉得什么时候写入磁盘。
 由参数sync_binlog= n来控制,设置sync_binlog = 1的话,表示最高安全级别的写入(但也不能保证不丢失任何事物日志),相当于是一种安全写入模式,不过对性能有一定的影响。
 个人觉得,如果是事务性的引擎,本身就是为了保证事物安全的,没理由不把sync_binlog 设置为1。

 据说设置为sync_binlog设置为1也会潜在丢失一个事务日志的可能性,但是还没想明白为什么会丢失,因为既然是事务性引擎,还有一层undo或者redo日志在做后盾啊?

 后面想想,因为有redo和undo日志的存在,事物的一致性可以在主服务器上得到保证,应该是主从复制的时候,可能丢失的一条事物可能无法传递到从服务器。

 MySQL二进制日志相关问题详解

 

4,二进制日志的单个文件大小

 二进制日志的大下就是单个日志文件的最大限制,正常情况下都不会超过设置的最大文件的大小限制,超过设置的最大限制之后,会发生日志滚动,也即重新生成一个二进制日志文件。
 max_binlog_size  = 100M
 这里显示的104857600单位是字节,也即104857600/1024/1024 = 100M

 MySQL二进制日志相关问题详解

 

5,二进制日志的清理

 二进制日志滚动之后会生成新的文件来存储日志,日志文件逾期之后会自动删除,否则会产生源源不断的日志文件
 比如可以设置过期时间为2,可配值为:expire_logs_days = 2,超过两天的二进制日志会被自动删除。
 可以通过命令show master logs 查看当前的二进制日志文件个数

  MySQL二进制日志相关问题详解

 

6,二进制日志文件的滚动

 1)正常情况下,记录满之后,自动滚动,后缀名+1
 2)重启mysql服务之后,自动滚动,不管日志文件是否按照指定的最大容量写满
 3)手动滚动,执行flush logs命令,如下执行flush logs之后,重新生成了一个二进制日志文件

 MySQL二进制日志相关问题详解

 4)手动删除二进制日志

通义万相 通义万相

通义万相,一个不断进化的AI艺术创作大模型

通义万相 596 查看详情 通义万相

 可以通过命令purge binary logs to fileName删除指定fileName之前的文件

 MySQL二进制日志相关问题详解

 可以通过命令purge binary logs before ‘2017-03-10 10:10:00’删除指定时间之前的文件

 MySQL二进制日志相关问题详解

 删除指定日志purge binary logs before date_sub( now( ), interval 7 day);
 潇湘大神是purge master logs before date_sub( now( ), interval 7 day),应该是一个效果(binary和master关键词)?

 

7,二进制日志的绑定(或者排除)的数据库

 可以设置某些数据库开启二进制日志,或者某些数据库不开启二进制日志
 # binlog_do_db:设置master-slave时使用;
 # binlog-ignore-db:设置哪个数据库不记录日志;
 MySQL5.7.18中设置了(my.cnf中配置了),但是查询的时候好像没用?

 MySQL二进制日志相关问题详解

 

8,二进制日志的缓存以及缓存大小配置

 binlog_cache_size的大小,一开始提到的问题,当事物开始的时候,会按照binlog_cache_size系统变量指定的值分配内容空间,如果指定的binlog_cache_size缓存空间不够则会报错并回滚事物
 这里显示的记录的单位同样是字节,除以两个1024之后就是以MB为单位的容量了,这里的20971520 /1024/1024就相当于20MB了。
 如果有较大的事务性操作,比如在测试的时候,必须要将此缓存设置的相对较大一些,否则语句无法成功执行

 MySQL二进制日志相关问题详解

 max_binlog_cache_size语binlog_cache_size的区别在于前者是实例级别的cache,后者是Session级别的cache,如果并发量很大,就需要考虑将max_binlog_cache_size设置的稍微大一些。
 max_binlog_cache_size默认是是4GB,最大值也是4GB,这里为了测试设置的是100MB(104857600/1024.0/1024.0)

 MySQL二进制日志相关问题详解

    max_binlog_cache_size设置的最大内存大小为4GB,如果服务器内容较大,比如128GB或者更大,max_binlog_cache_size默认为设置为最大也无伤大雅,因为要保证并发成功写入。
 至于对于Session级别的binlog_cache_size大小,可以根据业务情况自行调整,个人觉得设置的稍微大一点也问题不大,毕竟,除了正常的OLTP操作,有一些定时作业之类的数据提取或者merge数据之类的操作可能会产生大量的日志。
 据说是可以通过查看binlog_cache_disk_use 与 binlog_cache_use来判断binlog_cache_size是否需要调整。
 但是在MySQL5.7.18中并没有发现这个参数

 MySQL二进制日志相关问题详解

 

9,二进制日志其他参数

 max_binlog_stmt_cache_size针对非事务语句,非事务性的参数暂不关心它了
 记得某次看到过某大师说过,innodb引擎优势不仅仅在事务性的支持上,与非事物引起的myisam引擎相比,读取性能上差距越来越小,MySQL因此将innodb设置为默认引擎。
 放弃myisam,投奔innodb是正道。
 binlog_checksum 用作复制的主从校检。暂时没有研究过这个参数,暂不论
 详细参考想想大神的文章 。

 

 

总结:

  MySQL二进制日志不仅仅作用于功能性(master-slave复制)的,还作用于安全性(二进制日志)以及开启了二进制日志情况下的事务性操作,因此对于生产环境,可以认为是一个必不可少的配置。
  同时,其各种参数又会影响到某些操作,因此二进制日志的参数要格外的重视,确保数据库在使用时在功能性和可用性上得到保证。

 

参考: 

   《涂抹MySQL》

   以及各种翻书,网上资料

 

行动起来,可以改变思维模式以及畏惧心理。

 

以上就是MySQL二进制日志相关问题详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/399307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何通过 Jenkins 进行资源的锁定和释放
上一篇 2025年11月6日 18:50:42
CS扫描全能王如何从相册导入图片进行处理_CS扫描全能王图片导入与编辑教程
下一篇 2025年11月6日 18:50:49

相关推荐

  • mysql怎么多行注释

    在mysql中,可以利用“/* */”注释符进行多行注释,“/*”用于注释内容的开头,“*/”用于注释内容的结尾,注释的内容可以跨多行,语法为“/*多行注释*/”。 本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑。 mysql怎么多行注释 多行注释使用/* *…

    2026年9月1日
    000
  • 解决数据库连接问题:使用minii/db库的实际案例

    可以通过一下地址学习composer:学习地址 最近在开发一个小型应用时,我遇到了一个棘手的问题:需要快速集成一个轻量级的数据库操作库。尝试了多个库后,我发现它们要么功能过多,要么兼容性不佳。最终,我找到了 minii/db,这是一个基于 yii2 的简化版本,完美地解决了我的问题。 minii/d…

    用户投稿 2026年9月1日
    100
  • mysql怎么将值转换数字类型

    转换方法:1、用CAST(),语法“SELECT CAST(‘值’ AS SIGNED);”;2、用CONVERT(),语法“SELECT CONVERT(‘值’,SIGNED);”;3、用“+”运算符,语法“SELECT ‘值&#8217…

    2026年9月1日
    000
  • mysql中having的用法是什么

    在mysql中,having子句用于筛选分组之后的各种数据,通常与“group by”联合使用,该语句弥补了where关键字无法与聚合函数联合使用的不足。 本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑。 mysql中having的用法是什么 在 SQL 中增…

    2026年9月1日
    100
  • mysql index关键字的用法是什么

    在mysql中,index关键字可用于创建索引,语法“CREATE INDEX 索引名 ON 表名(列名)”;可用于查看索引,语法“SHOW INDEX FROM 表名”;也可用于修改索引,语法“DROP INDEX 索引名 ON 表名”。 本教程操作环境:windows7系统、mysql8版本、D…

    2026年9月1日
    000
  • mysql中5.6和5.5有什么区别

    mysql中5.6和5.5有什么区别mysql中5.6和5.5有什么区别mysql中5.6和5.5有什么区别mysql中5.6和5.5有什么区别

    区别:1、在5.5版本中主从配置不能省略binlog和POS两个参数,而在5.6版本中这两个参数可以省略;2、在5.5版本中不支持多线程复制,同步复制是单线程、队列的,而在5.6版本中支持多线程复制。 本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑。 mysq…

    2026年9月1日 用户投稿
    100
  • MySQL如何实现实时数据同步_跨机房数据同步方案?

    MySQL如何实现实时数据同步_跨机房数据同步方案?MySQL如何实现实时数据同步_跨机房数据同步方案?MySQL如何实现实时数据同步_跨机房数据同步方案?MySQL如何实现实时数据同步_跨机房数据同步方案?

    mysql实时数据同步在跨机房场景下的核心方案包括:1. 基于binlog的复制,通过slave节点读取master的binlog实现同步,优点稳定但受网络和负载影响;2. 基于gtid的复制,简化管理但需mysql 5.6+支持;3. mysql group replication,提供高可用但资…

    2026年9月1日 用户投稿
    000
  • mysql中union的用法是什么

    mysql中union的用法是什么mysql中union的用法是什么mysql中union的用法是什么mysql中union的用法是什么

    mysql中,union用于将多个select语句的结果组合到一个结果集中,并删除结果集中的重复数据,语法为“select column,…from table1 union select column,…from table2”。 本教程操作环境:windows10系统、m…

    2026年9月1日 用户投稿
    100
  • mysql与db2的区别是什么

    mysql与db2的区别:1、mysql可以对最小单元的对象批量进行授权,而db2不可以对最小单元的对象批量进行授权;2、mysql支持在恢复时打开数据库,而db2不支持在恢复时打开数据库。 本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑。 mysql与db2…

    2026年9月1日
    100
  • mysql编码怎么修改为utf8

    mysql编码修改为utf8的方法:1、打开并修改mysql配置文件“my.ini”;2、在“mysqld”标签下添加“default-character-set = utf8”;3、重新启动mysql服务即可。 本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑…

    2026年9月1日
    000
  • mysql中5.6与5.7有什么区别

    mysql中5.6与5.7的区别:1、5.7版本提供了json格式数据,而5.6版本没有提供json版本数据;2、5.7版本支持多主一从,而5.6版本不支持多主一从;3、5.7版本初始化数据时在bin目录下,而5.6版本在script目录。 本教程操作环境:windows10系统、mysql8.0.…

    2026年9月1日
    100
  • 如何利用MySQL唯一索引和分布式锁/数据库锁防止特定时间段内的数据重复插入?

    如何利用MySQL唯一索引和锁机制避免特定时间段内的数据重复插入? 本文探讨如何防止在特定时间范围内(例如10:15-11:15)向MySQL数据库插入重复数据。直接使用MySQL唯一索引无法完全解决此问题,因为时间戳是动态变化的。 解决方案: 1. 高效方案:利用分布式锁(例如Redis) 对于高…

    2026年9月1日
    100
  • mysql中–是啥意思

    在mysql中,“–”是注释符,是单行注释的意思,该注释符后需要添加一个空格注释才能生效,语法为“– 注释内容”;该注释符与“#”注释符都用于单行注释,区别就是“#”注释符后不需要添加空格。 本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电…

    2026年9月1日
    000
  • mysql视图有索引吗

    mysql中视图没有索引。视图是一张虚拟的表,并不真实的存在于数据库中,所以也就没有主键、索引,因为视图没有行和列,本质上就是语句,当调用视图时系统先执行生成视图的语句,然后在视图的基础上进行查询。 本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑。 mysql…

    2026年9月1日
    100
  • MySQL唯一索引如何实现基于时间段的约束?

    MySQL如何实现基于时间段的唯一索引约束? 如何在MySQL中创建唯一索引,以确保同一时间段内只允许插入一条记录?直接用索引无法实现,但我们可以通过以下两种方法解决: 方法一:利用分布式锁(高频数据场景推荐) 此方法适合数据插入频率较高的场景。 流程如下: 使用Redis等分布式锁服务。插入数据前…

    2026年9月1日
    100
  • MySQL数据库基础知识点储备(整理总结)

    本篇文章给大家带来了关于mysql数据库的相关知识,主要整理了数据库基础的一下知识点,包括索引、语法顺序、执行顺序、存储过程等等相关问题,希望对大家有帮助。 推荐学习:mysql教程 一、数据库 1.1 事务 1.1.1 事务四个特性(ACID) 原子性 (Atomicity) 整个事务中的所要操作…

    2026年9月1日
    100
  • MySQL你必须要了解存储引擎

    MySQL你必须要了解存储引擎MySQL你必须要了解存储引擎MySQL你必须要了解存储引擎MySQL你必须要了解存储引擎

    本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了存储引擎的相关问题,还包括了索引设计与使用、数据类型选择以及字符集设置等问题,希望对大家有帮助。 推荐学习:mysql教程 谁说MySQL查询千万级别的数据很拉跨?我今天就要好好的和你拉拉家常,畅谈到深夜,一起过除夕!这篇文章也是年前的最后…

    2026年9月1日 用户投稿
    400
  • 归纳详解MySQL知识点之表结构

    归纳详解MySQL知识点之表结构归纳详解MySQL知识点之表结构归纳详解MySQL知识点之表结构归纳详解MySQL知识点之表结构

    本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了表结构包括了约束条件以及修改表结构的相关问题,希望对大家有帮助。 推荐学习:mysql教程 约束条件 作用是限制如何给字段赋值 查看约束条件 mysql> desc 库名.表名; mysql> desc db1.t9; //如图…

    2026年9月1日 用户投稿
    600
  • 一文详解MySQL中的事务和 MVCC 原理

    一文详解MySQL中的事务和 MVCC 原理一文详解MySQL中的事务和 MVCC 原理一文详解MySQL中的事务和 MVCC 原理一文详解MySQL中的事务和 MVCC 原理

    本篇文章带大家了解一下mysql中的事务,并介绍一下mvcc 原理,希望能够给大家提供帮助! 01 什么是事务? 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不做,其实不是没做,是可能做了一部分但是只要有一步失败,就要回滚所有操作,有点一不做二不休的意思。 在…

    2026年9月1日 用户投稿
    100
  • mysql报错注入是什么

    在mysql中,报错注入就是指通过页面报出的错误信息,构造合适的语句来获取想要的数据;应用系统未关闭数据库报错函数,可以使用extractvalue()函数,从目标XML中返回包含所查询值的字符串。 本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑。 mysql…

    2026年9月1日
    400

发表回复

登录后才能评论
关注微信