随着数据库数据量的不断增长,有些表需要由普通的堆表转换为分区表的模式。有几种不同的方法来对此进行操作,诸如导出表数据,然后创建分区表再导入数据到分区表;使用EXCHANGE PARTITION方式来转换为分区表以及使用DBMS_REDEFINITION来在线重定义分区表。本文描述的是使用EXCHANGE PARTITION方式来实现,下面是具体的操作示例。有关具体的dbms_redefinition在线重定义表的原理及步骤可参考:基于 dbms_redefinition 在线重定义表 http://www.linuxidc.com/Linux/2014-06/103628.htm
有关使用DBMS_REDEFINITION在线重定义分区表可参考:使用DBMS_REDEFINITION在线切换普通表到分区表 http://www.linuxidc.com/Linux/2014-06/103629.htm
有关分区表的描述请参考:Oracle 分区表 http://www.linuxidc.com/Linux/2014-06/103630.htm--------------------------------------------------------------------------------Linux-6-64下安装Oracle 12C笔记 http://www.linuxidc.com/Linux/2013-07/86805.htm在CentOS 6.4下安装Oracle 11gR2(x64) http://www.linuxidc.com/Linux/2014-02/97374.htmOracle 11gR2 在VMWare虚拟机中安装步骤 http://www.linuxidc.com/Linux/2013-09/89579p2.htmDebian 下 安装 Oracle 11g XE R2 http://www.linuxidc.com/Linux/2014-03/98881.htm--------------------------------------------------------------------------------1、主要步骤
a、为新的分区表准备相应的表空间
b、基于源表元数据创建分区表以及相关索引、约束等
c、使用exchange方式将普通表切换为分区表
d、更正相关索引及约束名等(可省略)
e、使用split根据需要将分区表分割为多个不同的分区
f、收集统计信息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);
更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-06/103631p2.htm
Oracle 分区表MySQL用户权限导致的创建Trigger失败相关资讯 Exchange
- Android 版 Gmail 终于支持 (04月27日)
- Postfix实现Exchange 邮件传输的的 (02/22/2014 08:07:18)
- OpenChange将Exchange带入Linux (02/01/2009 19:29:34)
| - 从Linux telnet到Exchange邮件服务 (10/11/2014 09:24:14)
- HAproxy + Keepalive实现Exchange (02/13/2014 12:44:51)
- [注意]五月份的严重漏洞之一 (05/10/2007 08:34:46)
|
本文评论 查看全部评论 (0)