DG分為主庫和備庫,我們也猜測其屬於primary與standby 之間的互動,那麼在primary 和standby 之間的切換:
然而切換又分為switchover和failovers,前者是無損切換,不會丟失數據,而後者則有可能會丟失數據,並且切換後原primary數據庫也不再是該data guard配置的一部分了.。
針對不同standby(邏輯或物理)的處理方式也不盡相同。
角色轉換前的准備工作:
1檢查各數據庫的初始化參數,主要確認對不同角色相關的初始化參數都進行了正確的配置。
2確保可能成為primary數據庫的standby服務器已經處於archivelog模式。
3確保standby數據庫的臨時文件存在並匹配primary數據庫的臨時文件
4確保standby數據庫的RAC實例只有一個處於open狀態。(對於rac 結構的standby數據庫,在角色轉換時只能有一個實例startup。其它rac實例必須統統shutdown,待角色轉換結束後再startup)
Switchover;
無損轉換,通常是用戶手動觸發或者有計劃的讓其自動觸發,比如硬件升級,軟件升級之類的。通常它給你帶來的工作量非常小並且都是可預計的。其執行分兩個階段,第一步, primary數據庫轉換為tandby角色,第二步,standby數據庫(之一)轉換為primary角色,primary和standby 只是簡單的角色互換,
Failover:
不可預知原因導致primary 數據庫故障並且短期內不能恢復就需要failover。如果是這種切換那你就要小心點了,有可能只是虛驚一場,但如果運氣不好又沒有完備的備份恢復策略而且primary 數據並非處於最大數據保護或最高可用性模式地話,這種情況下呢丟失數據有可能是難免的,並且如果其故障未能修復,那它甚至連快速修復成為standby 的機會也都失去了;
在執行failover 之前,盡可能將原primary 數據庫的可用redo 都復制到standby 數據庫。
注意,如果要轉換角色的standby處於maximum protection模式,需要你首先將其切換為maximum performance模式
SQL> ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZEPERFORMANCE;
等standby 切換為新的primary 之後,你可以再隨意更改數據庫的保護模式。
maximum protection模式需要確保絕無數據丟失,因此其對於提交事務對應的redo 數據一致性要求非常高,另外,如果處於maximum protection模式的primary數據庫仍然與standby數據庫有數據傳輸,此時alter database語句更改standby數據庫保護模式會失敗,這也是由maximum protection 模式特性決定的。
一、物理standby的 Switchover
注意操作步驟的先後,很關鍵的喲。
1、檢查是否支持switchover 操作--primary 數據庫操作。
2、登陸primary 數據庫,查詢v$database 視圖的switchover_status 列。
情況(一):存在gap問題
解決物理standby Gap問題
SQL> SELECT * FROM V$ARCHIVE_GAP;
THREAD#LOW_SEQUENCE# HIGH_SEQUENCE#
----------- ------------- --------------
1 7 10
--到主庫查詢,確認一下:
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1AND DEST_ID=1 AND SEQUENCE# BETWEEN 7 AND 10;
NAME
--------------------------------------------------------------------------------
/primary/thread1_dest/arcr_1_7.arc
/primary/thread1_dest/arcr_1_8.arc
/primary/thread1_dest/arcr_1_9.arc
--把這些歸檔copy到物理standby,並使用ALTERDATABASE REGISTER LOGFILE應用這些歸檔:
SQL> ALTER DATABASE REGISTER LOGFILE'/physical_standby1/thread1_dest/arcr_1_7.arc';
SQL> ALTER DATABASE REGISTER LOGFILE'/physical_standby1/thread1_dest/arcr_1_8.arc';
SQL> ALTER DATABASE REGISTER LOGFILE '/physical_standby1/thread1_dest/arcr_1_9.arc';
情況(二):沒有gap
SQL>selects witchover_status from v$database;
SWITCHOVER_STATUS
----------------------------------------
TO STANDBY
如果該列值為"TO STANDBY"則表示primary數據庫支持轉換為standby角色,否則的話你就需要重新檢查一下Data Guard配置,比如看看LOG_ARCHIVE_DEST_n之類參數值是否正確有效等等。
2、啟動switchover --primary 數據庫操作
首先將primary 轉換為standby 的角色,通過下列語句:
SQL> alter database commit to switchover to physical standby
Database altered.
01:57:06 SQL>shutdown immediate;
ORA-01092: ORACLE instance terminated. Disconnection forced
SQL>startup mount;
ORACLE instance started.
Total System Global Area 417546240bytes
Fixed Size 2228944bytes
Variable Size 289410352bytes
Database Buffers 121634816bytes
Redo Buffers 4272128bytes
Database mounted.
語句執行完畢後,primary數據庫將會轉換為standby數據庫,並自動備份控制文件到trace
4、檢查是否支持switchover 操作--待轉換standby 數據庫操作
待原primary 切換為standby 角色之後,檢查待轉換的standby 數據庫switchover_status 列,看看是否支持角色轉換。
23:10:48 SQL>select status from v$instance;
STATUS
------------------------
MOUNTED
23:11:09 SQL>alter database open;
Database altered.
情況(1):
23:11:21 SQL>select switchover_status from v$database;
SWITCHOVER_STATUS
----------------------------------------
SWITCHOVERLATENT
(這種情況說明是需要進行redo應用,解決辦法:開啟MRP)
23:11:29 SQL>
23:13:51 SQL>alter database commit to switchover toprimary;
alter databasecommit to switchover to primary
*
ERROR at line 1:
ORA-16139: mediarecovery required
23:14:49 SQL>alter database recover managed standby database disconnect from session;
Database altered.
23:22:48 SQL> select database_role,switchover_status from v$database;
DATABASE_ROLE SWITCHOVER_STATUS
------------------------------------------------------------------------
PHYSICALSTANDBY SWITCHOVERPENDING
(可以注意到,狀態變了,說明正在應用。。。。再等一下)
23:23:02 SQL>select database_role,switchover_status from v$database;
DATABASE_ROLE SWITCHOVER_STATUS
------------------------------------------------------------------------
PHYSICALSTANDBY SWITCHOVERPENDING
23:23:20 SQL>r
1* select database_role,switchover_status from v$database
DATABASE_ROLE SWITCHOVER_STATUS
------------------------------------------------------------------------
PHYSICALSTANDBY TO PRIMARY
(ok,到這裡說明已經完全應用了,開始進行switchover standby庫)
23:24:53 SQL>alter database commit to switchover to primary;
Database altered.
23:28:38 SQL>select status from v$instance;
STATUS
------------------------
MOUNTED
(細心的話可以注意到
(1)情況1,如果執行前standby數據庫是打開狀態的,執行切換備庫命令之後,備庫是處於mount狀態下,然而主庫執行切換命令後是直接關閉了數據庫
(2)情況二:
注意:待轉換的物理standby可以處於mount模式或open read only模式,但不能處於open read write模式。
情況(二):
23:23:20 SQL>r
1* select database_role,switchover_status from v$database
DATABASE_ROLE SWITCHOVER_STATUS
------------------------------------------------------------------------
PHYSICALSTANDBY TO PRIMARY
這種情形時最容易的,直接執行就可以成功:
23:24:53 SQL>alter database commit to switchover to primary;
Database altered.
6、完成轉換,打開新的primary 數據庫
SQL>alterdatabase open;
Database altered.
注:如果數據庫處於openread-only 模式的話,需要先shutdown然後直接startup即可。
7.驗證新的primary:
SQL>select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
36
SQL>r
1* alter system switch logfile
System altered.
Ok,主備庫相同,說明切換成功!!