邏輯Data Guard的物件操作

靜以致遠√團團發表於2014-03-11

邏輯Data Guard的物件管理

一、指定物件跳過應用
使用DBMS_LOGSTDBY.SKIP

stmt  IN VARCHER2,

schema_name IN VARCHER2 DEFAULT NULL,

object_name IN VARCHER2 DEFAULT NULL,

proc_name IN VARCHER2 DEFAULT NULL,

use_like IN BOOLEAN DEFAULT TURE,

esc IN CHAR1 DEFAULT NULL

比如要跳過SCOTT使用者下對DG_TESTDML操作

 

指定跳過物件之前需關閉SQL應用

SQL> alter database stop logical standby apply;

Database altered.

 

SQL> exec dbms_logstdby.skip(stmt => 'DML',schema_name => 'SCOTT', object_name => 'DG_TEST');

 

PL/SQL procedure successfully completed.

 

SQL> select OWNER,STATEMENT_OPT,NAME,USE_LIKE from dba_logstdby_skip;

 

OWNER                STATEMENT_OPT       NAME       USE_LIKE

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

SCOTT                 DML                   DG_TEST    Y

SYSTEM               INTERNAL SCHEMA     %           Y

SYS                   INTERNAL SCHEMA      %           Y

OLAPSYS              INTERNAL SCHEMA      %          Y

BI                     INTERNAL SCHEMA      %          Y

SI_INFORMTN_SCHEMA  INTERNAL SCHEMA     %          Y

MGMT_VIEW           INTERNAL SCHEMA      %          Y

 

SQL> alter database start logical standby apply immediate;

Database altered.

 

此時在primary端插入測試資料:

 

PRIMARY > select count(*) from scott.dg_test;

 

  COUNT(*)

----------

         8

PRIMARY > insert into scott.dg_test

  2  select * from scott.dg_test

  3  /

8 rows created.

 

PRIMARY > commit;

Commit complete.

 

PRIMARY > select count(*) from scott.dg_test;

  COUNT(*)

----------

        16

 

standby端檢視該DML操作將跳過應用

 

SQL> select count(*) from scott.dg_test;

  COUNT(*)

----------

         8

 

二、取消物件跳過應用

使用DBMS_LOGSTDBY.UNSKIP

stmt     IN VARCHAR2,

schema_name     IN VARCHAR2,

object_name     IN VARCHAR2

 

SQL> select OWNER,STATEMENT_OPT,NAME,USE_LIKE from dba_logstdby_skip;

 

OWNER                STATEMENT_OPT        NAME       USE_LIKE

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

SCOTT                 DML                    DG_TEST    Y

SYSTEM               INTERNAL SCHEMA      %          Y

 

具體步驟:

SQL> alter database stop logical standby apply;

Database altered.

 

SQL> exec dbms_logstdby.unskip('DML','SCOTT','DG_TEST');

PL/SQL procedure successfully completed.

 

SQL> select OWNER,STATEMENT_OPT,NAME,USE_LIKE from dba_logstdby_skip;

OWNER                STATEMENT_OPT        NAME       USE_LIKE

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

SYSTEM               INTERNAL SCHEMA      %          Y

SYS                   INTERNAL SCHEMA      %          Y

SQL> alter database start logical standby apply immediate;

Database altered.

 

再次在primary端插入資料看一些效果:

 

PRIMARY > select count(*) from scott.dg_test;

 

  COUNT(*)

----------

        16

 

PRIMARY > insert into scott.dg_test

  2  value(‘DG_TEST_1’);

  3 /

1 row created.

 

PRIMARY > commit;

Commit complete.

 

PRIMARY > select count(*) from scott.dg_test;

  COUNT(*)

----------

        17

 

standby端檢視結構:

SQL> select count(*) from scott.dg_test;

  COUNT(*)

----------

         9

一條資料已經傳輸到stanbyd,表的記錄總數不同是因為上次在練習跳過物件應用時插入的幾條資料無法在取消跳過後傳入到standby

 

三、恢復物件資料

 

透過上述的測試可以看出,先是跳過某物件應用,再去啟用,這樣,在跳過應用期間的資料就無法同步到standby,針對這樣的問題,如若想恢復standby的資料與primary一致,可以透過DBMS_LOGSTDBY.INSTANTIATE_TABLE來恢復表中的資料:

DBMS_LOGSTDBY.INSTANTIATE_TABLE

schema_name IN VARCHAR2,

table_name IN VARCHAR2,

dblink IN VARCHAR2

透過上面的語法格式可以看出,在使用dbms_logstdby.instantiate_table對錶中的資料進行恢復時,需要建立一個可以連線到primary端的資料庫鏈:

SQL> create database link dg_table_reco connect to system identified by oracle using 'orcl_p.tns';

Database link created.

其中,dg_table_reco是連線名,system是連線使用者,oracle使用者的密碼

 

測試資料庫連線是否可用:

SQL> select sysdate from dual@dg_table_reco;

SYSDATE

---------

11-MAR-14

 

開始重新同步資料:

SQL> set sqlprompt 'STADNDBY > '

STADNDBY > select count(*) from scott.dg_test;

 

  COUNT(*)

----------

         9

同步之前在dg_test表中共有9條記錄

 

STADNDBY > alter database stop logical standby apply;

Database altered.

 

STADNDBY > exec dbms_logstdby.instantiate_table('SCOTT','DG_TEST','DG_TABLE_RECO');

PL/SQL procedure successfully completed.

注意模式名和表名的大小寫

再次檢視測試表的資料,發現已完全同步至standby

STADNDBY > select count(*) from scott.dg_test;

  COUNT(*)

----------

        17

 

四、邏輯Standby端修改資料:

 

首先介紹一下standby的保護狀態

SQL> select guard_status from v$database;

GUARD_S

-------

NONE

DGstandby資料的保護狀態有三種:

ALL:資料庫將對所有物件啟動修改保護,出了SYS使用者,其他使用者不允許直接修改資料。

STANDBY:對處於邏輯Standby維護關係的物件啟動修改保護,仍然是出了SYS使用者其他使用者均不能直接修改資料。

NONE:不啟動資料保護。

修改Standby端資料庫的保護狀態:

SQL> alter database guard standby;

Database altered.

SQL> select guard_status from v$database;

GUARD_STAUS

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

STANDBY

 

STANDBY狀態要實現在DG環境中邏輯standby端修改資料,就要暫時釋放DG對該standby的控制:

alter session disable guard;

資料修改完成後別忘了將DG切換為啟用狀態:

alter session enable guard;

 

 

 

 

 

 

 

 

 

 


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

相關文章