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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    vue form dynamic validator All In one
    TypeScript api response interface All In One
    closable VS closeable All In One
    macOS 如何开启 WiFi 热点 All In One
    vue css inline style All In One
    vs2010里面 新建网站里面的 asp.net网站 和 新建项目里面的 asp.net Web应用程序 的区别 (下)
    牛腩新闻 59 整合添加新闻页 FreeTextBox 富文本编辑器,检测到有潜在危险的 Request.Form 值,DropDownList 的使用
    牛腩新闻 61尾声: error.aspx的使用 防止报错
    vs2010里面 新建网站里面的 asp.net网站 和 新建项目里面的 asp.net Web应用程序 的区别 (上)
    牛腩新闻 62:尾声续2 asp.net的编译和发布
  • 原文地址:https://www.cnblogs.com/czjie/p/2258166.html
Copyright © 2011-2022 走看看