暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SYSTEM表空间- Oracle数据库的引导

原创 eygle 2019-10-14
1409

现在我们可以全面地来回顾一下数据库的内部引导过程(已经熟悉了nomount、mount、open的过程),通过10046事件可以跟踪一下数据库的启动过程:

SQL> startup nomount;
ORACLE instance started.
 
Total System Global Area  139531744 bytes
Fixed Size                   452064 bytes
Variable Size             121634816 bytes
Database Buffers           16777216 bytes
Redo Buffers                 667648 bytes
SQL> alter session set events='10046 trace name context forever,level 12';
Session altered.
SQL> alter database mount;
Database altered.
SQL> alter database open;
Database altered.


从跟踪文件中可以获得如下重要信息:

PARSING IN CURSOR #1 len=19 dep=0 uid=0 oct=35 lid=0 tim=1149404325198521 hv=2631704207 ad='533986f8'
alter database open
END OF STMT
PARSE #1:c=0,e=926,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,tim=1149404325198499
BINDS #1:
………………………
WAIT #1: nam='direct path read' ela= 43 p1=1 p2=1 p3=1
WAIT #1: nam='direct path read' ela= 4 p1=2 p2=1 p3=1
WAIT #1: nam='direct path read' ela= 3 p1=3 p2=1 p3=1
WAIT #1: nam='direct path read' ela= 2 p1=4 p2=1 p3=1
WAIT #1: nam='direct path read' ela= 2 p1=201 p2=1 p3=1
………………………
WAIT #1: nam='db file sequential read' ela= 88 p1=1 p2=417 p3=1
WAIT #1: nam='db file sequential read' ela= 91 p1=1 p2=377 p3=1


从以上信息中可以注意到,Oracle首先通过direct path read方式从每个数据文件头读取了第一个Block的信息,然后通过db file sequential read的单块读方式分别读取了数据文件1的第417个block和第377个block。


417上存放的正是1.417号对象,通过1.417对象进而找到bootstrap$对象,也就是block 377,找到了block 377,Oracle进而读取其内容,在内存中创建了这个对象:

PARSING IN CURSOR #2 len=188 dep=1 uid=0 oct=1 lid=0 tim=1149404325230977 hv=0 ad='b700de24'
create table bootstrap$ ( line#         number not null,   obj#           number not null,   sql_text   varchar2(4000) not null)   storage (initial 50K objno 56 extents (file 1 block 377))
END OF STMT


再接下来,Oracle通过递归查询,从bootstrap$中获取其他对象的创建语句:

PARSING IN CURSOR #2 len=55 dep=1 uid=0 oct=3 lid=0 tim=1149404325233023 hv=3952717224 ad='533984d8'
select line#, sql_text from bootstrap$ where obj# != :1
END OF STMT


进而创建这些对象:

PARSING IN CURSOR #2 len=129 dep=1 uid=0 oct=36 lid=0 tim=1149404325255090 hv=0 ad='b700de24'
CREATE ROLLBACK SEGMENT SYSTEM STORAGE (  INITIAL 112K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 32765 OBJNO 0 EXTENTS (FILE 1 BLOCK 9))
END OF STMT


在读取了1.417号对象之前的所有对象后,Oracle将可以正常打开数据库。


注意:在上一节我们已经指出——在Oracle 10g/11g中,Oracle将root dba直接指向了bootstrap$对象,从而消除了Oracle数据库中这个唯一的Cache对象。


V10 STYLE FILE HEADER:
        Compatibility Vsn = 169869568=0xa200100
        Db ID=3965153484=0xec5770cc, Db Name='DANALY'
        Activation ID=0=0x0
        Control Seq=2912565=0x2c7135, File size=84180=0x148d4
        File Number=1, Blksiz=8192, File Type=3 DATA
Tablespace #0 - SYSTEM  rel_fn:1
Creation  at  scn: 0x0000.00000007 09/03/2006 10:57:47
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0
reset logs count:0x23c5ed0c scn: 0x0000.00000001 reset logs terminal rcv data:0x0 scn: 0x0000.00000000
prev reset logs count:0x0 scn: 0x0000.00000000 prev reset logs terminal rcv data:0x0 scn: 0x0000.00000000
recovered at 01/28/2007 21:29:12
status:0x2004 root dba:0x00400179 chkpt cnt: 45507 ctl cnt:45506
begin-hot-backup file size: 0


了解了SYSTEM表空间的重要作用,也就可以理解:为什么系统表空间的文件头损坏,或者如果启动对象的数据块损坏后,Oracle数据库就将无法启动。


我们曾经见过很多案例,很多用户的数据库运行在非归档模式下,又没有备份,最后当SYSTEM表空间出现故障后,数据库就无法打开了,这是最为严重的情况,通常的方法是没有办法恢复数据的。


所以我们经常强调:SYSTEM表空间极其重要,备份重于一切。希望大家能够更加重视数据库和用户数据的安全。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论