Oracle 的 High Availability 功能,Oracle 是从下面几个方面来诠释的:html
(1) System faults and crashesnode
(2) Application and middleware failuressql
(3) Network failuresshell
(4) Media failures数据库
(5) Human Error服务器
(6) Disasters and extended outagessession
(7) Planned downtime, maintenance and management tasksoracle
上述第六项就包含了disaster recovery 在内。所以 disaster recovery 应该算作 high availability 的一个方面了。app
总的来讲,除了以Oracle database 自己参数进行性能调解外,Oracle 提供支持high availability 相关产品主要有下面几种:ide
(1) Oracle Fail Safe on NT
(2) Oracle Parallel Server
(3) Oracle Parallel Fail Safe
(4) Oracle Advanced Quening
(5) Oralce Advanced Replication
(6) Oracle Standby Database
在Duplication data 方面主要有用于distributed data 功能的Advanced Replication 和咱们讨论过 standby database
从参与讨论的帖子来看,相关的问题是集中在OPS,standby database 和 Advanced Replication 的选择,所以我就先将这三种产品作一下比较。
OPS 最原始的设计初衷就是system/application high availability。与其余产品相比较:
OPS 是多个单CUP机或SMP(Symmetric Multi-Processing system) 的cluster (MPP Massively Parallel Processing) 。cluster 里面不一样的 node 使用一个(通常是一个)或多个oracle instances 与一个database 链接
主要的技术特色:
(1) database 全部的data files 是创建在 raw devices 上面的,所以在技术方面对OS 的设置有很高的依赖性,不少方面取决于OS的对设置是否支持。
(2) 在database 方面,每一个node都有本身单独的 on-line redo log file groups,所以在作backup 和recovery 的时候,须要特殊的处理。
(3) OPS 的data files 方面并无redundance,所以 media failure 方面,要依靠RAID (redundant array of inexpensive disk) subsystem.
Oracle 从8i 开始在OPS的基础上,逐步在不一样的OS平台上,增长了Fail Safe/Failover 的功能,这里不尽详细描述。
Replication 的设计初是分散异地的application access database locally。这种技术能够将一个database 中的Tables,Indexes,Views,Packages and Package Bodies,Procedures and Functions,Triggers,Sequences,Synonyms复制到另外一database中。若是是所有database 的复制,也可用于high availability。
一个范例,yahoo在美国的东岸和西岸,各有一个镜像database,是采用的 replication 的技术。东西两岸的用户是连到最近的database,从而提升访问的速度。若是一个database出了问题,用户自动转入与另外一个相连,实现网站的high availability。这种high availability 对用户来讲,是透明的。
其余的范例,在公司中的应用,例如,HR database中雇员资料,在accounting database 中须要除去薪资等的其余资料,能够在HR中创建一个view,以replication 技术复制到 accounting database 中。
由于大多 replicas 都是在异地,从而在异地创建了redundance data。Replication 是对于database 来讲的 high availability。
从设计原理上来说,standby database 是为 primary database 创建的备份,所以具备 redundance data,也是相对于 database 来讲的 high availability;
standby database 为 primary database 作的备份,是经过 primary database 不断产生出的archived log files 来实现的。primary database 处于 archive mode 的状态,持续送出 archived log files 给 standby database,而 standby database 则处于 recovery mode,持续apply primary database 的 archived log files.
为了完成上述过程,必须具有如下的条件:
(1) 若是primary database 和 standby database 是运行在不一样的服务器上面,那么这两台服务器必须有相同version 和 release 的操做系统;必须有相同 version, release 和 patch 的 oracle RDBMS 系统。
(2) Oracle 是容许 primary 和 standby database 在同一个服务器上面运行的。若是是这种情形,建议这两个databases 要分布在不一样的physical disk drives 上面。而且不是全部的操做系统都支持mount 两个instances 链接两个同名的databases。
(3) Primary database 必需处于archive log mode。
(4) Oracle 从 version 7.3才开始支持 standby database。7.3.x – 8.0.x 须要手工copy 全部的archived log files 从 primary server 到 standby server,而且,须要手工 recovery archived log files (固然这些能够经过 OS shell scripts, sql scripts 等等方法来实现) ;而且standby database 只可以处于close/nomount/mount 的状态。
(5) Oracle 从version 8i (8.1.5之后) 开始支持 primary database 能够将 arhived log files 自动送到最多一个remote site (通常即standby database server) ,本地则可多达七个地点。而且,standby database 在mount 的状态下,增长了 managed recovery mode,在这种状态下,standby database 能够自动当即apply 由 primary node 送过来的 archived log files。
(6) Oracle 从version 8i (8.1.5之后) 开始支持standby database的mount recovery mode和database read only mode的转换。这样方便了系统能够利用standby database产生reports,而不影响用户正常使用 primary database。
(7) 一旦 standby database被activated,即成为primary database,没法再回归 standby database mode。所以primary database出了问题,standby database被actived成为primary database以后,若是须要在原来的 primary/standby node上面重建 primary/standby database,两个database都须要重建。
(8) 关于启动standby database时与 primary database之间的数据丢失问题。若是primary database在出问题以前若是没法完成 log file switch的话,两个database之间会相差 current on-line redo log file中的数据。oracle9i中的 data guard弥补了这一缺陷。oracle8i只有solaris平台支持 data guard。
注意:第(5) (6) 两项只有oralce 8i EE(Enterprise Edition)版本支持。SE (Standard Edition) 不支持这两项功能。
不一样于OPS和Advanced Replication,使用standby database的时候,不管在actived standby database时,或在primary node上面重建 primary database的时候,系统都须要down time。所需时间长短,与系统状态有关。若是能够在primary mode创建standby database (若是两个server的硬件设置同样,通常standby node要差一些,节约费用) ,能够减小downtime。
在下面的几部份,能够讨论到部份细节。
|
主服务器 |
备份服务器 |
操做系统 |
Windows 2003 Enterprise |
Windows 2003 Enterprise |
Oracle版本 |
Oracle 9.2.0.1 |
Oracle 9.2.0.1 |
Oracle SID |
pstest |
pstest |
ORACLE_HOME |
c:\oracle\oradata\pstest |
c:\oracle\oradata\pstest |
机器名 |
Primary |
Standby |
IP地址 |
192.168.5.20 |
192.168.5.21 |
这一步能够用命令只建立一个名字为pstest的Oracle服务名便可,
WINNT> oradim -NEW -SID pstest -STARTMODE manual
若是建立库的话,数据库文件须要被Primary Server上的数据库文件覆盖掉;
|
C:\oracle\oradata\pstest 目录下文件 |
|
CWMLITE01.DBF DRSYS01.DBF EXAMPLE01.DBF INDX01.DBF ODM01.DBF SYSTEM01.DBF TEMP01.DBF TOOLS01.DBF UNDOTBS01.DBF USERS01.DBF XDB01.DBF REDO01.LOG REDO02.LOG REDO03.LOG |
|
D:\oracle\ora92\database 目录下文件 |
|
PWDpstest.ora |
文件位置:c:\oracle\admin\pstest\pfile\
文件名字不肯定,相似这样:init.ora.114200520819,咱们把名字改成init.ora,这样好记一点;
FAL_SERVER=standby 注:Primary Server链接Standby Server的数据库链接名
FAL_CLIENT=primary 注:Standby Server链接Primary Server的数据库链接名
LOG_ARCHIVE_DEST_1= 'LOCATION= c:\ arch mandatory reopen=15’
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_2= 'SERVICE=standby' 注:到Standby Database的数据库链接名
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_FORMAT='ARC%t_%s.arc'
LOG_ARCHIVE_MIN_SUCCEED_DEST=2
log_archive_start=true
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
STANDBY_FILE_MANAGEMENT=AUTO
具体参数的说明请参考oracle在线文档。
SQL>shutdown immediate;
SQL>startup mount pfile=’ c:\oracle\admin\pstest\pfile\init.ora’;
SQL>alter database archivelog;
SQL>alter database open:
SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database create standby controlfile as ‘c:\oracle\oradata\pstest\control01.ctl’
SQL>alter database open;
而后将该controlfile复制到Standby Server的对应位置,原来的控制文件已经不须要了;
拷贝Primary Database上的初始化参数文件到Standby Database上对应位置,而后修改成如下内容:
CONTROL_FILES=' c:\oracle\oradata\pstest\control01.ctl’
FAL_SERVER=primary 注:Standby Server链接Primary Server的数据库链接名
FAL_CLIENT=standby 注:Primary Server链接Standby Server的数据库链接名
LOG_ARCHIVE_DEST_1= 'LOCATION= c:\ arch mandatory reopen=15’
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_2= 'SERVICE=primary'
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_FORMAT='ARC%t_%s.arc'
LOG_ARCHIVE_MIN_SUCCEED_DEST=2
log_archive_start=true
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
STANDBY_ARCHIVE_DEST=’ c: \arch’
STANDBY_FILE_MANAGEMENT=AUTO
具体参数的说明请参考oracle在线文档。
文件位于:c:\oracle\ora92\network\admin
Primary database |
standby = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.21)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = pstest) ) )
primary = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.20)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = pstest) ) ) |
Standby Database |
standby = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.21)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = pstest) ) )
primary = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.20)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = pstest) ) ) |
SQL>startup nomount pfile=’ c:\oracle\admin\pstest\pfile\init.ora’
SQL>alter database mount standby database;
SQL>startup pfile=’ c:\oracle\admin\pstest\pfile\init.ora’
SQL>alter database recover managed standby database disconnect from session;
SQL> create user test identified by 密码;
SQL> grant connect ,resource to test ;
SQL> conn test/密码@primary;
SQL> create table test(name varchar2(20));
SQL> insert into test values('hi,data guard');
SQL> commit;
SQL> conn / as sysdba
SQL> alter system switch logfile;
察看从库日志
C:\oracle\admin\poramls\bdump\pormals_alert.ora
看当前归档日志是否已经正常完成恢复
已只读方式打开从库察看是否insert into test values('hi,data guard');已经生效。
SQL> conn / as sysdba;
SQL> alter database recover managed standby database cancel;
SQL> alter database open read only;
SQL> conn test/密码
SQL> select * from test;
察看是否insert into test values('hi,data guard');已经生效。
若是生效说明已经彻底正常工做,data guard到此彻底配置完毕。
再次置从库在恢复模式
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE disconnect from session;
当primary 数据库失败时,将standby 数据库激活:取消(cancel)恢复执行如下操做:
sql> connect internal/password;
sql> startup nomount pfile=’c:\oracle\admin\pstest\pfile\init.ora’;
sql> alter database mount standby database;
sql> alter database activate standby database;
shutdown standby 数据库;
sql> shutdown immediate
重起Standby Database;
sql > startup
Primary Database和Standby Database上的tnsnames.ora文件内容能够是相同的,其目的是为了创建两个Oracle链接名,一个连本身,一个连对方;这两个链接名对应各自服务器上的初始化参数文件中的一下内容中的primary和standby:
FAL_SERVER=primary 注:Standby Server链接Primary Server的数据库链接名
FAL_CLIENT=standby 注:Primary Server链接Standby Server的数据库链接名
在上面的配置文件中,此参数的值为2,若是设置为1的话,将不能正常同步归档日志;
LOG_ARCHIVE_DEST_2= 'SERVICE=standby' 注:到Standby Database的数据库链接名
在Primary Server和Standby Server上的初始化文件中的这个参数分别只的是指向对方的数据库链接名。
启动的时候,先从库的listener,而后启动从库,而后启动主库的listener 接着是主库 关闭的时候正好相反,先关闭主库,而后是从库。
V$ARCHIVE_DEST_STATUS 这里面会纪录到standby 的状态和恢复到那个日志
V$ARCHIVE_GAP 这里面会纪录当前从库mrp进程恢复须要的胆识尚未传到从库得日志
V$ARCHIVED_LOG 这里面会纪录全部已经归档到从库的日志,而且记录该日志是否已经恢复
V$DATABASE 会纪录系统的保护状态和是否处于force logging状态
V$MANAGED_STANDBY (Physical Standby Databases Only) 会纪录当前从库的一些进程状况和进程的process id,如rfs,mrp等
V$STANDBY_LOG (Physical Standby Databases Only) 会纪录当前从库的standby redo log的一些状况。