- 开发环境
- ORA-12154-TNS: 无法解析指定的连接标识符(could not resolve the connect identifier specified)
- ORA-12557: TNS: 协议适配器不可加载
- OCIEnvCreate failed with return code -1 but error message text was not available.
- ORA-01033: ORACLE initialization or shutdown in progress
- ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
- OracleOraDb11g_home1TNSListener 服务启动后停止
开发环境
名称 | 版本 |
---|---|
操作系统 | Windows 10 X64 |
Oracle | win64_11gR2_database |
PLSQL Developer | 11.0.4.1788(64 bit)01.179332 - Unlimited user license |
ORA-12154-TNS: 无法解析指定的连接标识符(could not resolve the connect identifier specified)
页面报错误
ORA-12154: TNS:could not resolve the connect identifier specified
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: Tencent.OA.FMS.Framework.MVC.WebClientException: ORA-12154: TNS:could not resolve the connect identifier specified
问题 ORA-12154: TNS:could not resolve the connect identifier specified
,即 ORA-12154: TNS: 无法解析指定的连接标识符
这说明缺少了一个环境变量,TNS_ADMIN
。
我的 Oracle 安装目录为 D:\Oracal\app\product\11.2.0\dbhome_1
配置两个环境变量
环境变量名称 | 环境变量值 | 具体含义 |
---|---|---|
ORACLE_HOME |
D:\Oracal\app\product\11.2.0\dbhome_1 |
Oracle 安装目录 |
TNS_ADMIN |
%ORACLE_HOME%\network\admin |
该环境变量的值为 tnsnames.ora 文件所在路径。设置 TNS_ADMIN 变量是为了能够找到 tnsnames.ora |
ORA-12557: TNS: 协议适配器不可加载
页面报错 ORA-12557: TNS: 协议适配器不可加载
1.Path
环境变量内容如下
D:\app\product\11.2.0\client_1;
D:\app\product\11.2.0\client_2\bin;
C:\Program Files (x86)\Common Files\Oracle\Java\javapath;
D:\app\product\11.2.0\client_1\bin;
D:\app\product\11.2.0\client_1\network\admin\;
%SystemRoot%\system32;
%SystemRoot%;
%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\
一般这个错误都是有两个 Oracle 目录导致的。
Path
环境变量修改为
D:\app\product\11.2.0\client_1;
D:\app\product\11.2.0\client_2\bin;
C:\Program Files (x86)\Common Files\Oracle\Java\javapath;
D:\app\product\11.2.0\client_1\bin;
D:\app\product\11.2.0\client_1\network\admin\;
%SystemRoot%\system32;
%SystemRoot%;
%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\
2.ORACLE_HOME
环境变量修改为
D:\app\product\11.2.0\client_2
修改之后还是无效。
尝试了许多办法,包括修改为 client_1
对应的目录也不行。
后来重新安装了 Oracle,并修改对应环境变量为新目录
1.Path
环境变量
D:\app1\product\11.2.0\client_1\bin;
C:\Program Files (x86)\Common Files\Oracle\Java\javapath;
%SystemRoot%\system32;
%SystemRoot%;
%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\
2.ORACLE_HOME
环境变量
D:\app1\product\11.2.0\client_1
问题解决
OCIEnvCreate failed with return code -1 but error message text was not available.
解决了上一个问题,又出现了新问题
OCIEnvCreate failed with return code -1 but error message text was not available.
OCIEnvCreate 失败, 返回代码为-1,但错误消息文本不可用
再次刷新页面,直接把调用 Oracle 的服务给挂掉了
No connection could be made because the target machine actively refused it 127.0.0.1:18812
启动服务,又报错
OCIEnvCreate failed with return code -1 but error message text was not available.
OCIEnvCreate 失败, 返回代码为-1,但错误消息文本不可用
如此循环。
后来这样刷新,重启了几次之后,莫名其妙的这个错误竟然就没了~~~~~
ORA-01033: ORACLE initialization or shutdown in progress
数据库端
1.问题描述
使用 PLSQL Developer
登录数据库,提示
[Window Title]
(没有登录) - PL/SQL Developer
[Content]
ORA-01033: ORACLE initialization or shutdown in progress
进程 ID: 0
会话 ID: 0 序列号: 0
2.问题分析
数据库迁移到的新的机器上,重新配置新机器的 tns 即可
之前的 tns 为
#开发环境新库
dev_fms_new =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.10)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = fmsdev)
)
)
现在修改成了
#开发环境-2021年1月1日
dev_fms=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.88)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = fmsdev)
)
)
重新配置即可
web 端
修改了连接字符串后
<add name="TPS.ConnectionString" connectionString="data source=dev_fms;uid=luoma;pwd=luoma_pwd;Max Pool Size=100;Min Pool Size=5;" providerName="System.Data.OracleClient" />
运行报下面的错误。
尝试了以下方法之后,问题莫名其妙解决了
1.重新编译解决方案
2.注释,取消注释读取连接字符串相关的代码
3.重启电脑
4.重启服务
OracleMTSRecoveryService
OracleOraDb11g_home1ClrAgent
OracleOraDb11g_home1TNSListener
OracleServiceORCL
5.多次刷新界面,启动调试
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
1.问题描述
在 ORA-01033: ORACLE initialization or shutdown in progress 问题中,我修改了 tns 后,修改了连接字符串
<add name="TPS.ConnectionString" connectionString="data source=dev_fms;uid=luoma;pwd=luoma_pwd;Max Pool Size=100;Min Pool Size=5;" providerName="System.Data.OracleClient" />
解决了 web 端 的问题后,出现了新问题。
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: Luoma.OA.FMS.Framework.MVC.WebClientException: ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
源错误:
执行当前 Web 请求期间生成了未经处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
堆栈跟踪:
[WebClientException: ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
]
Luoma.OA.FMS.Framework.WCF.WCFClientProxy.CallChannel(Func`2 func, ChannelFactory`1 chanFactory) +779
Luoma.OA.FMS.Framework.WCF.WCFClientProxy.Call(Func`2 fun, String endpointConfigurationName) +219
Luoma.OA.FMS.Framework.WCF.WCFClientProxy.Call(Func`2 fun) +138
Luoma.OA.FMS.Framework.MVC.Providers.Impl.DefaultProfileProvider.GetUser(String userName) +179
Luoma.OA.FMS.Framework.MVC.Providers.Impl.DefaultProfileProvider.GenerateProfile(String userName) +72
Luoma.OA.FMS.Framework.MVC.Filters.LoginAuthorizationAttribute.OnAuthorization(AuthorizationContext filterContext) +854
System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor) +155
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +632
System.Web.Mvc.Controller.ExecuteCore() +144
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +93
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +57
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +25
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +54
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +431
System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +75
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +158
版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.8.4250.0
但是程序运行,是已经获取到数据库表数据了的。
TNS Ping 也没有问题
C:\WINDOWS\system32>tnsping dev_fms
TNS Ping Utility for 64-bit Windows: Version 11.2.0.1.0 - Production on 08-1月 -2021 19:09:13
Copyright (c) 1997, 2010, Oracle. All rights reserved.
已使用的参数文件:
D:\Oracal\app\product\11.2.0\dbhome_1\network\admin\sqlnet.ora
已使用 TNSNAMES 适配器来解析别名
尝试连接 (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =127.0.0.88)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = fmsdev)))
OK (30 毫秒)
2.问题分析
(1)LISTENER.ORA
D:\Oracal\app\product\11.2.0\dbhome_1\NETWORK\ADMIN\LISTENER.ORA
检查了这个文件,没问题
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\Oracal\app\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:D:\Oracal\app\product\11.2.0\dbhome_1\BIN\oraclr11.dll")
)
(SID_DESC =
(SID_NAME = ORCL)
(ORACLE_HOME = D:\Oracal\app\product\11.2.0\dbhome_1)
(ENVS = "EXTPROC_DLLS=ONLY:D:\Oracal\app\product\11.2.0\dbhome_1\BIN\oraclr11.dll")
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = v_hwhao-PC3)(PORT = 1521))
)
)
ADR_BASE_LISTENER = D:\Oracal\app
(2)tnsnames.ora
D:\Oracal\app\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
检查了这个文件,也没有问题
#开发环境-2021年1月1日
dev_fms=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.88)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = fmsdev)
)
)
后来在解决 OracleOraDb11g_home1TNSListener 服务启动后停止这个问题的时候,我发现了思路。
从这个问题可以知道,我的 OracleOraDb11g_home1TNSListener
服务,监听的目录是 D:\Program Files\PLSQL Developer
于是我猜测,会不会这个目录也有一个 listener.ora
和 tnsnames.ora
,但是我没有配置这里的 TNS,所以找不到报错了。
然后进入这个目录,果然发现有这两个文件,那么打开看看
(3)listener.ora
这个文件看上去,和上面 D:\Oracal\app\product\11.2.0\dbhome_1\NETWORK\ADMIN\LISTENER.ORA
目录的一致,不管。
# listener.ora Network Configuration File: D:\Program Files\PLSQL Developer\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\Oracal\app\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:D:\Oracal\app\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = v_hwhao-PC3)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = D:\Oracal\app
(4)tnsnames.ora
也要这个配置,所以不是这里的问题
DEV_FMS=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.88)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = fmsdev)
)
)
3.问题解决
注意:以下的解决办法是针对我本机和对应程序的,其实按照正常的逻辑,上面的问题分析已经可以解决问题了。
我怀疑不是我本机的问题,因为我本机的代码可以访问到数据库,但是一到页面上,登录之后,就报了这个错
于是我把项目登录部分的代码注释掉
Global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomHandleErrorAttribute());
//filters.Add(new LoginAuthorizationAttribute());
}
}
注释掉之后,没有报这个错误了,但是无法登录
查看了项目相关配置,登录部分的代码如下
RegisteredServices.xml
<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
<RegisteredAssemblies>
<RegisteredAssembly AssemblyName="Luoma.OA.FMS.Framework" />
<RegisteredAssembly AssemblyName="Luoma.OA.TPS.Service" />
</RegisteredAssemblies>
<DNSList>
<DNS DomainName="framework.fms.com" RoutingType="Seq">
<IPList>
<IP Address="127.0.0.10" Factor="1"/>
</IPList>
</DNS>
</DNSList>
<ServiceTypes>
<ServiceType ServiceName="TPS_*" TypeName="Luoma.OA.TPS.Service.*" />
</ServiceTypes>
<ClientTypes>
<ClientType ServiceName="FMSFramework_*" ContractName="Luoma.OA.FMS.Framework.*" />
</ClientTypes>
<ClientTypes>
<ClientType ServiceName="ExcelService" ContractName="Luoma.OA.FMS.Framework.ExcelService.IExcelService" />
</ClientTypes>
<RegisteredServices>
<Service ServiceName="FMSFramework_*" Address="net.tcp://framework.fms.com:18801/*" />
</RegisteredServices>
</Configuration>
登录是去 127.0.0.10
这台机器验证的,和运维同学联系后,果然这台机器有问题,没有配置 TNS 导致报错
替换为另一台配置好的机器地址后,问题解决
<IP Address="127.0.0.11" Factor="1"/>
OracleOraDb11g_home1TNSListener 服务启动后停止
1.问题描述
在服务中启动 OracleOraDb11g_home1TNSListener
,提示下面的错误
---------------------------
服务
---------------------------
本地计算机上的 OracleOraDb11g_home1TNSListener 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。
---------------------------
确定
--------------------------
2.原因分析
我的环境变量配置,TNS_ADMIN
配置如下
环境变量名称 | 环境变量值 | 具体含义 |
---|---|---|
TNS_ADMIN |
D:\Program Files\PLSQL Developer |
TNS 配置文件地址 |
为了解决问题 ORA-01033: ORACLE initialization or shutdown in progress,我把 TNS_ADMIN 修改为
环境变量名称 | 环境变量值 | 具体含义 |
---|---|---|
ORACLE_HOME |
D:\Oracal\app\product\11.2.0\dbhome_1 |
TNS 配置文件地址 |
TNS_ADMIN |
%ORACLE_HOME%\network\admin |
该环境变量的值为 tnsnames.ora 文件所在路径。设置 TNS_ADMIN 变量是为了能够找到 tnsnames.ora |
对比两个目录的文件,发现 listener.ora
的某个部分有差异
(1)D:\Program Files\PLSQL Developer\listener.ora
这个是正确的
#这是一个名为 LISTENER 的监听器
#监听的协议是 TCP 协议
#监听的主机 IP 是 v_hwhao-PC3
#监听的端口是 1521 端口
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = v_hwhao-PC3)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
(2)D:\Oracal\app\product\11.2.0\dbhome_1\network\admin\listener.ora
这个是错误的
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = v_hwhao-PC3)(PORT = 1521))
)
)
3.问题解决
下面两个办法任意选一个都可以
(1)恢复 TNS_ADMIN
配置,问题解决。
环境变量名称 | 环境变量值 | 具体含义 |
---|---|---|
TNS_ADMIN |
D:\Program Files\PLSQL Developer |
TNS 配置文件地址 |
(2)或者修改 D:\Oracal\app\product\11.2.0\dbhome_1\network\admin\listener.ora
对应配置项为
#这是一个名为 LISTENER 的监听器
#监听的协议是 TCP 协议
#监听的主机 IP 是 v_hwhao-PC3
#监听的端口是 1521 端口
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = v_hwhao-PC3)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)