おらくるのいる生活

OracleのDBAとしての、障害対応やらパフォーマンス・チューニングやらの日々を綴っています

impdp後、viewがinvalidになる

11gから19cにデータ移行を行った時の事です。

開発環境で、構成は以下の通りです。

移行元:11.2.0.2  SE  シングル

移行先:19.7.0  SE2 シングル

OS:RHEL

 

データ移行は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でリコンパイルして、再度確認します。

ちなみにutlrp.sqlはDB内のオブジェクトをチェックし、invalidであればリコンパイルしてくれるPL/SQLです。

SQL> @?/rdbms/admin/utlrp.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> @?/rdbms/admin/utlrp.sql

(略)
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も使っていなかったようです…