Informix IDS 11零碎经管(918磨练)认证指南,第 7 部分: IDS复制(11)

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





版权声明: 原创作品,允许转载,转载时请务必以超链接体式格局标明文章 原始来因 、作者信息和本声明。不然将究查法律责任。

posted @ 2011-03-07 00:16  蓝色的天空III  阅读(244)  评论(0编辑  收藏  举报