**
Oracle 容灾方案
**
一、容灾基本概念:
1、阵列的复制技术(硬件)
通过在阵列之间进行复制,异地保存数据(要求:两边的系统配臵一致,用于大数据量的环境,备份方,可以不设
主机,只需要存储设备。
对存储设备和网络环境要求比较高。比如 EMC 存储)
2、基于逻辑卷的复制技术(操作系统层面)
lv(logical volumn)的镜像技术来实现
通过 TCP/IP 网络传输逻辑卷上数据的变化(要求:两边的软、硬件环境必须一致,一般用于大数据量的传递,
如IBM AIX 的逻辑卷的复制技术)
3、基于 Oracle 的 redo log 的复制(在应用层)
1)DataGuard
2)GoldGate
3)stream
逻辑复制: 将主库的 redo log 传递到备库后,然后利用 logminer 的工具,从 redo log 中解析出 sql 语句,在
备库执行,保证和主库同步。(主库和备库可以
是不同的环境,备库可以处于读写状态)
逻辑备库可以看作是一个单独的库(数据库名和 DBID 和主库都不一样)。
物理复制:将主库的 redo log 传递到备库后,备库对 redo log 日志进行 recovery ,来和主库保持一致。(主库和
备库必须是相同的环境,备库一般处于只读状态)
物理的备库和主库是一样的(比如:数据库名、DBID)
4、Oracle Data Guard
----Oracle 成本最低的容灾技术(Oracle 企业版自动支持,通过主库和备库来实现容灾;一般主库处于生产环境,
备库处于备份状态,或者可以利用备库做数据查询、生成报表、数据备份等
减轻主库的压力)
—主库将 redo log 传递到备库上,备库对 redo log 进行应用(物理—RECOVERY,逻辑-----应用 sql 语句),来
保持和主库的同步。
———————————————————————————————————————————————————————
DG 环境:(备库最多可以有 9 9 个)
1) 主库和备库之间都是单实例
2) 主库是 RAC ,备库是单实例
3) 主库是 RAC,备库也是 RAC (MAA 实现最高可用性)
------ DG 的模式
1、物理 DG: 备库接收到主库的 redo log 后,做 recover;要求备库环境和主库换将必须一致,备库一般处于 mount
状态,如果 open,只能处于只读状态,并且在
open 状态下不能再做 recover。(一般对于物理 DG,可以利用备库进行备份,减轻主库的压力)
2、逻辑 DG: 备库收到主库的 redo log 后,对 redo log 抽取 sql 然后进行应用;备库环境可以和主库不一致。备
库可以进入 open(读写状态),可以在备库上做查询、
报表打印等操作,减轻主库压力;建立逻辑备库之前,必须先建立物理的备库
———————————————————————————————————————————————————————
------ DG 的保护模式
Data Guard 允许定义 3 钟数据保护模式,分别是最大保护(Maximum Protection),最大可用(Maximum
Availability)和最大性能(Maximum Performance)。
- 最大保护( Maximum Protection )
这种模式能够确保绝无数据丢失。要实现这一步当然是有代价的,它要求所有的事务在提交前其 REDO不仅被
写入到本地的 Online Redologs,还要同时写入到 Standby
数据库的 Standby Redologs,并确认 REDO 数据至少在一个 Standby 数据库中可用(如果有多个的话),然
后才会在Primary 数据库上提交。如果出现了什么故障导致
Standby 数据库不可用的话(比如网络中断),Primary 数据库会被 Shutdown,以防止数据丢失。
使用这种方式要求 Standby Database 必须配臵 Standby Redo Log,而 Primary Database 必须使用
LGWR,SYNC,AFFIRM 方式归档到 Standby Database. - 最高可用性( Maximum availability )
这种模式在不影响 Primary 数据库可用前提下,提供最高级别的数据保护策略。其实现方式与最大保护模式类
似,也是要求本地事务在提交前必须至少写入一台
Standby 数据库的 Standby Redologs 中,不过与最大保护模式不同的是,如果出现故障导致 Standby数据
库无法访问,Primary 数据库并不会被 Shutdown,而是自动转为
最高性能模式,等 Standby 数据库恢复正常之后,Primary 数据库又会自动转换成最高可用性模式。
这种方式虽然会尽量避免数据丢失,但不能绝对保证数据完全一致。这种方式要求 Standby Database 必须
配臵Standby Redo Log,而 Primary Database 必须使用
LGWR SYNC,AFFIRM 方式归档到 Standby Database. - 最高性能( Maximum performance )
缺省模式。 这种模式在不影响 Primary 数据库性能前提下,提供最高级别的数据保护策略。事务可以随时提
交,当前Primary 数据库的 REDO 数据至少需要写入一个
Standby 数据库,不过这种写入可以是不同步的。如果网络条件理想的话,这种模式能够提供类似最高可用性
的数据保护,而仅对 Primary 数据库的性能有轻微影响。
这也是创建 Standby 数据库时,系统的默认保护模式。
这种方式可以使用 LGWR ASYNC 或者 ARCH 进程实现,Standby Database 也不要求使用 Standby Redo Log。
———————————————————————————————————————————————————————
RFS: 在备库上启用的进程,远程文件服务器,接受重做日志(redo log 和 arch log)
LNSn:本地网络服务,复制传送 redo 日志
MRP: 管理恢复进程,如果是物理 DG ,用于对 redo log 做 recovery
LSP: 逻辑备用进程,在逻辑 DG,将从 redo log 中抽取的 sql 进行应用
使用LGWR 进程的 SYNC 方式 1)PrimaryDatabase 产生的 Redo 日志要同时写到日志文件和网络。也就是说
LGWR 进程把日志写到本地日志文件的同时还要发送给本地的 LNSn 进程(NetworkServerProcess),再由 LNSn
(LGWRNetworkServerprocess)进程把日志通过网络发送给远程的目的地,每个远程目的地对应一个 LNS 进程,
多个LNS 进程能够并行工作。
2)LGWR 必须等待写入本地日志文件操作和通过 LNSn 进程的网络传送都成功,PrimaryDatabase上的事
务才能提交,这也是 SYNC 的含义所在。
3)Standby Database 的 RFS 进程把接收到的日志写入到 Standby RedoLog 日志中。
4)Primary Database 的日志切换也会触发 Standby Database 上的日志切换,即 Standby Database 对
Standby RedoLog 的归档,然后触发 StandbyDatabase 的 MRP 或者 LSP 进程恢复归档日志。
因为 PrimaryDatabase 的 Redo 是实时传递的,于是 StandbyDatabase 端可以使用两种恢复方法:
实时恢复(Real-TimeApply):只要 RFS 把日志写入 StandbyRedoLog 就会立即进行恢复;
归档恢复:在完成对 StandbyRedoLog 归档才触发恢复。
PrimaryDatabase 默认使用 ARCH 进程,如果使用 LGWR 进程必须明确指定。使用 LGWRSYNC 方式时,
可以同时使用 NET_TIMEOUT 参数,这个参数单位是秒,代表如果多长时间内网络发送没有响应,LGWR 进程会抛
出错误。示例如下:
altersystemsetlog_archive_dest_2='SERVICE=STLGWRSYNCNET_TIMEOUT=30’scope=both;
1.3 使用 LGWR 进程的 ASYNC 方式
使用 LGWRSYNC 方法的可能问题在于,如果日志发送给 StandbyDatabase 过程失败,LGWR进程就会报
错。也就是说 PrimaryDatabase 的 LGWR 进程依赖于网络状况,有时这种要求可能过于苛刻,这时就可以使用
LGWRASYNC 方式。它的工作机制如下:
1)PrimaryDatabase一端产生Redo日志后,LGWR把日志同时提交给日志文件和本地LNS进程,但是LGWR
进程只需成功写入日志文件就可以,不必等待 LNSn 进程的网络传送成功。
2)LNSn 进程异步地把日志内容发送到 StandbyDatabase。多个 LNSn进程可以并发发送。
3)PrimaryDatabase 的 OnlineRedoLog 写满后发生 LogSwitch,触发归档操作,也触发 StandbyDatabase
对StandbyDatabase 对 StandbyRedoLog 的归档;然后触发 MRP或者LSP 进程恢复归档日志。
———————————————————————————————————————————————————————
因为 LGWR 进程不会等待 LNSn 进程的响应结果,所以配臵 LGWRASYNC 方式时不需要 NET_TIMEOUT
参数。示例如下:
altersystemsetlog_archive_dest_2='SERVICE=STLGWRASYNC’scope=both;
二: 配臵 Oracle DataGuard
物理的DATAGUARD
系统环境:
OS: RH55
Oracle version:Oracle 11g (11.2.0.1)
配臵说明:
Primary db:
db_name = prod
db_unique_name = bjdb
Standby db:
db_name = prod
db_unique_name = shdb
----------主库配臵( Oracle 10g )
—首先通过 rman 对数据库做冷备份
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 205520896 bytes
Fixed Size 1218532 bytes
Variable Size 67110940 bytes
Database Buffers 134217728 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database force logging; ;数据库必须在归档模式下建立 DG,强制所有的应用都生成日志
Database altered.
SQL>
SQL> show parameter spfile;
NAME TYPE VALUE
———————————————————————————————————————————————————————
spfile string /u01/app/oracle/product/10.2.0
/db_1/dbs/spfilebj.ora
SQL> alter system set log_archive_dest_1=‘location=/u01/disk1/arch/bj’ scope=spfile;
System altered.
SQL> alter system set log_archive_dest_2=‘location=sh’ scope=spfile;
System altered.
SQL> alter system set log_archive_format=‘arch_%T_%s_%r.log’ scope=spfile;
System altered.
-----建立 standby 日志(对于最大保护和最大性能模式必须建立 standby 日志,最大性能可以不建立,STANDBY
logfile 一般比 redolog 最少多一组日志)
SQL> set linesize 120
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
FIRST_CHANGE# FIRST_TIM
1 1 28 52428800 1 YES INACTIVE 538054
12-AUG-11
2 1 29 52428800 1 YES INACTIVE 553705
12-AUG-11
3 1 30 52428800 1 NO CURRENT 578175
29-AUG-11
SQL> alter database add standby logfile group 4
2 ‘/u01/app/oracle/oradata/bj/redo04a.log’ size 50m;
Database altered.
SQL> alter database add standby logfile group 5
2 ‘/u01/app/oracle/oradata/bj/redo05a.log’ size 50m;
Database altered.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
FIRST_CHANGE# FIRST_TIM
1 1 28 52428800 1 YES INACTIVE 538054
12-AUG-11
2 1 29 52428800 1 YES INACTIVE 553705
12-AUG-11
3 1 30 52428800 1 NO CURRENT 578175
———————————————————————————————————————————————————————
29-AUG-11
SQL> col member for a50
SQL> select group# ,member from v$logfile;
GROUP# MEMBER
1 /u01/app/oracle/oradata/ocmtest/redo01.log
2 /u01/app/oracle/oradata/ocmtest/redo02.log
3 /u01/app/oracle/oradata/ocmtest/redo03.log
4 /u01/app/oracle/oradata/bj/redo04a.log
5 /u01/app/oracle/oradata/bj/redo05a.log
SQL>
SQL> select group#,thread#,sequence#,bytes,status from v$standby_log;
GROUP# THREAD# SEQUENCE# BYTES STATUS
4 0 0 52428800 UNASSIGNED
5 0 0 52428800 UNASSIGNED
SQL> create pfile from spfile;
File created.
SQL>
------主库初始化参数 (Oracle 10g)
DB_UNIQUE_NAME=bj
LOG_ARCHIVE_CONFIG=‘DG_CONFIG=(bj,sh)’
LOG_ARCHIVE_DEST_1=‘LOCATION=/u01/disk1/arch/bj/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=bj’
LOG_ARCHIVE_DEST_2=‘SERVICE=sh LGWR ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=sh’
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_MAX_PROCESSES=3
FAL_SERVER=sh
FAL_CLIENT=bj
DB_FILE_NAME_CONVERT=’/u01/app/oracle/oradata/sh/’,’/u01/app/oracle/oradata/bj/’
LOG_FILE_NAME_CONVERT=’/u01/app/oracle/oradata/sh/’,’/u01/app/oracle/oradata/bj/’
STANDBY_FILE_MANAGEMENT=AUTO
---------修改 pfile 文件后,将实例启动到 nomount 状态,查看初始化参数是否正确
06:40:32 SYS@ bj>startup nomount pfile=$ORACLE_HOME/dbs/initbj.ora
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
———————————————————————————————————————————————————————
Variable Size 96470608 bytes
Database Buffers 184549376 bytes
Redo Buffers 2973696 bytes
06:41:36 SYS@ bj>create spfile from pfile;
File created.
Elapsed: 00:00:00.04
06:42:31 SYS@ bj>startup force mount;
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 96470608 bytes
Database Buffers 184549376 bytes
Redo Buffers 2973696 bytes
Database mounted.
06:42:47 SYS@ bj>show parameter spfile
NAME TYPE VALUE
spfile string /u01/app/oracle/product/10.2.0
/db_1/dbs/spfilebj.ora
---------在 mount 下创建备库的控制文件和将数据文件拷贝到备库
SQL> alter database create standby controlfile as ‘/home/oracle/standby.ctl’;
Database altered.
[oracle@ocmtest bj]$ cd /u01/app/oracle/oradata/bj
[oracle@ocmtest bj]$ tar czvf datafile.tar.gz *.dbf
example01.dbf
sysaux01.dbf
system01.dbf
temp01.dbf
undotbs01.dbf
users01.dbf
[oracle@ocmtest bj]$ ls
control01.ctl control03.ctl example01.dbf redo02.log redo04a.log sysaux01.dbf temp01.dbf
users01.dbf
control02.ctl datafile.tar.gz redo01.log redo03.log redo05a.log system01.dbf undotbs01.dbf
[oracle@ocmtest bj]$ scp datafile.tar.gz 192.168.8.86:/home/oracle
oracle@192.168.8.86’s password:
datafile.tar.gz
100% 110MB 6.9MB/s 00:16
[oracle@ocmtest bj]$ ls -lh
total 1.3G
-rw-r----- 1 oracle oinstall 6.8M Aug 29 14:37 control01.ctl
-rw-r----- 1 oracle oinstall 6.8M Aug 29 14:37 control02.ctl
-rw-r----- 1 oracle oinstall 6.8M Aug 29 14:37 control03.ctl
———————————————————————————————————————————————————————
-rw-r–r-- 1 oracle oinstall 110M Aug 29 14:55 datafile.tar.gz
-rw-r----- 1 oracle oinstall 101M Aug 29 14:35 example01.dbf
-rw-r----- 1 oracle oinstall 51M Aug 29 14:35 redo01.log
-rw-r----- 1 oracle oinstall 51M Aug 29 14:32 redo02.log
-rw-r----- 1 oracle oinstall 51M Aug 29 14:32 redo03.log
-rw-r----- 1 oracle oinstall 51M Aug 29 14:53 redo04a.log
-rw-r----- 1 oracle oinstall 51M Aug 29 14:53 redo05a.log
-rw-r----- 1 oracle oinstall 231M Aug 29 14:35 sysaux01.dbf
-rw-r----- 1 oracle oinstall 481M Aug 29 14:35 system01.dbf
-rw-r----- 1 oracle oinstall 21M Aug 29 14:31 temp01.dbf
-rw-r----- 1 oracle oinstall 26M Aug 29 14:35 undotbs01.dbf
-rw-r----- 1 oracle oinstall 5.1M Aug 29 14:35 users01.dbf
[oracle@ocmtest bj]$ scp /home/oracle/standby.ctl 192.168.8.86:/home/oracle
oracle@192.168.8.86’s password:
standby.ctl
100% 6896KB 6.7MB/s 00:00
[oracle@ocmtest bj]$ scp /u01/app/oracle/product/10.2.0/db_1/dbs/initbj.ora
192.168.8.86:/home/oracle
oracle@192.168.8.86’s password:
initbj.ora
100% 1644 1.6KB/s 00:00
[oracle@ocmtest bj]$
[oracle@shsrv dbs]$ orapwd file=orapwsh password=oracle entries=3
[oracle@ocmtest1 dbs]$ mkdir -p /u01/app/oracle/admin/sh/adump
[oracle@ocmtest1 dbs]$ mkdir -p /u01/app/oracle/admin/sh/bdump
[oracle@ocmtest1 dbs]$ mkdir -p /u01/app/oracle/admin/sh/udump
[oracle@ocmtest1 dbs]$ mkdir -p /u01/app/oracle/admin/sh/cdump
[oracle@ocmtest1 dbs]$ mkdir -p /u01/app/oracle/oradata/sh
[oracle@ocmtest1 dbs]$ mkdir -p /u01/disk1/arch/sh
[oracle@ocmtest1 dbs]$
------配臵备库 pfile 文件
[oracle@ocmtest1 dbs]$ more initsh.ora
sh.__db_cache_size=134217728
sh.__java_pool_size=4194304
sh.__large_pool_size=4194304
sh.__shared_pool_size=58720256
sh.__streams_pool_size=0
*.audit_file_dest=’/u01/app/oracle/admin/sh/adump’
*.background_dump_dest=’/u01/app/oracle/admin/sh/bdump’
*.compatible=‘10.2.0.1.0’
*.control_files=’/u01/app/oracle/oradata/sh/std_control.ctl’
*.core_dump_dest=’/u01/app/oracle/admin/sh/cdump’
*.db_block_size=8192
*.db_domain=’’
*.db_file_multiblock_read_count=16
*.db_name=‘sh’
*.db_recovery_file_dest=’/u01/app/oracle/flash_recovery_area’
*.db_recovery_file_dest_size=2147483648
*.dispatchers=’(PROTOCOL=TCP) (SERVICE=shXDB)’
———————————————————————————————————————————————————————
*.job_queue_processes=10
*.open_cursors=300
*.pga_aggregate_target=68157440
*.processes=150
*.remote_login_passwordfile=‘EXCLUSIVE’
*.sga_target=205520896
*.undo_management=‘AUTO’
*.undo_tablespace=‘UNDOTBS1’
*.user_dump_dest=’/u01/app/oracle/admin/sh/udump’
DB_UNIQUE_NAME=sh
LOG_ARCHIVE_CONFIG=‘DG_CONFIG=(sh,bj)’
LOG_ARCHIVE_DEST_1=‘LOCATION=/u01/disk1/arch/sh/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=sh’
LOG_ARCHIVE_DEST_2=‘SERVICE=sh LGWR ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=bj’
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_MAX_PROCESSES=3
FAL_SERVER=bj
FAL_CLIENT=sh
DB_FILE_NAME_CONVERT=’/u01/app/oracle/oradata/bj/’,’/u01/app/oracle/oradata/sh/’
LOG_FILE_NAME_CONVERT=’/u01/app/oracle/oradata/bj/’,’/u01/app/oracle/oradata/sh/’
STANDBY_FILE_MANAGEMENT=AUTO
[oracle@ocmtest1 dbs]$ cp /home/oracle/datafile.tar.gz /u01/app/oracle/oradata/sh
[oracle@ocmtest1 dbs]$ cd /u01/app/oracle/oradata/sh
[oracle@ocmtest1 sh]$ ls
datafile.tar.gz
[oracle@ocmtest1 sh]$ tar zxvf datafile.tar.gz ;释放数据文件
--------配臵网络(配臵 listener 和 tnsnames 保证两边的 sys 用户可以互访)
[oracle@ocmtest admin]$ lsnrctl status
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 29-AUG-2011 15:11:16
Copyright © 1991, 2005, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 29-AUG-2011 15:05:18
Uptime 0 days 0 hr. 5 min. 58 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
———————————————————————————————————————————————————————
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocmtest.cuug.com)(PORT=1521)))
Services Summary…
Service “bj” has 1 instance(s).
Instance “bj”, status READY, has 1 handler(s) for this service…
Service “bjXDB” has 1 instance(s).
Instance “bj”, status READY, has 1 handler(s) for this service…
Service “bj_XPT” has 1 instance(s).
Instance “bj”, status READY, has 1 handler(s) for this service…
The command completed successfully
[oracle@ocmtest admin]$
BJ =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.84)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = bj)
)
)
[oracle@ocmtest1 dbs]$ lsnrctl status
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 29-AUG-2011 15:43:47
Copyright © 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ocmtest1.cuug.com)(PORT=1521)))
STATUS of the LISTENER
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 29-AUG-2011 15:34:42
Uptime 0 days 0 hr. 9 min. 4 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listen