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
相关推荐
ao-weilai1 小时前
MySQL数据库:MySQL基础概要
数据库·mysql
雪碧聊技术1 小时前
从 0 跑通一个最小 RAG Demo:文档切分、向量检索与答案生成
数据库·oracle
喜欢的名字被抢了2 小时前
08-Redis 性能优化篇:快在哪、BigKey、HotKey、慢查询与内存
数据库·redis·性能优化
阳光九叶草LXGZXJ2 小时前
达梦数据库-学习-68-dmasm0X_XXXXXX.log日志激增
linux·运维·数据库·sql·学习
Mortalbreeze2 小时前
MySQL 基础篇(三):一文掌握 MySQL 常见数据类型
linux·服务器·数据库·mysql
青山木2 小时前
秒杀系统设计(一):需求拆解与流量治理
java·数据库·redis·后端·架构
lusklusklusk2 小时前
Oracle数据库基础之8_闪回
数据库·oracle
lusklusklusk2 小时前
Oracle数据库基础之10_性能优化
数据库·oracle·性能优化
Omics Pro2 小时前
预测性虚拟细胞中显式机理算子
大数据·数据库·人工智能·python·算法·机器学习·自然语言处理