[root@ORACLE ~]# su - oracle [oracle@ORACLE ~]$ sqlplus / as sysdba 1. 查看主库归档模式: SQL> select log_mode from v$database; LOG_MODE ------------ ARCHIVELOG 2. 如果不是归档模式,进行如下修改: SQL>SHUTDOWN IMMEDIATE; SQL>STARTUP MOUNT; SQL>ALTER DATABASE ARCHIVELOG; SQL>ALTER DATABASE OPEN; 3. 将主库修改为强制日志模式: SQL> alter database force logging; Database altered. 4. 查看db_name,主库和备库的db_name要相同: SQL> show parameter db_name; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_name string orcl 5. 查看unique_name,主库和备库的unique_name必须不一样,那么在后面生成pfile拷给备库后,需要将db_unique_name改为orcl_dg。 SQL> show parameter name; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ cell_offloadgroup_name string db_file_name_convert string db_name string orcl db_unique_name string orcl global_names boolean FALSE instance_name string oradb lock_name_space string log_file_name_convert string processor_group_name string service_names string orcl 6. 为主数据库添加standby redolog文件: [oracle@ORACLE orcl]$ sqlplus / as sysdba SQL> alter database add standby logfile ('/u01/app/oracle/oradata/orcl/standby_redo01.log') size 50M; Database altered. SQL> alter database add standby logfile ('/u01/app/oracle/oradata/orcl/standby_redo02.log') size 50M; Database altered. SQL> alter database add standby logfile ('/u01/app/oracle/oradata/orcl/standby_redo03.log') size 50M; Database altered. SQL> alter database add standby logfile ('/u01/app/oracle/oradata/orcl/standby_redo04.log') size 50M; Database altered. 6. 修改DG_CONFIG SQL> alter system set log_archive_config='DG_CONFIG=(orcl,orcl_dg)'; System altered. SQL> show parameter recovery; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest string /u01/app/oracle/fast_recovery_area db_recovery_file_dest_size big integer 4182M recovery_parallelism integer 0 7. 修改远程归档路径,将其发送到远程的orcl_dg服务器上。 SQL> alter system set log_archive_dest_2='SERVICE=orcl_dg LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_dg'; System altered. 8. 将第二个归档路径开启。 SQL> alter system set log_archive_dest_state_2=enable; System altered. SQL> select group#,member from v$logfile; GROUP# MEMBER ---------- -------------------------------------------------------------------------------- 3 /u01/app/oracle/oradata/orcl/redo03.log 2 /u01/app/oracle/oradata/orcl/redo02.log 1 /u01/app/oracle/oradata/orcl/redo01.log 4 /u01/app/oracle/oradata/orcl/standby_redo01.log 5 /u01/app/oracle/oradata/orcl/standby_redo02.log 6 /u01/app/oracle/oradata/orcl/standby_redo03.log 7 /u01/app/oracle/oradata/orcl/standby_redo04.log SQL> alter system set log_archive_format='%t_%s_%r.arc' scope=spfile; System altered. SQL> alter system set log_archive_max_processes=30; System altered. SQL> alter system set remote_login_passwordfile=exclusive scope=spfile; System altered. SQL> alter system set fal_server=orcl_dg; System altered. SQL> alter system set standby_file_management=auto; System altered. SQL> quit 9. 在主备库中同时修改tnsname.ora,添加以下两个配置: [oracle@ORACLE oracle]$ vi /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora # tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ORACLE)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) ) ORCL_DG = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ORADG)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) ) "product/11.2.0/db_1/network/admin/tnsnames.ora" 30L, 682C written 10. 开始备份: [oracle@ORACLE oracle]$ rman target / RMAN> backup database plus archivelog; Finished backup at 07-FEB-17 RMAN> exit Recovery Manager complete. # 如果备库已经创建了库,那么只需要将备库的oradata路径下的文件全部删除,以及控制文件删除,密码文件删除 # [oracle@ORADG ~]$ cd /u01/app/oracle/oradata/orcl/ # [oracle@ORADG orcl]$ ls # control01.ctl redo01.log redo03.log system01.dbf undotbs01.dbf # example01.dbf redo02.log sysaux01.dbf temp01.dbf users01.dbf # 删除备库的oradata路径下面的文件,不需要重新创建该路径 # [oracle@ORADG orcl]$ rm -rf * # 如果没有创建库,那么就需要在备库创建对应的路径: # [oracle@ORADG ~] mkdir -p /u01/app/oracle/oradata/orcl # [oracle@ORADG ~] mkdir -p /u01/app/oracle/fast_recovery_area/ORCL # [oracle@ORADG ~] mkdir -p /u01/app/oracle/admin/orcl/adump 11. 生成pfile文件,将其拷贝到备用数据库,并进行修改 [oracle@ORACLE admin]$ sqlplus / as sysdba SQL> create pfile='/u01/app/oracle/pfileoradb1.ora' from spfile; File created. SQL> show parameter spfile; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ spfile string /u01/app/oracle/product/11.2.0/db_1/dbs/spfileoradb.ora SQL> quit [oracle@ORACLE admin]$ scp /u01/app/oracle/pfileoradb1.ora 192.168.56.20:/u01/app/oracle/product/11.2.0/db_1/dbs/ pfileoradb1.ora 100% 1319 1.3KB/s 00:00 12. 在节点2上进行修改,如下,将主库的pfile文件拷贝过来进行修改,修改以下三个参数 [oracle@ORADG orcl]$ cd /u01/app/oracle/product/11.2.0/db_1/dbs/ [oracle@ORADG dbs]$ ls hc_orcl.dat init.ora lkORCL lkORCL_DG orapworcl pfileoradb1.ora spfileorcl.ora [oracle@ORADG dbs]$ mv spfileorcl.ora spfileorcl.ora.bak [oracle@ORADG dbs]$ vi pfileoradb1.ora *.db_unique_name='orcl_dg' *.fal_server='orcl' *.log_archive_dest_2='SERVICE=orcl ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl' 13. 在节点1上生成备用控制文件,并拷贝到节点2上: [oracle@ORACLE admin]$ sqlplus / as sysdba SQL> alter database create standby controlfile as '/tmp/orcl_dg.ctl'; Database altered. SQL> quit [oracle@ORACLE admin]$ scp /tmp/orcl_dg.ctl 192.168.56.20:/u01/app/oracle/oradata/orcl/control01.ctl orcl_dg.ctl 100% 9520KB 9.3MB/s 00:00 14. 在节点2上另一个路径下生成第二个control02 [oracle@ORADG adump]$ cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/fast_recovery_area/orcl/control02.ctl 15. 将其余归档文件和备份文件一起考到备用数据库上 [oracle@ORADG adump]$ scp -r 192.168.56.21:/u01/app/oracle/fast_recovery_area/ORCL/backupset /u01/app/oracle/fast_recovery_area/ORCL o1_mf_nnndf_TAG20170207T155257_d9lz6t7j_.bkp 100% 1122MB 17.5MB/s 01:04 o1_mf_annnn_TAG20170207T155438_d9lz9yv8_.bkp 100% 220KB 219.5KB/s 00:00 o1_mf_ncsnf_TAG20170207T155257_d9lz9x5f_.bkp 100% 9600KB 9.4MB/s 00:01 o1_mf_annnn_TAG20170207T155250_d9lz6lfj_.bkp 100% 82MB 16.5MB/s 00:05 [oracle@ORADG adump]$ scp -r 192.168.56.21:/u01/app/oracle/fast_recovery_area/ORCL/archivelog /u01/app/oracle/fast_recovery_area/ORCL o1_mf_1_10_d9lz9ykm_.arc 100% 218KB 218.0KB/s 00:00 o1_mf_1_8_d9lxp78t_.arc 100% 40KB 39.5KB/s 00:00 o1_mf_1_7_d9lxnfvf_.arc 100% 37MB 37.0MB/s 00:01 o1_mf_1_9_d9lz6k42_.arc 100% 2691KB 2.6MB/s 00:00 o1_mf_1_6_d9lk1v9w_.arc 100% 43MB 42.7MB/s 00:01 [oracle@ORADG dbs]$ scp 192.168.56.21:/u01/app/oracle/product/11.2.0/db_1/dbs/orapworadb $ORACLE_HOME/dbs oracle@192.168.56.21's password: orapworadb 100% 1536 1.5KB/s 00:00 16. 开启备库的监听: [oracle@ORADG dbs]$ lsnrctl start 17. 在备库创建spfile [oracle@ORADG dbs]$ export ORACLE_SID=orcl [oracle@ORADG dbs]$ sqlplus / as sysdba SQL> create spfile from pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/pfileoradb1.ora'; 18. 对备库进行恢复: [oracle@ORADG dbs]$ rman target / RMAN> startup mount RMAN> restore database; Finished restore at 07-FEB-17 19. 此时在备库查看状态,没有MRP进程 SQL> select process,status,sequence# from v$managed_standby; PROCESS STATUS SEQUENCE# --------- ------------ ---------- ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 PROCESS STATUS SEQUENCE# --------- ------------ ---------- ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 PROCESS STATUS SEQUENCE# --------- ------------ ---------- ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 20. 进行同步(在备库上执行)可以看到已经有了MRP进程, SQL> alter database recover managed standby database using current logfile disconnect from session; Database altered. SQL> select process,status,sequence# from v$managed_standby; PROCESS STATUS SEQUENCE# --------- ------------ ---------- ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 ARCH CONNECTED 0 MRP0 WAIT_FOR_GAP 10 21. 但是还是没有进行同步,可以在线面看到status为WAIT_FOR_GAP,下面是排错过程: SQL> select process,client_process,sequence#,status from v$managed_standby; PROCESS CLIENT_P SEQUENCE# STATUS --------- -------- ---------- ------------ ARCH ARCH 0 CONNECTED MRP0 N/A 10 WAIT_FOR_GAP SQL> select sequence#,applied from v$archived_log; SEQUENCE# APPLIED ---------- --------- 6 NO 7 NO 8 NO 9 NO 10 NO SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 9 Next log sequence to archive 11 Current log sequence 11 SQL> select dest_name,status from v$archive_dest_status where dest_name='LOG_ARCHIVE_DEST_2'; DEST_NAME STATUS ----------- --------- LOG_ARCHIVE_DEST_2 ERROR SQL> show parameter log_archive_dest_2 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest_2 string SERVICE=orcl_dg LGWR ASYNC VAL ID_FOR=(ONLINE_LOGFILES,PRIMAR Y_ROLE) DB_UNIQUE_NAME=orcl_dg log_archive_dest_20 string log_archive_dest_21 string log_archive_dest_22 string log_archive_dest_23 string SQL> show parameter log_archive_dest_state_2 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest_state_2 string ENABLE log_archive_dest_state_20 string enable log_archive_dest_state_21 string enable log_archive_dest_state_22 string enable log_archive_dest_state_23 string enable log_archive_dest_state_24 string enable log_archive_dest_state_25 string enable log_archive_dest_state_26 string enable log_archive_dest_state_27 string enable log_archive_dest_state_28 string enable log_archive_dest_state_29 string enable SQL> alter system set log_archive_dest_state_2=enable; System altered. SQL> select dest_name,status from v$archive_dest_status where dest_name='LOG_ARCHIVE_DEST_2'; DEST_NAME STATUS -------------- ----- LOG_ARCHIVE_DEST_2 ERROR SQL> SQL> show parameter dump NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ background_core_dump string partial background_dump_dest string /u01/app/oracle/diag/rdbms/orc l/oradb/trace core_dump_dest string /u01/app/oracle/diag/rdbms/orc l/oradb/cdump max_dump_file_size string unlimited shadow_core_dump string partial user_dump_dest string /u01/app/oracle/diag/rdbms/orc l/oradb/trace SQL> quit [oracle@ORACLE orcl]$ cd /u01/app/oracle/diag/rdbms/orcl/oradb/trace/ [oracle@ORACLE trace]$ ls -l total 1156 -rw-r-----. 1 oracle oinstall 389529 Feb 7 17:20 alert_oradb.log [oracle@ORACLE trace]$ tail -n 200 alert_oradb.log *********************************************************************** TNS-12545: Connect failed because target host or object does not exist (错误在这里可以看出,是因为无法连接到目标服务器) ns secondary err code: 12560 nt main err code: 515 TNS-00515: Connect failed because target host or object does not exist nt secondary err code: 111 nt OS err code: 0 Error 12545 received logging on to the standby PING[ARC1]: Heartbeat failed to connect to standby 'orcl_dg'. Error is 12545. [oracle@ORACLE trace]$ cd /u01/app/oracle/product/11.2.0/db_1/network/admin/ [oracle@ORACLE admin]$ ls listener.ora samples shrept.lst tnsnames.ora 检查tnsname.ora文件,查看是否有错误,检查发现无措 [oracle@ORACLE admin]$ cat tnsnames.ora [oracle@ORACLE admin]$ tnsping ORCL_DG TNS-12545: Connect failed because target host or object does not exist (这里发现tnsping不同,在hosts文件中没有添加备库的host记录,而在tnsname.ora文件中使用的HOST为计算机名,因此无法解析,修改名称为IP) [oracle@ORACLE admin]$ vi tnsnames.ora ORCL_DG = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.20)(PORT = 1521)) ) (SERVICE_NAME = orcl) ) "tnsnames.ora" 30L, 690C written [oracle@ORACLE admin]$ tnsping ORCL_DG Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.20)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl))) OK (50 msec) [oracle@ORACLE admin]$ sqlplus / as sysdba SQL> select dest_name,status from v$archive_dest_status where dest_name='LOG_ARCHIVE_DEST_2'; DEST_NAME STATUS ------------------ --------- LOG_ARCHIVE_DEST_2 ERROR SQL> alter system set log_archive_dest_state_2=enable; System altered. SQL> select dest_name,status from v$archive_dest_status where dest_name='LOG_ARCHIVE_DEST_2'; DEST_NAME STATUS -------------------- --------- LOG_ARCHIVE_DEST_2 VALID SQL> / DEST_NAME STATUS ------------------ --------- LOG_ARCHIVE_DEST_2 ERROR SQL> quit [oracle@ORACLE admin]$ cd /u01/app/oracle/diag/rdbms/orcl/oradb/trace/ [oracle@ORACLE trace]$ tail -n 200 alert_oradb.log *********************************************************************** Fatal NI connect error 12545, connecting to: (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ORADG)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)(CID=(PROGRAM=oracle)(HOST=ORACLE)(USER=oracle)))) VERSION INFORMATION: TNS for Linux: Version 11.2.0.4.0 - Production TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.4.0 - Production Time: 07-FEB-2017 17:21:40 Tracing not turned on. Tns error struct: ns main err code: 12545 TNS-12545: Connect failed because target host or object does not exist ns secondary err code: 12560 nt main err code: 515 TNS-00515: Connect failed because target host or object does not exist nt secondary err code: 111 nt OS err code: 0 Error 12545 received logging on to the standby PING[ARC1]: Heartbeat failed to connect to standby 'orcl_dg'. Error is 12545. Tue Feb 07 17:22:43 2017 Error 1033 received logging on to the standby PING[ARC1]: Heartbeat failed to connect to standby 'orcl_dg'. Error is 1033. Tue Feb 07 17:22:55 2017 ALTER SYSTEM SET log_archive_dest_state_2='ENABLE' SCOPE=BOTH; Tue Feb 07 17:23:45 2017 Error 1033 received logging on to the standby PING[ARC1]: Heartbeat failed to connect to standby 'orcl_dg'. Error is 1033. 注:密码文件在拷贝过来之后,是orapw+SID,SID要修改为备用数据库的instance_name,否则不生效 [oracle@ORACLE trace]$ cd /u01/app/oracle/product/11.2.0/db_1/dbs/ [oracle@ORACLE dbs]$ ls hc_oradb.dat init.ora lkORCL lkPRIMARY orapworadb snapcf_oradb.f spfileoradb.ora [oracle@ORACLE dbs]$ scp orapworadb 192.168.56.20:$ORACLE_HOME/dbs/orapworcl orapworadb 100% 1536 1.5KB/s 00:00 [oracle@ORACLE dbs]$ sqlplus / as sysdba DEST_NAME STATUS ------------------ --------- LOG_ARCHIVE_DEST_2 ERROR SQL> alter system set log_archive_dest_state_2=enable; System altered. SQL> select dest_name,status from v$archive_dest_status where dest_name='LOG_ARCHIVE_DEST_2'; DEST_NAME STATUS -------------------- --------- LOG_ARCHIVE_DEST_2 VALID SQL> / DEST_NAME STATUS -------------------- --------- LOG_ARCHIVE_DEST_2 VALID 22. 经过以上排错,数据库同步正常(在备库上查询,已经生成了RFS进程,其中LGWR进程就是将主库上的redo抓取过来): SQL> select process,client_process,sequence#,status from v$managed_standby; PROCESS CLIENT_P SEQUENCE# STATUS --------- -------- ---------- ------------ ARCH ARCH 0 CONNECTED ARCH ARCH 0 CONNECTED MRP0 N/A 12 APPLYING_LOG RFS ARCH 0 IDLE RFS UNKNOWN 0 IDLE RFS LGWR 12 IDLE RFS UNKNOWN 0 IDLE 23. 将同步取消,MRP进程消失: SQL> alter database recover managed standby database cancel; Database altered. SQL> select process,client_process,sequence#,status from v$managed_standby; PROCESS CLIENT_P SEQUENCE# STATUS --------- -------- ---------- ------------ ARCH ARCH 0 CONNECTED ARCH ARCH 0 CONNECTED ARCH ARCH 0 CONNECTED RFS ARCH 0 IDLE RFS UNKNOWN 0 IDLE RFS LGWR 12 IDLE RFS UNKNOWN 0 IDLE 24. 此时可将备库打开到open状态,及read_only,然后再进行同步: SQL> alter database open; Database altered. SQL> alter database recover managed standby database using current logfile disconnect from session; Database altered. SQL> select process,client_process,sequence#,status from v$managed_standby; PROCESS CLIENT_P SEQUENCE# STATUS --------- -------- ---------- ------------ ARCH ARCH 0 CONNECTED ARCH ARCH 0 CONNECTED RFS ARCH 0 IDLE MRP0 N/A 12 APPLYING_LOG RFS UNKNOWN 0 IDLE RFS LGWR 12 IDLE RFS UNKNOWN 0 IDLE 25. 从下面查询可以看出,此时数据库处于read_only并且正常同步状态 SQL> select database_role,open_mode from v$database; DATABASE_ROLE OPEN_MODE ---------------- -------------------- PHYSICAL STANDBY READ ONLY WITH APPLY SQL> select database_role,switchover_status from v$database; DATABASE_ROLE SWITCHOVER_STATUS ---------------- -------------------- PHYSICAL STANDBY NOT ALLOWED 测试: SQL> create table test as select * from dba_objects; Table created. 在节点2上查询得到如下结果,开始有延时。 SQL> select count(1) from test; select count(1) from test * ERROR at line 1: ORA-00942: table or view does not exist SQL> / COUNT(1) ---------- 86962 在节点1上将test表truncate掉 SQL> truncate table test; Table truncated. 节点2上查询结果如下: SQL> SQL> / COUNT(1) ---------- 0 节点2上查询结果如下: #DG常用维护命令 1、检查备库是否与主库同步 执行时间:每天 检查 applied 状态是否全部 为YES, 如果发现有 NO 行,请联系我 ; SQL> select sequence#,applied from v$archived_log; 检查sequence#的序号主库和备库是否一致,如果一致,说明日志已正确传送到备库。 检查 applied 状态是否为YES,如果是,说明规档日志已在备库中应用。NO为日志没有应用。 2、备库归档日志的删除 应定期删除 archive log, 以防止目录填满,导致整个 oracle 实例挂起 。 可以定制自动作业,用rman脚本,删除7天之前的的归档日志 DELETE noprompt ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7'; 3、 swithover 执行时间 : 计划 swithover 主库和备份都正常在线进行的一种转换 4、FAILOVER 执行时间:主库故障 5、 注册丢失的归档日志文件 从9i以后,oracle dataguard 备库一般都不需要手工处理丢失的日志,FAL自动会帮我们处理。个别情况,也是需要手工处理丢失的日志的。 在备库查询有哪些日志丢失,没应用到备库 SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP; 如果有记录,则把相应的归档日志从主库拷贝到备库。 备库注册: ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1'; 6、在生产库停止Data Guard操作: SQL> show parameter log_archive_dest SQL> alter system set log_archive_dest_state_2=defer; 7、在生产库开启Data Guard操作: SQL> alter system set log_archive_dest_state_2=enable; 8、查询备库相关进程信息 SQL> select process,client_process,sequence#,status from v$managed_standby; PROCESS列显示进程信息 CLIENT_PROCESS列显示对应的主数据库中的进程 SEQUENCE#列显示归档redo的序列号 STATUS列显示的进程状态 9、正确关闭顺序 首先关闭 standby database: SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; SQL>SHUTDOWN IMMEDIATE; 然后关闭product database SQL>SHUTDOWN IMMEDIATE;