然后通过tnsping该remotedb,连接成功。 想当然的使用sqlplus来连接remotedb,结果报错: ERROR: ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务 很是奇怪! 参考网上很多类似错误的解决方案,登录到远程数据库,通过 lsnrctl status 命令查看当前 监听情况,发现这里提供的service里面,并没有我前面配置 remotedb 时指定的 SERVICE_NAME ,马上改掉本地 remotedb的 SERVICE_NAME 为远程提供的 service,tnsping 和 sqlplus 都可以正常连接。 $lsnrctl service Service "goldmsgXDB" has 1 instance(s). Instance "goldmsg", status READY, has 1 handler(s) for this service... Handler(s): "D000" established:0 refused:0 current:0 max:1022 state:ready DISPATCHER <machine: E30, pid: 6585> (ADDRESS=(PROTOCOL=tcp)(HOST=E30)(PORT=29992)) Service "goldmsgpri" has 1 instance(s). Instance "goldmsg", status READY, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:2 refused:0 state:ready LOCAL SERVER $lsnrctl status 命令查看监听是否注册成功 可以看到,此处service_name有两个goldmsgXDB,goldmsgpri,而instance_name是一个goldmsg,这时tnsnames.ora里的service_name应该和lsntclt sercie里查出来的service_name保持一致。 The command completed successfully上面的问题,是因为数据库系统能根据提供的实例名(原来的SERVICE_NAME)去找到了相应的主机,故 tnsping 能通,但是根据 tns指定的SERVICE_NAME 没有找到相应的服务名,所有在建立连接的时候报错了。 在这里,提一下比较容易弄混淆的概念,服务名、实例名和数据库名: (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):这个是在数据库创建的时候确定的: 该信息存在于初始化文件,控制文件等地方。 |
|
来自: AlPacido > 《02_Oralce》