`

深入分析Oracle数据库中的checkpoint_change#

阅读更多
本文地址:http://wallimn.iteye.com/blog/1199561,转载请保留。

1、系统检查点(记录在控制文件中)
SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            539625


2、数据文件检查点(记录在控制文件中)
SQL> select file#,checkpoint_change#,last_change# from v$datafile;

     FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
         1             539625
         2             539625
         3             539625
         4             539625
         5             539625

3、数据文件头检查点(记录在数据文件中)
SQL> select file#,checkpoint_change# from v$datafile_header;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1             539625
         2             539625
         3             539625
         4             539625
         5             539625

以上三个checkpoint_change#要一致(只读、脱机表空间除外),数据库才能正常打开。否则会需要进行一步的处理。正常关库时,会生成新的检查点,写入上述三个checkpoint_change#,同时数据文件中的last_change#也会记录下该检查点,也就是说三个checkpoint_change#与last_change#记录着同一个值。
通过以下SQL可以证明
SQL> shutdown immediate
SQL> startup mount
SQL> select file#,checkpoint_change#,last_change# from v$datafile;

     FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
         1             540270       540270
         2             540270       540270
         3             540270       540270
         4             540270       540270
         5             540270       540270

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            540270

SQL> select file#,checkpoint_change# from v$datafile_header;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1             540270
         2             540270
         3             540270
         4             540270
         5             540270
        
数据库成功打开后,数据文件中的last_change#会被清空。正常关库时,再重新下最后的检查点。shutdown abort关库,这个值是空的(感兴趣可自行验证),此时数据库需要进行实例恢复(不需要用户干预),恢复后数据库才正常打开。

checkpoint_change#、last_change#实际上全部来自于SCN,可以通过下面的语句验证:
SQL>  select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                  540741
使用查询系统SCN号的函数,可以发现checkpoint_change#与之是接近的。SCN有很多触发的条件,可能不会特别接近。

下面举几个全备后恢复的例子,以及相关场景下checkpoint_change#的情况。

问题1:数据文件损坏的恢复
此时控制文件中记录的checkpoint_change#比数据文件头中记录的要大,数据库需要介质或者实例恢复。
SQL> startup       
Database mounted.
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '/u02/oradata/orcl/system01.dbf'
恢复一下,数据库就可以打开了。
SQL> recover database;
ORA-00279: change 539624 generated at 10/18/2011 08:27:31 needed for thread 1
ORA-00289: suggestion : /u02/oradata/orcl/arc/1_5_764840495.dbf
ORA-00280: change 539624 for thread 1 is in sequence #5


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 540768 generated at 10/18/2011 12:17:11 needed for thread 1
ORA-00289: suggestion : /u02/oradata/orcl/arc/1_6_764840495.dbf
ORA-00280: change 540768 for thread 1 is in sequence #6
ORA-00278: log file '/u02/oradata/orcl/arc/1_5_764840495.dbf' no longer needed for this recovery


Log applied.
Media recovery complete.
SQL> alter database open;

Database altered.

问题2:控制文件损坏的恢复
如果控制文件损坏,使用备份的控制文件是无法打开数据库的,
SQL> startup
Database mounted.
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/u02/oradata/orcl/system01.dbf'
ORA-01207: file is more recent than controlfile - old controlfile
会提示数据文件与控制文件新,实际上就是控制文件中记录的checkpoint_change#比数据文件头中的checkpoint_change#要小,这种情况是不能打开数据库的。但数据可以启动到mount状态,此时可以用命令
alter database backup controlfile to trace;
生成一个控制文件的脚本,在udump目录中。使用该脚本可以重建控制文件,进行实例恢复后或打开数据库。

如果没有备份的控制文件,数据库只能打开的nomount状态,不能获取重建控制文件的脚本,如果也没有备份过重建控制文件脚本,那就悲剧了。如果数据库不太复杂,可以手写一个。

问题3:数据文件、控制文件全部损坏(当然都有备份,日志是好的)
恢复数据文件、控制文件后,数据库仍然是无法打开的。
SQL> startup
Database mounted.
ORA-00314: log 1 of thread 1, expected sequence#  doesn't match
ORA-00312: online log 1 thread 1: '/u02/oradata/orcl/redo01.log'
提示的意思也就是日志中的检查点比较控制文件中记录的大。

SQL> select checkpoint_change# from v$datafile;

CHECKPOINT_CHANGE#
------------------
            539624
            539624
            539624
            539624
            539624
           
SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            539624
            539624
            539624
            539624
            539624
SQL>  select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            539624
           
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1          5   10485760          1 NO  CURRENT                 539571 18-OCT-11
         2          1          4   10485760          1 YES INACTIVE                539116 18-OCT-11
         3          1          3   10485760          1 YES INACTIVE                537456 18-OCT-11

此时可以使用下面的命令恢复数据库
SQL> recover database using backup controlfile;

恢复成功后,v$database中记录的checkpoint_change#并未发生变化。
SQL> select checkpoint_change# from v$datafile;

CHECKPOINT_CHANGE#
------------------
            602574
            602574
            602574
            602574
            602574

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            602574
            602574
            602574
            602574
            602574

SQL>  select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            539624

因为不一致,所以数据库仍然打不开:
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '/u02/oradata/orcl/system01.dbf'

此时的情况类似于问题2,解决办法也相同。shutdown abort,startup nomount,重建控制文件,recover database,alter database open;

问题4、数据库冷备过,新建的表空间的数据文件损坏,且无备份。
这种情况的处理办法:
restore备份的数据文件;
startup;
会提示无法定位数据文件,数据库无法打开,
alter database create datafile '提示的无法定位的数据文件名称';--此时查看checkpoint_change#,会发现新建的与其它的不相同。
set autorecovery on
recover database;
alter database open;

分享到:
评论

相关推荐

    oracle scn 详解

    - **system SCN**:表示整个数据库的状态,通常可以从`V$DATABASE`视图中的`CHECKPOINT_CHANGE#`字段获取。 - **datafile SCN**:针对每个数据文件的数据状态,可以通过`V$DATAFILE`视图中的`CHECKPOINT_CHANGE#`...

    个人经验总结:Oracle数据库SCN号详解

    SELECT checkpoint_change# FROM v$database; ``` 通过以上SQL语句可以查询当前数据库的系统检查点SCN。 #### 四、数据文件检查点SCN **定义**: 当一个检查点动作完成之后,Oracle会把每个数据文件的SCN单独存放...

    数据字典与典型查询

    `checkpoint_change#`是最近检查点的SCN,`resetlogs_change#`是在最近一次RESETLOGS操作后创建的第一个检查点的SCN,而`controlfile_change#`则是在控制文件最后更新时的SCN。 5. **检查备份状态** ```sql ...

    checkpoint_iter_370000.pth

    lightweight-pytorch训练好的模型checkpoint_iter_370000.pth

    Oracle数据库非常规恢复方案.pptx

    当控制文件出现问题时,可以利用`V$DATABASE.CHECKPOINT_CHANGE#`和`V$DATAFILE.CHECKPOINT_CHANGE#`等视图来获取相关信息。数据文件的SCN(系统改变号)可以通过`V$DATAFILE_HEADER.CHECKPOINT_CHANGE#`查看。如果...

    ORACLE中的checkpoint

    在Oracle数据库管理中,Checkpoint是一种关键机制,用于确保数据的一致性和安全性。Checkpoint的主要功能是在数据库发生故障时,能够快速恢复到一个一致的状态,而无需进行全量的重做日志回放。以下是对Checkpoint...

    oracle

    SELECT a.name, a.checkpoint_change# '开始SCN值', b.checkpoint_change# '结束SCN值' FROM v$datafile_header a, v$datafile b WHERE a.file#=b.file#; ``` - **描述**:通过比较两个重做日志文件的SCN(系统...

    convert_bert_tf_checkpoint_to_pytorch.py

    将基于TensorFlow的谷歌发布的官方BERT模型转化为基于Pytorch的BERT模型

    解释checkpoint数据库原理的资料

    根据给定的文件信息,我们将深入探讨checkpoint在数据库原理中的作用与机制,特别是Oracle数据库的checkpoint过程。Checkpoint是数据库管理中一个至关重要的概念,它确保了数据的一致性和持久性,尤其是在系统发生...

    oracle日常使用

    - `SQL&gt; select checkpoint_change# from v$datafile;` - `SQL&gt; select checkpoint_change# from v$database;` #### 三、控制文件管理 - **控制文件是Oracle数据库的重要组成部分之一,包含了数据库的物理结构...

    scn号与恢复研究.pdf

    SELECT name, checkpoint_change# FROM v$datafile_header; ``` 4. **EndSCN号**:此SCN存储在控制文件中,用于判断是否需要进行实例恢复。可以通过以下SQL查询获取: ```sql SELECT name, last_change# FROM v...

    UNIX下创建ORACLE数据库

    在UNIX环境下创建Oracle数据库是一项技术性很强的工作,它涉及到操作系统层面的配置以及Oracle数据库软件的安装和设置。这里我们将详细探讨这个过程中的关键步骤和重要知识点。 首先,我们需要确保环境变量正确配置...

    Oracle数据库参数设置

    Checkpoint 是 Oracle 自动执行的一种操作,当检查点操作时,数据库中的所有缓冲区会写回磁盘,所有数据库的控制文件被更新。Checkpoint 频繁发生会加快数据库的恢复,但是增加了 I/O 次数,会降低系统的性能。修改 ...

    ORACLE 数据库入门.pdf

    在Oracle中,连接是指用户与数据库之间的交互过程。每当有用户连接到数据库时,都会创建一个新的会话(session)。每个会话都有自己的私有内存区和进程,这使得Oracle能够支持多用户同时操作。 ##### 5. 事务...

    AMIBIOS8_Checkpoint_and_Beep_Code_List_1.9.rar_AMI CheckPoint_AM

    标题中的“AMIBIOS8_Checkpoint_and_Beep_Code_List_1.9.rar”指的是一个关于AMIBIOS8的检查点和蜂鸣代码列表的压缩文件,版本为1.9。AMI CheckPoint是AMIBIOS8的一个特性,用于在系统启动过程中提供硬件状态的反馈...

    Oracle数据库优化之数据库磁盘IO

    "Oracle数据库优化之数据库磁盘IO" Oracle数据库优化之数据库磁盘IO是指数据库管理员和开发者对Oracle数据库进行优化,以提高数据库的性能和稳定性。数据库磁盘IO是影响数据库性能的重要因素之一,因此优化数据库...

    oracle checkpoint工作原理

    在深入探讨Oracle Checkpoint的工作原理之前,我们首先理解Checkpoint在数据库系统中的核心作用及其对Oracle数据库性能和数据一致性的影响。 #### 一、Checkpoint 的基本概念 **Checkpoint** 在Oracle数据库中扮演...

    matplotlib整活-checkpoint_matplotib_checkpoint_

    checkpoint_matplotlib_checkpoint_" 这个标题表明我们将探讨如何使用matplotlib库在Python中创建自定义的可视化图像,并且可能涉及到一些进阶或非标准的使用方法,"checkpoint"可能是指这个教程或项目中的一个关键...

Global site tag (gtag.js) - Google Analytics