close

---底下只適用於SQL Server---

Subject : 資料庫實體檔案毀損

今天快下班的時候, 同事接到了一則求救電話, 有個資料庫掛點了, AP在大量insert資料時, 突然出現一堆錯誤訊息, 不過幸好只是開發用的資料庫, 因為同事晚上要趕去上課, 所以就先放著不管, 問我要不要先玩玩看, 這當然激起我的好奇心

先查看了一下相關的錯誤訊息, 上google大神查了一下, 看起來好像是存放資料的實體檔案已經掛了, 大概是沒救了, 不過既然沒救了, 就拿來當實驗吧

錯誤訊息大概如下:

Msg 945, Level 14, State 2, Line 1
Database 'XXXXXXXXXXX' cannot be opened due to inaccessible files or insufficient memory or disk space. See the SQL Server errorlog for details.

首先在SSMS上, 用圖形介面點來點去, 完全無法進入, 右鍵點選內容也是沒有東西, 感覺只剩了一個空殼, 接下來試了幾個語法, 不外乎是把資料庫先設成單人使用模式(single user mode)再嘗試用DBCC Check去修復, 如下

USE master

ALTER DATABASE XXXXXX SET EMERGENCY;
GO
ALTER DATABASE XXXXXX SET SINGLE_USER;
GO
DBCC CHECKDB (XXXXXX, REPAIR_ALLOW_DATA_LOSS)
GO
ALTER DATABASE XXXXXX SET MULTI_USER;
GO
ALTER DATABASE XXXXXX ONLINE;
GO

當將資料庫設成EMERGENCY時, 資料庫就會變成復原模式, 所以執行DBCC CHECKDB其實都是會失敗的, 證實這樣做是無效的

後來又試圖把XXXX.ldf的檔案先搬到其他資料夾, 嘗試先用XXXX.mdf(註一)來修復資料庫, 但是這個時候發現, 檔案是無法搬移的, 看來是壞的相當徹底

不過不死心的我還是又試了另一個方法, 先把資料庫改成離線狀態, 不過後來發現, 再也回不去了, 無法回到線上狀態, 索性一不作二不休, 把資料庫卸除(detach), 在嘗試先附加(attach)單一檔案修復資料庫, 結論當然還是不行, 最後辦公室走得剩沒幾個人了, 為了避免留下來關燈關冷氣, 只好宣告棄守, 放棄急救, 明天再來收拾殘局吧, 這個結論告訴我們平時備份的重要性, 不然正式環境真的碰上了, 就欲哭無淚了

卸除及附加單一檔案語法:

exec sp_detach_db [ @dbname = ] 'XXXXXXXX'
exec sp_attach_single_file_db @dbname = 'XXXXXXXX'
, @physname = N'c:\XXXXXXXX.mdf'


註一: 一個SQL Server的資料庫最少會有兩個實體檔案, 一個名為XXXX.mdf(資料檔), 另一個為XXX.ldf(交易記錄檔)

arrow
arrow
    全站熱搜

    Paul 發表在 痞客邦 留言(0) 人氣()