Standby Database的工作原理

tolywang發表於2008-06-06
1. 與 High Availability, Disaster Recovery 及 Data Duplicate 相關功能的產品概述

Oracle 的 High Availability 功能,Oracle 是從下面幾個方面來詮釋的:

(1) System faults and crashes

(2) Application and middleware failures

[@more@]

(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

(3) Oracle Parallel Fail Safe

(4) Oracle Advanced Quening

(5) Oralce Advanced Replication

(6) Oracle Standby Database

在Duplication data 方面主要有用於distributed 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 scripts, 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。

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

實現環境

主伺服器

備份伺服器

作業系統

Windows 2003 Enterprise

Windows 2003 Enterprise

Oracle版本

Oracle 9.2.0.1

Oracle 9.2.0.1

Oracle SID

pstest

pstest

ORACLE_HOME

c:oracleoradatapstest

c:oracleoradatapstest

機器名

Primary

Standby

IP地址

192.168.5.20

192.168.5.21

實現步驟

1. 在Primary Server上安裝Oracle並建立SID為pstest的Oracle資料庫;

2. 在Standby Server上安裝Oracle並建立SID為pstest的Oracle資料庫;

這一步可以用命令只建立一個名字為pstest的Oracle服務名即可,

WINNT> oradim -NEW -SID pstest -STARTMODE manual

如果建立庫的話,檔案需要被Primary Server上的資料庫檔案覆蓋掉;

3. 將Primary Server上的所有資料檔案、redo檔案和password檔案都copy到Standby Server機器的相應位置;

C:oracleoradatapstest 目錄下檔案

CWMLITE01.DBF

DRSYS01.DBF

EXAMPLE01.DBF

INDX01.DBF

ODM01.DBF

SYSTEM01.DBF

TEMP01.DBF

TOOLS01.DBF

UNDOTBS01.DBF

USERS01.DBF

XDB01.DBF

REDO01.LOG

REDO02.LOG

REDO03.LOG

D:oracleora92database 目錄下檔案

PWDpstest.ora

4. 修改Primary Server 的Oraclce初始化引數;

檔案位置:c:oracleadminpstestpfile

檔名字不確定,類似這樣:init.ora.114200520819,我們把名字改為init.ora,這樣好記一點;

FAL_SERVER=standby 注:Primary Server連線Standby Server的資料庫連線名

FAL_CLIENT=primary 注:Standby Server連線Primary Server的資料庫連線名

LOG_ARCHIVE_DEST_1= 'LOCATION= c: arch mandatory reopen=15’

LOG_ARCHIVE_DEST_STATE_1=ENABLE

LOG_ARCHIVE_DEST_2= 'SERVICE=standby' 注:到Standby Database的資料庫連線名

LOG_ARCHIVE_DEST_STATE_2=ENABLE

LOG_ARCHIVE_FORMAT='ARC%t_%s.arc'

LOG_ARCHIVE_MIN_SUCCEED_DEST=2

log_archive_start=true

REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE

STANDBY_FILE_MANAGEMENT=AUTO

具體引數的說明請參考oracle線上文件。

5. 設定primary database為archivelog模式

SQL>shutdown immediate;

SQL>startup mount pfile=’ c:oracleadminpstestpfileinit.ora’;

SQL>alter database archivelog;

SQL>alter database open:

6. 在Primary Database上建立Standby Database的控制檔案

SQL>shutdown immediate;

SQL>startup mount;

SQL>alter database create standby controlfile as 'c:oracleoradatapstestcontrol01.ctl’

SQL>alter database open;

然後將該controlfile複製到Standby Server的對應位置,原來的控制檔案已經不需要了;

7. 修改Standby Database的初始化引數

複製Primary Database上的初始化引數檔案到Standby Database上對應位置,然後修改為以下內容:

CONTROL_FILES=' c:oracleoradatapstestcontrol01.ctl’

FAL_SERVER=primary 注:Standby Server連線Primary Server的資料庫連線名

FAL_CLIENT=standby 注:Primary Server連線Standby Server的資料庫連線名

LOG_ARCHIVE_DEST_1= 'LOCATION= c: arch mandatory reopen=15’

LOG_ARCHIVE_DEST_STATE_1=ENABLE

LOG_ARCHIVE_DEST_2= 'SERVICE=primary'

LOG_ARCHIVE_DEST_STATE_2=ENABLE

LOG_ARCHIVE_FORMAT='ARC%t_%s.arc'

LOG_ARCHIVE_MIN_SUCCEED_DEST=2

log_archive_start=true

REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE

STANDBY_ARCHIVE_DEST=’ c: arch’

STANDBY_FILE_MANAGEMENT=AUTO

具體引數的說明請參考oracle線上文件。

8. 設定Primary Database和Standby Database的tnsnames.ora

檔案位於:c:oracleora92networkadmin

Primary database

standby =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.21)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = pstest)

)

)

primary =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.20)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = pstest)

)

)

Standby Database

standby =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.21)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = pstest)

)

)

primary =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.20)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = pstest)

)

)

9. 啟動standby database

SQL>startup nomount pfile=’ c:oracleadminpstestpfileinit.ora’

SQL>alter database mount standby database;

10. 啟動primary database

SQL>startup pfile=’ c:oracleadminpstestpfileinit.ora’

11. 啟動standby database到recover manage模式

SQL>alter database recover managed standby database disconnect from session;

測試一下 在Primary Database上:

SQL> create user test identified by 密碼;

SQL> grant connect ,resource to test ;

SQL> conn test/密碼@primary;

SQL> create table test(name varchar2(20));

SQL> insert into test values('hi,data guard');

SQL> commit;

SQL> conn / as sysdba

SQL> alter system switch logfile;

察看從庫日誌

C:oracleadminporamlsbdumppormals_alert.ora

看當前歸檔日誌是否已經正常完成恢復

已只讀方式開啟從庫察看是否insert into test values('hi,data guard');已經生效。

在Standby Database上

SQL> conn / as sysdba;

SQL> alter database recover managed standby database cancel;

SQL> alter database open read only;

SQL> conn test/密碼

SQL> select * from test;

察看是否insert into test values('hi,data guard');已經生效。

如果生效說明已經完全正常工作,data guard到此完全配置完畢。

再次置從庫在恢復模式

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE disconnect from session;

維護standby資料庫

當primary 資料庫失敗時,將standby 資料庫啟用:取消(cancel)恢復執行以下操作:
sql> connect internal/password;

sql> startup nomount pfile=’c:oracleadminpstestpfileinit.ora’;

sql> alter database mount standby database;

sql> alter database activate standby database;

shutdown standby 資料庫;

sql> shutdown immediate

重起Standby Database;

sql > startup

問題:

1. 關於tnsnames.ora檔案

Primary Database和Standby Database上的tnsnames.ora檔案內容可以是相同的,其目的是為了建立兩個Oracle連線名,一個連自己,一個連對方;這兩個連線名對應各自伺服器上的初始化引數檔案中的一下內容中的primary和standby:

FAL_SERVER=primary 注:Standby Server連線Primary Server的資料庫連線名

FAL_CLIENT=standby 注:Primary Server連線Standby Server的資料庫連線名

2. 關於初始化檔案中的LOG_ARCHIVE_MIN_SUCCEED_DEST引數

在上面的配置檔案中,此引數的值為2,如果設定為1的話,將不能正常同步歸檔日誌;

3. 關於初始化檔案中的LOG_ARCHIVE_DEST_2引數

LOG_ARCHIVE_DEST_2= 'SERVICE=standby' 注:到Standby Database的資料庫連線名

在Primary Server和Standby Server上的初始化檔案中的這個引數分別只的是指向對方的資料庫連線名。

4. 關於啟動關閉順序

啟動的時候,先從庫的listener,然後啟動從庫,然後啟動主庫的listener 接著是主庫 關閉的時候正好相反,先關閉主庫,然後是從庫。

5. 一些常用的view

V$ARCHIVE_DEST_STATUS 這裡面會紀錄到standby 的狀態和恢復到那個日誌

V$ARCHIVE_GAP 這裡面會紀錄當前從庫mrp程式恢復需要的膽識還沒有傳到從庫得日誌

V$ARCHIVED_LOG 這裡面會紀錄所有已經歸檔到從庫的日誌,並且記錄該日誌是否已經恢復

V$DATABASE 會紀錄系統的保護狀態和是否處於force logging狀態

V$MANAGED_STANDBY (Physical Standby Databases Only) 會紀錄當前從庫的一些程式情況和程式的process id,如rfs,mrp等

V$STANDBY_LOG (Physical Standby Databases Only) 會紀錄當前從庫的standby redo log的一些情況。

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

相關文章