问题描述
如何在执行exchange分区后将记录移动到相应的分区,拆分已交换的分区似乎不起作用
After exchanging partition with a table, the partitioned table does not have the records distributed across the appropriate partitions but it just resides in a same partition in which it was swapped
所有行仅存在于分区OLD_DATA中,不会创建新分区。当我尝试分割该分区时,出现以下错误
如何将交换分区中的数据跨各个分区分发 ???
After exchanging partition with a table, the partitioned table does not have the records distributed across the appropriate partitions but it just resides in a same partition in which it was swapped
--DROPPING EXISTING TABLE DROP TABLE requests PURGE; --CREATING NON-PARTITIONED TABLE CREATE TABLE requests ( reqsource NUMBER, reqtime TIMESTAMP(6), req CLOB ) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT ) --TABLESPACE "REQ_DATA" LOB ( "REQ" ) STORE AS BASICFILE ( -- TABLESPACE "REQ_DATA" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION NOCACHE LOGGING STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT ) ); --DROPPING EXISTING TABLE DROP TABLE requests_part; --CREATING PARTITIONED TABLE CREATE TABLE requests_part ( reqsource NUMBER, reqtime TIMESTAMP(6), req CLOB ) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT ) --TABLESPACE "REQ_DATA" LOB ( "REQ" ) STORE AS BASICFILE ( --TABLESPACE "REQ_DATA" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION NOCACHE LOGGING STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT ) ) -- MONTHLY PARTITIONED ON TIMESTAMP COLUMN PARTITION BY RANGE ( "REQTIME" ) INTERVAL ( numtoyminterval(1, 'MONTH') ) ( PARTITION "OLD_DATA" VALUES LESS THAN ( TIMESTAMP ' 2013-01-01 00:00:00' ) --TABLESPACE "REQ_DATA" ); ALTER TABLE requests_part EXCHANGE PARTITION old_data WITH TABLE requests WITHOUT VALIDATION UPDATE GLOBAL INDEXES; SELECT * FROM user_tab_partitions WHERE table_name = 'REQUESTS_PART'; TABLE_NAME COMPOSITE PARTITION_NAME HIGH_VALUE HIGH_VALUE_LENGTH PARTITION_POSITION REQUESTS_PART NO OLD_DATA TIMESTAMP' 2013-01-01 00:00:00' 31 1复制
所有行仅存在于分区OLD_DATA中,不会创建新分区。当我尝试分割该分区时,出现以下错误
ALTER TABLE results_part SPLIT PARTITION OLD_DATA FOR( TIMESTAMP' 2013-02-01 00:00:00' -- TO_DATE('01-MAY-2007','dd-MON-yyyy') ) AT ( -- TO_DATE('15-MAY-2007','dd-MON-yyyy') TIMESTAMP' 2013-01-01 00:00:00' ) Error report - ORA-14080: partition cannot be split along the specified high bound 14080. 00000 - "partition cannot be split along the specified high bound" *Cause: User attempted to split a partition along a bound which either collates higher than that of the partition to be split or lower than that of a partition immediately preceding the one to be split *Action: Ensure that the bound along which a partition is to be split collates lower than that of the partition to be split and higher that that of a partition immediately preceding the one to be split复制
如何将交换分区中的数据跨各个分区分发 ???
专家解答
问题是你正在这样做:
因此,数据库不会检查您正在交换的行是否属于目标分区; 它相信您已经事先验证了这一点。
如果不这样做,则可能会导致错误分区中的行:
所以我们有p0中值为20的行,尽管它的上限是11!
您一次只能用一个分区交换表中的所有行。如果你有要加载到许多分区的行,你可以:
-创建一个具有足够高的上限以存储所有值的分区,然后在交换后拆分此分区
-多次运行exchange进程,仅将每个分区的行插入到exchange表中,运行exchange并重复下一个。
without validation复制
因此,数据库不会检查您正在交换的行是否属于目标分区; 它相信您已经事先验证了这一点。
如果不这样做,则可能会导致错误分区中的行:
create table t ( c1 int, c2 int ); create table tpart ( c1 int, c2 int ) partition by range ( c1 ) interval ( 10 ) ( partition p0 values less than ( 11 ) ); insert into t with rws as ( select level x from dual connect by level <= 20 ) select x, x from rws; commit; alter table tpart exchange partition p0 with table t; ORA-14099: all rows in table do not qualify for specified partition alter table tpart exchange partition p0 with table t without validation; select count (*), max ( c1 ) from tpart partition ( p0 ); COUNT(*) MAX(C1) 20 20复制
所以我们有p0中值为20的行,尽管它的上限是11!
您一次只能用一个分区交换表中的所有行。如果你有要加载到许多分区的行,你可以:
-创建一个具有足够高的上限以存储所有值的分区,然后在交换后拆分此分区
-多次运行exchange进程,仅将每个分区的行插入到exchange表中,运行exchange并重复下一个。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
965次阅读
2025-03-17 11:33:53
Oracle DataGuard高可用性解决方案详解
孙莹
410次阅读
2025-03-26 23:27:33
墨天轮个人数说知识点合集
JiekeXu
354次阅读
2025-04-01 15:56:03
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
343次阅读
2025-04-08 09:12:48
Oracle SQL 执行计划分析与优化指南
Digital Observer
311次阅读
2025-04-01 11:08:44
风口浪尖!诚通证券扩容采购Oracle 793万...
Roger的数据库专栏
287次阅读
2025-03-24 09:42:53
Oracle 19c RAC更换IP实战,运维必看!
szrsu
286次阅读
2025-04-08 23:57:08
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
281次阅读
2025-03-19 14:41:51
oracle定时任务常用攻略
virvle
280次阅读
2025-03-25 16:05:19
MySQL 有没有类似 Oracle 的索引监控功能?
JiekeXu
258次阅读
2025-03-19 23:43:22