客户机中PLSQL DEV访问虚拟机中的ORCLE11g,错误百出!
创建时间: | 2017/10/14 18:44 |
作者: | CNSIMO |
标签: | ORACLE |
忙了一下午,只有两个字形容:麻烦!
安装ORACLE1g
首先,我已经提前在虚拟机上配置了windows2008+oracle11g,为什么用server2008呢?我没有别的,win10做虚拟机觉得不太好,win7镜像还得下载,你懂的。 然后就是oracle11g是去某电脑上拷过来的,我是一个十分爱惜流量的人,嘿嘿。
我们老师为了让我们更清楚区分数据库软件安装和数据库配置,所以在安装oracle11g的时候选择的是”只安装数据库软件“(记得是第二个选项),然后安装的时候字符集都设置的UTF8,其他的配置基本上都是保持的默认。
好了,安装的事情不细说,一般情况下只要是主机没问题,检测条件通过,安装都是不成问题的,下面就开始了配置数据库。
首先使用,有的可能不是。
例如我的web管理页面:https://server2008:1158/em,我的数据库监听端口是1521。
管理页面如下:
如果刚安装完,红框中的状态不对,那么考虑重装或者重启ORACLE各项服务或者重启ORACLE服务器。
重启ORACLE服务器的操作如下:
打开cmd输入以下命令:
sqlplus / as sysdba
shutdown immediate
startup
然后说ORACLE这几个配置工具的功能:
- DCA:管理数据库(创建、删除等等)
- NCA:配置数据库网络服务(监听、服务名等)
- Net Manager:网络综合管理工具(监听、服务名等具体信息查看更改等)
还有一个工具sqlplus也很常用,使用它访问ORACLE数据库地操作如下(cmd中):
如果是普通用户
sqlplus username/password@hostname/tnsname
如果是sysdba用户,例如sys
sqlplus sys/password@hostname/tnsname as sysdba
后面用到地时候你可能会更明白一些。
然后还有三个很重要的文件,其中两个需要知道一下:
注意路径哦!格式:{database_base}\network\admin。
在Net Manager或者NCA中更改监听或者服务名的信息后可能会映射到这两个文件,例如我在Net Manager中更改了LISTEN的地址,在listener.ora文件中是有体现的,可以打开看看,但是最好不要手动地去更改里面地内容,因为一不小心感觉没错就可能被人坑了。想要更改,还是在Net Manager中更改比较合适,例如现在我在Net Manager中将LISTEN地监听端口由1521变成了1522,打开listener.ora文件可以看到相应的地方也变了。
Tip:如果你在你不知道什么情况的情况下,你使用Net Manager做了一些操作,而且你也忘了原来是什么了,不要紧,关闭Net Manager窗口的时候会提示你是否保存,选择否即可恢复!
说了这么多没用的,我的目的还没实现呢,怎么在真机中访问虚拟机内的数据库呢?
先说明一下预先条件:
- 我所说的话,都是假设你对计算机了解,并且有基础,思维敏捷,熟悉VM虚拟机,不懂的请提问。
- 宿主机和虚拟机能够互相ping通,如果不行,尝试将连接方式改为NAT,宿主机中的VMNet8网卡ipv4设置为自动获取IP。
- 宿主机中的ORACLE的各项服务都已经正常启动。
- 还得知道环境变量怎么配置,不懂的自动百度学习。
我的机器配置如下:
- 虚拟机:VM12.5.7版本
- 宿主机:win10专业版1703
- PLSQL Developer 12(下载地址:https://www.allroundautomations.com/bodyplsqldevreg.html)
- 虚拟机:server2008r2 企业版,内存2G
- oracle:11g,数据库实例名称STD,全局数据库名STD.CNSIMO.CN,所有密码唯一:Admin2015,字符集:UTF8,语言:简体中文
连接步骤
- 官网下载instant client,http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html。
- 下载基础包和sqlplus包
- 一起解压出来后,得到一个文件夹,将它复制到任意位置,例如:D:\PLSQL Developer 12\
- 在D:\PLSQL Developer 12\instantclient_12_2中(以下简称{instantclient})新建文件夹network,在network中新建文件夹admin。
- 到{instantclient}\network\admin中新建记事本文件,下列代码复制进去并保存为utf-8格式,名称改为tnsnames.ora【后缀名txt->ora】,注意格式不能变(少一个多一个空格都不行)。
tip:请将STD.CNSIMO.CN改为自己的全局数据库名,HOST和PORT也改为自己的,首行的STD可以随便写。
STD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.138)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = SHARED)
(SERVICE_NAME = STD.CNSIMO.CN)
)
)
- 打开PLSQL DEV12,找到【首选项】设置
- 然后,在connection中安装图示设置,instantclient的位置。
- 很重要的一步,到虚拟机注册表中查看NLS_LANG的值,若无此路径则直接查找NLS_LANG,复制此键值。
- 很重要的一步,在宿主机中新建系统环境变量NLS_LANG,值与虚拟机中保持一致!
- 很重要的一步,再新建系统环境变量TNS_ADMIN,值为{instantclient}\network\admin
- 更改环境变量PATH,添加值为{instantclient}。
- 然后cmd中,运行sqlplus命令连接远程数据库,命令为:sqlplus sys/Admin2015@192.168.111.138/STD.CNSIMO.CN as SYSDBA,下图代表连接成功。
- 重新打开PLSQL DEV,尝试连接,填写用户名密码,database下拉框中如果没有出现之前在tnsnames.ora首行写的名字STD,就手动输入STD,并作为SYSDBA连接。成功的话,会进入主界面,否则提示。
解决问题
好了,连接的常规步骤已经看完了,但是事实上好多时候并不能真正的如愿以偿,问题碰到了一堆,常见的问题描述可能如下:
- ORA-12170: TNS:Connect timeout occurred
- ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
- ORA-12705: Cannot access NLS data files or invalid environment specified
先解决第一个问题,你可尝试ping一下你的远程主机,可能ping不通,所以需要你更改一下虚拟机和主机之间的网络连接方式;
然后第二个问题,导致这个问题的根本原因是在远程主机上该服务名并没有被监听程序监听,例如我通过sqlplus连接的时候将STD.CNSIMO.CN改为STD或者其它随便一个,都会报这个错误。解决方法如下:
打开Net Manager,选择服务命名,点击加号添加服务,列表中显示的std仅仅具有本地意义,重要的是右边的服务名,设置成全局数据库名,连接类型选择 共享服务器。
然后关闭Net Manager并保存配置。
再次尝试连接,如果还是连接不上,尝试重启ORACLE数据库!
Tip:网上可能查到的都是更改虚拟机中tnsnames.ora和listener.ora这两个文件,擅自更改后可能导致的问题是数据库连接不上、NetManager和NCA中部分功能无反应的问题。因为oracle对这两个文件的内容格式要求的太严格了。红框的首部不能有空格,蓝框的首部必须有空格!
至于最后一个问题,请检查环境变量中的NLS_LANG的值是否和远程主机注册表中的值相同,切记不要手敲!如果还是这个问题,可能是你刚配置完环境变量,cmd的命令框还是之前开的,请重开一个cmd再次尝试。