Oracle 10g DataGuard手記之基礎配置

來源:互聯網
上載者:User

標籤:des   io   os   ar   使用   for   sp   檔案   資料   

DataGuard為企業資料的高可用性,資料安全以及災難恢複提供支援,一般由一個primary db與幾個物理或邏輯standby db組成一個DataGuard配置。

系統內容

作業系統為windows server 2003 r2 enterprise x64 edition service pack 2,database為oracle 10g 10.2.0.4 enterprise x64 edition。伺服器均為AMD64架構,主機RAID5本地硬碟加RAID1光纖盤陣。

primary庫:
ip 10.0.0.1
$ORACLE_BASE E:\ORACLE
$ORACLE_HOME E:\ORACLE\PRODUCT\10.2.0\DB_1
$ORACLE_SID orcl

standby庫standby01:
ip 10.0.0.2
$ORACLE_BASE E:\ORACLE
$ORACLE_HOME E:\ORACLE\PRODUCT\10.2.0\DB_1
$ORACLE_SID orcl

主庫primary與(第一個)物理備庫standby01的oracle版本與物理結構是完全一致的,所有oracle檔案的路徑在兩台伺服器上都是一樣的。

方案

配置DataGuard的目標是保證業務系統資料的最高可用性,迅速從硬體故障,資料損毀或災難中恢複資料庫。物理standby效能和穩定性都優於邏輯standby,並且由於備庫不需要用於查詢,因此備庫採用物理standby模式。

DataGuard有三種保護模式,最大效能模式,最大可用模式和最大保護模式。

最大保護模式可以確保沒有資料丟失。這種模式要求所有的事務在提交前其redo資料不但要寫入本地online redo log,還要同時提交到standby的standby redo log,並確認redo資料至少在一個standby上可用,然後才會在primary上提交該事務。當出現故障導致無standby可用時,primary會shutdown,直到至少有一個standby恢複。
最大效能模式是dataguard預設的資料保護模式。在這種模式下,只要redo資料寫到本地online redo log中事務就可以提交。primary仍然向standby寫入redo logs,但這種寫入是非同步,對產生redo資料的事務沒有影響。最大效能模式對系統的影響最小,但有遺失資料的風險。
最大可用模式是這兩種模式的折衷,在正常情況下,最大可用模式和最大保護模式是一樣的,同樣要求事務提交前其redo資料不但要寫入到本地online redo log還要至少寫入到一個standby的standby redo log。但在standby出現故障不可用時,最大可用模式會自動降低成最大效能模式。當故障消除並且standby的redo log與primary完全同步後,primary會自動的恢複到最大可用模式運行。這種情況下dataguard消除redo log gaps時會使用到FAL_SERVER和FAL_CLIENT這兩個參數。所以standby故障不會導致primay不可用。只要至少有一個standby可用的情況下,即使primary down掉,也能保證不遺失資料。
因為系統內容較好,可以配置多個物理standby,系統可用性要求高,並且可以容忍極少量資料丟失,因此採用最高可用模式。

DataGuard基礎配置

主庫(primary)端配置:

1、開啟force logging模式
SQL>alter database force logging;
然後查詢
SQL>select force_logging from v$database;
FOR

YES
說明已經開啟FORCE LOGGING模式

2、建立密碼檔案
如果密碼檔案不存在需要建立密碼檔案,DataGuard配置裡面的每一個資料庫都必須使用密碼檔案,並且所有資料的SYS使用者密碼必須相同,這樣才能成功的傳輸REDO LOGS。主庫安裝時已經自動建立了密碼檔案,備庫安裝時也使用相同的SYS密碼進行安裝並自動建立密碼檔案,所以此時不必再重複建立密碼檔案。

3、配置Standby Redo Log

最大保護模式和最大可用模式必須使用standby redo log,並且推薦所有的資料庫都使用LGRW ASYNC日誌傳輸模式。建立standby資料庫時就要計劃好standby redo log的配置,並建立所有需要的日誌組和群組成員。為了增加可用性,可以多路standby redo log檔案,就像多路online redo log檔案那樣。多路時每個日誌組內的所有記錄檔內容都是一樣的,可以將它們分散到不同的磁碟機上以提高可用性和IO效能。

建立standby redo log的步驟如下:

1)確保記錄檔的大小與主、備庫online redo log檔案的大小保持一致。這樣日誌傳輸和應用都比較方便。

2)確定適當數目的standby redo log日誌組
standby redo log日誌組至少要比online redo log日誌組多一個。然而官方推薦根據primary資料庫的線程數來計算standby redo log日誌組的數量,參考公式如下

(每線程的日誌組數+1)*線程數

這樣可以降低primary庫LGRW進程被阻塞的可能性。
比如,primary有兩個線程,每個線程有兩個日誌組,那麼推薦配置6個standby redo log日誌組。
單一實例資料庫只有一個線程,所以配置比預設的3組online redo log多一組即4組standby redo log即可。

3)建立standby redo log日誌組

正常情況下standby redo log日誌組僅需要在Standby庫進行配置,考慮到主備切換,在primary端亦進行配置
先查詢一下online redo log記錄檔的大小
SQL>select group#,thread#,archived,status,bytes/1024/1024 from v$log;
GROUP# THREAD# ARC STATUS BYTES/1024/1024
—— ———- — —————- —————
1 1 YES INACTIVE 50
2 1 NO CURRENT 50
3 1 YES INACTIVE 50
online redo log記錄檔的大小為50M,組號為1-3,所以standby redo log日誌組的組號為4-7,下面建立standby redo log日誌組

SQL>alter database add standby logfile group 4 (‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\STDBYREDO01.LOG’) size 50M;
Database altered.
SQL>alter database add standby logfile group 5 (‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\STDBYREDO02.LOG’) size 50M;
Database altered.
SQL>alter database add standby logfile group 6 (‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\STDBYREDO03.LOG’) size 50M;
Database altered.
SQL>alter database add standby logfile group 7 (‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\STDBYREDO04.LOG’) size 50M;
Database altered.

驗證standby redo log日誌組是否建立成功
SQL>SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;
GROUP# SEQUENCE# ARC STATUS
———- ———- — ———-
4 0 YES UNASSIGNED
5 0 YES UNASSIGNED
6 0 YES UNASSIGNED
7 0 YES UNASSIGNED

4、設定oracle net service names

在主庫primary的$ORACLE_HOME/NETWORK/ADMIN/tnsname.ora檔案中添加如下oracle net service name,primary標識主庫和standby01標識(第一個)物理備庫
primary =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)

standby01 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)

5、設定primary初始化參數
對於primary資料庫,作為primary腳色需要定義幾個初始化參數控制redo傳輸服務。還有幾個附加的初始化參數需要定義以控制redo資料的接收和日誌應用服務,當primary庫轉換到standby角色時會使用這些參數,方便主備庫角色轉換。

DataGuard相關的初始化參數詳細解釋見這裡

因為需要修改的初始化參數較多,先從spfile匯出pfile,然後用編輯pfile,最後再用pfile重建spfile

SQL>create pfile from spfile;

會在$ORACLE_HOME/database/目錄下產生INITorcl.ora

下面是primary庫需要修改或添加的初始化參數:
DB_NAME=’orcl’
DB_UNIQUE_NAME=’primary’
LOG_ARCHIVE_CONFIG=’DG_CONFIG=(primary,standby01)’
LOG_ARCHIVE_DEST_1=’LOCATION=D:\archived_log\ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary’
LOG_ARCHIVE_DEST_2=’SERVICE=standby01 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby01′
LOG_ARCHIVE_DEST_STATE_1=enable
LOG_ARCHIVE_DEST_STATE_2=enable

註:因為LOG_ARCHIVE_DEST_n與LOG_ARCHIVE_DEST(LOG_ARCHIVE_DUPLEX_DEST)參數不相容,因此需要把LOG_ARCHIVE_DEST(LOG_ARCHIVE_DUPLEX_DEST)參數reset為空白,歸檔日誌路徑問題詳見oracle 10g重做日誌歸檔路徑參數。

註:LOG_ARCHIVE_DEST_1指定的本地歸檔目錄必須在參數生效前已經存在,不然啟動資料庫時會報如下錯誤:
ORA-16032: parameter LOG_ARCHIVE_DEST_1 destination string cannot be translated
ORA-09291: sksachk: invalid device specified for archive destination
OSD-04018: Unable to access the specified directory or device.
O/S-Error: (OS 2) XXXXXXXXXXXXXXXXXXXX

下面是standby腳色需要的初始化參數,為primary設定這些參數以方便在primary與standby腳色之間轉換
FAL_SERVER=standby01
FAL_CLIENT=primary
STANDBY_FILE_MANAGEMENT=auto

修改完畢後用pfile建立spfile

SQL>shutdown immediate
SQL>create spfile from pfile=’INITorcl.ora’
SQL>startup

6、確保primary處于歸檔模式

SQL>archive log list
Database log mode Archive Mode
Automatic archival Enabled

如果並未開啟歸檔模式,執行以下命令將資料庫置于歸檔模式
SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database archivelog;
SQL>alter database open;

7、為物理備庫產生control檔案

SQL>alter database create standby controlfile as ‘\path\to\control_file‘;

物理備庫(standby01)端配置

1、建立備庫
有多種方式建立物理備庫,使用冷備份或RMAN或其他方法,oracle推薦使用RMAN。因為primary與standby01結構完全一致,而且primary有停庫的機會,所以採用最簡單的冷備份來建立物理備庫standby01,方法如下:

需要拷貝的有密碼檔案,standby控制檔案,資料檔案,聯機記錄檔,初始化參數檔案。初始化參數檔案拷貝主庫上產生並修改好的pfile INITorcl.ora,然後根據物理備庫的實際情況做相應修改後產生spfile即可。

首先查詢資料庫,找到這些檔案所在的位置
SQL>select name from v$datafile; //資料檔案
SQL>select name from v$logfile; //線上記錄檔
SQL>show parameter log_archive_dest; //歸檔記錄檔

online redo log,standby redo log所在路徑為$ORACLE_BASE\PRODUCT\10.2.0\ORADATA\ORCL\,密碼檔案PWDorcl.ora,初始化參數檔案INITorcl.ora,普通使用者資料檔案所在路徑為$ORACLE_HOME\database\,系統使用者資料檔案所在路徑為$ORACLE_BASE\PRODUCT\10.2.0\ORADATA\ORCL\,歸檔記錄檔所在的路徑為D:\ARCHIVED_LOG

對於控制檔案稍微有些不同,standby庫不能直接使用primary庫的控制檔案,不然standby會報”ORA-01665: control file is not a standby control file”錯誤,需要從primary庫為standby產生控制檔案,在primary庫端執行命令

SQL>alter database create standby controlfile as ‘d:\control01.ctl‘;

然後分別關閉primary和standby01
SQL>shutdown immediate

將上述檔案拷貝到standby01庫相應的目錄下,因為兩邊庫結構完全一致,所以直接從primary拷貝$ORACLE_BASE\PRODUCT\10.2.0\ORADATA\ORCL和$ORACLE_HOME\database\這兩個目錄覆蓋到standby對應目錄下即可。

最後將產生的控制檔案拷貝到standby01庫初始化參數contro_files設定的路徑,這裡使用的是預設值,也就是standby01庫的$ORACLE_BASE\PRODUCT\10.2.0\ORADATA\ORCL\目錄下。注意控制檔案是有冗餘的,拷貝control01.ctl為control02.ctl和control03.ctl,分別覆蓋standby01原來的三個控制檔案,這三個控制檔案是完全一樣的。為了安全可靠,也可以修改初始化參數control_files,將三個控制檔案放到不同的磁碟機上面。關於控制檔案見oracle 10g 控制檔案冗餘。

2、設定oracle net service names

在備庫standby01的$ORACLE_HOME/NETWORK/ADMIN/tnsname.ora檔案中添加如下oracle net service name,primary標識主庫和standby01標識(第一個)物理備庫
primary =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)

standby01 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)

3、設定standby01初始化參數

直接根據stanby角色修改從primary庫拷貝過來的INITorcl.ora,下面是standby01庫需要修改或添加的初始化參數:

DB_NAME=’orcl’
DB_UNIQUE_NAME=’standby01′
LOG_ARCHIVE_CONFIG=’DG_CONFIG=(primary,standby01)’
LOG_ARCHIVE_DEST_1=’LOCATION=D:\archived_log\ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby01′
LOG_ARCHIVE_DEST_STATE_1=enable
FAL_SERVER=primary
FAL_CLIENT=standby01
STANDBY_FILE_MANAGEMENT=auto

下列參數用於standby01從備庫到主庫角色轉換

LOG_ARCHIVE_DEST_2=’SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary’
LOG_ARCHIVE_DEST_STATE_2=enable

修改完畢後用pfile建立spfile

SQL>create spfile from pfile=’INITorcl.ora’

4、啟動物理備庫standby並開啟redo應用

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

使用下面語句停止redo應用
SQL>alter database recover managed standby database cancel;

5、檢查物理備庫standby01是否正確同步

在primary庫上手工強制歸檔並查詢歸檔日誌
SQL>alter system switch logfile;
SQL>select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
————–
486

在standby01上查詢歸檔日誌
SQL>select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
————–
486

如果從primary上做如下查詢,能看到如下的記錄
SQL>select name,sequence# from v$archived_log order by sequence#;
NAME SEQUENCE#
———— ————-
standby01 486
D:\ARCHIVED_LOG\ARC00486_0765555401.001 486

同一個歸檔檔案分別寫到了本地歸檔路徑和standby01備庫。

這說明dataguard資料同步是正確的。

6、開啟即時redo應用

上面第4步的redo應用並不是即時的,只有當主庫的online redo歸檔並觸發備庫的standby redo歸檔後才將歸檔日誌的資料應用到備庫,這樣就會有較大的延遲,造成一段時間內主備庫差異較大。
dataguard提供了即時應用redo日誌的方法,如果開啟了日誌即時應用,日誌應用服務會將從primary接收到的redo資料立即應用到standby庫,而不會等到當前的standby redo log日誌歸檔後再應用redo資料。即時日誌應用必須要在standby庫配置standby redo log檔案。

開啟redo即時應用
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

預設dataguard運行於最大效能模式,如何升級到其他模式另文再敘。

P.S.:建立更多的物理standby備庫並沒有什麼特別的,只要在primary的pfile中增加更多的網路歸檔路徑,比如LOG_ARCHIVE_DEST_3、LOG_ARCHIVE_DEST_4等,當然對應的LOG_ARCHIVE_DEST_STATE_3、LOG_ARCHIVE_DEST_STATE_4也要設定為enable,還有參數LOG_ARCHIVE_CONFIG=’DG_CONFIG=(primary,standby01,standby02,…)’,再就是適當的設定FAL_SERVER和FAL_CLIENT就可以了。

Oracle 10g DataGuard手記之基礎配置

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.