Oracle数据库基础之7_备份恢复基础之SCN

SCN:System Change Number。

Sqlserver,Mysql,Postgresql没有SCN的概念只有LSN(Log Sequence Number)的概念,所以Oracle的current online redo log损坏的话是必须要是有备份文件才能进行恢复使controle file,datafile,redo log三者的SCN一致才能正常打开,但是像Sqlserver这种如果transaction log损坏但是datafile没有损坏的情况下是不需要使用备份文件进行恢复而是可以使用直接REBUILD LOG丢失部分数据的方式来把数据库正常打开。

oracle恢复的逻辑

假如,一个会话A,修改某行的某列数值5为3,但是没有来得及commit,就执行了shutdown abort。

因为没有ckpt,所以data file和control file没有记录最新的SCN,但是redo起码有shutdown abort前三秒的SCN

SMON进程发现redo log、data file、control file三者的SCN不一致,则利用redo log进行前滚,同步控制文件、数据文件使这二者和重做日志文件的最新SCN一致,当前滚完成后,发现会话A的数据块的ITL状态是uncommitted,则再使用undo中会话A的前镜像回滚,再一次同步控制文件、数据文件、重做日志文件确保三者都是一致的SCN

Oracle SCN存在以下概念

System Checkpoint SCN:系统检查点SCN,存放在控制文件中,是针对整个数据库全局的,因而只存在一个,mount和open状态下都可以查询到这个SCN的值

select checkpoint_change# from v$database;

Datafile Checkpoint SCN:数据文件检查点SCN,存放在控制文件中,针对每个数据文件的,因而一个数据文件就对应在控制文件中存在一份,,mount和open状态下都可以查询到这个SCN的值

select name,checkpoint_change# from v$datafile;

Start SCN:存放在数据文件头中,mount和open状态下都可以查询到这个SCN的值。虽然open才会打开数据文件,但是这个值在mount状态下也可以查询到。

select name,checkpoint_change# from v$datafile_header

Stop SCN:存放在控制文件中,针对每个数据文件的,因而一个数据文件就对应在控制文件中存在一份,数据库open状态时这个值为null,数据库shutdown immediate后再startup mount,这个值等于System Checkpoint SCN和Datafile Checkpoint SCN和Start SCN,数据库shutdown abort后再startup mount,这个值为null

select name,last_change# from v$datafile;

select current_scn from v$database;--系统最新SCN,一直在变化

SCN和time的关系

select time_dp,scn from sys.smon_scn_time order by 1 desc

如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN号设置为相应数据文件的 Start SCN号。

在数据库启动过程中,当End SCN 号为NULL,则需要做instance recovery(也可以理解成在数据库启动过程中如果数据文件的END SCN和Start SCN不一致则需要做instance recovery).因为如果数据库异常关闭的话,则END SCN号将为NULL。在数据库正常启动到open状态后,ORACLE会将END SCN 号设置为NULL

在数据库启动过程中,当System Checkpoint SCN、Datafile Checkpoint SCN和Start SCN 号都相同时,数据库可以正常启动,不需要做media recovery。三者当中有一个不同时,则需要做media recovery.

shutdown immediate后直接startup mount,不是使用控制文件恢复后的alter database mount,为什么可以直接restore database并recover until sequence,此时控制文件里面的SCN比数据文件的SCN新啊?因为控制文件scn比较新,所以可以找到最新的备份,虽然控制文件scn比较新,但是执行restore类似把数据文件返回到旧版本了

查看System Checkpoint SCN,Datafile Checkpoint SCN,start scn,stop scn的例子

sql 复制代码
SQL> select status from v$instance;
STATUS
------------
OPEN

SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE# 
------------------ 
           2612938 


SQL> select distinct CHECKPOINT_CHANGE#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
           2612938


SQL> select distinct CHECKPOINT_CHANGE# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
           2612938


SQL> select SEQUENCE#,STATUS,ARCHIVED,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
 SEQUENCE# STATUS           ARC FIRST_CHANGE# NEXT_CHANGE#
---------- ---------------- --- ------------- ------------
        10 CURRENT          NO        2611779   1.8447E+19
         8 INACTIVE         NO        2303569      2476815
         9 INACTIVE         NO        2476815      2611779



SQL> shutdown abort;
SQL> startup mount;
SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------ 
           2612938

SQL> select distinct CHECKPOINT_CHANGE#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
           2612938

SQL> select distinct CHECKPOINT_CHANGE# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
           2612938


SQL> select SEQUENCE#,STATUS,ARCHIVED,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
 SEQUENCE# STATUS           ARC FIRST_CHANGE# NEXT_CHANGE#
---------- ---------------- --- ------------- ------------
        10 CURRENT          NO        2611779   1.8447E+19
         9 INACTIVE         NO        2476815      2611779
         8 INACTIVE         NO        2303569      2476815

SQL> alter database open;

SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
           2806239

SQL> select distinct CHECKPOINT_CHANGE#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
           2806239

SQL> select distinct CHECKPOINT_CHANGE# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
           2806239

SQL> select SEQUENCE#,STATUS,ARCHIVED,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
 SEQUENCE# STATUS           ARC FIRST_CHANGE# NEXT_CHANGE#
---------- ---------------- --- ------------- ------------
        10 INACTIVE         NO        2611779      2806238
        11 CURRENT          NO        2806238   1.8447E+19
         9 INACTIVE         NO        2476815      2611779



SQL> shutdown immediate;
SQL> startup mount;

SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
           2808520

SQL> select distinct CHECKPOINT_CHANGE#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
           2808520      2808520

SQL> select distinct CHECKPOINT_CHANGE# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
           2808520

SQL> select SEQUENCE#,STATUS,ARCHIVED,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
 SEQUENCE# STATUS           ARC FIRST_CHANGE# NEXT_CHANGE#
---------- ---------------- --- ------------- ------------
        10 INACTIVE         NO        2611779      2806238
         9 INACTIVE         NO        2476815      2611779
        11 CURRENT          NO        2806238   1.8447E+19

alter system switch logfile时如果online redo log都切换了一轮需要覆盖之前online redo log的内容时会触发checkpoint

sql 复制代码
SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
           2808523

SQL> select distinct CHECKPOINT_CHANGE#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
           2808523

SQL> select distinct CHECKPOINT_CHANGE# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
           2808523

SQL> select SEQUENCE#,STATUS,ARCHIVED,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
 SEQUENCE# STATUS           ARC FIRST_CHANGE# NEXT_CHANGE#
---------- ---------------- --- ------------- ------------
        10 INACTIVE         NO        2611779      2806238
        11 CURRENT          NO        2806238   1.8447E+19
         9 INACTIVE         NO        2476815      2611779

SQL> alter system switch logfile;
System altered.

SQL> alter system switch logfile;
System altered.

SQL> alter system switch logfile;
System altered.


SQL> select SEQUENCE#,STATUS,ARCHIVED,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
 SEQUENCE# STATUS           ARC FIRST_CHANGE# NEXT_CHANGE#
---------- ---------------- --- ------------- ------------
        13 ACTIVE           NO        2809814      2809926
        14 CURRENT          NO        2809926   1.8447E+19
        12 ACTIVE           NO        2809734      2809814


SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
           2809734

SQL> select distinct CHECKPOINT_CHANGE#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
           2809734

SQL> select distinct CHECKPOINT_CHANGE# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
           2809734
相关推荐
adinnet20265 小时前
企业级 NL2SQL 的重要基础:数据库 Schema 自动理解与元数据管理
数据库
IvorySQL5 小时前
PostgreSQL 日报| OpenCode 遭黑客入侵 API 密钥失窃(10 月 20 日)
数据库·postgresql·区块链
Elastic 中国社区官方博客6 小时前
控制告警如何触发、恢复和发送通知:Elastic 可观测性中的 Kibana 通用告警
大数据·数据库·安全·elasticsearch·搜索引擎·全文检索·es
GlobalInfo6 小时前
全球人工智能数据中心保险市场动态、发展趋势及项目可行性研究报告2026-2032
数据库·人工智能·ai·数据中心
星马梦缘6 小时前
关于人工智能学院游戏设计大赛决赛的内部分工通知
数据库·人工智能·游戏
Databend6 小时前
以云原生湖仓支撑 AI 应用落地丨Databend 亮相 2026 人工智能开放计算大会
大数据·数据库·数据分析
geovindu6 小时前
sql:Managing Complex Joins and Subqueries in SQL using mysql 9.0
大数据·数据库·数据仓库·sql·mysql·数据库开发·数据库架构
国科安芯6 小时前
星载微控制器MCU选型与系统设计的证据化方法
大数据·数据库·单片机·嵌入式硬件·低轨卫星·商业航天·抗辐射
Sayuanni%36 小时前
Redis(初阶)
数据库·redis·缓存
jnrjian6 小时前
Oracle TDE 大小钥匙 HSM DEK 与 EDB key.bin
数据库·oracle