ITPUB论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
更多
查看: 63564|回复: 128

[精华] 关于数据库open的深入探究 [复制链接]

超级版主

人生就是如此

精华贴数
39
技术积分
113462
社区积分
12356
注册时间
2001-12-12
论坛徽章:
73
ITPUB元老
日期:2005-02-28 12:57:00ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41蜘蛛蛋
日期:2011-07-01 08:38:17蛋疼蛋
日期:2011-05-27 08:50:45现任管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:皮划艇
日期:2011-04-26 11:24:14咸鸭蛋
日期:2011-11-09 09:55:402011新春纪念徽章
日期:2011-02-18 11:43:322011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
发表于 2004-2-27 18:59:57 |显示全部楼层
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area  131142648 bytes
Fixed Size                   451576 bytes
Variable Size             104857600 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
Database mounted.
SQL> alter session set sql_trace = true;

Session altered.

SQL> alter database open;

Database altered.

SQL>

首先我们来参考跟踪文件的前部分(参考附件)
这是第一个对象的创建
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))

接下来我们来看执行的是
select line#, sql_text
from
bootstrap$ where obj# != :1
(这里实际上是逐步提取内容建立字典表本身的结构,根据后面内容可知)


那么在这里我们在数据库中来看看 bootstap$
SQL> desc bootstrap$
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
LINE#                                     NOT NULL NUMBER
OBJ#                                      NOT NULL NUMBER
SQL_TEXT                                  NOT NULL VARCHAR2(4000)

SQL>

SQL> select count(*) from bootstrap$;
        57

SQL>

SQL> select  obj#,sql_text from bootstrap$ where rownum<11;
        -1
8.0.0.0.0

         0
CREATE ROLLBACK SEGMENT SYSTEM STORAGE (  INITIAL 112K NEXT 1024K MINEXTENTS 1 M
AXEXTENTS 32765 OBJNO 0 EXTENTS (FILE 1 BLOCK 9))

         8
CREATE CLUSTER C_FILE#_BLOCK#("TS#" NUMBER,"SEGFILE#" NUMBER,"SEGBLOCK#" NUMBER)
PCTFREE 10 PCTUSED 40 INITRANS 2 MAXTRANS 255 STORAGE (  INITIAL 24K NEXT 1024K
MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 8 EXTENTS (FILE 1 BLOCK
73)) SIZE 225

         9
CREATE INDEX I_FILE#_BLOCK# ON CLUSTER C_FILE#_BLOCK# PCTFREE 10 INITRANS 2 MAXT
RANS 255 STORAGE (  INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PC
TINCREASE 0 OBJNO 9 EXTENTS (FILE 1 BLOCK 81))

        14
CREATE TABLE SEG$("FILE#" NUMBER NOT NULL,"BLOCK#" NUMBER NOT NULL,"TYPE#" NUMBE
R NOT NULL,"TS#" NUMBER NOT NULL,"BLOCKS" NUMBER NOT NULL,"EXTENTS" NUMBER NOT N
ULL,"INIEXTS" NUMBER NOT NULL,"MINEXTS" NUMBER NOT NULL,"MAXEXTS" NUMBER NOT NUL
L,"EXTSIZE" NUMBER NOT NULL,"EXTPCT" NUMBER NOT NULL,"USER#" NUMBER NOT NULL,"LI
STS" NUMBER,"GROUPS" NUMBER,"BITMAPRANGES" NUMBER NOT NULL,"CACHEHINT" NUMBER NO
T NULL,"SCANHINT" NUMBER NOT NULL,"HWMINCR" NUMBER NOT NULL,"SPARE1" NUMBER,"SPA
RE2" NUMBER) STORAGE (  OBJNO 14 TABNO 2) CLUSTER C_FILE#_BLOCK#(TS#,FILE#,BLOCK
#)

         5
CREATE TABLE CLU$("OBJ#" NUMBER NOT NULL,"DATAOBJ#" NUMBER,"TS#" NUMBER NOT NULL
,"FILE#" NUMBER NOT NULL,"BLOCK#" NUMBER NOT NULL,"COLS" NUMBER NOT NULL,"PCTFRE
E$" NUMBER NOT NULL,"PCTUSED$" NUMBER NOT NULL,"INITRANS" NUMBER NOT NULL,"MAXTR
ANS" NUMBER NOT NULL,"SIZE$" NUMBER,"HASHFUNC" VARCHAR2(30),"HASHKEYS" NUMBER,"F
UNC" NUMBER,"EXTIND" NUMBER,"FLAGS" NUMBER,"DEGREE" NUMBER,"INSTANCES" NUMBER,"A
VGCHN" NUMBER,"SPARE1" NUMBER,"SPARE2" NUMBER,"SPARE3" NUMBER,"SPARE4" NUMBER,"S
PARE5" VARCHAR2(1000),"SPARE6" VARCHAR2(1000),"SPARE7" DATE) STORAGE (  OBJNO 5
TABNO 2) CLUSTER C_OBJ#(OBJ#)

         6
CREATE CLUSTER C_TS#("TS#" NUMBER) PCTFREE 10 PCTUSED 40 INITRANS 2 MAXTRANS 255
STORAGE (  INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREAS
E 0 OBJNO 6 EXTENTS (FILE 1 BLOCK 57))

         7
CREATE INDEX I_TS# ON CLUSTER C_TS# PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE (
  INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO
7 EXTENTS (FILE 1 BLOCK 65))

        18
CREATE TABLE OBJ$("OBJ#" NUMBER NOT NULL,"DATAOBJ#" NUMBER,"OWNER#" NUMBER NOT N
ULL,"NAME" VARCHAR2(30) NOT NULL,"NAMESPACE" NUMBER NOT NULL,"SUBNAME" VARCHAR2(
30),"TYPE#" NUMBER NOT NULL,"CTIME" DATE NOT NULL,"MTIME" DATE NOT NULL,"STIME"
DATE NOT NULL,"STATUS" NUMBER NOT NULL,"REMOTEOWNER" VARCHAR2(30),"LINKNAME" VAR
CHAR2(128),"FLAGS" NUMBER,"OID$" RAW(16),"SPARE1" NUMBER,"SPARE2" NUMBER,"SPARE3
" NUMBER,"SPARE4" VARCHAR2(1000),"SPARE5" VARCHAR2(1000),"SPARE6" DATE) PCTFREE
10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE (  INITIAL 16K NEXT 1024K MINEXTEN
TS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 18 EXTENTS (FILE 1 BLOCK 121))

        36
CREATE UNIQUE INDEX I_OBJ1 ON OBJ$(OBJ#) PCTFREE 10 INITRANS 2 MAXTRANS 255 STOR
AGE (  INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 O
BJNO 36 EXTENTS (FILE 1 BLOCK 217))


10 rows selected.

SQL>

由这里我们可以看出,bootstrap$ 中实际上是记录了一些数据库系统基本对象的创建语句
那对于我们数据库来说,也可以看做建立一个表结构,通过这个结构可以通过关系型数据库的方式去获取文件中数据

ok,接下来我们看看trace文件中的内容,发现

CREATE ROLLBACK SEGMENT SYSTEM STORAGE (  INITIAL 112K NEXT 1024K MINEXTENTS
  1 MAXEXTENTS 32765 OBJNO 0 EXTENTS (FILE 1 BLOCK 9))   

在数据库系统表空间的头部创建了系统回滚段(block 9 开始,1---8  属于数据文件头)

再往下
CREATE CLUSTER C_OBJ#("OBJ#" NUMBER) PCTFREE 5 PCTUSED 40 INITRANS 2 MAXTRANS
  255 STORAGE (  INITIAL 136K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 OBJNO 2 EXTENTS (FILE 1 BLOCK 25)) SIZE 800
这里同样是直接指定了该cluster 的段头位置  block 25


SQL> select file_id,block_id from dba_extents where segment_name = 'C_OBJ#';
         1         25
         1         33
         1         41
         1       3241
         1       4441
         1       4473
         1       4489
         1       4513
         1       4529
         1       4561
         1       4585
         1       4609
         1       4641
         1       4681
         1       4753
         1       4833
         1       4873
         1      12681
         1      23689
         1      26249

20 rows selected.




CREATE INDEX I_OBJ# ON CLUSTER C_OBJ# PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE (  INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 OBJNO 3 EXTENTS (FILE 1 BLOCK 49))


CREATE TABLE TAB$("OBJ#" NUMBER NOT NULL,"DATAOBJ#" NUMBER,"TS#" NUMBER NOT
  NULL,"FILE#" NUMBER NOT NULL,"BLOCK#" NUMBER NOT NULL,"BOBJ#" NUMBER,"TAB#"
  NUMBER,"COLS" NUMBER NOT NULL,"CLUCOLS" NUMBER,"PCTFREE$" NUMBER NOT NULL,
  "PCTUSED$" NUMBER NOT NULL,"INITRANS" NUMBER NOT NULL,"MAXTRANS" NUMBER NOT
  NULL,"FLAGS" NUMBER NOT NULL,"AUDIT$" VARCHAR2(38) NOT NULL,"ROWCNT" NUMBER,
  "BLKCNT" NUMBER,"EMPCNT" NUMBER,"AVGSPC" NUMBER,"CHNCNT" NUMBER,"AVGRLN"
  NUMBER,"AVGSPC_FLB" NUMBER,"FLBCNT" NUMBER,"ANALYZETIME" DATE,"SAMPLESIZE"
  NUMBER,"DEGREE" NUMBER,"INSTANCES" NUMBER,"INTCOLS" NUMBER NOT NULL,
  "KERNELCOLS" NUMBER NOT NULL,"PROPERTY" NUMBER NOT NULL,"TRIGFLAG" NUMBER,
  "SPARE1" NUMBER,"SPARE2" NUMBER,"SPARE3" NUMBER,"SPARE4" VARCHAR2(1000),
  "SPARE5" VARCHAR2(1000),"SPARE6" DATE) STORAGE (  OBJNO 4 TABNO 1) CLUSTER
  C_OBJ#(OBJ#)

我们可以看到,从tab$ 开始,存储发生了变化,
STORAGE (  OBJNO 4 TABNO 1) CLUSTER   C_OBJ#(OBJ#)
那这里的 objno 4 tabno 1 表示什么意思呢?(通过 cluster   C_OBJ#(OBJ#)我们就可以找到表tab$自身)


SQL> select * from tab$ where obj# = 4 and tab# = 1;

      OBJ#   DATAOBJ#        TS#      FILE#     BLOCK#      BOBJ#       TAB#
---------- ---------- ---------- ---------- ---------- ---------- ----------
      COLS    CLUCOLS   PCTFREE$   PCTUSED$   INITRANS   MAXTRANS      FLAGS
---------- ---------- ---------- ---------- ---------- ---------- ----------
AUDIT$                                     ROWCNT     BLKCNT     EMPCNT
-------------------------------------- ---------- ---------- ----------
    AVGSPC     CHNCNT     AVGRLN AVGSPC_FLB     FLBCNT ANALYZETI SAMPLESIZE
---------- ---------- ---------- ---------- ---------- --------- ----------
    DEGREE  INSTANCES    INTCOLS KERNELCOLS   PROPERTY   TRIGFLAG     SPARE1
---------- ---------- ---------- ---------- ---------- ---------- ----------
    SPARE2     SPARE3
---------- ----------
SPARE4
--------------------------------------------------------------------------------
SPARE5
--------------------------------------------------------------------------------
SPARE6
---------
         4          2          0          1         25          2          1
        37          1          0          0          0          0         17
--------------------------------              921        428         83
      2381          0        139       6368          7 11-AUG-03        921
                              37         37       1024          0          0



06-AUG-03


SQL>

由这里可以看出,存储参数从这里开始,就从数据文件中固定表的记录中取出来
由此再往trace文件看下去,就会发现这个时候数据库已经可以通过已有信息从系统表空间文件中提取结构信息和数据信息
我们看上面关于存储的定义
CREATE CLUSTER C_OBJ#("OBJ#" NUMBER) PCTFREE 5 PCTUSED 40 INITRANS 2 MAXTRANS
  255 STORAGE (  INITIAL 136K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 OBJNO 2 EXTENTS (FILE 1 BLOCK 25)) SIZE 800
这里的extents 指明了是 block 25,我们假设在初始化参数文件中db_block_size设置不当,则必然导致文件位置定位错误


之所以要来研究这个问题(以前研究了今天写出来而已),是因为最早思考这样一个问题

我们要查询自己系统的一个表,则首先是去数据字典中找到该表的结构性信息
这些结构性信息存储在数据字典表中,但我们又从哪里获得数据字典表本身的结构性信息呢?

虽然从表中我们可以查询到字典表本身的结构性信息,那在数据库open的时候最初是如何确定结构的?
是写死在程序中呢?还是怎样处理的

由上面内容我们可以看出,程序中只要提供 bootstrap$ 的创建脚本,确定好bootstap$的结构同时指定了段头的位置
然后就能通过段头去获取bootstrap$中的内容,而这些内容就是为一些字典表创建结构的sql_text
这样就因了bootstrap$这个天生的蛋,孵化出了c_obj#,tab$等等鸡,这些鸡又继续生蛋,则完成了数据库字典表结构的建立

也就是说,oracle用关系型表来实现了自身结构的建立


trace 结果参考附件

超级版主

天下有雪

精华贴数
66
技术积分
208411
社区积分
6479
注册时间
2001-10-8
论坛徽章:
100
ITPUB元老
日期:2005-02-28 12:57:00ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36现任管理团队成员
日期:2011-05-07 01:45:08ITPUB9周年纪念徽章
日期:2010-10-08 09:28:52ITPUB技术丛书作者
日期:2010-09-26 15:00:232010系统架构师大会纪念
日期:2010-09-03 16:39:572010数据库技术大会纪念徽章
日期:2010-05-13 10:04:282009架构师大会纪念徽章
日期:2010-01-18 13:43:21祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB8周年纪念徽章
日期:2009-09-27 10:21:212009日食纪念
日期:2009-07-22 09:30:00参与2009年中国云计算大会纪念
日期:2009-06-05 10:02:28
发表于 2004-2-27 19:38:40 |显示全部楼层
这个东西是很有意思的,有助于深入理解数据库的本质

开天辟地,这就是那个1啊!

使用道具 举报

注册会员

中级会员

精华贴数
0
技术积分
660
社区积分
577
注册时间
2002-11-4
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
发表于 2004-2-27 20:50:25 |显示全部楼层

深表配服!

向這種求真,求實的人致敬﹗

使用道具 举报

版主

版主

精华贴数
6
技术积分
3985
社区积分
7408
注册时间
2002-7-30
论坛徽章:
55
管理团队2006纪念徽章
日期:2006-04-16 22:44:45管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:01ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24会员2006贡献徽章
日期:2006-04-17 13:46:34蛋疼蛋
日期:2011-08-02 12:31:13
发表于 2004-3-3 22:21:00 |显示全部楼层
在家用小猫看完这贴!

使用道具 举报

版主

版主

精华贴数
32
技术积分
53884
社区积分
6677
注册时间
2001-12-18
论坛徽章:
48
2007年度最佳版主
日期:2008-04-03 16:46:152011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:42:48现任管理团队成员
日期:2011-05-07 01:45:08双黄蛋
日期:2011-06-15 17:03:342012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:52ITPUB技术丛书作者
日期:2010-09-26 15:24:56
发表于 2004-3-6 21:00:29 |显示全部楼层
和操作系统的 init  很神似

这帖子不错!

使用道具 举报

版主

版主

精华贴数
3
技术积分
9663
社区积分
196
注册时间
2001-10-9
论坛徽章:
23
ITPUB元老
日期:2005-02-28 12:57:002011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:43:33ITPUB年度最佳技术回答奖
日期:2011-04-08 18:37:39现任管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412011新春纪念徽章
日期:2011-01-04 10:24:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51
发表于 2004-3-17 03:30:21 |显示全部楼层

Re: 关于数据库open的深入探究

最初由 biti_rainy 发布
[B]...
CREATE CLUSTER C_OBJ#("OBJ#" NUMBER) PCTFREE 5 PCTUSED 40 INITRANS 2 MAXTRANS
  255 STORAGE (  INITIAL 136K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 OBJNO 2 EXTENTS (FILE 1 BLOCK 25)) SIZE 800
这里的extents 指明了是 block 25,我们假设在初始化参数文件中db_block_size设置不当,则必然导致文件位置定位错误
[/B]


Very impressive research!

By "我们假设在初始化参数文件中db_block_size设置不当,则必然导致文件位置定位错误", I think you mean if db_block_size is 4k, you can't say 8k in spfile (or pfile), otherwise you would get database corruption. Of course nobody would be so insane to do so. But I just tried it on my test database (9.2.0.1.0 on XP). I was not able to startup. I got ORA-00209: control file blocksize mismatch, check alert log for more info. So looks like even if you want to change db_block_size, you cannot.

By the way, the create cluster SQL with objno and extents (file block) in the storage clause looks interesting. I tried to use those keywords but always get ORA-900 invalid SQL statement. There're some operations Oracle internally can do but we cannot in SQL*Plus. This is one example. Others are like alter database dismount or alter database close (the latter may work with anomaly), which you see in alert.log, and select piece from sys.idl_sb4$ (sometimes seen in v$sql or SQL trace).

Yong Huang

使用道具 举报

超级版主

天下有雪

精华贴数
66
技术积分
208411
社区积分
6479
注册时间
2001-10-8
论坛徽章:
100
ITPUB元老
日期:2005-02-28 12:57:00ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36现任管理团队成员
日期:2011-05-07 01:45:08ITPUB9周年纪念徽章
日期:2010-10-08 09:28:52ITPUB技术丛书作者
日期:2010-09-26 15:00:232010系统架构师大会纪念
日期:2010-09-03 16:39:572010数据库技术大会纪念徽章
日期:2010-05-13 10:04:282009架构师大会纪念徽章
日期:2010-01-18 13:43:21祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB8周年纪念徽章
日期:2009-09-27 10:21:212009日食纪念
日期:2009-07-22 09:30:00参与2009年中国云计算大会纪念
日期:2009-06-05 10:02:28
发表于 2004-3-23 17:04:19 |显示全部楼层

Re: Re: 关于数据库open的深入探究

最初由 Yong Huang 发布
[B]

There're some operations Oracle internally can do but we cannot in SQL*Plus. This is one example. Others are like alter database dismount or alter database close (the latter may work with anomaly), which you see in alert.log, and select piece from sys.idl_sb4$ (sometimes seen in v$sql or SQL trace).

Yong Huang [/B]


From Oracle9i,Following command can be use in sql*plus under some condition:
alter database close;
alter database dismount;

For example:



SQL> startup open;
ORACLE instance started.

Total System Global Area  131142648 bytes
Fixed Size                   451576 bytes
Variable Size             104857600 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
Database mounted.
Database opened.
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
PL/SQL Release 9.2.0.3.0 - Production
CORE    9.2.0.3.0       Production
TNS for Linux: Version 9.2.0.3.0 - Production
NLSRTL Version 9.2.0.3.0 - Production

SQL>
SQL> alter database close;

Database altered.

SQL> alter database dismount;

Database altered.

SQL> alter database mount;

Database altered.

SQL> shutdown         
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.

使用道具 举报

版主

版主

精华贴数
3
技术积分
9663
社区积分
196
注册时间
2001-10-9
论坛徽章:
23
ITPUB元老
日期:2005-02-28 12:57:002011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:43:33ITPUB年度最佳技术回答奖
日期:2011-04-08 18:37:39现任管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412011新春纪念徽章
日期:2011-01-04 10:24:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51
发表于 2004-3-23 19:15:08 |显示全部楼层

Re: Re: Re: 关于数据库open的深入探究

最初由 eygle 发布
[B]
From Oracle9i,Following command can be use in sql*plus under some condition:
alter database close;
alter database dismount;
...
SQL> alter database close;

Database altered.

SQL> alter database dismount;

Database altered.

SQL> alter database mount;

Database altered.

SQL> shutdown         
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down. [/B]


Actually, I really should say "alter database close" or "dismount" works without complaint from Oracle. But they don't seem to be the exact reverse of alter database open and mount, respectively. For instance, (tested in 8.1.7.0 and 9i both releases), after these commands, you can't alter database open (if dismounted, you have to mount first of course). Alter database open would return ORA-1531 ("a database already open by the instance". I wish it was just me that didn't find the trick yet. It would be nice to have exactly the reverse of nomount, mount and open for startup command.

By the way, info in sys.idl_sb4$ seems to be available only by dumping data blocks. Pete Finnigan (petefinnigan.com) told me UPI programming may reveal the content. He's an Oracle security guy.

Yong Huang

使用道具 举报

版主

版主

精华贴数
3
技术积分
9663
社区积分
196
注册时间
2001-10-9
论坛徽章:
23
ITPUB元老
日期:2005-02-28 12:57:002011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:43:33ITPUB年度最佳技术回答奖
日期:2011-04-08 18:37:39现任管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412011新春纪念徽章
日期:2011-01-04 10:24:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51
发表于 2004-3-23 19:23:02 |显示全部楼层

Re: 关于数据库open的深入探究

最初由 biti_rainy 发布
[B]首先我们来参考跟踪文件的前部分(参考附件)
这是第一个对象的创建
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))
...
[/B]


biti_rainy's research worked up my appetite. In case biti knows, (what's biti's real name anyway!), do you know what Oracle really does to the physical database? By that I mean, Oracle apparently did NOT really create the bootstrap$, tab$ and others every time the database is opened. Otherwise, a trace of database shutdown should show corresponding drop of those tables and clusters. I traced it and didn't find those drop statements. It's also hard to believe a potentially huge table tab$ is always recreated whenever the database is opened. So those tables bootstrap$, tab$ etc. "created" at the database open time are already in SYSTEM tablespace. But SGA needs information for the instance to work properly. However, even that is a puzzle to me, because you won't find those create table bootstrap$ statement in library cache (v$sql) and there's no alter system flush shared pool in there either.

Yong Huang

使用道具 举报

版主

版主

精华贴数
32
技术积分
53884
社区积分
6677
注册时间
2001-12-18
论坛徽章:
48
2007年度最佳版主
日期:2008-04-03 16:46:152011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:42:48现任管理团队成员
日期:2011-05-07 01:45:08双黄蛋
日期:2011-06-15 17:03:342012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:52ITPUB技术丛书作者
日期:2010-09-26 15:24:56
发表于 2004-3-31 17:57:52 |显示全部楼层
[php]
create table bootstrap$
( line#         number not null,                       /* statement order id */
  obj#          number not null,                            /* object number */
  sql_text      varchar2("M_VCSZ" not null)                    /* statement */
  storage (initial 50K)            /* to avoid space management during IOR I */
//                                            /* "//" required for bootstrap */


[/php]

使用道具 举报

相关内容推荐
您需要登录后才可以回帖 登录 | 注册

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 邮箱 虎吧 老博客 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
回顶部