真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

在SQLServer里怎么進(jìn)行頁(yè)級(jí)別的恢復(fù)

這篇文章跟大家分析一下“在SQL Server里怎么進(jìn)行頁(yè)級(jí)別的恢復(fù)”。內(nèi)容詳細(xì)易懂,對(duì)“在SQL Server里怎么進(jìn)行頁(yè)級(jí)別的恢復(fù)”感興趣的朋友可以跟著小編的思路慢慢深入來(lái)閱讀一下,希望閱讀后能夠?qū)Υ蠹矣兴鶐椭?。下面跟著小編一起深入學(xué)習(xí)“在SQL Server里怎么進(jìn)行頁(yè)級(jí)別的恢復(fù)”的知識(shí)吧。

站在用戶的角度思考問題,與客戶深入溝通,找到羅城網(wǎng)站設(shè)計(jì)與羅城網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋羅城地區(qū)。

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

我們來(lái)破壞一個(gè)頁(yè)

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

 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

下一步我進(jìn)行完整數(shù)據(jù)庫(kù)備份。這就是說(shuō)這個(gè)備份包含了屬于Test表的所有頁(yè)。這非常重要,因?yàn)榻酉聛?lái)我們會(huì)破壞這個(gè)表的一個(gè)特定頁(yè)。為了找出屬于Test表的頁(yè),我用DBCC IND命令來(lái)返回所有屬于這個(gè)表的頁(yè)。

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里怎么進(jìn)行頁(yè)級(jí)別的恢復(fù)

在SQL Server里怎么進(jìn)行頁(yè)級(jí)別的恢復(fù)

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

 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ù)庫(kù)必須設(shè)置如代碼所示的單用戶模式(Single-User mode)。這里我模擬了有個(gè)存儲(chǔ)錯(cuò)誤,寫了一些垃圾到存儲(chǔ)的頁(yè)里(是的,這個(gè)在你工作中也會(huì)碰到?。,F(xiàn)在當(dāng)你從表再次讀取數(shù)據(jù)庫(kù),SQL Server會(huì)返回你一個(gè)824 I/O錯(cuò)誤,因?yàn)閷?duì)損壞頁(yè)的校驗(yàn)失敗了。

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

在SQL Server里怎么進(jìn)行頁(yè)級(jí)別的恢復(fù)

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

1 SELECT * FROM msdb.dbo.suspect_pages

在SQL Server里怎么進(jìn)行頁(yè)級(jí)別的恢復(fù)

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

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

我們來(lái)還原損壞的頁(yè)

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

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

在這里還沒有進(jìn)行過(guò)事務(wù)日志備份,因此我們的備份會(huì)包含自完整備份后,所有已執(zhí)行的事務(wù)?,F(xiàn)在我們可以在SQL Server里初始頁(yè)級(jí)別還原操作。這里你使用傳統(tǒng)的RESTORE DATABASE的T-SQL命令,但你只要指定想要還原的頁(yè),不用還原整個(gè)數(shù)據(jù)庫(kù),我們只要還原有問題的頁(yè)。如果你在處理很大的數(shù)據(jù)庫(kù),這會(huì)有很大的區(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命令后,你要進(jìn)行另一個(gè)事務(wù)日志備份。這個(gè)另外的日志備份是需要的,因?yàn)榻酉聛?lái)你要保證在這個(gè)可用頁(yè)進(jìn)行的所有改變用作還原。沒有這個(gè)額外的日志備份,SQL Server不能把你的頁(yè)重新上線。

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

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

 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)在當(dāng)你再次查詢表時(shí),你會(huì)看到SELECT語(yǔ)句成功執(zhí)行沒有任何I/O錯(cuò)誤,在這個(gè)表里沒有丟失任何數(shù)據(jù)。還是很簡(jiǎn)單,是不是?

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

在SQL Server里怎么進(jìn)行頁(yè)級(jí)別的恢復(fù)

關(guān)于在SQL Server里怎么進(jìn)行頁(yè)級(jí)別的恢復(fù)就分享到這里啦,希望上述內(nèi)容能夠讓大家有所提升。如果想要學(xué)習(xí)更多知識(shí),請(qǐng)大家多多留意小編的更新。謝謝大家關(guān)注一下創(chuàng)新互聯(lián)網(wǎng)站!


標(biāo)題名稱:在SQLServer里怎么進(jìn)行頁(yè)級(jí)別的恢復(fù)
分享網(wǎng)址:http://weahome.cn/article/pipsgo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部