博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql的binlog格式
阅读量:2447 次
发布时间:2019-05-10

本文共 2081 字,大约阅读时间需要 6 分钟。

日志格式

5.5默认为statement

可以在session级别修改,需要super权限

Set session binlog_format=’MIXED’;

Set session sql_log_bin=0; --0不记录log,默认为1

Master修改此参数不会影响到slave,但不停止复制就修改或只修改master可能会导致slave停止工作;

 

masterstatement/mixed运行且binlog有以row格式记录的事件时,

Slave可根据实际情况自动切换至row,处理完后再切换为原来的设置;

 

 

Statement风险

当某些sqlnondeterministic时,会导致主备库书记不一致;

 

Create table … select

Create table部分以statement方式记录,select部分取决于binlog_format设置

  

 

Row风险

不会记录临时表操作,如果正在使用row且操作临时表,切换为statement会导致错误结果;

当使用InnoDB且事务隔离级别为read_commited/read_uncommited时,只能使用row,如果在运行时切换成statement会导致无法执行insert

Row以块的形式记录进binlog--binlog-row-event-max-size规定了其最大尺寸,默认为1024

即便指定了row,某些sql仍会以statement形式记录,比如DDL

slave不支持MyISAM的并发insert

不使用checksums,在处理binlog时因网络/磁盘等导致的错误可能无法被检测,可在change master to中使用SSL用于checksuming

slave_exec_mode=idempotent(默认strict)时,因相应行不存在导致的错误无法被捕获,则master/slave有不同步的风险;

 

Mixed

Mysql认定当前sqlunsafe时,以row格式记录

 

 

Unsafe sql

使用limit但不加order byupdate/delete

调用load_file()/UUID()/USER()/RAND()/SLEEP()/SYSDATE()/master_pos_wait()等系统函数sql   

UDF

更新包含auto_increment列的表

引用日志表的sql—主备库的日志表可能不同

Load data infile5.5.6起,该sql被认为不安全

Insert delayed

在事务中操作非事务表

引用系统变量

 

Auto_increment注意事项

基本上statement级别可以正确的复制auto_increment/last_insert_id()/timestamp,但要注意以下几点:

1

Slave/master上的表声明auto_increment的必须为同一列,5.5.30之前必须如此,BUG#12669186

2

trigger/function引发的auto_increment更新被认定是不安全的,5.5 BUG#45677

3

使用alter table添加auto_increment列可能导致主备库数据顺序不一致,因为行序号依赖存储引擎和插入次序;

要消除此误差,必须重建表

Create tabe t2 like t1; --create like会跳过原表的外键和data directory/index directory约束

Alter table t2 add id int auto_increment primary key;

Insert into t2 select * from t1 order by col1, col2; --order by必须列举出t1所有列

Drop t1;

Alter table t2 rename t1;

 

 

Statementrow格式的区别还体现在replicate-to-db/binlog-to-db

前者应用于slave,后者作用于master

这两个选项在statementrow级别复制时效果不同;

statement复制只检查use db条件,如果符合即复制;而row则检查实际表,即便use db不符合也可以复制;

案例

slave上设置replicate_do_db=sales

master上执行

use prices;

update sales.january set amount=amount+1000;

如果binlog格式为statement不会执行,而row会执行;

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15480802/viewspace-758064/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15480802/viewspace-758064/

你可能感兴趣的文章
在Boxee中使用Pandora
查看>>
linux创建交换分区设置_如何在Linux上创建交换文件
查看>>
vim 关闭查找_如何打开或关闭查找我的iPad
查看>>
linux rev命令_如何在Linux上使用rev命令
查看>>
slack财报_如何将自己的表情符号添加到Slack
查看>>
juicer hic使用_使用Sound Juicer在Linux中翻录音频CD
查看>>
如何在Microsoft表单中添加分支
查看>>
在“提示”框中:删除Windows 8安全启动,从Media Center启动应用程序,并加快Windows安装速度...
查看>>
修改时序约束改变slack_如何更改Slack的默认表情符号肤色
查看>>
如何在iPhone,iPad和Mac上禁用Safari经常访问的起始页
查看>>
vscode变假期不提示_12个假期的家庭技术支持提示
查看>>
将电视频道徽标添加到Windows 7 Media Center
查看>>
改善Google Chrome中的YouTube视频观看
查看>>
配置您的计算机以备份到Windows Home Server
查看>>
解决Windows Home Server Toolkit的连接问题
查看>>
如何在Windows 10中打印照片
查看>>
如何在离开时自动检测巢穴
查看>>
ubuntu显示管理器_如何在Ubuntu的文件管理器中显示导航栏而不显示面包屑
查看>>
关于极客
查看>>
自定义日历_如何在网络上自定义Google日历的通知
查看>>