標籤:
一、前言
筆者對於Oracle資料庫的理解,很長時間停留在“鏡花水月”的狀態,你說不懂吧,又會用,一較真起來吧,對一些基本概念又說不出一個道道來~如果想要在編碼的路上走得更遠,這個必定也是繞不過的坎,所以筆者決定花點時間,整理清楚一下Oracle中常常提及的概念~
首先,筆者先聲明一下這篇文章會解釋的概念包括哪些:資料庫(database)、資料庫執行個體(DB instance)、資料庫名(DB_NAME)、資料庫網域名稱、全域資料庫名、資料庫服務名(SERVICE_NAME)、資料表空間(tablespace)、方案(schema)、段(segment)、區(extent)、塊(block)、SID。
二、本文
2.1 資料庫(database)
通常情況下我們稱的“資料庫”,並不僅指物理的資料集合,它包含是一系列物理檔案的集合(資料檔案,控制檔案,聯機日誌,參數檔案等)以及資料庫管理系統,即資料 庫是物理資料、記憶體、作業系統進程的組合體。
2.2 資料庫執行個體(DB instance)
執行個體是訪問Oracle資料庫所需的一部分電腦記憶體和輔助處理後台進程,是由進程和這些進程所使用的記憶體(SGA)所構成一個集合。其實就是用來訪問和使用資料庫的一個 進程,它只存在於記憶體中。就像Java中new出來的執行個體對象一樣。
2.3 資料庫名(DB_NAME)
資料庫名就是一個資料庫的標識,就像人的社會安全號碼一樣。他用參數DB_NAME表示,如果一台機器上裝了多全資料庫,那麼每一個資料庫都有一個資料庫名。在資料庫安 裝或建立完成之後,參數DB_NAME被寫入參數檔案init.ora.xxxxxxx之中。格式如下:
DB_NAME=ctoporcl
在建立資料庫時就應考慮好資料庫名,並且在建立完資料庫之後,資料庫名不宜修改,即使要修改也會很麻煩。因為,資料庫名還被寫入控制檔案中,控制檔案是以二進位 型式儲存的,使用者無法修改控制檔案的內容。假設使用者修改了參數檔案中的資料庫名,即修改DB_NAME的值。但是在Oracle啟動時,由於參數檔案中的DB_NAME與控制文 件中的資料庫名不一致,導致資料庫啟動失敗,將返回ORA-01103錯誤。
資料庫名是在安裝資料庫、建立新的資料庫、建立資料庫控制檔案、修改資料結構、備份與恢複資料庫時都需要使用到的。有很多Oracle安裝檔案目錄是與資料庫名相關 的,如:
win:d:\oracle\product\10.1.0\oradata\DB_NAME\... Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/... pfile: win: d:\oracle\product\10.1.0\admin\DB_NAME\pfile\ini.ora Unix: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora 追蹤檔案目錄: win:/home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/...
另外,在建立資料時,create database命令中的資料庫名也要與參數檔案中DB_NAME參數的值一致,否則將產生錯誤。同樣,修改資料庫結構的語句alterdatabase, 當然也要指出要修改的資料庫的名稱。如果控制檔案損壞或丟失,資料庫將不能載入,這時要重新建立控制檔案,方法是以nomount方式啟動執行個體,然後以create controlfile 命令建立控制檔案,當然這個命令中也是指指DB_NAME。還有在備份或恢複資料庫時,都需要用到資料庫名。總之,資料庫名很重要,要準確理解它的作用。
查詢當前資料庫名:
1)select name from v$database; 2)showparameter db 3)查看參數檔案(init.ora.xxxxx)
修改資料庫名:
前面建議,應在建立資料庫時就確定好資料庫名,資料庫名不應作修改,因為修改資料庫名是一件比較複雜的事情。那麼現在就來說明一下,如何在已建立資料之後, 修改資料庫名。步驟如下:
1)關閉資料庫。
2)修改資料庫參數檔案中的DB_NAME參數的值為新的資料庫名。
3)以NOMOUNT方式啟動執行個體,修建控制檔案(有關建立控制檔案的命令文法,請參考oracle文檔)
2.4 資料庫網域名稱
在分散式資料庫系統中,不同版本的資料庫伺服器之間,不論啟動並執行作業系統是unix或是windows,各伺服器之間都可以通過資料庫鏈路進行遠程複製,資料庫網域名稱主要用 於oracle分布式環境中的複製。
在oracle的分布式系統的同一環境內,如果兩個資料庫的資料庫名不相同,兩個資料庫之間就可以建立資料庫鏈路,進行資料庫的遠程即時傳輸;
如果兩個資料庫的資料庫名相同,則這兩個資料庫之間就不能進行資料複製。
如果要在兩個資料庫名相同的資料庫之間複製資料,就需要增加域,而且兩個資料庫分別具有不同的子域,如果違背這些條件,則兩個資料庫之間就不能複製資料。
什麼時候使用域:
1)在oracle分布式環境中,兩個資料庫之間要通過資料庫鏈路進行資料的遠程傳輸
2)在同一網路環境下,兩個資料庫的資料庫名相同
查詢資料庫的網域名稱:
1)selectvalue from v$parameter where name = ‘db_domain‘; 2)showparameter domain 3)在參數檔案中查詢。
2.5 全域資料庫名
全域資料庫名=資料庫名+資料庫網域名稱
2.6 資料庫服務名(SERVICE_NAME)
Oracle9i版本開始,引入了一個新的參數,即資料庫服務名。參數名是SERVICE_NAME。如果資料庫有網域名稱,則資料庫服務名就是全域資料庫名;否則,資料庫服務名與 資料庫名相同。如果資料庫中沒有定義網域名稱,則資料庫服務名與資料庫名相同。
查詢資料庫服務名:
1)selectvalue from v$parameter where name = ‘service_name‘; 2)showparameter service_name 3)在參數檔案中查詢。
2.7 資料表空間(tablespace)
Oracle資料庫是通過資料表空間來儲存物理表的,一個資料庫執行個體可以有N個資料表空間,一個資料表空間下可以有N張表。有了資料庫,就可以建立資料表空間。資料表空間(tablespace)是數 據庫的邏輯劃分,每個資料庫至少有一個資料表空間(稱作SYSTEM資料表空間)。為了便於管理和提高運行效率,可以使用一些附加資料表空間來劃分使用者和應用程式。例如:USER表空 間供一般使用者使用,RBS資料表空間供復原段使用。一個資料表空間只能屬於一個資料庫。
2.8 方案(schema)
方案(schema)又叫模式,是比資料表空間小一級的邏輯概念,它也是一個邏輯容器。多個使用者可能共用一個資料表空間,那如何區分開每一個使用者?那麼在資料表空間中對每個使用者 都有一個對應的方案(schema),用於儲存單個使用者的資訊。
更專業一點的解釋(schema 的定義):
A schema is a collection of database objects (used by a user.). Schema objects are the logical structures that directly refer to the database’s data. A user is a name defined in the database that can connect to and access objects. Schemas and users help database administrators manage database security.
從定義中我們可以看出schema為資料庫物件的集合,為了區分各個集合,我們需要給這個集合起個名字,這些名字就是我們在企業管理器的方案下看到的許多類似使用者名稱 的節點,這些類似使用者名稱的節點其實就是一個schema,schema裡麵包含了各種對象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。
一個使用者一般對應一個schema,該使用者的schema名等於使用者名稱,並作為該使用者預設schema。這也就是我們在企業管理器方案下看到schema名都為資料庫使用者名稱的原 因。Oracle資料庫中不能新建立一個schema,要想建立一個schema,只能通過建立一個使用者的方法解決(Oracle中雖然有create schema語句,但是它並不是用來建立一個 schema的),在建立一個使用者的同時為這個使用者建立一個與使用者名稱同名的schem並作為該使用者的預設shcema。即schema的個數同user的個數相同,而且schema名字同user 名字一一 對應並且相同,所以我們可以稱schema為user的別名,雖然這樣說並不準確,但是更容易理解一些。
一個使用者有一個預設的schema,其schema名就等於使用者名稱,當然一個使用者還可以使用其他的schema。如果我們訪問一個表時,沒有指明該表屬於哪一個schema中的, 系統就會自動給我們在表上加上預設的sheman名。比如我們在訪問資料庫時,訪問scott使用者下的emp表,通過select * from emp; 其實,這sql語句的完整寫法為select * from scott.emp。在資料庫中一個對象的完整名稱為schema.object,而不是user.object。類似如果我們在建立對象時不指定該對象的schema,在該對象的schema為使用者 的預設schema。這就像一個使用者有一個預設的資料表空間,但是該使用者還可以使用其他的資料表空間,如果我們在建立對象時不指定資料表空間,則Object Storage Service在預設資料表空間中,要想讓對象 儲存在其他資料表空間中,我們需要在建立對象時指定該對象的資料表空間。
2.9 段(segment)
段是oracle資料庫中的分配單位,對象如表、索引等都是以段為單位進行分配。當建立一個表時將建立一個表段,建立一個索引時就建立一個索引段。每一個消耗儲存空間 的對象最終被儲存到一個單一的段中。有復原段、臨時段、聚簇段、索引段等。
2.10 區(extent)
區又叫盤區,是資料檔案中一個連續的分配空間,它比塊要大,由塊組成。有些對象分配空間時可能至少需要兩個盤區,比如復原段,而這兩個盤區不一定要求相連。區的 大小從一個塊到2GB不等。
2.11 塊(block)
塊是資料存放區的物理單位,也是資料檔案中最基礎的單位,資料直接儲存在塊上。是oracle空間分配的最小單位。oracle中的塊大小常見的有三種,2KB、4KB、8KB。塊 的大小在資料庫建立時就已經固定下來,資料庫中每個塊的大小都是相同的,而且所有的塊都有相同的格式,由“塊頭+表目錄+行目錄+空閑空間+資料空間”組成。塊頭包含 著塊類型(比如是表塊、還是索引塊)的資訊、磁碟上塊的位置等資訊。表目錄(table directory),如果有的話,包含著此塊中儲存各行的表的資訊(如果一個塊中存有多個 表中的資料)。行目錄(row directory)包含著資料行的描述資訊,它是一個指標數組,指示了每一行在資料區塊中的物理位置。塊頭、表目錄、行目錄統稱為塊開銷(block overhead),是oracle用來統計、管理塊本身的。剩下的兩部分很簡單,已經存有資料的就是資料空間,暫時沒存的就是空閑空間。
2.12 SID
SID就是instance_name
三、後話
下面對上面幾個容易混淆的概念再做一些說明,希望對各位有所協助~
3.1 SID和SERVICE_NAME的區別
可以簡單的這樣理解:一個公司比喻成一台伺服器,資料庫是這個公司中的一個部門。
1)SID:一個資料庫可以有多個執行個體(如RAC),SID是用來標識這個資料庫內部每個執行個體的名字,就好像一個部門裡,每個人都有一個自己的名字。
2)SERVICE_NAME:是這個資料庫對外宣稱的名字,外面的人要想串連我這個資料庫,你就在用戶端的串連串裡寫上service_name。它就像一個部門的名字,這 個部 門的名稱在看門大爺(listener)那裡有登記,看門大爺一看你是要找SERVICE_NAME這個部門,就告訴你我們公司確實有這個部門,於是你就找到了,連 接就建立了。
用一句話來說就是:SID是對內的,是執行個體層級的一個名字,用來內部之間稱呼用。SERVICE_name是對外的,是資料庫層級的一個名字,用來告訴外面的人,我資料庫 叫"SERVICE_NAME"。你可以通過service_name參數指定這個名字是什麼,可以有多個名字,名字隨便起,叫狗蛋,翠花都沒關係。如果你不指定,預設的是Db_name. Db_domain,也就是global_name。
資料庫裡,還有ORACLE_SID,是告訴OS系統,我這個執行個體叫做什麼。這些易混淆的名字,你要記住,他們不是指資料庫,就是指執行個體,就這兩個東西,別無其它。他們 具體用哪個名字,是要看對誰而言,是什麼場合。是對資料庫,還是對作業系統,還是對外部連結。就像你對父母而言,你有小名叫么兒;對同學而言,你有外號叫燈泡;對辦 事機構,你有正規的名字叫王小明。但歸根到底,是一回事。分清楚這點,就不容易混了。
3.2 ORACLE執行個體和資料庫之間的關係
1)臨時性和永久性
2)執行個體可以在沒有資料檔案的情況下單獨啟動 startup nomount , 通常沒什麼意義
3)一個執行個體在其生存期內只能裝載(alter database mount)和開啟(alter database open)一個資料庫
4)一個資料庫可被許多執行個體同時裝載和開啟(即RAC),RAC環境中執行個體的作用能夠得到充分的體現!
四、參考和引用連結 http://blog.sina.com.cn/s/blog_a5a24bcb01010npc.html http://blog.itpub.net/6906/viewspace-21647/ http://blog.csdn.net/elvis_dataguru/article/details/8984961 http://blog.csdn.net/nrlovestudy/article/details/49684571 http://www.2cto.com/database/201305/213418.html http://blog.csdn.net/z69183787/article/details/25706269 http://www.zhetao.com/content240 http://blog.csdn.net/elvis_dataguru/article/details/8984961 http://www.cnblogs.com/gsk99/archive/2011/04/14/2016216.html http://langgufu.iteye.com/blog/1469055
(文章內容如果有寫錯或者理解錯誤的還望指出,非常感謝~QQ:1163142850~)
Oracle 相關概念詳解