web-dev-qa-db-ja.com

ALTER INDEX COALESCE CLEANUPを中断すると、これまでの作業が失われますか?

Oracle 12c(12.1)では、時間隔パーティション分割を使用した巨大なパーティション分割テーブルがあります。ローカルインデックスのほかに、2つのグローバルインデックスがあります。 UPDATE INDEXES句を使用して古いパーティションを削除すると、グローバルインデックスが有効に保たれます。

翌日の Asynchronous Global Index Maintenance というバックグラウンドジョブと呼ばれる機能がALTER INDEX xxx COALESCE CLEANUPコマンドを開始しました。このコマンドは数日から実行され、削除されたパーティションの孤立したエントリからグローバルインデックスをクリーンアップします。

残念ながら、このテーブルに別のパラメーターで別のインデックスを作成する必要がありますが、バックグラウンドジョブが原因で発生する共有DMLロック(Row-X(SX))によるリソースビジーエラーが原因で不可能です。新しいリリースをデプロイする必要があるので、別のインデックスに間違いなくDDLが必要です。私には奇妙に見えますが、そのインデックスを変更しています...合体クリーンアップでは、別のインデックスを並行して作成できません。なぜ関係があるべきなのでしょうか?

質問:セッションを終了すると、過去2日間の作業が失われ、ジョブを最初から再開する必要がありますか?

1
D. Lohrsträter

明らかな理由(怠惰)のために、この投稿からテーブルとインデックスを作成する例を使用しました。

https://richardfoote.wordpress.com/2013/08/02/12c-asynchronous-global-index-maintenance-part-i-where-are-we-now/

create table muse (id number, code number, name varchar2(30)) partition by range (id) (partition muse1 values less than (1000001), partition muse2 values less than (2000001), partition muse3 values less than (maxvalue));
insert into muse with g as (select * from dual connect by level <= 1000) select rownum, mod(rownum,100000), 'DAVID BOWIE' from g,g,g where rownum <=  3000000;
commit;
create index muse_id_i on muse(id);
create index muse_code_i on muse(code) global partition by range(code)(partition code_p1 values less than (50000), partition code_p2 values less than (maxvalue));
exec dbms_stats.gather_table_stats(ownname=>user, tabname=>'MUSE', cascade=>true, estimate_percent=>null, method_opt=>'FOR ALL COLUMNS SIZE 1');

次にパーティションを削除します。

SQL> alter table muse drop partition muse1 update global indexes;

Table altered.

次に、インデックスを分析します。

SQL> analyze index muse_id_i validate structure;

Index analyzed.

SQL> select name, lf_rows, del_lf_rows from index_stats;

NAME                              LF_ROWS DEL_LF_ROWS
------------------------------ ---------- -----------
MUSE_ID_I                         3000000     1000000

孤立したエントリは、削除されたエントリとしてここに表示されます。

これが私の追加です。 coalesce cleanup手動で、数秒で中断し(Ctrl-C)、インデックスを再度分析します。

SQL> alter index muse_id_i coalesce cleanup;
^C
alter index muse_id_i coalesce cleanup
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation



SQL> SQL> analyze index muse_id_i validate structure;

Index analyzed.

SQL> select name, lf_rows, del_lf_rows from index_stats;

NAME                              LF_ROWS DEL_LF_ROWS
------------------------------ ---------- -----------
MUSE_ID_I                         2723063      723063

ご覧のとおり、コマンドを中断しても、一部のエントリはクリーンアップされています。もう一度やり直してください:

SQL> alter index muse_id_i coalesce cleanup;
^Calter index muse_id_i coalesce cleanup
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation



SQL> analyze index muse_id_i validate structure;

Index analyzed.

SQL> select name, lf_rows, del_lf_rows from index_stats;

NAME                              LF_ROWS DEL_LF_ROWS
------------------------------ ---------- -----------
MUSE_ID_I                         2532434      532434

次に、インデックスを作成してから続行します。

SQL> create index muse_name_i on muse(name) local;

Index created.

SQL> alter index muse_id_i coalesce cleanup;
^C
alter index muse_id_i coalesce cleanup
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation

SQL> SQL> analyze index muse_id_i validate structure;

Index analyzed.

SQL> select name, lf_rows, del_lf_rows from index_stats;

NAME                              LF_ROWS DEL_LF_ROWS
------------------------------ ---------- -----------
MUSE_ID_I                         2151894      151894

最後に:

SQL> alter index muse_id_i coalesce cleanup;

Index altered.

SQL> analyze index muse_id_i validate structure;

Index analyzed.

SQL> select name, lf_rows, del_lf_rows from index_stats;

NAME                              LF_ROWS DEL_LF_ROWS
------------------------------ ---------- -----------
MUSE_ID_I                         2000000           0

SQL>

だから、いいえ、進歩は失われませんでした。

2
Balazs Papp