OPatch適用時のトラブルシューティング

# はじめに
Oracle Database 19cへパッチ適用中にエラーがいくつか発生したので、エラー内容・解決方法をまとめてみた。
[Oracle Database 19cに最新パッチを適用してみた](https://qiita.com/shi6maSencho/items/9e672e4801436eca7663) のトラブルシュートだけ切り出しました。

# 1. OPatchインストール後、バージョン確認しようとした際にエラー
## 1-1. 本来のコマンド操作
 インストールしたOpatchバージョンを確認する際に、以下のコマンドを実行するだろう。
　```$ cd OPatch```　
　```$ opatch version```

## 1-2. エラー内容:warning:
本来であれば上記だけでバージョン確認ができるはずなのだが、以下のようなエラーが表示された場合は、
```
[CDB1:oracle@dbhol:/opt/oracle/product/19c/dbhome_1/OPatch]$ opatch version
/opt/oracle/product/19c/dbhome_1/OPatch/opatch: line 839: [: too many arguments
/opt/oracle/product/19c/dbhome_1/OPatch/opatch: line 839: [: too many arguments
Java (1.7) could not be located. OPatch cannot proceed!
OPatch returns with error code = 1
```
## 1-3. 解決策
　jdkを引数に指定して、明示的にjavaホームを指定する必要がある。
　(ここで結構つまずいてしまった:sob:)
　```
$ORACLE_HOME/OPatch/opatch version -jdk $ORACLE_HOME/jdk
　```
```
[CDB1:oracle@dbhol:/opt/oracle/product/19c/dbhome_1]$ $ORACLE_HOME/OPatch/opatch version -jdk $ORACLE_HOME/jdk
OPatch Version: 12.2.0.1.37

OPatch succeeded.
```
これで、ORACLE_HOME配下に新規OPatch (12.2.0.1.37) のインストール完了:sunny:

<font color="Red">一度このエラーにはまってしまった場合は、以後のOPatchコマンド実施時に同様の対応が必要</font>

# 2. OPatch適用しようとした際にエラー
## 2-1. 本来のコマンド操作
リスナーもDBインスタンスもすべて停止しているハズなのに、
OPatchを適用```opatch apply```実行後に、次のようなエラーが発生。
## 2-2. エラー内容:warning:
```
-----------------------
　OPatch適用するも失敗
-----------------------
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ $ORACLE_HOME/OPatch/opatch apply -jdk $ORACLE_HOME/jdk
Oracle Interim Patch Installer version 12.2.0.1.37
Copyright (c) 2023, Oracle Corporation.  All rights reserved.


Oracle Home       : /opt/oracle/product/19c/dbhome_1
Central Inventory : /opt/oracle/oraInventory
   from           : /opt/oracle/product/19c/dbhome_1/oraInst.loc
OPatch version    : 12.2.0.1.37
OUI version       : 12.2.0.7.0
Log file location : /opt/oracle/product/19c/dbhome_1/cfgtoollogs/opatch/opatch2023-04-28_04-22-32AM_1.log

Verifying environment and performing prerequisite checks...
Prerequisite check "CheckActiveFilesAndExecutables" failed.
The details are:


Following active files/executables/libs are used by ORACLE_HOME :/opt/oracle/product/19c/dbhome_1
/opt/oracle/product/19c/dbhome_1/bin/oracle




/opt/oracle/product/19c/dbhome_1/bin/tnslsnr
/opt/oracle/product/19c/dbhome_1/lib/libclntsh.so.19.1
/opt/oracle/product/19c/dbhome_1/lib/libasmclntsh19.so
UtilSession failed: Prerequisite check "CheckActiveFilesAndExecutables" failed.
Log file location: /opt/oracle/product/19c/dbhome_1/cfgtoollogs/opatch/opatch2023-04-28_04-22-32AM_1.log

OPatch failed with error code 73
```
## 2-3. 解決策①
**CheckActiveFilesAndExecutables** でエラーの原因を調べてみたところ、パッチ適用する際は、ORACLE_HOMEを利用するパッチはすべて停止していないといけないのだが、どこかでプロセスが動いているみたいだ。
1. 稼働中プロセスの確認
```ps -ef | grep _orcl```
```
------------------------------------------
 　稼働中プロセス確認結果_確かにヒットした
------------------------------------------
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ ps -ef | grep _orcl
oracle    3564 15558  0 04:30 pts/0    00:00:00 grep --color=auto _orcl
```
2.稼働中プロセスをkill
```$ for oud in $(ps -ef | awk '/_orcl/ {print $2}'); do kill -9 $pid; done```
```
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ for oud in $(ps -ef | awk '/_orcl/ {print $2}'); do kill -9 $pid; done
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
```
3.稼働中プロセスをkillできたか確認
```ps -ef | grep _orcl```
```
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ ps -ef | grep _orcl
oracle    7000 15558  0 04:41 pts/0    00:00:00 grep --color=auto _orcl
```
あれ？まだ残ってる！？？(;'∀')
上記方法で解決するエラーもあるが、今回は違うみたい・・

## 2-4. 解決策②
続いて、エラー文内の「**Oracle OPatch prereqfailedexception Prerequisite check CheckActiveFilesAndExecutables'' failed**」で検索してみた。

こんなありがたいドキュメントを発見。
[OPatchエラーの対処法: OUI-67073 Util Sessionが失敗しました: Prerequisite check"CheckActiveFilesAndExecutables" failed.](https://qiita.com/mtc465/items/fc9e3b54092a28245c7a)

```
----------------------
 　　エラー内容抜粋
----------------------
Following active files/executables/libs are used by ORACLE_HOME :/opt/oracle/product/19c/dbhome_1
/opt/oracle/product/19c/dbhome_1/bin/oracle




/opt/oracle/product/19c/dbhome_1/bin/tnslsnr
/opt/oracle/product/19c/dbhome_1/lib/libclntsh.so.19.1
/opt/oracle/product/19c/dbhome_1/lib/libasmclntsh19.so
UtilSession failed: Prerequisite check "CheckActiveFilesAndExecutables" failed.
```
恐らく、```oracle```、```tnslsnr```、```libclntsh.so.19.1```、```libasmclntsh19.so```のプロセスがアクティブになっていることが原因なので、PIDを特定し、killする。
①```/opt/oracle/product/19c/dbhome_1/bin/oracle```
```
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ /sbin/fuser /opt/oracle/product/19c/dbhome_1/bin/oracle
/opt/oracle/product/19c/dbhome_1/bin/oracle:  2618e  7990e 14015e 14019e 14023e 14030e 14036e 14042e 14046e 14049e 14051e 14054e 14059e 14063e 14067e 14077e 14081e 14090e 14099e 14103e 14109e 14113e 14121e 14125e 14127e 14131e 14138e 14142e 14154e 14159e 14161e 14165e 14168e 14259e 14261e 14263e 14265e 14270e 14274e 14276e 14278e 14280e 14282e 14284e 14286e 14288e 14530e 14532e 14899e 15694e 15713e 16009e 16196e 19615e 19620e 19625e 24423e 31045e
```
沢山プロセスが出てきた:scream:　→　すべてkill

②```/opt/oracle/product/19c/dbhome_1/bin/tnslsnr```
```
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ /sbin/fuser /opt/oracle/product/19c/dbhome_1/bin/tnslsnr
/opt/oracle/product/19c/dbhome_1/bin/tnslsnr: 12113e
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ ps -ef | grep 12113
oracle   12113     1  0 Apr25 ?        00:00:03 /opt/oracle/product/19c/dbhome_1/bin/tnslsnr LISTCDB2 -inherit
oracle   19669 15558  0 06:57 pts/0    00:00:00 grep --color=auto 12113
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ kill -9 12113
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ ps -ef | grep 12113
oracle   19884 15558  0 06:57 pts/0    00:00:00 grep --color=auto 12113
```
③```/opt/oracle/product/19c/dbhome_1/lib/libclntsh.so.19.1```
```
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ /sbin/fuser /opt/oracle/product/19c/dbhome_1/lib/libclntsh.so.19.1
/opt/oracle/product/19c/dbhome_1/lib/libclntsh.so.19.1: 19934m
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ ps -ef | grep 19934
oracle   19934     1  0 06:57 ?        00:00:00 /opt/oracle/product/19c/dbhome_1/bin/tnslsnr LISTCDB2 -inherit
oracle   21139 15558  0 07:01 pts/0    00:00:00 grep --color=auto 19934
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ kill -9 19934
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ ps -ef | grep 19934
oracle   21456 15558  0 07:02 pts/0    00:00:00 grep --color=auto 19934
```
④```/opt/oracle/product/19c/dbhome_1/lib/libasmclntsh19.so```
```
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ /sbin/fuser /opt/oracle/product/19c/dbhome_1/lib/libasmclntsh19.so
/opt/oracle/product/19c/dbhome_1/lib/libasmclntsh19.so: 21613m
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ ps -ef | grep 21613
oracle   21613     1  0 07:02 ?        00:00:00 /opt/oracle/product/19c/dbhome_1/bin/tnslsnr LISTCDB2 -inherit
oracle   21915 15558  0 07:03 pts/0    00:00:00 grep --color=auto 21613
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ kill -9 21613
[CDB1:oracle@dbhol:/opt/oracle/OPatch_new/35042068]$ ps -ef | grep 21613
oracle   21939 15558  0 07:04 pts/0    00:00:00 grep --color=auto 21613
```

ここまで全てプロセスを削除して、ようやくOPatch適用できた！！！！！！:sob:

# おわりに
パッチ適用の全貌は、以下の記事をご参照ください♬
- [Oracle Database 19cに最新パッチを適用してみた](https://qiita.com/shi6maSencho/items/9e672e4801436eca7663)