两者的主要区别是:
全局数据库名访问 用于客户端和服务端在2个不同的域之间
数据库名(实例名)访问 用于客户端和服务端在同一个域内
数据库名访问举例:
只需要在客户端的tnsname.ora文件中配置如下信息:
ORA11G_243 = // ORA11G_243 可随便定义
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = xxxx)) //服务端IP地址和端口根据实际情况填写
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = xxxx) //服务名填写服务端数据库实例名,即SID
)
)
全局数据库名访问举例:
首先在服务端修改监听文件listener.ora,配置如下信息:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ora11g)
(ORACLE_HOME = /oracle/app/product/11g/db)
(SID_NAME = ora11g)
)
(SID_DESC =
(GLOBAL_DBNAME = ora11g.home1) // 这里就是全局数据库名,通常格式为 db_name.db_domain
(ORACLE_HOME = /oracle/app/product/11g/db)
(SID_NAME = ora11g) //服务端数据库实例名,即SID
)
)
然后重启监听
再修改客户端的tnsname.ora文件,配置如下:
ORA11G_243 = // ORA11G_243 可随便定义
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = xxxx)) //服务端IP地址和端口根据实际情况填写
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = xxxx) //服务名填写服务端所配置的global_name,即全局数据库名 )
)
当客户端有连接请求过来时,服务端监听器会拿listener.ora中的GLOBAL_NAME同连接请求的SERVICE_NAME对比,如果连接请求中是SID(oracle9i之前常用)而不是SERVICE_NAME,则不检查GLOBAL_NAME,而是对监听器设置的SID_NAME进行匹配