这都是命
从来没有想过,我又要回过头来重新捡起Oracle。还记得那是大学的时候,非常羡慕我的Oracle数据库老师,各种问题都能搞定,以至于在大学的时候,学习Oracle记了N多的笔记,各种学习心得,不过那个时候傻得不知道写博客,到今天总结的笔记也不知道去哪里了。
从大城市回到了家乡小城市,大城市互联网公司几乎没有用Oracle这种东西的,基本都是MySQL等,而回家以后,这里几乎没有互联网公司,都是传统的IT企业,用的都是Oracle数据库,如我现在的东家。
重新捡起Oracle,真的是感慨万千,几分熟悉,又是几分陌生。知识就是在你一段时间不用以后,就会慢慢的变的陌生起来。以至于今天再看Oracle,仅仅是似曾相识。从这篇文章起,就开始我学习Oracle的漫长之旅。希望有搞Oracle的朋友一起作伴,一同交流。
我遇到的问题
搞Oracle,第一件事就是客户端连接网络上的Oracle数据库。一般我们用的客户端都是PL/SQL Developer。现在问题来了,我安装完PL/SQL Developer以后,死活就是连不上。好吧,我承认,不Google,我搞不定。根据对应的错误提示,Google之后,就有了这篇文章。
监听是什么?
如果你做过网络开发,对于监听listen就比较熟悉了,监听是什么,在网络开发中,就是监听某个端口,等待客户端的连接。同理,在Oracle中,监听的意思也和这差不多。
在Oracle数据库服务器中,通过一个叫“监听器”的组件接收来自客户端的连接请求,它是客户端和服务器端中间的桥梁。监听器虽然在Oracle服务器端,但是它和Oracle主进程并不绑定,它是一个独立运行在服务器端的后台进程,独立于数据库运行。它负责对客户端传入的连接请求进行监听,并且对服务器端的连接负荷进行调整。当客户端准备建立一个到服务器端的连接时,监听器接收客户端的连接请求,然后再将这个客户端连接请求交给服务器进行处理,一旦客户端和服务器建立连接,客户端和服务器以后就直接进行通信,而不再需要监听器的参与,这就好比师傅领进门,修行靠个人。就如下图所示:
- 客户端向服务器端发出连接请求,监听器监听到客户端的连接请求;
- 监听器把客户端的连接请求交给数据库服务器进行处理;
- 经过监听器建立连接以后,客户端与服务器端就可以直接进行通信,而不再需要监听器的参与了。
以上就是监听器干的活,也就是说,你对数据库服务器的第一次,肯定会给监听器,如果监听器没有配好,你就甭想连数据库了。那么,怎么才能配好监听器呢?
listener.ora、sqlnet.ora和tnsnames.ora文件
说到配监听器,就不得不先来说说listener.ora、sqlnet.ora和tnsnames.ora这三个文件,这三个文件别看后缀名是ora,其实就是一文本文件,可以使用记事本打开看看。
- listener.ora文件
打开listener.ora文件看看,贴上一部分有代表性的内容。#这是一个名为LISTENER1的监听器 #监听的协议是TCP协议 #监听的主机IP是127.0.0.1 #监听的端口是1521端口 LISTENER1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) #记录了监听器LISTENER1服务的全局数据库名、数据库路径和数据库实例名 SID_LIST_LISTENER1 = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ORCL) (ORACLE_HOME = C:\Oracle11g\product\11.2.0\dbhome_1) (SID_NAME = ORCL) ) )
只有我们在服务器端配置好了监听,客户端才有可能连上数据库服务器,至于客户端是如何连数据库服务器的,稍后再讲。
-
sqlnet.ora文件
打开sqlnet.ora文件看看,内容如下:SQLNET.AUTHENTICATION_SERVICES= (NTS) NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
这个sqlnet.ora文件实际上就是一个配置文件,主要是和接下来说的tnsnames.ora配合使用。关于sqlnet.ora的具体作用,请参见这篇《Oracle学习笔记——详解sqlnet.ora的作用》。
-
tnsnames.ora文件
tnsnames.ora文件存放于客户端机器上,和sqlnet.ora文件配合使用。可以简单的看看tnsnames.ora文件中的内容。#ORCL是个别名 #这条信息记录了我们使用TCP协议,去连接IP地址为127.0.0.1,端口号为1521的数据库主机上服务名为orcl的数据库 ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )
以后,我们还会配置更多的数据库连接信息,比如我要连接192.168.10.2主机上的数据库,我们只需要在tnsnames.ora中继续追加新的连接信息即可,比如:
STDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.2)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = stdb) ) )
看到这里,你可能觉的你已经明白了tnsnames.ora文件的作用了,推荐你继续阅读以下这篇《Oracle学习笔记——详解sqlnet.ora的作用》,更好的理解sqlnet.ora与tnsnames.ora文件是如何搭配工作的。
服务器端配置
好了,配置监听主要就是配置listener.ora、sqlnet.ora和tnsnames.ora这三个文件,而在服务器端,只需要我们搞定listener.ora文件就可以了。
- 我们可以直接使用Oracle自带的配置工具——Net Manager来配置,作为一名Geeker,绝对不会去使用那么难用的工具的,还是直接修改listener.ora来的快,来的省事,如果你非要使用Net Manager去配置,请去Google吧;
- 直接编辑listener.ora,就像下面这样,配置一个新的监听器:
LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ORCL) (ORACLE_HOME = C:\Oracle11g\product\11.2.0\dbhome_1) (SID_NAME = ORCL) ) )
你想在哪个数据库上配置一个新的监听,就修改对应的内容即可。
上面也说了,监听器是一个独立的进程,那么配置好了监听,就需要启动监听程序,那么如何启动呢?请阅读下面的【常用命令】一节。
客户端配置
客户端配置就更简单了,在【listener.ora、sqlnet.ora和tnsnames.ora文件】一节中,介绍tnsnames.ora文件时,就进行了举例说明,这里就不再多说了。
解决我的问题
哦,说了这么多了,该回到我的问题上来了,我就是连不上远程的数据库,归根到底就是没有在客户端配置远程数据库信息,这个问题很简单,但是如果你不懂得这中间的原理的话,你就不会了解这个问题的本质。
很多时候,一个问题就是很简单,就是一个很简单的知识点,今天多总结一点,就为明天少挖一个坑,或者就会帮别人多填一个坑。
常用命令
上面也说了,服务器配置完成以后,如何启动监听进程,查看监听器的状态,停止监听进程呢?在工作中,我们会经常用到下面的一些命令:
- 启动监听器
lsnrctl start <监听器的名字> // 启动名为LISTENER的监听器 lsnrctl start LISTENER
当我们不指定监听器的名字时,就默认启动LISTENER监听器;
-
关闭监听器
lsnrctl stop <监听器的名字> // 关闭名为LISTENER的监听器 lsnrctl stop LISTENER
当我们不指定监听器的名字时,就默认关闭LISTENER监听器;
-
查看监听器的状态
lsnrctl status <监听器的名字> // 查看名为LISTENER的监听器的运行状态 lsnrctl status LISTENER
当我们不指定监听器的名字时,就默认查看LISTENER监听器的状态。
现在服务器端的监听进程已经启动起来了,客户端也已经配置好了,那么如何进行连通性测试呢?
- 使用tnsping命令
tnsping <客户端配置的别名> // 判断是否连通ORCL别名对应服务器上的数据库 tnsping ORCL
- 使用客户端SQLPLUS连接数据库
打开SQLPLUS连接一下远程数据库,就可以进行测试; -
使用PL/SQL Developer连接数据库
总结
好了,总结完毕,一个小小的知识点,背后却是隐藏着这么多的内容。以谦虚的态度去学习每一个知识点。从这篇文章开始,开始Oracle学习的漫长之旅。有任何问题,请留言,希望和Oracle爱好者一起学习交流。
Stay hungry,Stay foolish!!!
果冻想,认真玩技术的地方。
2015年4月20日 于呼和浩特。
666我第一次也监听这东西都不知道是什么东西,我只知道Java的web里也有个Listener监听器.监听一些操作好像