目录
一、Data Guard介绍
Data Guard是保证企业数据的高可用性(high availability)、数据保护(data protection)以及灾难恢复(disaster recovery)的集成化灾难恢复解决方案,该技术可以维护生产数据库一个或多个同步备份,有一个生产数据库和若干个备用数据库组成,并形成一个独立的、易于管理的数据保护方案。Data Guard备用数据库可以与生产系统位于相同的数据中心,也可以是在地理位置上分布较远的的远程灾难备份中心。
二、Data Guard原理
Data Guard的基本原理是,当某次事务处理对生产数据库中的数据作出更改时,Oracle将在联机重做日志文件中记录此次更改。在Data Guard中,除了把日志记录到本地的联机日志文件和归档日志文件中外,还通过网络,把日志信息发送到远程的备用数据库服务器上。这个备用日志文件写入过程可以是实时、同步的,以实现零数据丢失(最大保护模式);也可以是异步的,以减少对网络带宽的压力(最大可用性模式);或者是通过归档日志文件的批量传输模式,以减少对生产系统的性能影响(最大性能模式)。
当备份数据库接收到日志信息时,Data Guard可以自动利用日志信息实现数据的同步。当主数据库打开并处于活动状态时,备份数据库可以执行恢复操作;如果主数据出现了故障,备用数据库即可以被激活并接管生产数据库的工作。
三、Data Guard主库与备库
3.1 Data Gurad主库
主库即生产数据库,主库可以是单一数据库实例,或者是RAC集群。
3.2 Data Guard备库
Data Guard备库按照从生产数据库传输过来的日志处理方法的不同分为物理备库、逻辑备库和快照备库。
物理备库,备份数据库处于mount状态下,直接利用数据恢复技术,把日志文件中记录的数据变更应用在备份数据库中,从而实现与生产数据库的数据同步,在进行数据同步的时候,物理备份数据库是不能打开的、也无法提供数据查询等服务;物理备用数据库也可以通过只读的方式打开,此时就只能接收日志文件,而无法进行数据的同步。
逻辑备库,数据库是处于正常打开状态,当它接收到新的日志信息后,利用日志挖掘器的功能,把日志中记录的变更信息转换成具体的SQL语句,并在逻辑备用数据库上执行这些SQL语句,从而实现与生产数据库的数据同步。逻辑备份数据支持在数据同步时,进行数据的查询、报表等操作。Oracle从9i R2开始支持逻辑备份数据库。
快照备库,可以暂时将物理备份数据库转换为可更新的数据库,快照备份数据不会立马应用接收到的日志文件,设一个时间点,一次性转换。
四、物理备库的数据保护级别
Oracle Data Guard 支持多种级别的数据保护模式:最大性能模式,最大可用性模式,最大保护模式。分别对应于“重要信息系统灾难恢复指南”中的5级,5级6级自适应,6级的数据保护级别。其中对应6级的最大保护模式可以实现实时数据实时同步和0数据丢失。另外,Oracle Data Guard 可以设置延时应用时间窗口,从而防范错误操作、黑客攻击等人为错误导致的数据损坏。
4.1 保护模式和重做传输
要确定适当的保护模式,企业需要根据用户对系统响应时间的要求来估量它们对数据保护的业务要求。下表从数据丢失风险的角度概述了各种模式的适用性。
保护模式 | 在灾难出现时数据丢失的风险 | 重做传输机制 |
最大保护 | 零数据丢失 | LGWR SYNC |
最大可用 | 零数据丢失 | LGWR SYNC |
最高性能 | 最小数据丢失 | LGWR SYNC或ARCH |
4.2 最大保护模式
最大保护模式为主数据库提供了最高水平的数据保护,从而确保一个全面的零数据丢失的灾难恢复解决方案。当在最大保护模式下运行时,重做记录由日志写入器 (LGWR) 进程从主数据库同步地传输到备用数据库,并且直到确认事务数据在至少一个备用服务器上的磁盘上可用时,才在主数据库上提交事务。
强烈建议,这种模式应至少配置两个备用数据库。当最后参与的备用数据库不可用时,主数据库上的处理将停止。这就确保了当主数据库与其所有备用数据库失去联系时,不会丢失事务。
由于重做传输的同步特性,这种最大保护模式可能潜在地影响主数据库响应时间。可以通过配置一个低延迟网络,并为它分配足够应付高峰事务负载的带宽来将这种影响减到最小。需要这种最大保护模式的企业有股票交易所、货币交易所、金融机构等。
4.3 最大可用性模式
最高可用性模式拥有仅次于最高水平的主数据库数据可用性。如同最大保护模式一样,重做数据由 LGWR 从主数据库同步地传输到备用数据库,直到确认事务数据在备用服务器的磁盘上可用时,事务才在主数据库上完成。不过,在这种模式下(与最大保护模式不同),如果最后参与的备用数据库变为不可用,例如由于网络连接问题,处理将在主数据库上继续进行。备用数据库与主数据库相比,可能暂时落在后面,但当它再次变为可用时,备用数据库将使用主数据库上累积的归档日志自动同步,而不会丢失数据。
由于同步重做传输,这种保护模式可潜在地影响响应时间和吞吐量。可以通过配置一个低延迟网络,并为它分配足够应付高峰事务负载的带宽来将这种影响减到最小。
最高可用性模式适用于想要确保获得零数据丢失保护,但不想让生产数据库受网络/备用服务器故障影响的企业。如果又一个故障随后影响了生产数据库,然后最初的网络/备用服务器故障得到解决,那么这些企业将接受数据丢失的可能性。
4.4 最高性能模式
最高性能模式是默认的保护模式。它与最高可用性模式相比,提供了稍微少一些的主数据库数据保护,但提供了更高的性能。在这种模式下,当主数据库处理事务时,重做数据由 LGWR 进程异步传输到备用数据库上。另外,也可以将主数据库上的归档器进程 (ARCH) 配置为在这种模式下传输重做数据。在任何情况下,均先完成主数据库上的写操作,主数据库的提交操作不等待备用数据库确认接收。如果任意备用目标数据库变为不可用,则处理将在主数据库上继续进行,这对性能只有很小的影响或没有影响。
在主数据库出现故障的情况下,尚未被发送到备用数据库的重做数据会丢失。但是,如果网络有足够的吞吐量来跟上重做流量高峰,并且使用了 LGWR 进程来将重做流量传输到备用服务器,则丢失的事务将非常少或者为零。
当主数据库上的可用性和性能比丢失少量数据的风险更重要时,应该使用最高性能模式。这种模式还适合于 WAN 上的 Data Guard 部署,在 WAN 中,网络的内在延迟可能限制同步重做传输的适用性。
五、Data Guard配置
5.1 准备
Primary Node:OA
OS:CentOS 6.2 DB:oracle 11.2.0.1
IP:172.29.41.90
Standby Node:OABAK
OS:CentOS 6.2 DB:oracle 11.2.0.1
IP:172.31.1.91
注意把两个数据库的在线重做日志调整到200M
注意:主从库的db_name是一样的
5.2 主库配置
5.2.1 确定主库处于归档模式
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /db/oracle/archive
Oldest online log sequence 1265
Next log sequence to archive 1267
Current log sequence 1267
如果没有启动归档模式,请使用以下方式启动归档
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> archive log list;
SQL> alter database open;
5.2.2 主库设置为force logging模式
SQL> select force_logging from v$database;
FOR
---
YES
如果没有启动force logging模式,使用以下方式启动
SQL> alter database force logging;
说明:为什么要改成Force Logging
有一些DDL语句可以通过指定NOLOGGING子句的方式避免写REDO(目的是提高速度,某些时候确实有效)。指定数据库为Force Logging模式后,数据库将会记录除临时表空间或临时回滚段外所有的操作,而忽略类似NOLOGGING之类的指定参数。如果在执行Force Logging时有NOLOGGING之类的语句在执行,那么Force Logging会等待,直到这类语句全部执行。
Force Logging是作为固定参数保存在控制文件中,因此其不受重启之类操作的影响(只执行一次即可),如果想取消,可以通过ALTER DATABASE NO FORCE LOGGING语句关闭强制记录。
5.2.3 创建备用联机日志组
备用联机日志创建是可选的,主要用于主库角色转换作为standby后接受主库的日志。不能与当前存在的联机日志组重复。
查看当前联机日志信息
SQL> select group#,sequence#,members,archived,status from v$log;
GROUP# SEQUENCE# MEMBERS ARC STATUS
---------- ---------- ---------- --- ----------------
1 1267 2 NO CURRENT
2 1265 2 YES INACTIVE
3 1266 2 YES INACTIVE
SQL> select group#,type,member from v$logfile;
GROUP# TYPE MEMBER
---------- ------- ----------------------------------------
1 ONLINE /db/oracle/oradata/OAPROD/redo01.log
1 ONLINE /db/oracle/oradata/OAPROD/redo11.log
2 ONLINE /db/oracle/oradata/OAPROD/redo02.log
2 ONLINE /db/oracle/oradata/OAPROD/redo12.log
3 ONLINE /db/oracle/oradata/OAPROD/redo03.log
3 ONLINE /db/oracle/oradata/OAPROD/redo13.log
创建备用联机日志组
SQL> alter database add standby logfile group 4 (‘/db/oracle/oradata/OAPROD/redo04.log’,’ /db/oracle/oradata/OAPROD/redo14.log’) size 200M;
SQL> alter database add standby logfile group 5(‘/db/oracle/oradata/OAPROD/redo05.log’,’ /db/oracle/oradata/OAPROD/redo15.log’) size 200M;
SQL> alter database add standby logfile group 6(‘/db/oracle/oradata/OAPROD/redo06.log’,’ /db/oracle/oradata/OAPROD/redo16.log’) size 200M;
SQL> alter database add standby logfile group 7(‘/db/oracle/oradata/OAPROD/redo07.log’,’ /db/oracle/oradata/OAPROD/redo17.log’) size 200M;
查看备用联机日志
SQL> select group#,thread#,sequence#,archived,status from v$standby_log;
GROUP# THREAD# SEQUENCE# ARC STATUS
---------- ---------- ---------- --- ----------
4 0 0 YES UNASSIGNED
5 0 0 YES UNASSIGNED
6 0 0 YES UNASSIGNED
7 0 0 YES UNASSIGNED
注意:Data Guard在最大保护和最高可用性模式下,Standby数据库必须配置standby redo log
5.2.4 修改主库初始化参数文件
创建pfile
SQL> create pfile from spfile;
修改主库的初始化参数文件initOAPROD.ora
[oracle@oa OAPROD]$ cd $ORACLE_HOME/dbs
[oracle@oa dbs]$ cp initOAPROD.ora initOAPROD.ora.bak
[oracle@oa dbs]$ vim initOAPROD.ora
……
*.audit_file_dest='/db/oracle/admin/OAPROD/adump'
*.audit_trail='none'
……
*.db_name='OAPROD'
……
*.DB_UNIQUE_NAME='oaprod'
……
*.fal_client='oaprod'
*.fal_server='oabak'
*.log_archive_config='dg_config=(oaprod,oabak)'
*.log_archive_dest_1='location=/db/oracle/archive valid_for=(all_logfiles,all_roles) db_unique_name=oaprod'
*.log_archive_dest_2='service=oabak LGWR async valid_for=(online_logfile,primary_role) db_unique_name=oabak'
*.log_archive_dest_state_1='enable'
*.log_archive_dest_state_2='enable'
*.standby_file_management='auto'
-
Audit_trail=’none’ 表示不做审计,审计(Audit)用于监视用户所执行的数据库操作。
-
Db_name=’OAPROD’ 表示数据库名,DG中主从数据库的DB_name是相同的,虽然和RAC不一样,并不是同一个库。
-
Db_uniqe_name=’oabak’ 表示数据库唯一名,DG中的db_uniqe_name必须不同。正因有了DB_UNIQUE_NAME,REDO数据在传输过程中才能确认传输到希望被传输到的数据库上。
-
fal_client='oaprod' / fal_server='oabak' fal表示fetch archive log,fal_client用于发送日志,fal_server用于接受日志。也即无论是主库或备库,fal_server=对方,fal_client=自己
-
log_archive_config 表示列出主库和备库
-
log_archive_dest_1 表示主库联机日志位置,valid_for属性指定发送指定角色生成的指定类型的日志文件
-
log_archive_dest_2 表示备库及日志传输形式
-
standby_file_management 表示如果Primary数据库数据文件发生修改(如新建、重命名等)则按照本参数的设置在Standby数据库中作相应修改。设为AUTO表示自动管理。设为MANUAL表示需要手工管理
通过pfile创建spfile
SQL> startup pfile=’initOAPROD.ora’
SQL> create spfile from pfile;
5.2.5 配置监听及TNS
Listener.ora一般都之前已经配置好了,只需要配置tnsname.ora
[oracle@oa admin]$ vim tnsnames.ora
OAPROD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oa.tp-link.net)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = OAPROD.tp-link.net)
)
)
OABAK =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oabak.tp-link.net)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = OAPROD.tp-link.net)
)
)
可以看到主库和备库的dbname是相同的。
启动主库的监听。
5.3 备库设置
5.3.1 数据恢复
需要将主从数据同步,可以有两种方式热备份(rman)或冷备份。Rman备份不需要停机,但操作时间长;冷备份操作简单,但主库需要停机。下面只说明通过RMAN恢复的步骤。
可以将当前的联机日志归档
SQL> alter system switch logfile;
System altered.
备份主库
RMAN> backup full format='/db/oracle/rman/FULL_%d_%T_%s' database include current controlfile for standby plus archivelog all delete input format='/db/oracle/rman/arch_%d_%T_%s';
Starting backup at 18-DEC-13
current log archived
……
Starting backup at 18-DEC-13
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00004 name=/db/oracle/oradata/OAPROD/apps_data01.dbf
input datafile file number=00005 name=/db/oracle/oradata/OAPROD/apps_idx01.dbf
input datafile file number=00006 name=/db/oracle/oradata/OAPROD/apps_data02.dbf
input datafile file number=00001 name=/db/oracle/oradata/OAPROD/system01.dbf
input datafile file number=00002 name=/db/oracle/oradata/OAPROD/sysaux01.dbf
input datafile file number=00003 name=/db/oracle/oradata/OAPROD/undo.dbf
…
Finished backup at 18-DEC-13
生成备库控制文件
SQL> alter database create standby controlfile as '/db/oracle/rman/standby.ctl';
Database altered.
将备份文件、备库控制文件、pfile、密码文件拷贝到备库
拷贝pfile和密码文件
[oracle@oa dbs]$ scp initOAPROD.ora orapwOAPROD oabak:/db/oracle/product/11.2.0/db_1/dbs
关于密码文件
Linux下的存放位置:$ORACLE_HOME/dbs/orapw$ORACLE_SID
即:ORACLE_HOME/dbs/orapw<sid>
Windows下的存放位置:$ORACLE_HOME/database/PWD%ORACLE_SID%.ora
注意remote_login_passwordfile参数设置,这里使用shared
none : 不使用密码文件认证
exclusive :要密码文件认证,自己独占使用(默认值)
shared :要密码文件认证,不同实例dba用户可以共享密码文件
拷贝备份文件和控制文件
[oracle@oa rman]$ ll
total 4925888
-rw-r-----. 1 oracle oinstall 545280 Dec 18 16:55 arch_OAPROD_20131218_102
-rw-r-----. 1 oracle oinstall 402464256 Dec 18 16:50 arch_OAPROD_20131218_99
-rw-r-----. 1 oracle oinstall 4608794624 Dec 18 16:54 FULL_OAPROD_20131218_100
-rw-r-----. 1 oracle oinstall 16187392 Dec 18 16:55 FULL_OAPROD_20131218_101
-rw-r-----. 1 oracle oinstall 16105472 Dec 18 16:58 standby.ctl
[oracle@oa rman]$ scp * oabak:/db/oracle/rman/
将控制文件拷贝到pfile指定位置
备库修改pfile
……
*.audit_trail='none'
……
*.control_files='/db/oracle/oradata/OAPROD/standby.ctl'
*.db_name='OAPROD'
……
*.db_unique_name='oabak'
*.log_archive_config='dg_config=(oaprod,oabak)'
*.log_archive_dest_1='location=/db/oracle/archive valid_for=(all_logfiles,all_roles) db_unique_name=oabak'
*.log_archive_dest_2='service=oaprod LGWR async valid_for=(online_logfile,primary_role) db_unique_name=oaprod'
*.log_archive_dest_state_1='enable'
*.log_archive_dest_state_2='enable'
*.standby_file_management='auto'
*.fal_client='oabak'
*.fal_server='oaprod
……
另外:
DB_FILE_NAME_CONVERT ----当primary和standby的数据文件路径不一致时使用
LOG_FILE_NAME_CONVERT ----当primary和standby的数据文件路径不一致时使用
LOCK_NAME_SPACE ----当主数据库和备用数据在同一台机上时设为备用数据库的
开始恢复,nomount启动数据库
[oracle@oabak dbs]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Wed Dec 18 18:02:39 2013
Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn /as sysdba
Connected to an idle instance.
SQL> startup nomount pfile=initOAPROD.ora
ORACLE instance started.
Total System Global Area 1603411968 bytes
Fixed Size 2213776 bytes
Variable Size 1040189552 bytes
Database Buffers 553648128 bytes
Redo Buffers 7360512 bytes
Mount数据库
SQL> alter database mount standby database;
Database altered.
查看备库
SQL> select open_mode,database_role from v$database;
OPEN_MODE DATABASE_ROLE
-------------------- ----------------
MOUNTED PHYSICAL STANDBY
配置备库监听及TNS
OAPROD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oaprod.tp-link.net)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = OAPROD.tp-link.net)
)
)
OABAK =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oabak.tp-link.net)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = OAPROD.tp-link.net)
)
)
启动备库监听
[oracle@oabak admin]$ lsnrctl start
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 18-DEC-2013 19:28:55
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Starting /db/oracle/product/11.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.1.0 - Production
System parameter file is /db/oracle/product/11.2.0/db_1/network/admin/listener.ora
Log messages written to /db/oracle/diag/tnslsnr/oabak/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oabak.tp-link.net)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
-----------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 18-DEC-2013 19:28:57
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /db/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File /db/oracle/diag/tnslsnr/oabak/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oabak.tp-link.net)(PORT=1521)))
Services Summary...
Service "OAPROD.tp-link.net" has 1 instance(s).
Instance "OAPROD", status READY, has 1 handler(s) for this service...
Service "oabak.tp-link.net" has 1 instance(s).
Instance "OAPROD", status READY, has 1 handler(s) for this service...
The command completed successfullyThe command completed successfully
通过tnsping相互ping没问题,说明网络连接及监听都正常。
同时测试sqlplus是否能连接对方
$ sqlplus sys/oracle@orcl as sysdba;
$ sqlplus sys/oracle@slave as sysdba;
还原主库的数据有两种方法:第一种就是通过rman直接还原;第二种使用duplicate命令进行还原。
通过rman直接还原
RMAN> restore database;
Starting restore at 18-DEC-13
……
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to /db/oracle/oradata/OAPROD/system01.dbf
channel ORA_DISK_1: restoring datafile 00002 to /db/oracle/oradata/OAPROD/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00003 to /db/oracle/oradata/OAPROD/undo.dbf
channel ORA_DISK_1: restoring datafile 00004 to /db/oracle/oradata/OAPROD/apps_data01.dbf
channel ORA_DISK_1: restoring datafile 00005 to /db/oracle/oradata/OAPROD/apps_idx01.dbf
channel ORA_DISK_1: restoring datafile 00006 to /db/oracle/oradata/OAPROD/apps_data02.dbf
channel ORA_DISK_1: reading from backup piece /db/oracle/rman/FULL_OAPROD_20131218_100
channel ORA_DISK_1: piece handle=/db/oracle/rman/FULL_OAPROD_20131218_100 tag=TAG20131218T165116
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:03:26
Finished restore at 18-DEC-13
直接通过duplicate还原数据(推荐这种方法,更快更方便。如果采用这种方法就不需要之前的备份操作)
备库的启动状态必须是nomount状态。
同时修改主库的tnsname.ora
OABAK =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oabak.tp-link.net)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = OAPROD.tp-link.net)
(UR = A)
)
)
开始同步数据
rman target sys/sa@mesdb auxiliary sys/sa@mesdbbak
RMAN> duplicate target database for standby nofilenamecheck from active database;
如果不加nofilenamecheck会报错辅助文件名与目标数据库使用文件名冲突
问题 1:RMAN-05500: the auxiliary database must be not mounted when using DUPLICATE
when you duplicate a database,
pri db: open or mount
std db: startup nomount;
问题 2:
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 12/28/2010 21:42:08
ORA-17629: Cannot connect to the remote database server
ORA-17627: ORA-01017: invalid username/password; logon denied
ORA-17629: Cannot connect to the remote database server
解决:
重建密码文件,拷贝到备库。
orapwd file=$ORACLE_HOME/dbs/orapwclonedb password='test'
同时参照RMAN active database duplicate fails with ORA-17627 ORA-17629 (文档 ID 1268962.1)
5.3.2 启用备库
备库启动redo
SQL> alter database recover managed standby database disconnect from session;
Database altered.
DISCONNECT FROM SESSION子句的作用是启动完后自动退出session,并无特殊。
查看备库
SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
--------- -------------------- -------------------- ----------------
OAPROD MOUNTED MAXIMUM PERFORMANCE PHYSICAL STANDBY
5.4 验证
查看同步情况
OAPROD主库
SQL> select switchover_status,database_role from v$database;
SWITCHOVER_STATUS DATABASE_ROLE
-------------------- ----------------
TO STANDBY PRIMARY
SQL> alter system switch logfile;
System altered.
SQL> column name format a40;
SQL> column first_time format a10;
SQL> column next_time format a10;
SQL> column applied format a5;
SQL> SELECT SEQUENCE#, name,FIRST_TIME, NEXT_TIME,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
……
SEQUENCE# NAME FIRST_TIME NEXT_TIME APPLI
---------- ---------------------------------------- ---------- ---------- -----
1276 /db/oracle/archive/1_1276_812316846.dbf 18-DEC-13 18-DEC-13 NO
1276 oabak 18-DEC-13 18-DEC-13 YES
1277 /db/oracle/archive/1_1277_812316846.dbf 18-DEC-13 18-DEC-13 NO
1277 oabak 18-DEC-13 18-DEC-13 YES
OABAK备库
SQL> select switchover_status,database_role from v$database;
SWITCHOVER_STATUS DATABASE_ROLE
-------------------- ----------------
SESSIONS ACTIVE PHYSICAL STANDBY
SQL> SELECT SEQUENCE#, name,FIRST_TIME, NEXT_TIME,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# NAME FIRST_TIME NEXT_TIME APPLI
---------- ---------------------------------------- ---------- ---------- -----
1276 /db/oracle/archive/1_1276_812316846.dbf 18-DEC-13 18-DEC-13 YES
1277 /db/oracle/archive/1_1277_812316846.dbf 18-DEC-13 18-DEC-13 YES
# 主库
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 D:\app\oracle\archivelog
最早的联机日志序列 1167
下一个存档日志序列 1169
当前日志序列 1169
#备库
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 D:\app\oracle\archivelog
最早的联机日志序列 1167
下一个存档日志序列 0
当前日志序列 1169
测试OK。
5.5 Active DataGuard测试
Oracle 11g之前,物理备库(physical Standby)在应用redo的时候,是不可以打开的,只可以mount。从11g开始,在应用redo的时候,物理备库可以处于read-only模式,这就称为Active Data Guard 。通过Active Data Guard,可以在物理备库进行查询或者导出数据,从而减少对主库的访问和压力。
Active Data Guard适用于一些只读性的应用,比如,有的应用程序只是查询数据,进行一些报表业务,不会产生redo数据,这些应用可以转移到备库上,避免对主库资源的争用。
Oracle版本11.0以上的才具有oracle active data guard新特性
暂停DG同步
SQL> conn /as sysdba
--取消备库的自动恢复
SQL> alter database recover managed standby database cancel;
Database altered.
此时只是暂停redo应用,并未停止备库,备库仍会接收只不过不会应用接收到的归档,直到再次启动redo应用。
启用备库只读模式
SQL> alter database open read only;
Database altered.
SQL> select open_mode,database_role from v$database;
OPEN_MODE DATABASE_ROLE
---------------------------------------- ----------------
READ ONLY PHYSICAL STANDBY
--备库查询测试
SQL> conn apps/gT9YTK$c
SQL> select * from bom_file;
……
--切换回redo应用
SQL> conn /as sysdba
--打开实时应用状态
SQL> alter database recover managed standby database using current logfile disconnect from session;
Database altered.
SQL> select open_mode,database_role from v$database;
OPEN_MODE DATABASE_ROLE
---------------------------------------- -----------------
READ ONLY WITH APPLY PHYSICAL STANDBY
Active DG测试
主库
SQL> create table t (i number,name varchar2(10));
--表已创建。
SQL> select * from t;
--未选定行
SQL> insert into t values(0,'abc');
--已创建 1 行。
SQL> insert into t values(1,'df');
--已创建 1 行。
SQL> commit;
--提交完成。
SQL> alter system switch logfile;
备库
SQL> select * from t;
I NAME
---------- --------------------
0 abc
1 df
--备库插入数据会报错
SQL> insert into t values(3,'df');
insert into t values(3,'df')
*
第 1 行出现错误:
ORA-16000: 数据库或可插入数据库是以只读访问方式打开的
5.6 DG switchover切换
1 查看主库状态
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
----------------------------------------
TO STANDBY
2 将主库切换到备库(数据库自动关闭呢?)
SQL> alter database commit to switchover to physical standby with session shutdown;
数据库已更改。
3 查看备库switchover状态
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
----------------------------------------
TO PRIMARY
4 将备库切换成主库,然后关闭
SQL> alter database commit to switchover to primary;
数据库已更改。
SQL> select open_mode,database_role from v$database;
OPEN_MODE DATABASE_ROLE
---------------------------------------- ----------------
MOUNTED PRIMARY
SQL> shutdown immediate;
5 启动备库。启动顺序不能错,先启动备库,在启动主库,不然主库识别不了备库。
SQL> conn /as sysdba
已连接到空闲例程。
SQL> startup nomount;
SQL> alter database mount standby database;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
SQL> select open_mode,database_role from v$database;
OPEN_MODE DATABASE_ROLE
---------------------------------------- -------------------
MOUNTED PHYSICAL STANDBY
6 再启主库
SQL> startup
SQL> alter system switch logfile;
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 D:\app\oracle\archivelog
最早的联机日志序列 1172
下一个存档日志序列 1173
当前日志序列 1174
检查
SQL>select status,database_mode from v$archive_dest_status;
SQL> select group#,thread#,sequence#,archived,status from v$standby_log;
SQL> select group# ,type,member from v$logfile;
5.7 DG failover切换
备库
1)检查备库是有GAP,如果存在则将相关归档日志拷贝到备库并注册应用
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
no rows selected
2)将备库切换成主库
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
Database altered.
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
DATABASE_ROLE
----------------
PHYSICAL STANDBY
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
Database altered.
SQL> ALTER DATABASE OPEN; Database altered.
六、log_archive_dest_n参数解释
6.1 AFFIRM和NOAFFIRM
AFFIRM明确指定redo传输目的地在写redo数据到standby redo日志之后告知传送者接收到了redo数据;
NOAFFIRM明确指定redo传输目的地在写redo数据到standby redo日志之前告知传送者接收到了redo数据;
如果没有明确指定,当sync属性被指定时,默认是AFFIRM,当async属性被指定,默认是NOAFFIRM。
6.2 db_unique_name
这个参数在目的地指定数据库唯一的名字,如果在DG中有多个standby数据库,这个属性有用,使用db_unique_name属性能明确标识主数据库和standby数据库之间的关系。db_unique_name指定的名字必须匹配在DG_CONFIG列表中db_unique_name的其中一个值,db_unique_name属性指定的名字还必须匹配指定目的地数据库初始化参数db_unique_name的值,如果不指定,连接会被拒绝。
6.3 delay
delay参数明确指定一个standby位置应用接收到的归档redo数据延迟的时间,delay是可选的,默认是没有任何延迟,delay属性的设置表明在standby目的地应用归档redo日志是不活动的,直到指定的时间间隔过期才会应用日志,在standby数据库上,当redo数据库成功传输和归档后开始计算时间,delay的时间间隔以分钟为单位,可以用于保护standby数据库免遭、来自主数据库的用户错误或者损坏带来的影响,是一种折中方案,在failover过程中必然需要更多的时间来应用日志。Delay不影响redo时间传送到standby目的地,如果启动实时应用,设置的任何延迟都将被忽略。改变delay属性设置会在下一次redo时间呗归档时起作用,正在归档的日志不受影响
6.4 location和service
每个目的地必须制定location或者service属性,用来制定redo传输服务栓出redo数据到本地磁盘目录或者远程数据库目的地。
log_archive_dest_1―log_archive_dest_10目的地能包括 location属性或者 service属性
log_archive_dest_11―log_archive_dest_31目的地只能包括 service属性。
如果要为log_archive_dest_n初始化参数指定多个属性,在属性列表中首先指定location或者service属性。确保数据库本地归档redo日志目录是可访问的使用location属性至少指定一个本地磁盘目录。通过指定location='use_db_recovery_file_dest'
可以指定文件传输位置为闪回恢复区。对应数据库初始化参数db_recovery_file_dest指定的目录,oracle通过omf自动管理存储在闪回恢复区中的文件,在service属性中必须使用Oracle net服务名
6.5 SYNC和ASYNC
指定使用同步sync传输或者异步async传输模式,如果没有指定,默认值是async
6.6 valid_for
在DG中,Oracle基于数据库角色和redo日志类型判断log_archive_dest_n指定的目录是否产生相应的归档redo日志,vaild_for属性可选,Oracle推荐在DG配置中的每个数据库为日志传输目的地指定vaild_for属性,以至于主数据库角色转换到配置中的任何standby数据库之后,redo传输都能继续工作。
为每个log_archive_dest_n目的地配置valid_for参数
VALID_FOR=(redo_log_type,database_role)
redo_log_type关键字表明该目的地产生归档的redo日志类型
online_logfile:目的地只归档联机redo日志
standby_logfile:目的地只归档standbyredo日志
all_logfiles:目的地既归档联机redo日志,也归档standby redo日志
database_role表明该目的地产生归档的数据库角色
primary_role:只有数据库是主,该目的地才会产生归档
standby_role:只有数据库是备,该目的地才会产生归档
all_role:当数据库不论是主还是备,该目的地都会产生归档
如果目的地没有指定valid_for属性,默认情况下,不管数据库是主还是备,目的地都会归档联机redo和standby redo,默认的行为等于设置valid_for=(all_logfiles,all_roles)属性值,在主数据库和standby数据库中可以使用相同的初始化参数设置启用valid_for属性。
例子:
log_archive_dest_1的vaild_for属性设置为(online_logfile,all_roles),log_archive_dest_3的vaild_for属性设置为(standby_logfile,standby_role),那当该数据库是主时,只会归档联机日志到log_archive_dest_1指定的目录,如果该数据库被转换为备,那standbyredo日志被归档到log_archive_dest_3指定的目录,log_archive_dest_1不会归档standby redo日志。