1、客户端连接数据库流程:监听只在连接时候起到转发作用
①客户端→监听转发→数据库
②数据库→监听转发→客户端
③客户端→数据库
2、监听配置:用netca命令
lsnrctl stop/start/status #监听停止、启动、查看状态命令
①服务端要配置两个文件:listener、tnsnames
listener文件:
LISTENER= #监听名字
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.111)(PORT = 1521)) #服务器本地IP地址
)
)
tnsnames文件:
linuxorcl= #连接时@后面的字符串,如sqlplus scott/tiger@linuxorcl
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.111)(PORT = 1521)) #服务器本地IP地址
)
(CONNECT_DATA =
(SERVICE_NAME =orcl) #服务器上数据库实例名字
)
)
②客户端要配置一个文件:tnsnames
tnsnames文件:
linuxorcl= #连接时@后面的字符串,如sqlplus scott/tiger@linuxorcl
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.111)(PORT = 1521))#服务器IP地址
)
(CONNECT_DATA =
(SERVICE_NAME =orcl) #服务器上数据库实例名字
)
)
3、监听注册有两种方式:静态注册和动态注册
①如何查询某服务是静态监听注册还是动态监听注册可以使用命令lsnrctl status来查看服务,实例状态为UNKNOWN值时表明此服务是静态注册的设置。
②静态注册
所谓静态配置,就是在配置监听器时,就明确的告诉监听器某个数据库的信息,监听器在启动过程中就会加载这一部分信息。这个信息同样是记录在监听器的配置文件LISTENER.ORA中,下面就是使用静态配置LISTENER.ORA文件,注意其中SID_LIST_LISTENER部分就是静态配置内容:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_NAME = orcl) #GLOBAL_NAME数据服务名
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(SID_NAME = orcl) #SID_NAME数据库实例名字
)
)
这个例子就是说,名字叫做LISTENER的监听器需要负责SID=ORCL的数据库的连接请求,静态配置的最大问题就是监听器无法知道数据库的真正状态。
③动态注册
动态注册是在instance启动的时候PMON进程根据init.ora中的INSTANCE_NAME,SERVICE_NAMES两个参数将实例和服务动态注册到listener中。要想使用动态注册功能,首先需要在数据库的初始化SERVICE_NAME和INSTANCE_NAME。如果没有定义SERVER_NAME参数,数据库会使用DB_NAME和DB_DOMAIN组成的一个全局数据库名称(Global Database Name)注册到监听器中。INSTANCE_NAME是实例名称,通常和SID值一样。只要数据库处于运行状态,PMON进程就会自动、定期的地向监听进程注册、更新信息,DBA也可以使用下面命令强制PMON立即向监听器注册:SQL>alert system register;
我在linux系统下就发生过ora-12514错误,检查了半天后来发现时系统里面的/etc/hosts里面的ip地址没有配成本地ip而是用127.0.0.1来代替
⑤监听解析一个登录命令流程如sqlplus scott/tiger@linuxorcl
首先监听会先去找tnsnames文件,解析里面是否有以linuxorcl开头的段如:
linuxorcl = #连接时@后面的字符串,如sqlplus scott/tiger@linuxorcl
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521)) #服务器本地IP地址
)
(CONNECT_DATA =
(SERVICE_NAME = orcl) #服务器上数据库实例名字
)
)
然后根据段里面的Host和service_name去解析数据库实例
最后把数据库实例注册到监听上(动态的或静态的)
数据库名:show parameter db_name;
数据库服务名:show parameter service_name;
数据库实例名:show parameter instance_name;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29489498/viewspace-1120439/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29489498/viewspace-1120439/