

Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍线上的生产环境远程连接Oracle数据库的方法和注意事项,并通过示例来说明,接下来我们就开始介绍。
Oracle数据库常见连接方式主要有如下两类:

1、Oracle TNS:TNS(transparence Network Substrate透明网络底层)是Oracle Net的一部分,专门用来管理和配置Oracle数据库和客户端连接的一个工具,如果通过TNS连接Oracle,那么客户端必须安装Oracle client程序。
2、JDBC:是一种针对Java语言的数据库连接,全称Java Database Connectivity。主要是用来规范客户端如何访问数据库的应用程序接口,并支持增删改查等API接口。如果通过JDBC连接Oracle,需要安装Java JDK环境及ojdbcX.jar驱动包。不依赖Oracle client程序。
JDBC连接串配置一般有如下三种方式:
使用service_name,配置方式:jdbc:oracle:thin:@//<host>:<port>/<service_name>
使用SID,配置方式:jdbc:oracle:thin:@<host>:<port>/<SID>
使用SID,配置方式:jdbc:oracle:thin:@<host>:<port>:<SID>
LDAP是轻量目录访问协议,英文全称是LightweightDirectory AccessProtocol,目录服务是一种特殊的数据库系统,以树状的层次结构来存储数据,适用于多读少写场景。LDAP本身并不支持连接数据库,而是用来访问解析存储在LDAP中的数据库连接配置信息。使用LDAP的优点是:针对数量不断增加的目录信息实现统一管理,操作简单易于维护,支持在任何计算机平台上都很容易访问LDAP目录。
针对生产环境特点,梳理应用连接oracle数据库的规范要求如下:
不推荐配置使用scan_ip,原因是scan_ip会根据节点连接数和负载情况动态解析分配会话连接的节点,可能会导致GC争用,影响数据库性能。
统一要求使用虚IP连接数据库。
推荐使用FAILOVER故障转移配置。
Java程序可以通过OCI和Thin两种方式访问ORACLE数据库。
1、OCI是一种胖客户端的连接方式,客户端通过原生java方法调用clibrary(即OCI),一般而言采用这种方式需要安装和配置oracle客户端环境。
配置说明:
(1)url=jdbc:oracle:oci:@<TNSName别名>,可以配置tnsnames.ora然后使用TNSName别名,tnsnames.ora配置并不是必须的,不使用TNSNAME别名的情况下连接串写法如下(以某生产库为例):
url=jdbc:oracle:oci:@(DESCRIPTION =(ADDRESS_LIST =(LOAD_BALANCE = off)(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.30)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.31)(PORT = 1521)) )(CONNECT_DATA = (service_name = dbsnc) (FAILOVER_MODE =(type = session) (method = basic)(retries = 60)(delay = 5)))) |
(2)JDBC-OCI支持TAF,采用这种方式可以实现failover,当前连接的节点宕机时,连接的会话会自动进行故障转移而不会断开。
推荐配置样例:
程序中使用连接串样例:

配置文件:

配置文件中连接串的配置示例:
优先连节点1的配置:
url=jdbc:oracle:oci:@(DESCRIPTION =(ADDRESS_LIST =(LOAD_BALANCE = off)(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.30)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.31)(PORT = 1521)) )(CONNECT_DATA = (service_name = dbsnc) (FAILOVER_MODE =(type = session) (method = basic)(retries = 60)(delay = 5)))) |
优先连节点2的配置:
url=jdbc:oracle:oci:@(DESCRIPTION =(ADDRESS_LIST =(LOAD_BALANCE = off)(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.31)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.30)(PORT = 1521)) )(CONNECT_DATA = (service_name = dbsnc) (FAILOVER_MODE =(type = session) (method = basic)(retries = 60)(delay = 5)))) |
2、JDBCThin驱动程序方式连接oracle数据库时,是纯java实现tcp/ip的c/s通信,不需要完整安装Oracle客户端软件,以linux.x64+oracle11g为例,只需要下载instantclient-basic-linux.x64-11.2.0.4.0.zip并使用其中的ojdbc6.jar等驱动文件,同时安装JDK(建议1.6以上)。
配置说明:
(1)url=jdbc:oracle:thin:@<TNSName别名>,可以配置tnsnames.ora然后使用TNSName别名,tnsnames.ora配置并不是必须的,不使用TNSNAME别名的情况下连接串写法如下(以某线上生产为例):
url=jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(LOAD_BALANCE = off)(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.30)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.31)(PORT = 1521)) )(CONNECT_DATA = (service_name = dbsnc) (FAILOVER_MODE =(type = session) (method = basic)(retries = 60)(delay = 5)))) |
(2)oracle数据库10.2.0.1版本开始支持TNSName,尽管JDBC-THIN不支持TAF,但这种写法使用很方便,当前连接的节点宕机时,客户端程序重启或客户端程序自动重连时能很快连到另外一个节点。
推荐配置样例:
程序中使用连接串样例:

配置文件:

配置文件中连接串的配置示例:
优先连节点1的配置:
url=jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(LOAD_BALANCE = off)(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.30)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.31)(PORT = 1521)) )(CONNECT_DATA = (service_name = dbsnc) (FAILOVER_MODE =(type = session) (method = basic)(retries = 60)(delay = 5)))) |
优先连节点2的配置:
url=jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(LOAD_BALANCE = off)(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.31)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.30)(PORT = 1521)) )(CONNECT_DATA = (service_name = dbsnc) (FAILOVER_MODE =(type = session) (method = basic)(retries = 60)(delay = 5)))) |
Weblogic连接oracle数据库可以只依赖JDBC+oracle驱动包,此配置不需要安装oracle客户端。推荐使用Weblogic多数据源方式来实现failover,与Weblogic多数据源配置样例(具体前台配置可参考多数据源+LDAP):
1.先配置2个单数据源,jdbc连接串推荐使用数据库的虚IP
数据源1- dbsnc1:jdbc:oracle:thin@192.168.21.30/dbsnc 数据源2- dbsnc2:jdbc:oracle:thin@192.168.21.31/dbsnc |
2、配置多数据源dbsnc,选中dbsnc1和dbsnc2两个一般数据源。
Weblogic连接oracle数据库可以只依赖JDBC+oracle驱动包,此配置不需要安装oracle客户端。推荐使用Weblogic多数据源方式来实现failover,与Weblogic多数据源配置样例:
1.先配置2个单数据源,jdbc连接串推荐使用LDAP

jdbc:oracle:thin:@ldap://192.125.50.245:3060/dbsnc1,cn=OracleContext,dc=chinashsnc,dc=com ldap://192.125.50.246:3060/dbsnc1,cn=OracleContext,dc=chinashsnc,dc=com |

jdbc:oracle:thin:@ldap://192.125.50.245:3060/dbsnc2,cn=OracleContext,dc=chinashsnc,dc=com ldap://192.125.50.246:3060/dbsnc2,cn=OracleContext,dc=chinashsnc,dc=com |
2.配置多数据源,选中前面配置的2个单数据源:

通过tuxedo中间件连接oracle数据库可以使用TNS方式,需要安装oracle客户端。
以某线上生产库为例:
(1)、如下在oracle客户端中sqlnet.ora配置优先使用TNS:
在oracle客户端中sqlnet.ora配置优先使用TNS NAMES.DIRECTORY_PATH=(TNSNAMES,HOSTNAME,ONAMES) |
(2)、在$ORACLE_HOME/network/admin/tnsnames.ora文件中添加对应TNS串配置:
优先连节点1的配置(dbsnc1_failover):
dbsnc1_failover = (DESCRIPTION = (LOAD_BALANCE=OFF) (FAILOVER=ON) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.30)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.31)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = dbsnc) (SERVER=DEDICATED) (FAILOVER_MODE= (type = session) (method = basic) (retries = 180) (delay = 5) ) ) ) |
优先连节点2的配置(dbsnc2_failover):
dbsnc2_failover = (DESCRIPTION = (LOAD_BALANCE=OFF) (FAILOVER=ON) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.31)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.30)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = dbsnc) (SERVER=DEDICATED) (FAILOVER_MODE= (type = session) (method = basic) (retries = 180) (delay = 5) ) ) ) |
(3)、使用tnsping命令测试数据库连接,可以看到使用TNS解析并连接成功。
(4)、使用tmloadcf命令更新tuxedo数据源配置,注意将SqlNet参数值修改为TNS中已配置好的数据源名称,如下:
OPENINFO="Oracle_XA:Oracle_XA+acc=P/USERNAME/PASSWORD+SesTm=150+LogDir=.+SqlNet=dbsnc1_failover+Loose_Coupling=true" |
通过tuxedo中间件连接oracle数据库时,如有搭建LDAP服务器,推荐使用LDAP进行域名解析。
以某线上生产库为例:
(1)、如下在oracle客户端中sqlnet.ora配置优先使用ldap:
在oracle客户端中sqlnet.ora配置优先使用TNS NAMES.DIRECTORY_PATH=(LDAP,TNSNAMES,HOSTNAME,ONAMES) |

同时创建ldap.ora文件并添加LDAP服务器配置

(2)、在LDAP服务器(192.125.50.245,192.125.50.246)中添加对应LDAP连接串配置:
优先连节点1的配置(dbsnc1_failover):
# dbsnc1_failover, OracleContext, chinashsnc.com dn: cn=dbsnc1_failover,cn=OracleContext,dc=chinashsnc,dc=com cn: dbsnc1_failover objectclass: top objectclass: orclNetService orclnetdescstring: (DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=off)(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.21.30)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.21.31)(PORT=1521)))(CONNECT_DATA=(service_name=dbsnc)(FAILOVER_MODE=(type=session)(method=basic)(retries=180)(delay=5)))) |
优先连节点2的配置(dbsnc2_failover):
# dbsnc2_failover, OracleContext, chinashsnc.com dn: cn=dbsnc2_failover,cn=OracleContext,dc=chinashsnc,dc=com cn: dbsnc2_failover objectclass: top objectclass: orclNetService orclnetdescstring: (DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=off)(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.21.31)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.21.30)(PORT=1521)))(CONNECT_DATA=(service_name=dbsnc)(FAILOVER_MODE=(type=session)(method=basic)(retries=180)(delay=5)))) |
(3)、使用tnsping命令测试数据库连接,可以看到使用LDAP解析并连接成功。

(4)、使用tmloadcf命令更新tuxedo数据源配置,注意将SqlNet参数值修改为LDAP中已配置好的数据源名称,如下:
OPENINFO="Oracle_XA:Oracle_XA+acc=P/USERNAME/PASSWORD+SesTm=150+LogDir=.+SqlNet=dbsnc1_failover+Loose_Coupling=true" |
(5)、使用tmadm-g命令可以查看当前tuxedo已配置的服务。
Shell脚本连接oracle数据库一般可通过oracle数据库自带的sqlplus工具,使用灵活方便,需要依赖于客户端上已安装oracle客户端。
1,配置说明:
(1)安装配置oracle客户端,设置环境变量;
(2)oracle客户端tnsnames.ora文件中连接串配置为failover方式,tnsnames位置:$ORACLE_HOME/network/admin/tnsnames.ora
(3)sqlplus用户名/密码@“tnsname中的别名”的方式进行连接时,客户端需要配置tnsname中的别名。
2,推荐配置样例:
Shell脚本中连接实例(数据库用户名,密码,tnsname中的别名根据实际情况填写):

tnsnames.ora文件中连接串的配置示例(failover):
优先连节点1的配置(dbsnc1_failover):
dbsnc1_failover = (DESCRIPTION = (LOAD_BALANCE=OFF) (FAILOVER=ON) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.30)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.31)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = dbsnc) (SERVER=DEDICATED) (FAILOVER_MODE= (type = session) (method = basic) (retries = 180) (delay = 5) ) ) ) |
优先连节点2的配置(dbsnc2_failover):
dbsnc2_failover = (DESCRIPTION = (LOAD_BALANCE=OFF) (FAILOVER=ON) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.31)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.30)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = dbsnc) (SERVER=DEDICATED) (FAILOVER_MODE= (type = session) (method = basic) (retries = 180) (delay = 5) ) ) ) |
注:tnsnames.ora配置并不是必须的,不使用TNSNAME别名的情况下写法如下:
sqlplus dbauser/********@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=off)(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.21.30)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.21.31)(PORT=1521)))(CONNECT_DATA=(service_name=dbsnc)(FAILOVER_MODE=(type=session)(method=basic)(retries=180)(delay=5)))) |







