批注:SUPPLEMENTAL_LOG_DATA_MIN=YES和IMPLICIT都表示数据库启动了最小化的补充日志。YES表示通过ALTER DATABASE ADD SUPPLEMENTAL LOG DATA语句启动的最小化补充日志;如果启动了对主键、唯一键、外键、ALL的补充日志,默认情况下都会打开最小化的补充日志,IMPLICIT表示的是通过启动对主键、唯一键、外键或者ALL的支持而打开的最小化补充日志。
因此,Oracle 建议你为表创建一个主键或非空的唯一索引/约束,以尽可能确保sql应用能够有效应用redo数据更新逻辑standby数据库。
3)执行下列语句检查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_COLUMN = 'Y';
OWNER TABLE_NAME
------------------------------ ------------------------------
TSMSYS SRS$ --这是一张系统表,首先查看该用户是否可以登录,如果是锁定状态,我们就无需设置它
SQL> select username,account_status from dba_users where username like '%TSMSYS%';
USERNAME ACCOUNT_STATUS
------------------------------ --------------------------------
TSMSYS EXPIRED & LOCKED
批注:DBA_LOGSTDBY_NOT_UNIQUE 该视图显示包含不被支持的数据类型,即既没有主键,也没有唯一索引的表,如果表中的列包括足够多的信息通常也可支持在逻辑standby的更新,不被支持的表通常是由于列的定义包含了不支持的数据类型。
对于BAD_COLUMN 列值有两个:
Y:表示该表中有采用大数据类型的字段,比如LONG,CLOB,如果表中除log列某些行记录完全匹配,则该表无法成功应用于逻辑standby,standby会尝试维护这些表,不过你必须保证应用不允许;
N:表示该表拥有足够的信息,能够支持在逻辑standby的更新,不过仍然建议你为该表创建一个主键或者唯一索引/约束以提高log应用效率;
4)假设某张表你可以确认数据是唯一的,但是因为效率方面的考虑,不想为其创建主键或唯一约束,怎么办呢,没关系,oracle想到了这一点,你可以创建一个disable的primary-key rely约束:
关于primary-key RELY约束:
如果你能够确认表中的行是唯一的,那么可以为该表创建rely的主键,RELY约束并不会造成系统维护主键的开销,如果你对一个表创建了rely约束,系统则会假定该表中的行是唯一,这样能够提供sql应用时的性能,但是需要注意,由于rely的主键约束只是假定唯一,如果实际并不唯一的话,有可能会造成错误的更新。
创建rely的主键约束非常简单,只要在标准的创建语句后加上RELY DISABLE即可,示例如下:
SQL> ALTER TABLE mytab ADD PRIMARY KEY (id, name) RELY DISABLE; --表mytab为我要创建rely主键约束的表名