Oracle-Oracle数据库结构
再談Oracle數據庫結構
之前寫了一篇文章《Oracle-知識結構漫談》 粗略的介紹了Oracle數據庫接口,在這里再更加詳細的描述一下,當做是對原有知識的鞏固,溫故知新。
Oracle體系結構
數據庫的體系結構是從某一個角度來分析和考察數據庫的組成、工作過程與原理,以及數據在數據庫中的組織與管理機制。
Oracle數據庫是一個邏輯概念,而不是一個運行數據庫服務器的計算機系統或者一臺Oracle服務器。
基本術語
1 Oracle實例 、Oracle數據庫
一般Oracle數據庫 可以分為兩部分:
實例是一個非固定的,基于內存的基本進程與內存結構。 當服務器關閉之后,實例也就不存在了。
數據庫指的是固定的、基于磁盤的數據文件、控制文件、日志文件、參數文件和歸檔日志文件等。
一般情況下,Oracle數據庫都是一個數據庫包含一個實例。
2 數據庫服務器
數據庫服務器DatabaseServer 一般指的是數據庫各軟件部件(如sqlplus、oem、exp/imp等) 、 實例 及 數據庫 3個主要部分, 是由安裝在服務器上的所有的軟件(包括各種類型的文件)及啟動成功后的實例組成。
體系結構圖解
如上圖,我們可以看出 SQL命令從客戶端發出后,由Oracle的服務器進行響應,在內存區域中進行語法分析、編譯、執行,將修改后的數據寫入數據庫文件,數據庫的修改信息寫入日志文件,再將SQL的執行結果返回給客戶端。
表空間與數據文件
在Oracle系統中,表空間和數據文件是Oracle數據庫結構的基本要素.
1 表空間
在Oracle數據庫中,用于存放數據庫表、索引、回滾段等對象的磁盤邏輯空間叫做表空間。 如上所示。
一般在完成Oracle系統的安裝并創建Oracle實例后,Oracle系統會自動創建多個表空間。
SYSTEM表空間
- SYSTEM表空間存放Oracle系統內部表和數據字典的數據,比如表名、列名、用戶名等。
- 不贊成用戶創建的表、索引等存放在SYSTEM表空間。
- SYSTEM表空間對應的數據文件是system01.dbf ,如果有表空間對應的數據文件比較小,可追加另外一個新的數據文件,比如system02.dbf
SYSAUX表空間
- SYSAUX表空間是Oracle 11g新增加的表空間,主要用于存放Oracle系統內部的常用樣例用戶的對象。
- SYSAUX一般不存放用戶的數據,由Oracle系統內部自動維護
- SYSAUX對應的數據文件為 sysaux01.dbf
UDNO表空間
- 列表內容UNDO表空間用于存儲撤銷信息的表空間
- 當我們對數據庫進行修改(包括INSERT、UPDATE、DELETE操作)時, Oracle會自動使用UNDO表空間來存放修改前的數據
- 當操作完成并提交后,Oracle系統會根據細腰保留修改前數據時間長短來釋放UNDO表空間的部分空間。
- 默認的數據文件為undotbs01.dbf
USERS表空間
- USER是Oracle建議用戶使用的表空間,可以在這這個表空間上創建跟蹤對象。
- Oracle的基本樣例用戶SCOTT的對象就存放在USERS表空間中。
- 一般USERS的表空間對應的數據文件是users01.dbf
總結:
除了Oracle系統默認創建的表空間外,用戶可以根據應用的規模及其所要存放的對象類型創建多個表空間,以區分用戶數據與系統數據、索引和數據。
此外,不同應用的數據應將不同表空間的文件放在不同的盤上,減少I/O沖突。
2 數據文件
數據文件DataFile是用于保存應用數據和Oracle系統內部數據的文件。
Oracle數據庫由表空間組成,每個表空間可以包含一或者多個數據文件
系統數據
管理用戶數據和Oracle系統本身的數據,這些數據被自動存放在系統表空間對應的system01.dbf中。
二Oracle系統內部的數據字典、表如DBA_USERS、DBA_DATA_FILES等說存放的岠屬于Oracle系統的內部數據,這也數據也存放在系統表空間對應的system01.dbf中。
用戶數據
用戶數據是指用戶應用系統的數據,包括與應用系統先關的信息。
select tablespace_name,file_id,file_name,round(bytes / (1024 * 1024*1024), 0) || 'G' total_spacefrom dba_data_filesorder by tablespace_name;從上面的查詢結果看出來: 表空間和數據文件是一對不可分離的數據庫實體。
- 表空間是一個數據庫的邏輯去
- 每個表空間由一個或者多個數據文件組成
- 一個數據文件只能屬于一個表空間
臨時表空間與臨時文件
Oracle系統中用于存放和排序有關的特殊表空間。
當需要排序時,Oracle就將排序的數據存放在該表空間內,排序完成后即可釋放數據所占的空間,因此稱之為臨時表空間。
臨時表空間也可以對應一個或者多個臨時文件(Tempfile)
oracle9i后,Oracle將臨時表空間所對應的臨時數據文件與一般數據文件分開, dba_temp_files數據字典中可以查詢臨時表空間和臨時數據文件的信息
Oracle存儲結構介紹
無論是普通的表空間還是臨時表空間,當創建時至少需要一個數據文件。
Oracle創建數據文件時,實際上是將磁盤的操作系統重新格式化成Oracle數據塊,并且每個Oracle數據塊都有唯一標示。
一般情況下,Oracle數據塊是操作系統塊的倍數,比如操作系統塊大小2048B,而Oracle數據塊大小為8192B(DB_BLOCK_SIZE=8192)
SQL> show param db_blockNAME TYPE VALUE --------------- ----------- -------- db_block_buffers integer 0 db_block_checking string FALSE db_block_checksum string TYPICAL db_block_size integer 8192一般的,我們在設計數據庫結構時需要將表、索引或者簇(Cluster)存儲到一個已經存在的表空間上, 而表、索引或者簇都是占用空間的對象,Oracle把占空間的對象統一稱為段(Segment)。
段是有多個區間(Extent)構成,而區間是由多個連續(塊的編號地址相鄰)的Oracle數據塊構成。
所以Oracle中,數據塊是一個基本的處理單位
控制文件
- 控制文件是一個存儲Oracle實例信息、數據文件和日志文件信息的內部二進制文件。
- 控制文件一般在Oracle系統安裝時自動創建。
- 控制文件的存放路徑由服務器參數文件SPFILEsid.ora的control files的參數值來決定。
因為控制文件中存放數據文件、日志文件等信息,所以Oracle實例在啟動的時候必須訪問控制文件。
Oracle實例在正常啟動時,首先要訪問的初始化參數文件SPFILE, 然后Oracle會為系統全局區(SGA)分配內存,這是Oracle實例處于安裝狀態,控制文件處于打開狀態; 接下來,Oracle會自動讀出控制文件中的所有數據文件和日志文件信息,并打開所有的數據文件及日志文件信息以便用戶訪問.
控制文件內部出了存放ORACLE實例及創建日期、數據文件、日志文件外,在系統運行的過程中,還存放系統更改號、檢查點信息,及歸檔的當前狀態信息等,如果開啟了RMAN備份,還會存放RMAN的備份信息。
Oracle系統處于安全的考慮,建議在 系統安裝時 指定多個控制文件,并將它們存放在不同的磁盤路徑下。
查詢數據庫實例包含的控制文件信息路徑
select name, status from v$controlfile;日志文件
Oracle日志文件分為 重做日志文件 和 歸檔日志文件。
特別是重做日志文件,是Oracle數據庫系統正常提供服務不可或缺的。
聯機重做日志文件(Online Redo Log File)
Online Redo log file 是用來記錄數據庫所發生過的交易的信息及有Oracle內部行為引起的數據庫變化信息。
在數據庫恢復時,可以從該日志文件中讀取出原來交易的數據。 在數據庫運行期間,當用戶發出commit命令時,數據庫會將每筆交易記錄到日志文件中,寫入日志文件成功后,才會把信息傳給用戶程序。所以,在日志文件中可以隨時督促信息以恢復某些交易數據。
當對表或者整個表空間設置了NOLOGGING屬性時,基于表或表空間中所有表的DML操作都不會生成日志信息,當然也就減少了日志信息的產生。
重做日志文件的作用
- 記錄所有數據的改變
- 提供恢復機制
- 組方式管理(最少兩組,默認為3組,每組一個重做日志文件,Oracle官方建議,所有的每組重做日志文件大小最好相同;當然如果是為重做日志文件組添加成員的時候不能指定大小,因為每個重做日志文件相互冗余,所以必須一致)
重做日志文件的狀態
- unused:說明此重做日志文件組沒被用過
- current:說明是當前重做日志組,lgwr正在寫
- active:說明此重做日志文件組剛寫完,記錄在重做日志文件組中的事務所造成的數據塊的改變,沒有完全從緩沖區寫入到數據文件,重做日志文件組屬于這種狀態,是不允許被覆蓋的,一旦寫完成,就變問inactive狀態。
- inactive:說明記錄在重做日志文件組中的事務所造成的數據塊的改變,已經從緩沖區寫入到數據文件,這種狀態允許被覆蓋。
上面4中狀態是重做日志文件常見的狀態,下面兩種狀態是在重做日志組損壞或者特殊情況下的狀態。 - clearing:說明該重做日志文件正被重建(重建后狀態變為unused)
- clearing_cyrrent:說明此重做日志文件重建是出現錯誤
為確保數據庫系統的安全,每個Oracle實例用一個日志線程(Thread)來近路數據庫的變化。 日志線程由若干日志組構成,日志組又由一個或者多個日志成員構成(當然也可以包括一個)。
可以從v$logfile數據字典中查詢
select group#,status , member from v$logfile ;可以根據 v$log_history 這個動態視圖查詢日志切換的頻率,判斷日志的大小是否合適。 日志組空間太小的話,第一會導致dbwr寫的頻率增加,增加了i/o;第二會造成事務的等待,延長事務周期,導致數據庫假死。
按照官方建議,日志切換時間一般在10-15分鐘比較適合。
Oracle實例在運行中產生日志信息,首先被記錄在SGA中的日志緩沖區中, 當發出commit命令后(或者日志緩沖區信息滿1/3或者3S過去)時,LGWR進程將日志信息從日志緩沖區中讀出并寫到日志文件組序列號小的文件中, 一個日志組寫滿后接著寫另外一組。
在DBWR工作之前,LGWR首先將事務變化寫入到重做日志。
LGWR工作觸發條件:
1、提交事務(commit)
2、每隔3秒鐘
3、當重做日志信息超過1M
4、重做日志緩沖區超過1/3滿
5、SCN(System Change Number)
當LGWR進程將所有能用的日志文件都使用過一次后,它將再次轉向第一個日志組重新覆寫。
Oracle用日志文件序列號來跟蹤不同的日志文件,當LGWR進程寫滿第一個日志組而轉向另外一組時,稱之為日志切換。
當日志發生切換時,Oracle會往警告日志文件(alter_sid.log) 記錄相應的信息,以幫助用戶觀察各日志組的使用情況。
歸檔日志文件
oracle系統運行有兩種模式——歸檔模式和非歸檔模式。
非歸檔模式
非歸檔模式就是在系統運行期間,所產生的日志信息不斷的記錄到各日志文件組中,當所有的重做日志組被寫滿年后又重新從第一個日志組開始覆寫日志信息內容。
歸檔模式
歸檔模式就是在各日志文件(成員)都寫滿即將被覆蓋前,現有歸檔進程(ARCH)將即將被覆蓋的日志文件中的日志信息讀取出來并寫到歸檔日志文件中,以便后面的恢復操作時查找。
默認情況下,Oracle系統不采用歸檔運行模式。
查看數據庫是否處于歸檔模式
SQL> SELECT log_mode FROM v$database; LOG_MODE------------NOARCHIVELOG如果將數據庫設置為歸檔模式下運行, 歸檔日志的領有服務器參數文件SPFILE的log_archive_dest參數確定。
SQL> show param log_archive_destNAME TYPE VALUE --------------- ----------- ------------------------------ log_archive_dest string log_archive_dest_1 string LOCATION=/ccarch/cc valid_for=(all_logfiles,all_roles) db_unique_name=pr_cc服務器參數文件
服務器參數文件SPFILE(Server Parmater File)是二進制文件,用來記錄Oracle實例的基本參數信息,包括數據庫實例名、控制文件所在路徑、進程等。
服務器參數文件在Oracle安裝時已默認的方式創建, 文件名為 SPFILEsid.ora , 其中sid為數據庫實例名。
SPFILE中的參數由oracle系統自動維護,如過要修改某些參數,不能對SPFILE進行直接編輯, 需要通過alter system命令來修改。
密碼文件、跟蹤文件、警告日志
密碼文件
作用:主要進行DBA權限的身份認證
密碼文件的位置:
$ORACLE_HOME/dbs/orapw$ORACLE_SID密碼文件查找的順序
--->orapw<sid>--->orapw--->FailureOracle的兩種認證方式;
- 使用與操作系統集成的身份驗證
- 使用Oracle數據庫的密碼文件進行身份認證
兩種認證方式, 決定在兩個參數中
創建Oracle密碼文件的命令
orapwd file=<fname> password=<password> entries=<users> force=<y/n>- file - name of password file (mand), 密碼文件的名字orapw
- password - password for SYS (mand), sys用戶的密碼
- entries - maximum number of distinct DBA
- force - whether to overwrite existingfile (opt),10g新增的參數,默認值為n ,y表示允許覆蓋
警告日志文件
告警日志文件是一個存放在Oracle系統目錄下的特殊文本文件(trace file),用來記錄數據庫運行期間錯誤信息。
告警日志文件命名一般為alert_<SID>.log,其中SID為ORACLE數據庫實例名稱。
10G中告警日志的路徑 由Oracle系統的background_dump_dest參數指定。
SQL> show parameter background_dump_destNAME TYPE VALUE ------------------- ----------- -------------------- background_dump_dest string /oracle/diag/rdbms/pr_cc/cc/trace11G及12C中,引入了ADR(Automatic Diagnostic Repository:一個存放數據庫診斷日志、跟蹤文件的目錄),關于ADR對應的目錄位置可以通過查看v$diag_info系統視圖
SQL> select * from v$diag_info;Diag Trace對應的目錄為文本格式的告警日志文件所在的目錄,而Diag Alert對應的目錄為XML格式的警告日志(對應為log_x.xml)
SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Default Trace File';這里的Default Trace File就是缺省的會話跟蹤文件名稱
后臺跟蹤文件和用戶跟蹤文件
跟蹤文件(trace file)的作用,通常是一個服務器進程對某種異常錯誤條件做出響應時創建的診斷文件。
路徑由服務器參數文件SPFILEsid.ora的user_dump_dest參數指定。
SQL>show parameter DUMP_DEST NAME TYPE VALUE ---------------- ----------- ------------------------------ background_dump_dest string /oracle/diag/rdbms/pr_cc/cc/trace core_dump_dest string /oracle/diag/rdbms/pr_cc/cc/cdump user_dump_dest string /oracle/diag/rdbms/pr_cc/cc/tracebackground_dump_dest(后臺轉儲)
core_dump_dest(內核轉儲)
user_dump_dest(用戶轉儲)
跟蹤文件名形:SID名+進程名+進程ID
Oracle服務器結構
Oracle服務器與Oracle實例
Oracle服務器是由Oracle實例+Oracle數據庫組成。
Oracle實例是有SGA+后臺進程組成。 每一個Oracle實例都有自己的SGA和獨立的Oracle進程集。
物理結構與邏輯結構的關系
系統全局區(SGA)
之前的博客 Oracle-內存管理解讀
SGA = 數據高速緩沖區+ 重做日志緩沖區+ 共享池+ 大池+ Java 池+ 流池
系統全局區是動態的,由參數SGA_MAX_SIZE決定。
查看當前系統的SGA大小:
SQL>show parameter sga_max_size NAME TYPE VALUE ------------------ ----------- ---------------------------- sga_max_size big integer 116992M修改當前系統的SGA大小:
alter system set sga_max_size=1024m scope=spfile;因為實例內存的分配是在數據庫啟動時進行的,所以要讓修改生效,要重啟數據庫。
數據高速緩沖區(Data Buffer Cache)
存儲Oracle系統中最近使用過的數據塊(即用戶的高速緩沖區)
數據告訴緩沖區有3種類型
- 臟區Dirty Buffers
- 自由區Free Buffers
- 保留區Pinned Bffer
大小由db_cache_size 決定
查看:
修改:
SQL>alter system set db_cache_size=1024m;重做日志緩沖區(Redo Log Buffer)
在這些日志在寫入重做日志文件之前, 必須先寫入到從昨日之緩沖區,然后由LGWR進程將它寫入磁盤,大小由LOG_BUFFER決定
共享池(Share Pool)
- 共享池是SGA的保留區, 用于存儲SQL、PL/SQL、包、數據字典、鎖、字符集 安全屬性等。
- 共享池包含庫高速緩沖區(Library Cache) 和 指點高速緩沖區(Dictionary Cache)
- 庫緩存大小由shared_pool_size 決定
查看:
SQL>show parameter shared_pool_size NAME TYPE VALUE --------------------- ----------- ------------------------ shared_pool_size big integer 10G修改:
SQL>alter system set shared_pool_size=120m;大池(Large Pool)
是一個可選的區域,用于一些大型的進程如Oracle的備份恢復操作、IO服務器進程等
Java 池
該程序緩沖區就是為Java 程序保留的。如果不用Java程序沒有必要改變該緩沖區的默認大小
流池(Stream pool)
被Oracle流所使用
后臺進程
SQL>select name description from v$bgprocess ;數據庫寫入器(DBwn)
Database Writer 數據庫寫。主要作用是將Database buffer cache(數據庫緩沖區)里那些被更新過、但還沒有被寫入數據文件的數據寫入到數據文件中。這里的n表示可以有多個數據庫寫操作.
可以修改SPFILE的DB_WRITER_PROCESSES參數,以允許使用多個DBWR進程,進程的名字分別為 DBW0、DBW1、DBW2等…
SQL>alter system set db_writer_processes=3 scope=spfile;檢查點進程(CKPT)
可選進程。
可以通過SPFILE中的CHECKPOINT_PROCESS參數為TRUE來啟動檢查點進程
日志寫入器(LGWR)
日志文件寫進程:是日志緩沖區的治理進程,負責把日志緩沖區中的日志項寫入磁盤中的日志文件上。每個實例只有一個LGWR進程.
系統監控器(SMON)
System Monitor,負責完成自動實例恢復和回收分類(sort)表空間。
進程監控器(PMON)
PRocess monitor ,實現用戶進程故障恢復、清理內存區和釋放該進程所需資源等。
清除失敗的進程
回滾事務
釋放鎖
釋放其他資源
歸檔器(ARCH)
archiver process
把已經填滿的在線日志文件拷貝到一個指定的存儲設備上。僅當日志文件組開關(switch)出現時,才進行ARCH操作。ARCH不是必須的,而只有當自動歸檔可使用或者當手工歸檔請求時才發出。
鎖(LCKn)
可選進程
封鎖進程:用于并行服務器系統,主要完成實例之間的封鎖。
調度(Dnnn)
可選進程
恢復器(RECO)
負責解決分布事物中的故障。Oracle可以連接遠程的多個數據庫,當由于網絡問題,有些事物處于懸而未決的狀態。
RECO進程試圖建立與遠程服務器的通信,當故障消除后,RECO進程自動解決所有懸而未決的會話。
快照進程(SNPn)
負責出護理數據庫快照的自動刷新,并通過dbms_job包運行預定的數據庫存儲過程.
并行查詢進程(Pnnn)
程序全局區(PGA)
與SGA不同,PGA是一個私有區。
http://blog.csdn.net/yangshangwei/article/details/53124044#t25
SQL> show parameter pga NAME TYPE VALUE ------------------ ----------------- ------------------ pga_aggregate_target big integer 10GOracle數據字典
之前的博客 Oracle-數據字典解讀
Oracle數據字典的構成
Oracle常用的數據字典
基本的數據字典
與數據庫組建相關的數據字典
Oracle常用的動態性能視圖
總結
總結
以上是生活随笔為你收集整理的Oracle-Oracle数据库结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle-修改用户密码为UNLIMI
- 下一篇: Shell-/bin/bash和/bin