最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle中將非分區(qū)表轉(zhuǎn)換為分區(qū)表的最佳實(shí)踐

 更新時(shí)間:2026年04月13日 08:48:07   作者:老蘇暢談運(yùn)維  
本文介紹了使用在線表重定義技術(shù)將普通表轉(zhuǎn)換為分區(qū)表的方法,通過創(chuàng)建臨時(shí)表、同步數(shù)據(jù)和原子交換步驟,在線重定義允許在不中斷業(yè)務(wù)的情況下修改表結(jié)構(gòu),特別適合需要高可用性的生產(chǎn)環(huán)境,需要的朋友可以參考下

雖然從 Oracle 12.2 開始,技術(shù)上已經(jīng)可以直接通過以下方式轉(zhuǎn)換非分區(qū)表為分區(qū)表:ALTER TABLE … MODIFY但一些較為復(fù)雜分區(qū)場(chǎng)景,還是建議采用在線重定義操作來更改為分區(qū)表。

什么是表重定義(Table Redefinition)?

在線表重定義(Online Table Redefinition) 允許在表正在被使用的情況下對(duì)其進(jìn)行結(jié)構(gòu)變更,且零停機(jī)時(shí)間。

它是如何工作的?

Oracle 通過創(chuàng)建臨時(shí)表和同步機(jī)制來實(shí)現(xiàn)在線重定義:

  1. 你創(chuàng)建一個(gè)具有目標(biāo)結(jié)構(gòu)的臨時(shí)表(interim table)
  2. Oracle 將數(shù)據(jù)從原表復(fù)制到臨時(shí)表
  3. 在此期間產(chǎn)生的任何變更都會(huì)被同步
  4. 最后,Oracle 以原子方式將原表與臨時(shí)表進(jìn)行交換

測(cè)試案例

1. 創(chuàng)建 Sequence(用于生成 ORDER_ID)

CREATE SEQUENCE SZR.CUSTOMER_ORDERS_SEQ
  START WITH 1
  INCREMENT BY 1
  NOCACHE
  NOCYCLE;

2. 創(chuàng)建測(cè)試用的非分區(qū)表 CUSTOMER_ORDERS(11g 兼容)

CREATE TABLE SZR.CUSTOMER_ORDERS (
    ORDER_ID        NUMBER        PRIMARY KEY, 
    ORDER_DATE      DATE          NOT NULL,
    CUSTOMER_ID     NUMBER        NOT NULL,
    CUSTOMER_NAME   VARCHAR2(120),
    PRODUCT_CODE    VARCHAR2(50),
    QUANTITY        NUMBER(8),
    UNIT_PRICE      NUMBER(12,2),
    TOTAL_AMOUNT    NUMBER(14,2)  GENERATED ALWAYS AS (QUANTITY * UNIT_PRICE) VIRTUAL,
    ORDER_STATUS    VARCHAR2(20)  DEFAULT 'PENDING',
    CREATED_BY      VARCHAR2(60)
) TABLESPACE USERS;

-- 創(chuàng)建 Trigger 實(shí)現(xiàn)自增主鍵
CREATE OR REPLACE TRIGGER SZR.CUSTOMER_ORDERS_TRG
BEFORE INSERT ON SZR.CUSTOMER_ORDERS
FOR EACH ROW
BEGIN
    IF :NEW.ORDER_ID IS NULL THEN
        SELECT SZR.CUSTOMER_ORDERS_SEQ.NEXTVAL
          INTO :NEW.ORDER_ID
          FROM DUAL;
    END IF;
END;
/

3. 插入一些測(cè)試數(shù)據(jù)(覆蓋不同年份)

INSERT INTO SZR.CUSTOMER_ORDERS (ORDER_DATE, CUSTOMER_ID, CUSTOMER_NAME, PRODUCT_CODE, QUANTITY, UNIT_PRICE, ORDER_STATUS, CREATED_BY)
SELECT 
    ADD_MONTHS(TO_DATE('2020-03-10','YYYY-MM-DD'), LEVEL*1) AS ORDER_DATE,
    5000 + MOD(LEVEL, 300) AS CUSTOMER_ID,
    'Customer_' || TO_CHAR(5000 + MOD(LEVEL, 300)) AS CUSTOMER_NAME,
    'PROD_' || LPAD(MOD(LEVEL, 99)+1, 3, '0') AS PRODUCT_CODE,
    MOD(LEVEL, 50) + 1 AS QUANTITY,
    ROUND(DBMS_RANDOM.VALUE(10, 500), 2) AS UNIT_PRICE,
    CASE MOD(LEVEL, 5) 
        WHEN 0 THEN 'COMPLETED' 
        WHEN 1 THEN 'SHIPPED' 
        WHEN 2 THEN 'PENDING' 
        ELSE 'CANCELLED' 
    END AS ORDER_STATUS,
    'User_' || MOD(LEVEL, 10) AS CREATED_BY
FROM DUAL
CONNECT BY LEVEL <= 1200;

COMMIT;

-- 查看原表記錄數(shù)和數(shù)據(jù)分布
SELECT COUNT(*) AS total_rows FROM SZR.CUSTOMER_ORDERS;

SELECT MIN(ORDER_DATE), MAX(ORDER_DATE) FROM SZR.CUSTOMER_ORDERS;

SELECT TRUNC(ORDER_DATE,'MM'), COUNT(*) FROM SZR.CUSTOMER_ORDERS GROUP BY TRUNC(ORDER_DATE,'MM') ORDER BY 1;

4. 檢查表是否支持重定義(使用 CONS_USE_PK)

set serveroutput on;
BEGIN
  DBMS_REDEFINITION.CAN_REDEF_TABLE(
    uname        => 'SZR',
    tname        => 'CUSTOMER_ORDERS',
    options_flag => DBMS_REDEFINITION.CONS_USE_PK
  );
  DBMS_OUTPUT.PUT_LINE('表支持重定義(CONS_USE_PK):成功');
END;
/

5. 創(chuàng)建具有目標(biāo)分區(qū)結(jié)構(gòu)的臨時(shí)表(Interim Table)

CREATE TABLE SZR.CUSTOMER_ORDERS_INT
TABLESPACE USERS
PARTITION BY RANGE (ORDER_DATE)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))    
(
  PARTITION P_BEFORE_2022 VALUES LESS THAN (TO_DATE('2022-01-01','YYYY-MM-DD'))
)
AS 
SELECT * FROM SZR.CUSTOMER_ORDERS 
WHERE 1=0;

-- 查看臨時(shí)表當(dāng)前分區(qū)
SELECT PARTITION_NAME, HIGH_VALUE 
FROM USER_TAB_PARTITIONS 
WHERE TABLE_NAME = 'CUSTOMER_ORDERS_INT';

6. 啟動(dòng)重定義過程(使用 CONS_USE_PK)

set serveroutput on;
BEGIN
  DBMS_REDEFINITION.START_REDEF_TABLE(
    uname        => 'SZR',
    orig_table   => 'CUSTOMER_ORDERS',
    int_table    => 'CUSTOMER_ORDERS_INT',
    options_flag => DBMS_REDEFINITION.CONS_USE_PK
  );
  DBMS_OUTPUT.PUT_LINE('START_REDEF_TABLE 執(zhí)行完成');
END;
/

大表場(chǎng)景:可在 START_REDEF_TABLE 前開啟并行(如 ALTER SESSION FORCE PARALLEL DML PARALLEL 4;)。

回退操作:如果執(zhí)行過程中發(fā)生錯(cuò)誤,可以使用以下語(yǔ)句回退

BEGIN
  DBMS_REDEFINITION.ABORT_REDEF_TABLE(
    uname      => 'SZR',
    orig_table => 'CUSTOMER_ORDERS',
    int_table  => 'CUSTOMER_ORDERS_INT'
  );
END;
/

7. 復(fù)制原表的依賴對(duì)象

set serveroutput on;
DECLARE
  l_num_errors  PLS_INTEGER;
BEGIN
  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
    uname            => 'SZR',
    orig_table       => 'CUSTOMER_ORDERS',
    int_table        => 'CUSTOMER_ORDERS_INT',
    copy_indexes     => 0,                    -- 不自動(dòng)復(fù)制索引(主鍵索引已存在)
    copy_triggers    => TRUE,
    copy_constraints => FALSE,                -- 關(guān)鍵:關(guān)閉約束復(fù)制,避免 NOT NULL 沖突
    copy_privileges  => TRUE,
    ignore_errors    => TRUE,
    num_errors       => l_num_errors,
    copy_statistics  => FALSE
  );
  DBMS_OUTPUT.PUT_LINE('COPY_TABLE_DEPENDENTS 執(zhí)行完成,錯(cuò)誤數(shù): ' || l_num_errors);
END;
/

8. 同步期間產(chǎn)生的新 DML 數(shù)據(jù)(推薦執(zhí)行)

BEGIN
  DBMS_REDEFINITION.SYNC_INTERIM_TABLE(
    uname      => 'SZR',
    orig_table => 'CUSTOMER_ORDERS',
    int_table  => 'CUSTOMER_ORDERS_INT'
  );
  DBMS_OUTPUT.PUT_LINE('SYNC_INTERIM_TABLE 執(zhí)行完成');
END;
/

9. 完成重定義

BEGIN
  DBMS_REDEFINITION.FINISH_REDEF_TABLE(
    uname      => 'SZR',
    orig_table => 'CUSTOMER_ORDERS',
    int_table  => 'CUSTOMER_ORDERS_INT'
  );
  DBMS_OUTPUT.PUT_LINE('FINISH_REDEF_TABLE 執(zhí)行完成,表已成功轉(zhuǎn)換為分區(qū)表');
END;
/

10. 驗(yàn)證結(jié)果

SELECT TABLE_NAME, PARTITIONING_TYPE, INTERVAL 
FROM USER_PART_TABLES 
WHERE TABLE_NAME = 'CUSTOMER_ORDERS';

SELECT PARTITION_NAME, HIGH_VALUE, NUM_ROWS 
FROM USER_TAB_PARTITIONS 
WHERE TABLE_NAME = 'CUSTOMER_ORDERS' 
ORDER BY PARTITION_POSITION;

SELECT COUNT(*) FROM SZR.CUSTOMER_ORDERS;

-- 刪除臨時(shí)表
DROP TABLE SZR.CUSTOMER_ORDERS_INT PURGE;

-- 收集統(tǒng)計(jì)信息
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS('SZR', 'CUSTOMER_ORDERS', cascade => TRUE);
END;
/

總結(jié)

通過以上步驟,我們成功使用在線表重定義技術(shù)將普通表 CUSTOMER_ORDERS 轉(zhuǎn)換為了按月間隔分區(qū)表。整個(gè)過程無需停機(jī),對(duì)業(yè)務(wù)影響最小,特別適合需要高可用7x24 運(yùn)行的生產(chǎn)環(huán)境。

在線重定義的優(yōu)勢(shì)在于:

  • ? 零停機(jī)時(shí)間
  • ? 完整的依賴對(duì)象遷移
  • ? 支持回滾操作
  • ? 數(shù)據(jù)一致性有保障

以上就是Oracle中將非分區(qū)表轉(zhuǎn)換為分區(qū)表的最佳實(shí)踐的詳細(xì)內(nèi)容,更多關(guān)于Oracle非分區(qū)表轉(zhuǎn)換為分區(qū)表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

三门峡市| 兴化市| 哈巴河县| 泽库县| 宜春市| 礼泉县| 辽中县| 桐乡市| 玛多县| 永顺县| 阜南县| 福州市| 梧州市| 阳曲县| 隆子县| 孝昌县| 山西省| 郑州市| 甘德县| 睢宁县| 镇巴县| 苍溪县| 安丘市| 邓州市| 綦江县| 涿鹿县| 湖州市| 南漳县| 梁河县| 平潭县| 厦门市| 达州市| 冕宁县| 皋兰县| 襄垣县| 南昌市| 水城县| 鄂州市| 安乡县| 蚌埠市| 祁阳县|