逻辑备库与物理备库不同,它并不是Primary数据库的一个精确的copy。同一rowid,在逻辑备库上返回的值并不是相同的。有些数据类型或者对象,逻辑备库并不支持同步。在创建逻辑备库之前,你首先要确认,哪些schema及对象是不被SQL-APPLY支持的。
1. 查询不被同步的schema 。
SQL> set pagesize 200
SQL> SELECT OWNER FROM DBA_LOGSTDBY_SKIP WHERE STATEMENT_OPT = 'INTERNAL SCHEMA';
OWNER
-------------------------------
SYS
SYSTEM
OUTLN
MGMT_VIEW
MDSYS
ORDSYS
EXFSYS
DBSNMP
WMSYS
APPQOSSYS
APEX_030200
ORDDATA
CTXSYS
ANONYMOUS
SYSMAN
XDB
ORDPLUGINS
OWBSYS
SI_INFORMTN_SCHEMA
OLAPSYS
ORACLE_OCM
XS$NULL
DIP
23 rows selected.
2. 查询哪些表是不被执行的。
SQL> SELECT DISTINCT OWNER,TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED ORDER BY OWNER,TABLE_NAME;
no rows selected
3. 如果上步返回数据,可以通过如下查询得知是哪些类型不被支持
SQL> SELECT COLUMN_NAME,DATA_TYPE FROM DBA_LOGSTDBY_UNSUPPORTED WHERE OWNER='OE' AND TABLE_NAME = 'CUSTOMERS';
no rows selected
4. 逻辑备库的SQL-APPLY是通过表的唯一标识进行的,也就是说表必须有主键或者唯一性索引。
SQL> col owner for a10
SQL> col table_name for a30
SQL> SELECT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_NOT_UNIQUE;
OWNER TABLE_NAME
---------- ------------------------------
SCOTT BONUS
SCOTT SALGRADE
SCOTT T1
如果表没有主键或唯一约束怎么办?Oracle会在日志文件中写入supplemental logging 。也就是会写入大量的附加信息,用所有的column的值以构建update时的唯一性。
当然也有一些表是无法构建唯一性的,可以通过如下语句查询
SELECT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_NOT_UNIQUE
WHERE (OWNER, TABLE_NAME) NOT IN
(SELECT DISTINCT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED)