Oracle表空間和數據文件


一、表空間的概念

Oracle數據庫的數據存放在表空間中,表空間是一個邏輯的概念,它是由數據文件組成,表空間大小由數據文件的數量和大小決定。

表空間有三種:Permanent Tablespaces(永久表空間)、Temporary Tablespaces(臨時表空間)、Undo Tablespaces(回滾表空間),Oracle在創建數據庫實例的時候,默認會創建三個永久表空間(SYSTEM、SYSAUX、USERS),一個臨時表空間(TEMP),一個回滾表空間(UNDOTBS1)。

1、SYSTEM表空間

SYSTEM表空間主要用於存放Oracle數據庫內部的數據字典,它是Oracle數據庫最重要的表空間,在創建數據庫實例時被最先創建,包含了數據庫的元數據,對於數據庫來說生死攸關。

2、SYSAUX表空間

SYSAUX表空間是SYSTEM表空間的輔助表空間,主要用於存儲數據字典以外的其他數據對象,它在一定程度上降低了SYSTEM表空間的負荷。

3、UNDOTBS1表空間

UNDO是回滾表空間,主要有四方面的用途,分別是:事物回滾、數據庫恢復、讀一致性、閃回查詢。

1)事物回滾:當事物執行失敗或用戶執行回滾操作(rollback)時,Oracle會利用保存在回退段中的信息將數據恢復到原來的值。

2)數據庫恢復:當數據庫實例出現了意外,在重啟恢復時,Oracle先利用重做日志文件的信息對數據庫進行恢復,再利用回滾段中的信息回滾未提交的事務。

3)讀一致性:當一個用戶對數據進行修改時,會預先將其原始值保存到回退段中,這時,如果有其它用戶訪問該數據,則訪問回退段中的信息,使當前用戶未提交的修改其他用戶無法看到,保證了數據的一致性。

4)閃回查詢:通過保留在回退段中的信息,用戶可以查詢某個數據在過去某個時刻的狀態。

4、TEMP表空間

臨時表空間用來管理數據庫排序以及用於存儲臨時表和索引、中間結果等臨時對象。當Oracle的內存不夠時,會把數據放在臨時表空間中,當操作完成后,系統會自動清理臨時表空間中的臨時對象,自動釋放空間。這里的釋放只是標記為空閑、可以重用,占用的磁盤空間並沒有真正釋放。這也是臨時表空間有時會不斷增大卻不見減少的原因。

5、USERS表空間

USERS表空間用於存放普通用戶的表和索引,一般情況下,它是用戶的缺省表空間。

6、查看表空間

用DBA登錄數據庫,執行以下SQL可以查看數據庫全部的表空間。

select * from v$tablespace;

在這里插入圖片描述

二、管理表空間

企業級的Oracle數據系統的存儲一般是采用ASM(自動存儲管理),ASM是Oracle 10g R2中為了簡化Oracle數據庫的管理而推出來的一項新功能,這是Oracle自己提供的卷管理器,替代了操作系統所提供的LVM,它不僅支持單實例,同時對RAC的支持也是非常好。

管理表空間的任務一般是由DBA來執行,涉及的知識比較多,本文介紹用文件系統作為Oracle的存儲空間,合適程序員學習。不管是ASM還是文件系統,邏輯上是一樣的,作為一個程序員,並不一定要掌握Oralce存儲系統的管理和配置,理解它的原理和使用就可以了。

1、創建表空間

創建表空間是使用create tablespace命令完成的,建立表空間是特權用戶或是DBA來執行的,如果用其它用戶來創建表空間,則用戶必須要具有create tablespace的系統權限。create tablespace命令的選項比較多,本文只介紹常用的方法。

create tablespace 表空間名 datafile '數據文件名' size 大小;

在創建數據庫實列后,為了方便管理,最好再創建一個專用於存放數據表空間和一個專用於存放索引表空間。

示例:

1)創建數據表空間DATA,同時創建數據文件/oracle/base/oradata/snorcl11g/data01.dbf,數據文件的大小是128M。

create tablespace DATA datafile '/oracle/base/oradata/snorcl11g/data01.dbf' size 128M;

2)創建索引表空間INDEXS,同時創建數據文件/oracle/base/oradata/snorcl11g/indexs01.dbf,數據文件的大小是128M。

create tablespace INDEXS datafile '/oracle/base/oradata/snorcl11g/indexs01.dbf' size 128M;

創建表空間時,可以指定多個數據文件,但致少要指定一個數據文件,數據文件由Oracle自動創建,不需要事先在磁盤上手工的創建文件。

在這里插入圖片描述

2、使用表空間

1)創建數據庫用戶時,指定用戶的對象缺省使用的表空間。

create user girl identified by pwdgirl default tablespace DATA;

2)創建表時,指定表使用的表空間。

create table T_GIRL
(
  id        char(4)         not null,   -- 編號
  name      varchar2(30)    not null,   -- 姓名
  yz        varchar2(20)        null,   -- 顏值
  sc        varchar2(20)        null    -- 身材
) tablespace DATA;

3)創建主鍵時,指定主鍵使用的表空間。

alter table T_GIRL add constraint PK_GIRL primary key(id) using index tablespace INDEXS;

4)創建索引時,指定索引使用的表空間。

create index IDX_GIRL_1 on T_GIRL(name) tablespace INDEXS;

3、刪除表空間

一般情況下,由特權用戶或是DBA來操作,如果是其它用戶操作,那么要求用戶具有drop
tablespace系統權限。

drop tablespace 表空間名 including contents and datafiles;

Including contents表示刪除表空間,同時刪除該表空間全部的數據庫對象,而datafiles表示將數據庫文件也刪除。

示例:

刪除DATA和INDEXS表空間,和該表空間全部的數據庫對象以及數據文件。

drop tablespace DATA including contents and datafiles;
drop tablespace INDEXS including contents and datafiles;

4、向表空間中添加數據文件

表空間的大小是由數據文件的數據和大小決定的,向表空間中添加數據文件,擴展表空間的容量。

alter tablesapce 表空間名 add datafile '數據文件名' size 大小
      [reuse]
      [autoextend [on/off] next 大小]
      [maxsize [unlimited|大小]];

參數說明:

size 大小:數據文件的初始大小,單位:K|M|G|T|P|E。

[reuse]:如果操作系統上已經存在數據文件,加reuse參數表示覆蓋它,否則會提示錯誤,建議一般不要啟用reuse選項,容易產生誤操作,如果磁盤上已存在同名的數據文件,可以先手工的刪除它。

[autoextend [on/off] next 大小]:數據文件是否自動擴展,如果為on,next參數指定每次擴展的大小。

[maxsize [unlimited|大小]]:如果數據文件可以自動擴展,maxsize參數可以限制文件的最大值,unlimited表示無限制。

示例:

1)向DATA表空間添加數據文件,大小100M,可重用,可自動擴展,每次擴展10M,最大200M。

alter tablespace DATA add datafile '/oracle/base/oradata/snorcl11g/data02.dbf' 
      size 100M reuse autoextend on next 10M maxsize 200M;

2)向DATA表空間添加數據文件,大小100M,可重用,可自動擴展,每次擴展10M,無最大限制。

alter tablespace DATA add datafile '/oracle/base/oradata/snorcl11g/data03.dbf' 
      size 100M reuse autoextend on next 10M maxsize unlimited;

3)向DATA表空間添加數據文件,大小200M,不可重用,不能自動擴展。

alter tablespace DATA add datafile '/oracle/base/oradata/snorcl11g/data04.dbf' 
      size 100M autoextend off;

6、修改表空間的狀態

alter tablespace 表空間名 [online] [offline] [read only|write];

示例:

1)把DATA表空間的狀態改為offline(離線)。

alter tablespace DATA offline;

2)把DATA表空間的狀態改為read onley(只讀)。

alter tablespace DATA read only;

3)把DATA表空間的狀態改為read write(可讀寫)。

alter tablespace DATA read write;

4)把DATA表空間的狀態改為offline(在線)。

alter tablespace DATA online;

7、修改數據文件狀態

修改數據文件的命令是alter database datafile。

示例:

1)先把表空間offline。

alter tablespace DATA offline;

2)把數據文件的狀態改為offline(離線),必須先把表空間offline。

alter database datafile '/oracle/base/oradata/snorcl11g/data02.dbf' offline;

3)把數據文件的狀態改為online(在線)。

alter database datafile '/oracle/base/oradata/snorcl11g/data02.dbf' online;

4)刪除數據文件

alter database datafile '/oracle/base/oradata/snorcl11g/data02.dbf' offline drop;

5)再把表空間online。

alter tablespace DATA online;

8、修改數據文件大小

修改數據文件的大小可以在線操作,關聯的表空間無需offline,對業務運行也沒有影響。

示例:

alter database datafile '數據文件名'
      [ [resize 大小| [autoextend [on/off] next 大小] [maxsize [unlimited|大小]] ];

1)把數據文件改為200M,前提是該數據文件已使用空間小於200M,否則提示錯誤。

alter database datafile '/oracle/base/oradata/snorcl11g/data02.dbf' resize 200M;

2)禁用數據文件自動擴展的屬性。

alter database datafile '/oracle/base/oradata/snorcl11g/data02.dbf' autoextend off;

3)啟用數據文件自動擴展的屬性,無最大限制。

alter database datafile '/oracle/base/oradata/snorcl11g/data02.dbf' 
      autoextend on next 10M maxsize unlimited;

9、移動數據文件

移動數據文件非常重要,例如存放數據文件的磁盤空間不足,增加了新的磁盤空間后,需要把數據文件遷移到新的磁盤。

移動數據文件有兩種方法:alter tablespace和alter database。

示例:

1)把表空間offline。

alter tablespace DATA offline;

2)執行操作系統命令,遷移數據文件,cp和mv都可以,注意,cp和mv是操作系統的命令,不是sqlplus中Oracle的命令。

mv data01.dbf data03.dbf
mv data02.dbf data04.dbf

3)執行alter tablespace或alter database修改數據庫文件名。

alter tablespace DATA rename datafile '/oracle/base/oradata/snorcl11g/data01.dbf' to '/oracle/base/oradata/snorcl11g/data03.dbf';
alter database rename file '/oracle/base/oradata/snorcl11g/data02.dbf' to '/oracle/base/oradata/snorcl11g/data04.dbf';

4)把表空間online。

alter tablespace DATA online;

三、查看表空間和數據文件

1、查看當前用戶的缺省表空間

select username,default_tablespace from user_users;

在這里插入圖片描述

2、查看數據文件

數據文件存放在數據字典DBA_DATA_FILES中,用DBA權限執行以下SQL查詢。

select file_name,file_id,tablespace_name,bytes,status,autoextensible,
       maxbytes,user_bytes,online_status
  from DBA_DATA_FILES order by tablespace_name,file_name;

在這里插入圖片描述

3、查看表空間使用情況

從數據字典DBA_FREE_SPACE和DBA_DATA_FILES中可以查詢表空間使用情況。

select a.tablespace_name "表空間名",total "表空間大小",
       (total - free) "已使用大小",free "表空間剩余大小",
       round(total/(1024*1024)) "表空間大小(M)",
       round((total-free)/(1024*1024)) "已使用大小(M)",
       round(free/(1024*1024)) "表空間剩余大小(M)",
       round((total-free)/total,4)*100 "使用率%"
  from
(select tablespace_name,sum(bytes) free from DBA_FREE_SPACE group by tablespace_name) a,
(select tablespace_name,sum(bytes) total from DBA_DATA_FILES group by tablespace_name) b
 where a.tablespace_name = b.tablespace_name;

在這里插入圖片描述

四、應用經驗

表空間和數據文件的管理,看上去就是幾個命令,但是在實際應用中並不會這么簡單。

如果讓您在一片空地上設計規划一座新的城市,想怎么設計就怎么設計,想怎么修改就怎么修改,但是,如果城市一旦建好,想改就沒那么容易了,要考慮拆遷問題,補償問題,還有對交通影響,對人們日常生活的影響等等。

表空間和數據文件的管理也是一樣的道理,如果您新建的表空間和數據文件還沒有被使用,您想怎么改就怎么改,一旦投入了業務運行,需要考慮的問題就多了。

所以,表空間和數據文件最好是一開始就規划和設計好。如果要修改業務運行中的表空間和數據文件(擴展數據文件除外),風險非常大,建議讓專業的DBA來操作,或者在操作之前做好業務數據的備份。如果操作不慎造成了數據的丟失或影響業務系統的運行,您會懊悔不已。

五、版權聲明

C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道

如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM