我们已经在服务器上建立了 RAC 数据库。我们可以使用 SCAN 地址从服务器上的 sqlplus 连接到数据库。但是,如果我尝试使用基于 SCAN 地址的 TNS 条目从客户端计算机使用 SQL 开发人员连接到 RAC,则会显示错误
12-APR-2016 22:33:07 * (CONNECT_DATA=(CID=(PROGRAM=SQL Developer)(HOST=__jdbc__)(USER=User))(SERVICE_NAME=racdb)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.227.110)(PORT=63694)) * establish * racdb * 12516
TNS-12516: TNS:listener could not find available handler with matching protocol stack
客户端计算机位于防火墙后面。这是 TNS 条目。
RACDB =
(DESCRIPTION =
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.1.149)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.1.150)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.1.151)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = racdb)
)
)
我们无法使用 DNS 从客户端解析 SCAN IP,因此我们使用客户端计算机上的 IP 地址。SCAN 的 IP 地址在客户端使用 NAT 进行转换。下面是他们在服务器上设置的真实地址
# SCAN
#192.168.227.149 racdb-scan.esplink.mn racdb-scan
#192.168.227.150 racdb-scan.esplink.mn racdb-scan
#192.168.227.151 racdb-scan.esplink.mn racdb-scan
如果我们把TNS入口的IP地址改成VIP地址,就连接成功了,可以连接RAC数据库了。
使用SCAN地址连接RAC有错吗?
看起来像 JDBC 11g NAT+RAC 问题。
使用 SCAN 的 JDBC 连接因 ORA-12516/ORA-12520 失败(文档 ID 1555793.1)
上面的注释建议将 JDBC 驱动程序升级到 12c。
每当您通过 SCAN 连接时,您的连接都会被重定向。以前版本的 Oracle JDBC 驱动程序无法正确处理该问题。
如果您下载最新的 SQL Developer,它附带 12.1.0.2 JDBC 驱动程序。
我更喜欢的另一个解决方案是将 OCI 与 Oracle 客户端一起使用而不是 JDBC(这使得取消 SQL Developer 中长时间运行的查询成为可能)。安装 Oracle 客户端后,您可以在工具/首选项/数据库/高级中进行配置。