先来一个tnsnames.ora文件的样板:
test=
(DEscriptON=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=1521)
)
(CONNECT_DATA=(SERVICE_NAME=orcl.testserver.com)
)
)
现解释如下:
test:为网络服务名(net service name),也叫数据库别名。
SERVICE_NAME:该参数是 Oracle8i 新引进的。在8i以前,我们用 SID 来表示标识数据库的一个实例,但是在 Oracle 的并行环境中,一个数据库对应多个实例,这样就需要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了 Service_name 参数,该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。该参数的缺省值为 Db_name. Db_domain,即等于 Global_name。一个数据库可以对应多个 Service_name,以便实现更灵活的配置。该参数与 SID 没有直接关系,即不必 Service name 必须与 SID 一样。
sql*plus 运行基本机理:
在用户输入 sqlplus system/manager@test 后,sqlplus 程序会自动到 sqlnet.ora 文件中找 NAMES.DEFAULT_DOMAIN 参数,假如该参数存在,则将该参数中的值取出,加到网络服务名的后面,即此例中你的输入由 sqlplus system/manager@test 自动变为 sqlplus system/manager@test.server.com ,然后再到 tnsnames.ora 文件中找 test.server.com 网络服务名,这当然找不到了,因为该文件中只有 test 网络服务名,所以报错。解决的办法就是将 sqlnet.ora 文件中的 NAMES.DEFAULT_DOMAIN 参数注释掉即可,如 #NAMES.DEFAULT_DOMAIN = server.com。假如 NAMES.DEFAULT_DOMAIN 参数不存在,则 sqlplus 程序会直接到 tnsnames.ora 文件中找 test 网络服务名,然后取出其中的 host,port,tcp,service_name,利用这些信息将连接请求发送到正确的数据库服务器上。
另外原则上 tnsnames.ora 中的配置不区分大小写,但是我的确遇到区分大小写的情况,所以最好将使用的网络服务与 tnsnames.ora 中配置的完全一样。
ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect Descrīptor.该错误表示能在 tnsnames.ora 中找到网络服务名,但是在 tnsnames.ora 中指定的 SERVICE_NAME 与服务器端的 SERVICE_NAME 不一致。解决的办法是修改 tnsnames.ora 中的 SERVICE_NAME。
可以看到,能否连接数据库,和sqlnet.ora中的names.default_参数有很大关系。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/248644/viewspace-929673/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/248644/viewspace-929673/