oracle維護資料表空間和資料檔案

來源:互聯網
上載者:User
文章目錄
  • 方法一: 自動擴充資料表空間
  • 方法二:重新定義資料表空間中的資料檔案的大小 
  • 方法三: 增加 資料檔案 到 資料表空間。 這樣資料表空間 就增加了。

1:重要參考 wiki

2: oracle doc 資料表空間參考

3:來自dba-oracle的參考

26,27,28,29

一: 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> CREATE TABLESPACE  peng DATAFILE 'D:\APP\TOPWQP\ORADATA\ORCL\peng01.DBF'  SIZE 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 a40SQL>SQL> select file_name ,tablespace_name from dba_data_files;FILE_NAME                                TABLESPACE_NAME---------------------------------------- ------------------D:\APP\TOPWQP\ORADATA\ORCL\USERS01.DBF   USERSD:\APP\TOPWQP\ORADATA\ORCL\UNDOTBS01.DBF UNDOTBS1D:\APP\TOPWQP\ORADATA\ORCL\SYSAUX01.DBF  SYSAUXD:\APP\TOPWQP\ORADATA\ORCL\SYSTEM01.DBF  SYSTEMD:\APP\TOPWQP\ORADATA\ORCL\EXAMPLE01.DBF EXAMPLED:\APP\TOPWQP\ORADATA\ORCL\MY_SPACE.DBF  MY_SPACED:\APP\TOPWQP\ORADATA\ORCL\TS_MYDB.DBF   TS_MYDBD:\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 LOCALSYSAUX             PERMANENT LOCALUNDOTBS1           UNDO      LOCALTEMP               TEMPORARY LOCALUSERS              PERMANENT LOCALEXAMPLE            PERMANENT LOCALUSER_TEMP          TEMPORARY LOCALMY_SPACE           PERMANENT LOCALTS_MYDB            PERMANENT LOCALPENG               PERMANENT LOCAL已選擇10行。

 8:修改預設資料表空間

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

SQL> create temporary tablespace mytemp  tempfile 'D:\APP\TOPWQP\ORADATA\ORCL\mytemp.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> select  property_name,property_value  from  database_properties;PROPERTY_NAME        PROPERTY_VALUE-------------------- --------------------DICT.BASE            2DEFAULT_TEMP_TABLESP MYTEMPACEDEFAULT_PERMANENT_TA USERSBLESPACE

一個資料庫可以有多個暫存資料表空間,但是只有一個default的資料表空間。

9: 資料表空間唯讀設定:

ALTER TABLESPACE  mytemp READ ONLY;

執行這條語句:oracle將做如下操作:
1:引起 checkpoint;
2:資料變成唯讀操作
3:依然可以從資料表空間中刪除一個object(table index 等) 

這個在實際中用的不多,我簡單說一下方法,就不做實驗了。

實驗: 建立一個資料表空間:create tablespace wang datafile '/檔案名稱/' size 100Mextent 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');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:

 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.bytesUNION ALLSELECT /* + 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;

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

Tablespace                      Size (MB)  Free (MB)     % Free     % Used------------------------------ ---------- ---------- ---------- ----------TS_MYDB                               500   499.9375        100          0MY_SPACE                              500   499.9375        100          0PENG                                    5     4.9375         99          1MYTEMP                                100         99         99          1UNDOTBS1                              365   335.6875         92          8USER_TEMP                             500        338         68         32EXAMPLE                               100    22.3125         22         78USERS                           9707.0625   462.8125          5         95SYSAUX                             821.25    41.9375          5         95SYSTEM                                710      1.125          0        100TEMP                                   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\mytemp001.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              YESA\ORCL\USERS01.DBFD:\APP\TOPWQP\ORADAT UNDOTBS1           YESA\ORCL\UNDOTBS01.DBFD:\APP\TOPWQP\ORADAT SYSAUX             YESA\ORCL\SYSAUX01.DBFD:\APP\TOPWQP\ORADAT SYSTEM             YESA\ORCL\SYSTEM01.DBFD:\APP\TOPWQP\ORADAT EXAMPLE            YESA\ORCL\EXAMPLE01.DBFD:\APP\TOPWQP\ORADAT MY_SPACE           YESA\ORCL\MY_SPACE.DBFD:\APP\TOPWQP\ORADAT TS_MYDB            YESA\ORCL\TS_MYDB.DBFD:\APP\TOPWQP\ORADAT PENG               NOA\ORCL\PENG01.DBFD:\APP\TOPWQP\ORADAT MY_SPACE           YESA\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也被幹掉了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.