Oracle DG 逻辑Standby的创建说明

一、逻辑Standby的准备工作

1、确认操作的对象和语句是否能被逻辑Standby支持

由于逻辑Standby是通过SQL应用来保持与Primary数据库的同步。SQL应用与REDO应用是有很大的区别,REDO应用实际上是在物理Standby端进行RECOVER;SQL应用则是分析重做日志文件中的REDO信息,并将其转换为SQL语句,在逻辑Standby端执行,因此,需要注意以下几点:

(1)并非所有的数据类型都能被逻辑Standby支持,

逻辑Standby支持的数据类型有:

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、嵌套表、自定义类型。

也可以通过查询DBA_LOGSTDBY_UNSUPPORTED来确定主数据库中是否含有不支持的对象

SQL> select * from dba_logstdby_unsupported;

注意:该视图的ATTRIBUTES列,显示对象不被SQL应用支持的原因。

(2)并非所有的存储类型都能被逻辑Standby支持。

逻辑Standby能够支持簇表(Cluster Tables)、索引组织表(Index-Organized Tables)、堆组织表(Heap-Organized Tables),但不支持段压缩(Segment Compression)存储类型。

(3)并非所有的PL/SQL包都能被SQL应用支持。

通常那些不会修改系统元数据(Metadata)的Package在实际应用时不会有问题,如DBMS_OUTPUT、DBMS_RANDOM、DBMS_METADATA之类的包。

那些可能修改系统元数据的Package不会被SQL应用支持,即使它们在Primary执行过,并且被成功传输到逻辑Standby端,也不会执行。如DBMS_JAVA、DBMS_REGISTRY、DBMS_ALERT、DBMS_SPACE_ADMIN、DBMS_REFRESH、DBMS_REDEFINITION、DBMS_SCHEDULER及DBMS_AQ等。只有DBMS_JOB例外,Primary数据库的jobs会被复制到逻辑Standby,不过在逻辑Standby数据库不会执行这些job。

说明:元数据,直接理解成对象的物理定义。举例来说,对于某表而言,元数据就是表结构,或表的存储属性等。

(4)并非所有的SQL语句都能在逻辑Standby端执行。

在默认情况下,下列SQL语句在逻辑Standby端会被SQL应用自动跳过:

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。

另外,由于SQL语句非常灵活,即使是那些能被SQL应用支持的DDL语句,可能在附加了某些特别的参数后,也不会在逻辑Standby端执行,由于数目较多,此处不再一一列举,感兴趣的话请查阅官方文档。

(5)并非所有的DML操作都能在逻辑Standby端实面SQL应用。

维护逻辑Standby与Primary的数据库同步是通过SQL应用实现,SQL应用转换的SQL语句在执行时,对于INSERT还好说,对于UPDATE、DELETE操作则必须能够唯一定位到数据库待更新的那条记录。问题就在这里,如果Primary库中表设置不当,可能就无法确认唯一条件。

你可能会说可以通过ROWID唯一嘛!千万要谨记啊,逻辑Standby,为啥叫逻辑Standby,就是因为它只是逻辑上与Primary数据库相同,物理上可能与Primary数据库存在相当大差异。一定要认识到,逻辑Standby的物理结构与Primary是不相同的(即使初始逻辑Standby是通过Primary的备份创建)。

因此想通过ROWID更新显然是不好使的,当然也就不能再将其作为唯一条件。下面来看这个问题。

2、确保Primary库中各表的行可被唯一标识

Oracle通过主键、唯一索引/约束的补充日志(Supplemental Logging)来确定待更新逻辑Standby数据库中的行。当数据库启用了补充日志,每一条UPDATE语句写REDO的时候会附加列值唯一信息,比如:

如果表定义了主键,则主键列会随同被更新列一起作为UPDATE语句的一部分,以便执行时区分哪些列应该被更新。

如果没有主键,则非空的唯一索引/约束会随同被更新列作为UPDATE语句的一部分,以便执行时区分哪些列应该被更新,如果该表有多个唯一索引/约束,则Oracle自动选择长度最短的那个,以降低生成的重做日志大小。

如果表既无主键,也没有定义唯一索引/约束,所有可定长度的列,连同被更新列同时作为UPDATE语句的一部分。更明确些,可定长度的列是指除LONG、LOB、LONG RAW、OBJECT TYPE、COLLECTION类型外的列。

Oracle 建议你为表创建一个主键或非空的唯一索引/约束,以尽可能确保SQL应用能够有效应用REDO数据,更新逻辑Standby数据库。

更多精彩内容:http://www.bianceng.cn/database/Oracle/

下列语句可以用来检查SQL应用能否唯一识别表列,并找出不被支持的表:

SQL> SELECT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_NOT_UNIQUE WHERE (OWNER, TABLE_N

AME) NOT IN  (SELECT DISTINCT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED)

AND BAD_COLUMN = 'Y';

OWNER TABLE_NAME

----- ---------------

TSMSY SRS$

提 示: 关于DBA_LOGSTDBY_NOT_UNIQUE, 该视图显示所有既没主键也没唯一索引的表。如果表中的列包括足够多的信息,通常也可支持在逻辑Standby端的更新,不被支持的表通常是由于列的定义包含了不支持的数据类型。

注意BAD_COLUMN列值,该列有两个值:

Y:表示该表中有采用大数据类型的字段,比如LONG、CLOB。如果表中除LOG列某些行记录完全匹配,则该表无法成功应用于逻辑Standby。Standby会尝试维护这些表,不过你必须保证应用不允许。

N:表示该表拥有足够的信息,能够支持在逻辑Standby的更新,不过仍然建议你为该表创建一个主键或者唯一索引/约束,以提高LOG应用效率。

假设在某张表中你可以确认数据是唯一的,但是基于效率方面的考虑,不想为其创建主键或唯一约束,怎么办呢?没关系,Oracle早想到了这一点,你可以创建一个DISABLE的Primary-Key Rely约束:

提 示: 关于Primary-Key Rely约束。

如果DBA能够确认表中的行是唯一的,那么可以为该表创建Rely的主键,Rely约束并不会造成系统维护主键的开销,如你对一个表创建了RELY约束,系统则会假定该表中的行是唯一的,这样能够提高SQL应用时的性能。但是需要注意,由于Rely的主键约束只是假定唯一,如果实际并不唯一的话,有可能会造成错误的更新哟。

创建Rely的主键约束非常简单,只要在标准的创建语句后加上RELY DISABLE即可,例如:

SQL> ALTER TABLE USER ADD PRIMARY KEY (ID) RELY DISABLE;

表已更改。

注 意: 创建了Rely约束后,Oracle会假定该列是唯一的(给DBA足够的信任),不过并不会对该列的值进行唯一性的验证,因此该列是否唯一只能由DBA来主动维护。

二、逻辑Standby创建时的操作步骤

1、创建物理Standby

创建逻辑Standby数据库的第一步就是先创建一个物理Standby数据库,然后再将其转换成逻辑Standby数据库。在将其转换为逻辑Standby前,可以随时启动REDO应用,不过一旦决定将其转换为逻辑Standby,就必须先停止该物理Standby的REDO应用,以避免提前应用含LogMiner字典的REDO数据,造成转换为逻辑Standby后,SQL应用时LogMiner字典数据不足而影响到逻辑Standby与Primary的正常同步。

2、设置Primary数据库

在创建物理Standby数据库时曾经设置过相关数量的初始化参数,用于Primary数据库与物理Standby的角色切换,对于逻辑Standby的角色切换,那些参数同样好使。

不过注意,如果希望Primary数据库能够正常切换为逻辑Standby角色,那么DBA在配置环境时,还需要设置相应的LOG_ARCHIVE_DEST_n初始化参数,并注意该参数的VALID_FOR属性值需要更改成STANDBY_LOGFILES,STANDBY_ROLE。

时间: 2024-11-29 12:29:25

Oracle DG 逻辑Standby的创建说明的相关文章

Oracle DG 物理Standby的创建步骤

一.创建备份 物理Standby数据库相当于Primary数据库在某个时间点的镜像复制,因此在创建物理Standby数据库之前,至少要有一份Primary数据库的完整备份. Oracle建议使用RMAN创建备份集,不过如果数据库规模不是太大,我个人更倾向于通过用户管理的方式创建备份集. 创建备份有三种方式: 1. RMAN 备份与恢复 -- 不需要shutdown 数据库 备份: $ rman target / RMAN> backup full format 'D:/FULL_%d_%T_%s

Oracle DG 逻辑Standby数据同步性能优化

1.调整APPLIER进程数 APPLIER进程就是执行应用操作的进程.在默认情况下逻辑Standby会启动5个APPLIER进程,如果日志应用任务繁重(或者说Primary数据库修改量较大),则适当多启动几个APPLIER进程有助于提高应用的效率. 先查看当前空闲的APPLIER进程数: SQL> SELECT COUNT(*) AS IDLE_APPLIER FROM V$LOGSTDBY_PROCESS WHERE TYPE = 'APPLIER' and status_code = 16

Oracle DG 逻辑Standby的相关视图管理

1.DBA_LOGSTDBY_EVENTS 可以把该视图看成逻辑Standby操作日志,因此如果发生了错误,可以通过该视图查看近期逻辑Standby都做了些什么.默认情况下,该视图只保留最近100条事件的记录(可以通过相关过程修改保存的记录条数). 例如: SQL> SELECT EVENT_TIME,STATUS,EVENT FROM DBA_LOGSTDBY_EVENTS ORDER BY EVENT_TIMESTAMP; EVENT_TIM STATUS                  

Oracle DG Linux平台逻辑Standby的创建实例

oracle,平台,linux,数据库,archive,sql 操作系统:linux redhat 4.7 Oracle: 10.2.0.1 主库:orcl_pd 备库:LGDG 一.逻辑Standby创建过程 1.创建物理Standby 具体的参考: Oracle Data Guard Linux 平台 Physical Standby 搭建实例 简单的做如下几点提示: (1)初始化参数配置 初始化参数的修改并不仅仅只是在待创建的Standby数据库端创建,当前的Primary数据库甚至同一个

Oracle DG 物理Standby环境搭建

Oracle Data Guard, 分逻辑Standby和物理Standby. 下面讲的是物理Standby环境的搭建步骤. 一.启用Force Logging 将Primary数据库置为Force Logging模式.通过下列语句: 查看状态: SQL> SELECT DATABASE_ROLE,FORCE_LOGGING FROM V$DATABASE; DATABASE_ROLE    FORCE_LOGGING ----------------  --------------- PRI

Oracle DG 修改逻辑Standby端数据

相对物理Standby,逻辑Standby的管理要复杂一点点.这个就是管理一个半数据库和管理两个数据库的差异(假设Data Guard环境为一主一备的情况下),毕竟逻辑Standby只是逻辑上,仿佛与Primary数据库一致,其实它是一个独立运行的,甚至可能与Primary数据库完全不同的数据库系统,对于这种配置环境,管理上多花点工夫想想也是应该的. 1.指定对象跳过应用 在默认情况下,接收自Primary的REDO数据中,所有能够被逻辑Standby数据库支持的操作都会在逻辑Standby端执

DataGuard逻辑备库创建(原创)

本文主要介绍将DataGuard的物理standby转换至逻辑standby,有关于物理standby的搭建可以参见 http://czmmiao.iteye.com/blog/911083搭建逻辑备库前的注意事项  初始化参数配置 初始化参数的修改并不仅仅只是在待创建的Standby数据库端创建,当前的Primary数据库甚至同一个Data Guard配置中的其他Standby数据库的初始化参数都有可能需要进行修改. 对于Primary数据库,至少需要新增一个LOG_ARCHIVE_DEST_

Oracle DG(Data Guard)支持异构平台说明

Oracle DG(Data Guard)支持异构平台说明  以下转自:http://blog.csdn.net/tianlesoftware/article/details/7241488 一.说明 OracleData Guard 最简单的配置是主备库的环境都一样,但是在有些情况下需要异构的配置,比如在迁移时为了减少停机时间或者零停机,可能就需要使用异构的DG 配置. 关于Oralce DataGuard 异构平台的搭建,MOS上有2篇文章专门来说明: Data Guard Support

ORACLE-DataGuard系列:逻辑standby搭建

    准备:    确认对象和语句能被standby支持    确保primary库中各表的行可被唯一标识    环境:    操作系统:RED HAT LINUX ENTERPRISE 5    ORACLE:   11.2.0.1.0    PRIMARY:    IP:    192.168.1.11    SID:  test    DB_UNIQUE_NAME:test    安装路径:/oracle/oracle/product/11.2.0/dbhome_1    本地归档路径: