1. 程式人生 > >第六章Oracle恢復內部原理(介質恢復)

第六章Oracle恢復內部原理(介質恢復)

介質恢復用在丟失或損壞資料檔案或者丟失了控制檔案的情形。介質恢復將還原的資料檔案恢復成當前資料檔案。還能夠恢復資料檔案異常離線時沒有來得及做檢查點操作丟失的變更。介質恢復使用歸檔日誌和聯機日誌。跟例項恢復不同的是,介質恢復必須由命令顯式呼叫。

6.1 什麼時候做介質恢復

由5.3節知道,資料檔案如果是還原的備份,在開啟前都要進行介質恢復,即使是應用聯機日誌就可以恢復的。另外一種情形就是資料檔案異常離線沒有做檢查點操作。不做介質恢復資料庫是無法開啟的,需要介質恢復的資料檔案也不能聯機。資料庫沒有被任何例項開啟的時候,介質恢復只能在離線的資料檔案上恢復。即使有崩潰恢復的時候也要在開啟資料庫顯示呼叫介質恢復命令。此時崩潰恢復可能沒有什麼做的但還是會自動執行。有時候介質恢復可能發現沒有日誌要應用,就會報錯“不需要介質恢復”,即該檔案不需要恢復。

如果當前控制檔案丟失了,將一個備份控制檔案還原了,介質恢復就必須做了,這是所有資料檔案都聯機的時候還要介質恢復的一個例子。

6.2 執行緒合併重做程式

介質恢復應用重做日誌時用的是執行緒合併的重做演算法。即它要同時應用所有執行緒的重做日誌,按SCN遞增的順序合併重做日誌。在還原的資料檔案上應用介質恢復的過程跟在聯機資料檔案上應用崩潰恢復的過程的不同在於:崩潰恢復同一時刻只會應用來自一個執行緒的日誌,因為同一時刻資料檔案上的塊只需要最多一個執行緒的重做日誌(同一時刻只有一個例項可能修改該塊)。在還原的備份上,則無法猜測跟該塊有關的執行緒數目。通常介質恢復時需要同時讀取所有執行緒的重做日誌,然後按照SCN遞增的順序合併重做日誌。注意這個演算法依賴於資料塊的變更各個執行緒都是按SCN遞增的順序記錄的(並行伺服器環境中)。

6.3 還原備份

在資料庫關閉或者資料檔案離線的情況下,可以將該資料檔案的備份還原。注意絕不能在資料檔案還在使用的情況下還原。每次都資料檔案頭時都會校驗資料檔案頭部的檢查點計數和資料檔案在控制檔案中的檢查點計數以檢測是否發生這種非法操作。

6.4 介質恢復命令

介質恢復命令有三種:

RECOVER DATABASE

RECOVER TABLESPACE

RECOVER DATAFILE

這三個命令的根本區別在於恢復的資料檔案集合不同。三個命令都用同樣的標準決定每個資料檔案是否要做介質恢復。每個資料檔案上都一個排它鎖,介質恢復程式開始恢復前會先申請獲得這個鎖。如果得不到就觸發一個錯誤。這可以防止兩個恢復會話同時恢復同一個資料檔案以及防止對一個在使用的資料檔案進行介質恢復。

6.4.1 RECOVER DATABASE

這個命令用來恢復所有聯機資料檔案。如果所有例項都正常關閉並且也沒有資料檔案被還原,這個命令會觸發一個“no recovery required”的錯誤。當有例項已經打開了資料檔案時這個命令也會報錯因為該例項已經持有所有的鎖。

6.4.2 RECOVER TABLESPACE

這個命令用來恢復指定表空間上的所有資料檔案。為了將表空間名轉換成具體的資料檔名,資料庫必須先開啟。這意味著這個表空間及其所有資料檔案在資料庫開啟前得先離線才能進行介質恢復。如果該表空間的所有資料檔案都不需要介質恢復時會觸發一個錯誤說沒有檔案需要介質恢復。

6.4.3 RECOVER DATAFILE

這個命令用來恢復指定的資料檔案,無論資料庫是否開啟,只要能獲得該資料檔案上的介質恢復鎖即可。當一個例項已經開啟資料庫的時候,則只能在離線的資料檔案上做介質恢復。

6.5 開始介質恢復

介質恢復時開始查詢介質恢復起始SCN。如所有要恢復的資料檔案的檔案頭中最低的檢查點SCN。注意:如果一個數據檔案的檢查點SCN落在它的離線SCN 範圍內(見2.18)則會引發一個異常。此時,該資料檔案的離線結束SCN將替代檔案頭檢查點SCN參與計算介質恢復起始SCN。

然後每個啟用的執行緒(指在介質恢復開始SCN那一刻處於啟用狀態的執行緒,見2.10)都會分配一個緩衝區用來讀取重做日誌。每個檔案的檔案頭的檢查點 SCN被儲存下來用來確保在這個SCN以前的重做日誌不需要應用。結束SCN(控制檔案中記錄的)也被儲存下來。如果是無窮大則取最大的結束SCN用來告訴介質恢復在何處停止,超出這個SCN的重做日誌不需要應用(見6.10)。介質恢復結束時,之前結束SCN為無窮大的資料檔案會在該結束SCN處做一個檢查點操作(而不是在介質恢復結束點)。這使得一個乾淨離線或者只讀的資料檔案在跟它的表空間乾淨結束SCN處進行檢查點操作。

6.6 應用重做日誌,介質恢復檢查點

每個在介質恢復起始SCN處啟用的執行緒(見2.10)都打開了一個日誌。如果該日誌是聯機狀態,就會自動被開啟;如果該日誌是歸檔狀態,就會提示使用者輸入日誌名稱,除非是自動恢復。所有執行緒中的重做日誌按照產生的順序被應用,在需要的時候還會切換執行緒。

有個例外就是在基於取消的不完全恢復(見6.12)或者是備份的控制檔案的恢復(見6.13),按序列順序計算出的下一個聯機日誌如果在磁碟上會自動被應用,否則會提示輸入它的完整路徑。

在日誌分界點,介質恢復會執行一個檢查點操作。髒資料會被寫入到磁碟,資料檔案頭檢查點推進,因此在此之前的重做日誌不需要再重新應用。介質恢復的檢查點還可能發生在介質恢復結束時會對介質恢復開始時一些結束SCN為無窮大的資料檔案在結束SCN處做檢查點操作。

6.7 介質恢復和模糊狀態位

6.7.1 介質恢復模糊位

資料檔案頭部的介質恢復模糊位用來表示由於在進行介質恢復,該資料檔案可能包含比資料檔案頭部檢查點SCN還要晚的資料變更。介質恢復模糊位在介質恢復開始的被設定,通常來說在介質恢復對資料檔案頭髮生一次檢查點時該狀態位可以被清除。當介質恢復成功結束或失敗時該狀態位才算永久清除。在8.1將見到,在不完全恢復後以重置日誌方式開啟資料庫,如果還有資料檔案的介質恢復模糊位被設定,將會開啟失敗。

6.7.2 聯機模糊位

介質恢復在碰到一個崩潰恢復結束標記(或者一個立即離線的標記:發生在資料檔案還沒有做檢查點操作就離線),介質恢復會在下一個介質恢復檢查點清除資料檔案頭的聯機模糊位和熱備模糊位(如果被設定)。

6.7.3 熱備份模糊位

在碰到一個結束熱備份標記(或者一個崩潰恢復結束標記),介質恢復會在下一個介質恢復檢查點操作時清除熱備份模糊位。在不完全恢復後以重置日誌方式開啟資料庫時如果有資料檔案熱備份模糊位或其他模糊位被設定,開啟將失敗。這防止了不完全恢復在熱備份開始和結束中間時間點結束時還能以重做日誌方式成功開啟資料庫。在這樣的時間點結束不完全恢復將會導致資料檔案處於不一致狀態,因為還原的備份可能包含該結束點和熱備份結束點之間的資料庫變更。

6.8 執行緒啟用

當一個例項啟用一個新執行緒的時候會在該執行緒的重做日誌中寫入一筆執行緒啟用記錄。當介質恢復碰到這樣的記錄時就重新分配一個重做日誌緩衝區,開啟新的執行緒的重做日誌,開始應用它的重做日誌。

6.9 執行緒禁用

執行緒被禁用的時候,它的當前日誌被標記為執行緒結束。介質恢復應用完該重做日誌後,會釋放它的重做日誌緩衝區並停止查詢該執行緒的重做日誌。

6.10 結束介質恢復(完整的介質恢復)

每個執行緒的當前日誌(也是最後一個)都會有個執行緒結束標記。完整的介質恢復(相對於不完全恢復,見6.12)都會應用重做日誌直至所有執行緒的執行緒結束處。執行緒結束標記可以認為是沒有當前控制檔案,因為執行緒結束標記在日誌頭部而不是在控制檔案中的記錄中。

注意:備份當前聯機日誌並在後面還原是很危險的,很容易導致對當前執行緒結束的誤判。因為備份中的執行緒結束標記相對於當前執行緒結束的日誌而言是過期了的。

如果正在做介質恢復的資料檔案在控制檔案中(假定是當前控制檔案)的結束SCN是無窮大,介質恢復將會聯機程結束之前停止,重做程式將聯機程結束點的SCN處停止,因為沒有超出這個SCN的重做日誌存在了。

像2.15中描述的那樣,結束SCN是在資料檔案離線時被設定的。如果沒有上面這個處理方式,將不能保證資料庫開啟的時候在結束SCN無窮大的資料檔案上的介質恢復何時能停止。

6.11 自動恢復

當介質恢復命令後加上AUTOMATIC選項時將會自動進行介質恢復。它省去了讓使用者輸入歸檔重做日誌檔案路徑的麻煩,前提是它們在磁碟上。只要日誌序號能確定,日誌檔名就可以根據資料庫初始化引數LOG_ARCHIVE_DEST和LOG_ARCHIVE_FORMAT計算出來。除非使用者指定其他的歸檔目錄,當前LOG_ARCHIVE_DEST指定的值將會被使用。介質恢復開始檢查點(見6.5)中包含(RBA欄位中)執行緒(產生該開始檢查點的執行緒)初始的日誌序號。如果啟用了多個重做日誌執行緒,將根據控制檔案中的日誌歷史記錄部分將開始SCN對映到各個執行緒對應的日誌序列號。一旦第一個恢復用的日誌找到了,後續的日誌按順序應用。如果不能確定初始的日誌序號,使用者就得猜測直到找到正確的日誌。介質恢復開始檢查點中的timestamp欄位值將幫助使用者決定。

6.12 不完全恢復

RECOVER DATABASE命令可以在所有重做日誌被應用前停止,這種型別的恢復就是不完全恢復。不完全恢復後開啟資料庫必須以重置日誌方式開啟。

不完全恢復將資料庫恢復到指定時間點或之前的資料庫一致狀態。所有後續的更新將丟失。

不完全恢復主要用於下列情形:

a. 因為有檔案損壞必須進行介質恢復,但由於某個歸檔日誌或聯機日誌損壞或丟失,不能進行完全恢復。

b. 所有處於啟用狀態的聯機日誌都不可用,因此無法進行例項恢復,這個情形變成上一個情形。

c. 為了恢復一個使用者錯誤的操作(如刪了表或者資料等),將資料庫恢復到錯誤操作之前的一個數據庫一致的點

6.12.1 Incomplete Recovery UNTIL Options

根據停止的方式分,不完全恢復有三種類型:

a. 基於取消的不完全恢復,命令:RECOVER DATABASE UNTIL CANCEL

b. 基於SCN的不完全恢復,命令:RECOVER DATABASE UNTILCHANGE

c. 基於時間點的不完全恢復,命令:RECOVER DATABASE UNTILTIME

基於取消的不完全恢復在使用者輸入cancel(而不是日誌路徑)的時候停止恢復。聯機日誌也不會自動被應用,防止在下一個日誌開始前取消。如果多個執行緒要進行恢復,可能照成某些執行緒的重做日誌只是部分應用。

基於SCN的不完全恢復停止應用指定SCN以及更高SCN相關的重做日誌。因此在該SCN時提交的事務(或更晚提交)將會被回滾。如果你想恢復到某個事務提交點SCN時,將將該SCN值加一。

基於時間點的不完全恢復,跟基於SCN的不完全恢復類似,只是輸入的是時間點。介質恢復根據重做日誌塊頭部的時間來將該時間點轉換成SCN,然後恢復到該SCN處停止。

6.12.2 不完全恢復和資料一致性

為了防止不完全恢復破壞資料庫完整性,所有資料檔案必須恢復到同一點。並且沒有任何一個數據檔案擁有該點之後的資料庫變更。這就要求介質恢復用的資料檔案必須是從早於期望恢復的時間點之前的備份中還原出來的。系統用檔案頭的模糊位(見8.1)來保證資料檔案上沒有停止時間點之後的變更。

6.12.3 不完全恢復和控制檔案記錄的資料檔案

如果要不完全恢復到某個資料檔案被刪除的時間點之前,則控制檔案中必須有該被刪除的資料檔案記錄,否則無法進行恢復。而現有的控制檔案已經沒有該資料檔案的記錄了。一個可選的方法就是恢復的時候使用刪除資料檔案之前時間點備份的控制檔案進行不完全恢復;另一個可選的方法就是用CREATE CONTROLFILE命令建立一個控制檔案包含被刪除的資料檔案。

不完全恢復到某個資料檔案被新增之前的時間點倒沒有什麼問題。新增的資料檔案會在恢復後開啟資料庫時被忽略,為了避免介質恢復訪問該資料檔案,該資料檔案可能被離線。

6.12.4 不完全恢復後以重置日誌方式開啟資料庫

不完全恢復後下一步就是以RESETLOGS選項開啟資料庫。其中一個影響(見第7節)就是資料庫丟棄了不完全恢復中沒用用到的重做日誌,並且後續恢復將再也無法應用這些重做日誌。如果是錯誤的進行了不完全恢復(比如說又找到了丟失的日誌),下一步可以以NORESETLOGS選項開啟資料庫。如果開啟成功了,則需要進行成功的完全恢復。

6.12.5 不完全恢復中的離線檔案

如果不完全恢復中某個資料檔案處於離線狀態,它不會被恢復。如果該檔案是正常離線的表空間的一部分,不被恢復就沒問題。它將一直處於離線狀態直至恢復結束。否則,如果以重置日誌方式開啟資料庫後該資料檔案仍然是離線狀態,該資料檔案所在表空間將不得不被刪除。因為它需要重置日誌之前的日誌進行介質恢復。通常在介質恢復之前都要去檢查 V$DATAFILE中保證資料檔案都聯機。只有那些是正常離線的表空間的資料檔案且該資料檔案將會被刪除的才能在不完全恢復中保持離線(見8.6)。

6.13 基於備份的控制檔案的恢復

如果介質恢復時控制檔案比當前控制檔案舊,則需要進行基於備份的控制檔案的恢復(RECOVER DATABASE...USING BACKUP CONTROLFILE)。這適用於控制檔案是從一個備份中還原出來的或者用CREATE CONTROLFILE...RESETLOGS命令建立的備份控制檔案。

CREATE CONTROLFILE...RESETLOGS命令似的控制檔案是一個“備份”。在這個命令之後只能進行基於備份控制檔案的恢復,只能用RESETLOGS選項開啟資料庫。這個命令意味著所有的聯機重做日誌和控制檔案備份都丟失。

相比之下,命令CREATE CONTROLFILE...NORESETLOGS使得控制檔案最新。如記錄了最新的聯機日誌和日誌序號。這個命令後介質恢復不是必需的。事實上,如果是以“乾淨”的方式關閉並且沒有資料檔案是從備份中還原出來的,則不需要進行任何恢復。此後可以以正常的方式或者NORESETLOGS方式開啟資料庫。

一個備份的控制檔案缺乏當前聯機日誌和資料檔案結束SCN的正確資訊。因此恢復程序不能找到聯機日誌並自動應用。並且,恢復程序還得假定結束SCN是無窮大。以RESETLOGS選項開啟資料庫會糾正該資訊。備份的控制檔案中包含的啟用的執行緒集合可能跟原始的控制檔案也不同,以RESETLOGS選項開啟資料庫後也會糾正該執行緒集合資訊。

BACKUP CONTROLFILE選項可以獨立使用,也可以結合不完全恢復。除非使用了不完全恢復選項,所有執行緒都要應用重做日誌直至執行緒結束為止。這個會在以RESETLOGS選項開啟資料庫時驗證。

當還原了一個備份的控制檔案後,即使沒有執行不完全恢復,也會要求以RESETLOGS選項開啟資料庫。當問題僅僅是因為丟失了當前控制檔案(並且存在控制檔案備份),下面步驟用來避免基於控制檔案的恢復和重置日誌:

  1. 將備份控制檔案複製到當前控制檔案位置,然後將資料庫啟動到MOUNTED狀態。
  2. 執行ALTER DATABASE BACKUP CONTROLFILE TO TRACE NORESETLOGS.
  3. 執行第二步中得到跟蹤檔案中的SQL:CREATE CONTROLFILE...NORESETLOGS

第三步中的CREATE CONTROLFILE...NORESETLOGS命令很重要,它反映了資料庫的結構資訊,跟丟失的控制檔案一樣。如在控制檔案備份後添加了一個數據檔案,那麼CREATE CONTROLFILE 命令就要包含該資料檔案的資訊。

當控制檔案確實是備份的控制檔案時,在RECOVER DATABASE命令時用BACKUP CONTROLFILE選項將會失敗,這個很快就能檢測到。一個跡象就是資料檔案頭的檢查點計數比該資料檔案在控制檔案中的記錄的檢查點計數要大。這個測試可能也不能測不出備份控制檔案,因為可能資料檔案也是從備份中還原。另外一個測試是驗證聯機日誌檔案頭部跟它們在控制檔案中的記錄,同樣也可能無法測出一個備份控制檔案。

6.14 建立資料檔案:恢復一個備份中沒有的資料檔案

如果資料檔案丟失或損壞了,而且還沒有任何備份,它可以通過重做日誌和控制檔案中的記錄恢復,前提是滿足一下條件:

  1. 自該資料檔案建立後的所有重做日誌檔案都可用。
  2. 包含該資料檔案的資訊(名稱和大小等)的控制檔案可用或者可以重建。

首先用ALTER DATABASE CREATE DATAFILE 建立一個新的空的資料檔案以替換丟失的資料檔案,然後在該資料檔案上通過命令RECOVER DATAFILE 應用重做日誌,從資料檔案建立的時間起到丟失或損壞的那一刻為止。當期間的所有重做日誌都應用後,該資料檔案就跟丟失前的那一刻狀態一致了。這個方法對恢復最近建立的資料檔案且沒有相應備份的情形很有用。不過SYSTEM表空間的原始資料檔案不能用這個方法恢復,因為在資料庫建立的時候還沒有相應的重做日誌儲存下來。

6.15 用Export/Import進行即時恢復

偶爾,我們要撤銷某個錯誤的操作(如刪除表或者大量資料等)。一個途徑就是執行一個在錯誤時間點之前的不完全恢復,然後重置日誌開啟資料庫。這種方法就導致整個資料庫——不僅僅是出錯的幾個SCHEMA物件——要回到一個過去的時間點。

這個方法有個副作用,就是它丟棄了提交的事務。任何發生在重置日誌SCN後的更新都丟失了。重做日誌的另外一個副作用就是使得之前所有的備份對將來的恢復都沒有用。

因此將資料庫全部回滾到過去的一個時間點並不是一個可以接受的方案。下面這個替代方案的副作用僅僅是將受影響的範圍限制到恢復的幾個物件。

即時不完全恢復是發生在產品資料庫的副本上——稱之為用於恢復的資料庫。該資料庫的初始狀態取的是產品庫發生在那個錯誤操作之前的備份,在副本資料庫上可以將不相干的資料庫物件都離線以避免不必要的恢復。不過SYSTEM表空間和回滾段所在的表空間必須參與恢復以保證能以‘乾淨的’方式開啟資料庫。(這也說明了回滾段和資料檔案應該分開存放)。

當介質恢復到錯誤時間之前的那一刻後,以重置日誌方式開啟資料庫。此時資料庫處於錯誤操作之前的一個時間點,等於有了個出錯前的資料庫版本。將錯誤操作影響的資料庫物件用EXPORT匯出來然後匯入到產品庫中。在匯入到產品庫之前,先做以下準備:

  1. 為了恢復一個錯誤的更新操作,在產品庫把受影響的表裡的資料先清除掉。如truncate表資料。
  2. 為了恢復一個錯誤的刪除操作,在產品庫裡先重建一下被刪除的物件(保持空資料)。

然後最重要的一步就是用IMPORT匯入,選擇只匯入資料。因為EXPORT/IMPORT是一個漫長的過程,因此可以推遲到無法忍受的時間點執行。同時要恢復的物件也可以通過在產品庫和副本庫間建DBLINK來隨時同步。

這種即時恢復的一個副作用就是跟要恢復的物件有關的事務一致性可能無法保證,不過這個副作用可以通過把要恢復的物件面擴充套件到跟該事務有關的所有資料庫物件。

**********本部落格所有內容均為原創,如有轉載請註明作者和出處!!!**********
Name: guoyJoe

QQ: 252803295

Email: [email protected]

OCM:http://education.oracle.com/education/otn/YGuo.HTM
_____________________________________________________________
加群驗證問題:哪些SGA結構是必需的,哪些是可選的?否則拒絕申請!!!

[email protected]  總群:127149411

[email protected] No.1群:177089463(已滿)

[email protected] No.2群:121341761

[email protected] No.3群:140856036



相關推薦

Oracle恢復內部原理介質恢復

介質恢復用在丟失或損壞資料檔案或者丟失了控制檔案的情形。介質恢復將還原的資料檔案恢復成當前資料檔案。還能夠恢復資料檔案異常離線時沒有來得及做檢查點操作丟失的變更。介質恢復使用歸檔日誌和聯機日誌。跟例項恢復不同的是,介質恢復必須由命令顯式呼叫。 6.1 什麼時候做介質恢復

:循環結構

結構 不執行 三種 表達式 成了 不改變 條件 運算符 步驟 第六章:循環結構(二) 一. for 循環 1.循環結構的四個組成部分 (1). 初始部分:設置循環的初始狀態,比如我們設置記錄循環次數的變量 i 為 0 . (2). 循環體:重復執行的代碼 .

演算法導論 :堆排序 筆記堆、維護堆的性質、建堆、堆排序演算法、優先順序佇列、堆排序的程式碼實現

堆排序(heapsort) 像合併排序而不像插入順序,堆排序的執行時間為O(nlgn) 。像插入排序而不像合併排序,它是一種原地( in place) 排序演算法:在任何時候,陣列中只有常數個元素儲存在輸入陣列以外。 堆: (二叉)堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。樹

Realm及相關物件 PrincipalCollection

之前使用過的(來點印象) login("classpath:shiro-authenticator-all-success.ini"); Subject subject = SecurityUtils.getSubject(); //得到一個身份集合,其包含了Realm

JVM垃圾收集器2

1、G1 說明: 從上圖來看,G1與CMS相比,僅在最後的"篩選回收"部分不同(CMS是併發清除),實際上G1回收器的整個堆記憶體的劃分都與其他收集器不同。 CMS需要配合ParNew,G1可單獨回收整個空間 原理: G1收集器將整個堆劃分為多個大小相等的Region G1

高等數學: 定積分的應用1定積分的應用 平面圖形的面積 立體體積

§6.1  定積分的元素法 一 再論曲邊梯形面積計算 設在區間上連續,且,求以曲線為曲邊,底為的曲邊梯形的面積。 1、化整為零 用任意一組分點   將區間分成 個小區間,其長度為 並記  相應地,曲邊梯形被劃分成個窄曲邊梯形,第個窄曲邊梯形的面積記為。 於是   2、以

GZIP壓縮原理分析32—— Deflate演算法詳解五23 動態哈夫曼編碼分析12構建哈夫曼樹04

*構建literal/length樹 部落格http://www.cnblogs.com/esingchan/p/3958962.html中這樣說道:“ZIP之所以是通用壓縮,它實際上是針對位元組作為

GZIP壓縮原理分析29—— Deflate演算法詳解五20 動態哈夫曼編碼分析09構建哈夫曼樹01

現在已經完成了對字串“As mentioned above,there are many kinds of wireless systems other than cellular.”進行壓縮的第一步

GZIP壓縮原理分析19—— Deflate演算法詳解五10 演算法分析04 格式說明03 靜態哈夫曼編碼

靜態哈夫曼編碼(Compression with fixed Huffman codes),這部分內容只要看格式就好,出現在這裡的碼錶只是為了說明,細節此時可能不懂,但是後面會鋪開來講,不用擔心。

Realm及相關物件 AuthorizationInfo

AuthorizationInfo用於聚合授權資訊的: public interface AuthorizationInfo extends Serializable { Collection<String> getRoles(); //獲取角色字串資訊

GZIP壓縮原理分析31—— Deflate演算法詳解五22 動態哈夫曼編碼分析11構建哈夫曼樹03

*構建distance樹 現在已經知道壓縮會在壓縮結果中儲存葉子節點深度資訊(即碼字長度)從而讓解壓方間接得到碼錶,但是問題來了,構造樹的資訊只包括碼字長度,可解壓方怎麼知道這個碼字長度是哪個原碼的(注意,“原碼”與“原始碼”的差別,前者是指原始資料,後者是指程式碼)?有什

GZIP壓縮原理分析30—— Deflate演算法詳解五21 動態哈夫曼編碼分析10構建哈夫曼樹02

*正規化哈夫曼編碼 使用靜態哈夫曼編碼的編碼/解碼雙方同時擁有一張完全相同的碼錶,這張碼錶是事先規定好的,只要使用這種壓縮方式並且使用這種壓縮方式對應的靜態哈夫曼編碼,那麼壓縮方就照著碼錶壓縮,解碼方

Realm及相關物件 Realm

一、Realm 1. 定義實體及關係 即使用者-角色之間是多對多關係,角色-許可權之間是多對多關係;且使用者和許可權之間通過角色建立關係;在系統中驗證時通過許可權驗證,角色只是許可權集合,即所謂的顯示角色;其實許可權應該對應到資源(如選單、URL、頁面按鈕、Java 方法

篇-以隱式意圖Implicit Intent呼叫系統服務

一、新建一個layout5.xml,同樣換為constriant模式。 二、拖動兩個Button到預覽介面,第一個按鈕名字改為DISPLAY WEBPAGE,第二個按鈕名字改為MAKE A CALL。第一個按鈕連線上左右。width改為match。第二個按鈕連線左右,上方連第一個按鈕的下方。width改為m

】 暫存器記憶體訪問總結

3.1.記憶體中字的儲存 1.概念:CPU中,用16位暫存器來儲存一個字,即一個只要用兩個地址連續的記憶體單元來存放。 2.字單元:存放一個字型資料(16位)的記憶體單元,由兩個地址連續的記憶體單元組成。     通常情況下,我們將起始地址為N的字單元簡稱為N地址單元。 3.2.D

Vulkan Cookbook 5 建立統一紋理uniform texel緩衝區

建立統一紋理(uniform texel)緩衝區 譯者注:示例程式碼點選此處 統一紋理緩衝區准許我們以類似於影象讀取資料的方式讀取資料,它們的內容不是解釋為單個(標量)值的陣列,而是解釋為具有一個、兩個、三個或四個元件的格式化畫素(紋素)。通過這樣的緩衝區,我們可以訪問比通常影象提供的資料大

演算法競賽入門經典(第二版)-劉汝佳- 高效演算法設計 習題18/28

說明 本文是我對第8章28道習題的練習總結,建議配合紫書——《演算法競賽入門經典(第2版)》閱讀本文。 另外為了方便做題,我在VOJ上開了一個contest,歡迎一起在上面做:第八章習題contest 如果想直接看某道題,請點開目錄後點開相應的題目!!!

17 迭代器模式Iterator Pattern

概述 在面向物件的軟體設計中,我們經常會遇到一類集合物件,這類集合物件的內部結構可能有著各種各樣的實現,但是歸結起來,無非有兩點是需要我們去關心的:一是集合內部的資料儲存結構,二是遍歷集合內部的資料。面向物件設計原則中有一條是類的單一職責原則,所以我們要儘可能的去分解這些職責,用不同的類去承擔不同的職責。I

《Java從入門到失業》:類和物件4.2:String類

4.2String類        這一節,我們學習第一個類:String類。String翻譯成漢語就是“字串”,是字元的序列。我們知道,在Java中,預設採用Unicode字符集,因此字串就是Unicode字元的序列。例如字

《Java從入門到失業》:類和物件4.4:方法引數及傳遞

4.4方法引數及傳遞        關於這個知識點,我想了很久該不該在這裡闡述。因為這個知識點稍微有點晦澀,並且就算不了解也不影響用Java編寫程式碼。不過筆者剛開始工作的時候,就是因為這塊內容沒有過多的關注,以至於相當於長一段時間對這塊內容都模糊不