使用匯出匯入(datapump)方式將普通表切換為分區表

來源:互聯網
上載者:User

標籤:database   oracle   資料庫   dba   遷移   

      隨著資料庫資料量的不斷增長,有些表需要由普通的堆錶轉換為分區表的模式。有幾種不同的方法來對此進行操作,諸如匯出表資料,然後建立分區表再匯入資料到分區表;使用EXCHANGE PARTITION方式來轉換為分區表以及使用DBMS_REDEFINITION來線上重定義分區表。本文描述的是使用匯出匯入方式來實現,下面是具體的操作樣本。

      有關具體的dbms_redefinition線上重定義表的原理及步驟可參考:基於 dbms_redefinition 線上重定義表
      有關使用DBMS_REDEFINITION線上重定義分區表可參考:使用DBMS_REDEFINITION線上切換普通表到分區表
      有關使用使用exchange方式可參考:使用exchange方式切換普通表到分區表
      有關分區表的描述請參考:Oracle 分區表
      有關分區表資料匯入匯出可參考:匯入匯出 Oracle 分區表資料

 

1、主要步驟
    a、為新的分區表準備相應的資料表空間
    b、基於源表中繼資料建立分區表
    c、使用datapump方式匯出原表資料然後再匯入到分區表
    d、收集統計資訊,驗證結果,為分區表添加索引約束等

 

2、準備環境

--建立使用者SQL> create user leshami identified by xxx;SQL> grant dba to leshami;--建立示範需要用到的資料表空間SQL> create tablespace tbs_tmp datafile ‘/u02/database/SYBO2/oradata/tbs_tmp.dbf‘ size 10m autoextend on;SQL> alter user leshami default tablespace tbs_tmp;SQL> create tablespace tbs1 datafile ‘/u02/database/SYBO2/oradata/tbs1.dbf‘ size 10m autoextend on;SQL> create tablespace tbs2 datafile ‘/u02/database/SYBO2/oradata/tbs2.dbf‘ size 10m autoextend on;SQL> create tablespace tbs3 datafile ‘/u02/database/SYBO2/oradata/tbs3.dbf‘ size 10m autoextend on;SQL> conn leshami/xxx-- 建立一個lookup表CREATE TABLE lookup (  id            NUMBER(10),  description   VARCHAR2(50));--添加主鍵約束ALTER TABLE lookup ADD (  CONSTRAINT lookup_pk PRIMARY KEY (id));--插入資料INSERT INTO lookup (id, description) VALUES (1, ‘ONE‘);INSERT INTO lookup (id, description) VALUES (2, ‘TWO‘);INSERT INTO lookup (id, description) VALUES (3, ‘THREE‘);COMMIT;--建立一個用於切換到分區的大表CREATE TABLE big_table (  id            NUMBER(10),  created_date  DATE,  lookup_id     NUMBER(10),  data          VARCHAR2(50));--填充資料到大表DECLARE  l_lookup_id    lookup.id%TYPE;  l_create_date  DATE;BEGIN  FOR i IN 1 .. 10000 LOOP    IF MOD(i, 3) = 0 THEN      l_create_date := ADD_MONTHS(SYSDATE, -24);      l_lookup_id   := 2;    ELSIF MOD(i, 2) = 0 THEN      l_create_date := ADD_MONTHS(SYSDATE, -12);      l_lookup_id   := 1;    ELSE      l_create_date := SYSDATE;      l_lookup_id   := 3;    END IF;        INSERT INTO big_table (id, created_date, lookup_id, data)    VALUES (i, l_create_date, l_lookup_id, ‘This is some data for ‘ || i);  END LOOP;  COMMIT;END;/--為大表添加主、外鍵約束,索引,以及添加觸發器等.ALTER TABLE big_table ADD (  CONSTRAINT big_table_pk PRIMARY KEY (id));CREATE INDEX bita_created_date_i ON big_table(created_date);CREATE INDEX bita_look_fk_i ON big_table(lookup_id);ALTER TABLE big_table ADD (  CONSTRAINT bita_look_fk  FOREIGN KEY (lookup_id)  REFERENCES lookup(id));CREATE OR REPLACE TRIGGER tr_bf_big_table   BEFORE UPDATE OF created_date   ON big_table   FOR EACH ROWBEGIN   :new.created_date := TO_CHAR (SYSDATE, ‘yyyymmdd hh24:mi:ss‘);END tr_bf_big_table;/--收集統計資訊EXEC DBMS_STATS.gather_table_stats(‘LESHAMI‘, ‘LOOKUP‘, cascade => TRUE);EXEC DBMS_STATS.gather_table_stats(‘LESHAMI‘, ‘BIG_TABLE‘, cascade => TRUE);

3、建立分區表

CREATE TABLE big_table2 (  id            NUMBER(10),  created_date  DATE,  lookup_id     NUMBER(10),  data          VARCHAR2(50))PARTITION BY RANGE (created_date)(PARTITION big_table_2012 VALUES LESS THAN (TO_DATE(‘01/01/2013‘, ‘DD/MM/YYYY‘)) tablespace tbs1, PARTITION big_table_2013 VALUES LESS THAN (TO_DATE(‘01/01/2014‘, ‘DD/MM/YYYY‘)) tablespace tbs2, PARTITION big_table_2014 VALUES LESS THAN (MAXVALUE)) tablespace tbs3;--可以直接使用Insert方式來填充資料到分區表,如下INSERT INTO big_table2   SELECT * FROM big_table;

4、通過datapump方式匯出匯入資料到分區表

--該方式主要用於從不同的資料庫遷移資料,比如源庫源表為普通表,而目標庫為分區表 $ expdp leshami/xxx directory=db_dump_dir dumpfile=big_table.dmp logfile=exp_big_tb.log tables=big_table content=data_onlySQL> rename big_table to big_table_old;Table renamed.SQL> rename big_table2 to big_table;Table renamed.$ impdp leshami/xxx directory=db_dump_dir dumpfile=big_table.dmp logfile=imp__big_tb.log tables=big_tableEXEC DBMS_STATS.gather_table_stats(‘LESHAMI‘, ‘BIG_TABLE‘, cascade => TRUE);--下面是匯入資料之後的結果SQL> select table_name, partition_name,high_value,num_rows  2  from user_tab_partitions where table_name=‘BIG_TABLE‘;TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE              NUM_ROWS------------------------------ ------------------------------ --------------------- ----------BIG_TABLE2                     BIG_TABLE_2012                 TO_DATE(‘ 2013-01-01        3333BIG_TABLE2                     BIG_TABLE_2013                 TO_DATE(‘ 2014-01-01        3334BIG_TABLE2                     BIG_TABLE_2014                 MAXVALUE                    3333--如果資料無異常可以刪除源表以便為分區表添加相應索引及約束,如果未刪除源表,需要使用單獨的索引,約束名等SQL> drop table big_table;Table dropped.ALTER TABLE big_table ADD (  CONSTRAINT big_table_pk PRIMARY KEY (id));CREATE INDEX bita_created_date_i ON big_table(created_date) LOCAL;CREATE INDEX bita_look_fk_i ON big_table(lookup_id) LOCAL;ALTER TABLE big_table ADD (  CONSTRAINT bita_look_fk  FOREIGN KEY (lookup_id)  REFERENCES lookup(id));--觸發器也需要單獨添加到分區表CREATE OR REPLACE TRIGGER tr_bf_big_table   BEFORE UPDATE OF created_date   ON big_table   FOR EACH ROWBEGIN   :new.created_date := TO_CHAR (SYSDATE, ‘yyyymmdd hh24:mi:ss‘);END tr_bf_big_table2;/

5、後記
      之所以用到了匯出匯入的方式,是因為源表與目標資料分割表位於不同的資料庫,需要將源表資料移轉到新的分區表。當然使用帶dblink的insert方式也可以完成上述功能。注意,在匯入時,如果目標資料庫的新分區表與原資料庫源表表名一致,可以跳過本文描述的rename表名以及刪除源表名的過程。其次,該種切換到分區表的方式簡單易用,但難以保證資料一致性,通常使用在可閒置表對象上進行操作。

    

更多參考

有關Oracle RAC請參考
     使用crs_setperm修改RAC資源的所有者及許可權
     使用crs_profile管理RAC資源設定檔
     RAC 資料庫的啟動與關閉
     再說 Oracle RAC services
     Services in Oracle Database 10g
     Migrate datbase from single instance to Oracle RAC
     Oracle RAC 串連到指定執行個體
     Oracle RAC 負載平衡測試(結合伺服器端與用戶端)
     Oracle RAC 伺服器端串連負載平衡(Load Balance)
     Oracle RAC 用戶端串連負載平衡(Load Balance)
     ORACLE RAC 下非預設連接埠監聽配置(listener.ora tnsnames.ora) 
     ORACLE RAC 監聽配置 (listener.ora tnsnames.ora) 
     配置 RAC 負載平衡與容錯移轉
     CRS-1006 , CRS-0215 故障一例 
     基於Linux (RHEL 5.5) 安裝Oracle 10g RAC 
     使用 runcluvfy 校正Oracle RAC安裝環境

有關Oracle 網路設定相關基礎以及概念性的問題請參考:
     配置非預設連接埠的動態服務註冊 
     配置sqlnet.ora限制IP訪問Oracle 
     Oracle 監聽器日誌配置與管理 
     設定 Oracle 監聽器密碼(LISTENER)
     配置ORACLE 用戶端串連到資料庫

有關基於使用者管理的備份和備份恢複的概念請參考
     Oracle 冷備份
     Oracle 熱備份
     Oracle 備份恢複概念
     Oracle 執行個體恢複
     Oracle 基於使用者管理恢複的處理
     SYSTEM 資料表空間管理及備份恢複
     SYSAUX資料表空間管理及恢複
     Oracle 基於備份控制檔案的恢複(unsing backup controlfile)

有關RMAN的備份恢複與管理請參考
     RMAN 概述及其體繫結構
     RMAN 配置、監控與管理
     RMAN 備份詳解
     RMAN 還原與恢複
     RMAN catalog 的建立和使用
     基於catalog 建立RMAN儲存指令碼
     基於catalog 的RMAN 備份與恢複
     RMAN 備份路徑困惑
     使用RMAN實現異機備份恢複(WIN平台)
     使用RMAN遷移檔案系統資料庫到ASM
     linux 下RMAN備份shell指令碼
     使用RMAN遷移資料庫到異機

有關ORACLE體繫結構請參考
     Oracle 資料表空間與資料檔案
     Oracle 密碼檔案
     Oracle 參數檔案
     Oracle 聯機重做記錄檔(ONLINE LOG FILE)
     Oracle 控制檔案(CONTROLFILE)
     Oracle 歸檔日誌
     Oracle 復原(ROLLBACK)和撤銷(UNDO)
     Oracle 資料庫執行個體啟動關閉過程
     Oracle 10g SGA 的自動化管理
     Oracle 執行個體和Oracle資料庫(Oracle體繫結構) 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.