偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

在SQL Server里如何進行頁級別的恢復

開發(fā) 后端
在今天的文章里我想談下每個DBA應該知道的一個重要話題:在SQL Server里如何進行頁級別還原操作。假設在SQL Server里你有一個損壞的頁,你要從最近的數(shù)據(jù)庫備份只還原有問題的頁,而不是還原整個數(shù)據(jù)庫。

在今天的文章里我想談下每個DBA應該知道的一個重要話題:在SQL Server里如何進行頁級別還原操作。假設在SQL Server里你有一個損壞的頁,你要從最近的數(shù)據(jù)庫備份只還原有問題的頁,而不是還原整個數(shù)據(jù)庫。

我們來破壞一個頁

***步我想向你展示下如何建立表(或索引)里有個特定頁損壞的情景,這里我們會進行一些魔術,因為開箱即用(out-of-box)的SQL Server本身不會引入任何損壞的頁(如果有的話,恭喜你找到了一個BUG)。我們從創(chuàng)建一個新的數(shù)據(jù)庫,往新建的表插入一些記錄開始。

 1 USE master
 2 GO
 3 
 4 CREATE DATABASE PageLevelRestores
 5 GO
 6 
 7 USE PageLevelRestores
 8 GO
 9 
10 -- Create a table where every record fits onto 1 page of 8kb
11 CREATE TABLE Test
12 (
13     Filler CHAR(8000)
14 )
15 GO
16 
17 -- Insert 4 records
18 INSERT INTO Test VALUES (REPLICATE('A', 8000))
19 INSERT INTO Test VALUES (REPLICATE('B', 8000))
20 INSERT INTO Test VALUES (REPLICATE('C', 8000))
21 INSERT INTO Test VALUES (REPLICATE('D', 8000))
22 GO
23 
24 -- Retrieve the selected records
25 SELECT * FROM Test
26 GO

下一步我進行完整數(shù)據(jù)庫備份。這就是說這個備份包含了屬于Test表的所有頁。這非常重要,因為接下來我們會破壞這個表的一個特定頁。為了找出屬于Test表的頁,我用DBCC IND命令來返回所有屬于這個表的頁。

1 -- Perform a full database backup
2 BACKUP DATABASE PageLevelRestores TO DISK = N'C:\Backups\PageLevelRestores.bak'
3 GO
4 
5 -- Retrieve the first data page for the specified table (columns PageFID and PagePID)
6 DBCC IND(PageLevelRestores, Test, -1)
7 GO

為了破壞一個特定的頁,我使用未公開的DBCC WRITEPAGE命令。是的,在SQL Server里有個可用的DBCC WRITEPAGE命令,但請不要告訴任何人……

 1 ALTER DATABASE PageLevelRestores SET SINGLE_USER WITH ROLLBACK IMMEDIATE
 2 GO
 3 
 4 -- Let's corrupt page 90...
 5 DBCC WRITEPAGE(PageLevelRestores, 1, 90, 0, 1, 0x41, 1)
 6 DBCC WRITEPAGE(PageLevelRestores, 1, 90, 1, 1, 0x41, 1)
 7 DBCC WRITEPAGE(PageLevelRestores, 1, 90, 2, 1, 0x41, 1)
 8 GO
 9 
10 ALTER DATABASE PageLevelRestores SET MULTI_USER
11 GO

為了使用DBCC WRITEPAGE,問題數(shù)據(jù)庫必須設置如代碼所示的單用戶模式(Single-User mode)。這里我模擬了有個存儲錯誤,寫了一些垃圾到存儲的頁里(是的,這個在你工作中也會碰到?。,F(xiàn)在當你從表再次讀取數(shù)據(jù)庫,SQL Server會返回你一個824 I/O錯誤,因為對損壞頁的校驗失敗了。

1 -- Retrieve the selected records
2 SELECT * FROM Test
3 GO

一旦SQL Server在I/O訪問期間檢測到一個損壞的頁,在msdb.dbo.suspect_pages里,損壞的頁也會被記錄,如下圖所示。

1 SELECT * FROM msdb.dbo.suspect_pages

對msdb里對特定表進行監(jiān)控是個很好的想法,可以得到你的數(shù)據(jù)庫里是否有損壞的頁?,F(xiàn)在我們讓事情變得更糟糕,下列代碼會往表里插入另外一條記錄。

1 -- Now we have additional transaction that we don't want to loose...
2 INSERT INTO Test VALUES (REPLICATE('E', 8000))
3 GO
我們來還原損壞的頁

現(xiàn)在你是DBA,你想恢復這個數(shù)據(jù)庫到正確狀態(tài)且不丟失數(shù)據(jù)(像我們在***一步插入的記錄)。你會怎么做?首先你要進行所謂的尾日志備份(Tail-Log Backup):你要備份自上次事務日志備份后的已發(fā)生的事務。

1 -- Backup the transaction log
2 BACKUP LOG PageLevelRestores TO
3     DISK = 'C:\Backups\PageLevelRestores_LOG1.bak'
4     WITH INIT
5 GO

在這里還沒有進行過事務日志備份,因此我們的備份會包含自完整備份后,所有已執(zhí)行的事務?,F(xiàn)在我們可以在SQL Server里初始頁級別還原操作。這里你使用傳統(tǒng)的RESTORE DATABASE的T-SQL命令,但你只要指定想要還原的頁,不用還原整個數(shù)據(jù)庫,我們只要還原有問題的頁。如果你在處理很大的數(shù)據(jù)庫,這會有很大的區(qū)別。

1 USE master
2 -- Restore full database backup
3 RESTORE DATABASE PageLevelRestores
4     PAGE = '1:90'
5     FROM DISK = 'C:\Backups\PageLevelRestores.bak'
6     WITH NORECOVERY
7 GO

現(xiàn)在到了棘手的部分:在RESTORE DATABASE的T-SQL命令后,你要進行另一個事務日志備份。這個另外的日志備份是需要的,因為接下來你要保證在這個可用頁進行的所有改變用作還原。沒有這個額外的日志備份,SQL Server不能把你的頁重新上線。

1 -- Backup the tail of the log...
2 BACKUP LOG PageLevelRestores TO
3     DISK = 'C:\Backups\PageLevelRestores_LOG_TAIL.bak'
4     WITH INIT
5 GO

進行完這個額外日志備份后,***你可以在正確的順序里恢復所有的日志備份,***你可以把數(shù)據(jù)庫恢復上線。

 1 -- Restore all available log backups in the correct order
 2 RESTORE LOG PageLevelRestores FROM
 3     DISK = 'C:\Backups\PageLevelRestores_LOG1.bak'
 4     WITH NORECOVERY
 5 GO
 6 
 7 -- Finally restore the tail log backup
 8 RESTORE LOG PageLevelRestores FROM
 9     DISK = 'C:\Backups\PageLevelRestores_LOG_TAIL.bak'
10     WITH NORECOVERY
11 GO
12 
13 -- Finally finish with the restore sequence
14 RESTORE DATABASE PageLevelRestores WITH RECOVERY
15 GO

現(xiàn)在當你再次查詢表時,你會看到SELECT語句成功執(zhí)行沒有任何I/O錯誤,在這個表里沒有丟失任何數(shù)據(jù)。還是很簡單,是不是?

1 USE PageLevelRestores
2 GO
3 
4 -- Retrieve the selected records
5 SELECT * FROM Test
6 GO

小結

在SQL Server里如何進行頁級別恢復操作是每個DBA應該知道的。它是你工具箱里最重要的工具之一——尤其當你在處理很大的數(shù)據(jù)庫時。不用恢復整個數(shù)據(jù)庫,你只恢復有問題的頁,整個恢復過程會非??臁?/p>

***給你一個問題,各位看官:你是否有過在SQL Server進行頁級別的恢復,如果是的話——對你來說它有多難/簡單?請暢所欲言!

感謝關注!

責任編輯:李英杰 來源: 博客園
相關推薦

2013-02-21 10:32:29

Win Server 災難恢復虛擬機

2010-07-19 11:10:58

SQL Server

2010-07-19 08:51:58

SQL Server

2010-07-22 16:13:53

2010-07-09 13:01:50

SQL Server

2010-04-20 15:41:38

Oracle sql

2016-04-19 18:20:29

阿里巴巴HBase宕機恢復

2010-07-14 17:37:33

SQL Server

2010-09-24 18:47:23

SQL數(shù)據(jù)分頁

2022-12-01 14:02:02

MySQL數(shù)據(jù)文件

2013-12-02 15:36:31

Windows Ser系統(tǒng)映像還原Windows Ser

2011-08-16 14:08:01

windowslinux

2010-09-17 13:35:30

SQL跨表更新

2010-09-28 14:52:37

SQL表結構

2011-09-15 17:01:25

ubuntu備份

2011-09-19 16:56:14

Vista秘密下載

2019-06-12 08:57:43

Oracle數(shù)據(jù)庫恢復

2011-07-22 15:20:37

Active Dire備份

2011-07-22 15:19:29

Active Dire恢復

2011-07-22 15:23:55

Active Dire備份
點贊
收藏

51CTO技術棧公眾號