在创建逻辑standby之前,首先检查primary数据库的状态,确保primary数据库已经为创建逻辑standby做好了全部准备工作,比如说是否
1.配置逻辑Standby 的准备工作
SQL> SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;
OWNER TABLE_NAME COLUMN_NAME DATA_TYPE ATTRIBUTES
---------- -------------------- -------------------- -------------------- --------------------
SH MVIEW$_EXCEPTIONS BAD_ROWID ROWID
OE CUSTOMERS CUST_ADDRESS CUST_ADDRESS_TYP
OE CUSTOMERS PHONE_NUMBERS PHONE_LIST_TYP
OE CUSTOMERS CUST_GEO_LOCATION SDO_GEOMETRY
OE WAREHOUSES WAREHOUSE_SPEC XMLTYPE
OE WAREHOUSES WH_GEO_LOCATION SDO_GEOMETRY
PM ONLINE_MEDIA PRODUCT_AUDIO ORDAUDIO
PM ONLINE_MEDIA PRODUCT_TESTIMONIALS ORDDOC
PM ONLINE_MEDIA PRODUCT_PHOTO ORDIMAGE
PM ONLINE_MEDIA PRODUCT_PHOTO_SIGNATURE ORDIMAGESIGNATURE
PM ONLINE_MEDIA PRODUCT_THUMBNAIL ORDIMAGE
PM ONLINE_MEDIA PRODUCT_VIDEO ORDVIDEO
PM PRINT_MEDIA AD_TEXTDOCS_NTAB TEXTDOC_TAB
PM PRINT_MEDIA AD_GRAPHIC BFILE
PM PRINT_MEDIA AD_HEADER ADHEADER_TYP
OE CATEGORIES_TAB CATEGORY_NAME VARCHAR2 Object Table
OE CATEGORIES_TAB CATEGORY_DESCRIPTION VARCHAR2 Object Table
OE CATEGORIES_TAB CATEGORY_ID NUMBER Object Table
OE CATEGORIES_TAB PARENT_CATEGORY_ID NUMBER Object Table
19 rows selected.
批注:关于DBA_LOGSTDBY_UNSUPPORTED 该视图显示包含不被支持的数据类型的表的列名及该列的数据类型,注意该视图的ATTRIBUTES列,列值会显示表不被sql应用支持的原因。
在CentOS 6.4下安装Oracle 11gR2(x64)
Oracle 11gR2 在VMWare虚拟机中安装步骤
Debian 下 安装 Oracle 11g XE R2
Oracle 11g从入门到精通 PDF+光盘源代码
RHEL6 ASM方式安装Oracle 11g R2
2)维护逻辑standby与primary的数据库同步是通过sql应用实现,SQL应用转换的SQL语句在执行时,对于insert还好说,对于update,delete操作则必须能够唯一定位到数据库待更新的那条记录,问题就在这里,如果primary库中表设置不当,可能就无法确认唯一条件,逻辑standby跟物理standby的区别,就是因为它只是逻辑上与primary数据库相同,,物理上可能与primary数据库存在相当大差异,一定要认识到,逻辑standby的物理结构与primary是不相同的(即使初始逻辑standby是通过primary的备份创建),因此想通过rowid更新显然是不好使的,就不能再将其做为唯一条件,可以通过以下的方法来解决:
如何确保primary库中各表的行可被唯一标识
Oracle 通过主键、唯一索引/约束补充日志(supplemental logging)来确定待更新逻辑standby库中的行,当数据库启用了补充日志(supplemental logging)每一条update语句写redo的时候会附加列值唯一信息,比如:
如果表定义了主键,则主键值会随同被更新列一起做为update语句的一部分,以便执行时区别哪些列应该被更新;
如果没有主键,则非空的唯一索引/约束会随同被更新列做为update语句的一部分,以便执行时区分哪些列应该被更新,如果该表有多个唯一索引/约束,则oracle自动选择最短的那个;
如果表即无主键,也没有定义唯一索引/约束,所有可定长度的列连同被更新列作为update语句的一部分,更明确的话可定长度的列是指那些除:long,lob,long raw,object type,collection类型外的列;
确定在主数据库上,补充日志是否被启用,可以查询v$database,如下:SQL> select SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUP SUP SUPPLEME
--- --- --------
NO NO NO
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.
SQL> select SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUP SUP SUPPLEME
--- --- --------
NO NO YES
批注: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
N:表示该表拥有足够的信息,能够支持在逻辑standby的更新,不过仍然建议你为该表创建一个主键或者唯一索引/约束以提高log应用效率;
4)
更多详情见请继续阅读下一页的精彩内容: