在创建逻辑备库之前,必须得先创建物理备库,关于如何创建物理备库,请参阅前述文章(ORACLE DG专题3--手把手部署DG 物理备库)。

重新设置主库的归档参数

逻辑备库和物理备库不一样,逻辑备库在进行SQL应用时还会产生日志,即逻辑备库的在线重做日志,因此逻辑备库不但要对从主库传过来的Standby日志进行归档,还必须得对备库自己产生的在线日志进行归档。

假定log_archive_dest_1指定standby日志的归档路径,log_archive_dest_3指定在线日志的归档路径。

虽然主库并不需要配置两个归档路径,但为了方便将来可能的角色转换(switchover),一般建议在主库中也做相应的配置。

首先,查看当前主库的log_archive_dest_1:

SYS@JKKA> show parameter log_archive_dest_1

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1                   string      location=/data/oradata/jkka/archivelog
                                                 valid_for=(all_logfiles,all_roles)
                                                 db_unique_name=jkka

需要把valid_for属性修改为只对在线日志生效:

SQL> alter system set log_archive_dest_1='location=/data/oradata/jkka/archivelog valid_for=(online_logfiles,all_roles) db_unique_name=jkka';

System altered.

ORACLE DG专题4--部署DG逻辑备库-LMLPHP

接着在OS上新建standby归档目录,新增的log_archive_dest_3指向它:

SQL> alter system set log_archive_dest_3='location=/odata/fast_recovery_area/T24APDB/archstandby VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=T24APDB';
System altered.

SQL> alter system set log_archive_dest_state_3=enable;
System altered.

ORACLE DG专题4--部署DG逻辑备库-LMLPHP

在主库构建LogMiner字典

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

在物理备库上停止日志应用服务

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered.

把物理备库转换成逻辑备库

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

注意:上面的ADDBLG是新的逻辑备库的db_name,它必须得跟主库的db_name不一样且字符长度不超过8个字符,这点和物理备库不一样。

上述语句执行成功后,会把备库的db_name修改成新的名字ADDBLG,关闭备库,重启至mount状态让其生效:

SQL> shutdown immediate
SQL> startup mount

调整逻辑备库参数

这一步和第一步类似,首先查看当前的log_archive_dest_1的配置:

 NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1                   string      location=/data/oradata/jkka/archivelog
                                                 valid_for=(all_logfiles,all_roles)
                                                 db_unique_name=jkka2

需要把valid_for属性修改为只对在线日志生效:

SQL> alter system set log_archive_dest_1='location=/data/oradata/jkka/archivelog valid_for=(online_logfiles,all_roles) db_unique_name=jkka2';
System altered.

log_archive_dest_2保持不变:

NAME                                 TYPE        VALUE
----------------------------------- ----------- ------------------------------
log_archive_dest_2                   string      service=jkkapri ASYNC
                                                 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=jkka

在OS上新建standby归档目录,新增的log_archive_dest_3指向它:

SQL> alter system set log_archive_dest_3='location=/data/oradata/jkka/archstandby VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=jkka2';
System altered.

SQL> alter system set log_archive_dest_state_3=enable;
System altered.

以resetlogs方式打开逻辑备库

SQL> alter database open resetlogs;
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

ORACLE DG专题4--部署DG逻辑备库-LMLPHP

可能的报错:

  • 切换成logical备时报错

ORACLE DG专题4--部署DG逻辑备库-LMLPHP

解决方案:暂时不知道报了什么错;

  • 切换逻辑备库后,备库无法mount,无法打开

ORACLE DG专题4--部署DG逻辑备库-LMLPHP

原因:控制文件中记录的数据库名:NAME为原来的名称T24APDB,需要修改(nomount 状态),猜测就是因为上面的切换导致的

SQL> ALTER SYSTEM SET DB_NAME=ADDBLG scope=spfile;

然后重启数据库(shutdown、startup)

参考

 本文参阅了这篇文章:

[Oracle] Data Guard 系列(5) - 创建逻辑备库

09-19 12:38