【この記事は2020-01-27に他ブログで掲載したものです】
2週間前から出ていたqopatchエラーの原因がやっと分かったのでメモ書きする。
そもそもqopatchとは
一言で言えば、簡単に適用済みパッチの状況を確認できる機能のこと。
Oracle DBのパッチはOSコマンド(Linux Red Hat) である「OPatch」コマンドで適用する。
適用したパッチの確認は、11g以前では同じ「OPatch」コマンドを使用して確認する仕様だった。
そして、Oracle DB 12cなってからは適用済みパッチをSQLベースで確認できるようになった。
具体的には、DBMS_QOPATCHが提供するXMLドキュメントを返すファンクションを使用する。
そのファンクションがqopatch。
エラーの発生タイミング
インスタンスの起動時になぜか毎回発生する。
DBインスタンスは夜間停止しており、朝8時になるとJP1に設定したhogeora(仮名)というOSユーザーでシェルを実行し、インスタンスを起動している。
エラー内容
アラートログに「パーミッションがおかしい」(超訳)と書いてあった。
原因
インスタンス起動をoracleユーザー(DBインストールユーザー)で実行していなかったから。
私の扱っているシステムではoracleユーザーの代わりに、hogeoraというOSユーザーでDBの管理をしている。
しかし、DBのインストールはoracleユーザーで実行しており、製品系のコマンドファイルの所有者はoracleとなっていた。
起動コマンドはスティッキービットによりhogeoraで実行しても、oracleユーザーとして実行されるため、特に問題は発生しないが、起動処理の流れの中で実行されるqopatchのファンクションについてはスティッキービットが付与されていないため、hogeoraとして処理が実行される。
qopatchは実行内容をORACLE_HOMEの下のlogディレクトリにログ出力しようとするが、hogeoraでは権限がないのでログが吐けず怒られていたというオチ。
解決策
インスタンスの起動については、oracleユーザーで実行すれば良い。