上面的问题,是因为数据库系统能根据提供的实例名(原来的SERVICE_NAME)去找到了相应的主机,故 tnsping 能通,但是根据 tns指定的SERVICE_NAME 没有找到相应的服务名,所有在建立连接的时候报错了。
在这里,提一下比较容易弄混淆的概念,服务名、实例名和数据库名:
(1)服务名(service_names):指listener提供的对外的服务名,客户端可以通过配置tnsnmaes.ora进行连接,tnsnmaes.ora文件中的service_name要等于服务器端listener所注册的服务名,服务名可以通过输入lsnrctl后,在输入service查看,一般的service_name在listener.ora文件中配置(静态注册),或者当没有listener.ora文件时,在初始化文件中配置instance_name和service_names这2个参数进行动态注册。但是无论采用那种注册方式,都可以通过lsnrctl-sevice来检查。
(2)实例名(instance_name):oracle启动instance后,即启动oracle的内存进程,这个内存进程的名称。在unix或者linux环境可以通过ps -ef |grep ora_看到启动的进程。instance_name由环境变量决定,一个只装oracle软件,没有建库的实例(即没有初始化文件,没有控制文件,没有数据文件,没有redolog),可以用rman来启动,启动后select instance_name from v$instance;这个时候我们可以看到instance_name和在环境变量里面配置的ORACLE_SID是同样的名称。(注:正是由于这个原因,我们一般说的SID就是instance_name,但是需要注意的是,实际上instance_name不等于ORACLE_SID。前者是数据库层面的概念,后者是操作系统中环境变量的设置。)
(3)数据库名(db_name):这个是在数据库创建的时候确定的:
CREATE DATABASE db_name
CONTROLFILE REUSE
MAXINSTANCES 32
MAXLOGHISTORY 0
……
该信息存在于初始化文件,控制文件等地方。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9399028/viewspace-693876/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9399028/viewspace-693876/