で失敗する場合がありORA-08103: object no longer exists
ます。
Oracle では、リーダーとライターは互いにブロックしません。これは、UNDO スペースが不足するなどのいくつかの奇妙なケースを除いて、DML とクエリが互いに干渉しないことを意味します。ただし、テーブルスペース、または任意のタイプの 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 は失敗しません。変更されたパーティションを照会していません。各パーティションには独自のセグメントがあり、「もはや存在しない」可能性がある別個のオブジェクトです。