關於資料庫open的深入探究(轉)
關於資料庫open的深入探究(轉)[@more@]關於資料庫open的深入探究 SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area 131142648 bytesFixed Size 451576 bytesVariable Size 104857600 bytesDatabase Buffers 25165824 bytesRedo Buffers 667648 bytesDatabase 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 frombootstrap$ where obj# != :1(這裡實際上是逐步提取內容建立字典表本身的結構,根據後面內容可知)那麼在這裡我們在資料庫中來看看 bootstap$SQL> desc bootstrap$Name Null? Type----------------------------------------- -------- ----------------------------LINE# NOT NULL NUMBEROBJ# NOT NULL NUMBERSQL_TEXT NOT NULL VARCHAR2(4000)SQL> SQL> select count(*) from bootstrap$;57SQL> SQL> select obj#,sql_text from bootstrap$ where rownum<11;-18.0.0.0.00CREATE ROLLBACK SEGMENT SYSTEM STORAGE ( INITIAL 112K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 32765 OBJNO 0 EXTENTS (FILE 1 BLOCK 9))8CREATE CLUSTER C_FILE#_BLOCK#("TS#" NUMBER,"SEGFILE#" NUMBER,"SEGBLOCK#" NUMBER)PCTFREE 10 PCTUSED 40 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 24K NEXT 1024KMINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 8 EXTENTS (FILE 1 BLOCK73)) SIZE 2259CREATE INDEX I_FILE#_BLOCK# ON CLUSTER C_FILE#_BLOCK# PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 9 EXTENTS (FILE 1 BLOCK 81))14CREATE TABLE SEG$("FILE#" NUMBER NOT NULL,"BLOCK#" NUMBER NOT NULL,"TYPE#" NUMBER NOT NULL,"TS#" NUMBER NOT NULL,"BLOCKS" NUMBER NOT NULL,"EXTENTS" NUMBER NOT NULL,"INIEXTS" NUMBER NOT NULL,"MINEXTS" NUMBER NOT NULL,"MAXEXTS" NUMBER NOT NULL,"EXTSIZE" NUMBER NOT NULL,"EXTPCT" NUMBER NOT NULL,"USER#" NUMBER NOT NULL,"LISTS" NUMBER,"GROUPS" NUMBER,"BITMAPRANGES" NUMBER NOT NULL,"CACHEHINT" NUMBER NOT NULL,"SCANHINT" NUMBER NOT NULL,"HWMINCR" NUMBER NOT NULL,"SPARE1" NUMBER,"SPARE2" NUMBER) STORAGE ( OBJNO 14 TABNO 2) CLUSTER C_FILE#_BLOCK#(TS#,FILE#,BLOCK#)5CREATE TABLE CLU$("OBJ#" NUMBER NOT NULL,"DATAOBJ#" NUMBER,"TS#" NUMBER NOT NULL,"FILE#" NUMBER NOT NULL,"BLOCK#" NUMBER NOT NULL,"COLS" NUMBER NOT NULL,"PCTFREE$" NUMBER NOT NULL,"PCTUSED$" NUMBER NOT NULL,"INITRANS" NUMBER NOT NULL,"MAXTRANS" NUMBER NOT NULL,"SIZE$" NUMBER,"HASHFUNC" VARCHAR2(30),"HASHKEYS" NUMBER,"FUNC" NUMBER,"EXTIND" NUMBER,"FLAGS" NUMBER,"DEGREE" NUMBER,"INSTANCES" NUMBER,"AVGCHN" NUMBER,"SPARE1" NUMBER,"SPARE2" NUMBER,"SPARE3" NUMBER,"SPARE4" NUMBER,"SPARE5" VARCHAR2(1000),"SPARE6" VARCHAR2(1000),"SPARE7" DATE) STORAGE ( OBJNO 5TABNO 2) CLUSTER C_OBJ#(OBJ#)6CREATE CLUSTER C_TS#("TS#" NUMBER) PCTFREE 10 PCTUSED 40 INITRANS 2 MAXTRANS 255STORAGE ( INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 6 EXTENTS (FILE 1 BLOCK 57))7CREATE INDEX I_TS# ON CLUSTER C_TS# PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE (INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO7 EXTENTS (FILE 1 BLOCK 65))18CREATE TABLE OBJ$("OBJ#" NUMBER NOT NULL,"DATAOBJ#" NUMBER,"OWNER#" NUMBER NOT NULL,"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" VARCHAR2(128),"FLAGS" NUMBER,"OID$" RAW(16),"SPARE1" NUMBER,"SPARE2" NUMBER,"SPARE3" NUMBER,"SPARE4" VARCHAR2(1000),"SPARE5" VARCHAR2(1000),"SPARE6" DATE) PCTFREE10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 16K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 18 EXTENTS (FILE 1 BLOCK 121))36CREATE UNIQUE INDEX I_OBJ1 ON OBJ$(OBJ#) PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 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 25SQL> select file_id,block_id from dba_extents where segment_name = 'C_OBJ#';1 251 331 411 32411 44411 44731 44891 45131 45291 45611 45851 46091 46411 46811 47531 48331 48731 126811 236891 2624920 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 137 1 0 0 0 0 17-------------------------------- 921 428 832381 0 139 6368 7 11-AUG-03 92137 37 1024 0 006-AUG-03SQL> 由這裡可以看出,儲存引數從這裡開始,就從資料檔案中固定表的記錄中取出來由此再往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用關係型表來實現了自身結構的建
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-942878/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫關於SQL的執行計劃(轉)Oracle資料庫SQL
- 3.3.1 關於關閉資料庫資料庫
- 關於new Object的探究Object
- 2.5.1 關於建立資料庫的子句資料庫
- 關於資料庫鎖的總結資料庫
- 2.1 關於建立資料庫資料庫
- 關於資料隱私的文化轉變
- 關於檔案的open方法
- 2.8.1.1 關於資料庫服務資料庫
- 關於IOS物件的小事的探究iOS物件
- 關於 phpMyAdmin 管理 Homestead MySQL 資料庫的配置PHPMySql資料庫
- 關於資料庫 statistics_level的介紹資料庫
- 關於Oracle資料庫的時間查詢Oracle資料庫
- 關於mongodb資料庫的增刪改查MongoDB資料庫
- 關於資料庫壓力測試的故事資料庫
- 關於資料庫壓縮技術的Survey資料庫
- 關於mac地址的淺顯探究Mac
- 關於oracle資料庫全形數字轉換半形數字方法Oracle資料庫
- 資料庫SQL語句中關於explain關鍵字的用法資料庫SQLAI
- 關於oracle資料庫訊號量的問題Oracle資料庫
- IndexedDB.open()開啟與新建資料庫Index資料庫
- IndexedDB.open() 開啟與新建資料庫Index資料庫
- 關於 sqlmap 注入的疑惑,sqlmap 是如何拿到資料庫資料的呢?SQL資料庫
- 關於layer.open彈框
- 【虹科乾貨】關於JSON資料庫JSON資料庫
- 2.5.10.2 關於資料庫時區檔案資料庫
- 1.4.1. 關於Oracle 資料庫版本號Oracle資料庫
- 3.1.5.1 關於啟動資料庫例項資料庫
- 關於BSS資料化轉型的幾點討論
- SQLite資料庫損壞及其修復探究SQLite資料庫
- 一個關於wait/notify與鎖關係的探究AI
- 關於資料庫查詢業務的幾點思考資料庫
- .NET關於資料庫操作的類-囊括所有的操作資料庫
- 關於 SAP HANA 資料庫的死鎖問題(deadlock)資料庫
- 關於資料庫索引,必須掌握的知識點資料庫索引
- 關於redis快取資料庫的一些思考Redis快取資料庫
- 關於SQL Server 映象資料庫快照的建立及使用SQLServer資料庫
- 從32位資料庫還原到64bit資料庫open的時候報錯資料庫
- 關於 iconv 轉碼導致資料丟失的問題