1

正如标题所说:在访问表/分区时移动(不重命名)表/分区会对访问它的任何查询产生负面影响吗?

例如,假设有一个长期运行的SELECT COUNT(*) FROM some_table.
如果我要ALTER TABLE some_table MOVE TABLESPACE some_other_tablespace,会SELECT失败吗?
它会完成,但结果不正确吗?也许完全是别的东西?

我能找到的唯一信息是在某些情况下将表移动到不同的表空间需要重建索引,但没有人提到任何活动查询会发生什么。

4

2 回答 2

3

它可能会失败ORA-08103: object no longer exists

在 Oracle 中,读取器和写入器不会相互阻塞。这意味着 DML 和查询不会相互干扰,不包括一些奇怪的情况,如 UNDO 空间用完。但是移动表空间或任何类型的 ALTER 或其他 DDL 语句不是正常的写入。当您运行 DDL 时,多版本并发控制模型会崩溃,至少对于所涉及的对象而言,并且奇怪的事情开始发生。

测试一个大动作是困难的,但是你可以通过循环大量的小改动和查询来重现这些错误。如果您认为这只是一个理论问题,我已经看到这些错误发生在现实生活中的生产数据库上。

警告:下面是无限循环,因为我无法预测重现此错误需要多长时间。但它通常只需要我几十秒。

--Create sample table.
drop table test1 purge;
create table test1(a number, b number)
partition by list(a) (partition p1 values(1), partition p2 values(2))
nologging tablespace users;

--Session 1
begin
  loop
    execute immediate '
      insert /*+ append */ into test1 select mod(level,2)+1, level
      from dual connect by level <= 100000';
    commit;
    execute immediate 'alter table test1 move partition p1 tablespace users';
  end loop;
end;
/       

--Session 2: Read from moved partition
declare
  v_count number;
begin
  loop
    select count(*) into v_count from test1 where a = 1;
  end loop;
end;
/

--Session 3: Read from unmoved partition
declare
  v_count number;
begin
  loop
    select count(*) into v_count from test1 where a = 2;
  end loop;
end;
/

会话 2 最终将死于:

ORA-08103: object no longer exists
ORA-06512: at line 6

会话 3 不会失败,它不会查询已更改的分区。每个分区都有自己的段,并且是一个可能“不再存在”的单独对象。

于 2013-03-20T19:55:22.523 回答
0

如果正在访问分区,则分区移动将导致 DML 失败。

我刚刚证明了这一点:-/。

我正在执行大删除并尝试移动分区(更改表移动分区)。
我收到的错误是:ORA-12801:并行查询服务器 P004ORA-08103 中发出错误信号:对象不再存在

于 2013-09-19T23:39:06.853 回答