1. 程式人生 > >Oracle_高級功能(4) 數據庫存儲結構

Oracle_高級功能(4) 數據庫存儲結構

free 進制 修改表 恢復 刪除表空間 重做 需要 cat 足夠

數據庫存儲結構
分為:物理存儲結構和邏輯存儲結構。
物理結構和邏輯結構分開,對物理數據的存儲不會影響對邏輯結構的訪問。
1.物理存儲結構
數據庫文件
os block
2.邏輯存儲結構
tablespace 表空間
segment 段
extend 擴展區
db block 數據塊(8k)
2.1創建表空間
create tablespace <ts_name> datafile ‘<file>‘ size <n> reuse autoextend on next <n>;
舉例:
create tablespace ts_finds datafile ‘E:\app\oradata\orcl\ts_finds01.DBF‘ size 100M

reuse autoextend on next 10M;

2.2 修改表空間
--增加數據文件
alter tablespace <ts_name> add datafile ‘<file>‘ size <n>
reuse autoextend on next <n>;
舉例:
alter tablespace ts_finds add datafile ‘E:\app\oradata\orcl\ts_finds02.DBF‘ size 10M
reuse autoextend on next 10M;
--擴展已有數據文件的大小
alter database datafile ‘<file>‘ resize <n>;

舉例:
alter database datafile ‘E:\app\oradata\orcl\ts_finds02.DBF‘ resize 50M;

2.3 刪除表空間
drop tablespace <ts_name> including contents;
舉例:
drop tablespace ts_finds including contents;

3.關系
Tablespace -->data file
Segment
extent -->
db block -->os block

一個Tablespace可以有多個data file(最多64K個),一個data file只能屬於一個Tablespace;

一個Tablespace可以有多個Segment,一個Segment只能屬於一個Tablespace;
一個Segment可以有多個extent,一個extend只能屬於一個Segment;
一個extent可以有多個db block(一般是8個),一個db block只能屬於一個extent;
一個db block可以有多個os block(db block是8k,os block一般是2k),一個os block只能屬於一個db block;
一個data file可以存儲多個Segment,一個Segment可以存儲在多個data file中;
一個data file包含多個extent,一個extent只能屬於一個data file中。

4.數據字典
select * from dba_tablespaces;
select * from dba_data_files;
select * from dba_temp_files;
select * from dba_segments where segment_name=‘EMP‘;
select * from dba_extents where segment_name=‘EMP‘;
select * from dba_extents where file_id=4

--清空回收站
purge recyclebin;

5、數據庫文件
數據庫文件包括:數據文件、臨時文件、控制文件、聯機重做日誌文件。
數據文件是磁盤上的一個物理文件,由Oracle 數據庫創建,
並包含如表和索引之類的數據結構。
臨時數據文件是一個屬於臨時表空間的數據文件,主要用於排序操作。
控制文件是一個跟蹤數據庫的物理組件的根文件。
聯機重做日誌文件是一組包含對數據所做的更改記錄的文件。
數據按Oracle 專有格式寫入這些文件,且不能由其他程序讀取。

6.數據文件
數據文件就是用來存表、索引等具體數據記錄的數據庫文件。
數據文件頭包含數據文件的元數據,例如數據文件大小和檢查點SCN。
每個文件頭包含一個絕對文件號和一個相對文件號。
絕對文件號唯一地標識數據庫內的數據文件。
相對文件號唯一地標識表空間內的數據文件。
當Oracle 數據庫剛創建一個數據文件時,分配的磁盤空間已格式化,但不包含任何用戶數據。
但是,數據庫會保留此空間,將來用於容納其相關聯的表空間中的數據段。
隨著表空間中的數據增長,Oracle 數據庫將用數據文件中的可用空間來為段分配擴展區。
擴展區要麽是已使用的,即包含段數據;要麽空閑的,即可以重用。
datafile
datafile header
extend used
extend free
extend free(之前被使用,現在已釋放)

7、控制文件
數據庫控制文件是一個二進制文件,僅與一個數據庫相關聯。
每個數據庫有一個唯一的控制文件(如果有多個的話,內容是相同,為了備份)。
控制文件是Oracle 數據庫用來查找數據庫文件,並從總體上管理數據庫狀態的根文件。
select * from v$database
控制文件包含以下信息:
數據庫名稱和數據庫唯一標識符(DBID)
創建數據庫的時間戳
有關數據文件、 聯機重做日誌文件、和歸檔重做日誌文件的信息
表空間信息
RMAN備份
控制文件用於數據庫的啟動和恢復。
在數據庫使用期間, Oracle 數據庫不斷讀取和寫入控制文件,
並且只要數據庫處於打開狀態,控制文件就必須是可用的,以便可以寫入。
Oracle 數據庫對同一數據庫啟用多個完全相同的控制文件,並同時打開和寫入。
通過在不同的磁盤上多路復用控制文件,數據庫可以實現冗余,從而避免單點故障。
如果控制文件變得不可用,則當數據庫實例嘗試訪問已損壞的控制文件時,會遭遇失敗。
當其他的當前控制文件副本存在時,可以重新裝入數據庫並打開,而不需進行介質恢復。
如果數據庫的所有控制文件都丟失了,那麽,實例會失敗,且需要進行介質恢復。

只有數據庫可以修改控制文件中的信息。
查詢 V$DATABASE獲取數據庫名稱和 DBID。

8、聯機重做日誌
聯機重做日誌由兩個或多個預分配文件組成,用於存儲數據庫發生的更改。
聯機重做日誌用於記錄對數據文件的更改。
數據庫維護聯機重做日誌文件,以防止數據丟失。
具體來說,在一個實例失敗後,
聯機重做日誌文件使Oracle 數據庫可以恢復已提交但尚未寫入數據文件的數據。
Oracle 數據庫將每個事務同步地寫入重做日誌緩沖區,然後將其寫入到聯機重做日誌。
Oracle 數據庫使用聯機重做日誌的唯一目的是為了恢復。

聯機重做日誌有一個重做線程。
一個聯機重做日誌包含兩個或更多聯機重做日誌文件。
Oracle 數據庫一次只使用一個聯機重做日誌文件來存儲從重做日誌緩沖區寫入的記錄。
正在由日誌寫入器(LGWR) 進程寫入的聯機重做日誌文件稱為當前聯機重做日誌文件。
當數據庫停止向一個聯機重做日誌文件寫入,並開始向另一個寫入時,發生日誌切換。
切換發生在當前聯機重做日誌文件已滿,且必須繼續寫入時。
也可以手動強制日誌切換。
日誌寫入器以循環方式寫入聯機重做日誌文件。
當日誌寫入器填滿最後一個可用的聯機重做日誌文件時,該進程又向第一個日誌文件寫入,
如此反復使用。

聯機重做日誌文件包含重做記錄。重做記錄由一組更改向量組成,
每個向量描述對某數據塊的一個更改。
例如,對emp表中的sal的更新,將生成一個重做記錄,
描述對該表的數據段塊、 回滾段數據塊、和回滾段的事務表的更改。
重做日誌記錄了與更改相關的所有元數據,包括如下:
更改的SCN和時間戳
變更事務的事務 ID
事務提交時的SCN和時間戳(如果它已提交)
所做更改的操作類型
被修改的數據段的名稱和類型
select * from v$logfile;
select * from v$log;
--手動強制日誌切換
alter system switch logfile;


9、db block數據塊
一個邏輯數據塊對應於特定字節數的物理磁盤空間,比如 8 KB。
Oracle 數據庫以數據塊(也稱為 Oracle 塊或頁)為單位,來管理數據庫數據文件中的邏輯存儲空間。
數據塊是Oracle 數據庫可以使用和分配的最小存儲單位。

9.1 數據塊和操作系統塊
在物理級別,存儲在磁盤文件中的數據庫數據由操作系統塊組成。
操作系統塊是操作系統可以讀取或寫入的最小數據單位。
數據塊與操作系統塊的邏輯分離具有以下含義:
應用程序不需要確定磁盤上的數據的物理地址。
數據庫數據可以在多個物理磁盤上進行存儲和備份。

9.2 數據塊大小 默認8K,
db_block_size 初始化參數在數據庫被創建時設置其數據塊大小。
不能更改數據庫的塊大小,除非重新創建數據庫。
如果數據塊和操作系統塊的大小不同,則數據塊大小必須是操作系統塊大小的整數倍。
select * from v$parameter where lower(name)=‘db_block_size‘;

9.3 數據塊格式
每個數據塊有一個格式或內部結構,使得數據庫能夠跟蹤塊中的數據和可用空間。
9.3.1 數據塊開銷(塊頭)
Oracle 數據庫使用塊開銷來管理塊本身。塊開銷不能用來存儲用戶數據。
塊開銷包含關於塊的一般信息,包括磁盤地址和段類型。
對於事務管理塊,其塊頭包含活動的和歷史的事務信息。
塊開銷的某些部分是大小固定的,但總的大小是可變的。
平均起來,塊開銷總計在 84到107字節左右。

9.3.2 行格式
塊的行數據部分包含實際數據,如表行或索引鍵條目等。
正如每個數據塊具有一個內部的格式,每一行也有一個行格式,使得數據庫能夠跟蹤行中的數據。
Oracle 數據庫以可變長度記錄形式來存儲行。
行包含在一個或多個行片斷中。每個行片斷有一個行頭和列數據。

行頭
行頭至少占用3個字節。
Oracle數據庫使用行頭來管理存儲在塊中的行片斷。
數據塊中通常每行只包含一個行片斷。
如果整個行可以插入到一個數據塊中,則Oracle數據庫將該行存儲為一個行片斷。
但是,如果所有行數據不能插入一個單一的塊,或者一個更新導致現有的行不能容納在原來的塊中,
則數據庫將該行存儲為多個行片斷。
Oracle 數據庫在一個行片斷中只能存儲 255 的列。
因此,如果你在具有1000個列的表中插入行,則數據庫將創建 4個行片斷,通常會鏈接多個塊。

列數據
在行頭之後的列數據部分存儲行中的實際數據。
行片斷通常按create table語句中列的順序來存儲列,但這個順序並不總是能保證的。
如,long類型列總是在最後。
對行片斷中的每一列, Oracle 數據庫獨立地存儲列長度和列數據。所需的空間取決於數據類型。
如果列的數據類型是可變長度的,則用於容納一個值所需的空間可能在其數據被更新時會增長和收縮。
每一行都在數據塊標頭的行目錄中有一個槽位。槽位指向行的開始部分。

9.3.3 Rowid格式
Oracle 數據庫使用一個rowid唯一地標識一行。
在內部,rowid 是一個結構,用於保存數據庫訪問行所需要的信息。
一個 rowid 並不物理地存儲在數據庫中,
而是從存儲數據的文件和塊推導而來的。
這種rowid 類型使用每個行的物理地址的 64進位編碼。
編碼的字符為 A-Z、a-z、0-9、+、和/。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
一個擴展 rowid 以一個四段式格式顯示,OOOOOOFFFBBBBBBRRR,
此格式分為以下幾個組件
OOOOOO 數據對象號標識段,。數據庫中的每個段都被分配了一個數據對象號。同一段中的模式對象具有相同的數據對象號。
FFF 表空間相對數據文件號,標識包含行的數據文件
BBBBBB 數據塊號標識包含行的塊。塊號是相對於他們的數據文件的,而不是其表空間。因此,具有相同塊號的兩行,可以駐留在同一表空間的不同數據文件中。
RRR 行號標識塊中的行。
select rowid,e.* from scott.emp e;
select rowid,e.* from scott.dept e;

select * from dba_extents where segment_name=‘DEPT‘;
select * from dba_extents where segment_name=‘EMP‘;
CX= 2*64+23=151 =144
CH =2*64+7=135 =128

select
dbms_rowid.rowid_object(rowid) obj#,
dbms_rowid.rowid_relative_fno(rowid) rfile#,
dbms_rowid.rowid_block_number(rowid) block#,
dbms_rowid.rowid_row_number(rowid) row#,
dbms_rowid.rowid_to_absolute_fno(rowid,‘SCOTT‘,‘EMP‘) file#
from scott.emp;

9.4 數據塊的空間管理
隨著數據庫從底向上不斷填充數據塊,在行數據和塊頭之間的可用空間就會逐漸減少。
在更新期間,當將一個尾部空值更改為非空值時,可用空間也會變少。
數據庫會管理數據塊中的可用空間,以優化性能並避免空間浪費。
9.4.1 數據塊中的可用空間百分比
pctfree 存儲參數設置了為更新現有的行而保留的可用空間最小百分比。
pctfree 對於防止行遷移並避免空間浪費非常重要。
數據庫不斷將行添加到塊,將導致行數據朝著塊頭方向向上不斷增長,而塊頭本身又朝行數據方向向下不斷擴大。
設置pctfree 存儲參數確保至少10%的數據塊是空閑的。

insert 語句和update(由小改大)語句 會占用空間;
delete 語句和update(由大改小)語句 會釋放空間。
釋放的空間將產生磁盤碎片。
只有在滿足以下條件時,Oracle 數據庫才會自動且透明地合並數據塊中的可用空間,
INSERT或UPDATE語句試圖使用的塊,包含足夠的可用空間來容納新的行片斷。
可用空間已被碎片化,以至於該行片斷不能插入到塊中的某一個連續區域。

create table EMP
(
EMPNO NUMBER(4) not null,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);

10、extend 擴展區
擴展區是一組邏輯上連續的數據塊,被分配來用於存儲特定類型的信息。
一般由8(128/1024)個db block組成一個extend。
擴展區是數據庫存儲空間分配的邏輯單位,由多個連續數據塊組成。
在一個擴展區中的數據塊在邏輯上是連續的,但在物理上可能是分散分布。

10.1 分配擴展區
在默認情況下,在數據段被創建時,數據庫會為數據段分配一個初始擴展區。
一個擴展區總是包含在一個數據文件中。
如果初始擴展區滿了,並需要更多空間時,則數據庫自動為該段分配一個增量擴展區。
一個增量擴展區是為該段創建的後續擴展區。
分配算法取決於表空間是本地管理的還是字典管理的。
對於本地管理表空間,數據庫搜索一個數據文件的位圖,以查找相鄰的可用數據塊。
如果該數據文件中沒有足夠的空間,則數據庫到另一個數據文件中查找。
一個段的擴展區始終位於同一表空間中,但可能在不同的數據文件中。
新分配給擴展區的塊,舊數據並未清空,只有當Oracle 數據庫開始使用這些塊時,
才會根據需要將其格式化。

10.2 釋放擴展區
使用 DROP 命令刪除表或索引時,表或索引段的擴展區會返回給表空間。
截斷表 truncate table emp;
truncate與delete區別:
truncate屬於DDL語言,delete屬於DML語言;
truncate不記redo_log,delete記redo_log;
truncate只能用於刪除全表數據,delete可以根據where條件來刪除;
truncate速度快,delete只能用於少量(10萬行)數據的刪除;
truncate刪除完成後數據不能恢復,delete可以恢復;
truncate是回收原有的extend,重新分配一個新的extend,delete不影響原有的extend。

10.3 擴展區的存儲參數
每一個段是由擴展區表示的存儲參數來定義的。
這些參數控制 Oracle 數據庫如何為段分配可用空間。
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);

11、segment 段
段是為一個特定數據庫對象(如一個表)分配的一組擴展區。
EMP表的數據存儲在其自己的數據段中,而該表的每個索引存儲在其自己的索引段中。
會消耗存儲空間的每個數據庫對象都由單個段組成。
每個段屬於且僅屬於一個表空間。
一個段的所有擴展區存儲在相同的表空間中。
在一個表空間中,一個段可以包括多個數據文件中的擴展區。
單個擴展區絕不會跨越多個數據文件。

11.1 用戶段
在數據庫中的單個數據段用於存儲一個用戶對象的數據,如表、索引。
默認情況下,數據庫使用延遲的段創建,當創建表和索引時,僅更新數據庫元數據。
在用戶向表或分區中插入第一行時,數據庫才創建表和索引段等。
延遲的段創建使系統能夠避免不必要地使用數據庫資源。
表段與其索引段可以不在同一個的表空間中。

11.2 臨時段
臨時段是系統創建的,用於查詢時的排序操作。
臨時段在臨時表空間內,還對應有一個臨時數據文件。
Oracle 數據庫在用戶會話期間,根據需要為查詢分配臨時段,並在查詢完成後將其刪除。
除了會記錄在臨時段上的空間管理操作,臨時段的更改不會記錄在聯機重做日誌中。
數據庫在分配給用戶的臨時表空間中創建臨時段。
表空間的默認存儲特性決定了臨時段中的擴展區特征。

12、tablespace 表空間
表空間是段的邏輯存儲容器。
段是占用存儲空間的數據庫對象,如表和索引。
在物理級別,表空間將數據存儲在一個或多個數據文件或臨時文件中。
數據庫必須有SYSTEM和 SYSAUX表空間。
用戶需要創建至少一個表空間來存儲應用程序數據。

表空間類型:
本地管理表空間 (默認值)
數據庫使用表空間本身中的位圖來管理擴展區。
因此,本地管理表空間需要預留表空間的一部分用於位圖。
在一個表空間中,數據庫可以使用自動段空間管理 (ASSM) 或手動段空間管理 (MSSM)來管理段 。
字典管理表空間
數據庫使用數據字典來管理擴展區。
12.1 本地管理表空間
本地管理表空間在數據文件頭中維護一個位圖,以跟蹤數據文件體中的可用空間和已用空間。
每一位對應一組塊。當空間被分配或釋放時,Oracle 數據庫更改位圖值,以反映數據塊的新狀態。
本地管理表空間優勢:
避免使用數據字典來管理擴展區
如果消耗或釋放一個擴展區會導致在數據字典表或撤消段中消耗或釋放空間,則在字典管理的表空間中會發生遞歸操作。
自動跟蹤相鄰的可用空間
通過這種方式,數據庫消除了合並空閑擴展區的需要。
自動確定本地管理擴展區的大小
在本地管理表空間中所有的擴展區可以具有相同的大小,並覆蓋對象存儲選項。
Oracle 強烈建議使用自動段空間管理的本地管理表空間。
默認情況下,Oracle 數據庫將所有新創建的用戶表空間設置為本地管理表空間。
字典管理表空間已經過時,不再使用了。

12.2 SYSTEM表空間
SYSTEM表空間是在數據庫被創建時就包括的一個必要的管理性表空間。
Oracle 數據庫使用SYSTEM來管理數據庫。
SYSTEM表空間包括以下信息,全部都由SYS 用戶所擁有
數據字典
包含數據庫管理信息的表和視圖
已編譯的存儲對象,如觸發器、 過程、和包等
默認情況下,Oracle 數據庫將所有新創建的用戶表空間設置為本地管理表空間。
在SYSTEM為本地管理表空間的數據庫中,不能創建字典管理表空間 (這已經過時)。

12.3 SYSAUX表空間
SYSAUX 表空間是SYSTEM表空間的一個輔助表空間。
SYSAUX 表空間為未駐留在SYSTEM表空間的數據庫元數據提供了一個集中的位置。
它減少了在種子數據庫和用戶定義的數據庫中缺省創建的表空間數量。

12.4 UNDOTBS1表空間
撤消表空間是為系統管理的撤消數據而保留的一個本地管理表空間。
與其他永久表空間類似,撤消表空間也包含數據文件。
在這些文件中的撤消塊被分組為一些擴展區。
新安裝的 Oracle 數據庫會自動創建一個撤消表空間。

撤消保留期是 Oracle 數據庫在覆蓋舊的撤消數據之前嘗試對其保留的最小時間量。
撤消保留很重要,因為長時間運行的查詢可能需要舊數據塊前鏡像以提供讀取一致性。
此外,某些 Oracle 閃回功能也可能會依賴於撤消數據的可用性。
應該盡可能保留舊的撤消數據。
事務提交後,撤消數據對於回滾或恢復事務不再是必需的。
如果撤消表空間還有足夠空間用於新事務,數據庫可能會保留舊的撤消數據。
當可用空間偏低時,數據庫開始覆蓋已提交事務的舊撤消數據。

12.5 TEMP 臨時表空間
臨時表空間僅包含在會話期間存在的瞬態數據。永久模式對象不能駐留在臨時表空間中。
數據庫臨時表空間數據存儲在臨時文件中。
臨時表空間可以提高不適合在內存中進行的多個排序操作的並發性。
這些表空間也提高了在排序過程中空間管理的效率。

Oracle_高級功能(4) 數據庫存儲結構