它可能会失败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 不会失败,它不会查询已更改的分区。每个分区都有自己的段,并且是一个可能“不再存在”的单独对象。