ORACLE网络配置大全没有比这个更详细的【weber出品】

一、起篇

  现在怎么说也是互联网时代,数据库也要联网,很多朋友学习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...

发现动态注册已成功

 

ORACLE网络配置大全没有比这个更详细的【weber出品】

上一篇:理解WebSocket心跳及重连机制(五)


下一篇:MySQL优化