sponsored links

关于ORACLE 在windos 环境下出现ORA-12546的问题研究

近期碰到一个ORA-12546: TNS:permission denied 的错误,开始以为是很简单的错误,结果弄了一天多才可以恢复。


服务器环境


序号


名称


版本


1


Windows Server 64


2012 R2


2


Oracle 10g 64


10.2.0.4

首先环境如上,使用administrator用户登陆后在cmd下如下情况

OracleServiceTIMSS 服务正在启动 .
OracleServiceTIMSS 服务已经启动成功。

C:\Users\Administrator>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Wed May 17 10:12:03 2017

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

ERROR:
ORA-12546: TNS:permission denied

检查tnsnames.ora 和sqlnet.ora均正常

C:\Users\Administrator>tnsping localhost:1521/timss

TNS Ping Utility for 64-bit Windows: Version 10.2.0.4.0 - Production on 17-MAY-2
017 10:24:15

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

Used parameter files:
D:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

Used EZCONNECT adapter to resolve the alias
Attempting to contact (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=timss))(ADDRESS=(
PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))
OK (0 msec)

开始的时候怀疑是tns问题导致的oracle链接不上,权限的话administrator 在ora_dba和administrators组中,应该不是用户权限不足的情况。

检查监听日志为发现大量如下内容。

TIMESTAMP * CONNECT DATA [* PROTOCOL INFO] * EVENT [* SID] * RETURN CODE
16-5月 -2017 11:27:02 * (CONNECT_DATA=(SID=test)(CID=(PROGRAM=)(HOST=__jdbc__)(USER=))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.49.0.73)(PORT=62899)) * establish * timss * 12505
TNS-12505: TNS: 监听程序当前无法识别连接描述符中所给出的 SID

alert日志未发现任何的连接启动报错,而且未发现启动时的日志输出。

由于oracle服务在windows平台的启动方式为程序和库一同启动,基本可以确定是oracle服务未正常启动,或者说启动的是其他的实例。

但是在windows的服务下OracleServiceTEST启动时是正常的,且并未见服务器报错。

此时查看注册表regedit

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1/ORACLE_SID 也是默认的实例TEST

在检查了大量的内容后发现应该是兼容性问题。

在确定了问题后现在是如何恢复的问题了。

根据用户描述,重启服务后改实例就会无法访问,可见OracleserviceTEST启动的时候有可能并未正真启动TEST所在的实例。

为验证该问题,我们删除HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1/ORACLE_SID键值,在删除前保证ORACLE的服务已经停止

让ORACLE服务没有默认的SID。接下来是我的启动方式

C:\Users\Administrator>set ORACLE_SID=TEST

C:\Users\Administrator>net start oracleserviceTEST
OracleServiceTIMSS 服务正在启动 .
OracleServiceTIMSS 服务无法启动。

发生服务特定错误: 1336.

请键入 NET HELPMSG 3547 以获得更多的帮助。

C:\Users\Administrator>net start oracleserviceTEST
OracleServiceTIMSS 服务正在启动 ......
OracleServiceTIMSS 服务已经启动成功。

C:\Users\Administrator>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Wed May 17 10:13:03 2017

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

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64
bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

手工设置ORACLE_SID,启动ORACLE的服务后使用cmd 居然成功了。

但是当在服务里关闭OracleServiceTEST的服务后,重启后使用cmd登陆sqlplus 此时ORA-12546又会出现。

此时由于HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1/ORACLE_SID 已经不存在 所以即使按照刚刚手工设置ORACLE_SID的方式启动也不好使了。

怀疑是ORACLE_SID在某一个文件中被缓存了。由于服务器兼容性问题,该问题就不深究了。

下面是整个操作流程:

1、停止OracleServiceTEST服务,如果有多个实例记得都停掉

2、HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1/ORACLE_SID 该值删除(服务启动时该值根本读不到)

3、在CMD下set ORACLE_SID=TEST,使用net start OracleSErviceTEST 启动数据库,使用SQLPLUS 登陆验证

4、HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1/ORACLE_SID 设置为TEST

5、下次重启Oracle服务时按照1-4流程重新执行,所有操作都需要首先停止数据库实例。

总体的结果就是环境变量的问题导致ORACLE服务启动未完成。可以在alert日志中发现该实例根本未启动。

总结:

该问题的本质是程序不兼容,安装的是oracle 10g for vista 64位 该版本支持windows 7 以下的server的安装,但是可以通过修改配置文件增加支持的操作系统。

安装之初本来就安装不了,但是强行修改了检查的xml文件,可以进行安装。操作系统为win2012 在window 7 以上微软对文件权限有了很大的改动,导致很多低版本的oracle安装上以后会出现各式各样的问题。

Tags: