Oracleでは統計情報のバックアップやインポートが可能ですが、別のユーザー(スキーマ)のDBに入れるとなると正攻法では不可となっていました。例えば本番ではユーザー hoge に対して、開発用DBでは hoge_deve になってる場合に統計情報を移行したいというシチュエーションです。
そこで今回、いろいろ試行錯誤してみたら上手く移行できたのでその方法をメモ的に残しておきたいと思います。
ただあくまで「開発環境などへの移行目的」として紹介していますので、本番での利用はおすすめしません。。。
統計情報をエクスポートする
まずは元DBから統計情報をエクスポートします。
# su - oracle $ sqlplus sys as sysdba SQL> exec DBMS_STATS.CREATE_STAT_TABLE('USER1', 'SAVE_STATS_USER1'); SQL> exec DBMS_STATS.EXPORT_SCHEMA_STATS('USER1', stattab =>'SAVE_STATS_USER1'); SQL> quit
統計情報を格納したテーブルからエクスポートします。
$ exp user1/user1_pass@orcl file=>(gzip > /tmp/stat_table.exp.gz ) tables=SAVE_STATS_USER1 statistics=none
統計情報をインポートする
続いて移行先のDBサーバにログインして統計情報をインポートします。
先ほど取得したバックアップは事前にアップロードしといてください。
$ imp user2/user2_pass@orcl file=<(gunzip -c /tmp/stat_table.exp.gz) IGNORE=Y FULL=Y
続いてSQLコマンドで統計情報を仮インポートしているテーブルのデータをアップデートしておきます。これが異なるユーザーに移行する際に必要な作業です。
update SAVE_STATS_USER1 set C5 = 'USER2'
あとは仮テーブルから統計情報をインポートします。
$ sqlplus sys as sysdba SQL> EXECUTE DBMS_STATS.DELETE_SCHEMA_STATS('USER2'); SQL> exec DBMS_STATS.IMPORT_SCHEMA_STATS(ownname => 'USER2' ,stattab => 'SAVE_STATS_USER1'); SQL> exec DBMS_STATS.DROP_STAT_TABLE (ownname => 'USER2',stattab => 'SAVE_STATS_USER1'); SQL> quit
これで完了です。
無事に移行できたかどうか・・・・ 統計情報の状況を確認するSQLで確認してみてください。
-- テーブル用 SELECT TABLE_NAME NAME,LAST_ANALYZED FROM USER_TABLES order by NAME; -- インデックス用 SELECT TABLE_NAME,INDEX_NAME,LAST_ANALYZED FROM USER_INDEXES order by TABLE_NAME,INDEX_NAME;
では。