Oracle 的 SID、Service Name、Schema、User、Database 这 5 个到底分别是什么

#Oracle 的 SID、Service Name、Schema、User、Database 这 5 个到底分别是什么

Database
   ↓
Service Name / SID
   ↓
User
   ↓
Schema
   ↓
Table

但实际 Oracle 架构里,SID 和 Service Name 属于连接定位概念,User 和 Schema 属于对象权限概念


#1. Database:整个数据库

可以理解成 Oracle 存放数据的大容器

例如:

Oracle Database
└── EBSDB
    ├── APPS
    ├── HR
    ├── XXCUS
    └── ...

里面包含:

  • 数据文件
  • 控制文件
  • 日志
  • 用户
  • Schema
  • 索引
  • 视图
  • 存储过程

#2. SID:Oracle Instance 的名字

SID = Oracle System Identifier

它主要标识一个 Oracle Instance(实例)

例如:

SID = ORCL

Oracle 服务器上可能有:

Instance
└── ORCL

Instance 可以简单理解成:

Oracle Database
        ↕
   Oracle Instance

Instance 负责运行 Oracle 的内存、后台进程等。

所以:

SID
↓
找到哪个 Oracle Instance

#你可以把 SID 理解成

“我要连接服务器上的哪个 Oracle 实例?”


#3. Service Name:我要连接哪个 Oracle 服务

Service Name 是客户端连接 Oracle 时非常常见的连接目标。

例如:

Service Name = orcl

或者:

Service Name = EBS

连接字符串可能是:

10.10.10.20:1521/EBS

这里:

10.10.10.20   → Host
1521          → Port
EBS           → Service Name

Service 可以映射到一个或多个 Instance。

例如 RAC:

             Service: EBS
              /     \
             ↓       ↓
        Instance1  Instance2
           SID1       SID2

所以 Service Name 更偏向“我要访问哪个数据库服务”


#4. User:登录账号

这个最简单。

例如:

User = APPS
Password = xxx

你登录 Oracle 时实际上是在进行:

用户名 + 密码
       ↓
     Oracle
       ↓
    APPS 用户

User 决定:

  • 能登录什么
  • 能访问什么
  • 有什么权限
  • 能操作哪些对象

例如:

APPS
  ├── SELECT
  ├── INSERT
  ├── UPDATE
  └── EXECUTE

#5. Schema:User 拥有的对象空间

这是最容易混淆的。

Oracle 中:

每个 User 默认拥有一个同名 Schema。

例如创建:

CREATE USER EBS_USER IDENTIFIED BY xxx;

Oracle 会有:

User
└── EBS_USER

Schema
└── EBS_USER

这个 Schema 里面放这个用户拥有的对象:

EBS_USER Schema
├── CUSTOMER
├── ORDER
├── PRODUCT
├── V_ORDER
└── PKG_ORDER

所以你可以简单记:

User
  ↓ owns
Schema
  ↓ contains
Table / View / Procedure / ...

#最重要的区别

#SID

SID
↓
Oracle Instance

解决:

连接哪个实例?


#Service Name

Service Name
↓
Oracle Service
↓
Instance

解决:

连接哪个数据库服务?


#User

User
↓
登录身份
↓
权限

解决:

我是谁?我有什么权限?


#Schema

Schema
↓
Table / View / Procedure

解决:

这些数据库对象属于谁?


#Database

Database
↓
整个 Oracle 数据库

解决:

整个数据存储系统是什么?


#放到你实际 Navicat 里面

假设你拿到 Oracle 信息:

IP:192.168.1.100
Port:1521
Service Name:EBS
用户名:APPS
密码:123456

Navicat:

Host
192.168.1.100

Port
1521

Service Name
EBS

User
APPS

Password
******

连接成功后:

Oracle
└── EBS
    ├── APPS
    │   ├── FND_USER
    │   ├── FND_TABLE
    │   └── ...
    │
    ├── HR
    │   ├── EMPLOYEES
    │   └── ...
    │
    └── XXCUS
        ├── XX_ORDER
        └── XX_CUSTOMER

这里:

EBS
↑
Service Name

APPS
↑
User

APPS
↑
Schema

FND_USER
↑
Table

#最后用一句话记忆

概念 你可以理解成
Database 整个数据库
SID Oracle 实例的名字
Service Name 连接入口/数据库服务
User 登录账号
Schema 这个用户拥有的对象空间
Table Schema 里面的具体数据表

#实际开发中最容易遇到的

10.10.10.20:1521/EBS
       │
       ├── Service Name = EBS
       │
       └── User = APPS
              │
              └── Schema = APPS
                     │
                     ├── FND_USER
                     ├── HR_XXX
                     └── XX_ORDER

尤其注意:Oracle 的 User 和 Schema 经常同名,所以很多工具界面会让你感觉它们就是一个东西。概念上分别对应“身份”和“对象空间”。