[置顶] 数据库故障总结【一】ORA-12638、ORA-12154、ORA-12514的解决方法

****************************************************************************************************************

数据库故障【一】ORA-12638、ORA-12154、ORA-12514的解决方法

*****************************************************************************************************************

一、oracle错误解释

ORA-12638 :身份证明检索失败

ORA-12154: TNS: 无法解析制定的链接标识符。

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

二、相关oracle网络配置说明

oracle网络配置

三个配置文件 listener.ora、sqlnet.ora、tnsnames.ora ,都是放在$ORACLE_HOME\network\admin目录下。

1.sqlnet.ora
作用: 决定怎么样找一个连接中出现的连接字符串。
文件例子: 在客户端sqlplus或DOS下输入 sqlplus sys/sys@orcl
(1)如果sqlnet.ora的配置如下:
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME)
客户端就会首先在tnsnames.ora文件中找orcl的记录。如果没有相应的记录则尝试把orcl当作一个主机名,通过网络的途径去解析它的 ip地址然后去连接ip相对应的服务器, 在服务器上查找文件listener.ora中的变量GLOBAL_DBNAME中指定的实例。

(2)sqlnet.ora是下面这个样子
SQLNET.AUTHENTICATION_SERVICES= (NONE)
NAMES.DIRECTORY_PATH= (TNSNAMES)
客户端就只会从tnsnames.ora查找实例orcl的记录
字段说明:
SQLNET.AUTHENTICATION_SERVICES  -- sql连接认证方式
NTS     -- 需要认证
NONE – 无需认证
NAMES.DIRECTORY_PATH     -- sql连接路径
TNSNAMES    -- tnsnames.ora配置路径
HOSTNAME    -- 可把orcl当主机名

2.tnsnames.ora
作用:
提供的tnsname到主机名或者ip的对应,只有当sqlnet.ora中类似NAMES.DIRECTORY_PATH= (TNSNAMES) 这样,也就是客户端解析连接字符串的顺序中有TNSNAMES是,才会尝试使用这个文件。
文件例子:
UIDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.166.100.102)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = uidb)
)
)
字段说明:
PROTOCOL:客户端与服务器端通讯的协议,一般为TCP,该内容一般不用改。
HOST:数据库侦听所在的机器的机器名或IP地址,数据库侦听一般与数据库在同一个机器上。
PORT:数据库侦听正在侦听的端口,可以察看服务器端的listener.ora文件或在数据库侦听所在的机器的命令提示符下通过lnsrctl status [listener name]命令察看。此处Port的值一定要与数据库侦听正在侦听的端口一样。
SERVICE_NAME:服务端服务名,即数据库实例名。在服务器端,用system用户登陆后,
sqlplus> show parameter service_name命令察看。

3.listener.ora
作用:
listener监听器进程的配置文件,关于listener进程就不多说了,接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接,listener进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接。
文件例子:
# listener.ora Network Configuration File: /opt/oracle/app/oracle/product/11.1.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
##上面是监听器监听的协议,ip,端口等,这里使用默认的1521端口
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.166.100.111)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
##定义LISTENER进程为实例FWQ提供服务 这里是,并且它对应的ORACLE_HOME和GLOBAL_DBNAME 。其中GLOBAL_DBNAME不是必需的,除非使用HOSTNAME做数据库连接。
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /opt/oracle/app/oracle/product/11.1.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = FWQ) --全局数据库名称
(ORACLE_HOME = /opt/oracle/app/oracle/product/11.1.0/db_1)
(SID_NAME = FWQ) --数据库SID
)
)

字段说明:
SID_DESC -- 字段描述了数据库服务或者非数据库服务的情况。
GLOBAL_DBNAME -- 全局数据库名称
注:输入根据初始化参数文件中的 SERVICE_NAMES 参数值或 DB_NAME 和 DB_DOMAIN 参数值提供的数据库名和域名。
ORACLE_HOME -- Oracle 主目录,输入数据库的 Oracle 主目录位置。
注:Windows NT 已经知道 Oracle 主目录。因此,连接 Windows NT 上的服务不需要此字段。
SID_NAME -- 输入实例的 Oracle 系统标识符 (SID)。
oracle有三种监听方式:
(1)Database 提供对数据库实例的网络访问
(2)PLSExtProc PL/SQL 包访问操作系统可执行程序的方法
(3)Executable 提供对操作系统可执行程序的网络访问
PLSExtProc 模式是标准的配置方式,也是最常用的数据库连接方式。 PLSExtProc 模式允许 PL/SQL 程序访问外部程序,并且被大多数实例配置为默认连接方式。
另外,上面说到的三个文件都可以通过图形的配置工具来完成配置
$ORACLE_HOME/netca 向导形式的
$ORACLE_HOME/netmgr
profile 配置的是sqlnet.ora也就是名称解析的方式
service name 配置的是tnsnames.ora文件
listeners配置的是listener.ora文件,即监听器进程
具体的配置可以尝试一下然后来看一下配置文件。

四 解决方法
1.ORA-12638 :身份证明检索失败
把配置文件sqlnet.ora中的字段 SQLNET.AUTHENTICATION_SERVICES= (NTS)改为
SQLNET.AUTHENTICATION_SERVICES= (NONE)或者把该字段注释掉。
解释:
SQLNET.AUTHENTICATION_SERVICES -- sql连接认证
NTS -- 需要认证
NONE – 无需认证
2.ORA-12154: TNS: 无法解析制定的链接标识符。
检查配置文件tnsnames.ora中的链接标识符,即数据库实例名是否写错了。如果没有写错的话,查看制定的链接字段前后的空格符,是否有中文字符空格。因为tnsnames.ora文件对格式要求比较严格。数据库实例名没有错但仍提示这个错误往往都是这个原因造成的。
3.ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
在配置文件listener.ora中增加如下一段代码:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /opt/oracle/app/oracle/product/11.1.0/db_1) --oracle安装路径
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = FWQ) --数据库实例名
(ORACLE_HOME = /opt/oracle/app/oracle/product/11.1.0/db_1) --oracle安装路径
(SID_NAME = FWQ) --数据库SID
)
)


原因:由于原来的代码

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.166.100.111)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
无 SID_LIST_LISTENER字段时,它只会动态连接监听服务。当无法动态连接服务时,可以加上SID_LIST_LISTENER字段,就变成静态连接监听服务,指定监听程序必须接收连接请求的数据库服务,客户端就可以用sqlplus或者pl/sql dev工具连接服务器。


五 附录:监听器的操作命令

在DOS或linux下需要敲监控命令,总结如下:
1. ***>lsnrctl 进入LSNRCTL命令环境。
2. LSNRCTL>help,列出许多命令,如上图所示。常用的命令描述如下表:
命令 描述
start 开始监听服务
stop 停止监听服务
status 查看监听状态
services查看监听服务,列出服务摘要
version 查看监听版本
exit,quit 离开LSNRCTL命令








你可能感兴趣的:(oracle,数据库,list,服务器,service,Path)