日志是关于记录数据库中发生的事情。就像有些人可能会保留个人日志来记下他们日常生活中发生的事情一样,数据库日志会跟踪登录和事务等事情。更重要的是,有效的日志应包括有关访问控制和输入验证失败的条目。难怪默认情况下 MySQL 唯一启用的日志是错误日志(至少在 Windows 上)。
上周的文章简介了 MySQL 中不同的日志类型,重点介绍了其中最重要的-错误、常规、二进制和慢速日志,并涵盖了前两个。今天我们会更详细地介绍二进制日志,而慢速日志将留待第 3 部分。
二进制日志记录的语句
二进制日志用于存储描述数据库更改的事件,例如表创建操作或通过 INSERT 和 UPDATE 等语句更改表数据。除了使用基于行的日志记录外,它还保存一些可能已进行更改的语句(例如删除不存在行的 DELETE 语句)的事件(有关此内容的更多信息,请参见下文)。因此,二进制日志不包括没有修改数据的语句,例如 SELECT 或 SHOW 等,这些可以在常规查询日志中找到。
二进制日志有两个重要用途:
- 对于复制,主复制服务器上的二进制日志提供要发送到从服务器的数据更改的记录。实际上,主服务器将其二进制日志中包含的事件发送到其从服务器,以便它们运行相同的命令,进行与主服务器上相同的数据更改。
- 某些数据恢复操作会使用二进制日志。还原备份后,将重新运行二进制日志中与备份相关的事件,以便将数据库同步到执行备份时的位置。
尽管有这些非常重要的用途,但默认情况下二进制日志是禁用的,因为它会稍微降低性能。但是,二进制日志在设置复制时和从备份还原时提供的好处通常会超过这种轻微的性能影响。
二进制日志格式
MySQL 为二进制日志提供了三种日志记录格式,每种格式都有自己的优缺点。与其他日志不同,你无法使用简单的 ON/OFF 开关启用它。相反,你必须使用“--binlog-format = type”启动 MySQL 服务器来选择二进制日志的格式。每种类型的确切语句如下所述:
- 基于语句
基于语句的日志记录了所有对表的数据或结构进行更改的 SQL 语句。使用 --binlog-format=STATEMENT 启用。
某些非确定性语句可能对复制来说是不安全的。如果 MySQL 确定是这种情况,它将发出警告“Statement may not be safe to log in statement format”。
- 基于行
在基于行的日志中,主服务器将事件写入二进制日志,以指示各个表行的影响方式。因此,表必须始终包含主键以确保可以有效地识别行。你可以使用 --binlog-format=ROW 启動服务器来告诉它使用基于行的日志。
- 混合
第三种选项是混合日志。使用此日志格式时,默认情况下会使用基于语句的日志,但在某些情况下,日志模式会自动切换到基于行。若要使用混合日志,请使用选项 --binlog-format=MIXED 启动 MySQL。
图 1-在 Navicat 的服务器监控工具中的 binlog_format 服务器变量