适用于 Oracle数据库 - 企业版 - 版本10.1.0.2至10.2.0.4 [10.1至10.2] Oracle数据库 - 企业版 - 版本12.1.0.2至12.1.0.2 [12.1] Oracle数据库 - 企业版 - 版本11.2.0.4至11.2.0.4 [11.2] Oracle数据库 - 企业版 - 版本11.1.0.7至11.1.0.7 [11.1]
目标 以下说明描述了如何在不关闭主(生产)数据库的情况下,使用RMAN复制逐步创建物理备用数据库的过程。 Database Name :- prim Primary db_unique_name :- prim standby db_unique_name :- stdby Primary Hostname :- raca.idc.oracle.com standby Hostname :- core1.idc.oracle.com
解决方案
启用强制日志记录。
创建备用重做日志(SRL)。
在主数据库的参数文件中做出适当的更改。
备份数据库,包括数据文件、归档日志和控制文件,以便备用,并将备份复制到备用服务器。
为备用数据库创建参数文件。
从主数据库到备用数据库建立连接。
将备份移动到备用服务器。
和 9. 启动备用实例。
使用RMAN复制命令创建备用数据库。
创建SRL。
启动MRP(管理恢复进程)。
验证是否正确地将日志发送并应用到备用数据库。
步骤1:在主数据库上启用强制日志记录。
1 SQL > ALTER DATABASE FORCE LOGGING;
注意:如果不存在,请创建密码文件,同时检查是否已启用归档。
步骤2:在主数据库上配置备用重做日志。
1 2 3 4 SQL > ALTER DATABASE ADD STANDBY LOGFILE GROUP 3 '/u01/app/oracle/databases/prim/redo/log3a.log' size 50 m;SQL > ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 '/u01/app/oracle/databases/prim/redo/log4a.log' size 50 m;SQL > ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 '/u01/app/oracle/databases/prim/redo/log5a.log' size 50 m;SQL > ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 '/u01/app/oracle/databases/prim/redo/log6a.log' size 50 m;
注意: 检查SRL(备用重做日志)的数量, (每个线程的最大日志文件数 + 1)* 最大线程数 SRL的大小应等于ORL(在线重做日志)的大小。 例如,如果主数据库每个线程有3个日志文件,且有2个线程,那么备用数据库上需要8个备用重做日志文件组。 验证是否已创建备用重做日志文件组。
1 SQL > SELECT GROUP #,ThREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;
步骤3:修改主数据库的初始化参数以配置Data Guard,具体如下:
1 2 3 4 5 6 7 8 SQL > alter system set LOG_ARCHIVE_CONFIG= 'DG_CONFIG=(prim,stdby)' ;SQL > alter system set LOG_ARCHIVE_DEST_1= 'LOCATION=/u01/app/oracle/databases/prim/redo/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=prim' ;SQL > alter system set LOG_ARCHIVE_DEST_2= 'SERVICE=stdby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=stdby' ;SQL > alter system set LOG_ARCHIVE_DEST_STATE_1= ENABLE;SQL > alter system set FAL_SERVER= stdby;SQL > alter system set FAL_CLIENT= prim;SQL > alter system set DB_FILE_NAME_CONVERT= '/u01/app/oracle/databases/stdby/data/' ,'/u01/app/oracle/databases/prim/data' scope = spfile;SQL > alter system set LOG_FILE_NAME_CONVERT= '/u01/app/oracle/databases/stdby/redo/' ,'/u01/app/oracle/databases/prim/redo' scope = spfile;
步骤4:在主数据库上运行备份作业,通过连接到目标数据库和目录数据库(如果有的话)。
1 2 3 4 5 6 7 8 run { allocate channel c1 type disk; allocate channel c2 type disk; backup database format '/u01/app/oracle/databases/stage/%U'; backup archivelog all format '/u01/app/oracle/databases/stage/%U'; backup current controlfile for standby format '/u01/app/oracle/databases/stage/%U'; }
步骤5:在主数据库上创建参数文件,将其复制到备用数据库,并做出必要的更改。
1 SQL > create pfile= '/u01/app/oracle/databases/prim/stage/initstdby.ora' from spfile;
步骤6:建立连接 在主数据库和备用数据库上都创建网络服务。 在prim服务器上,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 prim = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =raca.idc.oracle.com )(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = prim) ) ) stdby = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =core1.idc.oracle.com )(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = stdby) ) )
在standby服务器上,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 prim = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =raca.idc.oracle.com )(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = prim) ) ) stdby = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =core1.idc.oracle.com )(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = stdby) ) )
步骤7:将文件移动到备用服务器, a. 在备用服务器上创建相同的目录并复制备份。 在备用服务器操作系统上,
1 2 $mkdir -p /u01/app/oracle/databases/stage/[oracle@raca prim]$ scp /u01/app/oracle/databases/stage/* core1.idc.oracle.com:/u01/app/oracle/databases/stage/
b. 另外,我们可以将备份复制到备用服务器的不同目录。在备用服务器上,以主数据库为目标连接到RMAN,并以辅助实例身份登录,如果你的主数据库有目录数据库,那么以主数据库为目标、目录数据库和辅助实例身份连接。将这些备份片段编入目录,以便主数据库或目录数据库的控制文件知道备份信息。
步骤8:在备用服务器上对复制的initstdby.ora文件进行必要的更改。
1 2 3 4 5 6 7 8 9 10 11 12 13 db_name=prim db_unique_name=stdby log_archive_config='DG_CONFIG=(prim,stdby)' log_archive_dest_1='LOCATION=/u01/app/oracle/databases/stdby/redo/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=stdby' log_archive_dest_2='SERVICE=prim LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=prim' log_archive_dest_state_1=ENABLE db_file_name_convert='/u01/app/oracle/databases/prim/data/' ,'/u01/app/oracle/databases/stdby/data/' log_file_name_convert='/u01/app/oracle/databases/prim/redo/' ,'/u01/app/oracle/databases/stdby/redo/' REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE standby_archive_dest='/u01/app/oracle/databases/stdby/arch/' standby_file_management=AUTO fal_client=stdby fal_server=prim
步骤9:创建备用实例。 创建与主数据库相同的密码。或者,我们可以从主数据库复制密码文件并在备用数据库上重命名它。 例如,从主数据库复制密码文件,
1 scp /u01/app/oracle/dbs/opapwprim core1.idc.oracle.com:/u01/app/oracle/dbs/
在standby上,
1 $mv orapwprim orapwstdby
或者创建与主数据库相同的新密码,如下所示, a. 对于UNIX,
1 2 $export ORACLE_SID$orapwd file='$ORACLE_HOME/dbs/orapwstdby' password=sys entries=10;
对于Windows,
1 2 d:>set ORACLE_SID=stdby d:>oradim -new -sid stdby -intpwd sys
b. 在备用服务器上创建必要的目录并启动辅助实例。
1 2 3 4 5 [oracle@core1 stdby]$ pwd /u01/app/oracle/databases/stdby [oracle@core1 stdby]$mkdir data redo oradata stage udump bdump cdump SQL>create spfile from pfile='/u01/app/oracle/databases/stage/initstdby.ora' ; SQL>start nomount;
步骤10:在备用服务器上使用RMAN复制创建备用数据库。 当在备用数据库的复制命令中指定’dorecover’时,请在目标数据库上执行归档日志切换,并运行复制命令。 例如: 对于primary,
1 sql > alter system archive log current ;
在备用服务器上,通过连接字符串连接到目标数据库(即prim)和目录数据库(如果有的话),以及这个辅助数据库,操作如下,
1 $RMAN target /@prim catalog RMAN/RMAN@catdb auxiliary /
如果是no catalog数据库,
1 2 3 4 5 6 $RMAN target sys/<password>@prim auxiliary /Recovery Manager: Release 10.2.0.1.0 - Production on Thu Mar 5 12:30:56 2009 Copyright (c) 1982, 2005, Oracle. All rights reserved. connected to target database: PRIM (DBID=3971986030) connected to auxiliary database: PRIM (DBID=3971986030, not open) RMAN> duplicate target database for standby dorecover;
注意:我们也可以使用不带dorecover子句的选项, 例如,
1 RMAN>duplicate target database for standby;
步骤11:创建SRL,
1 2 SQL > ALTER DATABASE ADD STANDBY LOGFILE GROUP 3 '/u01/app/oracle/databases/prim/redo/log3a.log' size 50 m;参考步骤2
步骤12:在备用数据库上启动MRP(管理恢复进程),
1 2 3 4 5 SQL > select name,db_unique_name,database_role from v$database;NAME DB_UNIQUE_NAME DATABASE_ROLE PRIM STDBY PHYSICAL STANDBY SQL > alter database recover managed standby database disconnect ;
步骤13:在主数据库上启用log_archive_dest_2,该参数用于将日志发送到备用服务器。
1 SQL > alter system set log_archive_dest_state_2= enable;
步骤14:检查备用数据库是否与主数据库同步, A. 在备用数据库上检查v$archived_log视图,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 SQL > SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;SEQUENCE# FIRST_TIM NEXT_TIME 29 06 - MAR-09 06 - MAR-09 30 06 - MAR-09 06 - MAR-09 31 06 - MAR-09 06 - MAR-09 32 06 - MAR-09 06 - MAR-09 33 06 - MAR-09 06 - MAR-09 34 06 - MAR-09 06 - MAR-09 35 06 - MAR-09 06 - MAR-09 36 06 - MAR-09 06 - MAR-09 37 06 - MAR-09 06 - MAR-09 38 06 - MAR-09 06 - MAR-09 39 06 - MAR-09 06 - MAR-09
B. 在主数据库上执行日志切换,
1 SQL > ALTER SYSTEM SWITCH LOGFILE;
C. 在备库上执行,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 SQL > SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;SEQUENCE# FIRST_TIM NEXT_TIME 29 06 - MAR-09 06 - MAR-09 30 06 - MAR-09 06 - MAR-09 31 06 - MAR-09 06 - MAR-09 32 06 - MAR-09 06 - MAR-09 33 06 - MAR-09 06 - MAR-09 34 06 - MAR-09 06 - MAR-09 35 06 - MAR-09 06 - MAR-09 36 06 - MAR-09 06 - MAR-09 37 06 - MAR-09 06 - MAR-09 38 06 - MAR-09 06 - MAR-09 39 06 - MAR-09 06 - MAR-09 40 06 - MAR-09 07 - MAR-09 SQL > select sequence#,applied from v$archived_log order by sequence#;SEQUENCE# APP 29 YES30 YES31 YES32 YES33 YES34 YES35 YES36 YES37 YES38 YES39 YES40 YES