1:表空間概念
在oracle資料庫中,所有資料從邏輯結構上看都是存放在表空間當中,當然表空間下還有段、區、塊等邏輯結構。從實體結構上看是放在資料檔案中。一個表空間可由多個資料檔案組成。
如下圖所示,一個資料庫由對應一個或多個表空間,表空間邏輯上有一個或多個段(segment)組成,實體上由一個或多個os file組成。
1.1基本的表空間
系統中預設建立的幾個表空間:
system
sysaux
users
undotbs1
example
temp
系統中必須的表空間有那幾個?
答案: system、sysaux、temp、undo, 像users、example等表空間是可有可無的。
1.2表空間的分類
永久表空間 存放永久性資料,如表,索引等。
臨時表空間 不能存放永久性對象,用于儲存資料庫排序,分組時産生的臨時資料。
undo表空間 儲存資料修改前的鏡象。
1.3表空間的管理
表空間的管理方式:
字典管理:全庫所有的空間配置設定都放在資料字典中。容易引起字典争用,而導緻性能問題。
本地管理:空間配置設定不放在資料字典,而在每個資料檔案頭部的第3到第8個塊的位圖塊,來管理空間配置設定。
2:建立表空間
3:表空間管理
3.1 表空間資訊
如何檢視資料庫有哪些表空間?如何檢視表空間對應的資料檔案?
檢視表空間:
檢視表空間可以通過下面幾個系統視圖檢視基本資訊
--包含資料庫中所有表空間的描述資訊
select * from dba_tablespaces
--包含目前使用者的表空間的描叙資訊
select * from user_tablespaces
--包含從控制檔案中擷取的表空間名稱和編号資訊
select * from v$tablespace;
檢視資料檔案
--包含資料檔案以及所屬的表空間的描述資訊
select * from dba_data_files
--包含臨時資料檔案以及所屬的表空間的描述資訊
select * from dba_temp_files
--包含從控制檔案中擷取的資料檔案的基本資訊,包括它所屬的表空間名稱、編号等
select * from v$datafile
--包含所有臨時資料檔案的基本資訊
select * from v$tempfile
3.1.1:檢視預設的temp表空間
資料庫級别
使用者級别
3.1.2:檢視預設的永久表空間
如果建立使用者時,不指定其永久表空間,則會使用預設的表空間。
3.1.3:檢視預設的表空間類型
如果不指定表空間類型,就會預設使用default_tbs_type參數指定的表空間類型。
3.1.4:檢視表空間情況
3.1.5:檢視表空間的資料檔案
永久表空間/undo表空間
select * from dba_data_files;
臨時表空間
select * from v$tempfile;
3.1.6:檢視表空間使用情況
--sql 1:
計算表空間使用情況(考慮了資料檔案自動增長情況)
3.2 預設表空間
在oracle
9i資料庫中,建立資料庫使用者時,如果沒有指定預設的永久性表空間,則系統使用systme表空間分别作為該使用者的預設永久表空間,預設的臨時表空間為
temp。在oracle
10/11g中,如果不指定預設永久性表空間,則是users.預設的臨時表空間為temp,當然前提是你沒有修改過預設永久表空間值或指定使用者的預設永
久性表空間。oracle允許使用自定義的表空間作為預設永久性表空間,你可以用下面sql檢視資料庫的預設永久表空間和預設臨時表空間
sql>select * from database_properties
where property_name = 'default_permanent_tablespace';
where property_name ='default_permanent_tablespace'
你可以使用alter database default tablespace語句可以設定資料庫的預設永久性表空間,這樣建立使用者時,預設将使用指定的表空間。
資料庫級别:
永久表空間
sql>alter database default tablespace user;
sql>alter database default temporary tablespace temp;
sql>alter user usernam default tablespace new_tablespace_name
檢視使用者對應的預設表空間
select username, default_tablespace from dba_users
注意事項:
1:如果我們在建立使用者時指定了預設表空間為default_permanent_tablespace的值,那麼在修改預設表空間後,之前使用者的預設表空間也會發生改變。
eg:
2:如果我們在建立使用者時沒有指定使用者表空間,那麼預設也會使用db的預設表空間,這時候如果我們修改了db的預設表空間,使用者的表空間也會發生改變。
将資料庫的預設表空間切換為users
3: 如果我們在建立使用者指定使用者的表空間是其他的表空間,那麼我們修改db的預設表空間不會影響使用者的表空間。
4: db的預設表空間不能删除,除非将預設表空間指向其他表空間之後才可以删除。
sql> drop tablespace users;
drop tablespace users
ora-12919: 不能删除預設永久表空間
5: 如果使用者的預設表空間指向其他的表空間,當這個表空間被drop 之後,使用者的預設表空間會自動指向db的預設表空間。
sql> drop tablespace test2;
3.3 删除表空間
除了system表空間外,資料庫中的任何
表空間可以删除。删除表空間時,oracle僅僅是在控制檔案和資料字典中删除與表空間和資料檔案相關的資訊。預設情況下,oracle并不會在操作操作
系統中删除相應的資料檔案,是以在成功執行删除表空間的操作後,需要手動删除該表空間在作業系統中對應的資料檔案。如果在删除表空間的同時要删除對應的數
據檔案,則必須顯示的指定including contents and
datafiles子句。注意:目前的資料庫級的預設表空間不能删除,使用者級的可以删除.否則會報錯:ora-12919: can not drop
the default permanent tablespace
drop tablespace 表空間名 [including contents [and datafiles] [cascade constraints]]
sql> drop tablespace urer01 including contents;
如果在表空間中包含資料庫對象,則必須在drop tablespace語句中顯示的指定including contents. 如果要再删除表空間user的同時删除它所對應的資料檔案,則可以使用下面的語句
sql>drop tablespace user01 including contents and datafiles;
注意:删除表空間時,contents與datafiles選項錯位,會報如下錯誤:
sql>drop tablespace tbs_stage_dat including datafiles and contents
ora-01911:contents keyword expected
sql>drop tablespace tbs_stage_dat including contents and datafiles
3.4 調整表空間
3.4.1 增加資料檔案
如果發現某個表空間存儲空間不足時,可以為表空間添加新的資料檔案,擴充表空間大小。但是一般建議預先估計表空間所需的存儲空間大小,然後為它建立若幹适當大小的資料檔案。
例子:
在添加新的資料檔案時,如果同名的作業系統已經存在,alter tablespace語句将失敗。如果要覆寫同名的作業系統檔案時,則必須在後面顯示的指定reuse子句。
sql> alter tablespace tbs_eds_dat
2 add datafile 'g:\datafile\tbs_eds_dat01.dbf'
3 size 100m
4 autoextend on
5 next 10k
6 maxsize 51200m;
alter tablespace tbs_eds_dat
*
第 1 行出現錯誤:
ora-03206: autoextend 子句中 (6553600) 塊的最大檔案大小超出範圍
oracle支援的資料檔案大小是由它的
db_block_size和db_block的數量決定的。其中db_block(oracle塊)的數量是一個定值
2**22-1(4194303).資料檔案大小容量=塊數量*塊大小。下面清單說明不同資料塊資料庫所能支援的最大實體檔案大小:
資料塊的大小 實體檔案的最大值m 實體檔案的最大值g
=============================================================================
2kb 8191m 8g
4kb 16383m 16g
8kb 32767m 32g
16kb 65535m 64g
32kb 131072m 128g
64kb 262144m 256g
3.4.2 調整資料檔案大小
重置資料檔案的大小
alter database datafile '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf'
resize 500m;
3.4.3 删除資料檔案
alter tablespace test
drop datafile '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf'
3.4.4 移動資料檔案
現在有這樣一個案例:以前資料庫伺服器隻有一個容量比較小得磁盤,資料檔案全部放在d盤,後來申請了一個1t的磁盤,需要給d盤騰出一些空間(d盤爆滿了),現在想移動一些大的資料檔案到1t的磁盤:
linux/unix下
3.4.5 資料檔案脫機
alter database datafile '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf' offline;
3.4.6 資料檔案聯機
alter database datafile '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf' online;
4:維護表空間
4.1 變更表空間狀态
表空間狀态有下面幾種狀态:online、offline、read only、read write。
若要檢視表空間的狀态,可以通過下面sql語句來檢視。
4.1.1 表空間脫機
sql>alter tablespace tbs_dm_dat offline immediate;
設定脫機狀态,可以使用下面4個參數來控制脫機方式
normal
該參數表示将表空間以正常方式切換到脫機狀态,在進入脫機狀态過程中,oracle會執行一次檢查點,
将sga區中與該表空間相關的髒緩存塊寫入資料檔案中,然後再關閉表空間的所有資料檔案。如果在這過程中沒有發生任何錯誤,則可以使用normal參數,
這也是預設的方式。
temporary 該參數将表空間以臨時方式切換到脫機狀态。這時oracle在執行檢查點時并不會檢查各個資料檔案的狀态,即使某些資料檔案處于不可用狀态,oracle也會忽略這些錯誤。這樣将表空間設定為聯機狀态時,可能需要進行資料恢複。
immediate 該參數将表空間以立即方式切換到脫機狀态,這時oracle不會執行檢查點,也不會檢查資料檔案是否可用。而是直接将屬于表空間的資料檔案設定為脫機狀态。下一次将表空間恢複為聯機狀态時必須進行資料庫恢複。
for recover 該參數将表空間以用于恢複方式切換到脫機狀态,如果要對表空間進行基于時間的恢複,可以使用這個參數将表空間切換到脫機狀态。
如果資料庫運作在非歸檔模式下
(noarchivelog),由于無法保留恢複表空間所需要的重做資料,是以不能将表空間以立即方式切換到脫機狀态。如果表空間脫機了,則查詢表空間下
的表,會報錯誤:ora-00376 此時無法讀取檔案 以及 ora-01110:資料檔案x......
注意:脫機(offline)一般用于資料庫的聯機備份,資料恢複等維護操作。有些表空間不能offline,如:sytem,undo等
1. sytem 不能offline,也不能read only
2. 目前的undo表空空間,不能offline,也不能read only
3. 目前的臨時表空間不能offline,也不能read only
4. sysaux可以offline 不能read only
sql> alter tablespace system offline;
alter tablespace system offline
ora-01541: system tablespace cannot be brought offline; shut down if necessary
4.1.2 表空間聯機
sql> alter tablespace tbs_dm_dat online;
4.1.3 表空間隻讀
sql>alter tablespace tbs_dm_dat ready only;
表空間隻讀時,其中的表,不能進行任何dml操作, 否則會報錯:ora-00372: file xxx cannot be modified at this time
ora-01110: data file xx: ********。但是能删除表。
4.1.4 表空間讀寫
sql>alter tablespace tbs_dm_dat read write;
4.1.5 表空間改名
在oracle 10g 之前,表空間的名稱是不能被修改的。在oracle 11g中,通過alter tablespace 語句中使用rename子句,資料庫管理者可以修改表空間的名稱。
4.1.6 開啟自動擴充
alter database datafile '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf' autoextend on;
4.1.7 關閉自動擴充
alter database datafile '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf' autoextend off;
5 表空間配額
表空間不足與使用者配額不足是兩種不同的概念。表空間的大小是指實際的使用者表空間的大小,而配額大小指的是使用者指定使用表空間的的大小。兩者的解決方式亦不相同
3.5.1 檢視使用者的表空間配額
max_bytes=-1表示沒有配額限制,
3.5.2 管理使用者表空間配額
使用者表空間限額的建立與更改:
1.建立使用者時,指定限額
eg:
create user test identified by test
default tablespace ts_test
temporary tablespace temp
quota 3m on ts_test
password expire;
2.更改使用者的表空間限額:
a:不對使用者做表空間限額控制:
檢視是否沒有表空間限額限制
b:取消限額
這種方式是全局性的.
sql> grant unlimited tablespace to scott;
或者針對特定的表空間的.
sql>alter user scott quota unimited on tbs_eds_dat;
select * from session_privs where privilege='unlimited tablespace'
sql> revoke unlimited tablespace from scott;
c:制定配額
3. 可以配置設定自然也可以回收了:
revoke unlimited tablespace from test;
或者
alter user skate quota 0 on tb;
表空間大小不足問題的解決:使用“alter tablespace tablespace_name add datafile filename size size_of_file”指令向指定的資料增加表空間,根據具體的情況可以增加一個或多個表空間。