SQL Server 數據庫備份還原和數據恢復


 

認識數據庫備份和事務日志備份

數據庫備份與日志備份是數據庫維護的日常工作,備份的目的是在於當數據庫出現故障或者遭到破壞時可以根據備份的數據庫及事務日志文件還原到最近的時間點將損失降到最低點。

 

數據庫備份

數據庫備份可以手動備份和語句備份

一.手動備份數據庫

1.鼠標右鍵選擇你要進行備份的數據庫-任務-備份

可以在常規選項頁面你可以選擇備份類型是進行完整數據庫備份還是差異數據庫備份

2.點擊添加選項,選擇數據庫文件的存放路徑

注意文件名記得加后綴.bak,便於恢復時的查找

3.你還可以在選項頁面是追加到現有的備份集,還是覆蓋所有的現有備份集,還可以選擇備份驗證完整性(建議選擇),還可以選擇是否壓縮備份等。

二.語句備份數據庫

use master 
go
BACKUP DATABASE [test] TO  DISK = N'D:\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\test.bak' WITH NOFORMAT, NOINIT,  NAME = N'test-完整 數據庫 備份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

數據庫日志備份

      首先需要注意,數據庫日志的備份是基於數據庫完整備份,也就是說你備份數據庫日志之前你首先要先對數據庫進行一次完整的備份,因為之間會涉及到堅持到檢查點lsn這也是本文接下來要講的重點。

一.手動備份數據庫日志

1.右鍵數據庫-任務-備份-選擇備份類型(事務日志)

2.點添加,添加日志文件備份存儲路徑

3.同數據庫完整備份一樣,你也可以選擇覆蓋現有備份集或者追加到現有備份集,這里現在覆蓋現有備份集、驗證完整性,然后確認備份

二.語句備份數據庫事務日志

BACKUP LOG [test] TO  DISK = N'D:\test.trn' WITH NOFORMAT, INIT,  NAME = N'test-事務日志  備份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

數據庫還原

右鍵數據庫-還原數據庫-添加需要進行還原的數據庫文件路徑

在還原源選項中你可以選擇‘源數據庫’,‘源設備’。1.選擇源數據庫工具會自動顯示該數據庫之前的一些備份,然后直接選擇需要還原的數據庫備份集。

2.選擇源設備點擊后面的...,添加需要還原的數據庫文件

2.點擊確認還原數據庫

數據庫恢復

數據庫恢復的前提是1.一個完整的數據庫備份2.包含這個完整數據庫備份的事務日志備份3.完整備份之間也可以存在數個差異備份

對於數據庫維護空間始終是一個比較頭疼的問題,特別是對於大型數據庫而言,每天的日志文件增長是龐大的,很多數據庫管理員會定時對數據庫日志文件進行收縮,但是經常收縮會存在收縮完日志文件還是不能減少,這是因為存在很多活動的日志無法收縮可以用

DBCC LOGINFO('
數據庫名稱
')   
 
我們看到
status=0
的日志,代表已經備份到磁盤的日志文件;而
status=2
的日志還沒有備份。當我們收縮日志文件時,收縮掉的空
間其實就是
status=0
的空間,如果日志物理文件無法減小,這里一
定能看到非常多
status=2
的記錄

 

 解決辦法:1.可以分離要收縮的數據庫,然后手動刪除日志文件,然后附加數據庫,數據庫就會產生一個很小的日志文件(不推薦使用這種方法)

2.右鍵要出來的數據庫選擇“屬性”-"選項",將恢復模式改成"簡單",然后利用收縮工具可以講日志文件收縮到很小,收縮完記得講恢復模式改成"完整"

也可以用語句進行處理(dbname是你要進行收縮的數據庫名,dbname_log是你要進行收縮的數據庫的邏輯日志名稱)

USE [master]
    GO
    ALTER DATABASE [dbname] SET RECOVERY SIMPLE WITH NO_WAIT
    GO
    ALTER DATABASE [dbname] SET RECOVERY SIMPLE   --簡單模式
    GO
    USE [dbname]
    GO
    DBCC SHRINKFILE (N'dbname_log' , 11, TRUNCATEONLY)
    GO
    USE [master]
    GO
    ALTER DATABASE [dbname] SET RECOVERY FULL WITH NO_WAIT
    ALTER DATABASE [dbname] SET RECOVERY FULL

對於第一種方法不贊同使用,首先對於數據庫的分離與附加有時候會破壞數據庫,造成數據庫無法還原,還有就是對於在線數據庫也不允許進行分離操作。

對於第二種方法是slq2008收縮日志文件的一種方法,但是此方法也不能使用過於頻繁,因為進行數據庫恢復模式的更改會截斷事務日志文件,這樣的話當時利用事務日志文件進行恢復的時候檢查點不能包含數據庫文件,而且當你要對事務日志進行備份的時候會重新提示你需要對數據庫進行完整備份。

舉個例子:比如你昨天晚上進行了一次完整備份,然后同時你也進行了一次日志備份,然后你每個小時進行過一次差異備份,最近的差異備份時間點是14點,如果此時數據庫錯誤修改了數據,你可以立馬備份一個日志文件將數據庫恢復到日志備份開始到日志備份終點前的任意時間點 。

如果此時你進行了修改數據庫模式,截斷日志進行了收縮,那么你的數據只能恢復到昨天晚上備份的那個日志備份時間前的任意時間點,也就是今天所做的數據庫更改無法再恢復了,因為日志文件已經被截斷了.

因為日志文件的檢查點(lsn)是連續的,每一次日志備份都是在上一次備份的基礎上lsn往后增加的,lsn的范圍也包括了數據庫文件的lsn,也只有日志文件的lsn包括了數據庫文件的lsn,才能將數據庫文件進行回滾。

 

總結

備份還原看似簡單,而且現在的圖形化的工具更加讓人對備份還原的理解不夠深入,特別的日志備份如果你不仔細研究一下會存在很多誤區。

1.完整備份和差異備份的BAK中也會備份日志文件,在備份的時候生成檢查點但是該檢查點只是標識(好比將日志文件進行歸檔,當我們查詢fn_dblog的時候發現日志少了,但實際上日志文件還是存在的,當你這時候備份日志的時候你依然會備份到那部分歸檔掉的日志,但是備份日志的時候生成檢查點checkpoin就會將日志進行截斷,將不活動的那部分日志清空)作用並不截斷日志。

2.當日志進行第一次備份的時候是自最近一次完整備份之后的日志進行備份,當下次再進行日志備份(前提日志未被截斷)的時候是備份上一次日志備份的last_lsn之后到當前備份之間的日志記錄,不管中間是否存在完整或者差異備份都不會減少日志的量,不要誤理解為當上一次備份日志之后中間存在完整備份然后再備份日志備份的日志記錄就是完整備份之后的記錄。

3.第一次的日志備份的first_lsn一定是和日志備份之前的完整備份的first_lsn相同,如果備份集最后一次備份是日志備份那么最后一次日志備份的last_lsn一定包含自第一次完整備份以來所有的完整好差異備份的last_lsn。所有可以通過第一次完整備份和第一個日志備份和最后一個日志備份(中間沒有日志備份)還原數據庫到第一次完整備份之后的任何一個時間點,無論中間是否存在完整差異備份。

4.為什么備份集之間需要完整或者差異備份,如果沒有完整或者差異備份如果自第一次備份以來很長時間沒有進行完整或者差異備份那么當進行故障還原的時候需要耗費很長的時間,當中間如果存在差異備份的時候那么還原日志的時間將大大減少,不需要在執行完整到差異這部分的redo/undo。

5.由於SQLSERVER是日志先寫的機制,所以當數據庫出現故障也是數據出現了故障一般都是進行了寫日志操作但是在寫數據的時候出現了什么問題,所以當進行日志的還原操作的時候會進行這些檢查,保證事務的一致性這也是為什么DBCC CHECKDB檢查數據庫錯誤一般還原是最好的方法,當你將日志進行還原的時候所有的日志備份的操作都會重新進行操作一次。

6.差異備份的原理,差異備份與日志備份不一樣,日志備份是每次的備份都是自上一次備份以來的增量,差異備份是自上一次完整備份以來的增量,所以無論中間有多少次差異備份,都只需要還原完整備份與最后一次差異備份即可。

 

select name,first_lsn,last_lsn,checkpoint_lsn,database_backup_lsn,backup_start_date ,backup_finish_date 
 from msdb..backupset where database_name=N'InsideTSQL2008' 
 
SELECT * FROM [sys].[fn_dblog](NULL,NULL) 

SELECT  *
FROM    fn_dump_dblog(NULL, NULL, N'DISK', 1,N'd:\InsideTSQL2008.bak', DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT)

 

 

 

備注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。

《歡迎交流討論》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM