リプレイ・アップグレードを使用したOracle Databaseリリースのアップグレード

以前のリリースからアップグレードするには、Oracle Multitenant Replay Upgrade (リプレイ・アップグレード)プロシージャを使用して、非CDBをPDBに採用するか、PDBをアップグレードできます。

リプレイ・アップグレードを使用したCDBまたはPDBのアップグレード

リプレイ・アップグレードを使用してコンテナ・データベース(CDB)全体およびそのプラガブル・データベース(PDB)をアップグレードすることも、個々のPDBをアップグレードすることもできます。

アップグレードを開始する前に、次のステップを実行する必要があります。

  • 新しいリリースのOracle Databaseソフトウェアのインストール
  • 新しいOracleホームを準備します。
  • preupgradeパラメータを指定してAutoUpgradeを実行します。

ノート:

リプレイ・アップグレードを使用してPDBを接続し、PDBオープン時にPDBをアップグレードする場合、アップグレードするPDBの数は、Oracle Databaseで使用できるCPUコア(プロセッサ)の数を指定するOracle Database初期化パラメータCPU_COUNTの値の4分の1(¼)以下にすることをお薦めします。従来のアップグレードでは、一度にアップグレードされるPDBのデフォルト数は、CPU_COUNTの値の2分の1(½)以下です。

クラシック・アップグレード・ツールまたはAutoUpgradeユーティリティを使用して、Oracle Multitenant Replay Upgrade (リプレイ・アップグレード)メソッドを使用してアップグレードを完了できます。

クラシック・アップグレード・ツールを使用したリプレイ・アップグレード

CDB$ROOTおよびホストされているすべてのPDBを含めてCDB全体をアップグレードするには、パラレル・アップグレード・ユーティリティ(catctl.pl)を手動または暗黙的に実行するか、dbupgradeスクリプトを使用します。手順は以前のリリースと同じです。ただし、Oracle Database 21c以降では、アップグレード・ユーティリティにはデフォルトでリプレイ・アップグレード・プロシージャが使用されます。コマンド構文に変更はありません。

PDBプラグインでの自動アップグレードを使用した新しいリリースのCDBへのリプレイ・アップグレード

以前のリリースのPDBを新しいリリースのCDBに接続すると、CDBはPDBのオープン時にPDBがCDBより以前のリリースであることを検出し、リプレイ・アップグレード・プロセスを自動的に開始します。PDBオープン時のアップグレードでは、リプレイ・アップグレード同期化機能を使用してPDBを自動的にアップグレードします。この最適化により、PDBを制限モードで開いてエラーをPDB_PLUG_IN_VIOLATIONSビューに公開することが回避され、エラーを手動で修正する必要がなくなります。

リプレイ・アップグレードを有効または無効にする方法

デフォルトで、Oracle Multitenant Replay Upgrade (リプレイ・アップグレード)メソッドはPDBおよびCDBでのアップグレードに対して有効になっています。ただし、リプレイ・アップグレード・メソッドの使用を有効または無効にすることができます。

パラレル・アップグレード・ユーティリティ(catctl.pl)のデフォルトのリプレイ・アップグレードの実行を無効にするには、次のコマンドをCDB$ROOTまたは特定のPDBのいずれかで実行します。

ALTER DATABASE UPGRADE SYNC OFF

リプレイ・アップグレードの動作を再度有効にするには、次のコマンドを入力します。

ALTER DATABASE UPGRADE SYNC ON

パラレル・アップグレード・ユーティリティ(catctl.pl)のパラメータ-tを設定することで、非リプレイ・アップグレードを選択することもできます。これにより、従来のスクリプト方式を使用する非リプレイ・アップグレードが強制されます。

ノート:

CDB$ROOTに接続しているか、特定のPDBに接続しているかによって、CDB全体または個々のPDBでのリプレイ・アップグレード・メソッドの使用を管理できます。

  • UPGRADE SYNCCDB$ROOTOFFに設定されている場合、CDBに接続されているどのPDBにもリプレイ・アップグレード・メソッドは使用されません。
  • UPGRADE SYNCCDB$ROOTONに設定されているが、PDBでOFFに設定されている場合、リプレイ・アップグレード・メソッドは、UPGRADE SYNCOFFであるPDBに対して使用されません。ただし、リプレイ・アップグレード・メソッドは、CDBに接続されている他のすべてのPDBに対して使用されます。
  • UPGRADE SYNCCDB$ROOTONに設定され、すべてのPDBに対してONに設定されている場合(デフォルト)、リプレイ・アップグレード・メソッドはCDBに接続されているすべてのPDBに対して使用されます。

リプレイ・アップグレードを使用した非CDBからPDBへのアップグレードについて

Oracle Multitenant Replay Upgrade (リプレイ・アップグレード)メソッドを使用することにより、非CDBのOracle Databaseソフトウェアをマルチテナント・アーキテクチャにアップグレードするステップの一部を自動化できます。

リプレイ・アップグレード・メソッドは、このOracle Databaseリリースへの直接アップグレードがサポートされている以前のOracle Databaseリリースからのアップグレードに対してデフォルトで有効になっています。リプレイ・アップグレード・プロセスは、noncdb_to_pdb.sqlなどのスクリプトを実行する従来の方法とは異なります。非CDBの場合、DBMS_PDB.DESCRIBEを実行して非CDBを記述した後、新しいOracle Database CDBに非CDBを接続します。アップグレードのためのリプレイ・アップグレード・メソッドは、次の2つのステップで完了します。

  1. 非CDBデータベースは、新しいOracle Databaseリリースにアップグレードされます。
  2. 非CDBデータ・ディクショナリは、PDBデータ・ディクショナリに変換されます。

これらのステップはいずれも、ALTER PLUGGABLE DATABASE OPENを実行するときにトリガーされます。どちらのステップも、ディクショナリに格納されたSQL文を自動的に再生し、PDBへの非CDBの採用と、新しいリリースへのデータベースのアップグレードのタスクを完了します。

リプレイ・アップグレード・メソッドを使用する利点は、PDBのアップグレードと変換のために実行する必要があるアップグレード・ワークフローを大幅に簡略化できることです。非CDBからPDBへの暗黙的な変換により、Oracle Database 21cより前の非CDBおよびPDBの両方のOracle Databaseリリースを新しいリリースのCDBのPDBに採用およびアップグレードするプロセスが簡略化されます。

リプレイ・アップグレードを使用したPDBとしての非CDBの採用およびアップグレード

アップグレードを簡略化するには、Oracle Multitenant Replay Upgrade (リプレイ・アップグレード)メソッドを使用することにより、非CDBをPDBに採用(移動)およびアップグレードできます。

アップグレードを開始する前に、次のステップを実行する必要があります。

  • 新しいリリースのOracle Databaseソフトウェアのインストール
  • 新しいOracleホームを準備します。
  • preupgradeパラメータを指定してAutoUpgradeを実行します。

DBMS_PDBパッケージおよびリプレイ・アップグレード・メソッドを使用して非CDBをPDBとして採用するには、次の手順を実行します。

  1. CDBが存在しない場合は作成します。

  2. 非CDBがトランザクション上一貫した状態にあることを確認してください。

  3. 非CDBを読取り専用モードにします。

  4. 非CDBに接続し、DBMS_PDB.DESCRIBEプロシージャを実行して、非CDBを記述するXMLファイルを作成します。

    現行ユーザーには、SYSDBA管理権限が必要です。ユーザーは、接続時にAS SYSDBAを使用して権限を行使する必要があります。

    たとえば、ncdb.xmlという名前のXMLファイルを/disk1/oracleディレクトリに生成し、次のプロシージャを実行します。

    BEGIN
      DBMS_PDB.DESCRIBE(
        pdb_descr_file => '/disk1/oracle/ncdb.xml');
    END;
    /
    

    このプロシージャが正常に完了した後、XMLファイルおよび非CDBデータベース・ファイルを使用して、非CDBをCDBに接続できます。

  5. DBMS_PDB.CHECK_PLUG_COMPATIBILITYファンクションを実行して、非CDBがCDBと互換性があるかどうかを確認します。

    このファンクションを実行する場合は、次のパラメータを設定します。

    • pdb_descr_file - このパラメータをデータベース記述XMLファイルへのフルパスに設定します。

    • pdb_name - 新しいPDBの名前を指定します。このパラメータを省略した場合は、XMLファイル内のPDB名が使用されます。

    たとえば、/disk1/oracle/ncdb.xmlファイルで記述されている非CDBが現在のCDBと互換性があるかどうかを確認するには、次のPL/SQLブロックを実行します。

    SET SERVEROUTPUT ON
    DECLARE
      compatible CONSTANT VARCHAR2(3) := 
        CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
               pdb_descr_file => '/disk1/oracle/ncdb.xml',
               pdb_name       => 'NCDB')
        WHEN TRUE THEN 'YES'
        ELSE 'NO'
    END;
    BEGIN
      DBMS_OUTPUT.PUT_LINE(compatible);
    END;
    /
    

    出力がYESの場合は非CDBに互換性があり、次のステップに進むことができます。出力がNOの場合は、非CDBには互換性がありません。互換性がない理由を確認するには、ビューPDB_PLUG_IN_VIOLATIONSを確認します。続行する前に、すべての違反を修正する必要があります。たとえば、アップグレードを実行するか、datapatchユーティリティを実行して、バージョンまたはパッチの不一致をすべて解決する必要があります。違反を修正してから、DBMS_PDB.CHECK_PLUG_COMPATIBILITYを再度実行して、非CDBがCDBと互換性があることを確認します。

  6. 非CDBを停止します。

  7. 非CDBを接続します。

    たとえば、次のSQL文は非CDBをプラグインし、そのファイルを新しい場所にコピーして、非CDBからtbs3ユーザー表領域のみを含めます。

    CREATE PLUGGABLE DATABASE ncdb USING '/disk1/oracle/ncdb.xml'
      COPY
      FILE_NAME_CONVERT = ('/disk1/oracle/dbs/', '/disk2/oracle/ncdb/')
      USER_TABLESPACES=('tbs3');
    

    違反がない場合は、新しいPDBをオープンしないでください。これは、後のステップで開きます。

    USER_TABLESPACES句を使用すると、非CDB内の複数のテナントに使用されたデータを異なるPDBに分けることができます。この句を指定したCREATE PLUGGABLE DATABASE文を複数使用して、非CDBに存在する他の表領域のデータを含む別のPDBを作成できます。

  8. データベースを開くコマンドでリプレイ・アップグレードを実行できるようにするには、ALTER DATABASE PROPERTY SET UPGRADE_PDB_ON_OPEN='true'と入力します。たとえば:
    ALTER DATABASE PROPERTY SET UPGRADE_PDB_ON_OPEN='true';
  9. 新しいPDBに接続して、それを開きます。PDBが開かれるときに、データベースはアップグレードされ、非CDBデータベース・データ・ディクショナリがPDBに変換されます。たとえば:

    ALTER PLUGGABLE DATABASE OPEN

    Oracle Databaseでデータベースのアップグレードを完了するには、新しいPDBを開く必要があります。PDBを読取り専用モードでオープンしようとすると、エラーが返されます。PDBが開かれるときに、非CDBがPDBに採用され、データ・ディクショナリが変換されて、新しいPDBがCDBに統合されます。リプレイ・アップグレードからのメッセージは、トレース・ディレクトリに置かれます。PDBが開かれてリプレイ・アップグレードが完了すると、そのステータスはNORMALになります。

    アップグレードのステータスを確認するには、次のビューを問い合せます。
    • リプレイ・アップグレード・エラーを確認するには、ビューDBA_REPLAY_UPGRADE_ERRORSを使用します
    • 完全性をチェックするには、DBA_APPLICATIONSを使用します。app_name 'APP$CDB$CATALOG'値のapp_version値を確認します。この値は、PDBの新しいバージョンである必要があります。
    • ビューDBA_APP_ERRORSで文エラーをチェックします。このビューには、エラー・メッセージとエラーに関する文テキスト(app_statement)が表示されます。成功したアップグレードでは、このビューにapp_name='APP$CDB$CATALOG'の行が含まれていないことが必要です。
  10. datapatchを実行して、新しいPDBにパッチを適用します。

    datapatch -pdbs ncdb
  11. アップグレード後の修正を実行します。

    java -jar autoupgrade.jar -preupgrade "target_home=/u01/app/oracle/product/21.0.0/dbhome_1,dir=/autoupgrade/test/log,inclusion=ncdb" –mode postfixups
  12. PDBをバックアップします。

    PDBは、バックアップしないとリカバリできません。

ノート:

PDBの作成時にエラーが返された場合は、作成されたPDBがUNUSABLE状態である可能性があります。ビューCDB_PDBSまたはDBA_PDBSを問い合せることで、PDBの状態を確認できます。PDB作成のエラーについてさらに学習するには、アラート・ログを確認してください。使用できないPDBは削除するしかありません。PDBが使用できない場合は、使用できないPDBと同じ名前のPDBを作成する前にPDBを削除する必要があります。

リプレイ・アップグレード・プロセスの失敗とリカバリのシナリオ

Oracle Multitenant Replay Upgrade (リプレイ・アップグレード)のログ・ファイルおよびトレース・ファイル内のエラーと問題をチェックする方法を学習します。

リプレイ・アップグレードが失敗した場合、PDB_UPGRADE_SYNCプロパティはPDBに対して1つ減分されます。リプレイ・アップグレードが2回失敗すると、catctl.plは、アップグレードを完了するために従来のスクリプト・ベースのパラレル・アップグレード・プロシージャのメソッドを使用することになります。

リプレイ・アップグレード・エラーの原因を特定するには、エラーが発生した文のアップグレード・ログを確認します。リプレイ・アップグレード・プロシージャの実行後、正常に実行されたかどうかに関係なく、問合せDBA_APP_ERRORSが実行されます。その問合せの結果を確認して、エラーが発生した文の文テキストおよびエラー・メッセージを確認します。ログ内の特定のエラーを表示するには、grepコマンドを使用して'^ORA-'のテキスト文字列を検索し、アップグレード・ログを問い合せることもできます。

もう1つのリカバリ・オプションは、トレース・ファイル(.trc)を確認することです。トレース・ファイルには、リプレイ・アップグレード・プロシージャ中に実行された各文の出力が含まれています。ファイルには、文テキスト、文が成功したか失敗したか、エラー・メッセージ(該当する場合)およびプロセス中の経過時間が示されます。接頭辞文字列Replay Upgrade, PDB IDを含む行を探します。ここで、変数IDはPDB IDです。たとえば、Replay Upgrade, PDB 15です。