參考:http://www.zhetao.com/content240
在實際的開發應用中,關於Oracle數據庫,經常聽見有人說建立一個數據庫,建立一個Instance,啟動一個Instance之類的話。
其實問他們什么是數據庫,什么是Instance,很可能他們給的答案就是數據庫就是Instance,Instance就是數據庫啊,沒有什么區別。
在這里,只能說雖然他們Oracle用了可能有了一定的經驗,不過基礎的概念還是不太清楚。(我目前就是這個狀態)
一、什么是數據庫,其實很簡單,數據庫就是存儲數據的一種媒介。比如常用的文件就是一種,在Oracle10G中,數據的存儲有好幾種。
第一種是文件形式,也就是在你的磁盤中創建一批文件,然后在這些文件中存儲信息。
第二種就是磁盤陣列形式,這個是什么意思呢,這個就是說明數據庫不是存放為某個文件,而是把一個或者多個磁盤格式化成Oracle的一種格式了,
等於整個磁盤就是存放Oracle數據庫的,不能作為別的用途。這樣的優點是存儲性能高,因為不再借助別的文件格式了,而是把整個磁盤都成為
Oracle最適應的文件系統格式。
當然還可能有別的形式,比如網絡什么的。不過我們最常用的還是文件格式的,在文件格式中,數據庫指的就是那些數據文件,
控制文件以及REDO文件等等一系列文件。
二、什么是Instance,其實就是指的操作系統中一系列的進程以及為這些進程所分配的內存塊。在Oracle中,我們可以新建一個Oracle的Instance,
這個時候雖然有了進程還有SGA等一系列的內存快,但是這個時候並沒有把數據庫文件讀取進來。所以只是一個實例,在后來,你可以通過命令手動
或者自動地把數據庫文件加載進我們的數據庫Instance中,這個時候的數據庫才可以讓我們真正的開始訪問操作。所以說,數據庫的應用如果想實現,
數據庫和數據庫Instance是缺一不可的,如果只有數據庫的那些文件,那么,只能代表數據在這個文件中,但是我們無法直接進行操作。
而如果只有數據庫Instance,那么我們雖然可以進行操作,但是也不知道操作哪些數據,操作生成的數據也無法保存等等。所以,當一個Oracle Instance
真正Load了一個Oracle Database了以后,數據庫才可以被我們使用。
在這里要注意一點的是,Oracle的實例在啟動以后,只能load一次數據庫,如果想把數據庫與Instance斷開,然后再重新掛在一個數據庫Instance,
那么你首先把數據庫Instance進程結束,然后重新建立這個instance的一個進程,再load另外一個數據庫。否則肯定要拋除ORA-16169錯誤,
說數據庫已經被打開。因為一個數據庫Instance在其生存期中最多只能load和打開一個instance.
剛接觸ORACLE的人肯定會對實例和數據庫感到困惑,實例到底代表些什么?為什么會有這個概念的出現?
ORACLE實例 = 進程 + 進程所使用的內存(SGA)
實例是一個臨時性的東西,你也可以認為它代表了數據庫某一時刻的狀態!
數據庫 = 重做文件 + 控制文件 + 數據文件 + 臨時文件
數據庫是永久的,是一個文件的集合。
三、ORACLE實例和數據庫之間的關系
1. 臨時性和永久性
2. 實例可以在沒有數據文件的情況下單獨啟動 startup nomount , 通常沒什么意義
3. 一個實例在其生存期內只能裝載(alter database mount)和打開(alter database open)一個數據庫
4. 一個數據庫可被許多實例同時裝載和打開(即RAC),RAC環境中實例的作用能夠得到充分的體現!
四、下面對實例和數據庫做詳細的詮釋:
在Oracle領域中有兩個詞很容易混淆,這就是“實例”(instance)和“數據庫”(database)。作為Oracle術語,這兩個詞的定義如下:
數據庫(database):物理操作系統文件或磁盤(disk)的集合。使用Oracle 10g的自動存儲管理(Automatic Storage Management,ASM)或RAW分區時,
數據庫可能不作為操作系統中單獨的文件,但定義仍然不變。
實例(instance):一組Oracle后台進程/線程以及一個共享內存區,這些內存由同一個計算機上運行的線程/進程所共享。這里可以維護易失的、非持久性內容
(有些可以刷新輸出到磁盤)。就算沒有磁盤存儲,數據庫實例也能存在。也許實例不能算是世界上最有用的事物,不過你完全可以把它想成
是最有用的事物,這有助於對實例和數據庫划清界線。
這兩個詞有時可互換使用,不過二者的概念完全不同。
實例就是一組操作系統進程(或者是一個多線程的進程)以及一些內存。這些進程可以操作數據庫;
數據庫只是一個文件集合(包括數據文件、臨時文件、重做日志文件和控制文件)。在任何時刻,一個實例只能有一組相關的文件(與一個數據庫關聯)。
大多數情況下,反過來也成立:一個數據庫上只有一個實例對其進行操作。不過,Oracle的真正應用集群(Real Application Clusters,RAC)是一個例外,
這是Oracle提供的一個選項,允許在集群環境中的多台計算機上操作,這樣就可以有多台實例同時裝載並打開一個數據庫(位於一組共享物理磁盤上)。
由此,我們可以同時從多台不同的計算機訪問這個數據庫。Oracle RAC能支持高度可用的系統,可用於構建可擴縮性極好的解決方案。
實例 就是治理相關庫的內存結構的名字(由SGA、PGA、服務器進程、用戶進程、后台進程等組成)
數據庫 就是實際的磁盤上的文件(數據文件、日志文件、控制文件等),負責保存數據,但由對應的實例來操作它的數據
服務名 就是對外公布的名稱,為網絡監聽服務
其實,在我們傳統的概念里,數據庫是一個統稱的名字,在Oracle中,你可以把“數據庫”理解成一個大概念,也要把它理解成一個小概念
1、一個Oracle數據庫系統中可以同時安裝幾個數據庫,每一個數據庫對應一個唯一的實例,但是OPS系統除外,可以多個實例同時對一個數據庫操作,稱為並行服務器
2、只是一個名字,SID即是INSTANCE_NAME,SERVICE_NAMES主要用在監聽器中,為了方便吧,有些是為了傳統習慣的延續,有些是為了更方便的使用
3、NET EASY CONFIG操縱的應該是主機字符串,是為客戶端服務的,
一個數據庫可以對外公布多個服務名(SERVICE_NAMES)
一個客戶端也可以用多個主機字符串連接到同一個數據庫服務器上
4、一個OS上可以裝多個Oracle數據庫(小的概念),每個庫可以對外公布多個服務名,都通過init.ora和listener.ora來實現
主機字符串,數據庫服務名,數據庫別名,不太一樣。
service_names是對外的服務名,是服務器端使用的,一個庫可以設置多個對外服務名,以實現不同的目的
“主機字符串”的叫法主要在SQL*Plus中使用,是在客戶端使用,
“數據庫別名”主要用在一些開發工具連接Oracle服務器時使用,是通俗叫法
還有像配置ODBC時的Data Source的Service Name,
它們都是一個道理,指向的都是客戶端tnsnames.ora文件中的一小段文本
1、在SQL/PLUS中的登陸中,用USER/PWD@***,那么,這個***是主機字符串。
2、在設置ODBC時的用戶和密碼一定要是ORACLE中的合法用戶和密碼,但不輸也行,引用ODBC名時再給出也可以。
3、若要向ORACLE代理商購買ORACLE,是以用戶數來算錢的。那么,這個“用戶”跟我們在ORACLE中通過
CREATE USER USERNAME IDENTIFIED BY PASSWORD創建的用戶是不同概念,“用戶數”指的是並發訪問用戶數,
(我理解是同時間訪問同一個內存地址的進程數)。要是我買了8個用戶的,可以建幾十、上百個用戶也沒問題,只要峰值達不到並發數就可以了。
打個比方,你的名字叫小明,但是你有很多外號。你父母叫你小明,但是朋友都叫你的外號。
這里你的父母就是oracle實例,小明就是sid,service name就是你的外號。
sid用於實例區分各個數據庫,service name用於外部鏈接。
對於初接觸Oracle 數據庫的人來講,很容易混淆的兩個概念即是Oracle 實例和Oracle 數據庫。這兩
概念不同於SQL sever下的實例與數據庫,當然也有些相似之處。只是在SQL server我們根本不需要花費太
多的精力去搞清SQL實例和數據庫,因為它簡單易於理解。下面簡要說明一下SQL實例、數據庫,更多的是講
述Oracle下的實例及數據庫。
=====================================================
一、SQL server中的實例與數據庫
1.SQL中的實例指的是一個SQL server服務器上僅有一個缺省實例。缺省實例名即為機器名ServerName
(或IP),如果在同一台機器上再安裝SQL server,我們可以對實例命名如ServerName/InstanceName。
即一台SQL server服務器上可以存在多個不同的實例。一個實例下可以存在多個不同的數據庫。
對於不同實例下的數據庫的訪問,使用ServerName/InstanceName:PortNo即可實現訪問,缺省實例
為ServerName:PortNo。
2.對不同的實例配置IP地址,相關的訪問協議,端口等等。
3.實例的可訪問性需要啟動該實例對應的相關服務。此處需要注意的是實例名和實例的服務名並不是相
同的。缺省的實例的服務名為MSSQLSERVER,而命名實例的服務名為MSSQL$INSTANCE_NAME。
4.實例的相關功能性的設置可以通過外圍應用配置來實現。
=======5.上述完成后,即可實現對數據庫的訪問。
=======================================================
一個Oracle Server由一個Oracle實例和一個Oracle數據庫組成。
即:Oracle Server = Oracle Instance + Oracle Database
Oracle實例
包括了內存結構(SGA)和一系列后台進程(Background Process),兩者合起來稱為一個Oracle實例
即:Oracle Instance = SGA + Background Process
Oracle內存結構
包含系統全局區(SGA)和程序全局區(PGA)
即Oracle Memory Structures = SGA + PGA
SGA由服務器和后台進程共享
PGA包含單個服務器進程或單個后台進程的數據和控制信息,與幾個進程共享的SGA 正相反,PGA是
只被一個進程使用的區域,PGA 在創建進程時分配在終止進程時回收。即由服務器進程產生。
1.SGA
系統全局區SGA,SGA = 數據緩沖區+ 重做日志緩沖區+ 共享池+ 大池+ Java 池+ 流池
系統全局區是動態的,由參數SGA_MAX_SIZE決定。
查看當前系統的SGA大小:show parameter sga_max_size;
要修改:alter system set sga_max_size=1200m scope=spfile;
因為實例內存的分配是在數據庫啟動時進行的,所以要讓修改生效,要重啟數據庫。
ORACLE 10G 引入了ASMM(自動共享內存管理),DBA只需設置SGA_TARGET,ORACLE就會
自動的對共享池、JAVA池、大池、數據緩沖區、流池進行自動調配。取消自動調配就是
SGA_TARGET設為。
數據緩沖區(Database buffer cache):存儲從數據文件中獲得的數據塊的鏡像
大小由db_cache_size 決定
查看:show parameter db_cache_size;
設置:alter system set db_cache_size=800M;
重做日志緩沖區(Redo log buffer):對數據庫的任何修改都按順序被記錄在該緩沖,然后由LGWR進程將
它寫入磁盤,大小由LOG_BUFFER決定
共享池(Shared pool):是SGA中最關鍵的內存片段,共享池主要由庫緩存(共享SQL區和PL/SQL區)和數據字典緩存組成,
它的作用是存放頻繁使用的sql,在有限的容量下,數據庫系統根據一定的算法決定何時釋放共享池中的sql。
庫緩存大小由shared_pool_size 決定
查看:show parameter shared_pool_size
修改:alter system set shared_pool_size=120m;
數據字典緩存:
存儲數據庫中數據文件、表、索引、列、用戶和其它數據對象的定義和權限信息
大小由shared_pool_size 決定,不能單獨指定
大池(Large pool):是一個可選的區域,用於一些大型的進程如Oracle的備份恢復操作、IO服務器進程等
Java 池:該程序緩沖區就是為Java 程序保留的。如果不用Java程序沒有必要改變該緩沖區的默認大小
流池(Stream pool):被Oracle流所使用
2.PGA
是為每個用戶進程連接ORACLE數據庫保留的內存進程創建時分配,進程結束時釋放,只能被一個進程使用。
PGA包括了以下幾個結構:
排序區、游標狀態區、會話信息區、堆棧區
由參數:pga_aggregate_target 決定
3.幾類進程:
用戶進程,服務器進程,后台進程,其它可選進程
用戶進程:在用戶連接數據庫產生,請求oracle服務器連接,必須要先建立一個連接,不會直接和oracle服務器連接。
服務器進程:當連接實例並建立用戶會話時產生,獨立服務器或者提供共享服務器都能產生。
后台進程:維持物理和內存之間的聯系,用來管理數據庫的讀寫,恢復和監視等工作。服務器進程主要是通過它和用戶進程
進行聯系和溝通,並由它和用戶進程進行數據的交換。在Unix機器上,Oracle后台進程相對於操作系統進程,也就是說,
一個Oracle后台進程將啟動一個操作系統進程。在Windows機器上,Oracle后台進程相對於操作系統線程,打開任務管理器,
我們只能看到一個ORACLE.EXE的進程,但是通過另外的工具,就可以看到包含在這里進程中的線程。
可選進程:ARCN 歸檔進程、RECO、SNNN、PNNN
必須要有的后台進程:
DBWn數據庫寫進程、PMON程序監控進程、SMON系統監控進程、LGWr日志寫進程、CKPT檢查點進程
DBWn(數據庫寫進程),曾用名DBWr(DateBase Writer), 后來允許多個進程寫data file就改成DBWn了。負責將修改過的
數據塊從數據庫緩沖區高速緩存寫入磁盤上的數據文件中。
寫入條件:發生檢查點、臟緩存達到限制、沒有自由的緩存、超時發生、表空間離線、表空間只讀、表被刪除或者截斷、
開始備份表空間。可以修改數據寫進程的數量
alter system set db_writer_processes=3 scope=spfile;
PMON(程序監控進程):清除失效的用戶進程,釋放用戶進程所用的資源。
如PMON將回滾未提交的工作,釋放鎖,釋放分配給失敗進程的SGA資源。
清除失敗的進程
回滾事務
釋放鎖
釋放其他資源
SMON(系統監控進程):檢查數據庫的一致性,當啟動失敗時完成災難恢復等。
實列恢復時,前滾所有重做日志中的文件,打開數據庫為了用戶能訪問,回滾未提交的事務,釋放臨時表空間
清除臨時空間,聚結空閑空間,從不可用的文件中恢復事務的活動,OPS中失敗節點的實例恢復
清除OBJ$表
縮減回滾段
使回滾段脫機
LGWr(日志寫進程):將重做日志緩沖區中的更改寫入在線重做日志文件。
條件:
提交的時候(commit)
達到/滿
每隔秒
有大於M 重做日志緩沖區未被寫入磁盤
DBWr需要寫入的數據的SCN號大於LGWr記錄的SCN號,DBWr觸發LGWr寫入
超時
在dbwr進程些之前寫日志
CKPT(檢查點進程):DBWr/LGWr的工作原理,造成了數據文件,日志文件,控制文件的不一致,CKPT進程負責同步數據文件,
日志文件和控制文件,CKPT會更新數據文件/控制文件的頭信息
條件:
在日志切換的時候
數據庫用immediate ,transaction ,normal選項shutdown數據庫的時候
根據初始話文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的設置的數值來確定
用戶觸發
ARCN(歸檔進程)
在每次日志切換時把已滿的日志組進行備份或歸檔
條件:
數據庫以歸檔方式運行的時候
RECO
負責解決分布事物中的故障。Oracle可以連接遠程的多個數據庫,當由於網絡問題,有些事物處於懸而未決的狀態。
RECO進程試圖建立與遠程服務器的通信,當故障消除后,RECO進程自動解決所有懸而未決的會話。
Server Process(服務進程)
分為專用服務進程(Dedicated Server Process)和共享服務進程(MultiTreaded Server Process)
專用服務進程:一個服務進程對應多個用戶進程,輪流為用戶進程服務。
用戶進程(User Process)、服務進程(Server Process)、后台進程(Background Processes)的啟動
用戶進程: 數據庫用戶請求Oralce server會話時被啟動
服務進程:當用戶會話啟動后,連接到Oracle實例時該進程被啟動
后台進程:當Oracle實例被啟動時,啟動相關的后台進程
三、Oracle 數據庫
一系列物理文件的集合
包括控制文件、數據文件、聯機日志文件、參數文件、密碼文件等
即:Oracle Database = Controlfile + datafile + logfiel + spfile +..
1.控制文件(controlfile)
數據庫的名字,檢查點信息,數據庫創建的時間戳
所有的數據文件,聯機日志文件,歸檔日志文件信息
備份信息等
2.數據文件(datafile)
包含了用戶和應用程序的所有數據
--查看數據文件信息
3.聯機日志文件
記錄了用戶對數據庫的所有操作,一個數據庫中至少要有兩個日志組文件,每個日志組中至少有一個日志成員
日志組中的多個日志成員是互為鏡相關系
4.歸檔日志文件
Oracle可以運行在兩種模式之中,歸檔模式和非歸檔模式。在歸檔模式中,為了保存用戶的所有修改,
在聯機日志文件切換后和被覆蓋之間系統將他們另外保存成一組連續的文件系列,該文件系列就是歸檔日志文件。
用戶恢復意外情況出現的數據丟失、異常等。
5.參數文件(pfile和spfile)
initSID.ora或init.ora文件,通常位於:$ORACLE_BASE/admin/<SID>/pfile
初始化文件記載了許多數據庫的啟動參數,如內存,控制文件,進程數等,在數據庫啟動的時候加載(Nomount時加載)
6.其他文件
密碼文件:用於Oracle 的具有sysdba權限用戶的認證.
告警日志文件:報警日志文件(alert.log或alrt.ora),記錄數據庫啟動,關閉和一些重要的出錯信息
查看路徑:select value from v$PARAMETER where name =‘background_dump_dest’;
7.數據庫邏輯組織結構
表空間、段、區、塊
一個數據庫由一個或多個表空間組成,一個表空間只能屬於一個數據庫
一個表空間由一個或多個多個數據文件組成,一個數據文件只能屬於一個表空間
一個數據文件由一個或多個操作系統塊組成,每一個操作系統塊只能數以一個數據文件
一個表空間可以包含一個或多個段,一個段只能屬於一個表空間
一個段由一個或多個區組成,每一個區只能屬於一個段
一個區由一個或多個Oracle 塊組成,每一個Oracle塊只能屬於一個區
一個區只能屬於一個數據文件,數據文件的空間可以分配到一個或多個區
一個Oracle 塊由一個或多個操作系統塊組成,一個操作系統塊是一個Oracle塊的一部分