Docker容器中Oracle 12C空闲实例频繁停止问题排查
问题原因及解决思路
1. Docker容器Shell配置未生效
docker exec -it进入容器时,默认是交互式非登录Shell,这类Shell只会加载~/.bashrc,不会自动加载~/.bash_profile。如果你的ORACLE_SID仅配置在.bash_profile中,或者.bashrc没有引入.bash_profile的内容,就会导致每次新会话都需要手动执行export命令。
验证方式:进入容器后执行echo $ORACLE_SID,若输出为空则说明配置未生效。
解决办法:
- 在
~/.bashrc末尾添加source ~/.bash_profile,让交互式Shell继承登录Shell的配置; - 直接将
export ORACLE_SID=ORCLCDB写入~/.bashrc文件。
2. Oracle数据库未随容器自动启动
Docker容器启动时,默认不会自动启动Oracle数据库实例。你每次手动执行startup能临时启动数据库,但容器重启或会话退出后,数据库会停止运行,监听器自然没有可关联的服务。
解决办法:
- 编写容器启动脚本,让容器启动时自动拉起数据库和监听器。例如创建
/startup.sh脚本:
修改Dockerfile或启动容器时指定该脚本为入口命令,确保容器启动阶段自动执行。#!/bin/bash export ORACLE_HOME=/u01/app/oracle/product/12.2.0.1/dbhome_1 export ORACLE_SID=ORCLCDB lsnrctl start sqlplus / as sysdba << EOF startup; exit; EOF tail -f $ORACLE_HOME/diag/rdbms/orclcdb/ORCLCDB/trace/alert_ORCLCDB.log
3. 监听器未自动注册数据库服务
Oracle 12C默认依赖动态注册机制,数据库启动后会自动将服务注册到监听器,但如果LOCAL_LISTENER参数配置错误,或者监听器启动后数据库未触发注册,就会出现监听器无服务的情况。
验证方式:登录数据库后执行show parameter local_listener;,若参数值为默认的(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)),但容器内部主机名或IP并非localhost,则会导致注册失败。
解决办法:
- 修改
LOCAL_LISTENER参数为容器实际的主机名或IP,手动触发注册:alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=容器IP或主机名)(PORT=1521))' scope=both; alter system register; - 或者配置静态注册,在
$ORACLE_HOME/network/admin/listener.ora中添加:
之后重启监听器:SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ORCLCDB) (ORACLE_HOME = /u01/app/oracle/product/12.2.0.1/dbhome_1) (SID_NAME = ORCLCDB) ) )lsnrctl restart。
内容的提问来源于stack exchange,提问作者Zakaro
相关产品推荐
相关产品推荐

