Oracle 11g Active Dataguard Switchover實驗

dbhelper發表於2014-11-29

 

Oracle Data GuardOracle HA架構體系的重要組成部分,也是Oracle MAAMaximum Availability Architecture)的關鍵技術方案。藉助Data GuardSwitchoverFailover特性,我們可以實現運維繫統高可用性需求,最大限度的降低計劃內和非計劃內當機時間。

Data Guard建立在資料庫軟硬體、資料冗餘策略,透過搭建和主庫Primary Database資料相同、軟硬體獨立的物理(Physical)和邏輯(Logical)備庫Standby,並且藉助Redo Log傳遞應用確保資料同步。當單獨資料庫(通常為Primary)發生故障,不能繼續提供服務時,額外的Standby可以作為備用資料庫來支援應用,減少系統整體資料丟失和停機影響。

SwitchoverFailoverDataguard裡面一組有區別又有聯絡的概念,其本質都是Primary停止對外服務,由Standby支援對外資料服務,變為新的Primary。但是兩者從概念到操作上都有很大差異。

Switchover的核心是“Planned”,也就是計劃內的停機切換動作。我們的運維繫統在執行過程中,經常有如裝置檢修、軟體升級補丁等維護操作。這個時候,如果是一些SLA要求很高的系統,停機時間視窗就是一個問題。特別是一些7*24的系統,業務部門是不會允許過長的停機時間。Switchover就是對Dataguard或者RAC環境下,臨時性的Primary點停機進行升級工作,由Standby變為Primary支援服務,最後再切換回來的過程。這個過程在Oracle中成為角色轉換role transition。由於是有準備、有計劃的操作,Switchover是平順的,不會引起資料的丟失。

Failover的核心則是“unplanned”,是和Switchover相對應,更貼近Data Guard的原始設計初衷。如果Primary出現故障,不能支援服務的時候。Standby可以在很短的時間內,自動或者手動的切換到Primary角色。之後由這個新的Primary支援服務。如果Primary可以修復好,則可能需要重新搭建DG或者Apply為新的Standby,之後切換回Primary角色。Failover由於涉及到Primary站點的故障型別程度,所以是可能出現資料丟失的。

進行SwitchoverFailover的工具方法很多,最常用的有三個:SQL CommandData Guard BrokerDB Grid Control。本文介紹如何使用SQL Command進行Switchover操作。

 

1、環境介紹

 

我們選擇環境已經搭建好Dataguard,版本為11.2.0.4PrimaryStandby相同)。作業系統版本為Red Hat Linux 6.5

 

 

SQL> select * from v$version;

 

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production

PL/SQL Release 11.2.0.4.0 - Production

CORE 11.2.0.4.0 Production

 

Primary資料庫unique名稱為ora11g

 

SQL> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database;

 

NAME      LOG_MODE     OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS    DB_UNIQUE_NAME

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

ORA11G    ARCHIVELOG   READ WRITE           PRIMARY          SESSIONS ACTIVE      ora11g

 

Standby資料庫名稱為ora11gsy,此時開啟實時資料同步應用。

 

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

 

Database altered

 

SQL> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database;

 

NAME      LOG_MODE     OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS    DB_UNIQUE_NAME

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

ORA11G    ARCHIVELOG   READ ONLY WITH APPLY PHYSICAL STANDBY NOT ALLOWED          ora11gsy

 

注意:此時standbyopen modeRead only with apply,這個是11g Active Data Guard的特性。傳統DG在進行Apply的過程中,是處在mount狀態的,不支援實時資料只讀操作。11g支援在apply中開啟資料庫到只讀狀態。

 

2Switchover過程中Primary主庫操作

 

進行Switchover的過程分為三個步驟,一個是在Primary上停止工作,切換到Standby狀態,第二個是在選擇一個Standby例項,切換角色到Primary狀態,最後是將其他StandbyApply過程啟動。

注意在上面我們檢視Primary資料庫ora11gv$database檢視,其中switchover_status取值是我們需要關注的,如果取值為session active或者to standby,我們是可以進行切換的。如果其他值,說明配置的log傳輸機制存在問題,需要解決調整。

 

--ora11g

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

Database altered

 

注意:如果swtichover_status狀態為session active,就需要在命令中加入with session shutdown子句。執行後,我們發現Primary ora11g已經關閉。

 

 

SQL> select status from v$instance;

select status from v$instance

*

ERROR at line 1:

ORA-03135: connection lost contact

Process ID: 2357

Session ID: 1 Serial number: 5

 

 

SQL> exit

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

 

--例項程式消失

[oracle@SimpleLinux trace]$ ps -ef | grep pmon

oracle    2107     1  0 15:35 ?        00:00:01 ora_pmon_ora11gsy

oracle    2473  1848  1 16:03 pts/1    00:00:00 grep pmon

 

此時,alert log中也記錄了例項停止的情況。

 

ALTER DATABASE ADD STANDBY LOGFILE 'srl1.f' SIZE 52428800;

ALTER DATABASE ADD STANDBY LOGFILE 'srl2.f' SIZE 52428800;

ALTER DATABASE ADD STANDBY LOGFILE 'srl3.f' SIZE 52428800;

ALTER DATABASE ADD STANDBY LOGFILE 'srl4.f' SIZE 52428800;

Archivelog for thread 1 sequence 19 required for standby recovery

Switchover: Primary controlfile converted to standby controlfile succesfully.

Switchover: Complete - Database shutdown required

USER (ospid: 2365): terminating the instance

Instance terminated by USER, pid = 2365

Completed: alter database commit to switchover to physical standby with session shutdown

 

Shutting down instance (abort)

License high water mark = 6

Sun Apr 20 16:02:11 2014

Instance shutdown complete

 

在這個過程中,為了確保資料無損失,Primary一定將所有的日誌資訊傳遞到Standby上。此時,可以啟動Primary,到mount standby狀態。

 

[oracle@SimpleLinux trace]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.4.0 Production on Sun Apr 20 16:06:47 2014

 

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

 

SQL> conn / as sysdba

Connected to an idle instance.

SQL> startup nomount

ORACLE instance started.

 

Total System Global Area  372449280 bytes

Fixed Size                  1364732 bytes

Variable Size             331353348 bytes

Database Buffers           33554432 bytes

Redo Buffers                6176768 bytes

 

SQL> alter database mount standby database;

Database altered.

 

 

注意:如果需要進行裝置維修或者停機操作,是可以不啟動Primary的。

 

3Switchover過程中Standby備庫操作

 

此時standby狀態。

 

SQL> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database;

 

NAME      LOG_MODE     OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS    DB_UNIQUE_NAME

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

ORA11G    ARCHIVELOG   READ ONLY WITH APPLY PHYSICAL STANDBY SESSIONS ACTIVE      ora11gsy

 

首先檢查standby上是否將所有的Redo Log順利應用,是否存在apply gap

 

 

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

 

 SEQUENCE# APPLIED

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

        17 YES

        18 YES

        19 YES

 

14 rows selected

 

使用命令進行切換。

 

 

SQL> alter database commit to switchover to primary;

alter database commit to switchover to primary

 

ORA-01093: ALTER DATABASE CLOSE 僅允許在沒有連線會話時使用

 

SQL> alter database commit to switchover to primary with session shutdown;

Database altered

 

此時,standby資料庫狀態為:

 

 

SQL> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database;

 

NAME      LOG_MODE     OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS    DB_UNIQUE_NAME

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

ORA11G    ARCHIVELOG   MOUNTED              PRIMARY          NOT ALLOWED          ora11gsy

 

SQL> conn / as sysdba

Connected.

SQL> select status from v$instance;

 

STATUS

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

MOUNTED

 

啟動standby資料庫ora11gsy,並且檢查redo log傳遞情況。

 

SQL> alter database open;

Database altered.

 

SQL> select sequence# ,name, STANDBY_DEST, APPLIED from v$archived_log;

 

 SEQUENCE# NAME                                                                             STANDBY_DEST APPLIED

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

       (篇幅原因,有省略……

        20 /u01/app/fast_recovery_area/ORA11GSY/archivelog/2014_04_20/o1_mf_1_20_9o70fq3g_. NO           NO

        20 ora11g                                                                           YES          NO

        21 /u01/app/fast_recovery_area/ORA11GSY/archivelog/2014_04_20/o1_mf_1_21_9o70fvr7_. NO           NO

        21 ora11g                                                                           YES          NO

 

18 rows selected

 

注意:由於新standbyora11g啟動狀態(mount),所以可以看到日誌傳遞,只是沒有應用。

 

4、效果檢查和測試

 

此時,我們檢查原來的Primary,也就是ora11g的資料庫狀態。

 

 

SQL> select status from v$instance;

 

STATUS

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

MOUNTED

 

 

SQL> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database;

 

NAME      LOG_MODE     OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS    DB_UNIQUE_NAME

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

ORA11G    ARCHIVELOG   MOUNTED              PHYSICAL STANDBY RECOVERY NEEDED      ora11g

 

已經接受資料,只是沒有開啟應用。

 

 

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

 

Database altered

 

此時,檢查ora11gsy的狀態,發現傳遞日誌已經應用。

 

 

SQL> select sequence# ,name, STANDBY_DEST, APPLIED from v$archived_log;

 

 SEQUENCE# NAME                                                                             STANDBY_DEST APPLIED

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

         (篇幅原因,有省略…..

        20 ora11g                                                                           YES          YES

        21 /u01/app/fast_recovery_area/ORA11GSY/archivelog/2014_04_20/o1_mf_1_21_9o70fvr7_. NO           NO

        21 ora11g                                                                           YES          YES

 

18 rows selected

 

下面進行一個資料同步測試,判斷switchover成功。我們在ora11gsy上建立資料表。

 

SQL> conn scott/tiger@ora11gsy

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0

Connected as scott

 

SQL> create table t as select * from dba_objects;

 

Table created

 

SQL> select count(*) from t;

 

  COUNT(*)

----------

     86033

 

primary端,啟動進入read only apply過程。

 

SQL> conn sys/oracle@ora11g as sysdba

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0

Connected as SYS

 

SQL> alter database recover managed standby database cancel;

Database altered

 

SQL> alter database open;

Database altered

 

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

Database altered

 

SQL> select count(*) from scott.t;

 

  COUNT(*)

----------

     86033

 

同步成功,進行switchover成功。

 

5、結論

 

進行Dataguard switchoverfailover是非常常見的運維需求,在實際場景下,我們儘可能選擇穩妥完全的策略進行操作。Dataguard Broker存在一定的配置工作量,而DB Grid Control又是一個收費產品,所以SQL命令還是我們比較好的選擇。

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

相關文章