ORACLE在线重定义--将普通表转化为分区表

Oracle普通表转化为分区表几种方法 Oracle提供了包来支持在线重定义表,包括将普通表转换为分区表。这种方法可以在不停机的情况下进行表结构的变更。检查是否可以重定义sql创建分区表sql开始重定义sql同步和结束重定义sql删除旧表(可选):如果不再需要旧表,可以删除它。选择哪种方法取决于具体需求、Oracle数据库的版本以及维护窗口的大小。在线重定义(DBMS_REDEFINITION)通常是最灵活和最推荐的方法,因为它可以在不停机的情况下完成表结构的变更。 阅读详情

10gR2
需要将一个普通表转为按月分区提高查询效率

测试如下:

一、建立测试表

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

Table created.

SQL> DESC T;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 TIME                                               DATE


SQL> INSERT INTO T SELECT ROWNUM,CREATED FROM ALL_OBJECTS;
rows created.

SQL> SET TIMING ON
SQL> select count(*) from t;

  COUNT(*)
----------

二、测试表是否可以在线重定义

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('test','T', DBMS_REDEFINITION.CONS_USE_PK);
BEGIN DBMS_REDEFINITION.CAN_REDEF_TABLE('test','T', DBMS_REDEFINITION.CONS_USE_PK); END;

                                                    *
ERROR at line 1:
ORA-06550: line 1, column 53:
PLS-00201: identifier 'DBMS_REDEFINITION' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

出错原因是没有赋予‘DBMS_REDEFINITION' 的执行权限。解决的办法是:

dba用户授予权限

SQL> GRANT ALL ON SYS.DBMS_REDEFINITION TO TEST;

Grant succeeded.


SQL>  GRANT CREATE ANY TABLE, ALTER ANY TABLE, DROP ANY TABLE, LOCK ANY TABLE, SELECT ANY TABLE TO TEST;

Grant succeeded.

回到test用户继续验证

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('test', 'T', DBMS_REDEFINITION.CONS_USE_PK);
BEGIN DBMS_REDEFINITION.CAN_REDEF_TABLE('test', 'T', DBMS_REDEFINITION.CONS_USE_PK); END;

*
ERROR at line 1:
ORA-12089: cannot online redefine table "test"."T" with no primary key
ORA-06512: at "SYS.DBMS_REDEFINITION", line 137
ORA-06512: at "SYS.DBMS_REDEFINITION", line 1479
ORA-06512: at line 1

如果没有定义主键会提示以上错误信息

建立主键:

SQL> alter table t add constraint pk_t primary key(id);

Table altered.

再次验证成功

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('test','T',DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL procedure successfully completed.

三、建立中间表及分区

SQL> select to_char(min(time),'YYYY-MM-DD HH24:MI:SS') from t;

TO_CHAR(MIN(TIME),'
-------------------
2003-06-13 21:11:01

SQL> select to_char(max(time),'YYYY-MM-DD HH24:MI:SS') from t;

TO_CHAR(MAX(TIME),'
-------------------
2013-05-07 21:40:35

SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
      (PARTITION T_2003 VALUES LESS THAN (TO_DATE('2004-1-1', 'YYYY-MM-DD')),
      PARTITION T_2004 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
      PARTITION T_2005 VALUES LESS THAN (TO_DATE('2006-1-1', 'YYYY-MM-DD')),
      PARTITION T_2006 VALUES LESS THAN (TO_DATE('2007-1-1', 'YYYY-MM-DD')),  
      PARTITION T_2007 VALUES LESS THAN (TO_DATE('2008-1-1', 'YYYY-MM-DD')),
     PARTITION T_2008 VALUES LESS THAN (TO_DATE('2009-1-1', 'YYYY-MM-DD')),
     PARTITION T_2009 VALUES LESS THAN (TO_DATE('2010-1-1', 'YYYY-MM-DD')),
     PARTITION T_2010 VALUES LESS THAN (TO_DATE('2011-1-1', 'YYYY-MM-DD')),
     PARTITION T_2011 VALUES LESS THAN (TO_DATE('2012-1-1', 'YYYY-MM-DD')),
     PARTITION T_2012 VALUES LESS THAN (TO_DATE('2013-1-1', 'YYYY-MM-DD')),
     PARTITION T_2013 VALUES LESS THAN (TO_DATE('2014-1-1', 'YYYY-MM-DD')));

四、在线重新定义操作

SQL> exec dbms_redefinition.start_redef_table('TEST','T','T_NEW');

PL/SQL procedure successfully completed.

一些问题:

建立过程关于物化视图的问题

SQL> desc user_mviews;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER                                     NOT NULL VARCHAR2(30)
 MVIEW_NAME                                NOT NULL VARCHAR2(30)
 CONTAINER_NAME                            NOT NULL VARCHAR2(30)
....省略

SQL> select mview_name from user_mviews;

no rows selected

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE('test','T','T_NEW');

PL/SQL procedure successfully completed.

SQL>  select mview_name from user_mviews;

MVIEW_NAME
------------------------------
T_NEW

SQL>

#start后会产生一个物化视图,如果中途失败不做abort会导致物化视图一次存在,下一次操作时会报:

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE('test', 'T', 'T_NEW');                        
BEGIN DBMS_REDEFINITION.START_REDEF_TABLE('test', 'T', 'T_NEW'); END;        

*
ERROR at line 1:
ORA-12091: cannot online redefine table "test"."T" with
materialized views
ORA-06512: at "SYS.DBMS_REDEFINITION", line 50
ORA-06512: at "SYS.DBMS_REDEFINITION", line 1343
ORA-06512: at line 1

SQL> drop materialized view log on T;

ORA-14400: inserted partition key does not map to any partition

这个报错的意思是分区表建立时有值在分区表之外,未被包含,可以查询下数据把缺失的分区表建立起来
参考:

SQL> select to_char(max(time),'YYYY-MM-DD HH24:MI:SS') from t;

TO_CHAR(MAX(TIME),'
-------------------
2014-05-01 21:40:35  

SQL> select partition_name from user_tab_partitions where table_name='T_NEW';

PARTITION_NAME
------------------------------
T_2003
T_2004
T_2005
T_2006
T_2007
T_2008
T_2009
T_2010
T_2011
T_2012
T_2013
rows selected.

SQL> ALTER TABLE T_NEW ADD PARTITION T_2014 VALUES LESS THAN (TO_DATE('2015-01-01','YYYY-MM-DD'));

Table altered.


SQL> select partition_name from user_tab_partitions where table_name='T_NEW';

PARTITION_NAME
------------------------------
T_2003
T_2004
T_2005
T_2006
T_2007
T_2008
T_2009
T_2010
T_2011
T_2012
T_2013
T_2014
rows selected.

五、执行重定义后的分区数据同步

SQL>  exec dbms_redefinition.sync_interim_table('TEST','T','T_NEW');

PL/SQL procedure successfully completed.

六、完成在线重定义操作

SQL>  EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('TEST','T','T_NEW');

PL/SQL procedure successfully completed.

如果执行在线重定义的过程中出错

可以在执行dbms_redefinition.start_redef_table之后到执行dbms_redefinition.finish_redef_table之前的时间里
执行:DBMS_REDEFINITION.abort_redef_table('test', 't', 't_new')以放弃执行在线重定义。

By cycsa http://www.cnblogs.com/cycsa

转载自-----https://www.cnblogs.com/cycsa/archive/2013/05/08/3067222.html

实战篇:Oracle分区表之在线重定义 使用在线重定义的方式进行分区表的转换,优势在于可以在线进行,流程简单,可以快速进行转换。 阅读详情

相关推荐

有史以来最小的GIF/png/jpg/jpeg

昨天我对图像进行了 base64 编码,这样我就可以将它发送到 CouchDB 以测试我正在为客户编写的一些代码。它让我想起了我之前在远程服务器上设置 cookie 时所做的事情。基本上,一个小的 PHP 脚本被放在远程服务器上,它接受几个 GET 参数并根据它们的值设置一些 cookie。然后脚本输出一个 1x1 的透明 GIF。本地服务器上的 PHP 脚本生成了一个 IMG 标签,该标签链接到该图像并根据本地服务器上的 COOKIES 设置参数。

凌凌1301的博客 1417

分区:在线重定义:DBMS_REDEFINITION

本文基于以下文章实际练习测试: http://www.oracle-base.com/articles/misc/partitioning-an-existing-table.php http://docs.oracle.com/cd/E11882_01/server.112/e25494/tables007.htm#ADMIN11678   一.说明 权限 在线重定义的用户需要相应的

DATA 2686

卷王问卷考试系统——测试报告

本问卷考试系统是一款在线平台,支持用户发布和完成调查问卷,并进行考试管理,核心功能在于简化问卷创建发布、数据收集及考试组织流程。此次测试将围绕其关键模块展开,涵盖用户注册登录、项目列表、我的练习以及我的题库等核心部分。问卷考试系统(一)硬件环境普通办公电脑(CPU:Intel i5 、内存:16GB 、硬盘:512GB )(二)软件环境操作系统:Windows 11 ;浏览器:Chrome(版本 120+)、Firefox(版本 115+)、Edge(版本 120+)验证界面信息在完整性、一致性、准确性和用

m0_73433755的博客 555

ORACLE在线重定义:将普通表转化为分区表

10gR2 需要将一个普通表转为按月分区提高查询效率测试如下: 一、建立测试表 SQL> CREATE TABLE T(ID NUMBER ,TIME DATE); Table created. SQL> DESC T; Name Null? Type ...

weixin_34308389的博客 205

国家医保移动支付国密算法SM2签名验签、SM4加解密DLL

DLL,非.net开发,所以无需安装配置,直接程序引用开发即可,支持各类开发语言。已知省份有广西、贵州、安徽、河北、黑龙江、湖南、吉林、江苏、四川、新疆等各地方。国家医保移动支付国密算法SM2签名验签、SM4加解密DLL。//SM4加密与解密。支持医保移动支付(国家统一版),//SM2签名与验签。

4264

OpenCV 开闭运算

开运算和闭运算是将腐蚀和膨胀按照一定的次序进行处理。 但这两者并不是可逆的,即先开后闭并不能得到原来的图像。 开运算 开运算是先腐蚀后膨胀,其作用是:分离物体,消除小区域。特点:消除噪点,去除小的干扰块,而不影响原来的图像。 闭运算 闭运算与开运算相反,是先膨胀后腐蚀,作用是消除/“闭合”物体里面的孔洞,特点:可以填充闭合区域。 cv.morphologyEx(img, op, kernel) img: 要处理的图像 op: 处理方式:若进行开运算,则设为cv.MORPH_OPEN,若进行闭

꧁༺ʚvv༒catɞ༻꧂的博客 949

如何将oralce普通表转换为分区表

 本文档 ID 1985005.1  如何将oralce普通表转换为分区表,此前面试被问到过,虽然知道在线重定义,个人觉得很简单,查查文档做个试验就差不多了,但自己没亲自操作过有点心虚;这次抽点时间好好研究一下! 可以任选如下四种方法的一种来对非分区表进行分区: A) 通过 expdp/impdp 方法 B) 通过 Insert with a subque

小伟的博客 4618

基于Openrouter的API调用免费大模型

Openrouter 是一个 AI 模型聚合平台,整合了全球 200 多种主流 AI 模型,包括 GPT-4、Claude、Gemini 等,以及国产通义千问、DeepSeek 等。其核心优势是统一的 API 设计,开发者仅需少量代码即可与多个模型交互,还支持自动路由与回退机制。用户可通过 OpenAI SDK 或 LangChain 调用 Openrouter 中的模型。

MurphyStar的博客 6205

oracle重新定义表,ORACLE在线重定义

一、建表和索引SQL> create table redefie_table (2 id number(10) primary key,3 create_date date4 );Table created.SQL> insert into redefie_table select rownum,created from user_objects;33 rows ...

weixin_35959694的博客 283

青龙人形机器人硬件平台设计全解析:从构型到控制系统的实战指南

本文深度解析了青龙人形机器人硬件平台的设计全流程,从需求分析、构型设计到核心系统实现。文章详细阐述了其43个自由度的仿生构型、高动态性下肢设计、灵巧作业系统以及分布式控制架构,并探讨了旋转关节与直线关节等关键技术选型,为开发者提供了从理论到实践的完整硬件设计指南。

weixin_29248313的博客 382

Jetson AGX Orin到手必看:DP线选错黑屏、SSD不识别?这篇避坑指南帮你一次搞定

本文详细介绍了Jetson AGX Orin开发套件的硬件避坑指南,涵盖开箱检查、DP线选择、SSD兼容性等关键问题。通过实测数据和实用技巧,帮助开发者避免黑屏、存储不识别等常见问题,提升开发效率。特别推荐符合VESA认证的DP 1.4a线缆和兼容性优秀的SSD型号,确保设备稳定运行。

weixin_33696822的博客 434

oracle在线重定义出错,【Oracle】在线重定义失败后的处理

普通表在线重定义为分区表过程中报错,数值范围超过了分区限制大小,那么想要重新对表进行在线重定义需要经过哪些步骤呢?这个例子记录了处理过程:SALES@ORCL>execdbms_redefinition.start_redef_table('SALES','SALES','SALES_P');BEGINdbms_redefinition.start_redef_table('SALE...

weixin_31058323的博客 349

DeiT详解:知识蒸馏的Transformer

DeiT模型(8600万参数)仅用一台 GPU 服务器在 53 hours train,20 hours finetune,仅使用 ImageNet 就达到了 84.2 top-1 准确性,而无需使用任何外部数据进行训练,性能与最先进的卷积神经网络(CNN)可以抗衡。其核心是提出了针对 ViT 的教师-学生蒸馏训练策略,并提出了方法,使得在视觉领域训练得又快又好。

走在深度学习前沿的小宋 2636

Oracle分区管理方法

Oracle提供了分区技术以支持VLDB(Very Large DataBase)。分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。  Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。  分区提供以下优点:

苏湘的专栏 3857

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

mysql 堆表_验证堆表(heap table)存储方式

堆表(heap table)的存储方式:Oracle 数据库系统中最普通,最为常用的即为堆表。堆表的数据存储方式为无序存储,也就是任意的D堆表(heap table)的存储方式:验证:1、创建tableSQL> conn scott/tigerConnected.SQL> create table t12 (a int,3 b varchar2(4000) default rpad('...

weixin_36085524的博客 428

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Oracle 分区表 总结

<br />一. 分区表理论知识<br />       Oracle提供了分区技术以支持VLDB(Very Large DataBase)。分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。 <br />       Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。 <br /> <br />When to Partiti

wu_wei_jie的专栏 347

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

oracle普通表转分区表(在线重定义方式)

1.1.TAB_TAOBAO_BILL 1.1.1检查下这张表是否可以在线重定义,无报错表示可以,报错会给出错误信息: exec dbms_redefinition.can_redef_table('ycheng', 'P_TAB_TAOBAO_BILL'); 1.1.2.expdp导出表进行备份(这里的DATA_PUMP_1目录是/data1/dpdump) expdp \'\/ ...

weixin_30544657的博客 137

ORACLE 普通表转换成分区表(在线重定义)

分区表 在一个高可用系统中,如果需要改变一个表的定义是一件比较棘手的问题,尤其是对于7×24系统。Oracle提供的基本语法基本可以满足一般性修改,但是对于把普通堆表改为分区表,把索引组织表修改为堆表等操作就无法完成了。而且,对...

csz123456101的博客 224

Oracle19C将普通表转为分区表

这是核心步骤,它将启动后台进程,开始将原表数据复制到中间表,并捕获期间的增量变化BEGINuname => 'YOUR_SCHEMA', -- schema名orig_table => 'YOUR_ORIGINAL_TABLE', -- 原表名int_table => 'YOUR_INTERIM_TABLE', -- 中间表名options_flag => DBMS_REDEFINITION.CONS_USE_ROWID -- 通常使用ROWID方式END;

JangBingYang的博客 485

Oracle 在线重定义(下)| 四种将普通表改为分区表的方式

作者 | JiekeXu来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)如需转载请联系授权 |(个人微信 ID:JiekeXu_DBA)大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看 Oracle 在线重定义(下),欢迎点击上方蓝字“JiekeXu DBA之路”关注我的公众号,标星或置顶,更多干货第一时间到达!目 录 Oracle...

JiekeXu的博客 3040

使用ORACLE在线重定义将普通表改为分区表

1.首先建立测试表,并插入测试数据:create table myPartition(id number,code varchar2(5),identifier varchar2(20)); insert into myPartition values(1,'01','01-01-0001-000001'); insert into myPartition values(2,'02','02-01-

专注大规模数据处理 8485

oracle中将普通表变更为分区表

1、创建表 SQL&gt; CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE); 2、插入数据 SQL&gt; INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;SQL&gt; COMMIT; 3、在线重定义的表自行验证,看该表是否可以重定义, SQL&gt; EXEC DBMS_R...

我在路上的博客 2万+

普通表在线重定义为分区表

BEGINEND;BEGINEND;BEGIN'TMP_P',NULL,2);END;BEGINEND;BEGINEND;

Ahern_的博客 1078

ORACLE将普通表转换成分区表

将普通表转换成分区表的两种方式 一、rename方式 实战: --1.创建测试表 CREATE TABLE test_fan AS SELECT * FROM Dba_Objects; --2.创建测试表对应的分区表 SELECT dbms_metadata.get_ddl('TABLE','TEST_FAN') FROM dual; create table man_dev.test_fan_bak (owner , object_name , subobject_name , ob

riven2011的博客 1908

[Oracle] 表在线重定义 - 普通表到分区表

对于一个7*24的在线生产系统来说,修改表定义(DDL)时一件非常痛苦的时,因为如果直接使用alter语句,将会在表上安放一个排他锁,也就是说在这期间所有的DML和select都无法操作,如果是一个大表,alter的时间将很长,在这期间应用会受到很大的影响。 幸好,从9i开始,Oracle提供了在线表重定义功能,在修改表定义的同时几乎不影响DML和select语句,因为排他锁只会在表上出现很短时

Zhu_Julian's Notes (朱显杰的技术博客) 6940
上一篇: Oracle数据库查询优化方案(处理上百万级记录如何提高处理查询速度)
下一篇: Oracle 强制中止正在执行的SQL语句
BikeRiver
博客等级 码龄10年 11粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值