數據文件和日志文件是數據庫中最重要的文件。它們是數據存儲的地方。每個數據庫至少有一個與之相關的數據文件,通常情況下不只一個,有很多。數據在數據文件中是如何組織的?要了解這些內容我們首先必須理解什麼是表空間(tablespace)、段(segment)、區(extent)、塊(block),這些都是oracle數據庫在數據文件中組織數據的基本單元。現在我們來理解這些概念。
塊是數據存儲的物理單位,也是數據文件中最基礎的單位,數據直接存儲在塊上。是oracle空間分配的最小單位。oracle中的塊大小常見的有三種,2KB、4KB、8KB。塊的大小在數據庫創建時就已經固定下來,數據庫中每個塊的大小都是相同的,而且所有的塊都有相同的格式,由“塊頭+表目錄+行目錄+空閒空間+數據空間”組成。塊頭包含著塊類型(比如是表塊、還是索引塊)的信息、磁盤上塊的位置等信息。表目錄(table directory),如果有的話,包含著此塊中存儲各行的表的信息(如果一個塊中存有多個表中的數據)。行目錄(row directory)包含著數據行的描述信息,它是一個指針數組,指示了每一行在數據塊中的物理位置。塊頭、表目錄、行目錄統稱為塊開銷(block overhead),是oracle原來統計、管理塊本身的。剩下的兩部分很簡單,已經存有數據的就是數據空間,暫時沒存的就是空閒空間。
區又叫盤區,是數據文件中一個連續的分配空間,它比塊要大,由塊組成。有些對象分配空間時可能至少需要兩個盤區,比如回滾段,而這兩個盤區不一定要求相連。區的大小從一個塊到2GB不等
段是oracle數據庫中的分配單位,對象如表、索引等都是以段為單位進行分配。當創建一個表時將創建一個表段,創建一個索引時就創建一個索引段。每一個消耗存儲空間的對象最終被存儲到一個單一的段中。有回滾段、臨時段、聚簇段、索引段等。
表空間是一個邏輯容器,它和數據文件關聯起來,一個表空間至少有一個數據文件與之關聯。一個表空間可以有多個段,一個段只能屬於一個表空間。
方案(schema)又叫模式,是比表空間小一級的邏輯概念,它也是一個邏輯容器。多個用戶可能共用一個表空間,那如何區分開每一個用戶?那麼在表空間中對每個用戶都有一個對應的方案,用於保存單個用戶的信息。
oracle中存儲的層次結構總結如下:
一、數據庫由一個或多個表空間組成
二、表空間由一個或多個數據文件組成,一個表空間包含多個段
三、段由一個或多個區組成
四、區是數據文件中一個連續的分配空間,由一個或多個塊組成
五、塊是數據庫中最小、最基本的單位,是數據庫使用的最小的I/O單元
六、每個用戶都有一個對應的方案
1. service name 服務名(其實就是:數據庫名),裝 ORACLE 時肯定要指定的一個名字
2. tablespace 表空間,數據庫對象的磁盤存儲位置
3. schema 方案,數據庫對象的邏輯分類
4. user 用戶,等同於 schema
5. service name > tablespace > schema(user)
詳細說明:
schema 為數據庫對象的集合,為了區分各個集合,我們需要給這個集合起個名字,這些名字就是我們在企業管理器的 schema 下看到的許多類似用戶名的節點,這些類似用戶名的節點其實就是一個schema,schema 裡面包含了各種對象如:tables,views,sequences,stored procedures,synonyms,indexes,clusters,and database links。
一個用戶(user)一般對應一個 schema,該用戶的 schema 名等於用戶名,並作為該用戶缺省的 schema。這也就是我們在企業管理器的 schema 下看到 schema 名都為數據庫用戶名的原因。Oracle 數據庫中不能新創建一個 schema,要想創建一個 schema,只能通過創建一個 user 的方法解決(Oracle 中雖然有 create schema 語句,但是它並不是用來創建一個 schema 的),在創建一個 user 的同時為這個 user 創建一個與用戶名同名的 schem 並作為該用戶的缺省 shcema。即 schema 的個數同 user 的個數相同,而且 schema 名字同 user 名字一一對應並且相同,所有我們可以稱 schema 為 user 的別名,雖然這樣說並不准確,但是更容易理解一些。
一個 user 有一個缺省的 schema,其 schema 名就等於用戶名,當然一個 user 還可以使用其他的 schema。如果我們訪問一個表時,沒有指明該表屬於哪一個 schema 中的,系統就會自動給我們在表上加上缺省的 sheman 名。比如我們在訪問數據庫時,訪問 scott 用戶下的 emp 表,通過select * from emp; 其實,這 sql 語句的完整寫法為 select * from scott.emp。在數據庫中一個對象的完整名稱為 schema.object,而不屬 user.object。類似如果我們在創建對象時不指定該對象的 schema,在該對象的 schema 為 user 的缺省 schema。這就像一個 user 有一個缺省的 tablespace,但是該 user 還可以使用其他的 tablespace,如果我們在創建對象時不指定 tablespace,則對象存儲在缺省 tablespace 中,要想讓對象存儲在其他 tablespace 中,我們需要在創建對象時指定該對象的 tablespace。
舉例如下:
SQL> Gruant dba to scott
SQL> create table test(name char(10));
Table created.
SQL> create table system.test(name char(10));
Table created.
SQL> insert into test values('scott');
1 row created.
SQL> insert into system.test values('system');
1 row created.
SQL> commit;
Commit complete.
SQL> conn system/manager
Connected.
SQL> select * from test;
NAME
----------
system
SQL> ALTER SESSION SET CURRENT_SCHEMA = scott; --改變用戶缺省schema名
Session altered.
SQL> select * from test;
NAME
----------
scott
SQL> select owner ,table_name from dba_tables where table_name=upper('test');
OWNER TABLE_NAME
------------------------------ ------------------------------
SCOTT TEST
SYSTEM TEST
--上面這個查詢就是將 schema 作為 user 的別名的依據。實際上在使用上,shcema 與 user 完全一樣,沒有什麼區別,在出現 schema 名的地方也可以出現 user 名。
schema 和 user 一般是一致的,建立一個 user 後即可得到一個 schema,如:HR 用戶建立後便有 HR 方案,接下來建立表、索引等數據庫對象時,要指定其屬於哪個 schema,也要指定其存放在哪個 tablespace 裡。
也可以這樣理解,schema 是數據庫對象的邏輯歸屬和分類,而 tablespace 是數據庫對象的物理和實際存放位置。
Schema 就是用戶所屬對象的一個集合,對象包括表,索引,視圖,JAVA,PL/SQL塊等。
Schema 的名字與用戶名一樣,當創建一個用戶時,這個用戶所對應的shema也同時創建,用戶名與schema交互使用。
Schema 與tablespace之間沒有什麼聯系,同一個schema的對象可以存儲在不同的表空間中,同一個表空間中可以存儲不同schema的對象。
不要在SYS和SYSTEM SCHEMA下創建其它數據對象。
Schema is the collection of database objects owned by a database user.
Schema has the same name as the user owns it.
Schema objects include structures such as tables,views,indexes,Java,PL/SQL etc..
Schema is no relationship with tablespace.
Object in the same schema can be in different tablespaces.
When a database user is created,acorresponding schema with the same name is created for that user.
Username and Schema are offen used interchangeably.