重庆思庄Oracle、、PostgreSQL、Redhat认证学习论坛
标题:
MySQL的binlog的格式
[打印本页]
作者:
jiawang
时间:
2022-11-27 14:06
标题:
MySQL的binlog的格式
一种是statement,一种是row。另一种叫作mixed,其实它就是前两种格式的混合。
当binlog_format=statement
binlog里面记录的就是SQL语句的原文。
由于statement格式下,记录到binlog里的是语句原文,因此可能会出现这样一种情况:在主库执行这条SQL语句的时候,用的是索引a;而在备库执行这条SQL语句的时候,却使用了索引t_modified。因此,MySQL认为这样写是有风险的。
binlog_format=‘row’
前后的BEGIN和COMMIT是一样的。但是,row格式的binlog里没有了SQL语句的原文,而是替换成了两个event:Table_map和Delete_rows。
Table_map event,用于说明接下来要操作的表是test库的表t;
Delete_rows event,用于定义删除的行为。
需要借助mysqlbinlog工具,解析和查看binlog中的内容
binlog_format=‘mixed’ 它就是前两种格式的混合
因为有些statement格式的binlog可能会导致主备不一致,所以要使用row格式。
但row格式的缺点是,很占空间。比如你用一个delete语句删掉10万行数据,用statement的话就是一个SQL语句被记录到binlog中,占用几十个字节的空间。但如果用row格式的binlog,就要把这10万条记录都写到binlog中。这样做,不仅会占用更大的空间,同时写binlog也要耗费IO资源,影响执行速度。
所以,MySQL就取了个折中方案,也就是有了mixed格式的binlog。mixed格式的意思是,MySQL自己会判断这条SQL语句是否可能引起主备不一致,如果有可能,就用row格式,否则就用statement格式。
欢迎光临 重庆思庄Oracle、、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/)
Powered by Discuz! X3.2