夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
          轉自: http://blog.csdn.net/tianlesoftware/article/details/5547565




          Data Guard 環境:

          操作系統: redhat 4.7 

          Primary數據庫:

          IP地址:10.85.10.1。

          數據庫SIDorcl

          DB_UNIQUE_NAMEorcl_pd

           

          Standby數據庫:

          IP地址:10.85.10.2

          數據庫SIDorcl。

          DB_UNIQUE_NAMEorcl_st

           

           

           

          一. Primary 端的配置

           

          1.  主庫設置為force logging 模式

          SQL> alter database force logging;

           

          2. 主庫設為歸檔模式

          SQL> archive log list; 

          SQL> shutdown immediate 

          SQL> startup mount 

          SQL> alter database archivelog; 

          SQL> archive log list; 

           

          3. 添加redo log file

          添加一個新的Standby Redologs組(注意組號不要與當前存在的Online Redologs組重復),并為該組指定一個成員:

          SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/redo04.log') size 50M; 

          SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/orcl/redo05.log') size 50M; 

          SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/orcl/redo06.log') size 50M; 

          SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/orcl/redo07.log') size 50M; 


          4. 修改listener.ora tnsnames.ora 文件

           

          Listener.ora 文件:

           

          SID_LIST_LISTENER =

            (SID_LIST =

              (SID_DESC =

                (SID_NAME = PLSExtProc)

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

                (PROGRAM = extproc)

              )

          (SID_DESC =

          (GLOBAL_DBNAME = orcl)

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

                  (SID_NAME = orcl)  

              )

            )

           

          LISTENER =

            (DESCRIPTION_LIST =

              (DESCRIPTION =

                (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))

                (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

              )

            )

           

          注意:SID_LIST_LISTENER 配置的是靜態注冊,如果沒有該參數,而且Data Guard 啟動順序又不正確,那么在主庫可能會報 PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514. 錯誤,導致歸檔無法完成。

           

          Oracle Listener 動態注冊 與 靜態注冊

          http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5543166.aspx


          Tnsnames.ora 文件

          ORCL_ST =

            (DESCRIPTION =

              (ADDRESS_LIST =

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

              )

              (CONNECT_DATA =

          (SERVER = DEDICATED)

                (SERVICE_NAME = orcl)

              )

            )

           

          ORCL_PD =

            (DESCRIPTION =

              (ADDRESS_LIST =

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

              )

              (CONNECT_DATA =

                    (SERVER = DEDICATED)

                (SERVICE_NAME = orcl)

              )

            )


          5. 創建備庫的密碼文件和控制文件

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

          -- 說明: 判斷一個數據庫是Primary還是Standby,就是通過控制文件來判斷的。

          [oracle@localhost dbs]$ orapwd file=/u01/app/oracle/product/10.2.0/db_1/dbs/orapworcl password=admin

          如果已經存在,就不用創建了。 缺省情況下,win下口令文件的格式是pwdsid.oraunix下的格式是orapwSID(大小寫敏感)

           

          6. 修改初始化參數文件

          SQL> create pfile='/u01/initorcl.ora' from spfile;

           

          在initorcl.ora 添加如下內容:


          ####主庫參數######
          *.DB_NAME ='orcl';
          *.DB_UNIQUE_NAME='orcl_pd'  
          #--列出DG中所有DB_UNIQUE_NAME
          *.LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl_pd,orcl_st)' 
          *.LOG_ARCHIVE_DEST_1='LOCATION=/u01/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_pd'
          *.LOG_ARCHIVE_DEST_2='service=orcl_st DB_UNIQUE_NAME=orcl_st'


          *.LOG_ARCHIVE_DEST_STATE_1=ENABLE 
          *.LOG_ARCHIVE_DEST_STATE_2=ENABLE 
          *.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
          #####備庫參數#######
          *.FAL_SERVER=orcl_st
          *.FAL_CLIENT=orcl_pd
          *.standby_file_management='AUTO'  
          *.standby_archive_dest='/u01/archive'
          #如果主備庫目錄不同,還需要添加:
          #*.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
          #*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'

           


           

          '/u01/initorcl.ora' 這個pfile 啟動數據庫,并生成spfile。

          SQL> shutdown immediate

          Database closed.

          Database dismounted.

          ORACLE instance shut down.

          SQL> startup pfile='/u01/initorcl.ora';

          ORACLE instance started.

          Total System Global Area  167772160 bytes

          Fixed Size                  1218316 bytes

          Variable Size              79694068 bytes

          Database Buffers           83886080 bytes

          Redo Buffers                2973696 bytes

          Database mounted.

          Database opened.

          SQL> create spfile from pfile='/u01/initorcl.ora';

          File created.

           

           

          二. Standby 端配置

           

           1. 創建備庫存放數據文件和后臺跟蹤目錄, 這個目錄可以和主庫相同, 如果不同,就需要在主庫的初始化文件中進行轉換。 

          如:

          *.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'

          *.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'

           

             $ORACLE_BASE/ORADATA/ORCL 

             $ORACLE_BASE/admin/orcl 

             $ORACLE_BASE/admin/orcl/adump 

             $ORACLE_BASE/admin/orcl/bdump 

             $ORACLE_BASE/admin/orcl/cdump 

             $ORACLE_BASE/admin/orcl/dpdump 

             $ORACLE_BASE/admin/orcl/pfile 

             $ORACLE_BASE/admin/orcl/udump 

             $ORACLE_BASE/admin/orcl/ 

           

          2. 將主庫的密碼文件,控制文件,數據文件,參數文件,日志文件copy到備庫。 

          說明一點,這個控制文件是我們自己創建的standby 控制文件。將copy過來的控制文件再復制三份就可以了。  主備的控制文件是不一樣的。  這里除了采用直接copy 文件之外,還可以采用Rman 恢復來做。 直接copy 需要停數據庫,如果采用RMAN 的話,就不需要停機了。 

          [oracle@localhost orcl]$ pwd

          /u01/app/oracle/oradata/orcl

          [oracle@localhost orcl]$ ls

          control01.ctl  redo01.log  redo04.log  redo07.log    temp01.dbf

          control02.ctl  redo02.log  redo05.log  sysaux01.dbf  undotbs01.dbf

          control03.ctl  redo03.log  redo06.log  system01.dbf  users01.dbf

          [oracle@localhost orcl]$ scp *.dbf 10.85.10.2://u01/app/oracle/oradata/orcl

          [oracle@localhost u01]$ scp *.ctl 10.85.10.2://u01/app/oracle/oradata/orcl

          [oracle@localhost u01]$ scp *.log 10.85.10.2://u01/app/oracle/oradata/orcl

          [oracle@localhost u01]$ scp initorcl.ora 10.85.10.2://u01/app/oracle/product/10.2.0/db_1/dbs

          [oracle@localhost dbs]$ scp orapworcl 10.85.10.2://u01/app/oracle/product/10.2.0/db_1/dbs

           

          3. 修改初始化參數文件

          修改之后如下:

          ####主庫參數######
          *.DB_NAME ='orcl';
          *.DB_UNIQUE_NAME='orcl_st'  
          #--列出DG中所有DB_UNIQUE_NAME
          *.LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl_pd,orcl_st)' 
          *.LOG_ARCHIVE_DEST_1='LOCATION=/u01/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_st'
          *.LOG_ARCHIVE_DEST_2='service=orcl_pd DB_UNIQUE_NAME=orcl_pd'


          *.LOG_ARCHIVE_DEST_STATE_1=ENABLE 
          *.LOG_ARCHIVE_DEST_STATE_2=ENABLE 
          *.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
          #####備庫參數#######
          *.FAL_SERVER=orcl_pd
          *.FAL_CLIENT=orcl_st
          *.standby_file_management='AUTO'  
          *.standby_archive_dest='/u01/archive'
          #如果主備庫目錄不同,還需要添加:
          #*.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
          #*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'

           

          4. 修改listener.ora 和 tnsnames.ora 文件,如果不存在,就從主庫上copy 過去。

           

          5. 在備庫添加redo log file

            如果主庫沒有添加redo log file,可以先用copy 過來的初始化文件將數據庫啟動到mount 狀態。在創建個spfile,最后添加redo log。

          SQL> startup mount pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora'

          ORACLE instance started.

          SQL> create spfile from pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora';

           

          添加一個新的Standby Redologs組(注意組號不要與當前存在的Online Redologs組重復),并為該組指定一個成員:

          SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/redo04.log') size 50M; 

          SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/orcl/redo05.log') size 50M; 

          SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/orcl/redo06.log') size 50M; 

          SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/orcl/redo07.log') size 50M; 

           

          提示,由于從Primary數據庫復制文件時并沒有復制Online Redologs,因此物理Standby數據庫在第一次啟動REDO應用時,會在Alert文件中報Online Redo Logfile文件不存在,沒有關系,物理Standby會自動重建這批文件,同時你也不用擔心會丟失數據,Online Redologs中的數據會以歸檔文件的形式從Primary端接收。

           

           

          至此,Data Guard 的操作已經完成,下面來開始驗證。

           

           

          注意Data Guard 啟動順序:

          啟動順序:先standby ,primary;
                 關閉順序:先primary standby;

           

           

          在備庫將實例啟動到mount 狀態

          SQL> startup nomount;

          SQL>alter database mount standby database ; 

          SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 

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

           

          在備庫啟動監聽:

          $lsnrctl start

           

          在主庫啟動實例:

          SQL> startup;

           

          在主庫啟動監聽:

          $lsnrctl start

           

          在主庫驗證歸檔目錄是否有效:

          SQL> SELECT STATUS,DESTINATION, ERROR FROM V$ARCHIVE_DEST;

          如果有錯誤,要排查原因。

           

          SQL> alter system switch logfile;

           

          SQL> select max(sequence#) from v$archived_log;

           

          MAX(SEQUENCE#)

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

                      70

           

          主備查詢結果一致,Data Guard 搭建結束。

           

           

           

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

           

           

           

           

          三. 一些其他操作 

           

          1. 首先查看當前的保護模式   ---primary數據庫操作

          SQL> select protection_mode,protection_level from v$database;

          PROTECTION_MODE      PROTECTION_LEVEL

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

          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

           

          2. 設置新的數據保護模式并重啟數據庫    --primary數據庫操作

           

          當保護模式更改順序:

          maximize protection --->  maximize availability ----> maximize performance

          當在把dataguard的保護級別按這上面的順序減低的時候, 不需要primary庫在mount狀態,否則primary 必須在mount 狀態。 

           

          如:
          SQL>  alter database set standby database to maximize availability;

           alter database set standby database to maximize availability

          *

          ERROR at line 1:

          ORA-01126: database must be mounted in this instance and not open in any

          instance

           

          SQL> shutdown immediate

          Database closed.

          Database dismounted.

          ORACLE instance shut down.

          SQL> startup mount;

          ORACLE instance started.

           

          Total System Global Area  167772160 bytes

          Fixed Size                  1218316 bytes

          Variable Size              79694068 bytes

          Database Buffers           83886080 bytes

          Redo Buffers                2973696 bytes

          Database mounted.

          SQL> alter database set standby database to maximize availability;

          Database altered.

          SQL> alter database open;

          alter database open

          *

          ERROR at line 1:

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

           

          報錯了,這是因為最大可用性需要先修改日志傳送方式為lgwr同步方式,否則,數據庫是無法open.

           

          Maximum protection/AVAILABILITY模式必須滿足以下條件

          Redo Archival Process: LGWR

          Network Tranmission mode: SYNC

          Disk Write Option: AFFIRM

          Standby Redo Logs: Yes

          standby database type: Physical Only

           

          SQL> alter system set log_archive_dest_2='service=orcl_st lgwr sync AFFIRM';

          System altered.

          SQL> shutdown immediate

          Database closed.

          Database dismounted.

          ORACLE instance shut down.

          SQL> startup mount;

          ORACLE instance started.

          Total System Global Area  167772160 bytes

          Fixed Size                  1218316 bytes

          Variable Size              79694068 bytes

          Database Buffers           83886080 bytes

          Redo Buffers                2973696 bytes

          Database mounted.

          SQL> alter database set standby database to maximize availability;

          Database altered.

          SQL> alter database open;

          Database altered.

          SQL> select protection_mode,protection_level from v$database;

          PROTECTION_MODE      PROTECTION_LEVEL

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

          MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

           

           

          alter database set standby database to maximize performance;

          提示:maximize后可跟{PROTECTION | AVAILABILITY | PERFORMANCE},分別對應最大保護,最高可用性及最高性能。

           

          在最大保護模式下,直接關閉備庫是不行的,如果在備庫上關閉數據庫,會有如下提示:
          SQL> shutdown immediate
          ORA-01154: database busy. Open, close, mount, and dismount not allowed now
          SQL>
          在最大保護模式下,備庫是不允許關閉的,此時首先關閉主庫,然后備庫就可以順利關閉了。

          注意: 主庫的保護模式修改之后,備庫的模式也會改變,和主庫保持一致。 

           

           

          3. 查看日志歸檔情況

           

          主庫進行日志切換

          SQL>Alter system switch logfile; 

           

          select max(sequence#) from v$archived_log; 

          select max(sequence#) from v$log_history; 

          select group#,sequence#,archived,status from v$log; 

          select name,sequence#,applied from v$archived_log; 

          select sequence#,applied from v$archived_log; 

           

          若不同步, 

          1) 看log日志, archive是否有丟失 

          2)可以在備庫坐如下操作: 

          alter database recover managed standby database cancel; 

          alter database recover managed standby database disconnect from session; 

           

           

           

           

           

          四. 主備庫切換 

           

           

          4.1 Switchover 

           

          一般SWITCHOVER切換都是計劃中的切換,特點是在切換后,不會丟失任何的數據,而且這個過程是可逆的,整個DATA GUARD環境不會被破壞,原來DATA GUARD環境中的所有物理和邏輯STANDBY都可以繼續工作。

           

           在進行DATA GUARD的物理STANDBY切換前需要注意: 

          1)確認主庫和從庫間網絡連接通暢; 

          2)確認沒有活動的會話連接在數據庫中; 

          3)PRIMARY數據庫處于打開的狀態,STANDBY數據庫處于MOUNT狀態;

          4)確保STANDBY數據庫處于ARCHIVELOG模式; 

          5)如果設置了REDO應用的延遲,那么將這個設置去掉; 

          6)確保配置了主庫和從庫的初始化參數,使得切換完成后,DATA GUARD機制可以順利的運行。 ­

           

          主庫:

          1. 查看switchover 狀態 

          SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

          SWITCHOVER_STATUS

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

          TO STANDBY

           

          附: A:switchover_status出現session active/not allowed 

           

           當出現session active的時候表示還有活動的session,則運行 

           Alter database commit to switchover to physical standby with session shutdown; 

               當出現not allowed時,在官方文檔說轉換會不成功,但是我測試的時候成功了。 

           

               B.ora- 01153: an incompatible media recovery is active 

                  運行下面代碼 

                  Alter database recover managed standby database finish; 

                  或者Alter database recover managed standby database finish force; 

                  Alter database recover managed standby database disconnect from session; 

           

          2 切換成備庫 

          SQL>Alter database commit to switchover to physical standby with session shutdown; 

          或者

          SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; 

               Database altered. 

           

          3 啟動到mount和應用日志狀態 

          SQL> SHUTDOWN IMMEDIATE 

          SQL> startup nomount; 

          SQL> alter database mount standby database; 

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

           

          4. 查看數據庫模式 

          SQL>select dest_name,status,database_mode,recovery_mode,protection_mode from v$archive_dest_status; 

          SQL>select status,database_mode from v$archive_dest_status; 

           

           

          備庫: 

          1.查看switchover狀態 

          SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE; 

              TO PRIMARY 

          附:若不是用此語句切換:ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY with session shutdown 

           

          補充:若出現:ORA-16139: media recovery required

          是因為沒有執行:alter database recover managed standby database disconnect from session; 

           

          2. 切換成主庫 

          SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; 

          Database altered. 

          SQL> shutdown immediate; 

          SQL> startup; 

          SQL> alter system switch logfile; 

           

          3. 查看數據庫模式 

          SQL>select dest_name,status,database_mode,recovery_mode,protection_mode from v$archive_dest_status; 

          SQL>select status,database_mode from v$archive_dest_status; 

           

          驗證同步:

          SQL> select max(sequence#) from v$archived_log;

          MAX(SEQUENCE#)

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

                      78

           

           

           

          4.2.  Failovers: 

           

          FAILOVER切換一般是PRIMARY數據庫發生故障后的切換,這種情況是STANDBY數據庫發揮其作用的情況。這種切換發生后,可能會造成數據的丟失。而且這個過程不是可逆的,DATA GUARD環境會被破壞。 

           

          由于PRIMARY數據庫已經無法啟動,所以FAILOVER切換所需的條件并不多,只要檢查STANDBY是否運行在最大保護模式下,如果是的話,需要將其置為最大性能模式,否則切換到PRIMARY角色也無法啟動。 

           

           

          1. 查看是否有日志GAP,沒有應用的日志: 

           

              SQL> SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG; 

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

           

            如果有,則拷貝過來并且注冊 

          SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '路徑'; 

          重復查看直到沒有應用的日志: 

           

          2. 然后停止應用歸檔: 

            SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 

            Database altered. 

           

          3. 下面將STANDBY數據庫切換為PRIMARY數據庫: ­

            SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH; 

          或 SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE; 

            Database altered. 

           

            SQL> SELECT DATABASE_ROLE FROM V$DATABASE; 

            DATABASE_ROLE 

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

            PHYSICAL STANDBY 

           

            SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; 

            Database altered. 

           

              SQL> ALTER DATABASE OPEN; 或者 shutdown immediate+startup 

            Database altered. 

           

            檢查數據庫是否已經切換成功: 

           

            SQL> SELECT DATABASE_ROLE FROM V$DATABASE; 

            DATABASE_ROLE 

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

            PRIMARY 

           

          至此,FAILOVER切換完成。這個時候應該馬上對新的PRIMARY數據庫進行備份。

          posted on 2014-05-26 13:49 HUIKK 閱讀(375) 評論(0)  編輯  收藏 所屬分類: DataBase
          主站蜘蛛池模板: 溆浦县| 于田县| 平谷区| 讷河市| 萝北县| 鸡东县| 阿鲁科尔沁旗| 昂仁县| 连州市| 金堂县| 维西| 汤阴县| 当涂县| 巴林左旗| 兴业县| 湾仔区| 中西区| 临朐县| 特克斯县| 玛纳斯县| 陆良县| 陆丰市| 平顶山市| 靖安县| 临清市| 临邑县| 乌拉特前旗| 旬阳县| 从江县| 鄂州市| 安新县| 德阳市| 和顺县| 米泉市| 峡江县| 新晃| 崇明县| 聂拉木县| 阳高县| 沂水县| 江油市|