oracle維護表空間和數據文件

oracle維護表空間和數據文件
一: oracle 表空間概念
表空間是聯繫數據庫的物理磁盤(數據文件)和邏輯組件的橋樑,表空間是用來存儲oralce數據庫對象例如:tables、indexes和 rollback segments。可以想象oracle物理磁盤和邏輯磁盤之間的關係,表空間的概念和這個一樣。 PS: 數據文件 就相當於一個省的的範圍(這個是實實在在存在的),而 表空間相當於在省上建立的管理機構,行政機構等,這些是相當於邏輯的結構,這些 表空間的 信息在數據字典中存儲。
一個表空間是由至少一個數據庫 datafiles(數據文件)組成,在表空間的總大小是可變的,所有分配在表空間的數據文件的物理磁盤空間大小也是可變的。
當表空間被定義的 時候,datafiles自動創建,在大多數情況下,所有的datafile是被提前分配的,當datafile創建的時候,空間即被設置,你,你能夠定義datafile的初始大小。
tablespace 就是把一組data file 放在一起 成爲一個 tablespace;是一個邏輯概念。
關於oracle的一些概念:
先科普以下概念:
1:oracle block concept(塊概念)
一個oracle塊是一個oracle數據塊的最小的存儲單元,oracle數據庫塊的大小當創建數據的時候被指定,除非oracle數據進行重構,否則不能進行修改了,數據庫塊大小通常爲2K,4K,8K,16KOR 32K。一旦定義了塊的大小,就能夠創建新的 表空間了,表空間包含若干個塊。
注意:oracle數據庫instance也包含一個RAM buffer cache,組成RAM buffer cache的塊適合和物理數據文件數據塊相對應。
數據庫包含有多個 tablespace 一個 tablespace包含一個或多個 datafiles ,一個表或者一個index 暫居一個segment
extent 由連續的oracle data block組成 : 邏輯上連續。
一個segment可以存儲在不同的datafiles裏面,跨越的概念;extent不能跨越datafiles。oralce data block 包含 一個或多 os block
二:表空間的類型:
1 :一個數據庫至少包含一個tablespace 就是 SYSTEM;
system tablespace ;創建數據庫的時候,創建包含數據字典包含SYSTEM undo segment 
Non-SYSTEM tablespace
2:更科學的劃分 tablespace的類型:
1:permanent 永久表空間 (SYSTEM 和 No-SYSTEM tablespace 就是這種類型)
2: undo 表空間
3:temporary 表空間
2,3是用於管理數據庫 的表空間,所有不永久存儲數據,
PS:當一個數據被創建的時候,將包含以下表空間:
SYSTEM (the data dictionary)
SYSAUX (optional database components)
TEMP (temporary tablespace, see tablespace types below)
UNDOTBS1 (undo tablespace, see tablespace types below)
USERS (default users tablespace created)
3:創建表空間 create tablespace oracle doc 11: 
創建表空間的簡單語法:
[sql]
SQL> CREATE TABLESPACE peng DATAFILE 'D:\APP\TOPWQP\ORADATA\ORCL\peng01.DBF' S 
IZE 5M; 
表空間已創建。 
查找表空間信息
[sql]
SQL> select * from v$tablespace; 
TS# NAME INC BIG FLA ENC 
---------- ------------------------------ --- --- --- --- 
0 SYSTEM YES NO YES 
1 SYSAUX YES NO YES 
2 UNDOTBS1 YES NO YES 
4 USERS YES NO YES 
3 TEMP NO NO YES 
6 EXAMPLE YES NO YES 
7 USER_TEMP NO NO YES 
8 MY_SPACE YES NO YES 
9 TS_MYDB YES NO YES 
10 PENG YES NO YES 
已選擇10行。 
如何知道一個表空間有哪些數據文件:
[sql]
SQL> col file_name format a40 
SQL> 
SQL> select file_name ,tablespace_name from dba_data_files; 
FILE_NAME TABLESPACE_NAME 
---------------------------------------- ------------------ 
D:\APP\TOPWQP\ORADATA\ORCL\USERS01.DBF USERS 
D:\APP\TOPWQP\ORADATA\ORCL\UNDOTBS01.DBF UNDOTBS1 
D:\APP\TOPWQP\ORADATA\ORCL\SYSAUX01.DBF SYSAUX 
D:\APP\TOPWQP\ORADATA\ORCL\SYSTEM01.DBF SYSTEM 
D:\APP\TOPWQP\ORADATA\ORCL\EXAMPLE01.DBF EXAMPLE 
D:\APP\TOPWQP\ORADATA\ORCL\MY_SPACE.DBF MY_SPACE 
D:\APP\TOPWQP\ORADATA\ORCL\TS_MYDB.DBF TS_MYDB 
D:\APP\TOPWQP\ORADATA\ORCL\PENG01.DBF PENG 
已選擇8行。 
4:兩種管理數據字典的方式:
1: locally managed tablespace 自治式管理:
1:自己管理tablespace 
2:數據字典中有個Bitmap 用於管理 tablespace (一個位圖對應一個extent的意味1佔用 0未佔用)
在每一個數據文件的頭,都會有一個bitmap 位圖,來表示空間的佔用情況。一個bit代表一個extent,佔用1 未佔用 0;locally-managed也是串行,不能並行,但是 每個表空可以自己管理,所有就相當於並行。如果SYSTEM表空間用的是local-managed ,其他表空間就只能是 local-managed的了。以後就要用local-managed 方式管理表空間。
如果由於歷史的原因 dictionary 管理的 SYSTEM tablespace 想變成locally managed:需要執行如下命令:
[sql]
DBMS_SPACE_ADMIN.TABLESPACE_MIGRANTE_TO_LOCAL('SYSTEM'); 
注意:做這個命令前的準備工作: 1:全備份數據庫 2:確保臨時表空間不是SYSTEM
自己管理的tablespace 有兩個表管理這些數據:
?疑問 每個表空間口有自己的 DEBIT和CREDIT表嗎?
DEBIT表:記錄所有已經被分配的extent
CREDIT表:記錄所有空閒的extent
當申請空間的時候,oracle就去查詢這些表,然後分配空間,當向表中
插入數據的時候,就是在申請空間。
2: data-dictionary 的管理。
當自己的表中插入數據的時候,oracle要去查詢數據字典(執行很多隱含sql)然後分配空間。因爲數據字典只有一個:對數據字典的訪問必須是序列化的,不能併發,如果通過數據字典,管理表空間, 容易造成數據庫的開銷過大,所以這種方式有點過時,中央集羣的管理方式是 data-dictionary,地方似的管理是新出的管理表空間的方式。
PS :大事中央管,小事自己管。 中央集權制放掉,搞自治
 3:undo tablespace:
主要是用來存儲undo segment; 就是再對一個表或者表空間做修改的時候,undo 就是做事先進行備份。undo一定是 loacally mananged  以後有專門一章進行講解;
5:temporary tablespaces:
就是oracle的臨時存儲用的,比如做一些大型的排序,在內存中做肯定不行,內存不夠,這個時候就需要在臨時表空間中進行排序操作。臨時的中轉站。有一個全局的臨時表空間可以被大家共用,只用於存放臨時的信息,可以 data-dictionary方式,但是推薦使用locally -mananged管理方式.
強烈建議,在創建數據庫的時候額外指定 臨時表空間。如果沒有指定,默認是 SYSTEM這樣做事很危險的。所以要指定。
有兩種方式指定 default temporary tablespace:
1:創建數據庫的使用 create database的時候。
 DEFAULT TEMPORARY TABLESPACE temp  TEMPFILE '路徑/文件名' SIZE 400M
2: 可以使用 alter database 的時候。
ALTER DATABASE DEFAULT TEMPORYARY TABLESPACE default_temp2;(這個要首先創建表空間)
6: 查詢默認的臨時表空間
[sql]
desc database_properties; 
col property_name format a20; 
col property_value format a20; 
select property_name,property_value from database_properties; 
7 :如何看一個表空間的 類型:
[sql]
SQL> select tablespace_name,contents,extent_management from dba_tablespaces; 
TABLESPACE_NAME CONTENTS EXTENT_MAN 
------------------ --------- ---------- 
SYSTEM PERMANENT LOCAL 
SYSAUX PERMANENT LOCAL 
UNDOTBS1 UNDO LOCAL 
TEMP TEMPORARY LOCAL 
USERS PERMANENT LOCAL 
EXAMPLE PERMANENT LOCAL 
USER_TEMP TEMPORARY LOCAL 
MY_SPACE PERMANENT LOCAL 
TS_MYDB PERMANENT LOCAL 
PENG PERMANENT LOCAL 
已選擇10行。 
8:修改默認表空間
下面進行新加一個表空間:
[sql]
SQL> create temporary tablespace mytemp tempfile 'D:\APP\TOPWQP\ORADATA\ORCL\my 
temp.DBF' size 100M extent management local; 
表空間已創建。 
SQL> 
SQL> ALTER DATABASE DEFAULT TEMPORYARY TABLESPACE mytemp; 
ALTER DATABASE DEFAULT TEMPORYARY TABLESPACE mytemp 
第 1 行出現錯誤: 
ORA-02231: ALTER DATABASE 選項缺失或無效 
SQL> 
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE mytemp; 
數據庫已更改。 
SQL> 
默認臨時表空間就修改了,可以通過如下命令查詢:
[sql]
SQL> select property_name,property_value from database_properties; 
PROPERTY_NAME PROPERTY_VALUE 
-------------------- -------------------- 
DICT.BASE 2 
DEFAULT_TEMP_TABLESP MYTEMP 
ACE 
DEFAULT_PERMANENT_TA USERS 
BLESPACE 
一個數據庫可以有多個臨時表空間,但是隻有一個default的表空間。
9: 表空間只讀設置:
ALTER TABLESPACE mytemp READ ONLY;
執行這條語句:oracle將做如下操作:
1:引起 checkpoint;
2:數據變成只讀操作
3:依然可以從表空間中刪除一個object(table index 等) 
這個在實際中用的不多,我簡單說一下方法,就不做實驗了。
[plain]
實驗: 創建一個表空間: 
create tablespace wang datafile '/文件名/' size 100M 
extent management local uniform size 128k; 
create user wang identified by wang default tablespace wang; 
然後用user/user登錄 
創建表 就在以上指定的表空間中了。 
create table wang (id integer,name char(10)); 
insert into t values(0,'wang'); 
commit; 
insert into t values(1,'qiupeng'); 
第二條不commit 
然後切換到sys用戶; 
然後執行 
alter tablespace wang read only; 
如果transcription沒有commit以上語句耗在這裏,commit後這個語句才執行。 
drop table wang ;這個命令可以執行。 
相當於 一個省的地域是實實在在的文件, 省上面的行政機構是相當於 
tablespace,是一個邏輯的結構, 
這個tablespace的邏輯結構是存儲在數據字段中的,可以執行 drop table操作 
相當於對數據字典進行訪問。 
10 :讓一個表空間 offline
以下表空間不能離線:
1:SYSTEM表空間
2:處於active的 undo segment 的表空間
3:default temporary 表空間不能離線 ,temporary 表空間如果不是default的就可以離線。
[sql]
ALTER TABLESPACE mytemp OFFLINE; 
ALTER TABLESPACE mytemp ONLINE; 
實驗:
[plain]
create table tt(id integer,name char(10)); 
insert into tt values(0,'wang'); 
commit; 
select * from tt; 
insert into tt values(1 ,'bbbbb'); 
select * from tt; 
這個時候第二條記錄還沒有commit; 
這意味在undo segment 有一個 active的。 
如果表空間離線,就不能對這個表空間內的表做操作。 
11: 變大和變小 表空間;(這個很有現實意義)
有二種方式:
1:表空間可以自動變大 創建表空間的時候 可以設置 AUTOEXTEND ON實現。
2:可以通過在表空間中加入新的數據文件來增加表空間。
1:查詢表空間的使用情況:
DBA_DATA_FILES 這個表記錄了所有數據文件情況。
DBA_FREE_SPACE 能夠知道還剩餘多少表空間。(如果是離線狀態不能查出。)
google 搜索 : oracle tablespace usage sql 
這個sql能夠查詢出數據庫的所有表空間的使用情況;
注意這是一個很重要的sql:
[sql]
SELECT /* + RULE */ df.tablespace_name "Tablespace", 
df.bytes / (1024 * 1024) "Size (MB)", 
SUM(fs.bytes) / (1024 * 1024) "Free (MB)", 
Nvl(Round(SUM(fs.bytes) * 100 / df.bytes),1) "% Free", 
Round((df.bytes - SUM(fs.bytes)) * 100 / df.bytes) "% Used" 
FROM dba_free_space fs, 
(SELECT tablespace_name,SUM(bytes) bytes 
FROM dba_data_files 
GROUP BY tablespace_name) df 
WHERE fs.tablespace_name (+) = df.tablespace_name 
GROUP BY df.tablespace_name,df.bytes 
UNION ALL 
SELECT /* + RULE */ df.tablespace_name tspace, 
fs.bytes / (1024 * 1024), 
SUM(df.bytes_free) / (1024 * 1024), 
Nvl(Round((SUM(fs.bytes) - df.bytes_used) * 100 / fs.bytes), 1), 
Round((SUM(fs.bytes) - df.bytes_free) * 100 / fs.bytes) 
FROM dba_temp_files fs, 
(SELECT tablespace_name,bytes_free,bytes_used 
FROM v$temp_space_header 
GROUP BY tablespace_name,bytes_free,bytes_used) df 
WHERE fs.tablespace_name (+) = df.tablespace_name 
GROUP BY df.tablespace_name,fs.bytes,df.bytes_free,df.bytes_used 
ORDER BY 4 DESC; 
在我數據庫上的執行結果:
[sql]
Tablespace Size (MB) Free (MB) % Free % Used 
------------------------------ ---------- ---------- ---------- ---------- 
TS_MYDB 500 499.9375 100 0 
MY_SPACE 500 499.9375 100 0 
PENG 5 4.9375 99 1 
MYTEMP 100 99 99 1 
UNDOTBS1 365 335.6875 92 8 
USER_TEMP 500 338 68 32 
EXAMPLE 100 22.3125 22 78 
USERS 9707.0625 462.8125 5 95 
SYSAUX 821.25 41.9375 5 95 
SYSTEM 710 1.125 0 100 
TEMP 27 0 0 100 
12 :三種方法擴展表空間
方法一: 自動擴充表空間
三種方式: 
1: create database 指定 datafile 的時候可以增加選項 AUTOEXTEND ON NEXT 10M MAXSIZE 500M 這樣數據庫文件就能自動增長。
2: create tablespace 這個AUTOEXTEND ON NEXT 10M MAXSIZE 500M 也可以用在create tablespace。
3:ALTER TABLESPACE ADD DATAFILE 
下面用第三種方式做實驗:(修改的表空間必須實現,這個my_)
[sql]
SQL> alter tablespace MY_SPACE add datafile 'D:\APP\TOPWQP\ORADATA\ORCL\mytemp 
001.DBF' size 20M autoextend on next 10M maxsize 100M; 
表空間已更改。 
增加以後可以到 dba_data_files;表中看是否爲自動增加:
[sql]
desc dba_data_files; 
col file_name format a20; 
select file_name , tablespace_name,autoextensible from dba_data_files; 
[sql]
SQL> select file_name , tablespace_name,autoextensible from dba_data_files; 
FILE_NAME TABLESPACE_NAME AUT 
-------------------- ------------------ --- 
D:\APP\TOPWQP\ORADAT USERS YES 
A\ORCL\USERS01.DBF 
D:\APP\TOPWQP\ORADAT UNDOTBS1 YES 
A\ORCL\UNDOTBS01.DBF 
D:\APP\TOPWQP\ORADAT SYSAUX YES 
A\ORCL\SYSAUX01.DBF 
D:\APP\TOPWQP\ORADAT SYSTEM YES 
A\ORCL\SYSTEM01.DBF 
D:\APP\TOPWQP\ORADAT EXAMPLE YES 
A\ORCL\EXAMPLE01.DBF 
D:\APP\TOPWQP\ORADAT MY_SPACE YES 
A\ORCL\MY_SPACE.DBF 
D:\APP\TOPWQP\ORADAT TS_MYDB YES 
A\ORCL\TS_MYDB.DBF 
D:\APP\TOPWQP\ORADAT PENG NO 
A\ORCL\PENG01.DBF 
D:\APP\TOPWQP\ORADAT MY_SPACE YES 
A\ORCL\MYTEMP001.DBF 
已選擇9行。 
可以看到 剛增加的數據文件 是否爲自動增長 autoextensible 這個屬性顯示 ;
如果不想新增加 數據文件的方式擴展表空間,可以使用: 如下命令 對原來的數據文件設置爲自動擴展來擴展表空間(道理一樣)
[sql]
alter database datafile '數據文件位置+數據文件名' autoextend on next 10M maxsize 100M 
方法二:重新定義表空間中的數據文件的大小 
手工的讓數據文件 變大變小:使已經存在的數據文件變大變小,
example:
ALTER DATABASE DATAFILE ' ' RESIZE 200M
[sql]
這個需要考慮當前需要改變的數據文件的大小。 
col file_name format a40; 
col tablespace_name format a15; 
select file_name, tablespace_name,byte from dba_data_files; 
注意臨時表空間在: DBA_TEMP_FILES 這個表中去找。
先查詢出,然後執行,修改數據文件大小,然後再次進行查詢。
如果修改的大小小於真實的數據文件的大小,這樣oracle就會報錯。
方法三: 增加 數據文件 到 表空間。 這樣表空間 就增加了。
alter tablespace my_temp add datafile ' ' SIZE 200M
如何移動DATAFILE:
方法一:
使用alter tablespace 命令:
做之前必須做兩個工作:
1:讓tablespace offline
2:目標數據文件必須存在。
命令:
首先讓這個文件離線:
alter tablespace tablespace_name offline;
然後移動文件
然後 執行如下命令:
ALTER TABLESPACE tablespace_name RENAME DATAFILE ' ' TO ' ';
相當於指針重新進行了指向了;
然後把表空間上線: 
alter tablespace tablespace_name online;
刪除表空間:
1: SYSTEM 表空間 不能刪除
2: 有一個 active segments 不能刪除。
命令: DROP TABLESAPCE tablespace_name INCLUDING CONTENTS AND DATAFILES;
有三種可選項。
如上命令可以執行, 相應的表空間中的 datafile也被幹掉了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章