天天看點

oracle維護表空間和資料檔案

oracle維護表空間和資料檔案

一: oracle 表空間概念

表空間是聯系資料庫的實體磁盤(資料檔案)和邏輯元件的橋梁,表空間是用來存儲oralce資料庫對象例如:tables、indexes和 rollback segments。可以想象oracle實體磁盤和邏輯磁盤之間的關系,表空間的概念和這個一樣。 PS: 資料檔案 就相當于一個省的的範圍(這個是實實在在存在的),而 表空間相當于在省上建立的管理機構,行政機構等,這些是相當于邏輯的結構,這些 表空間的 資訊在資料字典中存儲。

一個表空間是由至少一個資料庫 datafiles(資料檔案)組成,在表空間的總大小是可變的,所有配置設定在表空間的資料檔案的實體磁盤空間大小也是可變的。

當表空間被定義的 時候,datafiles自動建立,在大多數情況下,所有的datafile是被提前配置設定的,當datafile建立的時候,空間即被設定,你,你能夠定義datafile的初始大小。

tablespace 就是把一組data file 放在一起 成為一個 tablespace;是一個邏輯概念。

關于oracle的一些概念:

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> 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> 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:需要執行如下指令:

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: 查詢預設的臨時表空間

desc database_properties; 

col property_name format a20; 

col property_value format a20; 

select property_name,property_value from database_properties; 

7 :如何看一個表空間的 類型:

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 

8:修改預設表空間

下面進行新加一個表空間:

SQL> create temporary tablespace mytemp tempfile 'D:\APP\TOPWQP\ORADATA\ORCL\my 

temp.DBF' size 100M extent management local; 

SQL> ALTER DATABASE DEFAULT TEMPORYARY TABLESPACE mytemp; 

ALTER DATABASE DEFAULT TEMPORYARY TABLESPACE mytemp 

第 1 行出現錯誤: 

ORA-02231: ALTER DATABASE 選項缺失或無效 

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE mytemp; 

資料庫已更改。 

預設臨時表空間就修改了,可以通過如下指令查詢:

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的就可以離線。

ALTER TABLESPACE mytemp OFFLINE; 

ALTER TABLESPACE mytemp ONLINE; 

實驗:

create table tt(id integer,name char(10)); 

insert into tt values(0,'wang'); 

select * from tt; 

insert into tt values(1 ,'bbbbb'); 

這個時候第二條記錄還沒有commit; 

這意味在undo segment 有一個 active的。 

如果表空間離線,就不能對這個表空間内的表做操作。 

11: 變大和變小 表空間;(這個很有現實意義)

有二種方式:

1:表空間可以自動變大 建立表空間的時候 可以設定 AUTOEXTEND ON實作。

2:可以通過在表空間中加入新的資料檔案來增加表空間。

1:查詢表空間的使用情況:

DBA_DATA_FILES 這個表記錄了所有資料檔案情況。

DBA_FREE_SPACE 能夠知道還剩餘多少表空間。(如果是離線狀态不能查出。)

google 搜尋 : oracle tablespace usage 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 

GROUP BY df.tablespace_name,fs.bytes,df.bytes_free,df.bytes_used 

ORDER BY 4 DESC; 

在我資料庫上的執行結果:

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> 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;表中看是否為自動增加:

desc dba_data_files; 

col file_name format a20; 

select file_name , tablespace_name,autoextensible from dba_data_files; 

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 

A\ORCL\MYTEMP001.DBF 

已選擇9行。 

可以看到 剛增加的資料檔案 是否為自動增長 autoextensible 這個屬性顯示 ;

如果不想新增加 資料檔案的方式擴充表空間,可以使用: 如下指令 對原來的資料檔案設定為自動擴充來擴充表空間(道理一樣)

alter database datafile '資料檔案位置+資料檔案名' autoextend on next 10M maxsize 100M 

方法二:重新定義表空間中的資料檔案的大小 

手工的讓資料檔案 變大變小:使已經存在的資料檔案變大變小,

example:

ALTER DATABASE DATAFILE ' ' RESIZE 200M

這個需要考慮目前需要改變的資料檔案的大小。 

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也被幹掉了。