解釋數據庫、表空間、數據文件、表、數據的最好辦法就是想象一個裝滿東西的櫃子。數據庫其實就是櫃子,櫃中的抽屜是表空間,抽屜中的文件夾是數據文件,文件夾中的紙是表,寫在紙上的信息就是數據。
表空間的設計理念:
1.Oracle表空間之基本概念
ORACLE數據庫被划分成稱作為表空間的邏輯區域——形成ORACLE數據庫的邏輯結構。一個ORACLE數據庫能夠有一個或多個Oracle,而一個表空間則對應着一個或多個物理的數據庫文件。表空間是ORACLE數據庫恢復的最小單位,容納着許多數據庫實體,如表、視圖、索引、聚簇、回退段和臨時段等。
每個ORACLE數據庫均有SYSTEM表空間,這是數據庫創建時自動創建的。SYSTEM表空間必須總要保持聯機,因為其包含着數據庫運行所要求的基本信息(關於整個數據庫的數據字典、聯機求助機制、所有回退段、臨時段和自舉段、所有的用戶數據庫實體、其它ORACLE軟件產品要求的表)。 一個小型應用的ORACLE數據庫通常僅包括SYSTEM表空間,然而一個稍大型應用的ORACLE數據庫采用多個表空間會對數據庫的使用帶來更大的方便。 2.Oracle表空間之作用 表空間的作用能幫助DBA用戶完成以下工作: 1.決定數據庫實體的空間分配; 2.設置數據庫用戶的空間份額; 3.控制數據庫部分數據的可用性; 4.分布數據於不同的設備之間以改善性能; 5.備份和恢復數據。 用戶創建其數據庫實體時其必須於給定的表空間中具有相應的權力,所以對一個用戶來 說,其要操縱一個ORACLE數據庫中的數據,應該: 1.被授予關於一個或多個表空間中的RESOURCE特權; 2.被指定缺省表空間; 3.被分配指定表空間的存儲空間使用份額; 4.被指定缺省臨時段表空間。
一、數據庫名 1.數據庫名的概念
數據庫名(db_name)就是一個數據庫的標識,就像人的身份證號一樣。如果一台機器上裝了多全數據庫,那么每一個數據庫都有一個數據庫名。在數據庫安裝或創建完成之后,參數DB_NAME被寫入參數文件之中。
數據庫名在$ORACLE_HOME/admin/db_name/pfile/init.ora文件中
########################################### # Database Identification ########################################### db_domain="" db_name=orcl 在創建數據庫時就應考慮好數據庫名,並且在創建完數據庫之后,數據庫名不宜修改,即使要修改也會很麻煩。因為,數據庫名還被寫入控制文件中,控制文件是以 二進制型式存儲的,用戶無法修改控制文件的內容。假設用戶修改了參數文件中的數據庫名,即修改DB_NAME的值。但是在Oracle啟動時,由於參數文 件中的DB_NAME與控制文件中的數據庫名不一致,導致數據庫啟動失敗,將返回ORA-01103錯誤。
2.數據庫名的作用
數據庫名是在安裝數據庫、創建新的數據庫、創建數據庫控制文件、修改數據結構、備份與恢復數據庫時都需要使用到的。 有很多Oracle安裝文件目錄是與數據庫名相關的,如: winnt: F:\oracle\product\10.2.0\oradata\DB_NAME\...
又如參數文件pfile: winnt: F:\oracle\product\10.2.0\admin\DB_NAME\pfile\init.ora.54200885729
如果控制文件損壞或丟失,數據庫將不能加載,這時要重新創建控制文件,方法是以nomount方式啟動實例,然后以create controlfile命令創建控制文件,當然這個命令中也要指明DB_NAME。
3.修改數據庫名
建議:應在創建數據庫時就確定好數據庫名,數據庫名不應作修改,因為修改數據庫名是一件比較復雜的事情。 現在就來說明一下,如何在已創建數據之后,修改數據庫名。步驟如下: (1)關閉數據庫。 (2)修改數據庫參數文件中的DB_NAME參數的值為新的數據庫名。 (3)以NOMOUNT方式啟動實例,修建控制文件(有關創建控制文件的命令語法,請參考oracle文檔)
4.查詢當前數據庫名
方法一: select name from v$database; 方法二:show parameter db 方法三:查看參數文件
二、數據庫實例名
1.數據庫實例名的概念(instance_name) 先來解釋以下,實例是什么東西。實例是訪問Oracle數據庫所需的一部分計算機內存和輔助處理后台進程,是由進程和這些進程所使用的內存(SGA)所構成一個集合,它根本不需要一個與其相關聯的數據庫,沒有任何數據文件也可以啟動實例。下面是Oralce的啟動過程: sqlplus / as sysdba sql>startup nomount #啟動了一個實例,現在SGA分配了,進程在運行,除數據庫所有的東西都啟動了 sql>alter database mount#利用控制文件(init.ora文件中指定)定位重作文件、數據文件、臨時文件 sql>alter database open#數據庫可供任何人通過這個實例訪問。 所以可以這么理解:大家訪問Oracle都是訪問一個實例,但這個實例如果關聯了數據庫文件,就是可以訪問的,如果沒有,就會得到實例不可用的錯誤。 實例名指的是用於響應某個數據庫操作的數據庫管理系統的名稱。她同時也叫SID。實例名是由參數instance_name決定的。如果這個參數不被指定(即instance_name沒有被指定為任何值),那么實例的名字由該用戶的環境變量ORACLE_SID(注意這里是大寫)決定。在windows平台下,則是注冊表中oracle_sid值決定。
實例名和SID是一一對應的,名字相同,但在存儲位置不同。
2.實例和數據庫 實例和數據庫之間的區別如下: (1)實例是臨時的,它只在相關的進程和內存集合存在時存在;數據庫是永久的,只要文件存在它就存在 (2)一個實例在其生存期內可安裝和打開單個數據庫;數據庫可以被很多實例安裝和打開,或者一個接一個的實例安裝和打開,或者由多個實例同時安裝和打開(RAC) 順便提一下RAC,簡單來說RAC就是多個實例同時打開一個數據庫文件的系統,在結構上是多台機器,每天機器運行一個實例,每個實例都打開同一個數據庫 (這個是用磁盤共享技術實現的),這些實例之間需要同步高速緩存,這樣保證多個實例是完全一致的,不會相互沖突乃至覆蓋。
數據庫實例名(instance_name)用於對外部連接。在操作系統中要取得與數據庫的聯系,必須使用數據庫實例名。例如,要去連接一個數據庫服務器,就必須知道其數據庫實例名,只知道數據庫名是沒有用的。與數據庫名不同,在數據安裝或創建數據庫之后,實例名可以被修改。數 據庫名和實例名可以相同也可以不同。在一般情況下,數據庫名和實例名是一對一的關系,但如果在oracle並行服務器架構(即oracle實時應用集群) 中,數據庫名和實例名是一對多的關系(一個數據庫對應多個實例,同一時間內用戶只一個實例相聯系,當某一實例出現故障,其它實例自動服務,以保證數據庫安 全運行) 。 3.查詢當前數據庫實例名
方法一:select instance_name from v$instance; 方法二:show parameter instance
三、ORACLE_SID
在實際中,對於數據庫實例的標識有時使用實例名,有時使用ORACLE_SID,它們有什么區別呢?
(ORACLE_SID) OS<----------------> ORACLE 數據庫 <--------(instance_name(實例名))
上圖表示實例名instance_name、ORACLE_SID與數據庫及操作系統之間的關系,雖然這里列出的兩個參數都是數據庫實例名,但 instance_name參數是ORACLE數據庫的參數,此參數可以在參數文件中查詢到;而ORACLE_SID參數則是操作系統環境變量,與 ORACLE_BASE、ORACLE_HOME等用法相同,用於和操作系統交互。也就是說,在操作系統中要想得到實例名,就必須使用ORACLE_SID。且ORACLE_SID必須與instance_name的值一致,否則,你將會收到一個錯誤,在winnt平台,是“TNS:協議適配器錯誤”。
四、數據庫域名與全局數據庫名
1.概念與聯系
使用數據庫名(da_name)對一個數據庫進行唯一標識,這種表示對於單個數據庫是足夠的,但是隨着由多個數據庫構成的分布式數據庫的普及,這種命令數 據庫的方法給數據庫的管理造成一定的負擔,因為各個數據庫的名字可能一樣,造成管理上的混亂。為了解決這種情況,引入了db_domain參數,這樣在數 據庫的標識是由db_name和db_domain兩個參數共同決定的,避免了因為數據庫重名而造成管理上的混亂。這類似於互連網上的機器名的管理。我們 將db_name和db_domain兩個參數用‘.’連接起來,表示一個數據庫,並將該數據庫的名稱稱為global_name,即它擴展了 db_name。db_name參數只能由字母、數字、’_’、’#’、’$’組成,而且最多8個字符。
數據庫域名(db_domain):定義一個數據庫所在的域,該域的命名同互聯網的’域’沒有任何關系,只是數據庫管理員為了更好的管理分布式數據庫而根據實際情況決定的。當然為了管理方便,可以將其等於互聯網的域。
全局數據庫名(global_name):對一個數據庫(Oracle database)的唯一標識,oracle建議用此種方法標識數據庫。該值是在創建數據庫時決定的,缺省值為db_name. db_domain。在以后對參數文件中db_name與db_domain參數的任何修改不影響global_name的值,如果要修改 Global_name,只能用alter database rename global_name to <db_name.db_domain>命令進行修改,然后修改相應參數。
2.查詢數據庫域名
方法一:select value from v$parameter where name = 'db_domain'; 方法二:show parameter domain 方法三:在參數文件中查詢
3.例子
全國交通GIS系統的分布式數據庫,其中: 吉林節點: jl.jtgis 吉林長春節點: cc.jl.jtgis 河北節點: hb.jtgis 河北石家庄節點:sjz.hb.jtgis 這些就是數據庫域名,數據庫域名在存在於參數文件中,她的參數是db_domain. 全局數據庫名=數據庫名+數據庫域名,如前述福建節點的全局數據庫名是:orcl.jl.jtgis
五、數據庫服務名 該參數是oracle8i新引進的。在8i以前,我們用SID來表示數據庫的一個實例,但是在Oracle的並行環境中,一個數據庫對應多個實例,這樣就需要多網絡服務名,設置繁瑣。為了方便並行環境中的設置,引進了service_name參數。該參數對應一個數據庫,而不是一個實例,而且該參數有許多其它的好處。 該參數的缺省值為db_name.db_domain,即等於global_name.如果數據庫有域名,則數據庫服務名就是全局數據庫名;否則,數據庫 服務名與數據庫名相同。一個數據庫可以對應多個service_name,以便實現更靈活的配置。該參數與SID沒有直接關系,即 service_name 不必與SID一樣。 從Oracle8i開始的oracle網絡組件,數據庫與客戶端連接的主機字符串使用的是數據庫服務名。之前用的是SID,即數據庫實例名。
查詢數據庫服務名 方法一:select value from v$parameter where name = 'service_name'; 方法二:show parameter service_name
六、網絡服務名
網絡服務名(net_service_name),又可以稱為數據庫別名(database alias)。是客戶端程序訪問數據庫時所需要,屏蔽了客戶端如何連接到服務器端的細節,實現了數據庫的位置透明的特性。網絡服務名被記錄在 tnsnames.ora文件中。
可以通過netmgr來新建網絡服務名。
網絡服務名是從客戶端的角度出發,當客戶端連接遠程數據庫或其他服務時,可以指定網絡服務名。因此需要使用一個或多個命名方法將此Net服務名解析為連接數據庫或其他服務的連接描述符,看下面:
[本地]——將存儲在本地客戶機的tnsnames.ora文件中的網絡服務名解析為連接描述符。 [Oracle Names]——由Oracle名字服務器提供為網絡上的每個Oracle Net服務提供解析方法 [主機名]——通過TCP/IP環境中的主機別名連接到Oracle數據庫服務 [Sun NIS]/[DCE CDS]——專用系統用的,在Windows 2000系統環境下不適用