利用RMAN的DUPLICATE创建STANDBY将单实例数据库升级为RAC环境
2010年03月05日 作者: 大头刚
利用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; 在实例2,3对应的节点上,尝试只读方式打开数据库: [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 TrackbackNo comments yet.
No trackback yet.