利用RMAN的DUPLICATE创建STANDBY,可以在不停机的情况下将单实例数据库迁移到RAC数据库。当然这种不停机是指相对的,在DG进行切换的时候,停机时间可以保证在5分钟之内完成。

首先确保目标服务器上的RAC环境已经建立,由于RMAN的DUPLICATE创建STANDBY,没有办法将数据文件放到远端的ASM磁盘组中,本次测试使用OCFS2做为RAC的共享存储文件系统。如果使用ASM作为存储机制,无法实现不停机迁移。
测试环境:

primary sid         : test
primary ip          : 192.168.1.200
 
standby sid         : testrac01,testrac03,testrac03
standby Public  ip  : 192.168.1.101,192.168.1.102,192.168.1.103
standby Virtual ip  : 192.168.1.201,192.168.1.202,192.168.1.203
standby Private ip  : 10.0.0.1,10.0.0.2,10.0.0.3

RAC数据库环境如下:

SYS@test_rac01>select * FROM v$version;
BANNER
----------------------------------------------------------------
Oracle DATABASE 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE	10.2.0.3.0	Production
TNS FOR Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
 
SYS@test_rac01>select instance_name, STATUS FROM gv$instance;
 
INSTANCE_NAME	 STATUS
---------------- ------------
testrac01	 OPEN
testrac02	 OPEN
testrac03	 OPEN

RAC的数据文件路径和primary的路径一直,共享磁盘挂载到对应的路径

df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda     ocfs2    1.4T  202G  1.2T  15% /u01/app/oracle/oradata

一、由于要进行将目标数据库升级为RAC环境,因此需要添加UNDOTBS和THREAD对应的日志,因为我们是3个节点,需要UNDOTBS2、UNDOTBS3和THREAD2、THREAD3

 
SQL> CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE '/u01/app/oracle/oradata/test/undotbs02.dbf' SIZE 4096M;
SQL> CREATE UNDO TABLESPACE UNDOTBS3 DATAFILE '/u01/app/oracle/oradata/test/undotbs03.dbf' SIZE 4096M;
 
SQL> ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 11 '/u01/app/oracle/oradata/test/redo11.log' SIZE 300M;
SQL> ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 12 '/u01/app/oracle/oradata/test/redo12.log' SIZE 300M;
SQL> ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 13 '/u01/app/oracle/oradata/test/redo13.log' SIZE 300M;
 
SQL> ALTER DATABASE ADD LOGFILE THREAD 3 GROUP 14 '/u01/app/oracle/oradata/test/redo14.log' SIZE 300M;
SQL> ALTER DATABASE ADD LOGFILE THREAD 3 GROUP 15 '/u01/app/oracle/oradata/test/redo15.log' SIZE 300M;
SQL> ALTER DATABASE ADD LOGFILE THREAD 3 GROUP 16 '/u01/app/oracle/oradata/test/redo16.log' SIZE 300M;
 
SQL> ALTER DATABASE ENABLE THREAD 2;
SQL> ALTER DATABASE ENABLE THREAD 3;

二、下面可以在主库修改初始化参数文件:
修改primary的监听。

testrac  =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.201)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = testrac01)
    )
  )

修改primary的DG参数

ALTER SYSTEM SET log_archive_config='DG_CONFIG=(test,testrac)' scope=both;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=testrac LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)' scope=both;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE scope=both;

在primary执行,利用当前的初始化参数,创建PFILE,修改后用于STANBY数据库的启动,同时生成STANDBY CONTROLFILE,与修改后的PFILE文件一起放到目标服务器上:

SQL> CREATE PFILE='/u01/app/oracle/inittestrac.ora' FROM SPFILE;
SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/u01/app/oracle/stb_control01.ctl';

修改参数,添加RAC参数

*.audit_file_dest='/u01/app/oracle/admin/test/adump'
*.background_dump_dest='/u01/app/oracle/admin/test/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/test/trol.ctl'   (到共享磁盘)
*.core_dump_dest='/u01/app/oracle/admin/test/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='testcent'
*.job_queue_processes=10
*.FAL_CLIENT='testcent'
*.FAL_SERVER='testcenter'
*.log_archive_config='DG_CONFIG=(test,testrac)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/oradata/flash_recovery_area VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testrac'  (归档目录放到共享磁盘)
*.log_archive_dest_2='SERVICE=test LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.job_queue_processes=10
*.log_archive_format='%t_%s_%r.dbf'
*.open_cursors=300
*.pga_aggregate_target=1349151744
*.processes=2500
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=2755
*.sga_max_size=1589934592
*.sga_target=1589934592
*.undo_management='AUTO'
*.user_dump_dest='/u01/app/oracle/admin/test/udump'
*.cluster_database=true
*.cluster_database_instances=3
*.db_unique_name='testrac'
testcent1.undo_tablespace='UNDOTBS1'
testcent2.undo_tablespace='UNDOTBS2'
testcent3.undo_tablespace='UNDOTBS3'
testcent1.instance_number=1
testcent2.instance_number=2
testcent3.instance_number=3
testcent1.thread=1
testcent2.thread=2
testcent3.thread=3
testcent1.local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.201)(PORT=1521))'
testcent2.local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.202)(PORT=1521))'
testcent3.local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.203)(PORT=1521))'
 
#有BUG,切换完毕在改回来。
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=100G
 
#如果数据文件路径没变就不用设置,改变了需要设置这2个参数
*.log_file_name_convert=('', '')
*.db_file_name_convert=('', '')

在STANDBY的RAC环境的3个节点上分别拷贝密码文件,在节点1,2,3上,密码文件应该重命名为orapwtestrac01,orapwtestrac02,orapwtestrac03。

三、确保两个节点上的对应目录都已经建立。

/u01/app/oracle/admin/test/bdump
/u01/app/oracle/admin/test/adump
/u01/app/oracle/admin/test/cdump
/u01/app/oracle/admin/test/bdump
/u01/app/oracle/oradata/test
/u01/app/oracle/oradata/flash_recovery_area/

四、在主库创建数据全备

rman target /
sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
backup AS COMPRESSED BACKUPSET DATABASE format '/u01/backup/rman_backup/data/test_full_%U_$DATE.dbf' ;

在备库把备份拷贝过来,放到相同的目录。

五、确保STANDBY数据库可以通过服务名访问主库,每个节点都设置。

[oracle@test-rac01 admin]$ tnsping test
TNS Ping Utility for Linux: Version 10.2.0.3.0 - Production on 25-JAN-2010 17:37:42
Copyright (c) 1997, 2006, Oracle.  All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.200)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = test))
OK (10 msec)

六、利用RMAN的DUPLICATE创建STANDBY,把节点2、3先关闭,只开启节点1。

SQL> conn /AS sysdba
Connected TO an idle instance.
SQsql> startup nomount pfile='xxxxxxxxx/orapwtestrac01'

必须是nomount状态,否则无法进行duplicate操作
登陆RMAN并且登陆到备库

[oracle@test-rac01 ~]$ rman target sys/XXXX@test auxiliary /
RMAN>connect auxiliary sys/XXX@testrac01
connected TO auxiliary DATABASE: testrac01(NOT mounted)
 
RMAN>duplicate target DATABASE FOR standby nofilenamecheck;

然后从库即可启动进行恢复:

SQL> ALTER DATABASE mount standby DATABASE;
ALTER DATABASE mount standby DATABASE
*
ERROR at line 1:
ORA-01100: DATABASE already mounted
 
SQL> ALTER DATABASE recover managed standby DATABASE disconnect FROM session;
DATABASE altered.

在共享磁盘上创建共享的SPFILE文件:

SQL> create spfile =  from pfile;
建议把参数文件放共享磁盘,每个节点去调用,例如:
[root@boss-rac01 dbs]# cat inittestrac01.ora
spfile=/u01/app/oracle/oradata/spfiletestrac.ora

下面关闭恢复归档状态,并已只读方式打开数据库:

SQL> ALTER DATABASE recover managed standby DATABASE cancel;
SQL> ALTER DATABASE open READ only;
 
在实例23对应的节点上,尝试只读方式打开数据库:
[oracle@test-rac02 dbs]$ cat inittestrac02.ora
spfile=/u01/app/oracle/oradata/spfiletestrac02.ora
 
SQsql> startup;
SQsql> SELECT instance_name, STATUS FROM gv$instance;
 
INSTANCE_NAME	 STATUS
---------------- ------------
testrac02	 OPEN
testrac01	 OPEN
testrac03	 OPEN

七、执行SWITCHOVER

下面为了执行SWITCHOVER操作,可以先关闭实例2、3,确认主库和备库归档应用已经同步。由于RAC环境STANDBY在SWITCHOVER时,很容易由于设置DB_RECOVERY_FILE_DEST导致bug的出现,因此在STANDBY数据库建立初始化参数文件的时候就没有加载DB_RECOVERY_FILE_DEST等参数,这里将主库的相应参数也去掉:

SQL> SHOW parameter db_recovery_file_dest
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
db_recovery_file_dest string
db_recovery_file_dest_size big integer 4G
 
SYS@testcenter>alter system SET db_recovery_file_dest='' scope=spfile;
System altered.

在主库执行SWITCHOVER操作:

SQL> ALTER DATABASE commit TO switchover TO physical standby;
SQL> shutdown immediate
SQL> startup mount
 
SQL> SELECT name, db_unique_name, database_role, switchover_status FROM v$database;
 
NAME	  DB_UNIQUE_NAME		 DATABASE_ROLE	  SWITCHOVER_STATUS
--------- ------------------------------ ---------------- --------------------
test      test			         PHYSICAL STANDBY SESSIONS ACTIVE

下面切换到RAC环境的STANDBY数据库,检查状态:

SQLSQsql> SELECT name, db_unique_name, database_role, switchover_status FROM v$database;

执行SWITCHOVER切换到主库,并打开数据库:

SQL> ALTER DATABASE commit TO switchover TO PRIMARY;
SQL> ALTER DATABASE open;
SQL> SELECT name, db_unique_name, database_role, switchover_status FROM v$database;
 
NAME	  DB_UNIQUE_NAME		 DATABASE_ROLE	  SWITCHOVER_STATUS
--------- ------------------------------ ---------------- --------------------
TESTRAC   testrac			 PRIMARY	  SESSIONS ACTIVE

切换成功。
在原主数据库,也就是切换完成后的STANDBY主库执行:

SQL> ALTER DATABASE recover managed standby DATABASE disconnect FROM session;

使得STANDBY数据库应用主库的归档。

在新的主数据库的节点2,3上,启动实例:

sqlplus "/ as sysdba"
SQL> startup;
SQL> SELECT instance_name, STATUS FROM gv$instance;
 
INSTANCE_NAME	 STATUS
---------------- ------------
testcent2	 OPEN
testcent1	 OPEN
testcent3	 OPEN

至此,单实例数据库到RAC环境STANDBY的SWITCHOVER操作完成。同时,单实例数据库升级到RAC环境数据库的操作也完成了。如果一旦升级后RAC环境出现问题,或者不适应系统的压力。可以通过SWITCHOVER的方法快速的切换为原始环境,且不会丢失任何的数据。

  • Comments (0)
  • Trackbacks (0)
Leave a comment Trackback

No comments yet.

No trackback yet.