SQL> select name,open_mode,database_role,protection_mode from v$database;
Physical備庫
由于邏輯Standby是通過SQL應用來保持與Primary數據庫的同步。SQL應用與REDO應用是有很大的區別,REDO應用實際上是在物理Standby端進行RECOVER;SQL應用則是分析重做日志文件中的REDO信息,并將其轉換為SQL語句,在邏輯Standby端執行,因此需要確認操作的對象和語句是否能被邏輯Standby支持。
SQL> SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;
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';
注意BAD_COLUMN列值,該列有兩個值:
Y :表示該表中有采用大數據類型的字段,比如LONG啦,CLOB啦之類。如果表中除log列某些行記錄完全匹配,則該表無法成功應用于邏輯standby。standby會嘗試維護這些表,不過你必須保證應用不允許。
N :表示該表擁有足夠的信息,能夠支持在邏輯standby的更新,不過仍然建議你為該表創建一個主鍵或者唯一索引/約束以提高log應用效率。
假設在某張表中你可以確認數據是唯一的,但是基于效率方面的考慮,不想為其創建主鍵或唯一約束,怎么辦呢?沒關系,Oracle早想到了這一點,你可以創建一個DISABLE的Primary-Key Rely約束。
Add a disabled primary-key RELY constraint.(摘自君三思)
維護邏輯standby與primary的數據庫同步是通過sql應用實現,SQL應用轉換的SQL語句在執行時,對于insert還好說,對于update,delete操作則必須能夠唯一定位到數據庫待更新的那條記錄。如果primary庫中表設置不當,可能就無法確認唯一條件。所以,Oracle 建議為表創建一個主鍵或非空的唯一索引/約束,以盡可能確保sql應用能夠有效應用redo數據,更新邏輯standby數據庫。
如果能夠確認表中的行是唯一的,那么可以為該表創建rely的主鍵,RELY約束并不會造成系統維護主鍵的開銷,主你對一個表創建了rely約束,系統則會假定該表中的行是唯一,這樣能夠提供sql應用時的性能。但是需要注意,由于rely的主鍵約束只是假定唯一,如果實際并不唯一的話,有可能會造成錯誤的更新喲。
創建rely的主鍵約束非常簡單,只要在標準的創建語句后加上RELY DISABLE即可,例如:
SQL> ALTER TABLE mytab ADD PRIMARY KEY (id, name) RELY DISABLE;
注 意:創建了Rely約束后,Oracle會假定該列是唯一的(給DBA足夠的信任),不過并不會對該列的值進行唯一性的驗證,因此該列是否唯一只能由DBA來主動維護。
參詳物理standby創建
Physical備庫切換到logical備庫,需要在primary庫構建LogMiner字典及開啟supplemental日志,在這之前應先停用physical備庫的MRP進程,以避免提前應用含LogMiner字典的REDO數據,造成轉換為邏輯Standby后,SQL應用時沒有LogMiner字典數據的REDO數據而影響到邏輯Standby與Primary的正常同步。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
備庫恢復傳輸redo:
SQL> recover managed standby database disconnect from session;
一是將主庫LOG_ARCHIVE_DEST_1參數中的VALID_FOR屬性改為僅僅聯機重做日志有效,而不包括備用重做日志。當primary為主庫時,用于存放primary產生的arch,當primary被切換為備庫角色后,用于存放自身作為備庫產生的歸檔。
LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary'
二是專門為備用重做日志添加一個新的歸檔路徑LOG_ARCHIVE_DEST_3,也就是說聯機日志與備用日志分開,僅當primary庫轉為備庫時有效,當primary庫為備庫角色時,用于存放從primary庫接收到的STANDBY_LOGFILES。
LOG_ARCHIVE_DEST_3='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=primary' LOG_ARCHIVE_DEST_STATE_3=ENABLE
生成LogMiner字典,這樣redo日志中的變化才能被LogMiner字典的SQL Apply組件正確解析。
SQL> EXECUTE DBMS_LOGSTDBY.BUILD;
另外主鍵和唯一約束/索引列的supplemental日志是自動生成的,The supplemental logging information ensures each update contains enough information to logically identify each row that is modified by the statement.對于11.2以上的版本,supplemental日志會隨primary庫傳至physical備庫,而這之前的版本需要檢查primary庫與physical 備庫是否生成supplemental日志,如果沒有則主庫通過如下語句生成,然后再執行switchover 或 failover傳至physical 備庫。
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;
若physical備庫為RAC模式,則需先進行:
SQL> ALTER SYSTEM SET CLUSTER_DATABASE=FALSE SCOPE=SPFILE; SQL> SHUTDOWN ABORT; SQL> STARTUP MOUNT EXCLUSIVE;
轉physical備庫為logical備庫:
SQL> ALTER DATABASE RECOVER TO LOGICAL STANDBY db_name;
SQL> SHUTDOWN; SQL> STARTUP MOUNT; LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby'
與physical備庫所不同的是,logical備庫被open后會產生自己的重做日志(redo),因此我們需要配置參數LOG_ARCHIVE_DEST_n。對于邏輯備庫,此時存在三種日志文件,即online redo log,archived redo log,standby redolog。
LOG_ARCHIVE_DEST_3='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=standby'; LOG_ARCHIVE_DEST_STATE_3=ENABLE
SQL> ALTER DATABASE OPEN RESETLOGS;
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
SQL> select name,open_mode,database_role,protection_mode from v$database;
Primary庫NN用戶T1表插入數據
Logical standby庫查詢
至此,ORACLE 11G 之DATAGUARD搭建邏輯standby成功!
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com