帮助中心 >  行业资讯 >  云计算 >  MySQL日志文件——Binlog

MySQL日志文件——Binlog

2025-02-12 10:55:27 1213

对于 MySQL 来说,日志文件尤为重要。MySQL 常见的日志文件有二进制日志(Binlog)、通用查询日志(General Log)、慢查询日志(Slow Log)、错误日志(Error Log)、重做日志(Redo Log)、回滚日志(Undo Log)等。今天蓝队云会详细介绍这些日志文件。

Binlog

Binlog基础

Binlog包含描述数据库修改的语句,如create table、update等数据变更语句,不会记录类似select、show 等不修改数据的语句。如果想记录所有的 SQL 语句,则可以使用General Log,此部分内容将在下一节进行详细讲解。下面通过例子(在没有其他会话正在修改数据的MySQL环境中操作)展开介绍。查看当前Binlog的位点:

image.png

创建一张表:

image.png

查看Binlog信息(其中的Binlog文件和位点都是通过执行上面的show master status语句获取的):

image.png

从上面的例子中可以看出,执行的create table语句会记录到Binlog中。

开启和关闭Binlog

如果要开启Binlog,就需要在配置文件的[mysqld]中加上如下语句:

image.png

表示 Binlog 的存放路径为“/data/mysql/binlog/”,文件名为 mysql-bin 后接 Binlog的序列号。例如:

image.png

为了跟踪使用了哪些Binlog文件,mysqld还创建了一个Binlog索引文件,其中包含Binlog文件的名称。在默认情况下,该名称与Binlog文件具有相同的基本名称,扩展名为“.index”。如上面查询的内容为mysql-bin.index。在本例中,其内容为如下形式:

image.pngimage.png


如果没有指定文件名和路径,在[mysqld]中的配置如下:

log-bin

则默认存放在datadir下,Binlog的文件名为主机名后接Binlog的序列号,如datadir为“/data/mysql/data/”,主机名为node1,Binlog的全路径为如下形式:

image.png

一般建议指定一个基本名称,防止更改主机名时出现 Binlog 的文件名与之前不一致的现象。如果要关闭Binlog,就需要在配置文件中加上如下语句:

skip_log_bin

或者:

disable_log_bin

如果要关闭当前会话的Binlog,则可以执行如下语句

set sql_log_bin=0;

Binlog的作用

Binlog的作用主要有以下两个。

  • 复制:主库的变更先写入Binlog,然后传到从库进行回放。主从的具体原理会在第9章中详细介绍。

  • 灾备:当误操作后,可以先把全备导入某个新的实例中,然后通过全备时间点到误操作中间的Binlog解析出所有事务(需要注意的是,把误操作这条SQL语句排除掉),并在新实例中执行这些事务,达到恢复到误操作前一刻的状态。

Binlog记录的格式

Binlog可以设置为以下几种日志格式。

  • statement(基于 SQL 语句的格式):每条会修改数据的 SQL 语句都会记录在Binlog中,不需要记录每行的变化。

  • row(基于行):会非常清楚地记录每行数据被修改的细节。

  • mixed(混合模式):以上两种格式的混合使用,默认采用的 statement 格式保存Binlog,statement格式无法准确复制的操作可以使用row格式保存Binlog。

MySQL会根据执行的SQL语句选择保存日志的方式。

几种日志格式的优点和缺点如表所示。

image.png

Binlog记录的格式由参数binlog_format控制,如果要设置为row格式,则在[mysqld]中加上如下语句:

image.png

当然,也支持动态修改,修改参数binlog_format的全局值的方法如下:

image.png

修改参数binlog_format的会话级别的方法如下:

image.png

Binlog的解析

Binlog文件不能直接查看,需要通过mysqlbinlog工具解析。例如,在row格式下,解析Binlog的方法如下。首先执行create语句:

image.png

解析Binlog:

image.png

其中,--start-position表示开始位点,-vv表示显示详细信息。查看解析结果:

image.png

由上述内容可以看出,执行 create table test.b(id int)语句后,该语句就会记录在Binlog中。

MySQL 8.0 Binlog加密

从MySQL 8.0.14开始,可以对Binlog文件和中继日志文件进行加密,从而保护敏感数据。可以通过在配置文件的[mysqld]中加上如下语句开启Binlog加密:

image.png

查看Binlog列表:

image.png

由此可以发现,最新的Binlog Encrypted已经变为Yes。下面尝试通过mysqlbinlog解析最新的Binlog,具体如下:

image.png

由此可以发现,已经解析不出结果。应该使用MySQL的用户密码进行解析才可以,具体如下:

image.png

--read-from-remote-server参数表示从MySQL服务中读取Binlog,而不是读取本地日志文件。读取远程MySQL的Binlog要求远程MySQL实例正在运行。

Binlog的清除

对于一个繁忙的MySQL实例,其Binlog增长也是比较快的,因此,需要设置其保留天数,如果磁盘即将满,那么可能还要单独删除历史 Binlog。本节主要介绍 Binlog的清除。可以使用 purge binary logs 语句来删除指定 Binlog 的文件名或指定时间之前的Binlog文件,具体示例如下。

示例一,删除指定Binlog之前的文件:

image.png

示例二,删除指定时间之前的Binlog文件。查看Binlog文件:

image.png

删除指定时间之前的Binlog文件:

image.png

当然,一般还是建议设置expire_logs_days参数或binlog_expire_logs_seconds参数。expire_logs_days参数定义了日志保留天数。binlog_expire_logs_seconds参数定义了日志保留秒数,MySQL 8.0建议设置这个参数,在未来的版本中可能会废除expire_logs_days参数。

当Binlog存在的时间超过binlog_expire_logs_seconds参数设置的时间时,则自动删除。有

时Binlog占用的磁盘空间会过大,如果要降低其保留时间,则可以进行如下操作:

image.png

如上所示,缩短保留时间后,需要执行flush logs语句才能删除之前的Binlog

Binlog的落盘

Binlog同步到磁盘的频率由sync_binlog参数控制。sync_binlog参数大致有以下几种配置。

  • sync_binlog=0,禁用MySQL服务将Binlog同步到磁盘的功能,是由操作系统控制 Binlog 的刷盘。在这种情况下,性能比较好,但是当操作系统崩溃时可能会丢失部分事务。- sync_binlog=1,每个事务都会同步到磁盘。这是最安全的设置,但是磁盘写入次数的增加可能会导致性能下降。

  • sync_binlog=N,表示每N个事务Binlog同步一次到磁盘。当操作系统崩溃时,服务器提交的事务可能没有被刷新到 Binlog 中,此时可能会丢失部分事务,虽然设置比较大的值可以提高性能,但是数据丢失的风险也会增加。

Binlog相关的参数

  • max_binlog_size:单个Binlog文件大小的最大值。

  • log-slave-update:从库从主库接收的更新是否记录到从库自身的Binlog中,如果从库后面又接了从库,或者在从库上做备份,或者MySQL 5.6主从复制使用了GTID模式(具体原因见9.2.1节),那么建议开启这个参数。

  • binlog-do-db:后面接库名,表示当前数据库只记录该参数设置的库的 Binlog,其他库都不记录。

  • binlog-ignore-db:后面接库名,表示当前数据库不记录该参数设置的库的Binlog,其他库都记录。


综上所述,二进制日志(Binlog)在 MySQL 中扮演着极为重要的角色,无论是主从复制、数据灾备,还是日常的数据管理,都离不开它。了解 Binlog 的各项特性、配置方法及相关操作,有助于数据库管理员更好地管理 MySQL 数据库,保障数据的安全与稳定。


想了解更多相关技术小分享可以上蓝队云官网查阅,更多技术问题,也可以直接咨询。同时,蓝队云整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。


提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: