本节摘要:Oracle 术语体系的第一原则是区分"运行时"与"持久化"两个世界——实例属于运行时,数据库属于磁盘;内存分 SGA 与 PGA,存储分逻辑与物理两层。本节用一张术语关系图把这套词表对齐,并用数据字典查询把每个词落到可验证的对象上。
新人接手 Oracle 的第一周,几乎都会被老 DBA 一句话敲打:"实例不是数据库。"这句话值得展开。**数据库(Database)**是磁盘上那堆物理文件的集合:数据文件、控制文件、在线重做日志——断了电它也在。**实例(Instance)**是运行时的进程加内存:一组后台进程和一块共享内存 SGA——重启就清零重建。实例打开数据库,两者配合才有服务;单机环境一对一,RAC 环境多个实例共享同一个数据库。这个区分不是咬文嚼字:值班时"实例崩了"和"数据库坏了"是两种完全不同量级的事故,前者重启即恢复,后者可能要动备份。
磁盘上的数据文件是哑巴,真正给数据编址的是逻辑结构。Oracle 从大到小分五层:表空间(Tablespace)是最大的逻辑容器,一个数据库由若干表空间组成;表空间往下是段(Segment)——一张表、一个索引各占一个段;段往下是区(Extent),一次连续分配的若干块;最底层是块(Block),Oracle 最小 I/O 单元,默认 8KB。这栋"五层楼"的价值在于:容量告警时你知道该去找谁(表空间),碎片整理时你知道对象在哪一层(段与区),I/O 调优时你知道最小读写单位(块)。
几个容易混的邻居词也要对齐:模式(Schema)与用户(User)——Oracle 里两者一体,建用户即建模式,模式是该用户所有对象的集合;表空间与数据文件——一对多的包含关系,表空间是账本目录,数据文件是账本本身;UNDO 与 REDO——名字像反义词,职能也像:UNDO 记"怎么撤销"供回滚与一致性读,REDO 记"怎么重做"供崩溃恢复,方向相反、缺一不可。
| 术语对 | 一句话区分 | 值班含义 |
|---|---|---|
| 实例 vs 数据库 | 运行时的进程内存 vs 磁盘上的文件集合 | 实例崩了重启,数据库坏了才动备份 |
| SGA vs PGA | 全局共享内存 vs 会话私有内存 | SGA 命中率影响全库,PGA 不足拖慢排序 |
| 表空间 vs 数据文件 | 逻辑容器 vs 物理载体 | 扩容加数据文件,清理删段释放空间 |
| UNDO vs REDO | 怎么撤销 vs 怎么重做 | UNDO 异常影响回滚与一致读,REDO 丢失影响恢复 |
| CDB vs PDB | 容器库 vs 可插拔库 | 多租户下故障域按 PDB 隔离(详见第 8 章) |
背景。 新人小周接手一套交接文档残缺的库,老 DBA 只留下一句"存储够用到年底吗"。术语不清的人会去翻操作系统磁盘——那是错的楼层。
操作。 小周按五层楼自上而下查:
-- 楼顶:表空间水位(回答"够不够"的正确楼层) SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024/1024, 1) AS total_gb, ROUND(SUM(bytes - NVL(free_bytes,0))/1024/1024/1024, 1) AS used_gb FROM ( SELECT t.tablespace_name, t.bytes, (SELECT SUM(f.bytes) FROM dba_free_space f WHERE f.tablespace_name = t.tablespace_name) AS free_bytes FROM dba_data_files t) GROUP BY tablespace_name; -- 楼层明细:哪些段在吃空间(前 10 名) SELECT owner, segment_name, segment_type, ROUND(bytes/1024/1024/1024, 2) AS size_gb FROM dba_segments ORDER BY bytes DESC FETCH FIRST 10 ROWS ONLY; -- 地基:块大小与块数量 SELECT block_size, ROUND(block_size * COUNT(*)/1024/1024/1024, 1) AS db_gb FROM v$datafile d JOIN v$parameter p ON p.name='db_block_size' GROUP BY block_size;
结果。 十分钟内答案落地:报表表空间一个历史分区段占 1.8TB,业务增长其实是它无限膨胀,加磁盘属于治标。解读。 术语分层决定了排查路径——不知道"段"这个概念的人会在表空间层面止步,得出"容量不够、申请扩容"的错误结论。变式。 若查询发现的是 UNDO 表空间暴涨,路径则转向事务分析(找长事务,见第 3 章),与容量治理无关。同一套词表,指向完全不同的处置手册。
Oracle 把自身元数据也存成了表——数据字典。前缀是它们的门牌:USER_ 开头看你自己的,ALL_ 开头看你有权看的,DBA_ 开头看全库的(需权限),V$ 开头是运行时动态视图。背术语不如用术语:
-- 我有哪些表(USER_ 前缀,无需写 owner) SELECT table_name, num_rows, last_analyzed FROM user_tables ORDER BY num_rows DESC; -- 这个库有什么组件在工作(V$ 前缀,运行时真相) SELECT name, value/1024/1024 AS sga_mb FROM v$sga; -- 表空间与数据文件的包含关系(DBA_ 前缀,全库视角) SELECT t.name AS tablespace, d.name AS datafile, ROUND(d.bytes/1024/1024/1024, 1) AS size_gb FROM v$tablespace t JOIN v$datafile d USING (ts#) ORDER BY t.name;
跑一遍这三段查询,五层楼、两个世界、三种前缀就不再是名词,而是你机器上真实存在的对象。本节要点回顾
术语对齐之后,下一节回到那张续约评估单的最后一栏:把 Oracle 和它的对手们放到同一张桌子上。