MySQL 或 MariaDB 中,对数据库做的任何操作都会被记录到 Binary Log 日志文件中。
二进制日志文件在主从复制中非常重要。恢复 MySQL 时也会使用到二进制日志文件。
但是 Binary Log 而二进制文件,所以无法直接使用文本查看工具打开看,所以 MySQL 提供了 mysqlbinlog
命令。
mysqlbinlog
命令是一个以友好可读方式查看 MySQL Binary log 的命令行工具。也可以使用 mysqlbinlog
命令来读取内容并用管道传给其他 MySQL 工具集。
MySQL 的 binary log 文件包含了对数据库文件操作的事件。MySQL 服务器会以二进制文件写入。
举例
获取二进制文件列表
在 MySQL 中执行:
mysql> SHOW BINARY LOGS;
如果没有开启二进制文件,则会报错 ERROR 1381 (HY000): You are not using binary logging
二进制日志文件默认会存放在 /var/lib/mysql 目录下
使用 mysqlbinlog 命令
使用:
mysqlbinlog log_file
mysqlbinlog
常用的参数有:
-d, --database=db_name
指定数据库-o, --offset=n
忽略日志前 n 行-v, -vv
,-v
从 binlog 中重建 SQL 语句,-vv
增加了注释--start-datetime=datatime, --stop-datetime=datetime
指定日期间隔内的所有日志--start-position=position, --stop-position=position
指定位置间隔内的所有日志
常用方法
通过 binlog 查看 delete 语句的执行:
mysqlbinlog /data/mysql_data/bin.000008 --database EpointFrame --base64-output=decode-rows -vv --skip-gtids=true |grep -C 1 -i "delete from Audit_Orga_Specialtype" > /opt/sql.log
说明:
/data/mysql_data/bin.000008
:需要解析的 binlog 日志。database
:只列出该数据库下的行数据,但无法过滤 Rows_query_event。base64-output=decode-rows -vv
:显示具体 SQL 语句。skip-gtids=true
:忽略 GTID 显示。grep -C 1 -i "delete from dataex_trigger_record"
:通过管道命令筛选出所需 SQL 及执行时间。/opt/sql.log
:将结果导入到日志文件,方便查看。
限定时间范围
设定范围
mysqlbinlog --start-datetime='2021-12-06 12:00:00' --stop-datetime='2021-12-06 16:00:00' mysql-bin.0043* |grep 'admin_user' -B 6 A6
设定位置
mysqlbinlog --start-position=120 --stop-position=330 /path/to/binlog.00001
查看特定数据的 log
可以使用 -d
参数来指定特定数据库上的日志:
mysqlbinlog -d gogs mysqld-bin.000001
mysqlbinlog --database gogs mysqld-bin.000001