news 2026/10/3 18:58:31

Oracle SCN与检查点详解:从原理到故障排查实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Oracle SCN与检查点详解:从原理到故障排查实战

简介:这是一份面向Oracle数据库运维与开发人员的经典技术解析资料,聚焦SCN与检查点两大核心概念,帮助读者理清SCN在事务提交、一致性读、分布式事务及数据库恢复中的工作机制,并结合检查点事件、DBWR写盘、CKPT进程更新控制文件与数据文件头等过程,理解如何缩短崩溃恢复时间。内容涵盖SCN定义与获取方式,如通过dbms_flashback.get_system_change_number查询当前系统SCN,同时说明系统SCN并非每次数据库操作都会改变,通常在事务提交或回滚时更新,并区分控制文件、数据文件头、数据块、日志文件等不同位置SCN的不同作用。检查点部分梳理了事件发生时脏数据写入与文件头更新的完整流程,并给出v$datafile查询检查点SCN的示例,便于对照练习。资源为1个PDF文档,压缩包约81KB,内容精炼,既能作为Oracle入门者建立知识框架的导读材料,也可供有经验者快速回顾关键概念;目前已有434人学习下载,适合需要理解Oracle内部时钟与恢复机制的数据库学习者。

1. 从一次夜班告警看 SCN 与检查点的关系

凌晨两点,监控弹出一条告警:数据库 alert 日志里连续刷 “Checkpoint not complete”,随后实例恢复花了快 40 分钟。第二天排查下来,redo 太小、DBWn 刷盘跟不上,SCN 推进和检查点节奏错位——这就是 Oracle SCN 与检查点详解 要讲清楚的事。SCN 是数据库的全局版本号,检查点负责把脏数据落盘并推进恢复起点,两者配合失误,恢复时间、日志切换告警、DG 延迟都会冒出来。这套机制适合刚接触 Oracle 的新运维,也适合被告警烦了一整年的 DBA。

2. SCN 从哪里来、到哪里去:全局版本号背后的分配与推进

2.1 SCN 不是一个普通数字:结构、单调性与“别拿它当时间”

SCN(System Change Number)是 Oracle 内部用来标识数据库变更顺序的一个全局递增整数。每一次事务提交、每一次 redo 记录生成,都会拿到一个新的、比之前更大的 SCN。Oracle 用 SCN 回答三个问题:这块数据文件头是不是旧的、这条 redo 该不该重放、这个事务对某个会话是否可见。

在内部实现上,SCN 并不只是一个简单计数器,它由 base 和 wrap 两部分组成,大版本之间还改过存储方式。对外你不需要关心这两个部分,只需要理解一个硬规则:SCN 必须严格单调递增,不能回退。同一实例内如此,RAC 和 Data Guard 环境中也要保证全局一致。

正因为这个“全局一致”的要求,SCN 才和数据库恢复深度绑定。实例恢复时,Oracle 从控制文件里的检查点 SCN 开始,把 redo 一直重放到日志里记录的最新 SCN;介质恢复时也按 SCN 排序决定重放顺序。没有 SCN,Oracle 无法判断哪份数据是新的,也就没法回答“恢复到哪里算完”。

一个常见的误解是用 SCN 去推当前时间。SCN 的推进速度完全取决于数据库负载:业务高峰时一秒可能推进几万,空闲时段可能几分钟都不动。Oracle 提供了SCN_TO_TIMESTAMP函数做换算,但它的可靠性依赖 undo 保留期,超出保留范围会直接报 ORA-08181。把 SCN 当成时间线上均速前进的刻度,是很多排查方向跑偏的起点。

2.2 SCN 的分配路径:commit、redo 与 row cache 中的 SCN 锁

SCN 的分配不是由某个前台进程自己随便生成的,Oracle 通过 row cache 里的SCN 锁(对应等待事件enq: TT)来统一分配。事务提交时,会话去 row cache 拿一个 SCN,拿到之后把 SCN 写进 redo record,再把事务标记为已提交。也就是说,SCN 顺序和 redo 记录顺序是一致的。

查询当前系统 SCN 最常见的方式是SELECT current_scn FROM v$database;。这里注意,current_scn是当前实例已经分配出去的最大 SCN,代表“数据库看到了哪个版本”,不代表“最近一次提交是哪个 SCN”。如果你在做数据比对或者增量抽取,用一个 SCN 作为起点,要确保这个 SCN 对应的 redo 还没有被覆盖。

在多实例环境里,SCN 分配会有额外的同步成本。RAC 的早期实现依赖主节点周期性广播 SCN,分布式事务和频繁 commit 时可能出现 SCN 分配热点,表现为大量会话在提交时等enq: TT。12c 之后引入 Lamport SCN 算法,节点间不再强制每次 commit 都去主节点拿 SCN,这类等待明显减少。真遇到enq: TT堆积,排查时要先去v$session里看阻塞来源,记下 SID 和 SERIAL# 再决定怎么处理,不要一上来就杀会话。

还有一个容易忽略的细节:SELECT ... FROM dual这类只读操作不会推进 SCN,只有产生了 redo 的写操作才会。所以拿current_scn做数据抽样的时间起点可以,但不要指望它反映每条 SQL 的执行时刻。

2.3 SCN 在恢复、DG 与 RAC 中的角色:为什么它必须全局一致

实例恢复的流程可以压缩成一句话:从检查点 SCN 开始,重放 redo 到最新 SCN。检查点 SCN 越旧,需要重放的 redo 越多,恢复时间越长。反过来,检查点 SCN 离最新 SCN 越近,说明脏数据越少,恢复越快,但代价是 DBWn 要更频繁地把脏块写进数据文件。

Data Guard 里的gap检测也依赖 SCN。主库和备库各自持有自己的 SCN,备库应用 redo 时会不断推进自己的 SCN。主备之间如果因为网络或者归档日志中断产生缺口,备库的 SCN 会明显落后,主库的 alert 日志里会出现远程归档中断的提示。所以看 DG 延迟,不能只看传输速度,要比较当前主备两端 SCN 差值,以及备库应用的 redo 序列号是否连续。

RAC 中每个节点都有独立的 SCN 分配,但对外必须表现为一个全局有序序列。节点间通过 GES 协调 SCN,协调不当就会出大问题。Oracle 对 SCN 有一个最大允许值检查,如果某个节点分配的 SCN 超出安全范围,数据库会拒绝启动。这也是为什么绝对不要手工修改 SCN,Oracle 内部的ADJUST_SCN相关事件是极端兜底手段,非 Oracle 工程师指导下操作,等保巡检里如果发现有人动过这类事件,基本可以判定是重大违规操作。

2.4 常见误区:手工调 SCN、时间换算与错误依赖 current_scn

先把结论放在前面:SCN 只能由 Oracle 自己分配,任何试图手工把 SCN 调大或调小的操作,都可能让数据库起不来。有人为了让某个 DG 备库跳过 gap,尝试手工推进备库 SCN,结果备库打开后数据文件和 redo 对不上,最后只能重建备库。这个动作不是“后悔药”,是自找的坑。

第二个误区是用SCN_TO_TIMESTAMP当普通时间函数用。它依赖 undo 中的提交时间信息,undo 被覆盖后函数返回 NULL 或直接报 ORA-08181。想统计“某个时间点之后发生了哪些事务”,正规做法是查V$LOGMNR日志挖掘或者闪回查询,而不是靠 SCN 换算时间。

第三个误区是把v$database.current_scn当成“数据库最近活动时间”。一个空闲实例的current_scn长时间不动是正常的,只有产生 redo 的操作才会推进它。监控系统如果拿 SCN 变化率判断数据库是不是“活”的,空闲期就会误报。

3. 检查点不只是落盘:三类检查点与检查点队列的工作逻辑

3.1 检查点位置、脏块队列与控制文件:先分清这四样东西

检查点不是一个“瞬间动作”,而是一个状态:数据库已经确认哪些脏数据写进了数据文件,并把这条确认边界记录在了控制文件里。这个边界就是“检查点位置”,通常用一个 SCN 表示。控制文件里的检查点 SCN 越新,实例恢复时需要重放的 redo 越少。

和检查点相关的还有三个概念,容易混淆:

  • 检查点位置(checkpoint position):控制文件里记录的一个 SCN,表示 DBWn 已经把这个位置之前的脏块全部写盘。
  • 检查点队列(checkpoint queue):内存里一串脏块链表,按块第一次变脏的时间顺序排列,DBWn 从队列头开始写脏块。
  • 数据文件头 SCN:每个数据文件头部记录的 SCN,表示该文件最后一次被同步到的位置。
  • redo 日志里的next_change#:表示这个日志组对应的 SCN 区间终点。

把四者放到一条链上理解:事务产生 redo,同时把对应数据块标记为脏块挂进检查点队列;DBWn 写脏块;CKPT 进程定期把检查点位置更新到控制文件;数据文件头 SCN 在完全检查点或实例打开时更新。恢复时,Oracle 从控制文件的检查点 SCN 开始读 redo,因为那个位置之前的脏数据已经全部落盘,不需要再恢复。

所以“检查点太旧”的直接后果是:恢复起点太靠前,要重放一大段 redo。我们巡检时看v$datafile.checkpoint_change#,本质就是看每个文件当前恢复到哪个 SCN 位置。

3.2 完全检查点、增量检查点与热备份检查点:三类触发源

完全检查点更新控制文件,也会更新每个数据文件头,让文件头 SCN 和检查点 SCN 对齐。触发源有三个:干净关闭数据库时(shutdown immediate/normal)、执行ALTER SYSTEM CHECKPOINT、以及某些表空间动作。完全检查点不是每时每刻都发生的,也不是日常负载下最主要的检查点来源。

增量检查点才是现代 Oracle 实例正常运行时的主角。CKPT 进程每隔一段时间把当前检查点位置往前推,并写进控制文件,但不动数据文件头。DBWn 在检查点队列里挑脏块写盘,两个进程各干各的,通过检查点位置协调。增量检查点的好处是避免某一次崩溃前积压大量脏块,同时减少普通运行时的写盘峰值。

热备份检查点比较容易理解跑偏。执行ALTER TABLESPACE ... BEGIN BACKUP时,Oracle 会冻结数据文件头 SCN,让文件头显得比控制文件旧,这样备份工具拷贝文件时各文件开头不一致也认。备份结束后必须执行ALTER TABLESPACE ... END BACKUP解开文件头。如果忘了,下次打开数据库时 Oracle 会认为文件头 SCN 落后太多,再配合丢失的 redo 就报 ORA-01194,处理起来相当被动。

三类检查点不是互斥的。一个正常运行的系统里,增量检查点持续发生,日志切换时还会额外触发一次检查点,干净关闭时补一次完全检查点。理解它们的侧重,才能看懂 alert 日志里各种 check 相关提示。

3.3 日志切换隐藏了一个检查点:redo 太小为何拖慢一切

日志切换(log switch)是 Oracle 从一个 redo 日志组切到下一个组的过程。每次切换都会触发一个检查点,目的是确保当前日志组可以安全复用。所谓“安全复用”,是指这个日志组的内容在必要的时候可以被覆盖,而覆盖前必须保证该组内最旧 SCN 对应的脏块已经写完。

如果 redo 日志组很小,切换特别频繁,数据库根本没时间把检查点推进到上一个日志组的 SCN,就会出现 “Checkpoint not complete” 或 “log file switch (checkpoint incomplete)” 告警。此时日志组不能复用,切换被堵住,事务的 redo 无处落盘,更新操作就会慢下来,严重时业务直接卡死。

这解释了为什么很多检查点问题最后都指向 redo 配置:不是 CKPT 或 DBWn 偷懒,而是 redo 把切换频率拉到了系统跟不上。我们调检查点参数之前,第一步永远是确认日志切换间隔。日常巡检看v$log_history,如果平均切换间隔低于 15 分钟,就要考虑加大 redo 组了。

3.4 DBWn 与 CKPT 的分工:排查时别找错了进程

排检查点相关的等待,先搞清楚是哪个进程背锅。DBWn 负责把脏块从 buffer cache 写到数据文件,写慢了,脏队列排长队,检查点推不动;CKPT 只负责更新控制文件里的检查点位置,它本身不写数据文件,它的负载一般很轻。如果系统里频繁出现free buffer waits或write complete waits,重点查 DBWn 的写能力和磁盘 I/O,而不是检查点进程。

另一个容易误判的点是:增量检查点推进得勤快,不代表脏数据已经写了。检查点位置更新到控制文件只代表“Oracle 计划让系统恢复到这里”,真正把数据写进磁盘还要靠 DBWn 干活。所以看到一个很新的检查点 SCN,不要立刻断定系统很安全,还要对比v$datafile里各文件的检查点 SCN 和实际 I/O 状况。检查点在控制文件里推进,不等于数据文件里也推进了。

4. 调参落地的标准动作:MTTR 目标、redo 大小与检查点刷盘节奏

4.1 核心参数对照:哪些参数真正影响检查点,哪些只是看起来相关

先给一张可以直接存进笔记的参数表。主打原则是:不碰隐含参数,官方支持、动态可改的先看。

参数默认值作用适用场景设置建议
fast_start_mttr_target0(自动计算)目标平均恢复时间,秒希望控制实例恢复耗时上限需要确定性恢复窗口时设 300–600,之后观察实际效果
log_checkpoint_timeout1800(秒)距上次检查点超过该秒数则触发防止长时间没有检查点一般保持默认,不轻易调
log_checkpoint_interval0(禁用)按 OS 块数触发检查点极少单独使用不建议设,单位容易搞错
db_writer_processes由 CPU 数自动决定DBWn 进程数量大量写负载场景先加观察 I/O 和等待,再考虑加进程
standby_db_preserve_redo0备库侧额外保留 redo 的量DG 场景防止 gap 时 redo 被覆盖按备库磁盘余量给一个保留窗口

fast_start_mttr_target是最直观的一个参数。设成 300,表示希望实例恢复尽量在 5 分钟内完成。Oracle 会据此调整增量检查点推进速度,让检查点 SCN 离最新 SCN 不要太远。这个参数可以动态改,但效果不会立即生效,CKPT 进程会在后续几个周期里逐步调整。

log_checkpoint_timeout和log_checkpoint_interval是老版本里常用的检查点触发手段,现在主要作为兜底存在。log_checkpoint_timeout默认 1800 秒,保证哪怕业务完全没有写操作,每半小时也会推进一次检查点位置。log_checkpoint_interval默认 0 就是禁用,它的单位是操作系统的数据块数量,不是 KB,配置时一换算就容易翻车。

DBWn 进程数不是越多越好。写负载确实大的时候,从一台机器的v$pgastat看不出直接关系,更靠谱的观测点是v$system_event里 DBWn 相关的写等待。RAC 环境中每个实例都有自己的 DBWn 进程组,调参前先确认实例里写压力集中在哪个节点,否则改了参数也改变不了全局瓶颈。

4.2 查清楚当前检查点状态:一条巡检 SQL 看懂三个关键位置

配置参数之前,先把现状摸清楚。下面三条查询是排查检查点的基本盘,可以直接抄进巡检脚本。

-- 当前系统 SCN 与打开状态 SELECT current_scn, open_mode, log_mode FROM v$database; -- 控制文件里的检查点位置,与各数据文件当前同步 SCN SELECT file#, name, status, checkpoint_change#, last_change# FROM v$datafile ORDER BY file#; -- 当前 redo 日志组的 SCN 区间和状态 SELECT group#, thread#, sequence#, status, first_change#, next_change# FROM v$log ORDER BY group#;

第一条查询里的current_scn是数据库当前分配到的最大 SCN,open_mode看库是读写还是只读,log_mode确认是否归档模式。第二条查询是关键:checkpoint_change#表示控制文件认为该数据文件已经同步到的 SCN,last_change#在文件在线时通常为空,文件 offline 或关闭时才有值。如果某个文件的checkpoint_change#明显小于其他文件,说明它的脏块还没写完,或者该文件经历过异常离线。

第三条查询看 redo 的状态。first_change#是该日志组里最早的 SCN,next_change#是日志组里最后一个 SCN 的下一个值。当前正在写的日志组next_change#为空,status是 CURRENT。ACTIVE状态的日志组表示它参与了实例恢复,需要等检查点推进到它的范围之外才能变成 INACTIVE。ACTIVE 组太多,基本就是检查点追不上日志切换。

4.3 目标 MTTR 怎么定:用数据说话,别拍脑袋

设定fast_start_mttr_target前,先查v$instance_recovery,那里直接给了 Oracle 当前估算的恢复时间。

SELECT target_mttr, estimated_mttr, optimal_mttr FROM v$instance_recovery;

target_mttr是当前参数目标值,estimated_mttr是 Oracle 按检查点位置、redo 生成速度、脏块量估算出的实际恢复时间,optimal_mttr是按当前负载推算出的最优恢复时间。设置前先看estimated_mttr和optimal_mttr的差,如果两者已经比较接近,调参空间很小,再设小目标值只会加大写盘频率,恢复时间不见得降。

设置目标值用ALTER SYSTEM SET fast_start_mttr_target=300;,等 10 到 15 分钟后再查一次estimated_mttr。正常情况它会往目标值方向靠,但不会完全等于,因为估算还要考虑 redo 写入峰值和 DBWn 能力。如果调小目标值后estimated_mttr纹丝不动,优先怀疑磁盘写能力,而不是继续把参数调小。

另外一个实用经验:fast_start_mttr_target不是越小越好。设成 60 秒,CKPT 会激进地推进检查点,DBWn 写盘量明显上升,日志切换频率也会被带快。原本只是想缩短恢复时间,结果把日常负载拉高,这是最常见的调参翻车姿势。我一般先把目标放在 300 到 600 秒之间,跑一个业务高峰周期后再按estimated_mttr回退调整。

4.4 调参数前必须确认的两个前提:redo 大小和 DBWn 写能力

先确认 redo 日志组大小。切换到当前日志组,在v$log里看bytes字段。日志切换间隔小于 10 分钟,既说明 redo 小,也说明检查点被频繁打断。此时调fast_start_mttr_target是治标不治本,先把 redo 组加大到让切换间隔落在 20 到 30 分钟更实际。

确认 DBWn 写能力看两个等待:free buffer waits和write complete waits。前者表示 buffer cache 里没有足够空闲块让用户进程继续读数据,DBWn 忙不过来;后者表示用户在等待缓冲区被写完后才能继续使用。两者只要出现一个,调 MTTR 前先解决写瓶颈。最直接的验证是看v$sysstat里的物理写次数和时间差,判断是单次写耗时高,还是写次数太频繁。

在 Docker 或虚机环境里还要注意磁盘类型差异。很多 Oracle 安装在共享存储上,本地盘和网络盘的写延迟差别很大,同样一组参数在测试机上看不出问题,上生产后 DBWn 直接成为瓶颈。检查点调优没有银弹参数,本质是让 CKPT、DBWn、redo 三者负载匹配。

5. 检查点相关故障排查:现象、原因与处理顺序

5.1 实例恢复时间暴涨:检查点位置离日志尾部太远

现象:服务器掉电或shutdown abort后,数据库打开耗时从原来的几分钟涨到三四十分钟,业务侧压力巨大。alert 日志里能看到 recovery 阶段一直在重放大量 redo。

原因:控制文件里的检查点 SCN 离最新 SCN 太远。崩溃前 DBWn 没能及时写脏块,大量需要重做的变更都堆在 redo 里,实例恢复要把这些 redo 全部应用一遍。检查点推进慢、redo 切换太频繁、DBWn 写能力差,三项占一项就会出现。

解决:先查v$datafile的checkpoint_change#和v$log的next_change#,计算当前检查点位置和日志尾部的差距。差距持续拉大说明检查点追不上 redo 生成速度。处理顺序是:先加大 redo 组让切换频率降下来,再设置合理的fast_start_mttr_target推动检查点追赶,最后确认 DBWn 写等待是否需要加db_writer_processes。注意不要反过来先加进程,否则检查点推进会更快产生更多写盘,I/O 更紧张。

5.2 alert 日志刷 “Checkpoint not complete”:redo 复用被卡住

现象:alert 日志反复出现Checkpoint not complete,同时伴随log file switch (checkpoint incomplete)等待,业务更新变慢,日志切换耗时拉长到几十秒。

原因:数据库想要切换到下一个 redo 日志组,但该日志组对应的脏数据还没写完,检查点没有推进到允许复用的 SCN。最常见的触发条件是 redo 日志组太小,切换频率逼近 DBWn 写盘极限;其次是某次写入峰值让脏队列瞬间积压。

解决:第一步查v$log里各组状态,ACTIVE 组超过一半基本就是检查点跟不上的信号。第二步查v$log_history里切换间隔,把间隔低于 15 分钟作为红线看待。第三步加大 redo 日志组。常见做法是新增两组更大的 redo 日志,切换后删除旧组,让系统逐步过渡到大日志组,期间不重启库。这个方法比直接改fast_start_mttr_target更治本,因为检查点追不上通常意味着 redo 总量和写盘能力不匹配。

5.3 DG 备库 SCN gap 不断拉大:不只是网络问题

现象:主库 alert 日志出现归档中断提示,备库 apply 延迟从几分钟涨到几小时,v$archive_dest_status里状态不是 VALID。

原因:备库接收和应用 redo 的速度跟不上主库产生 redo 的速度。检查点在这里的角色不是直接原因,但主库检查点过于激进会加大 DBWn 写盘量,挤压主库 I/O,间接让归档传输变慢。真正要排查的是备库的 standby redo log 配置、归档目录可用性以及磁盘写能力。

解决:对比主备库当前 SCN 和归档序列号差。先在备库执行SELECT current_scn FROM v$database;和主库做差,差距以小时计说明不是瞬时抖动。然后查备库v$archived_log有没有断档,v$standby_log的组数和大小是否够用。常见做法是给备库增加与主库 redo 组数一致的 standby redo log,并设置standby_db_preserve_redo保留一段时间 redo,防止 gap 期间 redo 被覆盖。19c 单实例搭建 DG 时最容易忽略的也是这套核对动作,往往主库没问题,备库缺组或路径不可写导致 apply 中断。

5.4 热备份忘记 END BACKUP:文件头 SCN 被冻住的翻车现场

现象:执行完表空间热备份后没有做 END BACKUP,数据库异常重启后打开失败,报 ORA-01194: file N needs more recovery to be consistent,配合 ORA-01110 定位到具体数据文件。

原因:ALTER TABLESPACE ... BEGIN BACKUP会冻结该表空间所有数据文件头 SCN,让文件头甚至整个备份窗口期间产生的修改在文件头部看出“旧状态”。正常结束后执行END BACKUP才解开。如果忘了执行,文件头 SCN 停留在备份开始时刻,控制文件里记录的检查点 SCN 已经推进到了更后位置,数据库打开时发现文件头落后太多,判定备份未结束。

解决:确认该数据文件确实处于备份状态后,执行ALTER DATABASE END BACKUP;,把文件头 SCN 强制推进到当前检查点位置。执行前一定确认备份进程已经停了,否则丢数据是大概率事件。这也是我最早翻车的地方,后来写备份脚本时把 END BACKUP 放在退出 trap 里,任何中断路径都会先解冻结,宁可多写一次 END BACKUP,也不能让文件头卡在中间状态。

6. 验证 SCN 与检查点行为:三个日常巡检技巧

6.1 一次性把检查点家底摸清楚:四段 SQL 串成巡检脚本

-- 系统当前 SCN 和数据库状态 SELECT current_scn, open_mode FROM v$database; -- 控制文件检查点位置 SELECT file#, checkpoint_change#, to_char(checkpoint_time, 'yyyy-mm-dd hh24:mi:ss') FROM v$datafile WHERE status = 'ONLINE'; -- redo 日志组当前状态 SELECT group#, sequence#, status, first_change#, next_change# FROM v$log ORDER BY group#; -- 实例恢复时间估算 SELECT target_mttr, estimated_mttr, optimal_mttr FROM v$instance_recovery;

四段查询放一起,一个库里当前的 SCN 水位、检查点位置、redo 切换状态、恢复时间预估全有了。正常库里checkpoint_change#不会离current_scn太远,离太远说明写压力积压;v$log里 ACTIVE 组偏多说明切换和写盘节奏不平衡;estimated_mttr高于目标值就需要复核 I/O。这套查询等保巡检时也派得上用场,检查项里要求核对数据库运行健康状态,直接拿它当依据。

6.2 用 estimated_mttr 验证参数调整是否真的生效

设置fast_start_mttr_target后,等 15 分钟再查一次v$instance_recovery。如果estimated_mttr纹丝不动,先看v$datafile的检查点位置有没有变化,再查v$system_event里 DBWn 相关的写等待。检查点调优说玄学也玄学,但数据不会撒谎:目标值设了,检查点推进频率就应当变化,没变就说明瓶颈不在检查点调度,而在更底层的写盘能力。

6.3 用闪回版本查询看 SCN 的可见性

SELECT versions_startscn, versions_endscn, name FROM t_test VERSIONS BETWEEN SCN 0 AND MAXVALUE;

对一个测试表做几次 update 后执行这条 SQL,能看到每一行版本的起止 SCN,比任何文档都直观。注意VERSIONS BETWEEN SCN 0 AND MAXVALUE会读所有可见版本,数据量大时要加条件。看不到历史版本先确认 undo 保留期和 undo 表空间容量,这是闪回查询的前提。

我现在的巡检习惯是每周末跑一次这套验证,先看检查点位置和 redo 切换间隔,再对比 target 和 estimated,最后汇总成一个简表放进值班记录。时间长了,哪套库的检查点节奏是什么样心里有数,出问题时一眼就能看出偏差。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 18:58:24

AI绘图冲击游戏美术:Stable Diffusion实战与从业者转型指南

1. 从一张原画说起:AI绘图到底动了游戏行业的哪块蛋糕去年年底,我们团队内部做了一次挺有意思的测试。美术组把一张已经画了四天的角色概念图丢进Stable Diffusion里,用图生图配合一个偏写实风格的模型,跑了不到二十分钟&#xff…

作者头像 李华
网站建设 2026/10/3 18:57:37

AI学习操作系统:大模型实战的三层解耦架构与动态演进路线

1. 这不是一张“地图”,而是一套可执行的AI学习操作系统 你手头这张“AI 学习生态全景图”,绝不是那种印在海报上、挂在墙上、看一眼就忘的装饰画。它是我过去三年带过27个AI方向学员、亲手部署过43个本地大模型、调试过112次微调任务、踩过至少86个环境…

作者头像 李华
网站建设 2026/10/3 18:57:10

回形针的工程哲学:从设计原理到自动化视觉检测

1. 一件日用品凭什么讲了这么多年 聊起 paperclip,也就是回形针,很多人的第一反应是“这不就是那个小铁丝弯成的夹子嘛”。但如果你把它当成一个工程产品来看,事情就没那么简单了。它诞生距今差不多一个半世纪,结构几乎没有变过&a…

作者头像 李华
网站建设 2026/10/3 18:52:08

免Root静默授权安卓远程控制:Shizuku+App Ops实战方案

1. 项目概述:为什么“远程控制弹窗”成了安卓生态里最顽固的牛皮癣? 你有没有过这样的经历:刚点开向日葵、TeamViewer或某款企业级远程协作App,屏幕中央立刻弹出一个半透明灰底白字的授权框——“允许XXX访问您的设备?…

作者头像 李华
网站建设 2026/10/3 18:51:22

OpenShell:统一管理 Shell 配置,实现多机同步与高效终端工作流

作为一个每天要在终端里待上大量时间的人,我一直有个很实在的诉求:自己积累的别名、快捷键、补全逻辑,能不能在换机器、重置环境之后一分钟恢复原状,而不是把半年攒下的配置再手动敲一遍。OpenShell这个项目,就是为了解…

作者头像 李华
网站建设 2026/10/3 18:47:01

从注意力机制到超长序列:电价预测中的Transformer实践

电价预测这事儿,我前后折腾了快两年。最早用LSTM,后来换成Transformer,最近半年一直在搞超长序列的方向。说句实话,电价数据是所有时序预测里最难啃的那一类——波动剧烈、尖峰频发、周期性又异常复杂,传统模型和深度学…

作者头像 李华