在oracle的scn详细说明

oracle中的scn机制

在Oracle数据库中,SCN(System Change Number)是一个全局唯一的标识符,用于标识数据库中每个数据块的变化。SCN值是一个单调递增的整数,以秒为单位,自Oracle数据库实例启动以来不断增长。SCN值主要用于以下目的:

  1. 控制并发事务:Oracle使用SCN来检测并发访问的数据块是否已被修改。当多个事务访问同一数据块时,它们必须等待对该数据块的上一个事务的提交或回滚。这通过SCN来判断,因为只有在SCN大于数据块上的最新修改时,Oracle才允许其他事务访问该数据块。

  2. 记录数据变化:Oracle在事务开始和结束时记录SCN值,以便可以在需要时利用它来确定事务的先后顺序。

  3. 数据库恢复:在数据库需要恢复时,Oracle通过SCN值来确定需要恢复到的特定时间点或事务。

SCN值是Oracle一些重要特性的基础,例如Flashback技术和Data Guard。Oracle将SCN管理为全局唯一值,它通过在数据库的上下文中计数和存储事件的发生,跟踪所需要的变化。

scn的理解

SCN(System Change Number),这个参数相当于Oracle数据库中每一个操作的计数,唯一且递增。

其中SCN存在于控制文件中,每个数据文件和重做日志中,很多地方把这些分成四种SCN,系统检查点SCN,数据文件检查点SCN,开始SCN和结束SCN。

说简单点,当我们对数据库进行操作的时候,是先写进重做日志中的,每一个操作都有一个SCN号,从数据库里我们查询可以看到重做日志的起始SCN以及下一个SCN(下一个执行的操作SCN或是连接在后面使用的重做日志起始SCN),当触发DBWR进程的时候,往数据文件中更新数据,这时更改数据文件中的SCN和控制文件中的SCN(数据库开始之前会检查所有文件头和控制文件中的SCN,一致才能成功启动)

做rman备份的时候,备份的数据文件的SCN被锁定,所有数据文件不能被更新,但是数据库还是可以执行数据更新,这时更新的数据都记录在重做日志中(所以为了不使数据丢失,要将数据库设置为归档模式),这里怎么在备份完成后在使SCN和数据一致,我还没搞清楚,我觉得可能和归档恢复数据库的原理是一样的。

获取oracle中scn的方法

在Oracle数据库中,有多种方式可以获取SCN(System Change Number):

  1. 通过SQL查询获得当前数据库SCN:

    sql 复制代码
    SELECT CURRENT_SCN FROM V$DATABASE;

    该查询返回的值为当前数据库的SCN。

  2. 使用DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()函数获取任意时刻数据库的SCN:

    sql 复制代码
    SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER(SYSDATE - 7) AS SCN
    FROM DUAL;

    该查询返回的是过去一周内的SCN值。

在选择哪种方法获取SCN时,请注意该方法需要的权限和数据库所需时间。 例如,使用DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER可能需要特定的角色或特权,并且可能需要较长的查询时间。

基于scn的recover

当使用 Oracle 数据库进行 SCN(System Change Number)恢复时,下面是一个更具体的步骤:

  1. 确定需要恢复到的 SCN 值。

  2. 进入 SQL*Plus 或者其他 Oracle 数据库命令行工具,以 sysdba 身份登录。

  3. 关闭数据库:

    复制代码
    SHUTDOWN IMMEDIATE;
  4. 进入数据库管理模式(Mount 模式):

    复制代码
    STARTUP MOUNT;
  5. 恢复数据库到指定 SCN 值:

    复制代码
    RECOVER DATABASE UNTIL SCN <SCN_value>;

    <SCN_value> 替换为您要恢复的 SCN 值。

  6. 打开数据库:

    复制代码
    ALTER DATABASE OPEN RESETLOGS;

    使用 RESETLOGS 选项来打开数据库,并在恢复后创建一个新的重置日志组。

  7. 运行完整的数据库恢复后,可以进行必要的后续操作,例如应用归档日志等。

请注意,SCN 恢复可能需要一些时间,具体取决于数据库的大小和所需 SCN 值之间的距离。。

相关推荐
乌鸦乌鸦你的小虎牙2 小时前
qt 5.12.8 配置报错(交叉编译环境)
开发语言·数据库·qt
一只大袋鼠3 小时前
Redis 安装+基于短信验证码登录功能的完整实现
java·开发语言·数据库·redis·缓存·学习笔记
Anastasiozzzz3 小时前
深入研究Redis的ZSet底层数据结构:从 Ziplist 的级联更新到 Listpack 的完美救场
数据结构·数据库·redis
菠萝蚊鸭3 小时前
x86 平台使用 buildx 基于源码构建 MySQL Wsrep 5.7.44 镜像
数据库·mysql·galera·wsrep
沙漏无语5 小时前
(二)TIDB搭建正式集群
linux·数据库·tidb
姚不倒5 小时前
三节点 TiDB 集群部署与负载均衡搭建实战
运维·数据库·分布式·负载均衡·tidb
隔壁小邓5 小时前
批量更新方式与对比
数据库
数据知道6 小时前
MongoDB复制集架构原理:Primary、Secondary 与 Arbiter 的角色分工
数据库·mongodb·架构
人道领域6 小时前
苍穹外卖:菜品新增功能全流程解析
数据库·后端·状态模式
修行者Java6 小时前
(七)从 “非结构化数据难存储” 到 “MongoDB 灵活赋能”——MongoDB 实战进阶指南
数据库·mongodb