sql >> データベース >  >> RDS >> Oracle

テーブル/パーティションを別のテーブルスペースに移動すると、そのテーブル/パーティションにアクセスするクエリが中断されますか?

    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は失敗せず、変更されたパーティションを照会していません。各パーティションには独自のセグメントがあり、「存在しなくなる」可能性のある個別のオブジェクトです。



    1. SQLクエリからElasticSearchクエリへの自動変換

    2. Oracle DBA Mentor

    3. SELECT結果セットを使用してMySQLストアドプロシージャでUPDATEクエリを実行する

    4. Django ArrayFieldの長さをクエリするにはどうすればよいですか?