備忘録

ORA-12034:マテリアライズド・ビュー・ログは最終リフレッシュよりも新しいものです。

マテビューの元表に対してのTRUNCATE
の検証をしているときに、ORA-12034 が発生した。
良くわからないのが、起きたのが1回だけで何回同じことをやっても発生しない。
マテビューの件数が減っていることから、リフレッシュ自体は完了しているが、その後でこけているっぽい。
超微妙なタイミングで発生するOracleのバグ?

マニュアルで関係しそうなものを見てみた。
まず疑ったのは、マテビューログのパージ。
CREATE MATERIALIZED VIEW LOG でログのパージタイミングを指定できる。
mv_log_purge_clause
  • IMMEDIATE SYNCHRONOUS: マテリアライズド・ビュー・ログは、リフレッシュの直後に消去されます。これはデフォルトです。

  • IMMEDIATE ASYNCHRONOUS: マテリアライズド・ビュー・ログは、リフレッシュ操作後に、別のOracleスケジューラ・ジョブで消去されます。

  • START WITHNEXTおよびREPEAT INTERVALは、CREATEまたはALTER MATERIALIZED VIEW LOG文で開始される、マテリアライズド・ビューのリフレッシュに依存しないスケジュール実行のパージを設定します。これは、CREATEまたはALTER MATERIALIZEDVIEW文の、スケジュール実行のリフレッシュ構文と似ています


とあり、今回はオプションを何も指定していないので同期で削除されるから問題なさそう。

次に疑ったのは、COMMIT SCN
WITH ROWID, PRIMARY KEY でマテビューを作っている。デフォルトでは「COMMIT SCN句を使用しない場合、マテリアライズド・ビュー・ログはタイムスタンプ・ベースになり」と言っているので、これに起因する問題か?
と思ったが、「COMMIT SCN」はローカルマテビューでしか使用できないので、これで回避することは出来ない。

結局理由わからずで、起きないことを祈るのみ。
運用では、TRUNCATEは基本無く、更新しているタイミングでリフレッシュはしないのでまず起きないと期待したい。


SQL> truncate table tbl03;

表が切り捨てられました。

SQL>
SQL> select UNUSABLE, KNOWN_STALE, INVALID from USER_MVIEW_ANALYSIS WHERE MVIEW_NAME='MV01';

UN KN IN
-- -- --
N N Y

SQL> select count(*) from mv01;

COUNT(*)
----------
2

SQL> exec DBMS_MVIEW.REFRESH( 'MV01', '?');
BEGIN DBMS_MVIEW.REFRESH( 'MV01', '?'); END;

*
行1でエラーが発生しました。:
ORA-12034: "TEST"."TBL03"のマテリアライズド・ビュー・ログは最終リフレッシュよりも新しいものです。
ORA-06512: "SYS.DBMS_SNAPSHOT", 行2563
ORA-06512: "SYS.DBMS_SNAPSHOT", 行2776
ORA-06512: "SYS.DBMS_SNAPSHOT", 行2745
ORA-06512: 行1


SQL> select UNUSABLE, KNOWN_STALE, INVALID from USER_MVIEW_ANALYSIS WHERE MVIEW_NAME='MV01';

UN KN IN
-- -- --
N Y N

SQL> select count(*) from mv01;

COUNT(*)
----------
1

次のページ

FC2Ad