通过sqlplus登录数据库hang住

本文记录了一次Oracle数据库启动失败及归档日志问题的解决过程。业务人员反馈数据库无法正常工作,使用sqlplus和rman工具登录时会hang住。通过预登录检查、关闭数据库并清除归档日志物理文件,最终成功重启数据库。

问题描述

业务人员报错:
在这里插入图片描述
但是用sqlplus工具登录时hang住

[oracle@db RACDB]$ !sql
sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on 星期二 12月 24 09:57:24 2019

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

^CERROR:
ORA-01075: 您现在已登录


[oracle@db RACDB]$
[oracle@db RACDB]$ rman target /

恢复管理器: Release 11.2.0.4.0 - Production on 星期二 12月 24 09:58:35 2019

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

^CRMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: 内部恢复管理器程序包初始化失败
RMAN-04005: 目标数据库中存在错误:
ORA-01013: 用户请求取消当前的操作

sqlplus和rman工具都进不到数据库,会hang住

问题解决

[oracle@db archivelog]$  sqlplus -prelim  / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on 星期二 12月 24 10:10:55 2019

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

SQL> archive log list
ORA-01012: not logged on
SQL> shutdown abort               
ORACLE 例程已经关闭。
SQL> exit
从 ORACLE 断开
[oracle@db archivelog]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on 星期二 12月 24 10:11:40 2019

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

已连接到空闲例程。

SQL> startup
ORACLE 例程已经启动。

Total System Global Area 5.3982E+10 bytes
Fixed Size            2266024 bytes
Variable Size         2.9931E+10 bytes
Database Buffers     2.4025E+10 bytes
Redo Buffers           24084480 bytes
数据库装载完毕。
ORA-03113: 通信通道的文件结尾 进程 ID:
16606
会话 ID: 13147 序列号: 3


SQL> archive log list
ORA-24324: 未初始化服务句柄
ORA-01041: 内部错误, hostdef 扩展名不存在

在告警日志看归档文件存放地址,清空物理文件后重新启动

如若还失败,startup mount;
然后关闭归档: alter database noarchivelog;

<think>我们正在处理的问题:sqlplus命令连接本地数据库响应时间过长(甚至卡死无响应)的原因及解决方案。 根据引用内容,特别是引用[1]引用[2]描述了类似现象:连接数据库hang,甚至本地sqlplus / as sysdba也无法连接或响应缓慢。 引用[3]指出SQL*Plus可以连接而其他应用程序不行时,可能是监听问题,但我们的情况是SQL*Plus本身连接本地也慢,所以监听问题可能不是主要原因(因为本地连接通常不需要监听)。 引用[4]提到Oracle Net Manager配置问题,但我们的问题是sqlplus命令。 结合之前的回答引用,我们分析原因解决方案如下: 原因分析: 1. DNS解析问题:尽管是本地连接,但Oracle在连接时可能会尝试反向解析主机名(将IP解析为主机名),如果DNS配置不当或网络延迟,会导致连接缓慢。 2. 系统资源问题:数据库实例或服务器资源(CPU、内存、I/O)耗尽,导致实例无法响应。 3. 数据库实例hang数据库内部出现严重问题(如死锁、大量阻塞、内部错误)导致实例无法处理请求。 4. 配置文件问题:sqlnet.ora、tnsnames.ora等配置不当,尤其是本地连接的配置。 5. 日志文件过大:监听日志(listener.log)或跟踪文件过大,导致I/O瓶颈。 解决方案: 1. 禁用DNS解析(推荐): 修改sqlnet.ora文件,添加以下两行: NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) DISABLE_OOB=ON 这样SQL*Plus将不使用DNS解析,而使用本地解析。 2. 检查系统资源: 使用top、vmstat等命令检查系统资源使用情况。如果资源耗尽,需要释放资源或重启数据库。 3. 检查数据库实例状态: 尝试通过其他方式(如sqlplus / as sysdba)连接,如果连接成功,检查数据库内部状态: SQL> select status from v$instance; SQL> select count(*) from v$session where status='ACTIVE'; SQL> select event, count(*) from v$session_wait group by event; 如果实例hang,可能需要重启实例。 4. 检查监听日志跟踪文件: 清理过大的监听日志(位于$ORACLE_HOME/network/log): mv listener.log listener.log.bak lsnrctl reload # 或重启监听 同时检查是否有大量错误的连接请求。 5. 简化连接测试: 使用EZCONNECT方式连接,避免配置文件的影响: sqlplus username/password@//localhost:1521/SERVICE_NAME 或者本地连接使用操作系统认证: sqlplus / as sysdba 6. 检查/etc/hosts文件: 确保主机名解析正确,将127.0.0.1本机IP映射到正确的主机名(如localhost): 127.0.0.1 localhost localhost.localdomain ::1 localhost localhost.localdomain 192.168.1.100 your_hostname 7. 调整连接超时参数(在sqlnet.ora中): SQLNET.INBOUND_CONNECT_TIMEOUT=30 TCP.CONNECT_TIMEOUT=10 8. 重启数据库监听: sqlplus / as sysdba SQL> shutdown immediate; SQL> startup; $ lsnrctl stop $ lsnrctl start 9. 检查是否有其他网络问题: 使用strace或truss跟踪sqlplus系统调用(仅限Linux/Unix): strace -T -o sqlplus_trace.txt sqlplus / as sysdba 观察卡在哪个系统调用上。 10. 检查Oracle的bug:查看alert.log日志,确认是否有已知bug导致连接问题。 步骤总结: 1. 先尝试最简单的本地连接(sqlplus / as sysdba)是否也慢。 2. 检查系统资源(top, free, iostat等)。 3. 检查/etc/hostsDNS解析(nslookup主机名)。 4. 修改sqlnet.ora禁用DNS解析并设置超时。 5. 清理监听日志并重启监听。 6. 重启数据库实例。 7. 如果仍然不行,追踪系统调用。 注意:如果是本地数据库,通常不需要监听(因为通过IPC或BEQ协议),但如果使用网络连接(如通过localhost)则需要。 </think>根据引用内容数据库连接原理,SQLPlus连接本地数据库响应时间过长的原因及解决方案如下: ### 一、根本原因分析 1. **DNS解析延迟**(最常见) Oracle尝试将本地IP反向解析为主机名,若DNS服务器响应慢或无法解析,导致连接卡在认证阶段[^1][^2]。 计算公式:$ \text{总延迟} = \text{SQL处理时间} + \text{DNS查询时间} $ 2. **实例挂起(Hang)** 数据库实例无法处理连接请求,可能由以下原因导致: - 资源争用:`enq: TX - row lock contention` 等锁等待事件 - 内存泄漏:SGA/PGA耗尽导致进程阻塞 - 后台进程异常:PMON、SMON进程僵死[^1] 3. **监听配置错误** - `listener.ora` 中 `HOST` 指向不可解析的主机名 - `sqlnet.ora` 的 `NAMES.DIRECTORY_PATH` 包含无效协议 - 监听日志过大(超过500MB)导致I/O阻塞[^4] 4. **系统资源瓶颈** ```mermaid graph LR A[响应延迟] --> B[CPU使用率>90%] A --> C[Swap使用率>30%] A --> D[/var磁盘使用率>95%] ``` ### 二、关键解决方案 #### 1. 禁用DNS解析(立即生效) ```bash # 修改sqlnet.ora echo "NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)" >> $ORACLE_HOME/network/admin/sqlnet.ora echo "DISABLE_OOB=ON" >> $ORACLE_HOME/network/admin/sqlnet.ora ``` 原理:跳过反向DNS查询,直接使用本地解析[^1][^2] #### 2. 诊断实例挂起 ```sql -- 检查阻塞会话 SELECT sid, serial#, event, blocking_session FROM v$session WHERE status = 'ACTIVE' AND wait_class != 'Idle'; -- 强制清理异常进程 ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; ``` #### 3. 监听配置修复 ```bash # 确保listener.ra配置正确 cat $ORACLE_HOME/network/admin/listener.ora LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) # ← 关键修改 ) ) ``` #### 4. 资源紧急释放 ```bash # 清理监听日志 mv $ORACLE_HOME/network/log/listener.log listener.log.bak lsnrctl reload # 释放内存 echo 3 > /proc/sys/vm/drop_caches # Linux ``` ### 三、诊断流程图 ```mermaid graph TD A[SQLPlus连接延迟] --> B{本地连接 or 网络连接} B -->|本地连接 sqlplus / as sysdba| C[检查DNS配置] B -->|网络连接 sqlplus user/pwd@service| D[检查监听状态] C --> E[/etc/hosts是否包含127.0.0.1 localhost] D --> F[lsnrctl status是否正常] E -->|否| G[添加127.0.0.1 localhost] F -->|异常| H[重启监听] G & H --> I[测试连接速度] I -->|仍延迟| J[检查v$session_wait] ``` ### 四、长效预防措施 1. **主机名固化** `/etc/hosts` 添加强制解析: ``` 127.0.0.1 localhost.localdomain localhost ::1 localhost.localdomain localhost ``` 2. **资源监控策略** ```bash # 定时任务检查资源 */5 * * * * /usr/bin/free -m | awk 'NR==2{if ($3/$2 > 0.9) exit 1}' ``` 3. **连接协议优化** `sqlnet.ora` 增加: ```ini SQLNET.EXPIRE_TIME=10 # 每10分钟检测死连接 TCP.NODELAY=YES # 禁用Nagle算法 ``` > ⚠️ 若问题仍未解决,需检查 `$ORACLE_HOME/bin/oracle` 二进制文件权限(需755)及内核参数 `semmni` 配置[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值