OPatchを使用してパッチを適用してみた

# はじめに
今回は以前にインストールしたOracle Database 21c(21.3.0.0.0)にOPatchを使用してOracle Database 21.5.0.0.0へのRU(Release Update)のパッチを適用した。失敗例なども含めて実行した手順を紹介する。
Oracle Database 21c(21.3.0.0.0)のインストール方法に関しては以下の記事を参考にするとよい。

https://qiita.com/tk_miya/items/afc1390717816a87408e

# 事前準備
## MOS(My Oracle Support)から適用するパッチをダウンロードする
パッチのファイルをダウンロードするためMOS(My Oracle Support)へアクセスする。
※MOSを使用するためにはサポート契約の上、登録が必要である。MOSに関する情報は[こちら]
(https://docs.oracle.com/cd/E26121_01/doc.60/e58519/toc.htm)。
Patches & Updatesのタブをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511285/83236bfe-6b5b-73c2-f8a7-24810de66e5c.png)
"Search"タブの"Product or Family(Advanced)"をクリックし、検索したい製品名とリリースをプルダウンから指定する。今回は以下のように選択した。選択後"Search"ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511285/2ad88304-f2b3-c8b6-4e9f-5b0c524f6eaa.png)
パッチの検索結果から適用したいパッチを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511285/7a3c6f27-5102-8fd9-8e12-baebd8328572.png)
"Download"をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511285/6f88a95c-fc6a-8e98-6c57-2c02f1da0632.png)
ダウンロードリンクをクリックしてダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511285/808c894d-fcc4-1942-cc43-b9a46e47f41c.png)
これでダウンロード完了。
## パッチファイルをローカルマシンから仮想マシンに移行する
WinSCPを使用してローカルマシンからOracle Database 21c(21.3.0.0.0)がインストールされている仮想マシン(Oracle Linux 8)のoracleユーザーのホームディレクトリにダウンロードしたパッチファイルを移行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511285/a0ced262-15d4-334d-51fc-088b75a6b15f.png)
## データベースとリスナーを停止する
今回適用するパッチはデータベースとリスナーを停止する必要があるため以下の操作をそれぞれ行う。
リスナーを停止するため、oracleユーザーで```ORACLE_HOME/bin```ディレクトリで以下のコマンドを実行する。

```oracle:oracleユーザー
lsnrctl stop listener_name
```
※ listener_nameに登録してあるリスナー名を入力する。リスナー名は``ORACLE_BASE/homes/Oracleホーム名/network/admin/listenernames.ora``で確認できる。Oracleホーム名は任意であるが、インストーラーによってOraDB21Home1で自動的に命名される。


データベースを停止するため、sysユーザーでSQL*Plusにログインして以下のコマンドを実行する。

```oracle:SQL*Plus
SHUTDOWN IMMEDIATE
```

## PATHを通す
以下を実行してOPatchの実行に必要なPATHを通す。既に設定済みであれば不要である。

```oracle:oracleユーザー
export PATH=$PATH:/u01/app/oracle/product/21.3.0/dbhome_1/OPatch
export ORACLE_HOME=/u01/app/oracle/product/21.3.0/dbhome_1
```

## ディレクトリを作成する
ローカルマシンから移行したパッチファイルを解凍するためのディレクトリをoracleユーザーで任意の場所に作成する。今回は``/home/oracle``に作成した。

```oracle:oracleユーザー
mkdir patchdir
```

## パッチファイルを解凍する
作成したディレクトリに移動して、ローカルマシンから移行したパッチファイルを解凍する。

```oracle:oracleユーザー
cd /home/oracle/patchdir
unzip ~/file_name.zip
```

※ file_name.zipはパッチファイル名

```oracle:実行例
$ cd /home/oracle/patchdir
$ unzip ~/p33516412_210000_Linux-x86-64.zip
```

解凍後、パッチ番号がついたディレクトリが作成される。今回はpatchdirディレクトリに33516412ディレクトリが作成される。パッチを適用する際はこのディレクトリに移動して実行する。

# パッチを適用する
## 前提条件チェックprereqの実行
解凍したパッチファイルのディレクトリ（パッチ番号のディレクトリ）に移動して、前提条件チェックであるprereqコマンドを実行する。今回は実行例としてCheckConflictAgainstOHWithDetailコマンドを実行する。

```oracle:oracleユーザー
cd /home/oracle/patchdir/33516412
opatch CheckConflictAgainstOHWithDetail -ph ./
```

CheckConflictAgainstOHWithDetailは競合およびスーパーセットに関する詳細情報を確認することにより、適用されるパッチとOH内のパッチの間に競合が存在するかどうかを確認する。他にも様々な前提条件チェックのコマンドがある。
opatchのprereqコマンドの詳細に関しては[こちら](https://docs.oracle.com/cd/E26854_01/doc.121/e49737/opatch_commands.htm#CHDCGDBD)。

```oracle:実行例
$ opatch prereq CheckConflictAgainstOHWithDetail -ph ./
Oracle Interim Patch Installerバージョン12.2.0.1.26
Copyright (c) 2022, Oracle Corporation.  All rights reserved。

PREREQ session

Oracleホーム       : /u01/app/oracle/product/21.3.0/dbhome_1
中央インベントリ : /u01/app/oraInventory
   元           : /u01/app/oracle/product/21.3.0/dbhome_1/oraInst.loc
OPatchのバージョン    : 12.2.0.1.26
OUIのバージョン       : 12.2.0.9.0
ログ・ファイルの場所 : /u01/app/oracle/product/21.3.0/dbhome_1/cfgtoollogs/opatch/opatch2022-02-04_16-38-09午後_1.log

Invoking prereq "checkconflictagainstohwithdetail"

Prereq "checkConflictAgainstOHWithDetail" passed.

OPatch succeeded.

```

今回は当然であるが先に適用しているパッチがなかったためパッチの競合は確認できなかった。

## opatchの実行
opatchコマンドでパッチを適用する。

```oracle:oracleユーザー
cd /home/oracle/patchdir/33516412
opatch apply
```

```oracle:実行例
$ opatch apply
Oracle Interim Patch Installerバージョン12.2.0.1.26
Copyright (c) 2022, Oracle Corporation.  All rights reserved。


Oracleホーム       : /u01/app/oracle/product/21.3.0/dbhome_1
中央インベントリ : /u01/app/oraInventory
   元           : /u01/app/oracle/product/21.3.0/dbhome_1/oraInst.loc
OPatchのバージョン    : 12.2.0.1.26
OUIのバージョン       : 12.2.0.9.0
ログ・ファイルの場所 : /u01/app/oracle/product/21.3.0/dbhome_1/cfgtoollogs/opatch/opatch2022-02-04_16-39-40午後_1.log

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


The OPatch being used has version 12.2.0.1.26 while the following patch(es) require higher versions: 
Patch 33516412 requires OPatch version 12.2.0.1.28.
Please download latest OPatch from My Oracle Support.

UtilSessionが失敗しました: Prerequisite check "CheckMinimumOPatchVersion" failed.
Log file location: /u01/app/oracle/product/21.3.0/dbhome_1/cfgtoollogs/opatch/opatch2022-02-04_16-39-40午後_1.log

OPatch failed with error code 73

```

failedとなった。
失敗した原因は、
>The OPatch being used has version 12.2.0.1.26 while the following patch(es) require higher versions: 
Patch 33516412 requires OPatch version 12.2.0.1.28.
Please download latest OPatch from My Oracle Support.

パッチ33516412を適用するにはOPatchのバージョンが12.2.0.1.28以上である必要があるため、今使用しているOPatchのバージョン(12.2.0.1.26)では実行できないということ。つまり、MOSからOPatchの新しいバージョンをダウンロードしてくる必要がある。

# OPatchのバージョンを上げる
序盤に紹介した事前準備と手順がかぶるため説明を少々省略する。
MOSにアクセスして12.2.0.1.28以上のOPatchファイルをダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511285/383d542d-279d-8de9-2351-4fc157e25a14.png)
ダウンロードしたファイルをWinSCPでローカルマシンからOracle Databaseがインストールされている仮想マシンに移行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511285/ea837609-e859-6fad-2b2a-37b199f173a2.png)
ORACLE_HOMEにあるOPatchディレクトリを入れ替えるため、既存のOPatchディレクトリの名前を変更する。

```oracle:oracleユーザー
mv OPatch OPatch_old
```

ローカルマシンから移行したパッチファイルをORACLE_HOME上に解凍する。

```oracle:oracleユーザー
cd $ORACLE_HOME
unzip ~/file_name.zip
```

※ file_name.zipはパッチファイル名

```oracle:実行例
$ cd $ORACLE_HOME
$ unzip ~/p6880880_210000_Linux-x86-64.zip
```

以下のコマンドでバージョンを確認する。

```oracle:oracleユーザー
opatch version
```

```oracle:実行例
$ opatch version
OPatch Version: 12.2.0.1.29

OPatch succeeded.
```

これでOPatchが先ほどのエラーの修復条件を満たすバージョンに入れ替わった。

# パッチを適用する(2回目)
1回目と同様にopatchを実行する。

```oracle:oracleユーザー
cd /home/oracle/patchdir/33516412
opatch apply
```

```oracle:実行例
$ opatch apply
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511285/b9d9de6c-9b84-0bd3-82e1-96a7f6551a48.png)
Oracle Interim Patch Installerバージョン12.2.0.1.29
Copyright (c) 2022, Oracle Corporation.  All rights reserved。


Oracleホーム       : /u01/app/oracle/product/21.3.0/dbhome_1
中央インベントリ : /u01/app/oraInventory
   元           : /u01/app/oracle/product/21.3.0/dbhome_1/oraInst.loc
OPatchのバージョン    : 12.2.0.1.29
OUIのバージョン       : 12.2.0.9.0
ログ・ファイルの場所 : /u01/app/oracle/product/21.3.0/dbhome_1/cfgtoollogs/opatch/opatch2022-02-04_16-55-12午後_1.log

Verifying environment and performing prerequisite checks...
OPatch continues with these patches:   33516412  

続行しますか。[y|n]
y
User Responded with: Y
All checks passed.

ローカル・システムのこのORACLE_HOME以外で実行しているOracleインスタンスを停止してください。
(Oracleホーム = '/u01/app/oracle/product/21.3.0/dbhome_1')


ローカル・システムにパッチを適用する準備ができましたか。 [y|n]
y
User Responded with: Y
Backing up files...
個別パッチ'33516412'をOH '/u01/app/oracle/product/21.3.0/dbhome_1'に適用中
ApplySession: オプションのコンポーネント[ oracle.network.gsm, 21.0.0.0.0 ] , [ oracle.tfa, 21.0.0.0.0 ] , [ oracle.net.cman, 21.0.0.0.0 ] , [ oracle.ons.cclient, 21.0.0.0.0 ] , [ oracle.rdbms.ic, 21.0.0.0.0 ] , [ oracle.sdo.companion, 21.0.0.0.0 ] , [ oracle.duma, 21.0.0.0.0 ] , [ oracle.network.cman, 21.0.0.0.0 ] , [ oracle.ons.eons.bwcompat, 21.0.0.0.0 ] , [ oracle.jdk, 1.8.0.271.00 ] がOracleホームに存在しないか、上位バージョンが見つかりました。

コンポーネントoracle.rdbms.rsf, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.network.rsf, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.rdbms, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.dbjava.ic, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.dbjava.jdbc, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.dbjava.ucp, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.has.common.cvu, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.ldap.owm, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.ldap.rsf, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.ldap.rsf.ic, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.ldap.security.osdt, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.nlsrtl.rsf, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.oraml.server, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.rdbms.dbscripts, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.rdbms.deconfig, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.rdbms.rman, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.rdbms.rsf.ic, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.sqlplus, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.tfa.db, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.ons, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.ctx.rsf, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.sqlplus.ic, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.sdo.locator, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.assistants.server, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.sdo.locator.jrf, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.ldap.ssl, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.rdbms.dv, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.rdbms.scheduler, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.xdk.parser.java, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.xdk.rsf, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.ctx, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.rdbms.crs, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.sdo, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.rdbms.util, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.ons.ic, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.javavm.server, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.javavm.server.core, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.xdk, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.assistants.acf, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.rdbms.oci, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.assistants.deconfig, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.precomp.common, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.precomp.lang, 21.0.0.0.0にパッチを適用中...

コンポーネントoracle.jdk, 1.8.0.291.09にパッチを適用中...
Patch 33516412 successfully applied.
Log file location: /u01/app/oracle/product/21.3.0/dbhome_1/cfgtoollogs/opatch/opatch2022-02-04_16-55-12午後_1.log

OPatch succeeded.
```

今回は成功した。

# パッチ適用後の作業
## 適用されているパッチの確認
以下のコマンドでインストールされているすべてのパッチを確認することができる。

```oracle:oracleユーザー
opatch lspatches
```

```oracle:実行例
$ opatch lspatches
33516412;Database Release Update : 21.5.0.0.220118 (33516412)

OPatch succeeded.
```

以上より、パッチが適用されていることが確認できた。

## データベースとリスナーの起動
停止していたデータベースとリスナーを起動する。
データベースを起動するため、sysユーザーでSQL*Plusにログインして以下のコマンドを実行する。

```oracle:SQL*Plus
START UP
```
リスナーを起動するため、oracleユーザーで```ORACLE_HOME/bin```ディレクトリで以下のコマンドを実行する。

```oracle:oracleユーザー
lsnrctl start listener_name
```
※ listener_nameに登録してあるリスナー名を入力する。リスナー名は``ORACLE_BASE/homes/Oracleホーム名/network/admin/listenernames.ora``で確認できる。Oracleホーム名は任意であるが、インストーラーによってOraDB21Home1で自動的に命名される。

### Oracle Databaseのバージョンの確認
以下のようにSQL*PlusにログインするとOracle Databaseのバージョンが21.3.0.0.0から21.5.0.0.0に変わっていることが確認できる。

```oracle:oracleユーザー
$ sqlplus / as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on 月 2月 7 13:31:32 2022
Version 21.5.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.



Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.5.0.0.0
に接続されました。
SQL> 
```

以上で完了！