Oracle 10g 物理standby轉為邏輯standby
1.配置邏輯Standby 的準備工作
在建立邏輯standby之前,首先檢查primary資料庫的狀態,確保primary資料庫已經為建立邏輯standby做好了全部準備工作,比如說是否啟動了歸檔是否啟用了forced logging等,這部分可以參考建立物理standby時的準備工作,除此之外呢,由於邏輯standby是通過sql應用來保持與primary資料庫的同步,sql應用與redo應用是有很的大區別,redo應用實際上是物理standby端進行recover,sql應用則是分析redo檔案將其轉換為sql語句在邏輯standby端執行,
1)檢查資料庫是否有不被邏輯standby支援的對象,如下:
SQL> SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;
OWNER TABLE_NAME COLUMN_NAME DATA_TYPE ATTRIBUTES
---------- -------------------- -------------------- -------------------- --------------------
SH MVIEW$_EXCEPTIONS BAD_ROWID ROWID
OE CUSTOMERS CUST_ADDRESS CUST_ADDRESS_TYP
OE CUSTOMERS PHONE_NUMBERS PHONE_LIST_TYP
OE CUSTOMERS CUST_GEO_LOCATION SDO_GEOMETRY
OE WAREHOUSES WAREHOUSE_SPEC XMLTYPE
OE WAREHOUSES WH_GEO_LOCATION SDO_GEOMETRY
PM ONLINE_MEDIA PRODUCT_AUDIO ORDAUDIO
PM ONLINE_MEDIA PRODUCT_TESTIMONIALS ORDDOC
PM ONLINE_MEDIA PRODUCT_PHOTO ORDIMAGE
PM ONLINE_MEDIA PRODUCT_PHOTO_SIGNATURE ORDIMAGESIGNATURE
PM ONLINE_MEDIA PRODUCT_THUMBNAIL ORDIMAGE
PM ONLINE_MEDIA PRODUCT_VIDEO ORDVIDEO
PM PRINT_MEDIA AD_TEXTDOCS_NTAB TEXTDOC_TAB
PM PRINT_MEDIA AD_GRAPHIC BFILE
PM PRINT_MEDIA AD_HEADER ADHEADER_TYP
OE CATEGORIES_TAB CATEGORY_NAME VARCHAR2 Object Table
OE CATEGORIES_TAB CATEGORY_DESCRIPTION VARCHAR2 Object Table
OE CATEGORIES_TAB CATEGORY_ID NUMBER Object Table
OE CATEGORIES_TAB PARENT_CATEGORY_ID NUMBER Object Table
19 rows selected.
批註:關於DBA_LOGSTDBY_UNSUPPORTED 該視圖顯示包含不被支援的資料類型的表的列名及該列的資料類型,注意該視圖的ATTRIBUTES列,列值會顯示表不被sql應用支援的原因。
在CentOS 6.4下安裝Oracle 11gR2(x64)
Oracle 11gR2 在VMWare虛擬機器中安裝步驟
Debian 下 安裝 Oracle 11g XE R2
Oracle 11g從入門到精通 PDF+光碟片原始碼
RHEL6 ASM方式安裝Oracle 11g R2
2)維護邏輯standby與primary的資料庫同步是通過sql應用實現,SQL應用轉換的SQL語句在執行時,對於insert還好說,對於update,delete操作則必須能夠唯一定位到資料庫待更新的那條記錄,問題就在這裡,如果primary庫中表設定不當,可能就無法確認唯一條件,邏輯standby跟物理standby的區別,就是因為它只是邏輯上與primary資料庫相同,物理上可能與primary資料庫存在相當大差異,一定要認識到,邏輯standby的物理結構與primary是不相同的(即使初始邏輯standby是通過primary的備份建立),因此想通過rowid更新顯然是不好使的,就不能再將其做為唯一條件,可以通過以下的方法來解決:
如何確保primary庫中各表的行可被唯一標識
Oracle 通過主鍵、唯一索引/約束補充日誌(supplemental logging)來確定待更新邏輯standby庫中的行,當資料庫啟用了補充日誌(supplemental logging)每一條update語句寫redo的時候會附加列值唯一資訊,比如:
如果表定義了主鍵,則主索引值會隨同被更新列一起做為update語句的一部分,以便執行時區別哪些列應該被更新;
如果沒有主鍵,則非空的唯一索引/約束會隨同被更新列做為update語句的一部分,以便執行時區分哪些列應該被更新,如果該表有多個唯一索引/約束,則oracle自動選擇最短的那個;
如果表即無主鍵,也沒有定義唯一索引/約束,所有可定長度的列連同被更新列作為update語句的一部分,更明確的話可定長度的列是指那些除:long,lob,long raw,object type,collection類型外的列;
確定在主要資料庫上,補充日誌是否被啟用,可以查詢v$database,如下:SQL> select SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUP SUP SUPPLEME
--- --- --------
NO NO NO
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.
SQL> select SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUP SUP SUPPLEME
--- --- --------
NO NO YES
批註:SUPPLEMENTAL_LOG_DATA_MIN=YES和IMPLICIT都表示資料庫啟動了最小化的補充日誌。YES表示通過ALTER DATABASE ADD SUPPLEMENTAL LOG DATA語句啟動的最小化補充日誌;如果啟動了對主鍵、唯一鍵、外鍵、ALL的補充日誌,預設情況下都會開啟最小化的補充日誌,IMPLICIT表示的是通過啟動對主鍵、唯一鍵、外鍵或者ALL的支援而開啟的最小化補充日誌。
因此,Oracle 建議你為表建立一個主鍵或非空的唯一索引/約束,以儘可能確保sql應用能夠有效應用redo資料更新邏輯standby資料庫。
3)執行下列語句檢查sql應用能否唯一識別表列,找出不被支援的表:
SQL> SELECT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_NOT_UNIQUE
2 WHERE (OWNER, TABLE_NAME) NOT IN
3 (SELECT DISTINCT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED)
4 AND BAD_COLUMN = 'Y';
OWNER TABLE_NAME
------------------------------ ------------------------------
TSMSYS SRS$ --這是一張系統資料表,首先查看該使用者是否可以登入,如果是鎖定狀態,我們就無需設定它
SQL> select username,account_status from dba_users where username like '%TSMSYS%';
USERNAME ACCOUNT_STATUS
------------------------------ --------------------------------
TSMSYS EXPIRED & LOCKED
批註:DBA_LOGSTDBY_NOT_UNIQUE 該視圖顯示包含不被支援的資料類型,即既沒有主鍵,也沒有唯一索引的表,如果表中的列包括足夠多的資訊通常也可支援在邏輯standby的更新,不被支援的表通常是由於列的定義包含了不支援的資料類型。
對於BAD_COLUMN 列值有兩個:
Y:表示該表中有採用大資料類型的欄位,比如LONG,CLOB,如果表中除log列某些行記錄完全符合,則該表無法成功應用於邏輯standby,standby會嘗試維護這些表,不過你必須保證應用不允許;
N:表示該表擁有足夠的資訊,能夠支援在邏輯standby的更新,不過仍然建議你為該表建立一個主鍵或者唯一索引/約束以提高log應用效率;
4)假設某張表你可以確認資料是唯一的,但是因為效率方面的考慮,不想為其建立主鍵或唯一約束,怎麼辦呢,沒關係,oracle想到了這一點,你可以建立一個disable的primary-key rely約束:
關於primary-key RELY約束:
如果你能夠確認表中的行是唯一的,那麼可以為該表建立rely的主鍵,RELY約束並不會造成系統維護主鍵的開銷,如果你對一個表建立了rely約束,系統則會假定該表中的行是唯一,這樣能夠提供sql應用時的效能,但是需要注意,由於rely的主鍵約束只是假定唯一,如果實際並不唯一的話,有可能會造成錯誤的更新。
建立rely的主鍵約束非常簡單,只要在標準的建立語句後加上RELY DISABLE即可,樣本如下:
SQL> ALTER TABLE mytab ADD PRIMARY KEY (id, name) RELY DISABLE; --表mytab為我要建立rely主鍵約束的表名
更多詳情見請繼續閱讀下一頁的精彩內容: