您的位置:首页 > 数据库

主从数据库复制中有关bin-log格式问题

2015-04-14 13:35 260 查看
主从数据库复制时,主数据库上有一个配置叫binlog_format,有3个选项(Mixed,Statement,Row)。具体说明可以参看官方文档。
http://dev.mysql.com/doc/refman/5.7/en/replication-formats.html
Statement是语句级别的复制,简单的说就是把主数据库上执行的SQL语句在从库上再执行一边。

Row是行数据级别的复制,直接操作行级数据,这样复制的准确性比Statement高。缺点是binlog记录的数据量会变大。

Mixed是介于两者之间的一种方式,Mysql会根据具体的SQL选择Statement还是Row方式记录。

Mixed在大部分情况下用Statement方式,但是在以下一些情况会以Row方式记录,防止主从数据不一致。

1.UUID()

2.
AUTO_INCREMENT
columns

3.When
a statement refers to one or more system variables. 例如系统时间

其他还有很多,不过我在开发中没遇到过,就不一一确认。

以下,我做了一些测试确认主从一致性。

先建立一张表

CREATE TABLE `test` (

`autoid` int(11) NOT NULL AUTO_INCREMENT,

`sysdatetime` datetime DEFAULT NULL,

`radomid` int(11) DEFAULT NULL,

`uuidhere` varchar(60) COLLATE utf8_bin DEFAULT NULL,

PRIMARY KEY (`autoid`)

)

插入数据

insert into test(sysdatetime,radomid,uuidhere) values(sysdate(),rand()*10000000,UUID())

检索结果

autoidsysdatetimeradomiduuidhere
12015-04-14 13:18:10269932a4442c04-e265-11e4-80e1-00163e020999
从库检查一下。数据也是一致的。

在从库上,对自动增长key做一些手脚,让两边不一致。

mysql> SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name="test";

可以得到:AUTO_INCREMENT = 2

mysql> ALTER TABLE test auto_increment=4;

mysql> insert into test(sysdatetime,radomid,uuidhere) values(sysdate(),rand()*10000000,UUID());

mysql> select * from test;

4 | 2015-04-14 13:40:23 | 2215597 | bea0ffbb-e268-11e4-83c7-00163e000dcf

mysql> rollback;

mysql>
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name="test";

可以得到:AUTO_INCREMENT
= 5

然后再在主库上插入数据,看同步情况。

12015-04-14 13:18:10269932a4442c04-e265-11e4-80e1-00163e020999
22015-04-14 13:53:0679724985cebd3f-e26a-11e4-80e1-00163e020999
再去从库确认得出,数据是一致的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: