SymmetricDS文檔翻譯--【Chapter 3. 詳細配置(Configuration)[section B]】,

來源:互聯網
上載者:User

SymmetricDS文檔翻譯--【Chapter 3. 詳細配置(Configuration)[section B]】,
3.4 Table Triggers

SymmetricDS使用資料庫觸發器捕獲要同步的資料。SymmetricDS的觸發器定義在TRIGGER表中。SymmetricDS使用裡面的一行記錄產生一個資料庫觸發器。僅僅當一個觸發器指定一個有效Route的時候,這個觸發器才會被SymmetricDS自動產生,這個ROUTE的source_node_group_id必須對應當前節點的group id。

TRIGGER表的source_table_name列可以包含萬用字元(“*”),因此TRIGGER表中的一個行可以定義對多個表的同步操作。系統資料表和任意以SymmetricDS表首碼開始的表將會被排除在外。也可以提供一個萬用字元符號的列表。如果有多個萬用字元符號,可以用逗號確定界限。一個萬用字元符號可以以驚嘆號(”!”)開始,以表明一個要排除的匹配。符號總是從左至右被匹配。如果一個表已經存在一個觸發器,那張表將不會被萬用字元匹配中(明確定義的觸發器比萬用字元建立的觸發器有更高的優先順序)。

當判斷一個資料變化是否發生的時候,預設情況下,觸發器將記錄資料變化,即使資料以相同的值被更新一次。例如,如果一行中的一個列以這個列的值被更新了一次,一個資料變化將會被捕獲。有一些全域的屬性,trigger.update.capture.changed.data.only.enabled(預設是false),這允許你重載這個行為。當設定為true時,SymmetricDS將僅捕獲真正改變過的資料(當一個列的新的資料不等於舊的資料的時候)。

Important

屬性trigger.update.capture.changed.data.only.enabled目前僅在MySQL,DB2,SQL Server和Oracle方言中被支援。

下面的SQL語句定義了一個觸發器,這個觸發器將捕獲表item的資料,不管是插入,更新還是刪除。Trigger被分配到一個名叫“item”的channel上。

insert into SYM_TRIGGER (trigger_id, source_table_name,          channel_id, last_update_time, create_time)                 values ('item', 'item', 'item', current_timestamp, current_timestamp); 

Important

注意,很多的資料庫允許定義同一類型的多個觸發器。每一個資料庫定義觸發器的觸發順序是不同的。如果除了SymmetricDS安裝在你表上的觸發器,你還有其他的觸發器,請諮詢你的資料庫文檔確定這樣的順序是否有問題。

3.4.1 Linking Triggers

TRIGGER_ROUTER表用來定義你想要的配置的Trigger和Router的組合。Trigger和Router之間的關係是多對多,因此這個表作為一個串連表用來定義有效Trigger-Router組合和在Trigger-Router層級的配置資訊。

有三個重要的控制可以配置到一個特定的Trigger-Router組合:Enabled,Initial Loads 和Ping Back。這些參數的定義可以在TRIGGER_ROUTER表中找到。

3.4.1.1 Enable/Disable Trigger Router

每一個Trigger-Router組合可以在需要的時候被啟用或者關閉。預設是開啟的,但是,如果你因為某種原因,你想定義Trigger Router組合被啟用的優先順序,你可以設定enabled標識為0。這將導致trigger-router映射被發送到所有的節點,但是trigger-router映射將不會被認為被啟用或者開啟以捕獲資料變化或者路由資料。

3.4.1.2. Enabling “Ping Back”

預設地,SymmetricDS避免迴圈資料的變化。當一個觸發器觸發的時候,SymmetricDS記錄資料變化的始發節點的id到source_node_id列中。在route的過程中,如果route導致資料發送回資料變化的始發節點,預設地,資料不會被route。如果你希望資料能夠被route回資料變化的始發節點,你可以為特定的trigger-router組合重新設定ping_back_enabled列的值。這將使router具有將資料發送回資料變化始發節點的能力。

3.4.2. Large Objects

TRIGGER表中還有兩個Lob類型相關的設定:

use_stream_lobs

指定在觸發觸發器時,是捕獲lob類型的資料,還是在提取資料時使用回調用流的方式訪問源表中Lob類型的列。值為1表明通過回調讀取來源資料;值為0時,觸發器會直接捕獲Lob類型的資料。

Use_capture_lobs

給SymmetricDS一個暗示,觸發器是否捕獲Lob類型的資料。如果被設定為1,在觸發器捕獲資料和為初始負載選擇資料時將盡一切努力使用Lob相關的工具提取和儲存資料庫中的資料。

3.4.3. External Select

 

偶爾,當一個觸發器被觸發的時候,你可能發現你需要捕獲和儲存的一部分資料出現在另一張表上。Route資料的時候,這些資料通常被用來確定資料要被route的位置。Trigger表定義包含一個可選的external_select列,這個列被用來指定被捕獲的資料。一旦資料被捕獲,捕獲的資料在Route期間在DATA表的external_data欄位中可以擷取。針對這類情況,使用一個SQL Select語句,這個Select語句將返回external_select中你需要route的資料條目。Section3.6.7 “Utilizing External Select when Routing”有一個使用externalselect的例子。

3.4.4. Dead Trigger

有時候,在決定初始載入什麼資料的時候可能需要額外增加觸發器。這些觸發器,就是Dead Trigger,它們需要被配置,但是不捕獲任何的資料變化。一個“dead”觸發器是一個不捕獲資料變化的觸發器。也就是說,一個觸發器的sync_on_insert,sync_on_update和sync_on_delete屬性都被設定為false。它將被包含在資料到目標節點的初始負載中。

你為什麼需要一個Dead Trigger? 舉個例子,一個Dead Trigger可以被載入唯讀尋找表(lookup table),也可以被用來載入一個需要被範例資料或預設資料填充的表。另一個用處是恢複單向同步的表的資料負載。例如,一個分銷商店記錄的交易資訊,這些交易資訊被單向同步到中央資料庫。如果分銷商店需要從中央資料庫恢複所有的交易資訊,這些交易資訊可以作為在那個方向上的Dead Trigger建立的初始負載的一部分從中央資料庫發送到分銷商店。

下面的SQL語句建立了一個非同步的dead Trigger,在初始負載的過程中,這個Trigger發送“corp”節點群組的交易資訊表的資料到“store”節點群組。

insert into sym_trigger (TRIGGER_ID,SOURCE_CATALOG_NAME,                         SOURCE_SCHEMA_NAME,SOURCE_TABLE_NAME,CHANNEL_ID,                         SYNC_ON_UPDATE,SYNC_ON_INSERT,SYNC_ON_DELETE,                         SYNC_ON_INCOMING_BATCH,NAME_FOR_UPDATE_TRIGGER,                         NAME_FOR_INSERT_TRIGGER,NAME_FOR_DELETE_TRIGGER,                         SYNC_ON_UPDATE_CONDITION,SYNC_ON_INSERT_CONDITION,                         SYNC_ON_DELETE_CONDITION,EXTERNAL_SELECT,                         TX_ID_EXPRESSION,EXCLUDED_COLUMN_NAMES,                         CREATE_TIME,LAST_UPDATE_BY,LAST_UPDATE_TIME)               values ('SALE_TRANSACTION_DEAD',null,null, 'SALE_TRANSACTION','transaction',                         0,0,0,0,null,null,null,null,null,null,null,null,null,                         current_timestamp,'demo',current_timestamp);                           insert into sym_router (ROUTER_ID,TARGET_CATALOG_NAME,TARGET_SCHEMA_NAME,                         TARGET_TABLE_NAME,SOURCE_NODE_GROUP_ID,TARGET_NODE_GROUP_ID,ROUTER_TYPE,                         ROUTER_EXPRESSION,SYNC_ON_UPDATE,SYNC_ON_INSERT,SYNC_ON_DELETE,                         CREATE_TIME,LAST_UPDATE_BY,LAST_UPDATE_TIME)               values ('CORP_2_STORE',null,null,null, 'corp','store',null,null,1,1,1,                         current_timestamp,'demo',current_timestamp);                           insert into sym_trigger_router (TRIGGER_ID,ROUTER_ID,INITIAL_LOAD_ORDER,                         INITIAL_LOAD_SELECT,CREATE_TIME,LAST_UPDATE_BY,LAST_UPDATE_TIME)               values ('SALE_TRANSACTION_DEAD','CORP_2_REGION',100,null,                         current_timestamp,'demo',current_timestamp); 

3.4.5. Changing Triggers

一個Trigger的資訊可以使用SQL語句更新來改變同步的表現。SymmetricDS將在每天晚上尋找Trigger表的變化,也可以在任何時候運行Sync Trigger Job來進行更新。例如,將表price_changes放到price channel中,可以使用下面的陳述式完成:

update SYM_TRIGGER          set channel_id = 'price',            last_update_by = 'jsmith',            last_update_time = current_timestamp          where source_table_name = 'price_changes';

所有改變的配置應該在註冊節點集中管理。啟動時,改變的配置將被同步到所有的用戶端節點。當Trigger的變化到達用戶端節點的時候,Sync Trigger Job將會自動運行。

觸發器的變化將會在Sync Trigger Job運行後才生效。不想等Sync Trigger Job晚上運行,你也可以通過JMX調用syncTrigger()方法或者簡單的重新啟動SymmetricDS服務。一個完整的Trigger變化的記錄被儲存在表TRIGGER_HIST中,這個在Section 4.3.5 “Sync Triggers Job”中討論。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.