一文搞懂Oracle体系架构:内存结构、后台进程与存储全解析

发布时间:2026/9/2 19:26:06

一文搞懂Oracle体系架构:内存结构、后台进程与存储全解析
这次的内容来自一场 Oracle 体系架构直播回放。如果你已经能装好 Oracle 数据库、能在 SQL*Plus 里跑几条查询但一直没有把“实例、数据库、SGA、后台进程、表空间”这些概念串成一张完整的图那这篇文章就是帮你搭起框架的。Oracle 体系架构是 DBA 和开发者的分水岭。会写 SQL 的人很多但能说清楚一条 SQL 从客户端发出后在 Oracle 内部经历了哪些内存结构、哪些后台进程、哪些文件读写的人才算真正入了 Oracle 的门。这篇博客把直播回放里的核心知识点重新整理成文字版从内存结构、进程结构、存储结构到 SQL 执行链路一次讲透。文章会覆盖SGA 和 PGA 怎么划分、后台进程各自干什么、控制文件和数据文件如何协作、重做日志和归档日志的切换机制、ASM 和普通文件系统的差异以及一套日常排查用的诊断 SQL。适合正在学 Oracle 的开发者、刚转岗的 DBA以及准备面试 Oracle 岗位的读者。建议先收藏再对照自己的环境操作一遍。1. Oracle 体系架构核心能力速览在深入细节之前先用一张表把 Oracle 体系架构的关键概念列出来。后面所有内容都是围绕这张表展开的。能力项说明核心架构实例Instance与数据库Database分离实例构成内存结构SGA PGA 后台进程SMON/PMON/DBWn/LGWR 等数据库构成控制文件、数据文件、联机重做日志、归档日志、参数文件、密码文件内存结构SGA共享池、缓冲区缓存、重做日志缓冲区、大池等 PGA后台进程SMON、PMON、DBWn、LGWR、CKPT、ARCn、RECO 等存储结构表空间Tablespace→ 段Segment→ 区Extent→ 块Block逻辑结构表、索引、分区、簇、序列、存储过程、视图等物理结构数据文件、控制文件、联机重做日志、归档日志、参数文件部署形态单机、RACReal Application Clusters、Data Guard、ASM 存储常见版本11g、12c、19c、21c长期支持版以 19c 为主适合场景企业级 OLTP、数据仓库、金融/政企核心业务系统从表里可以看到Oracle 的关键设计思路是“实例”和“数据库”分开。实例是运行在内存中的一组进程和内存结构数据库是磁盘上的一组物理文件。实例挂载并打开数据库后用户才能访问数据。这个分离设计支持了 Oracle 的高可用架构比如 RAC 就是多个实例共享一个数据库Data Guard 就是一个主数据库配多个备数据库。2. 适用场景与使用边界2.1 哪些人需要掌握 Oracle 体系架构第一类是 DBA。安装部署、性能调优、备份恢复、故障排查每一项都需要体系架构作为底层知识。比如数据库启动到 nomount、mount、open 三个阶段分别校验参数文件、控制文件、数据文件这个流程本身就是体系架构的具体体现。第二类是 Oracle 开发人员。写 SQL 时如果了解共享池如何缓存 SQL、缓冲区缓存如何管理数据块、undo 段如何保障读一致性就能主动写出更高效的 SQL而不是等出问题后再优化。第三类是架构师。做技术选型时需要判断 Oracle 适合承载什么业务、RAC 和 Data Guard 如何组合、ASM 是否比普通文件系统更合适这些问题都要回到体系架构找答案。2.2 不适用和需要谨慎的场景Oracle 是商业数据库授权费用不低不适合对成本极其敏感的初创项目。如果业务量很小、团队没有专职 DBA轻量级开源数据库可能更合适。涉及数据库迁移、备份恢复、日志审计等操作时必须遵循法律法规和企业内部数据安全规范。数据库里通常包含用户隐私、交易记录、商业机密任何导出、复制、恢复操作都要确认授权范围。等保测评涉及的数据库命令、日志留存要求需要按照企业合规流程执行不能随意操作生产库。3. 环境准备与前置条件学习体系架构不一定要一套高配服务器。常见做法是在本机安装 Oracle 数据库或者用 Docker 启动一个 Oracle 容器只要能执行 SQL 和查看后台进程即可。3.1 操作系统选择Oracle 官方对 Linux 支持最好生产环境最常见的是 RHEL、CentOS、Oracle Linux。个人学习可以用 Windows 安装 Oracle 11g 或 19c也可以用虚拟机装 Linux 再安装 Oracle。比较稳妥的方案是本机装一个 Oracle Linux 或 CentOS 7 虚拟机分配 4GB 内存、50GB 磁盘然后安装 Oracle 19c。这个配置足够验证 SGA 内存调整、表空间创建、用户权限管理等操作。3.2 安装文件与账号准备安装 Oracle 数据库需要准备Oracle Database 安装介质11g/19c 安装包或 Docker 镜像。操作系统创建oracle用户配置环境变量。提前规划 ORACLE_HOME、ORACLE_BASE、监听端口默认 1521。磁盘空间建议 20GB 以上交换分区建议 4GB 以上。安装完成后用 sqlplus 验证连接# 切换到 oracle 用户设置环境变量 su - oracle # 登录 SQL*Plus使用 sysdba 权限 sqlplus / as sysdba如果能进入 SQL*Plus 并执行select name from v$database;说明数据库实例已经启动可以进行后续的体系架构实验。3.3 Docker 方式快速准备可选如果不想在虚拟机里完整安装可以用 Docker 跑一个 Oracle 19c 容器作为学习环境。以 Docker 方式启动后实例和数据库都在容器内部通过端口映射暴露 1521 端口供外部连接。这种方式的优点是环境隔离坏了直接删容器重来适合反复折腾。缺点是部分后台进程状态在容器里体现得不够直观学习时还是建议至少完整安装一次。4. 实例与数据库理解 Oracle 的第一道门4.1 什么是实例实例Instance由内存结构和一组后台进程组成。启动一个 Oracle 实例相当于在操作系统里启动了一批 Oracle 进程并分配了一块共享内存。实例启动后用户连接上来执行 SQL其实是在实例的内存里完成解析、执行、数据读取等操作。用命令可以查看当前实例的后台进程-- 查看当前实例的后台进程 select pid, spid, program, pga_used_mem, pga_alloc_mem from v$process where background Y order by pid;这里能看到 DBW0、LGWR、CKPT、SMON、PMON 等一行行后台进程。每一个进程都有明确的职责后续会逐个说明。4.2 什么是数据库数据库Database是磁盘上的物理文件集合主要包括控制文件Control File记录数据库的物理结构信息是数据库启动时的“总目录”。数据文件Data File存放表和索引等用户数据的文件。联机重做日志Online Redo Log记录所有变更操作的日志文件用于实例恢复。归档日志Archive Log联机重做日志切换后保留的历史日志。参数文件SPFILE/PFILE保存数据库实例的配置参数。密码文件Password File允许 sysdba 远程登录的认证文件。数据库文件是持久的实例是易失的。数据库宕机后文件还在重启实例后挂载数据库文件业务就可以继续。4.3 启动阶段Oracle 实例启动过程分为三个阶段SQL startup 1. NOMOUNT读取参数文件启动实例分配 SGA启动后台进程。 2. MOUNT 根据控制文件记录的信息挂载数据库文件但不打开数据文件。 3. OPEN 打开数据文件和联机重做日志允许用户访问数据库。理解这三个阶段对排查启动故障非常有用。如果启动到 nomount 就报错大概率是参数文件有问题或 SGA 分配失败。如果 mount 阶段报错大概率是控制文件缺失或损坏。如果 open 阶段报错可能是数据文件损坏、日志文件异常或需要介质恢复。4.4 关闭阶段关闭数据库也有几种模式shutdown normal -- 等待当前连接断开后关闭生产环境很少用 shutdown immediate -- 回滚未提交事务断开连接关闭实例生产常用 shutdown transactional -- 等待当前事务结束再断开连接关闭实例 shutdown abort -- 直接终止实例需要启动时做实例恢复慎用生产环境最常见的是shutdown immediate。shutdown abort会留下需要恢复的日志状态虽然数据库可以通过自动实例恢复回到一致状态但不建议作为常规关机方式。5. 内存结构SGA 与 PGAOracle 内存结构分为系统全局区SGA和程序全局区PGA两大部分。SGA 是实例级共享内存多个会话共同访问PGA 是每个服务进程私有的内存区域各自独立。5.1 SGA 组成SGA 的内存区域很多重点掌握几个关键组件SGA 组件作用常见调优方向共享池Shared Pool缓存 SQL 语句、执行计划、数据字典信息避免过多硬解析library cache miss 过多时考虑加大缓冲区缓存Buffer Cache缓存数据文件中的数据块减少磁盘 I/O命中率低时考虑增加容量或优化 SQL重做日志缓冲区Redo Log Buffer暂存重做记录由 LGWR 写入联机重做日志太小会导致日志缓冲等待大池Large Pool用于备份恢复、RMAN、并行查询等并行操作多时考虑加大Java 池Java Pool在数据库中运行 Java 代码时使用使用 Java 存储过程时才需要关注Streams 池Streams Pool用于 Oracle Streams / GoldenGate 等同步场景才需要关注查看各组件当前大小的 SQLselect pool, sum(bytes)/1024/1024 as size_mb from v$sgastat group by pool;从结果能看到 shared pool、large pool、java pool 等的大小。如果使用自动内存管理AMMSGA 和 PGA 会按照参数设置自动调整。5.2 PGA 的作用PGA 是服务进程的私有内存区主要用途包括排序sort、哈希连接hash join、位图合并等。排序操作如果 PGA 不够就会把中间结果写到磁盘临时表空间出现temp space相关等待SQL 执行效率明显下降。查看 PGA 使用量-- 查看 PGA 目标值和当前使用量 select name, value/1024/1024 as value_mb from v$parameter where name in (pga_aggregate_target, sga_target, memory_target);这里显示的是目标值实际分配可能动态变化。排序、连接、聚合操作很重的 SQL通常需要更大的 PGA。5.3 内存参数设置思路如果使用自动内存管理核心参数就是memory_target。数据库会根据运行负载在 SGA 和 PGA 之间动态调整。如果使用手动管理需要分别设置sga_target和pga_aggregate_target。生产环境调整这些参数前要看 AWR 报告或等待事件确定瓶颈到底在共享池、缓冲区还是 PGA。不要盲目加大 SGA因为内存资源总是有限的分配过多给数据库会挤占操作系统可用内存。6. 后台进程谁在背后干活Oracle 实例有一批必备后台进程。下面逐个说明核心进程的作用。6.1 SMONSystem Monitor系统监控进程负责实例启动时的实例恢复。数据库异常关闭后SMON 会利用联机重做日志把已提交但未写入数据文件的事务重做把未提交的事务回滚并清理临时段。6.2 PMONProcess Monitor进程监控进程负责监控其他进程。当用户会话异常断开时PMON 会释放该会话占用的资源、回滚未提交事务、清理进程锁。PMON 还负责向监听器注册实例信息让客户端可以通过监听器找到数据库服务。6.3 DBWnDatabase Writer数据库写进程负责把缓冲区缓存中的脏数据块写回数据文件。DBWn 不是实时写的而是延迟写入目的是减少磁盘 I/O。当缓冲区缓存空间不足、检查点发生、脏缓冲区达到阈值时DBWn 会被触发。6.4 LGWRLog Writer日志写进程负责把重做日志缓冲区中的记录写入联机重做日志文件。LGWR 写入时机非常关键用户提交事务时。重做日志缓冲区达到 1/3 满时。日志缓冲区中的记录超过 1MB 时。每 3 秒一次。DBWn 写数据文件之前确保对应重做记录已写入日志。因为 LGWR 写入是同步的所以它比 DBWn 更重要。如果 LGWR 跟不上整个数据库的提交操作都会变慢。6.5 CKPTCheckpoint检查点进程负责更新控制文件和数据文件头的检查点信息。检查点发生得越频繁实例恢复时间越短但会带来更多写 I/O。系统通过fast_start_mttr_target等参数控制检查点行为。6.6 ARCnArchiver归档进程负责把切换后的联机重做日志复制到归档日志目录。只有数据库处于归档模式ARCHIVELOG时ARCn 才会工作。生产数据库一般都会开启归档模式因为只有归档模式才支持在线备份和时间点恢复。查看当前归档模式-- 查看是否处于归档模式 select name, log_mode from v$database;如果输出ARCHIVELOG说明数据库已经开启归档。没有开启归档的库在日志切换后旧日志被覆盖无法恢复到切换点之后的时间点。6.7 其他常见进程RECORecoverer负责分布式事务的自动恢复。在 RAC 环境下还有 LMS、LMD 等与缓存融合相关的进程。Data Guard 环境下有 MRP、LSP 等与日志应用相关的进程。学习时不需要记住所有进程先把 SMON、PMON、DBWn、LGWR、CKPT、ARCn 这几个核心进程的职责弄清楚就能理解大部分日常运维场景。7. 存储结构从数据文件到数据块7.1 物理存储结构物理层面Oracle 数据库文件包括控制文件、数据文件、联机重做日志、归档日志。查看数据文件和控制文件信息-- 查看数据文件 select file_id, tablespace_name, bytes/1024/1024 as size_mb from dba_data_files order by tablespace_name, file_id; -- 查看控制文件位置 select name from v$controlfile;控制文件是数据库的“总目录”记录了所有数据文件的位置、日志文件的位置、数据库名称、检查点信息、SCN 等信息。控制文件通常需要至少两个副本放在不同磁盘或目录避免单点故障。7.2 逻辑存储结构逻辑层面Oracle 的存储层级是表空间 → 段 → 区 → 块。表空间Tablespace数据库逻辑存储的最大单元一个表空间对应一个或多个数据文件。段Segment表、索引、回滚段都是段一个段只能存在于一个表空间内。区Extent段由若干连续数据块组成的区构成段扩展时以区为单位分配空间。块Block最小的 I/O 单元默认大小通常是 8KB。创建表空间是 DBA 最基础的操作-- 创建永久表空间 create tablespace app_data datafile /u01/app/oracle/oradata/ORCLDB/app_data01.dbf size 500M autoextend on next 100M maxsize 20G; -- 创建用户并指定默认表空间 create user app_user identified by YourStrongPassword default tablespace app_data quota unlimited on app_data; -- 授予开发常用权限 grant connect, resource to app_user;这里需要注意生产中创建用户和赋权要遵循最小权限原则不要随意授予dba权限。7.3 临时表空间与回滚段临时表空间用于排序和临时数据的存放。查询量大、排序多的系统临时表空间不足会报ORA-01652。回滚段存放在 UNDO 表空间中用于事务回滚、读一致性和闪回查询。查看 UNDO 表空间状态-- 查看 undo 表空间信息 select tablespace_name, status, contents from dba_tablespaces where contents UNDO;UNDO 表空间过小或者 undo_retention 设置不当会导致ORA-01555 snapshot too old错误这是 Oracle 开发中常见的坑。7.4 表空间使用率监控日常运维中最常用的查询之一-- 查看表空间使用率 select b.tablespace_name, round(b.bytes / 1024 / 1024, 2) as total_mb, round((b.bytes - nvl(c.bytes, 0)) / 1024 / 1024, 2) as used_mb, round(nvl(c.bytes, 0) / 1024 / 1024, 2) as free_mb, round((b.bytes - nvl(c.bytes, 0)) / b.bytes * 100, 2) as used_pct from (select tablespace_name, sum(bytes) bytes from dba_data_files group by tablespace_name) b left join (select tablespace_name, sum(bytes) bytes from dba_free_space group by tablespace_name) c on b.tablespace_name c.tablespace_name order by used_pct desc;当某个表空间使用率超过 90% 时就要考虑扩容或清理历史数据。很多业务故障都是表空间被写满导致的。8. 重做日志与归档日志数据安全的生命线8.1 联机重做日志联机重做日志记录数据库的所有变更操作。日志文件至少需要两组每组可以配置成员文件。LGWR 会循环写入这些日志组写满一组后切换到下一组。查看日志组和成员select group#, sequence#, bytes/1024/1024 as size_mb, members, status from v$log; select group#, member from v$logfile order by group#;如果当前日志组状态为CURRENT说明 LGWR 正在写这一组。当日志切换频繁时会产生大量归档日志也意味着数据库写操作很频繁。8.2 日志切换与检查点日志切换Log Switch是 LGWR 从一组日志切换到另一组日志的操作。切换时如果目标日志组处于ACTIVE状态且没有被归档数据库会等待。生产环境如果看到大量log file switch相关等待一般需要增大日志文件大小或调整检查点策略。8.3 归档模式的作用归档模式的核心价值是保证可恢复性。联机重做日志会被循环覆盖如果不归档日志切换前的重做记录就丢了。归档模式下ARCn 会把切换的日志复制到归档目录意味着可以从任意一个备份点开始应用归档日志恢复到最后时刻。生产数据库建议始终开启归档模式并定期做备份。不要以为有了归档就不需要备份归档只是重做记录如果数据文件损坏还是要依赖备份文件来恢复。查看最近归档日志的生成情况select sequence#, first_time, next_time, archived from v$log_history where first_time sysdate - 1 order by sequence# desc;8.4 强制日志与补充日志对于涉及 Data Guard 或逻辑复制的环境可能需要开启强制日志和补充日志-- 开启强制日志 alter database force logging;强制日志确保所有操作都写入重做日志包括某些原本可能不记录的批量操作。补充日志Supplemental Logging主要用于 GoldenGate 这类逻辑复制工具确保日志中包含足够的键列信息。9. ASM 与 RAC体系架构的扩展形态9.1 ASM 是什么ASMAutomatic Storage Management是 Oracle 的卷管理器也是数据库实例之上的一层存储管理组件。ASM 把多个磁盘组合成磁盘组数据库文件放在磁盘组中由 ASM 负责条带化和镜像。使用 ASM 的好处是简化存储管理避免手动管理数据文件路径。ASM 本身也是一个实例启动时会有ASM实例。进入 ASM 实例的常见方式# 以 grid 用户进入 ASM 实例 sqlplus / as sysasm # 查看磁盘组 select name, state, total_mb, free_mb from v$asm_diskgroup;ASM 在企业部署中很常见尤其是 RAC 环境下所有节点需要共享存储ASM 磁盘组可以屏蔽底层存储差异。9.2 RAC 的核心思路RACReal Application Clusters让多个实例同时访问一个数据库实现负载均衡和故障切换。每个节点有自己的 SGA 和后台进程但共享一套数据文件、控制文件、联机重做日志通常存放在 ASM 磁盘组中。RAC 的关键技术是缓存融合Cache Fusion通过专用网络在节点之间传递数据块避免每个节点都去磁盘读取同一个数据块。学习 RAC 前建议先把单机体系架构吃透。单机体系架构理解得越深RAC 里的 LMS、LMD 进程、DRM 机制、私网通信等内容就越容易理解。9.3 物理体系与虚拟体系基础架构对比在部署 Oracle 时经常会遇到“物理体系”与“虚拟体系”两种架构的对比。物理体系指数据库直接运行在物理服务器上虚拟体系指数据库运行在云主机、虚拟机或容器环境中。虚拟化环境的优势是部署快、资源弹性好、硬件故障切换成本低但在数据库层面虚拟机的 CPU 抢占、内存超分、磁盘网络 I/O 不稳定都可能影响数据库性能。一台物理机上如果虚拟机数量过多可能出现 CPU 等待严重、日志写入延迟变大等现象。从运维角度虚拟化部署建议预留足够资源不要只看参数配置不看实际竞争。数据库是 I/O 敏感型应用日志写入和缓冲区刷新对延迟要求很高。虚拟化环境跑 Oracle至少要让数据库所在虚拟机独享足够的 CPU 核数和内存并与存储团队确认底层磁盘的 IOPS 能力。10. SQL 执行流程与常用开发技巧10.1 一条 SQL 的执行链路从客户端发一条 SQL 到返回结果完整过程大致如下客户端通过监听器建立到 Oracle 服务进程的连接。服务进程在共享池中查找 SQL 是否已缓存。如果未缓存进行语法解析、语义检查、生成执行计划这一过程叫硬解析。执行计划确定后服务进程根据执行计划访问缓冲区缓存中的数据块。如果缓冲区缓存没有目标数据块从数据文件读取到缓冲区缓存。执行过程中需要排序或哈希操作时使用 PGA 内存内存不足时使用临时表空间。变更操作产生重做记录写入重做日志缓冲区提交时由 LGWR 写入联机重做日志。最终结果通过服务进程返回客户端。硬解析较多时共享池竞争会变高系统会出现library cache load lock等等待事件。减少硬解析的主要手段是使用绑定变量。10.2 绑定变量的意义绑定变量可以让不同参数值的同一条 SQL 复用同一个执行计划减少硬解析。下面两段对比能说明问题-- 不推荐每次值不同SQL 文本不同容易产生硬解析 select * from employees where employee_id 100; select * from employees where employee_id 200; -- 推荐使用绑定变量复用执行计划 select * from employees where employee_id :id;业务系统里只要 SQL 都由代码生成尽量使用占位符例如 JDBC 中的?或 MyBatis 的#{}。10.3 Oracle 常用高级查询技巧Oracle 的开发中有几个高频场景层次查询、日期处理、分页、去重和 NOT EXISTS。这些都是面试和实战中的常客。层次查询使用connect by-- 从 id1 开始向下递归查询所有子节点 select employee_id, manager_id, level from employees start with employee_id 1 connect by prior employee_id manager_id;level表示当前节点所在层级。注意connect by使用不当可能导致循环递归比如父子关系数据存在环时需要加nocycle并配合connect_by_iscycle列判断。对日期字段做截断处理最常用的是trunc(sysdate)-- 今天凌晨 0 点 select trunc(sysdate) from dual; -- 本月第一天 select trunc(sysdate, mm) from dual; -- 本月最后一天的 23:59:59 select last_day(sysdate) interval 23 hour interval 59 minute interval 59 second from dual;Oracle 分页通常使用ROWNUM或OFFSET FETCH。11g 和更早版本常用三层嵌套的 ROWNUM 写法-- Oracle 11g 及更早版本分页写法 select * from ( select a.*, rownum as rn from ( select * from employees order by hire_date desc ) a where rownum 20 ) where rn 10;19c 中可以使用标准 SQL 的分页语法-- Oracle 12c 支持的标准分页 select * from employees order by hire_date desc offset 10 rows fetch next 10 rows only;注意分页排序时内层一定要有明确的order by否则每次翻页的结果可能不稳定。NOT EXISTS 和 NOT IN 的取舍-- 推荐NOT EXISTS 可读性好且能避免空值问题 select * from employees e where not exists ( select 1 from dept_history h where h.employee_id e.employee_id );当子查询结果中存在NULL时NOT IN会返回空结果而NOT EXISTS不会受影响。所以判断“不存在”时优先用NOT EXISTS。处理大字段时CLOB 是常见类型。CLOB 不能直接用等于号比较很长内容需要用dbms_lob相关函数操作。例如判断 CLOB 是否为空select id, dbms_lob.getlength(content) as content_len from documents where dbms_lob.getlength(content) 0;10.4 存储过程的优化思路存储过程承载了很多业务逻辑优化时先看 SQL 再看结构。通常先定位v$sql中执行次数多、耗时长的 SQL再回到存储过程里优化具体语句。查看当前最耗时的 SQLselect sql_id, elapsed_time/1000000 as elapsed_sec, executions, sql_text from v$sql where elapsed_time 0 order by elapsed_time desc fetch first 10 rows only;找到问题 SQL 后用explain plan或dbms_xplan查看执行计划重点关注全表扫描、大表连接顺序、索引使用情况。存储过程里尽量避免在循环内部逐条执行 SQL尽量改为一次集合操作完成。11. 系统视图与日常诊断11.1 Oracle 动态性能视图体系架构中的很多信息都暴露在动态性能视图中。以下视图是 DBA 日常最常用的视图作用v$session当前会话信息v$process当前进程信息v$sqlSQL 语句统计信息v$sqlareaSQL 文本和资源统计汇总v$sgastatSGA 各组件内存使用情况v$pgastatPGA 使用统计v$log联机重做日志组状态v$logfile日志成员文件位置v$controlfile控制文件位置v$datafile数据文件信息v$tablespace表空间信息v$asm_diskgroupASM 磁盘组信息v$parameter参数当前值查看当前会话数select status, count(*) from v$session group by status;查看活跃会话正在执行的 SQLselect s.sid, s.serial#, s.status, s.sql_id, s.event from v$session s where s.status ACTIVE and s.username is not null;11.2 等待事件等待事件是判断数据库瓶颈的重要入口。常见的等待事件包括db file sequential read单块读一般对应索引查询。db file scattered read多块读常见于全表扫描。log file sync等待 LGWR 写日志提交频繁时会看到。library cache lock共享池竞争常见于硬解析过多或存储过程编译。enq: TX - row lock contention行锁等待两个会话更新同一行时会看到。查看当前正在发生的等待事件select event, count(*) from v$session where wait_class Idle group by event order by count(*) desc;从等待事件出发可以反向定位到 SQL 和对象进而判断是 SQL 问题、存储问题还是并发问题。12. 功能测试与效果验证学习体系架构后建议按下面的顺序做一个完整实验。每一步都有明确的验证目标跑通了才算真正理解。12.1 实例与数据库验证执行startup的三个阶段观察各阶段报错信息。实验目标确认实例和数据库是两个不同概念。步骤sqlplus / as sysdba shutdown immediate; startup nomount; -- 此时可以用 select name from v$database; 查看数据库信息但无法访问用户表 -- 此时如果查询 dba_data_files会提示数据库尚未装载 alter database mount; -- 此时可以查询控制文件中的文件信息 alter database open;验证方法在 nomount 阶段查询v$database能看到控制文件里的数据库名但还不能访问用户数据到了 open 阶段后正常业务 SQL 才能执行。12.2 表空间测试创建测试用户和表空间插入数据后查看各种存储视图。步骤create tablespace test_ts datafile /u01/app/oracle/oradata/ORCLDB/test_ts01.dbf size 200M autoextend on next 50M maxsize 2G; create user test_user identified by TestPass123 default tablespace test_ts quota unlimited on test_ts; grant connect, resource to test_user;创建表并插入数据conn test_user/TestPass123orcl create table t1 (id number primary key, name varchar2(50)); begin for i in 1..10000 loop insert into t1 values(i, name_ || i); end loop; commit; end; /然后查询-- 查看段大小 select segment_name, bytes/1024 as size_kb from user_segments where segment_name T1;如果段大小大于 0说明数据已经写入数据文件并通过段管理分配了空间。12.3 后台进程验证查看后台进程状态select background, program, pid from v$process where background Y order by program;重点确认 DBW0、LGWR、CKPT、SMON、PMON 这几个进程都存在。如果某个进程不存在说明实例状态异常。12.4 日志切换验证查看当前日志组然后手动切换几次观察归档日志生成select group#, sequence#, status from v$log; alter system switch logfile; alter system switch logfile; -- 再次查看日志状态 select group#, sequence#, status from v$log;对于开启归档模式的数据库切换后可以查询归档日志记录select sequence#, first_time, archived from v$log_history where first_time sysdate - 1 order by sequence# desc;手动切换日志是测试归档、测试备份恢复的常用手段。生产环境不宜频繁手动切换这里只是学习验证。12.5 监控查询验证监控日志中常见的问题是等保相关的数据库命令核查。Oracle 数据库的等保测评通常会检查审计功能、密码策略、登录失败处理等设置。简单查看几个基本配置-- 查看审计相关参数 select name, value from v$parameter where name in (audit_trail, audit_sys_operations); -- 查看用户密码有效期配置 select resource_name, limit from dba_profiles where profile (select profile from dba_users where username TEST_USER);需要说明的是等保测评的具体核查项目很多不同等级要求的检查项不同。生产环境做等保整改时要按照测评机构给出的清单逐项确认不能只改一个参数就算完成。13. 常见问题与排查方法13.1 排查问题清单问题现象可能原因排查方式解决方案数据库启动到 nomount 就报错参数文件损坏或 SGA 分配失败查看 alert 日志检查内存参数检查参数文件调小 sga_target 或 memory_targetmount 阶段找不到控制文件控制文件路径配置错误或文件缺失查看参数 control_files检查文件是否存在恢复控制文件或修改 control_files 参数指向正确位置open 阶段数据文件损坏数据文件被误删或磁盘故障查询 v$datafile 状态查看 alert 日志从备份恢复数据文件或执行介质恢复磁盘空间不足报 ORA-01653表空间无法扩展DBA_DATA_FILES 查看表空间大小和自动扩展扩容数据文件或增加新的数据文件排序操作报 ORA-01652临时表空间不足查询临时表空间使用情况扩充分临时表空间或优化排序 SQLORA-01555 snapshot too oldUNDO 表空间过小或 undo_retention 太短查看 UNDO 表空间大小和回滚段状态增大 UNDO 表空间延长 undo_retention数据库无法连接监听报无服务实例未注册到监听器或监听器未启动lsnrctl status 查看监听状态检查 pmont 是否注册启动监听器等待 PMON 注册或手动 alter system register等待事件大量 log file syncLGWR 写入慢检查磁盘 I/O查看日志文件所在存储优化存储性能调整提交方式或批量提交共享池中硬解析多没有使用绑定变量查看 v$sql 中 sql_text 相似但 sql_id 不同的语句业务代码改造使用绑定变量执行计划突然变差统计信息过期或绑定变量窥探查看执行计划检查统计信息收集时间重新收集统计信息或使用 SQL Plan Management13.2 最常见的启动故障定位数据库报错时用户反馈的信息往往不够。DBA 第一步应该是看告警日志alert log。告警日志位置在vi$diag_info中可以查到select name, value from v$diag_info where name Diag Alert;alert 日志记录了数据库启动关闭、参数修改、内存分配失败、ORA-600 错误等信息是排查问题的第一手资料。13.3 进程残留问题如果数据库异常关闭后后台进程没有完全退出可能导致再次启动失败提示内存或端口被占用。此时需要手动检查并清理残留进程# 查看 oracle 相关进程 ps -ef | grep ora_ | grep -v grep # 如果确定没有其他实例在运行可以 kill 残留进程 kill -9 pid需要特别谨慎生产环境下先确认这些进程确实属于当前实例不要误杀其他实例的进程更不要随意 kill 正常运行的数据库进程。14. 最佳实践与使用建议14.1 学习阶段的建议第一次学习体系架构不要急着调参数。先做三件事第一把实例和数据库的启动流程完整走一遍从 nomount 到 mount 再到 open每步查询对应的视图观察状态变化。第二手动插入一批数据然后从v$sgastat观察缓冲区缓存的变化从v$sql观察 SQL 解析记录。第三手动切换几次日志观察日志组状态和归档日志生成。这套实验跑完体系架构就不再是抽象概念了。14.2 生产环境的最佳实践生产数据库的变更要遵循变更流程。可以先在测试环境验证 SQL 和参数调整的效果再安排生产变更。修改内存参数时建议保留一个可回退的快照。修改sga_target、pga_aggregate_target这类参数后如果内存不足会导致实例无法启动需要有回退方案。日常监控可以重点关注几个指标表空间使用率超过 85% 预警90% 需要立即处理。归档日志增长速度归档目录写满会导致数据库挂起。活动会话数长期过高可能是 SQL 或锁问题。等待事件 Top 5作为性能瓶颈的入口。日志和备份方面建议开启归档模式定期做 RMAN 全备和归档备份。备份不仅要备份数据文件控制文件和参数文件也要包含在备份策略中。数据库里的数据往往涉及用户隐私和商业信息。在测试环境可以使用脱敏数据在生产环境执行导出、备份、迁移操作前要确认操作对象的授权范围。涉及等保测评、日志留存等合规要求时按照企业安全部门和测评机构的规范执行。14.3 开发规范建议给 Oracle 开发的团队几条实用建议所有 SQL 使用绑定变量避免大量硬解析。大数据量分页查询使用OFFSET FETCH并确保排序稳定。判断不存在用NOT EXISTS避免NOT IN的空值陷阱。日期过滤使用trunc(sysdate)时注意索引列上使用函数会导致无法走普通索引可以改成范围条件。大批量数据操作分批提交避免长事务导致 UNDO 膨胀和锁持有时间过长。存储过程内的 SQL 要逐个分析执行计划循环内的 SQL 尤其要避免重复访问大表。15. 总结与下一步Oracle 体系架构最值得花时间理解的是“实例”和“数据库”的分离设计。把 SGA、PGA、后台进程、表空间、重做日志这些东西如何协作搞清楚安装部署、SQL 优化、备份恢复这些技能就都有了一个统一的解释框架。建议按照下面这个顺序继续深入先在本地把 11g 或 19c 装起来手动执行一次完整的启停和日志切换实验然后收集一份 AWR 报告对照文章里的等待事件清单找出数据库的瓶颈最后尝试用 RMAN 做一次备份和恢复演练这是检验体系架构理解程度最好的方式。最容易踩的坑有三个一是把 SGA 调得过大导致操作系统内存不足实例启动失败二是临时表空间和 UNDO 表空间规划太小业务高峰直接报错三是生产库没有开启归档模式一旦需要恢复到故障时间点才发现日志已覆盖。后续可以继续研究的方向包括执行计划与索引优化、UNDO 与读一致性机制、RMAN 备份恢复实战、RAC 和 Data Guard 的搭建与切换。每个方向都建立在体系架构基础上框架搭稳了后面学什么都快。

相关新闻

quake3源码大致结构

quake3源码大致结构

2026/9/2 19:26:06

quake3的源码的大致结构(2017年 3月1日,我再次看了我以前写的这个博客,感觉错误之处极多,过去没有能够领悟的东西,现在领悟了很多,从quake3引擎中,我学到了不少的东西,先做出一番改进…

TabActivity、TabHost、NavController

TabActivity、TabHost、NavController

2026/9/2 19:26:06

1.TabActivity 继承自Activity&#xff0c;其内部定义好了TabHost&#xff0c;可以通过getTabHost()获取TabHost。 TabHost 包含了两种子元素&#xff1a;一些可以自由选择的Tab&#xff0c;及 与这些tab对应的内容tabContent&#xff0c;在layout的<TabHost>下它们分别对…

UI交互动画从概念到实战:提升产品演示质感的关键技术

UI交互动画从概念到实战:提升产品演示质感的关键技术

2026/9/2 19:26:06

先聊一个真实场景&#xff1a;同样是一套 SaaS 控制台&#xff0c;静态稿看起来功能齐全、界面干净&#xff0c;但一到产品演示阶段&#xff0c;按钮点击有没有反馈、页面切换是否平滑、模块出现有没有节奏&#xff0c;会直接决定观众对“产品完成度”的判断。很多时候功能差异…

自动化测试面试高频问题与实战解答:从UI到接口框架

自动化测试面试高频问题与实战解答:从UI到接口框架

2026/9/2 20:16:08

自动化测试在软件测试面试里几乎躲不掉。西安这边12k左右的测试岗&#xff0c;面试官不会只问你“什么是自动化测试”&#xff0c;更常问的是“你做过哪些自动化”“脚本怎么写的”“框架怎么搭的”“出了问题怎么排查”。这些问题的共同点是&#xff1a;看起来是概念题&#x…

小米YU7提车验车全攻略:从外观到交付单,避开签字后扯皮

小米YU7提车验车全攻略:从外观到交付单,避开签字后扯皮

2026/9/2 20:16:08

提完车再发现问题&#xff0c;是所有人都不想面对的场景。群里有个朋友提小米YU7&#xff0c;等车等了大半年&#xff0c;交付当天心情激动&#xff0c;围着车转了一圈&#xff0c;觉得“看起来没毛病”&#xff0c;签完字就把车开走了。第二天洗车时&#xff0c;才发现引擎盖边…

自动化测试面试高频考点全解析:从概念到工程实践

自动化测试面试高频考点全解析:从概念到工程实践

2026/9/2 20:16:08

最近有准备跳槽的测试同学问我&#xff1a;面一个西安 12k 左右的测试岗&#xff0c;面试官怎么总爱揪着自动化测试问&#xff1f;这其实不是什么个别现象。自动化测试在软件测试面试中早就是高频考点&#xff0c;尤其是薪资到了 10k 以上&#xff0c;如果你只会点点点&#xf…

Gradle 5.6.4下载失败?镜像加速与手动放置全攻略

Gradle 5.6.4下载失败?镜像加速与手动放置全攻略

2026/9/2 20:16:08

简介&#xff1a;Gradle 5.6.4 完整发行包&#xff08;all 版&#xff09;是面向 Java 与 Android 开发者的构建工具资源&#xff0c;适合需要离线安装、快速搭建开发环境或学习新版特性的用户。压缩包共两千个文件&#xff0c;主要包含 Java 源码、HTML 帮助文档、Gradle 与 K…

自动化测试面试高频考点:Selenium、接口自动化与Pytest实战解析

自动化测试面试高频考点:Selenium、接口自动化与Pytest实战解析

2026/9/2 20:16:08

1. 为什么自动化测试问题总被面试官反复追问最近不少测试同学反馈&#xff0c;在西安面试 12k 左右的软件测试岗位时&#xff0c;功能测试、数据库、Linux 这些基础题还好&#xff0c;一旦聊到自动化测试&#xff0c;就容易卡壳。有的被问到“Selenium 的显式等待和隐式等待到底…

Tesseract 5.0 Windows源码编译指南:打造完整本地OCR识别环境

Tesseract 5.0 Windows源码编译指南:打造完整本地OCR识别环境

2026/9/2 20:06:07

简介&#xff1a;OCR-Tesseract 5.0编译后完整版本&#xff0c;面向需要快速集成OCR能力的软件开发者、算法工程师及科研人员。该资源基于Google维护的开源OCR引擎Tesseract 5.0编译生成&#xff0c;借助深度学习模型和LSTM/CNN网络&#xff0c;可高效识别中文、英文等百余种语…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/2 10:08:07

每年校招季我都会接触不少准备数据库方向笔试的同学&#xff0c;看到最多的状态就是&#xff1a;简历上写着“熟悉 MySQL”“了解索引优化”&#xff0c;一碰到数据库管理工程师的笔试卷&#xff0c;却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/2 12:11:52

1. 这不是“背公式”的事&#xff1a;时间参数到底在约束什么你翻过数字电路教材&#xff0c;一定见过这两个词&#xff1a;建立时间&#xff08;Setup Time&#xff09;和保持时间&#xff08;Hold Time&#xff09;。它们常被并列写在触发器&#xff08;Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起&#xff1a;从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目&#xff0c;我至今记忆犹新。它没有直接给出一个花哨的名字&#xff0c;而是用“超声波测距机”这个朴实无华的功能描述&#xff0c;精准地勾勒出了考核的核心。对于当时备赛的我而言…

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

2026/9/2 0:04:59

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

2026/9/2 0:04:59

这次我们来看一个很实用的 DeepSeek 落地场景&#xff1a;用 DeepSeek 把英文视频字幕自动翻译成中文。具体案例是《恶魔君》1989 年第 28 集的英转中字幕任务&#xff0c;标题写得很直白&#xff0c;但背后其实是一整套可以复用的技术流程&#xff1a;字幕解析、模型调用、批量…

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

2026/9/2 0:04:59

当你家里摆着一台天猫精灵&#xff0c;却总希望语音助手偶尔“不正经”一点&#xff0c;不用官方腔回答问题&#xff0c;而是张口就接几句搞笑段子&#xff0c;会是什么体验&#xff1f;我最近动手验证了一下这个想法——没有去改装任何市面上现有的智能音箱&#xff0c;而是直…

远程协作的工作台整理

远程协作的工作台整理

2026/9/2 6:21:32

远程协作的工作台整理远程协作的核心不是再加一个工具&#xff0c;而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置&#xff1b;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/2 6:21:32

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/2 2:45:06

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…