關系數據庫——數據庫恢復

實現技術

?

  • 恢復操作的基本原理:冗余?
  • 恢復機制涉及的兩個關鍵問題
  1. 如何建立冗余數據
    • 數據轉儲(backup
    • 登錄日志文件(logging
  2. ?如何利用這些冗余數據實施數據庫恢復

?

數據轉儲

?

  • 數據轉儲定義:

轉儲是指DBA將整個數據庫復制到其他存儲介質上保存起來的過程,備用的數據稱為后備副本或后援副本

  • 如何使用
    1. 數據庫遭到破壞后可以將后備副本重新裝入
    2. 重裝后備副本只能將數據庫恢復到轉儲時的狀態
  • 轉儲方法
    1. 靜態轉儲與動態轉儲
    2. 海量轉儲與增量轉儲

靜態轉儲:

1)定義:在系統中無事務運行時進行的轉儲操作。轉儲開始的時刻數據庫處于一? 致性狀態,而轉儲不允許對數據庫的任何存取、修改活動。靜態轉儲得到的一定是一個數據一致性的副本。

2)優點:實現簡單

3)缺點:降低了數據庫的可用性

轉儲必須等待正運行的用戶事務結束才能進行;新的事務必須等待轉儲結束才能執行

動態轉儲:

???????? ?? 1)定義:轉儲期間允許對數據庫進行存取或修改。轉儲和用戶事務可以并發執行。

???????? ?? 2)優點:不用等待正在運行的用戶事務結束;不會影響新事務的運行。

???????? ?? 3)實現:必須把轉儲期間各事務對數據庫的修改活動登記下來,建立日志文件后備副本加上日志文件就能把數據庫恢復到某一時刻的正確狀態。

海量轉儲:

???????? ?? 1)定義:每次轉儲全部數據庫

???????? ?? 2)特點:從恢復角度,使用海量轉儲得到的后備副本進行恢復更方便一些。

增量轉儲:

???????? ?? 1)定義:每次只轉儲上一次轉儲后更新過的數據

???????? ?? 2)特點:如果數據庫很大,事務處理又十分頻繁,則增量轉儲方式更實用更有效。

?

日志文件

?

1、什么是日志文件

日志文件(log)是用來記錄事務對數據庫的更新操作的文件

2、日志文件的格式

1)以記錄為單位:

日志文件中需要登記的內容包括:

    • 各個事務的開始標記(BEGIN TRANSACTION)
    • 各個事務的結束標記(COMMITROLLBACK)
    • 各個事務的所有更新操作

???? 以上均作為日志文件中的一個日志記錄???????????????????

每個日志記錄的內容:

  • 事務標識(標明是哪個事務)
  • 操作類型(插入、刪除或修改)
  • 操作對象(記錄內部標識)
  • 更新前數據的舊值(對插入操作而言,此項為空值)
  • 更新后數據的新值(對刪除操作而言, 此項為空值)

?

2)以數據塊為單位

日志記錄內容包括:

事務標識(標明是哪個事務)

?被更新的數據塊

3、日志文件的作用

  • 進行事務故障恢復
  • 進行系統故障恢復
  • 協助后備副本進行介質故障恢復

1)事務故障恢復和系統故障恢復必須用日志文件

2)在動態轉儲方式中必須建立日志文件,后備副本和日志文件結合起來才能有效地恢復數據庫

3)靜態轉儲方式中也可以建立日志文件(重新裝入后備副本,然后利用日志文件把已完成的事務進行重做,對未完成事務進行撤銷)

4、登記日志文件:

  • 基本原則
    1. 登記的次序嚴格按并行事務執行的時間次序
    2. 必須先寫日志文件,后寫數據庫

為什么要先寫日志文件?

1)寫數據庫和寫日志文件是兩個不同的操作,在這兩個操作之間可能發生故障

2)如果先寫了數據庫修改,而在日志文件中沒有登記下這個修改,則以后就無法恢復這個修改了

3)如果先寫日志,但沒有修改數據庫,按日志文件恢復時只不過是多執行一次不必要的UNDO操作,并不會影響數據庫的正確性

?

恢復策略

?

事務故障的恢復

  • 事務故障:事務在運行至正常終止點前被終止
  • 恢復方法
    1. 由恢復子系統應利用日志文件撤消(UNDO)此事務已對數據庫進行的修改
  • 事務故障的恢復由系統自動完成,對用戶是透明的,不需要用戶干預
  • 事務故障的恢復步驟

1. 反向掃描文件日志,查找該事務的更新操作。

2. 對該事務的更新操作執行逆操作。即將日志記錄中“更新前的值” 寫入數據庫。

?

  • ?插入操作, “更新前的值”為空,則相當于做刪除操作
  • ?刪除操作,“更新后的值”為空,則相當于做插入操作
  • ?若是修改操作,則相當于用修改前值代替修改后值

3. 繼續反向掃描日志文件,查找該事務的其他更新操作,并做同樣處理。

4. 如此處理下去,直至讀到此事務的開始標記,事務故障恢復就完成了。

系統故障的恢復

  • 系統故障造成數據庫不一致狀態的原因
    1. 未完成事務對數據庫的更新已寫入數據庫
    2. 已提交事務對數據庫的更新還留在緩沖區沒來得及寫入數據庫
  • 恢復方法
    1. Undo 故障發生時未完成的事務
    2. Redo 已完成的事務
  • 系統故障的恢復由系統在重新啟動時自動完成,不需要用戶干預
  • 系統故障的恢復步驟

1. 正向掃描日志文件

      • 重做(REDO) 隊列: 在故障發生前已經提交的事務
        • 這些事務既有BEGIN TRANSACTION記錄,也有COMMIT記錄
      • 撤銷 (Undo)隊列: 故障發生時尚未完成的事務
        • ?這些事務只有BEGIN TRANSACTION記錄,無相應的COMMIT記錄

2. 對撤銷(Undo)隊列事務進行撤銷(UNDO)處理

      • 反向掃描日志文件,對每個UNDO事務的更新操作執行逆操作

3. 對重做(Redo)隊列事務進行重做(REDO)處理

      • 正向掃描日志文件,對每個REDO事務重新執行登記的操作

介質故障的恢復

恢復步驟

重裝數據庫

  • 裝入最新的后備副本,使數據庫恢復到最近一次轉儲時的一致性狀態。
  • 對于靜態轉儲的數據庫副本,裝入后數據庫即處于一致性狀態
  • 對于動態轉儲的數據庫副本,還須同時裝入轉儲時刻的日志文件副本,利用恢復系統故障的方法(即REDO+UNDO),才能將數據庫恢復到一致性狀態。

?裝入有關的日志文件副本,重做已完成的事務。

  • 首先掃描日志文件,找出故障發生時已提交的事務的標識,將其記入重做隊列。
  • 然后正向掃描日志文件,對重做隊列中的所有事務進行重做處理。
  • 介質故障的恢復需要DBA介入
  • DBA的工作
    1. 重裝最近轉儲的數據庫副本和有關的各日志文件副本
    2. 執行系統提供的恢復命令,具體的恢復操作仍由DBMS完成

檢查點

  • 利用日志技術進行數據庫恢復存在兩個問題
    1. 搜索整個日志將耗費大量的時間
    2. REDO處理:事務實際上已經執行,又重新執行,浪費了大量時間
  • 具有檢查點(checkpoint)的恢復技術
    1. 在日志文件中增加檢查點記錄(checkpoint
    2. 增加重新開始文件,并讓恢復子系統在登錄日志文件期間動態地維護日志
  • 檢查點記錄的內容
    1. 建立檢查點時刻所有正在執行的事務清單
    2. 這些事務最近一個日志記錄的地址
  • 重新開始文件的內容
    1. 記錄各個檢查點記錄在日志文件中的地址

  • 動態維護日志文件的方法

周期性地執行如下操作:建立檢查點,保存數據庫狀態。

具體步驟是:

1.將當前日志緩沖區中的所有日志記錄寫入磁盤的日志文件上

2.在日志文件中寫入一個檢查點記錄

3.將當前數據緩沖區的所有數據記錄寫入磁盤的數據庫中

4.把檢查點記錄在日志文件中的地址寫入一個重新開始文件

?

使用檢查點方法可以改善恢復效率

當事務T在一個檢查點之前提交:

  1. T對數據庫所做的修改一定都已寫入數據庫
  2. 寫入時間是在這個檢查點建立之前或在這個檢查點建立之時
  3. 在進行恢復處理時,沒有必要對事務T執行REDO操作

使用檢查點的恢復步驟

?1.從重新開始文件中找到最后一個檢查點記錄在日志文件中的地址,由該地址在日志文件中找到最后一個檢查點記錄

?2.由該檢查點記錄得到檢查點建立時刻所有正在執行的事務清單ACTIVE-LIST

  • 建立兩個事務隊列
    • UNDO-LIST
    • REDO-LIST
    • ACTIVE-LIST暫時放入UNDO-LIST隊列,REDO隊列暫為空

?3.從檢查點開始正向掃描日志文件,直到日志文件結束

  • 如有新開始的事務Ti,把Ti暫時放入UNDO-LIST隊列
  • 如有提交的事務Tj,把TjUNDO-LIST隊列移到REDO-LIST隊列

4.UNDO-LIST中的每個事務執行UNDO操作

? ??????????????? REDO-LIST中的每個事務執行REDO操作

?

鏡像

?

為避免硬盤介質出現故障影響數據庫的可用性,許多DBMS提供了數據庫映像(mirror)功能用于數據庫恢復。

將整個數據庫或其中的關鍵數據復制到另一個磁盤上,每當主數據庫更新時,DBMS自動把更新后的數據復制過去,由DBMS自動保證鏡像數據與主數據庫的一致性。一旦出現介質故障,可由鏡像磁盤繼續提供使用,同時DBMS自動利用磁盤數據進行數據庫的恢復,不需要關閉系統和重裝數據庫副本。

在沒有出現故障時,數據庫鏡像還可以用于并發操作,即當一個用戶對數據庫加排它鎖修改數據時,其他用戶可以讀鏡像數據庫上的數據,而不必等待該用戶釋放鎖。

由于數據庫鏡像是通過復制數據實現的,頻繁地賦值數據自然會降低系統運行效率。因此在實際應用中用戶往往只選擇對關鍵數據和日志文件進行鏡像。

?

?

?

小結:

?

  • 如果數據庫只包含成功事務提交的結果,就說數據庫處于一致性狀態。保證數據一致性是對數據庫的最基本的要求。
  • 事務是數據庫的邏輯工作單位
    1. DBMS保證系統中一切事務的原子性、一致性、隔離性和持續性
  • DBMS必須對事務故障、系統故障和介質故障進行恢復
  • 恢復中最經常使用的技術:數據庫轉儲和登記日志文件
  • 恢復的基本原理:利用存儲在后備副本、日志文件和數據庫鏡像中的冗余數據來重建數據庫

常用恢復技術

?

事務故障的恢復

  • UNDO

系統故障的恢復

  • UNDO + REDO

介質故障的恢復

  • 重裝備份并恢復到一致性狀態 + REDO

?

提高恢復效率的技術

檢查點技術

  • 可以提高系統故障的恢復效率??
  • 可以在一定程度上提高利用動態轉儲備份進行介質故障恢復的效率

鏡像技術

  • 鏡像技術可以改善介質故障的恢復效率

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444877.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444877.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444877.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Lua語言中pairs和ipairs的區別

tbl = {"alpha", "beta", ["one"] = "uno", ["two"] = "dos"} for key, value in ipairs(tbl) do print(key, value) end --pairs() --pairs()函數基本和ipairs()函數用法相同, 區別在于pairs()可以遍歷整個table…

算法(22)-leetcode-劍指offer6

leetcode-劍指offer-545.面試題55- 二叉樹的深度46.面試題55-2-平衡二叉樹47.面試題57-1-和為s的兩個數字-雙指針48.面試題57-2-和為s 的連續正數序列-雙指針49.面試題56-數組中出現數字的次數-位運算leetcode-136 只出現一次的數字Ileetcode-137 只出現一次的數字IIleetcode-2…

leetcode160 相交鏈表

編寫一個程序,找到兩個單鏈表相交的起始節點。 如下面的兩個鏈表: 在節點 c1 開始相交。 示例 1: 輸入:intersectVal 8, listA [4,1,8,4,5], listB [5,0,1,8,4,5], skipA 2, skipB 3 輸出:Reference of the node…

lua的一些api文檔總結吧

打算記錄一些我認為重要的常用的api: 1. 建一個新表 void lua_createtable (lua_State *L, int narr, int nrec) 創建一個新的table, 并把它放在棧頂. narr和nrec分別指定該table的array部分和hash部分的預分配元素數量 無返回值 棧高度+1, 棧頂元素是新table #define l…

關于mysql的一些時間格式和字符的問題

最近在做一些游戲的數據分析,需要對大量數據的用戶行為進行處理存庫,其中有個數據庫字段是datetime類型的,這個以前都沒用過,我以前都喜歡用int來存放時間戳,但這次這樣用,我就得在數據庫中轉換了&#xff…

算法(17)-leetcode-劍指offer1

leetcode-劍指offer-11.面試題3-數組中的重復數字2.面試題04-二維數組中的查找3.面試題05-替換空格4.面試題06-從尾到頭打印鏈表5.面試題07-重建二叉樹6.面試題09-兩個堆棧實現隊列7.面試題10-1-斐波那契數列8.面試題10-2-青蛙跳臺階問題9.面試題11-旋轉數組的最小數字10.面試題…

蟻群算法的一些東西

運行了三個TSP經典用例,基本符合要求。僅僅是一份按照蟻群算法的原理寫的代碼,沒有做任何優化。 // bigSearch.cpp : 定義控制臺應用程序的入口點。 // #include<iostream> #include<math.h> #include<time.h> using namespace std; //該程序是以…

leetcode101 對稱二叉樹

給定一個二叉樹&#xff0c;檢查它是否是鏡像對稱的。 例如&#xff0c;二叉樹 [1,2,2,3,4,4,3] 是對稱的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的: 1 / \ 2 2 \ \ 3 3 說明: 如果你可以運用遞歸和迭…

Linux內核OOM機制的詳細分析

Linux 內核有個機制叫OOM killer&#xff08;Out-Of-Memory killer&#xff09;&#xff0c;該機制會監控那些占用內存過大&#xff0c;尤其是瞬間很快消耗大量內存的進程&#xff0c;為了防止內存耗盡而內核會把該進程殺掉。典型的情況是&#xff1a;某天一臺機器突然ssh遠程登…

算法(18)-leetcode-劍指offer2

leetcode-劍指offer-211.面試題13-機器人的運動范圍-廣度優先搜索12.面試題14-1-剪繩子13.面試題14-2-剪繩子214.面試題16-二進制中1的個數-布萊恩克尼根15.面試題16-數值的整數次方-快速冪解析法16.面試題17-打印從1到最大的n位數17.面試題18-刪除鏈表的節點18.面試題19-正則匹…

rabbitmq技術的一些感悟(一)

Rabbitmq 初識rabbitmq RabbitMQ是流行的開源消息隊列系統,用erlang語言開發。RabbitMQ是AMQP(高級消息隊列協議)的標準實現。如果不熟悉AMQP,直接看RabbitMQ的文檔會比較困難。不過它也只有幾個關鍵概念,這里簡單介紹 幾個概念說明: Broker

leetcode21 合并兩個鏈表

將兩個有序鏈表合并為一個新的有序鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 示例&#xff1a; 輸入&#xff1a;1->2->4, 1->3->4 輸出&#xff1a;1->1->2->3->4->4 思路&#xff1a;鏈表歸并。 /*** Definition for si…

rabbitmq技術的一些感悟(二)

上一節文章主要是說了一下rabbitmq的安裝以及搭建好環境的一些命令,以及常用的api調用,其實自從google被封掉之后,我之前收藏的很多技術連接都已經被禁止訪問了,這個是多么可悲的一件事情啊,說多了都是淚。 首先,我先寫一段消費者的模塊,建立連接,初始化amq以及銷毀連接…

算法(19)-leetcode-劍指offer3

leetcode-劍指offer-321.面試題22-鏈表中的倒數第k個節點22.面試題24-反轉鏈表23.面試題25-合并兩個排序鏈表-遞歸24.面試題26-樹的子結構25.面試題27-二叉樹的鏡像26.面試題28-對稱二叉樹27.面試題29-順時針打印矩陣28.面試題30-包含min函數的棧29.面試題31-棧的押入&#xff…

高效解析xml的總結,閑下來寫的

需要這么幾個庫&#xff0c;直接放在你的代碼工程里即可&#xff1a; #include "rapidxml.h" #include "rapidxml_utils.h" int ReBornBossConf::loadConf(const char* szFileName){ rapidxml::file<char> fdoc(szFileName); rapidxml::xml_docum…

leetcode35 插入的位置

給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置。 你可以假設數組中無重復元素。 思路&#xff1a;二分查找 public class Solution {public int searchInsert(i…

算法(20)-leetcode-劍指offer4

leetcode-劍指offer-433.面試題33-二叉搜索樹的后序遍歷序列34.面試題34-二叉樹中和為某一值的路徑35.面試題35-復雜鏈表的復制36.面試題36-二叉搜索樹與雙向鏈表37.面試題37-序列化二叉樹38.面試題38-字符串的排列39.面試題39-數組中出現次數超過一半的數字40.面試題40-最小的…

關于linux的進程中的各個線程cpu占用情況的分析和查看

我們經常會在新開的服搭建一個游戲的服務器,有時候要進行壓力測試,那么如何來看呢,一般我們會通過top命令查看各個進程的cpu和內存占用情況,獲得到了我們的進程id,然后我們也許會通過pstack命令查看里邊的各個線程id以及對應的線程現在正在做什么事情,分析多組數據就可以…

算法(21)-leetcode-劍指offer5

leetcode-劍指offer-443.面試題43-1&#xff5e;n整數中1出現的次數44.面試題44-數字序列中某一位的數字45.面試題45-把數組排成最小的數-快排變種46.面試題46-把數字翻譯成字符串47.面試題47-禮物的最大價值-dp48.面試題48-最長不含重復字符的子字符串-滑動窗口法49.面試題49-…

游戲中DDA算法和Bresenham算法的應用

在角色扮演或即時戰略游戲中,經常會將角色以最佳的方式走到指定地點。游戲場景的地面情況復雜,而且場面大,若采用盲目式搜索,例如盲目窮舉法,則幾乎要遍歷整個場景,效率非常低,造成角色反應速度過慢,實踐證明是一種不適合網絡游戲尋路方法。而啟發式搜索算法在障礙較少的情況下…