文档说明: 1 )、对于 oracle 网络写的不是很全,有的地方可能有误,希望大家多多提出意见! 2 )、本文档适合有一定 oracle 基础的人员阅读。 3 )、此文档解决了 oracle 监听的基本配置、一些网络组件的基本概念、常见问题排错方法、怎么配置动态监听和静
文档说明:
1 )、对于 oracle 网络写的不是很全,有的地方可能有误,希望大家多多提出意见!
2 )、本文档适合有一定 oracle 基础的人员阅读。
3 )、此文档解决了 oracle 监听的基本配置、一些网络组件的基本概念、常见问题排错方法、怎么配置动态监听和静态监听以及非默认监听、安装多个实例时如何配置监听
4 )、如果对监听很感兴趣请参考 oracle 官方联机文档 , 已经打包。
Oracle? Database
Net Services Administrator's Guide
11g Release 2 (11.2)
Oracle? Database
Net Services Reference
11g Release 2 (11.2)
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
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
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
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
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
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
------------------------
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
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
remote_listener string
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=resoft)(PORT=1522)))
STATUS of the LISTENER
------------------------
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
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
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
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
WARNING: Subscription for node down eventstill pending
对于一些使用短连接的,频繁的连接数据库的应用, listener.log 增长很快。有的可以在比较短的时间内(十几天)就可以超过 2GB 。对于一些平台的某些版本的 Oracle ,在监听日志增大到 2GB 以后会导致监听不能正常工作。
对于这种 listener.log 增长非常迅速的系统,可以关闭监听日志,不让监听写日志到文件。也可以写个 job 定期清理。
关于 Oracle Listener 的说明,官网有更多详细描述。
Listener Control Utility
这里我们看 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
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
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
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---
#--------------------------------------------
[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 配置说明
工作压力关系,在这里不再介绍,有兴趣参考官方文档
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
( 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= 后面的主机名