【问题标题】:oracle creating table from another table created partially ; unable to extend temp spaceoracle 从部分创建的另一个表创建表;无法扩展临时空间
【发布时间】:2018-05-03 12:40:08
【问题描述】:

我们正在尝试使用方法从另一个表创建一个表 -

create table tab1 as select * from tab2;

但是进程失败并出现错误

ORA-01652: 无法在表空间中将临时段扩展 8192

但是,表 tab1 仅使用部分数据创建。 tab1 和tab2 中存在计数不匹配。这两个表中的任何一个都没有被任何事务填充/更新。这发生在几张桌子上。

据我所知,创建表应该完全或根本不创建表。不可能部分创建表。

专家建议任何见解。

【问题讨论】:

  • 仍在寻找专家意见。

标签: sql oracle


【解决方案1】:

将错误原因放在一边(由his answer 中的@Leo 解决):

我没有找到任何关于CREATE TABLE ... AS SELECT 交易的具体信息。任何CREATE TABLE 语句都是DDL 操作,而这些操作通常是非事务性操作。

这只是一个推测,但我想说表创建确实成功了。您给出的指令基本上是二合一的,其中第一个是实际的表创建,它确实有效(并且由于它不是事务性的,它不会受到第二个的影响),第二个是来自 select 的批量插入(带有批次的隐式提交),在某些时候会中断。

这可能无法回答您的问题,但由于操作显然是两阶段的,如果您需要更多事务性方法,您将从将操作拆分为两个单独的操作中受益:

第一:

CREATE TABLE tab1 AS SELECT * FROM tab2 WHERE 1 = 2;

秒:

INSERT INTO tab1 SELECT * FROM tab2;

这样,如果第二部分失败,您将不会得到部分插入。不过,您仍然可以使用该表。

【讨论】:

  • 我经常使用你建议的方法,先创建一个空表,然后使用源表填充它。但我不打算在这里使用它,因为这些是我正在处理的巨大表。但是,我的问题在这里仍未得到解答,该表是如何部分创建的。
【解决方案2】:

执行以下操作,将现有表空间的文件名确定为 sysadmin

SELECT * FROM DBA_DATA_FILES;

然后按如下方式扩展数据文件的大小(将文件名替换为上一个查询中的文件名):

ALTER DATABASE DATAFILE 'C:\ORACLEXE\ORADATA\XE\SYSTEM.DBF' RESIZE 4096M;

你可以先试试下面的命令或者请求 DBA 授予权限:

 grant unlimited tablespace to <schema_name>;

【讨论】:

  • 错误消息指的是 TEMP 表空间——它们的大小调整不同(请不要以 SYSTEM 为例——该表空间应该单独保留)
  • 感谢您解决表空间问题。但这不是这里的问题。我担心表是如何部分创建的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 2016-04-02
  • 2019-12-07
  • 1970-01-01
  • 2018-12-30
相关资源
最近更新 更多