一、使用方法
binlog命令可以在终端执行,也可以在数据库可视化工具中执行:
1、终端执行
1.1、 linux
为防止binlog版本不一致,可以在前面加上/usr/local/mysql/bin/mysqlbinlog,如
/usr/local/mysql-5.7.26/bin/mysqlbinlog mysql-bin.000002
1.2、 windows
我的mysql5.1配置文件在C:\Program Files\MySQL\MySQL Server 5.1下,而数据目录在C:\ProgramData\MySQL\MySQL Server 5.1\data下。binlog日志有两种执行方法:
(1) mysqlbinlog配置了环境变量,直接使用:
(2) 通过登录mysql使用:
mysql> show binlog events; #只查看第一个binlog文件的内容
mysql> show binlog events in 'mysql-bin.000002';#查看指定binlog文件的内容
mysql> show binary logs; #获取binlog文件列表
mysql> show master status; #查看当前正在写入的binlog文件
2、可视化工具中执行
如navicat
二、常用命令
1、读取日志
1.1、直接读取
mysqlbinlog 文件名 >输出文件名
如:
1.2、指定时间段和数据库读取日志
mysqlbinlog -d crm mysqld-bin.000001
或者
mysqlbinlog -database crm mysqld-bin.000001
如查询2022-03-15 09:00:00到2022-03-17 20:00:00 数据库为 test的操作日志,并输出到屏幕上:
mysqlbinlog --no-defaults --database=test --start-datetime="2022-03-15 09:00:00" --stop-datetime="2022-03-17 20:00:00" mysql-bin.000001 |more
输出到文件中
mysqlbinlog --no-defaults --database=test --start-datetime="2022-03-15 09:00:00" --stop-datetime="2022-03-16 20:00:00" mysql-bin.000001 > test0316.txt
1.3、grep根据关键字搜索
#drop关键字
指定路径/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v 指定路径/mysql_log/mysql3306_bin.000012 | grep -i drop
#drop关键字前后各10行
指定路径/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v 指定路径/mysql_log/mysql3306_bin.000012 | grep -i -A 10 -B 10 drop
(1)grep -A1 keyword filename 找出filename中带有keyword的行,输出中除显示该行外,还显示之后的一行(After 1);
(2) grep -B1 keyword filename
找出filename中带有keyword的行,输出中除显示该行外,还显示之前的一行(Before 1);
(3)grep -1 keyword filename
找出filename中带有keyword的行,输出中除显示该行外,还显示之前的一行(After 1)和显示之后的一行(After 1);
2、删除binlog文件
注意:binlog文件不可直接删除,否则会导致mysql启动失败,可以通过命令删除。
(1)使用reset master
,该命令将会删除所有日志,并让日志文件重新从000001开始。
(2)使用命令
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
例如
purge master logs to "mysql-bin.000002"
将会清空000002之前的所有日志文件.
(3)使用--expire_logs_days=N
选项指定过了多少天日志自动过期清空。
3、恢复数据
使用binlog的--start-position=? --stop-position=?命令。
三、常见报错:
1、使用mysqlbinlog命令报错ERROR: Error in Log_event::read_log_event(): 'Sanity check failed', data_len: 31, event_type: 35,原因为版本与数据库版本不匹配导致,如我版本为3.3,使用于mysql5.1的版本,读取mysql5.7的日志会报错