1.差異備份的還原
不備份結尾日志的情況下還原數(shù)據(jù)
創(chuàng)建差異備份的放在我們已經(jīng)在前面一篇博客 SQL Server的備份 中提到了,這里我們不再贅述,下面我們給出差異備份與還原的T-SQL方法,代碼如下:
--
創(chuàng)建備份設備
EXEC
sp_addumpdevice
'
disk
'
,
'
MyAdvWorks_1
'
,
'
d:\backup\MyAdvWorks_1.bak
'
;
EXEC
sp_addumpdevice
'
disk
'
,
'
MyAdvWorks_diff1
'
,
'
d:\backup\MyAdvWorks_diff1.bak
'
;
EXEC
sp_addumpdevice
'
disk
'
,
'
MyAdvWorks_log1
'
,
'
d:\backup\MyAdvWorks_log1.bak
'
;
EXEC
sp_addumpdevice
'
disk
'
,
'
MyAdvWorks_log2
'
,
'
d:\backup\MyAdvWorks_log2.bak
'
;
--
數(shù)據(jù)庫備份階段
--
創(chuàng)建完整備份
BACKUP
DATABASE
MyAdvWorks
TO
MyAdvWorks_1
WITH
INIT;
GO
--
在完整備份之后創(chuàng)建差異備份
BACKUP
DATABASE
MyAdvWorks
TO
MyAdvWorks_diff1
WITH
DIFFERENTIAL;
GO
--
數(shù)據(jù)庫還原階段
--
完整還原
RESTORE
DATABASE
MyAdvWorks
FROM
MyAdvWorks_1
WITH
NORECOVERY;
GO
--
在完整還原之后差異還原
RESTORE
DATABASE
MyAdvWorks
FROM
MyAdvWorks_diff1
WITH
RECOVERY;
GO
在執(zhí)行上述完整還原的時候,SSMS報錯,錯誤內(nèi)容如下:
Msg
3159
,
Level
16
, State
1
, Line
2
The tail
of
the
log
for
the
database
"MyAdvWorks" 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
2
RESTORE
DATABASE
is
terminating abnormally.
這是因為, 對于使用完全恢復模式或大容量日志恢復模式的數(shù)據(jù)庫,在大多數(shù)情況下,您必須在還原數(shù)據(jù)庫前備份日志的結尾。 ? 還原數(shù)據(jù)庫而不首先備份日志的末尾將導致錯誤,除非 RESTORE DATABASE 語句包含 WITH REPLACE 或 WITH STOPAT 子句 ,此子句必須指定數(shù)據(jù)備份的結束時間或在數(shù)據(jù)備份結束之后發(fā)生的事務。 ? 有關結尾日志備份的詳細信息,請參閱 結尾日志備份 (SQL Server) 。RESTORE的語法可以 參考 RESTORE (Transact-SQL) 。為了解決上述錯誤,我們將完整還原的TSQL語句修改如下:
--
完整還原
RESTORE
DATABASE
MyAdvWorks
FROM
MyAdvWorks_1
WITH
REPLACE
,NORECOVERY;
GO
REPLACE 選項的影響
應盡可能避免使用 REPLACE,而且在使用該選項之前必須仔細考慮。 ? 還原一般會防止意外使用一個數(shù)據(jù)庫覆蓋另一個數(shù)據(jù)庫。 ? 如果 RESTORE 語句中指定的數(shù)據(jù)庫已存在于當前服務器上,并且指定的數(shù)據(jù)庫系列 GUID 與備份集中記錄的數(shù)據(jù)庫系列 GUID 不同,則不還原該數(shù)據(jù)庫。 ? 這是一項重要的安全保護措施。
使用 REPLACE 選項后,就會忽略還原時通常執(zhí)行的幾項重要安全檢查。 ? 忽略的檢查如下:
-
還原時使用其他數(shù)據(jù)庫的備份覆蓋現(xiàn)有數(shù)據(jù)庫。
使用 REPLACE 選項后,即使指定的數(shù)據(jù)庫名稱與備份集中記錄的數(shù)據(jù)庫名稱不同,還原也允許您使用備份集中任何一個數(shù)據(jù)庫覆蓋現(xiàn)有數(shù)據(jù)庫。 ? 這會導致一個數(shù)據(jù)庫意外覆蓋另一個數(shù)據(jù)庫。
-
在沒有獲取結尾日志備份并也沒有使用 STOPAT 選項的情況下,使用完整恢復模式或大容量日志恢復模式對數(shù)據(jù)庫進行還原。
使用 REPLACE 選項后,由于沒有備份最近寫入的日志,您會丟失提交的作業(yè)。
-
覆蓋現(xiàn)有文件。
例如,可能會錯誤地覆蓋錯誤類型的文件,如 .xls 文件或非聯(lián)機狀態(tài)的其他數(shù)據(jù)庫正在使用的文件等。 ? 如果覆蓋現(xiàn)有文件,則即使所還原的數(shù)據(jù)庫是完整的,也有可能丟失某些數(shù)據(jù)。
RECOVERY 和 NORECOVERY 的比較
仔細觀察上述完整還原和差異還原的TSQL語句,我們可以看到在 完整還原 階段,使用了 WITH NORECOVERY ,而 差異還原 ,則是使用了 RECOVERY 。
- NORECOVERY 指定 不發(fā)生回滾 。 ? 從而使 前滾 按順序在下一條語句中繼續(xù)進行。 在這種情況下,還原順序可還原其他備份,并執(zhí)行前滾。
- RECOVERY(默認值)表示,應在完成當前備份前滾之后執(zhí)行回滾。 恢復數(shù)據(jù)庫要求要還原的整個數(shù)據(jù)集(“前滾集”)必須與數(shù)據(jù)庫 一致 。 ? 如果前滾集尚未前滾到與數(shù)據(jù)庫保持一致的地步,并且指定了 RECOVERY,則數(shù)據(jù)庫引擎將發(fā)出錯誤。
- 因此RESTORE...WITH RECOVERY狀態(tài)就表明此時數(shù)據(jù)庫已經(jīng)處于 一致性 狀態(tài)了。一般都是數(shù)據(jù)庫還原的最后一步才會使用RESTORE...WITH RECOVERY,其他時候都是使用RESTORE...WITH NORECOVERY。
前滾與回滾的區(qū)別 ?
前滾和回滾是 SQL Server中的兩個事務操作。
- 前滾用于恢復之前的操作。
比如:執(zhí)行一個刪除一條記錄的命令,剛剛把該操作的日志寫完(即在日志中已經(jīng)commit),并準備執(zhí)行刪除操作時,但是此時停電了,因此這條記錄的刪除工作沒有完成。在下次啟動SQL Server時,數(shù)據(jù)庫會讀取日志最近的一個檢查點(checkpoint),然后重做所有已經(jīng)commit的事務,這就包括之前刪除記錄的操作。
- 回滾用于撤銷之前的操作。
比如:我要執(zhí)行一個銀行轉賬的事務,從賬戶A中轉出1000元到賬戶B中,在我執(zhí)行完A-1000的時候,數(shù)據(jù)庫down掉了,此時整個事務還沒有執(zhí)行完,因此事uncommitted的。所以在下次啟動SQL Server的時候,數(shù)據(jù)庫會讀取日志最近的一個檢查點(checkpoint),回滾所有那些uncommitted的事務。比如在這里會撤銷A-1000的操作,也就是會往A賬戶中加回去1000元。?
2.事務日志的還原
--
開始:實驗2:事務日志備份與---------------------------------------------
--
創(chuàng)建備份設備
EXEC
sp_addumpdevice
'
disk
'
,
'
MyAdvWorks_1
'
,
'
d:\backup\MyAdvWorks_1.bak
'
;
EXEC
sp_addumpdevice
'
disk
'
,
'
MyAdvWorks_diff1
'
,
'
d:\backup\MyAdvWorks_diff1.bak
'
;
EXEC
sp_addumpdevice
'
disk
'
,
'
MyAdvWorks_log1
'
,
'
d:\backup\MyAdvWorks_log1.bak
'
;
EXEC
sp_addumpdevice
'
disk
'
,
'
MyAdvWorks_log2
'
,
'
d:\backup\MyAdvWorks_log2.bak
'
;
--
數(shù)據(jù)庫備份階段
--
創(chuàng)建完整備份
BACKUP
DATABASE
MyAdvWorks
TO
MyAdvWorks_1
WITH
INIT;
GO
--
在完整備份之后創(chuàng)建差異備份
BACKUP
DATABASE
MyAdvWorks
TO
MyAdvWorks_diff1
WITH
DIFFERENTIAL;
GO
--
事務日志備份
BACKUP
LOG
MyAdvWorks
TO
MyAdvWorks_log1;
GO
--
數(shù)據(jù)庫還原階段----------
--
結尾日志備份,結尾日志備份在還原階段,在restore之前先進行結尾日志備份
use
master
BACKUP
LOG
MyAdvWorks
TO
MyAdvWorks_log2
WITH
INIT,
NORECOVERY;
GO
--
完整還原
RESTORE
DATABASE
MyAdvWorks
FROM
MyAdvWorks_1
WITH
NORECOVERY;
GO
--
差異還原
RESTORE
DATABASE
MyAdvWorks
FROM
MyAdvWorks_diff1
WITH
NORECOVERY;
GO
--
事務日志還原
RESTORE
LOG
MyAdvWorks
FROM
MyAdvWorks_log1
WITH
NORECOVERY;
GO
--
結尾日志還原
RESTORE
LOG
MyAdvWorks
FROM
MyAdvWorks_log2
WITH
RECOVERY;
GO
--
結束:實驗2---------------------------------------------
3.備份到一個邏輯設備中
觀察上面的備份我們可以發(fā)現(xiàn),我們創(chuàng)建了四個邏輯備份設備,分別用戶存儲完整備份,差異備份,事務日志備份和結尾日志備份。然后恢復的時候也是指定到這四個不同的備份設備,但是當我們只創(chuàng)建一個備份設備,并且備份到同樣一個備份設備的時候。備份工作可以完成,還原工作就不能完成了。比如如何區(qū)分差異還原和完全還原,如何區(qū)分事務日志還原和結尾日志還原。因此無法通過TSQL進行精確還原。
但是使用SSMS的話,我們可以在一個邏輯設備,并且進行精確還原。
解決問題(PS:2012-7-9)
今天在使用restore stopat的時候看到了restore中有file關鍵字,并且在備份的時候在message中看到了file 1等字段,所以我就想這個file是不是就是備份集呢?后來驗證是的,因此也就找到了使用一個邏輯設備進行備份還原的方法。代碼示例如下
--
開始:實驗2:事務日志備份與---------------------------------------------
--
創(chuàng)建備份設備
EXEC
sp_addumpdevice
'
disk
'
,
'
MyAdvWorks_1
'
,
'
d:\backup\MyAdvWorks_1.bak
'
;
--
數(shù)據(jù)庫備份階段
--
創(chuàng)建完整備份
BACKUP
DATABASE
MyAdvWorks
TO
MyAdvWorks_1
WITH
INIT;
GO
/*
Processed 280 pages for database 'MyAdvWorks', file 'MyAdvWorks' on file 1.
Processed 2 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 1.
BACKUP DATABASE successfully processed 282 pages in 0.257 seconds (8.568 MB/sec).
*/
--
在完整備份之后創(chuàng)建差異備份
BACKUP
DATABASE
MyAdvWorks
TO
MyAdvWorks_1
WITH
DIFFERENTIAL;
GO
/*
Processed 40 pages for database 'MyAdvWorks', file 'MyAdvWorks' on file 2.
Processed 1 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 2.
BACKUP DATABASE WITH DIFFERENTIAL successfully processed 41 pages in 0.108 seconds (2.965 MB/sec).
*/
--
事務日志備份
BACKUP
LOG
MyAdvWorks
TO
MyAdvWorks_1;
GO
/*
Processed 4 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 3.
BACKUP LOG successfully processed 4 pages in 0.078 seconds (0.338 MB/sec).
*/
--
數(shù)據(jù)庫還原階段----------
--
結尾日志備份,結尾日志備份在還原階段,在restore之前先進行結尾日志備份
BACKUP
LOG
MyAdvWorks
TO
MyAdvWorks_1
WITH
NORECOVERY;
GO
/*
Processed 1 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 4.
BACKUP LOG successfully processed 1 pages in 0.059 seconds (0.041 MB/sec).
*/
--
完整還原
RESTORE
DATABASE
MyAdvWorks
FROM
MyAdvWorks_1
WITH
FILE
=
1
,
NORECOVERY;
GO
/*
Processed 280 pages for database 'MyAdvWorks', file 'MyAdvWorks' on file 1.
Processed 2 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 1.
RESTORE DATABASE successfully processed 282 pages in 0.363 seconds (6.066 MB/sec).
*/
--
差異還原
RESTORE
DATABASE
MyAdvWorks
FROM
MyAdvWorks_1
WITH
FILE
=
2
,
NORECOVERY;
GO
/*
Processed 40 pages for database 'MyAdvWorks', file 'MyAdvWorks' on file 2.
Processed 1 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 2.
RESTORE DATABASE successfully processed 41 pages in 0.129 seconds (2.483 MB/sec).
*/
--
事務日志還原
RESTORE
LOG
MyAdvWorks
FROM
MyAdvWorks_1
WITH
FILE
=
3
,
NORECOVERY;
GO
/*
Processed 0 pages for database 'MyAdvWorks', file 'MyAdvWorks' on file 3.
Processed 4 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 3.
RESTORE LOG successfully processed 4 pages in 0.044 seconds (0.599 MB/sec).
*/
--
結尾日志還原
RESTORE
LOG
MyAdvWorks
FROM
MyAdvWorks_1
WITH
FILE
=
4
,
RECOVERY;
GO
/*
Processed 0 pages for database 'MyAdvWorks', file 'MyAdvWorks' on file 4.
Processed 1 pages for database 'MyAdvWorks', file 'MyAdvWorks_log' on file 4.
RESTORE LOG successfully processed 1 pages in 0.019 seconds (0.128 MB/sec).
*/
--
結束:實驗2---------------------------------------------
在備份的時候,message中顯示文件被備份到了哪一個file中,所以在restore的時候,指定file序號就可以執(zhí)行還原了。
?
?
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

