ORACLE體係結構-真正的數據庫-文件係統
前麵文章,對於ORACLE部分前麵主要闡述的是INSTANCE實例內部的一些東西,主要從共享池、數據緩衝區兩大塊去講解,其實對於細節的說明還有一些知識點,如RMAN中的大池應用或PGA中的後台線程會在後麵逐步說明,本文以ORACLE物理結構來講解點點物理層的東西,其實這也是真正的數據庫了,其餘的都是實例,為此先明白一個在ORACLE數據庫上容易誤會的名詞:INSTANCE(實例)和DATABASE(數據庫),數據庫是一組文件結構,而INSTANCE是一段內存結構,包含了對文件結構的操作過程和中間件,保證高效、穩定、安全等目的,而實體存放數據庫的還是文件結構,一般一個實例對應一個數據庫,在ORACLE集群中,可以完成多個實例對應一個數據庫,實現內存共享,負載均衡、節點失敗切換、分布式計算的高可用性,再配合相關容災技術,如:Data Guard(這部分屬於高可用部分知識,在後麵逐步會牽涉)。
本文主要說明一下部分內容:
1、ORACLE邏輯結構說明
2、ORACLE文件分類和組織關係
3、ORACLE啟動關閉詳細
4、控製文件
5、日誌文件
6、數據文件
1、ORACLE邏輯結構說明:
對於ORACLE的邏輯結構,普遍的教材和大學的老師會給出類似於下麵的圖形,我們也先來看下一下圖形,用於幫助進一步說明(下麵圖形對於體係結構闡述了大部分的情況):
簡單描述就是:
1、表空間、段、區、塊、OS塊一次按照一對多下去。
2、一個表空間可以包含多個數據文件,但是一個數據文件隻能在一個表空間。
3、一個數據文件可以包含多個區、但是一個區隻能在一個數據文件中。
補充一點:一個數據庫包含多個表空間,一個表空間隻能屬於一個數據庫,這個沒有在圖中說明。
那麼提出一下幾個問題:
a、為什麼段和數據文件沒有直接關係(有部分書籍將它歸為多對多的關係)?
b、平時創建的表放在那裏,和這個結構之間是何種關係?
c、同上一個問題,索引存放在那裏,與他們何種關係?
針對這三個問題,進一步說明:
問題a:為什麼段和數據文件沒有直接關係(有部分書籍將它歸為多對多的關係)?
一般來說,一個段是表空間分配對象的基本單位,我們先不討論分區表和分區索引的問題,一個表或者一個索引在創建較大的時候,若一個表空間創建多個數據文件,默認的數據文件由於某種情況限製增長大小(如:數據文件不是自動增長的,該陣列或分區已滿),ORACLE會自動將新增的數據寫入到其他的數據文件(如果存在其他文件的情況下),那麼即使是一個普通表也可能跨數據文件,也就對應一個段可以跨數據文件了,係統如何識別到是一個段呢,其實是通過OBJECT_ID,即使是做分區表,每一個分區會有不同的OBJECT_ID,上次關於數據緩衝區的文章中,提及到ROWID的生成,如何實現全數據庫唯一的方式,其中ROWID第二部分就是對象編號;很多時候對象在默認情況下盡量不要去做跨文件查找,會影響一些性能,較大的表,可以適當使用分區表的方式來降低每個段的數量,每次查詢基本從一個分區內提取數據。
問題b和c:
同上,一個段是表空間分配對象的基本單位,分為數據段和索引段,對於普通的表和索引,創建對象就等價於創建一個段,創建一個索引也是一個段,可以通過視圖:
SELECT * FROM USER_SEGMENTS
可以查看到到段信息基本和表結構一一對應;但是表存在分區表、索引同樣存在分區索引(在博客簡單分區表中已經詳述分區表的創建過程),分區表以及分區索引的每個分區都可以指定不同的表空間,也就是對於一個段是在同一個表空間,但是對於一個表來說,如果是分區表是可以跨表空間的,在創建分區和分區索引的時候,隻需要指定每一個分區tablespace <tablespace_name>即可完成這個功能,不過這個功能在很少的情況下才會使用。
2、ORACLE文件分類和組織關係
這部分說起來有點像廢話,不過既然說到這裏,還是簡單說明一下吧。
ORACLE文件主要分為以下幾大類:
1、初始化參數文件
2、控製文件
3、日誌文件(在線日誌、歸檔日誌)
4、數據文件
初始化參數文件:每個版本的數據庫初始化參數文件會有所變化,對於ORACLE 10G,始化參數文件主要保存的內容包含:控製文件位置、開啟有標最大值、SGA最大值、PGA最大值、SQL優化器模式、係統多塊讀最大數量、數據緩衝區大小、tranc文件位置、保留區位置、JOB隊列大小、最大連接數、回滾段表空間默認名稱、回滾段表空間管理方式。
控製文件:相互備份,由初始化參數文件找到其位置,每個控製文件一摸一樣,為二進製文件,相互備份,內部也有整列類似的技術相互拷貝,初始化參數文件可以創建1~8個控製文件,通過控製文件可以找到數據文件和日誌文件的位置,以及同一個數據庫內部可以創建數據文件和日誌文件的上限信息以及大小信息。
日誌文件:
日誌文件是記錄數據庫做過什麼的記錄,它也記錄一個數據庫的時間戳和對應的遞增的SCN號,數據庫在提交的時候隻需要記錄先通過PGA中後台進程寫入相應日誌;日誌文件按照組進行管理,一般默認為三組,每組一個文件,可以每組多個文件,可以在一定程度上提高日誌編寫的性能,並減少switch log的從在線日誌向歸檔日誌轉換的過程,尤其在RAC集群中,日誌組可以明顯提高集群下的日誌寫導致的阻塞從而導致性能瓶頸;係統的事務回滾點以及備份恢複等也是通過係統日誌文件的記錄的時間戳以及SCN號碼對應起來的。
數據文件:
所謂數據文件,就是存儲數據的文件,它存儲什麼?一般用戶級別的數據文件都是記錄表的殼以及表的內容以及索引的殼以及索引的內容(分別以數據段和索引段存放,不過都是存儲在數據文件中,數據文件和表空間的關係,上麵已經有所說明),表的殼和索引的殼是指表的位圖信息以及索引的管理信息。一個數據文件的理論最大值為32G,所以很多時候在做陣列的時候以30G左右為一個分組,這樣保證數據文件不會越界。一個表空間可以最多存放1024個數據文件,也就是:1024*32G=32768G。相當於32T為一個表空間的上線,那麼會不會有比這個還要大的數據,有,看看上麵的說明,一個表可以跨表空間存放;係統表空間需要除係統表內容外,還需要存放一些管理性的視圖(這裏的視圖不是虛表,是說管理其所有用戶的創建對象的信息),如USER_TABLES、DBA_OBJECTS、USER_SOURCE等等這些都存儲在係統表空間內,所以大家在創建數據庫後,一定要將係統表空間稍微設置大一點,不然有些時候數據庫創建東西或者某些時候很慢不知道為什麼。
為了進一步說明三大文件的規則,進一步從啟動文件過程,以及關閉數據庫說明係統的對三大文件以及一些相關內容的關係。
3、ORACLE啟動關閉詳細:
首先明確,一個數據庫的創建一般需要創建哪些內容:
a、創建數據庫的名稱以及其SID,SID一般和數據庫的名稱一致,但是也不一定,外部係統要連接數據庫需要按照SID去連接,SID為實例名稱。
b、根據參數編寫初始化參數文件,這些參數文件如果你在不輸入指定的參數值的時候有一些默認值。
c、創建dump目錄。
d、創建密碼文件。
e、創建基於操作係統的服務信息,通過ORADIM命令可以管理這些服務信息。
f、啟動到MOUNT狀態,建立字典信息。
g、處理二進製信息以及擴展包的拷貝(在:$ORALCE_HOME/RDBMS/ADMIN/目錄下)
付:很多時候大家認為ORACLE卸載的時候卸載不幹淨,為什麼,最重要的一點就是ORACLE的軟件產品和數據庫是完全獨立的,往往在WINDOWS下用習慣的人都都是在控製麵板上去卸載軟件,但是沒有卸載掉數據庫,而數據庫在沒有軟件的情況下也啟動不起來,這樣就隻能到注冊表中去將HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE,然後重啟才能生效。
但是真正卸載的好辦法(最少ORACLE 10G後)可以使用的就是,使用DBCA先刪除數據庫(在DOS下輸入DBCA,會彈出向導,根據向導將數據庫刪掉),再卸載數據庫軟件,可以卸載得幹幹淨淨,或者使用ORADIM刪除掉關於數據庫的服務信息後,再卸載軟件,就可以幹幹淨淨的重做了。
回到話題,數據庫啟動部分:
數據庫啟動分三個階段,先啟動到UNMOUNT狀態,然後再啟動到MOUNT狀態,在後再啟動到OPEN狀態,下麵逐步解釋每一個狀態一般可以做什麼,數據庫啟動了什麼,做了什麼事情。
3.1、啟動到UNMOUNT狀態:
STARTUP UNMOUNT;
可以執行的動作為:
查看數據庫狀態:
SELECT STATUS FROM V$INSTANCE;
查看後台進程:
SELECT * FROM V$BGPROCESS WHERE paddr<>'00';
啟動了什麼:
a、確定SID信息
b、找到參數文件(查找順序為:spfilesid.ora->spfile.ora->initsid.ora):順序去查找,一個找不到找下一個,三個全部找不到,直接提示錯誤。
c、分配INSTANCE實例的內存空間。
d、啟動後台進程
e、初始化字典信息、V$、GV$
f、寫入啟動日誌到:bdump/*.log內部。
UNMOUNT可做的是:
a、修改數據庫初始化參數
b、創建數據庫
c、創建控製文件
3.2、數據庫啟動到MOUNT狀態:
ALTER DATABASE MOUNT;
MOUNT做了什麼
a、確定控製文件的位置,並校驗其完整性
b、讀取控製文件到內存中
c、吸入bdump中
MOUNT下可以做什麼
a、能夠備份和恢複數據庫
b、修改文件的名稱和位置
控製文件為銜接數據文件和日誌文件的中間件,也是一個領頭者。
查看所有的控製文件為:
SELECT NAME FROM V$CONTROLFILE;
查看數據庫的狀態為:
SELECT STATUS FROM V$INSTANCE;
發現為:MOUNT
3.3、啟動數據庫到OPEN狀態:
ALTER DATABASE OPEN;
數據庫做了什麼動作:
a.確定數據文件的位置
b.校驗數據文件完整性,若一致則啟動數據文件
c.如果不一致,通過日誌文件恢複到一致性狀態,若數據文件缺失,則不能啟動須手工將其OFFLINE狀態才可以啟動。
d.寫DUMP文件。
啟動到OPEN狀態後可以做的事情就是:
外部可以連接數據庫,即認識到SID信息。
驗證數據庫狀態:
SQL> connect / as sysdba;
已連接。
SQL> select status from v$instance;
STATUS
------------
OPEN
使用ORACLE關閉命令:
在SQL模式下,使用命令:HELP SHUTDOWN查看:
SQL> help shutdown
SHUTDOWN
--------
Shuts down a currently running Oracle Database instance, optionally
closing and dismounting a database.
SHUTDOWN [ABORT|IMMEDIATE|NORMAL|TRANSACTIONAL [LOCAL]]
這裏順便介紹一下,ORACLE的HELP其實是一張表,這個表是在SYSTEM用戶下,上述命令的結果類似於查詢SQL語句:
SELECT * FROM SYSTEM.HELP t
WHERE t.topic='SHUTDOWN';
一樣的結果
說明其四種方式,默認為NORMAL,四種方式的區別分別介紹一下:
SHUTDOWN NORMAL
四種方式中若不指定關鍵字,直接使用SHUTDOWN關閉數據庫,則認為是SHUTDOWN NORMAL關鍵字。該默認狀況下,會有以下特點:
1、所有會話信息必須全部退出,包括外部程序連接和第三方工具以及sqlplus等連接須全部關閉,不然不能關閉數據庫。
2、若會話沒有關閉,這個命令將不會影響會話進行,即SQL可以繼續運行,程序可以繼續跑。
3、此時無法建立新的會話,可以使用操作係統認證 as sysdba連接到空閑進程,但是做不了任何事情。
SHUTDOWN TRANSCATIONAL
看名字就是是以事務級別關閉的了,不過很多人容易誤解的是認為它的粒度應該比NORMAL更加細,其實是麵對的對象更加細,但是關閉級別更加粗,因為它隻需要沒有事務沒有提交就可以關閉,此時有以下特征:
1、當前未提交的事務必須提交或回滾後,才能關閉掉數據庫,否則用這個命令鍵無法關閉。
2、新的數據庫操作語句和新發起的數據庫會話將無法再建立。
3、對於多個事務需要修改數據庫同一行記錄的排隊事務,還未征用到該行記錄的將會自動放棄執行。
4、如果沒有尚未提交或回滾的事務,即使有會話存在也會關閉數據庫。
SHUTDOWN IMMDIATE
1、會進行存盤操作
2、不會管當前是否有事務還沒有進行COMMIT。
3、將已經提交的事務存入磁盤。
SHUTDOWN ABORT
1、直接關閉,不進行存盤
2、會導致數據文件和日誌文件不一致的問題。
3、從外部看,和IMMDIATE沒有太大區別,不過內部唯一區別就是不會存盤操作。
4、這種方式關閉數據庫後,啟動時,會發現SMON進程通過控製文件會發現數據文件和日誌文件不一致的問題,並對其進行同步恢複。
以隻讀方式啟動數據庫:
STARTUP OPEN READ ONLY
這種啟動方式前數據庫關閉的方式不能是ABORT方式,因為隻讀方式不允許對數據庫進行修改操作,而ABORT關閉的數據庫需要用SMON來同步數據文件和日誌文件做相應恢複操作,所以一般情況下這是不成立的,除非存盤前,兩者本身就是一致的,這個可能性很小。
1、以隻讀方式打開數據庫,隻能查看,不能修改任何信息。
2、如果前一次是以“非隻讀”方式啟動,並做了一些操作後,使用ABORT關閉數據庫,本次啟動使用READ ONLY方式啟動,隻能啟動到MOUNT狀態。
3、如果為其他狀態,應當修改為:ALTER DATABASE OPEN READ ONLY;
4、如果在ABORT後,以非READ ONLY方式啟動,SMON恢複過程是內置的,對外部透明。
啟動過程中的文件信息,包含在以下視圖中:
V$DATAFILE、V$CONTROLFILE、V$LOGFILE、V$TEMPFILE
快速重啟數據庫:
最後,快速關閉帶啟動數據庫,即快速重啟數據庫命令:
STARTUP FORCE;
4、控製文件
查看控製文件的位置:
SQL> SELECT VALUE FROM V$SPPARAMETER
2 WHERE NAME ='control_files';
VALUE
----------------------------------------
D:/oracle/oradata/orcl102/control01.ctl
D:/oracle/oradata/orcl102/control02.ctl
D:/oracle/oradata/orcl102/control03.ctl
查看內存中所使用的控製文件:
SQL> SELECT NAME FROM V$CONTROLFILE;
NAME
---------------------------------------
D:/ORACLE/ORADATA/ORCL102/CONTROL01.CTL
D:/ORACLE/ORADATA/ORCL102/CONTROL02.CTL
D:/ORACLE/ORADATA/ORCL102/CONTROL03.CTL
上述兩個控製不一定是一樣的,在內存中修改了的信息,根據設置有些時候需要重啟數據庫後才能修改掉前者的信息(spfile)。
另外,控製文件為自我保護,自我鏡像,丟掉一個也沒事,即使全部丟掉也沒事,吟為它隻需要存儲一些控製信息,控製文件無論多少個(1~8個),內容都是一摸一樣的。
實現內存信息和磁盤信息不一樣的情況:
alter system set control_files=
'D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL',
'D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL'
SCOPE=spfile;
此時再次查詢上述兩個SQL:
SQL> SELECT VALUE FROM V$SPPARAMETER
2 WHERE NAME ='control_files';
VALUE
------------------------------------------------------------
D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL
SQL> SELECT NAME FROM V$CONTROLFILE;
NAME
---------------------------------------------------
D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL
重啟數據庫後再次查詢:
SQL> SELECT VALUE FROM V$SPPARAMETER
2 WHERE NAME ='control_files';
VALUE
------------------------------------------------------------
D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL
SQL> SELECT NAME FROM V$CONTROLFILE;
NAME
---------------------------------------------------
D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL
重啟前數據不一致,重啟後數據保持一致了。
1、ALTER SYSTE就是修改參數信息,修改INSTANCE內部的信息,對應ALTER DATABASE是修改數據庫的信息。
如:
ALTER SYSTEM SWITCH LOGFILE;--切換在線日誌文件組
ALTER SYSTEM checkpoint; --手工存盤
ALTER SYSTEM register;--手工注冊
ALTER SYSTEM ARCHIVE LOG CURRENT;--歸檔日誌
ALTER SYSTEM的SCOPE一般有幾類參數:
1、memory 僅僅針對內存有效。
2、spfile 重啟時針對數據庫文件和內存才有效果
3、both 修改內存和文件。
恢複控製文件3後重啟的效果:
上述已經閑置了控製文件3,此時將3恢複:
alter system set control_files=
'D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL',
'D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL',
'D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL'
SCOPE=spfile;
再次啟動時報錯:
SQL> startup force;
ORACLE 例程已經啟動。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
ORA-00214: ???? 'D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL' ?? 257 ???
'D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL' ?? 251 ???
內容看不懂是因為數據庫安裝使用了中文字符集,這裏將其修改為英文字符集:
SQL>alter session set nls_language=american;
SQL> ALTER DATABASE MOUNT;
alter database mount
*
ERROR at line 1:
ORA-00214: controlfile 'D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL' version 257
inconsistent with file 'D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL' version 251
說明控製文件也是有版本的,並且所有控製文件的版本必須保持一直,此時不一致的時候,要同步成一致的,最簡單的辦法就是COPY,操作係統級別的拷貝操作:
在SQL下可是用HOST+操作係統命令實現相應命令操作:
SQL> HOST COPY D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL
然後再次啟動數據庫就沒有問題了。
備份控製文件:
控製文件基本隻需要記錄一些版本信息,所以如果文件係統的數量沒有變化後,須對控製文件做相應的備份工作,控製文件備份工作非常簡單:
SQL> alter database backup controlfile to trace;
數據庫已更改。
這樣就完成了,那麼備份了那裏去了呢?使用一下命令就能找到:
SQL> show parameter user_dump;
NAME TYPE VALUE
---------- ----------- ------------------------------
user_dump_dest string D:/ORACLE/ADMIN/ORCL102/UDUMP
到這個目錄下可能會找到很多文件,找日期最近的一個即可,如果不好找,就先刪除掉這個目錄下的文件後,再執行控製文件備份的命令,這樣這個目錄下就隻有一個trc文件,也就是那個備份文件了,內部包含對控製文件的創建以及對日誌文件、數據文件、臨時表空間文件等的一些控製信息,可以詳細閱讀,後續會介紹如何通過這個文件恢複所有的控製文件被刪除的情況。
破壞控製文件:
將所有控製文件刪除掉,此時數據庫會自動關閉掉,並以ABORT方式關閉。啟動時報錯:
SQL> startup;
ORACLE instance started.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 176163716 bytes
Database Buffers 427819008 bytes
Redo Buffers 7135232 bytes
ORA-00205: ?????????, ??????, ???????
此時數據庫自動到NOMOUNT狀態(因為MOUNT狀態需要啟動控製文件,現在無法啟動),此時將備份的TAC文件中的信息拷貝出來執行:
SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL10" NORESETLOGS NOARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 'D:/ORACLE/ORADATA/ORCL10/REDO01.LOG' SIZE 50M,
9 GROUP 2 'D:/ORACLE/ORADATA/ORCL10/REDO02.LOG' SIZE 50M,
10 GROUP 3 'D:/ORACLE/ORADATA/ORCL10/REDO03.LOG' SIZE 50M
11 -- STANDBY LOGFILE
12 DATAFILE
13 'D:/ORACLE/ORADATA/ORCL10/SYSTEM01.DBF',
14 'D:/ORACLE/ORADATA/ORCL10/UNDOTBS01.DBF',
15 'D:/ORACLE/ORADATA/ORCL10/SYSAUX01.DBF',
16 'D:/ORACLE/ORADATA/ORCL10/USERS01.DBF',
17 'D:/ORACLE/ORADATA/ORCL10/EXAMPLE01.DBF'
18 CHARACTER SET ZHS16GBK
19 ;
控製文件已創建。
然後進行介質恢複:
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE
完成介質恢複。
SQL> alter database open;
數據庫已更改。
5、日誌文件
查詢日誌文件組信息:
SQL> SELECT * FROM V$LOG;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------
1 1 5 52428800 1 NO INACTIVE 627440 2009-10-08
2 1 6 52428800 1 NO CURRENT 651249 2009-10-08
3 1 4 52428800 1 NO INACTIVE 598150 2009-10-07
ORACLE數據庫在線日誌文件都是以組問單位(同一組日誌寫,一起工作,一般一個組一個文件,多個文件同事寫在RAC集群下解決一些性能瓶頸):GROUP#為組編號,STATUS字段為:CURRENT代表正在運行的日誌組,BYTES代表日誌組的文件的大小;SEQUENCE#代表第幾次對這個日誌組
查看正在編寫的日誌文件:
SQL> SELECT * FROM V$LOGFILE;
GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ------------------------------------------------ ---------------------
1 STALE ONLINE D:/ORACLE/ORADATA/ORCL10/REDO01.LOG NO
3 STALE ONLINE D:/ORACLE/ORADATA/ORCL10/REDO03.LOG NO
2 ONLINE D:/ORACLE/ORADATA/ORCL10/REDO02.LOG NO
狀態為:STALE就是過期的信息。
日誌組就是類似上班組,某些組上夜班,某些組上白班,交替接班的過程。管理對象以組為單位進行管理。
組內每一個文件叫做:成員。
在開始的控製文件中有以下語句,用於控製日誌文件的信息:
MAXLOGFILES 16 最多可以有多少個日誌文件組
MAXLOGMEMBERS 3 一個組最多可以有多少個成員
MAXDATAFILES 100 最多數據文件個數
MAXINSTANCES 8 最多實例個數(集群中)
在線日誌切換的條件:
1、寫滿後進行切換(切換中隻會切換到所有日誌滿的時候,前麵的日誌文件進行存盤,否則不會存盤)
2、手工使用命令:ALTER SYSTEM SWITCH LOGFILE;
切換日誌導致增量存盤,一般存盤方式:1、完全存盤;2、增量存盤
完全存盤觸發的兩種方式:
1、手工存盤:ALTER SYSTEM CHECKPOINT;
2、停止數據庫(非ABORT方式)
完全存盤的意思是:完全存盤是將內存中所有的髒塊寫入磁盤中。
查看係統檢查點號碼:
SQL> select checkpoint_change# FROM v$database;
CHECKPOINT_CHANGE#
------------------
289534543
查看係統SCN號碼:
SQL> SELECT CURRENT_SCN,CHECKPOINT_CHANGE#
2 FROM V$DATABASE;
CURRENT_SCN CHECKPOINT_CHANGE#
----------- ------------------
289553912 289534543
這兩個號碼之間的差距就是還在存盤時需要寫入的部分。
算下差距:
SQL> SELECT CURRENT_SCN-CHECKPOINT_CHANGE#
2 FROM V$DATABASE;
CURRENT_SCN-CHECKPOINT_CHANGE#
------------------------------
19369
即有19369個地方需要存盤,
查看日誌組信息:
SQL> SELECT FIRST_CHANGE#
2 FROM V$LOG WHERE STATUS='CURRENT';
FIRST_CHANGE#
-------------
289548398
說明將會從289548398這個時候開始存盤。
此時存盤後再次查詢:
SQL> SELECT * FROM V$LOG;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE#
---------- ---------- ---------- ---------- ---------- --- ---------------- -------------
1 1 3209 52428800 1 NO CURRENT 289562771
2 1 3207 52428800 1 NO INACTIVE 289534543
3 1 3208 52428800 1 NO ACTIVE 289548398
發現當前文件將會從289562771開始編寫,這裏的ACTIVE狀態在後麵說明。
查詢數據文件的檢查點編號:
SELECT CHECKPOINT_CHANGE#,NAME FROM V$DATAFILE;
會發現所有的數據文件的檢查點編號都是289562771。
日誌文件的最小值為(8192個扇區*512個字節=4M):一般為默認為5M.
增加在線日誌組:
SQL> alter database add logfile group 7
2 'D:/ORACLE/ORADATA/ORCL102/REDO07.LOG' size 5m;
數據庫已更改。
查看信息:
SQL> SELECT * FROM V$LOG;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 3213 52428800 1 NO INACTIVE 289588737 24-6月 -10
2 1 3210 52428800 1 NO INACTIVE 289570945 24-6月 -10
3 1 3211 52428800 1 NO CURRENT 289584829 24-6月 -10
7 1 3212 5242880 1 YES UNUSED 0
發現狀態為UNUSED,說明還沒有使用過。切換日誌組:
SQL> alter system switch logfile;
係統已更改。
SQL> SELECT * FROM V$LOG;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -----------
1 1 3213 52428800 1 NO CURRENT 289588737 24-6月 -10
2 1 3210 52428800 1 NO ACTIVE 289570945 24-6月 -10
3 1 3211 52428800 1 NO ACTIVE 289584829 24-6月 -10
7 1 3212 5242880 1 NO ACTIVE 289587946 24-6月 -10
ACTIVE狀態代表這個日誌組已經被切換過,但是還沒有存盤,當你切換日誌的時候,隻會在所有日誌寫滿後,順序將前麵的一個日誌組存盤,此時使用命令:
SQL> alter system checkpoint;
係統已更改。
再次查看:
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS最後更新:2017-04-02 06:51:17