一:客户信息
河北某食品集團
二:案例描述
客户向我們反饋公司運行ERP/CRM的一台DELL服務器由於突然斷電,服務器中一台VPS不可用,虛擬磁盤上的數據庫文件丟失。
三:解決方案
案例評估
服務器上4塊硬盤搭建了一個RAID10的磁盤陣列環境,安裝了Citrix XenServer的虛擬化操作系統,虛擬機採用Windows Server操作系統,有系統盤和數據盤兩組,上層部署ERP/CRM系統(SQL Server數據庫)。服務器意外斷電導致虛擬機磁盤丟失,虛擬機不可用,SQL Server數據庫和ERP/CRM程序文件丟失,需要恢復SQL Server數據庫。
恢復方案
1、將出故障的DELL服務器中所有硬盤以只讀方式進行備份,後續的數據恢復分析和數據恢復操作都基於備份的鏡像文件進行,不會對原服務器上的數據做任何操作,保證原服務器的初始狀態,避免對原始數據造成可能的二次破壞。
2、基於鏡像文件對底層數據進行分析,發現故障服務器中丟失的虛擬機磁盤採用LVM結構。進入到“/etc/lvm/backup/”目錄下查詢看是否有損壞的虛擬磁盤信息,如果有就意味着LVM信息尚有保存;如果沒有就意味着虛擬磁盤信息已經被更新,只能通過底層數據查找沒有更新的LVM信息。本案例中金海境科技的工程師從底層數據中查詢到了尚未更新的LVM信息。
3、找到LVM信息就意味着數據沒有丟失。基於LVM信息分析和查找虛擬磁盤的分區數據,但是工程師經過分析後發現了一個非常少見的現象:虛擬磁盤損壞。經過進一步查找和分析後確認該區域的數據確實已經損壞,只能找到一些數據庫碎片,可以通過數據庫碎片重組的手段來恢復數據:根據數據庫結構,將底層找到的數據庫碎片按照本來的順序拼接重組,然後對數據庫進行修復和校檢後即可恢復數據庫。
4、因為數據庫碎片重組的恢復方法相對比較複雜,先嚐試通過數據庫備份來恢復數據庫。因為之前數據庫做過一次備份,數據庫備份文件和ERP/CRM程序文件保存在RAR壓縮包中。正常情況下RAR壓縮包的**個扇區記錄的是文件名,所以可以根據文件名反向查找壓縮包的數據起始位置,把相應的壓縮包底層數據提取出來並重命名。但是在實際的恢復過程中提取出來的壓縮包解壓時報錯。
5、嘗試使用RAR修復工具(設置為“忽略錯誤”)繼續解壓數據,仍然解壓失敗。這種數據恢復方案行不通,只能通過數據庫碎片重組的方案來恢復數據庫數據。
6、在數據庫層面分析數據庫的起始位置,分析出數據庫起始位置後根據每個數據庫碎片的編號和文件號去底層掃描符合這個數據庫碎片的所有數據,最後將所有掃描出來的數據重組為一個MDF文件,通過MDF校驗程序檢測整個MDF文件的完整性,完成後開始提取數據。
7、將服務器內的數據全部提取出來並通過初步驗證,沒有問題後搭建新的數據庫環境,將恢復出來的數據庫表添加上去進行查詢,所有數據查詢正常,本次數據恢復工作完成。
四:案例總結
在SQL Server數據庫管理中,數據庫碎片(Database Fragmentation)指的是數據在存儲介質上的非連續分佈,這通常發生在數據庫的索引結構中。索引碎片化會導致查詢性能下降,因為數據庫系統需要花費更多的時間來查找數據。為了優化性能,需要定期重組(Reorganize)或重建(Rebuild)索引。
1. 理解索引碎片
在SQL Server中,有兩種類型的碎片:
頁級碎片:這是由於數據頁在物理存儲中的非連續排列引起的。可以通過重組索引來減少頁級碎片。
鍵值碎片:這是由於索引鍵值分佈不均勻造成的。重建索引可以顯著減少鍵值碎片。
2. 重組索引
重組索引不會改變索引的結構,只是將現有的數據重新組織到索引結構中,以減少頁級碎片。重組索引可以使用以下SQL命令:
sql
Copy Code
ALTER INDEX [IndexName] ON[TableName] REORGANIZE;
3. 重建索引
重建索引會刪除現有的索引並重新創建它,這通常用於減少鍵值碎片並優化索引的物理存儲結構。重建索引可以使用以下SQL命令:
sql
Copy Code
ALTER INDEX [IndexName] ON[TableName] REBUILD;
4. 選擇何時使用重組與重建
使用重組:如果你的索引已經很大,且頁級碎片較多,但不希望重建索引帶來的性能開銷(因為重建索引需要額外的磁盤空間和時間),你可以選擇重組索引。
使用重建:如果你注意到查詢性能明顯下降,且鍵值分佈不均勻,或者你希望徹底優化索引的結構,那麼應該選擇重建索引。重建索引通常伴隨着更好的性能提升,但代價是重建過程中的性能下降和額外的磁盤空間使用。
當數據發生丟失時,金海境科技研發團隊深入研究各種服務器和系統設計思路,認真對比故障類別,攻克疑難恢復案例,總結成功恢復經驗,擁有成功修復服務器數據庫,虛擬化平台,分佈式存儲等數據中心相關的上萬個疑難案例。