本人在使用oracle的时候,常常发现plsql连不上oracle的时候。有的本机不能连,有的远程不能连,时常捉摸不透问题到底出在哪儿,一会儿实例名,一会儿服务名,一会儿说缺少监听,一会说解析不了服务,又有时候发现ip能连,localhost不能连,问题颇多。这几天弄了几台虚拟机专门安装oracle,了解了一些皮毛,记录下来。
本人主要论述ORACLE后,如何配置实现PLSQL访问的问题。
一 基本说明
1 操作系统是win7。
2 oracle是11g2R。
3 plsql是免安装版本,内含简约版oracle客户端instantclient。
4 需要安装的是oracle数据库,oracle客户端和plsql都不需要安装。
二 基本配置
1 我们安装好oracle以后,安装目录一般类似这个结构F:\app\Think\product\11.2.0\dbhome_1(本文以此为例)。这个时候,默认会有一个实例orcl,服务名一般为ORCL。
2 plsql免安装版解压后,目录D:\install\PLSQL,目录结构如下:
D:\install\PLSQL
|-- instantclient_11_2
|-- tnsnames.ora
|-- PLSQL Developer
|-- readme.txt
三 配置
1 修改F:\app\Think\product\11.2.0\dbhome_1\NETWORK\ADMIN下面listener.ora和tnsnames.ora
1.1 listener.ora内容如下:
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 计算机名)(PORT = 1521))
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = F:\app\Think\product\11.2.0\dbhome_1)
(SID_NAME = ORCL)
)
)
ADR_BASE_LISTENER = F:\app\Think
1.2 tnsnames.ora内容如下:
tns =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = WIN-I9IGNNTD71I)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL)
)
)
1.3 配置环境变量
NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK
TNS_ADMIN = F:\app\Think\product\11.2.0\dbhome_1\NETWORK\ADMIN
1.4 重启OracleOraDb11g_home1TNSListener和OracleServiceORCL服务
1.5 使用plsql连接,输入用户名、密码,选择tns选项,选择normal,连接。
三 lsnrctl status的作用
1 我们经过以上步骤后,一般能够连接上。不过也经常出现各种错误提示,比如监听程序无法识别连接描述符中请求的服务、监听程序无法识别连接描述符中请求的SID等。这时候我们在命令行中输入lsnrctl status查看结果LISTENER 的 STATUS:
------------------------
别名 LISTENER
版本 TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Produ
ction
启动日期 27-9月 -2016 19:42:43
正常运行时间 0 天 0 小时 3 分 41 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 F:\app\Think\product\11.2.0\dbhome_1\network\admin\lis
tener.ora
监听程序日志文件 f:\app\think\diag\tnslsnr\swxx_dyl\listener\alert\log.
xml
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=swxx_dyl)(PORT=1521)))
服务摘要..
服务 "ORCL" 包含 2 个实例。
实例 "ORCL", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orclXDB" 包含 1 个实例。
实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
如果能看到服务摘要下面的内容,说明监听已经启动,并且已经监听了一些服务和实例。以上就表示监听了两个服务:一服务名ORCL带俩实例ORCL和orcl。二服务名orclXDB带实例orcl。这个时候我们看一看tnsnames.ora看一看CONNECT_DATA这个节点的内容,这里可以配置成SERVICE_NAME=服务名或者SID=实例名的形式,服务名或者实例名要在上面status的列表中有才行。这里尤其注意服务名和实例名不是大小写敏感的。比如这个例子,我在tnsnames.ora配置成SERVICE_NAME=oRclXdb也是可以的。
如果服务摘要下面的内容没有服务列表,那么说明问题正出在这里。首先我们看一看监听程序参数文件,看看这个文件的内容是不是和我上面的配置一样。如果监听程序参数文件的位置不是F:\app\Think\product\11.2.0\dbhome_1\listeners.ora,我们查看一下环境变量TNS_ADMIN设置是否正确。
四 listeners.ora和tnsnames.ora
1 oracle加载的listerers.ora的位置首先是取环境变量TNS_ADMIN位置下的同名文件,如果没有环境变量TNS_ADMIN,取F:\app\Think\product\11.2.0\dbhome_1\listeners.ora。它的配置主要是HOST和SID_NAME。HOST可以是计算机名/ip/localhost/127.0.0.1,个人觉得配置计算机名更通用,本机plsql中可以使用计算机名/ip/localhost/127.0.0.1:port/SID来访问。SID_NAME不能用SID或者SERVICE_NAME取代(注意这里是SID_LIST_LISTENER)。SID_NAME的值要用实例名,可以连上sqlplus后使用select instance_name from v$instance查看实例名,一般为orcl。
2 tnsnames.ora主要是plsql使用,它的实际位置请参阅五他的主要配置也是HOST和SERVICE_NAME。这里本机访问HOST能使用哪些值取决于listneers.ora的HOST值。SERVICE_NAME=服务名可以换成SID=实例名(注意单实例环境下),这里实例名和服务名也不分大小写。
五 plsql配置说明
plsql需要配置两个东西oci.dll位置和tnsnames.ora位置,这两个地方都在plsql的工具-->首选项中配置。
1 oci.dll在OCI库内配置,找到D:\install\PLSQL\instantclient_11_2\oci.dll。
2 tnsnames.ora,在ORACLE主目录中配置tnsnames.ora的位置。这里要留意一下,如果这里为空,系统寻找环境变量TNS_ADMIN下面的tnsnames.ora配置,如果环境变量TNS_ADMIN没有配置,就寻找F:\app\Think\product\11.2.0\dbhome_1\NETWORK\ADMIN下面的tnsnames.ora。
六 一些注意事项
1 修改文件后,一般需要重启服务。
2 要找到正确位置的listeners.ora和tnsnames.ora再修改。
3 以lsnrctl status是否能展示服务列表为分水岭,不能的话,说明服务端还没配好,要找到服务端的listeners.ora到底在哪,内容到底有没有问题;能展示服务列表的话,可以在plsql中直接用地址字符串来实验。本机的话,地址字符串是localhost/127.0.0.1/ip/计算机名:1521/SID,注意SID要在lsnrctl status服务列表的实例名称中。