SQL Server的備份有三種形式:
網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、微信小程序、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了廣宗免費建站歡迎大家使用!
一是全備份(full backup)
這個備份里面包含的內(nèi)容是值得商榷的,我們知道數(shù)據(jù)庫有兩種文件,數(shù)據(jù)文件與日志文件,全備份是不是將所有的數(shù)據(jù)文件與日志文件打包,備份成一個文件? 那么還原的時候是不是需要做恢復,將備份過后發(fā)生的事務接著備份時間點重新執(zhí)行一邊? 上面的問題細想都是肯定的。全備份做的事情,就是將所有的緩存先flush到磁盤上,不管在進行的事務是否提交,這樣保證了日志的連續(xù)性,數(shù)據(jù)與日志的一致性,如果事務沒提交 ,在日志文件上的標記是active的,這段日志也就不會被清空,下次恢復的時候,就從這段日志開始,接著使用新的日志執(zhí)行。因此 全備份之前肯定會執(zhí)行一次checkpoint;、
二是差異備份(differential backup)
這個備份會不會也重復full backup的過程,先執(zhí)行checkpoint,然后再將上一次備份之后,發(fā)生數(shù)據(jù)頁變化的這些數(shù)據(jù)頁都備份起來,這部分備份就不會有日志。但是和全備份一樣,備份的容積體量比較大,差異備份備份的是數(shù)據(jù)頁,不管這一頁是不是只有一條數(shù)據(jù)更改了,還是全部更改了;
三是日志備份(transaction log backup)
日志備份中需要注意的就是對未提交事務的理解,沒有提交的事務其實還是占用日志文件的VLF,shrink并不能回收日志空間;提交事務的日志如被備份之后,就會將日志VLF打上unactive或者truncated標記,這個時候執(zhí)行shrink就可以回收這部分日志VLF了。日志備份體量小,比較適合頻率高的執(zhí)行,比如每5分鐘執(zhí)行一次。
全備份:
全備份用到的命令,涉及到兩方面的參數(shù),一是指定相應的備份設備,可以是磁盤,也可以是磁帶;另一方面 就是備份可用的選項,比如是否壓縮,是否加密。
BACKUP DATABASE database
TO backup_device [ ,...n ]
[ WITH with_options [ ,...o ] ] ;
備份設備很講究,可以事先定義好邏輯設備,也可以直接指定物理設備。磁帶備份機倒是沒見過,但是常規(guī)的磁盤備份還是可以討論一下的:
我們可以將一個本機帶路徑的物理文件名指定為備份設備:
backup database lenistest
to ?disk = 'E:\Data_BU\lenistest5__backup.bck';
也可以將網(wǎng)絡上的一個帶路徑的物理文件名指定為備份設備:
backup database AdventureWorks2012
to ?disk = '\\BackupSystem\BackupDisk1\AW_backups\AdventureWorksData.Bak';
這里有個有趣的現(xiàn)象,如果我們在全備份之后 ,沒有備份好日志,這個時候故障突然發(fā)生了,我們需要作恢復,但是恢復的時候因為會重寫日志,這樣就會丟失數(shù)據(jù),如果不采取額外地措施,系統(tǒng)是會報錯的:
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup.bck'
Msg 3159, Level 16, State 1, Line 6
The tail of the log for the database “l(fā)enistest” has not been backed?
up. Use BACKUP LOG WITH NORECOVERY to backup the log if it contains?
work you do not want to lose. Use the WITH REPLACE or WITH STOPAT?
clause of the RESTORE statement to just overwrite the contents of the?
log.
Msg 3013, Level 16, State 1, Line 6
RESTORE DATABASE is terminating abnormally.
所以如果對丟失的數(shù)據(jù)不關心或者認為不會丟失數(shù)據(jù),可以采用with replace選項來重寫原來的日志文件進行強制恢復。
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup.bck'
with replace;
差異備份:
差異備份相對全備份,優(yōu)越的地方在于備份數(shù)據(jù)量少,但是有趣的是差異備份不能獨立存在(日志備份也不能獨立存在,他倆只能依附于全備份,也就是說在執(zhí)行差異備份和日志備份的時候,必須先有一個全備份做好在那里), 差異備份必須以一個全備份做基準,在這基礎之上再判斷哪些數(shù)據(jù)頁是有過更新的,這些更新的數(shù)據(jù)頁計算出來并被備份起來。
use master;
go
backup database lenistest
to ?disk = 'E:\Data_BU\lenistest5__backup.bck';
backup database lenistest
to ?disk = 'E:\Data_BU\lenistest5__backup.bck'
with differential;
假如我們沒有事先做好全備份,就直接作差異備份了,那么這是不成功的:
backup database lenistest
to ?disk = 'E:\Data_BU\lenistest5__backup2.bck'
with differential;
Msg 3035, Level 16, State 1, Line 11
Cannot perform a differential backup for database “l(fā)enistest”, because?
a current database backup does not exist. Perform a full database?
backup by reissuing BACKUP DATABASE, omitting the WITH DIFFERENTIAL?
option.
Msg 3013, Level 16, State 1, Line 11
BACKUP DATABASE is terminating abnormally.
日志備份:
日志備份相對差異備份來說,體量更小,同樣它也需要全備份事先存在:
backup log lenistestto disk = 'E:\Data_BU\lenistest5__backup.bck';
假如我沒有事先做好全備份,我們看看直接備份日志會出現(xiàn)什么結(jié)果:
Msg 4214, Level 16, State 1, Line 15
BACKUP LOG cannot be performed because there is no current database?
backup.
Msg 3013, Level 16, State 1, Line 15
BACKUP LOG is terminating abnormally.
提示先做全備份!
備份我們都討論完了,接下來我們看看還原。還原通常有兩個步驟,一是還原,二是恢復。當然我們也可以直接還原不恢復,但是可能會丟失數(shù)據(jù),除非全備份之后 ,沒有任何操作。假設我們一天一個全備份,每15分鐘做一個差異備份 ,每5分鐘做一個日志備份,我們該如何還原我們的數(shù)據(jù)庫呢?
通常我們首先要知道我們的備份文件名或者物理路徑,這個地方涉及到很多術(shù)語很難理解,比如說backup device, backupset, backup media, media set ,media family.
MSDN上有一個解釋,先看這個腳本:
backup database AdventureWorks2012
to ?tape = '\\.\tape0'
, tape = '\\.\tape1'
, tape = '\\.\tape2'
with format
, medianame = 'MyAdvWorks_MediaSet_1';
解釋說到,這個備份操作產(chǎn)生了一個 media set, 這個media set就是命名為MyAdvWorks_MediaSet_1, 這個media set還有個media header, media header一旦生成,就可以往里面寫入備份文件了。這段腳本也同時生成了一個橫跨三個tape的備份文件, 他們統(tǒng)稱為backup set.
當我們指定3個backup device作為backup set(備份集)并且執(zhí)行第一次全備份的時候,接下來所有的備份都需要同時指定這3個backup device作為backup set:
backup database lenistest
to ?disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
with format
, medianame = 'lenistestbackupset';
backup database lenistest
to ?disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
with noinit
, differential
, medianame = 'lenistestbackupset';
Msg 3231, Level 16, State 1, Line 10
The media loaded on “E:\Data_BU\lenistest5__backup01.bck” is formatted?
to support 3 media families, but 2 media families are expected?
according to the backup device specification.
Msg 3013, Level 16, State 1, Line 10
BACKUP DATABASE is terminating abnormally.
上面我先作了一次全備份,指定了三個backup device作為一份backup set, 接下來作差異備份的時候,我只指定了其中兩個backup device作為backup set, 操作失敗,提示就是少了一個backup device.
backup database lenistest
to ?disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
with noinit
, differential
, medianame = 'lenistestbackupset';
這次我們指定了同樣個數(shù)的backup device,但backup device的順序顛倒了一下,操作成功。
到目前為止,我們的腳本已經(jīng)新建了 1 個media set,名為 lenistestbackupset , 2 個backup set, 第一個backup set是全備份的backup set,另外一個backup set是差異備份。所以每一次備份都會產(chǎn)生一個backup set. Media set產(chǎn)生的時間則是第一次給數(shù)據(jù)庫作全備份的時候。
這個時候我們需要恢復數(shù)據(jù)庫,那么第一步就是要先還原全備份,但是先不恢復,等全備份還原過后,再用差異備份做恢復:
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
with file = 1
, replace
, norecovery;
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
with file = 2
, recovery;
這里一定是用replace來重寫日志。
select mf.media_set_id
, isnull(ms.name, 'no media name') as media_name
, mf.physical_device_name
, mf.family_sequence_number
, mf.media_family_id
, bs.database_name
, bs.backup_start_date
, bs.backup_finish_date
from backupmediafamily ? ? ? mf
inner join backupset ? ? bs
? on mf.media_set_id = bs.media_set_id
left join backupmediaset ms
? on bs.media_set_id = ms.media_set_id
where bs.database_name = 'lenistest';
上面的腳本可以抓出來這些media family, media set, backup set的信息,如果像上面的例子一樣, 我們用3個backup device來承載備份,那么這3個backup device組成了一個media family, 按照family_sequence_number來編排,1,2,3。
下面實現(xiàn)一個備份到恢復的全過程例子,分別在full backup, differential backup, log backup之前各出入同樣的數(shù)據(jù),看看是不是還原的時候,能正確還原過來:
insert into dbo.dataloading
(
object_id
, object_name
)
select object_id
, name as object_name
from sys.objects;
backup database lenistest
to ?disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
with format
, medianame = 'lenistestbackupset';
insert into dbo.dataloading
(
object_id
, object_name
)
select object_id
, name as object_name
from sys.objects;
backup database lenistest
to ?disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
with noinit
, differential
, medianame = 'lenistestbackupset';
insert into dbo.dataloading
(
object_id
, object_name
)
select object_id
, name as object_name
from sys.objects;
backup log lenistest
to ?disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
with noinit
, medianame = 'lenistestbackupset';
接著我們做還原與恢復:
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup01.bck', disk = 'E:\Data_BU\lenistest5__backup03.bck', disk = 'E:\Data_BU\lenistest5__backup02.bck'
with file = 1
, replace
, norecovery;
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup01.bck', disk = 'E:\Data_BU\lenistest5__backup03.bck', disk = 'E:\Data_BU\lenistest5__backup02.bck'
with file = 2
, norecovery;
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup01.bck', disk = 'E:\Data_BU\lenistest5__backup03.bck', disk = 'E:\Data_BU\lenistest5__backup02.bck'
with file = 3
, recovery;
這里的file選項就是backup set選項,表示第一個備份集,第二個備份集,第三個備份集。如果想還原到最新的故障發(fā)生時間點,前面的restore都不能recovery,只有在最后的時候才能作recovery.
如果我們只想恢復全備份的數(shù)據(jù),只要執(zhí)行recovery就可以了,但是數(shù)據(jù)肯定是少了:
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup01.bck', disk = 'E:\Data_BU\lenistest5__backup03.bck', disk = 'E:\Data_BU\lenistest5__backup02.bck'
with file = 1
, replace
, recovery;
SQL
Server在msdb數(shù)據(jù)中維護了一系列表,用來存儲執(zhí)行所有備份和還原的細節(jié)信息。即使你正在使用第三方的備份應用程序,只要這個應用程序使用SQL
Server的虛擬設備接口(Virtual
Device
Interface---VDI)來執(zhí)行備份和還原執(zhí)行,那么執(zhí)行細節(jié)依然被存儲在這一系列表中。
存儲細節(jié)的表包括:
backupset
backupfile
backupfilegroup
(SQL
Server
2005
upwards)
backupmediaset
backupmediafamily
restorehistory
restorefile
restorefilegroup
logmarkhistory
suspect_pages
(SQL
Server
2005
upwards)
你可以在Books
Online里面找到上面這些表的具體說明。
下面這個腳本可以幫你找出每個數(shù)據(jù)庫近期的備份信息:
SELECT
b.name,
a.type,
MAX(a.backup_finish_date)
lastbackup
FROM
msdb..backupset
a
INNER
JOIN
master..sysdatabases
b
ON
a.database_name
COLLATE
DATABASE_DEFAULT
=
b.name
COLLATE
DATABASE_DEFAULT
GROUP
BY
b.name,
a.type
ORDER
BY
b.name,
a.type
指定數(shù)據(jù)庫最后20條事務日志備份信息:
SELECT
TOP
20
b.physical_device_name,
a.backup_start_date,
a.first_lsn,
a.user_name
FROM
msdb..backupset
a
INNER
JOIN
msdb..backupmediafamily
b
ON
a.media_set_id
=
b.media_set_id
WHERE
a.type
=
'L'
ORDER
BY
a.backup_finish_date
DESC
指定時間段的事務日志備份信息:
SELECT
b.physical_device_name,
a.backup_set_id,
b.family_sequence_number,
a.position,
a.backup_start_date,
a.backup_finish_date
FROM
msdb..backupset
a
INNER
JOIN
msdb..backupmediafamily
b
ON
a.media_set_id
=
b.media_set_id
WHERE
a.database_name
=
'AdventureWorks'
AND
a.type
=
'L'
AND
a.backup_start_date
'10-Jan-2007'
AND
a.backup_finish_date
'16-Jan-2009
3:30'
ORDER
BY
a.backup_start_date,
b.family_sequence_number
刪除備份日志的兩個存儲過程:
EXEC
msdb..sp_delete_backuphistory
'1-Jan-2005'
EXEC
msdb..sp_delete_database_backuphistory
'AdventureWorks'
在電腦開始菜單中選擇“SQL Server Management Studio”雙擊。在出現(xiàn)的界面中點擊“連接”按鈕。2 在出現(xiàn)的“ Microsoft SQL Server Management Studio”界面中選擇“管理”下的“維護計劃”右擊維護計劃,點擊“維護計劃向?qū)А保? 在出現(xiàn)的“SQL Server維護計劃向?qū)А苯缑嬷悬c擊“下一步”在出現(xiàn)的界面中把名稱和說明寫上。然后點擊“更改”設頂備份計劃在出現(xiàn)的“作業(yè)計劃屬性”界面中,更改執(zhí)行時間,也就是多久備份一次。這里該為每天備份。間隔時間更改為“1”更改執(zhí)行一次時間為0:00:00也就是在每天的0點自動備份數(shù)據(jù)。更改好以后,就可以在下面看到“在每天的 0:00:00 執(zhí)行。將從 2014-5-16 開始使用計劃?!比缓簏c擊“下一步”按鈕在選擇維護任務界面中選擇要備份的數(shù)據(jù)庫文件。然后點擊下一步。在選擇維護任務順序中,可以移動要備份的數(shù)據(jù)庫文件的順序。然后點擊“下一步”在定義“備份數(shù)據(jù)庫完整”界面中,選擇數(shù)據(jù)庫后面下拉菜單中的數(shù)據(jù)庫文件。然后點擊“確定”按鈕在定義“備份數(shù)據(jù)庫完整”界面里選擇備份路徑。然后點擊“下一步”在“選擇報告選項”界面中設置好“報告文本文件”的路徑。然后點擊“下一步”在出現(xiàn)的“完成該向?qū)А苯缑嬷袝吹皆O置備份的詳細信息。這樣數(shù)據(jù)庫自動備份就成功了。
1、首先我們打開數(shù)據(jù)庫進入數(shù)據(jù)庫。
2、然后我們輸入賬號和密碼,點擊鏈接即可進入數(shù)據(jù)庫中。
3、然后我們在左側(cè)樹里找到要改的數(shù)據(jù)庫。
4、然后我們即可找到我們要查看的所有的表。
5、然后我們右鍵點擊設計。
6、然后我們可以查看到數(shù)據(jù)庫表單。
第一步打開sql server數(shù)據(jù)庫,選擇要備份的數(shù)據(jù)庫,鼠標右鍵選擇任務-備份,如下圖所示:
請點擊輸入圖片描述
第二步進去備份數(shù)據(jù)庫界面之后,備份完整的數(shù)據(jù)庫,然后看到備份數(shù)據(jù)庫的默認路徑,如下圖所示:
請點擊輸入圖片描述
第三步點擊添加,可以修改備份的數(shù)據(jù)庫路徑,如下圖所示:
請點擊輸入圖片描述
第四步這里選擇默認路徑備份數(shù)據(jù)庫,點擊確定,可以看到已經(jīng)成功備份數(shù)據(jù)庫了,如下圖所示:
請點擊輸入圖片描述
第五步我們在默認路徑C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\下,可以看到數(shù)據(jù)庫備份文件,如下圖所示:
請點擊輸入圖片描述