oracle dataguard 切換
http://blog.csdn.net/tianlesoftware/article/details/5901053
Oracle 高可用性的三個主要體現是: RAC, Data Guard 和 Stream. 所以熟練掌握這些技術就是評價DBA的標準一個。 RAC + Data Guard 主要用在災備或者報表伺服器上。 比如用RAC+ 邏輯standby 做報表,從而減輕RAC 系統的壓力。
關於Data Guard 的一些原理知識可以參考:
Oracle Data Guard 理論知識
http://blog.csdn.net/tianlesoftware/archive/2010/04/22/5514082.aspx
Oracle Data Gurad Physical Standby 相關說明
http://blog.csdn.net/tianlesoftware/archive/2010/05/04/5557410.aspx
RAC 的知識參考:
RAC 的一些概念性和原理性的知識
http://blog.csdn.net/tianlesoftware/archive/2010/02/27/5331067.aspx
Redhat 5.4 + ASM + RAW+ Oracle 10g RAC 安裝文件
http://blog.csdn.net/tianlesoftware/archive/2010/09/09/5872593.aspx
RAC 和 Data Guard 的組合有4種情況:
組合
Primary
Standby
1
Single Instance
Single Instance
2
Single Instance
RAC
3
RAC
Single Instance
4
RAC
RAC
在RAC + DG 平臺下,重用的幾個檢視:
(1) v$archive_dest_status: 在Standby Database 上可以在這個檢視中檢視接收的日誌編號,恢復的日誌編號,從而可以瞭解Standby Database 和 Primary Database 日誌的差別。 如果standby 比Primary 滯後太多,可以考慮增加恢復程式。 該檢視中的recovery_mode 列也顯示了是否使用了實時恢復(Real-Time Apply).
(2) v$archive_dest: 這個檢視中的error 列可以用於輔助診斷。
(3) v$managed_standby: 這個檢視可以確認standby RAC中,哪個例項是執行recover 的例項。
下面實驗是RAC + Single standby 的模式。
一. 測試環境
1.1 RAC Primary Database 環境
RAC primary
Rac1
Rac2
Public IP
10.85.10.1
10.85.10.2
Private IP
192.168.1.200
192.168.1.201
Virtual IP
10.85.10.3
10.85.10.4
Instance
Orcl1
Orcl2
DB_NAME
Orcl
Data,Control File, Redo File
ASM
1.2 Standby Database 環境
Single Instance Standby
說明
IP
10.85.10.5
Oracle
非RAC 版本
Instance
Orcl
Data,Control File,Redo File
/u01
二.配置說明
1.3 switchover 之前,這時RAC是Primary Database
(1) RAC的每個例項都要配置日誌傳送,目的地指向Standby。
(2) 確認日誌傳送的方法。如:LGWR
(3) Standby 配置日誌接收方法,如:standby redo log。
(4) 啟動MRP
1.4 switchover 之後,此時,rac 是standby database
如果Standby 是RAC,則日誌接收和日誌恢復可以是不同的Instance。 因此Oracle 在術語上把這兩種例項分別叫作Receive Instance 和 Recover Instance。 在這個實驗中,放在一個例項上進行。
(1) Single Instance 的日誌只傳送到RAC的一個例項。
(2) 確認RAC 的日誌接收方法,如: Standby Redo Log。
(3) 在RAC的一個例項上啟動MRP.
三. 開始搭建
3.1 主庫歸檔模式設定
Data Guard 用的歸檔日誌來完成同步, 所以在實驗之前, 主庫必須是歸檔模式。 這裡就RAC 的歸檔。 關於RAC的歸檔參考Blog RAC 之 RMAN 備份中的1.2 節。 設定歸檔就那麼幾步, 設定好歸檔目錄,然後關閉所以節點,最後在一個節點上將模式設定為歸檔就ok了。
RAC 之 RMAN 備份
http://blog.csdn.net/tianlesoftware/archive/2010/09/22/5901053.aspx
3.2 準備備庫環境
安裝Oracle軟體,並建立例項的相關目錄。Linux 平臺上Oracle 的安裝參考blog:
linux平臺下oracle資料庫安裝
http://blog.csdn.net/tianlesoftware/archive/2009/10/24/4718218.aspx
在備庫建立相關目錄
mkdir -p $ORACLE_BASE/oradata/orcl/datafile
mkdir -p $ORACLE_BASE/oradata/orcl/tempfile
mkdir -p $ORACLE_BASE/admin/orcl/adump
mkdir -p $ORACLE_BASE/admin/orcl/bdump
mkdir -p $ORACLE_BASE/admin/orcl/cdump
mkdir -p $ORACLE_BASE/admin/orcl/dpdump
mkdir -p $ORACLE_BASE/admin/orcl/hdump
mkdir -p $ORACLE_BASE/admin/orcl/pfile
mkdir -p $ORACLE_BASE/admin/orcl/udump
這裡要注意的地方:
因為RAC 主庫是用ASM 來存放的,所以這裡設定的目錄,與ASM 目錄是不一致的, 這種情況下,我們就需要在引數檔案裡用db_file_name_convert和 log_file_name_convert 引數來進行轉換。
3.3 配置主備庫的監聽,修改tnsnames.ora 和 listener.ora 檔案
主備庫的tnsnames.ora 檔案是一致的。 修改成如下:
ORCL2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
(INSTANCE_NAME = orcl2)
)
)
ORCL1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
(INSTANCE_NAME = orcl1)
)
)
ORCL_ST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =10.85.10.5 )(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = orcl)
)
)
這裡要注意RAC 例項和單例項配置上的區別。 上面以用紅色標出。
用net manager 工具,在備庫建立一個監聽。 也可以手動的在listener.ora 檔案裡新增如下內容:
SID_LIST_LISTENER_RAC2 =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.10.5)(PORT = 1521))
)
注意:SID_LIST_LISTENER 配置的是靜態註冊,如果沒有該引數,而且Data Guard 啟動順序又不正確,那麼在主庫可能會報 PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514. 錯誤,導致歸檔無法完成。
Oracle Listener 動態註冊 與 靜態註冊
http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5543166.aspx
3.4 在主庫上建立備庫的密碼檔案和控制檔案,並將檔案傳到備庫的相關位置
3.4.1 密碼檔案:
[oracle@rac2 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@rac2 bin]$ orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle
[oracle@rac2 bin]$ cd $ORACLE_HOME/dbs/
[oracle@rac2 dbs]$ ls
ab_+ASM2.dat init+ASM2.ora initorcl2.ora orapworcl1
hc_+ASM2.dat initdw.ora orapw+ASM2 orapworcl2
hc_orcl2.dat init.ora orapworcl snapcf_orcl2.f
預設情況下,win下口令檔案的格式是pwdsid.ora,unix下的格式是orapwSID(大小寫敏感)
參考:
Oracle OS認證 口令檔案 密碼丟失處理
http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4698293.aspx
傳送檔案:
[oracle@rac2 dbs]$ scp orapworcl 10.85.10.5://u01/app/oracle/product/10.2.0/db_1/dbs
orapworcl 100% 1536 1.5KB/s 00:00
[oracle@rac2 dbs]$
3.4.2 控制檔案
[oracle@rac1 admin]$ export ORACLE_SID=orcl1
[oracle@rac1 admin]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 8 03:39:00 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn system/oracle;
Connected.
SQL> alter database create standby controlfile as '/u01/control01.ctl';
Database altered.
SQL>
--判斷一個資料庫是Primary還是Standby,就是通過控制檔案來判斷的。
傳送檔案:
[oracle@rac1 u01]$ scp control01.ctl 10.85.10.5://u01/app/oracle/oradata/orcl/datafile
control01.ctl 100% 15MB 1.4MB/s 00:11
在備庫上將控制檔案複製2份,並命名為control02.ctl, control03.ctl
[oracle@rac3 orcl]$ cp control01.ctl control02.ctl
[oracle@rac3 orcl]$ cp control01.ctl control03.ctl
[oracle@rac3 orcl]$ ls
control01.ctl control02.ctl control03.ctl
3.5 引數檔案
3.5.1 主庫的引數檔案
先用spfile 來建立pfile 檔案。 這裡要注意的,不要直接用create pfile from spfile來建立。 至於為什麼參考Blog:
RAC 修改 spfile 引數
http://blog.csdn.net/tianlesoftware/archive/2010/09/24/5902591.aspx
[oracle@rac1 u01]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 8 04:33:51 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> create pfile='/u01/tmp.ora' from spfile;
File created.
SQL> !
[oracle@rac1 u01]$ cd /u01
[oracle@rac1 u01]$ ls
app dave.log RAC_hot_database_backup.sh.out
backup dave.ora tianlesoftware.dmp
control01.ctl impdp.log tmp.ora
dave_2010929.dmp RAC_hot_database_backup.sh
[oracle@rac1 u01]$ more tmp.ora
通過more 命令,我們就可以看到rac pfile 引數的內容,對於RAC 主庫,我們不需要做什麼修改,只需要新增如下內容:
*.log_archive_config='dg_config=(orcl,orcl_st)'
*.log_archive_dest_3='service=orcl_st VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=orcl_st'
*.db_file_name_convert=' /u01/app/oracle/oradata/orcl/datafile','+DATA/orcl/datafile',
' /u01/app/oracle/oradata/orcl/tempfile','+DATA/orcl/tempfile'
*.log_file_name_convert=' /u01/app/oracle/oradata/orcl/datafile', '+DATA/orcl/datafile'
*.standby_file_management=auto
*.fal_server='orcl_st'
orcl1.fal_client='orcl1'
orcl2.fal_client='orcl2'
這裡要注意的地方:如果之前配置了例項之間歸檔檔案的互相傳送,那麼這裡需要加上db_unique_name 引數:
orcl2.log_archive_dest_2='service=orcl1 db_unique_name=orcl'
orcl1.log_archive_dest_2='service=orcl2 db_unique_name=orcl'
不然在啟動時會報如下錯誤:
BAD PARAM ORA-16052: DB_UNIQUE_NAME attribute is required
查詢Data Guard 的db_unique_name 可以通過v$dagatuard_config檢視:
SQL> select * from v$dataguard_config;
DB_UNIQUE_NAME
------------------------------
orcl
orcl_st
如果之前沒有新增,可以通過修改pfile,在用pfile 建立spfile,或者用SQL, 如:
SQL> alter system set log_archive_dest_2='service=orcl1 db_unique_name=orcl' sid='orcl2';
關於這些引數的意義,可以參考:
Oracle Data Guard 理論知識
http://blog.csdn.net/tianlesoftware/archive/2010/04/22/5514082.aspx
一些說明:
(1) 使用ASM 作儲存時,datafile 和tempfile 是分別放在兩個目錄下的,所以在standby 上也單獨建立一個tempdata 目錄,並在db_file_convert 中作相應的設定。
(2) 在使用ASM的RAC中,注意不要修改db_unique_name 的引數值,因為ASM 存放檔案的規則,是按照+diskgroup_name/database_unique_name/file_type/tag_name.file_number.incarnation 這樣一個規則存放的,但是第二項database_unique_name 並不是db_name; 如果改變了db_unique_name,則之後建立的資料檔案會放到新的目錄下,會導致db_file_convert的失敗,這一點需要特別注意。
(3) 如果RAC中使用db_create_online_dest_n 系列的引數,要相應調整standby 上的log_file_name_convert 引數。
第一點裡提到ASM 分開存放檔案,我們可以用asmcmd 命令連上ASM 驗證一下:
[oracle@rac2 +ASM]$ export ORACLE_SID=+ASM2
[oracle@rac2 +ASM]$ asmcmd
ASMCMD> ls
DATA/
FLASH_RECOVERY_AREA/
ASMCMD> cd DATA
ASMCMD> ls
ORCL/
ASMCMD> cd ORCL/
ASMCMD> ls
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
spfileorcl.ora
ASMCMD> cd TEMPFILE
ASMCMD> ls
TEMP.283.730181265
3.5.2 備庫的引數檔案
備庫的初始化檔案,在主庫的基礎上修改一下,把不用的刪除掉就可以了。 對於設計到Data Guard的引數,修改一下引數的值就可以了。 最終備庫的引數如下:
[oracle@rac3 dbs]$ more initorcl.ora
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.background_dump_dest='/u01/app/oracle/admin/orcl/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/orcl/datafile/control01.ctl','/u01/app/oracle/oradata/orcl/
datafile/control02.ctl','/u01/app/oracle/oradata/orcl/datafile/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/orcl/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='orcl'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.job_queue_processes=10
*.log_archive_dest_1='LOCATION=/u01/arch'
*.log_archive_dest_state_2='ENABLE'
*.open_cursors=300
*.pga_aggregate_target=59768832
*.processes=150
*.remote_login_passwordfile='exclusive'
*.sga_target=179306496
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/orcl/udump'
*.db_unique_name=orcl_st -- 注意,這個值要和主庫參log_archive_dest_n裡設定的一致,不然會報錯誤:ORA-16047: DGID mismatch between destination
*.log_archive_config='dg_config=(orcl,orcl_st)'
*.log_archive_dest_2='service=orcl1 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=orcl1'
*.db_file_name_convert='+DATA/orcl/datafile','/u01/app/oracle/oradata/orcl/datafile','+DATA/orcl/tem
pfile','/u01/app/oracle/oradata/orcl/tempfile'
*.log_file_name_convert='+DATA/orcl/onlinelog','/u01/app/oracle/oradata/orcl/datafile',
'+FLASH_RECOVERY_AREA/orcl/onlinelog','/u01/app/oracle/oradata/orcl/datafile'
*.standby_file_management=auto
*.standby_archive_dest='/u01/arch'
*.fal_server='orcl1','orcl2'
*.fal_client='orcl2'
這裡面關於log_file_name_conver 引數:
先從主庫檢視v$logfile:
SQL>Select * from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- -----------------------------------------------------
2 ONLINE +DATA/orcl/onlinelog/group_2.282.730181191
2 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.262.73018
1 ONLINE +DATA/orcl/onlinelog/group_1.281.730181173
1 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.261.73018
3 ONLINE +DATA/orcl/onlinelog/group_3.285.730181443
3 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.263.73018
4 ONLINE +DATA/orcl/onlinelog/group_4.286.730181451
4 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.264.73018
如果這裡除了+DATA,還有+FLASH_RECOVERY_AREA, 那麼這些redo 都需要在引數裡指定進行轉換。 不然通過rman ,這些路徑也會被複制過去,但是standby上是無法訪問這些路徑的,所以在做switchover 切換的時候,就會報錯。 這點是要注意的地方。
3.6 RMAN 備份主庫並將備份檔案傳到standby上
這裡用的是RMAN 複製的方法來搭建standby 環境。 可以參考我的Blog:
用RMAN複製 搭建 物理 Data Gurad 環境
http://blog.csdn.net/tianlesoftware/archive/2010/07/23/5756750.aspx
備份檔案,放在/u01/rmanback 目錄下,我們在rac1節點進行備份。 在standby 節點也需要建同樣的目錄,還需要把備份檔案copy到這個目錄下。
[oracle@rac1 bin]$ rman target /
Recovery Manager: Release 10.2.0.1.0 - Production on Fri Oct 8 12:13:07 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: ORCL (DBID=1257961898)
RMAN> RUN {
allocate channel c1 type disk;
allocate channel c2 type disk;
sql 'alter system archive log current';
backup current controlfile for standby format='/u01/rmanbackup/control_%U';
BACKUP FORMAT '/u01/rmanbackup/orcl_%U_%T' skip inaccessible filesperset 5 DATABASE ;
sql 'alter system archive log current';
BACKUP FORMAT '/u01/rmanbackup/arch_%U_%T' skip inaccessible filesperset 5 ARCHIVELOG ALL DELETE INPUT;
release channel c2;
release channel c1;
}
SCP 拷貝到 standby 上:
[oracle@rac1 rmanbackup]$ scp * 10.85.10.5://u01/rmanbackup/
RMAN備份有一些注意事項,具體參考我的blog:
RAC 之 RMAN 備份
http://blog.csdn.net/tianlesoftware/archive/2010/09/22/5901053.aspx
3.7用之前建立的初始化引數檔案將備庫啟動到nomount 狀態:
啟動監聽:
[oracle@rac3 admin]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 08-OCT-2010 12:41:43
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.85.10.5)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.85.10.5)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 08-OCT-2010 12:41:43
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.85.10.5)(PORT=1521)))
The listener supports no services
The command completed successfully
啟動資料庫:
[oracle@rac3 u01]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 8 12:37:08 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup nomount pfile=?/dbs/initorcl.ora
ORACLE instance started.
Total System Global Area 180355072 bytes
Fixed Size 1218388 bytes
Variable Size 62916780 bytes
Database Buffers 113246208 bytes
Redo Buffers 2973696 bytes
SQL>
3.8 rman還原資料庫:
[oracle@rac1 admin]$ rman target / auxiliary sys/oracle@orcl_st
Recovery Manager: Release 10.2.0.1.0 - Production on Fri Oct 8 13:25:31 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: ORCL (DBID=1257961898)
connected to auxiliary database: ORCL (not mounted)
RMAN> duplicate target database for standby;
…
Finished Duplicate Db at 09-OCT-10
3.9 檢查standby 資料庫
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/datafile/system.276.730181051
/u01/app/oracle/oradata/orcl/datafile/undotbs1.278.730181053
/u01/app/oracle/oradata/orcl/datafile/sysaux.277.730181053
/u01/app/oracle/oradata/orcl/datafile/users.279.730181053
/u01/app/oracle/oradata/orcl/datafile/undotbs2.284.730181347
/u01/app/oracle/oradata/orcl/datafile/tianlesoftware.dbf
/u01/app/oracle/oradata/orcl/datafile/anhuianqing.dbf
7 rows selected.
SQL> select name from v$tempfile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/tempfile/temp.283.730181265
將備庫啟動到mount standby 狀態,並啟動MRP 程式:
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 180355072 bytes
Fixed Size 1218388 bytes
Variable Size 62916780 bytes
Database Buffers 113246208 bytes
Redo Buffers 2973696 bytes
SQL> alter database mount standby database;
Database altered.
SQL> recover managed standby database disconnect from session;
Media recovery complete.
SQL>
3.10 新增standby redo log 日誌
RAC 每個Redo Thread 都需要建立對應的Standby Redo Log。 建立原則和單例項一樣,包括日誌檔案大小相等,日誌組數量要多1組。
在RAC裡檢視聯機日誌:
[oracle@rac2 rmanbackup]$ export ORACLE_SID=orcl2
[oracle@rac2 rmanbackup]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Oct 9 03:49:49 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba;
Connected.
SQL> select thread#,group#,bytes/1024/1024 from v$log;
THREAD# GROUP# BYTES/1024/1024
---------- ---------- ---------------
1 1 50
1 2 50
2 3 50
2 4 50
從上面的結果看出, RAC 有兩個Redo Thread,每個Thread 有兩個日誌組,每個日誌檔案大小有50MB,所以要針對每個thread 需要建立3組 Standby Redo Log,大小為50MB。
Alter database add standby logfile thread 1 group 5 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_05.log') size 50m;
Alter database add standby logfile thread 1 group 6 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_06.log') size 50m;
Alter database add standby logfile thread 1 group 7 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_07.log') size 50m;
Alter database add standby logfile thread 2 group 8 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_08.log') size 50m;
Alter database add standby logfile thread 2 group 9 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_09.log') size 50m;
Alter database add standby logfile thread 2 group 10 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_10.log') size 50m;
新增完可以用: select * from v$logfile 檢視日誌情況。
3.11 先停止RAC 例項,然後用之前建立的pfile 啟動rac 例項。
[oracle@rac1 u01]$ cd /u01/app/oracle/product/crs/bin/
[oracle@rac1 bin]$ srvctl stop database -d orcl
[oracle@rac1 bin]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.orcl.db application OFFLINE OFFLINE
ora....oltp.cs application OFFLINE OFFLINE
ora....cl1.srv application OFFLINE OFFLINE
ora....cl2.srv application OFFLINE OFFLINE
ora....l1.inst application OFFLINE OFFLINE
ora....l2.inst application OFFLINE OFFLINE
ora....SM1.asm application ONLINE ONLINE rac1
ora....C1.lsnr application ONLINE ONLINE rac1
ora.rac1.gsd application ONLINE ONLINE rac1
ora.rac1.ons application ONLINE ONLINE rac1
ora.rac1.vip application ONLINE ONLINE rac1
ora....SM2.asm application ONLINE ONLINE rac2
ora....C2.lsnr application ONLINE ONLINE rac2
ora.rac2.gsd application ONLINE ONLINE rac2
ora.rac2.ons application ONLINE ONLINE rac2
ora.rac2.vip application ONLINE ONLINE rac2
[oracle@rac1 bin]$ export ORACLE_SID=orcl1
[oracle@rac1 bin]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Oct 9 05:27:55 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba;
Connected to an idle instance.
SQL> create spfile from pfile='/u01/tmp.ora';
File created.
啟動所有節點:
SQL> startup
ORACLE instance started.
Total System Global Area 180355072 bytes
Fixed Size 1218388 bytes
Variable Size 109054124 bytes
Database Buffers 67108864 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
這裡有遇到了點麻煩,參考:
ORA-01677 standby file name convert parameters differ from other instance 錯誤
http://blog.csdn.net/tianlesoftware/archive/2010/10/09/5930227.aspx
3.12 在主庫檢視日誌傳送情況
SQL> Select dest_name,status,error from v$archive_dest;
DEST_NAME STATUS ERROR
-------------------- --------- -------------------------------------------------
LOG_ARCHIVE_DEST_1 VALID
LOG_ARCHIVE_DEST_2 VALID
LOG_ARCHIVE_DEST_3 VALID
LOG_ARCHIVE_DEST_4 INACTIVE
LOG_ARCHIVE_DEST_5 INACTIVE
LOG_ARCHIVE_DEST_6 INACTIVE
LOG_ARCHIVE_DEST_7 INACTIVE
LOG_ARCHIVE_DEST_8 INACTIVE
LOG_ARCHIVE_DEST_9 INACTIVE
LOG_ARCHIVE_DEST_10 INACTIVE
10 rows selected.
兩個節點都正常。
3.13 驗證同步情況
在主備庫分別切換日誌:
SQL> alter system switch logfile;
System altered.
SQL> select sequence# from v$archived_log;
SEQUENCE#
----------
…
15
16
SQL> alter system switch logfile;
System altered.
SQL> select sequence# from v$archived_log;
SEQUENCE#
----------
…
17
18
在備庫進行驗證:
SQL> select sequence#,applied from v$archived_log;
SEQUENCE# APP
---------- ---
…
13 YES
4 NO
14 YES
15 YES
16 YES
18 NO
16 YES
17 YES
18 YES
19 YES
同步成功。 至此RAC 為主庫的,備庫為單例項的 Oracle 的Data Guard 環境已經搭建完成。
四. Switchover 切換
之前blog上的一篇單例項間切換的例子:
Oracle Data Guard Switchover 切換
http://blog.csdn.net/tianlesoftware/archive/2010/07/27/5768602.aspx
RAC 環境下,切換Primary 和 Standby 時,只能有一個例項是活動的, 其他例項必須關閉。
這裡我們關閉rac2節點。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
orcl2
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
在RAC1 節點將主庫切換到備庫:
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
orcl1
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE
SQL> alter database commit to switchover to physical standby with session shutdown;
Database altered.
SQL> shutdown immediate;
將備庫切換成主庫:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY with session shutdown;
SQL> shutdown immediate;
在rac1(原來的主庫)節點上建立standby redo log file:
SQL> select thread#,group#,bytes/1024/1024 from v$log;
THREAD# GROUP# BYTES/1024/1024
---------- ---------- ---------------
1 1 50
1 2 50
2 3 50
2 4 50
SQL> alter database add standby logfile thread 1 group 5 size 50m;
SQL> alter database add standby logfile thread 1 group 6 size 50m;
SQL> alter database add standby logfile thread 1 group 7 size 50m;
SQL> alter database add standby logfile thread 2 group 8 size 50m;
SQL> alter database add standby logfile thread 2 group 9 size 50m;
SQL> alter database add standby logfile thread 2 group 10 size 50m;
新增之後可以通過v$logfile 檢視檢視:
SQL> select * from v$logfile;
rows will be truncated
GROUP# STATUS TYPE MEMBER
---------- ------- ------- -----------------------------------------------------
2 ONLINE +DATA/orcl/onlinelog/group_2.282.730181191
2 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.262.73018
1 ONLINE +DATA/orcl/onlinelog/group_1.281.730181173
1 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.261.73018
3 ONLINE +DATA/orcl/onlinelog/group_3.285.730181443
3 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.263.73018
4 ONLINE +DATA/orcl/onlinelog/group_4.286.730181451
4 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.264.73018
5 STANDBY +DATA/orcl/onlinelog/group_5.292.731930683
5 STANDBY +FLASH_RECOVERY_AREA/orcl/onlinelog/group_5.268.73193
…
Standby 日誌新增完之後,就可以啟動例項了。 同樣要注意的是, 如果standby 是RAC 環境, MRP 只能在一個例項上執行,這和RAC的恢復操作一樣,而其他例項只能執行RFS。
這種切換的意義並不大,RAC 本身就是一個高可用性的系統,它有多個節點可以規避當機的風險。 RAC + 邏輯standby 這種用法還是比較常見。 我們公司目前也是用這種搭配方法,邏輯standby 用來做報表資料庫。
Oracle 高可用性的三個主要體現是: RAC, Data Guard 和 Stream. 所以熟練掌握這些技術就是評價DBA的標準一個。 RAC + Data Guard 主要用在災備或者報表伺服器上。 比如用RAC+ 邏輯standby 做報表,從而減輕RAC 系統的壓力。
關於Data Guard 的一些原理知識可以參考:
Oracle Data Guard 理論知識
http://blog.csdn.net/tianlesoftware/archive/2010/04/22/5514082.aspx
Oracle Data Gurad Physical Standby 相關說明
http://blog.csdn.net/tianlesoftware/archive/2010/05/04/5557410.aspx
RAC 的知識參考:
RAC 的一些概念性和原理性的知識
http://blog.csdn.net/tianlesoftware/archive/2010/02/27/5331067.aspx
Redhat 5.4 + ASM + RAW+ Oracle 10g RAC 安裝文件
http://blog.csdn.net/tianlesoftware/archive/2010/09/09/5872593.aspx
RAC 和 Data Guard 的組合有4種情況:
組合
Primary
Standby
1
Single Instance
Single Instance
2
Single Instance
RAC
3
RAC
Single Instance
4
RAC
RAC
在RAC + DG 平臺下,重用的幾個檢視:
(1) v$archive_dest_status: 在Standby Database 上可以在這個檢視中檢視接收的日誌編號,恢復的日誌編號,從而可以瞭解Standby Database 和 Primary Database 日誌的差別。 如果standby 比Primary 滯後太多,可以考慮增加恢復程式。 該檢視中的recovery_mode 列也顯示了是否使用了實時恢復(Real-Time Apply).
(2) v$archive_dest: 這個檢視中的error 列可以用於輔助診斷。
(3) v$managed_standby: 這個檢視可以確認standby RAC中,哪個例項是執行recover 的例項。
下面實驗是RAC + Single standby 的模式。
一. 測試環境
1.1 RAC Primary Database 環境
RAC primary
Rac1
Rac2
Public IP
10.85.10.1
10.85.10.2
Private IP
192.168.1.200
192.168.1.201
Virtual IP
10.85.10.3
10.85.10.4
Instance
Orcl1
Orcl2
DB_NAME
Orcl
Data,Control File, Redo File
ASM
1.2 Standby Database 環境
Single Instance Standby
說明
IP
10.85.10.5
Oracle
非RAC 版本
Instance
Orcl
Data,Control File,Redo File
/u01
二.配置說明
1.3 switchover 之前,這時RAC是Primary Database
(1) RAC的每個例項都要配置日誌傳送,目的地指向Standby。
(2) 確認日誌傳送的方法。如:LGWR
(3) Standby 配置日誌接收方法,如:standby redo log。
(4) 啟動MRP
1.4 switchover 之後,此時,rac 是standby database
如果Standby 是RAC,則日誌接收和日誌恢復可以是不同的Instance。 因此Oracle 在術語上把這兩種例項分別叫作Receive Instance 和 Recover Instance。 在這個實驗中,放在一個例項上進行。
(1) Single Instance 的日誌只傳送到RAC的一個例項。
(2) 確認RAC 的日誌接收方法,如: Standby Redo Log。
(3) 在RAC的一個例項上啟動MRP.
三. 開始搭建
3.1 主庫歸檔模式設定
Data Guard 用的歸檔日誌來完成同步, 所以在實驗之前, 主庫必須是歸檔模式。 這裡就RAC 的歸檔。 關於RAC的歸檔參考Blog RAC 之 RMAN 備份中的1.2 節。 設定歸檔就那麼幾步, 設定好歸檔目錄,然後關閉所以節點,最後在一個節點上將模式設定為歸檔就ok了。
RAC 之 RMAN 備份
http://blog.csdn.net/tianlesoftware/archive/2010/09/22/5901053.aspx
3.2 準備備庫環境
安裝Oracle軟體,並建立例項的相關目錄。Linux 平臺上Oracle 的安裝參考blog:
linux平臺下oracle資料庫安裝
http://blog.csdn.net/tianlesoftware/archive/2009/10/24/4718218.aspx
在備庫建立相關目錄
mkdir -p $ORACLE_BASE/oradata/orcl/datafile
mkdir -p $ORACLE_BASE/oradata/orcl/tempfile
mkdir -p $ORACLE_BASE/admin/orcl/adump
mkdir -p $ORACLE_BASE/admin/orcl/bdump
mkdir -p $ORACLE_BASE/admin/orcl/cdump
mkdir -p $ORACLE_BASE/admin/orcl/dpdump
mkdir -p $ORACLE_BASE/admin/orcl/hdump
mkdir -p $ORACLE_BASE/admin/orcl/pfile
mkdir -p $ORACLE_BASE/admin/orcl/udump
這裡要注意的地方:
因為RAC 主庫是用ASM 來存放的,所以這裡設定的目錄,與ASM 目錄是不一致的, 這種情況下,我們就需要在引數檔案裡用db_file_name_convert和 log_file_name_convert 引數來進行轉換。
3.3 配置主備庫的監聽,修改tnsnames.ora 和 listener.ora 檔案
主備庫的tnsnames.ora 檔案是一致的。 修改成如下:
ORCL2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
(INSTANCE_NAME = orcl2)
)
)
ORCL1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
(INSTANCE_NAME = orcl1)
)
)
ORCL_ST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =10.85.10.5 )(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = orcl)
)
)
這裡要注意RAC 例項和單例項配置上的區別。 上面以用紅色標出。
用net manager 工具,在備庫建立一個監聽。 也可以手動的在listener.ora 檔案裡新增如下內容:
SID_LIST_LISTENER_RAC2 =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.10.5)(PORT = 1521))
)
注意:SID_LIST_LISTENER 配置的是靜態註冊,如果沒有該引數,而且Data Guard 啟動順序又不正確,那麼在主庫可能會報 PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514. 錯誤,導致歸檔無法完成。
Oracle Listener 動態註冊 與 靜態註冊
http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5543166.aspx
3.4 在主庫上建立備庫的密碼檔案和控制檔案,並將檔案傳到備庫的相關位置
3.4.1 密碼檔案:
[oracle@rac2 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@rac2 bin]$ orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle
[oracle@rac2 bin]$ cd $ORACLE_HOME/dbs/
[oracle@rac2 dbs]$ ls
ab_+ASM2.dat init+ASM2.ora initorcl2.ora orapworcl1
hc_+ASM2.dat initdw.ora orapw+ASM2 orapworcl2
hc_orcl2.dat init.ora orapworcl snapcf_orcl2.f
預設情況下,win下口令檔案的格式是pwdsid.ora,unix下的格式是orapwSID(大小寫敏感)
參考:
Oracle OS認證 口令檔案 密碼丟失處理
http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4698293.aspx
傳送檔案:
[oracle@rac2 dbs]$ scp orapworcl 10.85.10.5://u01/app/oracle/product/10.2.0/db_1/dbs
orapworcl 100% 1536 1.5KB/s 00:00
[oracle@rac2 dbs]$
3.4.2 控制檔案
[oracle@rac1 admin]$ export ORACLE_SID=orcl1
[oracle@rac1 admin]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 8 03:39:00 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn system/oracle;
Connected.
SQL> alter database create standby controlfile as '/u01/control01.ctl';
Database altered.
SQL>
--判斷一個資料庫是Primary還是Standby,就是通過控制檔案來判斷的。
傳送檔案:
[oracle@rac1 u01]$ scp control01.ctl 10.85.10.5://u01/app/oracle/oradata/orcl/datafile
control01.ctl 100% 15MB 1.4MB/s 00:11
在備庫上將控制檔案複製2份,並命名為control02.ctl, control03.ctl
[oracle@rac3 orcl]$ cp control01.ctl control02.ctl
[oracle@rac3 orcl]$ cp control01.ctl control03.ctl
[oracle@rac3 orcl]$ ls
control01.ctl control02.ctl control03.ctl
3.5 引數檔案
3.5.1 主庫的引數檔案
先用spfile 來建立pfile 檔案。 這裡要注意的,不要直接用create pfile from spfile來建立。 至於為什麼參考Blog:
RAC 修改 spfile 引數
http://blog.csdn.net/tianlesoftware/archive/2010/09/24/5902591.aspx
[oracle@rac1 u01]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 8 04:33:51 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> create pfile='/u01/tmp.ora' from spfile;
File created.
SQL> !
[oracle@rac1 u01]$ cd /u01
[oracle@rac1 u01]$ ls
app dave.log RAC_hot_database_backup.sh.out
backup dave.ora tianlesoftware.dmp
control01.ctl impdp.log tmp.ora
dave_2010929.dmp RAC_hot_database_backup.sh
[oracle@rac1 u01]$ more tmp.ora
通過more 命令,我們就可以看到rac pfile 引數的內容,對於RAC 主庫,我們不需要做什麼修改,只需要新增如下內容:
*.log_archive_config='dg_config=(orcl,orcl_st)'
*.log_archive_dest_3='service=orcl_st VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=orcl_st'
*.db_file_name_convert=' /u01/app/oracle/oradata/orcl/datafile','+DATA/orcl/datafile',
' /u01/app/oracle/oradata/orcl/tempfile','+DATA/orcl/tempfile'
*.log_file_name_convert=' /u01/app/oracle/oradata/orcl/datafile', '+DATA/orcl/datafile'
*.standby_file_management=auto
*.fal_server='orcl_st'
orcl1.fal_client='orcl1'
orcl2.fal_client='orcl2'
這裡要注意的地方:如果之前配置了例項之間歸檔檔案的互相傳送,那麼這裡需要加上db_unique_name 引數:
orcl2.log_archive_dest_2='service=orcl1 db_unique_name=orcl'
orcl1.log_archive_dest_2='service=orcl2 db_unique_name=orcl'
不然在啟動時會報如下錯誤:
BAD PARAM ORA-16052: DB_UNIQUE_NAME attribute is required
查詢Data Guard 的db_unique_name 可以通過v$dagatuard_config檢視:
SQL> select * from v$dataguard_config;
DB_UNIQUE_NAME
------------------------------
orcl
orcl_st
如果之前沒有新增,可以通過修改pfile,在用pfile 建立spfile,或者用SQL, 如:
SQL> alter system set log_archive_dest_2='service=orcl1 db_unique_name=orcl' sid='orcl2';
關於這些引數的意義,可以參考:
Oracle Data Guard 理論知識
http://blog.csdn.net/tianlesoftware/archive/2010/04/22/5514082.aspx
一些說明:
(1) 使用ASM 作儲存時,datafile 和tempfile 是分別放在兩個目錄下的,所以在standby 上也單獨建立一個tempdata 目錄,並在db_file_convert 中作相應的設定。
(2) 在使用ASM的RAC中,注意不要修改db_unique_name 的引數值,因為ASM 存放檔案的規則,是按照+diskgroup_name/database_unique_name/file_type/tag_name.file_number.incarnation 這樣一個規則存放的,但是第二項database_unique_name 並不是db_name; 如果改變了db_unique_name,則之後建立的資料檔案會放到新的目錄下,會導致db_file_convert的失敗,這一點需要特別注意。
(3) 如果RAC中使用db_create_online_dest_n 系列的引數,要相應調整standby 上的log_file_name_convert 引數。
第一點裡提到ASM 分開存放檔案,我們可以用asmcmd 命令連上ASM 驗證一下:
[oracle@rac2 +ASM]$ export ORACLE_SID=+ASM2
[oracle@rac2 +ASM]$ asmcmd
ASMCMD> ls
DATA/
FLASH_RECOVERY_AREA/
ASMCMD> cd DATA
ASMCMD> ls
ORCL/
ASMCMD> cd ORCL/
ASMCMD> ls
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
spfileorcl.ora
ASMCMD> cd TEMPFILE
ASMCMD> ls
TEMP.283.730181265
3.5.2 備庫的引數檔案
備庫的初始化檔案,在主庫的基礎上修改一下,把不用的刪除掉就可以了。 對於設計到Data Guard的引數,修改一下引數的值就可以了。 最終備庫的引數如下:
[oracle@rac3 dbs]$ more initorcl.ora
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.background_dump_dest='/u01/app/oracle/admin/orcl/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/orcl/datafile/control01.ctl','/u01/app/oracle/oradata/orcl/
datafile/control02.ctl','/u01/app/oracle/oradata/orcl/datafile/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/orcl/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='orcl'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.job_queue_processes=10
*.log_archive_dest_1='LOCATION=/u01/arch'
*.log_archive_dest_state_2='ENABLE'
*.open_cursors=300
*.pga_aggregate_target=59768832
*.processes=150
*.remote_login_passwordfile='exclusive'
*.sga_target=179306496
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/orcl/udump'
*.db_unique_name=orcl_st -- 注意,這個值要和主庫參log_archive_dest_n裡設定的一致,不然會報錯誤:ORA-16047: DGID mismatch between destination
*.log_archive_config='dg_config=(orcl,orcl_st)'
*.log_archive_dest_2='service=orcl1 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=orcl1'
*.db_file_name_convert='+DATA/orcl/datafile','/u01/app/oracle/oradata/orcl/datafile','+DATA/orcl/tem
pfile','/u01/app/oracle/oradata/orcl/tempfile'
*.log_file_name_convert='+DATA/orcl/onlinelog','/u01/app/oracle/oradata/orcl/datafile',
'+FLASH_RECOVERY_AREA/orcl/onlinelog','/u01/app/oracle/oradata/orcl/datafile'
*.standby_file_management=auto
*.standby_archive_dest='/u01/arch'
*.fal_server='orcl1','orcl2'
*.fal_client='orcl2'
這裡面關於log_file_name_conver 引數:
先從主庫檢視v$logfile:
SQL>Select * from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- -----------------------------------------------------
2 ONLINE +DATA/orcl/onlinelog/group_2.282.730181191
2 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.262.73018
1 ONLINE +DATA/orcl/onlinelog/group_1.281.730181173
1 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.261.73018
3 ONLINE +DATA/orcl/onlinelog/group_3.285.730181443
3 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.263.73018
4 ONLINE +DATA/orcl/onlinelog/group_4.286.730181451
4 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.264.73018
如果這裡除了+DATA,還有+FLASH_RECOVERY_AREA, 那麼這些redo 都需要在引數裡指定進行轉換。 不然通過rman ,這些路徑也會被複制過去,但是standby上是無法訪問這些路徑的,所以在做switchover 切換的時候,就會報錯。 這點是要注意的地方。
3.6 RMAN 備份主庫並將備份檔案傳到standby上
這裡用的是RMAN 複製的方法來搭建standby 環境。 可以參考我的Blog:
用RMAN複製 搭建 物理 Data Gurad 環境
http://blog.csdn.net/tianlesoftware/archive/2010/07/23/5756750.aspx
備份檔案,放在/u01/rmanback 目錄下,我們在rac1節點進行備份。 在standby 節點也需要建同樣的目錄,還需要把備份檔案copy到這個目錄下。
[oracle@rac1 bin]$ rman target /
Recovery Manager: Release 10.2.0.1.0 - Production on Fri Oct 8 12:13:07 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: ORCL (DBID=1257961898)
RMAN> RUN {
allocate channel c1 type disk;
allocate channel c2 type disk;
sql 'alter system archive log current';
backup current controlfile for standby format='/u01/rmanbackup/control_%U';
BACKUP FORMAT '/u01/rmanbackup/orcl_%U_%T' skip inaccessible filesperset 5 DATABASE ;
sql 'alter system archive log current';
BACKUP FORMAT '/u01/rmanbackup/arch_%U_%T' skip inaccessible filesperset 5 ARCHIVELOG ALL DELETE INPUT;
release channel c2;
release channel c1;
}
SCP 拷貝到 standby 上:
[oracle@rac1 rmanbackup]$ scp * 10.85.10.5://u01/rmanbackup/
RMAN備份有一些注意事項,具體參考我的blog:
RAC 之 RMAN 備份
http://blog.csdn.net/tianlesoftware/archive/2010/09/22/5901053.aspx
3.7用之前建立的初始化引數檔案將備庫啟動到nomount 狀態:
啟動監聽:
[oracle@rac3 admin]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 08-OCT-2010 12:41:43
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.85.10.5)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.85.10.5)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 08-OCT-2010 12:41:43
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.85.10.5)(PORT=1521)))
The listener supports no services
The command completed successfully
啟動資料庫:
[oracle@rac3 u01]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 8 12:37:08 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup nomount pfile=?/dbs/initorcl.ora
ORACLE instance started.
Total System Global Area 180355072 bytes
Fixed Size 1218388 bytes
Variable Size 62916780 bytes
Database Buffers 113246208 bytes
Redo Buffers 2973696 bytes
SQL>
3.8 rman還原資料庫:
[oracle@rac1 admin]$ rman target / auxiliary sys/oracle@orcl_st
Recovery Manager: Release 10.2.0.1.0 - Production on Fri Oct 8 13:25:31 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: ORCL (DBID=1257961898)
connected to auxiliary database: ORCL (not mounted)
RMAN> duplicate target database for standby;
…
Finished Duplicate Db at 09-OCT-10
3.9 檢查standby 資料庫
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/datafile/system.276.730181051
/u01/app/oracle/oradata/orcl/datafile/undotbs1.278.730181053
/u01/app/oracle/oradata/orcl/datafile/sysaux.277.730181053
/u01/app/oracle/oradata/orcl/datafile/users.279.730181053
/u01/app/oracle/oradata/orcl/datafile/undotbs2.284.730181347
/u01/app/oracle/oradata/orcl/datafile/tianlesoftware.dbf
/u01/app/oracle/oradata/orcl/datafile/anhuianqing.dbf
7 rows selected.
SQL> select name from v$tempfile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/tempfile/temp.283.730181265
將備庫啟動到mount standby 狀態,並啟動MRP 程式:
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 180355072 bytes
Fixed Size 1218388 bytes
Variable Size 62916780 bytes
Database Buffers 113246208 bytes
Redo Buffers 2973696 bytes
SQL> alter database mount standby database;
Database altered.
SQL> recover managed standby database disconnect from session;
Media recovery complete.
SQL>
3.10 新增standby redo log 日誌
RAC 每個Redo Thread 都需要建立對應的Standby Redo Log。 建立原則和單例項一樣,包括日誌檔案大小相等,日誌組數量要多1組。
在RAC裡檢視聯機日誌:
[oracle@rac2 rmanbackup]$ export ORACLE_SID=orcl2
[oracle@rac2 rmanbackup]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Oct 9 03:49:49 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba;
Connected.
SQL> select thread#,group#,bytes/1024/1024 from v$log;
THREAD# GROUP# BYTES/1024/1024
---------- ---------- ---------------
1 1 50
1 2 50
2 3 50
2 4 50
從上面的結果看出, RAC 有兩個Redo Thread,每個Thread 有兩個日誌組,每個日誌檔案大小有50MB,所以要針對每個thread 需要建立3組 Standby Redo Log,大小為50MB。
Alter database add standby logfile thread 1 group 5 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_05.log') size 50m;
Alter database add standby logfile thread 1 group 6 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_06.log') size 50m;
Alter database add standby logfile thread 1 group 7 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_07.log') size 50m;
Alter database add standby logfile thread 2 group 8 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_08.log') size 50m;
Alter database add standby logfile thread 2 group 9 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_09.log') size 50m;
Alter database add standby logfile thread 2 group 10 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_10.log') size 50m;
新增完可以用: select * from v$logfile 檢視日誌情況。
3.11 先停止RAC 例項,然後用之前建立的pfile 啟動rac 例項。
[oracle@rac1 u01]$ cd /u01/app/oracle/product/crs/bin/
[oracle@rac1 bin]$ srvctl stop database -d orcl
[oracle@rac1 bin]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.orcl.db application OFFLINE OFFLINE
ora....oltp.cs application OFFLINE OFFLINE
ora....cl1.srv application OFFLINE OFFLINE
ora....cl2.srv application OFFLINE OFFLINE
ora....l1.inst application OFFLINE OFFLINE
ora....l2.inst application OFFLINE OFFLINE
ora....SM1.asm application ONLINE ONLINE rac1
ora....C1.lsnr application ONLINE ONLINE rac1
ora.rac1.gsd application ONLINE ONLINE rac1
ora.rac1.ons application ONLINE ONLINE rac1
ora.rac1.vip application ONLINE ONLINE rac1
ora....SM2.asm application ONLINE ONLINE rac2
ora....C2.lsnr application ONLINE ONLINE rac2
ora.rac2.gsd application ONLINE ONLINE rac2
ora.rac2.ons application ONLINE ONLINE rac2
ora.rac2.vip application ONLINE ONLINE rac2
[oracle@rac1 bin]$ export ORACLE_SID=orcl1
[oracle@rac1 bin]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Oct 9 05:27:55 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba;
Connected to an idle instance.
SQL> create spfile from pfile='/u01/tmp.ora';
File created.
啟動所有節點:
SQL> startup
ORACLE instance started.
Total System Global Area 180355072 bytes
Fixed Size 1218388 bytes
Variable Size 109054124 bytes
Database Buffers 67108864 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
這裡有遇到了點麻煩,參考:
ORA-01677 standby file name convert parameters differ from other instance 錯誤
http://blog.csdn.net/tianlesoftware/archive/2010/10/09/5930227.aspx
3.12 在主庫檢視日誌傳送情況
SQL> Select dest_name,status,error from v$archive_dest;
DEST_NAME STATUS ERROR
-------------------- --------- -------------------------------------------------
LOG_ARCHIVE_DEST_1 VALID
LOG_ARCHIVE_DEST_2 VALID
LOG_ARCHIVE_DEST_3 VALID
LOG_ARCHIVE_DEST_4 INACTIVE
LOG_ARCHIVE_DEST_5 INACTIVE
LOG_ARCHIVE_DEST_6 INACTIVE
LOG_ARCHIVE_DEST_7 INACTIVE
LOG_ARCHIVE_DEST_8 INACTIVE
LOG_ARCHIVE_DEST_9 INACTIVE
LOG_ARCHIVE_DEST_10 INACTIVE
10 rows selected.
兩個節點都正常。
3.13 驗證同步情況
在主備庫分別切換日誌:
SQL> alter system switch logfile;
System altered.
SQL> select sequence# from v$archived_log;
SEQUENCE#
----------
…
15
16
SQL> alter system switch logfile;
System altered.
SQL> select sequence# from v$archived_log;
SEQUENCE#
----------
…
17
18
在備庫進行驗證:
SQL> select sequence#,applied from v$archived_log;
SEQUENCE# APP
---------- ---
…
13 YES
4 NO
14 YES
15 YES
16 YES
18 NO
16 YES
17 YES
18 YES
19 YES
同步成功。 至此RAC 為主庫的,備庫為單例項的 Oracle 的Data Guard 環境已經搭建完成。
四. Switchover 切換
之前blog上的一篇單例項間切換的例子:
Oracle Data Guard Switchover 切換
http://blog.csdn.net/tianlesoftware/archive/2010/07/27/5768602.aspx
RAC 環境下,切換Primary 和 Standby 時,只能有一個例項是活動的, 其他例項必須關閉。
這裡我們關閉rac2節點。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
orcl2
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
在RAC1 節點將主庫切換到備庫:
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
orcl1
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE
SQL> alter database commit to switchover to physical standby with session shutdown;
Database altered.
SQL> shutdown immediate;
將備庫切換成主庫:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY with session shutdown;
SQL> shutdown immediate;
在rac1(原來的主庫)節點上建立standby redo log file:
SQL> select thread#,group#,bytes/1024/1024 from v$log;
THREAD# GROUP# BYTES/1024/1024
---------- ---------- ---------------
1 1 50
1 2 50
2 3 50
2 4 50
SQL> alter database add standby logfile thread 1 group 5 size 50m;
SQL> alter database add standby logfile thread 1 group 6 size 50m;
SQL> alter database add standby logfile thread 1 group 7 size 50m;
SQL> alter database add standby logfile thread 2 group 8 size 50m;
SQL> alter database add standby logfile thread 2 group 9 size 50m;
SQL> alter database add standby logfile thread 2 group 10 size 50m;
新增之後可以通過v$logfile 檢視檢視:
SQL> select * from v$logfile;
rows will be truncated
GROUP# STATUS TYPE MEMBER
---------- ------- ------- -----------------------------------------------------
2 ONLINE +DATA/orcl/onlinelog/group_2.282.730181191
2 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.262.73018
1 ONLINE +DATA/orcl/onlinelog/group_1.281.730181173
1 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.261.73018
3 ONLINE +DATA/orcl/onlinelog/group_3.285.730181443
3 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.263.73018
4 ONLINE +DATA/orcl/onlinelog/group_4.286.730181451
4 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.264.73018
5 STANDBY +DATA/orcl/onlinelog/group_5.292.731930683
5 STANDBY +FLASH_RECOVERY_AREA/orcl/onlinelog/group_5.268.73193
…
Standby 日誌新增完之後,就可以啟動例項了。 同樣要注意的是, 如果standby 是RAC 環境, MRP 只能在一個例項上執行,這和RAC的恢復操作一樣,而其他例項只能執行RFS。
這種切換的意義並不大,RAC 本身就是一個高可用性的系統,它有多個節點可以規避當機的風險。 RAC + 邏輯standby 這種用法還是比較常見。 我們公司目前也是用這種搭配方法,邏輯standby 用來做報表資料庫。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/235507/viewspace-1062786/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle DataGuard切換步驟Oracle
- oracle 之dataguard standby 切換Oracle
- oracle11g dataguard切換Oracle
- 【DataGuard】Oracle DataGuard 資料保護模式切換Oracle模式
- Oracle 11.2.0.4 physical dataguard和snapshot dataguard切換Oracle
- Oracle DataGuard switchover切換一例Oracle
- Oracle DataGuard 主備切換 (switchover) oracle11gOracle
- Oracle物理DG自動切換——Dataguard Broker配置Oracle
- 【DATAGUARD】Oracle Dataguard物理備庫切換最佳實踐(sqlplus)OracleSQL
- DataGuard切換保護模式模式
- ORACLE 11g dataguard系列,手工切換測試Oracle
- Dataguard failover切換實驗AI
- 實戰dataguard主從切換
- dataguard 切換後更換IP,service_name
- ORACLE 12C DATAGUARD環境搭建和主從切換Oracle
- DataGuard主備庫切換步驟
- dataguard之物理standby 日誌切換
- 【DATAGUARD】物理dg的switchover切換(五)
- Oracle 10g DataGuard物理主備切換-switchover與failoverOracle 10gAI
- dataguard 手動切換,檢查指令碼指令碼
- dataguard之物理standby庫failover 切換AI
- 【DATAGUARD】物理dg的failover切換(六)AI
- Oracle RAC一樣架構的Dataguard 是如何運作和切換的 ?Oracle架構
- DataGuard---->物理StandBy的角色切換之switchover
- 基於多種場景DataGuard切換方案
- DATAGUARD在做SWITCHOVER切換時遇到問題總結
- 【DataGuard】使用Grid Control對Oracle物理Data Guard進行Switchover切換Oracle
- 物理dataguard 正常切換 角色轉換,switchover_status 狀態改變
- Oracle10G Dataguard 多個備庫 - 主庫和物理備庫的切換Oracle
- DataGuard切換(主庫為Rac+備庫為Rac)
- 備庫的切換狀態為SWITCHOVER PENDING時進行dataguard主備庫角色切換
- 物理dataguard 正常切換 腳色轉換,switchover_status 狀態改變
- oracle dg切換操作示例Oracle
- Oracle日誌模式切換Oracle模式
- 【DataGuard】Oracle 11g DataGuard 角色轉換(一)物理備庫SwitchoverOracle
- 物理DataGuard客戶端無縫切換--客戶端TAF 配置客戶端
- dataguard手動switchover切換步驟及注意的問題 轉
- RAC和Dataguard環境下主備庫切換演練模板