DG - 逻辑Standby创建

一、准备工作

在创建逻辑standby 之前,首先检查primary 数据库的状态,确保primary 数据库已经为创建逻辑standby做好了全部准备工作,比如说是否启动了归档,是否启用了forced logging 等,redo 应用实际上是物理standby 端进行recover,sql 应用则是分析redo 文件,将其转换为sql 语句在逻辑standby 端执行,因此,需要注意:

  • 并非所有的数据类型都能被逻辑standby支持:
SQL> SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;

提示:关于DBA_LOGSTDBY_UNSUPPORTED
该视图显示包含不被支持的数据类型的表的列名及该列的数据类型。注意该视图的ATTRIBUTES 列,列值会显示表不被sql 应用支持的原因。

  • 如何确保primary库中各表的行可被唯一标识

Oracle 通过主键、唯一索引/约束补充日志(supplemental logging)来确定待更新逻辑standby 库中的行。当数据库启用了补充日志(supplemental logging),每一条update 语句写redo 的时候会附加列值唯一信息,比如:
a). 如果表定义了主键,则主键值会随同被更新列一起做为update 语句的一部分,以便执行时区别哪些列应该被更新。
b). 如果没有主键,则非空的唯一索引/约束会随同被更新列做为update 语句的一部分,以便执行时区分哪些列应该被更新,如果该表有多个唯一索引/约束,则oracle 自动选择最短的那个。
c). 如果表即无主键,也没有定义唯一索引/约束,所有可定长度的列连同被更新列作为update 语句的一部分。更明确的话,可定长度的列是指那些除:long,lob,long raw,object type,collection 类型外的列。

  确定在主数据库上,补充日志是否被启用,可以查询v$database,如下:

SQL> select supplemental_log_data_pk,supplemental_log_data_ui from v$database;

  因此,Oracle 建议你为表创建一个主键或非空的唯一索引/约束,以尽可能确保sql 应用能够有效应用redo 数据,更新逻辑standby 数据库。

  执行下列语句检查sql 应用能否唯一识别表列,找出不被支持的表:

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_COLLUMN = 'Y';

  关于primary-key RELY 约束:

  如果你能够确认表中的行是唯一的,那么可以为该表创建rely 的主键,RELY 约束并不会造成系统维护主键的开销,主你对一个表创建了rely 约束,系统则会假定该表中的行是唯一,这样能够提供sql 应用时的性能。但是需要注意,由于rely 的主键约束只是假定唯一,如果实际并不唯一的话,有可能会造成错误的更新。

  创建rely 的主键约束非常简单,只要在标准的创建语句后加上RELY DISABLE 即可:

SQL> alter table jss.b add primary key (id) rely disable;

二、创建步骤

1. 创建物理standby

  如果决定将其转换为逻辑standby,就必须停止该物理standby的redo应用,以避免提前应用含LogMiner 字典的redo 数据,造成转换为逻辑standby 后,sql 应用时logMiner 字典数据不足而影响到逻辑standby 与primary 的正常同步。

2. 设置primary数据库

  与物理standby的角色切换的参数没二样啦,不过如果希望primary数据库能够正常切换为逻辑standby角色还需要设置相应的log_archive_dest_N,并且valid_for属性需要改成:(STANDBY_LOGFILES,STANDBY_ROLE)。然后生成LogMiner字典信息:

SQL> EXECUTE DBMS_LOGSTDBY.BUILD;

  该过程专门用于生成记录的元数据信息到redo log,这样改动才会被传输到逻辑standby,然后才会被逻辑standby 进行SQL 应用。

  提示:该过程通过闪回查询的方式来获取数据字典的一致性,因此oracle初始化参数UNDO_RETENTION值需要设置的足够大。

3. 转换物理standby为逻辑standby

SQL> alter database recover to logical standby NEW_DBNAME;

  注意:逻辑standby是一个全新的数据库,如果当前使用spfile,则数据库会自动修改其中的相关信息,如果使用的是pfile,在下次执行shutdown的时候oracle会提示你去修改db_name初始化参数的值。

4. 重建逻辑standby的密码文件

5. 调整逻辑standby初始化参数

  一方面是由于此处我们的逻辑standby 是从物理standby 转换来的,某些参数并不适合甚至可能造成错误,比如log_archive_dest_n 参数的设置。另一方面,由于逻辑standby 会有读
写操作,因此需要读写本地online redologs 及并产生archivelogs,务必需要注意本地的archivelogs 路径不要与应用接收自primary 数据库的redo 数据生成的archivelogs 路径冲突。

6. 打开逻辑standby

由于逻辑standby与primary数据库事务并不一致,因此第一次打开时必须指定resetlogs:

SQL> alter database open resetlogs;

然后通过sql命令应用redo数据:

SQL> alter database start logical standby apply immediate;

如果想停止逻辑standby的sql应用:

 

SQL> alter database stop logical standby apply immediate

 

 

逻辑standby创建示例

一、创建物理standby

  ......提示:暂停standby的redo应用

SQL> alter database recover managed standby database cancel;

二、设置primary数据库

  生成LogMiner字典信息

SQL> execute dbms_logstdby.build;

三、转换物理standby为逻辑standby

SQL> alter database recover to logical standby jssldg;

四、重建逻辑standby的密码文件

c:\xxx orapwd file=c:\oracle\database\PWDjssldg.ora password=verysafe entries=30 

注意保持sys密码与primary数据库一致

五、调整逻辑standby初始化参数

  注意归档文件路径不要冲突:

SQL>alter system set log_archive_dest_1='location=xxx\JSSLDG\arc\
valid_for=(online_logfiles,all_roles) db_unique_name=JSSLDG';
SQL>alter system set log_archive_dest_2='location=XXX\oradata\JSSLDG\std\
valid_for=(standby_logfiles,standby_role) db_unique_name=JSSLDG';

我们创建JSSLDG 时并未创建standby redologs,但对于逻辑standby 的sql 应用,standby redologs 是必须的,因此我们在此处也要为该standby 创建几组standby redologs:

SQL>alter database add standby logfile group 4 ('XXX\oradata\JSSLDG\standbyrd01.log') size 20m;

六、打开逻辑standby

SQL> alter database open resetlogs;

SQL> alter database start logical standby apply immediate;

 

posted @ 2012-08-06 10:19  南宫元耘  阅读(1374)  评论(0编辑  收藏  举报