`

如何将Oracle数据库的普通表转换成分区表

 
阅读更多

导读: 在一个高可用系统中,如果需要改变一个表的定义是一件比较棘手的问题,尤其是对于7×24系统。Oracle数据库 提供的基本语法基本可以满足一般性修改,但是对于把普通堆表改为分区表,把索引组织表修改为堆表等操作就无法完成了,Oracle的普通表没有办法通过修改属性的方式直接转化为分区表,必须通过重建的方式进行转变,下面介绍三种效率比较高的方法,并说明它们各自的特点。

方法一:利用原表重建分区表
步骤:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已创建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已创建6264行。

SQL> COMMIT;

提交完成。

SQL> CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE))
6 AS SELECT ID, TIME FROM T;

表已创建。

SQL> RENAME T TO T_OLD;

表已重命名。

SQL> RENAME T_NEW TO T;

表已重命名。

SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
6264
SQL> SELECT COUNT(*) FROM T PARTITION (P1);
COUNT(*)
----------
0
SQL> SELECT COUNT(*) FROM T PARTITION (P2);
COUNT(*)
----------
6246
SQL> SELECT COUNT(*) FROM T PARTITION (P3);
COUNT(*)
----------
18

优点:

方法简单易用,由于采用DDL语句,不会产生UNDO,且只产生少量REDO,效率相对较高,而且建表完成后数据已经在分布到各个分区中了。

不足:

对于数据的一致性方面还需要额外的考虑。由于几乎没有办法通过手工锁定T表的方式保证一致性,在执行CREATE TABLE语句和RENAME T_NEW TO T语句直接的修改可能会丢失,如果要保证一致性,需要在执行完语句后对数据进行检查,而这个代价是比较大的。另外在执行两个RENAME语句之间执行的对 T的访问会失败。

适用于修改不频繁的表,在闲时进行操作,表的数据量不宜太大。

 

方法二:使用交换分区的方法

步骤:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已创建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已创建6264行。

SQL> COMMIT;

提交完成。

SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (MAXVALUE));

表已创建。

SQL> ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;

表已更改。

SQL> RENAME T TO T_OLD;

表已重命名。

SQL> RENAME T_NEW TO T;

表已重命名。

SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
6264

优点:

只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。如果对数据在分区中的分布没有进一步要求的话,实现比较简单。在执行 完RENAME操作后,可以检查T_OLD中是否存在数据,如果存在的话,直接将这些数据插入到T中,可以保证对T插入的操作不会丢失。

不足

仍然存在一致性问题,交换分区之后RENAME T_NEW TO T之前,查询、更新和删除会出现错误或访问不到数据。如果要求数据分布到多个分区中,则需要进行分区的SPLIT操作,会增加操作的复杂度,效率也会降低。
适用于包含大数据量的表转到分区表中的一个分区的操作。应尽量在闲时进行操作。

 

方法三:Oracle9i以上版本,利用在线重定义功能

步骤:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已创建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已创建6264行。

SQL> COMMIT;

提交完成。

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER’, 'T', DBMS_REDEFINITION.CONS_USE_PK);
PL/SQL 过程已成功完成。
SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE));

表已创建。

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(‘USER’, 'T', 'T_NEW', -
> 'ID ID, TIME TIME', DBMS_REDEFINITION.CONS_USE_PK);
可以改为:
SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(‘USER’, 'T', 'T_NEW')
PL/SQL 过程已成功完成。
SQL> EXEC dbms_redefinition.sync_interim_table(‘USER’, 'T', 'T_NEW')
现在,将中间表与原始表同步。(仅当要对表 T 进行更新时才需要执行该操作。)
SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER’, 'T', 'T_NEW');
PL/SQL 过程已成功完成。

如果重组织失败,那么你就必须采取特殊的步骤来让它重新开始。由于重定义过程需要创建表格的快照,因此为了重新开始这一过程,你必须调用DBMS_REDEFINITION.ABORT_REDEF_TABLE来释放快照。

DBMS_REDEFINITION.ABORT_REDEF_TABLE过程有三个参数,即用户(schema)、原始表格(original table name)名称以及持有表格名称(holding table name)。它“出栈”并允许你开始重组织表格。

SQL> SELECT COUNT(*) FROM T;
SQL> SELECT COUNT(*) FROM T PARTITION (P2);
SQL> SELECT COUNT(*) FROM T PARTITION (P3);

需要说明的是完成后,原表和中间表的结构也同时进行了交换,并且中间表里面有原表的数据备份。

优点

保证数据的一致性,在大部分时间内,表T都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。

不足 :实现上比上面两种略显复杂,适用于各种情况。

然而,在线表格重定义也不是完美无缺的。下面列出了Oracle9i重定义过程的部分限制:

你必须有足以维护两份表格拷贝的空间。
你不能更改主键栏。
表格必须有主键。
必须在同一个大纲中进行表格重定义。
在重定义操作完成之前,你不能对新加栏加以NOT NULL约束。
表格不能包含LONG、BFILE以及用户类型(UDT)。
不能重定义链表(clustered tables)。
不能在SYS和SYSTEM大纲中重定义表格。
不能用具体化视图日志(materialized view logs)来重定义表格;不能重定义含有具体化视图的表格。
不能在重定义过程中进行横向分集(horizontal subsetting)。

上文中介绍的三种将Oracle数据库的普通表转换成分区表的方法,每种方法之后也都总结出了每一种方法的优缺点,所以每一种方法都是各有优缺点,并不是完美的,所以在选择选用哪一种方法时,要根据实际情况,综合考虑最终确定选择那一种。

分享到:
评论

相关推荐

    oracle普通表转化为分区表的方法

    Oracle数据库中的分区表是一种高级的表组织形式,它将大表分成多个较小的部分,每个部分称为一个分区,以提高查询性能和管理效率。当表的大小超过2GB时,官方推荐使用分区表,因为它们在处理大量数据时具有显著优势...

    数据库库表转换为java的bean对象

    oracle mysql 数据库库表转换为java对象

    Oracle数据库管理员

    Oracle数据库管理员是一个关键角色,负责管理和维护Oracle数据库系统的稳定性和安全性。Oracle数据库是企业级的关系型数据库管理系统,广泛应用于各种规模的企业中。以下是一些关于Oracle数据库管理的关键知识点: ...

    利用GDAL2.1.2库 把shp文件导入 oracle数据库中 例子

    本文将深入探讨如何利用GDAL 2.1.2版本将Shapefile(SHP)文件导入Oracle数据库,以及这一过程中的关键知识点。 首先,GDAL是一个C++库,它提供了一系列API来读取、写入和处理地理空间数据。GDAL 2.1.2版本包含了对...

    oracle数据库修复

    不需要运行Oracle数据库软件,ODU直接读取数据库文件解析数据。 支持ASM,能够直接从ASM磁盘中导出数据,即使相关的磁盘组不能成功mount 支持从ASM中直接抽取出数据文件和其他任意存储在ASM中的文件(包括控制文件...

    赤兔Oracle数据库恢复软件 v11.6.zip

    赤兔Oracle数据库恢复软件是一款专业好用的Oracle数据库抢修恢复软件。软件功能强大,持修复因各种原因造成的数据库无法打开或数据库删除后没有备份的问题,从而实现对Oracle数据库的抢修恢复,最大限度减少数据丢失...

    BLOG_如何将一个普通表转换为分区表.pdf

    而将一个普通的数据库表转换为分区表,可以让数据库管理员对数据进行更精细化的管理。 从提供的文件内容可以看出,本文主要介绍的是如何将一个非分区表转换为分区表,其中涉及了四种不同的方法,并且强调了每种方法...

    实验授课计划-Oracle数据库教程(第2版)-赵明渊-清华大学出版社.docx

    - **使用视图**:视图可以像普通表一样被查询,但不能直接修改其中的数据。 ### 9. 索引 - **索引的作用**:提高数据检索速度,类似于书的目录。 - **创建索引**:使用CREATE INDEX语句创建索引。 - **索引类型**...

    oracle数据库开发规范.doc

    - **命名规则**: 分区表名称遵循普通表的命名规则,一般采用主用途缩写加上下划线和日期格式(yy/mm)。 - **分区名称**: 分区名称通常由表的主要用途缩写加上区域缩写组成。 - **子分区**: 子分区的命名为父分区...

    数据库结构转换数据库文档

    "db-generator-master"这个文件可能是一个开源项目,它可能包含了源代码、配置文件、使用说明等,用于将MySQL和Oracle数据库的结构转换为清晰的文档格式。使用这样的工具,开发者可以方便地导出这些关键信息,不仅...

    Oracle数据库恢复工具Oracle Database Unloader(ODU)3.09

    ODU全称为Oracle Database Unloader,是类似于Oracle的DUL的软件,用于直接从Oracle数据库的数据文件中获取表数据。在各种原因造成的数据库不能打开时,用于抢救数据,最大限度地减少数据丢失。 ODU有什么功能特点...

    oracle数据库.doc

    在Oracle数据库中,有多种类型的用户角色,例如超级管理员(sys/change on install)、普通管理员(system/manager)以及普通用户(scott/tiger)等,每个角色都有不同的权限。 SQL(Structured Query Language)是...

    Oracle数据库错误消息

    Oracle数据库在运行过程中可能会遇到各种错误,这些错误通常由特定的错误代码标识,并附带详细的错误消息,以帮助用户诊断和解决问题。以下是对部分Oracle数据库错误消息的详细解析,涵盖从EXP-00000至EXP-00024的...

    焕发数据库的生命力——Oracle数据库系统的在线重组技术.pdf

    - 将普通堆表转换为索引组织表 在线重组的原理涉及三个主要阶段: 1. 设置阶段:根据重组表的信息创建一个新的表,并指定修改后的参数。 2. 复制阶段:记录对原表的DML操作,并将数据复制到新表中。 3. 同步阶段:...

    浅析Oracle数据库中Pro*C程序.pdf

    通过Pro*C,开发者可以在C程序中嵌入SQL语句,实现对Oracle数据库的动态操作,如创建、修改、删除表,以及查询、插入、更新和删除数据。此外,还能嵌入PL/SQL块,进一步提升程序的灵活性和性能。 2. Pro*C程序组成...

    Oracle数据库面试题.pdf

    - **定义**:表空间是Oracle数据库中存储数据的逻辑容器。 - **管理方式**:可以通过SQL命令或企业管理器进行表空间的创建、扩展和缩减操作。 3. **实例与数据库的关系**: - **实例**:指运行时的Oracle环境,...

Global site tag (gtag.js) - Google Analytics