Oracle RAC One Node 和 Oracle Data Guard 配置 DBA 指南

Oracle RAC One Node 和 Oracle Data Guard 配置 DBA 指南
作者:Martin Bach

按照下文的指導,您可以輕鬆地結合使用 Oracle RAC One Node 和 Oracle Data Guard 來實現災難恢復。

2011 年 7 月發佈

Oracle RAC One Node 是 Oracle Database 11g 第 2 版 的一個高可用性選件,它是傳統的主動/被動集羣和 Oracle Real Application Cluster (RAC) 選件的混合體,它與標準 Oracle RAC 的主要區別在於 Oracle RAC One Node 數據庫通常僅在一個實例上處於活動狀態。Oracle RAC One Node 還允許聯機遷移數據庫及其會話以進行計劃維護。

Oracle RAC One Node 還降低了意外中斷的風險。如果發生節點故障,Oracle RAC One 實例將在另一臺候選服務器上自動重新啓動。此外,因爲 Oracle RAC One Node 數據庫實際上是一個集羣數據庫,所以從 Oracle RAC One Node 轉換爲完全配置的 Oracle RAC 相對較爲簡單。

大多數具有低恢復時間目標 (RTO) 的企業依靠 Oracle Data Guard(Oracle Database 企業版的一個特性)在出現嚴重故障或災難時恢復服務。最初缺乏 Data Guard 對 Oracle RAC One Node 的支持,事實證明,這阻礙了許多企業對 Oracle RAC One Node 的採用。但從 2010 年 Oracle 發佈 11.2.0.2 補丁集開始,Oracle Data Guard 現已可用於保護 Oracle RAC One Node 數據庫。(Oracle RAC One Node 最初以 11.2.0.1 基礎版本上一次性補丁的形式僅適用於數量有限的平臺,而如今,它適用於已針對其發佈了補丁集的所有支持的平臺。)

在本文中,我們首先探討用於配置 Oracle Data Guard 的“代理”(Broker) 方法,該方法主要針對經驗較少的 DBA 或那些不想進行過細的配置管理工作的人員。在第 2 部分中,我們將瞭解如何在 Oracle RAC One Node 環境中手動配置 Oracle Data Guard,這是更高級的方法。爲了簡單起見,兩種情況都只使用一個物理備用數據庫。(假定您對 Oracle Data Guard 有基本的瞭解。)

環境配置
在以下各節中,我們假定已創建了 Oracle RAC One Node 主數據庫(名爲 RON),該數據庫已啓動並正在運行。本示例在 64 位 Oracle Linux 5.5 平臺上採用 Oracle 11.2.0.2 配置了一個四節點主集羣和一個相同的 DR 集羣。這些數據庫位於 ASM 中,其 db_create_file_dest 設置爲磁盤組 DATA,在磁盤組 FRA 中有一個快速恢復區。

主數據庫 RON 與候選服務器 node1 和 node2 以及域 example.com 一起在主集羣的 Oracle 集羣註冊表中註冊。並已按照 Oracle 的建議創建了數據庫服務 RON_APP.example.com。(注意,用戶連接應始終使用此服務而不是 ORACLE_SID,以最大程度減少聯機遷移過程中的問題。)

所有診斷和管理文件都存儲在名爲 /data/oracle/RON/ 的現有 ACFS 掛載點上。這使得信息對整個集羣可用,此特性可大大簡化管理。

下面的示例顯示了主集羣 OCR 中的數據庫配置:

$ srvctl config database -d RON
Database unique name: RON
Database name: RON
Oracle home: /u01/app/oracle/product/11.2.0.2/
Oracle user: oracle
Spfile: +DATA/RON/spfileRON.ora
Domain: example.com
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools: RON
Database instances:
Disk Groups: DATA,FRA
Mount point paths:
Services: RON_APP.example.com
Type: RACOneNode
Online relocation timeout: 30
Instance name prefix: RON
Candidate servers: node1,node2
Database is administrator managed

DR 數據庫將在另一個四節點集羣上構建,該集羣包括 drnode1 和 drnode2 兩個數據庫節點。注意,不一定要使用四個節點;大多數 Oracle RAC One 數據庫駐留在兩節點集羣上。

準備備用數據庫主機
如前所述,在此我們將使用一個共享 ACFS 文件系統(掛載在同一集羣的所有節點上)來存儲診斷目標目錄、數據轉儲目錄及其他信息。對於主數據庫,該目錄已經存在,但對於備用數據庫,情況並非如此。首先需要在 DR 集羣上創建 ASM 集羣文件系統。

首先以網格基礎架構所有者的身份爲 ASM 集羣文件系統創建一個新卷。(在未實現職責分離的環境中,此命令很可能以 oracle 用戶的身份來執行。)注意,ORACLE_SID 被設置爲第一個 ASM 實例。

[grid@drnode1 ~] $ asmcmd volcreate -G ACFSDG -s 1G RONDG_V1

[grid@drnode1 ~] $ asmcmd volinfo -G ACFSDG RONDG_V1
Diskgroup Name: ACFSDG

     Volume Name: RONDG_V1
     Volume Device: /dev/asm/RONDG_v1-329
     State: ENABLED
     Size (MB): 1024
     Resize Unit (MB): 256
     Redundancy: UNPROT
     Stripe Columns: 4
     Stripe Width (K): 128
     Usage:
     Mountpath:

[grid@drnode1 ~] $

在上面的示例中,在名爲 ACFSDG 的專用磁盤組上創建了 ASM 動態卷。爲 ADVM/ACFS 使用單獨的磁盤組儘管很方便,但沒有必要。在本例中,原因很簡單:儘管數據庫位於“高級”類型的存儲上,但 ACFS 卷並非如此,因此使用了不同的磁盤組。

上面的命令創建了一個 1GB 的 ASM 動態卷 RONDG_V1,稍後供磁盤組 ACFSDG 中的 ACFS 使用。接下來必須對該捲進行格式化。您需要以 root 身份使用 mkfs 實用程序來執行此操作,如本示例中所示:

[root@drnode1 ~]# mkfs -t acfs /dev/asm/RONDG_v1-329
mkfs.acfs: version = 11.2.0.2.0
mkfs.acfs: on-disk version = 39.0
mkfs.acfs: volume = /dev/asm/RONDG_v1-329
mkfs.acfs: volume size = 1073741824
mkfs.acfs: Format complete.
[root@drnode1 ~]#

之後必須在 ACFS 註冊表中註冊該卷。(或者,可以將該卷創建爲依賴於 RONDG 數據庫的集羣資源。)

[root@drnode1 ~]# /sbin/acfsutil registry -a -n \

drnode1,drnode2 \
/dev/asm/RONDG_v1-329 /data/oracle/RONDG/
acfsutil registry: mount point /data/oracle/RONDG successfully added to Oracle Registry

我們來解釋一下上面的命令,我們已指示集羣級掛載註冊表添加一個名爲 /dev/asm/RONDG_v1-329 的新文件系統,並將其掛載到所有集羣節點上的 /data/oracle/RONDG。

可以將 ACFS 註冊表看作一個擴展的、可移植的、集羣級 /etc/fstab 文件。使用此註冊表,不必也不鼓勵在每個集羣節點的 fstab 中添加掛載點!您可能需要在初始創建集羣文件系統後進行手動掛載。

我們通過一個示例來演示此過程。首先,在所有集羣節點上創建掛載點,然後掛載集羣文件系統。(同樣,ACFS 註冊表將在下次服務器重新啓動時執行此步驟!)接下來,將放寬文件系統權限,允許 oracle 用戶讀、寫和更改目錄。以下所示的 shell 腳本利用用戶等效性以及 Oracle 用戶在 /etc/sudoers 中有適當的條目的事實。生產環境中通常不具備此條件,您需要請系統管理員爲您執行此步驟。

[oracle@drnode1 tmp: RON]mkdir/data/oracle/RONDG/[oracle@drnode1tmp:RON] for i in 2 3 4

do
ssh drnode$i sudo mkdir –p /data/oracle/RONDG/
done

[oracle@drnode1 tmp: RON]$ for i in 2 3 4 ; do

ssh drnode$i sudo mount -t acfs /dev/asm/RONDG_v1-329 \
/data/oracle/RONDG/;
mount;
done

[oracle@drnode1 oracle]# for i in 2 3 4

do
ssh drnode$i sudo chown -R oracle:oinstall /data/oracle/RONDG
done

我以類似方式在掛載點 /data/oracle/RONDG 下爲管理文件創建了所需的子目錄。這些目錄是:

admin
admin/adump
admin/pfile
admin/scripts
admin/dpump

創建備用數據庫
準備好基礎架構後,下一步是爲備用數據庫 RONDG 創建初始化文件。通常的做法是,通過執行 create pfile=’/tmp/initRONDG_1.ora’ from spfile… 命令在主集羣上創建該文件,然後再將該文件傳輸到 DR 集羣。需要做一點編輯,主要是針對 db_unique_name 並刪除 control_files 參數。下面是一個示例。(注意其中將使用 ACFS 掛載的目錄用於 audit_dump_dir 和 diagnostic_dest):

[oracle@drnode1 dbs]$ vi /tmp/initRONDG_1.ora
*.archive_lag_target=900
*.audit_file_dest=’/data/oracle/RONDG/admin/adump’
*.audit_sys_operations=TRUE
*.audit_trail=’os’
*.cluster_database=true
*.db_domain=’example.com’
*.compatible=’11.2.0.2.0’
*.cpu_count=1
*.db_block_size=8192
*.db_create_file_dest=’+DATA’
*.db_file_multiblock_read_count=16
*.db_name=’RON’
*.db_unique_name=’RONDG’
*.db_recovery_file_dest_size=10737418240
*.db_recovery_file_dest=’+FRA’
*.diagnostic_dest=’/data/oracle/RONDG/admin’
*.dispatchers=’(PROTOCOL=TCP) (SERVICE=RONDGXDB)’
*.memory_target=4294967296
*.open_cursors=300
*.processes=450
*.remote_listener=’scan2.example.com:1999’
*.remote_login_passwordfile=’exclusive’
*.resource_limit=TRUE
*.resource_manager_plan=’default_plan’
*.standby_file_management=’auto’
RONDG_1.undo_tablespace=UNDOTBS1
*.undo_management=AUTO

這裏未特意設置本地監聽器:Oracle Clusterware 11.2.0.2 將識別 Oracle RAC 和 Oracle RAC One 數據庫中的非默認本地監聽器並將其自動添加到配置中。

最後,需要將口令文件從主集羣複製並鏈接到 ACFS 掛載點。轉到備用主機上的 $ORACLE_HOME/dbs 目錄:

[oracle@drnode1 dbs]scporacle@node1: ORACLE_HOME/dbs/orapwRON* orapwRONDG
[oracle@drnode1 dbs]$ mv orapwRONDG /data/oracle/RONDG/admin/pfile -iv
orapwRONDG' ->/data/oracle/RONDG/admin/pfile/orapwRONDG’
removed `orapwRONDG’
[oracle@drnode1 dbs: RON]$ ln -s /data/oracle/RONDG/admin/pfile/orapwRONDG

您應在充當數據庫候選者的所有其他集羣節點上重複上述創建符號鏈接的過程;記住,與 init_R{ORACLE_SID}.ora 不同,無論實例名如何,口令文件始終名爲 orapwDBUniqueName。

爲了允許 Oracle Data Guard 在主集羣與備用集羣之間傳遞日誌,在所有集羣節點上的所有 RDBMS $ORACLE_HOME/network/admin/tnsnames.ora 中添加一組新條目:

RON =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = scan1.example.com)(PORT = 1999))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = RON.example.com)
)
)

RONDG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = scan2.example.com)(PORT = 1999))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = RONDG.example.com)
)
)

注意,在此不可能使用服務名 RON_APP.example com — 如果數據庫 RON 處於備用角色,將不能啓用該服務,從而防止日誌被傳遞到目標而導致 ORA-12514 錯誤。但在 CONNECT_DATA 部分必須使用 SERVICE_NAME 而不是 SID。

現在該創建備用數據庫了。啓動 RONDG_1 實例,使其進入“nomount”階段。以下是我用於創建備用數據庫的 RMAN 命令的輸出:

[oracle@drnode1 admin]$ rman target sys/sysPassword@ron auxiliary /

Recovery Manager: Release 11.2.0.2.0 - Production on Mon Mar 28 16:25:08 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

connected to target database: RON (DBID=1589116261)
connected to auxiliary database (not started)

RMAN> startup clone nomount

Oracle instance started

Total System Global Area 534462464 bytes

Fixed Size 2228200 bytes
Variable Size 381681688 bytes
Database Buffers 142606336 bytes
Redo Buffers 7946240 bytes

RMAN> duplicate target database for standby;

Starting Duplicate Db at 28-MAR-11
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=15 instance=RONDG_1 device type=DISK

contents of Memory Script:
{
restore clone standby controlfile;
}
executing Memory Script

Starting restore at 28-MAR-11
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece /u01/app/oracle/backup/ctrl_04m8c636_1_1
channel ORA_AUX_DISK_1: piece handle=/u01/app/oracle/backup/ctrl_04m8c636_1_1 tag=TAG20110328T155934
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:07
output file name=+DATA/rondg/controlfile/current.256.746987137
output file name=+FRA/rondg/controlfile/current.256.746987139
Finished restore at 28-MAR-11

contents of Memory Script:
{
sql clone ‘alter database mount standby database’;
}
executing Memory Script

sql statement: alter database mount standby database

contents of Memory Script:
{
set newname for clone tempfile 1 to new;
switch clone tempfile all;
set newname for clone datafile 1 to new;
set newname for clone datafile 2 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 4 to new;
set newname for clone datafile 5 to new;
restore
clone database
;
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to +DATA in control file

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 28-MAR-11
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to +DATA
channel ORA_AUX_DISK_1: restoring datafile 00002 to +DATA
channel ORA_AUX_DISK_1: restoring datafile 00003 to +DATA
channel ORA_AUX_DISK_1: restoring datafile 00004 to +DATA
channel ORA_AUX_DISK_1: restoring datafile 00005 to +DATA
channel ORA_AUX_DISK_1: reading from backup piece /u01/app/oracle/backup/db_01m8c5on_1_1
channel ORA_AUX_DISK_1: piece handle=/u01/app/oracle/backup/db_01m8c5on_1_1 tag=TAG20110328T155358
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:02:16
Finished restore at 28-MAR-11

contents of Memory Script:
{
switch clone datafile all;
}
executing Memory Script

datafile 1 switched to datafile copy
input datafile copy RECID=6 STAMP=746987293 file name=+DATA/rondg/datafile/system.257.746987155
datafile 2 switched to datafile copy
input datafile copy RECID=7 STAMP=746987294 file name=+DATA/rondg/datafile/sysaux.258.746987155
datafile 3 switched to datafile copy
input datafile copy RECID=8 STAMP=746987294 file name=+DATA/rondg/datafile/undotbs1.259.746987157
datafile 4 switched to datafile copy
input datafile copy RECID=9 STAMP=746987294 file name=+DATA/rondg/datafile/users.261.746987157
datafile 5 switched to datafile copy
input datafile copy RECID=10 STAMP=746987294 file name=+DATA/rondg/datafile/undotbs2.260.746987157
Finished Duplicate Db at 28-MAR-11

最後一步是向 pfile 添加控制文件,文件名顯示在上面的“output file name”行中。然後應在 ASM 中創建一個服務器參數文件,並在集羣註冊表中註冊數據庫:

SQL> create spfile=’+DATA/RONDG/spfileRONDG.ora’ from pfile;

File created.
SQL> shutdown immediate
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.
SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

不要忘記更新 ORACLEHOME/dbsinit {ORACLE_SID}.ora,使其指向 spfile。這隻需在當前節點上執行,您將在稍後的步驟中看到,我們將在 OCR 中定義一個指向 spfile 的指針。如果需要,將自動創建 $ORACLE_HOME/dbs 中缺少的任何 pfile,並指向該 spfile,如配置中所指示。

將數據庫註冊爲 Oracle RAC One 數據庫,這個數據庫有兩個候選服務器 drnode1 和 drnode2。此外,指示數據庫用作物理備用數據庫,並且僅啓動進入掛載模式。另外,還創建一個建議的服務。參見以下示例:

[oracle@drnode1 admin: RON]$ srvctl add database -d RONDG –o \

$ORACLE_HOME -c RACONENODE -e drnode1,drnode2 -w 10 -p
‘+DATA/RONDG/spfileRONDG.ora’ -r PHYSICAL_STANDBY -s mount

[RONDG_1]oracle@drnode1 $ srvctl add service -d RONDG -s \

RONDG_APP.example.com -e session

注意,如果未通過 srvctl add filesystem 在 OCR 中註冊 ACFS 資源(此時的確未註冊),則無法在此設置對 ACFS 資源的依賴關係。ACFS 掛載的註冊方式不同,它使用掛載註冊表。

[oracle@drnode1 ~] $ srvctl config database -d RONDG
Database unique name: RONDG
Database name:
Oracle home: /u01/app/oracle/product/11.2.0.2/
Oracle user: oracle
Spfile: +DATA/RONDG/spfileRONDG.ora
Domain: example.com
Start options: mount
Stop options: immediate
Database role: PHYSICAL_STANDBY
Management policy: AUTOMATIC
Server pools: RONDG
Database instances:
Disk Groups: DATA,FRA
Mount point paths:
Services: RONDG_APP.example.com
Type: RACOneNode
Online relocation timeout: 10
Instance name prefix: RONDG
Candidate servers: drnode1,drnode2
Database is administrator managed

[oracle@drnode1 ~] $ srvctl config service -d RONDG
Service name: RONDG_APP.example.com
Service is enabled
Server pool: RONDG
Cardinality: 1
Disconnect: false
Service role: PRIMARY
Management policy: AUTOMATIC
DTP transaction: false
AQ HA notifications: false
Failover type: SESSION
Failover method: NONE
TAF failover retries: 0
TAF failover delay: 0
Connection Load Balancing Goal: LONG
Runtime Load Balancing Goal: NONE
TAF policy specification: NONE
Edition:
Preferred instances: RONDG_1
Available instances:

Clusterware 管理的所有數據庫都應通過 srvctl 進行控制,而不是通過 SQL*Plus。使用以下命令啓動數據庫:

[oracle@drnode1 dbs]$ srvctl start database -d RONDG -n drnode1

[oracle@drnode1 dbs]$ srvctl status database -d RONDG
Instance RONDG_1 is running on node drnode1
Online relocation: INACTIVE

很好,Oracle Data Guard 配置的第一步完成!

回顧
在此階段我們暫停一下,以消化前面所做的工作:我們成功使用恢復管理器爲 Oracle RAC One 數據庫創建了備用數據庫。所有文件都在 ASM 中,ASM 負責文件名轉換。standby_file_management 初始化參數設置爲 auto,以防止發生名稱衝突。一個額外的好處是,ASM 在磁盤組 DATA 下創建了“子目錄”RONDG(主數據庫中的是 RON),便於我們區分主數據庫和備用數據庫。在此方面,任何減少人爲錯誤因素的行爲都是受歡迎的。

下一步涉及創建 Oracle Data Guard 配置,以允許在主集羣和備用集羣之間傳遞重做信息。現在焦點是 Oracle Data Guard Broker。爲便於跟着示例進行操作,我們選擇了命令行界面。

Broker 方法
Oracle 9i Database 中引入了 Oracle Data Guard Broker,在自動化至關重要或 IT 人員經驗可能不足的場合,該工具幫助極大。在 Oracle Database 10g 中,Broker 界面已得到擴展,它負責管理快速啓動故障切換特性,該特性可在高度自動化環境中自動執行角色轉換。

使用 broker 創建 Oracle Data Guard 配置的最輕鬆的方法是使用 Oracle Enterprise Manager Grid Control,不過,還有一種命令行界面形式的替代方法 — Data Guard Manager 命令行模式,即 dgmgrl。此方法可在任何可以使用 SSH 連接的主機上執行,且開銷極小。(因爲 dgmgrl 方法使用廣泛,所以在此主要討論這個方法。記住,broker 負責設置您手動設置的所有初始化參數。因此建議您不要在 Broker 界面之外修改任何與 Oracle Data Guard 有關的參數。)

Oracle Data Guard Broker 依靠兩個配置文件來存儲元信息。單實例用戶可能不會注意到這兩個文件,因爲其位置在此類配置中並非十分重要,默認設置即可正常工作。對於任何集羣環境(包括 Oracle RAC 和 Oracle RAC One Node),broker 配置文件需要位於共享存儲上。由於我們畢竟使用 ASM 作爲存儲後端,因此將 broker 配置文件放在此處再好不過。還可以使用一個支持的集羣文件系統。

配置初始化文件
您可以在 SQL*Plus 中定義 broker 配置文件,如在本示例中針對備用數據庫 RONDG 那樣:

SQL> alter system set dg_broker_config_file1=’+DATA/rondg/dr1.dat’;
SQL> alter system set dg_broker_config_file2=’+DATA/rondg/dr2.dat’;

不要忘記還要爲主數據庫設置該參數 — 會發生滾動變化:

SQL> alter system set dg_broker_config_file1=’+DATA/ron/dr1.dat’;
SQL> alter system set dg_broker_config_file2=’+DATA/ron/dr2.dat’;

如果本地監聽器未在默認端口 1521 監聽,且尚未設置初始化參數 local_listener,則須手動設置該參數。如果您不知道監聽器端口是什麼,可以執行 srvctl config listener 來查明該端口。除此之外,無需爲初始化文件進行進一步配置;broker 將負責所有其他配置。

現在在主數據庫和備用數據庫上啓動 broker:

SQL> alter system set dg_broker_start=true;

在 alert.log 中您可以看到 broker 進程啓動。

準備監聽器
在角色轉換期間,broker 將必須重新啓動數據庫實例。爲此,它需要靜態註冊的數據庫實例。默認情況下,靜態服務名將遵循 Oracle Data Guard Broker 的以下命名約定:

DB_NAME_DGMGRL.db_domain

如果該域存在,則添加該域非常重要!在本示例中,主數據庫將使用 RON_DGMGRL.example.com 作爲其靜態連接標識符。

(注意:記住,RON 數據庫的 ORACLE_SID 是動態的,您的實例與集羣節點之間沒有靜態映射!ORACLE_SID 將採用 dbUniqueName_N 形式,其中 N 可以是 1 或 2。如果您不喜歡,有一個選項可以通過定義自定義實例名前綴 [option -i to srvctl add database] 來偏離命名標準。大多數情況下您會發現數據庫使用 dbUniqueName_1 SID,但在遷移或意外停機期間您一定會看到 dbUniqueName_2 SID。)

每個可能的 ORACLE_SID 都需要在每個候選服務器的 listener.ora 中靜態註冊。在本示例中,RON 有 2 臺候選服務器,因此可以有兩個 ORACLE_SID:RON_1 和 RON_2。RONDG 同樣如此,它也有兩臺候選服務器。因此需要向其各自候選服務器的監聽器靜態註冊每個 ORACLE_SID。在 broker 的數據庫屬性 StaticConnectIdentifier 中可以看到此需求。

您需要修改 $GRID_HOME/network/admin/listener.ora 中的 listener.ora 文件以添加靜態連接標識符。以下是主集羣上監聽器的 SID_LIST 的一個示例(注意 SID_LIST_LISTENERNAME 是以前所沒有的)。服務名也已靜態註冊,這是可選的。

SID_LIST_LISTENER=

data guard broker

(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=RON_DGMGRL.example.com)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)
(SID_NAME=RON_1)
)
(SID_DESC=
(GLOBAL_DBNAME=RON_DGMGRL.example.com)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)
(SID_NAME=RON_2)
)

the same but not exclusively for the broker

(SID_DESC=
  (GLOBAL_DBNAME=RON.example.com)
  (ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)
  (SID_NAME=RON_1)
)
(SID_DESC=
  (GLOBAL_DBNAME=RON.example.com)
  (ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)
  (SID_NAME=RON_2)
)

)

所有其他服務均動態註冊。DR 集羣的 listener.ora 文件的設置如下所示:

SID_LIST_LISTENER=

data guard broker

(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=RONDG_DGMGRL.example.com)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)
(SID_NAME=RONDG_1)
)
(SID_DESC=
(GLOBAL_DBNAME=RONDG_DGMGRL.example.com)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)
(SID_NAME=RONDG_2)
)

the same but not exclusively for the broker

(SID_DESC=
  (GLOBAL_DBNAME=RONDG.example.com)
  (ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)
  (SID_NAME=RONDG_1)
)
(SID_DESC=
  (GLOBAL_DBNAME=RONDG.example.com)
  (ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)
  (SID_NAME=RONDG_2)
)

)

添加配置之後,重新加載了每個本地監聽器。

創建 Broker 配置
所有準備工作完成之後,就該啓動 dgmgrl 並創建配置了。Broker 要求以 SYSDBA 身份進行連接,用戶 martin 擁有該權限。或者,以 SYS 用戶身份連接到數據庫。

通過以下兩個步驟來創建 Broker 配置:第一步創建配置,第二步添加備用數據庫。最後,啓用該配置。以下是一個示例:

$ dgmgrl martin/xxx
DGMGRL for Linux: Version 11.2.0.2.0 - 64bit Production

Copyright (c) 2000, 2009, Oracle.All rights reserved.

Welcome to DGMGRL, type “help” for information.
Connected.
DGMGRL> CREATE CONFIGURATION brokertest as

PRIMARY DATABASE IS RON
CONNECT IDENTIFIER IS RON;
Configuration “brokertest” created with primary database “RON”

DGMGRL> add database RONDG

as connect identifier is RONDG
maintained as physical;
Database “RONDG” added

添加數據庫之後,可以檢查配置的狀態:

DGMGRL> show configuration verbose

Configuration - brokertest

Protection Mode: MaxPerformance
Databases:
RON - Primary database
RONDG - Physical standby database

Properties:
FastStartFailoverThreshold = ‘30’
OperationTimeout = ‘30’
FastStartFailoverLagLimit = ‘30’
CommunicationTimeout = ‘180’
FastStartFailoverAutoReinstate = ‘TRUE’
FastStartFailoverPmyShutdown = ‘TRUE’
BystandersFollowRoleChange = ‘ALL’

Fast-Start Failover: DISABLED

Configuration Status:
DISABLED

還可以逐個查看數據庫。可以使用“verbose”屬性顯示更多信息。

DGMGRL> show database verbose RON

Database - RON

Role: PRIMARY
Intended State: OFFLINE
Instance(s):
RON_1

Properties:
DGConnectIdentifier = ‘RON’
ObserverConnectIdentifier = ”
LogXptMode = ‘ASYNC’
DelayMins = ‘0’
Binding = ‘optional’
MaxFailure = ‘0’
MaxConnections = ‘1’
ReopenSecs = ‘300’
NetTimeout = ‘30’
RedoCompression = ‘DISABLE’
LogShipping = ‘ON’
PreferredApplyInstance = ”
ApplyInstanceTimeout = ‘0’
ApplyParallel = ‘AUTO’
StandbyFileManagement = ‘AUTO’
ArchiveLagTarget = ‘900’
LogArchiveMaxProcesses = ‘4’
LogArchiveMinSucceedDest = ‘1’
DbFileNameConvert = ”
LogFileNameConvert = ”
FastStartFailoverTarget = ”
InconsistentProperties = ‘(monitor)’
InconsistentLogXptProps = ‘(monitor)’
SendQEntries = ‘(monitor)’
LogXptStatus = ‘(monitor)’
RecvQEntries = ‘(monitor)’
SidName = ‘RON_1’
StaticConnectIdentifier = ‘(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.99.91)(PORT=2001))(CONNECT_DATA=(SERVICE_NAME=RON_DGMGRL.example.com)(INSTANCE_NAME=RON_1)(SERVER=DEDICATED)))’
StandbyArchiveLocation = ‘USE_DB_RECOVERY_FILE_DEST’
AlternateLocation = ”
LogArchiveTrace = ‘0’
LogArchiveFormat = ‘%t_%s_%r.dbf’
TopWaitEvents = ‘(monitor)’

Database Status:
DISABLED

此處值得注意的一個事實是 Broker 認識到 RON 實際是一個集羣數據庫。從上述輸出的前幾行中可以看出這點:

DGMGRL> show database verbose RON

Database - RON

Role: PRIMARY
Intended State: OFFLINE
Instance(s):
RON_1

類似地,可以查看備用數據庫的屬性:

DGMGRL> show database verbose RONDG

Database - RONDG

Role: PHYSICAL STANDBY
Intended State: OFFLINE
Transport Lag: (unknown)
Apply Lag: (unknown)
Real Time Query: OFF
Instance(s):
RONDG_2

Properties:
DGConnectIdentifier = ‘RONDG’
ObserverConnectIdentifier = ”
LogXptMode = ‘ASYNC’
DelayMins = ‘0’
Binding = ‘OPTIONAL’
MaxFailure = ‘0’
MaxConnections = ‘1’
ReopenSecs = ‘300’
NetTimeout = ‘30’
RedoCompression = ‘DISABLE’
LogShipping = ‘ON’
PreferredApplyInstance = ”
ApplyInstanceTimeout = ‘0’
ApplyParallel = ‘AUTO’
StandbyFileManagement = ‘AUTO’
ArchiveLagTarget = ‘900’
LogArchiveMaxProcesses = ‘4’
LogArchiveMinSucceedDest = ‘1’
DbFileNameConvert = ”
LogFileNameConvert = ”
FastStartFailoverTarget = ”
InconsistentProperties = ‘(monitor)’
InconsistentLogXptProps = ‘(monitor)’
SendQEntries = ‘(monitor)’
LogXptStatus = ‘(monitor)’
RecvQEntries = ‘(monitor)’
SidName = ‘RONDG_2’
StaticConnectIdentifier = ‘(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.99.99)(PORT=2001))(CONNECT_DATA=(SERVICE_NAME=RONDG_DGMGRL.example.com)(INSTANCE_NAME=RONDG_2)(SERVER=DEDICATED)))’
StandbyArchiveLocation = ‘USE_DB_RECOVERY_FILE_DEST’
AlternateLocation = ”
LogArchiveTrace = ‘0’
LogArchiveFormat = ‘%t_%s_%r.dbf’
TopWaitEvents = ‘(monitor)’

Database Status:
DISABLED

看看輸出中的 TopWaitEvents 行;您可以輕鬆查詢備用數據庫 和主數據庫上的主要等待事件。始終可獲取主(或邏輯備用)數據庫的前 n 個事件,這對於物理備用數據庫而言是新的。

從輸出來看,一切正常,因此我們來啓用配置。我們在主數據庫和備用數據庫上創建了備用重做日誌以解析“show configuration”輸出中的警告消息。(稍後我將詳細介紹如何創建備用重做日誌。)

DGMGRL> enable configuration
Enabled.

DGMGRL> show configuration verbose

Configuration - brokertest

Protection Mode: MaxPerformance
Databases:
RON - Primary database
RONDG - Physical standby database

Properties:
FastStartFailoverThreshold = ‘30’
OperationTimeout = ‘30’
FastStartFailoverLagLimit = ‘30’
CommunicationTimeout = ‘180’
FastStartFailoverAutoReinstate = ‘TRUE’
FastStartFailoverPmyShutdown = ‘TRUE’
BystandersFollowRoleChange = ‘ALL’

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

角色轉換
Oracle Data Guard 的一個主要目標是允許角色轉換。可能有兩種不同類型的角色轉換:正常轉換和故障切換。這兩個術語在口語中常常互換使用,但實際上卻有很大不同。

下面幾節說明如何執行它們。

執行正常轉換
準備好 Oracle Data Guard Broker 之後,可以輕鬆執行轉換操作。不必使用一些 SQL 命令來轉換角色,只需一個命令。至於配置,您需要使用 dgmgrl 工具來啓動轉換。您應以 SYSDBA 身份通過 Net*8 進行連接:

[oracle@node1 ~]$ dgmgrl sys/xxx@ron

妙處在於,只需鍵入一個命令即可啓動轉換。我們來看看下面這個示例:

DGMGRL> show configuration

Configuration - brokertest

Protection Mode: MaxPerformance
Databases:
RON - Primary database
RONDG - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

DGMGRL> switchover to RONDG
Performing switchover NOW, please wait…
New primary database “RONDG” is opening…
Operation requires shutdown of instance “RON_2” on database “RON”
Shutting down instance “RONDG_2”…
ORACLE instance shut down.
Operation requires startup of instance “RON_2” on database “RON”
Starting instance “RON_2”…
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is “RONDG”

這很簡單,對不對?如果您未向監聽器靜態註冊實例,則啓動命令將失敗。如果出現這種情況,您始終可以手動完成缺失的步驟。在“switchover succeeded, new primary is «RONDG»”行之後,可以驗證配置的新狀態:

DGMGRL> show configuration

Configuration - brokertest

Protection Mode: MaxPerformance
Databases:
RONDG - Primary database
RON - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

DGMGRL> exit

轉換過程到此結束。要在方便的時候切換回 RON 數據庫,請使用同一過程並互換數據庫名稱。

執行故障切換操作
與轉換操作類似,Broker 界面極大地簡化了執行故障切換操作的任務。故障切換可以是完全的(complete,默認值)也可以是立即的 (immediate)。默認故障切換在激活備用數據庫之前嘗試恢復儘可能多的重做信息,從而儘量減少數據損失。對於計劃的受控故障切換測試,建議在掛載主數據庫時使用 alter system flush redo to db_unique_name confirm apply 語句刷新所有重做來避免數據損失。(注意 ALTER SYSTEM FLUSH REDO 引起的錯誤 9044026 ORA-16447,這個錯誤影響低於 Oracle 11.2.0.2 的版本,導致在某些條件下不能刷新重做。)

在進行故障切換之前,我們先來看看當前配置:

DGMGRL> show configuration

Configuration - brokertest

Protection Mode: MaxPerformance
Databases:
RON - Primary database
RONDG - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

該配置工作正常,沒有出現警告。瞭解了這些之後,我們就可以執行故障切換了,如下所示:

DGMGRL> failover to RONDG
Performing failover NOW, please wait…
Failover succeeded, new primary is “RONDG”
DGMGRL> show configuration

Configuration - brokertest

Protection Mode: MaxPerformance
Databases:
RONDG - Primary database
RON - Physical standby database (disabled)
ORA-16661: the standby database needs to be reinstated

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

如您所見,故障切換已完成,但需要恢復新的備用數據庫 RON。啓用閃回數據庫之後,broker 可以使用 reinstate database 命令完成此操作,如以下示例所示:

DGMGRL> reinstate database RON
Reinstating database “RON”, please wait…
Reinstatement of database “RON” succeeded
DGMGRL> show configuration

Configuration
Name: brokertest
Enabled: YES
Protection Mode: MaxPerformance
Fast-Start Failover: DISABLED
Databases:
RONDG - Primary database
RON - Physical standby database

Current status for “brokertest”:
SUCCESS

DGMGRL>

如果自動恢復失敗,很可能需要從備份恢復數據庫。作爲最後一種辦法,您可以嘗試使用 flashback database 命令將數據庫閃回到主數據庫激活時的點(v$database 視圖中包含了此信息)。

總結
至此已有許多信息需要消化。本文旨在說明 Oracle RAC One Node 和任何其他 Oracle 數據庫類型一樣可輕鬆使用 Oracle Data Guard。遵循本文描述的原則,您可以順暢地進行故障切換及後續轉換操作。

和往常一樣,請經常實踐 DR 策略並記下需要遵守的過程。許多 DBA 都親身體驗到數據庫的角色轉換通常是 DR 場景中較爲輕鬆的部分。

在第 2 部分,我們將研究更高級的 Oracle Data Guard 手動配置方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章