`

oracle中sid和service_name的区别

 
阅读更多

转自:http://blog.csdn.net/zhangzl1012/article/details/50752572

 

 先来讲一个小故事,2015年6月份,有个客户迁移了数据库,由单实例数据库变成了RAC。JAVA应用程序出现了无法连接数据库的情况,但是PL/SQL能连接上数据库。由于项目比较庞大,虽然在半夜切换的,但是也不能接受长时间的业务停顿。当时,我对ORACLE技术也只是略知皮毛。在咨询过公司研发后,他们给我的建议是:参考PL/SQL的连接参数,将spring中jdbc连接的url由jdbc:oracle:thin:@10.2.0.2:1521:orcl改为jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 10.2.0.2)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl))),结果问题解决了,当时我挺佩服公司研发的。现在看来,这个并不是最佳的解决方案,下面通过讲解SID和SERVICE_NAME的区别,我将给出更佳的解决方案。

        在讲解SID和SERVICE_NAME之前,先说一下实例。实例是操作系统中访问数据库所需要的一系列的进程和内存的集合。即使没有任何数据文件,实例也可以启动。但是要想访问数据库,必须把数据库文件加载进实例中。实例和数据库的区别可以简单概括为:实例是临时的,它只在相关的进程和内存集合存在时存在,而数据库是永久的,只要文件存在它就存在。一个实例只能对应一个数据库,但是一个数据库可以由多个实例对应(如RAC)。RAC就是多个实例同时打开一个数据库文件的系统,在结构上是多台机器,每台机器运行一个实例,每个实例都打开同一个数据库 (这个是用磁盘共享技术实现的),这些实例之间需要同步高速缓存,这样保证多个实例是完全一致的,不会相互冲突乃至覆盖。

       SID即INSTANCE_NAME是用来唯一标示实例的。SERVICE_NAME是oracle8i新引进的,8i之前,一个数据库只能由一个实例对应,但是随着高性能的需求,并行技术的使用,一个数据库可以由多个实例对应了,比较典型的应用如RAC。为了充分利用所有实例,并且令客户端连接配置简单,ORACLE提出了SERVICE_NAME的概念。该参数直接对应数据库,而不是某个实例。

      了解了SID和SERVICE_NAME之后,我突然觉得前面故事中使用的解决方案并不是最佳的解决方案,因为SERVICE_NAME的出现就是为了应对并发技术,简化客户端连接配置。通过SERVICE_NAME应该能找到更好的解决方案。通过查找JDBC帮助得知JDBC连接ORACLE的方法由三种:

格式一:jdbc:oracle:thin:@//(这里的双斜杠可选)<host>:<port>/<service_name>(这里用SID也行)
格式二:jdbc:oracle:thin:@<host>:<port>:<SID> (这里用serivce_name不行)
格式三:jdbc:oracle:thin:@<TNSName> 

       不难看出,故事中使用RAC之前,JDBC是使用格式二连接的,使用RAC后实例增多了,SID已经不唯一,格式二已经无法完全利用所有资源。研发参考PL/SQL的连接方法刚好碰巧使用了格式三。因为java应用服务器跟数据库服务器是分离的,应用服务器上没有oracle的服务端以及客户端。虽然解决方案中没有使用TNSName,但是使用了TNSName的连接描述,效果是一样的。既然JDBC有三种连接方案,我们不妨再看一下第一种方案。再加上前面的讲解内容,我想大家已经都知道故事中的问题该怎么修改了,只要改成jdbc:oracle:thin:@//10.2.0.2:1521/orcl就可以了,而且这种格式也支持单实例数据库。这也是ORACLE在8i之后增加SERVICE_NAME的初衷。

      可以看到SID是跟实例相对的,SERVICE_NAME是跟数据库相对的概念

在本地做一个测试,一般单实例的oracle在安装时默认SID和SERVICE_NAME是一样的,我们先连接数据库修改一下SERVICE_NAME。方法如下:

1.在cmd中输入sqlplus / as sysdba连接数据库

2.输入show parameter service_name查看当前服务名(可省略)

3.输入alter system set service_names='new_service_name' scope=both

本地sid与service_name都是orcl,这里service_name改为‘kk’然后在java的jdbc连接中设置url='jdbc:orcl:thin:@localhost:1521:orcl'可以连接上。设置成'jdbc:orcl:thin:@localhost:1521:kk'则连接不上。并报错:TNS:listener dose not currently know of SID given in connect descriptor。可以看出是监听器不能识别这个sid。把listener.ora文件中的SID_NAME改为kk则报:TNS:listener could not hand off client connection,即监听器不能处理这个客户端连接。

但是如果用jdbc:oracle:thin:@//<host>:<port>/<service_name>的形式填写地址则orcl和kk都可以连接上

 

分享到:
评论

相关推荐

    oracle_DB_NAME,INSATNCE_NAME,ORACLE_SID区别

    Oracle 中有三个重要的概念:DB_NAME、INSTANCE_NAME 和 ORACLE_SID,它们都是 Oracle 数据库的重要组成部分,了解它们的区别和作用非常重要。 DB_NAME DB_NAME 是数据库的名称,也就是数据库的名字标识。在 ...

    Oracle9个_name介绍

    ### Oracle中的九个_Name参数详解 #### 一、db_name:数据库名称 ...特别是`db_name`、`instance_name`、`service_name`和`listener`等参数,在日常管理和维护中使用频率较高,是必须掌握的核心概念。

    Navicat连接oracle所依赖instantclient_11_1及使用方法

    - SID/Service Name:填写`tnsnames.ora`中的`SERVICE_NAME`。 - 用户名:输入你的Oracle数据库用户名。 - 密码:输入对应的密码。 4. 测试连接,如果一切配置正确,你应该能够成功连接到Oracle数据库。 请注意...

    数据库名实例名sid的区别

    在Oracle数据库系统中,数据库名(DB_NAME)、实例名(INSTANCE_NAME)以及操作系统环境变量(ORACLE_SID)是区分和管理数据库的关键概念。这些参数在不同的Oracle版本中有不同的作用和重要性。 首先,数据库名(DB...

    Oracle的基础概念.doc

    本文将深入探讨Oracle数据库中的几个关键概念,包括`DB_NAME`、`INSTANCE_NAME`、`ORACLE_SID`、`GLOBAL_NAME`、`DB_DOMAIN`、`SERVICE_NAME`以及`NET_SERVICE_NAME`,帮助读者全面理解这些概念及其在Oracle数据库...

    Oracle_PLSQL_instant_Client

    - `service_name`:Oracle服务名,可以在Oracle的`listener.ora`文件或`tnsnames.ora`文件中找到。 - `username`:用于登录数据库的用户名。 - `password`:对应的用户密码。 5. **安全连接**:Oracle支持SSL...

    Oracle客户端连接远端数据库

    在企业级应用环境中,Oracle数据库因其卓越的性能、稳定性和安全性而被广泛采用。当需要从客户端连接到远程Oracle数据库时,就需要配置一系列的文件来确保连接的成功。本文将详细介绍如何通过配置`listener.ora`、`...

    oracle配置文件tnsname

    在Oracle数据库的网络配置中,有三个重要的配置文件:`listener.ora`、`sqlnet.ora` 和 `tnsnames.ora`。这些文件位于 `$ORACLE_HOME/network/admin` 目录下,它们对于实现客户端与服务器之间的通信至关重要。本文将...

    Python使用cx_Oracle模块操作Oracle数据库详解

    这里的`ORACLE_SID`和`SERVICE_NAME`是Oracle数据库中的两个关键概念,它们用于识别和访问数据库实例。`ORACLE_SID`通常代表数据库实例的标识,而`SERVICE_NAME`则用于网络服务,特别是在集群或分布式环境下,外部...

    Oracle_10.x_InstantClient_安装总结

    ### Oracle 10.x InstantClient 安装指南与解析 #### 概述 在IT行业中,Oracle数据库的应用非常广泛,而为了与Oracle...希望本文能够帮助解决您在安装过程中的疑惑,使您的Oracle应用开发和管理工作更加高效便捷。

    orcale 12514错误

    其中,`SERVICE_NAME`应与`listener.ora`中的`GLOBAL_DBNAME`和`SID_NAME`保持一致。 4. **验证环境变量** 检查ORACLE_HOME和ORACLE_SID等环境变量是否已正确设置。这些变量对于监听器和服务的正常运行至关重要...

    Oracle_SQL_Developer_使用指南

    - SID/Service Name:根据数据库实例类型选择输入 - Hostname/IP Address:数据库服务器地址 - Port:数据库监听端口 3. 点击“Test”按钮验证连接,成功后点击“Connect”完成连接。 三、SQL查询 1. 在...

    Oracle 数据库监听分析及其说明

    - **Oracle_sid**: 必须与 Instance_name 的值相匹配,通常用于操作系统级别的环境变量。 - **Sid_name**: 实例名,与 Instance_name 相同。 - **GLOBAL_DBNAME**: 全局数据库名,它向外部提供服务并用于标识数据库...

    详解数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名[参考].pdf

    在深入了解Oracle数据库的管理及维护过程中,理解数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名和服务名等核心概念至关重要。这些概念不仅对于数据库的日常管理十分重要,而且在遇到故障排除时更是不可或...

    Oracle中各名称介绍.docx

    Oracle数据库在设计和管理上涉及多个关键概念,包括数据库名、数据库实例名(SID)、数据库服务名和...然而,在复杂的Oracle部署中,理解这些概念的区别和用途是至关重要的,有助于确保数据的正确访问和系统稳定运行。

    oracle概念详解

    通过以上介绍可以看出,Oracle数据库中涉及多个概念,每个概念都有其特定的作用和应用场景。正确理解和使用这些概念对于Oracle数据库的管理和维护至关重要。例如,了解数据库名和实例名的区别有助于在出现问题时快速...

    Oracle 11G 配置文件

    每个服务实例(SID)都有一个名称和端口号,如`SID_LIST_LISTENER = (SID_DESC = (SID_NAME = ORCL) (GLOBAL_DBNAME = ORCL) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (ADDRESS = (PROTOCOL = TCP)...

    ORACLE 中的几个重点概念

    在Oracle数据库的管理和使用过程中,有几个重要的概念常常被提及,但有时也容易被混淆,这些概念包括:数据库名(DB_NAME)、数据库实例名(INSTANCE_NAME)、操作系统环境变量ORACLE_SID、数据库服务名(SERVICE_...

    oracle实例名,数据库名,服务名等概念区别与联系.doc

    Oracle 数据库概念解释 Oracle 数据库中有多个概念经常让初学者...数据库名、实例名、数据库域名、全局数据库名、服务名等概念都是 Oracle 数据库中重要的概念,理解它们的区别和联系对于数据库管理和开发非常重要。

    oracle安装错误包含instantclient_11_2.zip

    确保其中的service_name与服务器端的实际service_name匹配,同时检查语法是否正确。 - **检查listener.ora**:这个文件配置了监听器的行为。确保它包含了正确的SID_LIST(服务ID列表)和LISTENER(监听器)配置,...

Global site tag (gtag.js) - Google Analytics