11gから19cにデータ移行を行った時の事です。
開発環境で、構成は以下の通りです。
データ移行はexpdp/impdpで行い、特にエラーも無く正常終了しました。
移行先でオブジェクト状態を確認したところ、invalidオブジェクトが54、ありました。
SQL> select status, count(status) from dba_objectsSQL> select status, count(status) from dba_objects 2 group by status;
STATUS COUNT(STATUS)
------- -------------
VALID 75502
INVALID 54
ちなみにutlrp.sqlはDB内のオブジェクトをチェックし、invalidであればリコンパイルしてくれるPL/SQLです。
(略)
SQL> select status, count(status) from dba_objects 2 group by status;
STATUS COUNT(STATUS)
------- -------------
VALID 75506
INVALID 50
余り減らないですね…
何がinvalidになっているのか確認した所、すべてviewでした。
更に調べたところ、これらのviewはDBリンク経由で他DBにあるテーブルを参照しています。
DBリンクに使用されている接続情報を移行先のtnsnames.oraに入れていなかったので、追記して再度、コンパイルします。
(略)
SQL> select status, count(status) from dba_objects 2 group by status;
STATUS COUNT(STATUS)
------- -------------
VALID 75509
INVALID 47
一気にvalidになる事を期待したのですが、3つしかvalidが増えませんでした…
試しにviewに対してselectしてみます。
SQL> select count(*) from USER_A.VIEW_AAA;
select count(*) from USER_A.VIEW_AAA
*
行1でエラーが発生しました。:
ORA-04063: view "USER_A.VIEW_AAA"にエラーがあります。
viewの定義を確認した所、カラム名にマルチバイト文字が使われているのが気になりましたが、文字化けはしていないので、そこは問題では無さそうです。
もちろん、移行前後でDBのキャラクタセットと環境変数は同じにしてあります。
何が問題なのかチェックする為、移行先環境でビューの作成を試みたところ
SQL> create view USER_A.VIEW_AAA as
(略)
*
行22でエラーが発生しました。:
ORA-02019: 指定されたリモート・データベースは存在しません。
ORA-28000:アカウントがロックされています。
ORA-02063:先行のエラー・メッセージを参照してくださいline(connect_string)。
DBリンクで接続する先のユーザのアカウントがロックされていました。
確認の為、直接つなぎます。
SQL> conn user_b/password@connect_string
ERROR:
ORA-28000: アカウントがロックされています。
運用チームに依頼してアカウント・ロックを解消し、再度コンパイルしたところ、全てvalidとなりました。
開発環境だからかも知れませんが、アカウントがロックされたまま放置されているくらいなので、viewも使っていなかったようです…