1
第一步:确定主数据库中是否包含逻辑standby数据库不支持的数据类型和表。
以下是逻辑standby数据库支持的类型:
CHAR
NCHAR
VARCHAR2 and VARCHAR
NVARCHAR2
NUMBER
DATE
TIMESTAMP
www.ixdba.net
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
RAW
CLOB
BLOB
逻辑standby数据库不支持的类型包括:
NCLOB,LONG,LONG RAW, BFILE, ROWID和UROWID,以及用户自定义的类型,包括对象类型,REF类型,varray和嵌套表。如果存在表含有这些类型的字段,当逻辑standby数据库对这张表应用DML操作时就会报错。
逻辑standby数据库不支持的表和序列:
SYS用户的表和序列;
含有不支持数据类型的表;
建有函数索引的表;
建有物化视图的表;
全局临时表(Global Temporary Table)。
可以通过查询视图DBA_LOGSTDBY_UNSUPPORTED来确定主数据库中是否含有不支持的对象:
SQL> SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;
如果主数据库中含有不支持的对象,日志实施服务进程(Log Apply Service)在向standby数据库实施redo log时会自动排除这些对象。
1.2 第二步:确定主数据库中表的所有数据记录是否都能被唯一定位
为了维护standby数据库,SQL实施操作进程必须能够为一定位到主数据库上更新的每一条记录。为了能使主数据库上的变化数据能高效和正确的实施到standby数据库上,Oracle建议对每张表都建立主键。
大多数表都必须有了主键或者没有空值的唯一约束,否则,补充日志(supplemental logging 在第四步会激活)会自动收集定位在主数据库上更新的记录的信息。通过补充日志,那些能够唯一定位记录的信息会加到归档redo日志中的每一个更新事务中,这样,日志实施服务进程就能维护standby数据库了。
可以通过以下步骤来确保SQL实施操作进程能唯一定位表的记录:
1、 查询视图DBA_LOGSTDBY_NOT_UNIQUE来定位哪些表没有主键货无空值的唯一约束:
SQL> SELECT OWNER, TABLE_NAME, BAD_COLUMN FROM DBA_LOGSTDBY_NOT_UNIQUE;
以上查询会返回用户名、表名以及通过Y和N来标识的字段BAD_COLUMN:
· 如果BAD_COLUMN的值为Y,表示这张表的字段使用一个极大的数据类型,如LONG。如果有两条这样的记录存在表中(除LOB字段外),这张表就无法被正确维护。
· 值为N表示表含有足够的信息来维护standby数据库上的表(但是却没有主键或无空值约束)。然而,如果你增加了主键,日志传输服务进程(Log Transport Service)和SQL实施操作进程将会更高效。
2、 在必要的情况下增加主键以提高效率
为了维护standby数据库上的表,补充日志功能会自动为redo日志中的每一个更新表操作增加字段数据,具体如下:
· 如果表已经有主键或者无空值的唯一索引,向redo日志中添加的信息将最少。
· 如果表没有主键或无空值的唯一索引,补充日志功能会通过向redo日志中的所有行都添加相应的值为它增加唯一健值。然而,这个自动增加的键值会增加写入到redo日志中的信息。
3、 在必要的情况下,在表上创建非激活依赖的约束。
如果表在视图DBA_LOGSTDBY_NOT_UNIQUE中可以查到,它又是一张会被频繁更新的表。可以通过创建一个非激活依赖的约束在表上来避免通过主键维护表,以提高redo日志的性能。一个非激活依赖的约束可以为SQL实施操作进程提供更多的信息,而不会增加在主数据库上的索引成本。