如何配置才能使客户端连到数据库
要使一个客户端机器能连接oracle数据库需要在客户端机器上安装oracle的客户端软件唯一的例外就是java连接数据库的时候可以用jdbc thin模式不用装oracle的客户端软件加入你在机器上装了oracle数据库就不需要在单独在该机器上安装oracle客户端了因为装oracle数据库的时候会自动安装oracle客户端
用过sql server数据库然后又用oracle的新手可能会有这样的疑问问什么我用sql server的时候不用装sql server的客户端呢?原因很简单sql server也是microsoft的它在操作系统中集成了sql server客户端如果microsoft与oracle有协议将oracle客户端也集成到操作系统中那我们也就不用在客户端机器装oracle客户端软机就可访问数据库了不过这好像是不可能实现的事情
也有的人会问为什么在sql server中没有侦听端口一说而在oracle中要配置侦听端口?其实sql server中也有侦听端口只不过microsoft将侦听端口固定为不允许你随便改动这样给你一个错觉感觉sql server中没有侦听端口咳microsoft把太多的东西都封装到黑盒子里方便使用的同时也带来的需要副作用而oracle中的侦听端口直接在配置文件中允许随便改动只不过无论怎样改动要与oracle服务器端设置的侦听端口一致
我们如何做才能使客户端机器连接到oracle数据库呢?
A. 安装相关软件
B. 进行适当的配置
A.在适当的位置安装适当的软件
在客户端机器
.在客户端机器上安装ORACLE的Oracle Net通讯软件它包含在oracle的客户端软件中
.正确配置了sqlnetora文件
NAMESDIRECTORY_PATH = (TNSNAMES …)
NAMESDEFAULT_DOMAIN=DB_DOMAIN
一般情况下我们不用NAMESDEFAULT_DOMAIN参数如果想不用该参数用#注释掉或将该参数删除即可对于NAMESDIRECTORY_PATH参数采用缺省值即可对于NAMESDEFAULT_DOMAIN参数有时需要注释掉在下面有详细解释
.正确配置了tnsnameora文件
在服务器端机器
.保证listener已经启动
.保证数据库已经启动
如果数据库没有启动用
Oracle i:
dos>sqlplus / as sysdba
sqlplus> startup
Oracle i:
dos>svrmgrl
svrmgrl>connect internal
svrmgrl>startup
命令启动数据库
如果listener没有启动用
lsnrctl start [listener name]
lsnrctl status [listener name]
命令启动listener
B.进行适当的配置
如何正确配置tnsnameora文件
可以在客户端机器上使用oracle Net Configuration Assistant或oracle Net Manager图形配置工具对客户端进行配置该配置工具实际上修改tnsnamesora文件所以我们可以直接修改tnsnamesora文件下面以直接修改tnsnamesora文件为例
该文件的位置为 …\network\admin\tnsnamesora (for windows)
…/network/admin/tnsnamesora (for unix)
此处假设服务器名为testserver服务名为使用的侦听端口为则tnsnamsora文件中的一个test网络服务名(数据库别名)为
test =
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=))
)
(CONNECT_DATA=(SERVICE_NAME=)
)
)
红色的内容为需要根据实际情况修改的内容现解释如下
PROTOCOL客户端与服务器端通讯的协议一般为TCP该内容一般不用改
HOST数据库侦听所在的机器的机器名或IP地址数据库侦听一般与数据库在同一个机器上所以当我说数据库侦听所在的机器一般也是指数据库所在的机器在UNIX或WINDOWS下可以通过在数据库侦听所在的机器的命令提示符下使用hostname命令得到机器名或通过ipconfig(for WINDOWS) or ifconfig(for UNIX)命令得到IP地址需要注意的是不管用机器名或IP地址在客户端一定要用ping命令ping通数据库侦听所在的机器的机器名否则需要在hosts文件中加入数据库侦听所在的机器的机器名的解析
PORT数据库侦听正在侦听的端口可以察看服务器端的listenerora文件或在数据库侦听所在的机器的命令提示符下通过lnsrctl status [listener name]命令察看此处Port的值一定要与数据库侦听正在侦听的端口一样
SERVICE_NAME在服务器端用system用户登陆后sqlplus> show parameter service_name命令察看
如何利用配置的网络服务名连接到数据库
用sqlplus程序通过test网络服务名进行测试如sqlplus system/manager@test如果不能连接到数据库则在tnsnameora文件中的test网络服务名(net service)后面加上Oracle数据库的DB_Domain参数值通过用sqlplus> show parameter db_domain命令察看此处db_domain参数值为将其加到网络服务名后面修改后的tnsnameora中关于该网络服务名的内容为
=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=))
)
(CONNECT_DATA=(SERVICE_NAME=)
)
)
用sqlplus程序通过网络服务名测试如sqlplus system/manager
关于为什们在网络服务名后面加db_domain参数需要了解sql*plus连接数据库的原理我在后面解决常见故障中给出了详细的说明
如果上面的招数还不奏效的话只好用一下乾坤大挪移了
将客户端的网络服务名部分
=
(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=))
)
(CONNECT_DATA=(SERVICE_NAME=)
)
)
拷贝到服务器的tnsnamesora文件中然后再服务器端用sqlplus system/manager连接到数据库
如果能连接成功说明你的客户端与服务器端的网络有问题
如果连接不成功用前面的部分检查网络服务名部分部分是否正确如果确信网络服务名部分正确而且所有的客户端都连不上数据库则可能为系统TCP/IP或Oracle系统有问题建议重新安装数据库
常见故障解决办法
TNS (ORA)TNS:could not resolve service name
该错误表示用于连接的网络服务名在tnsnamesora文件中不存在如上面的tnsnamesora中的网络服务名只有test假如用户在连接时用sqlplus system/manager@test则就会给出TNS错误
要注意的是有时即使在tnsnamesora文件中有相应的网络服务名可是用该网络服务名连接时还会出错出现这种情况的典型配置如下(在客户端的机器上)
sqlnetora文件
NAMESDIRECTORY_PATH = (TNSNAMES …)
NAMESDEFAULT_DOMAIN =
tnsnamesora文件:
test =
(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=))
)
(CONNECT_DATA=(SERVICE_NAME=)
)
)
sql*plus运行基本机理
在用户输入sqlplus system/manager@test后sqlplus程序会自动到sqlnetora文件中找NAMESDEFAULT_DOMAIN参数假如该参数存在则将该参数中的值取出加到网络服务名的后面即此例中你的输入由sqlplus system/manager@test自动变为sqlplus system/man 然后再到tnsnamesora文件中找网络服务名这当然找不到了因为该文件中只有test网络服务名所以报错解决的办法就是将sqlnetora文件中的NAMESDEFAULT_DOMAIN参数注释掉即可如#NAMESDEFAULT_DOMAIN = 假如NAMESDEFAULT_DOMAIN参数不存在则sqlplus程序会直接到tnsnamesora文件中找test网络服务名然后取出其中的hostporttcpservice_name利用这些信息将连接请求发送到正确的数据库服务器上
另外原则上tnsnamesora中的配置不区分大小写但是我的确遇到区分大小写的情况所以最好将使用的网络服务与tnsnamesora中配置的完全一样
ORA: TNS:listener could not resolve SERVICE_NAME given in connect Descriptor
该错误表示能在tnsnamesora中找到网络服务名但是在tnsnamesora中指定的SERVICE_NAME与服务器端的SERVICE_NAME不一致解决的办法是修改tnsnamesora中的SERVICE_NAME
易混淆术语介绍
Db_name对一个数据库(Oracle database)的唯一标识该数据库为第一章讲到的Oracle database这种表示对于单个数据库是足够的但是随着由多个数据库构成的分布式数据库的普及这种命令数据库的方法给数据库的管理造成一定的负担因为各个数据库的名字可能一样造成管理上的混乱为了解决这种情况引入了Db_domain参数这样在数据库的标识是由Db_name和Db_domain两个参数共同决定的避免了因为数据库重名而造成管理上的混乱这类似于互连网上的机器名的管理我们将Db_name和Db_domain两个参数用连接