MySQL - binlog 二进制日志

文章目录

  • 前言
    • 作用
  • 格式
    • STATEMENT
    • ROW
    • MIXED
  • 选项与变量
    • inf
    • 客户端
  • 资源


前言

MySQL 版本 8.0.28

作用

binlog(二进制日志)包含描述数据库更改(如表创建操作或者表数据更改)的 “events(事件)”。除非使用基于行的日志记录,否则它还包含可能发生更改的语句事件(例如,不匹配任何行的 DELETE)。binlog 还包含关于每个语句更新数据花费了多长时间的信息。binlog 有以下重要用途:

  1. 用于主从复制。主库和从库之间利用 binlog 进行数据复制,主库执行什么语句、进行何种更新,从库跟着执行;
  2. 用于数据恢复。数据库还原备份后,将重新执行备份后记录的 binlog 中的事件。这些事件使数据库从备份点更新到最新状态。
  3. 用于操作审计。因为 binlog 里包含对数据库的修改操作,可以编写代码对日志分析是否有敏感操作报警。

binlog 不用于不修改数据的 SELECTSHOW 等语句。若要记录所有语句(例如,确定问题查询),使用 general query log。

启用 binlog 记录的情况下运行服务器会使性能稍微慢一些。但是,binlog 可以在设置主从复制和还原操作方面的好处通常大于这种小的性能下降。


格式

日志格式也可以由所使用的存储引擎设置或限制。这有助于消除在使用不同存储引擎的源和副本之间复制某些语句时出现的问题。

对于基于语句的复制,可能存在复制不确定性语句的问题。在确定给定语句对于基于语句的复制是否安全时,MySQL 确定它是否能够保证使用基于语句的日志记录复制该语句。如果 MySQL 不能做出这样的保证,它会将语句标记为潜在的不可靠并发出警告,语句可能不能安全地登录到语句格式。

您可以通过使用 MySQL 的基于 ROW 的复制来避免这些问题。例如 INSERT NOW() 语句中,如果使用 STATEMENT 格式则会导致主从数据不一致,因为同步数据会存在时间差。

服务器使用 3 种日志格式记录 binlog 中的信息

STATEMENT

MySQL 中的复制功能最初是基于 SQL 语句从源到副本的传播。这成为基于 statement 的日志记录。通过使用 --binlog-format=STATEMENT 启动服务器使用此格式;
优点:记录数据库执行的原生 SQL,不需记录每一行的变化,binlog 日志文件最小,性能最高,主从复制带宽小。
缺点:容易出现主从数据不一致问题,可以使用 ROW 模式解决。

ROW

基于 ROW (默认)的日志记录,源将事件写入 binlog,以指示各个表行受到的影响。通过使用 --binlog-format=ROW 启动服务器使用此格式。
优点:记录数据更改前和更改后的变化情况,在主从数据复制模式下可靠性最高。
缺点:占用空间大,性能比 STATEMENT 较低。

MIXED

混合日志记录,也就是 STATEMENTROW 的组合。对于混合日志记录,默认情况下使用基于 STATEMENT 的日志记录,但在某些情况下,日志记录模式会自动切换基于 ROW 的日志记录。通过使用 --binlog-format=MIXED 启动服务器使用此格式。

切换到 STATEMENT 的情况:

  1. 函数包含 UUID()
  2. 更新包含 AUTO_INCREMENT 的列
  3. 函数包含 FOUND_ROWSROW_COUNT
  4. 使用 USER()CURRENT_USER()
  5. 涉及的表是 MySQL 中的日志表
  6. 使用 LOAD_FILE()

选项与变量

inf

[mysqld]
# 默认开启,关闭 OFF
log_bin=ON
# binlog 日志的基本文件名
log_bin_basename=/var/lib/mysql/mysql-bin
# 指定的是 binlog 文件的索引文件,这个文件管理了所有的 binlog 文件的目录
log_bin_index=/var/lib/mysql/mysql-bin.index

# 日志过期,默认值为 0,表示不启动过期自动删除功能
# 如果启动了自动清除功能,超过该天数的日志文件将被自动删除
# 删除工作通常在 MySQL 启动时或 FLUSH 日志时
expire_logs_days=0

客户端

# 查看是否开启了 binlog
mysql> SHOW VARIABLES LIKE 'log_bin';

log_bin

# 查看 binlog 格式
mysql> SHOW VARIABLES LIKE 'binlog_format';

# 设置 binlog 格式
mysql> SET SESSION binlog_format = 'STATEMENT';
mysql> SET SESSION binlog_format = 'ROW';
mysql> SET SESSION binlog_format = 'MIXED';

binlog_format

# 查看所有二进制日志文件列表
mysql> SHOW BINARY LOGS;

MySQL - binlog 二进制日志_第1张图片

# 查看当前正在写入的 binlog 文件
mysql> SHOW MASTER STATUS;

master status


资源

主从复制
数据恢复
general query log

你可能感兴趣的:(MySQL,mysql,数据库,服务器,binlog,二进制日志)