ORA-12514 监听程序当前无法识别连接描述符中的服务

本文介绍了解决Oracle数据库连接错误ORA-12514(监听器未知服务)和ORA-01034(Oracle不可用)的过程。通过检查服务状态、tnsping连接测试,并调整自动启动配置,最终成功启动数据库。

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

 某日,出现如下错误:

C:/Documents and Settings/Administrator>sqlplus ifsapp/ifsapp@smtest

SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 8月 27 16:53:09 2008

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

ERROR:
ORA-12514: TNS: listener does not currently know of service requested in connect descriptor

请输入用户名:

经检查:
    1. 检查服务器端服务为【已启动】状态。
    2. 客户端tnsping状态为:
C:/Documents and Settings/Administrator>tnsping smtest

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 27-8月 -
2008 16:57:25

Copyright (c) 1997, 2005, Oracle.  All rights reserved.

已使用的参数文件:
D:/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora


已使用 TNSNAMES 适配器来解析别名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 10.10.2.60)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = TEST)))
OK (10 毫秒)
    3.服务器端
C:/Documents and Settings/Administrator>SET ORACLE_SID=TEST

C:/Documents and Settings/Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.2.0 - Production on 星期三 8月 27 16:49:08 2008

Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.

SQL> conn / as sysdba;
已连接到空闲例程。
SQL> select * from v$instance;
select * from v$instance
*
第 1 行出现错误:
ORA-01034: ORACLE not available

    有点想不明白,明明在Windows服务列表中看到服务是启动的,可为何是空闲例程。想了半天,才猛然想起:此前为了将服务器重启时间减少,而将HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_OraDb10g_home1 下的ORA_TEST_AUTOSTART值设置为FALSE。参看文章《Windows 下逐状态启动 Oracle数据库》。于是:

SQL> startup;
ORACLE 例程已经启动。

Total System Global Area  645922816 bytes
Fixed Size                  1291108 bytes
Variable Size             432016540 bytes
Database Buffers          209715200 bytes
Redo Buffers                2899968 bytes
数据库装载完毕。
数据库已经打开。
SQL>

    问题解决。

### ORA-12514 TNS 监听程序无法识别连接描述符请求服务的解决方案 ORA-12514 错误通常表示客户端尝试连接到的服务名称未被监听识别。此问题可能由多种原因引起,包括监听器配置错误、服务名称不匹配或环境变量未正确设置等。 #### 监听器配置文件 `listener.ora` 的检查与修改 监听器配置文件 `listener.ora` 位于 Oracle 安装目录下的 `NETWORK\ADMIN` 文件夹中。打开该文件并确保其内容类似于以下示例: ```plaintext LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = your_host_name)(PORT = your_port_number)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = your_service_name) (ORACLE_HOME = your_oracle_home_path) (SID_NAME = your_sid_name) ) ) ``` 上述配置中,`your_host_name` 是服务器的主机名或 IP 地址,`your_port_number` 是监听器端口号(通常是 1521),`your_service_name` 是数据库服务名称,`your_oracle_home_path` 是 Oracle 客户端或服务器的安装路径,`your_sid_name` 是数据库实例的 SID[^2]。 如果 `SID_LIST_LISTENER` 部分未定义,则需要手动添加以确保监听器能够识别数据库实例。 #### 检查并重启监听器 完成 `listener.ora` 文件的修改后,使用以下命令检查和重启监听器: ```bash lsnrctl status lsnrctl stop lsnrctl start ``` 通过 `lsnrctl status` 命令可以验证监听器是否正在运行以及它是否已注册所需的服务。如果服务未注册,则可能是 `SID_LIST_LISTENER` 配置有误或数据库未正确启动。 #### 检查 `tnsnames.ora` 文件 `tnsnames.ora` 文件同样位于 `NETWORK\ADMIN` 文件夹中。确保该文件中的条目与数据库的实际配置一致。例如: ```plaintext MY_DATABASE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = your_host_name)(PORT = your_port_number)) (CONNECT_DATA = (SERVICE_NAME = your_service_name) ) ) ``` 此处的 `your_host_name`、`your_port_number` 和 `your_service_name` 必须与 `listener.ora` 文件和数据库的实际配置相匹配[^3]。 #### 环境变量的配置 为了确保 PL/SQL Developer 能够正确找到 `tnsnames.ora` 文件,建议设置一个名为 `TNS_ADMIN` 的环境变量,其值为 `tnsnames.ora` 文件所在的路径。例如: ```plaintext E:\app\product\11.2.0\dbhome_1\NETWORK\ADMIN ``` 此操作可避免因路径问题导致的连接失败[^3]。 #### 数据库服务的状态检查 确保目标数据库实例已正确启动,并且监听器已成功注册该实例。可以通过以下命令检查数据库状态: ```sql SELECT instance_name, status FROM v$instance; ``` 如果数据库未启动或监听器未注册服务,需要启动数据库实例并重新启动监听器。 #### PL/SQL Developer 连接测试 在 PL/SQL Developer 中创建新连接时,选择“TNS”作为连接类型,并输入正确的用户名、密码以及 `tnsnames.ora` 文件中定义的别名。测试连接以确认配置是否正确。 ### 示例代码:验证监听器和服务状态 以下脚本可用于验证监听器和服务状态: ```python import cx_Oracle # 替换为实际的连接信息 dsn_tns = cx_Oracle.makedsn('your_host_name', 'your_port_number', service_name='your_service_name') try: connection = cx_Oracle.connect(user='your_username', password='your_password', dsn=dsn_tns) print("Connection successful!") except cx_Oracle.DatabaseError as e: error, = e.args print(f"DatabaseError: {error.message}") finally: if 'connection' in locals(): connection.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值