云和恩墨 成就所托 www.enmotech.com Oracle DataGuard 数据库迁移方案 (2015/10/16) 云和恩墨(北京)信息技术有限公司 http://www.enmotech.com 技术顾问 章芋文 http://www.enmotech.com 实力成就稳健 技术创造价值 -1- www.enmotech.com 云和恩墨 成就所托 目 录 1. 报告概述 ......................................................................................................................................................... - 3 2. 迁移步骤 ......................................................................................................................................................... - 3 3. 迁移前期工作 ................................................................................................................................................. - 3 4. 配置 DG .......................................................................................................................................................... - 3 5. 切换 DG .......................................................................................................................................................... - 7 - http://www.enmotech.com 实力成就稳健 技术创造价值 -2- 云和恩墨 成就所托 www.enmotech.com 1. 报告概述 近期需要将数据库从存储上迁移到本地硬盘上,采用 DG 搭建一套备库,然后将备库切换为主库的方式来 迁移。 2. 迁移步骤 迁移前期环境准备工作、配置 DG 备库、主备切换、应用连接切换后的主库测试、迁移完成。 3. 迁移前期工作 目标端环境准备,包括主机存储网络等环境的准备,安装相同版本的数据库。 原库打开归档。 4. 配置 DG 在生产端数据库服务器和容灾端数据库服务器上配置 ADG,具体步骤包括: 1) 主库检查。例如: --开归档 archive log list --开 force logging select force_logging from v$database; --alter database force logging; --查看监听参数 show parameter listener --查看 name show parameter name --查看 password 验证方式 show parameter password 2) 配置主备库 tnsnames.ora,例如: orcl = (DESCRIPTION = http://www.enmotech.com 实力成就稳健 技术创造价值 -3- 云和恩墨 成就所托 www.enmotech.com (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.103.13)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.103.14)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) oadb = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.103.12)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oadb) ) ) 3) 配置备库监听: LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = standby) (ORACLE_HOME = /oracle/app/oracle/product/11.2/db_1) (SID_NAME = standby) ) ) 4) 调整主库参数文件: SQL> alter system set db_recovery_file_dest='/arch' scope=both; System altered. SQL> alter system set log_archive_config='dg_config=(primary,standby)' scope=spfile; System altered. http://www.enmotech.com 实力成就稳健 技术创造价值 -4- 云和恩墨 成就所托 www.enmotech.com SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary' scope=spfile; System altered. SQL> alter system set LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby' scope=spfile; ASYNC System altered. SQL> alter system set LOG_ARCHIVE_DEST_STATE_1='ENABLE' scope=spfile; System altered. SQL> alter system set LOG_ARCHIVE_DEST_STATE_2='ENABLE' scope=spfile; System altered. SQL> alter system set standby_file_management='AUTO' scope=spfile; System altered. SQL> alter system set fal_client='primary' scope=spfile; System altered. 参数修改完成以后,备份参数文件 SQL> create pfile='/tmp/pfile.ora' from spfile; File created. 5) 准备备库密码文件: #在主库执行 scp orapwpdm standby:/oracle/app/oracle/product/11.2/db_1/dbs #在备库执行 mv orapwpdm orapwstandby 6) 准备备库参数文件: *.audit_file_dest='/oracle/app/oracle/admin/standby/adump' *.audit_trail='db' *.compatible='11.2.0.0.0' *.control_files='/oradata/PRIMARY/controlfile/o1_mf_8ph6tn64_.ctl','/arch/PRIMARY/controlfile/o 1_mf_8ph6tnp3_.ctl' *.db_block_size=8192 *.db_create_file_dest='/oradata' *.db_create_online_log_dest_1='' http://www.enmotech.com 实力成就稳健 技术创造价值 -5- 云和恩墨 成就所托 www.enmotech.com *.db_domain='' *.db_name='primary' *.db_recovery_file_dest='/arch' *.db_recovery_file_dest_size=7340032000 *.diagnostic_dest='/oracle/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=primaryXDB)' *.fal_client='standby' *.fal_server='primary' *.log_archive_config='dg_config=(primary,standby)' *.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby' *.log_archive_dest_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary' *.log_archive_dest_state_1='ENABLE' *.log_archive_dest_state_2='ENABLE' *.open_cursors=300 *.pga_aggregate_target=209715200 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE' *.sga_target=838860800 *.standby_file_management='AUTO' *.undo_tablespace='UNDOTBS1' *.db_unique_name='standby' *.service_names='standby' 7) 创建 standbylogfile,大小与生产一致,数量为(日志组数量+1)*实例数量: #在主库执行 alter database alter database alter database alter database add add add add standby standby standby standby logfile logfile logfile logfile '/oradata/PRIMARY/onlinelog/std01.log' '/oradata/PRIMARY/onlinelog/std02.log' '/oradata/PRIMARY/onlinelog/std03.log' '/oradata/PRIMARY/onlinelog/std04.log' size size size size 100m; 100m; 100m; 100m; 8) 克隆数据库: #启动备库到 nomount SQL>startup nomount #在主库执行 rman target sys/oracle@primary auxiliary sys/oracle@standby run { allocate channel prmy1 type disk; allocate channel prmy2 type disk; allocate channel prmy3 type disk; allocate channel prmy4 type disk; allocate auxiliary channel stby type disk; duplicate target database for standby from active database http://www.enmotech.com 实力成就稳健 技术创造价值 -6- 云和恩墨 成就所托 www.enmotech.com spfile parameter_value_convert 'primary','standby' set db_unique_name='standby' set log_archive_max_processes='5' set control_files='/oradata/PRIMARY/controlfile/o1_mf_8ph6tn64_.ctl','/arch/PRIMARY/controlfile/o1_ mf_8ph6tnp3_.ctl' set fal_client='standby' set fal_server='primary' set standby_file_management='AUTO' set log_archive_config='dg_config=(primary,stabdby)' set log_archive_dest_2='service=primary ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=primary' ; } 9) 在备库启用日志同步 alter database recover managed standby database using current logfile disconnect from session; #确保备库与主库的日志同步完成 SELECT ARCH.THREAD# "Thread", ARCH.SEQUENCE# "Last Sequence Received", APPL.SEQUENCE# "Last Sequence Applied" FROM (SELECT THREAD# ,SEQUENCE# FROM V$ARCHIVED_LOG WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$ARCHIVED_LOG GROUP BY THREAD#)) ARCH, (SELECT THREAD# ,SEQUENCE# FROM V$LOG_HISTORY WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$LOG_HISTORY GROUP BY THREAD#)) APPL WHERE ARCH.THREAD# = APPL.THREAD# ORDER BY 1; --确保输出结果里面 Last Sequence Received 和 Last Sequence Applied 完全一致; 5. 切换 DG (1) 检查备库日志应用和主库保持一致: Tue Oct 30 19:06:24 CST 2012 Media Recovery Log /u2/fra/RT/archivelog/arc_1_670629641_90481.dbf Media Recovery Waiting for thread 1 sequence 90482 Tue Oct 30 19:06:34 CST 2012 Redo Shipping Client Connected as PUBLIC -- Connected User is Valid RFS[4]: Assigned to RFS process 2050 RFS[4]: Identified database type as 'physical standby' Tue Oct 30 19:06:44 CST 2012 Redo Shipping Client Connected as PUBLIC http://www.enmotech.com 实力成就稳健 技术创造价值 -7- 云和恩墨 成就所托 www.enmotech.com -- Connected User is Valid RFS[5]: Assigned to RFS process 2052 RFS[5]: Identified database type as 'physical standby' RFS[5]: Successfully opened standby log 5: '/ora1/RT/stdredo05a.log' Tue Oct 30 19:06:49 CST 2012 Media Recovery Log /u2/fra/RT/archivelog/arc_1_670629641_90482.dbf Media Recovery Waiting for thread 1 sequence 90483 (2) 检查主库状态: SQL> select DATABASE_ROLE, PROTECTION_MODE, SWITCHOVER_STATUS, FLASHBACK_ON from v$database; DATABASE_ROLE PROTECTION_MODE SWITCHOVER_STATUS FLASHBACK_ON ---------------- -------------------- -------------------- -----------------PRIMARY MAXIMUM PERFORMANCE SESSIONS ACTIVE NO (3) 切换主库为备库: SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN; Database altered. (4) 检查备库是否可以切换为主库: SQL> select DATABASE_ROLE, PROTECTION_MODE, SWITCHOVER_STATUS, FLASHBACK_ON from v$database; DATABASE_ROLE PROTECTION_MODE SWITCHOVER_STATUS FLASHBACK_ON ---------------- -------------------- -------------------- -----------------PHYSICAL STANDBY MAXIMUM PERFORMANCE TO PRIMARY NO (5) 切换备库为主库: SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; Database altered. SQL> select open_mode from V$database; OPEN_MODE ---------MOUNTED SQL> alter database open; Database altered. SQL> select open_mode from V$database; OPEN_MODE ---------READ WRITE http://www.enmotech.com 实力成就稳健 技术创造价值 -8-