主从数据库复制中有关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.
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())
检索结果
从库检查一下。数据也是一致的。
在从库上,对自动增长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
然后再在主库上插入数据,看同步情况。
再去从库确认得出,数据是一致的。
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_INCREMENTcolumns
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())
检索结果
autoid | sysdatetime | radomid | uuidhere | |
---|---|---|---|---|
1 | 2015-04-14 13:18:10 | 269932 | a4442c04-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
然后再在主库上插入数据,看同步情况。
1 | 2015-04-14 13:18:10 | 269932 | a4442c04-e265-11e4-80e1-00163e020999 |
2 | 2015-04-14 13:53:06 | 797249 | 85cebd3f-e26a-11e4-80e1-00163e020999 |
相关文章推荐
- MySQL 用户授权和bin-log日志和主从复制、读写分离(2)
- 关于解决 MySQL 数据库主从复制延迟的问题
- 有关不同数据库间数据表的复制问题
- mysql 主从复制实验------包含授权、bin-log
- mysql innodb ib_logfile、bin-log与主从同步的问题
- MySQL 用户授权和bin-log日志和主从复制、读写分离(1)
- mysql主从复制实现数据库同步
- 数据库纯净下的主从复制
- MySQL主从复制基础搭建--之遇到的问题
- JAVAEE——宜立方商城13:Mycat数据库分片、主从复制、读写分离、100%Linux中成功安装Mysql的方法
- 构建高性能数据库缓存之redis主从复制
- ADO.NET Entity framework 中 实体的对应数据库中text类型的问题 (更新) :asp.net entity 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。参数 3 ("@0"): 数据类型 0
- 浅谈数据库导入导出格式问题
- Mysql 主从复制-Binlog详细解析(Row格式)
- [C++]有关深复制与copy constructor的一些问题与实例
- mysql主从复制实现数据库同步
- mysql主从复制碰到的小问题
- 构建高性能数据库缓存之redis主从复制
- MySQL 数据库主从复制架构
- MySQL之——如何添加新数据库到MySQL主从复制列表