So Easy! Oracle在Linux上的安装配置系列四 监听器的配置
在创建了数库和各种数据库对象并装载了数据后,下一步是在数据库服务器与使用它的用户之间建立连
接,Oracle Net Services使这种连接成为可能。Oracle Net Services组件必须"存活"在客户机和服务器上,它们一般使用TCP/IP网络协议来建立客户机和数据库服务器之间的网络连接。
本文官方文档位置:
http://docs.oracle.com/cd/E11882_01/network.112/e41945/listenercfg.htm#NETAG010
为了方便配置和管理网络连接,Oracle提供了Oracle Net Services,它是一套在分布式异构计算环境中提供连接方案的组件。Oracle Net Services的组成:
Oracle NetOracle Net ListenerOracle Connection ManagerOracle Net Configuration Assistant Oracle Net Manager
Oracle Net:Oracle Net是一个初始化、建立及维护客户机和服务器之间连接的组件。必须在客户机和服务器上都安装。Oracle Net主要由两个组件构成:
Oracle Network Foundation LayerOracle Protocol Support
Oracle Net Listener:驻留Oracle数据库的所有服务器还运行一个名为Oracle Net Listener(通常也称为监听器)的服务, 其主要功能是监听客户机服务登录Oracle数据库的请求。监听器在保证客户机服务具有与数据库匹配的信息(协议、端口和实例名)后,将客户机请求传递到数据库。假如用户和密码通过认证,则数据库将允许客户机登录。一旦监听器把用户请求交付给数据库,客户机和数据库直接连接,不再需要监听器有帮助。
Oracle Connection Manager、Oracle Net Configuration Assistant、Oracle Net Manager是帮助配置数据库网络连接的GUI实用程序:
Oracle Connection Manager ----> cmctlOracle Net Configuration Assistant---> netcaOracle Net Manager ---->netmgr
连接描述符(connection descriptor):术语连接描述符用来表示数据库连接的两个必需的部分,数据库服务名和地址。连接描述符的地址部分包含三个部分,分别是:连接使用的通信协议,主机名和端口号
UNIX服务器上的Oracle连接的标准端口号为1521或1526
下面是一个典型的连接描述符的例子:
(DESCRIPTION= (ADDRESS=(PROTOCOL = TCP)(HOST=IP/servername)(PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=orcl_Oracle.Study.org)))
ADRESS 行指出网络通信将使用TCP协议,HOST指定UNIX服务器,服务器上的Oracle监听器正监听来自端口1521的连接请求。连接描述符的ADDRESS部分也称为协议地址(protocol address)
连接标识符
连接标识符(connect identifier)与连接描述符紧密关联。可把连接描述符作为连接标识符,或者可简单地映射一个数据库服务名为一个连接描述符。
下面是说明映射orcl连接标识符的例子:
orcl= (DESCRIPTION= (ADDRESS=(PROTOCOL = TCP)(HOST=IP/servername)(PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=orcl_Oracle.Study.org)) )
连接串
通过提供一个连接串(connects string)连接到数据库。连接串包含用户名/密码组合及一个连接标识符。最常见的连接标识符之一是节点服务名,它是一个数据库服务的名字。
下面的例子给出一个连接串,它把一个完整的连接描述符作为连接标识符:
CONN scott/[email protected](DESCRIPTION= (ADDRESS=(PROTOCOL = TCP)(HOST=IP/servername)(PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=orcl_Oracle.Study.org)) )
下面是一个更简单的连接到相同数据库的方法,它使用连接标识符orcl:
CONN scott/[email protected]
监听器和连接
Oracle监听器是一个只运行在服务器上并监听连接请求的服务。Oracle提供一个名为lsnrctl的实用程序来管理监听器。监听器的配置文件是listener.ora该文件默认的位置在unix系统为$ORACLE_HOME
/network/admin 该文件是监听器进程的配置文件,监听器的默认名为listener,关于listener就不多说了,它是一个独立运行在Oracle服务器上的进程,接受远程对数据库的接入申请并交付给oracle的服务器进程。所以如果不是使用的远程的连接,并且不需要使用OEM时,listener进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接。因为监听器只运行在服务器上,因此在客户机的机器上没有listener.ora文件。
下面是一个最简单的监听器的例子:
LISTENER = (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)) (ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY)) )
这个例子只给出了监听器的名字(LISTENET)和监听的协议地址。
监听器命令监听器的启动、停止和查看监听器的状态
启动监听器
$ lsnrctl start
停止监听器
$ lsnrctl stop
查看监听器的状态
$ lsnrctl status LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 17-APR-2015 01:42:43 Copyright (c) 1991, 2009, Oracle. All rights reserved. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=Oracle.Study)(PORT=1521))STATUS of the LISTENER------------------------Alias LISTENERVersion TNSLSNR for Linux: Version 11.2.0.1.0 - ProductionStart Date 16-APR-2015 19:20:49Uptime 0 days 6 hr. 21 min. 53 secTrace Level offSecurity ON: Local OS AuthenticationSNMP OFFListener Parameter File /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.oraListener Log File /u01/app/oracle/diag/tnslsnr/Oracle/listener/alert/log.xmlListening Endpoints Summary...(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle.Study)(PORT=1521)))Services Summary...Service "orcl.Oracle.Study" has 1 instance(s).Instance "orcl", status READY, has 1 handler(s) for this service...Service "orcl_Oracle.Study.org" has 1 instance(s).Instance "orcl", status READY, has 1 handler(s) for this service...The command completed successfully
输出说明了监听器启动了多长时间,监听器的配置文件位于何处,它还给出监听器为连接请求而监听的数据库名称。
Services Summary部分,相应的状态可具有如下的某个值:
READ :此实例可接受连接
BLOCKED:此实例不能接受连接
UNKNOWN:此实例在listerer.ora文件中注册而不是通过动态服务注册,因而不知道其状态
进入lsnrctl实用程序,使用help,可以查看更多监听器的命令
[[email protected] admin]$ lsnrctl LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 17-APR-2015 01:49:21 Copyright (c) 1991, 2009, Oracle. All rights reserved. Welcome to LSNRCTL, type "help" for information. LSNRCTL> help The following operations are availableAn asterisk (*) denotes a modifier or extended command: start stop status services version reload save_config trace spawn change_password quit exit set* show*
实例:
So Easy! Oracle在Linux上的安装配置系列三中创建了数据库,并启动了实例,以下示例在服务器上创建监听器配置文件并从win7中使用oracle即时客户端和sql*plus连接到数据库
以下是在服务器上创建的监听器配置文件:
$ cd $ORACLE_HOME/network/admin$ vim listener.ora LISTENER =(ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.23.130)(PORT=1521)) (ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY)))
启动监听器查看监听器的状态(lsnrctl status),可以看到监听器读取的的配置文件为我们创建的文件,并且到实例已经READ,如下:
$ lsnrctl start
到官网下载Windows版的Oracle即时客户端和windors版的Sql * Plus把两个软件解压到相同的文件夹,并放在任意的目录下,我这里是c盘根目录的instantclient_11_2文件夹:
http://download.oracle.com/otn/nt/instantclient/112010/instantclient-sqlplus-win32-11.2.0.1.0.ziphttp://download.oracle.com/otn/nt/instantclient/112010/instantclient-basic-win32-11.2.0.1.0.zip
在instantclient_11_2文件夹的根目录下创建两个文件tnsnames.ora和sqlnet.ora这两个文件可以放在任意位置,但必须用TNS_ADMIN环境变量指定。
tnsnames.ora的文件内容如下:
orcl= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.23.130)(PORT=1521)) ) (CONNECT_DATA= (SERVICE_NAME=orcl_Oracle.Study.org)) ))
tnsnames.ora文件是本地命名方法的配置文件,该文件包含的内容为网络服务名映射到连接描述符,或网络服务名映射到监听协议地址,以上示例中DESCRIPTION包含连接描述符,ADDRESS包含协议及地址,CONNECT_DATA包含数据库服务标识信息。
sqlnet.ora文件的作用:
1.限制客户端访问(如指定客户端域为不允许访问)
2.指定命名方法(local naming,directory
nameing...)的优先级
3.启用日志及跟踪(log and
trace)功能
4.通过特定进程来路由客户端连接
5.配置外部命名(第三方连接程序,如c语言写的)参数
6.配置Oracle的高级安全
7.使用协议特定的参数限制对数据库的访问
常用参数设置
1.设置windows下允许使用windows
nt本地认证
SQLNET.AUTHENTICATION_SERVICES=(nts)
2.设置Oracle客户端连接串命名查找顺序
NAMES.DIRECTORY_PATH=(tnsnames,
onames,ezconnect)
允许的值有:
1.tnsnames使用客户端的tnsnames.ora解析
2.ldap使用目录访问协议解析,需要有目录服务
3.ezconnect
or hostname,允许使用tcp/ip连接串,包含主机名,端口,服务名
4.cds分布式环境的数据库名
5.nis (Network
Information Service (NIS) external naming
method),主要用于外部程序解析
6.onames:通过Oracle Name
Server解析
3.设置客户端连接会话超时时间(单位分钟)
定期检测客户端是否还是活动的,设置为0不检测
SQLNET.EXPIRE_TIME
=
10
另外还有:
客户端建立连接超时时间(单位秒,默认60)
SQLNET.INBOUND_CONNECT_TIMEOUT=10
Oracle建议在listener.ora中也进行配置
接受超时时间(单位秒)
SQLNET.RECV_TIMEOUT=3
发送超时时间(单位秒)
SQLNET.SEND_TIMEOUT=3
4.客户端限制
是否进行限制(默认no):
TCP.VALIDNODE_CHECKING
如:TCP.VALIDNODE_CHECKING=yes
限制客户端访问
TCP.EXCLUDED_NODES=(hostname
| ip_address, hostname | ip_address, ...)
如:TCP.EXCLUDED_NODES=(financ, mkt,
144.25.5.25)
允许客户端访问,会覆盖限制访问
TCP.INVITED_NODES=(hostname | ip_address,
hostname | ip_address, ...)
如:TCP.INVITED_NODES=(sale, h,
144.185.5.73)
5.设置立即发送
设置等待一段时间或者数据包凑够多大才会一起发送,或者可以让数据立即发送
TCP.NODELAY=yes
6.设置使用专享连接还是公用链接
设置为on会在客户端连接串后加上(SERVER=dedicated)
USE_DEDICATED_SERVER=on/off
本例为:
NAMES.DIRECTORY_PATH= (TNSNAMES)SQLNET.AUTHENTICATION_SERVICES= (NTS)
sqlnet.sql文件官方文档位置:
http://docs.oracle.com/cd/E11882_01/network.112/e10835/sqlnet.htm
在xshell中新建一个窗口,切换到instantclient_11_2目录,在windows版的sql *plus中以sys用户使用dba权限连接数据库:
[C:\Users\chencheng]$ cd c:\instantclient_11_2 [C:\instantclient_11_2]$ [C:\instantclient_11_2]$ sqlplus sys/[email protected] as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Fri Apr 17 13:21:05 2015 Copyright (c) 1982, 2010, Oracle. All rights reserved. ERROR:ORA-01031: insufficient privileges Enter user-name:
出现ORA-01031错误: insufficient privileges 。
使用一般用户以非dba权限登录是可以的,但实例必须被启动.如:
[C:\instantclient_11_2]$ sqlplus system/[email protected] SQL*Plus: Release 11.2.0.1.0 Production on Fri Apr 17 22:24:13 2015 Copyright (c) 1982, 2010, Oracle. All rights reserved. Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> col tablespace_name for a14SQL> col file_name for a50SQL> set linesize 32767SQL> SELECT file_name,tablespace_name FROM dba_data_files; FILE_NAME TABLESPACE_NAM-------------------------------------------------- --------------/u01/app/oracle/admin/oradata/orcl/system01.dbf SYSTEM/u01/app/oracle/admin/oradata/orcl/sysaux01.dbf SYSAUX/u01/app/oracle/admin/oradata/orcl/undotbs01.dbf UNDOTBS/u01/app/oracle/admin/oradata/orcl/users01.dbf USERS
不能以DBA身份登录要解决这个问题就要说到密码文件:
密码文件(password file)是一个可选的文件,允许远程SYSDBA或管理员访问数据库。
启动Oracle时,还没有数据库可以用来验证密码。在"本地"系统上启动Oracle时(也就是说不在网络上,而是从数据库实例所在的机器启动),Oracle会利用操作系统来执行这种认证。
注意:我们在xshell中使用ssh协议连接linux服务器,在linux命令行下使用
$ sqlplus / as sysdba
连接数据库是属于本地连接,而非远程连接
安装Oracle时,会要求完成安装的人指定管理员"组"。在unix/Linux上,这个组一般默认为DBA,不过,也可以是平台上任何合法的组名。这个组很"特殊"因为这个组的任何用户都可以作为SYSDBA连接Oracle,而无需指定用户名或密码。如,在安装Oracle Database 11g Release 2时,我指定了一个dba组。dba组中的任何用户都无需用户名/密码就能连接:
[[email protected] ~]# useradd -G dba were[[email protected] ~]# su - were [[email protected] ~]$ export ORACLE_BASE=/u01/app/oracle[[email protected] ~]$ export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1[[email protected] ~]$ export ORACLE_SID=orcl [[email protected] ~]$ export PATH=$PATH:$ORACLE_HOME/bin[[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Fri Apr 17 09:36:13 2015 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to an idle instance. SQL> startupORACLE instance started. Total System Global Area 1068937216 bytesFixed Size 2220200 bytesVariable Size 616566616 bytesDatabase Buffers 444596224 bytesRedo Buffers 5554176 bytesDatabase mounted.Database opened.SQL> exit [[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Fri Apr 17 09:43:10 2015 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> SHOW USER; USER is "SYS" SQL> SELECT instance_name FROM v$instance; INSTANCE_NAME----------------orcl
这是可以的,成功地连接了oracle,现在我能启动这个数据库,将其关闭,或者完成我想做的任何管理工作。不过,假设我从另外一台机器通过网络完成这些操作,会怎么样呢?问题的答案就是ORA-01031错误 。
在网络上,对于SYSDBA的操作系系统认证不再凑效,即使把
REMOTE_LOGIN_PASSWORDFILECD
参数设置为TRUE也不例外。所以,操作系统认证不可行。如前所述,如果想启动一个实例进行装载,并打开一个数据库,根据定义还没有数据库,也无法从中查找认证的详细信息。但是这里我打开了数据库但还是没办法使用dba权限远程访问,还是出现ORA-01031: insufficient privileges错误。
因此密码文件"应运而生"。密码文件保存了一个用户名和密码列表,这些用户名和密码分别对应于可以通过网络远程认证为SYSDBA的用户。Oracle必须使用这个文件来认证用户,而不是数据库中存储的正常密码文件。
下面校正这种情况。首先,我们要本地启动数据库,以便设置REMOTE_LOGIN_PASSWORDFILE.
查看REMOTE_LOGIN_PASSWORDFILE的值
SQL> show parameter remote_login_passwordfile NAME TYPE VALUE------------------------------- --------------- ------------------------------remote_login_passwordfile string EXCLUSIVE
这个参数有三种值:
NONE:没有密码文件 ,不存在"远程SYSDBA"登录
SHARED:多个数据库可以使用同样的密码文件
EXCLUSIVE:只有一个数据库使用了一个给定的密码文件
在Oracle 11g R2中这个参数的默认值就是EXCLUSIVE
假如remote_login_passwordfile参数的值不是EXCLUSIVE修改方法如下,但实例启动和运行时,这个设置不能动态改变,所以不得不关闭、要想认它生效必需重启实例
SQL> ALTER SYSTEM SET remote_login_passwordfile=exclusive SCOPE=spfile;
下一步是使用命令行工具orapwd创建和填写这个初始的密码文件:
$ orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle entries=20
这样创建了一个名为oraporcl的密码文件,这个文件存放在$ORACLE_HOME/dbs目录中.
目前该文件中只有一个用户,也就是用户sys,尽管数据库上还有其他SYSDBA账户,但是它们还不在密码文件中,不过基于以上设置 ,我们可以第一次作为SYSDBA通过网络连接oracle
[C:\instantclient_11_2]$ sqlplus sys/[email protected] as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Fri Apr 17 21:55:21 2015 Copyright (c) 1982, 2010, Oracle. All rights reserved. Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> SHOW USER;USER is "SYS"
小结:
本篇讲了oracle基本的网络连接,对网络相关的三个配置文件做了最简单的配置,讲了密码文件 ,并实现了在实例启动的情况下,从远程计算机通过即时客户端以dba权限登录数据库。
未完成的内容,在没有实例启动的情况下从远程登录oracle并启动数据库。监听器的动态配置和静态配置、oracle的四种连接方法
本篇的内容到此为止,恭候阅读,不对的地址请批评指证,讨论.
qq:276631587
good luck!