如何使用mysqlbinlog工具?

MySQL & MariaDB

1 基础知识

1.1 MySQL BingLog的概念

  • MySQL BingLog是一种记录MySQL运行“事件”的二进制日志文件
  • MySQL BingLog文件需要使用mysqlbinlog专用工具读取

1.2 mysqlbinlog工具的作用

能显示复制关系的从属服务器的写入中继日志文件内容

2 最佳实践

2.1 命令选项的介绍

2.1.1 命令使用格式

shell> mysqlbinlog [options] log_file ...

2.1.2 命令的使用范例

shell> mysqlbinlog binglog.0000003

以上命令输出的内容有,

  • 记录基本语句的日志记录
  • 记录事件信息的SQL语句
  • 记录执行SQL语句的ID
  • 记录执行SQL语句的时间戳
  • 记录执行SQL语句的耗时

另外,对于日志记录的格式,请参阅官方17.2.1章节

2.1.3 日志的范例

# at 141
#100309  9:28:36 server id 123  end_log_pos 245
  Query thread_id=3350  exec_time=11  error_code=0
  • 第一行”at”关键字后面的ID代表二进制日志的事件偏移量或起始位置
  • 第二行,
  • “100309 9:28:36”为日期和时间
    “server id”是事件起源服务器的标识
    “end_log_pos”指示下一事件的起始位置(即当前时间结束位置加一)
    “thread_id”指示事件由那个线程负责执行
    “exec_time”指示事件执行所耗费的时间(主节点执行的开始时间至从节点执行的结束时间)
    “error_code”指示时间执行的结果(零表示没有错误)

2.1.4 读取远程服务器的二进制日志

mysqlbinlog --read-from-remote-server

以上选项支持从远程服务器读取二进制日志(如果主服务加密从从服务器读取),另外以下选项作为辅助可选项,

  • “–host”指示远程二进制日志服务器的IP或主机名称
  • “–port”指示远程二进制日志服务器的端口
  • “–protocol”指示远程二进制日志服务器的协议
  • “–socket”指示远程二进制日志服务器的socket路径
  • “–user”指示远程二进制日志服务器的用户名
  • “–password”指示远程二进制日志服务为的用户密码

另外,有关其他选项,请参阅官方链接的“mysqlbinlog Options”部分,详细链接如下,
https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog.html

2.2 命令的使用范例

2.2.1 通过管道传递给MySQL客户端

shell> mysqlbinlog binlog.000001 | mysql -u root -p

当需要引入多个binlog文件时,可使用如下命令,

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

另外,为避免BLOB值的影响,可加上如下选项再使用,

shell> mysqlbinlog --binary-mode binlog.[0-9]* | mysql -u root -p

2.2.2 编辑后再还原数据

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

注:以上通过命令将binlog导出到临时文件,编辑(删除某些原因不想执行的语句)后再导入MySQL客户端

2.2.3 安全的单线程执行

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

以上使用单个线程依次导入两个binglog并执行,另外以下方法亦可作为替代,

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

另外以下方法是我们不建议的,请谨慎使用(有可能第一个binlog后执行会覆盖第二个binlog的执行结果),

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

2.2.4 通过管道的流输入

shell> gzip -cd binlog-files_1.gz | ./mysqlbinlog - | ./mysql -uroot  -p

以上范例通过提取压缩包的内容后通过管道将二进制日志文件以流的形式直接作为mysqlbinlog的标准输入流,然后同样以流的形式传递给mysql客户端,如果需要指定多个压缩包,可使用如下命令,

shell> gzip -cd binlog-files_1.gz binlog-files_2.gz | ./mysqlbinlog - | ./mysql -uroot  -p

另外需要注意的是,

  • 以上使用方法只有MySQL 8.0.12以上版本支持
  • mysqlbinlog无法识别“–stop-position”选项

参阅文档
===================

mysqlbinlog的使用
——————-
https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog.html

基于时间点的增量恢复
——————–
https://dev.mysql.com/doc/refman/8.0/en/point-in-time-recovery.html

没有评论

发表回复

Apache
如何部署Oracle Linux 9.x LAMP环境?

1 理论部分 – LAMP是Linux+Apache+MySQL+PHP的简写 &#82 …

MySQL & MariaDB
如何测试MySQL配置参数语法?

1 前言 一个问题,一篇文章,一出故事。 笔者需要修改MySQL服务端的参数,想到nginx有“ng …

MySQL & MariaDB
如何单独备份MySQL的表?

1 前言 一个问题,一篇文章,一出故事。 笔者遇到用户需要单独备份MySQL某库的某表数据的情况,想 …