在SQLServer里怎么進行頁級別的恢復

這篇文章跟大家分析一下“在SQL Server里怎么進行頁級別的恢復”。內容詳細易懂,對“在SQL Server里怎么進行頁級別的恢復”感興趣的朋友可以跟著小編的思路慢慢深入來閱讀一下,希望閱讀后能夠對大家有所幫助。下面跟著小編一起深入學習“在SQL Server里怎么進行頁級別的恢復”的知識吧。

站在用戶的角度思考問題,與客戶深入溝通,找到羅城網站設計與羅城網站推廣的解決方案,憑借多年的經驗,讓設計與互聯網技術結合,創造個性化、用戶體驗好的作品,建站類型包括:網站建設、網站設計、企業官網、英文網站、手機端網站、網站推廣、域名申請網站空間、企業郵箱。業務覆蓋羅城地區。

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

我們來破壞一個頁

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

 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

下一步我進行完整數據庫備份。這就是說這個備份包含了屬于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

在SQL Server里怎么進行頁級別的恢復

在SQL Server里怎么進行頁級別的恢復

為了破壞一個特定的頁,我使用未公開的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,問題數據庫必須設置如代碼所示的單用戶模式(Single-User mode)。這里我模擬了有個存儲錯誤,寫了一些垃圾到存儲的頁里(是的,這個在你工作中也會碰到!)。現在當你從表再次讀取數據庫,SQL Server會返回你一個824 I/O錯誤,因為對損壞頁的校驗失敗了。

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

在SQL Server里怎么進行頁級別的恢復

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

1 SELECT * FROM msdb.dbo.suspect_pages

在SQL Server里怎么進行頁級別的恢復

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

1 -- Now we have additional transaction that we don't want to loose...
2 INSERT INTO Test VALUES (REPLICATE('E', 8000))
3 GO

我們來還原損壞的頁

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

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

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

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

現在到了棘手的部分:在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

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

 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

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

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

在SQL Server里怎么進行頁級別的恢復

關于在SQL Server里怎么進行頁級別的恢復就分享到這里啦,希望上述內容能夠讓大家有所提升。如果想要學習更多知識,請大家多多留意小編的更新。謝謝大家關注一下創新互聯網站!

網頁名稱:在SQLServer里怎么進行頁級別的恢復
當前地址:http://m.kartarina.com/article10/pipsgo.html

成都網站建設公司_創新互聯,為您提供品牌網站制作ChatGPT網站導航移動網站建設網站設計外貿建站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管
主站蜘蛛池模板: 色欲AV无码一区二区三区 | 日韩精品无码一区二区三区免费| 精品无码人妻一区二区三区不卡| 无码日韩人妻av一区免费| 97碰碰碰人妻视频无码| 亚洲成a人片在线观看天堂无码 | 亚洲精品无码不卡在线播放HE| 亚洲啪AV永久无码精品放毛片| 熟妇人妻系列av无码一区二区| 亚洲AV永久无码精品一福利 | 亚洲人成无码网WWW| 国产aⅴ无码专区亚洲av麻豆| 中文有码无码人妻在线| 国产精品亚洲专区无码唯爱网| 久久精品无码专区免费青青| 亚洲一区精品无码| 亚洲午夜无码毛片av久久京东热| 亚洲成AV人片在线播放无码| 中文字幕av无码不卡| 亚洲中文字幕无码av| 秋霞鲁丝片Av无码少妇| 自慰无码一区二区三区| 无码国模国产在线无码精品国产自在久国产 | 中文字幕无码日韩欧毛| 亚洲AV综合色区无码另类小说 | 亚洲精品无码不卡在线播HE| 国产成人无码区免费A∨视频网站| 亚洲熟妇无码一区二区三区 | 成人免费午夜无码视频| 无码精品人妻一区二区三区人妻斩 | 四虎影视无码永久免费| 人妻AV中出无码内射| 波多野结AV衣东京热无码专区| 无码喷水一区二区浪潮AV| 激情无码亚洲一区二区三区| 精品久久久久久久无码久中文字幕 | 亚洲精品无码不卡在线播放HE| 国产免费AV片无码永久免费 | 成年男人裸j照无遮挡无码| 无码免费午夜福利片在线| 亚洲AV无码一区二区三区性色 |