Oracle 的 High Availability 功能,Oracle 是從下面幾個方面來詮釋的:html
(1) System faults and crashesnode
(2) Application and middleware failuressql
(3) Network failuresshell
(4) Media failures數據庫
(5) Human Error服務器
(6) Disasters and extended outagessession
(7) Planned downtime, maintenance and management tasksoracle
上述第六項就包含了disaster recovery 在內。所以 disaster recovery 應該算作 high availability 的一個方面了。app
總的來講,除了以Oracle database 自己參數進行性能調解外,Oracle 提供支持high availability 相關產品主要有下面幾種:ide
(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 和咱們討論過 standby database
從參與討論的帖子來看,相關的問題是集中在OPS,standby database 和 Advanced Replication 的選擇,所以我就先將這三種產品作一下比較。
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 的功能,這裏不盡詳細描述。
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。
從設計原理上來說,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。
在下面的幾部份,能夠討論到部份細節。
|
主服務器 |
備份服務器 |
操做系統 |
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 |
這一步能夠用命令只建立一個名字爲pstest的Oracle服務名便可,
WINNT> oradim -NEW -SID pstest -STARTMODE manual
若是建立庫的話,數據庫文件須要被Primary 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 |
文件位置:c:\oracle\admin\pstest\pfile\
文件名字不肯定,相似這樣: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在線文檔。
SQL>shutdown immediate;
SQL>startup mount pfile=’ c:\oracle\admin\pstest\pfile\init.ora’;
SQL>alter database archivelog;
SQL>alter database open:
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的對應位置,原來的控制文件已經不須要了;
拷貝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
具體參數的說明請參考oracle在線文檔。
文件位於: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) ) ) |
SQL>startup nomount pfile=’ c:\oracle\admin\pstest\pfile\init.ora’
SQL>alter database mount standby database;
SQL>startup pfile=’ c:\oracle\admin\pstest\pfile\init.ora’
SQL>alter database recover managed standby database disconnect from session;
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
看當前歸檔日誌是否已經正常完成恢復
已只讀方式打開從庫察看是否insert into test values('hi,data guard');已經生效。
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;
當primary 數據庫失敗時,將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
Primary Database和Standby Database上的tnsnames.ora文件內容能夠是相同的,其目的是爲了創建兩個Oracle鏈接名,一個連本身,一個連對方;這兩個鏈接名對應各自服務器上的初始化參數文件中的一下內容中的primary和standby:
FAL_SERVER=primary 注:Standby Server鏈接Primary Server的數據庫鏈接名
FAL_CLIENT=standby 注:Primary Server鏈接Standby Server的數據庫鏈接名
在上面的配置文件中,此參數的值爲2,若是設置爲1的話,將不能正常同步歸檔日誌;
LOG_ARCHIVE_DEST_2= 'SERVICE=standby' 注:到Standby Database的數據庫鏈接名
在Primary Server和Standby Server上的初始化文件中的這個參數分別只的是指向對方的數據庫鏈接名。
啓動的時候,先從庫的listener,而後啓動從庫,而後啓動主庫的listener 接着是主庫 關閉的時候正好相反,先關閉主庫,而後是從庫。
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的一些狀況。