Documentation Home
MySQL 8.0 参考手册  / 第 4 章 MySQL 程序  / 4.6 管理和实用程序  /  4.6.8 mysqlbinlog——处理二进制日志文件的实用程序

4.6.8 mysqlbinlog——处理二进制日志文件的实用程序

服务器的二进制日志由包含描述数据库内容修改的事件 的文件组成 。服务器以二进制格式写入这些文件。要以文本格式显示它们的内容,请使用 mysqlbinlog实用程序。您还可以使用 mysqlbinlog来显示复制设置中副本服务器写入的中继日志文件的内容,因为中继日志与二进制日志具有相同的格式。二进制日志和中继日志将在 第 5.4.4 节“二进制日志”第 17.2.2 节“中继日志和复制元数据存储库”中进一步讨论。

像这样调用mysqlbinlog

mysqlbinlog [options] log_file ...

例如,要显示名为 的二进制日志文件的内容binlog.000003,请使用以下命令:

mysqlbinlog binlog.0000003

输出包括 中包含的事件 binlog.000003。对于基于语句的日志记录,事件信息包括 SQL 语句、执行它的服务器的 ID、语句执行时的时间戳、花费的时间等等。对于基于行的日志记录,事件指示行更改而不是 SQL 语句。有关日志记录模式的信息 ,请参阅第 17.1.2 节,“复制格式” 。

事件前面有提供附加信息的标题注释。例如:

# at 141
#100309  9:28:36 server id 123  end_log_pos 245
  Query thread_id=3350  exec_time=11  error_code=0

在第一行中,后面的数字at 表示二进制日志文件中事件的文件偏移量或起始位置。

第二行以日期和时间开头,指示语句何时在事件发起的服务器上开始。对于复制,此时间戳会传播到副本服务器。 server idserver_id事件发生的服务器的值。end_log_pos 表示下一个事件的开始位置(即当前事件的结束位置+1)。thread_id 指示哪个线程执行了事件。 exec_time是在源服务器上执行事件所花费的时间。在副本上,它是副本上的结束执行时间减去源上的开始执行时间的差值。差异用作复制落后于源多少的指标。 error_code指示执行事件的结果。零意味着没有错误发生。

笔记

使用事件组时,可以将事件的文件偏移量组合在一起,将事件的注释组合在一起。不要将这些分组事件误认为是空白文件偏移量。

可以重新执行 mysqlbinlog 的输出(例如,将其用作mysql的输入)以重做日志中的语句。这对于服务器意外退出后的恢复操作很有用。对于其他使用示例,请参阅本节后面的讨论和第 7.5 节“使用二进制日志的时间点(增量)恢复”

通常,您使用mysqlbinlog直接读取二进制日志文件并将其应用到本地 MySQL 服务器。也可以使用该 --read-from-remote-server 选项从远程服务器读取二进制日志。要读取远程二进制日志,可以提供连接参数选项以指示如何连接到服务器。这些选项是--host--password--port--protocol--socket--user

当针对大型二进制日志运行mysqlbinlog时,请注意文件系统有足够的空间用于生成的文件。要配置 mysqlbinlog用于临时文件的目录,请使用 TMPDIR环境变量。

在 MySQL 5.6.10 及更高版本中,mysqlbinlogpseudo_slave_mode 在执行任何 SQL 语句之前 将值设置为 true。

mysqlbinlog支持以下选项,可以在命令行或 选项文件的组中指定[mysqlbinlog][client]有关 MySQL 程序使用的选项文件的信息,请参阅第 4.2.2.2 节,“使用选项文件”

表 4.20 mysqlbinlog 选项

选项名称 描述 介绍
--base64-输出 使用 base-64 编码打印二进制日志条目
--绑定地址 使用指定的网络接口连接到 MySQL 服务器
--binlog-row-event-max-size 二进制日志最大事件大小
--字符集目录 安装字符集的目录
--connection-server-id 用于测试和调试。有关适用的默认值和其他详细信息,请参阅文本 5.6.20
- 数据库 仅列出该数据库的条目
--调试 写调试日志
--调试检查 程序退出时打印调试信息
- 调试信息 程序退出时打印调试信息、内存和 CPU 统计信息
--default-auth 要使用的身份验证插件
--defaults-extra-file 除了通常的选项文件外,还读取命名的选项文件
--defaults-文件 只读命名选项文件
--defaults-group-suffix 选项组后缀值
--disable-log-bin 禁用二进制日志记录
--exclude-gtids 不要显示提供的 GTID 集中的任何组
--force-if-open 读取二进制日志文件,即使打开或未正确关闭
--强制阅读 如果 mysqlbinlog 读取了一个它无法识别的二进制日志事件,它会打印一条警告
- 帮助 显示帮助信息并退出
--hexdump 在评论中显示日志的十六进制转储
- 主持人 MySQL 服务器所在的主机
--include-gtids 仅显示提供的 GTID 集中的组
--local-load 在指定目录下为LOAD DATA准备本地临时文件
--登录路径 从 .mylogin.cnf 读取登录路径选项
--no-defaults 不读取选项文件
- 抵消 跳过日志中的前 N ​​个条目
open_files_limit 指定要保留的打开文件描述符的数量
- 密码 连接到服务器时使用的密码
--插件目录 安装插件的目录
- 港口 用于连接的 TCP/IP 端口号
--print-defaults 打印默认选项
- 协议 使用的传输协议
- 生的 以原始(二进制)格式将事件写入输出文件
--从远程主机读取 从 MySQL 复制源服务器读取二进制日志而不是读取本地日志文件
--从远程服务器读取 从 MySQL 服务器读取二进制日志而不是本地日志文件
--结果文件 直接输出到命名文件
--secure-auth 不要以旧的(pre-4.1)格式向服务器发送密码 5.6.17
--server-id 仅提取由具有给定服务器 ID 的服务器创建的那些事件
--server-id-bits 告诉 mysqlbinlog 当 log 由 server-id-bits 设置为小于最大值的 mysqld 写入时如何解释二进制日志中的服务器 ID;仅由 mysqlbinlog 的 MySQL Cluster 版本支持
--set-字符集 将 SET NAMES charset_name 语句添加到输出
--shared-memory-base-name 共享内存连接的共享内存名称(仅限 Windows)
- 简写 只显示日志中包含的语句
--skip-gtids 不要在输出转储文件中包含二进制日志文件中的 GTID
- 插座 要使用的 Unix 套接字文件或 Windows 命名管道
--ssl-crl 包含证书吊销列表的文件
--ssl-crlpath 包含证书吊销列表文件的目录
--ssl模式 连接到服务器的所需安全状态 5.6.30
--开始日期时间 从时间戳等于或晚于 datetime 参数的第一个事件读取二进制日志
--起始位置 从位置等于或大于参数的第一个事件解码二进制日志
--停止日期时间 在时间戳等于或大于 datetime 参数的第一个事件停止读取二进制日志
--永不停止 读取最后一个二进制日志文件后保持与服务器的连接
--stop-never-slave-server-id 连接到服务器时要报告的从属服务器 ID
--停止位置 在位置等于或大于参数的第一个事件处停止解码二进制日志
--to-last-日志 不要在 MySQL 服务器请求的二进制日志末尾停止,而是继续打印到最后一个二进制日志的末尾
- 用户 连接到服务器时使用的 MySQL 用户名
--冗长 将行事件重构为 SQL 语句
--verify-binlog-校验和 验证二进制日志中的校验和
- 版本 显示版本信息并退出

You can pipe the output of mysqlbinlog into the mysql client to execute the events contained in the binary log. This technique is used to recover from an unexpected exit when you have an old backup (see Section 7.5, “Point-in-Time (Incremental) Recovery Using the Binary Log”). For example:

mysqlbinlog binlog.000001 | mysql -u root -p

Or:

mysqlbinlog binlog.[0-9]* | mysql -u root -p

If the statements produced by mysqlbinlog may contain BLOB values, these may cause problems when mysql processes them. In this case, invoke mysql with the --binary-mode option.

You can also redirect the output of mysqlbinlog to a text file instead, if you need to modify the statement log first (for example, to remove statements that you do not want to execute for some reason). After editing the file, execute the statements that it contains by using it as input to the mysql program:

mysqlbinlog binlog.000001 > tmpfile
... edit tmpfile ...
mysql -u root -p < tmpfile

When mysqlbinlog is invoked with the --start-position option, it displays only those events with an offset in the binary log greater than or equal to a given position (the given position must match the start of one event). It also has options to stop and start when it sees an event with a given date and time. This enables you to perform point-in-time recovery using the --stop-datetime option (to be able to say, for example, roll forward my databases to how they were today at 10:30 a.m.).

If you have more than one binary log to execute on the MySQL server, the safe method is to process them all using a single connection to the server. Here is an example that demonstrates what may be unsafe:

mysqlbinlog binlog.000001 | mysql -u root -p # DANGER!!
mysqlbinlog binlog.000002 | mysql -u root -p # DANGER!!

Processing binary logs this way using multiple connections to the server causes problems if the first log file contains a CREATE TEMPORARY TABLE statement and the second log contains a statement that uses the temporary table. When the first mysql process terminates, the server drops the temporary table. When the second mysql process attempts to use the table, the server reports unknown table.

To avoid problems like this, use a single mysql process to execute the contents of all binary logs that you want to process. Here is one way to do so:

mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p

Another approach is to write all the logs to a single file and then process the file:

mysqlbinlog binlog.000001 >  /tmp/statements.sql
mysqlbinlog binlog.000002 >> /tmp/statements.sql
mysql -u root -p -e "source /tmp/statements.sql"

mysqlbinlog can produce output that reproduces a LOAD DATA operation without the original data file. mysqlbinlog copies the data to a temporary file and writes a LOAD DATA LOCAL statement that refers to the file. The default location of the directory where these files are written is system-specific. To specify a directory explicitly, use the --local-load option.

Because mysqlbinlog converts LOAD DATA statements to LOAD DATA LOCAL statements (that is, it adds LOCAL), both the client and the server that you use to process the statements must be configured with the LOCAL capability enabled. See Section 6.1.6, “Security Considerations for LOAD DATA LOCAL”.

Warning

LOAD DATA LOCAL为语句 创建的临时文件 不会 自动删除,因为在您实际执行这些语句之前需要它们。不再需要语句日志后,您应该自行删除临时文件。这些文件可以在临时文件目录中找到,名称类似于 original_file_name-#-#.