Oracle11gR2 Active DataGuard

pxbibm發表於2014-04-18
明天是最後一次oracle 培訓課程,課程中會涉及到oracle Oracle Data Guard搭建過程,今天
上午做了一個實驗,一起和大家分享下,我實驗使用的是Oracle 11R2 .2版本的。
採用RMAN做duplicate。
實驗實現的是物理備資料庫。
Oracle11gR2 Active DataGuard
先簡單介紹下Oracle Data Guard概念,可以參考我上篇寫的《Oracle Data Guard 介紹
http://blog.itpub.net/12798004/viewspace-1144122/
Oracle Data Guard
確保企業資料的高可用性、資料保護以及災難恢復。Data Guard 提供
了一套全面的服務來建立、維護、管理和監控一個或多個備資料庫,使得生產資料
庫從災難和資料損壞中得以倖存。Data Guard 維護這些備資料庫作為生產資料庫的事務一致
性拷貝。然後,如果生產資料庫因為計劃的或計劃外的中斷而變得不可用。Data Guard 能切
換任何備資料為生產角色,從而最小化中斷引起的當機時間。Data Guard 能與傳統的備份、
恢復和cluster 技術一起使用,以提供高階別的資料保護和資料可用性。
使用 Data Guard,管理員能通過將資源密集的備份和報表操作轉移到備系統上,來提高
生產資料庫的效能。
Data Guard
11G中有了很大的改進,最典型的兩個新特性就是Active Data GuardAdvanced Compression引入。
Active Data Guard
技術:oracle 10gPhysical Standby節點在進行Redo Apply過程中,是不能夠開啟資料庫讀取資料的。
如果需要進行讀取,則必須先將其終止Apply過程,才能支援讀取。Active Data Guard特性就是支援Standby節點在Apply的同時支援只讀資料庫。
Advanced Compression
高階壓縮技術:遠端災備使用Data Guard的一種重要瓶頸就是傳輸頻寬限制。
所有的Redo Log資料都要通過PrimaryStandby之間的連線都是通過Oracle Net 連進行傳遞的,Redo Log隨著業務的增加而加大。
Advanced Compression
可以將Redo Log進行一定程度壓縮傳遞。

實驗步驟如下:
1.先配置Primary Database(主庫)
檢查是否歸檔資料庫
SQL>archive log list;
如果不是歸檔資料庫先設定歸檔資料庫
先停止主庫
SQL>shutdown immediate
啟動資料庫到mount狀態
SQL>startup mount;
SQL>alter database archivelog;
SQL>alter database open;
SQL>archive log list;
設定資料為強制寫日誌。
SQL>alter database force logging;
SQL>select force_logging from v$database;--檢視狀態
為了能實現主備庫雙向切換,配置SRL。
SQL> alter database add standby logfile '/u01/oracle/oradata/devdb/sredo01.log' size 10M;

檢視v$logfile(檔案的位置)、v$standby_log(standby log的資訊)來確認。

SQL> select group#,type,member from v$logfile;

SQL> select group#,dbid,thread#,sequence#,status from v$standby_log

新增多組日誌檔案:
SQL>alter database add standby logfile member '/u01/oracle/oradata/devdb/sredo02.log' to group 4;

SQL> select group#, member from v$logfile where type='STANDBY';
SQL> select group#, dbid, bytes from v$standby_log;

SRL檔案是為了解決下列兩個主要問題
資料保護 如果沒有使用SRL檔案,而且與資料庫的連線中斷,將無法保留傳入的重做資料--例如如果主資料庫出現故障,然後進行故障轉移,那麼連線中斷時正在傳送的資料就會丟失。 如果

將重做資料寫入SRL,故障轉移時已經永久儲存了重做資料並可供使用。

效能目標
當LNS連線到備用資料庫時,僅當在備用資料庫上的RFS程式建立和初始化了歸檔日誌,LNS/ARCH才能開始傳送重做資料。如果日誌檔案很大,這會導致暫停時間過長。 該事件在日誌切換時發

生,因而對主資料庫的吞吐量影響很大。
配置了SRL,實時應用成為可能。
2.配置Primary Database(主庫)SPFILE引數
2. 1.
log_archive_config
該引數通過DG_CONFIG 屬性羅列同一個Data Guard 中所有DB_UNIQUE_NAME(含primary db 及standby db),以逗號分隔
primary端和standby端相同
SQL>show parameter log_archive_config
SQL>alter system set log_archive_config='DG_CONFIG=(devdb,dgdevdb)' scope=spfile;
2.2
log_archive_dest_2
新增歸檔日誌傳輸位置,archive_dest引數包括兩種型別位置,location和service。
Location參數列示本地目錄歸檔日誌存放,而service表示通過Oracle NET服務傳輸過去。要實現Dataguard元件,需要將日誌指定到service裡面。
SQL> alter system set
log_archive_dest_2='SERVICE=dgdevdb valid_for=(online_logfiles,primary_role) db_unique_name=dgdevdb'
scope=spfile;
SQL> alter system set log_archive_dest_state_2=enable;
注意:Online_logfiles和Primary_role表示當前例項為Primary角色的時候,才傳遞日誌。
2.3
db_file_name_convert:主資料庫和備用資料庫的資料檔案轉換目錄對映(如果兩資料庫的目錄結構不一樣),如果有多個對映,逐一指明對映關係
格式:*.db_file_name_convert=主資料庫資料檔案目錄,備用資料庫資料檔案目錄
primary端(主庫進行設定,是為了在切換後主備角色互換):
SQL> alter system set db_file_name_convert='devdb','dgdevdb' scope=spfile;
log_file_name_convert:指明主資料庫和備用資料庫的log檔案轉換目錄對映
格式:*. log_file_name_convert=主資料庫log目錄,備用資料庫目錄
primary端(主庫進行設定,是為了在切換後主備角色互換):
SQL> alter system set log_file_name_convert='devdb','dgdevdb' scope=spfile;
2.4
standby_file_management引數,預設是manual。該引數用於控制Primary與Standby之間檔案建立的方式。標準的DG環境下,在Primary DB下新增資料檔案,會自動在Standby中增加檔案。
SQL> show parameter standby_file_management
SQL> alter system set standby_file_management=auto;
SQL> show parameter standby_file_management;
OK ,主資料庫相關的引數都已經配置完成,很簡單吧。就幾個引數。
下面來配置網路環境
配置網路Oracle Net內容

1.配置網路服務名:新增主庫,備庫的服務名
tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

DEVDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.4.128.120)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = DEVDB)
    )
  )

DGDEVDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.4.128.120)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = DGDEVDB)
    )
  )

2.新增靜態註冊。
listener.ora

# listener.ora Network Configuration File: /u01/oracle/product/11.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = devdb)
      (ORACLE_HOME = /u01/oracle/product/11.2.0/db_1)
      (SID_NAME = devdb)
    )
   (SID_DESC =
      (GLOBAL_DBNAME =dgdevdb)
      (ORACLE_HOME = /u01/oracle/product/11.2.0/db_1)
      (SID_NAME = dgdevdb)
    )

  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.4.128.120)(PORT = 1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.4.128.120)(PORT = 1522))
    )
  )

ADR_BASE_LISTENER = /u01/oracle

 

密碼檔案設定,在使用RMAN複製資料庫時要使用管理員密碼,為了方便,保持密碼一樣,因此我拷貝了主庫的密碼檔案。

[oracle@pxboracle dbs]$ cp orapwdevdb orapwdgdevdb
[oracle@pxboracle dbs]$ ls -l | grep orapw
建立備庫需要的目錄
[oracle@pxboracle dbs]$mkdir -p /u01/oracle/admin/dgdevdb/adump
[oracle@pxboracle dbs]$mkdir -p /u01/oracle/flash_recovery_area/dgdevdb
[oracle@pxboracle dbs]$mkdir -p /u01/oracle/oradata/dgdevdb
[oracle@pxboracle dbs]$mkdir -p /u01/oracle/diag/rdbms/dgdevdb
到此為止,所有的引數檔案都已經配置完畢!
下面啟動備庫的例項

啟動standby例項

1.
在/u01/oracle/product/11.2.0/db_1/dbs下新建立一個initdgdevdb.ora 引數檔案
[oracle@pxboracle dbs]$ vi initdgdevdb.ora
db_name=dgdevdb
[oracle@pxboracle dbs]$ export ORACLE_SID=dgdevdb
[oracle@pxboracle dbs]$ sqlplus /nolog
SQL> conn / as sysdba
SQL> startup nomount pfile='/u01/oracle/product/11.2.0/db_1/dbs/initdgdevdb.ora';
[oracle@pxboracle dbs]$ ps -ef | grep pmon
注:在啟動備庫的例項過程中,我遇到了如下錯誤:

ORA-00845: MEMORY_TARGET not supported on this system

如果您也遇到了,請參考我寫的《ORA-00845: MEMORY_TARGET not supported on this system報錯解決
http://blog.itpub.net/12798004/viewspace-1144633/

RMAN進行duplicate操作
1.編寫複製資料庫指令碼
[oracle@pxboracle]# vi standby_sql
run {
  duplicate target database for standby from active database
  spfile
     parameter_value_convert 'devdb','dgdevdb'
     set db_unique_name='dgdevdb'
     set control_files='/u01/oracle/oradata/dgdevdb/control01.ctl'
     set db_file_name_convert='devdb','dgdevdb'
     set log_file_name_convert='devdb','dgdevdb'
     set log_archive_max_processes='5'
     set fal_client='dgdevdb'
     set fal_server='devdb'
     set standby_file_management='AUTO'
     set log_archive_config='dg_config=(devdb,dgdevdb)'
     set log_archive_dest_2='service=devdb async valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=devdb';
}
[oracle@pxboracle]# chmod 755 standby_sql

啟動RMAN進行duplicate,連線target和auxiliary。
 
[oracle@pxboracle dbs]$ rman nocatalog
RMAN>connect target sys/devdb@devdb
RMAN>connect auxiliary sys/devdb@dgdevdb
RMAN>@/u01/standby_sql 
出現 **end-of-file**

指令碼沒有報錯,執行成功。

對DG進行測試
主庫
由於我們修改主庫資料引數是通過命令來修改的,引數都是儲存在spfile中的(scope=spfile)
因此需要重啟主庫使引數生效。
SQL> startup force (生產資料庫千萬別使用force重新啟動,一定要一致性關閉資料庫)
SQL> conn scott/tiger@devdb
SQL>create table dg_test as select * from user_tables;
SQL> select count(*) from dg_test;
SQL> atler system switch logfile;--手工切換日誌,讓日誌傳遞到備庫上。
備庫上:
SQL> conn / as sysdba
SQL> alter database recover managed standby database cancel; 
SQL> alter database open; 
SQL> conn scott/tiger@dgdevdb
SQL> select count(*) from dg_test;
主庫資料表新增資料,進行修改。
主庫上執行
SQL> insert into dg_test select * from user_tables;
SQL> commit;
SQL> select count(*) from dg_test;
SQL>alter system switch logfile;
此時備(standby)庫,並沒有同步。因為我們剛剛關閉cancel同步。下面啟動同步過程,接受新的資料。
備庫上執行
SQL> alter database recover managed standby database using current logfile disconnect from session;
SQL> select open_mode from v$database;

OPEN_MODE

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

READ ONLY WITH APPLY
SQL> select count(*) from scott.dg_test;

同步成功!
注意:在
11g中,READ ONLY WITH APPLY狀態表示在同步同時,也可以應用資料庫的Redo Log。如果是之前的版本,備庫需要恢復到mount狀態。





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

相關文章