Oracle数据库最早是构建在Unix/Linux环境下,提供企业级应用。所以,其中很多的配置和架构体系都是依存在Unix/Linux思路。
1、 故障症状
一台项目组内部使用的数据库服务器断电停机了,重启之后就数据库没有自动启动。在任务管理器中,使用重新启动数据库服务OracleServiceOrcl,启动过程中没有错误报出。监听器服务启动,检查监听器服务状态如下:
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=acca-119hs63yxc)(PORT=1521)
))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
启动日期 11-10月-2011 12:35:32
正常运行时间 0 天 0 小时 0 分 21 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 C:\tool\oracle\oracle\product\10.2.0\db_1\network\admin\listener.ora
监听程序日志文件 C:\tool\oracle\oracle\product\10.2.0\db_1\network\log\listener.log
监听端点概要... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=acca-119hs63yxc)(PORT=1521)))
监听程序不支持服务
命令执行成功
数据库没有启动,那么尝试手工命令行登录。
C:\Documents and Settings\Administrator>sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 10月 11 12:36:03 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba
ERROR:
ORA-12641: 验证服务无法初始化
SQL> conn sys/sys as sysdba
ERROR:
ORA-12641: 验证服务无法初始化
登录无法实现。
2、问题分析
从监听器的情况看,监听器是在运行,但是没有注册的服务传入进来。起码证明数据库实例Instance的没有启动或者启动中断。另外一个疑点在于即使实例没有启动,单独使用本机用户进行服务器端验证也无法登陆。
那么,首先排除一下是不是在Instance启动过程中出现什么问题,检查AlertLog。下面是抽取到的日志最后记录。
Fri Sep 23 15:46:13 2011
Thread 1 advanced to log sequence 1428
Current log# 2 seq# 1428 mem# 0: C:\TOOL\ORACLE\ORACLE\PRODUCT\10.2.0\ORADATA\OTS\REDO02A.LOG
Current log# 2 seq# 1428 mem# 1: C:\TOOL\ORACLE\ORACLE\PRODUCT\10.2.0\ORADATA\OTS\REDO02B.LOG
Sat Sep 24 06:00:09 2011
Thread 1 advanced to log sequence 1429
Current log# 3 seq# 1429 mem# 0: C:\TOOL\ORACLE\ORACLE\PRODUCT\10.2.0\ORADATA\OTS\REDO03A.LOG
Current log# 3 seq# 1429 mem# 1: C:\TOOL\ORACLE\ORACLE\PRODUCT\10.2.0\ORADATA\OTS\REDO03B.LOG
当前日期是10月11日,而alert_log中的最后的记录是在9月24日。说明最起码在启动当天,使用任务管理器启动根本就没有触及到启动的过程。
结合使用sqlplus不能登陆的现象,说明在启动之前,使用当前用户进行验证登录是失败的。
[oracle@bspdev ~]$ oerr ora 12641
12641, 00000, "Authentication service failed to initialize"
// *Cause: The authentication service failed during initialization.
// *Action: Enable tracing to determine the exact error.
那么,整个问题的焦点就集中到空闲实例登录验证机制上。因为即使是使用任务管理器进行实例启动,实现机制无外于由OS使用当前用户进行登录。所以,下一步的检查目标是验证机制配置文件tnsnames.ora。
打开该文件,发现如下配置。
SQLNET.AUTHENTICATION_SERVICES = (ALL)
该参数确定的是是否使用操作系统验证机制。在Windows平台上,配置工具netca将这个参数默认设置为NT。取值NT的含义是专门用于Windows平台的验证机制。在官方文档上,Windows平台设置为ALL也是可以进行OS验证的。
3、问题解决
理论上没有问题,但是笔者尝试将其修改为NT,看看实际的效果。
SQLNET.AUTHENTICATION_SERVICES = (NT)
尝试进行sqlplus连接。
SQL> conn sys/acca as sysdba
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 419430400 bytes
Fixed Size 1249368 bytes
Variable Size 83890088 bytes
Database Buffers 331350016 bytes
Redo Buffers 2940928 bytes
数据库装载完毕。
数据库已经打开。
启动成功,监听器状态如下。
--篇幅原因,有省略……
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=acca-119hs63yxc)(PORT=1521)
))
LISTENER 的 STATUS
------------------------
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=acca-119hs63yxc)(PORT=1521)))
服务摘要..
服务 "OTSXDB" 包含 1 个例程。
例程 "ots", 状态 READY, 包含此服务的 1 个处理程序...
服务 "OTS_XPT" 包含 1 个例程。
例程 "ots", 状态 READY, 包含此服务的 1 个处理程序...
服务 "ots" 包含 1 个例程。
例程 "ots", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
alert_log中也出现了对应的启动过程日志,无故障。登录尝试也成功。
SQL> conn scott/tiger@otstest;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as scott
4、结论和反思
说明,在windows上尝试使用Oracle 10gR2(起码在笔者的服务器上尝试使用)ALL选项,会带来验证登录问题。
下面是该参数几个取值在验证上的效果。
SQLNET.AUTHENTICATION_SERVICES = (ALL)
SQL> conn / as sysdba
ERROR:
ORA-12641: 验证服务无法初始化
SQL> conn sys/acca as sysdba
ERROR:
ORA-12641: 验证服务无法初始化
取值NONE效果。
SQLNET.AUTHENTICATION_SERVICES = (NONE)
SQL> conn / as sysdba
ERROR:
ORA-01031: 权限不足
SQL> conn sys/acca as sysdba
已连接。
SQL>
取值NT效果。
SQLNET.AUTHENTICATION_SERVICES = (NT)
SQL> conn / as sysdba
ERROR:
ORA-01031: 权限不足
警告: 您不再连接到 ORACLE。
SQL> conn sys/acca as sysdba
已连接。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17203031/viewspace-709211/ ,如需转载,请注明出处,否则将追究法律责任。