MySQL二进制日志(binary log)总结

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

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

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

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

顺便总结一下二进制日志(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

 

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

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

 

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

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

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

 

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

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

 

5,二进制日志的清理

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

 

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

 1)正常情况下,记录满之后,自动滚动,后缀名+1
 2)重启mysql服务之后,自动滚动,不管时候记录满
 3)手动滚动,执行flush logs命令,如下执行flush logs之后,重新生成了一个二进制日志文件

 

 4)手动删除二进制日志

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

 

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

 

 删除指定日志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中配置了),但是查询的时候好像没用?

 

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

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

 

 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)

 

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

 

9,二进制日志其他参数

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

总结:

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

参考:http://www.cnblogs.com/kerrycode/p/6610874.html

   《涂抹MySQL》

   以及各种翻书,网上资料

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

时间: 2024-12-16 13:09:51

MySQL二进制日志(binary log)总结的相关文章

MySQL 二进制日志(Binary Log)

同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分.MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等.这些日志可以帮助我们定位mysqld内部发生的事件,数据库性能故障,记录数据的变更历史,用户恢复数据库等等.二进制日志,也叫binary log,是MySQL Server中最为重要的日志之一,本文主要描述二进制日志. 1.MySQL日志文件系统的组成   a.错误日志:记录启动.运行或停止mysqld时出现的问题.   b.通用日志:

mysql 二进制日志binary log操作简单命令

show master status \G; #查看当前正在记录的二进制日志 show binary logs; #查看binary log 所有文件列表 show binlog events; #查看第一个binary log日志文件 shaow binlog events in'binary log 文件名' #查看制定binary log文件内容 用mysqlbinlog工具查看 查看制定binary log文件内的制定时间段的代码: mysqlbinlog --start-datetim

二进制日志BINARY LOG清理

mysql> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 126 | | mysql-bin.000002 | 150 | | mysql-bin.000003 | 150 | | mysql-bin.000004 | 150 | | mysql-bin.000005 | 107 |

MySQl Study学习之--MySQl二进制日志管理

MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log):   a.它包含的内容及作用如下:    包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)    包含关于每个更新数据库(DML)的语句的执行时间信息    不包含没有修改任何数据的语句,如果需要启用该选项,需要开启通用日志功能    主要目的是尽可能的将数据库恢复到数据库故障点,因为二进制日志包含备份后进行的所有更新    用于在主复制服务器上记录所有将发送

Mysql学习之--Mysql二进制日志管理

Mysql学习之--Mysql二进制日志管理 简介:     MySQL的二进制日志可以说或是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是失误安全型的.      MySQL的二进制日志的作用是显而易见的,可以方便的备份这些日志以便做数据恢复,也可以作为主从复制的同步文件,然而二进制日志的大小可能会根据不同的需求而存在麻烦,所以让日志回滚是必须的,当然MySQL已经为我们提供了二进制回滚的功

MySQL二进制日志总结

二进制日志简单介绍 MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句.二进制日志(binary log)中记录了对MySQL数据库执行更改的所有操作,并且记录了语句发生时间.执行时长.操作数据等其它额外信息,但是它不记录SELECT.SHOW等那些不修改数据的SQL语句.二进制日志(binary log)主要用于数据库恢复和主从复制,以及审计(audit)操作. 官方文档关于二进制日志(binary log)的介绍如下: T

关系型数据库之Mysql二进制日志管理(四)

MySQL二进制日志(Binary Log)1.它包含的内容及作用如下:包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)包含关于每个更新数据库(DML)的语句的执行时间信息不包含没有修改任何数据的语句,如果需要启用该选项,需要开启通用日志功能主要目的是尽可能的将数据库恢复到数据库故障点,因为二进制日志包含备份后进行的所有更新用于在主复制服务器上记录所有将发送给从服务器的语句启用该选项数据库性能降低1%,但保障数据库完整性,对于重要数据库值得以性能换完整.有些类似

mysql二进制日志的使用

mysql二进制日志也就是一些mysql命令操作的记录 删除二进制日志信息: 二进制日志会记录大量的信息(其中包含一些无用的信息).如果很长时间不清理二进制日志,将会浪费很多的磁盘空间.但是,删除之后可能导致数据库崩溃时无法进行恢复,所以若要删除二进制日志首先将其和数据库备份一份,其中也只能删除备份前的二进制日志,新产生的日志信息不可删(可以做即时点还原).也不可在关闭mysql服务器之后直接删除因为这样可能会给数据库带来错误的.若非要删除二进制日志需要做如下操作:导出备份数据库和二进制日志文件

mysql二进制日志

mysql二进制日志称为binlog,记录了数据库修改数据的操作,可以用作数据恢复. binlog有三种记录方式 1.statement 记录修改数据的原始sql,IO量较小.sql中存在使用user()等依赖运行环境的函数时,可能导致数据恢复不正确. 2.row 记录每行数据的修改动作,IO较大,准确性最高,生产环境推荐使用这种模式. 3.mixed 上述两种模式混合使用. binlog参数设置 1.log_bin 只读参数,只能在my.ini(my.cnf)中设置,log_bin的值为二进制