• 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
    





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

  • 相关阅读:
    shell 环境变量
    websphere 进程
    shell 安装使用VIM
    shell seq 用法
    shell 变量自增
    WebService学习笔记系列(二)
    WebService学习笔记系列(一)
    类加载器及其委托机制的深入分析
    Java工具类:给程序增加版权信息
    QQ互联API接口失效,第三方网站的死穴
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1973002.html
Copyright © 2020-2023  润新知