简述
Binlog是记录所有数据库表结构变更以及表数据修改的二进制日志,不会记录SELECT和SHOW这类操作。
Binlog日志是以事件形式记录,还包含语句所执行的消耗时间。
开启Binlog日志有以下两个最重要的使用场景。
主从复制:在主库中开启Binlog功能,这样主库就可以把Binlog传递给从库,从库拿到Binlog后实现数据恢复达到主从数据一致性。数据恢复:通过mysqlbinlog工具来恢复数据。
状态
初始状态
通过简单的MySQL的数据,就可以看到初始状态,默认mysql5.7是关闭的。如下图所示。
![null 图片[1]-蜻蜓点水binlog-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-187589-1663912141.png)
开启状态
开启的时候,需要在配置文件中,设置log-bin变量的值。默认不改变路径,只填写一个名称-mysql-bin。对此值赋值完,变开启了bin-log日志。查阅资料,开启此类日志,会占用服务器百分之一的开销。仅供参考,未求证真伪。
![null 图片[2]-蜻蜓点水binlog-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-187589-1663912142.png)
默认路径:/Library/Application Support/appsolute/MAMP PRO/db/mysql57/
相关参数
在binlog日志中,有一个很重要的参数binlog_format,这个参数规定了日志文件的存储方式,默认为row。其次缓存的大小binlog_cache_size,还有有效期:expire_logs_days。这些均使用默认值,不涉及生产环境的参考值。
![null 图片[3]-蜻蜓点水binlog-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-187589-1663912143.png)
查阅日志
小白初次尝试,查阅binlog日志的几种方式,前两种为错误操作,均为乱码不可读,以第三种为正确操作方式,使用专用的mysqlbinlog工具进行读取该日志文件。
- • 方式一【错误】:
![null 图片[4]-蜻蜓点水binlog-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-187589-1663912144.png)
- • 方式二【错误】:
方式三【正确】:
mysqlbinlog -vv –base64-output=decode-rows mysql-bin.000007
存储模式【binlog_format】
statement模式
表现形式,记录sql语句,但如果是带有时间参数的语句,比如now(),这样的语句在恢复的时候,就是时间错乱。优点是记录数据较少,节省IO,提高性能。
row模式
表现形式,非一般的sql语句,记录数据繁琐,可读性差,不会出现statement模式下的时间错乱的情况,数据量比较庞大。
mixed模式
混合模式是前两种的结合体,系统智能判断使用哪种形式记录。三种方式的对比图:
![null 图片[5]-蜻蜓点水binlog-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-187589-1663912147.png)
数据恢复实操
说明
在执行前使用flush logs,产生一个新的日志文件,便于我们实验,方便结果的恢复和阅读,此时产生了的是04日志文件。
实操
在本地数据库blog中建立一张表xc_test,里面添加一条数据。name为123的,制造数据丢失的场景,人工删除这条数据,此时查看日志文件如下:
![null 图片[6]-蜻蜓点水binlog-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-187589-1663912150.png)
以行号起始点恢复数据
寻找两个标记,一个begin,一个end。中间为删除操作产生的日志记录。在这两个标记之间,寻找delete最上面的at数是343,最下面的at数为390。日志文件简单分析到这里。也可以在MySQL中执行:”show binlog events in ‘mysql-bin.000004′”查阅更方便,阅读更好。
![null 图片[7]-蜻蜓点水binlog-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-187589-1663912152.png)
再看日志恢复的命令:mysqlbinlog –database=要操作的数据库 binlog的名称 –start-position=开始的pos –stop-position=结束的pos| mysql -u登陆名 -p登陆密码 -v 要操作的数据库 分析到这里,如果要回复这条数据,我们需要找到这个条数的插入过程,也就是insert。看下面这个图:
![null 图片[8]-蜻蜓点水binlog-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-187589-1663912154.png)
也就是插入的开始位置是468,结束位置是688。按照上面的格式,进行拼接数据如下:mysqlbinlog --database=blog mysql-bin.000004 --start-position=486 --stop-position=688 | mysql -u root -proot -v blog
以时间起始点恢复数据
mysqlbinlog --database=blog mysql-bin.000004 --start-datetime="2022-08-02 10:45:05" --stop-datetime="2022-08-02 14:10:10" | mysql -u root -proot -v blog
![null 图片[9]-蜻蜓点水binlog-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-187589-1663912155.png)
bug[Ownership is released on COMMIT or ROLLBACK.]
![null 图片[10]-蜻蜓点水binlog-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-187589-1663912158.png)
原因: 设置的起始pos和结束pos点并不是一条完整的mysql事务开启事务结束语
总结:
mysql下命令总结:
show variables like 'binlog%'; # 查看数据库变量
flush logs; # 重新生成一个日志文件
show binlog events in 'mysql-bin.000004' # 查询指定日志文件
show master logs; # 显示所有日志文件
show master status; #当前的日志文件
E
N
D
本文作者:TideSec
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/187589.html
昶之琴![资深玩家 徽章-资深玩家-NGC660 安全实验室](http://ngc660.cn/wp-content/themes/zibll/img/thumbnail-null.svg)
2年前0
我以为只要提交就行了好想告诉你![备受喜爱 徽章-备受喜爱-NGC660 安全实验室](http://ngc660.cn/wp-content/themes/zibll/img/thumbnail-null.svg)
2年前0
花巨资看一下