一、起篇
现在怎么说也是互联网时代,数据库也要联网,很多朋友学习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]$ ls listener.ora samples shrept.lst tnsnames.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]$ lsnrctl LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 01-APR-2013 14:16:24 Copyright (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_name NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ service_names string orcl, hndx
这个时候可以查询一下状态了:
[oracle@hndx ~]$ lsnrctl status LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 01-APR-2013 14:24:37 Copyright (c) 1991, 2005, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hndx)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production Start Date 01-APR-2013 14:21:59 Uptime 0 days 0 hr. 2 min. 38 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/10.2.0/db_1/network/admin/listener.ora Listener Log File /u01/app/oracle/10.2.0/db_1/network/log/listener.log Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hndx)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0))) Services Summary... Service "PLSExtProc" has 1 instance(s). Instance "PLSExtProc", 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 hndx TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 01-4月 -2013 14:48:26 Copyright (c) 1997, 2010, Oracle. All rights reserved. 已使用的参数文件: D:\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 dispatcher NAME 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 sysdba alter system register; lsnrctl status Services Summary... Service "PLSExtProc" has 1 instance(s). Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully 发现没有动态服务名
解决方法:
cd $ORACLE_HOME/network/admin vi tnsname.ora tt = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1522)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) ) sqlplus / as sysdba alter system set local_listener=tt; alter system register; Services Summary... Service "PLSExtProc" has 1 instance(s). Instance "PLSExtProc", 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... 发现动态注册已成功