1. 程式人生 > >oracle 11g ADG實施手冊

oracle 11g ADG實施手冊

一:實驗環境介紹

虛擬機器系統:    RHEL Linux 6.4(64位)

資料庫版本:    Oracle 11gR2 11.2.0.4 (64位)

IP地址規劃:

主資料庫

192.168.11.120  

SID:pri

db_name:pri

db_unique_name:pri

備份資料庫

192.168.11.121 

SID:std

db_name:pri

db_unique_name:std

安裝完成後可以通過以下命令查詢:

select dbid,name,open_mode,db_unique_name from v$database;

select instance_name from v$instance;

基礎要求:(1)安裝兩臺虛擬機器分別作為主庫和備庫,硬碟大小隨意。但要保證

根分割槽有20G,別給太小了就行。實體記憶體1G,SWAP 2G

關於Active database duplication方式:(必看)

在Oracle 10g下,我們可以使用RMAN duplicate 命令建立一個具有不同DBID 的複製庫。 到了Oracle 11gR2, RMAN 的duplicate 有2種方法實現:

1. Active database duplication    (本文所使用的方式,適用於11gR2之後的版本)

2. Backup-based duplication        (傳統方式,10g,11g通用)

Active database duplication 通過網路,直接copy target 庫到auxiliary 庫,然後建立複製庫。這種方法就不需要先用RMAN 備份資料庫,然後將備份檔案傳送到auxiliary端。

這個功能的作用是非常大的。 尤其是對T級別的庫。 因為對這樣的庫進行備份,然後將備份集傳送到備庫,在進行duplicate 的代價是非常大的。 一備份要佔用時間,二要佔用備份空間,三在網路傳送的時候,還需要佔用頻寬和時間。所以Active database duplicate 很好的解決了以上的問題。 它對大庫的遷移非常有用。

如果是從RAC duplicate 到單例項,操作是一樣的。 如果是從單例項duplicate 到RAC。 那麼先duplicate 到 單例項。 然後將單例項轉換成RAC。

二:安裝資料庫軟體前的系統配置        (主庫和備庫端都要做下列操作)

1.基本配置:

一定要用新裝的系統(這裡以紅帽企業版6.4為例),系統要求最低配置1G記憶體,2Gswap分割槽,根分割槽20G以上,裝好系統後先配置好yum,IP地址,/etc/sysconfig/network檔案中的主機名,以及/etc/hosts檔案中的IP地址和主機名的對應關係。

主庫IP:192.168.11.120   

主庫主機名:ora11g

備庫IP:192.168.11.121

備庫主機名:ora11g-dg

2.裝包

binutils-2.20.51.0.2-5.11.el6 (x86_64)

compat-libcap1-1.10-1 (x86_64)

compat-libstdc++-33-3.2.3-69.el6 (x86_64)

compat-libstdc++-33-3.2.3-69.el6.i686

gcc-4.4.4-13.el6 (x86_64)

gcc-c++-4.4.4-13.el6 (x86_64)

glibc-2.12-1.7.el6 (i686)

glibc-2.12-1.7.el6 (x86_64)

glibc-devel-2.12-1.7.el6 (x86_64)

glibc-devel-2.12-1.7.el6.i686

ksh

pdksh-5.2.14-21.x86_64.rpm

libgcc-4.4.4-13.el6 (i686)

libgcc-4.4.4-13.el6 (x86_64)

libstdc++-4.4.4-13.el6 (x86_64)

libstdc++-4.4.4-13.el6.i686

libstdc++-devel-4.4.4-13.el6 (x86_64)

libstdc++-devel-4.4.4-13.el6.i686

libaio-0.3.107-10.el6 (x86_64)

libaio-0.3.107-10.el6.i686

libaio-devel-0.3.107-10.el6 (x86_64)

libaio-devel-0.3.107-10.el6.i686

make-3.81-19.el6

sysstat-9.0.4-11.el6 (x86_64)

unixODBC-2.2.14-11.el6 (x86_64) or later

unixODBC-2.2.14-11.el6.i686 or later

unixODBC-devel-2.2.14-11.el6 (x86_64) or later

unixODBC-devel-2.2.14-11.el6.i686 or later

3.建立相關的組與使用者:

/usr/sbin/groupadd oinstall

/usr/sbin/groupadd -g 502 dba

/usr/sbin/groupadd -g 503 oper

/usr/sbin/useradd -u 502 -g oinstall -G dba,oper oracle

# passwd oracle

4.建立所需的目錄並賦予特定的屬主和屬組

mkdir -p /u01/app/oracle

chown -R oracle:oinstall /u01/app

chmod -R 775 /u01/app

5.編輯limits.conf 檔案

vim /etc/security/limits.conf

新增下面5行內容:

vim /etc/security/limits.conf

oracle              soft    nproc   2047

oracle              hard    nproc   16384

oracle              soft    nofile  1024

oracle              hard    nofile  65536

oracle              soft    stack   10240 

6.編輯sysctl.conf檔案,設定相關引數

vim /etc/sysctl.conf

新增/修改下列內容:(注意!下面的引數,若是已經存在,則直接修改數值,不要再新增同樣的引數,相同的引數只能有一個!如果需要修改的引數已經大於下面的數字,則不用修改,請仔細核對!)

vim /etc/sysctl.conf

fs.aio-max-nr = 1048576

fs.file-max = 6815744

kernel.shmall = 2097152

kernel.shmmax = 4294967295

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

net.ipv4.ip_local_port_range = 9000 65500

net.core.rmem_default = 262144

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 1048576

#sysctl –p 使其生效

# /sbin/sysctl -p

儲存退出後,別忘了用sysctl -p命令使引數生效!

7.編輯vim /home/oracle/.bash_profile檔案,配置相關環境變數

新增下列幾行:

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1

export ORACLE_SID=pri (備庫端設定為std)

export LD_LIBRARY_PATH=$ORACLE_HOME/bin:/bin:/usr/bin:/usr/local/bin:

export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

export PATH=$ORACLE_HOME/bin:$PATH

注意伺服器需要關閉iptablesselinux

linux6.4系統:iptables –F

Service iptables save

Setenforce 0

Vi /etc/selinux/config

[[email protected] admin]$ more /etc/selinux/config

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

# enforcing - SELinux security policy is enforced.

# permissive - SELinux prints warnings instead of enforcing.

# disabled - No SELinux policy is loaded.

SELINUX=disabled

# SELINUXTYPE= can take one of these two values:

# targeted - Targeted processes are protected,

# mls - Multi Level Security protection.

SELINUXTYPE=targeted

三:開始安裝oracle11g資料庫軟體        (主庫和備庫端都要做下列操作)

1.掛載oracle11g的映象到/mnt/cdrom 目錄下,並把3個包解壓到/usr/local/src 目錄下

cd /mnt/cdrom/

unzip p13390677_112040_Linux-x86-64_1of7.zip -d /usr/local/src

unzip p13390677_112040_Linux-x86-64_2of7.zip -d /usr/local/src

unzip p13390677_112040_Linux-x86-64_3of7.zip -d /usr/local/src

(只裝資料庫的話,解壓前兩個包即可,第三個包是grid)

2. root身份執行xhost +,然後切換到oracle使用者進入/usr/local/src/database目錄中,執行runInstaller 開始安裝 (database是預設解壓完的目錄名)

# xhost +

# su - oracle

$ ./runInstaller

注意:安裝oracle11g要求解析度最低為1024x768,不然無法完整顯示安裝過程

安裝過程:略

注意:主庫在安裝完軟體後需要進行DBCA建庫操作,推薦不要啟用歸檔模式,會節省時間,備庫端不要建庫!可以開啟監聽程式

四:開始搭建Dataguard

1:將資料庫改為強制日誌模式            (此步驟只在主庫上做)

[[email protected] ~]$ sqlplus / as sysdba

檢視當前是否強制日誌模式:

[email protected]> select name,log_mode,force_logging from v$database;   

NAME LOG_MODE FOR

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

PRI         NOARCHIVELOG NO

[email protected]> alter database force logging;

Database altered.

[email protected]> select name,log_mode,force_logging from v$database;

NAME LOG_MODE FOR

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

PRI         NOARCHIVELOG YES

2:建立密碼檔案                        (此步驟只在主庫上做)

注意:兩端分別建立自己的密碼檔案好像有問題,備庫的密碼檔案需要跟主庫一致,否則導致日誌傳輸不到備庫,有待驗證。我最後是將主庫的密碼檔案直接copy到備庫,重新命名後使用。

[[email protected] ~]$ cd $ORACLE_HOME/dbs

[[email protected] dbs]$ ls

hc_pri.dat  init.ora  initpri.ora  lkPRI  orapwpri  snapcf_pri.f  spfilepri.ora 

已經有一個密碼檔案了

[[email protected] dbs]$ orapwd file=orapwpri password=oracle force=y

這條命令可以手動生成密碼檔案,force=y的意思是強制覆蓋當前已有的密碼檔案(如果有可以不建立)

將主庫的密碼檔案copy給備庫,並重命名

[[email protected] dbs]$ scp orapwpri 192.168.11.121:$ORACLE_HOME/dbs/orapwstd

3:建立standby redolog日誌組            (此步驟只在主庫上做)

原則:

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

2:standby redo log日誌檔案組的個數依照下面的原則進行計算:

Standby redo log組數公式>=(每個instance日誌組個數+1)*instance個數

假如只有一個節點,這個節點有三組redolog,

所以Standby redo log組數>=(3+1)*1 == 4

所以至少需要建立4組Standby redo log

檢視當前執行緒與日誌組的對應關係及日誌組的大小:

[email protected]> select thread#,group#,bytes/1024/1024 from v$log;   

THREAD# GROUP# BYTES/1024/1024

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

1 1 50

1 2 50

1 3 50

如上,我現在的環境有三組redolog,每個日誌組的大小都是50M,

所以Standby redo log組數>=(3+1)*1== 4

所以至少需要建立4組Standby redo log,大小均為50M

(thread:執行緒,只有在多例項資料庫才有用的引數,例如RAC環境,單例項不考慮)

檢視當前有哪些日誌組及其成員:

[email protected]> col member for a50

[email protected]> select group#,member from v$logfile;

GROUP# MEMBER

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

3 /u01/app/oracle/oradata/pri/redo03.log

2 /u01/app/oracle/oradata/pri/redo02.log

1 /u01/app/oracle/oradata/pri/redo01.log

先手動建立standby log日誌組所需的目錄:

(建立新目錄只是為了便於區分,並非必須)

[[email protected] oradata]$ cd /u01/app/oracle/oradata/

[[email protected] oradata]$ ls

standbylog pri

新建4個日誌組作為standby redolog日誌組,大小與原來的日誌組一致:

由於已經存在group1-3,,所以group號只能從4開始

[email protected]>

alter database add standby logfile group 4 '/u01/app/oracle/oradata/standbylog/std_redo04.log' size 50m;

alter database add standby logfile group 5 '/u01/app/oracle/oradata/standbylog/std_redo05.log' size 50m;

alter database add standby logfile group 6 '/u01/app/oracle/oradata/standbylog/std_redo06.log' size 50m;

alter database add standby logfile group 7 '/u01/app/oracle/oradata/standbylog/std_redo07.log' size 50m; 

檢視standby 日誌組的資訊:

[email protected]> select group#,sequence#,status, bytes/1024/1024 from v$standby_log;

GROUP# SEQUENCE# STATUS BYTES/1024/1024

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

4 0 UNASSIGNED 50

5 0 UNASSIGNED 50

6 0 UNASSIGNED 50

7 0 UNASSIGNED 50

檢視當前有哪些日誌組及其成員:

[email protected]> set pagesize 100

[email protected]> col member for a60

[email protected]> select group#,member from v$logfile order by group#;

GROUP#     MEMBER

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

1     /u01/app/oracle/oradata/pri/redo01.log

2     /u01/app/oracle/oradata/pri/redo02.log

3     /u01/app/oracle/oradata/pri/redo03.log

4     /u01/app/oracle/oradata/standbylog/std_redo04.log

5     /u01/app/oracle/oradata/standbylog/std_redo05.log

6     /u01/app/oracle/oradata/standbylog/std_redo06.log

7     /u01/app/oracle/oradata/standbylog/std_redo07.log

4:修改主庫的pfile引數檔案        (此步驟只在主庫上做)

檢視spfile的路徑:

[email protected]> show parameter spfile;

NAME TYPE VALUE

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

spfile string /u01/app/oracle/product/11.2.0/db_1/dbs/spfilepri.ora

用spfile建立一個pfile,用於修改:   

[email protected]> create pfile from spfile;

修改主庫的pfile:

/u01/app/oracle/product/11.2.0/db_1/dbs/ initpri.ora

[[email protected] ~]$ cd $ORACLE_HOME/dbs

pri.__db_cache_size=318767104

pri.__java_pool_size=4194304

pri.__large_pool_size=4194304

pri.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment

pri.__pga_aggregate_target=335544320

pri.__sga_target=503316480

pri.__shared_io_pool_size=0

pri.__shared_pool_size=163577856

pri.__streams_pool_size=0

*.audit_file_dest='/u01/app/oracle/admin/pri/adump'

*.audit_trail='db'

*.compatible=' 11.2.0.4.0 '

*.control_files='/u01/app/oracle/oradata/pri/control01.ctl','/u01/app/oracle/flash_recovery_area/pri/control02.ctl'

*.db_block_size=8192

*.db_domain=''

*.db_name='pri'

*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'

*.db_recovery_file_dest_size=4070572032

*.diagnostic_dest='/u01/app/oracle'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=priXDB)'

*.log_archive_format='%t_%s_%r.dbf'

*.memory_target=836763648

*.open_cursors=300

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.undo_tablespace='UNDOTBS1'

以下內容是需要新增加的:

*.db_unique_name='pri' DG主庫和備庫的db_name必須一致,db_unique_name不一致

*.log_archive_config='dg_config=(pri,std)' pri主資料庫SID,std備份資料庫SID

*.log_archive_dest_1='location=/u01/app/oracle/arch valid_for=(all_logfiles,all_roles) db_unique_name=pri' 主資料庫的歸檔日誌路徑和SID

*.log_archive_dest_2='service=std valid_for=(online_logfiles,primary_role) db_unique_name=std' 備份資料庫的SID

*.log_archive_dest_state_1=enable

*.log_archive_dest_state_2=enable

*.log_archive_max_processes=4

*.fal_server='std' 備份資料庫的SID

*.fal_client='pri' 主資料庫的SID

*.db_file_name_convert='/u01/app/oracle/oradata/std','/u01/app/oracle/oradata/pri' 第一個目錄是備份資料庫資料檔案路徑(備份伺服器上有此目錄),第二個是主資料庫資料檔案路徑

*.log_file_name_convert='/u01/app/oracle/oradata/std','/u01/app/oracle/oradata/pri' 第一個目錄是備份資料庫資料檔案路徑(備份伺服器上有此目錄),第二個是主資料庫資料檔案路徑

*.standby_file_management='auto'

修改完畢,儲存退出

手工建立/u01/app/oracle/arch:       

[[email protected] dbs]$ mkdir –p /u01/app/oracle/arch

5:用修改過的pfile重新建立一個spfile,用於重啟資料庫    (此步驟只在主庫上做)

關閉資料庫:

[email protected]> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

用修改過的pfile重新建立一個spfile:

[email protected]> create spfile from pfile;   

此時把資料庫改為歸檔模式:        (如果當初建庫時選擇了啟用歸檔,則此步驟忽略)

由於當前資料庫已關閉,首先需要把資料庫啟動到mount狀態

[email protected]> startup mount;       

ORACLE instance started.

Database mounted.

[email protected]> alter database archivelog;    啟用歸檔模式

Database altered.

[email protected]> alter database open;        OPEN資料庫

Database altered.

[email protected]> archive log list;            檢視是否啟用歸檔模式

SQL> archive log list;

Database log mode Archive Mode

Automatic archival Enabled

Archive destination /u01/app/oracle/arch

Oldest online log sequence 22

Next log sequence to archive 24

Current log sequence 24

如上,歸檔路徑已經改為/u01/app/oracle/arch,證明對pfile的修改已生效

檢視當前資料庫是否使用spfile啟動:   

[email protected]> show parameter spfile;

NAME TYPE VALUE

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

spfile string /u01/app/oracle/product/11.2.0/db_1/dbs/spfilepri.ora

如上,若能看到spfile的路徑,則證明資料庫是使用spfile啟動的,若沒有值,則說明是用pfile啟動的。

確認資料庫已經啟用歸檔模式和強制日誌模式:

[email protected]> select name,log_mode,force_logging from v$database;

NAME LOG_MODE FOR

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

PRI ARCHIVELOG YES

6:修改監聽檔案,新增靜態監聽        (主庫、備庫都要做)

主庫:

[[email protected] ~]$ cd $ORACLE_HOME/network/admin

[[email protected] admin]$ vim listener.ora     新增的內容如下紅色字型部分:

# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

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

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = pri)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

      (SID_NAME = pri)

    )

  )

ADR_BASE_LISTENER = /u01/app/oracle

主庫修改後最終效果如下圖:

 

備庫:

[[email protected] ~]$ cd $ORACLE_HOME/network/admin

[[email protected] admin]$ vim listener.ora     新增的內容如下紅色字型部分:

# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

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

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = std)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

      (SID_NAME = std)

    )

  )

ADR_BASE_LISTENER = /u01/app/oracle

備庫修改後最終效果如下圖:

 

使新增加的監聽生效:    (主庫和備庫端都要做)

[[email protected] admin]$ lsnrctl stop

[[email protected] admin]$ lsnrctl start

確認新增加的靜態監聽有效:

主庫:

[[email protected] ~]$ lsnrctl status

..........................................(N行省略)

Services Summary...

Service "pri" has 2 instance(s).

Instance "pri", status UNKNOWN, has 1 handler(s) for this service...

Instance "pri", status READY, has 1 handler(s) for this service...

Service "priXDB" has 1 instance(s).

Instance "pri", status READY, has 1 handler(s) for this service...

The command completed successfully

備庫:

[[email protected] ~]$ lsnrctl status

..........................................(N行省略)

Services Summary...

Service "std" has 2 instance(s).

Instance "std", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

如上,靜態監聽新增成功

7:編輯網路服務名配置檔案tnsnames.ora        (主庫和備庫端都要做)

[[email protected] admin]$ pwd

/u01/app/oracle/product/11.2.0/db_1/network/admin

[[email protected] admin]$ ls

listener.ora samples tnsnames.ora

listener.ora_bak shrept.lst tnsnames.ora_bak

[[email protected] admin]$ more tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

pri =

  (DESCRIPTION =

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = pri)

    )

  )

std =

  (DESCRIPTION =

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = std)

    )

  )  

編輯結果如下圖:

 

保證主庫和備庫的tnsnames.ora檔案中的內容完全相同,可以把修改後的檔案直接傳給備庫。

[[email protected] admin]$ scp tnsnames.ora 192.168.11.121:$ORACLE_HOME/network/admin

tnsnames.ora 100% 925 0.9KB/s 00:00

配置完後,確保在任意一端上都能tnsping通對方:

[[email protected] admin]$ tnsping std

[[email protected] admin]$ tnsping pri

8:在備庫端,修改pfile引數檔案        (只在備庫端做)

首先,在主庫端把pfile拷貝給備庫端的$ORACLE_HOME/dbs目錄下,並重命名:

[[email protected] ~]$ cd $ORACLE_HOME/dbs

[[email protected] dbs]$ ls

hc_std.dat init.ora initstd.ora lkSTD orapwstd spfilestd.ora

[[email protected] dbs]$ scp initpri.ora 192.168.2.253:$ORACLE_HOME/dbs/initstd.ora

initpri.ora 100% 1497 1.5KB/s 00:00

然後在備庫端進行修改:

[[email protected] ~]$ cd $ORACLE_HOME/dbs

[[email protected] dbs]$ more initstd.ora

pri.__db_cache_size=318767104

pri.__java_pool_size=4194304

pri.__large_pool_size=4194304

pri.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment

pri.__pga_aggregate_target=335544320

pri.__sga_target=503316480

pri.__shared_io_pool_size=0

pri.__shared_pool_size=163577856

pri.__streams_pool_size=0

*.audit_file_dest='/u01/app/oracle/admin/std/adump'

*.audit_trail='db'

*.compatible='11.2.0.0.0'

*.control_files='/u01/app/oracle/oradata/std/control01.ctl','/u01/app/oracle/oradata/std/control02.ctl'

*.db_block_size=8192

*.db_domain=''

*.db_name='pri' DG主庫和備庫的db_name必須一致,db_unique_name不一致

*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'

*.db_recovery_file_dest_size=4070572032

*.diagnostic_dest='/u01/app/oracle'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=stdXDB)'

*.log_archive_format='%t_%s_%r.dbf'

*.memory_target=836763648

*.open_cursors=300

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.undo_tablespace='UNDOTBS1'

以下需要手工新增

*.db_unique_name='std'

*.log_archive_config='dg_config=(pri,std)'

*.log_archive_dest_1='location=/u01/app/oracle/arch valid_for=(all_logfiles,all_

roles) db_unique_name=std'

*.log_archive_dest_2='service=pri valid_for=(online_logfiles,primary_role) db

_unique_name=pri'

*.log_archive_dest_state_1=enable

*.log_archive_dest_state_2=enable

*.log_archive_max_processes=4

*.fal_server='pri'

*.fal_client='std'

*.db_file_name_convert='/u01/app/oracle/oradata/pri','/u01/app/oracle/oradata

/std'

*.log_file_name_convert='/u01/app/oracle/oradata/pri','/u01/app/oracle/oradat

a/std'

*.standby_file_management='auto'

修改完畢,儲存退出

注意:整個搭建過程最需要留意的就是主庫和備庫的PFILE配置,建議修改完後仔細對照主備庫PFILE的區別

9:在備庫端手工建立所需的目錄    (備庫端做,不提前建立的話恢復時會報錯!)

mkdir -pv /u01/app/oracle/admin/std/adump

mkdir -pv /u01/app/oracle/diag/rdbms/std/std/trace

mkdir -pv /u01/app/oracle/arch

mkdir -pv /u01/app/oracle/oradata/std

mkdir -pv /u01/app/oracle/oradata/standbylog

mkdir -pv /u01/app/oracle/flash_recovery_area

10:用修改後的pfile建立一個spfile,用於啟動資料庫        (備庫端做)

[[email protected] ~]$ sqlplus / as sysdba

Connected to an idle instance.

[email protected]> create spfile from pfile;

File created.

將資料庫啟動到nomount狀態:

[email protected]> startup nomount;

ORACLE instance started.

Total System Global Area 839282688 bytes

Fixed Size 2233000 bytes

Variable Size 482348376 bytes

Database Buffers 352321536 bytes

Redo Buffers 2379776 bytes

[email protected]>

11:利用RMAN在備庫上恢復主庫            (備庫端做)

[[email protected] ~]$ rman target sys/[email protected] auxiliary sys/[email protected]

Recovery Manager: Release 11.2.0.3.0 - Production on Tue Apr 15 16:39:28 2014

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

connected to target database: PRI (DBID=775616459)

connected to auxiliary database: PRI (not mounted)

RMAN> duplicate target database for standby from active database nofilenamecheck;

這條命令可以直接恢復資料檔案,standby控制檔案,standby日誌組,非常霸道

Starting Duplicate Db at 16-MAR-16

using target database control file instead of recovery catalog

allocated channel: ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: SID=134 device type=DISK

contents of Memory Script:

{

backup as copy reuse

targetfile '/u01/app/oracle/product/11.2.0/db_1/dbs/orapwpri' auxiliary format

'/u01/app/oracle/product/11.2.0/db_1/dbs/orapwstd' ;

}

executing Memory Script

Starting backup at 16-MAR-16

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=140 device type=DISK

Finished backup at 16-MAR-16

contents of Memory Script:

{

backup as copy current controlfile for standby auxiliary format '/u01/app/oracle/oradata/std/control01.ctl';

}

executing Memory Script

Starting backup at 16-MAR-16

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile copy

copying standby control file

output file name=/u01/app/oracle/product/11.2.0/db_1/dbs/snapcf_pri.f tag=TAG20160316T110737 RECID=2 STAMP=906635257

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01

Finished backup at 16-MAR-16

contents of Memory Script:

{

sql clone 'alter database mount standby database';

}

executing Memory Script

sql statement: alter database mount standby database

contents of Memory Script:

{

set newname for tempfile 1 to

"/u01/app/oracle/oradata/std/temp01.dbf";

switch clone tempfile all;

set newname for datafile 1 to

"/u01/app/oracle/oradata/std/system01.dbf";

set newname for datafile 2 to

"/u01/app/oracle/oradata/std/sysaux01.dbf";

set newname for datafile 3 to

"/u01/app/oracle/oradata/std/undotbs01.dbf";

set newname for datafile 4 to

"/u01/app/oracle/oradata/std/users01.dbf";

backup as copy reuse

datafile 1 auxiliary format

"/u01/app/oracle/oradata/std/system01.dbf" datafile

2 auxiliary format

"/u01/app/oracle/oradata/std/sysaux01.dbf" datafile

3 auxiliary format

"/u01/app/oracle/oradata/std/undotbs01.dbf" datafile

4 auxiliary format

"/u01/app/oracle/oradata/std/users01.dbf" ;

sql 'alter system archive log current';

}

executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to /u01/app/oracle/oradata/std/temp01.dbf in control file

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting backup at 16-MAR-16

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile copy

input datafile file number=00001 name=/u01/app/oracle/oradata/pri/system01.dbf

output file name=/u01/app/oracle/oradata/std/system01.dbf tag=TAG20160316T110744

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:01:38

channel ORA_DISK_1: starting datafile copy

input datafile file number=00002 name=/u01/app/oracle/oradata/pri/sysaux01.dbf

output file name=/u01/app/oracle/oradata/std/sysaux01.dbf tag=TAG20160316T110744

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:01:09

channel ORA_DISK_1: starting datafile copy

input datafile file number=00003 name=/u01/app/oracle/oradata/pri/undotbs01.dbf

output file name=/u01/app/oracle/oradata/std/undotbs01.dbf tag=TAG20160316T110744

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15

channel ORA_DISK_1: starting datafile copy

input datafile file number=00004 name=/u01/app/oracle/oradata/pri/users01.dbf

output file name=/u01/app/oracle/oradata/std/users01.dbf tag=TAG20160316T110744

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01

Finished backup at 16-MAR-16

sql statement: alter system archive log current

contents of Memory Script:

{

switch clone datafile all;

}

executing Memory Script

datafile 1 switched to datafile copy

input datafile copy RECID=2 STAMP=906635463 file name=/u01/app/oracle/oradata/std/system01.dbf

datafile 2 switched to datafile copy

input datafile copy RECID=3 STAMP=906635463 file name=/u01/app/oracle/oradata/std/sysaux01.dbf

datafile 3 switched to datafile copy

input datafile copy RECID=4 STAMP=906635463 file name=/u01/app/oracle/oradata/std/undotbs01.dbf

datafile 4 switched to datafile copy

input datafile copy RECID=5 STAMP=906635463 file name=/u01/app/oracle/oradata/std/users01.dbf

Finished Duplicate Db at 16-MAR-16

RMAN>

恢復資料庫結束

12:嘗試開啟備庫

登陸並檢視資料庫當前狀態:

[[email protected] ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 14 16:41:50 2014

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

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

[email protected]> startup

[email protected]> select status from v$instance;

STATUS

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

MOUNTED        (RMAN恢復完直接就是mount狀態)

13:備庫啟動日誌應用(啟用備庫前確認歸檔日誌是否都已拷貝)

[email protected]> alter database recover managed standby database disconnect from session;

Database altered.

(停止日誌應用的命令是:alter database recover managed standby database cancel;)

檢視日誌應用情況:

[email protected]> set pagesize 100

[email protected]> select sequence#,applied from v$archived_log order by 1;

SEQUENCE# APPLIED

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

8 YES

9 YES

10 YES

如上,如果發現有個NO的,也是正常的,說明該日誌在主庫上還沒有歸檔,可以在主庫上執行alter system switch logfile;命令來進行日誌切換,再到備庫檢視日誌應用情況

14:分別檢視主庫和備庫的歸檔序列號是否一致:

先在主庫手動切換一下日誌:

[email protected]> alter system switch logfile;

System altered.

然後檢視主庫:

[email protected]> archive log list;

SQL> archive log list;

Database log mode Archive Mode

Automatic archival Enabled

Archive destination /u01/app/oracle/arch

Oldest online log sequence 22

Next log sequence to archive 24

Current log sequence 24

備庫:

SQL> archive log list;

Database log mode Archive Mode

Automatic archival Enabled

Archive destination /u01/app/oracle/arch

Oldest online log sequence 22

Next log sequence to archive 0

Current log sequence 24

結果完全一致,至此,DataGuard的搭建成功!

15:檢查命令

檢視standby啟動的DG程序

SQL> select process,client_process,sequence#,status from v$managed_standby; 

PROCESS   CLIENT_P  SEQUENCE# STATUS 

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

ARCH      ARCH             23 CLOSING 

ARCH      ARCH              0 CONNECTED            //歸檔程序 

ARCH      ARCH             21 CLOSING 

ARCH      ARCH              0 CONNECTED 

RFS       ARCH              0 IDLE 

RFS       UNKNOWN           0 IDLE 

RFS       LGWR             24 IDLE               //歸檔傳輸程序 

RFS       UNKNOWN           0 IDLE 

MRP0      N/A              24 APPLYING_LOG      //日誌應用程序 

9 rows selected. 

檢視資料庫的保護模式:

SQL> select database_role,protection_mode,protection_level,open_mode from v$database; 

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL     OPEN_MODE 

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

PRIMARY          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE  READ WRITE 

#standby 端檢視,也是一樣的。 

SQL> select database_role,protection_mode,protection_level,open_mode from v$database; 

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL     OPEN_MODE 

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

PHYSICAL STANDBY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE  MOUNTED 

檢視DG的日誌資訊

SQL> select * from v$dataguard_status;

16:Open Read Only standby資料庫並且開啟實時日誌應用

SQL> shutdown immediate 

ORA-01109: database not open 

Database dismounted. 

ORACLE instance shut down. 

SQL> startup 

ORACLE instance started. 

Total System Global Area 1188511744 bytes 

Fixed Size                  1364228 bytes 

Variable Size             754978556 bytes 

Database Buffers          419430400 bytes 

Redo Buffers               12738560 bytes 

Database mounted. 

Database opened. 

SQL> select database_role,protection_mode,protection_level,open_mode from v$database; 

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL     OPEN_MODE 

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

PHYSICAL STANDBY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE  READ ONLY 

SQL> select process,client_process,sequence#,status from v$managed_standby; 

PROCESS   CLIENT_P  SEQUENCE# STATUS 

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

ARCH      ARCH              0 CONNECTED 

ARCH      ARCH              0 CONNECTED 

ARCH      ARCH              0 CONNECTED 

ARCH      ARCH             26 CLOSING 

RFS       ARCH              0 IDLE 

RFS       UNKNOWN           0 IDLE 

RFS       LGWR             27 IDLE 

7 rows selected. 

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

Media recovery complete. 

SQL> select process,client_process,sequence#,status from v$managed_standby; 

PROCESS   CLIENT_P  SEQUENCE# STATUS 

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

ARCH      ARCH              0 CONNECTED 

ARCH      ARCH              0 CONNECTED 

ARCH      ARCH              0 CONNECTED 

ARCH      ARCH             26 CLOSING 

RFS       ARCH              0 IDLE 

RFS       UNKNOWN           0 IDLE 

RFS       LGWR             27 IDLE 

MRP0      N/A              27 APPLYING_LOG 

8 rows selected. 

SQL> select process,client_process,sequence#,status from v$managed_standby;

PROCESS   CLIENT_P  SEQUENCE# STATUS

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

ARCH   ARCH         19 CLOSING

ARCH   ARCH         20 CLOSING

ARCH   ARCH          0 CONNECTED

ARCH   ARCH         21 CLOSING

MRP0   N/A          22 WAIT_FOR_LOG

RFS   ARCH          0 IDLE

RFS   UNKNOWN       0 IDLE

RFS   UNKNOWN       0 IDLE

RFS   LGWR         22 IDLE

9 rows selected.

五:相關知識補充:

1:DataGuard的三種資料保護模式:

(1)MAXIMIZE PROTECTION(最大保護模式):

最大資料保護與無資料分歧,LGWR將同時傳送到備用節點,在主節點事務確認之前,備用節點也必須完全收到日誌資料。如果網路不好,引起LGWR不能傳送資料,將引起嚴重的效能問題,導致主節點DOWN機。

(2)MAXIMIZE AVAILABILITY(最大可用模式):

無資料丟失模式,允許資料分歧,允許非同步傳送。正常情況下執行在最大保護模式,在主節點與備用節點的網路斷開或連線不正常時,自動切換到最大效能模式,主節點的操作還是可以繼續的。在網路不好的情況下有較大的效能影響。

(3)MAXIMIZE PERFORMANCE(最大效能模式):

這種模式應當可以說是從8i繼承過來的備用伺服器模式,非同步傳送,無資料同步檢查,可能丟失資料,但是能獲得主節點的最大效能。