Oracle 9.2.0.4 DataGuard 總結(轉)

wdnmg發表於2011-03-23

參考連線
Dataguard配置Step by Step
http://www.eygle.com/ha/dataguard-step-by-step.htm
DataGuard基本概念
http://www.itpub.net/715289.html
在RHEL3上配置oracle 10g data guard
http://wxy0327.itpub.net/post/16888/92718

DG三種模式
一、最大保護
二、最大可用性。採用lgwr日誌傳輸模式,可以同和非同步方式傳redo,standby需要有線上日誌redo存在,否則主機的線上日誌會逐漸的添充到歸檔日誌中,可是並不能完填充,這
樣就會導災難的後果。
LGWR transmission is specified through the log_archive_dest_n option LGWR:
log_archive_dest_2='service=to_standby lgwr'
If LGWR transmission is used, there should be a row having client_process=LGWR in v$managed_standby.
arch方式傳輸歸檔日誌
log_archive_dest_2='service=to_standby arch'
三、最大效能
建立備用伺服器有如下要求:
1、        主節點必須執行在歸檔模式下
2、        主節點與備用節點最好有相同的OS版本,一般beta號差一點還是可以的
3、        主節點與備用節點必須有相同的資料庫版本和相容版本
 

配置dataguard實現oracle雙機熱備,故障切換,把損失降到最小。
主要分為以下幾個步驟
一、安裝主備兩臺oracle9i資料庫,目錄保持一致。設定好主庫的歸檔方式及歸檔路徑。
二、把主節點的資料檔案,重做日誌複製到備機上面。在主節點生成備機的控制檔案,引數檔案並複製到備機上面。
三、配置主備機listener.ora 、tnsnames.ora
四、啟動備機資料庫
五、在主機上面設定歸檔路徑到備機。
六、觀察日誌檔案進行測試
 
下面詳細說明每步操作:
一、雙機安裝裝備
主機:192.168.0.25    備機:192.168.0.127
1.1 雙機安裝oracle
兩臺機器安裝oracle,如果原來已經有一臺機器了,那麼只需要在備機安裝oracle及資料庫,測試可以正常啟動和關閉.

2.1準備把主機資料檔案引數檔案,控制檔案,密碼檔案複製到備機。
在備機上面操作:
進入oracle資料檔案所在目錄,cd /opt/ora9/oradata/oradb/
刪除目錄下面所有檔案。
cd /opt/ora9/product/9.2.0.4/dbs/
mv spfileoradb.ora spfileora.ora.bak  (這個操作的目錄是使用備機在啟動時使用在主機上生成引數檔案來啟動)
mv orapworadb orapworadb.bak   (同樣為了使用主機上面的密碼檔案)
2.2
進入主機操作:
sql>startup 啟動
SQL> archive log list;  修改好歸檔方式及路徑
sql>alter database create standby controlfile as '/opt/standby.ctl';  生成控制檔案
SQL> create pfile from spfile; 生成引數檔案
SQL> !
[oracle@standby oracle]$ cd $ORACLE_HOME/dbs
[oracle@standby dbs]$ ls
initoradb.ora 看到這個檔案就對了。

下面這些檔案複製到備機上面並放在相應的目錄
同步資料檔案目錄
rsync -ave ssh /opt/ora9/oradata/oradb/ 192.168.0.127:/opt/ora9/oradata/oradb/
複製引數檔案
scp /opt/ora9/product/9.2.0.4/dbs/initoradb.ora 192.168.0.127:/opt/ora9/product/9.2.0.4/dbs/
複製密碼檔案
scp /opt/ora9/product/9.2.0.4/dbs/orapworadb 192.168.0.127:/opt/ora9/product/9.2.0.4/dbs/
複製控制檔案
scp /opt/standby.ctl 192.168.0.127:/opt/ora9/oradata/oradb/
以上檔案許可權都要是oracle使用者

在備機上面操作
修改引數檔案
vi /opt/ora9/product/9.2.0.4/dbs/initoradb.ora
*.control_files='/opt/ora9/oradata/oradb/standby.ctl'  主要修改好控制檔名字
新增如下四行
*.standby_archive_dest='/opt/standby/arch'   (主機同步過的歸檔日誌存放位置)      
*.fal_server='PRIMARY'
*.fal_client='STANDBY'
*.standby_file_management='AUTO'

三、配置主備機listener.ora、tnsname.ora
在主機上面操作
vi listener.ora  這個檔案基本不用修改,lsnrctl start啟動正常,埠處於監聽。
主要修改tnsname.ora
vi tnsname.ora  新增如下內容

primary.test.com =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.25)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = oradb)
      (SERVER = DEDICATED)
    )
  )
standby.test.com =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.127)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = oradb)
      (SERVER = DEDICATED)
    )
  )
 
在備機上面做和上面同樣操作,之後分別主備機上面做tnsping 測試
如:tnsping primary.test.com tnsping standby.test.com看到ok就行了。

四、啟動備用資料庫
sqlp " as sysdba "  登入
sql>startup nomount;
sql>alter database mount standby database;
sql>alter database recover managed standby database disconnect from session;
五、
在主機上操作,新增歸檔路徑
SQL> alter system set log_archive_dest_2='service=standby.test.com mandatory reopen=60';

六、測試一下
在主機上面
create table test (varchar2 (20));
insert into test values ('aaaa');
commit;
SQL> alter system switch logfile;

在備用節點觀察日誌
tail -f /opt/ora9/admin/oradb/bdump/alert_oradb.log
Datafile 7: '/opt/ora9/oradata/oradb/odm01.dbf'
Starting datafile 8 recovery in thread 1 sequence 11
Datafile 8: '/opt/ora9/oradata/oradb/tools01.dbf'
Starting datafile 9 recovery in thread 1 sequence 11
Datafile 9: '/opt/ora9/oradata/oradb/users01.dbf'
Starting datafile 10 recovery in thread 1 sequence 11
Datafile 10: '/opt/ora9/oradata/oradb/xdb01.dbf'
Media Recovery Waiting for thread 1 seq# 11
Tue Jul 28 14:45:25 2026
Completed: alter database recover managed standby database di

把備機變成只讀模式。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered.
SQL> ALTER DATABASE OPEN READ ONLY;
Database altered.
sql> select * from test
應該看到和主庫一樣的內容
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; 
回到備機模式。

七、主機切換到備機
1.在主機192.168.0.25上面操作,建立恢復歸檔儲存位置。
alter system set standby_archive_dest='/opt/standby/arch';
SQL> alter database commit to switchover to physical standby;
Database altered.
SQL> shutdown immediate
SQL> startup nomount;
SQL> alter database mount standby database;
SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
--------- ---------- -------------------- ----------------
PRIMARY MOUNTED MAXIMUM PERFORMANCE PHYSICAL STANDBY
上面資訊中看到了主機已經變為了standby
sql>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
進入歸檔恢復。
2.在備機192.168.0.127上面操作.

SQL> alter database commit to switchover to primary;
切到主機模式。
SQL> shutdown immediate;
ORA-01507: database not mounted
SQL> startup
ORACLE instance started.
SQL> alter system set log_archive_dest_2='service=standby.test.com mandatory reopen=60';
 
測試一下,在原備機192.168.0.127也就是現在主機上面執行下面:
SQL> insert into test values ('dddd');
1 row created.
SQL> commit;

SQL> alter system switch logfile;
System altered.
 

檢視原主機192.168.0.25也就是現在備機上面的日誌:
tail -f /opt/ora9/admin/oradb/bdump/alert_oradb.log
Mon Aug 21 21:55:41 2006
Restarting dead background process QMN0
QMN0 started with pid=14
Mon Aug 21 21:57:46 2006
Media Recovery Log /opt/standby/arch/1_15.dbf
Media Recovery Waiting for thread 1 seq# 16
Media Recovery Log /opt/standby/arch/1_16.dbf
Media Recovery Waiting for thread 1 seq# 17

以只讀模式開啟資料庫:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered.
SQL> ALTER DATABASE OPEN READ ONLY;
Database altered.
SQL> select * from test;
NAME
------------------------------
aaa
bbbb
cccc
dddd

應該看到剛才插入的內容。
sql>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;變為歸檔恢復模式。
 
八、切換回原來的主機
在原備機192.168.0.127也就是剛才的主機上面操作:
SQL> alter database commit to switchover to physical standby;
Database altered.
SQL> shutdown immediate
ORA-01507: database not mounted

statORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.
SQL> alter database mount standby database;
Database altered.
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
Database altered.
tail -f /opt/ora9/admin/oradb/bdump/alert_oradb.log檢視日誌變化

在原主機192.168.0.25也就是剛才備機上面操作
SQL> alter database commit to switchover to primary;
Database altered.
SQL> shutdown immediate;
ORA-01507: database not mounted

ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area  236000356 bytes
Fixed Size                   451684 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.
Database opened.

這樣就又原回到原來狀態,完成自由切換,用上面的方法進行歸檔日誌恢復測試。
 

從最大效能轉換到最大可用性。
在 primary DB 上:
shutdown immediate;
startup mount;
alter database set standby database to maximize availability;
alter database open;
 
physical是直接應用歸檔日誌的,而logical的方式則是需要把所有的歸檔轉換成SQL語句再在logical standby database上執行它。這會佔用大量的系統資源,如CPU,memory,I/O
等。
 
 
 

高階應用
參考:http://zbig.3322.org/bbs/dispbbs.asp?boardID=6&ID=50
 
四、採用Arch 程式傳送歸檔日誌的最大性
能模式
在預設情況下,Data guard就是最大效能模式,所以不需要採用其它額外的配置,我們只需
要修改主資料庫的第二個歸檔路徑即可。
SQL>alter system set log_archive_dest_2='SERVICE=dbstandby REOPEN=300' scope=both;
SQL>alter system set log_archive_dest_state_2=enable scope=both;
SQL>alter system archive log current;
其中reopen表示瞭如果發生歸檔失敗後,第二次重複的時間間隔(秒),這種方式是從8i以
來一直採用的一種方式,具有比較穩定,不影響資料庫的效能,如果發生網路失敗等原因,
主資料庫不會因為遠端歸檔不成功而停下來。

五、採用Lgwr程式傳遞聯日誌機的最大效能模式
5.1關於LGWR傳遞Redo和Standby Redo Log
Data Guard除了以上傳統的Arch日誌傳送過程外,還可以採用聯機日誌的傳送,在備用端
建議建立一組備用日誌,並保持與主資料庫備用日誌相同大小,而且最好比主資料庫的聯
機日誌多一組以上。
如果採用聯機日誌傳送,但是不在備用端建立備用日誌的話,聯機日誌將自動寫到備用端
的歸檔日誌中。
在備用日誌或者當前正在歸檔的日誌中的內容是不能馬上被應用的,必須當歸檔完成後才
由MRPn程式應用到備用資料庫,所以說,恢復不是連續的,但是,傳送過程可以是連續
的,在備用日誌或當前歸檔日誌中的內容,如果有需要,可以最終被指定應用到備用資料
庫。
如果在Rac 環境下,Standby 上的redo 被所有instances 的LGWR 一起使用. 而沒有按
instances 分開。
如果在建立資料庫或者控制檔案的時候,MAXLOGFILES引數指定過小,將影響到備用日
志的建立,這種情況下,必須重新建立控制檔案才能解決相應問題。
5.2建立Standby Redo Log
在決定採用redo日誌傳送之前,先在備用資料庫上建立備用日誌
SQL>alter database add standby logfile
'/u01/oracle/oradata/tbdb/stdy_redo01.log' size 100m;
或者
SQL>alter database add standby LOGFILE
GROUP 4 ('/u01/oracle/oradata/tbdb/stdy_redo04.log') SIZE 102400K,
SQL>alter database add standby LOGFILE
GROUP 5 ('/u01/oracle/oradata/tbdb/stdy_redo05.log') SIZE 102400K,
SQL>alter database add standby LOGFILE
GROUP 6 ('/u01/oracle/oradata/tbdb/stdy_redo06.log') SIZE 102400K,
SQL>alter database add standby LOGFILE
GROUP 7 ('/u01/oracle/oradata/tbdb/stdy_redo07.log') SIZE 102400K,
5.4修改主庫的歸檔路徑
同前面介紹的用ARCH 程式傳遞archived log相比,只面作以下更改:
SQL>alter system set LOG_ARCHIVE_DEST_2=’SERVICE=dbstandby LGWR’
scope=both
另外,如果考慮到以後該庫可能被切換到備用資料庫,也可以建立同樣的備用日誌
組:
SQL>alter database add standby LOGFILE
GROUP 4 ('/u01/oracle/oradata/tbdb/stdy_redo04.log') SIZE 102400K,
GROUP 5 ('/u01/oracle/oradata/tbdb/stdy_redo05.log') SIZE 102400K,
GROUP 6 ('/u01/oracle/oradata/tbdb/stdy_redo06.log') SIZE 102400K,
GROUP 7 ('/u01/oracle/oradata/tbdb/stdy_redo07.log') SIZE 102400K;
備用日誌的資訊可以通過檢視
V$STANDBY_LOG 與V$LOGFILE 獲得
LGWR 直接將log buffer 中的事務資料非同步(async 預設)通過net8 傳遞給從庫,從庫的RFS
程式接收Redo data, 並寫到Standby Redo Log中, 然後,當主庫發生log switch時,從庫
的ARC0,ARC1 程式將redo log寫到archived log file 中,一旦archived log 可用,MRP0 馬
上將歸檔日誌應用到資料檔案及控制檔案中。
如果想最終應用備用日誌中的日誌,可以用命令(見失敗切換過程)
alter database recover managed standby database finish;

六、決定歸檔的一些引數說明
6.1 ARCH與LGWR
採用歸檔日誌傳送還是聯機日誌傳送,預設是歸檔程式
是否採用ARCH程式還是LGWR程式,很多時候依賴於保護的方式,下表可以看到在不同的
保護模式下,採用歸檔程式還是聯機日誌程式的情況。
最大保護最大可用最大效能
程式LGWR LGWR LGWR或ARCH
網路傳輸模式SYNC SYNC LGWR時設定ASYNC
磁碟寫操作AFFIRM AFFIRM NOAFFIRM
備用日誌Yes 物理備用需要LGWR和物理備用時需要
備用庫型別物理物理或邏輯物理或邏輯
6.2 SYNC與ASYNC 和AFFIRM 與NOAFFIRM
SYNC與ASYNC決定了網路傳輸的同步與非同步操作,預設ASYNC
AFFIRM與NOAFFIRM決定了歸檔日誌磁碟寫的同步與非同步操作,預設NOAFFIRM。
這兩個引數用來決定不同的保護模式。
網路I/O 性質歸檔日誌磁碟I/O性質物理備用的效能保護的級別
SYNC AFFIRM Lowest Highest
SYNC NOAFFIRM Low High
ASYNC AFFIRM High Low
ASYNC NOAFFIRM Highest Lowest
6.3 DELAY 與NODELAY
是否延遲同步,預設不延遲,如果選擇DELAY,預設30 分鐘

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE NODELAY;
還可以設定在主資料庫上
LOG_ARCHIVE_DEST_3=’SERVICE=stby1 DELAY=240’
LOG_ARCHIVE_DEST_STATE_3=ENABLE
延遲引數並不影響日誌的傳送
6.4 MANDATORY 與OPTIONAL
預設是OPTIONAL,如果設定MANDATORY,表示一定要歸檔成功,否則將引發主資料庫
的歸檔等待。
Oracle建議採用OPTIONAL方式來傳送日誌。
18
6.5 REOPEN 與NOREOPEN 和MAX_FAILURE 與
NOMAX_FAILURE
REOPEN 與NOREOPEN 決定是否重試操作,預設是REOPEN,300 秒,表示如果失敗後,
最小的重試的時間間隔
Noreopen表示不重試失敗操作
MAX_FAILURE 與NOMAX_FAILURE 表示最大重試次數,預設是NOMAX_FAILURE,表
示一直重試,如果是MAX_FAILURE,則採用MAX_FAILURE=count 來決定重試的次數,
如果是MAX_FAILURE,則一定需要在REOPEN模式下
6.6 ALTERNATE 與NOALTERNATE
表示如果歸檔失敗,是否轉向新的歸檔路徑,預設是的NO ALTERNATE
如採用如下配置
LOG_ARCHIVE_DEST_2=’LOCATION=/disk1 MANDATORY
ALTERNATE=LOG_ARCHIVE_DEST_3’
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_DEST_3=’LOCATION=/disk2 MANDATORY’
LOG_ARCHIVE_DEST_STATE_3=ALTERNATE
那麼就是說,如果路徑2 上歸檔失敗的話,將切換到路徑3繼續歸檔。
七、驗證備用伺服器是否工作
我們可以通過檢視檢視日誌應用情況
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED
FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIM NEXT_TIME
---------- --------- ---------
3 08-JUN-04 08-JUN-04 YES
4 08-JUN-04 08-JUN-04 YES
5 08-JUN-04 09-JUN-04 YES --新傳過來的歸檔日誌檔案
或者檢視alert日誌檔案,如有如下內容表示正在恢復,而且在等待下一個日誌。
alter database recover managed standby database disconnect from session
Attempt to start background Managed Standby Recovery process
MRP0 started with pid=11
MRP0: Background Managed Standby Recovery process started
Starting datafile 1 recovery in thread 1 sequence 5
Datafile 1: '/u01/oracle/oradata/tbdb/system01.dbf'
Starting datafile 2 recovery in thread 1 sequence 5
Datafile 2: '/u01/oracle/oradata/tbdb/undotbs01.dbf'
19
Starting datafile 3 recovery in thread 1 sequence 5
Datafile 3: '/u01/oracle/oradata/tbdb/indx01.dbf'
Starting datafile 4 recovery in thread 1 sequence 5
Datafile 4: '/u01/oracle/oradata/tbdb/tools01.dbf'
Starting datafile 5 recovery in thread 1 sequence 5
Datafile 5: '/u01/oracle/oradata/tbdb/users01.dbf'
Media Recovery Waiting for thread 1 seq# 5
Wed Jun 9 02:20:04 2004
Completed: alter database recover managed standby database di
Wed Jun 9 02:28:18 2004
Media Recovery Log /u01/oracle/oradata/tbdb/archive/1_5.dbf
Media Recovery Waiting for thread 1 seq# 6
其它的備用資料庫相關檢視還有
V$MANAGED_STANDBY
(Physical Standby Databases Only) 會紀錄當前從庫的一些程式情況和程式的process id,如
rfs,mrp等
V$ARCHIVE_GAP
這裡面會紀錄當前從庫mrp程式恢復需要的膽識還沒有傳到從庫得日誌
V$DATAGUARD_STATUS
備用庫的狀態與資訊
V$STANDBY_LOG
備用資料庫的備用日誌的數量與當前狀態等資訊
八、最大保護模式
8.1 環境要求
Data Guard配置環境中,最大保護模式時至少有一個Standby DB滿足以下最低要求:
Redo archival process :LGWR
Network transmission mode :SYNC
Disk write option :AFFIRM
Standby redo logs required? :Yes
Database type :Physical
在Maximum Protection Mode下,Oracle建議至少配置2個Standby, 因為如果其中一個不能從
主庫接收日誌,主庫可繼續執行.
8.2 配置最大保護模式
在備用資料庫上
新增Standby Redo Log
20
SQL> alter database add standby logfile
GROUP 4 ('/u01/oracle/oradata/tbdb/stdy_redo04.log') SIZE 102400K,
GROUP 5 ('/u01/oracle/oradata/tbdb/stdy_redo05.log') SIZE 102400K,
GROUP 6 ('/u01/oracle/oradata/tbdb/stdy_redo06.log') SIZE 102400K,
GROUP 7 ('/u01/oracle/oradata/tbdb/stdy_redo07.log') SIZE 102400K;
啟動到managed recovery模式
SQL> recover managed standby database disconnect from session;
保證備用庫的監聽正常,保證主資料庫到備用資料庫的連線正常。
修改歸檔引數
8.3 轉換模式由最大效能到最大保護
在主庫上,檢查當前模式
SQL>select protection_mode from v$database;
PROTECTION_MODE
--------------------
MAXIMUM PERFORMANCE
SQL>shutdown immediate;
SQL>startup mount
SQL> alter system set log_archive_dest_2='SERVICE=dbstandby LGWR SYNC AFFIRM '
scope=both;
SQL>alter database set standby database to maximize protection;
SQL>alter database open;
SQL> select protection_mode from v$database;
PROTECTION_MODE
--------------------
MAXIMUM PROTECTION
模式切換的完全的語法如下
ALTER DATABASE SET STANDBY DATABASE TO
MAXIMIZE {PROTECTION | AVAILABILITY | PERFORMANCE}
注意:
1、在Data Guard環境中,如果要在最大保護模式下,必須至少一個Standby的設定滿足以
下條件
alter system set log_archive_dest_2='SERVICE=dbstandby LGWR SYNC AFFIRM';
並將主庫設定到Maximum Protection,備庫可以在Maximum Performance,也可設定在
Maximum Protection.
2、最大保護模式下,Standby方的MRP0仍是需要等待Primary的當前日誌歸檔後(由Log
switch觸發)才能應用到database中。這在所有模式中均一樣。在failover的時候,可以

alter database recover managed standby database finish;
應用日誌, 這樣不會丟失資料.
3、最大保護模式下,處於最大保護模式下的備用資料庫不能正常的關閉,必須要保持與主
庫一致的模式,如果採用abort強行關閉或者系統與網路故障,在主資料庫上進行的任何事
務,將導致主資料庫的關閉,在alert日誌中,會有如下的記載
Tue Jun 15 12:06:04 2004
Network asynch I/O wait error 3114 log 3 service 'dbstandby'
LGWR: All standby destinations have failed (16098)
******************************************************
WARNING: All standby database destinations have failed
WARNING: Instance shutdown required to protect primary
******************************************************
LGWR: terminating instance due to error 16098
Instance terminated by LGWR, pid = 25034
 
九、日常管理
9.1 備用伺服器的管理模式與只讀模式
1、啟動到管理模式
SQL>shutdown immediate
SQL>startup nomount pfile=?/dbs/inittbdbsdby.ora
SQL>alter database mount standby database
SQL>alter database recover managed standby database disconnect from session;
2、啟動到只讀方式
SQL>shutdown immediate
SQL>startup nomount pfile=?/dbs/inittbdbsdby.ora
SQL>alter database mount standby database
SQL>alter database open read only
3、如果在管理恢復模式下到只讀模式
SQL>recover managed standby database cancel;
SQL>alter database open read only;
這個時候,可以給資料庫增加臨時資料檔案(這個在熱備份的時候是沒有備份過來的)

alter tablespace temp add tempfile '/u01/oracle/oradata/tbdb/temp01.dbf' size 100M;
4、從只讀方式到管理恢復方式
SQ>recover managed standby database disconnect from session;
9.2 備用伺服器日誌刪除
備用伺服器的日誌刪除也必須小心,因為如果有些日誌還沒有被備用伺服器應用而該日誌被
22
刪除的話,將引起備用資料庫無法往下應用新的日誌。
刪除備用伺服器的日誌的指令碼為:
$ more removearchive.sh
#!/bin/sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/9.2;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
ORACLE_SID=tbdb; export ORACLE_SID
grep "Media Recovery Log"
$ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_${ORACLE_SID}.log|\
awk '{print $4}'|sed -e 's/^/rm /' >$ORACLE_BASE/work/worksh/rmarchlog.sh
chmod +x $ORACLE_BASE/work/worksh/rmarchlog.sh
$ORACLE_BASE/work/worksh/rmarchlog.sh
cd $ORACLE_BASE/admin/$ORACLE_SID/bdump
cat alert_${ORACLE_SID}.log >>alert_${ORACLE_SID}.log.bak
echo ''>alert_${ORACLE_SID}.log
rm -f $ORACLE_BASE/work/worksh/rmarchlog.sh
9.3 日誌延遲檢查
備用伺服器可能有這樣的情況發生,因為日誌塊邏輯損壞,所以必須對日誌應用進行檢查,
防止日誌應用被停止,防患於未然,當然我們可以手工檢查,但是以下指令碼則可以實現自動
檢查(放到cron中),如果發現問題則併傳送mail到指定郵箱
$ more checklog.sh
#!/bin/sh
#first u must set env
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/9.2;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
ORACLE_SID=tbdb; export ORACLE_SID
#start check
DATE=`date +%Y-%m-%d:%H:%M:%S`
filepath=$ORACLE_BASE/oradata/$ORACLE_SID/archive/
logpath=$ORACLE_BASE/admin/$ORACLE_SID/bdump
remotefile=`ssh "ls -t /u01/oracle/oradata/tbdb/archive/*|head -1|sed -e
's/.*_1_//g' |sed -e 's/\.arc$//g'"`
echo "CHECK TIME:"${DATE}
echo "remote file:"$remotefile
23
cd $filepath
varfile=`ls -tl | grep "arch" | head -1|sed -e 's/.*_1_//g' |sed -e 's/\.arc$//g'`
echo "archive file:"$varfile
cd $logpath
varlog=`grep "Media Recovery Log" alert_${ORACLE_SID}.log | tail -1 |sed -e 's/.*_1_//g' | sed
-e 's/\.arc$//g'`
echo "applice file:"$varlog
vs1=$(($remotefile-$varfile))
vs2=$(($varfile-$varlog))
#if log is not be sended then mail to me
if [ $vs1 -ge 3 ]
then
echo "send error!"
mail -s "error!" < $ORACLE_BASE/work/worksh/mail.txt
else
echo "send is ok!"
echo
fi
#if log is not be apped then mail to me
if [ $vs2 -ge 3 ]
then
echo "applice error!"
mail -s "error!" < $ORACLE_BASE/work/worksh/mail.txt
else
echo "applice is ok!"
echo
fi
十、主庫與備庫的正常切換
注意:Swithover時只能先從Primary切到Standby,再從Standby切到Primary.
以下順序不能顛倒,如果採用standby redo log 的需要注意在切換前在主資料庫建立同樣的
standby redo log。
1、切換之前先要準備init引數檔案
最簡單的辦法就是把兩個資料庫的檔案互換,在一個機器上同時保留主資料庫的初始化檔案
與備用資料庫的初始化檔案。
2、從Primary切換到standby的指令碼:
[oracle@db worksh]$ more swithstandby.sh
24
#!/bin/sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/9.2;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib; export
LD_LIBRARY_PATH
ORACLE_SID=tbdb; export ORACLE_SID
ORACLE_NLS=$ORACLE_HOME/ocommon/nls/admin/data; export ORACLE_NLS
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK; export NLS_LANG
NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';export NLS_DATE_FORMAT
$ORACLE_HOME/bin/sqlplus /nolog <connect / as sysdba
alter database commit to switchover to physical standby with session shutdown;
shutdown
startup nomount pfile=?/dbs/inittbdbsdby.ora
alter database mount standby database;
recover managed standby database disconnect;
exit
EOF
lsnrctl stop
lsnrctl start listenerdb
3、修改主端的tnsnames.ora 將主庫IP:10.0.29.164 與備庫IP:10.0.29.162 對換(即164 與
162 對的即可)
4、從standby切換到primary的指令碼:
$ more switchprimary.sh
#!/bin/sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/9.2;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib; export
LD_LIBRARY_PATH
ORACLE_SID=tbdb; export ORACLE_SID
ORACLE_NLS=$ORACLE_HOME/ocommon/nls/admin/data; export ORACLE_NLS
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK; export NLS_LANG
NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';export NLS_DATE_FORMAT
$ORACLE_HOME/bin/sqlplus /nolog <connect / as sysdba
alter database commit to switchover to primary;
shutdown
25
startup pfile=?/dbs/inittbdb.ora
exit
EOF
lsnrctl stop listenerdb
lsnrctl start
5、修改備用端的tnsnames.ora 將主庫IP:10.0.29.164 與備庫IP:10.0.29.162 對換(即164
與162 對的即可)
這樣切換的要求是主機和備機各有兩個listener, listener 監聽1521,listenerdb 監聽1522(見
上面的配置過程),任何一個節點,在primary期間啟動listener, standby 期間啟動listenerdb。
連線data guard的客戶端的tnsnames配置,這樣就可以實現失敗切換,對客戶端是透明的:
tbdb =
(DESCRIPTION =
(failover = on )
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 主)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 備)(PORT = 1521))
)
(CONNECT_DATA =
(SID = tbdb)
)
)
十一、備用庫的失敗切換
11.1失敗切換
一般指主伺服器已經不能使用,必須切換到備用伺服器,所以,只操作備用伺服器這一
端,以下提供一完美切換指令碼
$ more switchprimary.sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/9.2;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib; export
LD_LIBRARY_PATH
ORACLE_SID=tbdb; export ORACLE_SID
ORACLE_NLS=$ORACLE_HOME/ocommon/nls/admin/data; export ORACLE_NLS
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK; export NLS_LANG
NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';export NLS_DATE_FORMAT
26
$ORACLE_HOME/bin/sqlplus /nolog <connect / as sysdba
recover managed standby database cancel;
-- if standby have Standby redo logfile
--alter database recover managed standby database finish;
-- else
alter database recover managed standby database finish skip standby logfile;
-- switch
alter database commit to switchover to primary;
-- open
shutdown immediate
startup pfile=?/dbs/inittbdb.ora
exit
EOF
lsnrctl stop listenerdb
lsnrctl start
最後改tnsnames.ora 將主庫IP:10.0.29.164 與備庫IP:10.0.29.162 對換(即164 與162 對
的即可)
說明:
1、如果在備用端有活動的未歸檔的日誌,或者有從主資料庫拷貝過來的聯機日誌,可以採
用如下的辦法註冊並恢復
SQL> ALTER DATABASE REGISTER LOGFILE '/u01/oracle/oradata/tbdb/archive/1_87.dbf';
SQL>recover standby database;
2、如果有活動日誌,必須用
alter database recover managed standby database finish;
否則用
alter database recover managed standby database finish skip standby logfile;
這樣切換的備用伺服器可以避免最小的資料丟失和不用resetlogs,特別是對於用多個備
用伺服器的時候,該伺服器可以馬上作為主伺服器而不用重新建立備用伺服器。
11.2強行切換(啟用)
這樣的切換是以激和備用伺服器來完成的,在重新啟動資料庫的時候,備用機會
resetlogs,這樣會影響到其它備用伺服器而且必須重新在主伺服器上重新構造備用伺服器,
一般不建議這樣做。
$ more activeprimary.sh
#!/bin/sh
#swith to primary with cancel
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
27
ORACLE_HOME=$ORACLE_BASE/product/9.2;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib; export
LD_LIBRARY_PATH
ORACLE_SID=tbdb; export ORACLE_SID
ORACLE_NLS=$ORACLE_HOME/ocommon/nls/admin/data; export ORACLE_NLS
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK; export NLS_LANG
#cancel and startup database
$ORACLE_HOME/bin/sqlplus /nolog <connect / as sysdba
alter system archive log current;
recover managed standby database cancel;
alter database activate standby database;
shutdown immediate
startup pfile=?/dbs/inittbdb.ora
exit
EOF
lsnrctl stop listenerdb
lsnrctl start
十二、備用庫的備份與恢復
12.1 從備用庫上恢復主庫的資料檔案
在某些情況下,主伺服器可能損壞一個或兩個資料檔案,如果從主資料庫上的備份恢復,理
論上也是可以的,但是可能會因為需要應用到太多的日誌,實際耗時太大,這個時候,我們
可以考慮從備份伺服器上恢復該資料檔案,因為備份伺服器與主資料庫一般只相差一個日誌
檔案左右。
1、關閉備用資料庫
recover managed standby database cancel;
shutdown immediate;
2、拷貝或FTP損壞的資料檔案到主資料庫
3、在主資料庫recover database datafile ‘檔名’即可。
12.2在備用資料庫上進行備份
如果想減輕主庫的壓力,可以在備用資料庫上進行備份,因為備用控制檔案的特性關係,在
對standby的rman備份中,不能修改rman的配置,所以沒有辦法自動備份控制檔案。
可以採用如下的方法備份:
1、採用恢復目錄備份standby資料庫
2、如果採用控制檔案做恢復目錄,注意
Alter database backup controlfile to ‘file name’備份控制檔案。
3、備份資料庫,可以停止恢復程式,跳轉到read only模式下,通過backup database來備份
資料庫,這樣的資料庫處於一致性的模式下
詳細出處參考:http://www.itqun.net/content-detail/109928_4.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70109/viewspace-690254/,如需轉載,請註明出處,否則將追究法律責任。

相關文章