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
相关推荐
进击的荆棘21 分钟前
MySQL——库的操作
数据库·mysql
2601_9679801136 分钟前
“小程序·云开发”上线 助力开发者的高效利器
数据库·存储管理·小程序云开发·云函数·开发者工具
zhangjw3444 分钟前
1-9 SELECT 查询基础:where、group by、having、order by、limit offset
数据库·postgresql·pg数据库
唐老板1 小时前
Postgres 慢查询,先取证再动手
数据库·ai编程
笃行3508 小时前
数据库性能优化的五处内核改造,KingbaseES 配了四件诊断工具
数据库
非优秀程序员10 小时前
第02章 杭电的英语老师与一台服务器|《互联网产品恩仇录》
数据库·node.js·代码规范
SelectDB15 小时前
SelectDB 是哪个公司的?是国产数据库吗?一篇讲清飞轮科技与 Apache Doris 的关系
数据库
这个DBA有点耶15 小时前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
这个DBA有点耶17 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风17 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql