oracle11g dataguard 完全手冊

sun642514265發表於2014-01-21
注:本文轉載 天生我豺  http://www.cnblogs.com/tippoint/archive/2013/04/18/3029019.html

一、前言:

   網路上關於dataguard的配置文章很多,但是很多打著oracle11g的文章實際都是隻能在9 10 上執行,比如FAL_CLIENT在11g中已經廢棄,但是現在網路上的文章都是沒有標註這一點。而且對於具體含義語焉不詳對於新手只能知其然而不知其所以然。這篇文章我就想讓像我這樣的人對於dataguard配置不僅僅知道怎麼配置,還要知道為什麼需要這樣配置,這樣的效果才是最好的。

  這篇文章不僅僅是記錄如何配置,還介紹了為什麼是這樣,以及注意要點,我希望這個文章可以作為進行dataguard配置的一個參考手冊。

二、前提
1.主庫是歸檔模式:

  如果我們不清楚為什麼是歸檔模式,那我們就應該也不會清楚dataguard是用來做什麼的。透過很多修飾的官方語言,我們需要明確DG(dataguard簡稱,後同)實際上的作用就是用來高可用。而實現原理就是從主庫獲取資料到從庫,在主庫發生異常的時候,從庫接管主庫,完成身份的變化。可以一個主庫,最多9個從庫。同時分為邏輯standby和物理standby這裡我們討論的是物理standby.

   一旦建立並配置成 standby 後,dg 負責傳輸 primary資料庫 redo data 到 standby 資料庫,standby 資料庫通過應用接收到的 redo data 保持與 primary 資料庫的事務一致。

   這下清楚了吧,需要保證主從庫一致,需要傳輸archive log和redo log到從庫,如果不是歸檔模式無法保證主從庫的資料一致。

2.從庫只需要安裝資料庫軟體,資料從主庫傳輸後完成。

3.很多人說11g有了active dataguard(ADG),邏輯standby 實際上已經沒什麼用處了。

4.主從庫硬體最好一致。oracle資料庫版本需要一致。

  (1)記憶體檢查項:

     # grep MemTotal /proc/meminfo

     交換分割槽檢查項:如果記憶體在1-2G,swap是1.5倍;2-16G,1倍;超過16G,設定為16G即可。

     # grep SwapTotal /proc/meminfo

     檢視共享記憶體大小:

     # df -h /dev/shm



   (2)檢視系統處理器架構,與oracle安裝包一致

     # uname -m



   (3)空間空間 /tmp必須大於1G

     # df -h /tmp

5.配置環境資料庫使用者必須有sysdba許可權
6.後面的環境:主庫 192.168.215.101 資料庫例項名:orcl        db_unique_name:orcl

              從庫 192.168.215.102 資料庫例項名:orcl       db_unique_name:orcldg

三、配置
1.判斷DG是否已經安裝:

  select * from v$option where parameter = 'Oracle Data Guard';

  如果是true表示已經安裝可以配置,否則需要安裝相應元件。

2.設定主庫為強制記錄日誌。

  預設情況下資料庫操作會記錄redo log,但是在一些特定的情況下可以使用nologging來不生成redo資訊

  (1)表的批量INSERT(通過/*+APPEND */提示使用“直接路徑插入“。或採用SQL*Loader直接路徑載入)。表資料不生成redo,但是 

所有索引修改會生成redo,但是所有索引修改會生成redo(儘管表不生成日誌,但這個表上的索引卻會生成redo!)。 

  (2)LOB操作(對大物件的更新不必生成日誌)。 

  (3)通過CREATE TABLE AS SELECT建立表

  (4)各種ALTER TABLE操作,如MOVE和SPLIT

  (5)在一些表遷移和表空間遷移中,可以使用alter table a nologging;或者alter tablespace snk nologging;在操作完成後再修改回logging狀態。

  這裡需要多說一句,如果你使用nologging匯入大批量資料,以後對這些資料的修改會在redo或者archive log中,但是基準的資料是沒有的,所以一旦介質損壞是無法完全恢復的,必須在使用nologging完成切換回logging後,做一次全備或者0級備份。

   (1)強制記錄日誌:sql>alter database force logging;

   (2)檢查狀態(YEs為強制):sql>select name,force_logging from v$database;

   (3)如果需要在主庫新增或者刪除資料檔案時,這些檔案也會在備份新增或刪除,使用如下:

      sql>alter system set standy_file_management='AUTO';

      預設此引數是manual手工方式 sql>show parameter standby

 

 3.建立standby log files(備用日誌檔案)

   從庫使用standby log files來儲存從主庫接收到的重做日誌。既然主要是從庫在使用,那為什麼需要在主庫上也建立

   standby log files?原因主要由兩個:一是主庫可能轉換為備庫,而備庫是需要有standby log files的 二是如果主庫

   建立了standby log files那備庫會自動建立。

   建立standby如要注意以下幾點:

   <1>standby log files的大小和redo log files一樣。

      查詢redo log files檔案大小(預設50M,3個):select group#,bytes/1024/1024 as M from v$log

   <2>一般而言, standbyredo 日誌檔案組數要比 primary 資料庫的 online redo 日誌檔案組數至少多一個。

      推薦 standbyredo 日誌組數量基於 primary 資料庫的執行緒數(這裡的執行緒數可以理解為 rac 結構中的 rac

      節點數)。

      有一個推薦的公式可以做參考:(每執行緒的日誌組數+1)*最大執行緒數

      假設現在節點是1個,則=(3+1)*1=4

      如果是雙節點       則=(3+1)*2=8

      這裡我們建立4個standby logfile:

      另:不建議組號group#緊挨著redo,因為後續redo有可能調整,這裡我們從建立從11到14的standby logfile

     

1
2
3
4
5
6
7
8
# cd $ORACLE_BASE/oradata/orcl/
# mkdir dg
# chown oracle:dba dg
sql> alter database add standby logfile group  11 '/opt/oracle/oradata/orcl/dg/standby11.log' size 50M;
sql> alter database add standby logfile group  12 '/opt/oracle/oradata/orcl/dg/standby12.log' size 50M;
sql> alter database add standby logfile group  13 '/opt/oracle/oradata/orcl/dg/standby13.log' size 50M;
sql> alter database add standby logfile group  14 '/opt/oracle/oradata/orcl/dg/standby14.log' size 50M;

 



   4.密碼檔案和控制檔案的建立傳輸

     (1)一般資料庫預設就有密碼檔案,存放在$ORACLE_HOME/dbs/orapwSID  這裡為orapworcl

        如果沒有sql>orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle

     (2)檢查REMOTE_LOGIN_PASSWORDFILE值是否為 EXCLUSIVE

        sql>show parameter REMOTE_LOGIN_PASSWORDFILE

 如果值不是EXCLUSIVE,則:alter system set remote_login_passwordfile=exclusive scope=spfile;

     (3)密碼檔案需要scp到從庫

        # scp orapworcl oracle@192.168.215.102:/opt/oracle/11.2/dbs 提示輸入yes 

     (4)控制檔案:

        11g的控制檔案一共兩份,內容一樣,一份在$ORACLE_BASE/oradata/orcl/control01.ctl

 一份在/opt/oracle/flash_recovery_area/orcl/control02.ctl

 生成standby控制檔案:

1
2
3
4
sql>shutdown immediate
sql>startup mount
sql>alter database create standby controlfile as '/tmp/standby_control01.ctl';
sql>startup open;

 

 然後在備庫建立對應的目錄,並授權

 mkdir orcl--- chown oracle:oinstall(或dba) orcl

scp control01.ctl oracle@192.168.215.102:/opt/oracle/oradata/orcl
scp control02.ctl oracle@192.168.215.102:/opt/oracle/flash_recovery_area/orcl/

 

     

    5.db_name和db_unique_name

      預設db_name和db_unique_name和例項名是一致的,這裡是orcl

      需要注意在DG中主庫和從庫的db_unique_name是不能一致的,需要區分開的。

      這裡我們設定主庫的db_unique_name為orcl,從庫為orcldg

      sql>show parameter db_unique_name

      設定:alter system set db_unique_name=orcl scope=spfile;

      --注意雖然預設db_unique_name和db_name是一致的,但是需要顯式設定,否則在spfile中沒有此引數

    

    6.閃回資料庫:

      強烈建議開啟資料庫閃回功能。閃回允許你將資料庫還原到以前的某一時間點。當發生故障轉移時,這個功能非常有用,

      它能讓你將老的主庫閃回到故障前,然後將其轉換為備庫。如果沒有啟用閃回功能,你就必須重建備庫,意味著要再複製一次資料檔案。

      除了這個好處,閃回還能在某些情況下讓你避免從備份恢復資料。


      (1)快速恢復區(Flash/Fast Recovery Area),預設是配置的,但是需要確認這個區域的磁碟夠大,至少300G以上(預設3G)

       sql>show parameter db_recovery_file_dest

       可以修改位置:sql>alter system set db_recovery_file_dest='新路徑';

       更改大小:sql>alter system set db_recovery_file_dest_size=400G;

      (2)檢視是否啟用,預設是不開啟的

       sql>select flashback_on from v$database;

       開啟:sql>alter database flashback on;

       如果你碰到 ORA-01153 報錯,那一定是在備庫進行此操作。你需要先取消重做日誌應用,啟用閃回日誌,然後重新啟用日誌應用。

       在主庫啟用閃回日誌,不會同步備庫也啟用。你必須手動在主庫和備庫上均啟用閃回日誌。

       如果不啟用閃回日誌,當出現故障轉移時,你將需要完全重新開始建立一個備庫。

    7.SQL*NET設定

      (1)配置主庫的監聽

         雖然可以通過netca來進行配置,但是除了這個預設的外,我們還需要一個靜態註冊SID_LIST_LISTENER,如果沒有此從引數而且

  dataguard啟動順序不正確,主庫會報PING[ARC1]:Heartbeat failed to connect to standby '***'.Error is 12514導致歸檔無法完成

  配置如下

 

SID_LIST_LISTENER=
     (SID_LIST =
  (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /opt/oracle/11.2)
      (SID_NAME = orcl)
  )
     )
          LISTENER =
   (DESCRIPTION_LIST =
     (DESCRIPTION =
       (ADDRESS = (PROTOCOL = TCP)(HOST = primaryDB)(PORT = 1521))
     )
   )
  

 

 

#vi $ORACLE_HOME/network/admin/listener.ora 加入上面的內容

       (2)配置tnsnames

        #vi $ORACLE_HOME/network/admin/tnsnames.ora

ORCL =
   (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.215.101)(PORT = 1521))
     )
     (CONNECT_DATA =
       (SERVICE_NAME = orcl)
     )
   )
 
 ORCLDG =
   (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.215.102)(PORT = 1521))
     )
     (CONNECT_DATA =
       (SERVICE_NAME = orcldg)
     )
   )

 

     

    (3)傳輸到備庫並修改listener.ora和tnsnames.ora

  


scp $ORACLE_HOME/network/admin/listener.ora oracle@192.168.215.102:/opt/oracle/11.2/network/admin/
scp $ORACLE_HOME/network/admin/tnsnames.ora oracle@192.168.215.102:/opt/oracle/11.2/network/admin/
          
--listener.ora:
          SID_LIST_LISTENER
   (SID_LIST =
     (SID_DESC =
        (GLOBAL_DBNAME = orcldg)
        (ORACLE_HOME = /opt/oracle/11.2)
        (SID_NAME = orcl)
      )
    )


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


 



   tnsnames.ora:不需要修改

 

       8.重做日誌傳輸配置

         (1)配置歸檔日誌位置:

  查詢已經設定的歸檔路徑sql:archive log list或者show parameter log_archive_dest_1

sql> alter system set log_archive_dest_1='LOCATION=/opt/oracle/oradata/orcl/archive1 valid_for=(all_logfiles,primary_role) db_unique_name=orcl' scope=spfile;

 

     還可以使用快速恢復區作為歸檔目錄,如LOCATION=use_db_recovery_file_dest

     官方文件裡說使用 valid_for=(online_logfiles, all_roles),這將導致備庫無法歸檔備用日誌檔案,因為它們不是線上日誌。

     但如果使用 all_logfiles 選項,主備庫將都能歸檔線上以及備用日誌。

     如果你想在備庫進行備份,並同時備份歸檔日誌的話,必須使用 all_logfiles。

   

         (2)配置重做日誌到備份庫:

sql>alter system set log_archive_dest_2='SERVICE=orcldg lgwr sync valid_for=(online_logfile,primary_role)  
               db_unique_name=orcldg';

   

  (3)要注意STANDBY_ARCHIVE_DEST 引數不需要,已經被官方棄用。設定此引數後啟動資料庫,只會報 ORA-32004: 
     obsolete or deprecated parameter(s) specified for RDBMS instance 錯。

  9.配置FAL_SERVER

    這個引數指定當日誌傳輸出現問題時,備庫到哪裡去找缺少的歸檔日誌。它用在備庫接收的到的重做日誌間有缺口的時候。

    這種情況會發生在日誌傳輸出現中斷時,比如你需要對備庫進行維護操作。在備庫維護期間,沒有日誌傳輸過來,這時缺口就出現了。

    設定了這個引數,備庫就會主動去尋找那些缺少的日誌,並要求主庫進行傳輸。

    你是主庫,就填寫:

      fal_server=從庫

    從庫上就反過來:

       fal_server=主庫

           注意:FAL_CLIENT在11g中已經廢棄,雖然可以配置但是已經不起作用了。

    sql>alter system set FAL_SERVER='orcldg';

   10.Data Guard 配置裡的另外一個庫的名字

     sql> alter system set log_archive_config = 'dg_config=(orcl,orcldg)';

   以上的辦法是我們採用alter system的方式線上修改,還有一種比較方便的辦法(但是容易出錯,所以方便和安全什麼時候都不可兼得)

   sql>create pfile from spfile;

   # 手工修改pfile

   sql>create spfile from pfile;

   然後用pfile生成spfile 同時傳輸pfile到從庫修改後生成spfile

   注意手工增加:

   *.log_archive_dest_state_1=enable

   *.log_archive_dest_state_2=enable

  

vi initorcl.ora

orcl.__db_cache_size=180355072
orcl.__java_pool_size=4194304
orcl.__large_pool_size=4194304
orcl.__oracle_base='/opt/oracle'#ORACLE_BASE set from environment
orcl.__pga_aggregate_target=264241152
orcl.__sga_target=494927872
orcl.__shared_io_pool_size=0
orcl.__shared_pool_size=289406976
orcl.__streams_pool_size=8388608
*.audit_file_dest='/opt/oracle/admin/orcl/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/opt/oracle/oradata/orcl/control01.ctl','/opt/oracle/flash_recovery_area/orcl/control02.ctl'#Restore Controlfile
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_recovery_file_dest='/opt/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=4039114752
*.diagnostic_dest='/opt/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.fal_server='orcldg'
*.job_queue_processes=1000
*.log_archive_config='dg_config=(orcl,orcldg)'
*.log_archive_dest_1='LOCATION=/opt/oracle/oradata/orcl/archive1 valid_for=(all_logfiles,primary_role) db_unique_name=orcl'
*.log_archive_dest_2='SERVICE=orcldg lgwr sync valid_for=(online_logfile,primary_role) db_unique_name=orcldg'
*.log_archive_format='orcl_%t_%s_%r.dbf'
*.memory_target=756023296
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'

 

 scp initorcl.ora oracle@192.168.215.102:/opt/oracle/11.2/dbs/

    修改備庫的initorcl.ora 修改引數如下:

*.db_name='orcl'
  *.db_unique_name='orcldg'
  *.fal_server='orcl'
  *.log_archive_config='dg_config=(orcldg,orcl)'
  *.log_archive_dest_1='LOCATION=/opt/oracle/oradata/orcl/archive1 valid_for=(all_logfiles,primary_role) db_unique_name=orcldg'
  *.log_archive_dest_2='SERVICE=orcl lgwr sync valid_for=(online_logfile,primary_role) db_unique_name=orcl'
 
  

  

    然後sql>create spfile from pfile;

  
11.傳輸主庫資料到備庫

        (1)scp -l 8192 -rp /opt/oracle/oradata/orcl/ oracle@192.168.215.102:/opt/oracle/oradata/

            注意目的地不要加orcl 會自動建立目錄的

            -l是limit限制,這樣最大是8192/8=1M速度,是為了解決stalled問題

            -rp 迴圈子目錄檔案

        (2)建立spfile中需要的目錄

       如/opt/oracle/admin/orcl/adump dpdump pfile

 12.啟用物理備用資料庫

       sql>startup nomount

       sql>alter database mount standby database;

       (1)啟動 redo 應用

  SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

  啟動實時應用

  SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

          這個命令指示備庫開始使用備用日誌檔案進行恢復。它也告訴備庫命令完成後回到命令列介面

   SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

   此時只是暫時 redo 應用,並不是停止 Standby 資料庫,standby 仍會保持接收只不過不會再應用

                 接收到的歸檔,直到你再次啟動 redo 應用為止

        (2)停止standby

           正常情況下,首先

     SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

    然後再sql>shutdown immediate

    當然也可以直接shutdown immediate

        (3)備用伺服器的管理模式與只讀模式

    <1>.啟動到管理模式

SQL>shutdown immediate;
SQL>startup nomount;
SQL>alter database mount standby database;
SQL>alter database recover managed standby database disconnect from session;



    <2>.啟動到只讀方式    

SQL>shutdown immediate;
 SQL>startup nomount;
 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 '/u02/oradata/test/temp01.dbf' size 100M;


     <4>.從只讀方式到管理恢復方式

     SQL> recover managed standby database disconnect from session;


         (4)應用物理備庫的幾點監控

      如果上面出了問題或者我們不知道成功了沒有,可以用下面的方法檢測


     <1>確認主備庫裡的歸檔目的地配置都是有效的

        select DEST_ID, STATUS, DESTINATION, ERROR from V$ARCHIVE_DEST where DEST_ID<=2;

        目的地狀態status應該顯示為 VALID,注意如果上面沒有執行redo應用會有一條error資訊


     <2>確認重做日誌是否真的被應用了,在主庫執行

        select SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED, ARCHIVED from V$ARCHIVED_LOG where name = 'JED2' order by FIRST_TIME;

        如果歸檔和日誌應用均正常,APPLIED 和 ARCHIVED 列都應該是 YES。(如果沒有應用redo,applied應該是NO)

        很多教程裡都讓這個查詢以 SEQUENCE# 列排序,但我不推薦。如果以 SEQUENCE# 列排序,當你做了一次故障轉移後,序列號會再從1開始,

        這時使用這個查詢,你將不能在結果最後看到最新的記錄。我曾經很奇怪為什麼查不到新記錄,其實是因為新記錄不是出現在最後,

        我沒看到。所以,這個查詢都是以 FIRST_TIME 列排序.


     <3>主庫上檢查是否有重做日誌缺口

        如果你發現日誌沒有被應用,那可能是重做日誌有了缺口,這種情況下備庫無法進行日誌應用。但如果你的 FAL_SERVER 引數設定正確,這應該不會有問題

        select STATUS, GAP_STATUS from V$ARCHIVE_DEST_STATUS where DEST_ID = 2;

        如果一切正常,應該返回 VALID 和 NO GAP .切記啟用redo應用才能顯示No GAP


     <4>在主備庫上執行以下查詢檢視資料庫狀態

         select * from V$DATAGUARD_STATUS order by TIMESTAMP;


     <5>檢查是否成功:

        主庫上檢視日誌傳送情況:

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

        應該log_archive_dest_1和2狀態應該是valid

        切換幾次日誌:

        sql>alter system switch logfile;

                      檢視日誌序號:

        sql>select sequence# from v$archived_log;

                      備庫驗證:

        sql>select sequence#,applied from v$archived_log;


    13.dataguard啟動關閉順序

       (1)監聽

          先啟從庫再起主庫

   #lsnrctl start

       (2)啟動

          先啟從庫:

   sql>startup nomount

   sql>alter database mount standby database;

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

   在啟主庫

   sql>startup

        (3)關閉:和開啟正好相反

           先關主庫:

    sql>shutdown immediate

    再關從庫:

    sql>alter database recover managed standby database cancel;

    sql>shutdown immediate;



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

相關文章