从来没有想过,我又要回过头来重新捡起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这三个文件,这三个文件别看后缀名是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.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
这个sqlnet.ora文件实际上就是一个配置文件,主要是和接下来说的tnsnames.ora配合使用。关于sqlnet.ora的具体作用,请参见这篇《Oracle学习笔记——详解sqlnet.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文件就可以了。
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 <客户端配置的别名>
// 判断是否连通ORCL别名对应服务器上的数据库
tnsping ORCL
好了,总结完毕,一个小小的知识点,背后却是隐藏着这么多的内容。以谦虚的态度去学习每一个知识点。从这篇文章开始,开始Oracle学习的漫长之旅。有任何问题,请留言,希望和Oracle爱好者一起学习交流。
Stay hungry,Stay foolish!!!
2015年4月20日 于呼和浩特。