手动重启gvenzl/oracle-xe:21-slim容器后持续重启并报数据文件缺失错误
问题
使用gvenzl/oracle-xe:21-slim镜像通过以下Docker Compose文件运行Oracle容器:
version: '2' services: oracle: image: gvenzl/oracle-xe:21-slim restart: always environment: - ORACLE_PASSWORD=root ports: - 1521:1521 volumes: - oracle-volume:/opt/oracle/oradata volumes: oracle-volume:
手动重启容器后,已创建的数据文件丢失,出现错误:
ORA-01157: cannot identify/lock data file 20 - see DBWR trace file ORA-01110: data file 20: '/opt/oracle/homes/OraDBHome21cXE/dbs/{filename}.dat'
容器持续自动重启,求解决办法?
解决办法
1. 停止故障容器
先停止当前循环重启的容器,避免操作冲突:
docker-compose down
2. 修正数据卷挂载配置
问题根源是你创建的数据文件被写入了容器内/opt/oracle/homes/OraDBHome21cXE/dbs目录,但该目录未被挂载到外部卷,重启容器后这部分数据直接丢失。修改Docker Compose,把该目录也加入挂载:
修改后的配置文件:
version: '2' services: oracle: image: gvenzl/oracle-xe:21-slim restart: always environment: - ORACLE_PASSWORD=root ports: - 1521:1521 volumes: - oracle-volume:/opt/oracle/oradata - oracle-dbs-volume:/opt/oracle/homes/OraDBHome21cXE/dbs volumes: oracle-volume: oracle-dbs-volume:
如果不想单独挂载多个目录,也可以直接挂载整个/opt/oracle目录(会包含容器内更多文件,按需选择):
version: '2' services: oracle: image: gvenzl/oracle-xe:21-slim restart: always environment: - ORACLE_PASSWORD=root ports: - 1521:1521 volumes: - oracle-volume:/opt/oracle volumes: oracle-volume:
3. 恢复现有数据(可选)
如果之前有重要数据未备份,先启动临时容器挂载原卷,尝试复制残留数据:
docker run -d --name temp-oracle -v oracle-volume:/opt/oracle/oradata gvenzl/oracle-xe:21-slim sleep 3600
进入临时容器查找并复制数据文件:
docker exec -it temp-oracle bash # 容器内执行复制操作,示例: cp /opt/oracle/oradata/your_backup/*.dat /opt/oracle/homes/OraDBHome21cXE/dbs/ # 退出后清理临时容器 docker stop temp-oracle && docker rm temp-oracle
4. 重新启动容器
用修改后的配置启动容器:
docker-compose up -d
5. 后续预防
- 创建表空间或数据文件时,明确指定路径到
/opt/oracle/oradata目录,避免写入容器内未挂载的路径 - 定期用
expdp等工具导出数据,做好备份
内容的提问来源于stack exchange,提问作者Hani Bikdeli
相关产品推荐
相关产品推荐

