Oracle创建连接过慢的问题

本文分享了Oracle数据库中常见的三个问题及其解决方案:ORA-12514、ORA-12518错误和连接速度慢的问题。此外还介绍了如何正确启动和关闭Oracle实例和服务,以及一些Oracle命令的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近日,公司ORACLE服务器突如其来的宕机了,经过重装一系列的折腾终于解决了。终于发现自己对ORACLE理解还不够。

 

先列举一下几个问题的解决方案:

问题一:ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务

解决方案:通过重启服务的方式启动数据库,尝试连接。如果未解决修改listener.ora文件,配置静态监听。

总结:正确添加listener.ora;重新启动了oracle服务器,并检查oracle所有服务是否启动;oracle客户端Net Cofiguration Assistant正确添加或重新配置实例名 

 

问题二:ORA-12518: TNS: 监听程序无法分发客户机连接

解决方案:一般出现此情况较少,首先检查数据库服务是否启动 ,如果数据库服务启动请通过sqlplus命令登录dba执行startup命令启动数据库实例。

cmd>sqlplus connect sys/sys as sysdba>startup

 

问题三:通过plsql等工具连接oracle速度慢,需要10几秒以上,甚至长时间连接不上,通过命令启动和关闭oralce侦听时连接也很慢。

解决方案:这种情况发生通常有两种情况,

第一种是机器名(hostname)的问题,需要修改listener.ora文件或者重新建立监听即可。

第二种方式是我此次遇到的问题,oracle多个人开发用,持续时间比较久,侦听日至过大,导致连接慢。这种方法的解决方案是删除或重命名原有侦听日至。

lsnrctl set log_status off

rename listener.log listener.old

lsnrctl set log_status on 

 

总结一下新了解到的知识:

1.在windows中,windows服务中的oracle服务启动了不代表oracle实例一样启动了。

开始菜单->oracle配置和移植工具->Administration Assistant for Windows

左侧菜单上找到数据库菜单,下方实例上右键启动关闭选项。

oracle实例选项卡中有"服务启动时启动实例",和"服务停止时关闭实例"两个选项。

 

2.oracle相关命令

#启动监听

lsnrctl start

#关闭监听

lsnrctl stop

用lsnrctl reload重启监听器,此命令可以代替lsnrctl stop和lsnrctl start。重启将会在不需要关闭和启动监听器的情况下读取listener.ora的配置。

 

#启动oradb数据库服务

net start OracleServiceORCL

#关闭oradb数据库服务

net stop OracleServiceORCL

 

#启动dbconsole服务

emctl start dbconsole

#停止dbconsole服务

emctl stop dbconsole

 

#启动数据库

system>sqlplus connect sys/sys as sysdba

sql>startup

 

#停止数据库

sql>shutdown immediate

 

要启动或者停止服务,必须拥有sysdba的权限。

 

 

 

shutdown命令参数:

Normal 需要等待所有的用户断开连接,需要在所有连接用户断开后才执行关闭数据库任务,所以有的时候看起来好象命令没有运行一样!在执行这个命令后不允许新的连接.

Immediate 等待用户完成当前的语句 (推荐),在用户执行完正在执行的语句后就断开用户连接,并不允许新用户连接。 

Transactional 等待用户完成当前的事务,在拥护执行完当前事物后断开连接,并不允许新的用户连接数据库。  

Abort 不做任何等待,直接关闭数据库,执行强行断开连接并直接关闭数据库。

 

前三种方式不会丢失用户数据。第四种情况对于紧急关闭数据库才使用。

 

 

 

数据库的启动

数据库启动使用startup命令,它有三种情况 

第一种:不带参数,启动数据库实例并打开数据库,以便用户使用数据库,在多数情况下,使用这种方式! 

第二种:带nomount参数,只启动数据库实例,但不打开数据库,在你希望创建一个新的数据库时使用,或者在你需要这样的时候使用! 

第三种:带mount参数,在进行数据库更名的时候采用。这个时候数据库就打开并可以使用了! 

 

其他问题:

 

提示:环境变量 ORACLE_SID 未定义,请定义。

设置 ORACLE_SID =WLW (WLW是我的实例名,也是服务名) C:\Documents and Settings\xcl>set ORACLE_SID=WLW(注意大写)

Oracle 10g错误:shared memory realm does not exist的分析与解决容,情况是这样的:在连接Oracle 10g时出现了错误:“shared memory realm does not exist”,如下图所示:

 

硬盘格式的文件存储文件限制:

NTFS(Windows):支持最大分区2TB,最大文件2TB

FAT16(Windows):支持最大分区2GB,最大文件2GB

FAT32(Windows):支持最大分区128GB,最大文件4GB

HPFS(OS/2):支持最大分区2TB,最大文件2GB

EXT2和EXT3(Linux):支持最大分区4TB,最大文件2GB

JFS(AIX):支持最大分区4P(block size=4k),最大文件4P

XFS(IRIX):这是个正经的64位的文件系统,可以支持9E(2的63次方)的分区

 

博客地址:http://www.hrblive.com/coder/blog/blog_149.html,转载请注明出处。

### Oracle 数据库连接缓慢的原因及解决方案 Oracle 数据库连接缓慢可能由多种原因引起,以下是一些常见的原因及其对应的解决方案: #### 1. 网络延迟或带宽不足 网络问题可能导致客户端与数据库服务器之间的通信变慢。如果网络延迟较高或带宽不足,数据传输效率会受到影响。 - **解决方案**:优化网络配置,确保客户端和服务器之间的网络连接稳定且带宽充足。可以使用 `ping` 或 `traceroute` 工具检查网络延迟,并考虑将数据库服务器迁移到更靠近客户端的位置[^1]。 #### 2. 监听器配置不当 监听器是 Oracle 数据库用于接收客户端连接请求的组件。如果监听器配置不正确(例如监听端口被防火墙阻止或监听器未启动),可能会导致连接延迟。 - **解决方案**:检查监听器状态,确保其正常运行。可以通过以下命令验证监听器状态: ```bash lsnrctl status ``` 如果监听器未启动,可以使用以下命令启动它: ```bash lsnrctl start ``` 此外,确保防火墙规则允许监听器使用的端口(默认为 1521)。 #### 3. 数据库性能瓶颈 数据库性能瓶颈可能是由于资源争用(如 CPU、内存、磁盘 I/O)引起的。如果数据库服务器的硬件资源不足,可能会导致连接速度变慢。 - **解决方案**:监控数据库服务器的资源使用情况,识别并解决潜在的瓶颈。可以使用以下视图分析性能问题: ```sql SELECT * FROM v$session; SELECT * FROM v$resource_limit; ``` 根据分析结果,升级硬件资源或优化数据库配置以提高性能。 #### 4. 连接池配置不合理 如果应用程序使用了连接池,但连接池的大小设置不合理,可能会导致连接缓慢。例如,连接池中的空闲连接数量不足,或者连接超时时间过短。 - **解决方案**:调整连接池参数,确保其配置合理。例如,增加最大连接数或延长连接超时时间。具体调整方式取决于所使用的连接池实现(如 UCP、DBCP 等)[^1]。 #### 5. SQL 查询优化不足 复杂的 SQL 查询或索引缺失可能导致查询执行时间过长,从而影响连接速度。 - **解决方案**:优化 SQL 查询,确保查询语句高效且使用了适当的索引。可以使用以下命令分析查询性能: ```sql EXPLAIN PLAN FOR SELECT ...; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); ``` 根据分析结果,添加必要的索引或重写查询语句以提高效率。 #### 6. 闲置连接过多 如果数据库中存在大量闲置连接,可能会占用系统资源,从而导致新连接建立缓慢。 - **解决方案**:定期清理闲置连接。可以通过创建存储过程并结合定时任务实现自动化管理。例如,引用中的代码片段展示了如何通过 `DBMS_JOB` 提交任务来清理闲置连接。 --- ### 示例代码:清理闲置连接的存储过程 以下是一个示例存储过程,用于检测并终止长时间未活动的会话: ```sql CREATE OR REPLACE PROCEDURE kill_idle_sessions AS CURSOR idle_sessions IS SELECT sid, serial# FROM v$session WHERE status = 'INACTIVE' AND last_call_et > 3600 -- 闲置超过 1 小时 AND username IS NOT NULL; BEGIN FOR session_info IN idle_sessions LOOP EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' || session_info.sid || ',' || session_info.serial# || ''''; END LOOP; END; / ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值