RAC环境逻辑STANDBY的创建

前面介绍了RAC环境物理STANDBY数据库的创建,这里在前面的基础上创建逻辑STANDBY数据库。

RAC数据库建立STANDBY(一):http://yangtingkun.itpub.net/post/468/484988

RAC数据库建立STANDBY(二):http://yangtingkun.itpub.net/post/468/485013

RAC数据库建立STANDBY(三):http://yangtingkun.itpub.net/post/468/485054

RAC数据库建立STANDBY(四):http://yangtingkun.itpub.net/post/468/485090

RAC数据库建立STANDBY(五):http://yangtingkun.itpub.net/post/468/485121

RAC数据库建立STANDBY(六):http://yangtingkun.itpub.net/post/468/485141

 

 

主数据库和目标数据库都采用11.1.0.6 FOR Solaris 10 sparc 64RAC环境,PRIMARY数据库使用了VOLUMN CLUSTER MANAGER,而STANDBY数据库使用ASM

备库的RAC环境已经安装完成,而且根据前面几篇文章中的步骤,已经将备库建立为主库的物理STANDBY,下面将物理STANDBY转化为逻辑STANDBY数据库。

首先检查主库中没有包含唯一约束的表:

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
------------------------------ ------------------------------
NDMAIN                         PLAN_TABLE
NDMAIN                         QUEST_SX_PLAN1
NDMAIN                         SQLEXPERT_PLAN1

需要注意,这个SQL可能会执行相当长的时间。

找到这些不包括主键的表,可以人为的添加一个RELY主键:

SQL> CONN NDMAIN
输入口令:
已连接。
SQL> ALTER TABLE PLAN_TABLE ADD PRIMARY KEY (TIMESTAMP, ID) RELY DISABLE;

表已更改。

SQL> ALTER TABLE QUEST_SX_PLAN1 ADD PRIMARY KEY (TIMESTAMP, ID) RELY DISABLE;

表已更改。

SQL> ALTER TABLE SQLEXPERT_PLAN1 ADD PRIMARY KEY (TIMESTAMP, ID) RELY DISABLE;

表已更改。

为这些表添加一个RELY主键,使得Oracle确信表中的主键约束,而真正的数据由用户来保证。

由于物理STANDBY已经创建成功,下面直接进行下一步,停止应用日志:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

数据库已更改。

修改主库的初始化参数,将ONLINE_LOGFILES状态和STANDBY_LOGIFLES状态区分开,需要注意,在修改参赛前,应该在RAC的两个节点上执行添加新目录的命令:

SQL> ALTER SYSTEM SET
  2  LOG_ARCHIVE_DEST_1 =
  3  'LOCATION=/data/oracle/oradata/rac11g/archivelog/
  4  VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES)
  5  DB_UNIQUE_NAME=rac11g';

系统已更改。

SQL> HOST mkdir /data/oracle/oradata/rac11g/archivelog2/

SQL> ALTER SYSTEM SET
  2  LOG_ARCHIVE_DEST_3 =
  3  'LOCATION=/data/oracle/oradata/rac11g/archivelog2/
  4  VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)
  5  DB_UNIQUE_NAME=rac11g';

系统已更改。

然后创建LOGMNR使用的数据字典:

SQL> EXEC DBMS_LOGSTDBY.BUILD

PL/SQL 过程已成功完成。

接着就可以将物理STANDBY数据库转化为逻辑STANDBY数据库了:

SQL> ALTER DATABASE RECOVER TO LOGICAL STANDBY RAC11G_L;
ALTER DATABASE RECOVER TO LOGICAL STANDBY RAC11G_L
*
1 行出现错误:
ORA-19952:
应以独占方式装载数据库

执行报错,这里就是RAC环境与普通环境的区别所在了。虽然这个错误号在metalink上都找不到对应的文章,不过幸好错误信息的描述还比较清楚,只需要将数据库的CLUSTER_DATABASE初始化参数置于FALSE,就可以执行上面的操作:

SQL> ALTER SYSTEM SET CLUSTER_DATABASE = FALSE SCOPE = SPFILE;

系统已更改。

SQL> SHUTDOWN IMMEDIATE
ORA-01109:
数据库未打开


已经卸载数据库。
ORACLE
例程已经关闭。
SQL> STARTUP MOUNT
ORACLE
例程已经启动。

Total System Global Area 1.7108E+10 bytes
Fixed Size                  2101632 bytes
Variable Size            3344420480 bytes
Database Buffers         1.3757E+10 bytes
Redo Buffers                4431872 bytes
数据库装载完毕。
SQL> ALTER DATABASE RECOVER TO LOGICAL STANDBY RAC11G_L;
ALTER DATABASE RECOVER TO LOGICAL STANDBY RAC11G_L
*
1 行出现错误:
ORA-20000: File +DATA/rac11g/rac11g_temp_2_16g has wrong dbid or dbname, remove or restore the offending file.


SQL> ALTER DATABASE TEMPFILE '+DATA/rac11g/rac11g_temp_2_16g' DROP;

数据库已更改。

SQL> ALTER DATABASE TEMPFILE '+DATA/rac11g/rac11g_temp_1_4g' DROP;

数据库已更改。

SQL> ALTER DATABASE RECOVER TO LOGICAL STANDBY RAC11G_L;

数据库已更改。

由于创建的物理STANDBY后,没有重置TEMP表空间,导致临时表空间文件状态不正确,这里可以先删除临时文件,等到数据库打开后再手工添加。

SQL> SHUTDOWN IMMEDIATE
ORA-01507:
未装载数据库


ORACLE
例程已经关闭。
SQL> STARTUP MOUNT
ORACLE
例程已经启动。

Total System Global Area 1.7108E+10 bytes
Fixed Size                  2101632 bytes
Variable Size            3344420480 bytes
Database Buffers         1.3757E+10 bytes
Redo Buffers                4431872 bytes
数据库装载完毕。
SQL> ALTER SYSTEM SET
  2  LOG_ARCHIVE_DEST_1 =
  3   'LOCATION=+DATA/RAC11G/
  4  VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES)
  5  DB_UNIQUE_NAME=rac11g_s';

系统已更改。

SQL> ALTER SYSTEM SET
  2  LOG_ARCHIVE_DEST_3 =
  3  'LOCATION=+DATA/RAC11G/DATAFILE/
  4  VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)
  5  DB_UNIQUE_NAME=rac11g_s';

系统已更改。

PRIMARY数据库一样,STANDBY数据库也需要将ONLINE_LOGFILESSTANDBY_LOGFILES分开。

SQL> ALTER DATABASE OPEN RESETLOGS;

数据库已更改。

SQL> ALTER DATABASE START LOGICAL STANDBY APPLY;

数据库已更改。

打开数据库后,开始逻辑应用。

下面添加临时文件:

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '+DATA/rac11g/rac11g_temp_1_4g' SIZE 4G REUSE;

表空间已更改。

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '+DATA/rac11g/rac11g_temp_2_16g' SIZE 16G REUSE;

表空间已更改。

物理STANDBY数据库没有创建STANDBY LOGFILE,下面创建STANDBY数据库的STANDBY LOGFILE文件:

SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 '+DATA/rac11g/rac11g_standby_redo1_1_1_1g' SIZE 1G;

数据库已更改。

SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 '+DATA/rac11g/rac11g_standby_redo1_2_1_1g' SIZE 1G;

数据库已更改。

SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 '+DATA/rac11g/rac11g_standby_redo1_3_1_1g' SIZE 1G;

数据库已更改。

SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 8 '+DATA/rac11g/rac11g_standby_redo2_1_1_1g' SIZE 1G;

数据库已更改。

SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 9 '+DATA/rac11g/rac11g_standby_redo2_2_1_1g' SIZE 1G;

数据库已更改。

SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 10 '+DATA/rac11g/rac11g_standby_redo2_3_1_1g' SIZE 1G;

数据库已更改。

创建完STANDBY LOGFILE之后,可以用IMMEDIATE方式应用日志:

SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;

数据库已更改。

SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

数据库已更改。

SQL> SELECT * FROM V$LOGSTDBY_STATE;

PRIMARY_DBID SESSION_ID REALTIME_APPLY  STATE
------------ ---------- --------------- ----------------------------------------
  1712482917          1 Y               APPLYING

数据库已经处于应用状态。

更改数据库的CLUSTER_DATABASE初始化参数,并在节点1打开数据库:

SQL> ALTER SYSTEM SET CLUSTER_DATABASE = TRUE SCOPE = SPFILE;

系统已更改。

SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;

数据库已更改。

SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE
例程已经关闭。
SQL> STARTUP
ORACLE
例程已经启动。

Total System Global Area 1.7108E+10 bytes
Fixed Size                  2101632 bytes
Variable Size            3344420480 bytes
Database Buffers         1.3757E+10 bytes
Redo Buffers                4431872 bytes
数据库装载完毕。
数据库已经打开。
SQL> SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE;

INSTANCE_NAME    STATUS
---------------- ------------
rac11g1          OPEN

SQL> SELECT NAME, OPEN_MODE, DATABASE_ROLE FROM V$DATABASE;

NAME                                                         OPEN_MODE  DATABASE_ROLE
------------------------------------------------------------ ---------- ----------------
RAC11G_L                                                     READ WRITE LOGICAL STANDBY

在节点2打开数据库:

$ sqlplus "/ as sysdba"

SQL*Plus: Release 11.1.0.6.0 - Production on 星期三 9 17 19:34:07 2008

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

已连接到空闲例程。

SQL> STARTUP
ORACLE
例程已经启动。

Total System Global Area 1.7108E+10 bytes
Fixed Size                  2101632 bytes
Variable Size            3478638208 bytes
Database Buffers         1.3623E+10 bytes
Redo Buffers                4431872 bytes
数据库装载完毕。
数据库已经打开。
SQL> SELECT INSTANCE_NAME, STATUS FROM GV$INSTANCE;

INSTANCE_NAME    STATUS
---------------- ------------
rac11g2          OPEN
rac11g1          OPEN

SQL> SELECT NAME, OPEN_MODE, DATABASE_ROLE FROM V$DATABASE;

NAME      OPEN_MODE  DATABASE_ROLE
--------- ---------- ----------------
RAC11G_L  READ WRITE LOGICAL STANDBY

两个节点都处于打开状态。

在节点1

SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

数据库已更改。

SQL> SELECT * FROM V$LOGSTDBY_STATE;

PRIMARY_DBID SESSION_ID REALTIME_APPLY  STATE
------------ ---------- --------------- ----------------------------------------
  1712482917          1 Y               IDLE

和物理STANDBY不同,逻辑STANDBY可以在两个节点同时启动的时候应用日志。

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-613588/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-613588/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值