Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL日志bin log

MySQL非常重要的日志bin log详解

作者:JAVA旭阳

bin log想必大家多多少少都有听过,它是MySQL中一个非常重要的日志,因为它涉及到数据库层面的主从复制、高可用等设计,所以本文就给大家详细的讲解MySQL非常重要的日志—bin log,需要的朋友可以参考下

bin log是什么?

bin log全称binary log,二进制日志文件,它记录了数据库所有执行的 DDLDML 等数据库更新的语句,但是不包含select或者show等没有修改任何数据的语句。它是MySQL级别的日志,也就是说所有的存储引擎都会产生bin log,而redo log或者undo log事务日志只有innoDB存储引擎才有。

bin log有什么用呢?

所以bin log对于数据备份主从主主等都都起到了关键作用。

bin log和redo log区别?

看了上面的bin log介绍,是不是感觉和事务日志redo log特别像呢?也是在事务执行的时候记录日志,但是他们还是有区别的。

你知道redo log吗, 如果不了解的话请参考这篇文章:详解MySQL事务日志redo log_Mysql_脚本之家 (jb51.net)

我们现在从多个角度对比下他们俩究竟有什么不一样?

使用场景角度来说:

数据内容角度来说:

生成范围角度来说:

生成时机角度来说:

bin log怎么写的?

bin log是什么时候写的,写入的机制又是怎么样的呢?

bin log写入的整体流程如下图所示:

3种刷盘策略:

bin logredo log类似,都有3种刷盘策略, bin log的write和fsync时机是由参数 sync_binlog 控制,默认是 0 。

为0的时候,表示每次提交事务都只 write,由系统自行判断什么时候执行fsync。虽然性能得到提升,但是机器宕机,page cache里面的 binglog 会丢失。

我们已经知道,事务执行时会同时记录redo logbin log两种日志,那会有日志出错不一致问题吗?

假如事务执行sqlupdate T set c = 1 where id = 2,在写完redo log日志后,bin log日志写期间发生了异常,会出现什么情况呢?

由于bin log没写完就异常,这时候bin log里面没有对应的修改记录。因此,之后用bin log日志恢复数据时,就会少这一次更新,恢复出来的这一行c值为0,而原库因为redo log日志恢复,这一行c的值是1,最终数据不一致。

那有什么解决方案吗?二阶段提交方案。

为了解决两份日志之间的一致性问题,InnoDB存储引擎使用两阶段提交方案。将redo log的写入拆成了两个步骤preparecommit

bin log写到哪了?

前面讲解了bin log写入的过程,那么它写到了哪里去了呢?

可以通过命令show variables like '%log_bin%';查看bin log最终输出的位置。

通过 SHOW BINARY LOGS;查看当前的二进制日志文件列表及大小,如下图:

修改MySQL的my.cfgmy.ini配置

#启用二进制日志
log-bin=cxw-bin
binlog_expire_logs_seconds=600
max_binlog_size=100M

bin log内容长啥样?

我们已经知道了bin log的位置了,那它里面的内容长什么样呢?

我们可以用show binlog events命令工具查看bin log日志中的内容。

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

bin log 格式

实际上bin log输出的格式类型有3种,默认是ROW类型,就是上面例子中的格式。

总结

本文讲解了MySQL中的一个非常重要的日志bin log,它主要用来做数据恢复和同步的,所以作为程序员的我们,还是很有必要对它有一个深入的认识。

以上就是MySQL非常重要的日志bin log详解的详细内容,更多关于MySQL日志bin log的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文