本帖最后由 信息发布软件 于 2017-9-1 23:42 编辑
Oracle数据库是网络数据库的典型代表。用户可以通过网络来访问Oracle数据库。Oracle数据库提供了网络互联的各种方案,包括结构和驱动程序,其网络通信协议结构类似于OSI-RM,但又有自己的分层机制。也就是说,Oracle的网络是基于计算机网络的,通过网络使Oracle实现了数据共享、数据完整性控制、数据安全传输、跨操作系统平台(可以同时运行在Linux或者微软的操作系统平台上)、在多硬件平台之间的数据相互操作。
那么是什么保障了Oracle网络的连通性呢?简单的说,是全局数据库名、监听程序与网络服务名这三架马车保障了Oracle网络的连通性。
第一架马车:全局数据库名。
在谈到全局数据库名之前,笔者要先谈谈这个的域名。这个互联网上的域名就相当于我们现实生活中的门牌号码一样,可以在纷繁芜杂的网络世界里准确无误地把我们指引到我们要访问的站点。从这个域名来看,它是由几个不同的部分组成的。这几个不同的部分彼此之间具有上下的层次关系。其中最后的.CN是域名的第一层,.COM是域名的第二层,而.Ctocio则是真正的域名,处在第三层,依次类推。至此我们可以看出域名从后到前的层次结构类似于一个倒立的树型结构。其中第一层的.CN叫做地理顶级域名。在这些地理顶级域名下,还可以再根据需要定义次一级的域名。如在我国的顶级域名.CN下又设立了.COM,.NET,.ORG,.GOV,.EDU,以及我国各个行政区划的字母代表如.BJ代表北京,.SH代表上海等等。故当访问网站时,只需要输入域名即可以打开相应的网站,而不需要输入难以记忆的IP地址。
而Oracle数据库系统是一个大型的分布式数据库系统。有时候出于性能等的考虑,往往需要在企业的多个地方部署多个数据库系统,这就构成了Oracle分布式网络环境。为了保障每个数据库名字的唯一性,Oracle数据库系统借鉴了域名的命名规则,使用域名结构来命名分布在各地的数据库。即一个数据库的全局名字由其数据库名和该数据库所在的域名组成。假设现在某一家企业在浙江有宁波、杭州、舟山三个办事处,分别部署了三个Oracle数据库,其中杭州为总部。结构图如下:
根据全局数据库名命名规则,杭州公司数据库名字为ORAL.DTM 宁波公司的数据库名字为ORAL.NINGBO.DTM,舟山公司的数据库名字为ORAL.ZHOUZHAN.DTM。此时如果应用程序要连接不同部门的得数据库就非常的方便。可以通过全局数据库名字来指定需要访问的数据对象。只需要经过简单的修改,用户就可以连接到所需要连接的数据库。另为,还可以在网络环境配置一个默认域,如此访问默认域中的数据库对象不需要指定域名。
利用全局数据库名能够起到两个好处。一是易于数据库进行扩充。如现在企业可能只用一个数据库来处理业务。但是当企业规模扩大的时候,可能一个数据库不能够满足性能上的需求。或者是因为企业合并等原因,需要部署分布式的数据库环境。此时不需要更改原先的存在的数据库,就可以对数据库环境进行扩充。二是方便数据库的连接。当用户在不同的数据库之间进行更换时,使用全局数据库名将会非常的方便。
故笔者建议数据库管理员,即使企业当前只有一台Oracle数据库时,最好对其进行命名时也能够根据全局数据库命名规则来定义其名字。以利益后续数据库的扩充,同时也便于数据库管理员的日常维护。
第二架马车:网络服务名。
当管理员利用conn system/system @tsh命令连接数据库的时候,@后面的内容就是网络服务名。网络服务名是数据库服务器在客户端的名称。换句话说,就是数据库的别名。通常情况下,一个数据库可以有多个网络服务名。网络服务名主要用来将连接标识符解析为连接描述符,帮助客户端应用程序准确的连接到指定的数据库服务器。一般来说,网络服务器主要提供两方面的信息。一是服务名称,默认情况下服务名称就是数据库全局名称;二是路由信息,即达到指定服务的网络路由,或者说是监听程序的网络地址。当应用程序连接数据库时,其连接字符串中的网络服务名就指出了所需要连接到的数据库服务器。另外,在客户端上,也必须配置有于服务器协议地址相同的连接描述符才能够向监听程序发出连接请求。
可见网络服务名这架马车,在Oracle网络连接中就好像其起到一个马夫手中皮鞭的作用,指挥着这辆马车的前进方向。但是,这架马车比较娇贵,动不动就会出现问题。
如当某个客户端非正常关机后,重新启动。可能会发现无法正常连接到客户端,提示网络服务器名错误而无法正常连接到客户端。再如有时候会因为无法解析全局数据库名字而客户端无法连接到数据库。为了防止网络服务名出现错误,笔者有以下几个建议。
一是网络服务名的信息通常情况下是保存在TNSNAMES.ORA这个文件中。如果意外关机等情况,这个文件中的信息可能会丢失。为此最好对这个文件进行独立的备份。在遇到因为网络服务名错误而无法连接到数据库的时候,可以先利用这个文件进行恢复。通常情况下,都可以解决问题。
二是最好不要手工更改这个文件。虽然这个文件看起来比较简单,但是修改起来比较麻烦。除非你是这方面的专家,否则的话最好不要手工更改这文件。通常情况下,最好采用Oracle数据库自带的工具来配置。笔者建议的作法是,先利用TNS工具把原先的配置文件删除,然后再重新建立一个。这是一个不错的选择。
三是当客户端与Oracle数据库服务器进行连接的时候,如果出现提示网络服务器的错误提示时(监听程序无法找到适用于客户机连接的例程),有部分原因是无法解析数据库全局名所造成的。此时,管理员可以尝试着修改这个文件中的全局数据库名。即把全局数据库名修改为数据库服务器对应的IP地址。如果幸运的话,这么修改后就可以解决客户端的连接问题了。
另外需要注意,有时候系统提示网络服务名错误无法连接到数据库时,有可能不是网络服务名错误所造成。有可能使其他的原因。如有时候如果存在防火墙,系统也会提示这个错误信息。如一次用户在Linux系统上安装Oralce数据库。而默认情况下,Linux系统的防火墙是开启的。在事后没有个防火墙关闭,导致Oralce无法正常连接。Oracle数据库并不是不能够通过防火墙,而是需要在防火墙上进行额外的设置。故如果是出于学习的需要,笔者建议可以先把Linux等操作系统的防火墙服务暂时关闭掉。
第三架马车:监听程序。
监听程序是运行在服务器端的一个单独的服务进程。他的作用就是通过监听端口,监听网络上的客户机对服务器的连接请求,并管理客户机与服务器之间的网络通信量。如果做一个形象的比喻,监听程序就好像是宾馆前面的保安。看到有客人来了,就开门来其进去。如果客人没付钱就走人,保安就会拦住客户不让其走。监听程序其的作用就是跟这个保安的作用非常类似。每次客户端请求连接服务器时,监听程序就会第一时间接收到这个请求。然后监听程序会把这个请求汇报给服务器。另外,监听程序还会对用户的合法性做出辨别。如果客户端提供的连接信息与监听程序保存在配置文件中的信息(如协议、端口、数据库等等信息)匹配的话,则监听程序就授权客户机连接到服务器。否则的话,就会拒绝客户机的连接请求。可见,监听程序这架马车,在数据库连接中起着举足轻重的作用。
现在怎么说也是互联网时代,数据库也要联网,很多朋友学习Oracle的时候无外乎搭建的是以下两种学习环境:
1、直接在windows环境下安装Oracle后直接sqlplus连接。
2、在windows中安装虚拟机中VMware,安装Linux操作系统+Oracle。
3、或者其他服务器上搭建。
第一种还好,基本上不需要网络配置,学习起来也简单。但是如果你想要在其他电脑上访问你自己电脑的数据库的时候麻烦就来了。或第二种你在windows中连接VMware虚拟机中的数据库。你安装好了客户端却不知道如何连接,我也是经过一段时间摸索,然后将这些经验分享给大家
二、客户端到服务器端的连接过程
首先,客户端发出请求---》监听器捕捉客户端发出的请求---》将请求发送给Oracle---》Oracle启动服务器进程---》对客户端的请求进行验证(密码是否正确,是否有权限)---》建立session---》监听结束,客户端与服务器端建立联系后就不再需要监听器了
三、服务器端的配置
监听配置:
创建监听:
[root@hndx ~]# su - oracle[oracle@hndx ~]$ cd $ORACLE_HOME/network/admin[oracle@hndx admin]$ lslistener.ora samples shrept.lst tnsnames.ora
j解释一下:listener.ora:监听文件,负责监听服务
tnsname.ora:记录了本地连接的需要的协议、端口号、ip地址等相关信息。
sqlnet.ora: 提供连接的解析方法
如果不存在listener.ora,先创建
使用netca创建
listener.ora的内容如下:
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /u01/app/oracle/10.2.0/db_1) (PROGRAM = extproc) ) )LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = hndx)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) )
监听控制工具:lsnrctl
[oracle@hndx admin]$ lsnrctlLSNRCTL for Linux: Version 10.2.0.1.0 - Production on 01-APR-2013 14:16:24Copyright (c) 1991, 2005, Oracle. All rights reserved.Welcome to LSNRCTL, type "help" for information.LSNRCTL> help
start--启动监听
stop--关闭监听
status--查看监听的状态
reload-->当监听配置文件发生了改变,使用reload进行重新加载,这个不是先stop再start,而是不中断业务重新加载配置文件
服务名注册:静态注册和动态注册
服务名:从客户端连接oracle,要与oracle的实例进行连接,服务名是对实例名的封装,我们可以通过服务名连接到某个实例
动态注册:PMON每隔一段时间,将参数service_names的值动态的注册到监听器中,状态为READY
SQL> alter system register;--手工触发PMON进行动态注册SQL> alter system set service_names='orcl','hndx';System altered.SQL> show parameter service_nameNAME TYPE VALUE------------------------------------ ----------- ------------------------------service_names string orcl, hndx
这个时候可以查询一下状态了:
[oracle@hndx ~]$ lsnrctl statusLSNRCTL for Linux: Version 10.2.0.1.0 - Production on 01-APR-2013 14:24:37Copyright (c) 1991, 2005, Oracle. All rights reserved.Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hndx)(PORT=1521)))STATUS of the LISTENER------------------------Alias LISTENERVersion TNSLSNR for Linux: Version 10.2.0.1.0 - ProductionStart Date 01-APR-2013 14:21:59Uptime 0 days 0 hr. 2 min. 38 secTrace Level offSecurity ON: Local OS AuthenticationSNMP OFFListener Parameter File /u01/app/oracle/10.2.0/db_1/network/admin/listener.oraListener Log File /u01/app/oracle/10.2.0/db_1/network/log/listener.logListening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hndx)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))Services Summary...Service "
LSExtProc" has 1 instance(s). Instance "
LSExtProc", status UNKNOWN, has 1 handler(s) for this service...Service "hndx" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service...Service "orcl" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service...Service "orclXDB" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service...Service "orcl_XPT" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service...The command completed successfully
静态注册:编辑listener.ora的内容:
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /u01/app/oracle/10.2.0/db_1) (PROGRAM = extproc) ) (SID_DESC = (SID_NAME = orcl) (ORACLE_HOME = /u01/app/oracle/10.2.0/db_1) (GLOBAL_DBNAME = www)--www就是静态注册的服务名 ) )LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = hndx)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) )
静态注册于动态注册的区别
动态注册:是由PMON进行注册的,PMON--只有实例启动的时候才能进行动态注册,当数据库关闭的时候,动态注册连接不了oracle
静态注册:如果数据库是关闭的,通过sys也可以登录数据库。
四、客户端的配置
1. 配置连接方法:
简易连接
本地连接
简易连接:使用netca->选择第二项-->选择轻松连接--完成后,生成sqlnet.ora里如下的内容:
NAMES.DIRECTORY_PATH= (EZCONNECT)
发出简易连接:sqlplus scott/tiger@192.168.0.5:1521/orcl--orcl是监听器中的静态注册或者动态注册的服务名
当发出以上的连接时,oracle首先读取sqlnet.ora里的解析方法EZCONNECT,如果存在就可以解析
然后向主机ip地址为192.168.0.5的1521端口发起连接
本地连接:使用netca->选择第二项-->本地命名--完成后,生成sqlnet.ora里如下的内容:
NAMES.DIRECTORY_PATH= (EZCONNECT, TNSNAMES)
TNSNAMES--就是本地连接的解析方法
创建一个连接符:使用netca->选择第三项-->本地网络服务名配置-->添加-->输入监听器中的服务名-->....->输入一个网络服务名
生成tnsname.ora里如下的内容:
HNDX = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.5)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) )
测试hndx的连通性:
C:\Users\oracle>tnsping hndxTNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 01-4月 -2013 14:48:26Copyright (c) 1997, 2010, Oracle. All rights reserved.已使用的参数文件
:\app\oracle\product\11.2.0\dbhome_1\network\admin\sqlnet.ora
已使用 TNSNAMES 适配器来解析别名
尝试连接 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.5)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = o
OK (20 毫秒)
tnsping:不检查服务名
C:\Users\oracle>sqlplus scott/tiger@hndx
以上的连接过程:首先读sqlnet.ora文件,看是否有TNSNAMES,如果有对hndx进行解析,然后再去tnsname.ora里找hndx,通过hndx进行连接
五、连接方式
有两种连接方式:
1. 专用连接
专用连接的特点:
专用连接:默认的连接方式,一个用户进程对应一个服务器进程用户进程退出,服务器进程也退出,释放所有的资源
用户进程与服务器进程是一对一的关系
2. 共享连接
共享服务器模式:用户进程与服务器进程是多对多的关系,多个服务器进程会处理多个用户进程
查看连接方式:
select server from v$session where sid=(select distinct sid from v$mystat);
专用连接中,用户进程没有发出命令,服务器进程处于空闲状态,资源一直占用,共享模式中,
只要是服务器进程空闲,就可以处理其他用户发出的命令,因此服务器进程的数量减少,对资源的
利用更加高效,占用的PGA减少,可以支持更多的用户
共享连接的工作过程
共享连接模式下,需要配置多个名为dispatcher的组件,dispatcher作为用户进程和服务器进程之间的
协调者,负责将用户进程的请求传递给服务器进程,并将服务器进程得到结果返回给用户PMON定期
将每个dispatcher的地址、以及工作负载注册到监听器里面,当用户进程连接监听器时,监听器会选择
一个负载最低的dispatcher,并把该dispatcher的地址返回给用户进程,用户进程和dispatcher进程建立
连接,用户进程在session的整个生命期间,所连接的dispatcher不会发生改变
共享连接的具体步骤如下:
1、用户进程连接到监听器
2、监听器根据注册的各个dispatcher的负载情况,选择一个负载最低的dispatcher,并将其地址返回给用户进程
3、用户进程根据监听器返回的dispatcher地址,连接到该dispatcher
4、dispatcher接收到用户进程发出的请求以后,会将该请求放入请求队列,该队列位于SGA中,请求队列被所有的dispatcher所共享
5、在服务器进程中,最空闲的服务器进程会从请求队列中按照先进先出的原则,挑选一个请求进行处理
6、服务器进程处理请求后,得到的结果放入响应队列,Oracle为每个dispatcher分配一个对应的响应队列
7、dispatcher到相应的队列中取出结果,返回给用户进程
注意:
1、专用连接中,用户进程和服务器进程一一对应,用户进程对应的PGA被服务器进程独享
2、共享连接中,多个服务器进程会处理多个用户请求,用户的PGA就需要在不同的服务器
进程之间共享,PGA中的UGA部分就会被放入到SGA中,如果配置了large pool,则UGA会
在large pool里分配,没有配置large pool,那么UGA就放在shared pool里面
配置共享连接
配置共享连接时,包含以下几个方面:
1、配置dispatcher进程的数量
show parameter dispatcherNAME TYPE VALUE------------------------------------ ----------- ------------------------------dispatchers string (PROTOCOL=TCP) (SERVICE=orclXD B)alter system set dispatchers='(PROTOCOL=TCP) (dispatchers=3)';
表示启动三个dispatcher,以tcp协议进行连接。可以通过max_dispatchers参数定义数据库里最多
可以同时启动多少个dispatchers,如;
alter system set max_dispatchers=5;
服务器进程
通过设置shared_servers来配置服务器进程,如:
alter system set shared_servers=5;
服务器进程可以根据需要动态生成。如果将shared_servers设置为0,则服务器进程一旦使用完毕就会被删除。
我们应该建立较少的服务器进程,如果不够用的话,则让系统根据负载自动创建额外的服务器进程。能够自动
同时创建的服务器进程个数有参数max_shared_servers决定。如:
alter system set max_shared_servers=20;
这时数据库默认会有5个服务器进程运行,当数据库负载增加,需要额外的服务器进程时,则会自动创建服务器
进程,最多有20个服务器进程。而当数据库负载下降时,也会自动删除服务器进程,直到剩下5个服务器进程。
共享连接的session个数
参数shared_server_sessions说明同时可以进行共享连接的session的个数。
能够同时使用专用连接的session个数等于参数sessions减去shared_server_sessions的值。
alter system set shared_server_sessions=5;
在服务器端配置了共享连接以后,还需要在客户端的tnsnames.ora文件里指明,要采用共享连接方式进行连接,如:
orcl = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.20)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) (SERVER = shared) --------如果是专用的话是:SERVER=DEDICATED ) )
当我们以orcl作为客户端的连接字符串连接到数据库以后,可以用如下方式显示服务名的详细信息,从而验证是否成功建立共享连接;
共享连接的限制
有些操作不能再共享连接下完成。
启动关闭数据库实例
创建表空间和数据文件
维护表和索引等数据库管理的工作。
共享连接适用于单纯的OLTP应用。对于需要扫描大量数据,运行时间较长的操作,不适合采用共享连接,例 如备份恢复
六、设置默认端口后
如果如果监听的端口号不是1521,动态注册不成功,如何解决?
listener.ora中的内容:
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1522)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) )
发现端口号为1522,动态注册不成功:
sqlplus / as sysdbaalter system register;lsnrctl statusServices Summary...Service "
LSExtProc" has 1 instance(s). Instance "
LSExtProc", status UNKNOWN, has 1 handler(s) for this service...The command completed successfully发现没有动态服务名
解决方法:
cd $ORACLE_HOME/network/adminvi tnsname.oratt = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1522)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) )sqlplus / as sysdbaalter system set local_listener=tt;alter system register;Services Summary...Service "
LSExtProc" has 1 instance(s). Instance "
LSExtProc", status UNKNOWN, has 1 handler(s) for this service...Service "orcl" has 1 instance(s). Instance "orcl", status READY, has 3 handler(s) for this service...Service "orcl_XPT" has 1 instance(s). Instance "orcl", status READY, has 3 handler(s) for this service...发现动态注册已成功
好文要顶