Oracle整體資料庫複製解決方案調查報告

dawn009發表於2014-07-10

   Oracle同步複製資料調研報告

一、 使用場景描述:

已有一臺資料庫伺服器在執行,為了不影響現有資料庫的使用,需要新啟一臺資料庫伺服器,把原有資料庫的資料以及後期可能產生的新資料做完整的資料同步。

二、 調研結果:

OracleOracle資料庫之間的整體資料庫複製可以實現。主要分為兩大類:一類為Asynchronous Replication非同步複製);另一類為Synchronous Replication(同步複製)。我個人認為使用非同步複製中的“物化檢視複製站點”較好,並且成功的實現了物化檢視複製站點的操作

、 整體資料庫複製概述

1. Replication 使用分散式資料庫技術在多個站點之間共享資料。

2. Replicated Database Distributed Database 並不一樣,在分散式資料庫系統中資料在

多個站點同時有效,但是一個表只會存在於一個站點中,而對於Replication 來說相同

的資料將同時存在於多個站點中。

3. 使用 replication 的原因:

1) Availability:也就是提供了優秀的failover 保護

2) Performance:由於有多個server,所以可以將使用者業務分佈在不同的server 

3) Disconnected computing:實體化檢視允許使用者在和master 斷開後使用資料庫

的子集,在重新連線上master 之後再進行兩者的同步。

4) Network load reduction:由於有多個server,所以可以減少master 的網路請

5) Mass deployment:透過變數產生自定義的實體化檢視以滿足多種需求

4. 在不同的 Oracle 發行版本之間以及不同作業系統的Oracle 之間都可以使用Advanced

Replication

5. Replication 中的幾個概念:

1) replication object:複製物件,指需要作複製的物件(object),包括表,索引,

儲存過程等等。複製物件的更新遵循事務一致性規則(transactionally consistent

manner)。

2) replication groups:複製組,是複製物件(replication object)的集合稱為group

oracle replication group 的形式來管理複製。一個組可以包含多個模式的object

一個模式也可以有多個組中的object,但是每個replication object 都只能屬於一個

replication group

3) replication sites:複製站點,包含兩種型別,主體站點(master sites)和實

體化檢視站點(materialized view sites)。一個site 可以擔任一個replication

group 中的mater site 同時又擔任另外一個replication group 中的materialized

view site,注意必須是另外一個組,而不能是同一個replication group

4) scheduled links:一個資料庫連結(database link),包含一個由使用者定義的計劃,

來將需要更新的事務推到其它的master sites,當建立scheduled link 的時候,oracle

將在本地任務佇列中建立一個任務。

5) master definition site:主體定義站點,大部分的高階複製配置都需要在一個站

點上作,這個站點就是maserdef site

6. Replication 環境的幾種型別

1) Multimaster Replication

2) Materialized View Replication(也可以稱為是Single Master Replication

3) Multimaster and Materialized View Hybrid Configurations

Multimaster Replication Materialized View Replication 的區別在於:

前者必須是全表複製而後者可以是 master 表的一部分

前者允許在每一個 transaction 之後都進行復制,而後者是屬於批處理複製

兩者都使用 scheduled links 進行資料同步操作。

Materialized View Replication 中的materialized view 可能有以下幾種型別:

1) Read-Only Materialized Views:只讀的實體化檢視

2) Updatable Materialized Views:允許更新,同時允許將更新複製到master site

3) Writeable Materialized Views:允許更新,但是每次refresh 的時候,更新都會丟

7. 介紹 Multimaster Replication 中的複製方式

1) Asynchronous replication

在一個master 上發生的變化將在推後的時間內更新到其他的master 

2) Synchronous replication

在一個master 上發生的變化將立刻更新到其他的master 

3) Procedural replication

必須給每個site 上的包都生成一個wrapper,所有的資料變化應該透過包中的儲存

過程完成,當某個master 上的procedure 被呼叫,wapper 將保證其他site 中的存

儲過程也被呼叫(同步或者不同步)。將大量的資料操作放到一個procedure 中,

然後對於procedure 的呼叫將被同步,用處在於在於有大資料量操作的時候可以減

少網路負載。

、 MR 的概念和構架

MR 是Master Replication,也就是主體站點複製的概念,是高階複製區別於普通複製的一個

重要的功能。本章節對於MR 中出現的種種概念作詳細解釋。

MR 分為single master 和multi master 兩種。single master 指一個master site 支援多個

materialized view site,而multi master 則包含多個master site。

Multimaster Replication 也被稱為peer-to-peer 或者n-way replication,任何一個master

上發生的變化都將被送到其它的master 上。

1. 為什麼使用 Multimaster Replication。

Failover:當主資料庫發生問題的時候,可以透過配置Oracle Net 來實現automatic

connect-time failover,需要將客戶端的tnsnames.ora 中的FAILOVER_MODE 引數設定

為ON。同時在主資料庫正常的時候,其它的master site 仍然可以作為一個具有完全功

能的資料庫來支援其它業務,比如報表等。

Load Balancing::提供讀動態平衡以及更本地化的資料存取。

2. 比較 RAC(Oracle Real Application Clusters)和Advanced Replication

Load Balancing::高階複製提供讀動態平衡,而RAC 則提供讀寫動態平衡。因為每一

次寫操作都會在所有的replication site 上體現,所以高階複製不能提供寫動態平衡。

Survivability::高階複製提供更加強有力的災難恢復功能,因為高階複製環境中的各

個site 可以位於物理上的不同地點,而RAC 因為使用的是磁碟陣列或其他型別的並行系統,

所以通常在同一個物理地點。

Interoperability:高階複製可以在不同平臺和作業系統的Oracle 之間實現,而RAC

環境則必須執行在相同的平臺上。

3. Multimaster Replication Process

Asynchronous Replication:

說明:使用非同步複製能夠減少網路資源和硬體資源的消耗,但是不同的master sites 之間

會有一段時間不同步,並且可能會造成資料衝突。

以下描述非同步複製的過程:

1) 使用者執行 DML 操作或者執行replicated procedure 的wrapper,當一個table 被設

定為需要複製,那麼對於此表的任何DML 操作都會被捕獲並且複製到其他的

master site。對於每一行被插入,更新或者刪除的資料都將由一個內部觸發器來創

建一個deferred remote procedure call (RPC)並且放在deferred transaction queue

中,如果一個儲存過程被設定為需要複製並且它的wrapper 被執行,則這個

procedure call 被放置在transaction queue 中。由於內部觸發器是由Oracle 本身

內部維護的,所以可以以最小的系統資源消耗來很快地獲取需要複製的物件的變

化。

2) deferred transaction queue 中儲存著所有的deferred RPCs。每個site 都有一個事

務佇列,這個佇列可以被多個replication group 共用。

3) 在指定的間隔之後或者被手工呼叫,事務將被傳遞到其他的site,每個site 都可能

有不同的間隔。

4) 事務在這些 site 上被應用,如果出錯該事務將被放置到一個錯誤佇列中,以備DBA

檢查處理,如果出現資料衝突,衝突解決方法將被呼叫,如果衝突無法解決那麼將

被記錄在錯誤佇列中

5) 當事務在所有的 remote master sites 上被成功執行之後,並不會從源site 的事務

佇列中立刻刪除,刪除工作將由另外的purge job 來執行,此job 的執行間隔可以

由使用者來定義。

Synchronous Replication:

說明:同步複製始終在同一個 transaction 中完成,如果整個環境中的任何一個site 沒有成

功執行事務,那麼整個transaction 將被回滾,包括源site。這就保證了資料一致性。

以下描述同步複製的過程:

1) 使用者執行 DML 操作或者執行replicated procedure 的wrapper,操作被內部觸發器

立刻捕獲。

2) 事務被傳遞到其他 site 並且立刻執行,任何一個site 出錯,就回滾整個事務。

4. 衝突解決方案的概念

衝突的型別:更新衝突,唯一性衝突,刪除衝突。

當發生衝突的時候,衝突解決方法將被呼叫以解決衝突,如果無法解決,則被記錄到目

標站點的錯誤佇列中。記錄到錯誤佇列中的衝突只能由資料庫管理員手動解決。

為了實現衝突解決方案,可能會需要修改表結構,比如如果使用最新時間戳的解決方案,

那麼就應該在表中新增一個timestamp 列。

5. 配置高階複製的工具

1) 圖形介面:Oracle Enterprise Manager 提供了一個友好的GUI 介面用以配置高階復

制。

2) 命令列方式:Oracle 提供了一套replication management application programming

interface (API)來支援使用者編寫自定義的指令碼用以配置高階複製,這些API 是一系

列的PL/SQL packages。實際上GUI 介面的高階配置工具也是呼叫這些API 來完成

配置的。

注意點:

在高階複製環境中的對於需要複製的物件作任何 DDL 操作,都應該使用高階複製配置

工具來作,比如利用DBMS_REPCAT 包中的相應儲存過程。在有些場合下也可以用匯出

匯入(EXP/IMP)來建立複製物件。在SQL*PLUS 中直接執行的任何DDL 操作都不會被

複製到其它的site 上。

6. 高階複製中的幾個角色

Replication Administrator:預設名稱是repadmin,也可以修改。

Propagator:一個高階複製環境中可能有多個RA 來管理不同的schema,但是隻能有

一個propagator 將延遲處理事務佇列中的事務傳遞到目標站點。

Receiver :負責接收和處理從propagator 處傳來的延遲處理事務。可以透過

DBMS_REPCAT_ADMIN 包中REGISTER_USER_REPGROUP 儲存過程來註冊一個receiver。

7. Database Links

資料庫連結在高階複製環境中提供了資料傳送的通道,在一個MMR 環境中,如果有N

個Master Site,就會有N-1 個資料庫連結。在MVR 環境中,則只需要從實體化檢視站

點上到主站點的資料庫連結。如果使用設定嚮導來建立dblink,則會在USING 後面使用

連線描述字串,而不是連線服務名,這樣在對方資料庫發生變化的時候,就必須刪除重

建現有的dblink,所以我們應該手動設定dnlink,從而在USING 後面使用連線服務名。

這樣即使對方資料庫改變,我們也只需要修改tnsnames.ora 中的配置即可,而不需要

重建dblink。

8. 可以進行復制的物件

• Tables

當一個物件被複制到目標站點上時,複製支援不會自動生成。利用這個特點可以快速地

釋出一個標準的資料庫環境到另外的站點上。

• Indexes

作為約束的索引,當表在主站點上被建立的時候,會自動在複製站點上建立,但是對於

提高效能的索引則不會被自動建立而必須手動指定。對於索引被複制到目標站點之後,

等同於本地的索引,不需要再新增複製支援。

• Packages and Package Bodies

儲存過程中的所有引數必須是IN 的,OUT 和INOUT 不被支援。儲存過程和函式也必須

定義在包中,單獨的儲存過程和函式無法進行復制。

• Procedures and Functions

雖然單獨的儲存過程和函式無法進行復制,但是仍然可以在高階複製環境中利用複製來

將單獨的儲存過程和函式釋出到遠端的站點上,就像在遠端站點本地建立的一樣。

• User-Defined Types and Type Bodies

所有的使用者定義型別在所有的複製站點上都必須存在而且必須完全相同。

• Triggers

一個比較重要的應用就是在DML 操作的時候在表的timestmap 列中插入當前的系統時

間。為了防止觸發器被重複呼叫,必須要使用API 來判斷DML 操作是在本地發起的還

是透過高階複製傳遞過來的。如下例:

CREATE OR REPLACE TRIGGER hr.insert_time

BEFORE

INSERT OR UPDATE ON hr.employees FOR EACH ROW

BEGIN

IF DBMS_REPUTIL.FROM_REMOTE = FALSE THEN

:NEW.TIMESTAMP := SYSDATE;

END IF;

END;

• Views, Object Views, and Synonyms

只是簡單地複製到其它站點,不會產生任何內部觸發器或者包來監控這些被複制的物件

的改變。由於是複製物件,所以仍然可以使用高階複製工具或者API 來進行修改和刪除。

• Indextypes

必須手工指定複製。可以用高階複製工具或者CREATE_MASTER_REPOBJECT 儲存過程。

• User-Defined Operators

複製情況跟檢視,同義詞等相同,只是簡單的複製而已。

注意:高階複製不支援 sequence。如果想實現高階複製環境中的序列唯一性,可以有

以下幾種方法:

1. 使用 SELECT SYS_GUID() OID FROM DUAL;這樣將會產生全球唯一的GUID

2. 在序列前面新增站點名稱,比如唯一的 GLOBAL_NAME

3. 在各個複製站點規劃不會重複的序列,比如站點 A 的序列從1 開始,以10 遞增,

站點B 的序列從3 開始,以10 遞增。

9. 高階複製環境中的佇列

Oracle 利用Internal Triggers 來捕獲物件變化,並且生成RPCs(remote procedure calls),

RPCs 中包含目標站點上的internal procedure 的執行命令以及需要複製的資料,RPCs

儲存在deferred transaction queue 中,當一個RPC 到達目標站點,該站點上相應的

internal procedure 將被執行以應用RPC 來完成複製操作。

高階複製環境中的佇列包含 Deferred Transaction Queue,Error Queue 和Job Queue。

Job Queue 中包含的作業有三種:將延遲事務推到遠端主站點的作業,將已經應用過的

事務從延遲事務處理佇列中刪除的作業,重新整理實體化檢視更新組的作業。

10. 管理請求(Administrative Request)- 管理機制

什麼是管理請求?

在 DBA_REPCATLOG 檢視中檢視Administrative Requests 的狀態。當管理請求在所有的

主站點上成功執行以後,管理請求將從所有的主站點包括主體定義站點中的管理請求隊

列中,也就是DBA_REPCATLOG 檢視中刪除。

DBA_REPCATLOG 檢視中管理請求的幾種狀態:

1) READY:表示請求準備被執行。如果長時間處於該狀態,可以手動執行

DBMS_REPCAT.DO_DEFERRED_REPCAT_ADMIN 儲存過程來執行請求。

2) AWAIT_CALLBACK:這種狀態只會出現在主體定義站點上,表示正在等待

其它的主站點執行請求並且返回結果。

3) ERROR:表示請求執行錯誤

4) DO_CALLBACK:這種狀態只會出現在非主體定義站點上,表示要通知主體

定義站點請求執行的結果。

11. 主體組(Master Group)- 組織機制

在高階複製環境中,Oracle 用複製組來管理複製物件。而在多主體複製(multimaster

replication)環境中複製組就被稱為主體組(Master Group)。在不同的複製站點上的相

應主體組中必須包含相同的複製物件。

12. Column Groups - 組織機制

Column Group 是在衝突解決方案中扮演角色的多個欄位的集合。如果組中的某個欄位

引發了衝突,那麼其餘的欄位可以用來作解決這個衝突。打個比方,如果一個表的column

group 中包含price 和timestamp 欄位,那麼當啟用時間戳衝突解決方案(timestamp

conflict resolution routine)時,timestamp 欄位就可以用來解決price 欄位中發生的衝突。

可能剛開始的時候會想把表中的所有欄位都放入一個Column Group 中,這樣確實使配

置和管理都更簡單了些,但是卻會降低複製的效能並且可能會引發潛在的資料衝突。在

後面的效能機制部分,大家將會看到如果一個column group 中發生了衝突,那麼oracle

的最小化通訊功能(minimum communication feature)將不會從其它的column group

中傳遞來資料。所以將所有的欄位全部放入一個column group 將減弱最小化通訊功能

帶來的好處, 除非使用了DBMS_REPCAT 包中的SEND_OLD_VALUES 和

COMPARE_OLD_VALUES 儲存過程。在後面的衝突解決方案的概念和體系結構章節中將

會有更詳細的描述。

13. 傳播型別 - 傳播機制

非同步資料複製通常也被稱為:store-and-forward data replication

同步資料複製通常也被稱為:real-time data replication

由於同步複製採取的鎖機制,所以當同時更新同一行資料時,會產生死鎖的現象。當同

步更新一個複製表時,Oracle 首先鎖住本地行,然後使用一個AFTER ROW 觸發器來鎖

住遠端的行。當事務在所有的站點都提交之後,Oracle 才會解鎖。同步資料複製極為依

賴系統和網路的可用性,因為只要當複製環境中的所有站點都可用時,事務才能正常進

行。

混合模式的資料複製:

1) 假設建立了 A 是masterdef site,然後新增了B 為同步資料複製,再新增C 為

非同步複製,那麼此時AB 之間是同步,AC 和BC 之間都是非同步。

2) 假設建立了 A 是masterdef site,然後新增了C 為非同步資料複製,再新增B

為同步複製,那麼此時AB 和BC 之間是同步,AC 之間是非同步。

14. Initiating 方法- 展開機制

當使用同步複製的時候,DML 傳播被立刻處理並且被自動展開。

如果是使用非同步複製,那麼可以用下面的方法傳播延遲事務:

計劃作業:大部分場合,都是利用計劃作業在指定的時間間隔後自動傳播延遲事務。

手動傳播:如果不想等待計劃作業的自動傳播,也可以利用儲存過程或者複製管理工具

來手動傳播改動。

15. 並行傳播(Parallel Propagation) - 效能機制

16. 最小化通訊(Minimum Communication) - 效能機制

17. 延遲秒數(Delay Seconds) - 效能機制

上面三個引數(15,16,17 值得好好研究並且進行調整,以後會補齊這部分內容)

18. 複製保護機制:

在多主體複製環境中,Oracle 將保證就算發生錯誤的時候,事務傳播也不會丟失,同樣

同一個事務也不可能傳播兩次。

正確的傳播並不以為著延遲事務在遠端站點就正確執行了,可能因為無法解決的衝突或

者說遠端站點磁碟空間不足等原因延遲事務執行失敗,那麼這樣的錯誤將會記錄在遠端

站點的錯誤佇列中。

19. 資料傳播的依賴性維護

非並行傳播中,Oracle 按照本地站點的事務commit 順序來在遠端站點應用事務。而並

行傳播中,Oracle 則會記錄最新事務產生的SCN,如果存在事務之間的依賴性,那麼

Oracle 將先在遠端站點應用比這個SCN 小或者等於這個SCN 的事務,然後再應用這個

最新的事務,這是一個非並行的應用,只有當不存在事務依賴性的時候,才會真正利用

並行來應用延遲事務。

記錄 SCN 有兩種方式,一種是資料塊級別的,一種是行級別的。

當建立表的時候,如果使用了:

NOROWDEPENDENCIES,這是預設屬性,那麼Oracle 將會以資料塊級別方式來記錄

SCN。這樣儲存在同一個資料塊中的多行記錄都只會有一個最新的SCN,舊的會被新生

成的覆蓋。

ROWDEPENDENCIES,那麼將對錶中的每一行都記錄SCN。在同一個資料塊中的多

行記錄將分別保留自己的SCN,這樣每一行記錄都需要額外的6 個位元組的儲存空間。但

是這將提高並行傳播時應用延遲事務的效率。(使用這個特性,要求資料庫的初始化參

數中COMPATIBLE=9.0.1 或者更高)。可以使用以下SQL 來檢查那些表啟用了這個特性:

SQL> SELECT OWNER, TABLE_NAME FROM DBA_TABLES

WHERE DEPENDENCIES = 'ENABLED';

如果沒有使用ROWDEPENDENCIES,那麼我們可以設法讓事務依賴性最小,這樣來達

到提高複製環境應用效率的目的。比如我們可以建立多個freelist,這樣可以在大量insert

的時候將不同事務更新的資料放置到不同的資料塊中。

另外在程式設計的時候,我們也應該儘量避免大量的事務同時更新同一張小表的現象出

現,比如說有些應用會設計一張小表來模擬序列(Sequence),用以生成唯一的主鍵。

這樣就會迫使多個事務同時更新同一個資料塊。對於這種情況,我們應該改為使用

Sequence 並且快取Sequence 的生成。

20. 衝突解決機制

為了正確地偵測複製衝突,Oracle 必須能夠找到在不同的站點之間對於相關行的唯一標示。

這就要求在複製環境中,每個表都必須有主鍵,如果沒有主鍵,那麼也必須指定多個欄位的

組合來作為唯一標示。

Oracle 自己提供了以下幾種衝突解決方案:

1) Latest and Earliest Timestamp

2) Overwrite and Discard

3) Maximum and Minimum

4) Additive and Average

5) Timestamp

6) Priority Group

7) Site Priority

如果上述Oracle 提供的解決方案無法滿足應用的需求,那麼也可以利用PL/SQL 來編寫自定

義的衝突解決方案。

下面章節我們將進一步研究衝突解決方案。

五、物化檢視複製站點的具體實現與環境要求
主站點:rep.yangtingkun
物化檢視站點:yangtk.yangtingkun
主機名:yangtingkun
複製使用者:yangtk
1. 檢查初始化引數
複製對資料庫的初始化引數限制不多,主要注意兩點。
global_names TRUE 以及job_queue_process 大等0
分別在主站點和物化檢視站點執行下面兩條sqlplus 命令,檢查資料庫初始化引數是否符合
要求。
show parameter global_names
show parameter job
如果初始化引數設定的不滿足要求,可以透過下列語句動態修改。
alter system set global_names = true;
alter system set job_queue_processes = 20;
2. 檢查全域性資料庫名稱
兩個資料庫的db_domain 名稱應該相同,只有db_name 不同。
透過下列語句檢查主站點和物化檢視站點的全域性資料庫名
select * from global_name;
如果全域性資料庫名設定不符合規範,可以透過如下語句動態修改。
alter database rename global_name to rep.yangtingkun;
alter database rename global_name to yangtk.yangtingkun;
3. 修改tnsnames.ora 檔案,主站點和物化檢視站點的引數檔案中都新增下列內容
REP =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = yangtingkun)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rep)
)
)
YANGTK =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = yangtingkun)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = yangtk)
)
)
4. 建立主體站點
--system 使用者連線到主站點
CONN system@rep
--建立複製管理使用者repadmin 並授權
CREATE USER repadmin IDENTIFIED BY repadmin;
BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (username => 'repadmin');
END;
/
GRANT COMMENT ANY TABLE TO repadmin;
GRANT LOCK ANY TABLE TO repadmin;
GRANT SELECT ANY DICTIONARY TO repadmin;
--註冊傳播使用者並授權,這裡使用了管理使用者repadmin,也可以分別建立使用者
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'repadmin');
END;
/
--註冊接收使用者,這裡使用了管理使用者repadmin
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'repadmin',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
--建立物化檢視站點複製管理員的代理使用者,出於簡單考慮,這裡也使用repadmin 使用者
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'repadmin',
privilege_type => 'proxy_snapadmin',
list_of_gnames => NULL);
END;
/
--設定代理重新整理使用者,並授權,這裡仍然使用repadmin 使用者
--對於repadmin 而言,不需要create session 許可權
--但是這裡如果新建使用者的話,create session 許可權則是必須的
GRANT CREATE SESSION TO repadmin;
GRANT SELECT ANY TABLE TO repadmin;
--設定清除延遲序列的job
--以複製管理員身份登陸到主站點
CONNECT repadmin/repadmin@rep
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
delay_seconds => 0);
END;
/
commit;
--多主站點的設定還需要多個站點間建立資料庫鏈並建立排程機制
--但是對於物化檢視複製的主體站點,則這些設定是不需要的
5. 設定物化檢視站點
--system 使用者連線到物化檢視站點
CONN system@yangtk
--建立物化檢視管理員,並授權
CREATE USER mvadmin IDENTIFIED BY mvadmin;
BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (
username => 'mvadmin');
END;
/
GRANT COMMENT ANY TABLE TO mvadmin;
GRANT LOCK ANY TABLE TO mvadmin;
GRANT SELECT ANY DICTIONARY TO mvadmin;
--建立傳播者,並授權,這裡使用mvadmin 使用者,也可以建立單獨的使用者
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'mvadmin');
END;
/
--建立重新整理者,並授權,這裡使用mvadmin 使用者重新整理物化檢視
--對於mvadmin 而言,不需要create session 許可權
--但是這裡如果新建使用者的話,create session 許可權則是必須的
GRANT CREATE SESSION TO mvadmin;
GRANT ALTER ANY MATERIALIZED VIEW TO mvadmin;
--註冊接受者
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'mvadmin',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
--建立PUBLIC 資料庫鏈
CREATE PUBLIC DATABASE LINK rep.yangtingkun USING 'rep';
--建立到主站點上代理物化檢視管理員的資料庫鏈
--以物化檢視管理員身份連線到物化檢視站點
CONNECT mvadmin/mvadmin@yangtk
CREATE DATABASE LINK rep.yangtingkun CONNECT TO repadmin IDENTIFIED BY
repadmin;
--建立到主站點上覆制管理員的資料庫鏈
--以傳播者身份登陸物化檢視站點
--在本例中,這個資料庫鏈與上面的資料庫鏈相同,故省略。
--設定清除延遲序列的job
--如果物化檢視站點只包括只讀物化檢視,這一步可以省略
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
delay_seconds => 0,
rollback_segment => '');
END;
/
--設定將修改推入到主站點的job
--如果物化檢視站點只包括只讀物化檢視,這一步可以省略
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => 'rep.yangtingkun',
interval => 'SYSDATE + 1/24',
next_date => SYSDATE,
stop_on_error => FALSE,
delay_seconds => 0,
parallelism => 0);
END;
/
--如果需要此物化檢視站點作為主物化檢視站點
--則還需要建立物化檢視站點的代理物化檢視管理使用者以及代理重新整理使用者
--本例中從略
commit;
6. 建立主體組
--以複製管理員身份登陸複製站點
CONNECT repadmin/repadmin@rep
--建立名為rep_test 的複製組
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP (
gname => 'rep_test');
END;
/
--將複製物件增加到複製組中
--主鍵所用的索引自動複製,其他索引需要明確新增到複製組中
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'rep_test',
type => 'TABLE',
oname => 'test_rep',
sname => 'yangtk',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'rep_test',
type => 'INDEX',
oname => 'ind_test_rep_name',
sname => 'yangtk',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
--生成複製支援
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => 'yangtk',
oname => 'test_rep',
type => 'TABLE',
min_communication => TRUE);
END;
/
--開始複製
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => 'rep_test');
END;
/
commit;
7. 建立物化檢視
--以複製使用者連線到主站點
CONNECT yangtk@rep
--建立物化檢視日誌表,FAST 重新整理方式必須要求建立物化檢視日誌,COMPLETE 則不需要
CREATE MATERIALIZED VIEW LOG ON yangtk.test_rep;
--如果被複制使用者不存在則建立,並授予相應許可權
--本例中,使用者已存在,此步驟省略
/*
CONNECT system@yangtk
CREATE USER yangtk IDENTIFIED BY yangtk;
ALTER USER yangtk DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
ALTER USER yangtk TEMPORARY TABLESPACE temp;
GRANT
CREATE SESSION,
CREATE TABLE,
CREATE PROCEDURE,
CREATE SEQUENCE,
CREATE TRIGGER,
CREATE VIEW,
CREATE SYNONYM,
ALTER SESSION,
CREATE MATERIALIZED VIEW,
ALTER ANY MATERIALIZED VIEW,
CREATE DATABASE LINK
TO yangtk;
*/
--建立複製使用者到主站點代理重新整理者的資料庫鏈
CONNECT yangtk@yangtk
CREATE DATABASE LINK rep.yangtingkun CONNECT TO repadmin IDENTIFIED BY
repadmin;
--建立物化檢視組
--以物化檢視管理員身份登陸物化檢視站點
CONNECT mvadmin/mvadmin@yangtk
--物化檢視組必須和複製站點上的複製組名稱相同
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPGROUP (
gname => 'rep_test',
master => 'rep.yangtingkun',
propagation_mode => 'ASYNCHRONOUS');
END;
/
--建立重新整理組
--對於只包含只讀物化檢視的站點,不需要此步驟
BEGIN
DBMS_REFRESH.MAKE (
name => 'mvadmin.rep_refresh',
list => '',
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
implicit_destroy => FALSE,
rollback_seg => '',
push_deferred_rpc => TRUE,
refresh_after_errors => FALSE);
END;
/
--建立物化檢視
--對於只讀物化檢視,省略FOR UPDATE 語句
CREATE MATERIALIZED VIEW yangtk.test_rep
REFRESH FAST WITH PRIMARY KEY FOR UPDATE
AS SELECT * FROM yangtk.test_rep@rep.yangtingkun;
--將物化檢視新增到物化檢視組
--對於只讀物化檢視,此步驟可以省略
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPOBJECT (
gname => 'rep_test',
sname => 'yangtk',
oname => 'test_rep',
type => 'SNAPSHOT',
min_communication => TRUE);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPOBJECT (
gname => 'rep_test',
sname => 'yangtk',
oname => 'ind_test_rep_name',
type => 'INDEX',
min_communication => TRUE);
END;
/
--將物化檢視新增到重新整理組
BEGIN
DBMS_REFRESH.ADD (
name => 'mvadmin.rep_refresh',
list => 'yangtk.test_rep',
lax => TRUE);
END;
/
commit;
8. 主物件上建立物件指令碼
create table test_rep (id number not null, name varchar2(100));
alter table test_rep add constraint pk_test_rep primary key (id);
create index ind_test_rep_name on test_rep (name);
insert into test_rep values (1, 'ytk');
insert into test_rep values (2, 'zhly');
commit;

六、問題與難點總結:

1,將快照加入快照組

EXECUTE DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT(gname => '複製組名', sname => '遠端使用者', oname => '遠端表名', type => 'SNAPSHOT',min_communication => FALSE);

sname 實現資料庫複製的使用者名稱稱

oname 實現資料庫複製的資料庫物件名稱

(表名長度在27個位元組內,程式包名長度在24個位元組內)

type 實現資料庫複製的資料庫物件類別

(支援的類別:表,索引,同義詞,觸發器,檢視,過程,函式,程式包,程式包體)

use_existing_object true表示用主複製節點已經存在的資料庫物件

gname 主複製組名

2,檔案位置說明:

D:\oracle\product\10.2.0\db_1\srvm\admin\init.ora ------job_queueprocesses = 10  open_links=8

exec dbms_repcat.drop_master_repgroup(gname=>'rep_test',all_sites=>true);

select gname,master,status from dba_repgroup;

select sname,oname,status,gname from dba_repobject;

3,問題解決方案:

SQL> exec DBMS_REPCAT.CREATE_MVIEW_REPGROUP (gname => 'rep_test',master => 'master.com',propagation_mode => 'ASYNCHRONOUS');

begin DBMS_REPCAT.CREATE_MVIEW_REPGROUP (gname => 'rep_test',master => 'master.com',propagation_mode => 'ASYNCHRONOUS'); end;

ORA-06550: 第 第 

PLS-00201: 必須宣告識別符號 'DBMS_REPCAT'

ORA-06550: 第 第 

PL/SQL: Statement ignored

解決方案:grant execute on dbms_repcat to mvadmin;

註釋:mvadmin:為要得到許可權的使用者名稱稱。

具體總結:

System使用者下:執行grant execute on 包名 to 使用者名稱;

說明:

   包名:要使用的包名;如:dbms_repcat

   使用者名稱:要使用此包的使用者。如:mvadmiv

舉例:grant execute on dbms_repcat to mvadmiv;

4,有些步驟需要一下許可權:

grant select any table to mvadmin;

grant execute any procedure to mvadmin;

grant comment any table to repadmin;

5,定義時間網站

6,問題解決方案:

ORA-02085: 資料庫連結 DBLINK_ANSON.COM 連線到 SNAP.COM

解決方案:當global_name引數設定為true,則dblink必須命名為和在目標資料庫如下查詢出的結果一致:

 select * from global_name,例如:

在目標資料庫執行查詢:

SQL>  select * from global_name;

GLOBAL_NAME

--------------------------------------------------------------------------------

Mydb

SQL> 

則修改dblink

 create database link mydb  connect to myuser identified by pass  using 'mydb2';

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/zhpsam109/archive/2006/05/13/727314.aspx

7,文章中的專業詞彙翻譯

scheduled links:預計連線

replication:複製

site:位置

wapper:打包

MR Master Replication:主複製

peer-to-peer:對等網路

Failover:失效備援

replicated proc:複製程式

deferred:延期

deferred remote procedure call (RPC):延遲遠端過程呼叫

remote:遠端的

purge:清除

8, Replication 環境的幾種型別

1) Multimaster Replication

2) Materialized View Replication(也可以稱為是Single Master Replication

3) Multimaster and Materialized View Hybrid Configurations

Multimaster Replication Materialized View Replication 的區別在於:

前者必須是全表複製而後者可以是 master 表的一部分

前者允許在每一個 transaction 之後都進行復制,而後者是屬於批處理複製

兩者都使用 scheduled links 進行資料同步操作。

9Oracle RAC

     是Oracle Real Application Cluster的簡寫,官方中文文件一般翻譯為“真正應用叢集”,它一般有兩臺或者兩臺以上同構計算機及共享儲存裝置構成,可提供強大的資料庫處理能力,現在是Oracle 10g Grid應用的重要組成部分。

10timestamp(時間戳)DATE資料型別的主要問題

     是它粒度不能足夠區別出兩個事件哪個先發生。ORACLE已經在DATE資料型別上擴充套件出來了TIMESTAMP資料型別,它包括了所有DATE資料型別的年月日時分秒的資訊,而且包括了小數秒的資訊。如果你想把DATE型別轉換成TIMESTAMP型別,就使用CAST函式。

SQL> SELECT CAST(date1 AS TIMESTAMP) "Date" FROM t;

個人總結:

經過了斷斷續續的九天時間,實驗失敗了5次,最後終於成功了。

在這個過程中使我對Oracle資料庫有了更近一步的瞭解。1Oracle資料庫在許可權方面力度很細;2Oracle廠商提供了大量的儲存過程與函式共開發人員使用,功能很強大,但是也加大了開發人員熟練掌握的難度;3,Oracle在複製方面其內部使用了大量的觸發器;4Oracle本身所具有的圖形化介面沒有SQL Server的直觀、易用;5Oracle的儲存結構上與其他資料庫相比更加的透明,為後期的其它新功能提供了強大的架構支援與擴充套件性。

解決問題的能力有所提高。1,我個人認為大多數的,經過公開的最佳實踐。如果在你嘗試使用時所出現了問題,大多數在網上都能找到對應的解決方案。尤其是國外的網站解決方案更多。2,人際交流方面。有時在遇到問題時,經過自己的思考,在網上查詢資料都找不到答案的話,我就請教身邊的同事,一般情況下他們都能幫助我解決。總之,現代的軟體工程是一個在各個領域都比較穩定、成熟,同時又充滿新的需求與限制的時代。所以在每個領域內部都有其最佳實踐。因為我們每個人所掌握的程度都不一樣,所以說技術分享就成了軟體製作中的關鍵所在。但是前提是我們每個人都要善於分享與交流。只有這樣我們每一個人才會更快更好的發展。

以上的解決方案可能不是最好的,但是我會在得到專案的具體需求後,在選擇一種更好的解決方案。

最後,祝經理您以及您的家人身體健康,新年快樂!

                                             

                                            關成龍

                                        20100209

                  



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1215820/,如需轉載,請註明出處,否則將追究法律責任。

相關文章