比較專業的standby論述(zt)

tolywang發表於2008-07-12

前言

當chao_ping提議我開一個STANDBY DATABASE技術專題討論的時候,我本來是想專門就STANDBY DATABASE的技術方面進行討論的。看罷三十餘篇的跟貼,實在感到有必要在深入技術問題之前,先說一些題外的話,雖然這些是與技術無關的話題,但對於從業IT界的打工者來說,卻是一個首先應該考慮的問題。

我們是做技術的人員,意思就是說,在企業的管理上,我們最多能做的,我們所說的,對管理者來說,只能是參考的意見,決策並不在於我們。很多IT的技術員,特別是很多初出茅廬的年輕朋友,都覺得,技術人員是一個企業中,最重要的。如果我的技術好,天下就是我的了。這裡面有很多的誤區。打個比方來說,技術人員對公司將用什麼伺服器,用什麼database server做後臺,有多少控制的能力呢?現在有很多公司把oracle資料平臺,定在IBM的AIX UNIX 伺服器,這是一個有道理的選擇嗎?在眾多UNIX 平臺上面,眾所周知是,AIX並不是Oracle首選推薦的作業系統,Oracle在AIX平臺上的許多bugs,這兩個公司相互推諉,使用者根本不能及時得到patch解決存在的問題,但是公司的決策如此,做技術的人員能決定多少,公司管理階層也許有他們的道理,譬如說,公司層決定所有伺服器象某一個公司購買,可以得到更大的折扣,減少技術上面打交到的支援廠商,等等,我們只能接受公司的選擇。在這一點上,我們與公司其他的職員沒有什麼兩樣的,如果抱著“惟我獨尊”的思想,首先在人際上就得不到贊同。

提到了人際關係,許多人會講,中國的人際關係很複雜,國外也許好多了。實際上呢,全世界那裡都是一樣,在中國處理不好,出了國也一樣處理不好。我們都有在看論壇的帖子,有人貼出來,也有人反彈,諸如低手不宜,或諷刺別人的程式不好等等,我不想用古人曰,三人行,必有我師之類來論證一番,從最低之處感念,你有問題,有人願意幫助你,無論幫上了或沒幫上你,都應心存感激之心,不是嗎。

迴歸到STANDBY DATABASE的討論上,許多帖子提到是否應該選用STANDBY DATABASE的問題。其實,這個問題,也並不僅僅是一個技術上面的問題。這就是我上面說了一堆題外話的原因。

當某一個DATEBASE需要特別的功能的時候,譬如HIGH AVAILABLE,DISASTER RECOVERY,SCALABILITY等等,做為技術人員,我們首先要做的是,看看市面相關的產品中,那樣能提供我們所要的功能,各類產品,各有千秋。在我們所需要的功能,那個最能滿足要求,不要第一個念頭就問別人,沒有人比你自己更瞭解你需要什麼。做了研究之後,不確定的話,可以請向資深的人諮詢一下,不過基本觀點就是,別人的提議只是你的參考,我還要說,因為沒有人比你自己更瞭解你需要什麼。

技術人員確實要從技術上了解那個產品最適合技術要求,但這並不能保證最後選用的產品是最適合技術要求的產品,最後的選擇,與很多方面的條件有關。舉個例子來說,我有一個DATABASE需要HIGH AVAILABLE, SCALABILITY,這樣子看下來OPS是最適合的,可是接下來的問題是,OPS需要額外的LICENSING FEE,我們目前有的硬體不能支援OPS,需要訂購新的,訂購新裝置的到達之前,DATABASE就必須進入生產模式。再複雜一點呢,我們技術部門的老闆要用OPS,可是專案管理部門的老闆要用STANDBY DATABASE,因為現有硬體支援,又不需要購買額外軟體,他們兩個一個管技術,一個管錢,兩個人都懂一些Oracle技術,又都不是專家。憑良心講OPS和STANDBY都能應付目前的需求,長遠來講OPS好一些,畢竟用的是client/server式的前臺軟體,使用者以後也許有增加的趨勢。不過這些內容也超過了技術人員的職責範圍,我只管按照最後的決定做就是了。因為我沒有最後選擇和決定的權利。

最後我希望能談一下IT從業人員的職業道德問題。做為某一領域的專家,也許很多時候會被請教與專業相關的問題。有專案會請你推薦執行平臺或後臺選用那個公司的DATABASE支援。雖然很多新技術很具吸引力,但IT的技術人員不能因為自己想學,想用某一產品,而推薦並不適合該專案的產品。

閒話已畢,話如正題。感謝各位有耐心看完前言。

一、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 方面主要有用於distribited 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。

在下面的幾部份,可以討論到部份細節。

 

二、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

 

http://blog.sina.com.cn/u/1281575831  

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-399582/,如需轉載,請註明出處,否則將追究法律責任。

相關文章