外观
Oracle 逻辑架构
逻辑架构概述
Oracle 数据库逻辑架构是 DBA 理解和管理数据库的基础,它描述了数据库的逻辑组件及其相互关系。Oracle 逻辑架构主要包括:
- 数据库实例:由内存结构和进程结构组成,负责数据库的运行和管理
- 存储结构:包括数据文件、控制文件、日志文件等物理文件的逻辑组织
- Schema 对象:包括表、索引、视图、存储过程等数据库对象
理解逻辑架构对于性能优化、故障诊断和日常维护至关重要。
数据库实例
数据库实例是 Oracle 数据库的核心,是内存结构和进程结构的集合。一个实例对应一个数据库,但在 RAC 环境中,多个实例可以共享一个数据库。
实例组成
| 组件 | 描述 |
|---|---|
| 内存结构 | SGA(系统全局区)和 PGA(程序全局区) |
| 进程结构 | 服务器进程、后台进程和辅助进程 |
| 元数据 | 数据字典和控制信息 |
内存结构
Oracle 数据库的内存结构分为两大区域:SGA(系统全局区)和 PGA(程序全局区)。
SGA(系统全局区)
SGA 是实例启动时分配的共享内存区域,所有数据库进程共享。主要包含以下组件:
数据库缓冲区高速缓存(Database Buffer Cache)
- 存储从数据文件读取的数据块副本
- 减少磁盘 I/O,提高查询性能
- 由 LRU 算法管理,分为热区和冷区
19c vs 21c 差异:
- 21c 引入了智能缓冲区缓存管理,自动调整热区/冷区比例
- 21c 支持更大的缓冲区缓存,单实例可支持到 TB 级
生产环境建议:
- 通常配置为物理内存的 40-60%
- 监控缓冲区缓存命中率,理想值 > 95%
- 使用
V$BUFFER_POOL_STATISTICS视图监控
sql
-- 查询缓冲区缓存命中率
SELECT name, physical_reads, db_block_gets, consistent_gets,
1 - (physical_reads / (db_block_gets + consistent_gets)) AS hit_ratio
FROM V$BUFFER_POOL_STATISTICS;共享池(Shared Pool)
- 存储 SQL 语句、PL/SQL 程序和数据字典信息
- 包含库缓存和数据字典缓存
19c vs 21c 差异:
- 21c 增强了共享池的自动调整能力
- 21c 引入了自适应游标共享增强
生产环境建议:
- 配置为物理内存的 10-20%
- 监控共享池命中率,理想值 > 95%
- 避免硬解析,使用绑定变量
sql
-- 查询共享池统计信息
SELECT * FROM V$SHARED_POOL_STATISTICS;大池(Large Pool)
- 为 RMAN、并行查询和共享服务器等操作提供大内存分配
- 减少共享池的压力
生产环境建议:
- 对于 RMAN 备份和并行查询密集型系统,适当增大
- 监控大池使用情况,避免内存不足
Java 池(Java Pool)
- 为 Java 虚拟机(JVM)提供内存
- 仅当数据库中使用 Java 存储过程时需要
流池(Streams Pool)
- 为 Oracle Streams 和 GoldenGate 等复制技术提供内存
- 19c 和 21c 中已逐步被 Oracle GoldenGate 和 Oracle Data Guard 替代
重做日志缓冲区(Redo Log Buffer)
- 存储事务产生的重做记录
- 定期写入重做日志文件
- 提高事务处理性能
19c vs 21c 差异:
- 21c 增强了重做日志缓冲区的自动调整
- 21c 支持更快的重做日志写入
生产环境建议:
- 通常配置为 100MB-500MB
- 监控重做日志缓冲区等待事件
sql
-- 查询重做日志缓冲区统计信息
SELECT redo_buffer_allocation_retries, redo_entries, redo_buffer_size
FROM V$INSTANCE_RECOVERY;PGA(程序全局区)
PGA 是每个服务器进程私有的内存区域,用于存储特定于进程的数据。主要包含以下组件:
排序区(Sort Area)
- 用于 SQL 查询的排序操作
- 超过 PGA 限制时会使用临时表空间
哈希区(Hash Area)
- 用于哈希连接和其他哈希操作
会话内存(Session Memory)
- 存储会话状态信息
游标状态(Cursor State)
- 存储 SQL 游标的执行计划和状态
19c vs 21c 差异:
- 21c 增强了 PGA 自动管理,更智能地调整大小
- 21c 支持 PGA 隔离,提高安全性
生产环境建议:
- 启用自动 PGA 管理(
PGA_AGGREGATE_TARGET) - 监控 PGA 使用情况,避免过度使用临时表空间
sql
-- 查询 PGA 使用统计信息
SELECT name, value FROM V$PGASTAT;进程结构
Oracle 数据库的进程结构包括后台进程、服务器进程和辅助进程。
后台进程
后台进程负责维护数据库的正常运行,主要包括:
SMON(系统监视器进程)
- 实例恢复
- 清理临时段
- 合并空闲空间
PMON(进程监视器进程)
- 清理失效的服务器进程
- 释放资源
- 注册服务信息到监听器
DBWn(数据库写入进程)
- 将脏数据块从缓冲区缓存写入数据文件
- 维护检查点
- 19c 和 21c 支持多个 DBWn 进程(最多 36 个)
LGWR(日志写入进程)
- 将重做日志缓冲区的内容写入重做日志文件
- 确保事务持久性
CKPT(检查点进程)
- 更新控制文件和数据文件头的检查点信息
- 触发 DBWn 写入脏数据块
MMON(内存监控进程)
- 收集 AWR 快照
- 监控数据库性能
- 生成警报
19c vs 21c 差异:
- 21c 增强了 MMON 进程的自动调整能力
- 21c 引入了新的后台进程用于自动索引管理
服务器进程
服务器进程处理客户端请求,主要包括:
专用服务器进程
- 为每个客户端连接创建一个专用进程
- 适用于连接数较少的环境
共享服务器进程
- 多个客户端连接共享一个服务器进程
- 适用于连接数较多的环境
- 减少内存消耗
辅助进程
辅助进程用于特定功能,如:
- ARCH:归档重做日志文件
- RMAN:备份和恢复操作
- CJQ:作业队列协调器
- QMNC:队列监视器协调器
存储结构的逻辑视图
Oracle 数据库的存储结构从逻辑上分为以下层次:
表空间(Tablespace)
表空间是数据库的最大逻辑存储单元,包含一个或多个数据文件。主要类型包括:
- 系统表空间:存储数据字典和系统对象
- SYSAUX 表空间:辅助系统表空间,存储 Oracle 组件数据
- 用户表空间:存储用户数据
- 临时表空间:存储临时数据,如排序结果
- UNDO 表空间:存储撤销数据,用于事务回滚和一致性读
19c vs 21c 差异:
- 21c 支持自动表空间管理增强
- 21c 引入了可传输表空间的增强功能
生产环境建议:
- 为不同类型的数据创建单独的表空间
- 合理规划表空间大小和增长策略
- 监控表空间使用率,避免空间不足
sql
-- 查询表空间使用情况
SELECT tablespace_name, file_id, bytes/1024/1024 AS size_mb,
(bytes - free_bytes)/1024/1024 AS used_mb,
free_bytes/1024/1024 AS free_mb,
ROUND((bytes - free_bytes)/bytes * 100, 2) AS used_pct
FROM (SELECT a.tablespace_name, a.file_id, a.bytes,
NVL(b.free_bytes, 0) AS free_bytes
FROM dba_data_files a
LEFT JOIN (SELECT tablespace_name, file_id, SUM(bytes) AS free_bytes
FROM dba_free_space
GROUP BY tablespace_name, file_id) b
ON a.tablespace_name = b.tablespace_name AND a.file_id = b.file_id);段(Segment)
段是表空间中的逻辑存储单元,用于存储特定类型的数据库对象。主要类型包括:
- 表段:存储表数据
- 索引段:存储索引数据
- LOB 段:存储大对象数据
- 回滚段:存储撤销数据(UNDO 表空间中)
区(Extent)
区是段的基本存储单元,由连续的数据块组成。当段需要更多空间时,会分配新的区。
数据块(Data Block)
数据块是 Oracle 存储的最小单元,对应磁盘上的物理块。Oracle 数据块大小通常为 8KB,但可以在创建数据库时指定为 2KB-32KB。
19c vs 21c 差异:
- 21c 支持更大的数据块大小(最大 128KB)
- 21c 增强了数据块压缩算法
Schema 对象
Schema 对象是数据库中存储和管理数据的逻辑结构,主要包括:
表(Table)
存储数据的基本单元,由行和列组成。
索引(Index)
提高数据查询速度,减少磁盘 I/O。
视图(View)
基于表或其他视图的逻辑表。
存储过程和函数(Stored Procedure & Function)
预编译的 PL/SQL 代码块,提高执行效率。
触发器(Trigger)
在特定事件发生时自动执行的 PL/SQL 代码块。
序列(Sequence)
生成唯一数字值的对象。
同义词(Synonym)
对象的别名,简化访问。
数据库链接(Database Link)
连接到远程数据库的通道。
19c vs 21c 差异:
- 21c 引入了原生 JSON 类型,增强了 JSON 支持
- 21c 支持更灵活的分区策略
- 21c 增强了 PL/SQL 并行执行能力
19c 和 21c 逻辑架构差异
内存管理增强
- 21c:智能内存管理,自动调整 SGA 和 PGA 大小
- 21c:支持内存隔离,提高安全性
- 21c:更大的缓冲区缓存支持,单实例可到 TB 级
自动索引管理
- 21c:引入了自动索引功能,自动创建、维护和删除索引
- 21c:新增了索引建议后台进程
存储优化
- 21c:支持更大的数据块大小(最大 128KB)
- 21c:增强了表空间自动管理
- 21c:改进了分区表管理
并行处理增强
- 21c:增强了 PL/SQL 并行执行能力
- 21c:改进了并行查询优化
云原生支持
- 21c:增强了容器和 Kubernetes 支持
- 21c:改进了云存储集成
生产环境逻辑架构设计最佳实践
内存配置
启用自动内存管理:
- 对于 19c,考虑使用
MEMORY_TARGET自动管理 SGA 和 PGA - 对于 21c,推荐使用自动内存管理,配合智能内存调整
- 对于 19c,考虑使用
合理分配内存比例:
- SGA:物理内存的 40-60%
- PGA:物理内存的 20-30%
- 预留 20% 内存给操作系统
监控内存使用:
- 使用 AWR 报告分析内存使用情况
- 监控内存相关等待事件
- 定期检查 SGA 和 PGA 命中率
进程配置
配置合适的进程数:
- 根据服务器资源和并发连接数调整
PROCESSES参数 - 监控进程使用率,避免进程不足
- 根据服务器资源和并发连接数调整
选择合适的服务器模式:
- 连接数较少的环境,使用专用服务器模式
- 连接数较多的环境,考虑使用共享服务器模式
监控进程状态:
- 定期检查后台进程状态
- 监控进程等待事件
存储逻辑设计
表空间设计:
- 为不同类型的数据创建单独的表空间
- 使用本地管理表空间(LMT)替代字典管理表空间(DMT)
- 启用自动扩展,但设置合理的最大值
数据块大小选择:
- 大多数系统使用 8KB 数据块
- 数据仓库系统可考虑使用 16KB 或 32KB 数据块
- 小表较多的系统可考虑使用 4KB 数据块
区和段管理:
- 使用自动段空间管理(ASSM)
- 为大表设置合适的初始区大小
- 监控段碎片,定期重组
常见问题(FAQ)
Q: 如何查看 SGA 和 PGA 的大小?
A: 使用以下 SQL 语句:
sql
-- 查询 SGA 大小
SELECT name, value/1024/1024 AS size_mb FROM v$sga;
-- 查询 PGA 大小
SELECT name, value/1024/1024 AS size_mb FROM v$pgastat WHERE name = 'aggregate PGA target parameter';Q: 如何调整 SGA 和 PGA 的大小?
A: 可以通过以下方式调整:
使用自动内存管理:
sqlALTER SYSTEM SET MEMORY_TARGET = 16G SCOPE = SPFILE; ALTER SYSTEM SET MEMORY_MAX_TARGET = 20G SCOPE = SPFILE;手动调整 SGA:
sqlALTER SYSTEM SET SGA_TARGET = 12G SCOPE = SPFILE; ALTER SYSTEM SET SHARED_POOL_SIZE = 3G SCOPE = SPFILE; ALTER SYSTEM SET DB_CACHE_SIZE = 6G SCOPE = SPFILE;手动调整 PGA:
sqlALTER SYSTEM SET PGA_AGGREGATE_TARGET = 4G SCOPE = SPFILE;
Q: 如何监控数据库进程状态?
A: 使用以下 SQL 语句:
sql
-- 查询后台进程状态
SELECT process, status, client_process, program FROM v$session WHERE type = 'BACKGROUND';
-- 查询服务器进程状态
SELECT sid, serial#, status, username, program FROM v$session WHERE type = 'USER';Q: 如何优化缓冲区缓存命中率?
A: 可以通过以下方式优化:
- 增加
DB_CACHE_SIZE参数值 - 使用多个缓冲区池,将不同类型的数据放入不同的池
- 优化 SQL 查询,减少逻辑读
- 使用绑定变量,减少硬解析
- 监控
V$BUFFER_POOL_STATISTICS视图,分析命中率
Q: 什么情况下使用共享服务器模式?
A: 共享服务器模式适用于以下场景:
- 大量客户端连接(数百或数千)
- 客户端连接时间短,事务量小
- 内存资源有限
- 网络延迟较大的环境
Q: 如何查看表空间的逻辑结构?
A: 使用以下 SQL 语句:
sql
-- 查询表空间、段、区和数据块信息
SELECT tablespace_name, segment_name, segment_type, extent_id, block_id, blocks
FROM dba_extents WHERE segment_name = 'YOUR_TABLE_NAME' AND owner = 'YOUR_SCHEMA';总结
Oracle 逻辑架构是数据库管理的基础,理解逻辑架构对于 DBA 至关重要。19c 和 21c 在逻辑架构上有一些重要差异,特别是在内存管理、自动索引和云原生支持方面。
在生产环境中,DBA 应该根据业务需求和系统资源,合理设计逻辑架构,包括内存配置、进程管理和存储结构。通过监控和优化逻辑架构,可以提高数据库的性能、可靠性和可扩展性。
随着 Oracle 数据库的不断发展,特别是 21c 引入的智能功能,DBA 的角色正在从手动管理向自动化管理转变。理解这些新特性和变化,将帮助 DBA 更好地适应未来的数据库管理挑战。
