ORA-14097: ALTER TABLE EXCHANGE PARTITION的列类型或大小不匹配



我在交换分区时遇到ORA-14097。谁能给我点光?

我有以下source_tbl(未分区)表,打算使用列"VALID_PERIOD_END"对其进行分区

CREATE TABLE source_tbl
(    INVOICE_ID NUMBER(15,0) NOT NULL ENABLE, 
LATEST_FLAG_NAME VARCHAR2(3000), 
STD_HASH **RAW**(1000), 
VALID_PERIOD_START TIMESTAMP (6), 
VALID_PERIOD_END **TIMESTAMP** (6), 
OVERSEAS NUMBER, 
.. <another 20 number columns)
VIP_NO NUMBER
) partition by range(VALID_PERIOD_END)
nologging;

这个表现在有5M行,我想通过VALID_PERIOD_END对它进行分区,这样如果它是' 99999-12-31 23:59:59'(当前)将在一个分区中,而其余的将在另一个分区中

我已经创建了第二个名为TEMP_tbl的表
CREATE TABLE TEMP_tbl
(    INVOICE_ID NUMBER(15,0) NOT NULL ENABLE, 
LATEST_FLAG_NAME VARCHAR2(3000), 
STD_HASH **RAW**(1000), 
VALID_PERIOD_START TIMESTAMP (6), 
VALID_PERIOD_END **TIMESTAMP** (6), 
OVERSEAS NUMBER, 
.. <another 20 number columns)
VIP_NO NUMBER
)partition by range(VALID_PERIOD_END)
(partition p1 values less than(maxvalue)) nologging;

TEMP_tbl与source_tbl具有完全相同的数据结构,正如驱动脚本使用的那样dbms_metadata.get_ddl

我已经执行了收集表状态,没有返回任何错误

EXEC DBMS_STATS.gather_table_stats(USER, upper('source_tbl'), cascade => TRUE);

但是,当我尝试执行下面的交换分区语句时,出现了上面的错误

alter table TEMP_tbl
exchange partition p1
with table source_tbl
without validation
update global indexes
;

我已经检查了"user_tab_cols"并且我确认source_tbl中没有隐藏列。是因为表中的原始列吗?

提前感谢!

Oracle 12.2引入了两个新的分区特性,它们将帮助您更好地使用交易。

  1. 引入了一个新的ALTER TABLE MODIFY PARTITION BYDDL,它允许将非分区表转换为分区表。该操作将把数据从现有的未分区表复制到新的表分区中,因此可以长时间运行。您可以指定ONLINE关键字以在线模式执行操作,这意味着当ALTER TABLE运行时,将允许对表进行DML操作。例如:
ALTER TABLE source_tbl
MODIFY PARTITION BY RANGE(VALID_PERIOD_END)
(partition p1 values less than (timestamp '9999-12-31 23:59:59'),
partition p2 values less than (maxvalue))
ONLINE;
  1. 为了帮助您解决所面临的EXCHANGE PARTITION问题,在CREATE TABLE中引入了FOR EXCHANGE WITH TABLE子句。这是专门用于在创建将与现有表交换的新表时精确匹配物理列的。FOR EXCHANGE WITH TABLE可以与PARTITION BY一起使用,创建一个分区表,该分区表可以与源表交换。例如:
CREATE TABLE TEMP_tbl
PARTITION BY RANGE(VALID_PERIOD_END)
(partition p1 values less than(maxvalue))
FOR EXCHANGE WITH TABLE source_tbl;

这里有一篇博客文章描述了这两种分区增强。这里是另一篇博客文章,专门讨论使用CREATE TABLE ... FOR EXCHANGE WITH TABLE来解决EXCHANGE PARTITION错误。

你没有提到你使用的是哪个版本的Oracle,所以也许你还在运行11g。在这种情况下,您可能需要深入USER_TAB_COLS,以查看两个表之间的区别。您提到您已经检查了隐藏列(这很好),但可能会发生其他不匹配。

要记住的一件事是NULLABLE列属性必须在两个表之间匹配。如果一个表有主键约束,而另一个表没有,那么该列在有主键的表中可能是非空的,而在另一个表中可能是空的,这将导致ORA-14097。

如果这不能解释问题,你也可以检查SEGMENT_COLUMN_ID顺序,DATA_TYPE,DATA_LENGTH,DATA_PRECISIONDATA_PRECISION。由于您使用dbms_metadata.get_ddl来创建您的表,这些应该匹配,但必须有一些差异,否则您将不会得到错误。

RAW(1000)列对于EXCHANGE PARTITION应该不是问题。

相关内容

  • 没有找到相关文章

最新更新