技术专题总结:standbyDatabase(二)

发表于:2007-05-25来源:作者:点击数: 标签:专题总结技术
二、Standby database 的建立 Oracle Standby Database 的建立过程并不复杂,但建立过程的相关设置取决于建立standby database 的目的。例如,如果建立standby database 是为了 disaster protection,standby database 就不能建立在与 primary database 相同

  二、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在managed recovery mode下面的管理,请看另外一部份。
  
  三、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。

原文转自:http://www.ltesting.net