首页 > 代码库 > 使用导出导入(datapump)方式将普通表切换为分区表
使用导出导入(datapump)方式将普通表切换为分区表
随着数据库数据量的不断增长,有些表须要由普通的堆表转换为分区表的模式。
有几种不同的方法来对此进行操作,诸如导出表数据,然后创建分区表再导入数据到分区表;使用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 ROW BEGIN :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_only SQL> 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_table EXEC 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 3333 BIG_TABLE2 BIG_TABLE_2013 TO_DATE(‘ 2014-01-01 3334 BIG_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 ROW BEGIN :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 负载均衡測试(结合server端与client)
Oracle RAC server端连接负载均衡(Load Balance)
Oracle RAC client连接负载均衡(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 监听器password(LISTENER)
配置ORACLE client连接到数据库
有关基于用户管理的备份和备份恢复的概念请參考
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 password文件
Oracle 參数文件
Oracle 联机重做日志文件(ONLINE LOG FILE)
Oracle 控制文件(CONTROLFILE)
Oracle 归档日志
Oracle 回滚(ROLLBACK)和撤销(UNDO)
Oracle 数据库实例启动关闭过程
Oracle 10g SGA 的自己主动化管理
Oracle 实例和Oracle数据库(Oracle体系结构)
使用导出导入(datapump)方式将普通表切换为分区表