ER:争执处理
当多个数据库做事器试图同时更新统一行时(更新的时间戳是相反的 GMT 时间),就会发作争执。ER 必须鉴定出要复制的新数据。为了处理争执,必须指定争执处理纪律和纪律的事件范畴。本节座谈以下主题:
- 方法
- 影子工具
- ATS 和 RIS 文件
- 练习
- 处理方案
方法
有五个不合的争执处理选项,它们的施展阐发各不相反。下面的表总结了这些方法:
表 7. 争执处理选项
纪律
描画
Ignore(纰漏)
ER 不尝试处理争执。
Time stamp(时间戳)
使用时间戳最近的行或事件。
SPL routine(SPL 例程)
ER 运用一个用 SPL(Stored Procedure Language)编写的例程来鉴定应该使用的数据。
Time stamp with SPL routine(结合运用时间戳与 SPL 例程)
假设时间戳相反,那么 ER 就调用 SPL 例程来处理争执。
Always-apply(总是使用)
ER 不尝试处理争执,总是把源数据使用于目标。
表 8. 纰漏争执处理
目标能否存在键值?
拔出
更新
删除
No
使用源纪录
丢弃源纪录
丢弃源纪录
Yes
丢弃源纪录
使用源纪录
使用源纪录
表 9. 时间戳争执处理
表 10. “总是使用” 争执处理
目标能否存在键值?
拔出
更新
删除
No
使用源纪录
将行作为 upsert 使用
将行使用于影子表
Yes
将行作为 upsert 使用,掩盖现有行
使用行
删除行
正本范畴
正本的范畴(事件或行)定义 ER 怎样对毛病做出反响。毛病可以可能由争执、锁问题等形成。假设范畴是 ‘row’,那么只要独自的行掉败;然则,假设范畴是 ‘transaction’,那么整个事件都将掉败。
影子工具
为了处理争执,需求相识两种影子工具:
- 影子列
- 影子表
影子列
关于运用时间戳或存储进程争执处理选项的一切表,复制进程运用影子列完成争执处理。这些列也称为 CRCOLS 或争执处理列。它们由两个字段组成,cdrserver 和 cdrtime。cdrserver 是一个专注 ID,表示行的源做事器 id。cdrtime 是一个时间戳,表示在源做事器上施行提交的时间。
影子表
ER 树立影子表(即删除表)来存储已经删除的行,直到删除操纵完全传布出去为止。影子表网罗删除的行的完好拷贝(包括影子列)。只需争执处理类型不是纰漏,那么在树立正本时,就会树立影子表。在 syscdr 数据库的 ‘deltabdef’ 表中网罗复制的表和影子表之间的关连。
ATS 和 RIS 文件
Aborted Transaction Spooling
假设一个事件无法使用,ER 就会从接收行列中删除掉败的事件,并在指定的 ATS 目录中写入一个文件,其中网罗整个事件的详细信息。只在整个事件掉败的状况下,施行 ATS spooling。每个掉败的事件被写到 ATS 设置参数指定的目录中的一个外部文件中。ATS 和 RIS 文件的默许职位中间是 /tmp。ATS 文件名的格局是 ats.targetServername.sourceServername.threadId.timestamp.sequence,其中各个部分的含义如下:
- targetServername —— 接收这个事件的 ER 做事器的称号
- sourceServername —— 发送这个事件的 ER 做事器的称号
- threadId —— 处理这个事件的线程
- timestamp —— 树立 ATS 文件时 cdrtime 的值
- sequence —— 关于每个文件递增的专注整数
示例:
- ats.test1.test3.D_1.970827_14:23:42.4
- ats.test2.test3.D_1.970827_14:23:41.4
Row Information Spooling
在拔出转换为更新和更新转换为拔出时,ER 将掉败的行错误纪录在 RIS 文件中。其余,假设用来处理争执的存储进程掉败了,那么用前往码生成一个 RIS 文件。RIS 文件名的格局与 ATS 文件名相反。下面是一些示例:
- ris.test1.test3.D_1.970827_14:23:42.3
- ris.test2.test3.D_1.970827_14:23:41.3
练习
这个练习理论复制和争执处理方面的操纵。议决这个练习,您应该可以可能看到 ER 怎样用时间戳和纰漏选项处理争执。
练习:施行以下步调:
表 11. 争执处理练习
步调
描画
1
定义下面的表:
清单 38. 树立 rocket 表
CREATE table rocket( rocket_id int, rocket_name char(20), rocket_cost money(10,2), launch_date datetime year to second, primary key (rocket_id,rocket_name)) with crcols;
2 定义一个正本,这个正本在零碎的其他节点上树立这个表。这个正本网罗以上司性:
- 时间戳争执处理选项
- 事件范畴
- ATS 和 RIS 错误日记纪录
3 启动正本并拔出以下行:
清单 39. 拔出行
insert into rocket values (10,"Gemini",500000.00,today); insert into rocket values (20,"Apollo13",800000.00,today); insert into rocket values (30,"Ramjet",400000.00,today); insert into rocket values (40,"Ramjet2",1000000.00,today);
4 停歇正本
5 在两个做事器上施行以下更新。必定要依照这里的序次施行更新(起首施行 T1)。
清单 40. 施行更新
(T1) 在做事器 A 上 UPDATE rocket set rocket_cost = 600000.00 where rocket_cost = 500000.00 and rocket_name = "Gemini"; (T2) 在做事器 B 上 UPDATE rocket set rocket_cost = 700000.00 where rocket_cost = 500000.00 and rocket_name = "Gemini";
6 持续施行正本。在两个做事器上 Gemini 的资本值是相反的吗?值为多少?在那儿中止争执探测?在那儿施行争执处理?在每个做事器上盘查数据库来证明您的猜测。
7 反省能否生成了任何日记消息。每个做事器上应该会生成一个日记消息。是什么招致生成 ATS 和 RIS 文件?
处理方案
处理方案:应该施行以下步调:
表 12. 争执处理处理方案
步调
描画
1
定义下面的表:
清单 41. 树立 rocket 表
CREATE table rocket( rocket_id int, rocket_name char(20), rocket_cost money(10,2), launch_date datetime year to second, primary key (rocket_id,rocket_name)) with crcols;
2 定义一个正本,这个正本在零碎的其他节点上树立这个表。这个正本网罗以上司性:
- 时间戳争执处理选项
- 事件范畴
- ATS 和 RIS 错误日记纪录
清单 42. 为 rocket 表定义正本
cdr def repl -M g_80s -n n -u -C "timestamp" -S tran -A -R rocketrep \ "stores7@g_80s:informix.rocket" "select * from rocket" \ "stores7@g_90s:informix.rocket" "select * from rocket"
定义正本的语句发作以下输入:
清单 43. 检修 rocket 表的正本
$ ./def_rocketrep.sh Verification of stores7@g_80s:informix.rocket started Verification of stores7@g_80s:informix.rocket is successful Verification of stores7@g_90s:informix.rocket started Creating table... create table informix.rocket ( rocket_id integer, rocket_name char(20), rocket_cost money(10,2), launch_date datetime year to second, primary key (rocket_id, rocket_name)) with CRCOLS lock mode row; Verification of stores7@g_90s:informix.rocket is successful
3 启动正本并拔出以下行:
清单 44. 启动正本
cdr start repl rocketrep
清单 45. 在 rocket 表中拔出行
insert into rocket values (10,"Gemini",500000.00,today); insert into rocket values (20,"Apollo13",800000.00,today); insert into rocket values (30,"Ramjet",400000.00,today); insert into rocket values (40,"Ramjet2",1000000.00,today);
4 停歇正本:
清单 46. 停歇正本
cdr suspend repl rocketrep
反省
onstat -g cat
的输入,正本的外形应该是 SUSPENDED。5 在两个做事器上施行以下更新。必定要依照这里的序次施行更新(起首施行 T1)。
清单 47. 施行更新
(T1) 在做事器 A 上 UPDATE rocket set rocket_cost = 600000.00 where rocket_cost = 500000.00 and rocket_name = "Gemini"; (T2) 在做事器 B 上 UPDATE rocket set rocket_cost = 700000.00 where rocket_cost = 500000.00 and rocket_name = "Gemini";
6 持续施行正本 ——
cdr resume repl rocketrep
。在两个做事器上 Gemini 的资本值是相反的吗?值为多少?在那儿中止争执探测?在那儿施行争执处理?在每个做事器上盘查数据库来证明您的猜测。清单 48. 更新的功效
on server A rocket_id rocket_name rocket_cost launch_date 10 Gemini $600000.00 2007-06-09 00:00:00 20 Apollo13 $800000.00 2007-06-09 00:00:00 30 Ramjet $400000.00 2007-06-09 00:00:00 40 Ramjet2 $1000000.00 2007-06-09 00:00:00 on server B rocket_id rocket_name rocket_cost launch_date 10 Gemini $700000.00 2007-06-09 00:00:00 20 Apollo13 $800000.00 2007-06-09 00:00:00 30 Ramjet $400000.00 2007-06-09 00:00:00 40 Ramjet2 $1000000.00 2007-06-09 00:00:00
假设先在做事器 B 上运转更新,然后是做事器 A,那么功效可以可能不一样。
7 反省能否生成了任何日记消息。是什么招致生成 ATS 和 RIS 文件?
清单 49. 消息日记文件
15:28:51 CDR CDRD_3: transaction aborted (One or more rows in a transaction defined with tx scope were rejected) with sql error 0 isam error 0. 15:28:51 CDR CDRD_3: failed transaction spooled to file /informix/ats-ris/boy/ats.g_80s.g_90s.D_3.070609_15:28:51.2
清单 50. ATS 文件内容
$ more ats.g_80s.g_90s.D_3.070609_15:28:51.2 TXH RIS file:/informix/ats-ris/boy/ris.g_80s.g_90s.D_3.070609_15:28:51.1 has also been created for this transaction ========== TXH Source ID:90 / Name:g_90s / CommitTime:07-06-09 15:26:40 TXH Target ID:80 / Name:g_80s / ReceiveTime:07-06-09 15:28:51 TXH Number of rows processed when transaction was aborted:1 TXH One or more rows in a transaction defined with tx scope were rejected TXH CDR:14 (Error: Failed conflict resolution rule) / SQL:0 / ISAM:0 ---------- RRH Row:1 / Replicate Id: 5242884 / Table: stores7@informix.rocket / DbOp:Update RRS 90 (g_90s)|1181420800 (07/06/09 15:26:40) RRD 10|Gemini|700000.00|2007-06-09 00:00:00
清单 51. RIS 文件内容
$ more ris.g_80s.g_90s.D_3.070609_15:28:51.1 TXH Source ID:90 / Name:g_90s / CommitTime:07-06-09 15:26:40 TXH Target ID:80 / Name:g_80s / ReceiveTime:07-06-09 15:28:51 ---------- RRH Row:1 / Replicate Id: 5242884 / Table: stores7@informix.rocket / DbOp:Update RRH CDR:14 (Error: Failed conflict resolution rule) / SQL:0 / ISAM:0 LRS 80 (g_80s)|1181420912 (07/06/09 15:28:32) LRD 10|Gemini|600000.00|2007-06-09 00:00:00 RRS 90 (g_90s)|1181420800 (07/06/09 15:26:40) RRD 10|Gemini|700000.00|2007-06-09 00:00:00 ========== TXH Transaction aborted TXH ATS file:/informix/ats-ris/boy/ats.g_80s.g_90s.D_3.070609_15:28:51.2 has also been created for this transaction
版权声明: 原创作品,允许转载,转载时请务必以超链接体式格局标明文章 原始来因 、作者信息和本声明。不然将究查法律责任。