10g Data Guard physical standby的主備庫角色轉換測試(switchover & failover)

ora_erin發表於2014-03-06
1、角色轉換前的準備工作
1)主庫上確認fal_server、db_file_name_convert、log_file_name_convert、standby_file_management、log_archive_dest_n的設定
fal_server=orcldg
db_file_name_convert='E:\oracle\product\10.2.0\oradata\ORCLDG\', 'E:\oracle\product\10.2.0\oradata\ORCL\'
log_file_name_convert='E:\oracle\product\10.2.0\oradata\ORCLDG\', 'E:\oracle\product\10.2.0\oradata\ORCL\'
standby_file_management=auto
SQL> show parameter log_archive_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1                   string      location=E:\oracle\product\10.2.0\arch valid_for=(all_logfiles,all_roles) db_unique_name=ORCL
log_archive_dest_2                   string      service=7502 arch valid_for=(online_logfiles,primary_role) db_unique_name=ORCLDG

2)在主庫建立standby redo log
alter database add standby logfile 'E:\oracle\product\10.2.0\oradata\ORCL\DGREDO01.log' size 50M;
alter database add standby logfile 'E:\oracle\product\10.2.0\oradata\ORCL\DGREDO02.log' size 50M;
alter database add standby logfile 'E:\oracle\product\10.2.0\oradata\ORCL\DGREDO03.log' size 50M;
alter database add standby logfile 'E:\oracle\product\10.2.0\oradata\ORCL\DGREDO04.log' size 50M;

3)備庫上確認fal_server、db_file_name_convert、log_file_name_convert、standby_file_management、log_archive_dest_n的設定
fal_server=orcl
db_file_name_convert='E:\oracle\product\10.2.0\oradata\ORCL\', 'E:\oracle\product\10.2.0\oradata\ORCLDG\'
log_file_name_convert='E:\oracle\product\10.2.0\oradata\ORCL\', 'E:\oracle\product\10.2.0\oradata\ORCLDG\'
standby_file_management=auto
SQL> show parameter log_archive_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1                   string      location=E:\oracle\product\10.2.0\arch2 valid_for=(all_logfiles,all_roles) db_unique_name=ORCLDG
log_archive_dest_2                   string      service=7501 arch valid_for=(online_logfiles,primary_role) db_unique_name=ORCL

4)備庫建立online redo log
原先data guard剛配置好的時候,備庫中只是在控制檔案中記錄了online redo log的資訊,但是實際磁碟上並沒有online redo log,在備庫執行恢復的時候會去檢測並建立,摘錄alert日誌如下:

Thu Mar 06 10:04:13 2014
alter database recover managed standby database disconnect from session
MRP0 started with pid=13, OS id=2684
Managed Standby Recovery not using Real Time Apply
Thu Mar 06 10:04:19 2014
Errors in file e:\oracle\product\10.2.0\admin\orcldg\bdump\orcldg_mrp0_2684.trc:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDG\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

Thu Mar 06 10:04:19 2014
Errors in file e:\oracle\product\10.2.0\admin\orcldg\bdump\orcldg_mrp0_2684.trc:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDG\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

Clearing online redo logfile 1 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDG\REDO01.LOG
Clearing online log 1 of thread 1 sequence number 36
Thu Mar 06 10:04:19 2014
Errors in file e:\oracle\product\10.2.0\admin\orcldg\bdump\orcldg_mrp0_2684.trc:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDG\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

Thu Mar 06 10:04:19 2014
Completed: alter database recover managed standby database disconnect from session
Thu Mar 06 10:04:20 2014
Clearing online redo logfile 1 complete


5)確保備庫處於archivelog和force logging模式
SQL> select log_mode,force_logging from v$database;
 
LOG_MODE     FORCE_LOGGING
------------ -------------
ARCHIVELOG   YES

6)確保備庫存在和主庫一致的臨時檔案
主庫:
SQL> select name from v$tempfile;
 
NAME
------------------------------------------------------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP01.DBF

備庫:
SQL> select name from v$tempfile;
 
NAME
------------------------------------------------------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDG\TEMP01.DBF

2、switchover(主庫和備庫角色互換,一般是主庫在硬體升級或軟體升級的時候進行switchover)
1)關閉備庫,開啟主庫,並在主庫上執行一些變更:
startup mount
alter system set log_archive_dest_2='service=7502 arch valid_for=(online_logfiles,primary_role) db_unique_name=ORCLDG' scope=spfile;
alter database set standby database to maximize performance;--現在data guard是最大效能保護模式
alter database open;
SQL> select * from hr.test;

        ID
----------
         1
         2
         3
         4

SQL> insert into hr.test values(5);

已建立 1 行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系統已更改。

在主庫歸檔日誌目錄下產生一個歸檔日誌,在備庫上沒有

SQL> insert into hr.test values(6);--id=6這條資料還在聯機重組日誌中

已建立 1 行。

SQL> commit;

提交完成。

2)主庫上檢查是否支援switchover,如果v$database.switchover_status列為to standby表示支援,不然就要重新檢查下data guard的配置

SQL> select database_role,open_mode,switchover_status from v$database;

DATABASE_ROLE    OPEN_MODE  SWITCHOVER_STATUS
---------------- ---------- --------------------
PRIMARY          READ WRITE SESSIONS ACTIVE

狀態是sessions active,看聯機文件的描述:
If the value in the SWITCHOVER_STATUS column is SESSIONS ACTIVE, perform the 
steps described in Section A.4, "Problems Switching Over to a Standby Database" on 
page A-4 to identify and terminate active user or SQL sessions that might prevent a 
switchover from being processed. If, after performing these steps, the SWITCHOVER_
STATUS column still displays SESSIONS ACTIVE, you can successfully perform a 
switchover by appending the WITH SESSION SHUTDOWN clause to the ALTER 
DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY statement 
described in Step 2.

--不過我當前是沒有其他session連著的,不知道為什麼是顯示這個狀態,不過可以使用with session shutdown這個選項

3)將主庫轉換為備庫
SQL> alter database commit to switchover to physical standby with session shutdown;
alter database commit to switchover to physical standby with session shutdown
*
第 1 行出現錯誤:
ORA-16416: 切換目標與主目標不同步

因為我故意製造了主庫和備庫的日誌間隙,備庫重新同步後,應該沒問題,可以順利切換:
備庫:
SQL> alter database recover managed standby database disconnect from session;

資料庫已更改。

主庫:
SQL> alter system switch logfile;--把第6條記錄也同步過去

系統已更改。

備庫上應用完畢後,主庫上執行:
SQL> alter database commit to switchover to physical standby with session shutdown;--執行成功

資料庫已更改。

SQL> select database_role,open_mode,switchover_status from v$database;
select database_role,open_mode,switchover_status from v$database
                                                      *
第 1 行出現錯誤:
ORA-01507: 未裝載資料庫

主庫執行這個操作後,資料庫被解除安裝,但是例項還是啟動著的

摘錄alert日誌如下:
alter database commit to switchover to physical standby with session shutdown
Thu Mar 06 12:52:14 2014
Stopping background process CJQ0
Thu Mar 06 12:52:14 2014
Stopping background process QMNC
Thu Mar 06 12:52:15 2014
SMON: disabling tx recovery
Thu Mar 06 12:52:15 2014
Stopping Job queue slave processes
Thu Mar 06 12:52:15 2014
Job queue slave processes stopped
Active process 7396 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
Active process 4820 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
CLOSE: waiting for server sessions to complete.
CLOSE: all sessions shutdown successfully.
Thu Mar 06 12:52:17 2014
SMON: disabling cache recovery
Thu Mar 06 12:52:17 2014
Block change tracking service stopping.
Thu Mar 06 12:52:17 2014
Stopping background process CTWR
Thu Mar 06 12:52:18 2014
Shutting down archive processes
Archiving is disabled
Thu Mar 06 12:52:23 2014
ARCH shutting down
ARC1: Archival stopped
Thu Mar 06 12:52:28 2014
ARCH shutting down
ARC0: Archival stopped
Thu Mar 06 12:52:29 2014
Thread 1 closed at log sequence 40
Successful close of redo thread 1
Thu Mar 06 12:52:30 2014
ARCH: Noswitch archival of thread 1, sequence 40
ARCH: End-Of-Redo Branch archival of thread 1 sequence 40
ARCH: Archiving is disabled due to current logfile archival
Clearing standby activation ID 1353650526 (0x50af115e)
The primary database controlfile was created using the
'MAXLOGFILES 16' clause.
There is space for up to 13 standby redo logfiles
Use the following SQL commands on the standby database to create
standby redo logfiles that match the primary database:
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 40 required for standby recovery
MRP0 started with pid=10, OS id=7948
Managed Standby Recovery not using Real Time Apply
Online logfile pre-clearing operation disabled by switchover
Media Recovery Log E:\ORACLE\PRODUCT\10.2.0\ARCH\ARC00040_0825872308.001
Identified End-Of-Redo for thread 1 sequence 40
Thu Mar 06 12:52:39 2014
Media Recovery End-Of-Redo indicator encountered
Thu Mar 06 12:52:39 2014
Media Recovery Applied until change 12315123290436
Resetting standby activation ID 1353650526 (0x50af115e)
Thu Mar 06 12:52:41 2014
Completed: alter database commit to switchover to physical standby with session shutdown

--在switchover的過程中會歸檔主庫當前的聯機重做日誌

SQL> shutdown immediate
ORA-01507: 未裝載資料庫

ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。

Total System Global Area  603979776 bytes
Fixed Size                  1250380 bytes
Variable Size             373296052 bytes
Database Buffers          222298112 bytes
Redo Buffers                7135232 bytes
資料庫裝載完畢。
SQL> select database_role,switchover_status from v$database;--主庫已經成功switchover為備庫

DATABASE_ROLE    SWITCHOVER_STATUS
---------------- --------------------
PHYSICAL STANDBY TO PRIMARY

4)備庫上檢查是否支援switchover,如果v$database.switchover_status列為to primary表示支援,不然就要重新檢查下data guard的配置
下面在備庫上進行操作
SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE

5)將備庫轉換為主庫
SQL> alter database commit to switchover to primary with session shutdown;

資料庫已更改。

SQL> select database_role,switchover_status from v$database;

DATABASE_ROLE    SWITCHOVER_STATUS
---------------- --------------------
PRIMARY          SESSIONS ACTIVE

此時備庫已經變為新的主庫,開啟新的主庫
SQL> alter database open;

資料庫已更改。

SQL> select * from hr.test;--資料是同步過來的,沒有丟失

        ID
----------
         1
         2
         3
         4
         5
         6

已選擇6行。

6)驗證新的主庫的功能
SQL> insert into hr.test values(7);

已建立 1 行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系統已更改。

歸檔日誌已經寫入新的主庫和新的備庫歸檔目的地,備庫開啟恢復後,資料同步成功
新的備庫:
SQL> alter database recover managed standby database disconnect from session;

資料庫已更改。

SQL> alter database recover managed standby database cancel;

資料庫已更改。

SQL> alter database open;

資料庫已更改。

SQL> select * from hr.test;

        ID
----------
         7
         1
         2
         3
         4
         5
         6

已選擇7行。

--至此,switchover演示完畢

3、failover(failover之後,原主庫不再是data guard配置的一部分,failover一般就是指主庫遭遇故障,啟動不起來,需要切換為備庫的情況)
在上述的switchover之後,原備庫orcldg(網路伺服器名為7502)變為新的主庫,原主庫orcl(網路伺服器名為7501)變為新的備庫

sqlplus sys/oracle@7502 as sysdba
SQL> select database_role from v$database;

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

sqlplus sys/oracle@7501 from v$database;
SQL> select database_role from v$database;

DATABASE_ROLE
----------------
PHYSICAL STANDBY

1)將備庫關閉,主庫開啟,在主庫上執行一些修改:
SQL> select * from hr.test;

        ID
----------
         7
         1
         2
         3
         4
         5
         6

已選擇7行。

SQL> insert into hr.test values(8);

已建立 1 行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系統已更改。

SQL> insert into hr.test values(9);

已建立 1 行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系統已更改。

SQL> insert into hr.test values(10);

已建立 1 行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系統已更改。

SQL> insert into hr.test values(11);--id=11這條資料所在的日誌未切換,未歸檔,還在聯機重做日誌檔案中

已建立 1 行。

SQL> commit;

提交完成。

在主庫的歸檔目錄(E:\oracle\product\10.2.0\arch2)下產生了42、43、44這三個歸檔日誌檔案,主庫當前聯機重做日誌檔案的sequence number為45,這些日誌在備庫上不存在

2)現在將主庫shutdown abort,模擬故障

3)在備庫上確認歸檔檔案與主庫是否連續,如果不連續,需要將主庫上的歸檔日誌檔案複製到備庫,並註冊到備庫控制檔案中

將備庫啟動到mount狀態,查詢v$archive_gap檢視,返回0條記錄,但是實際上備庫和主庫是存在歸檔間隙的,可能因為主庫目前是關閉狀態,所以這個檢視查詢不出來,但我們知道,主庫和備庫之間差42、43、44這三個歸檔日誌檔案。
將主庫的歸檔目錄(E:\oracle\product\10.2.0\arch2)下的42、43、44這三個歸檔日誌檔案,複製到備庫的歸檔目錄(E:\oracle\product\10.2.0\arch)下,並將這些日誌註冊到備庫的控制檔案中:
SQL> alter database register physical logfile 'E:\oracle\product\10.2.0\arch\ARC00042_0825872308.001';

資料庫已更改。

SQL> alter database register physical logfile 'E:\oracle\product\10.2.0\arch\ARC00043_0825872308.001';

資料庫已更改。

SQL> alter database register physical logfile 'E:\oracle\product\10.2.0\arch\ARC00044_0825872308.001';

資料庫已更改。

4)在備庫上應用這些歸檔日誌
SQL> alter database recover managed standby database finish force;

資料庫已更改。

5)切換備庫為主庫
SQL> alter database commit to switchover to primary;

資料庫已更改。

SQL> select database_role from v$database;

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

SQL> alter database open;

資料庫已更改。

SQL> select * from hr.test;

        ID
----------
         7
         1
         2
         3
         4
         5
         6
         8
         9
        10

已選擇10行。

--可以看到,備庫已經順利failover為主庫(原主庫已經不是data guard的一部分),但是看到hr.test表中只有10條資料,id=11那條資料已經丟失了,所以說在maximum performance保護模式下,如果主庫異常當機,需要切換為備庫的話,會造成一定資料的丟失(丟失聯機重做日誌中的資料)。

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

相關文章