ORA-38029
エラーメッセージ
ORA-38029: オブジェクト統計はロックされています ORA-38029: object statistics are locked.
基本的なエラーの内容
analyze tableコマンド等で表の統計情報を取得しようとした際に、表の統計がロックされている時に発生します。
確認事項および対応
- DBMS_STATS.UNLOCK_TABLE_STATS にロック解除したい表のスキーマ名、テーブル名を指定して実行することでロックを解除できます。
exec DBMS_STATS.UNLOCK_TABLE_STATS('owner','table name');
詳細
表の統計がロックされているかどうかはDBA_TAB_STATISTICS の STATTYPE_LOCKED 列で確認できます。
STATTYPE_LOCKED が null (空欄) の場合はアンロック状態で、その他(通常ALL)の場合はロックされている状態です。
SQL> select table_name, stattype_locked from dba_tab_statistics where owner = 'SCOTT' and stattype_locked; TABLE_NAME STATT ------------------------------ ----- TAB_TEST1 ALL <--- LOCKED TAB_TEST2 <--- UNLOCKED
DBMS_STATS.UNLOCK_TABLE_STATS を実行することでロックを解除できます。
SQL> exec DBMS_STATS.UNLOCK_TABLE_STATS('scott','TAB_TEST1'); PL/SQL procedure successfully completed.
アンロック後に再度統計情報の取得を実行すればエラーは回避できるはずです。
複数の表に対してまとめてロックを解除したい場合、以下のSQLでアンロックする為の実行文を作成することができます。
select 'exec DBMS_STATS.UNLOCK_TABLE_STATS (|| owner ||,|| table_name ||);' from dba_tab_statistics where owner = 'owner_name' and stattype_locked is not null;
SQL> select 'exec DBMS_STATS.UNLOCK_TABLE_STATS ('''|| owner ||''','''|| table_name ||''');' from dba_tab_statistics where owner = 'SCOTT' and stattype_locked is not null; 'EXECDBMS_STATS.UNLOCK_TABLE_STATS('''||OWNER||''','''||TABLE_NAME||''');' ------------------------------------------------------------------------ exec DBMS_STATS.UNLOCK_TABLE_STATS ('SCOTT','TAB_TEST1'); exec DBMS_STATS.UNLOCK_TABLE_STATS ('SCOTT','TAB_TEST2');
export/import をした際に、表のデータをimportせずに表の構成だけimportした場合などにロック状態になることがあるようです。
また、DBMS_STATS.LOCK_TABLE_STATS を使用することで意図的にロック状態にすることも可能です。
SQL> exec dbms_stats.lock_table_stats('scott', 'test');