首页 > 代码库 > Oracle Standby Database 实现方案
Oracle Standby Database 实现方案
版本:V20060328.01.01
Standby Database的工作原理
1. Oracle 与 High Availability, Disaster Recovery 及 Data Duplicate 相关功能的产品概述
Oracle 的 High Availability 功能,Oracle 是从下面几个方面来诠释的:
(1) System faults and crashes
(2) Application and middleware failures
(3) Network failures
(4) Media failures
(5) Human Error
(6) Disasters and extended outages
(7) Planned downtime, maintenance and management tasks
上述第六项就包含了disaster recovery 在内。因此 disaster recovery 应该算做 high availability 的一个方面了。
总的来说,除了以Oracle database 本身参数进行性能调解外,Oracle 提供支持high availability 相关产品主要有下面几种:
(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 (Oracle Parallel Sever)
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 的功能,这里不尽详细描述。
Advanced Replication
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。
2. standby database 的工作原理
从设计原理上来讲,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 |
实现步骤
- 1. 在Primary Server上安装Oracle并创建SID为pstest的Oracle数据库;
- 2. 在Standby Server上安装Oracle并创建SID为pstest的Oracle数据库;
这一步可以用命令只创建一个名字为pstest的Oracle服务名即可,
WINNT> oradim -NEW -SID pstest -STARTMODE manual
如果创建库的话,数据库文件需要被Primary Server上的数据库文件覆盖掉;
- 3. 将Primary Server上的所有数据文件、redo文件和password文件都copy到Standby 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 |
- 4. 修改Primary Server 的Oraclce初始化参数;
文件位置: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在线文档。
- 5. 设置primary database为archivelog模式
SQL>shutdown immediate;
SQL>startup mount pfile=’ c:\oracle\admin\pstest\pfile\init.ora’;
SQL>alter database archivelog;
SQL>alter database open:
- 6. 在Primary Database上创建Standby Database的控制文件
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的对应位置,原来的控制文件已经不需要了;
- 7. 修改Standby Database的初始化参数
拷贝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在线文档。
- 8. 设置Primary Database和Standby Database的tnsnames.ora
文件位于:c:\oracle\ora92\network\admin
Primary database |
standby = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.21)(PORT = 1521)) ) (CONNECT_DATA =http://www.mamicode.com/ (SERVICE_NAME = pstest) ) )
primary = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.20)(PORT = 1521)) ) (CONNECT_DATA =http://www.mamicode.com/ (SERVICE_NAME = pstest) ) ) |
Standby Database |
standby = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.21)(PORT = 1521)) ) (CONNECT_DATA =http://www.mamicode.com/ (SERVICE_NAME = pstest) ) )
primary = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.20)(PORT = 1521)) ) (CONNECT_DATA =http://www.mamicode.com/ (SERVICE_NAME = pstest) ) ) |
- 9. 启动standby database
SQL>startup nomount pfile=’ c:\oracle\admin\pstest\pfile\init.ora’
SQL>alter database mount standby database;
- 10. 启动primary database
SQL>startup pfile=’ c:\oracle\admin\pstest\pfile\init.ora’
- 11. 启动standby database到recover manage模式
SQL>alter database recover managed standby database disconnect from session;
测试一下
在Primary Database上:
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‘);已经生效。
在Standby Database上
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;
维护standby数据库
当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
问题:
- 1. 关于tnsnames.ora文件
Primary Database和Standby Database上的tnsnames.ora文件内容可以是相同的,其目的是为了建立两个Oracle连接名,一个连自己,一个连对方;这两个连接名对应各自服务器上的初始化参数文件中的一下内容中的primary和standby:
FAL_SERVER=primary 注:Standby Server连接Primary Server的数据库连接名
FAL_CLIENT=standby 注:Primary Server连接Standby Server的数据库连接名
- 2. 关于初始化文件中的LOG_ARCHIVE_MIN_SUCCEED_DEST参数
在上面的配置文件中,此参数的值为2,如果设置为1的话,将不能正常同步归档日志;
- 3. 关于初始化文件中的LOG_ARCHIVE_DEST_2参数
LOG_ARCHIVE_DEST_2= ‘SERVICE=standby‘ 注:到Standby Database的数据库连接名
在Primary Server和Standby Server上的初始化文件中的这个参数分别只的是指向对方的数据库连接名。
- 4. 关于启动关闭顺序
启动的时候,先从库的listener,然后启动从库,然后启动主库的listener 接着是主库 关闭的时候正好相反,先关闭主库,然后是从库。
- 5. 一些常用的view
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的一些情况。