BINARY_DOUBLE、BINARY_FLOAT、BLOB、CHAR、CLOB and NCLOB、DATE、INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND、LONG、LONG RAW、NCHAR、NUMBER、NVARCHAR2、RAW、TIMESTAMP、TIMESTAMP WITH LOCAL TIMEZONE、TIMESTAMP WITH TIMEZONE、VARCHAR2 and VARCHAR
提示:
下列类型在获取standby 支持时需要注意兼容性:
¤ clob,需要primary 数据库的兼容级别运行于10.1 或更高
¤ 含lob 字段的索引组织表(IOT),需要primary 数据库的兼容级别运行于10.2 或更高
¤ 不含lob 字段的索引组织表(IOT),需要primary 数据库的兼容级别运行于10.1 或更高
BFILE、Encrypted columns、ROWID, UROWID、XMLType、对象类型、VARRAYS、嵌套表、自定义类型。
SQL> SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;
提示:关于DBA_LOGSTDBY_UNSUPPORTED
该视图显示包含不被支持的数据类型的表的列名及该列的数据类型。注意该视图的ATTRIBUTES 列,列值会显示表不被sql 应用支持的原因。
只有dbms_job 例外,primary 数据库的jobs 会被复制到逻辑standby,不过在standby 数据库不会执行这些job。
ALTER DATABASE
ALTER MATERIALIZED VIEW
ALTER MATERIALIZED VIEW LOG
ALTER SESSION
ALTER SYSTEM
CREATE CONTROL FILE
CREATE DATABASE
CREATE DATABASE LINK
CREATE PFILE FROM SPFILE
CREATE MATERIALIZED VIEW
CREATE MATERIALIZED VIEW LOG
CREATE SCHEMA AUTHORIZATION
CREATE SPFILE FROM PFILE
DROP DATABASE LINK
DROP MATERIALIZED VIEW
DROP MATERIALIZED VIEW LOG
EXPLAIN
LOCK TABLE
SET CONSTRAINTS
SET ROLE
SET TRANSACTION
◆ 如果表定义了主键,则主键值会随同被更新列一起做为update 语句的一部分,以便执行时区别哪些列应该被更新。
◆ 如果没有主键,则非空的唯一索引/约束会随同被更新列做为update 语句的一部分,以便执行时区分哪些列应该被更新,如果该表有多个唯一索引/约束,则oracle 自动选择最短的那个。
◆ 如果表即无主键,也没有定义唯一索引/约束,所有可定长度的列连同被更新列作为update 语句的一部分。更明确的话,可定长度的列是指那些除:long,lob,long raw,object type,collection 类型外的列。
SQL> select supplemental_log_data_pk,supplemental_log_data_ui from v$database;
SUP SUP
--- ---
YES YES
因此,Oracle 建议你为表创建一个主键或非空的唯一索引/约束,以尽可能确保sql 应用能够有效应用redo 数据,更新逻辑standby 数据库。
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';
提示:关于DBA_LOGSTDBY_NOT_UNIQUE
该视图显示所有即没主键也没唯一索引的表。如果表中的列包括足够多的信息通常也可支持在逻辑standby 的更新,不被支持的表通常是由于列的定义包含了不支持的数据类型。
注意BAD_COLUMN 列值,该列有两个值:
Y:表示该表中有采用大数据类型的字段,比如LONG 啦,CLOB 啦之类。如果表中除log 列某些行记录完全匹配,则该表无法成功应用于逻辑standby。standby 会尝试维护这些表,不过你必须保证应用不允许
N:表示该表拥有足够的信息,能够支持在逻辑standby 的更新,不过仍然建议你为该表创建一个主键或者唯一索引/约束以提高log 应用效率。
如果你能够确认表中的行是唯一的,那么可以为该表创建rely 的主键,RELY 约束并不会造成系统维护主键的开销,主你对一个表创建了rely 约束,系统则会假定该表中的行是唯一,这样能够提供sql 应用时的性能。但是需要注意,由于rely 的主键约束只是假定唯一,如果实际并不唯一的话,有可能会造成错误的更新哟。
SQL> alter table jss.b add primary key (id) rely disable;
表已更改。
二、创建步骤
LogMiner 字典的redo 数据,造成转换为逻辑standby 后,sql 应用时logMiner 字典数据不足而影响到逻辑standby 与primary 的正常同步。
不过注意,如果希望primary 数据库能够正常切换为逻辑standby 角色的话,那么你还需要设置相应的log_archive_dest_N,并且valid_for 属性,需要更改成:(STANDBY_LOGFILES,STANDBY_ROLE)。
SQL> EXECUTE DBMS_LOGSTDBY.BUILD;
提示:
¤ 该过程会自动启用primary 数据库的补充日志(supplemental logging)功能(如果未启用的话)。
¤ 该过程执行需要等待当前所有事务完成,因此如果当前有较长的事务运行,可能该过程执行也需要多花一些等待时间。
¤ 该过程是通过闪回查询的方式来获取数据字典的一致性, 因此oracle 初始化参数UNDO_RETENTION 值需要设置的足够大。
执行下列语句,转换物理standby 为逻辑standby:
SQL> alter database recover to logical standby NEW_DBNAME;
提示:执行该语句前务必确保已经暂停了redo 应用,另外转换是单向的,即只能由物理standby 向逻辑standby 转换,而不能由逻辑standby 转成物理standby。这并不仅仅是因为dbname 发生了修改,更主要的原因是逻辑standby 仅是数据与primary 一致,其它如存储结构,scn 等基于dbid 都不一相同。
主要是由于转换操作修改了数据库名,因此密码文件也需要重建,这个操作我们做的比较多,这里就不详述了。
SQL> alter database open resetlogs;
SQL> alter database start logical standby apply immediate;
SQL> alter database stop logical standby apply immediate;
-The End-