ITPub博客

首页 > 数据库 > Oracle > 逻辑Data Guard的对象操作

逻辑Data Guard的对象操作

原创 Oracle 作者:静以致远√团团 时间:2014-03-11 17:15:23 0 删除 编辑

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

请登录后发表评论 登录
全部评论
每个人都有梦想,去实现吧!

注册时间:2013-11-14

  • 博文量
    164
  • 访问量
    2103649