Oracleのパッチ適用周りのメモ

Oracle Database、Oracle Grid InfrastructureへのPSU適用のメモ。

環境は以下の通り。

| ソフトウェア | バージョン |
|---|---|
|Oracle Dtabase 11g R2 |11.2.0.4.0|
|Oracle Grid Infrastructure 11g|11.2.0.4.0|
|opatch|11.2.0.3.15|
クラスタ構成ではなく、シングルインスタンスでの構成。

# oplan
パッチ適用の手順を自動生成してくれるユーティリティ。

$ORACLE_HOME/OPatch/oplan/READM.html より。
>
OPlanは、ご使用の環境に固有のステップ・バイ・ステップのパッチ適用手順を提供することにより、パッチのインストール・プロセスを容易にするユーティリティです。

>従来のパッチ操作とは異なり、ReadMeに基づいてパッチを適用するには、ターゲット構成を理解し、環境に関連するパッチ適用コマンドを手動で特定する必要があります。 OPlanは、ターゲットの構成情報を自動的に収集し、ターゲット構成に固有の命令を生成することによって、これらの要件を排除します。

>この手順では、パッチ適用とパッチのロールバックの両方の手順について説明します。この手順では、インプレースおよびアウトオブプレイス方法論の複数のパッチ適用オプションもカバーしています。

適用手順、ロールバック手順を自動生成してくれる。

```
適用手順
$ORACLE_HOME/OPatch/oplan/oplan generateApplySteps <bundle patch location>
ロールバック
$ORACLE_HOME/OPatch/oplan/oplan generateRollbackSteps <bundle patch location>
```

※対象が、以下になっている点注意。(シングルインスタンスのDBは対象外)
・Oracle Grid Infrastructure and Real Application Cluster Database
・Oracle Exadata Database Machine


# opatch(最新化の手順)
ORACLE_HOME配下のOpatchディレクトリをマルっと入れ替えてしまって最新化する。
DB、GRIDの双方のORACLE_HOME配下で最新化が必要。
$ORACLE_HOME/OPatchを追加しておくのがベター。

# opatch(オプション)
参考資料
[Oracle® Database 2日でReal Application Clustersガイド11gリリース2(11.2)](https://docs.oracle.com/cd/E16338_01/rac.112/b56291/softpatch2.htm)
[Oracle® OPatchユーザーズ・ガイドリリース12.1 for Windows and UNIX](https://docs.oracle.com/cd/E26854_01/doc.121/e49737/opatch_commands.htm)

## version
Opatchのバージョンを出力します。
PSU適用の前提条件としてOPatchのバージョンがxx以上と言った指定がある。

```
[grid@node1 ~]$ opatch version
OPatch Version: 11.2.0.3.15

OPatch succeeded.
```

## lsinventory
システムに現在何がインストールされているかをリストします。
```
$ORACLE_HOME/OPatch/opatch lsinventory -detail -oh $ORACLE_HOME
```
-detail
インストールされている製品およびその他の詳細をレポートします。-allオプションとともに使用することはできません。
-oh
デフォルト・ディレクトリのかわりに使用するGI/RACホーム・ディレクトリを指定します。環境変数ORACLE_HOMEよりも優先されます。

## lspatches
インストールされているすべてのパッチの概要を出力します。

```
[grid@node1 ~]$ opatch lspatches

24732075;Database Patch Set Update : 11.2.0.4.170418 (24732075)
22502505;ACFS Patch Set Update : 11.2.0.4.160419 (22502505)
23054319;OCW Patch Set Update : 11.2.0.4.160719 (23054319)
```

## prereq 
ORACLE_HOMEでパッチ適用の前提条件チェックを実行します。

```
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /tmp/oracle/src/<OPatch> -oh $ORACLE_HOME
```

CheckConflictAgainstOHWithDetail
競合およびスーパーセットに関する詳細情報を確認することにより、適用されるパッチとOH内のパッチの間に競合が存在するかどうかを確認します。
-phBaseDir
このオプションは、適用されるすべてのパッチが保持されているベース・ディレクトリのパスを指定するために使用できます。注意: このディレクトリには、圧縮または解凍形式の重複しないパッチのみを格納する必要があります。
※解凍前のファイルでも使用できる。但し、処理速度はやはり解凍していた方が早い。
-oh
処理するGI/RACホーム。環境変数ORACLE_HOMEよりも優先されます。

## nappply
n個のパッチをインストールします(したがって、napplyとなります)。
```
$ORACLE_HOME/OPatch/opatch napply -local 
```
-local
OPatchがローカル・ノードにパッチを適用し、ローカル・ノードのインベントリを更新する必要があることを指定します。パッチまたはインベントリ更新は他のノードに伝播されません。

# emocmrspコマンド
レスポンス・ファイルの作成を行う。
opatch autoコマンド実行時にOCMレスポンスファイルが必要。

```
$ORACLE_HOME/OPatch/ocm/bin/emocmrsp
```

# opatch auto
https://docs.oracle.com/cd/E28389_01/doc.1111/b61412/opatch.htm#CBHEFGJJ
パッチ適用前の事前検証、複数の製品を跨いでの一括のパッチ適用(DBとGI)をおこなってくれるもの。
デフォルトでローリングパッチの形式で適用する様な形となっている模様(つまりローカルノードだけに範囲が限定されている模様。Opatchコマンドを実行するとデフォルトでは全ノードに対して適用が行われた)

```
/u01/app/11.2.0/grid/OPatch/opatch auto /tmp/oracle/src/<Opatch> -rollback -ocmrf /tmp/oracle/src/ocm.rsp
```
-ocmrf
ocmrfオプションは、Oracle Configuration Manager (OCM)レスポンス・ファイルの絶対パスを指定します。ターゲットGI/RACホームでOCMをインストールして構成していない場合に必要です。

# catbundle.sql
Introduction To Oracle Database catbundle.sql (ドキュメントID 605795.1)

パッチ適用の過程で実行するsql。
ざっくりとこんな感じ。

>・パッチの一部であるスクリプトファイル（.sql、.plb）をデータベースにロードする為に使用する。
  これは、opatchが新しいSQLファイルとバイナリでORACLE_HOMEの更新を完了し、データベースが起動した後に実行されることを意味します。
>・dba_registry_historyビューに行を追加して、どのパッチバンドルが適用されたかを記録します

パラメータは2つ有り、どちらも必須。
```@catbundle <bundle series> <patch mode>```
bundle series
PSU、CPU、WINDOWSなど。文字通りパッチの種類
patch mode
applyかrollbackのどちらか。

## PatchとUnique Patch IDの相違について
lsinventoryでパッチ一覧を出力した際に気になった部分。

```
Patch  24732075     : applied on Thu May 11 13:15:49 JST 2017
Unique Patch ID:  21176096
Patch description:  "Database Patch Set Update : 11.2.0.4.170418 (24732075)"
```

Patch
パッチのファイル名のpxxxの部分。
Unique Patch ID
プラットフォームを通じての固有の値？公式情報では無くちょっと怪しい。