盛哥學習 Data Guard 第四篇《物理standby之failover 丟棄切換》

leonarding發表於2012-06-07

一、switchoverfailover

所謂switchover是針對failover而言的,它是一種無損切換,切換的過程中不會丟失資料。可以平滑的使主備互換並且2個庫都可以正常使用。

切換過程:主庫->切換->備庫->檢查狀態->原備庫->切換->主庫->再檢查狀態

應用場合:主庫需要調整升級,主庫效能不佳,這時可以切換後用新主庫對外提供服務

是否丟失資料:不會丟失資料

所謂failover,它是一種丟棄切換,直接把備庫切換成主庫,原主庫自動丟棄,也就是不在屬於DG架構的一部分了。

切換過程:備庫->切換->主庫->檢查狀態,原主庫脫離DG架構

應用場合:當主庫發生嚴重故障不可逆轉的時候可以使用failover,例如  我們熟悉紐約雙子塔911事件,如果你的主庫在那裡,呵呵那麼你就不要在猶豫了,failover是你最佳之選擇 come on

是否丟失資料:極有可能丟失資料,我們的目標就是損失降到最低

如果在failure之前是maximum protection or maximum availability模式,會丟失資料

挽救措施:重建主庫        使用原來備份恢復主庫

Failover Role Transition 之前準備工作(標準流程,一般自己建的庫最瞭解就可以skip

1.      如果備庫是maximum protection 必須先修改成maximum performance之後才能切換

修改語句: Alter database set standby database to maximize performance

注:切換之後你可以在改回maximum protection mode

2.      如果主庫與備庫之間有日誌傳輸的話,如上語句修改備庫從maximum protection->maximum performance不會成功的。因為failover操作會刪除原主庫的DG配置,這也是為了保護主庫操作

二、實操failover丟棄切換

需要知道的事情

1.failover操作之後,會自動丟棄原主庫不在是DG一部分

2.如果你有多個備庫,其他備庫也會自動脫離DG,也不需要做shutdown restart 動作。當有了新主庫之後可以根據需要重新建立所有備庫

3.我們推薦使用命令列的方式進行failover操作

4.不能在備庫接收日誌情況下進行failover操作

6.在進行切換之前檢查歸檔日誌號不能有缺口gap

5.如果你的備庫是在maximum protection mode or maximum availability mode並且使用LGWR方式傳送日誌,那麼歸檔日誌號是不會有缺口的必須是連續的,這時可以直接停止接收日誌,馬上進行failover切換

進入操作環節

1)檢查備庫歸檔日誌號是否都是連續的,不能有缺口,否則需要補救

SYS@OEL> select database_role,switchover_status,open_mode from v$database;

DATABASE_ROLE    SWITCHOVER_STATUS    OPEN_MODE

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

PHYSICAL STANDBY NOT ALLOWED            READ ONLY

備庫現在是read only狀態,我們調整到mounted

SYS@OEL> alter database recover managed standby database disconnect from session parallel 2;

SYS@OEL> select database_role,switchover_status,open_mode from v$database;

DATABASE_ROLE    SWITCHOVER_STATUS    OPEN_MODE

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

PHYSICAL STANDBY SESSIONS ACTIVE          MOUNTED

我們在read only狀態可以直接應用日誌,OEL資料庫自動調整到mounted狀態

可以檢查V$ARCHIVE_GAP檢視歸檔日誌號有沒有缺口

SYS@OEL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;

no rows selected

備庫歸檔日誌號是連續的。不用在複製歸檔日誌了

Example

SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
THREAD#    LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- -------------- ------------- --------------
         1                               90                             92

如果得到這個結果,說明缺少909192號歸檔日誌,可以從主庫->copy->備庫,必須保證歸檔日誌齊全,否則會在failover時導致資料丟失

載入copy歸檔日誌資訊至控制檔案

ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
對比主備庫歸檔日誌列表的完整性

SYS@LEO> select sequence#,ARCHIVED,APPLIED from v$archived_log;    主庫歸檔日誌列表

SEQUENCE# ARC APP

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

        10 YES YES

        11 YES NO

        11 YES YES

        12 YES NO

        12 YES YES

SYS@OEL> select sequence#,ARCHIVED,APPLIED from v$archived_log;    備庫歸檔日誌列表

        10 YES YES

        11 YES YES

        12 YES YES

2)終止了RFS程式,以便停止接收redo日誌,終止日誌應用

OEL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;

Database altered.

我們來看看後臺是怎麼做的

SKIP STANDBY LOGFILE option no longer needed for RECOVERFINISH. Option ignored

跳過備庫redo日誌,不在需要恢復

Thu Jun  7 20:09:43 2012

Terminal Incomplete Recovery: request posted (OEL)

Thu Jun  7 20:09:46 2012

Terminal Recovery timestamp is '06/07/2012 20:09:46'    終止恢復時間

Terminal Recovery: applying standby redo logs.         終止redo日誌應用

Terminal Recovery: thread 1 seq# 13 redo required      13號歸檔日誌終止

Terminal Recovery: End-Of-Redo log allocation

MRP: Validating standby redo logfile 4

Thu Jun  7 20:09:46 2012

Media Recovery Log /u01/app/oracle/oradata/OEL/file1/redo4_1.rdo

Terminal Recovery: log 4 reserved for thread 1 sequence 13  redo4_1 對應的是13號歸檔日誌

Identified End-Of-Redo for thread 1 sequence 13

Force關鍵字:終止了RFS程式,以便停止接收日誌

Finish關鍵字:後面還可以跟隨 FORCE  WAIT  NOWAIT

3)備庫執行failover丟棄切換

SYS@OEL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

Database altered.

檢視alert_OEL.log日誌

ALTER DATABASE SWITCHOVER TO PRIMARY (OEL)

Thu Jun  7 20:37:39 2012

If media recovery active, switchover will wait 900 seconds

如果存在日誌應用會等待900秒,實際上可能更長

Standby terminal recovery start SCN: 166513

SwitchOver after complete recovery through change 166514   啟動所有線上日誌組

Online log /u01/app/oracle/oradata/OEL/file1/redo01.log: Thread 1 Group 1 was previously cleared

Online log /u01/app/oracle/oradata/OEL/file2/redo1_2.log: Thread 1 Group 1 was previously cleared

Online log /u01/app/oracle/oradata/OEL/file1/redo02.log: Thread 1 Group 2 was previously cleared

Online log /u01/app/oracle/oradata/OEL/file2/redo2_2.log: Thread 1 Group 2 was previously cleared

Online log /u01/app/oracle/oradata/OEL/file1/redo03.log: Thread 1 Group 3 was previously cleared

Online log /u01/app/oracle/oradata/OEL/file2/redo3_2.log: Thread 1 Group 3 was previously cleared

Standby became primary SCN: 166512

備庫變成了主庫

Switchover: Complete - Database shutdown required (OEL)

此時資料庫是一個不確定的狀態,需要重啟來恢復

SYS@OEL> select status from v$instance;

STATUS

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

STARTED

注意:a.此時OEL資料庫已經不能在接收原主庫日誌了

            b.如果你有其他備用資料庫,failover過程中,standby logfile內容會自動歸檔並應用到其他備用資料庫

            c.沒有必要關閉並重啟任何其他備庫,因為已經不屬於DG的一部分了

SYS@LEO> select database_role,switchover_status,open_mode from v$database;

DATABASE_ROLE    SWITCHOVER_STATUS    OPEN_MODE

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

PRIMARY          NOT ALLOWED          READ WRITE    我們看到切換狀態已經變成:不允許了

4)重新啟動新主庫

failover之後OELread only 的話,必須shutdown immediate –> startup 重啟資料庫

failover之後OELmounted 的話,可以直接open開啟

SYS@OEL> shutdown immediate

SYS@OEL> startup

5)檢查資料庫狀態

SYS@OEL> select log_mode from v$database;                 並且還是歸檔模式

LOG_MODE

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

ARCHIVELOG

SYS@OEL> select database_role,switchover_status,open_mode from v$database;

DATABASE_ROLE    SWITCHOVER_STATUS    OPEN_MODE

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

PRIMARY          NOT ALLOWED          READ WRITE

此時OEL庫已經切換成主庫了,並且不屬於DG一部分了,還是read write狀態可以正常對外服務

6backup 新主庫

為什麼要備份新主庫,這是一個安全措施,現在沒有完整資料庫備份,發生故障時也就沒有了恢復源了,DBA 第一黃金定律:有備無患

7)恢復原主庫

慣例往往都是發生嚴重事故後進行failover切換,絕大多數主庫已經不能在使用了,那麼我們用什麼方法可以恢復主庫呢?

第一,flashback database to restore the failed primary database

第二,利用現有OEL庫重新建立LEO庫為備庫

第三,使用RMAN恢復原主庫

 

小結:failover時一定要想好了主庫能否再恢復,資料能否再找回來。

一定要檢查日誌號的連線性,否則切換不能成功。

必須停掉日誌接收和應用後在切換

           深刻理解failoverswitchover含義與區別

 

Leonarding

2012.6.7

於天津&summer

Bloghttp://space.itpub.net/26686207

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

相關文章