1、Oracle监听
监听具有独立性:与数据库的启动顺序无关先后,监听知道数据库的位置与端口,与数据库没有常连接。
连接建立流程:客户端连接监听,监听将客户端连接转发给数据库实例,数据库实例专门为连接启动一个
server process,同时将SP的地址告诉监听,监听再转告客户端,客户端直接对SP发起连接请求,SP校验通过
用户名密码后正式建立连接。监听只在建立连接时启作用,与数据库没有常连接,连接建立后,监听关闭不影
响会话正常执行SQL。
当连接时有@网络服务名,客户端会自动调用tnsname.ora文件,解析成IP,端口,连的服务名
listener.ora文件:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
-- 静态连接配置,静态注册在查询监听状态时会有UNKNOWN状态的服务,静态连接稳定,数据库将服务名注册到监听
(SID_DESC =
(GLOBAL_DBNAME =ipems) --服务名
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
( SID_NAME = ipems) --实例名
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))
)
)
-- 同一listener中配置一动态一静态监听
LSNR2 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1526))
)
)
SID_LIST_LSNR2 =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = ipems)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(GLOBAL_DBNAME = ipems)
)
)
tnsnames.ora文件
ipems = --网络服务名
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.200)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER= DEDICATED) --服务器模式
(SERVICE_NAME = ipems) --服务名
)
)
lsnr2 = --网络服务名
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.200)(PORT = 1526))
)
(CONNECT_DATA =
(SERVER= DEDICATED) --服务器模式 dedicated,shared
(SERVICE_NAME = ipems) --服务名
)
)
rac tnsnames.ora
racdb=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.10)(PORT=1521)) --vip
(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.11)(PORT=1521)))
(CONNECT_DATA=
(SERVICE_NAME=racdb)))
-- 非默认的动态listener可以正常起来需要在initSID.ora中配置local_listener='lsnr2'; --动态网络服务名
2、Oracle数据库的几个名字
show parameter name
数据库名:select dbid,name from v$database;
实例名: show parameter instance
select INSTANCE_NUMBER,INSTANCE_NAME from v$instance;
服务名: show parameter service
主机名:数据库IP地址
网络服务名:随便启,最好与实例名相同
3、netca 配置监听程序和本地Net服务
[root@redhat7 ~]# xhost +
[root@redhat7 ~]# export DISPLAY=192.168.0.1:0.0 --将图形界面映射到本地
[root@redhat7 ~]# su - oracle
[oracle@redhat7 ~]$ netca
lsnrctl start| status| stop --监听的启动关闭状态查询
tnsping ipems --tnsping网络服务名,测试是否可以ping通,能ping通不一定能连上
netstat -tulnp|grep 1521 --监听是否正常启动
alter system register; --手动注册,pmon注册数据库service name到监听里
4、几种连接方式
sqlplus hr/hr --不走监听,本地连
sqlplus / as sysdba --不走监听
sqlplus hr/hr@ipems --走监听
sqlplus hr/hr@192.168.0.100:1521/ipems --走监听,没有走tnsname.ora
连接时oracle发现有@字符串,会利用tnsnames.ora解析为主机IP和端口号,通过这两找到监听,监听再根据service_name
找到具体实例。
5、双监听:双IP或者双端口
遗留,双网卡,负载均衡。
6、oracle的监听日志
查找日志:
# find /u01/app/ -name listener.log
lsnrctl status
oracle监听日志解析
监听日志记录监听器的工作过程,因为一些32bitOS自带的文件系统不支持2GB以上的文件,导致监听服务进程
(tnslsnr)append write日志文件出错关于“LISTENER.LOG日志大小不能超过2GB,超过会导致LISTENER监听器无
法处理新的连接。
清理监听日志:
lsnrctl set log_status off
mv listener.log listener.yyyymmdd
lsnrctl set log_status on
lsnrctl status显示信息解析
UNKNOWN,READY状态说明其目前有一个静态注册和一个动态注册
SID_XPT服务:为DG准备的服务,DB BROKER会用到,如果不用DG可以删掉。
SID:启动数据库实例的服务
SIDXDB:高效处理XML数据的服务,默认会占用8080端口。
PLSExtProc:PL/SQL调用外部接口(C、JAVA编写的过程)的服务,可以从listerner.ora中移除该项,在监听
启动时不再启动PLSExtProc服务。
7、sqlnet.ora用来决定oracle怎么解析一个连接中出现的字符串。在域用户即非系统管理员用户安装oracle
创建数据库实例时会报错,可以将用户添加到DBA组或者删掉sqlnet.ora文件。
8、涉及IP地址有关的文件
Oracle默认会在..\product\10.2.0\db_1下面创建一个名为“当前IP或机器名_SID”的目录,该目录存储
的是SID实例的配置等信息;
同时Oracle默认在..\product\10.2.0\db_1\oc4j\j2ee目录下创建一个名为“OC4J_DBConsole_当前IP或机器名_SID”
的目录,存放的是OracleDBConsole服务的相关配置等信息;
Oracle 监听文件listener.ora,本地网络服务tnsnames.ora中的HOST设为当前IP地址;
数据库迁移或修改IP后只用关注第三种情况,对应修改即可。
参考资料:
http://www.cnblogs.com/kerrycode/p/4227579.html
http://blog.itpub.net/17203031/viewspace-701017
http://www.ha97.com/4785.html