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 经常同名,所以很多工具界面会让你感觉它们就是一个东西。概念上分别对应“身份”和“对象空间”。