標籤:
體繫結構圖的學習:
- 老餘服裝店的故事
- 結構圖:
- SQL查詢語句
- SGA
- 共用池shared pool
- 資料緩衝區Buffer cache
- PGA
- 進程
- SQL更新語句
- SGA:
- 日誌緩衝區
- 記錄檔
- 深入學習
- 提交
- 復原
- 一致讀
實踐體會:
- 記憶體
- 進程
- 啟停
- 檔案
- 監聽
學習意義:
體繫結構圖:
說明:
- oracle由執行個體和資料庫組成
- 執行個體由:專門開闢出來的一塊SGA記憶體地區和一些列後台進程組成,其中SGA主要被劃分為共用池(shared pool),資料緩衝區(db cache),日誌緩衝區(log buffer)這三個部分。另外加上oracle的一些進程:DBWn,LGWR,ARCH,CKPT這些有和硬碟打交道。其它進程還有:PMON,SMON,LCKn,RECO.
- 資料庫的檔案組成:
- 資料本身:
- 資料檔案:
- 記錄檔:
- 聯機記錄檔:必須多工(group-Nmember);迴圈寫
- 歸檔記錄檔:歸檔記錄檔會被移動到磁碟或磁帶,用於備份和恢複。
- 啟動執行個體:
- 參數檔案:
- 控制檔案:
- PGA也是開闢出來的一塊記憶體區,和SGA的差別是,PGA私人不共用。使用者連進來是的第一關就是PGA:
- 儲存使用者的串連資訊:如會話屬性,綁定變數等。
- 儲存使用者的許可權,當使用者建立會話時,系統會去資料字典查詢使用者的許可權資訊,並儲存在PGA中。
- 如果取回的資料需要排序,那麼排序的活動在PGA內完成,如果PGA不夠,那麼使用暫存資料表空間(盡量不使用暫存資料表空間,因為會大量增大磁碟IO,降低效能。)。
- 分為3個地區,記憶體裡面主要是1區PGA,2區SGA,硬碟為3區。一般的資料庫操作是1-2-3或者僅僅是1-2.
老餘的故事:
- 顧客的尺寸—soft parse
- 有效調整—buffer cache
- 記錄的習慣—目的是提高效能,批量的刷資料,而不是提交一筆刷一筆。
一條查詢語句的曆險:
- sqlplus建立一個會話,執行查詢select id from t where obejct_id=29;這個時候先完成PGA的3步驟中的頭2步:儲存會話資訊,使用者權限資訊,然後將sql語句hash出一條hash值。
- 帶著hash值,sql進入了第二個地區:共用池,在這裡首先尋找是否有同樣的hash值。如果沒有,那麼就比較辛苦:首先查詢文法是否正確,然後查詢語義(表和欄位有沒有寫錯)是否正確,是否有許可權等,確認完這些,將hash值儲存下來。接下來進行硬解析,經過最佳化器分析以後Oracle會選擇一個低成本的執行計畫。
- 帶著自信計劃的sql接下來進入第三個地區:資料緩衝區,去獲得需要的資料,如果查到該資料,則返回給sql帶回到PGA。如果沒有,就要大費周章地去磁碟(增大IO降低速度)裡面尋找。尋找的方式就是按照執行計畫來。讀出來的資料會被放回資料緩衝區和PGA
sqlplus xxx/xxxdrop table t;create table t as select * from all_objects;create index idx_objid on t(object_id);set autotrace on;set linesize 100;set timing on;select object_name from t where object_id=29;
-
- 前後兩次執行同一條語句:第二次比第一次少很多時間。原因是第二次少做了一些事情:
- 因為會話沒有斷開,所以不需要再去資料庫讀取許可權和使用者資訊,少了很多物理讀。
- 因為是第二次執行同一條語句,所以SGA的共用池裡已經儲存了相對應的hash值,比照一樣之後,不需要做文法語義的驗證,也不需要做硬解析獲得最佳化的執行計畫,只要把已經解析好的執行計畫拿來用就好。
- 資料被取到SGA的資料緩衝區裡面,也不需要去硬碟讀。
- 可以用/*+full(t)*/強制sql走全表掃描。
一條更新語句的曆險:
- 如果使用者還是沒有退出session,那麼PGA部分儲存的內容不需要再做一遍。還是會將sql語句hash出一條hash值。
- 帶著hash值,sql進入了第二個地區:共用池。照舊:首先查詢文法是否正確,然後查詢語義(表和欄位有沒有寫錯)是否正確,是否有許可權等,確認完這些,將hash值儲存下來。接下來進行硬解析,經過最佳化器分析以後Oracle會選擇一個低成本的執行計畫。
- 帶著自信計劃的sql接下來進入第三個地區:資料緩衝區。去磁碟裡面按照執行計畫來尋找,讀出來的資料會被放回資料緩衝區。
- sql執行update改變緩衝區中資料的值。
- 這個改變動作導致記憶體中的資料區塊變髒。DBWn專門負責將髒資料寫入磁碟。
- 這個改變動作被oracle記錄到日誌緩衝區,有LGWR快速寫入聯機記錄檔。
- 如果聯機記錄檔寫滿,切換日誌時會把寫滿的聯機記錄檔用ARCH寫入歸檔記錄檔。這裡面有個速度問題,如果有個聯機日誌aARCH進程沒有完全歸檔完,就有LGWR要來寫,說明聯機記錄檔太小或者檔案個數太少。
- 提交:只有使用者commit,這條更新語句才會在資料庫生效,如果使用者放棄,則用rollback。
- 記錄檔和資料檔案的關係:日誌存在的目的在系統崩潰後重啟時,把在日誌中記載的,但是沒刷到資料檔案的操作重新做一遍。所以如果平時DBWn不勤快的刷資料,資料庫的效能越好,但是同時的日誌裡面沒刷的內容相應的也越多,斷電恢複需要的時間也越長。可是如果平時DBWn很勤快,那麼固然恢複的時間段了,卻會影響到資料庫的效能。控制這個平衡的就是CKPT。
- 什麼時候資料由資料緩衝區寫入到磁碟,這是由CKPT來控制的(傻把式DBWn是聽CKPT來指揮的),另外如果LGWR出了故障,那麼DBWn會被攔住,因為DBWn必須等LGWR把操作記錄到日誌以後才能寫相應的資料到磁碟,這就是“凡事有記錄”。
勞模評選:LGWR
- PMON:這個是進程監視進程,如果你的sql更新語句進程崩潰,PMON自動幫你rollback,其它進程如RECO等崩潰,PMON協助重啟進程,遇到LGWR崩潰,PMON為終止整個執行個體,以避免資料產生不一致現象。
- SMON:系統監視進程,與PMON不同,SMON關注的是系統層級的操作,而非單個進程。重點工作在於執行個體恢複,同時還有清理暫存資料表空間和復原段資料表空間,合并空閑空間等。
- LCKn:僅僅用於RAC,用於執行個體間的封鎖,n從1到10.
- RECO:用於分布式的恢複: 比如有A,B,C三個分散式資料庫,一個應用橫跨這3個資料庫,一個提交一定在3個庫全部提交成功才成功,否則復原。
- CKPT:通過FAST_START_MTTR_TARGET的設定來控制DBWn寫入的頻繁程度,參數越短,恢復越短,寫入越頻繁,效能越差。
- DBWn:系統最核心的進程,負責將資料寫入磁碟,受CKPT指揮,和LGWR密切相關。
- LGWR:也是系統最核心的進程,負責把日誌緩衝的日誌寫到磁碟的記錄檔中。記錄檔必須是按順序記錄,中間錯了任何一條,其後的所有日誌就報廢了。所以多工非常關鍵。另外因為日誌必須按順序記錄,所以LGWR無法採用多進程,只能採用單一進程,否則次序錯亂了。 在這樣的情況下,為了保證LGWR及時有效寫入記錄檔,LGWR自己給自己加壓,定了5條規矩,通過這些規矩從不同側面保證記錄檔的可靠性,:
- 每個3秒跑一次,將這3秒內的日誌寫入磁碟。
- 任何Commit觸發LGWR運行一次,將commit的內容寫入磁碟。
- DBWn要把資料從緩衝寫到磁碟前,觸發LGWR運行一次,把相關內容寫入磁碟。
- 日誌緩衝區滿1/3,或者日誌滿1m,觸發LGWR運行一次,把1/3的內容,或者1m的內容寫入磁碟。
- 聯機記錄檔切換,觸發LGWR運行一次,將切換前的日誌寫入磁碟。
- ARCH:日誌切換是會觸發ARCH進程,另外日誌在被覆蓋之前如果沒有歸檔,會觸發ARCH歸檔完畢以後再覆蓋。
復原段:更新語句是會發生。
- 首先找到要更新的記錄,讀入到資料緩衝區(和查詢一樣)。
- 在復原段資料表空間分配空間,在資料緩衝區中建立該記錄的鏡像,通過DBWn將鏡像寫入復原段資料表空間,並且用日誌記錄下這個動作。
- 在2做好的前提下,然後對有鏡像的原記錄進行修改,並且將這個修改的動作寫入日誌。
- 此時,如果使用者提交,那麼LGWR要立即寫入這個提交資訊。並且,將復原段的事務表上的該事務標記為非活躍狀態,表示允許重寫。
- 如果進行了復原,則oracle要從復原段中讀取鏡像記錄,還原被修改的記錄。這個過程也會被日誌記錄起來。
- UNDO_MANAGEMENT=AUTO:自動管理復原段
- UNDO_RETENTION=900:commit後900秒才能覆蓋復原段的內容.
增刪改對於復原段的壓力大小問題:
- insert壓力最小.只記錄rowid,復原的時候只要定位到行刪除即可.delete壓力最大,需要重新插入回來整行.
- 對於記錄檔則反之.
讀一致性:查詢的規則,如果你是9:00開始查詢的,那麼資料庫應該返回9:00時的資料庫的值給你而不是9:01的.這個叫讀一致性.
- SCN全稱系統改變號碼,存在於資料庫的最小單位塊中.每一個塊的改變都會引起SCN的遞增.
- 資料庫的復原段記錄事務槽,這個是用來分配復原段空間的.如果你更新某塊,事務就被寫進槽裡,若未提交或者未復原,則該槽就是活躍的.資料庫讀到這一塊可以識別這種情況.
- 查詢的時候,如果scn號比發起的scn號小,則看是否是活躍事務,如果是活躍事務,去復原段讀資料.如果scn號比發起的scn號大,那麼也去復原段讀資料.
- Oracle寧可返回錯誤,也不能返回不一致讀.如果復原段的鏡像由於反覆修改被覆蓋了,oracle會返回ORA-01555錯誤.
- 塊頭的ITL槽記錄scn號,活動的話,可以找到對應的undo資料表空間.
實踐:
- 記憶體的體會:SGA/PGA:
sqlplus / as sysdbashow parameter sgashow parameter pgashow parameter shared_pool_sizeshow parameter db_cache_size
show parameter log_buffer
ipcs –m 在作業系統查看共用記憶體。
- 現在SGA一般為自動管理,只需設一些母體參數即可:SGA_MAXSIZE=8G,SGA_TARGET=2G, 指正常情況分配2G給oracle,如果不夠再增加,最大不超過8G。另外11g以後多了memory_max_target,memory_target.如果設定了這個,就不用設SGA和PGA了。如果要手動設定SGA,就把SGA_TARGET=0,然後設定shared_pool_size, db_cache_size為非0即可。
- log_buffer是不能自動分配的。必須手動,一般15m就夠了。由於每1/3寫一次,每滿1m寫一次,所以分配太大最佳化也不是太明顯。
- 修改文法:ALTER SYSTEM SET <parametername>=<value> SCOPE={MEMORY|SPFILE|BOTH}.
- 如果執行個體使用pfile啟動,則scope的預設值是memory,如果是spfile啟動,預設值是both。
- 有些參數必須重啟才會生效,如log_buffer,sga_max_size等。會報錯:ORA-02095: specified initialization parameter cannot be modified。
- 如果參數檔案有問題而啟動不了的解決方案:
- >create pfile=‘/tmp/swat.ora‘ from spfile;
- 去作業系統修改/tmp/swat.ora.
- >create spfile from pfile=‘/tmp/swat.ora‘;
- >startup
- 進程的體會:
show parameter instance_nameps-ef |grep arcarchive log list;shutdown immediatestartup mount;alter database archivelog;alter database open;
- 啟停的體會:
startup nomount:讀取參數檔案,通過參數檔案的指定來啟動執行個體。startup mount:鎖定控制檔案。控制檔案:記錄資料檔案,記錄檔,檢查點資訊。 startup:alter database mount;alter database open;通過控制檔案裡面的資訊來比較資料庫的狀態,如果狀態一致,順利開啟資料庫。
shutdown immediate:結束所有會話,復原未提交操作。shutdown abort :直接殺死所有會話,沒有復原,資料庫重啟後會出現資料不一致要reover。shutdown transactional:沒有事務的會話殺掉,有事務的等事務提交才殺。不需要復原操作。shutdown normal:新的會話無法連入,非常客氣的等待所有會話退出才關閉。
- 檔案的體會:
show parameter spfile 參數檔案位置show parameter control 控制檔案位置
set linesize 1000
col file_name format a100
col member format a100select file_name from dba_data_files; 資料檔案位置select group#,member from v$logfile;記錄檔位置show parameter recovery 歸檔檔案位置set linesize 1000show parameter dump 日誌警告檔案位置ls -lart alert*
- 監聽:lsnrctl status | lsnrctl stop | lsnrctl start
Oracle物理的體繫結構