记录一次Oracle日志listener.log文件大小超过4G后出现Tomcat服务启动一直报错的原因【ORACLE】

记录一次Oracle日志listener.log文件大小超过4G后出现Tomcat服务启动一直报错的原因

排查Web服务器:

报错信息:java.sql.SQLRecoverableException: IO 错误: The Network Adapter could not establish the connection。 PoolManager中拿数据库链接时出错

排查Db服务器:

发现数据库链接不上,初步判断是数据库服务器的问题,

检查监听等文件都没有改动过,突然就不行了。

经排查,D:\app\Administrator\diag\tnslsnr\oadb-newBPM\listener\trace目录下的文件

listener.log日志文件超过4GB,导致往里面写时很慢,故而OA出现卡死现象。

具体原因解析如下:

Oracle 的 listener.log 文件本身不会因为大小超过 4GB 而直接导致监听器(Listener)进程异常或崩溃。
详细解释:

文件大小限制: 现代操作系统(如 Linux, Windows, Unix)的主流文件系统(如 ext4, xfs, ntfs)对单个文件的大小限制远大于 4GB。因此,从操作系统层面看,listener.log 文件增长到 4GB 甚至几十 GB 通常是被允许的,不会因为"太大"而无法写入。

监听器功能: Oracle 监听器的主要功能是接收客户端连接请求并将其分发到相应的数据库实例。日志文件 (listener.log) 仅用于记录这些连接活动、错误信息和状态变更。监听器的核心功能与其日志文件的大小没有直接关联。

但是,一个过大的 listener.log 文件会带来严重的间接问题和风险:

磁盘空间耗尽: 这是最直接、最严重的风险。如果 listener.log 持续增长,最终会耗尽所在的磁盘分区空间。这不仅会影响监听器(无法写入新日志),更可能导致数据库实例(无法写入数据文件、重做日志、归档日志等)或其他关键系统组件因无空间而挂起或崩溃。

• 性能影响:

I/O 压力: 持续写入一个巨大的日志文件会增加磁盘 I/O 负载。

文件操作缓慢: 当需要查看或处理这个巨大的日志文件时(例如用 vi, cat, grep 命令),系统会非常缓慢,甚至可能卡死。

备份与归档困难: 大文件会使备份和归档操作变得耗时且占用大量网络和存储资源。

维护困难: 一个 4GB 或更大的日志文件极难分析。查找特定的错误信息或连接问题会变得非常困难,降低了日志文件的实用价值。

潜在的旧系统/文件系统问题: 在非常陈旧的系统或使用 FAT32 等老式文件系统时,确实存在 4GB 的文件大小限制。但在现代 Oracle 运行环境中,这种情况极为罕见。
最佳实践:

为了避免上述问题,强烈建议对 listener.log 文件进行定期管理:

日志轮转 (Log Rotation):

手动轮转 :停止监听器 (lsnrctl stop),重命名 listener.log(如改为 listener.log.bak),然后启动监听器 (lsnrctl start)。启动后会自动创建新的 listener.log。

自动轮转 :使用操作系统的日志轮转工具(如 Linux 的 logrotate)来自动化此过程。可以配置为按大小(如 100MB)或按时间(如每周)进行轮转,并自动压缩旧日志。

清理旧日志 : 在轮转后,应定期清理或归档旧的、不再需要的日志文件,以释放磁盘空间。

监控 : 将 listener.log 文件的大小纳入日常监控范围,设置告警阈值(例如超过 1GB 就告警),以便及时处理。
总结:

listener.log 超过 4GB 不会直接导致 Oracle 监听器异常,但它是一个严重的警告信号,表明日志管理缺失,存在耗尽磁盘空间和引发系统级故障的重大风险。应立即采取措施进行日志轮转和清理,并建立长效机制。

最终解决办法:

手动轮转方式:停止监听器 (lsnrctl stop),重命名 listener.log(如改为 listener20251022.log.bak),然后启动监听器 (lsnrctl start)。启动后会自动创建新的 listener.log。

至此已把listener.log用了4G大文件备份后,重新使用新的listener.log日志文件,这样不会导致IO读写慢了。

PS:命令说明如下
ALTER SYSTEM REGISTER; 是一个用于Oracle数据库的SQL命令。

它的主要作用是:

强制PMON(Process Monitor)进程立即向监听器(Listener)注册数据库服务。

通常情况下,PMON进程会每隔一段时间(通常是1分钟)自动向监听器注册一次数据库实例信息。但在某些场景下,你可能需要立即进行注册,而不是等待下一次自动注册,这时就可以使用这个命令。

常见使用场景:

重启监听器后 : 当你重启了Oracle监听器(lsnrctl stop 然后 lsnrctl start)后,数据库实例不会立即重新注册。你可以使用 ALTER SYSTEM REGISTER; 来让数据库立刻向新的监听器进程注册。

连接问题排查 : 当客户端报告"ORA-12514: TNS:listener does not know of service requested in connect descriptor"错误时,这通常意味着监听器不知道你要连接的服务名。执行此命令可以尝试解决该问题。

动态服务注册未及时生效时 : 在配置了动态服务注册的情况下,如果新创建的服务名没有及时出现在监听器中,可以手动触发注册。
如何执行

你需要以具有相应权限的用户(如 SYSDBA)身份连接到数据库,然后执行该命令。

Sql

编辑
-- 使用SQL*Plus或SQL Developer等工具连接

复制代码
CONNECT sys/password AS SYSDBA;

-- 执行注册命令

复制代码
ALTER SYSTEM REGISTER;

验证是否注册成功

执行命令后,可以在服务器上运行以下命令来检查监听器状态和服务注册情况:

Bash

编辑

复制代码
lsnrctl status

在输出中查找你的数据库服务名,确认其状态为 (READY) 或 (UNKNOWN)。


总结: ALTER SYSTEM REGISTER; 是一个简单但非常有用的诊断和管理命令,用于强制Oracle数据库立即向监听器注册,常用于解决连接问题或在维护后快速恢复服务可用性。

相关推荐
倒流时光三十年20 分钟前
PostgreSQL Semi-Join(半连接)通俗讲解
数据库·postgresql
NiceCloud喜云1 小时前
腾讯云国际版云数据库选型:MySQL、Redis 怎么按业务架构来判断
数据库·mysql·腾讯云
ew452181 小时前
MySQL JOIN 关联语法、差异、标准用法、经典坑点汇总
数据库·mysql
Rain的Java大神之路2 小时前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
Nturmoils2 小时前
给运营导个 CSV,在 ksql 里用 \copy 就够了
数据库
ciqingloveless2 小时前
Oracle打开数据库加密
数据库·oracle
counting money2 小时前
Tomcat 专题:从基础架构到性能调优与 WebSocket 实战
java·websocket·tomcat
m0_462605223 小时前
大模型week02
数据库
DBA_G3 小时前
GBase 8a数据库集群多维度资源管控策略矩阵解析
数据库·oracle
逐米时代4 小时前
智能招聘与人岗匹配:可解释匹配让录用依据有迹可循
大数据·数据库·人工智能