近期碰到一个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
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)
检查监听日志为发现大量如下内容。
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
由于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
但是当在服务里关闭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安装上以后会出现各式各样的问题。