Oracle Listener2(图片不全,废弃)
1)、对于oracle网络写的不是很全,有的地方可能有误,希望大家多多提出意见!
2)、本文档适合有一定oracle基础的人员阅读。
3)、此文档解决了oracle监听的基本配置、一些网络组件的基本概念、常见问题排错方法、怎么配置动态监听和静态监听以及非默认监听、安装多个实例时如何配置监听
4)、如果对监听很感兴趣请参考oracle 官方联机文档,已经打包。
博客中图片可能显示不正确,如果觉得看着不爽,可以去下载:http://www.cnblogs.com/AlbertCQY/admin/Files.aspx?order=4
Oracle® Database
Net Services Administrator's Guide
11g Release 2 (11.2)
E10836-06
Oracle® Database
11g Release 2 (11.2)
E10835-05
1、数据库监听配置
1.1监听器(LISTENER)
监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求。既然是基于服务器端的服务,那么它也只存在于数据库服务器端,进行监听器的设置也是在数据库服务器端完成的。
1.2本地服务名(Tnsnames)
Oracle客户端与服务器端的连接是通过客户端发出连接请求,由服务器端监听器对客户端连接请求进行合法检查,如果连接请求有效,则进行连接,否则拒绝该连接。
本地服务名是Oracle客户端网络配置的一种,另外还有Oracle名字服务器(Oracle Names Server)等。Oracle常用的客户端配置就是采用的本地服务名,本文中介绍的也主要是基于本地服务名的配置。以下的例子都是以oracle 11g r2为例。
1.3 Oracle网络连接配置方法
配置Oracle服务器端与客户端都可以在其自带的图形化Oracle网络管理器(Oracle Net Manager)里完成(建议在图形化的工具下完成Oracle服务端或客户端的配置)。在Windows下,点击“开始/程序/Oracle – Ora11gHome/Configuration and Migration Tools/Net Manager”启动Oracle网络管理器工具,在Linux/Unix下(windows 是在cmd命令窗口),利用netmgr命令来启动图形化Oracle网络管理器,如:
[oracle@resoft Desktop]$ netmgr
Linux RHEL6.0下启动Net Manager图形窗口如下图示:
图(一)
1.4 Oracle监听器配置(LISTENER)
如 图(一)示,选中树形目录中监听程序项,再点击左上侧“+”按钮添加监听程序,点击监听程序目录,默认新加的监听器名称是LISTENER(该名称也可以 由任意合法字符命名)。选中该名称,选中窗口右侧栏下拉选项中的“监听位置”,点击添加地址按钮。在出现的网络地址栏的协议下拉选项中选中 “TCP/IP”,主机文本框中输入主机名称或IP地址(如果主机即用作服务端也作为客户端,输入两项之一均有效;如果主机作为服务端并需要通过网络连 接,建议输入IP地址),端口文本框中输入数字端口,默认是1521,也可以自定义任意有效数字端口。配置好的监听位置如下图示:
图(二)
选 中窗口右侧栏下拉选项中的“数据库服务”,点击添加数据库按钮。在出现的数据库栏中输入全局数据库名,如myoracle。注意这里的全局数据库名与数据 库SID有所区别,全局数据库名实际通过域名来控制在同一网段内数据库全局命名的唯一性,就如Windows下的域名控制器,如这里可以输入 myoracle。Oracle主目录填写oracle home地址我这里是/u01/app/oracle/product/11.2.0/dbhome_1,输入SID,如ORCL。完整的数据库服务配置如下图示:
图(三)
保 存以上配置,默认即可在Oracle安装目录下找到监听配置文件 (Windows下如D:\oraclec\product\11.2.0\orcl\network\admin Linux/Unix下$ ORACLE_HOME/network/admin/listener.ora)。至此,Oracle服务端监听器配置已经完成。
服务器端监听(listener.ora)还是比较好配置的,大部分情况下在数据库安装完成时已经根据向导配置好了。
1.5 本地服务名配置(Tnsnames)
本 地服务名是基于Oracle客户端的网络配置,所以,如果客户端需要连接数据库服务器进行操作,则需要配置该客户端,其依附对象可以是任意一台欲连接数据 库服务器进行操作的pc机,也可以是数据库服务器自身。在客户端配置tnsnames时首先确保oracle客户端已经安装(下载地址:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.htm)如前面所介绍,可以利用Oracle自带的图形化管理工具Net Manager来完成Oracle客户端的配置。选中如图(一)中的服务命名,再点击左上侧“+”按钮,弹出如下图示对话框:
图(四)
输入Net服务名,如myoracle,点击下一步,进入下图示对话框:
图(五)
选中TCP/IP(Internet协议),点击下一步,如下图示:
图(六)
输入主机名与端口号。注意这里的主机名与端口号必须与数据库服务器端监听器配置的主机名和端口号相同,主机名可以是IP也可以是主机名。点击下一步,如下图示:
图(七)
输入服务名。这里的服务名实际上就是数据库服务器端监听器配置中的全局数据库名,前者与后者必须相同。服务名(service name)必须写正确。查看服务名方法:SQL> select value from v$parameter where name = 'service_names';
连接类型 通常选专用服务器,这要视数据库服务器的配置而定,如果配置的共享数据库服务器,这里的连接类型就要选共享服务器,否则建议选专用服务器(关于专用服务器 的介绍请参阅相关文档)。配置好后点击下一步,如下图示:
图(八)
如 果数据库服务器端相关服务启动了,可以点击测试按钮进行连接测试。Oracle默认是通过scott/tiger用户进行测试连接,由于scott用户是 Oracle自带的示例用户,对于正式的业务数据库或专业测试数据库可能没有配置这个用户,所以需要更改成有效的用户登录才可能测试成功。如果这里测试连 接不成功,也不要紧,先点完成按钮结束配置。
回 到Oracle网络管理器(Oracle Net Manager)主窗口,保存配置,默认即可在Oracle安装目录下找到本地服务名配置文件 (Windows下如: D:\oraclec\product\11.2.0\orcl\network\admin\tnsnames.ora Linux/Unix下$ ORACLE_HOME/network/admin/tnsnames.ora)。配置完成的本地服务名如下图示:
图(九)
树形目录下的服务命名可以通过编辑菜单里的重命名菜单更改成任意合法字符组成的服务名称,注意服务名称前不能有空格字符,否则可能无法连接数据库服务器。
1.6 连接数据库服务器
(1) 启动服务器端监听器与数据库服务
Linux/Unix下,启动监听器:
$ lsnrctl start
关闭监听器:
$ lsnrctl stop
查看监听状态:
$ lsnrctl status
启动数据库:
$ sqlplus /nolog
SQL>conn sys@myoracle as sysdba --这里的myoracle是前面配置的客户端本地服务名
或
SQL>conn / as sysdba
SQL>startup
Windows下,启动监听器:
C: lsnrctl start
以上服务必须同时启动,客户端才能连接数据库。由于默认配置的监听器名称是Listener,上述命令可以正常启动监听器,如果监听器名称是其它名称,如aListener,则需要用下列方式才能启动:
Linux/Unix下:
$ lsnrctl start aListener
Windows下:
C:lsnrctl start aListener
(2) 测试连接数据库服务器
测试的方法多种多样,可以在上面配置本地服务名时进行测试,也可以是第三方客户端工具,如PL/SQL Developer,最方便的是用Oracle自带的sqlplus工具,以下利用sqlplus进行测试:
[oracle@resoft Desktop]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.3.0 Production on Tue Feb 19 17:06:32 2013
Copyright (c) 1982, 2011, Oracle. All rights reserved.
SQL> conn scott/tiger@myoracle
Connected.
2、oracle listener动态注册和静态注册
也就是我们经常说的静态监听和动态监听
2.1 什么是注册
注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。比如上面查看到的服务名就是:SQL> select value from v$parameter where name = 'service_names';
VALUE
--------------------------------------------------------------------------------
ORCL
在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务。)
相当于是这样:在数据库服务器和客户端之间有一监听程序(Listener),在监听程序中,会记录相应数据库对应的服务名(一个数据库可能对应有多个服务名),当客户端需要连接数据库时,只需要提供服务名,就可以建立客户端和服务器之间的连接。
2.2 动态注册
动态注册是在instance启动的时候PMON进程根据init.ora(服务器参数文件)中instance_name,service_names两个参数将实例和服务动态注册到listener中。
首先要在init.ora中指定instance_name,service_names两个参数的值。在sqlplus下通过show parameter service_names 和show parameter instance_name可以查看这两个参数的值。
注册到监听器中的实例值从init.ora文件中的instance_name参数取得。如果该参数没有设定值,那么它将取init.ora文件中的db_name的值。如果在RAC中配置,您必须将集群中每个实例的instance_name参数设置为一个唯一的值。
注册到监听器中的服务值从init.ora文件中的参数service_names取得。如果该参数没有设定值,数据库将拼接init.ora文件中的 db_name和db_domain的值来注册自己。如果选择提供service_names值,您可以使用完全限定的名称(比如 orcl.oracle.com)或缩写的名称(比如orcl)。如果选择缩写的名称并设置了db_domain参数,注册到监听器中的服务将是 service_name值和db_domain值的拼接。例如下面的设置将导致服务orcl.oracle.com被注册到监听器中:
db_domain=oracle.com service_names=orcl ;
采取动态注册方法时,listener.ora中的内容如下: SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
) 可选择的是,您可以在service_names参数中指定多个服务值,值之间用逗号格开,这对于共享服务器配置是很有用的。
动态注册默认只注册到默认的监听器上(名称是LISTENER、端口是1521、协议是TCP),因为pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener,如果需要向非默认监听注册,则需要配置local_listener参数!
将监听的信息添加到tnsnames.ora 文件中。 注意,是tnsnames.ora 文件, 因为pmon在动态注册监听时要从tnsnames.ora中读取相关信息。
如果没有显式设置service_names和instance_name的值,那么仅当数据库在监听器运行之后启动时,动态注册才会发生;在这种情况下,如果监听器后来发生了重启,动态注册信息将会丢失。显然,最好在所有的数据库启动之前先启动监听器,这样就会避免没有显式设置 service_names和instance_name的值时,若重启监听器带来的动态注册信息丢失的情况。
为初始化参数service_names和instance_name设置显式的值是个很好的实践,尽管如果您没有设置它们,Oracle也会为动态注册而生成默认值(基于db_name和db_main)。这样做的原因是,如果监听器在数据库启动之后重新启动,其动态注册行为将会有一些微妙的区别.如果监听器在数据库运行之后重新启动,你们仅当您在init.ora文件中显式地设置了service_names和instance_name的值时,每个数据库的PMON进程才会在很短的时间之后自动注册数据库。
如果需要执行连接时故障转移或负载均衡,或者想要在RAC中配置在实例之间透明地分布连接,那么使用service_names参数将是必要的。为启用这些功能,您只需要将每个实例的数据库参数文件中的service_names设置为同一个值,并在客户端连接请求的service_name设置中引用该值。
如果没有显式设置service_names和instance_name的值,那么仅当数据库在监听器运行之后启动时,动态注册才会发生;在这种情况下,如果监听器后来发生了重启,动态注册信息将会丢失。显然,最后在启动任何数据库之前启动服务器上的监听器,并完全避免监听器的重启。
另外,您还可以在SQL*PLUS中使用命令:
SQL>ALTER SYSTEM REGISTER;
在数据库打开时的任何时候,手工地在监听器中注册服务值。这个命令对于替换因监听器重启而丢失地服务值很有用,并且它所注册地值与在数据库启动时由动态注册所设置的值完全一样。
动态监听:
oracle监听器运行后,oracle实例在open时,会动态向监听程序注册其service_names和instance_name。
其中instance_name默认是:db_name
而service_names默认是:db_name.db_domain 2.3 静态注册
静态注册就是实例启动时读取listener.ora文件的配置,将实例和服务注册到监听程序。无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务。
静态注册时,listener.ora中的GLOBAL_DBNAME向外提供服务名,listener.ora中的SID_NAME提供注册的实例名。
采取静态注册方法时,listener.ora中的内容如下: SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = myoracle)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = ORCL)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1521))
)
) 该文件表明数据库是单实例的,实例名为orcl,向外提供了1个服务:ORCL
静态监听:
oracle实例运行后,监听程序启动时,根据listener.ora的配置注册相应的服务。
其中global_dbname对应的是oracle对外的服务名,即初始化参数里的service_names
而sid_name对应的是oralce实例的名称,即初始化参数里的instance_name
既然有动态监听为什么还要静态监听呢?原因如下:
1).监听器不是最早启动,oracle实例先启动
2).监听器重启
3).oracle实例没有open
2.4查询某服务是静态注册还是动态注册 可以使用命令lsnrctl status来查看某服务是静态注册还是动态注册。
实例状态为UNKNOWN值时表明此服务是静态注册的设置。这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。
动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(对于一个备用数据库)来指明。举例:已经注册的动态监听(最常用)
[oracle@resoft admin]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 19-FEB-2013 18:11:48
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=resoft)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 19-FEB-2013 22:48:26
Uptime 248 days 13 hr. 13 min. 56 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/resoft/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=resoft)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
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...
The command completed successfully
不管何时关闭数据库,动态注册的数据库都会动态地从 监听器注销,而与之相关的信息将从状态列表中消失。这样,不管数据库是在运行还是已经关闭,监听器总是知道它的状态。该信息将被用于连接请求的回退(fallback)和负载平衡。
3、配置非默认监听
上面配置的监听都是默认监听 监听名:listener 端口:1521 这是会自动注册的,但是实际生产中基本上都是非默认监听。
以下测试直接修改服务器端监听文件listener.ora或者tnsnames.ora
目前测试数据库上已经有实例ORCL现在创建一个新的实例UPRR,设置监听名字listener1 端口1522
3.1 使用dbca数据库向导创建一个新实例UPRR
其它步骤省略,如下图所示:
3.2 配置服务器端监听
在listener.ora文件中添加以下内容
SID_LIST_LISTENER1 =
(SID_LIST =
(SID_DESC =
(SID_NAME = UPRR)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(PROGRAM = extproc)
)
)
LISTENER1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1522))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
3.3 注册非默认监听
然后以sys用戶运行:
[oracle@resoft admin]$ export ORACLE_SID=UPRR
[oracle@resoft admin]$ sqlplus / as sysdba
SQL> alter system set local_listener=listener1 scope=spfile;
SQL> alter system register;
或者:
SQL> alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1522))';
SQL> alter system register;
系统已更改。
3.4 在tnsnames.ora中添加解析文件
Tnsnames.ora中添加以下内容
UPRR =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = UPRR)
)
)
SID_LIST_LISTENER1 =
(SID_LIST =
(SID_DESC =
(SID_NAME = UPRR)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(PROGRAM = extproc)
)
)
LISTENER1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1522))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
3.5 启动非默认监听listener1
[oracle@resoft admin]$ lsnrctl
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 19-FEB-2013 19:40:23
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Welcome to LSNRCTL, type "help" for information.
LSNRCTL> stop listener --先关闭之前已经启动的监听listener
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=resoft)(PORT=1521)))
The command completed successfully
LSNRCTL> start listener1
Starting /u01/app/oracle/product/11.2.0/dbhome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.3.0 - Production
System parameter file is /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/resoft/listener1/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=resoft)(PORT=1522)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=resoft)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias listener1
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 19-FEB-2013 19:41:04
Uptime 0 days 0 hr. 0 min. 1 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/resoft/listener1/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=resoft)(PORT=1522)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "UPRR" has 1 instance(s).
Instance "UPRR", status UNKNOWN, has 1 handler(s) for this service... –此时监听的状态是没有注册,重启下数据库实例UPRR即可
The command completed successfully
3.6 重启实例
SQL> startup
ORACLE instance started.
Total System Global Area 636100608 bytes
Fixed Size 1346812 bytes
Variable Size 184550148 bytes
Database Buffers 444596224 bytes
Redo Buffers 5607424 bytes
Database mounted.
Database opened.
SQL> show parameter listener
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
listener_networks string
local_listener string LISTENER1
remote_listener string
[oracle@resoft admin]$ lsnrctl status listener1
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 19-FEB-2013 19:52:18
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=resoft)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias listener1
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 19-FEB-2013 19:41:04
Uptime 0 days 0 hr. 11 min. 14 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/resoft/listener1/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=resoft)(PORT=1522)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "UPRR" has 2 instance(s).
Instance "UPRR", status UNKNOWN, has 1 handler(s) for this service...
Instance "UPRR", status READY, has 1 handler(s) for this service...
Service "UPRRXDB" has 1 instance(s).
Instance "UPRR", status READY, has 1 handler(s) for this service...
The command completed successfully
至此,配置非默认监听结束。环境中在同一个数据库软件上安装两个实例:ORCL和UPRR。
ORCL使用监听listener 端口1521 UPRR 使用listener1 端口1522
3.7 同时启动两个实例和两个监听
刚才看到了在启动listener1的时候必须把listener关闭,其实可以让实例ORCL和UPRR使用一个监听listener 但是ORCL使用1521端口,UPRR使用1522端口。
修改后的listener.ora文件如下: SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = ORCL)
)
(SID_DESC =
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = UPRR)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1522))
)
)
修改完listener.ora后,把内容贴到tnsnames.ora中
3.8 使用远程PC测试
在我本机oracle client 的tnsnames.ora中添加如下内容:
注意:别名如:ORCL第一行要顶格写
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.220.200)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL)
)
)
UPRR =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.220.200)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME = UPRR)
)
)
使用sqlplus 登录连个实例
C:\>sqlplus scott/tiger@orcl
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 2月 19 20:45:53 2013
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> exit
从 Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 断开
C:\>sqlplus scott/tiger@uprr
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 2月 19 20:46:05 2013
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
4、Orace 监听配置修改说明
4.1 监听日志说明
Oracle的监听(Listener)在缺省情况下,会在文件中记录日志,记录数据库实例注册操作、客户端的连接等。
Oracle 11g中的信息如下:
[oracle@dave ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.3.0 - Productionon 22-DEC-2012 21:36:43
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version11.2.0.3.0 - Production
Start Date 22-DEC-2012 21:31:53
Uptime 0 days 0 hr. 4 min. 50 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/dave/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.4)(PORT=1521)))
Services Summary...
Service "dave" has 2 instance(s).
Instance "dave", status UNKNOWN, has 1 handler(s) for thisservice...
Instance "dave", status READY, has 1 handler(s) for thisservice...
Service "daveXDB" has 1instance(s).
Instance "dave", status READY, has 1 handler(s) for thisservice...
The command completed successfully
这个是Oracle 11g里的listener 的保存位置。在Oracle 11g中使用的是ADR,ADR是11G的新特性,欲详细了解百度之。
这里是个xml文件,不方便文件,我们可以去trace目录下,看文本格式的:
[oracle@dave trace]$ pwd
/u01/app/oracle/diag/tnslsnr/dave/listener/trace
[oracle@dave trace]$ ls
listener.log
[oracle@dave trace]$
[oracle@dave trace]$ tail -20 listener.log
Sat Dec 22 21:33:39 2012
22-DEC-2012 21:33:39 * service_update *dave * 0
22-DEC-2012 21:33:42 * service_update *dave * 0
22-DEC-2012 21:33:45 * service_update *dave * 0
Sat Dec 22 21:34:18 2012
22-DEC-2012 21:34:18 * service_update *dave * 0
22-DEC-2012 21:34:21 * service_update *dave * 0
22-DEC-2012 21:34:24 * service_update *dave * 0
22-DEC-2012 21:34:27 * service_update *dave * 0
Sat Dec 22 21:34:48 2012
22-DEC-2012 21:34:48 * service_update *dave * 0
Sat Dec 22 21:35:06 2012
22-DEC-2012 21:35:06 * service_update *dave * 0
Sat Dec 22 21:36:18 2012
22-DEC-2012 21:36:18 * service_update *dave * 0
Sat Dec 22 21:36:43 2012
WARNING: Subscription for node down eventstill pending
22-DEC-2012 21:36:43 *(CONNECT_DATA=(CID=(PROGRAM=)(HOST=dave)(USER=oracle))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=186647296))* status * 0
Sat Dec 22 21:37:34 2012
22-DEC-2012 21:37:34 * service_update *dave * 0
对于一些使用短连接的,频繁的连接数据库的应用,listener.log增长很快。有的可以在比较短的时间内(十几天)就可以超过2GB。对于一些平台的某些版本的Oracle,在监听日志增大到2GB以后会导致监听不能正常工作。
对于这种listener.log增长非常迅速的系统,可以关闭监听日志,不让监听写日志到文件。也可以写个job定期清理。
关于Oracle Listener 的说明,官网有更多详细描述。
Listener Control Utility
http://docs.oracle.com/cd/E11882_01/network.112/e10835/lsnrctl.htm#NETRF118
这里我们看2个比较常用的操作。
4.2停止写listener log
在某些特定的场合可能会有这样的需求。控制这个功能的参数是LOG_STATUS。 官网对这个参数的说明:To turn listenerlogging on or off.
--在OS层面直接使用:
lsnrctl SET LOG_STATUS {on | off}
--在LSNRCTL 工具中使用:
LSNRCTL> SET LOG_STATUS {on | off}
--查看log_status状态:
LSNRCTL> show log_status
Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))
LISTENER parameter "log_status"set to ON
The command completed successfully
说明:
之前遇到一个很奇怪的问题,就是log_status状态是on,但是listener就是不写日志,再次手工设置为on后,又正常写日志。
LSNRCTL> setlog_status off
Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))
LISTENER parameter "log_status"set to OFF
The command completed successfully
LSNRCTL> showlog_status
Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))
LISTENER parameter "log_status"set to OFF
The command completed successfully
LSNRCTL> setlog_status on
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))
LISTENER parameter "log_status"set to ON
The command completed successfully
LSNRCTL> showlog_status
Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))
LISTENER parameter "log_status" setto ON
The command completed successfully
4.3 保存listener 的修改
保存又参数:SAVE_CONFIG控制,官网的说明:
To save the current configuration state of the listener, includingtrace level, trace file, trace directory, and logging tothe listener.ora file. Any changes are stored in listener.ora,preserving formatting, comments, and case as much as possible. Beforemodification of the listener.ora file, a backup of the file,called listener.bak, is created.
我们在第一部分修改了log_status 的配置,如果没有保存,那么在重启监听之后,修改就会失效,所以这里要保存,才能永久的生效。
LSNRCTL> save_config
Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))
Saved LISTENER configuration parameters.
Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Old Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.bak
The command completed successfully
注意:
这里使用的是默认的listner,如果不是默认的,就需要加上listener_name. 如:
LSNRCTL> SAVE_CONFIG listener_name
保存之后,修改的内容就会写入listener.ora 文件。
这里是我的的测试环境,其中listener.ora 文件多了如下内容:
/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
#----ADDED BY TNSLSNR 22-DEC-201221:59:58---
LOGGING_LISTENER = ON
#--------------------------------------------
4.4 加密listener
有时候处于安全考虑,会需要对listener设置密码。
4.4.1 设置监听名
如果有多个监听,那么需要先设置当前的监听
LSNRCTL>set current_listener listener_name
4.4.2设置密码
使用change_password设置listener口令。
LSNRCTL> change_password
Old password: --如果原来没有设置口令就直接回车,否则输入原来的口令
New password:
Reenter new password:
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))
Password changed for LISTENER
The command completed successfully
--保存密码:
LSNRCTL> save_config
Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))
Saved LISTENER configuration parameters.
Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Old Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.bak
The command completed successfully
--加密之前:
[oracle@dave ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.3.0 -Production on 22-DEC-2012 22:54:55
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version11.2.0.3.0 - Production
Start Date 22-DEC-2012 21:57:46
Uptime 0 days 0 hr. 57 min. 9 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/dave/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.4)(PORT=1521)))
Services Summary...
Service "dave" has 2 instance(s).
Instance "dave", status UNKNOWN, has 1 handler(s) for thisservice...
Instance "dave", status READY, has 1 handler(s) for thisservice...
Service "daveXDB" has 1instance(s).
Instance "dave", status READY, has 1 handler(s) for thisservice...
--加密之后:
LSNRCTL> status
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version11.2.0.3.0 - Production
Start Date 22-DEC-2012 22:56:19
Uptime 0 days 0 hr. 11 min. 2 sec
Trace Level off
Security ON: Password or Local OSAuthentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/dave/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.4)(PORT=1521)))
Services Summary...
Service "dave" has 2 instance(s).
Instance "dave", status UNKNOWN, has 1 handler(s) for thisservice...
Instance "dave", status READY, has 1 handler(s) for thisservice...
Service "daveXDB" has 1instance(s).
Instance "dave", status READY, has 1 handler(s) for this service...
The command completed successfully
--在listener.ora 文件中也会多一个配置参数:
[oracle@dave ~]$ cat/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
…
#----ADDED BY TNSLSNR 22-DEC-201221:59:58---
LOGGING_LISTENER = ON
#--------------------------------------------
#----ADDED BY TNSLSNR 22-DEC-201223:06:31---
PASSWORDS_LISTENER =1DF5C2FD0FE9CFA2
#--------------------------------------------
[oracle@dave ~]$
4.4.3 解除密码
listener的密码策略是防止stop,所以在stop时需要确认密码,在start时不需要输入密码。
LSNRCTL> set password
Password:
The command completed successfully
使用set password输入正确的密码后,就可以进行stop操作了。
5、oracle sqlnet.ora说明
sqlnet.ora作用类似于linux或者其他unix的nsswitch.conf文件,通过这个文件来决定怎么样找一个连接中出现的连接字符串。可以没有此文件。
例如我们客户端输入 sqlplus system/oracle@orcl 假如我的sqlnet.ora是下面这个样子
SQLNET.AUTHENTICATION_SERVICES= (NTS) NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
那么,客户端就会首先在tnsnames.ora文件中找orcl的记录.如果没有相应的记录则尝试把orcl当作一个主机名,通过网络的途径去解析它的 ip地址然后去连接这个ip上GLOBAL_DBNAME=orcl这个实例,当然我这里orcl并不是一个主机名 如果我是这个样子
NAMES.DIRECTORY_PATH= (TNSNAMES)
那么客户端就只会从tnsnames.ora查找orcl的记录,括号中还有其他选项,如LDAP等并不常用。
Sqlnet.ora还有一个重要作用就是限制IP访问Oracle。与防火墙类似的功能,Oracle 提供限制与允许特定的IP或主机名通过Oracle Net来访问数据库。这个功能由sqlnet.ora配置文件来实。通过监听器的限制,比在数据库内部通过触发器进行限制效率要高。
限制IP例子: 通过在sqlnet.ora文件中增加下列记录来实现
tcp.validnode_checking = yes
tcp.invited_nodes = (hostname1, hostname2,ip1,ip2)
tcp.excluded_nodes = (10.103.11.17,hostname1,hostname2)
tcp.validnode_checking = yes
tcp.invited_nodes = (hostname1, hostname2,ip1,ip2)
tcp.excluded_nodes = (10.103.11.17,hostname1,hostname2)
当使用invited_nodes时,则所有没有包含在invited_nodes值中的IP或主机将无法通过Oracel Net连接到数据库。而如果使用excluded_nodes时,除了excluded_nodes值中列出的IP和主机不可访问之外,其余的节点都可以访问数据库。通常情况下,更倾向于使用excluded_nodes参数。
6、其它oracle network配置说明
工作压力关系,在这里不再介绍,有兴趣参考官方文档
Oracle® Database Net Services Administrator's Guide11g Release 2
7、常见的问题排除方法
7.1 ora-01031:insufficient privileges
sqlplus "/ as sysdba" 连不上,报ora-01031:insufficient privileges解决方法
注意多个数据库实例时候,set ORACLE_SID='',
1)、检查sqlnet.ora(WINDOWS下位于%ORACLE_HOME%NETWORKADMIN目录)是否包含这句:SQLNET.AUTHENTICATION_SERVICES=(NTS),没有的话加上
2)、检查登陆windows的用户(administrator或安装oracle时候使用的用户)是不是在包含在ORA_DBA组中,域用户没有连上域服务器时就可能出现这种现象。
3)、 要保证 remote_login_passwordfile 参数 = EXCLUSIVE .
4)、看看是否需要使用orapassw生成口令文件 .
一种解决方法案例:
(1)、检查系统参数:
SQL> show parameter password
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string EXCLUSIVE
(2)、
select * from v$pwfile_users;
SQL>
为空
(3)、
SQL> grant sysdba to sys;
grant sysdba to sys
*
ERROR at line 1:
ORA-01994: GRANT failed: password file missing or disabled
(4)、建立password文件
D:/>orapwd file="D:/oracle/product/10g/db_1/database/PWDoratest.ora" password=gp
oswong entries=10
(5)、
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
SYS正常显示出来。
(6)、重新在远程以SYSDBA登录,可正常使用。
如果口令文件创建的有问题,也是会报如下的错误:
ora-01031:insufficient privileges
口令文件的命名格式应为orapwsid,并且sid是区分大小写的。由于Target Database连接Auxiliary Database时需要验证口令,
如果违反了以上规则,将会提示ORA-01031: insufficient privileges。
我在用linux创建duplicate数据库的时候 就是因为口令文件创建的路径和名称不对才遇到这个错误
7.2 ORA-12514:TNS监听程序当前无法识别连接描述副中请求的服务
这是最常见的错误。
1)、打开Net Manager,选中服务名称,检查服务标识栏里的服务名输入是否正确。该服务名必须与服务器端监听器配置的全局数据库名一致。
2)、如果使用动态监听,检查监听是否注册到oracle实例中。解决方法:监听启动的状态下,重启oracle实例。
7.3 ORA-12541: TNS: 没有监听器
显而易见,服务器端的监听器没有启动,另外检查客户端IP地址或端口填写是否正确。启动监听器:
$ lsnrctl start
或
C:lsnrctl start
7.4 ORA-12154: TNS: 无法处理服务名
检查输入的服务名与配置的服务名是否一致。另外注意生成的本地服务名文件tnsnames.ora里每项服务的首行服务名称前不能有空格。
7.5 ORA-12535: TNS: 操作超时
出现这个问题的原因很多,但主要跟网络有关。解决这个问题,首先检查客户端与服务端的网络是否畅通,如果网络连通,则检查两端的防火墙是否阻挡了连接。
7. 6 Windows下启动监听服务提示找不到路径
用命令或在服务窗口中启动监听提示找不到路径,或监听服务启动异常。打开注册表,进入HKEY_LOCAL_MACHINE/SYSTEM/Current ControlSet/Services/OracleOraHome11GTNSListener项,查看ImagePath字符串项是否存在,如果没 有,设定值为实际安装路径,不同的安装路径设定值做相应的更改。这种方法同样适用于Oracle实例服务,同 上,找到如同HKEY_LOCAL_MACHINE/SYSTEM/Current ControlSet/Services/Oracle ServiceMYORACLE项,查看ImagePath字符串项是否存在,如果没有,则新建,设定值为安装路径。
7.7 windows 修改计算机名后监听出问题
1)、修改C:\Windows\System32\drivers\etc\hosts文件使计算机名和Ip映射正确
如:127.0.0.1 bj-pe2-chenqy
2)、修改oralce解析文件tnsnames.ora中(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1521)) host=后面的主机名