Oracle这个数据库是不错,但刚开始搞吧,这个东西体量有点大,牵扯的内容有点多,由一时半会不会弄,尤其是各种数据库、服务、监听等概念,一股脑上来傻傻分不清,尤其是出现问题的时候,往往是张二的和尚摸不着头脑,急出一身汗,系统通过跟大家一块理清一些概念,能对大家在解决问题的时候有点帮助吧。注意,我是拿Windows环境下的Oracle来说事的。
1、首先来聊聊Windows的服务
为啥先拿Windows的服务来做个引子呢?因为在谈数据库的时候都是各种服务:数据库服务、监听服务等等吧,所以对于服务我们得先搞明白,这部分的目的是要区分Windows服务里面的监听服务名和Net Manager里面的监听服务的区别。
1.1、查看windows服务
在Windows服务中可以查看服务属性,服务其实是后端运行的一个应用程序,通过属性可以看到其执行文件的路径,对于Oracle监听对应的应用程序可以看一下其对应的应用程序如下:
1.2、监听器和监听搞清楚
我们经常会把监听和监听器搞为一谈,导致新手往往是糊里糊涂,其实网上很多资料都说了数据库服务和监听服务,并讲了监听服务作为一个接口服务去完成客户端和数据库服务器的对接。但对于监听和监听器没说清楚,导致新手搞不清,也许是跨过门槛后懒得写这些了,我这里交代一下。
安装完oracle后,会在windows的服务里面看到一个名为“OracleOraDb11g_home1TNSListener”的服务,其对应的应用程序前面说了是叫LSNRCTL.EXE程序,这个玩意我这里叫它监听管理器或者监听控制程序,由它来控制监听。
我们在命令行程序里面输入的lsnrctl status/start/stop等,其实就跟你在命令行运行LSNRCTL.EXE然后跟上这些命令是一样的,就是执行的这个程序。注意,lsnrctl并不是监听器程序本身,而是监听器控制的一个小工具(TNSLSNR.EXE)。借助这个工具,我们可以操纵监听器行为、设置监听器参数。
定个义:OracleOraDb1g_home1TNSListener是监听器服务,服务进程为TNSLSNR.EXE,监听程序TNSLSNR.EXE。
然后说一下在net manager里面的监听程序下面配置的这个,我就加他监听或者监听服务,还是要区分出来此处的LISTENER和OracleOraDb1g_home1TNSListener是不一样的,一个是管理器一个是监听本身,个人理解下图中的监听程序对应于OracleOraDb1g_home1TNSListener 但监听程序里面有多个监听(LISTENER,LISTENER2,LISTENER3)。
我们通过命令lsnrctl stop或者windows服务里面右键把监听停止了,那么net manager里面的监听也就没用了。
2、再说说数据库服务和监听的事
oracle安装后,在windows服务里面可以看到很多oracle开头的服务,安装结束后这些服务就自动注册到系统里面了,我们日常用的话需要注意两个,这两个必须启动,否则oracle数据库不能正常使用。
OracleServiceORCL:数据库的主服务(数据库服务管理器),此服务必须开启,否则无法使用Oracle。
OracleOraDB11Home1TNSListener:数据库的监听服务(监听服务管理器),客户端若要连接服务器或者本机通过网络连接数据库,此服务必须开启。
我理解的这两个管理器可以跟net manager图中有这样的对应关系,这样就比较合理了。
数据库服务名,在下图中的框内有数据库的服务名和服务命名,图下图所示:
2.1、服务命名和服务名的关系
关于服务命名,Oracle自己的解释是“服务命名文件夹用于配置本地命名方法。本地命名方法是命名方法之一,使用这种方法可以将简单名称、Net服务名解析为连接到数据库或服务所需的信息”。初次看到这段官方解释,往往很难看懂。我的理解是,所谓命名服务,其实就是一个将普通名字映射到某个连接字符串的 key-value 对,其中key就是这个“命名服务”的名称,可以自己任意选取,例如“abc”,以后在连接数据库的时候,只需要输入“abc”进行连接;服务器在收到“abc”之后,可以自动将其解析为它所对应的value,即连接到某个数据库的连接字符串,完成连接。在上图中就是服务命名为tst1,而服务名是tst,需要注意的是一个服务名可以对应多个服务命名。
当我们测试数据库的时候可以用服务名,也可以用服务命名测试,加入配置了如下的服务命名和服务名:
那么测试连接就可以用下面两种方式:
2.2、监听和服务名的关系
监听(Listener)是一种后台进程,它监控来自客户端的连接请求,并根据其配置文件(通常是listener.ora)中定义的规则,将这些请求路由到相应的数据库服务或实例进行处理。目前的版本中,在数据库安装或者创建结束后默认的监听已经被配置,客户可以通过用户名、密码、IP及端口信息可以直接连接。当然默认的监听也可以删除然后新建监听,监听也可以有多个,但处于活动状态的只有一个。
本质上,Listener是建立实例和客户端进程之间联系的桥梁。Listener与实例之间的联系,就是通过注册的过程来实现的。注册的过程就是实例告诉监听器,它的数据库数据库实例名称instance_name和服务名service_names。监听器注册上这样的信息,对客户端请求根据监听注册信息,找到正确的服务实例名称,那么很容易想到,一个监听对应多个数据库实例,或者叫服务名。
服务名,就是为给监听服务的,就是说服务名和监听存在关系,创建服务名的时候还记得有输入主机名、端口和服务名吧,那个地方的服务名,准确来说应该是数据库实例名。
在创建监听的时候需要配置“数据库服务”,那个地方就写上前面服务命名的名称,这样就能够建立数据库实例名-服务命名-服务命名-监听的对应关系,在net manager里面就能对应起来了。监听就能通过服务命名找到实例名,就能跟客户端的连接对上了:
但服务名还要跟数据库实例关联起来,才能体现监听的作用,这个关系在创建服务名的时候很容易被忽视了,如下图,这样就能通过查询监听状态,关联到相应的实例(如果把服务名和实例名一致的话就填入第一个里面,有的地方直接说“在服务名中填你的数据库的名字,就是你想用的数据库”有失妥当),就能在命令行显示了,这个后面有。
通过上面的说明应该能清楚两者的联系了吧,因为在创建监听的时候很多新手都是知道去创建,但创建了和服务名啥联系,不一定能搞清楚,希望这儿能有所帮助。
2.3、本地网络服务名
这个地方稍微说一嘴什么叫本地网络服务名,因为他的名字笔记唬人看着想服务器端的玩意,其实是客户端的,也就是oracle client相关的,我们安装oracle的时候相当于在一台机器上安装了服务端和客户端,其实有个单独的客户端安装文件,安装后也可以使用net manager/net configration assistant。
本地网络服务名,即客户端与服务器的连接字符串,本地网络服务名是客户端的配置,Oracle客户端安装后,可以使用客户端自带的网络配置向导(Net Configuration Assistant)进行配置。
参考:https://blog.csdn.net/weixin_52613927/article/details/120262284
3、最后对一些其他概念下个定义
Oracle:通常一说就是orale数据库,其实Oracle是个大概念,应该定义为Oracle数据库系统,一个Oracle数据库系统中可以同时安装几个数据库,每一个数据库对应一个唯一的实例,这样就好理解下面的数据库了。
数据库:就是实际的磁盘上的文件(数据文件、日志文件、控制文件等),负责保存数据,但由对应的实例来操作它的数据,也可以说数据库是静态的一对文件,躺那儿不动,得有实例来操作他。
数据库实例:是指的操作系统中一系列的进程以及为这些进程所分配的内存块。在Oracle中,我们可以新建一个Oracle的实例(Instance),这个时候虽然有了进程还有SGA等一系列的内存快,但是这个时候并没有把数据库文件读取进来,所以只是一个实例,在后来,你可以通过命令手动或者自动地把数据库文件加载进我们的数据库实例(Instance)中(可以理解数据库实例包裹着数据库,通过实例去操作数据库,但壳子和内容是分离的,需要一个load过程,否则实例就是空壳子),这个时候的数据库才可以让我们真正的开始访问操作。所以说,数据库的应用如果想实现,数据库和数据库实例是缺一不可的,如果只有数据库的那些文件,那么,只能代表数据在这个文件中,但是我们无法直接进行操作。而如果只有数据库实例,那么我们虽然可以进行操作,但是也不知道操作哪些数据,操作生成的数据也无法保存等等。所以,当一个Oracle Instance真正Load了一个Oracle Database了以后,数据库才可以被我们使用。
需要注意的是:
实例可以在没有数据文件的情况下单独启动 startup nomount , 通常没什么意义
一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数据库
全局数据库:
注意这里的全局数据库名与数据库SID有所区别,全局数据库名实际通过域名来控制在同一网段内数据库全局命名的唯一性,就如Windows下的域名控制器,如这里可以输入myoracle.192.168.1.5。Oracle主目录可以不填写,输入SID,如myoracle。完整的数据库服务配置如下图示:
他跟你前面创建的(或自动生成的)服务命名对应起来:
参考资料:
https://blog.csdn.net/Ruishine/article/details/129147814
https://www.cnblogs.com/kane1990/p/OracleNetManager.html
https://jingyan.baidu.com/article/0aa223755099c788cc0d64ff.html
https://www.cnblogs.com/halberd-lee/p/12079480.html