项目组同事表示数据在2019年6月25日18点到2019年6月26日9点之间被人改动过,知道是哪个库的哪张表,但是不知道是做了什么改动,目前无法进行测试。
过程:
使用mysqlbinlog解析二进制日志,由于mysql.log 有1.3g,检查了binlog之后,发现昨天的日志有3个Binlog,因此通过该命令解析,但是binlog解析并没有记录登陆的ip。
此处没有使用show binary log events 的原因是被加密了,无法查看。
mysqlbinlog命令参数:
常用参数:
–start-datetime=datetime 从二进制日志中第1个日期时间等于或晚于datetime参量的事件开始读取。datetime值相对于运行mysqlbinlog的机器上的本地时区。
该值格式应符合DATETIME或TIMESTAMP数据类型。
–stop-datetime=datetime 从二进制日志中第1个日期时间等于或晚于datetime参量的事件起停止读。关于datetime值的描述参见–start-datetime选项。该选项可以帮助及时恢复。
–start-position=N 从二进制日志中第1个位置等于N参量时的事件开始读。
–stop-position=N 从二进制日志中第1个位置等于和大于N参量时的事件起停止读。
–base64-output=DECODE-ROWS 会显示出row模式带来的sql变更
-d 与 --database 效果相同,指定一个数据库名称。
–offset=N,-o N 跳过前N个条目。
-v, --verbose Reconstruct pseudo-SQL statements out of row events. -v
-v adds comments on column data types.
-V, --version Print version and exit.
–GTID相关:
–skip-gtids 跳过GTID
–include-gtids=name 打印时间提供的GTID
–exclude-gtids=name 打印所有事件提供的GTID
–print-table-metadata 打印存储于Table_map_log_event的metadata信息。
注意:
1.不要查看当前正在写入的binlog文件
2.不要加–force参数强制访问
3.如果binlog格式是行模式的,请加 -v 参数
查看binlog_format
show variables like ‘binlog_format’;
grep 命令:
-B, --before-context=NUM print NUM lines of leading context 筛选的字前多少行显示
-A, --after-context=NUM print NUM lines of trailing context 筛选的字后多少行显示
-n, --line-number print line number with output lines
–line-buffered flush output on every line
命令
切换到实例的存储二进制日志的var目录,可以看到符合时间段要求的二进制日志都是mysql-bin.00076 开头,筛选出来的文件中没有打印具体的年月日哦只有时间段的。
/home/mysql/mysql/bin/mysqlbinlog --base64-output=decode-rows -v --start-datetime=‘2019-06-25 9:00:00’ --stop-datetime=‘2019-06-27 9:00:00’ mysql-bin.00076* |grep ‘irl_system’ -A 50 >>/home/mysql/opdir/zfy/20190627/06273.sql
/home/mysql/mysql/bin/mysqlbinlog --base64-output=decode-rows -v --start-datetime=‘2019-06-25 9:00:00’ --stop-datetime=‘2019-06-27 9:00:00’ mysql-bin.000759 |grep ‘irl_system’ -A 50 >>/home/mysql/opdir/zfy/20190627/06274.sql
/home/mysql/mysql/bin/mysqlbinlog --base64-output=decode-rows -v --start-datetime=‘2019-06-25 18:00:00’ --stop-datetime=‘2019-06-26 09:00:00’ mysql-bin.00076* |grep ‘irl_system’ -A 50 >>/home/mysql/0626/06269.sql
此时已经定位了sql,此时的内容包含改之前的内容和更改之后的内容。但想要查看ip,第一次解析的实例的general_log,但是并没有记录ip.
grep “update irl_system” -A50 -B 10 mysql.log.2019062600 > 5.sql
此时来解析dbproxy的日志,项目组通过proxy连接。我们的策略是proxy日志每隔一个小时打印一次,那就非常方便了。
进入到proxy日志目录:
cd /home/mysql/dbproxy_6203/log
grep “update irl_system” -A50 -B 10 dbproxy.log.wf.2019062519 > 5.sql
这样打印出来的就会出现具体的ip地址登陆的用户,具体的语句,但是没有更改之前的值,因此看需求解析二进制还是proxy日志。