逻辑Data Guard的对象操作

逻辑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_TEST的DML操作

 

指定跳过对象之前需关闭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

DG对standby数据的保护状态有三种:

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29320885/viewspace-1107742/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值