DATAGUARD實際的應用場景

jichengjie發表於2016-06-28

本文主要討論以下幾個問題
1、線上建立DATAGUARD備庫
2、使用日RMAN異機恢復來保護DATAGUARD切換可能出現的問題。
3、切換和失敗切換


首先檢視DATAGUARD中引數哪些是靜態,哪些是動態的,動態的可以再不停機的情況下直接修改
先看一下主庫需要設定的引數,然後我們在資料庫中查一下
DB_UNIQUE_NAME=testdg1
LOG_ARCHIVE_CONFIG='DG_CONFIG=(testdg1,tsetdg2)'
LOG_ARCHIVE_DEST_1='LOCATION=/oradata/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testdg1'
LOG_ARCHIVE_DEST_2='SERVICE=testdg2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=testdg2'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
LOG_ARCHIVE_MAX_PROCESSES=2
STANDBY_FILE_MANAGEMENT='AUTO'
FAL_SERVER=testdg2
FAL_CLIENT=testdg1


select NAME,VALUE,ISSYS_MODIFIABLE
  from v$parameter2
 where upper(name) in ('DB_UNIQUE_NAME',
                        'LOG_ARCHIVE_CONFIG',
                        'LOG_ARCHIVE_DEST_2',
                        'LOG_ARCHIVE_DEST_1',
                        'LOG_ARCHIVE_DEST_STATE_1',
                        'LOG_ARCHIVE_DEST_STATE_2',
                        'REMOTE_LOGIN_PASSWORDFILE',
                        'LOG_ARCHIVE_FORMAT',
                        'LOG_ARCHIVE_MAX_PROCESSES',
                        'FAL_SERVER',
                        'FAL_CLIENT',
                        'STANDBY_FILE_MANAGEMENT');


NAME                             VALUE                                ISSYS_MODIFIABLE
-------------------------------- ------------------------------------ ----------------
log_archive_config                                                    IMMEDIATE
log_archive_dest_1               LOCATION=/home/oracle/archive        IMMEDIATE
log_archive_dest_2                                                    IMMEDIATE
log_archive_dest_state_1         enable                               IMMEDIATE
log_archive_dest_state_2         enable                               IMMEDIATE
log_archive_max_processes        2                                    IMMEDIATE
log_archive_format               %t_%s_%r.dbf                         FALSE
fal_client                                                            IMMEDIATE
fal_server                                                            IMMEDIATE
remote_login_passwordfile        EXCLUSIVE                            FALSE
db_unique_name                   test                                 FALSE
 
可以看到如果要動態的配置DATAGUARD,remote_login_passwordfile引數不能設定NONE,db_unique_name 也必須提前設定好
其他的引數都可以透過動態進行修改
 alter system set db_unique_name='testdg1' scope=spfile;
然後重啟資料庫,如果在規劃時就確定這個資料庫以後可能是要做DATAGUARD,可以提前設定好這個引數。
這樣其實主庫環境就準備好了,我們配置的是最大效能模式LGWR ASYNC模式。

1、設定主庫FORCE LOGGING屬性
 ALTER DATABASE FORCE LOGGING;
2、複製主庫的SPFILE到備庫,並且在備庫使用spfile建立pfile,修改pfile引數檔案加入或者更改


DB_UNIQUE_NAME=testdg2
LOG_ARCHIVE_CONFIG='DG_CONFIG=(testdg1,testdg2)'
LOG_ARCHIVE_DEST_1='LOCATION=/home/oracle/archive  VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testdg2'
LOG_ARCHIVE_DEST_2='SERVICE=testdg1 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=testdg1'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
LOG_ARCHIVE_MAX_PROCESSES=2
STANDBY_FILE_MANAGEMENT='AUTO'
FAL_SERVER=testdg1
FAL_CLIENT=testdg2


3、進行NET配置,主庫備庫均進行配置,備庫的LSTENER可以先啟動,保證都能TSNPING通

主庫:
testdg2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.171)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = testdg2)
    )
  )
備庫:
testdg1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.170)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = testdg1)
    )
  )
4、主庫進行RMAN備份,然後備份STANDBY CONTROLFILE,隨後傳輸密碼檔案,備份檔案,STANDBY控制檔案到備庫
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/boston.ctl';
5、恢復控制檔案,然後恢復資料檔案

[oracle@dg2 test]$ scp /home/oracle/boston.ctl control01.ctl
[oracle@dg2 test]$ scp /home/oracle/boston.ctl control02.ctl
[oracle@dg2 test]$ scp /home/oracle/boston.ctl control03.ctl
然後mount下恢復資料檔案


6、在備庫建立STANDBY LOGFILE 組為LOGFILE +1

alter database add standby logfile group 4  '/oracle/app/oracle/oradata/test/sredo04.log' size 50m;
alter database add standby logfile group 5  '/oracle/app/oracle/oradata/test/sredo05.log' size 50m;
alter database add standby logfile group 6  '/oracle/app/oracle/oradata/test/sredo06.log' size 50m;
alter database add standby logfile group 7  '/oracle/app/oracle/oradata/test/sredo07.log' size 50m;


到這裡備庫就算做完了。以下輸主庫

7、接下來我們來動態更改主庫的引數。


DB_UNIQUE_NAME=testdg1  --已經更改
LOG_ARCHIVE_CONFIG='DG_CONFIG=(testdg1,testdg2)' --需要更改
LOG_ARCHIVE_DEST_1='LOCATION=/home/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testdg1' -需要更改
LOG_ARCHIVE_DEST_2='SERVICE=testdg2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=testdg2' -需要更改
LOG_ARCHIVE_DEST_STATE_1=ENABLE -可以更改
LOG_ARCHIVE_DEST_STATE_2=ENABLE -可以更改
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE --已經更改
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc --不能更改
LOG_ARCHIVE_MAX_PROCESSES=2 --可以更改
STANDBY_FILE_MANAGEMENT='AUTO' --必須修改
FAL_SERVER=testdg2 --需要更改
FAL_CLIENT=testdg1 --需要更改

alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(testdg1,testdg2)'  scope=both;
alter system set LOG_ARCHIVE_DEST_1='LOCATION=/home/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testdg1'  scope=both;
alter system set LOG_ARCHIVE_DEST_2='SERVICE=testdg2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=testdg2'  scope=both;
alter system set LOG_ARCHIVE_DEST_STATE_1=ENABLE scope=both;
alter system set LOG_ARCHIVE_DEST_STATE_2=ENABLE scope=both;
alter system set LOG_ARCHIVE_MAX_PROCESSES=2 scope=both;
alter system set FAL_SERVER=testdg2 scope=both;
alter system set FAL_CLIENT=testdg1 scope=both;
alter system set STANDBY_FILE_MANAGEMENT='AUTO' scope=both;
8、確認配置成功
在主庫進行一次日誌切換來啟用LSN和RFS程式,主庫日誌如下:
******************************************************************
LGWR: Setting 'active' archival for destination LOG_ARCHIVE_DEST_2
******************************************************************
Wed Mar 12 01:22:22 CST 2014
Thread 1 advanced to log sequence 6 (LGWR switch)
  Current log# 3 seq# 6 mem# 0: /oracle/app/oracle/oradata/test/redo03.log
Wed Mar 12 01:22:22 CST 2014
LNS: Standby redo logfile selected for thread 1 sequence 6 for destination LOG_ARCHIVE_DEST_2
Wed Mar 12 01:22:22 CST 2014
ARC1: Standby redo logfile selected for thread 1 sequence 5 for destination LOG_ARCHIVE_DEST_2
9、開啟日誌應用,當然也可以開啟實時日誌應用如下:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

10、最後在主庫也建立相應多的standby logfile

alter database add standby logfile group 4  '/oracle/app/oracle/oradata/test/sredo04.log' size 50m;
alter database add standby logfile group 5  '/oracle/app/oracle/oradata/test/sredo05.log' size 50m;
alter database add standby logfile group 6  '/oracle/app/oracle/oradata/test/sredo06.log' size 50m;
alter database add standby logfile group 7  '/oracle/app/oracle/oradata/test/sredo07.log' size 50m;

11、只讀方式開啟

當備資料庫當前執行重做應用時開啟以用於只讀訪問:
1. 取消重做應用:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
2.開啟資料庫以用於只讀訪問:
SQL> ALTER DATABASE OPEN;

如果重新
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
恢復到正常模式


12、一些檢視
訪問V$MANAGED_STANDBY固定檢視
訪問V$ARCHIVE_DEST_STATUS固定檢視
訪問V$ARCHIVED_LOG固定檢視
訪問V$LOG_HISTORY固定檢視
訪問V$DATAGUARD_STATUS固定檢視


13、切換
首先檢查 備庫
SQL> select name,value from v$dataguard_stats;

NAME                             VALUE
-------------------------------- ----------------------------------------------------------------
transport lag                    +00 00:00:00
apply lag                        +00 00:00:00
apply finish time                +00 00:00:00.000
estimated startup time           13


transport lag                    +00 00:00:00
apply lag                        +00 00:00:00
apply finish time                +00 00:00:00.000
都為0

1、主庫執行
SELECT SWITCHOVER_STATUS FROM V$DATABASE
如果是SESSIONS ACTIVE和to standby
執行
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
2、關閉主庫
shutdown immediate
如果關閉報錯可以不理會,檢視一下程式是否存在
ps -ef|grep LGWR
如果不存在即可
3、啟動主庫到MOUNT
startup mount
4、在備庫執行
 SELECT SWITCHOVER_STATUS FROM V$DATABASE;
 如果是SESSIONS ACTIVE和to primary
 執行
 ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
5、關閉備庫
shutdown immediate
如果關閉報錯可以不理會,檢視一下程式是否存在
ps -ef|grep LGWR
如果不存在即可
6、啟動備庫
startup
7、源主庫執行,啟動日誌應用程式
alter database open;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

這樣完成了主庫備庫互相切換

最後檢查新的備庫及源主庫
SQL> select name,value from v$dataguard_stats;


NAME                             VALUE
-------------------------------- ----------------------------------------------------------------
transport lag                    +00 00:00:00
apply lag                        +00 00:00:00
apply finish time                +00 00:00:00.000
estimated startup time           13

transport lag                    +00 00:00:00
apply lag                        +00 00:00:00
apply finish time                +00 00:00:00.000

都為0

如果切換有問題請參考
Oracle Data Guard
Concepts and Administration
10gRelease 2 (10.2)
B14239-04

14、使用RMAN來保護可能在切換中的問題。
雖然說切換失敗也有辦法來進行回退,至少官方有文件說明,但是為了保障切換萬無一失,我們可以簡單的
是有RMAN異機來進行連續的恢復,如果有問題也不會導致資料丟失,比如典型的應用可能是我們進行伺服器修理
從而保證業務的連續性。

簡單的在主庫進行RMAN備份包含控制檔案然後複製到異機,進行restore,

保證應用已經停止沒有資料更改後進行日誌切換,然後複製可能的歸檔日誌到恢復端
這裡可能需要進行CATALOG ,我們使用CATALOG START WITH進行註冊就行了
我這裡記錄的SEQ是39
所以恢復為recover database until logseq 40 (<40)
然後模擬的我們進行一次切換,切換步驟參考上面,如果切換有問題我們就用我們異機恢復的資料庫,
如果沒有問題,我們就可以關閉主資料庫進行修理了。
一旦修理完成,我們想切換回主機,我們就需要再次上面的步驟
首先停止應用來確定,沒有資料修改,然後我們進行幾次切換保證所有的修改都進入了歸檔。
最後複製這些日誌到異機。這裡可能的需要進行一次CATALOG;
然後recover database until logseq
然後我們進行切換回主機即可,即使有問題也可以使用異機進行恢復



15、進行失敗切換
先確認是否有日誌GAP先確認是否有日誌GAP
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
對於使用ARCHIVE進行傳輸的模式,需要複製當前日誌檔案到目標端,並且進行註冊
ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1'; 
(需要測試)
需要根據ALTER日誌來判斷最後的當前日誌檔案。
保證任何可能的斷點都不存在


然後再備庫進行
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;來關閉RFS接收程式
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE; 確實資料沒有丟失
(如果此兩步有問題不能修復直接ACTIVE 備庫,這代表有資料丟失 
ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;)
檢視
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
程式轉換
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
SHUTDOWN IMMEDIATE; 
STARTUP 來啟動資料庫


實際上failover分為2種:
1、主庫還可以到mount
2、主庫不能到mount

1、如果主庫可以到mount
--確認gap情況
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
--保證備庫的mrp程式啟動
--ALTER SYSTEM FLUSH REDO TO 'target_db_name';
這一步保證了所有的redo傳輸到備庫,注意如果備庫mrp程式沒有啟動當前日誌將不能傳輸。
--ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;關閉備庫mrp程式
--ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;保證備庫接收的日誌應用完成
--確認可以進行切換了
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
---------------------------
TO PRIMARY
--ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;進行切換
--ALTER DATABASE OPEN;啟動資料庫

2、主庫不能到mount
主庫不能到mount自然就不能ALTER SYSTEM FLUSH REDO TO
那麼這一步我們需要手動完成
---確認gap
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
--將任何差值的archive log複製到備庫進行註冊
ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1'; 
--檢視mrp程式是否應用了這些註冊的歸檔
select * from v$managed_standby;
--關鍵一步需要恢復current_log
這一步是為了保證最小的日誌丟失,檢視alert日誌,來找到current log,傳輸到備庫,可以重新命名為
歸檔的格式
然後 recover standby database(until cancel)
;
--完成了這一步只能進行active備庫了
ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
--alter database open;

當然任何錯誤的情況下都可以activate physical standby database啟用備庫。

 作者微訊號:

          

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

相關文章