还原真实的 cache recovery

 

maclean blog 上看到的这篇文章,很不错,转贴过来,原文链接如下:

 http://www.oracledatabase12g.com/archives/whats-smon-enabling-cache-recovery.html

 

 

       我们在学习Oracle基础知识的时候会了解到实例恢复(Instance Recovery)或者说崩溃恢复(Crash recovery)的概念,有时候甚至于这2个名词在我们日常的语言中表达同样的意思。

 

       实际上Instance RecoveryCrash Recovery是存在区别的:针对单实例(single instance)或者RAC中所有节点全部崩溃后的恢复,我们称之为Crash Recovery    而对于RAC中的某一个节点失败,存活节点(surviving instance)试图对失败节点线程上redo做应用的情况,我们称之为Instance Recovery

 

       不管是Instance Recovery还是Crash Recovery都由2个部分组成:cache recoverytransaction recovery

 

       根据官方文档的介绍,Cache Recovery也叫Rolling Forward,就是我们常说的前滚;而Transaction Recovery也叫Rolling Back,就是我们常说的回滚。

 

前滚:在redo log file中,从目前的start SCN开始,重做后面的已提交之事务。

回滚rollback未完成(dead transaction)事务。

 

我的Blog 也有关于这2个概念的说明:

       Oracle 实例恢复时 前滚(roll forward 后滚(roll back 问题

       http://www.cndba.cn/Dave/article/1410

 

 

Crash Recovery测试:

SQL> shutdown abort;

ORACLE instance shut down.

 

SQL> startup mount;

ORACLE instance started.

 

Total System Global Area 1065353216 bytes

Fixed Size                  2089336 bytes

Variable Size             486542984 bytes

Database Buffers          570425344 bytes

Redo Buffers                6295552 bytes

Database mounted.

 

SQL> alter database open;

 

Crash Recovery将从alter database open开始,我们来观察其日志

 

==================alert.log====================

alter database open

Tue Jun 14 18:19:53 2011

Beginning crash recovery of 1 threads

 parallel recovery started with 2 processes

Tue Jun 14 18:19:53 2011

Started redo scan

Tue Jun 14 18:19:53 2011

Completed redo scan

 0 redo blocks read, 0 data blocks need recovery

Tue Jun 14 18:19:53 2011

Started redo application at

 Thread 1: logseq 1004, block 1124, scn 17136185

Tue Jun 14 18:19:53 2011

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

  Mem# 0: /flashcard/oradata/G10R2/onlinelog/o1_mf_2_6v34jokt_.log

  Mem# 1: /s01/flash_recovery_area/G10R2/onlinelog/o1_mf_2_6v34jotq_.log

Tue Jun 14 18:19:53 2011

Completed redo application

Tue Jun 14 18:19:53 2011

Completed crash recovery at

 Thread 1: logseq 1004, block 1124, scn 17156186

 0 data blocks read, 0 data blocks written, 0 redo blocks read

Tue Jun 14 18:19:53 2011

LGWR: STARTING ARCH PROCESSES

ARC0: Archival started

LGWR: STARTING ARCH PROCESSES COMPLETE

ARC0 started with pid=16, OS id=7829

Tue Jun 14 18:19:53 2011

Thread 1 advanced to log sequence 1005 (thread open)

Thread 1 opened at log sequence 1005

  Current log# 3 seq# 1005 mem# 0: /flashcard/oradata/G10R2/onlinelog/o1_mf_3_6v34jpmp_.log

  Current log# 3 seq# 1005 mem# 1: /s01/flash_recovery_area/G10R2/onlinelog/o1_mf_3_6v34jpyn_.log

Successful open of redo thread 1

Tue Jun 14 18:19:53 2011

ARC0: Becoming the 'no FAL' ARCH

ARC0: Becoming the 'no SRL' ARCH

ARC0: Becoming the heartbeat ARCH

Tue Jun 14 18:19:53 2011

SMON: enabling cache recovery

Tue Jun 14 18:19:53 2011

db_recovery_file_dest_size of 204800 MB is 6.81% used. This is a

user-specified limit on the amount of space that will be used by this

database for recovery-related files, and does not reflect the amount of

space available in the underlying filesystem or ASM diskgroup.

Tue Jun 14 18:19:54 2011

Successfully onlined Undo Tablespace 1.

Tue Jun 14 18:19:54 2011

SMON: enabling tx recovery

Database Characterset is UTF8

Opening with internal Resource Manager plan

where NUMA PG = 1, CPUs = 2

replication_dependency_tracking turned off (no async multimaster replication found)

Starting background process QMNC

QMNC started with pid=17, OS id=7831

Tue Jun 14 18:19:55 2011

Completed: alter database open

 

注意上述单实例Crash Recovery到数据库打开的整个过程:

(1).      alter database open

(2).      Beginning crash recovery of 1 threads

(3).      Started redo scan

(4).      Completed redo scan

(5).      Started redo application at

(6).      Completed redo application

(7).      Completed crash recovery at

(8).      SMON: enabling cache recovery

(9).      Successfully onlined Undo Tablespace 1

(10).  SMON: enabling tx recovery

(11).  Completed: alter database open

 

从上述步骤中我们可以看到三种恢复名词,即:

(1).      crash recovery

(2).      cache recovery

(3).      tx recovery

 

       这和官方文档所描述的Crash Recovery概念是不一致的,我们现在来理清这几种recovery

 

       crash recovery包含对redoscanapplication,显然其完成的是Rolling Forward前滚的工作,告警日志中出现的crash recovery等同于官方文档中介绍的”cache recovery”我们可以将” Completed crash recovery”看做前滚完成的标志。      tx recovery从字面就可以看出实际上是Transaction Recoverytx recovery发生在Undo Tablespace online之后(回滚事务的前提是Undo可用),数据完成打开操作之前(“Completed: alter database open”)注意tx recovery并不要求数据库打开前完成,仅仅是在数据库打开之前由smon启动(“SMON: enabling tx recovery”)

 

       剩下的唯一的问题是,这里的cache recovery是什么?显然它不是官方文档中所描述的”cache recovery”,几乎没有任何文档介绍存在这样一个recovery操作,这也是本文重点要介绍的。

 

       我们来看另一个演示,这个演示用以说明cache recovery还存在于最普通的不包含Crash Recovery的数据库打开过程中:

 

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

 

SQL> startup mount;

ORACLE instance started.

Total System Global Area 1065353216 bytes

Fixed Size                  2089336 bytes

Variable Size             486542984 bytes

Database Buffers          570425344 bytes

Redo Buffers                6295552 bytes

Database mounted.

 

SQL> alter database open;

Database altered.

 

SQL> select * from v$version;

 

BANNER

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

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

PL/SQL Release 10.2.0.4.0 - Production

CORE    10.2.0.4.0      Production

TNS for Linux: Version 10.2.0.4.0 - Production

NLSRTL Version 10.2.0.4.0 - Production

 

SQL> select * from global_name;

 

GLOBAL_NAME

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

www.oracledatabase12g.com

 

==================alert.log====================

alter database open

Tue Jun 14 18:43:52 2011

LGWR: STARTING ARCH PROCESSES

ARC0: Archival started

LGWR: STARTING ARCH PROCESSES COMPLETE

ARC0 started with pid=14, OS id=8133

Tue Jun 14 18:43:52 2011

Thread 1 opened at log sequence 1005

Current log# 3 seq# 1005 mem# 0: /flashcard/oradata/G10R2/onlinelog/o1_mf_3_6v34jpmp_.log

Current log# 3 seq# 1005 mem# 1: /s01/flash_recovery_area/G10R2/onlinelog/o1_mf_3_6v34jpyn_.log

Successful open of redo thread 1

Tue Jun 14 18:43:52 2011

ARC0: Becoming the 'no FAL' ARCH

ARC0: Becoming the 'no SRL' ARCH

ARC0: Becoming the heartbeat ARCH

Tue Jun 14 18:43:52 2011

SMON: enabling cache recovery

Tue Jun 14 18:43:53 2011

Successfully onlined Undo Tablespace 1.

Tue Jun 14 18:43:53 2011

SMON: enabling tx recovery

Database Characterset is UTF8

Opening with internal Resource Manager plan

where NUMA PG = 1, CPUs = 2

replication_dependency_tracking turned off (no async multimaster replication found)

Tue Jun 14 18:43:53 2011

Incremental checkpoint up to RBA [0x3ed.624.0], current log tail at RBA [0x3ed.944.0]

Tue Jun 14 18:43:53 2011

Starting background process QMNC

QMNC started with pid=15, OS id=8135

Tue Jun 14 18:43:53 2011

Completed: alter database open

 

       因为是clean shutdown,所以这里不存在crash recovery。但这里同样出现了”SMON: enabling cache recovery”,可见cache recovery是每次实例启动instance startup必要执行的一种恢复操作。但问题是,这个恢复操作到底针对何种对象?

 

       实际上cache recovery所要恢复的是rowcache,也就是我们常说的字典缓存(dictionary cache)关于这个结论,肯定有很多人要问我这样说的依据是什么,对应于这个”cache recovery”的问题,我们很难从google中得到一些启示,因为它和官方文档所描述的”cache recovery-rolling forward”存在重名的关系。

 

       为了证明cache recovery所恢复的是row cache,我们需要一个实证,从正式的系统中得到验证。要做到这一点是比较困难的,我们需要Oracle愿意把整个database open的过程变成慢动作来供我们参考,验证要用到一些调试工具,例如gdb或者dbx

 

我们首先将实例启动到mount状态,并对执行startupLOCAL进程做gdbbreakpoint断点调试:

SQL> shutdown abort;

ORACLE instance shut down.

 

SQL> startup mount;

ORACLE instance started.

Total System Global Area 1065353216 bytes

Fixed Size                  2089336 bytes

Variable Size             486542984 bytes

Database Buffers          570425344 bytes

Redo Buffers                6295552 bytes

Database mounted.

 

找出LOCAL进程的系统进程号SPID

 

SQL> select spid from v$process

2  where addr in (

3  select paddr from v$session

4  where sid=(select distinct sid from v$mystat))

5  /

 

SPID

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

8326

 

在实例startup nomount/mount后共享池的library cache就是可用的

 

SQL> select namespace from v$librarycache where gets!=0;

 

NAMESPACE

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

SQL AREA

TABLE/PROCEDURE

 

rowcache则尚未被填充,因为字典缓存来源于自对象(bootstrap$)和字典基表

 

SQL> select parameter,count,gets from v$rowcache where count!=0;

no rows selected

 
另开一个terminal窗口,并执行对LOCAL进程8326gdb breakpoint调试
 

[oracle@rh2 ~]$ gdb $ORACLE_HOME/bin/oracle 8326

GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-23.el5)

Copyright (C) 2009 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-redhat-linux-gnu".

For bug reporting instructions, please see:

...

Reading symbols from /s01/db_1/bin/oracle...(no debugging symbols found)...done.

Attaching to program: /s01/db_1/bin/oracle, process 8326

Reading symbols from /s01/db_1/lib/libskgxp10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/db_1/lib/libskgxp10.so

Reading symbols from /s01/db_1/lib/libhasgen10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/db_1/lib/libhasgen10.so

Reading symbols from /s01/db_1/lib/libskgxn2.so...(no debugging symbols found)...done.

Loaded symbols for /s01/db_1/lib/libskgxn2.so

Reading symbols from /s01/db_1/lib/libocr10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/db_1/lib/libocr10.so

Reading symbols from /s01/db_1/lib/libocrb10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/db_1/lib/libocrb10.so

Reading symbols from /s01/db_1/lib/libocrutl10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/db_1/lib/libocrutl10.so

Reading symbols from /s01/db_1/lib/libjox10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/db_1/lib/libjox10.so

Reading symbols from /s01/db_1/lib/libclsra10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/db_1/lib/libclsra10.so

Reading symbols from /s01/db_1/lib/libdbcfg10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/db_1/lib/libdbcfg10.so

Reading symbols from /s01/db_1/lib/libnnz10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/db_1/lib/libnnz10.so

Reading symbols from /usr/lib64/libaio.so.1...(no debugging symbols found)...done.

Loaded symbols for /usr/lib64/libaio.so.1

Reading symbols from /lib64/libdl.so.2...(no debugging symbols found)...done.

Loaded symbols for /lib64/libdl.so.2

Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.

Loaded symbols for /lib64/libm.so.6

Reading symbols from /lib64/libpthread.so.0...(no debugging symbols found)...done.

[Thread debugging using libthread_db enabled]

Loaded symbols for /lib64/libpthread.so.0

Reading symbols from /lib64/libnsl.so.1...(no debugging symbols found)...done.

Loaded symbols for /lib64/libnsl.so.1

Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.

Loaded symbols for /lib64/libc.so.6

Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.

Loaded symbols for /lib64/ld-linux-x86-64.so.2

Reading symbols from /lib64/libnss_files.so.2...(no debugging symbols found)...done.

Loaded symbols for /lib64/libnss_files.so.2

0x0000003181a0d8e0 in __read_nocancel () from /lib64/libpthread.so.0

 

输入断点kcrf_commit_forcekqlobjlod

(gdb) break kcrf_commit_force

Breakpoint 1 at 0x2724b6c

 

(gdb) break kqlobjlod

Breakpoint 2 at 0x1ac5e8c

 
在之前的terminal中执行数据库打开操作,因为breakpoint的关系这个open操作会hang住,这时我们通过观察告警日志来了解恢复进度
 

SQL> alter database open;         --这里会hang

 
gdb下输入continue
 

(gdb) c

Continuing.

 

Breakpoint 1, 0x0000000002724b6c in kcrf_commit_force ()

 

观察告警日志可以发现redo application已经完成,但还未进入cache recovery阶段
 

alter database open

Tue Jun 14 19:14:33 2011

Beginning crash recovery of 1 threads

parallel recovery started with 2 processes

Tue Jun 14 19:14:33 2011

Started redo scan

Tue Jun 14 19:14:33 2011

Completed redo scan

39 redo blocks read, 74 data blocks need recovery

Tue Jun 14 19:14:33 2011

Started redo application at

Thread 1: logseq 1006, block 1155

Tue Jun 14 19:14:33 2011

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

Mem# 0: /flashcard/oradata/G10R2/onlinelog/o1_mf_1_6v34jnkn_.log

Mem# 1: /s01/flash_recovery_area/G10R2/onlinelog/o1_mf_1_6v34jnst_.log

Tue Jun 14 19:14:33 2011

Completed redo application

Tue Jun 14 19:14:33 2011

Completed crash recovery at

Thread 1: logseq 1006, block 1194, scn 17200193

74 data blocks read, 74 data blocks written, 39 redo blocks read

Tue Jun 14 19:14:33 2011

LGWR: STARTING ARCH PROCESSES

ARC0: Archival started

LGWR: STARTING ARCH PROCESSES COMPLETE

ARC0 started with pid=17, OS id=8656

Tue Jun 14 19:14:33 2011

Thread 1 advanced to log sequence 1007 (thread open)

Thread 1 opened at log sequence 1007

Current log# 2 seq# 1007 mem# 0: /flashcard/oradata/G10R2/onlinelog/o1_mf_2_6v34jokt_.log

Current log# 2 seq# 1007 mem# 1: /s01/flash_recovery_area/G10R2/onlinelog/o1_mf_2_6v34jotq_.log

Successful open of redo thread 1

Tue Jun 14 19:14:33 2011

ARC0: Becoming the 'no FAL' ARCH

ARC0: Becoming the 'no SRL' ARCH

ARC0: Becoming the heartbeat ARCH

db_recovery_file_dest_size of 204800 MB is 6.81% used. This is a

user-specified limit on the amount of space that will be used by this

database for recovery-related files, and does not reflect the amount of

space available in the underlying filesystem or ASM diskgroup.

Tue Jun 14 19:14:37 2011

Incremental checkpoint up to RBA [0x3ef.3.0], current log tail at RBA [0x3ef.3.0]

 
且此时rowcache仍未被填充
 

SQL> select parameter,count,gets from v$rowcache where count!=0;

no rows selected

 
gdb界面下再次执行continue 2
 

(gdb) c

Continuing.

 

Breakpoint 1, 0x0000000002724b6c in kcrf_commit_force ()

(gdb) c

Continuing.

 

Breakpoint 2, 0x0000000001ac5e8c in kqlobjlod ()

 
观察告警日志可以发现已开始cache recovery,但也卡陷在cache recovery上,这保证我们的演示不受骚扰
 

Tue Jun 14 19:16:44 2011

SMON: enabling cache recovery

 
此时rowcache中出现唯一的一个dc_objects对象
 

select parameter,count,gets from v$rowcache where count!=0;

 

PARAMETER            COUNT       GETS

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

dc_objects               1          1

 
这个对象是什么呢?也许你已经猜到了,我们做一个rowcache dump来看一下:
 

SQL> ALTER SESSION SET EVENTS 'immediate trace name row_cache level 10';

 

================row_cache trace===================

 

BUCKET 43170:

row cache parent object: address=0x92326060 cid=8(dc_objects)

hash=f3d1a8a1 typ=11 transaction=(nil) flags=00000001

own=0x92326130[0x9230f628,0x9230f628] wat=0x92326140[0x92326140,0x92326140] mode=S

status=EMPTY/-/-/-/-/-/-/-/-

set=0, complete=FALSE

data=

00000000 4f42000a 5453544f 24504152 00000000 00000000 00000000 00000000

00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000

BUCKET 43170 total object count=1

 
可以看到上述dc_objects尚未完成加载(status=EMPTY & complete=FALSE ),那么这是一个什么object呢?
 
4f42000a 5453544f 24504152 => 转换为文本即:OB TSTO$PAR也就是BOOTSTRAP$
 
换而言之在cache recovery时第一个恢复的字典缓存对象是BOOTSTRAP$,这并不出乎我们的意料。
 
启动实例的LOCAL进程的等待事件为instance state change,这是常规情况下我们观察不到得
 
SQL> select event,p1text,p1 from v$session where wait_class!='Idle';
 
EVENT                                    P1TEXT                                           P1
---------------------------------------- ---------------------------------------- ----------
instance state change                    layer                                             2
 
gdb界面下再次continue,将载入更多的rowcache对象
 

(gdb) c

Continuing.

 

Breakpoint 2, 0x0000000001ac5e8c in kqlobjlod ()

 

BUCKET 37:

row cache parent object: address=0x916cd980 cid=3(dc_rollback_segments)

hash=5fed2a24 typ=9 transaction=(nil) flags=000000a6

own=0x916cda50[0x916cda50,0x916cda50] wat=0x916cda60[0x916cda60,0x916cda60] mode=N

status=VALID/INSERT/-/FIXED/-/-/-/-/-

data=

00000000 00000000 00000001 00000009 59530006 4d455453 00000000 00000000

00000000 00000000 00000000 00000000 00000003 00000000 00000000 00000000

00000000 00000000 00000000 00000000

BUCKET 37 total object count=1

 
595300064d455453 -> SYSTEM 属于dc_rollback_segments 也就是著名的system回滚段
 

BUCKET 55556:

row cache parent object: address=0x916d8cd0 cid=8(dc_objects)

hash=ce89d903 typ=11 transaction=(nil) flags=00000001

own=0x916d8da0[0x9230f628,0x9230f628] wat=0x916d8db0[0x916d8db0,0x916d8db0] mode=S

status=EMPTY/-/-/-/-/-/-/-/-

set=0, complete=FALSE

data=

00000000 5f430006 234a424f 00000000 00000000 00000000 00000000 00000000

00000000 00000005 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000

BUCKET 55556 total object count=1

 
5f430006 234a424f -> C_OBJ# 是著名的bootstrap对象之一,可以从$ORACLE_HOME/rdbms/admin/sql.bsq中找到它
 

create rollback segment SYSTEM tablespace SYSTEM

storage (initial 50K next 50K)

/

create cluster c_obj# (obj# number)

pctfree 5 size 800                           /* don't waste too much space */

/* A table of 32 cols, 2 index, 2 col per index requires about 2K.

* A table of 10 cols, 2 index, 2 col per index requires about 750.

*/

storage (initial 130K next 200k maxextents unlimited pctincrease 0)

/* avoid space management during IOR I */

/

 
我们还可以通过v$rowcache_parent视图来了解dictionary cache的情况
 
SQL> col cache_name for a20
SQL> col keystr for a31
SQL> set linesize 200
SQL> select address,cache_name,existent,lock_mode,saddr,substr(key,1,30) keystr from v$rowcache_parent;
 
ADDRESS          CACHE_NAME           E  LOCK_MODE SADDR            KEYSTR
---------------- -------------------- - ---------- ---------------- -------------------------------
00000000916CCE20 dc_tablespaces       N          0 00               000000000000000000000000000000
00000000916CD980 dc_rollback_segments Y          0 00               000000000000000000000000000000
0000000092326060 dc_objects           Y          0 00               000000000A00424F4F545354524150
00000000916D8CD0 dc_objects           N          3 000000009BD91328 000000000600435F4F424A23000000
00000000916DA830 dc_object_ids        Y          0 00               380000000000000000000000000000
 

       可以看到持有row cache lock的会话是'000000009BD91328',且该dc_objects对象还处于non-existent状态,换而言之真正装载rowcache的是启动实例的LOCAL服务进程

 
SQL> select sid,program,event,p1,p2,p3 from v$session where saddr='000000009BD91328';
 
SID PROGRAM                                          EVENT                                    P1   P2 P3
----- ------------------------------------------------ ---------------------------------------- -- ---- --
3294 sqlplus@rh2.oracle.com (TNS V1-V3)               db file scattered read                    1  378  3
 
该进程正在等待db file scattered readfileid->1,block-378,这些块属于BOOTSTRAP$
 
BOOTSTRAP$对象已从rowcache被载入到library cache
 
SQL> select kglhdadr,kglnaobj from x$kglob where kglobtyp=2 and kglnaobj not like 'X$%';
 
KGLHDADR             KGLNAOBJ
-------------------- --------------------
0000000092326990     BOOTSTRAP$
 
SQL> select owner||'.'||Name from v$db_object_cache where type='TABLE' and name not like 'X$%';
 
OWNER||'.'||NAME
--------------------------------------------------------------------------------
SYS.BOOTSTRAP$
 

初步总结:

1)在数据库正式open前需要恢复字典缓存,这个步骤被称为cache recovery,其实是row cache recovery。与官方文档中描述的”cache recovery”不同,row cache recovery应当是Oracle Internal的叫法。

2)实际执行row cache recovery的不是SMON进程,而是启动实例的服务进程

 

 

 

 

 

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

QQ:492913789

Email:ahdba@qq.com

Blog: http://www.cndba.cn/dave


DBA1 群:62697716();   DBA2 群:62697977()   DBA3 群:62697850()  

DBA 超级群:63306533();  DBA4 群: 83829929  DBA5群: 142216823   

DBA6 群:158654907  聊天 群:40132017   聊天2群:69087192

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

<think>好的,我现在需要处理用户关于“缓存恢复命令”(cache recovery command)的查询。用户引用了几个资料,其中提到了RMAN文件创建、系统升级中的recovery命令,以及Android OTA升级中的Recovery服务流程。首先,我需要明确用户的需求是什么。他们可能是在IT系统中寻找与缓存恢复相关的技术资料,特别是在系统恢复、固件升级或数据库管理方面。 首先,我需要回顾用户提供的引用内容。引用[1]提到了RMAN(Recovery Manager)在快速恢复区的文件配置,这可能与Oracle数据库的备份恢复有关。引用[2]和[3]涉及系统升级中的recovery命令和Android的OTA升级流程,特别是Recovery服务中的install_package函数。引用[4]讨论了固件升级和Android启动过程。 用户的问题可能集中在如何利用缓存恢复命令来执行系统恢复或固件升级。我需要将这几个引用点联系起来,解释不同上下文中的缓存恢复命令,比如数据库中的RMAN、Android系统升级中的缓存包应用,以及一般IT系统中的缓存恢复机制。 接下来,我需要确保回答符合用户的要求:结构清晰,分步解决问题,真实可靠。同时,根据系统级指令,需要正确使用LaTeX格式,生成相关问题,并在引用处添加标识。 可能的结构如下: 1. 定义缓存恢复命令,说明其在不同场景下的应用。 2. 分点讨论数据库、系统升级(特别是Android)中的具体例子。 3. 提供每个场景下的命令示例或流程说明。 4. 引用用户提供的资料作为支持。 5. 生成相关问题,帮助用户深入探讨。 需要检查每个引用是否正确对应到内容,例如引用[2]中的update_package使用CACHE分区,引用[3]中的Recovery服务流程,引用[1]的RMAN配置,以及引用[4]的固件升级。需要确保LaTeX格式正确,如独立公式用$$,行内用$,并且没有语法错误。 可能的问题点:用户提到的“缓存恢复命令”是否特指某个领域?比如数据库恢复,系统升级,还是通用IT操作?根据引用内容,应涵盖多个方面,但需明确区分不同场景。另外,需要确认技术细节的准确性,例如Android Recovery模式中的缓存包应用,或RMAN如何利用快速恢复区。 最后,生成的相关问题需要围绕缓存恢复命令的不同应用领域,引导用户进一步探索。例如,数据库中的恢复命令优化,Android OTA升级中的缓存机制,或者缓存分区在系统恢复中的作用。</think>### 缓存恢复命令(Cache Recovery Command)在IT系统中的技术解析 缓存恢复命令通常用于系统故障恢复、固件升级或数据备份等场景,其核心目标是通过缓存机制快速恢复系统状态或关键数据。以下是不同技术场景下的具体应用与分析: --- #### 1. **数据库系统中的缓存恢复命令** 在Oracle数据库中,**RMAN(Recovery Manager)** 通过配置快速恢复区(Fast Recovery Area)实现缓存恢复。例如: ```sql CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/recovery_area/%U'; ``` 此命令定义了备份文件的存储路径,确保在数据库崩溃时能快速从缓存恢复数据[^1]。 **关键技术点:** - 快速恢复区集中管理备份文件(控制文件、归档日志等)。 - 缓存恢复依赖增量备份和日志重放机制。 - 使用命令 `RESTORE DATABASE` 和 `RECOVER DATABASE` 触发恢复流程。 --- #### 2. **系统升级中的缓存恢复命令** 在Android OTA升级中,缓存分区(`CACHE`)用于临时存储升级包,并通过Recovery模式执行恢复操作。例如: ```bash adb reboot recovery --update_package=CACHE:some-filename.zip ``` 此命令指示系统从缓存分区加载升级包并启动安装流程[^2][^3]。 **关键技术点:** - 缓存分区存储临时文件(如OTA包),避免占用系统分区。 - Recovery服务通过解析`update_package`参数定位缓存文件。 - 核心函数`install_package`负责验证并刷写新固件。 --- #### 3. **通用IT系统的缓存恢复机制** 在服务器或存储设备中,缓存恢复可能涉及: - **RAID缓存重建**:通过冗余磁盘恢复数据。 - **内存缓存持久化**:将易失性内存数据定期写入非易失存储。 - **命令示例**(硬件级): ```bash megacli -CfgCache -Set -Volatile -aAll ``` 此命令配置磁盘控制器的缓存策略以提高恢复速度。 --- ### 缓存恢复命令的设计原则 1. **原子性**:确保恢复过程要么完全成功,要么回滚到初始状态。 2. **日志追踪**:记录操作日志以便故障排查(如数据库的Redo Log)。 3. **性能优化**:利用增量备份或差异备份减少恢复时间[^1]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值