之前學(xué)習(xí)Oracle數(shù)據(jù)庫之后是尔,對于表空間殉了、用戶、schema
等概念一直有些模糊拟枚,也沒有理清楚他們之間的關(guān)系薪铜,最近回過頭重新看了這部分的知識后,將自己對這方面的知識點(diǎn)做一下小結(jié)恩溅,本篇文章并不是常規(guī)的技術(shù)文章隔箍,只作為個(gè)人的小結(jié)分享。
先說說什么是Oracle數(shù)據(jù)庫
Oracle數(shù)據(jù)庫是能滿足我們存取數(shù)據(jù)需要的數(shù)據(jù)管理系統(tǒng)脚乡。完整的Oracle數(shù)據(jù)庫通常由兩部分組成:物理數(shù)據(jù)庫和數(shù)據(jù)庫實(shí)例蜒滩。也就是說,Oracle數(shù)據(jù)庫是物理存儲和內(nèi)存進(jìn)程的集合奶稠。
- 數(shù)據(jù)庫是一系列物理文件的集合(數(shù)據(jù)文件俯艰,控制文件,聯(lián)機(jī)日志锌订,參數(shù)文件等)竹握;
- Oracle數(shù)據(jù)庫實(shí)例則是一組Oracle后臺進(jìn)程/線程以及在服務(wù)器分配的共享內(nèi)存區(qū)。
什么是數(shù)據(jù)庫實(shí)例
當(dāng)我們啟動數(shù)據(jù)庫服務(wù)時(shí)辆飘,就會在內(nèi)存中創(chuàng)建一個(gè)數(shù)據(jù)庫實(shí)例出來啦辐,由這個(gè)Oracle數(shù)據(jù)庫實(shí)例來訪問和控制磁盤中的數(shù)據(jù)文件谓传,常見的數(shù)據(jù)庫實(shí)例有ORCL
。這個(gè)過程可以想象成是JAVA中根據(jù)class
類new
出了一個(gè)對象出來昧甘,我們可以根據(jù)這個(gè)對象調(diào)用具體的數(shù)據(jù)庫方法良拼。一個(gè)數(shù)據(jù)庫可以有多個(gè)實(shí)例,在作數(shù)據(jù)庫服務(wù)集群的時(shí)候可以用到充边。
正如上面介紹的一樣庸推,數(shù)據(jù)庫實(shí)例是Oracle數(shù)據(jù)庫的組成部分,是在內(nèi)存中運(yùn)行浇冰,為用戶提供訪問和操作數(shù)據(jù)庫的后臺進(jìn)程贬媒。
什么是表空間(Table Space)?
Oracle數(shù)據(jù)庫是通過表空間來存儲物理表的肘习,一個(gè)數(shù)據(jù)庫可以劃分為多個(gè)表空間际乘,每個(gè)表空間可以存儲多張表。表空間是數(shù)據(jù)庫的邏輯劃分漂佩,每個(gè)數(shù)據(jù)庫至少有一個(gè)表空間(稱作SYSTEM
表空間)脖含。把數(shù)據(jù)庫當(dāng)做一個(gè)大倉庫,為了管理方便投蝉,我們可以人工將這一片大的空間分為A养葵、B、C等區(qū)間瘩缆,這樣的A/B/C區(qū)間就相當(dāng)于是表空間关拒。(也可以理解為是去餐廳吃飯,每張桌子上面都有一個(gè)桌號庸娱,方便服務(wù)員上菜)着绊。
關(guān)于用戶
有了表空間,下一步自然是建表熟尉。但是在建表之前還有一步归露,就是要先創(chuàng)建用戶,只有用戶才能建表臣樱。用戶是獨(dú)立于表空間的存在靶擦,我們可以從上面的介紹中知道表空間其實(shí)也是數(shù)據(jù)存儲的容器,但用戶可以理解為是數(shù)據(jù)的歸屬者雇毫。還是舉倉庫的例子玄捕,倉庫提供的只是存放物料的空間,但物料的管理人還是具體的一個(gè)個(gè)的倉管棚放,也就是用戶枚粘。當(dāng)然了,倉管應(yīng)該有屬于自己的管轄范圍和權(quán)限飘蚯,所以需要為倉管定義好貨物具體存放的位置馍迄。所以對于用戶來說福也,我們也需要為其指定好對應(yīng)的表空間。
什么是Schema(方案)攀圈?
方案(schema
)又叫模式暴凑,是比表空間小一級的邏輯概念,它也是一個(gè)邏輯容器赘来。Schema
為數(shù)據(jù)庫對象的集合现喳,為了區(qū)分各個(gè)集合,我們需要給這個(gè)集合起個(gè)名字犬辰。schema里面包含了各種對象如tables
, views
, sequences
, stored procedures
, synonyms
, indexes
, clusters
, 和 database links
嗦篱。
我們知道一共表空間可以被多個(gè)用戶共用,那如何區(qū)分開每一個(gè)用戶幌缝?那么在表空間中對每個(gè)用戶都有一個(gè)對應(yīng)的方案灸促,用于保存單個(gè)用戶的信息。舉倉庫的例子來說涵卵,我們現(xiàn)在把倉庫的A區(qū)進(jìn)一步分為N個(gè)房間浴栽,每個(gè)房間是屬于特定的倉管的,這一個(gè)個(gè)的能夠存儲貨物的房間就相當(dāng)于是schema
轿偎,一個(gè)房間由一個(gè)倉管負(fù)責(zé)吃度。
關(guān)于數(shù)據(jù)文件(dbf、ora):
數(shù)據(jù)文件是數(shù)據(jù)庫的物理存儲單位贴硫。數(shù)據(jù)庫的數(shù)據(jù)是存儲在表空間中的,真 正是在某一個(gè)或者多個(gè)數(shù)據(jù)文件中伊者。而一個(gè)表空間可以由一個(gè)或多個(gè)數(shù)據(jù)文件組成英遭,一個(gè)數(shù)據(jù)文件只能屬于一個(gè)表空間。一旦數(shù)據(jù)文件被加入到某個(gè)表空間后亦渗,就不能刪除這個(gè)文件挖诸,如果要刪除某個(gè)數(shù)據(jù)文件,只能刪除其所屬于的表空間才行法精。
關(guān)于表數(shù)據(jù)和用戶的關(guān)系
表的數(shù)據(jù)多律,是有用戶放入某一個(gè)表空間的,而這個(gè)表空間會隨機(jī)把這些表數(shù)據(jù)放到一個(gè)或者多個(gè)數(shù)據(jù)文件中搂蜓。由于oracle的數(shù)據(jù)庫不是普通的概念狼荞,oracle是有用戶和表空間對數(shù)據(jù)進(jìn)行管理和存放的。但是表不是有表空間去查詢的帮碰,而是由用戶去查的相味。因?yàn)椴煌脩艨梢栽谕粋€(gè)表空間建立同一個(gè)名字的表!這里區(qū)分就是用戶了殉挽!
2023-08補(bǔ)充
(一)缺省用戶名和缺省表空間
從上面的文字描述中我們可以知道丰涉,表空間是數(shù)據(jù)存儲的邏輯單位拓巧,但實(shí)際上一張表的歸屬不單單看表空間,還得看是屬于表空間的哪個(gè)用戶的一死。所以我們在oracle數(shù)據(jù)庫中創(chuàng)建表肛度,需要注意我們創(chuàng)建的表有沒有放在正確的位置。
我們看看下面的標(biāo)準(zhǔn)建表語句:
CREATE TABLE user_name.table_name (
column1 datatype [constraints],
column2 datatype [constraints],
column3 datatype [constraints],
...
table_constraints
) TABLESPACE tablespace_name;
- 當(dāng)未顯式指定
user_name
時(shí)投慈,此時(shí)所創(chuàng)建的表會默認(rèn)放在當(dāng)前登錄的用戶上面 - 當(dāng)未顯式指定
tablespace_name
時(shí)承耿,此時(shí)所創(chuàng)建的表會默認(rèn)放在指定用戶的默認(rèn)表空間中。若建表語句中也未指定user_name
逛裤,則表會默認(rèn)放在當(dāng)前登錄用戶的默認(rèn)表空間中
為什么這里會特別強(qiáng)調(diào)表空間的歸屬呢瘩绒?
因?yàn)閷?shí)際上一個(gè)用戶可以有多個(gè)表空間,而且在一些復(fù)雜的項(xiàng)目中用戶不同的表空間存儲的數(shù)據(jù)類型带族、磁盤大小可能都是不同的锁荔。如果在建表的時(shí)候沒有注意好表存放的表空間的話,那么表就會放在用戶默認(rèn)的表空間里面蝙砌,占用了默認(rèn)表空間的存儲容量阳堕。
(二)關(guān)于oracle的版本
oracle版本 | 時(shí)間 |
---|---|
Oracle 1 | 1979年 |
Oracle 2 | 1983年 |
Oracle 3 | 1984年 |
Oracle 4 | 1985年 |
Oracle 5 | 1986年 |
Oracle 6 | 1988年 |
Oracle 7 | 1992年 |
Oracle 8 | 1997年 |
Oracle 8i | 1999年("i"代表Internet ) |
Oracle 9i | 2001年 |
Oracle 10g | 2003年("g"代表grid 網(wǎng)格計(jì)算) |
Oracle 11g | 2007年 |
Oracle 12c | 2013年("c"代表cloud 云計(jì)算) |
Oracle 18c | 2018年 |
Oracle 19c | 2019年 |
Oracle 21c | 2020年 |
oracle自1979年推出以來,有三個(gè)標(biāo)志性的版本择克,分別是8i恬总、10g、12c
肚邢,代表著不同版本中oracle的戰(zhàn)略性目標(biāo)壹堰,oracle8i,引入了一些針對互聯(lián)網(wǎng)應(yīng)用的功能和改進(jìn)骡湖,包括更好的分布式數(shù)據(jù)庫支持贱纠、Java集成和Web應(yīng)用程序開發(fā)工具;oracle10g這個(gè)版本引入了網(wǎng)格計(jì)算的概念响蕴,旨在提供更高的可伸縮性谆焊、可靠性和性能。它支持在多個(gè)服務(wù)器上分布和管理數(shù)據(jù)庫資源浦夷,以實(shí)現(xiàn)更好的負(fù)載平衡和容錯(cuò)能力辖试;oracle12c強(qiáng)調(diào)了Oracle數(shù)據(jù)庫在云計(jì)算環(huán)境中的功能和優(yōu)勢。它引入了一些云相關(guān)的功能劈狐,如多租戶架構(gòu)罐孝、自動化管理和數(shù)據(jù)庫即服務(wù)(Database as a Service)等。
需要注意的是肥缔,oracle并不是在oracle10g版本后才有分布式數(shù)據(jù)庫的管理能力肾档,之前就有了。只是10g版本推出的網(wǎng)格計(jì)算功能增強(qiáng)了分布式數(shù)據(jù)庫的管理能力和資源分配能力,使得數(shù)據(jù)庫能夠更好地適應(yīng)大規(guī)模數(shù)據(jù)處理和分析的需求怒见。
oracle在12c版本中俗慈,提出了"多租戶架構(gòu)",允許在單個(gè)數(shù)據(jù)庫實(shí)例中創(chuàng)建多個(gè)獨(dú)立的容器數(shù)據(jù)庫(CDB)和子數(shù)據(jù)庫(PDB)遣耍。這種架構(gòu)可以實(shí)現(xiàn)更高級別的資源隔離和共享闺阱,簡化管理,并提供更好的多租戶支持舵变。這種特性讓我們在數(shù)據(jù)庫的管理上更加的靈活酣溃,在原先我們要想實(shí)現(xiàn)資源隔離類似的功能應(yīng)該是只能通過創(chuàng)建多個(gè)數(shù)據(jù)庫實(shí)例來實(shí)現(xiàn),而現(xiàn)在只需要在一個(gè)數(shù)據(jù)庫實(shí)例中創(chuàng)建多個(gè)容器數(shù)據(jù)庫纪隙,或者在一個(gè)容器數(shù)據(jù)庫創(chuàng)建多個(gè)子數(shù)據(jù)庫就可以實(shí)現(xiàn)資源隔離(和共享)的效果赊豌。(在容器數(shù)據(jù)庫級別上創(chuàng)建的用戶、角色绵咱、表空間等對象可以被所有子數(shù)據(jù)庫共享和使用)
參考資料:
Oracle數(shù)據(jù)庫碘饼、實(shí)例、用戶悲伶、表空間艾恼、表之間的關(guān)系 https://blog.csdn.net/NRlovestudy/article/details/49684571
表空間與用戶的關(guān)系 表空間和數(shù)據(jù)文件的關(guān)系 https://www.cnblogs.com/lion88/p/4343890.html