一、Standby database 的建立
Oracle Standby Database
的建立过程并不复杂,但建立过程的相关设置取决于建立standby database 的目的。例如,如果建立standby database 是为了 disaster protection,standby database 就不能建立在与 primary database 相同服务器上面。如果是为了 protection against data corruption,在standby database 接收到 primary database 送来的 archived log files 时,apply 需要晚上一段,比如三个小时,或是六个小时。这样当 primary database出现错误的时候,standby database 不会与primary database 同步。
在这篇文章里面,我无法面面俱到的分析各种性能,仅做一个具体实例分析。
我们承诺客户的条件:
24x7 uptime of SIS database
in case of failure on primary:
1.1 1/2 hour to fail over to standby database
1.2 no more than 5 mins data loss
1.3 2 hours scheduled downtime to revert back to primary/standby configuration
我们为了完成以上各项,必须完成的工作:
1. 在remote site 建立 standby database。我们有半小时的时间 activing standby database,我个人喜欢再做一次 cold backup。
2. 以我们的环境,4组 log groups,每组 2 个members,on-line redo log file size 是 10M,运行高峰期,每分钟可以多达 10 个archived files 产生。因此非高峰的时候,我们用cron job 做强制 log switch.
3. 因为我们的standby database server 不是专用的,所以在非高峰期时我们需要重新建立 primary/standby database.
在这里,我又要说一些多余的话了。DBA 在申请down time 的时候,应该给自己预留足够的时间,到底多少合适,自己要掌握好。(如果留的时间太少,老板和客户可能会认为DBA的工作很容易,或不重要,如果一旦出了差错,自己的压力方面也够大。所以一般选择在用户可接受的最多的时间,我一般要求需要时间的2-4倍) 。
1. 根据上面的条件,我们做的环境设置
(1) 首先我们必须确认 primary database 处于archived mode:
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /oradba/sisi/arch
Oldest online log sequence 4783
Next log sequence to archive 4786
Current log sequence 4786
(2) 我们必须满足的条件是 high availablity,所以我们采用的是双机。
采用双机形式,有很多的好处,除了再安装与primary node 相同的OS系统及oracle 系统外,其他各种设置都可以与primary node 完全相同,省掉很多修改参数的麻烦之处。
(3) 我们的oracle 版本是8.1.7EE,standby node 通过net8 接收 primary node 的 archived log files。我们专门在 standby node 开通了 port 1512 做为 standby database 的listener。(Oracle 的缺省是 port 1521) 。
2. standby database的建立过程:
standby database一般是用primary database的cold backup建立的。特殊情况下,可以用RMAN或export dmp file来做。这里我们是讲的正常情况。
(1) 在 standby node上面建立与primary node上面相同的datafile directory。我们用的是/oradba/sisi/
(2) 修改 primary database的 initialize parameter file: (我们的例子,请不要问我为什么,很多是 application要求的,不是我制定的)
primary database:
db_name = sisi
instance_name = sisi
service_names = sisi
control_files = (/oradba/sisi/ctrl/stctl1si.ctl, /oradba/sisi/ctrl/stctl2si.ctl)
db_files = 500
compatible = 8.1.7.0.0
rollback_segments = (rbs1, rbs2, rbs3, rbs4, rbs5, rbs6, rbs7, rbs8, rbs9, rbs10, rbs11, rbs12, rbs1
3, rbs14, rbs15)
db_file_multiblock_read_count = 32
optimizer_mode = rule #application required
db_block_size = 8192
db_block_buffers = 83200
shared_pool_size = 52428800
sort_area_size = 1048576
sort_area_retained_size = 64000
log_checkpoint_interval = 10000
sessions = 252
transactions = 280
transactions_per_rollback_segment = 4
processes = 800
open_cursors = 1000
dml_locks = 500
log_buffer = 20971520
log_checkpoint_timeout = 10000
cursor_space_for_time = true
utl_file_dir=/tmp
timed_statistics = false # if you want timed statistics
max_dump_file_size = 2097152 # limit trace file size to 5 Meg each
core_dump_dest = /oradba/sisi/cdump
background_dump_dest= /oradba/sisi/bdump
user_dump_dest = /oradba/sisi/udump
remote_login_passwordfile = none
parallel_max_servers = 0
#The following parameters are the HA parameters needed for Standby Database on primary side
LOG_ARCHIVE_START=TRUE
LOG_ARCHIVE_FORMAT = "sisi%S.arc"
LOG_ARCHIVE_DEST_1='LOCATION=/oradba/sisi/arch MANDATORY REOPEN=60'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
STANDBY_ARCHIVE_DEST='/oradba/sisi/arch'
LOG_ARCHIVE_DEST_2='SERVICE=standby_sisi MANDATORY REOPEN=60'
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_MIN_SUCCEED_DEST=2
复制到Standby database side相对的directory下面:
db_name = sisi
instance_name = sisi
service_names = sisi
control_files = (/oradba/sisi/ctrl/stctl1si.ctl, /oradba/sisi/ctrl/stctl2si.ctl)
db_files = 500
compatible = 8.1.7.0.0
rollback_segments = (rbs1, rbs2, rbs3, rbs4, rbs5, rbs6, rbs7, rbs8, rbs9, rbs10, rbs11, rbs12, rbs1
3, rbs14, rbs15)
db_file_multiblock_read_count = 32
optimizer_mode = rule
db_block_size = 8192
db_block_buffers = 83200
shared_pool_size = 52428800
sort_area_size = 1048576 #100M Change to 1M after import.
sort_area_retained_size = 64000
log_checkpoint_interval = 10000
sessions = 252
transactions = 280
transactions_per_rollback_segment = 4
processes = 800
open_cursors = 1000
dml_locks = 500
log_buffer = 20971520
log_checkpoint_timeout = 10000
cursor_space_for_time = true
utl_file_dir=/tmp
timed_statistics = false # if you want timed statistics
max_dump_file_size = 2097152 # limit trace file size to 5 Meg each
core_dump_dest = /oradba/sisi/cdump
background_dump_dest= /oradba/sisi/bdump
user_dump_dest = /oradba/sisi/udump
remote_login_passwordfile = none
parallel_max_servers = 0
#The following parameter are the HA parameters needed for Standby Database on standby side
LOG_ARCHIVE_START=FALSE
LOG_ARCHIVE_FORMAT = "sisi%S.arc"
LOG_ARCHIVE_DEST_1='LOCATION=/oradba/sisi/arch MANDATORY REOPEN=60'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
STANDBY_ARCHIVE_DEST='/oradba/sisi/arch'
LOG_ARCHIVE_DEST_2='SERVICE=standby_sisi MANDATORY REOPEN=60'
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_MIN_SUCCEED_DEST=2
(3) shutdown primary database normal/immediate,做一个冷备份,再次 startup primary database时,用 pfile标示到上面改过的 parameter file. 用ftp或其他OS工具,把冷备份的 data
files/online redo log files到在standby node已经建好的对应 directory下面。
(4) 建立 standby database control file.
Alter database create standby controlfile as ‘/oradba/sisi/temp/stctl1si.ctl’;
用 rcp或 ftp到standby node对应的directory,用 cp command复制另一个。
(5) 在primary side编辑 tnsnames.ora文件,增加一条(可以用netasst做):
STANDBY_SISI =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.19.26.10)(PORT = 1512))
)
(CONNECT_DATA =
(SID = sisi)
)
)
(6) 在 standby node编辑 listener.ora文件,增加一条(可以用netasst做):
ST_LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = prtltest)(PORT = 1512))
)
SID_LIST_ST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = sisi)
(ORACLE_HOME = /oracle/8.1.7)
(SID_NAME = sisi)
)
)
(7) start standby listener:
lsnrctl start st_listener;
(8) start standby database
$ export ORACLE_SID=sisi
$ sqlplus
SQL*Plus: Release 8.1.7.0.0 - Production on Mon Dec 31 00:54:28 2001
(c) Copyright 2000 Oracle Corporation. All rights reserved.
Enter user-name: internal
Connected to:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
JServer Release 8.1.7.0.0 - Production
SQL>startup nomount pfile=’/oradba/sisi/pfile/stinitsi.ora’;
SQL>alter database mount standby database;
(9) apply log files.
这里有两种情况,核对已经mount起来的standby database与primary database之间有archived logs上的是否有差距,用下面命令:
SQL> select sequence# from v$log_history;
如果有差距,要手动把差的archived log files copy到standby node,并手动恢复:
SQL> recovery automatic standby database
如果没有差距,就可以直接进入managed recovery mode:
SQL> recovery managed standby database
二、Standby database的维护与备份
在前面的部份,我们提到过,standby database所处于的状态。在oracle 8i之前的各版本(指7.3.x – 8.0.x) ,standby database只能处于manual recovery mode以及被actived 成为 primary database,并且 archived log files的传送需要靠手动或OS的相关工具完成。
从 oracle8.1.x开始(EE版),oracle增加了新的功能,在 standby database所处的状态上面,增加了managed recoveredd mode 和 read only mode,archived log files也可以通过 oracle network自动传到standby side。
本篇是基于 oracle 8.1.7EE版本在 unix环境下的相关问题进行的讨论。
1. standby database的维护
在一般的情况下面,standby database一直是处于 managed recovered mode的情形下。
(1) 如果需要database 处于managed recovered mode 的情况下,必须满足的条件是:
在 primary database 与 standby database 在建立之后已经手动 recoverd gap log files。因此,如果不是用以前的冷备份及备份的 archived log files 建立的 standby database,两个database 之间没有 log 差距的话,即可直接进入 managed mode。
当 primary database 与 standby database 存在 archived log files 差距的时候,需要手动去做 recovery,有关命令是:
SQL> recover standby database;
Or
SQL> recover automatic standby database;
如果这两个 command 得到 ora-00308, 27037, 01547, 01194, 01110, 01112错误的时候,standby database可以直接进入 managed mode:
SQL> recover managed standby database;
(2) 当 standby database是处于 managed recovery mode时,recover managed standby database; command line的 window session要永远 open, standby database才能一直处于等待状态,当下一个 archived log file送达 standby node指定位置的时候,会及时被recovery到 standby database中。
如果,受到条件限制,无法永远 open一个 managed mode session window时,可以采用下面命令。
SQL> recover managed standby database timeout 15;
即为 managed mode窗口 open并等待 15分钟,如果 15分钟之内未收到新的 archived log files,这个session会自己结束。但结束之后,新到的 archived log files将不会被自动 recover到 standby database。这种情形下,可以通过设立 crontab job,在每隔一固定的时间段,运行上述命令,保证 primary database和standby database中的数据差距,最大为 crontab job的执行频率。
(3) 在维护方面,我们这里没有讨论到 primary database数据结构及 data files size等改变对 standby database的影响。这些情况,在一个成熟的 database环境中不是很常见问题,也不是很难解决的。
2. 在使用了 standby database后,database 的备份计划
在系统尚未使用 standby database之前,大家都知道正常运行在一个node上面的databases的备份计划非常的重要。从DBA的角度上来讲,并不希望因为系统增加了 standby database,而将全部的全部的备份计划弃置不用。
以我上面举例的系统来说,在设立 standby database之前,我们每个星期,有二个小时的 downtime做 cold back,删除 hard disk上面的所有 archived log files; 每天晚上,有一次 full export和全部 data files的 hotback。
在建立 standby database之后,我们失去了每周二小时的 downtime时间,即意味着,我们没有办法每周对 primary database进行 cold backup了,但我们仍然保留了对 primary database每晚上的 full export和全部 data files的 hotback。所有的 archived log files仍然一周清理一次,并转移到 backup tape上面,保留一年。每一年的 downtime我们仍在与客户的协商之中。
在这种情形下,对 standby database进行 backup,就变的相对需要考虑,以弥补每周以来,primary database无法进行 cold backup的缺陷。
Standby database可以采用两种情形进行 backup。一种是处于 shutdown状态 (必须 shutdown normal/immediate) 。另一种是 standby database处于 read-only状态。shutdown状态,相当于 cold backup,缺点是,standby database shutdown以后,database不能处于 managed recovery状态,有可能再 mount的时候,需要手动 recover primary/standby database的间距 archived log files。而 standby database处于read-only状态时仍然可以使 database处于 managed recovery mode。
但这种 backup的恢复可能会麻烦一些。
考虑各种情况之后,我们的系统对 standby database每天晚上采用的是 shutdown immediate之后的 cold backup。
三、Opening/Activating a standby database
在通常的情形下,standby database是处于 recovery状态的。但是在 opened read-only 或者 activeated 之后可以 access standby database 中的 data。
1. opening standby database read-only:
当 standby database 被 opened read-only 时,数据只能处于读取状态。
因为 standby database被opened 成为 read-only mode之后,还可以恢复成 recovery/managed recovery mode,所以 opening standby database read-only,可以用来试验 standby database是否建立成功及 archived log files是否成功 applied到database 中。
在更多的情况下,read-only mode 是用于系统 run report。很多拥有很多用户的系统,需要 on-line data access,同时需要 run report,为了避免系统 overheat,单机状态的时候,大的 reports 是在非尖峰期的晚上和周末运行的。如果系统有 standby database,可以 open standby database在 read-only情况下 run reports,不影响 primary database的性能。
需要注意的是,在 read-only状态下面时,primary database的 archived log files仍然持续送达 standby database,但是不会 apply到 standby database中去。所以,在 run完 reports之后,要将 standby database 回归至 managed/manual recovery mode。
有关命令行如下:
如果 standby database处于shutdown状态:
SQL> startup nomount pfile=/path/stinit.ora
SQL> alter database mount standby database;
SQL> alter database open read only;
如果 standby database 处于 manual/managed recovery mode:
SQL> recover cancel/recover managed standby database cancel
(需要另开启一个 session来做)
SQL> alter database open read only;
将 read-only mode 的 standby database 回归 manual/managed recovery mode:
SQL> recover standby database;/recover managed standby database time out 15;
检查 database 所处状态的命令:
SQL> select status from v$instance;
STATUS
-------
MOUNTED
2. activating a standby database
当 primary database 由于某种原因不能正常工作,而修复时间超过用户可以接受的范围时,需要击活 standby database,使之成为 primary database 运行。这个行为是单向的。被击活的 standby database 是无法再回到 standby 状态下的。下一个部份,我们讲讨论到 standby database 的重建问题。
完成击活 standby database 使之成为 primary database 的过程是需要 downtime 的。
过程如下:
(1) 首先要 shutdown primary database. 这种情况出现在 primary database 出了问题,不能正常工作,但 database 仍然处于 open 的状态下,但是无法做 online recovery,或者 online recovery 所需要的条件,客户不能接受(可能部份 data 无法访问,所需时间视数据库损坏程度而不同)。
这时,如果可能要尽量 archive current online log file:
SQL> alter system archive log current;
(2) 对应在 standby database node,activating 之前,要 apply 最后一个 archived log file。
如果 primary database 的错误导致 database down,系统丢失的 data 将会是 online log file 中的 data。同样的,在 activating 之前,要 apply 最后一个 archived log file。
(3) 在 standby database 处于 mount 的状态下 activate standby database:
SQL> alter database activate standby database;
(4) shutdown the standby database normal/immediate,之后做一次 cold backup。
在这里需要解释一下,当 standby database 被activated 之后成为 primary database,这个过程将自动 resetlogs。因此,在 startup 之前要做一次 cold backup,因为以往的 backup 最多只能 recover 到 standby database 被activated 这一点。
另外,standby database 的 parameter file 中log_archive_start 是 false,系统不能自动 archive log file,在startup 之前要改为 ture。
这样即可以保证在 重建 primary database 之前的任何状况发生,database 可以被 recovered to the point of failure。
(5) open the standby database.
SQL> startup pfile=/path/stinit.ora
注意:如果用户是通过client/server mode 或其他方式与 primary database 相连的话,在 activate standby database 的同时,需要修改 client side 的 tnsnames.ora 文件中的 database hose name 或者IP 地址。
四、Primary and standby database的重建
当原 standby database 因为 primary database的 failure而成为 primary database 之后,一般在仅接下来的第一个非高峰工作时段,就要进行 standby database的重建。
怎样对 Standby database进行重建,首先要考虑系统的设置,以及有多少的时间进行重建。
实例一:如果 primary/standby 两个nodes都是为该数据库专用的,且设置相同的话,可以保留 standby node上面的数据库做为 primary database,在原来的 primary上面建立一个standby database就可以了。系统不需要 downtime。备份文件可以采用上一部份中,standby database变为 primary database open 之前的冷备份,再手工 apply 从数据库 open 到目前的所有 archived logs。
注意,这种情形下,要重新设置当前 primary database node的 tnsnames.ora文件,以及当前 standby node上面的 listener.ora文件。(详细参见上面部份的 standby database的建立)
这种设置在 standby database系统中算是最理想的设置了,甚至在某些情形下面,可以 activing standby database,直接对 primary database进行 recovery,再在standby node上重建 standby database。具体的设置和操作,是要根据项目的要求设定的。
实例二:这种情况下,不管怎样,原来的primary node 要变回 primary database的服务器, standby node上的database要回归 standby database 的状态。在这种情形下,如果你能得到足够的系统 down time,最容易的办法,就是将 standby node上面的database shutown,拷贝所有的 all database file (包括 control files,但不包括 parameter file) 到 primary node 原来的目录下面,覆盖住原来的文件,清除掉原来 database的 alter.log/trace files/archived log files等等,直接 open database,同时把 application side的所有 tnsnames.ora文件 host name/IP 改回成 primary node 即可。重建 primary database的时间只比系统拷贝文件的时间多出 10分钟而已。
在 standby node上面:在 database shutdown之后,拷贝文件去 primary node的过程中,要对整个 database进行一次冷备份。之后用原来备份的 standby database的 parameter file取代当前的 parameter file,再从已经 open的 primary database上面建立一个 standby database的 control file拷贝到 standby node上面取代当前的 control files。
如果此时,primary database 尚未生成新的 archived log files, standby database 可以直接进入 managed recovery mode。
这个实例是我本人比较喜欢采用的一种方法。现给出具体的操作步骤如下:
重建 primary database的过程:
1) 在 standby node上面建一个 standby database 的 control file:
Alter database create standby control file ‘/oradba/DBA/stcrt1si.ctl’;
2) Shutdown database normal/immediate;
3) 对 database进行一个冷备份
4) 清除所有 archived log files (原来的 primary node上面的)
5) 拷贝除了 parameter file 之外的所有 data files/control files/online redo log files 到 primary node 原来 directory下面,覆盖掉原来的文件。
6) 可以用原来已经存在的 instance 直接 open database
重建 standby database的过程:
1) 拷贝刚刚建好的 control file (见重建 primary database过程) standby database parameter file 指定的 directory 下面
2) 清除 standby node上面全部的 archived log files.
3) 核对一下 parameter file是否与原来的 standby database parameter file相同 (应该是相同的) 之后,就可以直接 Startup standby database:
Startup nomount pfile=’xxxxxxxxxxxxxxxxxxx’;
Alter database mount standby database;
4) Recover managed standby database timeout 15;
(因为是在非工作繁忙期,所以,primary上面不会有很多 transactions,所以没有产生新的 archived log file之前,可以直接进入 managed recover mode。如果已经产生了 archived log files,要先手工 recover。
实例三:在实例二的情况下,如果在 primary node 上面重建 primary database 的时间,用户不允许有足够多的系统down time,可以采用的方法就是,在 primary node 上面再建目前运行的 database 的standby database,建立好之后,可以在最短时间内,进行一个转换。
在这种情况下,需要主意的问题是,在原来的 primary node 上面的 parameter file 要修改成为 standby mode 的 parameter,同时 network file 也需要做相应的更改。 (standby database 改来改去的,最好每个版本的文件,如果 parameter file, tnsnames.ora, listener.ora 等文件,专门收集到一个地方,会受益非浅的。)
在这个实例下运行,在 activated 了在 primary node 上面的 standby database,shutdown 之后,还是要做一次 cold backup 的。因此需要的 system downtime,几乎就是一次 cold backup 的时间。怎样重建standby database 在原来的 standby node上面,请参照前面如何建立 standby database 部份所讲的内容。