1、listener解析:
首先对listener做一个介绍:oracle的listener包括三个文件,分别是sqlnet.ora , tnsnames.ora, listener.ora 其放置的目录在$ORACLE_HOME/network/admin 下面。
下面分别介绍这三个文件:
1)sqlnet.ora:作用类似于linux系统中的/etc/nsswitch.conf(详情:http://blog.csdn.net/changyanmanman/article/details/7333510)文件,通过这个文件来决定怎样找一个连接中出现的连接字符串。
例如我们客户端输入: sqlplus sys/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等并不常用。
2)tnsnames.ora:这个文件类似于unix 的hosts文件,提供的tnsname到主机名或者ip的对应,只有当sqlnet.ora中类似
NAMES.DIRECTORY_PATH= (TNSNAMES) 这样,也就是客户端解析连接字符串的顺序中有TNSNAMES是,才会尝试使用这个文件。
HOST: 数据库侦听所在的机器的机器名或IP地址,数据库侦听一般与数据库在同一个机器上,所以当我说数据库侦听所在的机器一般也是指数据库所在的机 器。在UNIX或WINDOWS下,可以通过在数据库侦听所在的机器的命令提示符下使用hostname命令得到机器名,或通过ipconfig(for WINDOWS) or ifconfig(for UNIX)命令得到IP地址。需要注意的是,不管用机器名或IP地址,在客户端一定要用ping命令ping通数据库侦听所在的机器的机器名,否则需要在 hosts文件中加入数据库侦听所在的机器的机器名的解析。
PORT: 数据库侦听正在侦听的端口,可以察看服务器端的listener.ora文件或在数据库侦听所在的机器的命令提示符下通过lnsrctl status [listener name]命令察看。此处Port的值一定要与数据库侦听正在侦听的端口一样。
SERVICE_NAME: 在服务器端,用system用户登陆后,sqlplus>show parameter service_name命令察看。
如下例子:
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
#下面是这个TNSNAME对应的主机,端口,协议
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
#使用专用服务器模式去连接需要跟服务器的模式匹配,如果没有就根据服务器的模式自动调节
(SERVER = DEDICATED)
#对应service_name,SQLPLUS>;show parameter service_name; 进行查看
(SERVICE_NAME = orcl)
)
)
#下面这个类似
SALES =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sales)
)
)
注意: 如果数据库服务器用MTS,客户端程序需要用database link时最好明确指明客户端用dedicated直连方式,不然会遇到很多跟分布式环境有关的ORACLE BUG。一般情况下数据库服务器用直接的连接会好一些,除非你的实时数据库连接数接近1000 。
Listener.ora文件的例子
#listener.ora Network Configuration File: #E:oracleproduct.1.0Db_2NETWORKADMINlistener.ora
# Generated by Oracle configuration tools.
#下面定义LISTENER进程为哪个实例提供服务 这里是ORCL。
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = boway)
(ORACLE_HOME = E:oracleproduct.1.0Db_2)
(SID_NAME = ORCL)
)
)
#监听器的名字,一台数据库可以有不止一个监听器
#再向下面是监听器监听的协议,ip,端口等,这里使用的tcp1521端口,并且使#用的是主机名
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
)
上面的例子是一个最简单的例子,但也是最普遍的。一个listener进程为一个instance(SID)提供服务。
监听器的操作命令
$ORACLE_HOME/bin/lsnrctl start
(SID_LIST = #时候自己配即可,这个名字没什么用,在连接中也不会用到
(SID_DESC =
(GLOBAL_DBNAME =orcl1) #数据库向外提供的服务名,就是tnsnames.ora中描述的service_name.如果没有这一行,可动态注册。
(SID_NAME = ORCL) #SID_NAME :数据库的实例名
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1))
)
ORCLLISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.213.224.242)(PORT = 1521))
)
)
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=10.213.224.242)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=orcl) #这里的大小写也能忽略,测试可以连上。
)
)
lsnrctl start
报错提示:
The listener supports no services The command completed successfully 如图所示: 这样启动后远程连接会报错: oracle ORA-12514:TNS:listener does not currently know of service requested in connect descriptor 问题原因:数据库实例没注册到listener 解决方法一: 在listener.ora里面添加了一行 SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) (SID_NAME = orcl) ) ) 注:里面的orcl根据你安装的数据库实例名确定,我用此法解决了这个报错。 解决方法二: 登录数据库: $sqlplus / as sysdba 显示服务名: SQL>show parameter service_names 强制注册服务: SQL>alter system register; 查看监听状态: $lsnrctl status
2、图形的配置工具来完成配置:
$ORACLE_HOME/netmgr
本人比较习惯netmgr,
profile 配置的是sqlnet.ora也就是名称解析的方式
service name 配置的是tnsnames.ora文件
listeners配置的是listener.ora文件,即监听器进程
具体的配置可以尝试一下然后来看一下配置文件。
2. 则查询tnsnames.ora文件,从里边找orcl的记录,并且找到主机名,端口和service_name
3. 如果listener进程没有问题的话,建立与listener进程的连接。
4. 根据不同的服务器模式如专用服务器模式或者共享服务器模式,listener采取接下去的动作。默认是专用服务器模式,没有问题的话客户端就连接上了数据库的server process。
5. 这时候网络连接已经建立,listener进程的历史使命也就完成了。
3、连接用到的命令形式
1.sqlplus / as sysdba 这是典型的操作系统认证,不需要listener进程
2.sqlplus sys/oracle 这种连接方式只能连接本机数据库,同样不需要listener进程
3.sqlplus sys/oracle@orcl 这种方式需要listener进程处于可用状态。最普遍的通过网络连接。
以上连接方式使用sys用户或者其他通过密码文件验证的用户都不需要数据库处于可用状态,操作系统认证也不需要数据库可用,普通用户因为是数据库认证,所以数据库必需处于open状态。
init.ora中的Remote_Login_Passwordfile对身份验证的影响三个可选值:
NONE:默认值,指示Oracle系统不使用密码文件,通过操作系统进行身份验证的特权用户拥有SYSORA和SYSOPER权限
EXCLUSIVE:
1.表示只有一个数据库实例可以使用密码文件
2.允许将SYSORA和SYSOPER权限赋值给SYS以外的其它用户
SHARED:
1.表示可以有多个数据库实例可以使用密码文件
2.不允许将SYSORA和SYSOPER权限赋值给SYS以外的其它用户
所以,如果要以操作系统身份登录,Remote_Login_Passwordfile应该设置为NONE
当登录用户不是ORA_DBA组和ORA_OPER组成员时,登录数据库需要在Oracle中创建当前操作系统用户相同的用户名,如果当前用户是域用户,则名称为:domainnameyourname,如果是本地计算机用户,则名称为:computernameyourname
创建方法:
create "domainnameyourname" identified externally;
操作系统,修改HKEY_LOCAL_MACHINESOFTWAREORACLEHOME0下面添加AUTH_PREFIX_DOMAIN,值设为FALSE,在创建Oracle用户时可以忽略 掉域名
这种方式下,init.ora中有一个参数将影响数据库如何匹配一个windows用户和Oracle用户os_authent_prefix = ""
缺省为空,Oracle8i以前,无该参数,而使用OPS$作为用户名前缀.(Oracle用户名最大长度限制为30个字符)