版本:V20060328.01.01 http://wanow.blog.hexun.com/4672755_d.html
Standby Database的工作原理
1. Oracle 與 High Availability, Disaster Recovery 及 Data Duplicate 相關(guān)功能的產(chǎn)品概述
Oracle 的 High Availability 功能,Oracle 是從下面幾個(gè)方面來(lái)詮釋的:
(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 的一個(gè)方面了。
總的來(lái)說(shuō),除了以Oracle database 本身參數進(jìn)行性能調解外,Oracle 提供支持high availability 相關(guān)產(chǎn)品主要有下面幾種:
(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 方面主要有用于distributed data 功能的Advanced Replication 和我們討論過(guò) standby database
從參與討論的帖子來(lái)看,相關(guān)的問(wèn)題是集中在OPS,standby database 和 Advanced Replication 的選擇,因此我就先將這三種產(chǎn)品做一下比較。
OPS (Oracle Parallel Sever)
OPS 最原始的設計初衷就是system/application high availability。與其他產(chǎn)品相比較:
OPS 是多個(gè)單CUP機或SMP(Symmetric Multi-Processing system) 的cluster (MPP Massively Parallel Processing) 。cluster 里面不同的 node 使用一個(gè)(一般是一個(gè))或多個(gè)oracle instances 與一個(gè)database 連接
主要的技術(shù)特點(diǎn):
(1) database 所有的data files 是建立在 raw devices 上面的,因此在技術(shù)方面對OS 的設置有很高的依賴(lài)性,很多方面取決于OS的對設置是否支持。
(2) 在database 方面,每個(gè)node都有自己?jiǎn)为毜?on-line redo log file groups,因此在做backup 和recovery 的時(shí)候,需要特殊的處理。
(3) OPS 的data files 方面并沒(méi)有redundance,因此 media failure 方面,要依靠RAID (redundant array of inexpensive disk) subsystem.
Oracle 從8i 開(kāi)始在OPS的基礎上,逐步在不同的OS平臺上,增加了Fail Safe/Failover 的功能,這里不盡詳細描述。
Advanced Replication
Replication 的設計初是分散異地的application access database locally。這種技術(shù)可以將一個(gè)database 中的Tables,Indexes,Views,Packages and Package Bodies,Procedures and Functions,Triggers,Sequences,Synonyms復制到另一database中。如果是全部database 的復制,也可用于high availability。
一個(gè)范例,yahoo在美國的東岸和西岸,各有一個(gè)鏡像database,是采用的 replication 的技術(shù)。東西兩岸的用戶(hù)是連到最近的database,從而提高訪(fǎng)問(wèn)的速度。如果一個(gè)database出了問(wèn)題,用戶(hù)自動(dòng)轉入與另一個(gè)相連,實(shí)現網(wǎng)站的high availability。這種high availability 對用戶(hù)來(lái)說(shuō),是透明的。
其他的范例,在公司中的應用,例如,HR database中雇員資料,在accounting database 中需要除去薪資等的其他資料,可以在HR中建立一個(gè)view,以replication 技術(shù)復制到 accounting database 中。
因為大多 replicas 都是在異地,從而在異地建立了redundance data。Replication 是對于database 來(lái)說(shuō)的 high availability。
2. standby database 的工作原理
從設計原理上來(lái)講,standby database 是為 primary database 建立的備份,因此具有 redundance data,也是相對于 database 來(lái)說(shuō)的 high availability;
standby database 為 primary database 做的備份,是通過(guò) primary database 不斷產(chǎn)生出的archived log files 來(lái)實(shí)現的。primary database 處于 archive mode 的狀態(tài),持續送出 archived log files 給 standby database,而 standby database 則處于 recovery mode,持續apply primary database 的 archived log files.
為了完成上述過(guò)程,必須具備以下的條件:
(1) 如果primary database 和 standby database 是運行在不同的服務(wù)器上面,那么這兩臺服務(wù)器必須有相同version 和 release 的操作系統;必須有相同 version, release 和 patch 的 oracle RDBMS 系統。
(2) Oracle 是允許 primary 和 standby database 在同一個(gè)服務(wù)器上面運行的。如果是這種情形,建議這兩個(gè)databases 要分布在不同的physical disk drives 上面。并且不是所有的操作系統都支持mount 兩個(gè)instances 連接兩個(gè)同名的databases。
(3) Primary database 必需處于archive log mode。
(4) Oracle 從 version 7.3才開(kāi)始支持 standby database。7.3.x – 8.0.x 需要手工copy 所有的archived log files 從 primary server 到 standby server,并且,需要手工 recovery archived log files (當然這些可以通過(guò) OS shell scripts, sql scripts 等等方法來(lái)實(shí)現) ;并且standby database 只能夠處于close/nomount/mount 的狀態(tài)。
(5) Oracle 從version 8i (8.1.5以后) 開(kāi)始支持 primary database 可以將 arhived log files 自動(dòng)送到最多一個(gè)remote site (一般即standby database server) ,本地則可多達七個(gè)地點(diǎn)。并且,standby database 在mount 的狀態(tài)下,增加了 managed recovery mode,在這種狀態(tài)下,standby database 可以自動(dòng)立即apply 由 primary node 送過(guò)來(lái)的 archived log files。
(6) Oracle 從version 8i (8.1.5以后) 開(kāi)始支持standby database的mount recovery mode和database read only mode的轉換。這樣方便了系統可以利用standby database產(chǎn)生reports,而不影響用戶(hù)正常使用 primary database。
(7) 一旦 standby database被activated,即成為primary database,無(wú)法再回歸 standby database mode。因此primary database出了問(wèn)題,standby database被actived成為primary database之后,如果需要在原來(lái)的 primary/standby node上面重建 primary/standby database,兩個(gè)database都需要重建。
(8) 關(guān)于啟動(dòng)standby database時(shí)與 primary database之間的數據丟失問(wèn)題。如果primary database在出問(wèn)題之前如果無(wú)法完成 log file switch的話(huà),兩個(gè)database之間會(huì )相差 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的時(shí)候,無(wú)論在actived standby database時(shí),或在primary node上面重建 primary database的時(shí)候,系統都需要down time。所需時(shí)間長(cháng)短,與系統狀態(tài)有關(guān)。如果可以在primary mode建立standby database (如果兩個(gè)server的硬件設置一樣,一般standby node要差一些,節約費用) ,可以減少downtime。
在下面的幾部份,可以討論到部份細節。
實(shí)現環(huán)境
主服務(wù)器
備份服務(wù)器
操作系統
Windows 2003 Enterprise
Windows 2003 Enterprise
Oracle版本
Oracle 9.2.0.1
Oracle 9.2.0.1
Oracle SID
pstest
pstest
ORACLE_HOME
c:\oracle\oradata\pstest
c:\oracle\oradata\pstest
機器名
Primary
Standby
IP地址
192.168.5.20
192.168.5.21
實(shí)現步驟
1. 在Primary Server上安裝Oracle并創(chuàng )建SID為pstest的Oracle數據庫;
2. 在Standby Server上安裝Oracle并創(chuàng )建SID為pstest的Oracle數據庫;
這一步可以用命令只創(chuàng )建一個(gè)名字為pstest的Oracle服務(wù)名即可,
WINNT> oradim -NEW -SID pstest -STARTMODE manual
如果創(chuàng )建庫的話(huà),數據庫文件需要被Primary Server上的數據庫文件覆蓋掉;
3. 將Primary Server上的所有數據文件、redo文件和password文件都copy到Standby Server機器的相應位置;
C:\oracle\oradata\pstest 目錄下文件
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:\oracle\ora92\database 目錄下文件
PWDpstest.ora
4. 修改Primary Server 的Oraclce初始化參數;
文件位置:c:\oracle\admin\pstest\pfile\
文件名字不確定,類(lèi)似這樣:init.ora.114200520819,我們把名字改為init.ora,這樣好記一點(diǎn);
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
具體參數的說(shuō)明請參考oracle在線(xiàn)文檔。
5. 設置primary database為archivelog模式
SQL>shutdown immediate;
SQL>startup mount pfile=’ c:\oracle\admin\pstest\pfile\init.ora’;
SQL>alter database archivelog;
SQL>alter database open:
6. 在Primary Database上創(chuàng )建Standby Database的控制文件
SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database create standby controlfile as ‘c:\oracle\oradata\pstest\control01.ctl’
SQL>alter database open;
然后將該controlfile復制到Standby Server的對應位置,原來(lái)的控制文件已經(jīng)不需要了;
7. 修改Standby Database的初始化參數
拷貝Primary Database上的初始化參數文件到Standby Database上對應位置,然后修改為以下內容:
CONTROL_FILES=‘ c:\oracle\oradata\pstest\control01.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
具體參數的說(shuō)明請參考oracle在線(xiàn)文檔。
8. 設置Primary Database和Standby Database的tnsnames.ora
文件位于:c:\oracle\ora92\network\admin
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. 啟動(dòng)standby database
SQL>startup nomount pfile=’ c:\oracle\admin\pstest\pfile\init.ora’
SQL>alter database mount standby database;
10. 啟動(dòng)primary database
SQL>startup pfile=’ c:\oracle\admin\pstest\pfile\init.ora’
11. 啟動(dòng)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:\oracle\admin\poramls\bdump\pormals_alert.ora
看當前歸檔日志是否已經(jīng)正常完成恢復
已只讀方式打開(kāi)從庫察看是否insert into test values(‘hi,data guard‘);已經(jīng)生效。
在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‘);已經(jīng)生效。
如果生效說(shuō)明已經(jīng)完全正常工作,data guard到此完全配置完畢。
再次置從庫在恢復模式
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE disconnect from session;
維護standby數據庫
當primary 數據庫失敗時(shí),將standby 數據庫激活:取消(cancel)恢復執行以下操作:
sql> connect internal/password;
sql> startup nomount pfile=’c:\oracle\admin\pstest\pfile\init.ora’;
sql> alter database mount standby database;
sql> alter database activate standby database;
shutdown standby 數據庫;
sql> shutdown immediate
重起Standby Database;
sql > startup
問(wèn)題:
1. 關(guān)于tnsnames.ora文件
Primary Database和Standby Database上的tnsnames.ora文件內容可以是相同的,其目的是為了建立兩個(gè)Oracle連接名,一個(gè)連自己,一個(gè)連對方;這兩個(gè)連接名對應各自服務(wù)器上的初始化參數文件中的一下內容中的primary和standby:
FAL_SERVER=primary 注:Standby Server連接Primary Server的數據庫連接名
FAL_CLIENT=standby 注:Primary Server連接Standby Server的數據庫連接名
2. 關(guān)于初始化文件中的LOG_ARCHIVE_MIN_SUCCEED_DEST參數
在上面的配置文件中,此參數的值為2,如果設置為1的話(huà),將不能正常同步歸檔日志;
3. 關(guān)于初始化文件中的LOG_ARCHIVE_DEST_2參數
LOG_ARCHIVE_DEST_2= ‘SERVICE=standby‘ 注:到Standby Database的數據庫連接名
在Primary Server和Standby Server上的初始化文件中的這個(gè)參數分別只的是指向對方的數據庫連接名。
4. 關(guān)于啟動(dòng)關(guān)閉順序
啟動(dòng)的時(shí)候,先從庫的listener,然后啟動(dòng)從庫,然后啟動(dòng)主庫的listener 接著(zhù)是主庫 關(guān)閉的時(shí)候正好相反,先關(guān)閉主庫,然后是從庫。
5. 一些常用的view
V$ARCHIVE_DEST_STATUS 這里面會(huì )紀錄到standby 的狀態(tài)和恢復到那個(gè)日志
V$ARCHIVE_GAP 這里面會(huì )紀錄當前從庫mrp進(jìn)程恢復需要的膽識還沒(méi)有傳到從庫得日志
V$ARCHIVED_LOG 這里面會(huì )紀錄所有已經(jīng)歸檔到從庫的日志,并且記錄該日志是否已經(jīng)恢復
V$DATABASE 會(huì )紀錄系統的保護狀態(tài)和是否處于force logging狀態(tài)
V$MANAGED_STANDBY (Physical Standby Databases Only) 會(huì )紀錄當前從庫的一些進(jìn)程情況和進(jìn)程的process id,如rfs,mrp等
V$STANDBY_LOG (Physical Standby Databases Only) 會(huì )紀錄當前從庫的standby redo log的一些情況。