赞
踩
Oracle Data Guard是Oracle企业版自带的数据复制功能,基本原理是将日志文件从原数据库传输到目标数据库,然后在目标数据库上应用这些日志文件,从而使目标数据库与源数据库保持同步,是一种数据库级别的容容灾份方案。
Data Guard可以提供Oracle数据库的冗灾、数据保护、故障恢复等,实现数据库快速切换与灾难性恢复。在生产数据库的保证"事务一致性"时,使用生产库的物理全备份创建备库,备库会通过生产库传输过来的归档日志自动维护Standby数据库。
Data Guard 是一个集合,由一个primary 数据库或者叫生产数据库及一个或多个standby 数据库(最多9个)组成。组成Data Guard 的数据库通过Oracle Net连接,并且有可能分布于不同地域。只要各库之间可以相互通信,它们的物理位置并没有什么限制,你即可以通过命令行方式管理primary 数据库或standby 数据库,也可以通过Data Guard broker 提供的专用命令行界面(DGMGRL),或者通过OEM 图形化界面管理。
(1)Primary数据库
本文中的描述中称Primary数据库为主库或生产数据库。Data Guard 包含一个primary 数据库即被大部分应用访问的生产数据库,该库即可以是单实例数据库,也可以是RAC。
(2)Standby数据库
文中又称为备库。Standby数据库是primary数据库的复制,事务上保持一致。在同一个Data Guard 中你可以最多创建9个standby数据库。一旦创建完成,Data Guard 通过应用primary 数据库的redo自动维护每一个standby 数据库。Standby数据库同样即可以是单实例数据库,也可以是Oracle的RAC结构(Real Application Clusters)。关于standby 数据库,通常分两类逻辑standby和物理standby,为了提高可维护性,采用物理standby书库。
(1)重做传输服务(Redo Transport Services)。控制redo数据的传输到一个或多个归档目的地。
(2)日志应用服务(Log Apply Services) 。应用redo数据到standby数据库,以保持与primary数据库的事务一致。redo数据即可以从standby数据库的归档文件读取,也可直接应用备用日志文件读取。
(3)角色转换服务(Role Transitions) 。Data Guard中有两种角色primary和standby。角色转换就是让数据库在这两个角色中切换,切换分两种switchover和failover 。 Switchover一般在日常维护中使用,switchover可以确保不会丢失数据; Failover主库故障时采用,当primary数据库出现故障并且不能被及时恢复时,会调用failover将一个standby数据库转换为新的primary数据库。在最大保护模式或最高可用性模式下,failover可以保证不会丢失数据。
对于Data Guard 而言,由于它提供了三种数据保护的模式。
(1)最大保护(Maximum protection)
这种模式能够确保绝无数据丢失。要实现这一步当然是有代价的,它要求所有的事务在提交前其redo不仅被写入到本地的online redo log,还要同时提交到standby 数据库的standby redo log,并确认redo 数据至少在一个standby 数据库可用(如果有多个的话),然后才会在primary 数据库上提交。如果出现了什么故障导致standby数据库不可用的话,primary数据库会被shutdown,导致数据业务的停顿。
(2)最高性能(Maximum performance)
这种模式提供在不影响primary 数据库性能前提下最高级别的数据保护策略。事务可以随时提交,当前primary 数据库的redo 数据也需要至少写入一个standby 数据库,不过这种写入可以是不同步的。如果网络条件理想的话,这种模式能够提供类似最高可用性的数据保护而仅对primary 数据库有轻微的性能影响。
(3)最高可用性(Maximum availability)
这种模式提供在不影响primary 数据库可用前提下最高级别的数据保护策略。其实现方式与最大保护模式类似,也是要求所有事务在提交前必须保障redo 数据至少在一个standby数据库可用,不过与最大保护模式不同的是,如果出现故障导入无法同时写入standby 数据库redo log,primary 数据库并不会shutdown,而是自动转为最高性能模式,等standby 数据库恢复正常之后,它又会再自动转换成最高可用性模式。
最大保护及最高可用性需要至少一个standby 数据库redo 数据被同步写入。三种模式都需要指定LOG_ARCHIVE_DEST_n 初始化参数。
关于redo 传输服务(Redo Transport Services),它不仅控制着传输redo 数据到其它数据库,同时还管理着解决由于网络中断造成的归档文件未接收的过程。
在primary 数据库,Data Guard可以使用归档进程(ARCn)或者日志写进程(LGWR)收集redo数据并传输到standby,不管你选择归档进程也好,日志写进程也好,都由一个核心参数来控制,它就是LOG_ARCHIVE_DEST_n(n从1到10)定义redo文件路径。该参数定义必须通过location 或service 指明归档文件路径。location 表示本地路径,service 通常是net service name,即接收redo数据的standby 数据库。
下表中描述了不同保护模式下LOG_ARCHIVE_DEST_n 参数应该设置的属性:
最大保护 | 最髙可用 | 最高性能 | |
REDO写进程 | LGWR | LGWR | LGWR 或 ARCH |
网络传输模式 | SYNC | SYNC | LGWR 进程时 SYNC 或 ASYNC, ARCH 进程时 SYNC |
磁盘写操作 | AFFIRM | AFFIRM | AFFIRM或 NOAFFIRM |
是否需要Standby Redo logs | YES | YES | 可没有,但推荐有 |
1)使用ARCn归档redo数据
默认情况下,redo 传输服务使用ARCn 进程归档redo 日志。不过ARCn 归档进程只支持最高性能的保护模式。如果standby数据库处于其它类型的保护模式,那你必须使用LGWR 传输redo数据。下图描述传送过程。
在上图中,primary 数据库日志发生切换时就会启动归档。在primary 数据库假设有2 个归档进程,一旦ARC0 进程完成redolog 的归档,ARC1 进程即开始传输归档到standby 数据库的指定路径。
在standby数据库,RFS进程轮流将redo数据写入standby redo log,再由standby 数据库中的ARCn 进程将其写入归档,然后通过REDO应用或SQL 应用将数据应用到standby 数据库。
2)使用LGWR归档redo数据
使用LGWR 进程与使用ARCn 进程有明显不同,LGWR 无须等待日志切换及完成归档。Standby 数据库的LGWR进程会先选择一个standby redo log文件映射primary 数据库当前redolog 的sequence(以及文件大小),一旦primary 数据库有redo数据产生,根据LOG_ARCHIVE_DEST_n 初始化参数中sync 或async 属性设置,以同步或非同步方式传输到standby 数据库。
LGWR 归档进程密切相关的LOG_ARCHIVE_DEST_n 几个参数的属性,如果选择LGWR归档redo数据,那么在LOG_ARCHIVE_DEST_n中必须指定SERVICE 和LGWR属性以允许日志传输服务使用LGWR 进程来传送redo 数据到远程归档目的地。我们还需要指定SYNC(同步)还是ASYNC(异步)的传输方式,如果指定SYNC 属性(如果不明确指定的话,默认是SYNC),则primary数据库任何会产生redo 操作都会同步触发网络I/O,并且等到网络I/O 全部完成才会继续下面的提交,而如果指定了ASYNC 属性,则会primary 数据库的操作会先记录online redologs,然后再传输到standby。
(1)LGWR 同步归档的流程,例如初始化参数中有如下设置:
LOG_ARCHIVE_DEST_1='LOCATION=E:\ora10g\oradata\jssweb\ '
LOG_ARCHIVE_DEST_2='SERVICE=jsspdg LGWR SYNC NET_TIMEOUT=30'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
如果设置LOG_ARCHIVE_DEST_n 初始化参数SYNC 属性,建议同时设置NET_TIMEOUT 属性,该属性控制网络连接的超时时间,如果超时仍无响应,则会返回错误信息。
(2)LGWR 不同步归档的流程,例如初始化参数中有如下设置:
LOG_ARCHIVE_DEST_1='LOCATION=E:\ora10g\oradata\jssweb\ '
LOG_ARCHIVE_DEST_2='SERVICE=jsspdg LGWR ASYNC'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
ASYNC 方式归档就不需要再指定NET_TIMEOUT 了,因为LGWR 与LNSn 之间已无关联,所以指定不指定NET_TIMEOUT 就都没任何影响了,因此对于异步传输而言,即使网络出现故障造成primary与standby 之间通信中断,也并不会影响到primary 数据库的提交。
下图为Data Guard使用LGWR同步传输REDO的过程。
上图中展示了primary数据库LGWR写online redologs的同时,同步传输redo数据到standby 数据库的过程。在primary 数据库,LGWR 提交redo 数据到LNSn(LGWR Network Server process)进程(n>0),LNSn 启动网络传输。standby 数据库的RFS(Remote File Server)将接收到的redo数据写入standby redolog。特别注意,在此期间,primary 数据库的事务会一直保持,直到所有所有含LGWR SYNC 属性的LOG_ARCHIVE_DEST_n 指定路径均已完成接收。
一旦primary 数据库执行日志切换,就会级联触发standby的ARCn将standby redo 写入归档,然后通过redo 应用MRP进程或sql 应用LSP 进程读取归档文件将数据应用standby 数据库。如果启用了实时应用的话,MRP/LSP 会直接读取standby redolog 并应用到standby 数据库,无须再等待归档。
下图为Data Guard使用LGWR异步传输REDO的过程
上图展示了LNSn 进程异步传输redo 数据到standby 数据库RFS 进程的过程。大致步骤与同步传输相同,差别只在LNSn 进程这里,LGWR 写数据到online redolog,LNSn 进程访问online redolog 并传输数据到远程standby的RFS而不再与本地LGWR 之间有联系。standby 数据库方面的处理逻辑仍然不变。
目前油田的单台Unix服务器或Windows服务器都运行着Oracle数据库的多个实例,下面以两台Aix服务器P590和P720为例,数据库采用Oracle10GR2,实施Data Guard。两台服务器的位置可分别位于油田中心机房和开发事业部机房。
Oracle主库位于服务器P590上,上面运行着三个实例的数据库,分别是开发数据库ora7、经营数据库orajy及天然气数据库tlmtrq1,正常情况下由主库P590对外提供数据库服务。
我们要做的工作是在P720上安装Oracle10GR2,运行在归档模式下。对三个实例的数据库采用物理standby分别实施Data Guard,实现数据库的容灾。
为了不影响生产业务的运行,我这里采用不关闭数据库的方法进行Data Guard的部署,这种部署方法可以充分保障现有的生产数据业务不受影响,保证业务的连续性。
根据物理standby的要求,P720的目录文件物理结构要和P590保持一致。Oracle操作系统的用户ora10g,主目录为/home/ora10g,Oracle的环境变量放在这里。
在P720的卷组oravg上创建文件系统如下,和p590目录结构保持一致:
序号 | 逻辑卷 | 挂载点 | 大小 | 用途描述 |
1 | /dev/fslv00 | /oradata/orajy | 100G | 实例orajy数据文件目录 |
2 | /dev/fslv01 | /oradata/ora7 | 100G | 实例ora7数据文件目录 |
3 | /dev/fslv02 | /oradata/tlmtrq1 | 100G | 实例tlmtrq1数据文件目录 |
4 | /dev/fslv03 | /oraarch | 400G | 归档日志目录 |
Oralce 10GR2数据库的安装过程不再叙述。上表中挂载点分别为三个数据库数据文件的目录,/oraarch为三个数据库的归档目录。
由于要求每个实例对外提供服务的IP保持不变,所以在主库和备库之间发生互相切换的时候,对外提供服务的IP也要随之切换,要求对外提供服务的IP总是在主库服务器上,IP规划如下:
主机 | IP地址 | 说明 |
P590 | 10.79.20.51 | 服务器P590物理IP |
P720 | 10.79.20.54 | 服务器P720物理IP |
主库服务器 | 10.79.20.43 | 实例orajy对外提供服务IP |
10.79.20.50 | 实例ora7对外提供服务IP | |
10.79.20.67 | 实例tlmtrq1对外提供服务IP |
在两台主机P590、P720 目录/home/ora10g/script下创建脚本add_ip.sh和del_ip.sh,脚本内容如下:
add_ip.sh增加IP脚本:
ifconfig en1 10.79.20.43 netmask 255.255.254.0 alias
ifconfig en1 10.79.20.50 netmask 255.255.254.0 alias
ifconfig en1 10.79.20.67 netmask 255.255.254.0 alias
del_ip.sh删除IP脚本:
ifconfig en1 10.79.20.43 netmask 255.255.254.0 delete
ifconfig en1 10.79.20.50 netmask 255.255.254.0 delete
ifconfig en1 10.79.20.67 netmask 255.255.254.0 delete
一般服务器都有多个网卡,为提高IO性能,建议在将IP地址配置在不同的网络端口上。本文配置在一块网卡卡,增加多个IP地址。
(1)监听配置
由于主库对外提供服务,与备库相比,多出3个对外提供服务的IP,因此主库和备库的监听配置[3]不同,配置文件均位于$ORACLE_HOME/network/admin/,文件名为listener.ora。监听配置完成之后,需要重新启动监听进程。
现有主库的监听文件listener.ora内容:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orajy)
(ORACLE_HOME = /app/oracle/product/10.2.0/db)
)
(SID_DESC =
(SID_NAME = ora7)
(ORACLE_HOME = /app/oracle/product/10.2.0/db)
)
(SID_DESC =
(SID_NAME = tlmtrq1)
(ORACLE_HOME = /app/oracle/product/10.2.0/db)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.51)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.43)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC2))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.67)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC3))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.50)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC4))
)
)
在P720上完成Oracle数据库10gr2的安装后,使用任何文本编辑器建立备库监听文件listener.ora,内容如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orajy)
(ORACLE_HOME = /app/oracle/product/10.2.0/db)
)
(SID_DESC =
(SID_NAME = ora7)
(ORACLE_HOME = /app/oracle/product/10.2.0/db)
)
(SID_DESC =
(SID_NAME = tlmtrq1)
(ORACLE_HOME = /app/oracle/product/10.2.0/db)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.54)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
(2)TNS配置
主库和备库的tnsnames.ora文件内容一致,均位于$ORACLE_HOME/network/admin/,需要增加以下内容:
orajy =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.51)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orajy)
)
)
orajy_std =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.54)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orajy)
)
)
ora7 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.51)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora7)
)
)
ora7_std =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.54)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora7)
)
)
tlmtrq1 = (DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.51)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = tlmtrq1)
)
)
tlmtrq1_std =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.54)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = tlmtrq1)
)
下面以orajy的物理Standby库的建立为例,详细描述在主库不停机的情况的实施过程。假设主库与备库orajy物理存储结构如下:
数据库主目录为/app/oracle/product/10.2.0/db/;
数据库的名称DB_NAME为orajy;
主库的参数DB_UNIQUE_NAME为orajy, 备库的参数DB_UNIQUE_NAME为orajy_std;
数据文件、在线日志文件及standby日志文件目录为 /oradata/orajy;
控制文件目录 /app/oracle/oradata/orajy;
当前Primary数据库处于归档模式,归档日志目录为 /oraarch/orajy/;
参数与口令文件位于默认/$ORACLE_HOME/dbs/目录下;
RMAN数据备份 /oraarch/orajy/fullbk/。
(1)在备库P720上安装Oracle数据库系统,创建数据文件和归档日志的目录并进行用户授权。有关操作系统的命令请参阅AIX系统管理的相关书籍[14]。以下针对Oracle数据库的操作需要用户具有sysdba权限,请参阅Oracle数据库管理的资料[15]。
$mkdir /oradata/orajy
$mkdir /oraarch/orajy
$mkdir /oraarch/orajy/fullbk
$mkdir /app/oracle/admin/orajy
$cd /app/oracle/admin/orajy
$mkdir adump bdump cdump dpdump pfile udump
使用root用户授权
#chown -R ora10g /oradata
#chown -R ora10g /oraarch
#chown –R ora10g /app
#chgrp –R dba /oradata
#chgrp –R dba /oraarch
#chgrp –R dba /app
(2)、在主库P590上,修改主库处于force logging模式
SQL> ALTER DATABASE FORCE LOGGING;
如果口令文件不存在通过下列命令创建
orapwd file=’$ORACLE_HOME/dbs/orapworajy’ password=shift001
(3)、在主库P590上,配置主库的Standby Redo log。
配置之前,检查主库orajy的在线归档日志ORL有3组,每组2个文件,根据Oracle文档中的建议,需要建立(3+1)*2=8个Standby Redo log文件,而且文件大小要和SRL中的文件大小保持一致。
$export ORACLE_SID=orajy
$sqlplus ‘/as sysdba’
SQL>alter database force logging;
SQL> alter database add standby logfile Group 4 ('/oradata/orajy/redo41.log','/oradata/orajy/redo42.log') size 50M;
SQL> alter database add standby logfile Group 5 ('/oradata/orajy/redo51.log','/oradata/orajy/redo52.log') size 50M;
SQL> alter database add standby logfile Group 6 ('/oradata/orajy/redo61.log','/oradata/orajy/redo62.log') size 50M;
SQL> alter database add standby logfile Group 7 ('/oradata/orajy/redo71.log','/oradata/orajy/redo72.log') size 50M;
(4)、在主库P590上,修改主库的参数文件
SQL>alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(orajy,orajy_std)';
SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=/oradata/orajy/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orajy_std';
SQL>alter system set LOG_ARCHIVE_DEST_2='SERVICE=orajy_std LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orajy_std';
SQL> alter system set LOG_ARCHIVE_DEST_STATE_1=ENABLE;
SQL>alter system set FAL_SERVER=orajy_std;
SQL>alter system set FAL_CLIENT=orajy;
如果文件目录不一样,设置参数DB_FILE_NAME_CONVERT及LOG_FILE_NAME_CONVERT;
(5)、在主库P590上,使用RMAN[16]工具进行全备份
$rman target /
$rman >
Run {
allocate channel c1 type disk;
allocate channel c2 type disk;
backup database format '/oraarch/orajy/fullbk/%U'
plus archivelog format '/oraarch/orajy/fullbk/%U';
backup current controlfile for standby format '/oraarch/orajy/fullbk/%U';
}
(6)、在主库P590上,为备库创建参数文件
SQL>create pfile='/oraarch/orajy/fullbk/orajysb.ora’ from spfile;
(7)、在主库P590上,将口令文件orapworajy传送到备库的/$ORACLE_HOME/dbs目录中;将RMAN备份的文件 /oraarch/orajy/fullbk/* 及归档文件/oraarch/orajy/*.arc 到备库P720的相同目录中。
(8)、在备库P720上,按照上一节中所述,创建备库的监听文件listener.ora及服务别名文件tnsnames.ora,并使用tnsping测试,保证连接畅通。
$ tnsping orajy
TNS Ping Utility for IBM/AIX RISC System/6000: Version 10.2.0.1.0 - Production o
n 03-OCT-2013 18:51:32
Copyright (c) 1997, 2005, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.45)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orajy)))
OK (0 msec)
(9)、在备库P720上,修改备库的参数文件orajysb.ora
db_name=orajy
db_unique_name=orajy_std
log_archive_config='DG_CONFIG=(orajy,orajy_std)'
log_archive_dest_1='LOCATION=/oraarch/orajy/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orajy_std'
log_archive_dest_2='SERVICE=orajy LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orajy'
log_archive_dest_state_1=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
standby_archive_dest='/oraarch/orajy/'
standby_file_management=AUTO
fal_client=orajy_std
fal_server=orajy
如果操作系统的版本不一样,可能会要求修改sga_target的大小
(10)、在备库P720上,启动数据库到no mount状态
$export ORACLE_SID=orajy
$sqlplus ‘/as sysdba’
$SQL> create spfile from pfile=’/oraarch/orajy/fullbk/orajysb.ora’;
$SQL>startup nomount
(11)、在备库P720上,使用RMAN duplicate命令创建standby数据库[11]。
$rman target sys/shift001@orajy 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: orajy (DBID=3971986030)
connected to auxiliary database: orajy (DBID=3971986030, not open)
RMAN> duplicate target database for standby dorecover nofilenamecheck;
对于目录结构和文件名一样的必须加参数nofilenamecheck
(12)、在备库P720上,创建SRL
SQL> alter database add standby logfile Group 4 ('/oradata/orajy/redo41.log','/oradata/orajy/redo42.log') size 50M;
SQL> alter database add standby logfile Group 5 ('/oradata/orajy/redo51.log','/oradata/orajy/redo52.log') size 50M;
SQL> alter database add standby logfile Group 6 ('/oradata/orajy/redo61.log','/oradata/orajy/redo62.log') size 50M;
SQL> alter database add standby logfile Group 7 ('/oradata/orajy/redo71.log','/oradata/orajy/redo72.log') size 50M;
(13)、在备库P720上,启动MRP(managed recovery process)
SQL> select name,db_unique_name,database_role from v$database;
NAME DB_UNIQUE_NAME DATABASE_ROLE
--------- ---------------- --------------
ORAJY STDBY PHYSICAL Standby
SQL> alter database recover managed standby database disconnect;
(14)、在主库p590上,设置 the log_archive_dest_2参数,启动日志文件的传输。
SQL>alter system set log_archive_dest_state_2=enable;
(15)、在备库P720上,检查是否与主库同步
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIME NEXT_TIME
---------- ------------ ------------
84 28-SEP-13 28-SEP-13
85 28-SEP-13 28-SEP-13
86 28-SEP-13 28-SEP-13
87 28-SEP-13 28-SEP-13
88 28-SEP-13 28-SEP-13
89 28-SEP-13 28-SEP-13
90 28-SEP-13 28-SEP-13
91 28-SEP-13 28-SEP-13
92 28-SEP-13 30-SEP-13
93 30-SEP-13 01-OCT-13
94 01-OCT-13 02-OCT-13
SEQUENCE# FIRST_TIME NEXT_TIME
---------- ------------ ------------
95 02-OCT-13 03-OCT-13
12 rows selected.
在主库P590上,进行日志切换
SQL> ALTER SYSTEM SWITCH LOGFILE;
在备库P720上,进行检查
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIME NEXT_TIME
---------- ------------ ------------
84 28-SEP-13 28-SEP-13
85 28-SEP-13 28-SEP-13
86 28-SEP-13 28-SEP-13
87 28-SEP-13 28-SEP-13
88 28-SEP-13 28-SEP-13
89 28-SEP-13 28-SEP-13
90 28-SEP-13 28-SEP-13
91 28-SEP-13 28-SEP-13
92 28-SEP-13 30-SEP-13
93 30-SEP-13 01-OCT-13
94 01-OCT-13 02-OCT-13
SEQUENCE# FIRST_TIME NEXT_TIME
---------- ------------ ------------
95 02-OCT-13 03-OCT-13
96 03-OCT-13 03-OCT-13
13 rows selected.
我们看到日志文件已经传输过来。
SQL> select sequence#,applied from v$archived_log order by sequence#;
SEQUENCE# APP
---------- ---
84 NO
85 NO
86 NO
87 NO
88 NO
89 YES
90 YES
91 YES
92 YES
93 YES
94 YES
SEQUENCE# APP
---------- ---
95 YES
96 YES
13 rows selected.
可以看出,日志已经在备库应用。
(16)7实现数据的同步
要说明的是,为了保证主库的正常服务,我们在主库设置log_archive_dest_2参数的时候,使用LGWR ASYNC的选项,也就是说主库到备库采用了日志写进程LGWR的异步传输。如果采用同步传输,备库的错误,可能会影响主库的正常服务。待备库成功建成后。我们可以根据需要,重新设置log_archive_dest_2的参数,调整Data Guard的保护模式,满足数据级容灾的需要。
采用上述方法建立备库后,Data Guard的保护模式为最高性能模式。为了容灾的需要,一般我们设置为最高可用性模式,要启用最高可用性模式,必须启用LGWR同步写REDO数据的方式,之前配置的 LOG_ARCHIVE_DEST_n参数中,虽然也有LGWR写REDO数据,但都是非同步方式,因此有必要首先对初始化参数进行修改。
SQL>alter system set LOG_ARCHIVE_DEST_2='SERVICE=orajy_std LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orajy_std';
设置新的数据保护模式,并选择合适时机重启数据库。语句非常简单,如下所示:
SQL>ALTER DATABASE SET Standby DATABASE TO MAXIMIZE AVAILABILITY;
(17)、对于实例ora7和tlmtrq1,备库的创建方法一样,参考上文步骤.
以实例orajy为例,主库备库的启动与关闭
(1)、主库和备库的正常启动顺序
在P590上,先启动主库
$export ORACLE_SID=orajy
SQL>startup
在P720上,再启动备库
$export ORACLE_SID=orajy
SQL>startup mount;
SQL> ALTER DATABASE RECOVER MANAGED Standby DATABASE DISCONNECT FROM SESSION;
在备库如启用实时应用,附加USING CURRENT LOGFILE 子句即可。建议在实施数据库容灾时启动实时应用。
SQL> ALTER DATABASE RECOVER MANAGED Standby DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
在P720上,先关闭备库
$export ORACLE_SID=orajy
SQL> ALTER DATABASE RECOVER MANAGED Standby DATABASE CANCEL;
SQL> shutdown immediate
在P590上,在关闭主库
$export ORACLE_SID=orajy
SQL> shutdown immediate
当前主库处于OPEN状态,备库处于日志传送状态
在P720上
$export ORACLE_SID=orajy
SQL> recover managed standby database cancel;
SQL>alter database open read only;
备库回到日志传送模式
SQL> recover managed standby database disconnect from session;
(4)正常维护切换(Switchover)
A、在P590上,在主库端检验数据库可切换状态
$export ORACLE_SID=orajy
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO Standby
如果SWITCHOVER_STATUS为TO Standby表示可以正常切换
如果SWITCHOVER_STATUS的值为SESSIONS ACTIVE,表示当前有会话处于ACTIVE状态。
B、在P590上,开始主库正常切换
如果SWITCHOVER_STATUS的值为TO Standby 则执行:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL Standby;
如果SWITCHOVER_STATUS的值为SESSIONS ACTIVE 则执行
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL Standby WITH SESSION SHUTDOWN;
成功运行后,主库被修改为备库
C、在P590上,重启先前的主库
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
D、在P720上,在备库验证可切换状态
$export ORACLE_SID=orajy
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO_PRIMARY
E、在P720上,将目标备库转换为主库
如果SWITCHOVER_STATUS的值为TO_PRIMARY 则执行
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
如果SWITCHOVER_STATUS的值为SESSIONS ACTIVE 则执行
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
成功运行后,备库被修改为主库
F、在P720上,重启新的主库
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
在P590上,新的备库启动日志传送进程
SQL> alter database recover managed standby database disconnect;
G、对外服务IP切换
在P590上,删除对外提供服务的IP,更换监听配置文件
以root用户登录,运行命令:#/home/ora10g/script/del_ip.sh
以ora10g用户登录,修改监听配置文件listener.ora,重新启动监听。修改后的P590上的listener.ora为
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orajy)
(ORACLE_HOME = /app/oracle/product/10.2.0/db)
)
(SID_DESC =
(SID_NAME = ora7)
(ORACLE_HOME = /app/oracle/product/10.2.0/db)
)
(SID_DESC =
(SID_NAME = tlmtrq1)
(ORACLE_HOME = /app/oracle/product/10.2.0/db)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.51)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
在P720上,新的主库增加对外提供服务IP,更换监听配置文件
以root用户登录,运行命令:#/home/ora10g/script/add_ip.sh
以ora10g用户登录,修改监听配置文件,重新启动监听。修改后的listener.ora为:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orajy)
(ORACLE_HOME = /app/oracle/product/10.2.0/db)
)
(SID_DESC =
(SID_NAME = ora7)
(ORACLE_HOME = /app/oracle/product/10.2.0/db)
)
(SID_DESC =
(SID_NAME = tlmtrq1)
(ORACLE_HOME = /app/oracle/product/10.2.0/db)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.54)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.43)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC2))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.67)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC3))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.79.20.50)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC4))
)
)
(4)主库灾难切换failover
a、当主库出现故障的时候,首先删除其对外提供服务的IP
以root用户登录,运行命令:#/home/ora10g/script/del_ip.sh
在备库增加对外服务IP,以root用户登录,运行:#/home/ora10g/script/add_ip.sh
b、备库切换为主库
$export ORACLE_SID=orajy
SQL> atter database set standby database to maximize performance;
SQL> alter database recover managed standby database finish force;
SQL> alter database commit to switchover to primary ;
SQL> alter database open;
c、修改监听文件listener.ora,重新启动监听
本章小结
1、Oracle数据库从9i开始提供的Data Guard功能,为Oracle数据库的容灾提供了经济可靠的方案。用户可以根据需要,通过修改参数,实现同步或异步的数据库容灾。主库灾难切换(failover) 之后,原primary 数据库默认不再是data guard 配置的一部分。其它standby 数据库不直接参与failover 的过程,因此这些数据库不需要做任何操作。为了保证数据库的高可用性,为primary 数据库最好设计2个以上standby 数据库。
因为主库一般是性能高的服务器,在灾难切换后,在原主库的服务器上需要手动重建standby 数据库,将主库切换回来。这给日常管理带来了极大不便,不能满足数据级容灾的需要。
2、因为灾难切换是手动切换,时间长,不能满足RTO(恢复时间目标),为管理维护带来不便。
3、由于切换操作时,IP地址也需要进行切换,所以在规划Data Guard时通过网络设备的VLAN技术将primary数据库服务器和standby数据库服务器的IP地址划在同一子网内,便于IP地址的切换。从这点看来也为后期维护带来了不便。
总之单纯使用Data Guard建立备库,是不能满足容灾的管理需要的,下面的章节中,将进一步解决这方面的问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。