一、起篇
现在怎么说也是互联网时代,数据库也要联网,很多朋友学习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
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./db_1)
(PROGRAM = extproc)
)
) LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hndx)(PORT = ))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
监听控制工具:lsnrctl
[oracle@hndx admin]$ lsnrctl LSNRCTL for Linux: Version 10.2.0.1. - Production on -APR- :: Copyright (c) , , 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. - Production on -APR- :: Copyright (c) , , Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hndx)(PORT=)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1. - Production
Start Date -APR- ::
Uptime days hr. min. sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/10.2./db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/10.2./db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hndx)(PORT=)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "PLSExtProc" has instance(s).
Instance "PLSExtProc", status UNKNOWN, has handler(s) for this service...
Service "hndx" has instance(s).
Instance "orcl", status READY, has handler(s) for this service...
Service "orcl" has instance(s).
Instance "orcl", status READY, has handler(s) for this service...
Service "orclXDB" has instance(s).
Instance "orcl", status READY, has handler(s) for this service...
Service "orcl_XPT" has instance(s).
Instance "orcl", status READY, has 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./db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /u01/app/oracle/10.2./db_1)
(GLOBAL_DBNAME = www)--www就是静态注册的服务名
)
) LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hndx)(PORT = ))
(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 = ))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
测试hndx的连通性:
C:\Users\oracle>tnsping hndx TNS Ping Utility for -bit Windows: Version 11.2.0.1. - Production on -4月 - :: Copyright (c) , , Oracle. All rights reserved. 已使用的参数文件:
D:\app\oracle\product\11.2.\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=;
服务器进程
通过设置shared_servers来配置服务器进程,如:
alter system set shared_servers=;
服务器进程可以根据需要动态生成。如果将shared_servers设置为0,则服务器进程一旦使用完毕就会被删除。
我们应该建立较少的服务器进程,如果不够用的话,则让系统根据负载自动创建额外的服务器进程。能够自动
同时创建的服务器进程个数有参数max_shared_servers决定。如:
alter system set max_shared_servers=;
这时数据库默认会有5个服务器进程运行,当数据库负载增加,需要额外的服务器进程时,则会自动创建服务器
进程,最多有20个服务器进程。而当数据库负载下降时,也会自动删除服务器进程,直到剩下5个服务器进程。
共享连接的session个数
参数shared_server_sessions说明同时可以进行共享连接的session的个数。
能够同时使用专用连接的session个数等于参数sessions减去shared_server_sessions的值。
alter system set shared_server_sessions=;
在服务器端配置了共享连接以后,还需要在客户端的tnsnames.ora文件里指明,要采用共享连接方式进行连接,如:
orcl =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.20)(PORT = ))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
(SERVER = shared) --------如果是专用的话是:SERVER=DEDICATED
)
)
当我们以orcl作为客户端的连接字符串连接到数据库以后,可以用如下方式显示服务名的详细信息,从而验证是否成功建立共享连接;
共享连接的限制
有些操作不能再共享连接下完成。
启动关闭数据库实例
创建表空间和数据文件
维护表和索引等数据库管理的工作。
共享连接适用于单纯的OLTP应用。对于需要扫描大量数据,运行时间较长的操作,不适合采用共享连接,例 如备份恢复
六、设置默认端口后
如果如果监听的端口号不是1521,动态注册不成功,如何解决?
listener.ora中的内容:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = ))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
发现端口号为1522,动态注册不成功:
sqlplus / as sysdba alter system register; lsnrctl status Services Summary...
Service "PLSExtProc" has instance(s).
Instance "PLSExtProc", status UNKNOWN, has 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 = ))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
) sqlplus / as sysdba alter system set local_listener=tt; alter system register; Services Summary...
Service "PLSExtProc" has instance(s).
Instance "PLSExtProc", status UNKNOWN, has handler(s) for this service...
Service "orcl" has instance(s).
Instance "orcl", status READY, has handler(s) for this service...
Service "orcl_XPT" has instance(s).
Instance "orcl", status READY, has handler(s) for this service... 发现动态注册已成功