Oracle 12C 物理Standby 主備切換switchover


 

 

Oracle 12C 物理Standby 主備切換switchover

Oracle 12C 物理Standby 主備切換switchover

1 簡述

Oracle 12C 為DG 的運維提供了很多的改進。這里提到的就是其中之一的:物理DG 主備的一鍵切換。 所謂的一鍵就是一條命令。該命令會執行相關的檢查,並將11g 的切換步驟進行封裝執行。如果不符合 切換條件,會在命令行窗口及日志中給出相應的提示。

2 切換檢查

Oracle 為DG 切換提供了的專門的檢查命令:

alter database switchover to <target standby db_unique_name> verify;

以上命令會驗證如下信息:

  • 驗證數據庫的版本至少為 12.1
  • 主庫 REDO 傳輸正常。
  • 備庫 MRP 進程正常運行並且與主庫同步。

如果一切正常,數據庫會反饋以下消息

SQL> alter database switchover to chicago verify;

Database altered.

主庫日志:

SWITCHOVER VERIFY: Send VERIFY request to switchover target CHICAGO

SWITCHOVER VERIFY COMPLETE

Completed: alter database switchover to chicago verify

如果不正常,會有報錯信息,一般是 ORA-16470 或者 ORA-16475.

3 問題及解決方法

由於某些原因,可能我們的dataguard配置並不支持切換。這里列出對常見兩個錯誤的 解決思路。

3.1 ORA-16470

示例:

SQL>alter database switchover to chicago verify;

ORA-16470: Redo Apply is not running on switchover target

這種情況說明數據沒有正常同步,需要同步完成后,再進行切換。 在備庫執行以下命令:

alter database recover managed standby  database disconnect;

3.2 ORA-16475

ORA-16475 錯誤是一個入口性質的錯誤,只反饋給我們檢查成功,但是可能還會存在問題。 具體問題, 在primary 或者 standby 的alert日志中會有提示。命令行窗口的錯誤如下:

SQL> alter database switchover to chicago verify;

ERROR at line 1:

ORA-16475: succeeded with warnings, check alert log for more details

3.2.1 dirty redo log

如果redo log 中存在臟數據,需要清除,會遇到如下錯誤: 主庫日志:

-----Primary Alert log-----------

SWITCHOVER VERIFY WARNING: switchover target has dirty online redo logfiles that require clearing.

It takes time to clear online redo logfiles. This may slow down switchover process.
檢查 redo 日志路徑轉換設置
show parameter logfile_name_convert

如果沒有設置使用如下命令進行設置:

alter system set LOG_FILE_NAME_CONVERT='本地路徑','目標端路徑' scope=spfile;

注意
重啟備庫並且啟動 MRP。當重啟備庫並且啟動 MRP,將清除所有備庫的 log_file_name_convert 參數設置的日志。
檢查臨時文件

確認主庫和備庫的臨時數據文件匹配
臨時數據文件在創建備庫之后,不會同時創建臨時數據文件,用如下的命令查詢臨時數據文件,並且在備庫進行創建。

col name for a45
select ts#,name,ts#,status  from v$tempfile;
注意
對於多個備庫的環境,確保每個備庫與主庫同步。

3.2.2 log_archive_dest_n

standby 端*log_archive_dest_n* 參數配置不正確或者沒有配置時也會出現 ORA-16475 錯誤,alert日志如下:

SWITCHOVER VERIFY: Send VERIFY request to switchover target S1202
SWITCHOVER VERIFY COMPLETE
SWITCHOVER VERIFY WARNING: switchover target has no standby database definedin LOG_ARCHIVE_DEST_n parameter. If the switchover target is converted to
a primary database, the new primary database will not be protected.ORA-16475 signalled during: ALTER DATABASE SWITCHOVER TO S1202 VERIFY...
  • 檢查log_archive_dest_n 是否設置 對於一個standby的情況下,我們一般設置的是 log_archive_dest_2.

    show parameter log_archive_dest
    

    檢查除了log_archive_dest_1 外是否有配置其他參數。如果沒有配置,使用如下命令進行配置:

    alter system set log_archive_dest_2='SERVICE=&tnsname ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=&standby_db_unique_name;
    
  • 檢查switchover_status

    select switchover_status from v$database;
    
    

    switchover_status 的值為 UNRESOLVABLE GAP(RAC 或者非 RAC),通過以下方法解決:

    • 檢查是否有些線程已關閉但是仍存在

      col instance for a10
      set lines 32767
      select thread#,instance,status from v$thread;
      

      結果示例如下:

         THREAD# INSTANCE   STATUS
      ---------- ---------- ------
               1 gsboss     OPEN
               2 gsboss2    OPEN
      

      將存在的線程disable:

      ALTER DATABASE DISABLE THREAD &thread#;
      
    • 檢查 log_archive_destination 是否是否可用

      select status,DEST_ID,TYPE,ERROR,GAP_STATUS,SYNCHRONIZED,SYNCHRONIZATION_STATUS,RECOVERY_MODE from V$ARCHIVE_DEST_STATUS where STatus <> 'INACTIVE';
      

      如果存在路徑不可用的情況,修改為可用路徑。或者解決路徑權限等問題。

4 切換角色

在主庫和備庫同時開啟 trace,用於發生問題時候的診斷。

alter system set log_archive_trace=8191 sid=’*’;

4.1 切換備庫角色為主庫

主庫 - Boston, 備庫為chicago.

alter database switchover to chicago;

以下是主庫(BOSTON)和備庫(CHICAGO)的 alert 輸出:

  • 主庫日志:

    Fri Aug 23 11:05:23 2013
    
    ALTER SYSTEM SET log_archive_trace=8191 SCOPE=BOTH;
    
     alter database switchover to chicago
    
    Fri Aug 23 11:05:43 2013
    
    Starting switchover [Process ID: 3340]
    
    Fri Aug 23 11:05:43 2013
    
    ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY [Process Id: 3340] (boston)
    
    .
    
    Fri Aug 23 11:05:44 2013
    
    Active, synchronized Physical Standby switchover target has been identified
    
    Preventing updates and queries at the Primary
    
    Generating and shipping final logs to target standby
    
    Switchover End-Of-Redo Log thread 1 sequence 11 has been fixed   <--------- 序列號 11 是日志的終止序號
    
    Switchover: Primary highest seen SCN set to 0x0.0x229306
    
    ARCH: Noswitch archival of thread 1, sequence 11
    
    .
    
    Switchover: Primary controlfile converted to standby controlfile succesfully.
    
    Switchover: Complete - Database shutdown required
    
    Sending request (convert to primary database) to switchover target CHICAGO
    
    OCISessionBegin with PasswordVerifier succeeded
    
    Switchover complete. Database shutdown required
    
    USER (ospid: 3340): terminating the instance
    
    Fri Aug 23 11:05:51 2013
    
    Instance terminated by USER, pid = 3340
    
    Completed:  alter database switchover to chicago
    
    
  • 備庫日志:

    Fri Aug 23 11:05:47 2013
    
    SWITCHOVER: received request 'ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY' from primary database.
    
    Fri Aug 23 11:05:47 2013
    
    ALTER DATABASE SWITCHOVER TO PRIMARY (chicago)
    
    Maximum wait for role transition is 15 minutes.
    
    .
    
    Standby became primary SCN: 2265860
    
    Switchover: Complete - Database mounted as primary
    
    SWITCHOVER: completed request from primary database.
    
    
    注意
    備庫一端只最多只等待15分鍾,實現備庫與主庫的同步。

4.2 打開新的主庫

alter database open;

4.3 重啟新的備庫

shutdown abort
startup
-- 開啟數據同步
alter database recover managed standby database disconnect;

5 切換后的后續步驟

  • 關閉 trace
alter system set log_archive_trace=0;
  • 確認DG同步
    • 在主庫側執行

      alter system switch logfile;
      select dest_id,error,status from v$archive_dest where dest_id=<your remote log_archive_dest_<n>>;
      select max(sequence#),thread# from v$log_history group by thread#;
      
    • 在備庫側

      select thread#,sequence#,process,status from gv$managed_standby;
      select max(sequence#),thread# from v$archived_log group by thread#;
      
  • 在 12.2 中使用 v$dataguard_process 替代 v$managed_standby
select name,role,instance,thread#,sequence#,action from gv$dataguard_process;

Author: halberd.lee

Created: 2019-06-19 Wed 14:19

Validate


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM