參考:http://www.zhetao.com/content240算法
在實際的開發應用中,關於Oracle數據庫,常常聽見有人說創建一個數據庫,創建一個Instance,啓動一個Instance之類的話。sql
其實問他們什麼是數據庫,什麼是Instance,極可能他們給的答案就是數據庫就是Instance,Instance就是數據庫啊,沒有什麼區別。數據庫
在這裏,只能說雖然他們Oracle用了可能有了必定的經驗,不過基礎的概念仍是不太清楚。(我目前就是這個狀態)緩存
1、什麼是數據庫,其實很簡單,數據庫就是存儲數據的一種媒介。好比經常使用的文件就是一種,在Oracle10G中,數據的存儲有好幾種。服務器
第一種是文件形式,也就是在你的磁盤中建立一批文件,而後在這些文件中存儲信息。網絡
第二種就是磁盤陣列形式,這個是什麼意思呢,這個就是說明數據庫不是存放爲某個文件,而是把一個或者多個磁盤格式化成Oracle的一種格式了,多線程
等於整個磁盤就是存放Oracle數據庫的,不能做爲別的用途。這樣的優勢是存儲性能高,由於再也不借助別的文件格式了,而是把整個磁盤都成爲併發
Oracle最適應的文件系統格式。oracle
固然還可能有別的形式,好比網絡什麼的。不過咱們最經常使用的仍是文件格式的,在文件格式中,數據庫指的就是那些數據文件,工具
控制文件以及REDO文件等等一系列文件。
2、什麼是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)
實例是一個臨時性的東西,你也能夠認爲它表明了數據庫某一時刻的狀態!
數據庫 = 重作文件 + 控制文件 + 數據文件 + 臨時文件
數據庫是永久的,是一個文件的集合。
3、ORACLE實例和數據庫之間的關係
1. 臨時性和永久性
2. 實例能夠在沒有數據文件的狀況下單獨啓動 startup nomount , 一般沒什麼意義
3. 一個實例在其生存期內只能裝載(alter database mount)和打開(alter database open)一個數據庫
4. 一個數據庫可被許多實例同時裝載和打開(即RAC),RAC環境中實例的做用可以獲得充分的體現!
4、下面對實例和數據庫作詳細的詮釋:
在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中,你能夠把「數據庫」理解成一個大概念,也要把它理解成一個小概念
一、一個Oracle數據庫系統中能夠同時安裝幾個數據庫,每個數據庫對應一個惟一的實例,可是OPS系統除外,能夠多個實例同時對一個數據庫操做,稱爲並行服務器
二、只是一個名字,SID便是INSTANCE_NAME,SERVICE_NAMES主要用在監聽器中,爲了方便吧,有些是爲了傳統習慣的延續,有些是爲了更方便的使用
三、NET EASY CONFIG操縱的應該是主機字符串,是爲客戶端服務的,
一個數據庫能夠對外公佈多個服務名(SERVICE_NAMES)
一個客戶端也能夠用多個主機字符串鏈接到同一個數據庫服務器上
四、一個OS上能夠裝多個Oracle數據庫(小的概念),每一個庫能夠對外公佈多個服務名,都經過init.ora和listener.ora來實現
主機字符串,數據庫服務名,數據庫別名,不太同樣。
service_names是對外的服務名,是服務器端使用的,一個庫能夠設置多個對外服務名,以實現不一樣的目的
「主機字符串」的叫法主要在SQL*Plus中使用,是在客戶端使用,
「數據庫別名」主要用在一些開發工具鏈接Oracle服務器時使用,是通俗叫法
還有像配置ODBC時的Data Source的Service Name,
它們都是一個道理,指向的都是客戶端tnsnames.ora文件中的一小段文本
一、在SQL/PLUS中的登錄中,用USER/PWD@***,那麼,這個***是主機字符串。
二、在設置ODBC時的用戶和密碼必定要是ORACLE中的合法用戶和密碼,但不輸也行,引用ODBC名時再給出也能夠。
三、若要向ORACLE代理商購買ORACLE,是以用戶數來算錢的。那麼,這個「用戶」跟咱們在ORACLE中經過
CREATE USER USERNAME IDENTIFIED BY PASSWORD建立的用戶是不一樣概念,「用戶數」指的是併發訪問用戶數,
(我理解是同時間訪問同一個內存地址的進程數)。要是我買了8個用戶的,能夠建幾10、上百個用戶也沒問題,只要峯值達不到併發數就能夠了。
打個比方,你的名字叫小明,可是你有不少外號。你父母叫你小明,可是朋友都叫你的外號。
這裏你的父母就是oracle實例,小明就是sid,service name就是你的外號。
sid用於實例區分各個數據庫,service name用於外部連接。
對於初接觸Oracle 數據庫的人來說,很容易混淆的兩個概念便是Oracle 實例和Oracle 數據庫。這兩
概念不一樣於SQL sever下的實例與數據庫,固然也有些類似之處。只是在SQL server咱們根本不須要花費太
多的精力去搞清SQL實例和數據庫,由於它簡單易於理解。下面簡要說明一下SQL實例、數據庫,更多的是講
述Oracle下的實例及數據庫。
=====================================================
1、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實例被啓動時,啓動相關的後臺進程 3、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塊的一部分