我可以從相同版本的 SQL 伺服器恢復具有不同更新的數據庫嗎?
主伺服器(我備份數據庫的那個)是:
Microsoft SQL Server 2014 - 12.0.4100.1 (X64)
Apr 20 2015 17:29:27 版權所有 (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.3 (Build 9600 :)
(Hypervisor)
我正在嘗試恢復此伺服器中的數據庫:
Microsoft SQL Server 2014 (RTM-CU14) (KB3158271) - 12.0.2569.0 (X64) 2016 年 5 月 27 日 15:06:08 版權所有 (c) Microsoft Corporation Enterprise Edition:Windows NT 6.3 上基於核心的許可(64 位)(建構 10586:)
但恢復永遠不會完成。使用
SP_WHOISACTIVE
complete_percentage 為空(例如,10 分鐘)。在我自己的機器上,我可以恢復數據庫,這是我的伺服器:
Microsoft SQL Server 2014 (SP1-CU7) (KB3162659) - 12.0.4459.0 (X64) 2016 年 5 月 27 日 15:33:17 版權所有 (c) Microsoft Corporation Enterprise Edition:Windows NT 6.3 上基於核心的許可(64 位)(內部版本 10586:)(管理程序)
什麼會導致這個問題?數據庫為 140GB。有需要驗證的地方嗎?
隨
verifyonly
文件有效。我正在使用 T-SQL 進行還原:
restore database Database from disk ='F:\Database.BKP' with move 'Database' to 'path\database.mdf', move 'Database2' to 'path\database.ndf', move 'Database3' to 'path\database_FULLTEXT', move 'Databaselog' to 'path\database_log',stats=1
我注意到的一件事是等待類型
Async_io_
有沒有辦法驗證磁碟是否有問題,但通過 SQL SERVER?
哦,當我暫停腳本時,我收到了這條消息:
消息 3122,級別 16,狀態 1,行 4 文件初始化失敗。
RESTORE 無法繼續。消息 3204,第 16 級,狀態 1,第 4 行
備份或恢復被中止。消息 3013,第 16 級,狀態 1,第 4 行
RESTORE DATABASE 異常終止。查詢被取消
使用者。
但恢復永遠不會完成。使用 SP_WHOISACTIVE 的 complete_percentage 為空(例如,10 分鐘)。
10 分鐘的時間幾乎不足以有資格使用“從不”這個詞!
什麼會導致這個問題?數據庫為 140GB。
如果您沒有打開即時文件初始化(請參閱此處和此處以及其他地方),那麼它將嘗試將 140Gb+ 的磁碟空間歸零以準備恢復數據 - 這可能需要十分鐘以上的時間$$ * $$並且在該過程的那部分過程中,完成的百分比將不計算在內(這僅在頁面從備份文件恢復到數據文件時才計算在內,而不是在創建數據文件時計算在內)。
$$ * $$: ~10 分鐘內 ~14Gb 大約是 240MByte/秒 - 您的 I/O 子系統能以多快的速度寫入以及同時進行哪些其他活動?
要回答標題中的問題:
我可以從相同版本的 SQL 伺服器恢復具有不同更新的數據庫嗎?
是的,您應該能夠,即使不同的更新是服務包,但我通常建議您只在可能的情況下向上恢復以防萬一。
您可以使用以下腳本檢查恢復剩餘時間,也許這可以告訴您恢復需要多長時間:
select session_id, convert(nvarchar(22),db_name(database_id)) as [database], case command when 'BACKUP DATABASE' then 'DB' when 'RESTORE DATABASE' then 'DB RESTORE' when 'RESTORE VERIFYON' then 'VERIFYING' when 'RESTORE HEADERON' then 'VERIFYING HEADER' else 'LOG' end as [type], start_time as [started], dateadd(mi,estimated_completion_time/60000,getdate()) as [finishing], datediff(mi, start_time, (dateadd(mi,estimated_completion_time/60000,getdate()))) - wait_time/60000 as [mins left], datediff(mi, start_time, (dateadd(mi,estimated_completion_time/60000,getdate()))) as [total wait mins (est)], convert(varchar(5),cast((percent_complete) as decimal (4,1))) as [% complete], getdate() as [current time] from sys.dm_exec_requests where command in ('BACKUP DATABASE','BACKUP LOG','RESTORE DATABASE','RESTORE VERIFYON','RESTORE HEADERON')