我正在使用免費的 Oracle 23c Docker 容器(看這裡)以幫助提供開發環境。
作為環境配置的一部分,我將腳本和 SQL 放入/docker-entrypoint-initdb.d/startup
docker-compose.yml 檔案中的 using 配置中。
其中一個腳本是設定 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 發布
版權所有 (c) 1991、2023,Oracle。版權所有。
連線至(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_FREE))) 偵聽器的狀態------------------------ 別名偵聽器適用於 Linux 的 TNSLSNR 版本:版本 23.0.0.0.0 - 開發人員發佈開始日期
2023 年 9 月 14 日 08:27:37 正常運作時間 0 天 0 小時。 0分鐘2 秒追蹤等級關閉 安全開啟:本機作業系統驗證 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)tc HOST=0.0.0.0) (PORT=1521))) 服務摘要...服務「免費」有 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 發布
版權所有 (c) 1991、2023,Oracle。版權所有。
連線至(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_FREE))) 偵聽器的狀態------------------------ 別名偵聽器適用於 Linux 的 TNSLSNR 版本:版本 23.0.0.0.0 - 開發人員發佈開始日期
2023 年 9 月 14 日 08:32:46 正常運作時間 0 天 0 小時。 0分鐘10 秒追蹤等級關閉 安全開啟:本機作業系統驗證 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)tc HOST=0.0.0.0) (PORT=1521))) 服務摘要...服務「免費」有 1 個實例。實例“FREE”,狀態 READY,有 1 個用於此服務的處理程序...服務“PLSExtProc”有 1 個實例。實例“PLSExtProc”,狀態未知,有 1 個用於此服務的處理程序...指令成功完成
答案1
參數不能compatibility
調低,只能調高;所以這導致資料庫無法啟動;因此偵聽器被阻止