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

Oracle Sequence 進階應用:快取優化、RAC 有序生成、備份恢復後序號校準

     編輯:Oracle 資料庫基礎

前言

Sequence 是 Oracle 高併發唯一值生成的核心。基礎用法請參考姊妹篇;本文聚焦**進階場景**:大快取調優、RAC 環境 ORDER/NOORDER 抉擇、Data Guard 同步、備份恢復後序號倒退修正、審計追蹤與命名規範。

一、大快取策略:極致吞吐與跳號可控

原理回顧

CACHE n 讓實例在 SGA 保留 n 個序號,用完再向數據字典申請下一批 (SEQ$ 表更新)。

調優公式

建議 CACHE 值 ≈ (峰值 TPS × 容忍跳號秒數) / 實例數
-- 例:峰值 5000 TPS,單實例,容忍 1 秒跳號 → CACHE 5000
-- RAC 4 節點,同條件 → 每節點 CACHE 1250

監控指標

-- 查看序號申請頻率 (每次申請觸發 SEQ$ 更新)
SELECT sequence_name, cache_size, last_number
FROM dba_sequences
WHERE sequence_owner = 'APP_OWNER';

-- 觀察 "sequence cache" 等待事件
SELECT * FROM v$system_event WHERE event LIKE '%sequence%';

二、RAC 環境:ORDER vs NOORDER

模式全局順序效能適用場景
ORDER嚴格遞增 (跨實例協調)高延遲 (GCS 鎖同步)發票號、審計流水號、法規要求連續
NOORDER (預設)實例內遞增,實例間交錯極低延遲、線性擴展主鍵、內部 ID、無業務連續要求

實測建議

  • **主鍵類 Sequence 全部 NOORDER CACHE 1000**
  • **業務單據號單獨建 ORDER CACHE 20**,接受較低並發
  • 若業務可接受「大致遞增」,可在應用層按時間分片 (如 YYYYMMDD + 序號) 規避 RAC 協調

三、Data Guard 環境:序號同步與備庫只讀

問題

Primary 產生的 Sequence 值透過 Redo Apply 同步到 Standby,但 Standby 唯讀開放時 NEXTVAL 會報 ORA-16000。

解決方案

  1. 應用層路由:寫入操作導向 Primary,唯讀報表導向 Standby (不呼叫 NEXTVAL)
  2. 全域暫存表 + 觸發器:Standby 建立同名 GTT,報表寫 GTT,Primary 定期合併 (複雜,不推薦)
  3. 12c+ Active Data Guard 可延遲應用:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DELAY 60; 緩衝主庫故障,但不解決 NEXTVAL 問題

最佳實踐:架構上**嚴禁 Standby 執行 NEXTVAL**,所有取號在 Primary 完成。

四、備份恢復後序號倒退:自動校準腳本

風險場景

冷備份/邏輯導入恢復後,LAST_NUMBER 回到備份時刻,新 NEXTVAL 產生重複值 → 唯一索引報錯。

校準原則

將 Sequence 推進至 MAX(主鍵值) + 安全間隙。

自動化 PL/SQL

CREATE OR REPLACE PROCEDURE sync_sequences_post_restore AS
  v_sql VARCHAR2(1000);
BEGIN
  FOR rec IN (
    SELECT s.sequence_owner, s.sequence_name,
           t.table_name, c.column_name
    FROM dba_sequences s
    JOIN dba_dependencies d ON d.referenced_name = s.sequence_name AND d.referenced_type = 'SEQUENCE'
    JOIN dba_tab_columns c ON c.table_name = d.name AND c.data_type = 'NUMBER'
    JOIN dba_tables t ON t.table_name = c.table_name
    WHERE s.sequence_owner = 'APP_OWNER'
      AND c.column_name LIKE '%ID%'  -- 簡單啟發式,建議維護映射表
  ) LOOP
    -- 取得表中最大值
    EXECUTE IMMEDIATE 'SELECT NVL(MAX('||rec.column_name||'),0) FROM '||rec.table_name
      INTO v_max_id;
    -- 計算目標值
    v_target := v_max_id + 10000;
    -- ALTER SEQUENCE ... INCREMENT BY 大值 → NEXTVAL → 改回
    v_sql := 'ALTER SEQUENCE '||rec.sequence_owner||'.'||rec.sequence_name||
             ' INCREMENT BY '||v_target;
    EXECUTE IMMEDIATE v_sql;
    EXECUTE IMMEDIATE 'SELECT '||rec.sequence_owner||'.'||rec.sequence_name||'.NEXTVAL FROM DUAL';
    v_sql := 'ALTER SEQUENCE '||rec.sequence_owner||'.'||rec.sequence_name||
             ' INCREMENT BY 1';
    EXECUTE IMMEDIATE v_sql;
    DBMS_OUTPUT.PUT_LINE('Synced '||rec.sequence_name||' to >'||v_target);
  END LOOP;
END;
/

注意:需在維護窗口、單用戶模式執行,避免並發衝突。

五、審計與命名規範

命名規範

SEQ_<表名>_<用途>   -- 例: SEQ_ORDERS_PK, SEQ_INVOICE_NO

審計 DDL

AUDIT CREATE SEQUENCE, ALTER SEQUENCE, DROP SEQUENCE BY ACCESS;
-- 定期查詢
SELECT timestamp, os_username, obj_name, action_name
FROM dba_audit_trail
WHERE action_name IN ('CREATE SEQUENCE','ALTER SEQUENCE','DROP SEQUENCE')
ORDER BY timestamp DESC;

六、總結

Sequence 進階掌控三要素:**大快取高併發、RAC 分類用 ORDER、恢復後自動校準**。建立「Sequence 映射表」(表名、欄位、Sequence 名、快取值、ORDER 標記),納入 CMDB,讓每次架構變更、演練恢復都有章可循。

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