PL/SQL连接不上远程数据库,报错ORA-12504TNS:listener was not given the SERVICE_NAME in CONNECT_DATA2019

博客介绍了Oracle相关配置方法,一是要配置好tnsnames.ora文件,二是在填写PL/SQL数据库地址时采用‘IP/实例名’的格式。

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

1、配置好tnsnames.ora文件;
2、填写PL/SQL数据库地址时用‘IP/实例名’;

### Linux环境下Oracle数据库连接时出现ORA-12504错误的解决方案 ORA-12504 错误通常表示客户端尝试通过监听器连接Oracle数据库实例时,未能提供有效的 `SERVICE_NAME` 参数。以下是针对该问题的具体分析和解决方法: #### 1. **确认监听器配置** 确保监听器的配置文件 `listener.ora` 和 `tnsnames.ora` 正确无误。 - **Listener.ora** 监听器配置应包含目标数据库的服务名称和服务地址。例如: ```plaintext LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = your_host_name_or_ip)(PORT = 1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = your_service_name) (ORACLE_HOME = /path/to/oracle/home) (SID_NAME = your_sid_name) ) ) ``` 上述配置中的 `(GLOBAL_DBNAME)` 应与实际使用的 `SERVICE_NAME` 对应[^3]。 - **Tnsnames.ora** 客户端需要访问的目标数据库应在 `tnsnames.ora` 文件中定义。例如: ```plaintext YOUR_CONNECTION_ALIAS = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = your_host_name_or_ip)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = your_service_name) ) ) ``` 注意:`(SERVICE_NAME)` 是关键参数,必须与监听器配置一致[^5]。 --- #### 2. **验证监听器状态** 启动或重新加载监听器以应用最新的配置更改。 ```bash lsnrctl start lsnrctl reload lsnrctl status ``` 运行 `lsnrctl status` 命令后,检查输出是否显示了正确的 `SERVICE_NAME`。如果未找到对应的 `SERVICE_NAME`,则可能需要调整监听器配置并再次重启[^4]。 --- #### 3. **检查客户端连接字符串** 在 Navicat 或其他工具中,确保连接字符串正确设置了 `SERVICE_NAME` 而是仅依赖于 `SID`。虽然某些情况下可以使用 `SID` 替代 `SERVICE_NAME`,但这可能导致兼容性问题[^2]。 对于 Navicat 的高级设置部分,建议显式指定以下字段: - Host Name/IP Address: 数据库主机名或IP地址 - Port: 默认端口为1521 - Service Name: 使用完整的 `SERVICE_NAME` --- #### 4. **环境变量配置** 在Linux环境中,确保必要的环境变量已正确定义: ```bash export ORACLE_HOME=/path/to/oracle/home export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH export PATH=$ORACLE_HOME/bin:$PATH export TNS_ADMIN=/path/to/your/tnsnames/directory ``` 其中,`TNS_ADMIN` 指向存储 `tnsnames.ora` 文件的位置。 --- #### 5. **测试连接** 使用命令行工具(如 `sqlplus`)测试连接是否正常工作: ```bash sqlplus username/password@//your_host_name_or_ip:1521/your_service_name ``` 如果此命令成功,则说明基础配置正确;否则需进一步排查网络或权限问题[^1]。 --- #### 6. **常见误区及注意事项** - 要混淆 `SID` 和 `SERVICE_NAME`。尽管两者有时可互换使用,但在现代版本的Oracle中推荐优先采用 `SERVICE_NAME`。 - 如果启用了动态注册功能,确保数据库进程能够正确向监听器注册其服务信息。 --- ### 示例代码片段 以下是一个简单的 Python 脚本用于测试连接: ```python import cx_Oracle dsn_tns = cx_Oracle.makedsn('your_host_name_or_ip', '1521', service_name='your_service_name') connection = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns) print("Connection successful!") cursor = connection.cursor() cursor.execute("SELECT * FROM dual") for row in cursor: print(row) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值