日期:2014-05-16  浏览次数:20434 次

DataGuard逻辑备库创建(原创)

本文主要介绍将DataGuard的物理standby转换至逻辑standby,有关于物理standby的搭建可以参见
http://czmmiao.iteye.com/blog/911083
搭建逻辑备库前的注意事项
初始化参数配置
初始化参数的修改并不仅仅只是在待创建的Standby数据库端创建,当前的Primary数据库甚至同一个Data Guard配置中的其他Standby数据库的初始化参数都有可能需要进行修改。
对于Primary数据库,至少需要新增一个LOG_ARCHIVE_DEST_n参数,以发送REDO数据到新的Standby端,同时其他一些与Standby环境相关的参数也会涉及调整,如LOG_ARCHIVE_CONFIG及FAL_*等参数。
而对于现有的Standby数据库(如果有的话),主要是基于角色转换的考虑,有必要对一些参数提前进行设置,设置的参数对当前功能不会有任何影响或促进,如果确定不进行角色转换,那么同一个Data Guard配置中的其他Standby数据库初始化参数也可以不做任何调整。
监听和NetService配置
建议用Net Manager 工具来配置,这样不容易出现错误。
创建密钥文件
必须确保在同一个Data Guard环境中,所有数据库的SYS用户拥有相同密码,建议从其他服务器复制密钥文件到本地,然后按照密钥文件名的格式修改文件名即可。
注意Windows平台和Linux/UNIX平台下,密钥文件名的命名格式并不相同,Windows平台下密钥文件名格式为PWD[sid].ora,而Linux/UNIX平台下密钥文件名格式为orapw[sid],注意文件名的大小写哟。

停止物理备库的redo应用
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;?
Database altered.

Primary数据库生成数据字典
执行下列过程,生成LogMiner字典信息:

SQL> EXECUTE DBMS_LOGSTDBY.BUILD;?
PL/SQL procedure successfully completed.

该过程专门用于生成记录的元数据信息到redo log,这样改动才会被传输到逻辑standby,然后才会被逻辑standby进行SQL应用。
提示:
该过程会自动启用primary数据库的补充日志(supplemental logging)功能(如果未启用的话)。
该过程执行需要等待当前所有事务完成,因此如果当前有较长的事务运行,可能该过程执行也需要多花一些等待时间。
该过程是通过闪回查询的方式来获取数据字典的一致性,因此oracle初始化参数UNDO_RETENTION值需要设置的足够大。
注意:在Primary生成数据字典前,一定要确保待转换的物理Standby数据库已经停止REDO应用。如果已经启用了REDO应用,执行下列语句停止REDO应用:
控制文件中记录了日志文件的应用状态,正常情况下一个日志文件只会被应用一次,如果Primary生成的数据字典信息被物理Standby数据库应用了,等该物理Standby转换成逻辑Standby数据库时(不应用数据字典不代表就不能执行转换哟)就不会再应用这些文件,自然也没有Primary数据库对象的元数据,这可能会导致这部分对象的修改不能被逻辑Standby正常应用。
我们操作的根本目的是为了让逻辑Standby能够应用到这部分数据字典信息,只要能够实现这一点,是否暂停REDO应用或什么时间暂停REDO应用就无所谓了。这也我们理解另外一个问题,如果Primary生成LogMiner字典信息时,待转换的物理Standby数据库没有暂停REDO应用怎么办?好办,马上暂停REDO应用,然后Primary数据库重新生成一下LogMiner字典信息就是。

转换物理Standby为逻辑Standby
执行下列语句,转换物理Standby为逻辑Standby:
SQL> SHOW PARAMETER DB_NAME
NAME???????? TYPE??????? VALUE
---------------------- ----------- ------------------------------
db_name??????? string????? orcl

SQL> ALTER DATABASE RECOVER TO LOGICAL STANDBY LGDG;?
Database altered.

执行完该语句之后,关闭数据库并重新启动到MOUNT状态:
SQL> SHUTDOWN IMMEDIATE?
ORA-01507: database not mounted?
ORACLE instance shut down.?
SQL>? STARTUP MOUNT;
ORACLE instance started.
Total System Global Area? 167772160 bytes
Fixed Size????????????????? 1218316 bytes
Variable Size????????????? 79694068 bytes
Database Buffers?????????? 83886080 bytes
Redo Buffers??????????????? 2973696 bytes
Database mounted.

为什么要重启?因为上述操作涉及逻辑Standby数据库更名,包括DBID、INCARNATION等均已被重新初始化。
再次查看DB_NAME参数和数据库角色:
SQL> SHOW PARAMETER DB_NAME;
NAME?????????????? TYPE??????? VALUE
-------------------------- ----------- ------------------------------
db_name???????????? string????? LGDG
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
DATABASE_ROLE
----------------

LOGICAL STANDBY
现在DB_NAME和数据库的角色都已经被修改。
4调整逻辑Standby数据库初始化参数
设置重做日志文件路径,将本地生成的归档文件和Primary数据库发送来的归档文件分开,存放到不同目录内,注意归档文件路径不要冲突,修改参数如下: