分类: WINDOWS
2008-03-03 15:58:41
不论是小公司,还是拥有全球用户的大公司,后台数据库24小时可用,是至关重要的。Oracle 提供了两种高可靠性的解决方案
n Data Guard(又被称作Standby)
n RAC(Real Application Cluster)
一、RAC (Real Application Clusters)
RAC是多个单CPU机或SMP 或MPP的集群(cluster),cluster里面的服务器使用一个或多个oracle instances 与一个database联接.
SMP是指对称多处理器。大多数小型机都采用这种结构。MPP是另外一种计算机系统机构,大量信息并行处理机。
主要特点
1)database所有的data files/controfile/redo log都建立raw devices上。知道数据库在raw devices上(原是设备),可以绕过操作系统一级,直接读写磁盘,能够提供磁盘的I/O能力,提高效率,尤其是有大量I/O的时候。
2)在database方面,每个instance都有自己单独的on-line redo log file groups,因此backup和recovery是要作特殊处理。 而且在配置上比较复杂。
3)存储方面没有redundancy,因此media failure上还是需要RAID的支持。但集群都是共享一个磁盘阵列(磁盘柜),而这个磁盘阵列是厂商采用相关技术,具有高可靠性。
4)为了高可靠性和高速度,共享磁盘和计算机节点之间要求使用光线连接,而不是使用一般的局域网的网线。磁盘阵列使用光纤通道磁盘阵列。
Standby数据库
Standyby数据库克隆生产数据库,这两个数据库可以存放在不同的地域,当Production Database出现致命的不可恢复的状况时,可以短时间内起动Standy数据库,全面替代生产数据库.
RAC语Standy比较
1)数据库备份:Standby复制原始数据库,因此原始数据库有备份,而RAC只有一个数据库
2)服务器数量: RAC至少双机支持如容错、新的安全级别、负载均衡。在特大数据库和很多的用户访问的系统中,还可以增加计算机,使多个实例同时访问数据库。Standby运行时只有Primary Database提供服务。不能提供容错,、负载均衡等高级功能。
3)当机时间:RAC只要有一台服务器运行就不会当机,而Standyby数据库切换需要一定的时间
4)费用:Standby不需要数据库之外的许可证费用,而RAC的技术和实施相对复杂,花费更大。
5从硬件角度,RAC是比较高端的HA,所以一般都是选用专门厂商的Cluster, 如HP, SUN, AIX.使用相关的小型机系统。这种构建的系统非常稳定,也很安全。
此示例是在windows下说明的。 如果在Unix上只须作很小的相应的改动(如需要改动,文中作出相应标识)
A,standby的配置
在配置前,最好先重建控制文件,修改参数maxlogfiles为10。(默认为5)当然,这一步不是必要的,只有在你需要改变standby数据库的保护模式时才用到。这里是在最高性能模式(Max Performance Mode)。重建控制文件的具体方法可参照文章后的附录。
1,在主数据库启用归档
SQL> archive log list;
数据库日志模式 非存档模式
自动存档 禁用
存档终点 D:\oracle\ora92\RDBMS (在unix下,是路径可能为/。。。/。。。/RDBMS,这个路径是需要制定的。)
最早的概要日志序列 22
当前日志序列 24
下面几步是把Primary 数据库改为归档日志的运行方式,如果数据库已经是在归档日志下运行,则跳过这几步。
SQL> alter system set log_archive_dest_1='location=d:\oracle\arch'; (UNIX, 须改)
系统已更改。
SQL> alter system set log_archive_start=true scope=spfile;
系统已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL> alter database archivelog;
数据库已更改。
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\oracle\arch
最早的概要日志序列 22
下一个存档日志序列 24
当前日志序列 24
2,在standby数据库创建相应的目录结构
D:\oracle\admin\my_standby\bdump
D:\oracle\admin\my_standby\cdump
D:\oracle\admin\my_standby\udump
D:\oracle\admin\my_standby\pfile
D:\arch
D:\oracle\oradata\my_standby
3,设置primary强制logging
SQL> alter database force logging;
数据库已更改。
4,关闭数据库,拷贝所有数据文件及在线重做日志到standby数据库的对应位置
SQL> shutdown immediate
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
5,创建standby控制文件并拷贝到standby数据库,并更改成和primary数据库一样的名称。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> alter database create standby controlfile as 'd:\oracle\oradata\my_standby\standb
y.ctl';
数据库已更改。
SQL>
6,生成初始化文件并拷贝到standby数据库
SQL> create pfile='d:\oracle\admin\my_standby\pfile\standby.ora' from spfile;
文件已创建。
SQL>
7,修改standby数据库初始化参数
*.standby_archive_dest='d:\oracle\arch'
*.fal_server='primary'
*.fal_client='standby'
*.standby_file_management=auto
*.remote_archive_enable=TRUE
8, 修改Primary和Standby的lisener.ora和tnsnames.ora文件
Primary和standby的tnsnames.ora
#TNSNAMES.ORA Network Configuration File: D:\oracle\ora92\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.
STANDBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.199)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = my_standby)
)
)
PRIMARY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.32)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = my_standby)
)
)
Primary的listener.ora
# LISTENER.ORA Network Configuration File: D:\oracle\ora92\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.11.32)(PORT = 1521))
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = my_standby)
(SID_NAME = my_standby)
)
)
Standby的listener.ora
# LISTENER.ORA Network Configuration File: D:\oracle\ora92\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.199)(PORT = 1521))
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = my_standby)
(SID_NAME = my_standby)
)
)
9,创建standby数据库实例
$oradim –NEW –SID my_standby
启动listener,并启动数据库到nomount状态
C:\Documents and Settings\hp>set oracle_sid=my_standby
C:\Documents and Settings\hp>sqlplus
SQL*Plus: Release
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
请输入用户名: / as sysdba
已连接到空闲例程。
SQL> startup nomount pfile='d:\oracle\admin\my_standby\pfile\standby.ora';
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL>create spfile from pfile='d:\oracle\admin\my_standby\pfile\standby.ora';
10,启动standby数据库
SQL>startup nomount;
SQL>alter database mount standby database;
SQL>alter database recover managed standby database disconnect;
11,设置primary的远程归档路径
SQL> alter system set log_archive_dest_2='SERVICE=standby reopen=60';
系统已更改。
SQL> alter system set log_archive_dest_state_2=enable;
系统已更改。
12,测试文件是否已传到standby
在primary机上执行:
SQL> alter system switch logfile;
系统已更改。
SQL> select status,error from v$archive_dest;
STATUS ERROR
--------- ------------------------------------
VALID
VALID
INACTIVE
INACTIVE
INACTIVE
INACTIVE
INACTIVE
INACTIVE
INACTIVE
INACTIVE
已选择10行。
SQL>
查询standby数据库
SQL> col name format a30 SQL> select sequence#,name,applied from archived_log; SEQUENCE# NAME APP ---------- ------------------------------ --- 27 D:\ORACLE\ARCH\ARC00027.001 YES 24 D:\ORACLE\ARCH\ARC00024.001 YES 25 D:\ORACLE\ARCH\ARC00025.001 YES 26 D:\ORACLE\ARCH\ARC00026.001 YES SQL>
可以看到归档文件都传过来,而且都应用了(APP=YES)。
至此,standby安装完毕。
B,standby的切换
Oracle DataGuard提供了两种的故障撤换方式,分别为SWITCHOVER和FAILOVER。
SWITCHOVER是将主数据库和后备数据库的角色进行调换。这里介绍的是手工切换的方法,也可以用DataGuard Broker实现,在这里就不详述了。
首先,在primary及standby数据库中分别创建名为primary及standby的两套初始化参数文件,方便以后进行切换用。
SQL> create pfile='d:\oracle\admin\my_standby\pfile\standby.ora' from spfile;
文件已创建。
SQL>
加上如下参数
*.standby_archive_dest='d:\oracle\arch'
*.fal_server='standby'
*.fal_client='primary'
*.standby_file_management=auto
*.remote_archive_enable=TRUE
同理,在standby数据库创建名为primary的pfile,加上如下参数
*.log_archive_dest_2='SERVICE=primary reopen=60'
*.log_archive_dest_state_2=enable
( 1 ) 将主数据库撤换为standby数据库
在open状态下
SQL> alter database commit to switchover to standby;
数据库已更改。
SQL> shutdown immediate
ORA-01507: ??????
ORACLE 例程已经关闭。
SQL> startup nomount pfile='d:\oracle\admin\my_standby\pfile\standby.ora';
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL> alter database mount standby database;
数据库已更改。
SQL> alter database recover managed standby database disconnect;
数据库已更改。
SQL> create spfile from pfile='d:\oracle\admin\my_standby\pfile\standby.ora';
文件已创建。
SQL>
( 2 ),将standby数据库撤换为主数据库
SQL>alter database recover managed standby database finish;
SQL>alter database commit to switchover to primary;
SQL>shutdown immediate;
SQL>startup nomount pfile=’d:\oracle\admin\my_standby\pfile\primary.ora’ from spfile;
SQL>alter database mount;
SQL>alter database open;
SQL> create spfile from pfile='d:\oracle\admin\my_standby\pfile\primary.ora';
SQL> alter system archive log current;
测试归档是否已经传过去并成功应用。
Failover是在主数据库出现故障后,将后备数据库切换为主数据库的一种方法。同样的,也可以手工或使用DataGuard Broker实现。
有一点要注意的是,在failover后要重做后备数据库!
SQL> alter database recover managed standby database finish;
数据库已更改。
SQL> alter database activate standby database;
数据库已更改。
SQL> shutdown immediate
ORA-01507: ??????
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL>
1,生成控制文件
SQL> alter database backup controlfile to trace;
数据库已更改。
SQL>
在udump目录下可找到最新的trc文件,此文件就包含了当前控制文件的参数及生成语法。
2,提取语句另生成文件cre_ctl.sql。并修改maxlogfiles值为10。
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "MY_STANDBY" RESETLOGS FORCE
LOGGING ARCHIVELOG
-- SET STANDBY TO MAXIMIZE PERFORMANCE
MAXLOGFILES 10
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1 'D:\ORACLE\ORADATA\MY_STANDBY\REDO01.LOG' SIZE
GROUP 2 'D:\ORACLE\ORADATA\MY_STANDBY\REDO02.LOG' SIZE
GROUP 3 'D:\ORACLE\ORADATA\MY_STANDBY\REDO03.LOG' SIZE
-- STANDBY LOGFILE
DATAFILE
'D:\ORACLE\ORADATA\MY_STANDBY\SYSTEM01.DBF',
'D:\ORACLE\ORADATA\MY_STANDBY\UNDOTBS01.DBF',
'D:\ORACLE\ORADATA\MY_STANDBY\USERS01.DBF'
CHARACTER SET ZHS16GBK
;
ALTER DATABASE OPEN RESETLOGS;
ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\ORADATA\MY_STANDBY\TEMP01.DBF'
SIZE 41943040 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE
3,执行脚本
SQL>shutdown immediate;
SQL>@c:\cre_ctl.sql