相對物理Standby,邏輯Standby的管理要複雜一點點。這個就是管理一個半資料庫和管理兩個資料庫的差異(假設Data Guard環境為一主一備的情況下),畢竟邏輯Standby只是邏輯上,彷彿與Primary資料庫一致,其實它是一個獨立啟動並執行,甚至可能與Primary資料庫完全不同的資料庫系統,對於這種配置環境,管理上多花點工夫想想也是應該的。
推薦閱讀:
Data Guard 配置 Standby Redo Log
RMAN duplicate for Standby失敗解決過程
Data Gurad物理備份方式下以READ ONLY/WRITE模式開啟物理Standby
RAC primary+Single Standby DG配置實踐
Oracle Standby 策略 PPT
1、指定對象跳過應用
在預設情況下,接收自Primary的REDO資料中,所有能夠被邏輯Standby資料庫支援的操作都會在邏輯Standby端執行。如果你希望跳過對某些對象的某些操作的話,DBMS_LOGSTDBY.SKIP就能派上用場了。
先來看看DBMS_LOGSTDBY.SKIP的文法:
DBMS_LOGSTDBY.SKIP (
stmt IN VARCHAR2,
schema_name IN VARCHAR2 DEFAULT NULL,
object_name IN VARCHAR2 DEFAULT NULL,
proc_name IN VARCHAR2 DEFAULT NULL,
use_like IN BOOLEAN DEFAULT TRUE,
esc IN CHAR1 DEFAULT NULL);
除stmt外,其他都是選擇性參數,並且看字面意義就能明白其所指。例如,你想跳過SCOTT使用者下對dept表的DML操作,可以通過執行下列語句實現(執行該過程前需要先停止REDO應用):
SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
Database altered.
SQL> EXEC DBMS_LOGSTDBY.SKIP('DML', 'SCOTT', 'DEPT');
PL/SQL procedure successfully completed.
SQL>ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
Database altered.
2、恢複對象同步
如果邏輯Standby中的某些表取消了與Primary的同步維護,現在希望再恢複同步,沒問題,DBMS_LOGSTDBY家大業大,它還有個叫UNSKIP的門生專幹這個。
我們來看一下DBMS_LOGSTDBY.UNSKIP的文法:
DBMS_LOGSTDBY.UNSKIP (
stmt IN VARCHAR2,
schema_name IN VARCHAR2,
object_name IN VARCHAR2);
三項均為必選參數,各參數的定義與SKIP過程相同。
下面示範恢複tmp1表的同步。
首先查看當前邏輯Standby都有哪些對象處於不同步狀態,可以通過DBA_LOGSTDBY_SKIP視圖查看,例如:
SQL> select * from dba_logstdby_skip;
ERROR STATEMENT_OPT OWNER NAME U E PROC
----- ------------------------------ ---------- ----- - - ----------
N DML SCOTT DEPT Y
N INTERNAL SCHEMA SYSTEM % Y
N INTERNAL SCHEMA SYS % Y
N INTERNAL SCHEMA OLAPSYS % Y
N INTERNAL SCHEMA SI_INFORMT % Y
N INTERNAL SCHEMA MGMT_VIEW % Y
N INTERNAL SCHEMA ORDPLUGINS % Y
N INTERNAL SCHEMA XDB % Y
N INTERNAL SCHEMA SYSMAN % Y
N INTERNAL SCHEMA WMSYS % Y
N INTERNAL SCHEMA DBSNMP % Y
注意在執行DBMS_LOGSTDBY.UNSKIP過程前,要停止當前的SQL應用狀態:
SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
Database altered.
執行DBMS_LOGSTDBY.UNSKIP過程,恢複前面停止的scott.tmp1表的應用:
SQL> execute dbms_logstdby.unskip('DML', 'SCOTT', 'dept');
PL/SQL procedure successfully completed.
3、添加或重建對象
指定對象跳過應用雖然被取消,但是有可能在此期間由於Primary資料庫做過資料修改,兩端此時已經不同步,如果Standby端繼續應用極有可能導致應用錯誤的資料。
對於這類情況,Oracle也早有預見,DBMS_LOGSTDBY包中還有一個過程叫INSTANTIATE_TABLE,專門用來同步一下跳過的對象,以保持與Primary資料庫的一致。
DBMS_LOGSTDBY.INSTANTIATE_TABLE的調用文法如下:
DBMS_LOGSTDBY.INSTANTIATE_TABLE (
schema_name IN VARCHAR2,
table_name IN VARCHAR2,
dblink IN VARCHAR2);
除了SCHEMA名稱和表名稱外,還需要提供一個資料庫鏈,因此這裡我們首先在邏輯Standby端建立一個串連Primary資料庫的資料庫鏈:
SQL> CREATE DATABASE LINK PRE_TBL_DATA CONNECT TO SYSTEM IDENTIFIED BY ADMIN
USING 'ORCL_PD';
Database link created.
執行使用DBMS_LOGSTDBY.INSTANTIATE_TABLE過程,重新同步SCOTT.TMP1表(注意執行該過程前別忘了暫停當前的SQL應用):
SQL>EXEC DBMS_LOGSTDBY.INSTANTIATE_TABLE('SCOTT', 'DEPT', 'PRE_TBL_DATA');
PL/SQL procedure successfully completed.
SQL> SELECT * FROM SCOTT.DEPT;
對象已被重建,然後重新啟動SQL應用即可:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
Database altered.