1.环境介绍 百货–数据库服务器
实例名称 
IP 
账户 
密码 
db_name 
db_unique_name 
service_name 
 
 
zbds-baihuo-DB01 
172.16.35.141 
zyadmin 
** zbdsora 
zbdsora 
zbdsora 
 
zbds-baihuo-DB02 
172.16.35.140 
zyadmin 
** zbdsora 
zbdsora_std 
zbdsora_std 
 
2.DG部署 2.1.建立主库zbdsora DBCA建立主库,修改online redo 大小为500M
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 SQL> set  linesize 160 set  pagesize 2000col GROUP# for  999 col status for  a10 col TYPE  for  a10 col MEMBER for  a15 col IS_RECOVERY_DEST_FILE for  a10 select * from  v$log ; select * from  v$logfile ;    alter database add  logfile thread 1 group  1 '/alidata/oradata/zbdsora/redo01.log'  size 500M;  alter database add  logfile thread 1 group  2 '/alidata/oradata/zbdsora/redo02.log'  size 500M;  alter database add  logfile thread 1 group  3 '/alidata/oradata/zbdsora/redo03.log'  size 500M;  alter database add  logfile thread 1 group  4 '/alidata/oradata/zbdsora/redo04.log'  size 500M;  alter database add  logfile thread 1 group  5 '/alidata/oradata/zbdsora/redo05.log'  size 500M;   alter database drop logfile group  1; alter database drop logfile group  2; alter database drop logfile group  3; alter system  switch logfile; alter system  checkpoint; select group#,bytes,status from  v$log ; 
2.2.主库开启归档 主库开启归档并设置强制日志 force logging
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 SQL > shutdown immediate SQL > startup mountSQL > alter  database  archivelog; alter  system  set  log_archive_dest_1='location=/alidata/arch' ; SQL > alter  database  force logging;SQL > alter  database  open ;SQL > archive log  list;SQL > select  force_logging from  v$database ;
2.3.主库添加Standby Redo Log 1 2 3 4 5 6 7 8 9 10 11 --查看Redo和Standby Redo SQL> select * from  v$logfile ;											 --仅仅显示Online Redo,不显示Standby Redo SQL> select * from  v$log ;												 --新增一组大小为500M的Standby Redo,这里的group号不得与Online redo重复 SQL> alter database add  standby logfile group  21 '/alidata/oradata/zbdsora/standby21.log'  size 500M; alter database add  standby logfile group  22 '/alidata/oradata/zbdsora/standby22.log'  size 500M; alter database add  standby logfile group  23 '/alidata/oradata/zbdsora/standby23.log'  size 500M; alter database add  standby logfile group  24 '/alidata/oradata/zbdsora/standby24.log'  size 500M; alter database add  standby logfile group  25 '/alidata/oradata/zbdsora/standby25.log'  size 500M; alter database add  standby logfile group  26 '/alidata/oradata/zbdsora/standby26.log'  size 500M; 
2.4.从主库创建pfile文件 创建pfile文件, 默认路径为$ORACLE_HOME/dbs,此处为/alidata/oracle/product/11.2.0/db_1/dbs/,在sqlplus里执行以下命令
1 SQL> create  pfile from  spfile; 
将主库的pfile复制到备库/alidata/oracle/product/11.2.0/db_1/dbs/下
1 2 3 4 5 6 7 cd /alidata/oracle/product/11.2 .0 /db_1/dbs/ scp -P 40022  initzbdsora.ora zyadmin@ 172.16 .35 .140 :/software/dumpfile/ zyadmin/5 Eb/5 Al!7Uy@ 6 Oh! cp /software/dumpfile/initzbdsora.ora /alidata/oracle/product/11.2 .0 /db_1/dbs/ chown oracle. /alidata/oracle/product/11.2 .0 /db_1/dbs/initzbdsora.ora 
2.5.设置主库初始化参数 编辑/alidata/oracle/product/11.2.0/db_1/dbs/initzbdsora.ora文件,追加
1 2 3 4 5 6 7 8 9 10 11 12 cat >> /alidata/oracle/product/11.2.0/db_1/dbs/initzbdsora.ora << "EOF"  *.db_unique_name ='zbdsora'  *.fal_server ='zbdsora_std'  *.log_archive_config ='dg_config=(zbdsora,zbdsora_std)'  *.log_archive_dest_1 ='location=use_db_recovery_file_dest valid_for=(all_logfiles, all_roles) db_unique_name=zbdsora'  *.log_archive_dest_2 ='service=zbdsora_std lgwr async valid_for=(online_logfile,primary_role) db_unique_name=zbdsora_std'  *.log_archive_dest_state_1 =ENABLE *.log_archive_dest_state_2 =ENABLE *.standby_file_management ='AUTO'  *.db_file_name_convert ='/alidata/oradata/zbdsora' ,'/alidata/oradata/zbdsora' *.log_file_name_convert ='/alidata/oradata/zbdsora' ,'/alidata/oradata/zbdsora' EOF 
创建新的主库spfile文件,并重新启动主库
1 2 3 SQL > shutdown immediate SQL > create  spfile from  pfile;SQL > startup
2.6.设置备库初始化参数 编辑/alidata/oracle/product/11.2.0/db_1/dbs/initzbdsora.ora文件,修改备库初始化参数
1 2 3 4 5 6 7 8 9 10 11 12 cat >> /alidata/oracle/product/11.2.0/db_1/dbs/initzbdsora.ora << "EOF"  *.db_unique_name ='zbdsora_std'  *.fal_server ='zbdsora'  *.log_archive_config ='dg_config=(zbdsora,zbdsora_std)'  *.log_archive_dest_1 ='location=use_db_recovery_file_dest valid_for=(all_logfiles, all_roles) db_unique_name=zbdsora_std'  *.log_archive_dest_2 ='service=zbdsora_pri lgwr async valid_for=(online_logfile,primary_role) db_unique_name=zbdsora'  *.log_archive_dest_state_1 =ENABLE *.log_archive_dest_state_2 =ENABLE *.standby_file_management ='AUTO'  *.db_file_name_convert ='/alidata/oradata/zbdsora' ,'/alidata/oradata/zbdsora' *.log_file_name_convert ='/alidata/oradata/zbdsora' ,'/alidata/oradata/zbdsora' EOF 
alter system set log_archive_dest_2=’service=zbdsora_pri lgwr async valid_for=(online_logfile,primary_role) db_unique_name=zbdsora’;
2.7.复制主库的密码文件到备库 将密码文件orapwzbdsora复制到备库的/alidata/oracle/product/11.2.0/db_1/dbs/下
1 2 3 4 5 6 7 8 9 scp -P 40022  /alidata/oracle/product/11.2 .0 /db_1/dbs/orapwzbdsora zyadmin@ 172.16 .35 .140 :/software/dumpfile/ zyadmin/5 Eb/5 Al!7Uy@ 6 Oh! cd /alidata/oracle/product/11.2 .0 /db_1/dbs/ cp /software/dumpfile/orapwzbdsora /alidata/oracle/product/11.2 .0 /db_1/dbs/ chown oracle. /alidata/oracle/product/11.2 .0 /db_1/dbs/orapwzbdsora 
2.8.创建备库相应的目录结构 使用oracle用户创建以下目录,避免权限问题
1 2 3 mkdir -p /alidata/ oradata/zbdsora/  mkdir -p /alidata/ oracle/admin/ zbdsora/adump/  mkdir -p /alidata/ oracle/fast_recovery_area/ zbdsora/  
2.9.配置主库和备库的监听### 使用图形界面配置,采用静态监听,注意一定要配置静态监听
vim /alidata/oracle/product/11.2.0/db_1/network/admin/listener.ora
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 手动配置: 主库: SID_LIST_LISTENER  =  (SID_LIST  =     (SID_DESC  =       (GLOBAL_DBNAME  = zbdsora_pri)       (ORACLE_HOME  = /alidata/oracle/product/11.2 .0 /db_1)       (SID_NAME  = zbdsora)     )   ) LISTENER  =  (DESCRIPTION_LIST  =     (DESCRIPTION  =       (ADDRESS  = (PROTOCOL  = IPC)(KEY  = EXTPROC1521))       (ADDRESS  = (PROTOCOL  = TCP)(HOST  = 172.16 .35.141 )(PORT  = 1521 ))     )   ) ADR_BASE_LISTENER  = /alidata/oracle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 备库: SID_LIST_LISTENER  =  (SID_LIST  =     (SID_DESC  =       (GLOBAL_DBNAME  = zbdsora_std)       (ORACLE_HOME  = /alidata/oracle/product/11.2 .0 /db_1)       (SID_NAME  = zbdsora)     )   ) LISTENER  =  (DESCRIPTION_LIST  =     (DESCRIPTION  =       (ADDRESS  = (PROTOCOL  = IPC)(KEY  = EXTPROC1521))       (ADDRESS  = (PROTOCOL  = TCP)(HOST  = 172.16 .35.140 )(PORT  = 1521 ))     )   ) ADR_BASE_LISTENER  = /alidata/oracle
2.10.配置主库和备库的网络服务名 使用图形界面配置,在主备库上均需配置zbdsora、zbdsora_std两个服务名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 zbdsora_pri =   (DESCRIPTION  =         (ADDRESS_LIST  =         (ADDRESS  = (PROTOCOL  = TCP)(HOST  = 172.16 .35.141 )(PORT  = 1521 ))         )         (CONNECT_DATA  =         (sid  = zbdsora)         ) ) zbdsora_std =   (DESCRIPTION  =     (ADDRESS_LIST  =       (ADDRESS  = (PROTOCOL  = TCP)(HOST  = 172.16 .35.140 )(PORT  = 1521 ))     )     (CONNECT_DATA  =       (sid  = zbdsora)     )   ) 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ZBDSORA_PRI =   (DESCRIPTION  =     (ADDRESS_LIST  =       (ADDRESS  = (PROTOCOL  = TCP)(HOST  = 172.16 .35.141 )(PORT  = 1521 ))     )     (CONNECT_DATA  =       (SID  = zbdsora)     )   ) ZBDSORA_STD =   (DESCRIPTION  =     (ADDRESS_LIST  =       (ADDRESS  = (PROTOCOL  = TCP)(HOST  = 172.16 .35.140 )(PORT  = 1521 ))     )     (CONNECT_DATA  =       (SID  = zbdsora)     )   ) 
2.11.创建备库并启动 创建备库的spfile文件,启动备库到nomount模式
1 2 SQL > create  spfile from  pfile;SQL > startup nomount
2.12.RMAN复制主库到备库 首先RMAN连接到目标数据库和辅助数据库
1 rman target  sys/oracle@zbdsora _pri auxiliary sys/oracle@zbdsora _std 
使用RMAN的duplicate命令进行复制,两边目录结构相同,需要添加nofilenamecheck参数
1 RMAN> duplicate target database  for  standby from  active database  nofilenamecheck; 
复制成功后,备库自动被加载为mount模式,进入sqlplus查看
1 SQL> select  status from  v$instance; 
2.13.在备库开启实时日志应用 1 SQL > alter  database  recover managed standby database  using  current  logfile disconnect from  session ;
2.14.主备库角色状态查询 1 2 3 SQL > select  switchover_status,database_role from  v$database ;
3.测试DG 3.1.执行日志切换测试 在主库端切换归档,在备库检查是否也发生了切换
主库上执行日志切换
1 2 3 SQL> archive log list; SQL> alter system  switch logfile; archive log list; 
备库上查看,日志的sequence号也跟着变了
3.2.查看备库启动的DG进程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 SQL> select process,client_process,sequence#,status from  v$managed_standby; PROCESS   CLIENT_P  SEQUENCE# STATUS   ------ ARCH      ARCH             23  CLOSING   ARCH      ARCH              0  CONNECTED             ARCH      ARCH             21  CLOSING   ARCH      ARCH              0  CONNECTED   RFS       ARCH              0  IDLE   RFS       UNKNOWN           0  IDLE   RFS       LGWR             24  IDLE                RFS       UNKNOWN           0  IDLE   MRP0      N/A              24  APPLYING_LOG       9  rows selected.
3.3.查看数据库的保护模式 1 2 3 4 5 6 SQL > select  database_role,protection_mode,protection_level,open_mode from  v$database ;DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL     OPEN_MODE   PRIMARY           MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE  READ  WRITE 
3.4.查看DG的日志信息 1 SQL> select  * from  v$dataguard_status; 
3.5.Open Read Only Standby数据库 以只读方式打开备库,并开启实时日志应用
1 2 3 4 5 SQL > shutdown immediate SQL > startupSQL > select  database_role,protection_mode,protection_level,open_mode from  v$database ;SQL > select  process,client_process,sequence #,status from  v$managed_standby;SQL > alter  database  recover managed standby database  using  current  logfile disconnect from  session ;
3.6.解锁scott用户并添加数据,验证是否同步 在主库解锁scott用户并创建测试表,插入10000行数据。
操作如下
1 2 3 4 5 6 7 8 9 10 11 12 13 SQL > set  line  200 SQL > select  username,default_tablespace,account_status from  dba_users where  username='SCOTT' ;SQL > alter  user  scott account unlock;SQL > conn scott/tiger;SQL > show  user SQL > create  table  test001 (id number(10 ),name  varchar2(20 ));SQL > begin      for  i in  1. .10000  loop       insert  into  test001 values  (1 ,'ww' );      end  loop ;      end ;      / SQL > commit ;
standby端查询scott用户是否解锁,以及test001表是否创建并且插入了10000行数据
1 2 3 SQL > conn scott/tiger;SQL > select  * from  tab;SQL > select  count(*) from  scott.test001;
4.DG三种模式 这种保护模式(默认)提供了可能的最高级别的数据保护,而不影响主数据库的性能。这是通过允许事务在恢复该事务所需重做数据在写到本地联机重做日志后立即提交而实现的。主数据库的重做数据流也写到至少一个备数据库,但是那个重做流相对于创建重做数据的事务是异步写的。
当所用的网络连接有足够的带宽,这种模式提供了近似于最大可用性模式的数据保护级别,并且对主数据库性能的影响最小。
4.2.最大可用性模式max availability 这种保护模式提供了可能的最高级别的数据保护,而不用与主数据库的可用性相折衷。与最大保护模式相同,在恢复事务所需的重做写到本地联机重做日志和至少一个事务一致性备数据库上的备重做日志之前,事务将不会提交。与最大保护模式不同的是,如果故障导致主数据库无法写重做流到异地备重做日志时,主数据库不会关闭。替代地,主数据库以最大性能模式运行直到故障消除,并且解决所有重做日志文件中的中断。当所有中断解决之后,主数据库自动继续以最大可用性模式运行。
这种模式确保如果主数据库故障,但是只有当第二次故障没有阻止完整的重做数据集从主数据库发送到至少一个备数据库时,不发生数据丢失。
4.3.最大保护模式max protection 这种保护模式确保如果主数据库故障不会发生数据丢失。要提供这种级别的保护,恢复每个事务所需的重做数据必须在事务提交之前同时写到本地联机重做日志和至少一个备数据库上的备重做日志。要确保不发生数据丢失,如果故障导致主数据库无法写重做流到至少一个事务一致性备数据库的备重做日志时,主数据库会关闭。
4.4.查询当前模式 1 SQL> select  protection_mode,protection_level from  v$database ; 
5.DG切换测试 5.1.DG switchover 切换测试 db11-zbdsora:主库——>备库
db12-zbdsora:备库——>主库
主备库角色状态查询
1 2 3 SQL > select  switchover_status,database_role,open_mode from  v$database ;
主-zbdsora切换到备库
1 2 3 4 5 SQL > alter  database  commit  to  switchover to  physical standby;SQL > alter  database  commit  to  switchover to  physical standby with  session  shutdown;SQL > shutdown immediate SQL > startup mount
从-zbdsora切换到主库
1 2 SQL > alter  database  commit  to  switchover to  primary ;SQL > alter  database  open ;
db11-zbdsora执行APPLY LOG命令
1 2 3 4 5 6 7 SQL > alter  database  recover managed standby database  disconnect from  session ;SQL > alter  database  recover managed standby database  cancel;SQL > alter  database  open ;SQL > alter  database  recover managed standby database  disconnect from  session ;SQL > select  switchover_status,database_role,open_mode from  v$database ;
5.2.DG failover 切换测试 db11-zbdsora:主库——>崩溃
db12-zbdsora:备库——>主库
主备库角色状态查询
1 SQL> select  switchover_status,database_role,open_mode from  v$database ; 
db11-zbdsora通过shutdown abort方式人工模拟主库崩溃,直接关闭
1 2 3 4 SQL> select open_mode from  v$database ; SQL> shutdown abort SQL> startup mount SQL> alter system  flush redo to  'zbdsora_std' ; 
db12-zbdsora执行如下操作切换为主库
1 2 3 4 5 6 7 SQL > select  thread#, low_sequence#, high_sequence# from  v$archive_gap;SQL > alter  database  recover managed standby database  cancel;SQL > alter  database  recover managed standby database  finish;SQL > alter  database  commit  to  switchover to  primary ;SQL > alter  database  open ;SQL > select  open_mode, switchover_status from  v$database ;
5.3.DG failover后重建DG db11-zbdsora:崩溃——>备库
db12-zbdsora:主库——>主库(保持主库状态不变)
db12-zbdsora主库角色状态查询
1 SQL> select  switchover_status,database_role,open_mode from  v$database ; 
db12-zbdsora主库创建备库控制文件
SQL> alter database create standby controlfile as ‘/u01/bak/control01.ctl’;
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 1 将备库控制文件拷贝至db11 scp ezdb12:/u01/bak/control01.ctl /alidata/oradata/zbdsora/control01.ctl cp /alidata/oradata/zbdsora/control01.ctl /u01/app/oracle/fast_recovery_area/zbdsora/ mv /u01/app/oracle/fast_recovery_area/zbdsora/control01.ctl /u01/app/oracle/fast_recovery_area/zbdsora/control02.ctl 1 2 3 恢复对应数据文件至db11,并启动db11-zbdsora到mount状态,应用APPLY模式 SQL > startup mount;SQL > alter  database  recover managed standby database  disconnect from  session ;1 2 启动db11-zbdsora至OPEN 状态,并应用APPLY REDO模式 SQL > alter  database  recover managed standby database  cancel;SQL > alter  database  open ;SQL > alter  database  recover managed standby database  disconnect from  session ;1 2 3 6. 开启和关闭DataGuard的流程6.1 .关闭关闭主库 SQL > shutdown immediate 1 关闭主库监听 lsnrctl stop 1 查询备库是否正在执行重做应用或实时应用。如果MRP0或MRP进程存在,则备库正在应用重做。 SQL > select  process, status from  v$managed_standby;1 如果重做应用程序正在运行,停止备库的Redo日志的应用 SQL > alter  database  recover managed standby database  cancel;1 关闭备库 SQL > shutdown immediate 1 关闭备库监听 lsnrctl stop 1 6.2 .开启启动备库监听 lsnrctl start  1 启动备库到mount状态 SQL > startup mount;1 开启备库的Redo日志应用 SQL > alter  database  recover managed standby database  using  current  logfile disconnect from  session ;1 启动主库监听 lsnrctl start  1 启动主库 SQL > startup;1 检查日志情况的SQL 语句 select  al.thrd "Thread", almax "Last Seq Received", lhmax "Last Seq Applied" from  (select  thread# thrd, max(sequence #) almax        from  v$archived_log        where  resetlogs_change#=(select  resetlogs_change# from  v$database )        group  by  thread#) al,       (select  thread# thrd, max(sequence #) lhmax        from  v$log_history        where  first_time=(select  max(first_time) from  v$log_history)        group  by  thread#) lh  where  al.thrd = lh.thrd;