ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Oracle 19c Failed Logon Delay问题分析与优化

Oracle 19c Failed Logon Delay问题分析与优化 1. Oracle 19c的Failed Logon Delay问题解析最近在Oracle 19c数据库的性能调优过程中我发现一个有趣的现象Failed Logon Delay失败登录延迟竟然在AWR报告的Top 5 Timed Events中排名第二。这个发现让我很惊讶因为通常我们会更关注像db file sequential read、log file sync这类常见的等待事件。那么为什么Failed Logon Delay会成为性能瓶颈它又该如何解决呢Failed Logon Delay是指当用户尝试登录Oracle数据库但失败时系统故意引入的延迟时间。这个机制主要是为了防止暴力破解攻击——如果有人尝试用大量不同的密码来猜测账户密码这个延迟会让攻击变得非常缓慢。在Oracle 19c中这个延迟默认是3秒看起来不长但如果你的应用有频繁的连接尝试特别是连接池配置不当的情况这个延迟就会累积成严重的性能问题。2. 为什么Failed Logon Delay会进入Top 22.1 连接池配置不当最常见的原因是应用连接池配置不合理。许多开发团队会设置过大的初始连接数或过高的最大连接数当应用启动时会一次性创建大量连接。如果数据库此时负载较高或者网络有问题部分连接可能会失败触发Failed Logon Delay。我曾经遇到一个案例一个Java应用配置了初始连接数为50最大连接数为200。当应用重启时50个连接同时尝试建立由于数据库服务器CPU当时已经接近90%使用率其中15个连接因超时而失败导致总共45秒的延迟15次×3秒。这直接影响了应用的启动时间。2.2 密码过期或错误另一个常见原因是密码问题。当用户密码过期或应用配置了错误的密码时每次连接尝试都会触发Failed Logon Delay。特别是在微服务架构中如果多个服务使用同一数据库账户而密码变更没有同步到所有服务这个问题会更加严重。2.3 网络问题导致连接中断不稳定的网络也可能导致连接在认证阶段失败从而触发延迟。我曾经排查过一个性能问题最终发现是数据库服务器和应用服务器之间的网络设备偶尔会丢弃TCP包导致认证过程失败。3. 如何诊断Failed Logon Delay问题3.1 检查AWR报告首先查看AWR报告的Top 5 Timed Events部分。如果看到Failed Logon Delay排名靠前就确认了这个问题的存在。SELECT * FROM ( SELECT event, total_waits, time_waited_micro/1000000 time_waited_secs, ROUND(time_waited_micro*100/SUM(time_waited_micro) OVER(),2) pct FROM dba_hist_system_event WHERE snap_id (SELECT MAX(snap_id) FROM dba_hist_snapshot) ORDER BY time_waited_micro DESC ) WHERE ROWNUM 5;3.2 检查失败登录尝试查询数据库的审计日志或失败登录记录SELECT username, os_username, userhost, terminal, TO_CHAR(ntimestamp#, YYYY-MM-DD HH24:MI:SS) timestamp, returncode FROM sys.aud$ WHERE returncode ! 0 ORDER BY ntimestamp# DESC;3.3 监控实时会话使用以下查询监控当前的失败登录尝试SELECT program, status, event, seconds_in_wait FROM v$session WHERE event Failed Logon Delay;4. 解决方案与优化建议4.1 调整连接池配置对于应用连接池建议减小初始连接数改为按需增长设置合理的连接验证查询validationQuery配置适当的连接超时和获取超时实现连接重试机制但要有适当的退避策略以Tomcat JDBC连接池为例推荐配置spring.datasource.tomcat.initial-size5 spring.datasource.tomcat.max-active50 spring.datasource.tomcat.test-on-borrowtrue spring.datasource.tomcat.validation-querySELECT 1 FROM DUAL spring.datasource.tomcat.validation-interval300004.2 调整Failed Logon Delay参数虽然不建议完全禁用这个安全特性但在受控的内网环境中可以适当减小延迟时间ALTER SYSTEM SET sec_protocol_error_further_actionDELAY,3 SCOPESPFILE; ALTER SYSTEM SET sec_protocol_error_trace_actionLOG SCOPESPFILE;修改后需要重启数据库生效。注意将延迟设为0会禁用这个保护机制不建议在生产环境这样做。4.3 密码管理最佳实践避免在多个应用间共享数据库账户实施密码轮换时确保所有相关应用同步更新考虑使用Oracle Wallet集中管理密码设置合理的密码过期策略避免大量密码同时过期4.4 网络优化确保数据库服务器和应用服务器之间的网络稳定检查防火墙设置确保不会干扰数据库连接考虑使用TCP keepalive防止连接中断5. 高级调优技巧5.1 使用服务指标监控配置Oracle服务指标来专门监控登录失败BEGIN DBMS_SERVER_ALERT.SET_THRESHOLD( metrics_id DBMS_SERVER_ALERT.LOGONS_CURRENT, warning_operator DBMS_SERVER_ALERT.OPERATOR_GE, warning_value 50, critical_operator DBMS_SERVER_ALERT.OPERATOR_GE, critical_value 100, observation_period 1, consecutive_occurrences 3, instance_name NULL, object_type DBMS_SERVER_ALERT.OBJECT_TYPE_SYSTEM, object_name NULL); END; /5.2 实现自定义审计创建更精细的审计策略捕获失败登录的详细信息AUDIT CREATE SESSION WHENEVER NOT SUCCESSFUL;5.3 使用FAN事件快速失败对于RAC环境配置Fast Application Notification (FAN)可以更快地检测和响应连接问题ALTER SYSTEM SET remote_listener(ADDRESS(PROTOCOLTCP)(HOSTscan-name)(PORT1521)) SCOPEBOTH;6. 实际案例分析6.1 案例一微服务架构下的连锁反应一个采用微服务架构的电商平台共有20个服务使用同一个数据库账户。当密码过期时所有服务开始不断尝试重新连接导致数据库服务器负载激增。解决方案是为每个服务创建单独的数据库账户实现集中化的密码管理在应用端添加密码过期提前通知机制6.2 案例二连接池配置不当一个报表系统每天凌晨生成大量报表连接池配置为初始100个连接。当数据库维护时这100个连接全部失败触发了300秒的延迟。优化方案将初始连接数降为10实现指数退避的重试机制添加维护窗口检测在维护期间暂停报表生成7. 预防措施与长期规划定期审查AWR报告中的等待事件建立数据库连接健康监控仪表盘实施自动化密码轮换机制定期进行连接压力测试考虑使用连接代理如Oracle Connection Manager管理连接通过以上分析和解决方案我们不仅解决了Failed Logon Delay进入Top 5的问题还提升了整个系统的安全性和稳定性。记住数据库性能调优往往需要综合考虑安全、性能和可用性找到最适合你业务场景的平衡点。
返回列表