普通网络应用中会涉及3种进程:服务器端监听进程、服务器端服务进程、客户端进程。
1、服务器启动监听进程,在一个固定IP地址和端口上监听请求。
2、一个用户进程向监听进程发起请求。
3、监听进程收到请求后,立刻派生一个服务进程。(创建或从进程池选取)
4、监听进程把请求转发给派生出的服务进程。监听进程退出该请求活动。
NET8协议
Oracle提供了一个网络互连服务,叫做Oracle Net Service,叫做NET8服务。
它实现了OSI中的上三层。其中Oracle客户端的OCI(Oracle call Interface)和服务器端的OPI(Oracle Program Interface)组成了会话层。这一层用来维护客户端服务器之间的完整SQL会话:
1、解析SQL语句,进行语法分析
2、为SQL语句申请并分配Cursor
3、为SQL语句提供绑定变量
4、从服务器的数据字典中获得记录集的元数据信息
5、执行SQL语句
6、返回结果
7、关闭Cursor
NET8由3个组件构成:Net Interface、Routing/Naming/Auth和TNS(Transparent Network Substrate),Net Interface进行数据传输,RNA和TNS透明支持底层协议。
Oracle网络配置支持多种底层协议,包括TCP、TCPS、PIPE、SDP(Sockets Direct Protocol),NET8悉数支持这些协议。
有两种连接方式:专有模式(Dedicated Server)和共享模式(Shared Server)
专有模式为每个用户连接启动一个单独进程(影子进程)。共享模式是多个用户连接共享一个进程。
服务器配置:
静态注册
$ORACLE_HOME/network/admin/listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)
(HOST= ORAServer)
(PORT = 1521)
(QUEUESIZE=20)(监听等待队列,默认为5)
)
)
)
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = /oracle/product/10.2.0/)
(SID_NAME = ORCL)
)
)
动态注册:(推荐使用)
首先要在参数文件中设置两个参数:
SERVICE_NAME和INSTANCE_NAME(SID)
如果没有定义SERVICE_NAME参数,则DB_NAME和DB_DOMAIN会组成一个全局数据库名称,注册到监听器里。
PMON会自动定期向监听进程注册、更新信息
也可以强制:
SQL>alter system register;
动态配置结果准确,推荐使用。而且在RAC环境中,动态注册还包括每个实例的负载。这也是RAC可以实现负载均衡和故障转移的基础。
$lsnrctl status
READY:实例可以接受连接。
BLOCKED:实例目前不能接受连接。
UNKNOWN:静态注册,状态未知。
客户端配置:
客户端要连接到服务器,需要提供连接描述符,包括:
服务器网络地址、端口号;数据库服务名称。
$ORACLE_HOME/network/admin/tnsnames.ora
mydb = (连接标识符)
(DESCRIPTION = (连接描述符)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.254)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
一共有4中连接方式:
Local Naming:利用tnsnames.ora完成翻译过程。
Easy Connect Naming:不需要配置文件。Oracle 10g, 11g才可以支持。
External Naming:在网络上集中记录连接信息。
Directory Naming:在LDAP目录中保存这些信息。
tnsnames.ora也可以通过$TNS_ADMIN来指定目录
查找顺序:
$TNS_ADMIN
/var/opt/oracle
$ORACLE_HOME/network/admin