zoukankan      html  css  js  c++  java
  • DBA入门之Oracle数据库的关闭

    1.正常关闭数据库的状况

    下面我们来看看数据库是怎样根据SCN和Checkpoint来进行一致性判断及恢复控制的。

    有关SCN和CheckPoint的相关知识大家可以参考:

    DBA入门之认识Oracle SCN(System Change Number)

    DBA入门之认识检查点(Checkpoint)

    我们知道,在控制文件和数据文件头上,对于每个数据文件都有一个“Checkpoint SCN”和“Stop SCN”。这些Checkpoint和SCN至关重要,Oracle通过比较这些SCN值来确定数据库是否需要恢复。

    下面是来自一个Clean Shutdown的数据库的控制文件和数据文件头的内容。

    因为数据库在关闭之前执行了完全检查点,所以线程检查点SCN和所有数据文件检查点SCN和数据文件Stop SCN都一致。

    首先通过shutdown immediate关闭数据库,然后Mount状态转储获取控制文件内容:

    [oracle@czjie ~]$ sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.4.0 - Production on Thu Nov 17 22:26:17 2011

    Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

    Connected to:

    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    SQL> shutdown immediate

    Database closed.

    Database dismounted.

    ORACLE instance shut down.

    SQL> startup mount;

    ORACLE instance started.

    Total System Global Area 218103808 bytes

    Fixed Size 1266680 bytes

    Variable Size 121637896 bytes

    Database Buffers 92274688 bytes

    Redo Buffers 2924544 bytes

    Database mounted.

    SQL> alter session set events 'Immediate trace name controlf level 12';

    Session altered.

    SQL> select u_dump.value || '/' || db_name.value || '_ora_' || v$process.spid || nvl2(v$process.traceid, '_' || v$process.traceid, null )|| '.trc' "Trace File" from v$parameter u_dump cross join v$parameter db_name cross join v$process join v$session on v$process.addr = v$session.paddr where u_dump.name = 'user_dump_dest' and db_name.name = 'db_name' and v$session.audsid=sys_context('userenv','sessionid');

    Trace File

    --------------------------------------------------------------------------------

    /opt/ora10g/admin/ORCL/udump/ORCL_ora_3899.trc

    这个trace文件里就记录了控制文件的详细内容。

    (1) 关于数据库的相关信息。

    ***************************************************************************

    DATABASE ENTRY

    ***************************************************************************

    (size = 316, compat size = 316, section max = 1, section in-use = 1,

    last-recid= 0, old-recno = 0, last-recno = 0)

    (extent = 1, blkno = 1, numrecs = 1)

    11/10/2011 22:40:12

    DB Name "ORCL"

    Database flags = 0x00404001 0x00001000

    Controlfile Creation Timestamp 11/10/2011 22:40:17

    Incmplt recovery scn: 0x0000.00000000

    Resetlogs scn: 0x0000.0006ce7b Resetlogs Timestamp 11/10/2011 22:40:23

    Prior resetlogs scn: 0x0000.00000001 Prior resetlogs Timestamp 06/30/2005 19:09:40

    Redo Version: compatible=0xa200100

    #Data files = 4, #Online files = 4

    Database checkpoint: Thread=1 scn: 0x0000.000e6957 –这里就是检查点SCK

    Threads: #Enabled=1, #Open=0, Head=0, Tail=0

    enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

    Max log members = 3, Max data members = 1

    Arch list: Head=2, Tail=2, Force scn: 0x0000.000de15cscn: 0x0000.000e47c4

    Activation ID: 1294635980

    Controlfile Checkpointed at scn: 0x0000.000e6899 11/17/2011 22:25:51

    thread:0 rba:(0x0.0.0)

    enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

    (2) Redo信息。

    ***************************************************************************

    REDO THREAD RECORDS

    ***************************************************************************

    (size = 256, compat size = 256, section max = 8, section in-use = 1,

    last-recid= 0, old-recno = 0, last-recno = 0)

    (extent = 1, blkno = 9, numrecs = 8)

    THREAD #1 - status:0xe thread links forward:0 back:0

    #logs:3 first:1 last:3 current:2 last used seq#:0x27

    enabled at scn: 0x0000.0006ce7b 11/10/2011 22:40:23

    disabled at scn: 0x0000.00000000 01/01/1988 00:00:00

    opened at 11/17/2011 22:25:46 by instance ORCL

    Checkpointed at scn: 0x0000.000e6957 11/17/2011 22:26:32 –检查点信息

    thread:1 rba:(0x27.764f.10)

    enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

    log history: 38

    restore point keep sequence: 0

    (3) 数据文件的检查点信息。

    抽取一个数据文件的信息作为实例:

    DATA FILE #3:

    (name #5) /opt/ora10g/oradata/ORCL/sysaux01.dbf

    creation size=0 block size=8192 status=0xe head=5 tail=5 dup=1

    tablespace 2, index=3 krfil=3 prev_file=0

    unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00

    Checkpoint cnt:120 scn: 0x0000.000e6957 11/17/2011 22:26:32 --检查点SCN

    Stop scn: 0x0000.000e6957 11/17/2011 22:26:32 --Stop SCN

    Creation Checkpointed at scn: 0x0000.000019d1 06/30/2005 19:10:27

    thread:0 rba:(0x0.0.0)

    enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

    Offline scn: 0x0000.0006ce7a prev_range: 0

    Online Checkpointed at scn: 0x0000.0006ce7b 11/10/2011 22:40:23

    thread:1 rba:(0x1.2.0)

    enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

    Hot Backup end marker scn: 0x0000.00000000

    aux_file is NOT DEFINED

    注意这里,数据库正常关闭后,由于执行了完整检查点,数据文件处于一致的状态,检查点SCN在此等于Stop SCN。

    在此情况下,由于数据库处于一致状态,如果数据文件没有损失,下次启动Oracle就能够通过验证,顺利启动。

    2.数据库异常关闭的情况

    通过shutdown abort可以模拟一次异常,当使用shutdown abort方式关闭数据库时,Oracle会立即中断所有事物,关闭当前所有数据库连接,不执行检查点,理解关闭数据库。使用这种方式关闭数据库和断电以前的故障类似,数据库在下次启动时必须执行实例恢复才能启动,除非在特别紧急的情况下,否则不建议使用这种方式关闭数据库。

    来看以下测试:

    SQL> shutdown abort;

    ORACLE instance shut down.

    SQL> startup mount;

    ORACLE instance started.

    Total System Global Area 218103808 bytes

    Fixed Size 1266680 bytes

    Variable Size 121637896 bytes

    Database Buffers 92274688 bytes

    Redo Buffers 2924544 bytes

    Database mounted.

    SQL> alter session set events 'immediate trace name controlf level 12';

    Session altered.

    SQL> select u_dump.value || '/' || db_name.value || '_ora_' || v$process.spid || nvl2(v$process.traceid, '_' || v$process.traceid, null )|| '.trc' "Trace File" from v$parameter u_dump cross join v$parameter db_name cross join v$process join v$session on v$process.addr = v$session.paddr where u_dump.name = 'user_dump_dest' and db_name.name = 'db_name' and v$session.audsid=sys_context('userenv','sessionid');

    Trace File

    --------------------------------------------------------------------------------

    /opt/ora10g/admin/ORCL/udump/ORCL_ora_4002.trc

    看看此时控制文件的内容。

    1. 数据库的相关信息

    在Database Entry部分,可以看到数据库的Thread Checkpoint信息:

    ***************************************************************************

    DATABASE ENTRY

    ***************************************************************************

    (size = 316, compat size = 316, section max = 1, section in-use = 1,

    last-recid= 0, old-recno = 0, last-recno = 0)

    (extent = 1, blkno = 1, numrecs = 1)

    11/10/2011 22:40:12

    DB Name "ORCL"

    Database flags = 0x00404001 0x00001000

    Controlfile Creation Timestamp 11/10/2011 22:40:17

    Incmplt recovery scn: 0x0000.00000000

    Resetlogs scn: 0x0000.0006ce7b Resetlogs Timestamp 11/10/2011 22:40:23

    Prior resetlogs scn: 0x0000.00000001 Prior resetlogs Timestamp 06/30/2005 19:09:40

    Redo Version: compatible=0xa200100

    #Data files = 4, #Online files = 4

    Database checkpoint: Thread=1 scn: 0x0000.000e6958 --检查点信息

    Threads: #Enabled=1, #Open=1, Head=1, Tail=1

    enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

    Max log members = 3, Max data members = 1

    Arch list: Head=2, Tail=2, Force scn: 0x0000.000de15cscn: 0x0000.000e47c4

    Activation ID: 1294635980

    Controlfile Checkpointed at scn: 0x0000.000e6980 11/17/2011 22:39:39

    thread:0 rba:(0x0.0.0)

    enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

    2. 控制文件记录的redo信息

    在控制文件中,也可以找到REDO THREAD的检查点信息

    ***************************************************************************

    REDO THREAD RECORDS

    ***************************************************************************

    (size = 256, compat size = 256, section max = 8, section in-use = 1,

    last-recid= 0, old-recno = 0, last-recno = 0)

    (extent = 1, blkno = 9, numrecs = 8)

    THREAD #1 - status:0xf thread links forward:0 back:0

    #logs:3 first:1 last:3 current:2 last used seq#:0x27

    enabled at scn: 0x0000.0006ce7b 11/10/2011 22:40:23

    disabled at scn: 0x0000.00000000 01/01/1988 00:00:00

    opened at 11/17/2011 22:39:36 by instance ORCL

    Checkpointed at scn: 0x0000.000e6958 11/17/2011 22:39:36 –检查点信息

    thread:1 rba:(0x27.764f.10)

    enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

    log history: 38

    restore point keep sequence: 0

    3. 数据文件检查点信息

    同样,一下是控制文件中记录的数据文件检查点信息:

    DATA FILE #3:

    (name #5) /opt/ora10g/oradata/ORCL/sysaux01.dbf

    creation size=0 block size=8192 status=0xe head=5 tail=5 dup=1

    tablespace 2, index=3 krfil=3 prev_file=0

    unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00

    Checkpoint cnt:121 scn: 0x0000.000e6958 11/17/2011 22:39:36 –控制点信息

    Stop scn: 0xffff.ffffffff 11/17/2011 22:26:32

    Creation Checkpointed at scn: 0x0000.000019d1 06/30/2005 19:10:27

    thread:0 rba:(0x0.0.0)

    enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

    Offline scn: 0x0000.0006ce7a prev_range: 0

    Online Checkpointed at scn: 0x0000.0006ce7b 11/10/2011 22:40:23

    thread:1 rba:(0x1.2.0)

    enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

    Hot Backup end marker scn: 0x0000.00000000

    aux_file is NOT DEFINED

    注意此处,由于数据库是一场关闭,数据库没有完成最后的检查点,数据文件在Stop SCN仍然为无穷大(ffffffff)。

    在以上的信息中,各部分的Checkpoint SCN都一直,但是数据文件的Stop SCN不等于Checkpoint SCN,这意味着数据库上一次关闭没有执行完全教案差点,是异常关闭。此时启动数据库需要进行恢复。

    4. 数据库的实例恢复

    在数据库异常关闭之后,下次启动时,Oracle会自动执行实例恢复(Instance Recovery),实例恢复包括两个步骤:Cache Recovery和Transaction Recovery。

    继续以上的测试,启动数据库之后可以从alert_<sid>.log文件中获得数据库关于恢复的相关信息:

    SQL> alter database open;

    Database altered.

    Thu Nov 17 22:51:54 2011

    alter database open

    Thu Nov 17 22:51:54 2011

    Beginning crash recovery of 1 threads

    Thu Nov 17 22:51:54 2011

    Started redo scan

    Thu Nov 17 22:51:54 2011

    Completed redo scan

    190 redo blocks read, 72 data blocks need recovery

    Thu Nov 17 22:51:55 2011

    Started redo application at

    Thread 1: logseq 39, block 30288

    Thu Nov 17 22:51:55 2011

    Recovery of Online Redo Log: Thread 1 Group 2 Seq 39 Reading mem 0

    Mem# 0: /opt/ora10g/oradata/ORCL/redo02.log

    Thu Nov 17 22:51:55 2011

    Completed redo application

    Thu Nov 17 22:51:55 2011

    Completed crash recovery at

    Thread 1: logseq 39, block 30478, scn 964614

    72 data blocks read, 72 data blocks written, 190 redo blocks read

    Thu Nov 17 22:51:55 2011

    注意到Oracle在恢复过程中,首先读取日志,从最后完成的检查点开始,应用所有重做记录,这个过程叫前滚(Rolling Forward),也就是Cache Recovery过程,完成前滚之后,数据库可以被打开提供访问和使用。

    此后进入实例恢复的第二阶段,Oracle回滚未提交的事务。Oracle使用两个特点来增加这个恢复阶段的效率,这两个特点是Fast-Start On-Demand Rollback和Fast-Start Parallel Rollback(这些特点是Fast-Start Fault Recovery的组成部分,仅在Oracle 8i自会后的企业版中可用)。

    使用Fast-Start On-Demand Rollback特点,Oracle自动允许在数据库打开之后开始新的事务,这通常只需要很短的Cache Recovery时间。如果一个用户试图访问被一场终止进程锁定的记录,Oracle回滚那些新事物请求的记录,也就是说,因需求而回滚,然而,新事务不需要等待漫长的事务回滚时间。在Fast-Start On-Demand Rollback中,后台进程SMON充当一个调度员,使用多个服务器进程并行回滚一个事务集。

    Fast-Start Parallel Rollback的一个特殊形式是内部事务恢复(Intra-Transaction Recovery)。在内部事务恢复中,一个大的事务可以被拆分,非配给几个服务器进程并行回滚。可以通过初始化参数FAST_START_PARALLEL_ROLLBACK来控制并行回滚,该参数有3个参数值。

    FALSE:禁止Fast-Start Parallel Rollback。

    LOW:限制恢复进程不能超过2倍的CPU_COUNT。

    HIGH:限制恢复进程不能超过4个的CPU_COUNT.


    作者:czjie
    出处:http://www.cnblogs.com/czjie/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    X oracle 12c new feature: Automatic Report Capturing Feature
    X 搭建Postgresql configure: error: readline library not found
    X windows上利用vmvare搭建共享存储搭建rac
    洛谷P1397 [NOI2013]矩阵游戏
    BSOJ 6289【NOIP2018模拟赛】黄昏
    BSOJ 4282 秀秀的照片
    BSOJ 5185【11.08题目】暴力破解
    BSOJ 5100 简单的区间
    VUE 项目自适应屏幕和浏览器
    yarn npm区别
  • 原文地址:https://www.cnblogs.com/czjie/p/2258166.html
Copyright © 2011-2022 走看看