2014年9月4日 星期四

Oracle Data guard - 主備切換



環境說明


Oracle 11.2.0.1


PRIMARY IP : 192.168.1.101

STANDBY IP : 192.168.1.102


先看一下目前主備庫的腳色


SQL> select name,database_role from v$database;


NAME      DATABASE_ROLE

--------- ----------------
ORCL      PRIMARY

SQL>



SQL> select name,database_role from v$database;


NAME      DATABASE_ROLE

--------- ----------------
ORCL      PHYSICAL STANDBY

SQL>




1.把主庫(1.101)切換為備庫


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


Database altered.


--這時 Primary 上所有Redo 資料都會傳送到 Standby db 上


2.把原主庫(1.101)開到 Standby mount


SQL> shutdown immediate;

ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.

Total System Global Area  313159680 bytes

Fixed Size                  2175328 bytes
Variable Size             264244896 bytes
Database Buffers           41943040 bytes
Redo Buffers                4796416 bytes
SQL> alter database mount standby database;

Database altered.


SQL>



3.檢查 Standby db (1.102)是否都有 apply 


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


 SEQUENCE# STA APPLIED

---------- --- ---------
        52 NO  YES
        54 NO  YES
        55 NO  YES
        53 NO  YES
        56 NO  YES
        57 NO  YES
        58 NO  YES
        59 NO  YES

107 rows selected.



SQL>


4.把 Standby db 轉為 Primary


SQL> alter database commit to switchover to primary;


Database altered.


SQL>



--檢查一下(1.102)是否轉為Primary


SQL> select name,database_role from v$database;


NAME      DATABASE_ROLE

--------- ----------------
ORCL      PRIMARY


SQL>



--檢查一下(1.101)是否為Standby


SQL>  select name,database_role from v$database;


NAME      DATABASE_ROLE

--------- ----------------
ORCL      PHYSICAL STANDBY


SQL>

5.檢查完後 把 (1.102) shutdown 並開到 open


SQL> shutdown immediate;

ORA-01109: database not open


Database dismounted.

ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  313159680 bytes

Fixed Size                  2175328 bytes
Variable Size             255856288 bytes
Database Buffers           50331648 bytes
Redo Buffers                4796416 bytes
Database mounted.
Database opened.
SQL>



6.剛剛 (1.101) 已在Standby mount ,所以現在只要開啟應用實作就行


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


Database altered.


SQL>





7.檢查是否轉換成功


--在主庫(1.102)進行 swtich logfile 



SQL> alter system switch logfile;


System altered.



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

 SEQUENCE# STA APPLIED
---------- --- ---------
        61 NO  NO
        62 YES NO
        62 NO  NO

113 rows selected.


SQL>



--查看備庫(1.101) 是否有接收到並且應用


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


 SEQUENCE# STA APPLIED
---------- --- ---------
        58 YES NO
        58 NO  YES
        59 NO  YES
        59 YES NO
        60 NO  YES
        61 NO  YES
        62 NO  YES

106 rows selected.



SQL>

--測試成功


--在做一個測試

--在(1.102)主庫建立一個 table

SQL> create table test_dg100 as select * from dba_objects;


Table created.


SQL> select count(*) from test_dg100;


  COUNT(*)

----------
     72623


SQL> alter system switch logfile;

System altered.


SQL>




--查詢(1.101)備庫是否此Table 訊息 (必須開啟到 open read only 狀態



SQL> startup mount;

ORACLE instance started.

Total System Global Area  313159680 bytes

Fixed Size                  2175328 bytes
Variable Size             264244896 bytes
Database Buffers           41943040 bytes
Redo Buffers                4796416 bytes
Database mounted.
SQL> alter database open read only;

Database altered.


SQL>  select count(*) from test_dg100;


  COUNT(*)

----------
     72623

SQL>




--測試成功




上面是Primary DB還能開啟做的切換(Switchover),以下介紹的是Primary DB連開啟都不能開啟的切換(Failover)


Failover 最重要的是Redo file 的處理,要是處理的不當就會造成資料遺失

Data guard 保護模式有分成三種 Maximum Protection 最大保護、Maximum Availability 最高可用、Maximum Performance 最高性能

最大保護以及最高可用是以 LGWR SYNC AFFIRM 模式傳遞,主備庫兩邊的Redo file是一樣的,這邊就可以不用處理Redo file,不過在主庫還沒有Commit的交易當然就遺失了

假如最高性能是以 ARCH ASYNC 傳遞,這邊就要DBA手動去處理了



以下是針對 PERFORMANCE 的 Failover 小小測試

1.先看一下主備庫的模式 

SQL>  select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

SQL>


2.先在主庫創建 Table 好等等來驗證看看是否成功

SQL> create table test_dg101 as select * from dba_objects;

Table created.

SQL> select count(*) from test_dg101;

  COUNT(*)
----------
     72624

SQL> commit;


Commit complete.



--因為傳輸模式是ARCH,備庫還沒接收到 Archive log file,備庫所以當然就沒有此Table

SQL> select count(*) from test_dg101;
select count(*) from test_dg101
                     *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL>


3.模擬主庫 crash 


SQL> shutdown abort
ORACLE instance shut down.
SQL>

4.首先先把主庫的Redo log file傳送到Standby db上,這邊archive log file 已經都傳送過來Standby 所以就只處理Redo log 的部份,要是有archive log file 還未傳送到Standby 可以手動拉檔案過來再利用指令 SQL> ALTER DATABASE REGISTER LOGFILE '路径' 註冊進去

--關閉實做應用
SQL> alter database recover managed standby database cancel;

Database altered.

--利用Redo log file 恢復 Standby db 
SQL> recover standby database until cancel;
ORA-00279: change 1982951 generated at 09/04/2014 15:31:55 needed for thread 1
ORA-00289: suggestion : D:\ARCHIVE\ARC0000000069_0857233024.0001
ORA-00280: change 1982951 for thread 1 is in sequence #69


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
D:\test\REDO01.LOG
Log applied.
Media recovery complete.

SQL>

--有三個Redo log ,很幸運的試一次就成功


5.接著激活Standby db 讓它變成 Primary

SQL> shutdown immediate;
SQL> startup mount;
ORACLE instance started.

Total System Global Area  313159680 bytes
Fixed Size                  2175328 bytes
Variable Size             264244896 bytes
Database Buffers           41943040 bytes
Redo Buffers                4796416 bytes
Database mounted.
SQL>

SQL> alter database activate standby database;

Database altered.

SQL> alter database open;

Database altered.

SQL> SELECT DATABASE_ROLE FROM V$DATABASE;

DATABASE_ROLE
----------------
PRIMARY

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE


SQL>


--成功轉為 Primary


6.驗證

SQL> select count(*) from test_dg101;

  COUNT(*)
----------
     72624

SQL>



--資料成功恢復



















2014年9月2日 星期二

Oracle - Data Guard 保護模式轉換




Oracle Data Guard 的保護模式有提供三種Maximum Protection,Maximum Availability 和 Maximum Performance。


1.Maximum Protection 最大保護 
提供最安全的保護,在此模式下資料是絕對不會遺失,因為它要求本地 Primary DB 要寫入Redo log file 之前,至少也要寫一份去 Standby Redo log file ,此筆交易才算完成,如果因為網路故障或者某些原因導致 Primary DB無法連線至 Standby DB,這時Primary DB 會強制 Shutdown DB 以確保資料不會被遺失。

這種方式 Standby DB 必須配置Standby Redo Log,而 Primary DB 傳輸方式必須使用LGWR SYNC AFFIRM 模式


2.Maximum Availability 最高可用
此種模式也是提供最大保護,也是一樣要求本地 Primary DB 要寫入Redo log file 之前,至少也要寫一份去 Standby Redo log file ,此筆交易才算完成。差別在於此模式發生斷線,Primary DB 並不會強制Shutdown DB,而是自動切換 Maximum Performance 最高性能 模式,等待網路恢復正常後才會恢復成 Maximum Availability 最高可用

這種方式 Standby DB 也是必須配置Standby Redo Log,而 Primary DB 傳輸方式必須使用LGWR SYNC AFFIRM 模式


3.Maximum Performance 最高性能

這種模式下Primary DB不需等待 Standby Redo log file 寫入完成,所以效能上會比前兩種好,但也因為這樣資料同步上會有延遲。

這種傳輸方式可以用 LGWR ASYNC 或者 ARCH,Standby Database也不要求使用Standby Redo Log。



保護模式可以線上互相切換(除了第4種模擬之外



以下就針對上述的六種情況來做模擬

測試DB版本

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for 64-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production




1.最大性能 > 最高可用

(1.)先查看主備庫目前模式
SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE


(2.)查看log file 有無 standby log file

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER                                   IS_
---------- ------- ------- ---------------------------------------- ---
         1         ONLINE  D:\ORACLE\ORADATA\ORCL\REDO01.LOG        NO
         3         ONLINE  D:\ORACLE\ORADATA\ORCL\REDO03.LOG        NO
         2         ONLINE  D:\ORACLE\ORADATA\ORCL\REDO02.LOG        NO
         4         STANDBY D:\ORACLE\ORADATA\ORCL\REDO04.LOG        NO
         5         STANDBY D:\ORACLE\ORADATA\ORCL\REDO05.LOG        NO
         6         STANDBY D:\ORACLE\ORADATA\ORCL\REDO06.LOG        NO
         7         STANDBY D:\ORACLE\ORADATA\ORCL\REDO07.LOG        NO


7 rows selected.

要是沒有請在Standby DB使用以下指令增加,size大小必須與原使用Redo file一致,建議比照當前Redo log再多建一組Standby Redo file 以供轉換時備用

alter database add standby logfile group 4 'D:\datafile\redo04.log' size 50m;


(3.)調整傳輸模式為 LGWR SYNC AFFIRM



(4.)進行切換, 主備庫都轉為最高可用

SQL> alter database set standby database to maximize availability;

Database altered.

SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM AVAILABILITY RESYNCHRONIZATION

SQL> alter system switch logfile;

System altered.

SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY


SQL>


2.最高可用 > 最大保護

(1.)當前模式
SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

SQL>

(2.)因為傳輸模式已經改好了 LGWR SYNC AFFIRM 所以就可以直接轉換模式

SQL> alter database set standby database to maximize protection;

Database altered.

(3.)轉換成功
SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM PROTECTION   MAXIMUM PROTECTION


SQL>



3.最大保護 > 最大性能

(1.)當前模式
SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM PROTECTION   MAXIMUM PROTECTION

(2.)因為最大性能傳輸模式可以 LGWR 也可以 ARCH 傳輸,這邊就直接下指令轉換
SQL> alter database set standby database to maximize performance;

Database altered.

SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

SQL>




4.最大性能 > 最大保護

(1.)當前模式
SQL> select database_role,open_mode,protection_mode,protection_level from v$database;

DATABASE_ROLE    OPEN_MODE            PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- -------------------- --------------------
PRIMARY          READ WRITE           MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE


SQL>

(2.)在轉換時出現錯誤,表示所有instance 轉換時都不能在 open 狀態
SQL> alter database set standby database to maximize protection;
alter database set standby database to maximize protection
*
ERROR at line 1:
ORA-01126: database must be mounted in this instance and not open in any instance


SQL>


(3.) 在主DB開啟到 mount 狀態下指令

SQL> startup mount;
ORACLE instance started.

Total System Global Area  313159680 bytes
Fixed Size                  2175328 bytes
Variable Size             264244896 bytes
Database Buffers           41943040 bytes
Redo Buffers                4796416 bytes
Database mounted.
SQL> alter database set standby database to maximize protection;

Database altered.


(4.) 在備DB開啟到 mount 狀態下指令

SQL> startup mount;
ORACLE instance started.

Total System Global Area  313159680 bytes
Fixed Size                  2175328 bytes
Variable Size             264244896 bytes
Database Buffers           41943040 bytes
Redo Buffers                4796416 bytes
Database mounted.
SQL> alter database set standby database to maximize protection;

Database altered.

(5.)主庫open 並且檢查模式
SQL> alter database open ;

Database altered.

SQL> select database_role,open_mode,protection_mode,protection_level from v$database;

DATABASE_ROLE    OPEN_MODE            PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- -------------------- --------------------
PRIMARY          READ WRITE           MAXIMUM PROTECTION   MAXIMUM PROTECTION

SQL>

(6.)備庫 open read only ,並檢查模式

SQL> alter database open read only;

Database altered.

SQL> select database_role,open_mode,protection_mode,protection_level from v$database;

DATABASE_ROLE    OPEN_MODE            PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- -------------------- --------------------
PHYSICAL STANDBY READ ONLY            MAXIMUM PROTECTION   MAXIMUM PROTECTION

SQL>


5.最大保護 > 最高可用

(1). 查詢目前狀態
SQL> select database_role,open_mode,protection_mode,protection_level from v$database;

DATABASE_ROLE    OPEN_MODE            PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- -------------------- --------------------
PRIMARY          READ WRITE           MAXIMUM PROTECTION   MAXIMUM PROTECTION

(2.)轉換指令
SQL> alter database set standby database to maximize availability;

Database altered.

SQL> select database_role,open_mode,protection_mode,protection_level from v$database;

DATABASE_ROLE    OPEN_MODE            PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- -------------------- --------------------
PRIMARY          READ WRITE           MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY


SQL>


6.最高可用 > 最大性能

(1.) 這邊也是依樣直接下指令

SQL>
SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

SQL>
SQL> alter database set standby database to maximize performance;

Database altered.

SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

SQL>




結論:

最大性能要轉最大保護時 DB 必須要在 Mount 才能轉換,為了避免DB還要Shutdown ,可以先從 最大性能 > 最高可用 再從 最高可用 > 最大保護..

2次轉換可以避免Shutdown 後對業務上的影響