2011年6月17日金曜日

Oracleで統計情報のインポート時にエラー(ORA-20005)になったら

スズキです。

Oracleで中途半端な状態でデータインポートなどを行うと
下記のようなエラーが発生することがあります。

ORA-20005: object statistics are locked (stattype = ALL)

これは、統計情報がロックされており、統計情報がインポートとできないためです。

実際に統計情報のロックは下記のように確認することができます。

SQL> SELECT TABLE_NAME,STATTYPE_LOCKED FROM USER_TAB_STATISTICS;
TABLE_NAME    STATTYPE_LOCKED
------------- ---------------
SUZ_LAB_TABLE ALL
...
※STATTYPE_LOCKEDにALLが入っているとロックされていることになります。

ロックを外すには、下記を実行します。

SQL> exec DBMS_STATS.UNLOCK_TABLE_STATS('SUZ_LAB', 'SUZ_LAB_TABLE');

再度確認すると、ロックが外れていることが確認できます。

SQL> SELECT TABLE_NAME,STATTYPE_LOCKED FROM USER_TAB_STATISTICS;
TABLE_NAME    STATTYPE_LOCKED
------------- ---------------
SUZ_LAB_TABLE 
...
※STATTYPE_LOCKEDが空になっているとロックが外れていることになります。

というのを、PL/SQLで実行ユーザーが持つすべての統計情報のロックを外す形で作ってみました。

SET LINESIZE 2000;
SET SERVEROUTPUT ON;
DECLARE
  username VARCHAR(2000);
  ddl VARCHAR(2000);
BEGIN
  SELECT USER INTO username FROM DUAL;
  FOR cur IN (
    SELECT USER_TAB_STATISTICS.TABLE_NAME
    FROM USER_TAB_STATISTICS
  ) LOOP
    DBMS_OUTPUT.PUT_LINE(username || ' ' || cur.TABLE_NAME);
    DBMS_STATS.UNLOCK_TABLE_STATS(username, cur.TABLE_NAME);
  END LOOP;
END;
/

インデックスが問題なければ、"Oracle RDS"へのデータインポート完了!
--------
http://www.suz-lab..com

0 コメント: