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;