Dockerコンテナ内でOracle 23cを再起動するとリスナーがブロックされる

Dockerコンテナ内でOracle 23cを再起動するとリスナーがブロックされる

私は無料のOracle 23c Dockerコンテナを使用しています(こちらをご覧ください) を利用して開発環境のプロビジョニングを支援します。

環境設定の一環として、/docker-entrypoint-initdb.d/startupdocker-compose.yml ファイルの設定を使用してスクリプトと SQL を配置しています。

これらのスクリプトの 1 つは、COMPATIBILITY パラメータ ( ALTER SYSTEM SET COMPATIBLE = '19.0.0' SCOPE=SPFILE;) を設定するもので、設定後はデータベースの再起動が必要になります。

サーバー データベースのインストールでは、互換性を設定するために SQL を実行し、その後に次のようなコマンドを実行します。

echo -e "shutdown immediate \n startup mount" | sqlplus -s / as sysdba

データベースを再起動するため。

ただし、これを Docker コンテナで実行すると (上記のように自動的に実行するか、コンテナ上の sqlplus に手動で接続して同じコマンドを実行するかに関係なく)、データベースが再起動すると、リストアは接続がブロックされた状態で戻り、データベースに接続できなくなります。

docker exec -ti app_db_1 lsnrctl status次のような結果になります。

Linux 用 LSNRCTL: バージョン 23.0.0.0.0 - 開発者リリース 2023 年 9 月 14 日 08:27:40

Copyright (c) 1991, 2023, Oracle. 無断複写・転載を禁じます。

(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_FREE))) に接続しています。 LISTENER のステータス ------------------------ エイリアス LISTENER バージョン TNSLSNR for Linux: バージョン 23.0.0.0.0 - Developer-Release 開始日
2023 年 9 月 14 日 8:27:37 稼働時間 0 日 0 時間 0 分2 秒 トレース レベル オフ セキュリティ オン: ローカル OS 認証 SNMP オフ デフォルト サービス
FREE リスナー パラメータ ファイル
/opt/oracle/product/23c/dbhomeFree/network/admin/listener.ora リスナー ログ ファイル
/opt/oracle/diag/tnslsnr/854ac05c3c0f/listener/alert/log.xml リスニング エンドポイント サマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_FREE)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521))) サービス サマリー... サービス "FREE" には 1 つのインスタンスがあります。 インスタンス "FREE"、ステータス BLOCKED、このサービスに対する 1 つのハンドラがあります... サービス "PLSExtProc" には 1 つのインスタンスがあります。インスタンス「PLSExtProc」、ステータスは不明、このサービスには 1 つのハンドラーがあります... コマンドは正常に完了しました

Instance "FREE", status BLOCKED出力のセクションに注意してください。

このようなことが起こらずに、コンテナ内でプログラムによってデータベースを再起動するにはどうすればよいでしょうか?

更新 - ログインして対話的に再起動を実行すると、次の内容が表示されます。

ORA-00201: 制御ファイルのバージョン 23.0.0.0.0 は、ORACLE バージョン 19.0.0.0.0 と互換性がありません ORA-00202: 制御ファイル: '/opt/oracle/oradata/FREE/control01.ctl'


再起動する前に、lsnrctl statusこれを返します:

Linux 用 LSNRCTL: バージョン 23.0.0.0.0 - 開発者リリース 2023 年 9 月 14 日 08:32:57

Copyright (c) 1991, 2023, Oracle. 無断複写・転載を禁じます。

(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_FREE))) に接続しています。 LISTENER のステータス ------------------------ エイリアス LISTENER バージョン TNSLSNR for Linux: バージョン 23.0.0.0.0 - Developer-Release 開始日
2023 年 9 月 14 日 8:32:46 稼働時間 0 日 0 時間 0 分10 秒 トレース レベル オフ セキュリティ オン: ローカル OS 認証 SNMP オフ デフォルト サービス
FREE リスナー パラメータ ファイル
/opt/oracle/product/23c/dbhomeFree/network/admin/listener.ora リスナー ログ ファイル
/opt/oracle/diag/tnslsnr/05cf8b8b6d41/listener/alert/log.xml リスニング エンドポイント サマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_FREE)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521))) サービス サマリー... サービス "FREE" には 1 つのインスタンスがあります。 インスタンス "FREE"、ステータス READY、このサービスに対する 1 つのハンドラがあります... サービス "PLSExtProc" には 1 つのインスタンスがあります。インスタンス「PLSExtProc」、ステータスは不明、このサービスには 1 つのハンドラーがあります... コマンドは正常に完了しました

答え1

パラメータを低く設定することはできずcompatibility、高く設定することしかできないため、データベースが起動せず、リスナーがブロックされる原因となっていました。

関連情報