相比Oracle 8i和Oracle 9i,Oracle 11g在数据库备份方面做出了极大的改善,特别是作为Oracle最大可用性架构(MAA)一部分的真正应用集群(RAC)特性。Oracle 11g现在创建一个备用数据库变得更加简单了,因为恢复管理器(RMAN)支持直接从主数据库使用DUPLICATE DATABASE命令集通过网络克隆一个备用数据库,只要目标数据库是活动的即可。这意味着再也不用先生成,再传输,最后在备用数据库上通过复杂的手工方式还原和恢复主数据库的RMAN备份集了,相反,RMAN在主站点上自动生成一个转换脚本在内存中,然后在备用站点上使用这个脚本管理克隆操作,实际上不用DBA进行任何干预。
下文将集中精力讲解备用数据库“实况克隆”特性。笔者的硬件基本情况是:双核AMD Athlon 64位CPU(Winchester 420),4GB内存,主机运行的是Windows xp系统,运行VMWare Server 1.0.8访问访问虚拟数据库服务器环境,每个虚拟机使用1个CPU,1200M内存,我选择Oracle Enterprise Linux (OEL) 4.5.1(Linux内核版本2.6.9-55.0.0.0.2.ELsmp)作为虚拟机客户端操作系统。
每个VMWare虚拟机配置好后,在每个虚拟机的/etc/hosts文件中添加合适的条目,让主站点(training)和备用站点(11gStdby)之间建立起网络连接,然后在每个节点上都安装Oracle 11g数据库,最后,在主站点上创建好标准的11g R1种子数据库,包括标准的示例方案。这个数据库的ORACLE_SID是orcl,接下来就可以开始执行实况克隆操作了。
克隆前准备工作:调整主数据库
在克隆主数据库到对应的备用环境中之前,我需要对主数据库做一些调整,下面的步骤未做特别说明没有先后顺序,只要在发出DUPLICATE DATABASE命令前这些步骤都执行完了即可,在克隆操作过程中应该没有什么让人意外的东西出现。
强制记录所有的交易
大多数组织实施数据卫士配置的主要原因是保证所有交易都不丢失,但遗憾的是,默认情况下,Oracle数据库是运行在NOFORCE LOGGING模式下的,这意味着对对象的改变可能丢失,因为他们的存储属性被设为NOLOGGING,为了确保所有的改变都被记录下来,我将执行ALTER DATABASE FORCE LOGGING命令,这个命令需要在执行ALTER DATABASE ARCHIVELOG命令将数据库ARCHIVELOG模式前执行,这些命令如清单1所示。
清单1 将主数据库切换到ARCHIVELOG模式
--为归档日志文件设置一个合适的格式
ALTER SYSTEM SET log_archive_format = 'log_%s_%t_%r.arc' SCOPE=SPFILE;
--设置新的DB_UNIQUE_NAME参数,它不能动态修改
ALTER SYSTEM SET db_unique_name = 'orcl' SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE FORCE LOGGING;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
创建备用重做日志组
自从Oracle 9i R2开始支持备用重做日志(standby redo log 即SRL)组开始,Oracle就建议配置它,SRL对于实时应用(Real Time Apply)特性是需要的,或DBA想要实现重做日志串联目的时也需要,除此之外,它任然是备用数据库配置选项。Oracle 11g另一个优点是如果SRL在主数据库上已经配置好,那么DUPLICATE DATABASE命令将会在备用数据库上自动创建它们。清单2显示了我在主数据库上创建SRL的命令,注意我也使用了多个重SRL文件保护整个SRL组,避免数据丢失,这一点和在线重做日志组类似。
清单2 在主数据库上创建备用重做日志文件
ALTER DATABASE
ADD STANDBY LOGFILE
'/u01/app/oracle/oradata/orcl/srl01.log'
SIZE 50M
REUSE;
ALTER DATABASE
ADD STANDBY LOGFILE
'/u01/app/oracle/oradata/orcl/srl02.log'
SIZE 50M
REUSE;
ALTER DATABASE
ADD STANDBY LOGFILE
'/u01/app/oracle/oradata/orcl/srl03.log'
SIZE 50M
REUSE;
文件名转换
一般情况下,备用数据库都是创建在与主数据库不同的主机上的,否则,在灾难中主备数据库都有可能受到危害,最佳做法是将对应的备用数据库的目录和文件名都弄成一样,但如果遇到挂载点不一样时,目录名需要修改,这个时候就需要使用DB_FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT初始化参数进行转换了。
修改主站点初始化参数
在主数据库上设置下列初始化参数确保DUPLICATE DATABASE命令能够一样配置备用数据库,我在清单3中详细列出了这些初始化参数设置:
(1)DB_UNIQUE_NAME
我通过这个参数为主数据库定义一个唯一的实例名,这个参数值使得区分“原始”主数据库和备用数据库变得更加简单,因为这是一个静态参数,我在清单1中已经将其设置为SCOPE=SPFILE,它将在主数据库实例启动时生效。
(2)LOG_ARCHIVE_CONFIG
这个参数控制主或备用数据库是否应该接受和/或发送来自远程源的归档重做日志,它允许我们包含所有主备数据库,因为它在配置中列出了所有数据库的DB_UNIQUE_NAME值,我将其设置为目前我的数据卫士数据库orcl和stdby。
(3)STANDBY_FILE_MANAGEMENT
我将这个参数设置问为auto了,这样主数据库上发生什么操作,备用数据库上就会跟着发生什么操作,如主数据库上创建一个文件,备用数据库上也将创建一个相同的文件,删除主数据库上一个已有文件,备用数据库上也做对应的删除。如新增一个在线重做日志文件组或删除一个表空间。
(4)LOG_ARCHIVE_DEST_n
这个控制是从主数据库上传输归档重做日志到物理备用数据库的关键参数,我将设置两个归档目标:
1. 目标LOG_ARCHIVE_DEST_1指定主数据库归档重做日志的物理位置,注意我们使用了闪回恢复区作为目标。
2. 目标LOG_ARCHIVE_DEST_2指定了对应的备用数据库实例(stdby)的网络服务地址,这个参数确保归档重做日志自动传输到备用站点。
对于这个归档重做日志传输参数我还可以指定另外两个指令:
◆当数据库是以特定角色激活时,指令VALID_FOR大大简化了重做日志传输时的类型,当主备数据库角色不同时,在传输重做日志时这是最关键的参数,表1列出了这个参数允许的值。
表1 VALID_FOR指令值
设置
含义
ALL_LOGFILES
(默认)目标使用在线或备用重做日志文件
ONLINE_LOGFILE
目标仅适用于在线归档重做日志文件
STANDBY_LOGFILE
目标仅适用于备用重做日志文件
ALL_ROLES
当数据库以主或备用角色运行时(默认)目标都是有效的
PRIMARY_ROLE
当数据库以主角色运行时目标是有效的
STANDBY_ROLE
当数据库以备用角色运行时目标是有效的
◆也可以设置合适的重做日志传输模式(redo transport mode)值指定归档重做日志从主数据库传输到备用数据库,表2列出了这个指令允许的值。
设置
含义
ASYNC
在事务提交前可能不是所有的目标都接受了传输的重做日志(默认值)
SYNC
在事务提交前所有目标必须接受传输的重做日志
AFFIRM
仅当重做数据被写入到备用重做日志后,目标才确认已收到,含有SYNC含义
NOAFFIRM
当重做数据写入到备用重做日志前目标就可以确认收到,含有ASYNC含义
网络配置修改
最后,我需要确保主数据库和备用数据库之间能够通过网络通信,唯一需要变化的就是在主数据库本地命名配置文件(TNSNAMES.ORA)中加上备用数据库的实例,备用数据库的LISTENER.ORA配置文件也需要一个备用数据库实例的静态监听器,这些变化如清单4所示。
清单3 在主数据库上设置合适的初始化参数值
ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=/u01/app/oracle/flash_recovery_area/ORCL/ DB_UNIQUE_NAME=orcl VALID_FOR=(ALL_LOGFILES,ALL_ROLES)';
ALTER SYSTEM SET log_archive_dest_state_1 = 'ENABLE';
ALTER SYSTEM SET log_archive_dest_2 = 'SERVICE=stdby ASYNC DB_UNIQUE_NAME=stdby VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE)';
ALTER SYSTEM SET log_archive_dest_state_2 = 'ENABLE';
ALTER SYSTEM SET standby_file_management = 'AUTO';
ALTER SYSTEM SET log_archive_config = 'DG_CONFIG=(orcl,stdby)';
清单4 网络配置文件修改
#在主数据库实例上添加一个备用数据库条目
STDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 11gStdby)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = stdby)
)
)
#使用备用数据库实例的静态引用设置备用数据库监听器
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = stdby)
(ORACLE_HOME = /u01/app/oracle/product/11.1.0/db_1)
(SID_NAME = stdby)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 11gStdby)(PORT = 1521))
准备克隆:准备备用站点
现在主站点已经准备好可以克隆了,在对应的备用站点上也需要做一些对应的调整:
创建必要的目录
需要为数据库控制文件、数据文件、在线重做日志文件和备用重做日志文件创建必要的目录,我还为数据库的审核跟踪创建了合适的目录。
设置密码文件
因为主数据库要和备用数据库进行通信时需要使用远程认证,我将会使用orapwd工具创建一个新的密码文件,确保SYS的密码和主数据库匹配(注意我可能会直接从主数据库拷贝到备用数据库)。
创建备用初始化参数文件
最后,我需要创建一个初始化参数文件(PFILE),仅允许我启动备用数据库实例,它只需要一个参数:DB_NAME。当DUPLICATE DATABASE命令脚本执行完毕后,它将会创建一个服务端参数文件(SPFILE),它仅包括合适的初始化参数设置。
在清单5中我解释了这些命令和临时备用数据库初始化参数,为了开启DUPLICATE DATABASE克隆操作,我将启动备用站点的监听器,然后使用前面创建的PFILE初始化参数文件将备用数据库实例启动到NOMOUNT状态。
$> export ORACLE_SID=stdby
$> sqlplus / as sysdba
SQL> startup nomount pfile='/home/oracle/init_stdby.ora';
清单5 备用数据库临时初始化参数文件
######
# File: initstdby.ora
# Purpose: "Dummy" PFILE to enable startup of standby database
# instance during DUPLICATE DATABASE over the network
#####
DB_NAME=stdby