有时候需要审计看看谁执行了啥操作. 但很多环境是没得审计的. 这时候就可以通过解析binlog 得到ddl执行的记录了(审计dml套麻烦了).
主要有两种解析binlog的办法,
使用mysqlbinlog解析然后使用grep匹配需要的信息. 优点就是简单, 缺点就是grep是行级匹配, 获取到的数据不是那么好看...
例子:
mysqlbinlog /data/mysql_3308/mysqllog/binlog/m3308.0* | grep -i -E '^(CREATE |DROP |ALTER |RENAME |TRUNCATE |USE )'
很难匹配完整的DDL. (还请有能力的大佬自己完善 ^_^)
使用第三方工具解析, 比如mysql-replication.
但我们只解析DDL的话, 就没必要那么麻烦了.
通过前面的知识我们知道 ddl 均记录在 QUERY_EVENT , 所以我们只需要解析 QUERY_EVENT即可, 也不用全部解析, 只要解析DDL即可.
query_event格式如下:
名字 | 大小(byte) |
---|---|
slave_proxy_id | 4 |
execution time | 4 |
schema length | 1 |
error code | 2 |
status_vars length | 2 |
status-vars | 取决于status_vars length |
schema | 取决于schema length, 以\x00结尾 |
query(ddl) | 剩下的 |
check | 如果有的话就是4字节, 取query的时候记得-4 |
不用你去解析, 我给你提供现成的工具.
https://github.com/ddcw/ddcw/blob/master/python/getddl_frombinlog.py
用法
(venv) 21:32:26 [root@ddcw21 ei]#python getddl_frombinlog.py
version: 0.1
example:
getddl_frombinlog.py mysql-bin.0000022 [CHECK:BOOL]
getddl_frombinlog.py mysql-bin.000002* [CHECK:BOOL]
(venv) 21:32:47 [root@ddcw21 ei]#
直接执行 第一个参数就是Binlog文件的位置, 支持正则表达式
如果开启了binlog check的话, 就多跟个参数(随便叫啥)
使用例子:
python getddl_frombinlog.py '/data/mysql_3308/mysqllog/binlog/m3308.0*'
解析单个文件
有时候为了证明你没有执行危险的DDL, 你可以去解析DDL看看, 当然, 如果你没有开启binlog或者设置的sql_log_bin=off, 就当我没说.
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。