Mysql之Binary Log

770 阅读4分钟

「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战

前言

读写分离(主从同步)的时候会涉及到Binary Log,这里我们通过官方文档再进一步了解下,至于主从同步后续会继续出文章敬请期待。

为啥需要Binary Log?

也可以换句话说:Binary Log的作用是什么?

  • 假如不小心把数据删掉了怎么进行恢复?
  • 如果想搞读写分离,主从之间是怎么进行同步数据的?

所以二进制日志有两个重要用途:

  • 对于复制,在主复制服务器上使用二进制日志作为要发送到从服务器的语句的记录。二进制日志格式和处理的许多细节都是针对此目的的。主服务器将其二进制日志中包含的事件发送到其从属服务器,从属服务器执行这些事件以进行与主服务器相同的数据更改。从属服务器将从主服务器接收到的事件存储在其relay log中,直到它们可以被执行。中继日志与二进制日志的格式相同。

  • 某些数据恢复操作需要使用二进制日志。备份文件恢复后,将重新执行备份后记录的二进制日志中的事件。这些事件使数据库从备份点开始更新。

了解完它的作用,我们再来介绍下它。

简介

二进制日志是一组日志文件,其中包含有关对 MySQL 服务器实例的数据修改信息。

二进制日志是在 MySQL 3.23.14 中引入的。它包含所有的更新数据语句。它还包含可能已经更新它的语句(例如,一个不匹配任何行的DELETE),除非使用基于行的日志记录。语句以描述修改的“事件”的形式存储。二进制日志还包含每个语句更新数据消耗时长信息。

二进制日志还包含一些其他元数据,包括:

  • 有关正确重现语句所需的服务器状态的信息(比如所涉及的sql model)
  • 错误码
  • 维护binary llog 本身所需的元数据(例如,旋转事件

二进制日志是对服务器在运行过程中产生的全局状态变化的跟踪。它包含的事件描述了这种状态的变化。更准确地说,二进制日志事件描述了可用于重现服务器上发生的相同全局状态更改的操作。

类型

  • 基于语句的日志记录:事件包含产生数据更改(插入、更新、删除)的 SQL 语句
  • 基于行的日志记录:事件描述对单个行的更改。

很明显基于语句的消耗空间相对而言会更小,因为一条语句可能会触发多条插入、更新、删除。但是基于语句的没有基于行来的有保证,基于行的粒度更小控制的更严格,比如主从表索引不一样会导致执行结果不一样:delete from test where a>=4 and t_modified<='2018-11-10' limit 1;如果主库只有a索引,从库只有t_modified索引,两个不同索引可能会导致limit 1出的结果不一样,这样会导致主从不一致。

混合日志默认使用基于语句的日志,但会根据需要自动切换到基于行的日志。

从 MySQL 5.1 开始提供基于行(和混合)的日志记录。

使用

  • 通过使用log-bin选项开启二进制日志记录服务。 在my.inf主配置文件中直接添加三行
#开启binlog日志
log_bin=ON
#binlog日志的基本文件名,后面会追加标识了来表示每一个文件
log_bin_basename=/var/lib/mysql/mysql-bin
#binlog文件的索引文件,管理所有binlog文件
log_bin_index=/var/lib/mysql/mysql-bin.index
  • 设置记录日志的模式 在my.inf中配置
#设置日志三种格式:STATEMENT、ROW、MIXED 。
binlog_format = mixed
  • 该mysqlbinlog实用程序可用于以可读形式打印二进制或中继日志内容。
  • sync_binlog可以设置成1,表示每次事务的binlog都持久化到磁盘。这样可以保证MySQL异常重启之后binlog不丢失。