程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 11.2.0.3物理DataGuard主備庫切換(附加:ora-16139錯誤的解決)

11.2.0.3物理DataGuard主備庫切換(附加:ora-16139錯誤的解決)

編輯:Oracle教程

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,主備庫相同,說明切換成功!!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved