Oracle Databaseを安定して運用するためには、定期的にRelease Update(RU)を適用することが重要です。
RUには、Oracle Databaseで確認された不具合やセキュリティ上の問題に対する修正が累積して含まれています。
本記事では、Oracle Database 19cのシングル・インスタンス環境に対して、OPatchを使用してDatabase RUを適用する基本的な手順を解説します。
本記事の対象環境
本記事では、次の環境を想定しています。
OS :Oracle LinuxなどのLinux環境
Oracle Database :Oracle Database 19c
データベース構成 :シングル・インスタンス
Grid Infrastructure :なし
Oracle Restart :なし
パッチ種別 :Database Release Update
適用方式 :インプレース方式
次の環境は対象外です。
・Oracle RAC
・Oracle Restart
・Grid Infrastructure
・Data Guard
・Exadata
・Windows環境
・OJVM RU
・Database RUとOJVM RUのCombo Patch
Oracle Restartを使用している場合は、シングル・インスタンス構成であってもGrid Infrastructureホームが存在します。
その場合は、今回説明するopatch applyによるDatabaseホーム単体の手順とは異なるため注意してください。
また、実際のパッチ適用では、必ず対象RUに付属するREADMEを確認してください。
パッチ番号、必要なOPatchバージョン、競合パッチ、適用後の追加作業などは、RUごとに異なる可能性があります。
RUパッチ適用の全体像
Oracle Database 19cのRU適用は、大きく分けて次の2段階で行います。
Oracleホーム
│
│ opatch apply
▼
OracleバイナリへRUを適用
│
│ datapatch -verbose
▼
データベース内部へSQL変更を適用
opatch applyは、Oracleホーム内の実行ファイルやライブラリなどを更新します。
一方、datapatchは、データディクショナリやデータベースコンポーネントに必要なSQL変更を適用します。
そのため、opatch applyが正常終了しただけでは、RU適用作業は完了していません。
RUパッチ適用手順
全体の流れは次のとおりです。
1. RUとOPatchを準備する
↓
2. 現在のパッチ状態を確認する
↓
3. 競合チェックを実行する
↓
4. データベースとリスナーを停止する
↓
5. opatch applyを実行する
↓
6. データベースとPDBを起動する
↓
7. datapatchを実行する
↓
8. RUの適用結果を確認する
1.RUパッチとOPatchを準備する
Database RUとOPatchは、My Oracle Supportからダウンロードします。
RUのパッチ番号はリリースごとに異なるため、本記事では次のように表記します。
<DBRU_PATCH_ID>
ダウンロード時には、次の情報を確認します。
・Oracle Database 19c用のパッチであること
・対象OSとプラットフォームが正しいこと
・Database RUであること
・必要なOPatchの最低バージョン
特にLinux環境では、プラットフォームとして「Linux x86-64」など、対象サーバに対応したものを選択します。
OPatchのバージョンを確認する
Oracleソフトウェア所有者でログインします。
su - oracle
Oracle環境変数を設定します。
export ORACLE_SID=ORCL
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/OPatch:$ORACLE_HOME/bin:$PATH
OPatchのバージョンを確認します。
$ORACLE_HOME/OPatch/opatch version
出力例は次のとおりです。
OPatch Version: 12.2.0.1.xx
表示されたOPatchのバージョンが、RUのREADMEに記載されている要件を満たしていることを確認します。
要件を満たしていない場合は、RUを適用する前にOPatchを更新します。
OPatchを更新する
既存のOPatchディレクトリを退避します。
cd $ORACLE_HOME
mv OPatch OPatch_bak_$(date +%Y%m%d)
ダウンロードしたOPatchをOracleホームへ展開します。
unzip p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME
更新後のバージョンを確認します。
$ORACLE_HOME/OPatch/opatch version
Oracleインベントリを正常に読み取れることも確認します。
$ORACLE_HOME/OPatch/opatch lsinventory
2.RUパッチを展開する
RUを配置するディレクトリを作成します。
mkdir -p /u01/stage/oracle_patch
cd /u01/stage/oracle_patch
ダウンロードしたRUを展開します。
unzip p<DBRU_PATCH_ID>_190000_Linux-x86-64.zip
展開されたディレクトリを確認します。
ls -l
パッチディレクトリへ移動します。
cd /u01/stage/oracle_patch/<DBRU_PATCH_ID>
実際のディレクトリ構成はRUによって異なる可能性があります。
必ずREADMEに記載されたディレクトリでコマンドを実行してください。
3.現在のパッチ適用状況を確認する
RUを適用する前に、現在Oracleホームへ適用されているパッチを確認します。
$ORACLE_HOME/OPatch/opatch lsinventory
簡易的にパッチ一覧だけを表示する場合は、次のコマンドを使用します。
$ORACLE_HOME/OPatch/opatch lspatches
結果は、パッチ適用前後を比較できるようにファイルへ保存しておくと便利です。
mkdir -p /u01/work/patch_log
$ORACLE_HOME/OPatch/opatch lsinventory -detail \
> /u01/work/patch_log/lsinventory_before.txt
データベース内部へ適用済みのSQLパッチも確認します。
sqlplus / as sysdba
SET LINESIZE 250
SET PAGESIZE 100
COLUMN action_time FORMAT A30
COLUMN status FORMAT A15
COLUMN description FORMAT A90
SELECT patch_id,
patch_type,
action,
status,
action_time,
description
FROM dba_registry_sqlpatch
ORDER BY action_time;
opatch lsinventoryはOracleホームのパッチ状態を確認するために使用します。
DBA_REGISTRY_SQLPATCHは、datapatchによってデータベース内部へ適用されたSQLパッチを確認するために使用します。
4.既存パッチとの競合を確認する
新しいRUと、Oracleホームに適用済みの個別パッチが競合しないか確認します。
RUのパッチディレクトリで次のコマンドを実行します。
$ORACLE_HOME/OPatch/opatch \
prereq CheckConflictAgainstOHWithDetail -ph ./
競合がない場合は、前提条件チェックが正常終了したことを示すメッセージが表示されます。
競合が検出された場合は、そのままRUを適用してはいけません。
主に次のような対応が必要になります。
・既存の個別パッチをロールバックする
・新しいRU用のマージパッチを取得する
・新しいRUに既存パッチの修正が含まれているか確認する
・My Oracle Supportで競合内容を確認する
競合パッチへの対応は環境ごとに異なるため、READMEやMy Oracle Supportの情報に従って判断します。
5.データベースのバックアップを取得する
RU適用前には、問題発生時に切り戻せるよう、データベースのバックアップを取得します。
RMANを使用する場合の実行例は次のとおりです。
rman target /
BACKUP DATABASE PLUS ARCHIVELOG;
BACKUP CURRENT CONTROLFILE;
BACKUP SPFILE;
本番環境では、既存のバックアップ設計や運用ルールに従って取得してください。
必要に応じて、Oracleホームもバックアップします。
cd /u01/app/oracle/product/19.0.0
tar -czpf /u01/backup/dbhome_1_before_ru_$(date +%Y%m%d).tar.gz \
dbhome_1
Oracleホームをバックアップする場合は、データベースとリスナーを停止した後に取得するのが確実です。
6.データベースとリスナーを停止する
Oracle Databaseへ接続するアプリケーションやバッチ処理を停止します。
その後、データベースを停止します。
sqlplus / as sysdba
SHUTDOWN IMMEDIATE;
EXIT;
リスナーを停止します。
lsnrctl stop
リスナー名を明示する場合は、次のように実行します。
lsnrctl stop LISTENER
対象Oracleホームを使用しているプロセスが残っていないことを確認します。
ps -ef | grep -v grep | grep "$ORACLE_HOME"
Oracleインスタンスのプロセスも確認します。
ps -ef | grep -v grep | grep ora_
Oracleホーム内のファイルを使用しているプロセスが残っていると、OPatchがファイルを更新できずに失敗する可能性があります。
7.opatch applyでRUを適用する
RUのパッチディレクトリへ移動します。
cd /u01/stage/oracle_patch/<DBRU_PATCH_ID>
Oracle環境変数を確認します。
echo $ORACLE_HOME
echo $ORACLE_SID
which opatch
想定しているOracleホームが設定されていることを確認したら、RUを適用します。
$ORACLE_HOME/OPatch/opatch apply
実行中に確認を求められた場合は、表示されたOracleホームとパッチ番号を確認して続行します。
正常終了した場合は、最後に次のメッセージが表示されます。
OPatch succeeded.
エラーが発生した場合は、そのままデータベースを起動して作業を続行せず、画面に表示されたOPatchログを確認します。
8.OracleホームへのRU適用を確認する
opatch applyの実行後、OracleホームにRUが適用されたことを確認します。
$ORACLE_HOME/OPatch/opatch lspatches
詳細を確認する場合は、次のコマンドを実行します。
$ORACLE_HOME/OPatch/opatch lsinventory
適用したRUのパッチ番号が表示されていることを確認します。
結果をファイルへ保存します。
$ORACLE_HOME/OPatch/opatch lsinventory -detail \
> /u01/work/patch_log/lsinventory_after_opatch.txt
この時点では、OracleホームのバイナリにRUが適用された状態です。
データベース内部のSQL変更はまだ適用されていないため、続けてdatapatchを実行します。
9.データベースとPDBを起動する
データベースを起動します。
sqlplus / as sysdba
STARTUP;
CDB環境では、すべてのPDBをオープンします。
ALTER PLUGGABLE DATABASE ALL OPEN;
PDBの状態を確認します。
SET LINESIZE 200
SELECT name,
open_mode,
restricted
FROM v$pdbs
ORDER BY con_id;
出力例は次のとおりです。
NAME OPEN_MODE RESTRICTED
---------- ----------- ----------
PDB$SEED READ ONLY NO
PDB01 READ WRITE NO
PDB02 READ WRITE NO
datapatchは、原則としてオープンされているPDBに対してSQLパッチを適用します。
業務PDBが閉じた状態でdatapatchを実行すると、そのPDBにはSQL変更が適用されないため注意してください。
10.datapatchを実行する
OracleホームのOPatchディレクトリへ移動します。
cd $ORACLE_HOME/OPatch
事前確認として、使用しているdatapatchが対応している場合は、次のコマンドを実行します。
./datapatch -sanity_checks
重大な問題が表示されていないことを確認します。
続けて、datapatchを実行します。
./datapatch -verbose
datapatchは、Oracleホームに適用されているバイナリパッチを確認し、必要なSQL変更をCDBおよびオープン中のPDBへ適用します。
正常終了した場合は、最後に次のようなメッセージが表示されます。
SQL Patching tool complete
datapatchのログは、通常次のディレクトリ配下へ出力されます。
$ORACLE_BASE/cfgtoollogs/sqlpatch/
エラーが発生した場合は、datapatchの画面出力に表示されたログファイルを確認します。
11.SQLパッチの適用結果を確認する
datapatch実行後、DBA_REGISTRY_SQLPATCHを確認します。
sqlplus / as sysdba
SET LINESIZE 250
SET PAGESIZE 100
COLUMN action_time FORMAT A30
COLUMN status FORMAT A15
COLUMN description FORMAT A90
SELECT patch_id,
patch_type,
action,
status,
action_time,
description,
source_version,
target_version
FROM dba_registry_sqlpatch
ORDER BY action_time;
今回適用したRUについて、次の状態になっていることを確認します。
PATCH_TYPE :RU
ACTION :APPLY
STATUS :SUCCESS
STATUSがWITH ERRORSになっている場合は、正常終了していません。
ログファイルの場所を確認する場合は、次のSQLを実行します。
SELECT patch_id,
action,
status,
logfile
FROM dba_registry_sqlpatch
ORDER BY action_time;
エラー原因を解消した後、再度datapatchを実行します。
cd $ORACLE_HOME/OPatch
./datapatch -verbose
datapatchが失敗した場合、通常はopatch applyからやり直すのではなく、datapatchのエラー原因を解消して再実行します。
12.データベースの状態を確認する
データベースコンポーネントの状態を確認します。
SELECT comp_id,
comp_name,
version,
status
FROM dba_registry
ORDER BY comp_id;
原則として、各コンポーネントのSTATUSがVALIDであることを確認します。
無効オブジェクトも確認します。
SELECT owner,
object_type,
COUNT(*) AS invalid_count
FROM dba_objects
WHERE status = 'INVALID'
GROUP BY owner, object_type
ORDER BY owner, object_type;
パッチ適用によって無効オブジェクトが発生した場合や、READMEで再コンパイルが指示されている場合は、次のスクリプトを実行します。
@?/rdbms/admin/utlrp.sql
再コンパイル後、無効オブジェクト数を再度確認します。
13.リスナーを起動する
datapatchとデータベースの確認が完了したら、リスナーを起動します。
lsnrctl start
リスナーの状態を確認します。
lsnrctl status
データベースサービスが登録されていない場合は、次のSQLを実行します。
ALTER SYSTEM REGISTER;
再度リスナーの状態を確認します。
lsnrctl status
最後に、クライアントやアプリケーションからデータベースへ接続できることを確認します。
RU適用後の確認ポイント
RU適用後は、最低限次の内容を確認します。
Oracleホーム
└─ opatch lsinventoryにRUが表示される
データベース内部
└─ DBA_REGISTRY_SQLPATCHがAPPLY/SUCCESS
データベース状態
├─ CDBがOPEN
├─ 業務PDBがREAD WRITE
├─ DBA_REGISTRYがVALID
└─ 重大なエラーが発生していない
接続状態
├─ リスナーが起動している
└─ アプリケーションから接続できる
特に重要なのは、次の2点です。
opatch lsinventory
└─ Oracleホームへのバイナリ適用を確認
DBA_REGISTRY_SQLPATCH
└─ データベース内部へのSQL適用を確認
RUをロールバックする場合
RU適用後に重大な問題が発生した場合は、対象RUのREADMEに記載された手順に従ってロールバックします。
一般的な流れは次のとおりです。
データベースとリスナーを停止
↓
opatch rollback
↓
データベースとPDBを起動
↓
datapatch -verbose
↓
DBA_REGISTRY_SQLPATCHを確認
データベースとリスナーを停止します。
sqlplus / as sysdba
SHUTDOWN IMMEDIATE;
EXIT;
lsnrctl stop
RUのパッチIDを指定してロールバックします。
$ORACLE_HOME/OPatch/opatch rollback -id <DBRU_PATCH_ID>
データベースとPDBを起動します。
sqlplus / as sysdba
STARTUP;
ALTER PLUGGABLE DATABASE ALL OPEN;
EXIT;
datapatchを実行します。
cd $ORACLE_HOME/OPatch
./datapatch -verbose
ロールバック結果を確認します。
SELECT patch_id,
action,
status,
action_time,
description
FROM dba_registry_sqlpatch
ORDER BY action_time;
対象RUについて、次の状態になっていることを確認します。
ACTION :ROLLBACK
STATUS :SUCCESS
RUの種類や既存パッチの状態によってロールバック手順が異なる可能性があるため、実際の作業ではREADMEを優先してください。
よくある問題
OPatchのバージョンが古い
RUのREADMEに記載された最低OPatchバージョンを満たしていない場合、パッチ適用に失敗する可能性があります。
現在のバージョンを確認します。
$ORACLE_HOME/OPatch/opatch version
要件を満たしていない場合は、最新のOPatchへ更新します。
個別パッチとRUが競合する
競合チェックでエラーが発生した場合は、そのままopatch applyを実行してはいけません。
$ORACLE_HOME/OPatch/opatch \
prereq CheckConflictAgainstOHWithDetail -ph ./
必要に応じて、既存パッチのロールバックやマージパッチの取得を行います。
opatch applyだけ実行してdatapatchを忘れた
opatch applyだけを実行した場合、Oracleホームのバイナリは更新されていますが、データベース内部のSQL変更は適用されていません。
PDBをオープンし、datapatchを実行します。
ALTER PLUGGABLE DATABASE ALL OPEN;
cd $ORACLE_HOME/OPatch
./datapatch -verbose
一部のPDBにRUが適用されていない
datapatch実行時に対象PDBが閉じていた可能性があります。
対象PDBをオープンします。
ALTER PLUGGABLE DATABASE PDB01 OPEN;
datapatchを再実行します。
cd $ORACLE_HOME/OPatch
./datapatch -verbose
DBA_REGISTRY_SQLPATCHがWITH ERRORSになる
ログファイルを確認します。
SELECT patch_id,
action,
status,
logfile
FROM dba_registry_sqlpatch
WHERE status <> 'SUCCESS'
ORDER BY action_time;
エラー原因を修正した後、datapatchを再実行します。
cd $ORACLE_HOME/OPatch
./datapatch -verbose
まとめ
Oracle Database 19cのシングル環境へRUを適用する基本的な流れは、次のとおりです。
RUを展開
↓
競合チェック
↓
DB・リスナー停止
↓
opatch apply
↓
DB・PDB起動
↓
datapatch -verbose
↓
適用結果確認
RU適用では、次の2つの処理を区別して理解することが重要です。
opatch apply
└─ Oracleホームのバイナリを更新する
datapatch -verbose
└─ データベース内部のSQLを更新する
作業完了後は、次の両方を確認します。
opatch lsinventory
└─ RUがOracleホームへ適用されている
DBA_REGISTRY_SQLPATCH
└─ ACTIONがAPPLY
STATUSがSUCCESS
また、本記事は一般的なDatabase RUの適用手順を解説したものです。
実際の作業では、必ず対象RUに付属するREADMEを確認し、必要なOPatchバージョン、競合パッチ、適用コマンド、適用後作業を確認してから実施してください。
[参考]
Oracle Database Oracle Databaseパッチ・メンテナンス, リリース19c以降のリリース

コメント