首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle Data Guard 邏輯備庫建立完整實戰:從物理備庫轉換

     編輯:Oracle 資料庫基礎

架構拓撲與環境資訊

角色IPSIDDB_UNIQUE_NAME安裝路徑本地歸檔路徑
Primary192.168.1.11testtest/oracle/oracle/product/11.2.0/dbhome_1/oracle/oradata/test/archive
Physical Standby192.168.1.12dgtestdgtest/oracle/oracle/product/11.2.0/dbhome_1/oracle/oradata/dgtest/dgtest/archive
Logical Standby (目標)192.168.1.15logicdglogicdg/oracle/oracle/product/11.2.0/dbhome_1/oracle/oradata/logicdg/local-archive

策略:利用既有 Physical Standby (1.12) 轉換為 Logical Standby (1.15),再新增至 Data Guard 叢集。

第一階段:Primary 參數調整 (新增邏輯備庫配置)


*.log_archive_config = 'dg_config=(test,dgtest,logicdg)'
*.log_archive_dest_2 = 'service=test12 async valid_for=(online_logfiles,primary_role) db_unique_name=dgtest'
*.log_archive_dest_3 = 'service=test15 async valid_for=(online_logfiles,primary_role) db_unique_name=logicdg'
*.log_archive_dest_state_2 = defer
*.log_archive_dest_state_3 = defer
*.fal_server = test11
*.fal_client = test12
*.standby_file_management = auto
*.db_file_name_convert = '/oracle/oradata/test','/oracle/oradata/dgtest/dgtest','/oracle/oradata/test','/oracle/oradata/logicdg'
*.log_file_name_convert = '/oracle/oradata/test','/oracle/oradata/dgtest/dgtest','/oracle/oradata/test','/oracle/oradata/logicdg'

關鍵點

  • `log_archive_config` 宣告所有成員 `DB_UNIQUE_NAME`
  • `log_archive_dest_3` 指向新邏輯備庫服務名 `test15`
  • 初始狀態設 `DEFER`,轉換完成後再 `ENABLE`
  • `db_file_name_convert`/`log_file_name_convert` 同時支援物理與邏輯備庫路徑映射

第二階段:驗證既有 Physical Standby 同步狀態


-- Physical Standby (1.12)
SELECT sequence#, applied FROM v$archived_log;
-- 應顯示所有序號 APPLIED=YES

-- 待轉換節點 (1.15,目前為 Physical)
SELECT sequence#, applied FROM v$archived_log;
-- 確認無落後缺口

第三階段:停止待轉換節點 Redo Apply


-- 在 1.15 (logicdg) 執行
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

第四階段:Primary 建立 LogMiner 字典 (邏輯備庫前置)


-- 在 Primary (1.11) 執行
EXECUTE DBMS_LOGSTDBY.BUILD;
-- 產生字典資訊寫入 Redo,供邏輯備庫解析 DDL

第五階段:Physical Standby 轉換為 Logical Standby


-- 在 1.15 (logicdg) 執行
ALTER DATABASE RECOVER TO LOGICAL STANDBY logicdg;
-- 轉換過程:掛載 → 開啟 → 建立邏輯備庫字典 → 完成

-- 關閉並以 MOUNT 啟動
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;

第六階段:調整 Logical Standby 參數


-- 本地歸檔目的地 (所有角色)
ALTER SYSTEM SET log_archive_dest_1 = 
  'location=/oracle/oradata/logicdg/local-archive valid_for=(online_logfiles,all_roles) db_unique_name=logicdg';

-- 從 Primary 接收 Redo 的備用日誌目的地 (Standby 角色)
ALTER SYSTEM SET log_archive_dest_5 = 
  'location=/oracle/oradata/logicdg/archive valid_for=(standby_logfiles,standby_role) db_unique_name=logicdg';

第七階段:RESETLOGS 開啟邏輯備庫


ALTER DATABASE OPEN RESETLOGS;
-- 關鍵:RESETLOGS 產生新 Incarnation,確立邏輯備庫獨立身分

第八階段:建立 Standby Redo Logs (SRL) 並啟動 SQL Apply


-- 建立 3 組 SRL (建議數量 = 線上日誌組數 + 1)
ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 
  '/oracle/oradata/logicdg/standbyredo11.log' SIZE 100M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 12 
  '/oracle/oradata/logicdg/standbyredo12.log' SIZE 100M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 13 
  '/oracle/oradata/logicdg/standbyredo13.log' SIZE 100M;

-- 啟動即時 SQL Apply (邏輯備庫核心進程)
ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

第九階段:Primary 啟用對邏輯備庫傳輸


-- 在 Primary (1.11) 執行
ALTER SYSTEM SET log_archive_dest_state_3 = ENABLE;
-- 驗證傳輸狀態
SELECT dest_id, status, error FROM v$archive_dest WHERE dest_id = 3;

驗證邏輯備庫正常運作


-- 1. SQL Apply 進程狀態
SELECT * FROM v$logstdby_process;

-- 2. 同步進度
SELECT * FROM v$logstdby_progress;

-- 3. 套用延遲
SELECT * FROM v$logstdby_stats WHERE name = 'apply lag';

-- 4. 測試 DDL 複寫
-- Primary 建立測試表
CREATE TABLE test_sync (id NUMBER, txt VARCHAR2(100));
-- Logical Standby 查詢
SELECT * FROM test_sync;  -- 應可見資料

-- 5. 監視不支援物件
SELECT * FROM dba_logstdby_unsupported_table;
SELECT * FROM dba_logstdby_unsupported;

物理 vs 邏輯備庫關鍵差異對照

維度Physical StandbyLogical Standby
Redo 套用方式Redo Apply (區塊級)SQL Apply (SQL 級解析重放)
資料庫開啟模式Mount / Read Only (Active DG)Read Write (可本地寫入)
支援物件類型所有有限制 (參考 DBA_LOGSTDBY_UNSUPPORTED)
主要用途災難恢復、報表查詢 (Active DG)報表、ETL、異構遷移、滾動升級
轉換路徑基礎Physical → Logical (單向)

關鍵注意事項

  1. 字典建立時機:`DBMS_LOGSTDBY.BUILD` 必須在 Primary 執行,且轉換前確保所有 Standby 已套用該 Redo
  2. 不支援物件檢查:轉換前必須查詢 `DBA_LOGSTDBY_UNSUPPORTED`,評估業務影響
  3. SRL 尺寸:建議 ≥ 線上日誌大小,組數 = 線上日誌組數 + 1
  4. RESETLOGS 不可逆:開啟後 Incarnation 改變,原 Physical Standby 身分消失
  5. 主鍵/唯一索引:邏輯備庫要求表有主鍵或唯一索引以識別行,否則 SQL Apply 會失敗

此實戰記錄基於 Oracle 11.2.0.1 環境,展示從既有 Physical Standby 就地轉換為 Logical Standby 的標準化流程,適合 Data Guard 架構擴充參考。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved