这个…不知道是镜像问题还是配置上有问题,Docker版的Oracle 11g在上次部署完之后已经出现了多次无法访问的情况(就是 registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g这个镜像),最后一次修复已经将连接数从150(默认)提升到8000,这次无法访问肯定不是连接数已满的问题。

遇事不要慌,先通过docker exec进入容器内部连接一下oracle数据库,看到的是

ORA-01034: ORACLE not available

这…难道是之前为了修改连接数直接关机导致日志无法归档么?

上网查了些资料,最终通过如下步骤解决的:

  1. 先用sqlplus使用sysdba权限访问连接数据库
[oracle@e156e1b777f5 -]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.1.0 Production on Sun Nov 14 13:36:28 2021Copyright (c) 1982, 2009, Oracle. All rights reserved.Connected to an idle instance.
  1. 查询v$log看看能否正常查询到日志信息
SQL> select * from v$log;select × from v$logERROR at line 1:ORA-01034: ORACLE not availableProcess ID: 0Session ID: 0 Serial number: 0
  1. 在发现报ORA-01034: ORACLE not available错误后,我们再试试操作resetlogs
SQL> alter database open resetlogs;alter database open resetlogs*ERROR at line 1:ORA-01034: ORACLE not availableProcess ID: OSession ID: 0 Serial number: 0

要注意,这里使用resetlogs方式打开数据库对oracle进行恢复是存在风险的,如果日志文件没有损坏的情况下可以直接恢复就可以了,这次的情况比较麻烦,所以才想用这种方式进行。

  1. 既然所有操作都报错了,就先关闭实例
SQL> shutdown immediate;ORA-01034: ORACLE not available ORA-27101: shared memory realm does not existLinux-x86 64 Error: 2: No such file or directory
  1. 重新挂载启动
SQL> startup mount;ORACLE instance started.Total System Global Area 1603411968 bytesFixed Size2213776 bytesVariable Size1342179440 bytesDatabase Buffers251658240 bytesRedo Buffers7360512 bytesDatabase mounted.
  1. 重启之后再尝试使用resetlogs打开数据库
SQL> alter database open resetlogs;alter database open resetlogsERROR at line 1:ORA-01139: RESETLOGS option only valid after an incomplete database recovery

这里又是一个ERROR,先不要管它继续下一步操作

  1. 这时我们又再查一次v$log


如上图所示,通过v$log得知日志只记录到昨天(11月13日),还好不是生产环境的一天的时间还能够接受。

  1. 通过recover database命令进行数据恢复
SQL> recover database until time '2021-11-13 00:00:00'ORA-10879: error signaled in parallel recovery slaveORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error belowORA-01194: file 1 needs more recovery to be consistentORA-01110: data file 1: '/home/oracle/app/oracle/oradata/helowin/systeml.dbf'

嗯…没有头绪还是先“重启”吧

SOL> shutdown;ORA-01109: database not openDatabase dismounted.ORACLE instance shut down.SOL> startupORACLE instance started.Total System Global Area 1603411968 bytesFixed Size2213776 bytesVariable Size1342179440 bytesDatabase Buffers251658240 bytesRedo Buffers7360512 bytesDatabase mounted.ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

这次连启动也报错,真是“一波未平一波又起”。

  1. sqlplus再查询一次l日志


既然这样就手动redo一次吧。

  1. 执行recover database


执行完了之后再open resetlogs就可以了

SQL> alter database open resetlogs;Database altered.

为了使操作完全生效决定重启了一下oracle

SQL> shutdown immedate;SP2-0717: illegal SHUTDOWN optionSQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SOL> startup;ORACLE instance started.Total System Global Area 1603411968 bytesFixed Size2213776 bytesVariable Size1342179440 bytesDatabase Buffers251658240 bytesRedo Buffers7360512 bytesDatabase mounted.Database opened.

这样就搞定了。