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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月6日 18:46:51
下一篇 2025年11月6日 18:51:18

相关推荐

  • AppServer下phpMyAdmin无法登录,是什么原因导致的以及如何解决?

    AppServer环境下phpMyAdmin无法登录的排查与解决 在AppServer环境中安装phpMyAdmin后,即使用户名密码正确,也可能出现反复跳转回登录页面的情况。 这通常是由于AppServer的会话配置问题导致的。 问题根源: AppServer默认使用文件系统存储会话信息,这容易造…

    2025年12月10日
    000
  • PHP MySQL分页查询:如何高效实现精准分页并获取总记录数?

    PHP MySQL 高效分页查询技巧 本文介绍在PHP中优化MySQL分页查询的方法,确保高效性能和准确结果。 正确的SQL语句 不正确的SQL语句会导致分页结果错误。 以下展示了正确的分页查询方式: 立即学习“PHP免费学习笔记(深入)”; SELECT * FROM student LIMIT …

    2025年12月10日
    000
  • PHP本地开发工具5

    > phpstudy Web:Web开发的综合工具 PhPstudy Web是一种非常流行且用户友好的软件,旨在帮助开发人员有效地设置和管理Web服务器和PHP环境。 PhpStudy Web以其简单性和多功能性而闻名,在网络开发社区中广泛使用,尤其是用于本地开发和测试。 什么是phpstud…

    2025年12月10日
    000
  • PHP 8如何进行数据库连接安全

    要安全地连接 PHP 8 数据库,需要保护凭据并防止 SQL 注入:使用预处理语句分离 SQL 查询和数据,以避免 SQL 注入。使用密码哈希存储密码,防止泄露。遵循最小权限原则,限制用户的数据库访问权限。使用 HTTPS 加密数据传输。验证用户输入,防止恶意数据进入。 PHP 8 数据库连接安全:…

    2025年12月10日
    000
  • 升级到PHP

    本文档记录了在Ubuntu系统上安装或升级PHP 8.2的步骤,希望能帮助到您和其他人。 首先,更新系统软件包列表: sudo dpkg -l | grep php | tee packages.txtsudo add-apt-repository ppa:ondrej/php # 按提示键入sud…

    2025年12月10日
    000
  • Laravel中的数据库迁移

    Laravel数据库迁移:高效管理数据库架构 Laravel凭借其优雅的语法和强大的功能,成为流行的PHP框架。其数据库管理系统尤为出色,包含查询构建器、Eloquent ORM和迁移功能。迁移功能允许开发者精确控制数据库模式,简化团队协作,并在不同环境中轻松维护数据库一致性。本文将深入探讨Lara…

    2025年12月10日
    000
  • 创建数据库

    项目概述:构建旅游代理信息系统 本项目旨在开发一个基于MySQL数据库的旅游代理信息系统,支持代理商的未来发展和营销策略。系统将管理代理商、客户、住宿信息(公寓、房屋、酒店)、航班信息以及预订等功能。项目团队由3名成员组成,预计完成时间为12小时。最终成果将包含两个虚拟机,并包含数据库、逻辑数据模型…

    2025年12月10日
    000
  • 为什么在数据库中进行整理?

    MySQL中的校对规则定义了数据的分类和比较方式,尤其影响字符编码和字符串操作,例如大小写敏感性(’é’ 与 ‘e’ 的比较)。校对规则与字符集关联,决定数据库可存储的字符。 为什么要使用校对规则? 数据排序: 校对规则决定数据排序的顺序。例如,在 u…

    2025年12月10日
    000
  • Laravel Blueprint 构建快速 Laravel 应用程序

    Laravel 开发者必备利器:Blueprint!本文将分享如何利用 Laravel Blueprint 显著提升开发效率,特别是数据库迁移、模型和工厂的创建。 数据库迁移:高效便捷 Blueprint 不仅仅是简单的建表工具,它能快速有效地搭建整个数据库环境。只需几行代码,即可定义表结构、字段和…

    2025年12月10日
    000
  • Mac 中 Mysql 的 XAMPP 替代方案

    长期以来,我依赖 xampp 作为本地开发环境。xampp 使用与 mysql 类似的 mariadb,但两者并非完全一致。mariadb 的频繁更新,虽然带来了积极的改进,但也引入了不少 bug,曾导致我的数据库无法正常工作。 因此,我一直寻找在 XAMPP 中使用 MySQL 的方法。在 Win…

    2025年12月10日 好文分享
    000
  • PHP7版本更新对现有项目有哪些影响

    升级到 PHP 7 带来重大性能提升和新功能,但也会产生挑战:已废弃功能被移除,需要替换。严格的类型声明要求类型匹配,避免类型错误。数组操作优化改变了某些行为,需要测试和修复。老旧扩展库与 PHP 7 不兼容,需要更新或寻找替代方案。分步升级、单元测试、代码审查和性能测试是最佳实践,可将挑战转化为机…

    2025年12月10日
    000
  • 如何在 laravel 示例中使用滚动上的 ajax 分页加载更多数据

    在这篇文章中,我将逐步向您展示如何在 laravel 11 应用程序中使用滚动分页加载更多数据。 在此示例中,我们将使用迁移创建一个 posts 表。然后,我们将为帖子创建一个数据模型,并创建一个工厂类来创建虚拟帖子数据。最后,我们将创建一个加载帖子的路由,并编写使用 jquery ajax 在按钮…

    好文分享 2025年12月10日
    000
  • 从产品经理到独立开发人员:六个月转型指南

    从零基础到独立开发者:我的四个月转型之路 想在短短几个月内从零经验转型为能获得付费工作的独立开发者?这确实充满挑战。我曾是一名新手,甚至可以说是“菜鸟”,但我的经历证明,一切皆有可能。本文分享我的故事,希望能激励那些面临同样困境的人。 独立开发需要全面的技能。我之前的产品经理背景让我对开发流程和技术…

    2025年12月10日 好文分享
    000
  • PHP7各个版本的兼容性如何

    理论上,PHP7版本向下兼容,但实际升级可能存在细微改动导致行为差异。理解兼容性需了解PHP版本命名规则、变更日志,以及Zend引擎演进。向下兼容性仅指新版本运行旧代码,但行为可能不一致。弃用函数、扩展库不兼容是常见兼容性问题。进行全面兼容性测试至关重要,以避免上线问题。升级PHP版本可带来性能提升…

    2025年12月10日
    000
  • PHP 8如何防止代码注入攻击

    PHP 8 防止代码注入攻击的核心方法是:不相信用户输入,将其视为潜在的恶意输入。使用参数化查询和预编译语句,将用户输入作为数据传递,避免被解释为代码执行。进行输入验证和过滤,检查数据类型、长度和格式,确保符合预期。通过代码审查、调试和性能优化,确保代码正确性、效率和可维护性。 PHP 8 如何有效…

    2025年12月10日
    000
  • PHP 8如何进行错误和异常处理

    PHP 8 引入了更强大的错误和异常处理机制,包括:增强异常处理,使用 try…catch 语句块捕获和处理异常。自定义异常类,创建更具表达力的错误处理系统。性能考量和最佳实践,在需要特殊处理的情况下使用异常,避免过度使用。 PHP 8 的优雅错误与异常处理:不止是try…catch…

    2025年12月9日
    000
  • PHP 8如何防范SQL注入

    PHP 8 提供了多个防御 SQL 注入的方法:参数化查询、PDO 强化功能和输入验证过滤。参数化查询将 SQL 查询和数据分开处理,防止恶意代码执行。 PDO 具有数据类型检查、错误处理和跨数据库兼容性。输入验证过滤在使用参数化查询前检查用户输入,去除恶意代码。结合这几种方法,构建多层防御体系,保…

    2025年12月9日
    000
  • 本地开发之战:ServBay 与 MAMP

    mamp 和 servbay:本地服务器解决方案深度对比 MAMP 和 ServBay 都是优秀的本地服务器搭建工具,但它们各有千秋。本文将深入比较两者的功能、优缺点,帮助您选择最合适的工具。 MAMP 与 ServBay 的核心差异 本地服务器对于简化开发流程至关重要,MAMP 作为一款成熟的工具…

    2025年12月9日 好文分享
    000
  • 在Linux上如何搭建PHP 8环境?

    搭建PHP 8环境需要先具备Linux系统基础,熟练命令行操作。安装PHP 8时因发行版而异,以Debian/Ubuntu为例:安装PHP 8本身:sudo apt install php8.1 php8.1-cli php8.1-fpm php8.1-mysql php8.1-curl php8.…

    2025年12月9日
    000
  • 如何选择合适的PHP 8开发工具?

    PHP 8開發工具選擇取決於項目規模和個人偏好。主流選項包括:程式碼編輯器/IDE:VS Code:免費、輕量級、可擴展,適合各種平台。PHPStorm:強大的功能集,但收費且資源需求高。Sublime Text:輕量級、自訂性高,可用於簡單的PHP開發。除錯工具:Xdebug:配合VS Code或…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信