首先聲明,對於Oracle來說,我只是一個菜鳥,一個不能菜再菜的菜鳥了,所以Oracle中很多的名詞、知識點對於我來說都是一個新的東西。雖然我是一個菜鳥,但是這也不能阻擋我去認真的學習Oracle。
那天早上來到公司,聽到我師傅和移動的人在通電話,對話內容大致如下:
師傅:xx,你好;
移動負責人:yy,昨晚我收到告警,說有個表空間滿了,你們昨晚是不是有什麼操作?
師傅:哦,昨晚跑了個存儲過程,出現了點問題,但是後來處理了,現在沒問題了。
移動負責人:哦,那行,以後這種操作的小心點,不要影響到白天的生產。
。。。。。。
表空間滿了?表空間是個啥?我不知道。
那天上班的時候,師傅讓我去看一下有張表存放在哪個表空間,我當時立馬楞了,心裡想著:啥是表空間了,表為啥還要放到表空間。我承認我大學的知識都還給老師了。還好當時沒有立刻說自己不知道,要不又會被師傅罵一個狗血淋頭。於是下班回來好好的學習了一下表空間的相關概念,於是結合上面的問題,就有了這篇文章了。
說到表空間,就需要先了解一下Oracle的存儲結構。對於Oracle來說,它的存儲結構分為以下兩種:
物理結構就是實質的對應物理存儲文件,就是在存儲介質上實實在在存在的文件;而邏輯結構就是一個對象或者組織結構,只是邏輯上存在的東西。下面就對這兩種結構進行詳細的總結。
物理存儲結構是實際的數據存儲單元,對應於操作系統文件,是摸得著、看的見的東西,比邏輯存儲結構更易理解。Oracle數據庫就是由駐留在服務器磁盤上的這些操作系統文件組成的。這些文件有數據文件、控制文件,重做日志文件、歸檔日志文件、參數文件、警報文件、跟蹤文件和備份文件等組成。如下圖所示:
下面就對這些文件進行簡單說明,做一個簡單的了解,到了工作中用到時,再深入研究。
為了更好的保護數據庫,我們可以鏡像控制文件。每個控制文件中的內容就是相同的。鏡像了控制文件,即使其中的一個控制文件出現了問題,也不會影響到數據庫的損壞和數據的丟失。
控制文件的重要性不言而喻,就是說在沒有備份、鏡像的情況下,你的控制文件損壞了,很抱歉,你的數據庫很可能就over了;
show parameter background_dump_dest;
邏輯結構完全從物理結構中抽象出來的。在Oracle中,邏輯結構的組織結構如下圖所示:
Oracle存儲的邏輯結構由數據塊、區、段和表空間組成。數據庫由多個表空間組成;表空間由一個或多個段組成;段有一個或多個連續的區組成;區由一個或多個塊組成。塊是Oracle中最小的存儲單位。
好了,概念性的東西就總結這麼多,再回到文章開頭說的那兩個問題上。一個數據庫被分為一個個的邏輯單元,這些邏輯單元叫“表空間”。表空間用於存放數據庫對象(表、索引等)。一個數據庫邏輯上由一個或者多個表空間組成。表空間由一個或者多個數據文件(物理結構)組成。表空間用於存放數據庫對象,而這些對象實際上存放在數據文件中,數據文件是數據的物理載體。表空間的尺寸是組成這個表空間的所有數據文件的尺寸之和。
每個數據庫都擁有一個系統表空間和一個輔助表空間。在創建數據庫的時候,Oracle會自動創建這兩個表空間。我們也可以手動創建表空間,如下語句:
CREATE TABLESPACE testTBSP
DATAFILE 'D:\DBFILE\dbfile1.dbf'
SIZE 50M
AUTOEXTEND ON
NEXT 20M
MAXSIZE UNLIMITED
LOGGING
EXTENT MANAGEMENT LOCAL;
使用CREATE TABLESPACE
關鍵字創建一個名為testTBSP
的表空間,使用DATAFILE
關鍵字指定數據文件,數據文件的大小為50M,並設置成了以20M為單位自動擴展,並無上限。
如果我們把表空間對應的數據文件的最大值設置為指定大小,不如20480M,這樣就會出現文章開頭所說的把表空間干滿的問題。
一直都是在說表空間,那表呢?從邏輯結構上來講,表空間是表的容器,表是放在表空間裡的;但是從物理結構上來講,表實際上是存放在數據文件中的,數據文件是表的物理載體。我們可以在創建表的時候,指定該表存放的表空間。例如:
CREATE TABLE tb_student(name varchar2(20)) TABLESPACE testTBSP;
記住,每個表一定存在於一個表空間中。如果我們想查看表對應的表空間,可以使用如下語句:
SELECT table_name, tablespace_name
FROM DBA_TABLES
WHERE table_name='tb_student';