Dataguard日常維護及故障解決

shuyingxi發表於2014-09-03

一、   dataguard環境要求

2.1資料庫版本必須為企業版,版本最好在9i以上,主備庫資料庫的版本必須一致。

2.2 主備資料庫所在作業系統版本以及位數要求一樣。

2.3 主備庫硬體配置可以不一樣,看具體應用。

2.4 主資料庫和備資料庫都可以是單例項的,也可以是RAC

2.5 同一個dataguard環境中資料庫名必須一樣。主備庫的目錄結構要求一樣(邏輯備庫可以不一樣)

2.6關閉192.168.113.133的雙機(服務、例項、監聽)

2.7Sharemountcp檔案

2.8Unix轉換dos2unix –ascii copy….sh copy….sh

二、   對主庫的修改

3.1修改歸檔方式

要使用dataguard做資料庫容災,主庫必須處於歸檔模式下。如果已經是歸檔模式則跳過此步。修改歸檔模式步驟

SQL> archive log list;

Database log mode             No Archive Mode

Automatic archival            Disabled

Archive destination           /opt/arch

Oldest online log sequence    1

Current log sequence          3

可見當前資料庫處於非歸檔模式.

--關閉資料庫

SQL> shutdown immediate;   

啟動資料庫到mount階段

SQL> startup mount;

修改資料庫為歸檔模式

SQL> alter database archivelog;

Database altered.

開啟資料庫

SQL> alter database open;

檢視當前資料庫模式

SQL> archive log list;

Database log mode             Archive Mode

Automatic archival            Enabled

Archive destination           /opt/arch

Oldest online log sequence    1

Next log sequence to archive  3

Current log sequence          3

可見資料庫已經處於歸檔模式 

歸檔模式修改完成。

3.2開啟Forced Logging模式

   查詢當前日誌模式

   SQL>select FORCE_LOGGING from v$database;

       FOR

       ---

       NO

   可見當前資料庫為非強制日誌模式

   修改資料庫為強制日誌模式

   SQL> alter database force logging;

       Database altered.

   再次查詢

   SQL> select FORCE_LOGGING from v$database;

       FOR

       ---

       Yes

提示:關於FORCE LOGGING

想必大家知道有一些DDL語句可以透過指定NOLOGGING子句的方式避免寫redo log(目的是提高速度,某些時候確實有效),指定資料庫FORCE LOGGING模式後,資料庫將會記錄除臨時表空間或臨時回滾段外所有的操作而忽略類似NOLOGGING之類的指定引數。如果在執行force logging時有nologging之類的語句在執行,則force logging會等待直到這類語句全部執行。FORCE LOGGING是做為固定引數儲存在控制檔案中,因此其不受重啟之類操作的影響(只執行一次即可),如果想取消,可以透過alter database no force logging語句關閉強制記錄。

3.3建立密碼檔案

   [oracle@localhost ~]$ orapwd file=orapworcl password=123 force=y

   該密碼檔案預設生成位置為$ORACLE_HOME/dbs目錄.主備庫的密碼必須一致,否則歸檔日誌無法在主備庫之間同步。

3.4修改初始化引數

增加以下引數,如果在初始化引數已經有配置,則看需要做相應的修改。

1、與主庫角色相關的初始化引數說明:

DB_NAME

注意保持同一個Data Guard環境中所有資料庫DB_NAME相同

DB_UNIQUE_NAME

為每一個資料庫指定一個唯一的名稱,以標示同一個dataguard環境中不同的資料庫。

LOG_ARCHIVE_CONFIG 

該引數透過DG_CONFIG屬性羅列同一個Data Guard中所有DB_UNIQUE_NAME(含主庫db及備庫db),以逗號分隔。

例如:LOG_ARCHIVE_CONFIG='DB_CONFIG=(orcl,orcl2)'

LOG_ARCHIVE_DEST_n 

歸檔檔案的生成路徑。該引數非常重要,dataguard就是透過這裡的設定傳輸日誌的。

LOG_ARCHIVE_DEST_STATE_n

指定引數值為ENABLE,標示對應的LOG_ARCHIVE_DEST_n引數是否有效。

REMOTE_LOGIN_PASSWORDFILE

推薦設定引數值為EXCLUSIVE或者SHARED,注意保證相同Data Guard配置中所有db伺服器sys密碼相同。如果不同日誌傳輸會失敗。資料庫預設是EXCLUSIVE,一般不用修改。

LOG_ARCHIVE_FORMAT

指定歸檔檔案格式。一般也不用修改,保持預設即可

 

2、以下引數為備庫角色相關的引數,建議在主庫的初始化引數中也進行設定,這樣在主備庫角色相互轉換後不需要做修改dataguard也能正常執行。

FAL_SERVER 

指定備庫到主資料庫的連線服務名,FAL_SERVER = orcl2日誌所在伺服器。

FAL_CLIENT 

指定主庫到備庫的連線服務名,FAL_CLIENT = orcl日誌接收客戶端。

 

STANDBY_FILE_MANAGEMENT

如果主庫的資料檔案發生修改(如新建,重新命名等)則按照本引數的設定在備庫中做相應修改。設為AUTO表示自動。設為MANUAL表示需要手工管理。

例如:STANDBY_FILE_MANAGEMENT=AUTO

 

下面開始修改主庫的初始化引數。

db_name引數已經設定,不用修改

SQL> alter system set db_unique_name =’orcl’ scope=spfile;

System altered.

 

SQL> alter system set log_archive_config='dg_config=(orcl,orcl2)' scope=spfile;

System altered.

---這裡的orclorcl2db_unique_name

 

SQL> alter system set log_archive_dest_1='location=/opt/arch' scope=spfile;

System altered.

--/opt/arch為本地的歸檔目錄,需要手動建立該目錄,當然也可以指定別的路徑。

注意oracle賬號對該目錄又可讀寫的許可權。

 

SQL> alter system set log_archive_dest_state_1=enable scope=spfile;

System altered.

--這個通常不用修改,系統預設的就是enable

SQL>alter system set log_archive_dest_2='service=orcl2

valid_for=(online_logfiles,primary_role) arch async NOAFFIRM

db_unique_name=orcl2' scope=spfile;

System altered.

-----這裡的service為主庫連線到備庫的服務名,後面會在tnsnames.ora檔案中配置

valid_for引數說明這個歸檔日誌目的地在本資料庫為主庫的角色下才需要把online_logfile傳輸到備庫去。arch async NOAFFIRM說明的是同步的方式,這個同步的方式有三種方式,最大保護,最大效能,最大可用。每個方式有不同的設定,具體見第五項說明。

 

SQL> alter system set log_archive_dest_state_2=enable scope=spfile;

System altered.

以上修改的是作為主庫角色需要的引數,為了方便以後主備庫切換,建議在主庫中也配置作為備庫角色的相關引數。

SQL> alter system set fal_server=orcl2 scope=spfile;

System altered.

 

SQL> alter system set fal_client=orcl scope=spfile;

System altered.

 

SQL> alter system set standby_file_management=auto scope=spfile;

System altered.

生成靜態引數檔案,以備後面給備庫使用。

SQL> create pfile from spfile;

File created.

重新啟動主庫,使引數生效。

3.5rman工具備份主庫

建立一個備份檔案存放目錄,本例為/opt/rmanbk,同時賦予oracle賬號可讀寫該目錄。

[root@localhost opt]# mkdir rmanbk

[root@localhost opt]# chown oracle:oinstall rmanbk

--注意以上用root賬號建立目錄

開始備份資料庫

[oracle@localhost ~]$ rman target /

Recovery Manager: Release10.2.0.1.0 - Production on Tue Aug 17 09:40:45 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database: ORCL (DBID=1564056489)

RMAN>backup full database format='/opt/rmanbk/%d_%s.dbf' plus archivelog delete input;

 

Starting backup at 17-AUG-10

current log archived

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=147 devtype=DISK

channel ORA_DISK_1: starting archive log backupset

channel ORA_DISK_1: specifying archive log(s) in backup set

input archive log thread=1 sequence=3 recid=1 stamp=727261781

input archive log thread=1 sequence=4 recid=2 stamp=727263902

channel ORA_DISK_1: starting piece 1 at 17-AUG-10

channel ORA_DISK_1: finished piece 1 at 17-AUG-10

piece handle=/opt/oracle/product/10.2.0/db_1/flash_recovery_area/ORCL/backupset/2010_08_17/o1_mf_annnn_TAG20100817T094503_66mtf0qt_.bkp tag=TAG20100817T094503 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:04

channel ORA_DISK_1: deleting archive log(s)

archive log filename=/opt/arch/1_3_726573806.dbf recid=1 stamp=727261781

archive log filename=/opt/arch/1_4_726573806.dbf recid=2 stamp=727263902

Finished backup at 17-AUG-10

 

Starting backup at 17-AUG-10

using channel ORA_DISK_1

channel ORA_DISK_1: starting full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00001 name=/opt/oradata/orcl/system01.dbf

input datafile fno=00003 name=/opt/oradata/orcl/sysaux01.dbf

input datafile fno=00002 name=/opt/oradata/orcl/undotbs01.dbf

input datafile fno=00004 name=/opt/oradata/orcl/users01.dbf

channel ORA_DISK_1: starting piece 1 at 17-AUG-10

channel ORA_DISK_1: finished piece 1 at 17-AUG-10

piece handle=/opt/rmanbk/ORCL_2.dbf tag=TAG20100817T094507 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:01:05

channel ORA_DISK_1: starting full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

including current control file in backupset

including current SPFILE in backupset

channel ORA_DISK_1: starting piece 1 at 17-AUG-10

channel ORA_DISK_1: finished piece 1 at 17-AUG-10

piece handle=/opt/rmanbk/ORCL_3.dbf tag=TAG20100817T094507 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03

Finished backup at 17-AUG-10

 

Starting backup at 17-AUG-10

current log archived

using channel ORA_DISK_1

channel ORA_DISK_1: starting archive log backupset

channel ORA_DISK_1: specifying archive log(s) in backup set

input archive log thread=1 sequence=5 recid=3 stamp=727263976

channel ORA_DISK_1: starting piece 1 at 17-AUG-10

channel ORA_DISK_1: finished piece 1 at 17-AUG-10

piece handle=/opt/oracle/product/10.2.0/db_1/flash_recovery_area/ORCL/backupset/2010_08_17/o1_mf_annnn_TAG20100817T094616_66mth9qz_.bkp tag=TAG20100817T094616 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02

channel ORA_DISK_1: deleting archive log(s)

archive log filename=/opt/arch/1_5_726573806.dbf recid=3 stamp=727263976

Finished backup at 17-AUG-10

主庫備份完成

3.6建立備庫控制檔案

SQL> alter database create standby controlfile as '/opt/rmanbk/control01.ctl';

 

Database altered.

建立一個備庫使用的控制檔案。

到此我們已經為備庫準備好了靜態引數檔案,備庫控制檔案,主庫資料庫備份。

在備庫主機上建一目錄,把上述檔案透過scp命令傳輸到備庫主機上。其中備份目錄要和主庫上的備份目錄路徑一樣,不然在用rman還原備庫時候會找不到檔案。即在備庫上也建一個目錄/opt/rmanbk,我們把所有的檔案都放在這個目錄下。

[oracle@localhost ~]$ scp /opt/rmanbk/* oracle@192.168.18.205:/opt/rmanbk/

The authenticity of host '192.168.18.205 (192.168.18.205)' can't be established.

RSA key fingerprint is de:b4:0e:e6:c5:56:71:47:e1:69:5e:f1:c5:8b:48:b4.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.18.205' (RSA) to the list of known hosts.

oracle@192.168.18.205's password:

control01.ctl                                    100% 6896KB  6.7MB/s  00:00   

ORCL_2.dbf                                  100% 523MB 11.6MB/s  00:45   

ORCL_3.dbf                                      100% 6976KB  6.8MB/s  00:00 

上述已經傳輸了備份檔案和備庫的控制檔案,下面把主庫的靜態引數檔案傳輸到備庫

[oracle@localhost~]$

scp $ORACLE_HOME/dbs/initorcl.ora oracle@192.168.18.205:/opt/rmanbk/

oracle@192.168.18.205's password:

initorcl.ora                                    100% 1419    1.4KB/s  00:00

3.7建立備庫的redo log

 

sql> alter database add standby logfile group 4 ('D:\oracle\product\10.2.0\oradata\smsdb\STANDBYRD01.LOG') size 50M;

sql> alter database add standby logfile group 5 ('D:\oracle\product\10.2.0\oradata\smsdb\STANDBYRD02.LOG') size 50M;

 sql> alter database add standby logfile group 6 ('D:\oracle\product\10.2.0\oradata\smsdb\STANDBYRD03.LOG') size 50M;

3.8修改listener.oratnsnames.ora

修改listener.ora檔案,修改這部分內容,目的是使用oracle服務在監聽器中靜態註冊。

SID_LIST_LISTENER =

 (SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

     (PROGRAM = extproc)

   )

 )

修改成(增加紅色部分內容)

SID_LIST_LISTENER =

 (SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

     (PROGRAM = extproc)

   )

   (SID_DESC =

     (GLOBAL_DBNAME = orcl)

     (ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

     (SID_NAME = orcl)

   )

  )

【備註】

當使用靜態註冊的時候, 

(SID_NAME = orcl)中的sid_name務必要小寫,不管資料庫中instance_name引數是否是大寫。不然透過靜態註冊的服務無法連線資料庫例項。同oracle使用者的環境變數ORACLE_SID一樣,也必須用小寫。

修改靜態註冊可以使用netmgr工具配置。

修改tnsnames.ora檔案,增加主庫連線到備庫的服務名並修改對本地的連線用ip表示.

這樣主備庫可以統一。

orcl =

 (DESCRIPTION =

   (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.18.32)(PORT = 1521))

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = orcl)

   )

 )

orcl2 =

 (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.18.205)(PORT = 1521))

   )

   (CONNECT_DATA =

     (SERVICE_NAME = orcl2)

   )

 )

 

host地址根據實際情況修改。

到此對主庫的修改基本完成。

三、   對備庫的修改

4.1設定oracle環境變數和oracle例項名

修改oracle賬號根目錄下的.bash_profile檔案。增加紅色部分程式碼。目的是建立一個資料庫例項sid

[oracle@localhost ~]$ vi .bash_profile

# .bash_profile

 

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

       . ~/.bashrc

fi

 

# User specific environment and startup programs

 

PATH=$PATH:$HOME/bin

 

export PATH

export LC_ALL=en_US.UTF-8

export ORACLE_HOME=/opt/oracle/product/10.2.0/db_1

export PATH=$PATH:$ORACLE_HOME/bin

export NLS_LANG=american_america.ZHS16GBK

export ORACLE_SID=orcl2

4.2建立備庫的引數檔案

備庫的引數檔案我們根據主庫的引數檔案做一些修改即可。

複製/opt/rmanbk/initorcl.ora$ORACLE_HOME/dbs/initorcl2.ora。注意要修改引數檔名稱。(oracle資料庫預設的靜態引數檔名稱為init+$ORACLE_SID+.ora)

[oracle@localhost ~]$ cp /opt/rmanbk/initorcl.ora $ORACLE_HOME/dbs/initorcl2.ora

修改initorcl2.ora檔案內容,需要修改的部分以及修改後如下:

*.db_unique_name='ORCL2'

*.fal_client='ORCL2'  

*.fal_server='ORCL'

*.log_archive_dest_2='service=orcl valid_for=(online_logfiles,primary_role) arch async NOAFFIRM db_unique_name=orcl'

刪除*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'

刪除 (如果備庫不存在flash目錄則刪除)

*.db_recovery_file_dest='/opt/oracle/product/10.2.0/db_1/flash_recovery_area'

刪除(如果備庫不存在flash目錄則刪除)

*.db_recovery_file_dest_size=2147483648

 

別的不需要改動。儘量保持主備庫的sgapga相關引數一樣。

 

4.3建立備庫相關的目錄

參考主庫在備庫上建立相關的資料庫目錄

[oracle@localhost ~]$ mkdir /opt/arch

建立備庫的本地歸檔目錄

[oracle@localhost ~]$ mkdir /opt/oradata/orcl 

建立資料庫目錄

[oracle@localhost ~]$ mkdir /opt/rmanbk

建立資料庫備份檔案目錄

[oracle@localhost ~]$  

mkdir -p $ORACLE_HOME/admin/orcl/{adump,bdump,cdump,dpdump,pfile,udump}

建立資料庫後臺執行日誌目錄,這些目錄是需要同引數檔案中的設定一致的。

4.4建立備庫密碼檔案

可以手動建也可以複製主庫的密碼檔案,前提是主備庫設定的密碼要一致,否則日誌傳輸會失敗。

[oracle@localhost ~]$orapwd file=orapworcl2 password=123 force=y

注意檔名稱不能有誤,否則主庫連線不上備庫,導致歸檔日誌同步失敗

4.5修改listener.oratnsnames.ora

可以複製主庫的listener.ora,tnsnames.ora,sqlnet.ora三個檔案到備庫。方法同上3.6

sqlnet.ora檔案和tnsnames.ora檔案不用修改,與主庫保持一樣即可。

 

修改listener.ora檔案,修改這部分內容,目的是使用oracle服務在監聽器中靜態註冊。

SID_LIST_LISTENER =

 (SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

     (PROGRAM = extproc)

   )

 )

修改成(增加紅色部分內容)

SID_LIST_LISTENER =

 (SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

     (PROGRAM = extproc)

   )

   (SID_DESC =

     (GLOBAL_DBNAME = orcl2)

     (ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

     (SID_NAME = orcl2)

   )

  )

這個時候在主備庫上分別用tnsping命令測試orclorcl2服務名看是否通。如果不通則修改檢查以上檔案配置是否正確。

[oracle@localhost admin]$ tnsping orcl2

TNSPingUtility for Linux: Version10.2.0.1.0 - Production on 18-AUG-2010 19:32:00

 

Copyright (c) 1997, 2005, Oracle. All rights reserved.

Used parameter files:

/opt/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora

 

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.18.205)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl2)))

OK (0 msec)

 

[oracle@localhost admin]$ tnsping orcl

TNSPingUtility for Linux: Version10.2.0.1.0 - Production on 18-AUG-2010 19:33:38

Copyright (c) 1997, 2005, Oracle. All rights reserved.

Used parameter files:

/opt/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora

 

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST=192.168.18.32)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))

OK (10 msec)

從上面兩個服務名均已經互通。

4.6恢復控制檔案

複製三份備庫控制檔案到資料庫目錄

[oracle@localhost rmanbk]$ cp control01.ctl /opt/oradata/orcl/control01.ctl

[oracle@localhost rmanbk]$ cp control01.ctl /opt/oradata/orcl/control02.ctl

[oracle@localhost rmanbk]$ cp control01.ctl /opt/oradata/orcl/control03.ctl

4.7RMAN還原出備庫

[oracle@localhost ~]$ rman target /

Recovery Manager: Release10.2.0.1.0 - Production on Wed Aug 18 19:46:59 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database (not started)

RMAN> startup mount;

Oracle instance started

database mounted

Total System Global Area    167772160 bytes

Fixed Size                    1218292 bytes

Variable Size                62916876 bytes

Database Buffers             96468992 bytes

Redo Buffers                  7168000 bytes

啟動資料庫到mount階段,準備還原

RMAN> restore database;

Starting restore at 18-AUG-10

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=157 devtype=DISK

 

channel ORA_DISK_1: starting datafile backupset restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

restoring datafile 00001 to /opt/oradata/orcl/system01.dbf

restoring datafile 00002 to /opt/oradata/orcl/undotbs01.dbf

restoring datafile 00003 to /opt/oradata/orcl/sysaux01.dbf

restoring datafile 00004 to /opt/oradata/orcl/users01.dbf

channel ORA_DISK_1: reading from backup piece /opt/rmanbk/ORCL_2.dbf

channel ORA_DISK_1: restored backup piece 1

piece handle=/opt/rmanbk/ORCL_2.dbf tag=TAG20100817T094507

channel ORA_DISK_1: restore complete, elapsed time: 00:01:05

Finished restore at 18-AUG-10

RMAN>exit

退出rman恢復管理器

到此備庫基本建立完成。

4.8開啟備庫

建立備庫的動態引數檔案

SQL> create spfile from pfile;

關閉資料庫

SQL> shutdown immediate;

啟動備庫到mount狀態

SQL> startup mount;

開始應用日誌恢復

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

使備庫處於日誌恢復模式(備用模式)。

SQL> select process,status from v$managed_standby;

PROCESS  STATUS

--------- ------------

ARCH     CONNECTED

ARCH     CONNECTED

RFS      IDLE

MRP0     WAIT_FOR_LOG

這時候備庫的程式有以上幾個,

RFS - 遠端檔案接收程式

MRP0 -日誌應用程式

 

到此,需要測試一下備庫是否可以接收到主庫的歸檔日誌。可在主庫中手動歸檔一個日誌檔案(alter system switch logfile),然後檢視在備庫的歸檔目錄中是否生成有新的歸檔日誌檔案,也可以在備庫中用一下語句查詢是否存在日誌歸檔記錄。

select name,SEQUENCE#,APPLIED from v$archived_log order by sequence#;

 

備註:

對於物理備庫(physical standby)來說,處於日誌恢復模式的時候資料庫是不能開啟的。如果要開啟只能先關閉日誌恢復模式,然後以read only(只讀方式)開啟。

oracle11G版本可以在read only下應用歸檔日誌)

SQL>alter database recover managed standby database cancel;

停止日誌恢復模式

SQL>alter database open read only;

開啟資料庫。

物理備庫在只讀模式下可以增加臨時檔案。
SQL> alter database temp add tempfile '/opt/oradata/orcl/temp02.dbf' size100mreuse;

這個時候備庫還是可以接收主庫傳輸過來的歸檔日誌檔案,只是不能應用日誌而已。

當用read only方式開啟備庫後只有重新啟動才能使備庫重新回到備用模式。

4.9切換到DATAGUARD最大可用模式並開啟實時應用

一般情況下,到4.8步驟為止,dataguard的物理備庫已經可以正常使用了。只是這時dataguard處於預設的最大效能模式,這個模式下,主庫的重做日誌只有在歸檔之後才會傳輸到備庫上,然後備庫才會應用日誌。如果在歸檔之前主庫資料庫意外down機,那麼這部分未歸檔的資料肯會丟失。為了避免這種情況的發生,可以使用最大可用模式。Oracle推薦最大可用模式使用LGWR ASYNC(非同步)NOAFFIRM模式傳輸。實際的生產庫推薦這種模式。在standby不可用時,最大可用模式會自動降低成最大效能模式,所以standby故障不會導致primay不可用。對於dataguard模式的介紹。以下是在dataguard預設的最大效能模式下切換到實際生成用途的最大可用模式.

 

1,在備庫上增加備用重做日誌檔案,大小跟主庫的線上重做日誌一樣。組的數量最好比線上重做日誌多一兩組(可調)。

sql>alterdatabaserecovermanagedstandbydatabasecancel;

--先取消日誌應用

sql > system altered

sql>alterdatabaseaddstandbylogfilegroup4('/opt/oradata/primary/std_redo01.log')size50M;

sql > system altered

sql>alterdatabaseaddstandbylogfilegroup5 ('/opt/oradata/primary/std_redo02.log')size50M;

sql > system altered

sql>alterdatabaseaddstandbylogfilegroup6 ('/opt/oradata/primary/std_redo03.log')size50M;

sql > system altered

sql>alterdatabaseaddstandbylogfilegroup7

 ('/opt/oradata/primary/std_redo04.log')size50M;

sql > system altered

 

sql>recovermanagedstandbydatabasedisconnectfromsession;

------非實時應用模式或者用下面的語句開啟備庫的實時應用模式

sql>recovermanagedstandbydatabaseusing current logfile

disconnectfromsession;

 

鑑於後面主備庫切換的需要,在主庫上也增加備用重做日誌。當然要把主庫處於mount狀態下才可新增。可在下面統一修改。

2,在主庫上做修改(兩個地方:一個是修改log_archive_dest_2引數,二是新增備用日誌檔案)

sql>shutdownimmediate;

sql> startupmount;

sql>altersystemsetlog_archive_dest_2=’service=orcl

 valid_for=(online_logfiles,priamry_role) lgwr async noaffirm

db_unique_name=orcl2’scope=spfile;

sql>alterdatabaseaddstandbylogfilegroup4('/opt/oradata/primary/std_redo01.log')size50M;

sql>systemaltered

sql>alterdatabaseaddstandbylogfilegroup5 ('/opt/oradata/primary/std_redo02.log')size50M;

sql>systemaltered

sql>alterdatabaseaddstandbylogfilegroup6 ('/opt/oradata/primary/std_redo03.log')size50M;

sql>systemaltered

sql>alterdatabaseaddstandbylogfilegroup7

 ('/opt/oradata/primary/std_redo04.log')size50M;

sql>systemaltered

sql > alter database set standby database to maximize availability;

--------切換到最大可用模式

sql > alter database open;

開啟資料庫

 

【注意事項】

1,lgwr async noaffirm引數下主庫的模式保護級別為RESYNCHRONIZATION

 

SQL>selectdatabase_role,PROTECTION_MODE,PROTECTION_LEVELfromv$database;

DATABASE_ROLE   PROTECTION_MODE     PROTECTION_LEVEL

-----------   ----------------    ---------------

PRIMARY        MAXIMUMAVAILABILITYRESYNCHRONIZATION

 

備庫的查詢結果為:UNPROTECTED

 

DATABASE_ROLE     PROTECTION_MODE     PROTECTION_LEVEL

---------------- -------------------- --------------------

PHYSICALSTANDBY  UNPROTECTED         UNPROTECTED

 

2,lgwr sync affirm引數下主庫的模式保護級別為MAXIMUMAVAILABILITY

 

SQL>selectdatabase_role,PROTECTION_MODE,PROTECTION_LEVELfromv$database;

DATABASE_ROLE   PROTECTION_MODE     PROTECTION_LEVEL

-----------   ----------------    ---------------

PRIMARY        MAXIMUMAVAILABILITYMAXIMUMAVAILABILITY

 

備庫的查詢結果為:MAXIMUMAVAILABILITY

 

DATABASE_ROLE     PROTECTION_MODE          PROTECTION_LEVEL

---------------- --------------------     --------------------

PHYSICALSTANDBY  MAXIMUMAVAILABILITY    MAXIMUMAVAILABILITY

 

為了不給生產庫帶來太大的影響,推薦使用第一種引數。對於主庫採用lgwr傳輸日誌的方式。日誌是實時傳輸的,至於備庫是否採用實時恢復模式都是不會丟失資料的。

四、   DATAGUARD的三種保護模式說明

Dataguard有三種保護模式,最大保護、最大可用性和最大效能,對主庫的效能影響和對網路的要求依次降低。
  在最大保護模式下,備庫一旦無法接收日誌,主庫的所有操作被掛起,與備庫的日誌傳輸恢復正常時才會恢復,如果掛起時間較長,主庫例項會中斷,因此一般生產環境中很少會使用這種模式。在最大可用性模式下,當與備庫的日誌傳輸斷開時,主庫會自動切換到最大效能模式。dataguard預設的配置是最大效能模式。

三種模式的日誌同步引數設定如下表:

 

最大保護模式

最大可用模式

最大效能模式

Redo archival process

LGWR

LGWR

LGWR or ARCH

Network transmission
mode

SYNC

SYNC

SYNC or ASYNC when using LGWR process. SYNC if using ARCH process.

Disk write option

AFFIRM

AFFIRM

AFFIRM or NOAFFIRM

Standby redo log required?

Yes

Yes

No, but it is recommended

 三種模式在故障發生時候得不同點如下表:

 

最大保護模式

最大可用模式

最大效能模式

對主資料庫效能影響

最大

中等

最小

資料丟失可能性

不會

正常情況下不會丟資料,除非剛剛處於最大效能模式

會丟資料

故障發生時描述

當備庫日誌不可到達時,主資料庫會down機,不適合生成用途。

當備庫的日誌不可到達時會自動切換到最大效能模式。故障排除後自動切換回最大可用模式。

備庫日誌不可到達不會影響主庫的可用性。

是否需要standy redo file

需要

需要

不需要

最大保護和最大可用模式都需要用到備用重做日誌(standby redo logfile )

新增原則:

standby redo log的檔案大小與primary資料庫online redo log檔案大小相同。

standby redo log的組數最好比主庫多。

新增方法:

先停止備庫的日誌應用。

sql>alter database recover managed standby database cancel;

sql > alter database add standby logfile group 4

('/opt/oradata/primary/std_redo01.log') size50M;

 

sql > alter database add standby logfile group 5

('/opt/oradata/primary/std_redo02.log') size50M;

 

sql > alter database add standby logfile group 6

('/opt/oradata/primary/std_redo03.log') size50M;

 

sql > alter database add standby logfile group 7

('/opt/oradata/primary/std_redo04.log') size50M;

 

sql>alter database recover managed standby database disconnect from session;

鑑於主備發生角色轉換的需要,也應該在主庫上同樣新增備用日誌檔案。

切換standby的保護模式,在主庫上執行


SQL>ALTER DATABASE SET STANDBY DATABASE TO maximize protection;
SQL>ALTER DATABASE SET STANDBY DATABASE TO maximize performance;

預設的保護模式
SQL>ALTER DATABASE SET STANDBY DATABASE TO maximize availability;
說明:切換保護模式的操作必須在primay執行,且primay必須處於mount狀態,如果在open狀態執行,則報ORA-01126錯。

ORA-01126: database must be mounted EXCLUSIVE and not open for this operation

SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database set standby database to maximize availability;
SQL> alter database open;
     
注:此處會報ORA-03113錯誤。

     ORA-03113: end-of-file on communication channel
     
這時需要先修改日誌傳送方式為lgwr同步方式,否則,資料庫是無法open的。

SQL> conn / as sysdba
SQL> startup mount;
SQL> alter system set log_archive_dest_2='service=orcl2 lgwr sync affirm

db_unique_name=orcl2';
SQL> alter database open;

 

【注意】在主庫修改了保護模式後需要重啟後,備庫的保護模式才會被修改.只有最大可用和最大保護模式才可能實現DG的資料實時同步。修改實時同步的方法:

SQL> alter database recover managed standby database using current logfile disconnect from session;

 

五、   Dataguard日常維護

6.1主備庫的起停和維護

Dataguard關閉(先關主庫再關備庫)

Dataguard開啟(先開備庫再開主庫)

6.2日常的監控檢視

1,select dest_name,status,error from v$archive_dest;

在主庫上執行只主要是檢視日誌歸檔目的地是否可用,如果遠端歸檔目錄不可用則error會顯示錯誤資訊。

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  INACTIVE

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.

如上記錄則代表備庫歸檔日誌目錄有效且正常。

 

2,select database_role,LOG_MODE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;主要查詢資料庫的主備角色,以及當前dataguard保護的模式,主備庫上查詢結果不同。

 

SQL>select database_role,LOG_MODE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;

 

DATABASE_ROLE   LOG_MODE    PROTECTION_MODE     PROTECTION_LEVEL

---------------- ------------ -------------------- --------------------

PRIMARY         ARCHIVELOG  MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

 

3, select name,SEQUENCE#,APPLIED from v$archived_log order by sequence#;

主要查詢歸檔日誌的應用情況。主備庫上查詢結果不同,在主庫上對於每個歸檔檔案會有

兩條記錄。下面是在備庫上的查詢結果,可以看見日誌應用都YES

SQL> select name,SEQUENCE#,APPLIED from v$archived_log order by sequence#;

NAME                           SEQUENCE# APP

------------------------------ ---------- ---

/opt/arch/1_5_726573806.dbf            5 YES

/opt/arch/1_6_726573806.dbf            6 YES

/opt/arch/1_7_726573806.dbf            7 YES

/opt/arch/1_8_726573806.dbf            8 YES

/opt/arch/1_9_726573806.dbf            9 YES

/opt/arch/1_10_726573806.dbf          10 YES

/opt/arch/1_11_726573806.dbf          11 YES

/opt/arch/1_12_726573806.dbf          12 YES

/opt/arch/1_13_726573806.dbf          13 YES

如果有發現日誌不連續,則需要對照主庫的歸檔日誌序列,判斷是否有丟失的日誌,如果有則需要手動註冊日誌並應用歸檔。(方法:從主庫的歸檔目錄複製相應的歸檔檔案到備庫上註冊alter database register physical logfile '/opt/arch/歸檔檔名’;然後手動應用日誌alter database recover automatic standby database;

在測試過程中發現oracle10G下把丟失的歸檔日誌檔案考入指定目錄會自動註冊,不需手動註冊。)

 

4select process,status from v$managed_standby;

--查詢主備庫上的程式資訊。

5select message_num,message from v$dataguard_status;

--檢視dataguard的狀態資訊。

6,select * from v$archive_gap;

--在備庫檢查是否有日誌缺失

6.3主備庫的切換方法

主備庫的切換主要在兩種情況下切換,SwitchoverFailover,這兩種切換都需要手工執行完成。

一是Switchover(計劃中的切換,不會丟失資料)

二是Failover(當主庫出現故障的時候需要主備庫切換角色)

1,Switchover的切換方法

主庫端:

select switchover_status from v$database;

如果是to standby表可以正常切換.

直接執行alter database commit to switchover to physical standby;

否則執行:alter database commit to switchover to physical standby with session shutdown;

shutdown immediate;

startup nomount;

alter database mount standby database;

alter database recover managed standby database disconnect from session;

 

備庫端:

select switchover_status from v$database;

如果是to_primary表可以正常切換.

執行: alter database commit to switchover to primary;

否則執行: alter database commit to switchover to primary with session shutdown;

shutdown immediate;

startup;

2,Failover切換方法

(1)判斷主資料庫確實出現嚴重的硬體故障或其他原因導致主資料庫無法啟動。

(2)在物理備用資料庫上檢查是否有archive redo log gaps

   SQL>SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;

(3)消除archive redo log gaps

從主資料庫上或其他備份的地方把沒有傳到物理備用資料庫的archive redo log傳到物理備用資料庫上,並註冊到物理備用資料庫的controlfile中。

  SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'archive redo log檔名稱';

重複2,3步驟直到V$ARCHIVE_GAP檢視無記錄存在。

(4)在物理備用資料庫上發起failover操作

SQL > ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;

(5)把物理備用資料庫轉化成主用角色

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

(6)把新的主用資料庫重新啟動

  SQL> SHUTDOWN IMMEDIATE;

SQL> STARTUP;

(7)對新的主用資料庫做全備份.

6.4歸檔日誌的處理

1, 物理備庫中已經應用的歸檔日誌需定期刪除.

 rman> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

刪除7天前的歸檔日誌檔案。刪除之後最好做一個全備份。

2, 先手動刪除歸檔日誌檔案,然後再RMAN裡執行下面2條命令以更新控制檔案
crosscheck archivelog all;
delete expired archivelog all;

3, 取消對備庫傳送日誌
ALTER SYSTEM SET log_archive_dest_state_2=’DEFER’ ;

 

六、   常見故障

7.1備庫重啟後,在主庫上歸檔出現ORA-03113錯誤

SQL> select dest_name,status,error from v$archive_dest;

 

DEST_NAME                     STATUS                        ERROR

------------------------------ --------

LOG_ARCHIVE_DEST_1           VALID

LOG_ARCHIVE_DEST_2      ERROR          ORA-03113: end-of-file on   communication channel

解決辦法:在主庫執行

SQL> alter system set log_archive_dest_state_2= enable;

這個命令式手動觸發主庫區嘗試連線備庫。

其實這種情況下,只要保證主備庫之間的網路和配置是正確的。dataguard會自動恢復這個錯誤。這個週期預設是300秒,也可以在log_archive_dest_2的引數中新增reopen引數指定這個主備庫之間失敗後繼續嘗試的週期。

7.2ORA-01031: insufficient privileges錯誤

SQL> select dest_name,status,error from v$archive_dest;

DEST_NAME                     STATUS                        ERROR

---------------------- -----------------------------------------------

LOG_ARCHIVE_DEST_1            VALID

LOG_ARCHIVE_DEST_2            ERROR             ORA-01031: insufficient

                                                             Privileges

解決辦法:統一主備庫的資料庫密碼檔案,或者重建密碼檔案,sys密碼設定成一樣。

然後在主庫執行

SQL> alter system set log_archive_dest_state_2= enable;

7.3ORA-16191: Primary log shipping client not logged on standby

SQL> select dest_name,status,error from v$archive_dest;

 

DEST_NAME                     STATUS                        ERROR

------------------------------ -----------

LOG_ARCHIVE_DEST_1            VALID

LOG_ARCHIVE_DEST_2           ERROR                    ORA-16191: Primary log   shipping client not logged on standby

解決辦法:統一主備庫的資料庫密碼檔案,或者重建密碼檔案,sys密碼設定成一樣。

然後在主庫執行

SQL> alter system set log_archive_dest_state_2= enable;

7.4發現備庫一直無法應用日誌,MRP0程式顯示WAIT_FOR_GAP的問題

發現從主庫傳來的日誌無法應用

在備庫檢查,
SQL> select sequence#,applied from v$archived_log;

 SEQUENCE# APP
———- —
       930 NO
       931 NO
       932 NO
       933 NO
       934 NO
       935 NO
       936 NO
       937 NO
       938 NO
       939 NO
       940 NO
然後開始檢視有沒有mrp

[oracle@HJITBACKUP bdump]$ ps -ef | grep mrp
oracle   31896     1  0 14:37 ?        00:00:00 ora_mrp0_flow
oracle   32001 31820  0 15:17 pts/1    00:00:00 grep mrp

看來有,接著查gap,發現備庫上有此程式,

SQL> select * from v$archive_gap
  2  ;

no rows selected

查詢檢視沒有發現,

在接著檢查V$MANAGED_STANDBY

SQL> select process,status from v$managed_standby;

PROCESS   STATUS
——— ————
ARCH      CONNECTED
ARCH      CONNECTED
MRP0     WAIT_FOR_GAP
RFS       IDLE
RFS       IDLE

發現MRP0在等待GAP,進一步檢視此檢視

select process,status,group#,thread#,sequence#,block#,blocks from v$managed_standby;

PROCESS   STATUS       GROUP#        THREAD#  SEQUENCE#     BLOCK#     BLOCKS
——— ———— ———- ———- ———- ———- ———-
ARCH      CONNECTED    N/A                 0          0          0          0
ARCH      CONNECTED    N/A                 0          0          0          0
MRP0      WAIT_FOR_GAP N/A                 1       928          0          0
RFS       IDLE         N/A                 0          0          0          0
RFS       IDLE         N/A                 0          0          0          0
發現日誌928沒有應用,

原來是由於主庫刪除了928,導致備庫沒法應用,所以只能從備份中恢復,restore archivelog
至此問題處理完畢。

查詢備庫狀態
SQL> select process,status from v$managed_standby;

PROCESS   STATUS
——— ————
ARCH      CONNECTED
ARCH      CONNECTED
MRP0      WAIT_FOR_LOG
RFS       IDLE
RFS       IDLE
所以當standby裝完後,在主庫切換日誌後,這裡狀態應該是

MRP0      WAIT_FOR_LOG
才是正常的狀態

七、   注意事項

建議在主備庫的涉及到名稱地方都統一用小寫字母,避免在配置過程出現莫名的錯誤。

如果在主庫執行alter database clear unarchived logfilealter database open resetlogs,則dataguard要重建。

在連續恢復模式下工作之前,需要保證之前所有的歸檔日誌己經應用到備用庫上。因為在連續恢復模式的情況下,oracle不會應用之前的歸檔日誌,而只會應用後面陸續到來的歸檔日誌。

新建表、表空間、datafile都能透過日誌應用到備庫,但新建一個臨時表空間和rename datafile均不能應用到備庫上。

出現歸檔日誌gap時,需要找出相應的歸檔日誌,然後將這些歸檔日誌copy到備用節點的log_archive_dest目錄下面。然後ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE;

應當實時察看standby庫的alert檔案,就能清晰明瞭地知道主備更新的情況。這也是排錯的重要方法。

 

相關檢視

V$ARCHIVE_DEST
V$ARCHIVE_DEST_STATUS
V$ARCHIVE_GAP
V$ARCHIVED_LOG
V$DATABASE
V$DATAFILE
V$DATAGUARD_STATUS
V$LOG
V$LOGFILE
V$LOG_HISTORY
V$STANDBY_LOG

轉自:http://blog.163.com/scott_guo/blog/static/18102608320121111113518691/

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

相關文章