关系型数据库在双掌握环境中由排日志模式带来的数据是否一致,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
## 实验环境:双掌握结构
Master1==10.249.160.132
Master2==10.249.160.133
RHEL 5.4 X64,MYSQL 5.1.40
binlog_format=MIXED
tx_isolation=READ-COMMITTED
(这里有一个要点:READ-COMMITTED INNODB,MYSQL强制使用排日志模式)
[@more@]
## 初始化数据
使用测试;
设置名称gbk
如果存在h2,则删除表;
创建表h2 (id int,名称varchar(20),注释varchar(500),主键(id))
引擎=innodb默认字符集=gbk
插入氘值
(1,' h2 ',' h211 '),
(2,' h3 ',' h212 '),
(3,' h4 ',' h213 '),
(4,《H5》,《h214》),
(5,' h6 ',' h215 ');
刷新日志;
## 首先来认识一下,在排模式中,MYSQL是如何记录更新语句的。
比如:更新氘集名称='h-m@2 ',其中id=5;
BINLOG日志里这样记录的:
' BINLOG '
wx3rsxmcaaaaaaawahaaacyaaaaaaabahrlc3 qaamgxaamdwaa8dkadoawy=
wx3rsgcaaaaaaaapqaaak 0 gaaaqacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aDExNQ==
'/*!*/;
### UPDATE test.h2
###哪里
### @1=5 /* INT meta=0可空=0 is_null=0 */
# # # @ 2=' h6 '/* VARTRING(40)meta=40可空=1 is_null=0 */
# # # @ 3=' h215 '/* VARTRING(1000)meta=1000可空=1 is_null=0 */
### SET
### @1=5 /* INT meta=0可空=0 is_null=0 */
# # @ 2=' h-m @ 2 '/* VARTRING(40)meta=40可空=1 is_null=0 */
# # # @ 3=' h215 '/* VARTRING(1000)meta=1000可空=1 is_null=0 */
#### 我们发现关系型数据库只是记录了字段对应的号码。@1,而不记录具体是哪个字段。 (这正是俺担心的问题)
#### 下面我们用实验来验证一下问题。
####第一步,在Master1,意图是让MASTER2的结构化查询语言在Master1上延时应用。
停止奴隶;
####第二步,在Master2
更新氘集名称='h-m@2 ',其中id=5;
插入氘值(6,' h7@2 ',' dsflk ');
###尚未在Master1上应用
####第三步,在Master1
更改表h2在名字之后添加addr varchar(500);### 这里故障打断原的字段顺序
从氘中选择*;
- - - -
| id | name | addr | comment |
- - - -
| 1 | h2 | NULL | h211 |
| 2 | h3 | NULL | h212 |
| 3 | h4 | NULL | h213 |
| 4 | h5 | NULL | h214 |
| 5 | h6 | NULL | h215 |
- - - -
启动从机;###开始应用来自主控2的结构化查询语言日志
从氘中选择*;
- - - -
| id | name | addr | comment |
- - - -
| 1 | h2 | NULL | h211 |
| 2 | h3 | NULL | h212 |
| 3 | h4 | NULL | h213 |
| 4 | h5 | NULL | h214 |
| 5 | h-m @ 2 | h215 | h215 | # # addr=h215?
| 6 | H7 @ 2 | dsflk | NULL | # # addr=dsflk?
- - - -
####在这里。我们看到了什么?
####列地址,我们没有做任何事情臭虫.它有数据。
####记录6的列注释,应该是dsflk .不是"空"
####第四步,在Master2,有数据看起来没错;
从氘中选择*;
- - - -
| id | name | addr | comment |
- - - -
| 1 | h2 | NULL | h211 |
| 2 | h3 | NULL | h212 |
| 3 | h4 | NULL | h213 |
| 4 | h5 | NULL | h214 |
| 5 | h-m@2 | NULL | h215 |
| 6 | h7@2 | NULL | dsflk |
- - - -
####最后,
Master1和Master2中的数据不再相同。
当然,我们如果在作表结构变更时,把字段都加到最后,是没有这个问题的。
这应该当成是一个病菌处理。提交关系型数据库
还留了一个问题是:MYSQL的应用日志时,是通过什么来匹配行的?主键?还是日志里所列条件都必须匹配。
理论上的答案应该是:主键,(如果没有主键,就是关系型数据库帮你生成的内部主键。) 有兴趣的同学可以自己测试一把。
关于关系型数据库在双掌握环境中由排日志模式带来的数据是否一致问题的解答就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/106537.html