So Easy! Oracle在Linux上的安装配置系列四

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 Net
Oracle Net Listener
Oracle Connection Manager
Oracle Net Configuration Assistant
Oracle Net Manager

Oracle Net:Oracle Net是一个初始化、建立及维护客户机和服务器之间连接的组件。必须在客户机和服务器上都安装。Oracle Net主要由两个组件构成:

Oracle Network Foundation Layer
Oracle Protocol Support

Oracle Net Listener:驻留Oracle数据库的所有服务器还运行一个名为Oracle Net Listener(通常也称为监听器)的服务, 其主要功能是监听客户机服务登录Oracle数据库的请求。监听器在保证客户机服务具有与数据库匹配的信息(协议、端口和实例名)后,将客户机请求传递到数据库。假如用户和密码通过认证,则数据库将允许客户机登录。一旦监听器把用户请求交付给数据库,客户机和数据库直接连接,不再需要监听器有帮助。


Oracle Connection Manager、Oracle Net Configuration Assistant、Oracle Net Manager是帮助配置数据库网络连接的GUI实用程序:

Oracle Connection Manager  ----> cmctl
Oracle Net Configuration Assistant---> netca
Oracle 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/tiger@(DESCRIPTION=
                                   (ADDRESS=(PROTOCOL = TCP)(HOST=IP/servername)(PORT=1521))
                                   (CONNECT_DATA=
                                          (SERVICE_NAME=orcl_Oracle.Study.org))
                                )

下面是一个更简单的连接到相同数据库的方法,它使用连接标识符orcl:

CONN scott/tiger@orcl


监听器和连接 

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 LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 16-APR-2015 19:20:49
Uptime 0 days 6 hr. 21 min. 53 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/Oracle/listener/alert/log.xml
Listening 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,可以查看更多监听器的命令

[oracle@Oracle 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 available
An 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.zip
http://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/oracle@orcl 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/oracle@orcl

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 Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> col tablespace_name for a14
SQL> col file_name for a50
SQL> set linesize 32767
SQL> 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组中的任何用户都无需用户名/密码就能连接:

[root@Oracle ~]# useradd -G dba  were
[root@Oracle ~]# su - were
[were@Oracle ~]$ export ORACLE_BASE=/u01/app/oracle
[were@Oracle ~]$ export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
[were@Oracle ~]$ export ORACLE_SID=orcl
[were@Oracle ~]$ export PATH=$PATH:$ORACLE_HOME/bin
[were@Oracle ~]$ 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> startup
ORACLE instance started.

Total System Global Area 1068937216 bytes
Fixed Size    2220200 bytes
Variable Size  616566616 bytes
Database Buffers  444596224 bytes
Redo Buffers    5554176 bytes
Database mounted.
Database opened.
SQL> exit

[were@Oracle ~]$ 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 Production
With 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/oracle@orcl 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 Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> SHOW USER;
USER is "SYS"


小结:

本篇讲了oracle基本的网络连接,对网络相关的三个配置文件做了最简单的配置,讲了密码文件 ,并实现了在实例启动的情况下,从远程计算机通过即时客户端以dba权限登录数据库。

未完成的内容,在没有实例启动的情况下从远程登录oracle并启动数据库。监听器的动态配置和静态配置、oracle的四种连接方法



本篇的内容到此为止,恭候阅读,不对的地址请批评指证,讨论. 

                                                                                                                                                   qq:276631587

                                                                                                                                               good luck!


本文出自 “关注linux技术” 博客,请务必保留此出处http://werewolftj.blog.51cto.com/1606482/1634704

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。