史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   網路軟硬體架設技術文件 (http://forum.slime.com.tw/f133.html)
-   -   日誌文件丟失下的SQLServer資料庫的恢復 (http://forum.slime.com.tw/thread82723.html)

psac 2003-11-17 12:48 PM

日誌文件丟失下的SQLServer資料庫的恢復
 
問題:因為不小心把LDF日誌文件刪除了,只有MDF文件,怎樣恢復這個資料庫???

解決方案一:

sysdatabases
status=32768 (emergency mode)

開啟系統表的操作權限
USE master
EXEC sp_configure 'show advanced option', '1'

紀錄資料庫原狀態
select status from sysdatabases where name = 'crashdb'
status
-----------
16

(所影響的行數為 1 行)

將資料庫置為緊急狀態
update sysdatabases set status = 32768 where name = 'crashdb'
將資料庫置回原狀態
update sysdatabases set status = 16 where name = 'crashdb'
(可省略)

新增一資料庫,使用DTS的在 SQL Server 實例之間傳輸資料庫對像功能敬愛能夠將原資料庫的所有資料庫對像、資料及相關權限複製到新資料庫中

將原資料庫刪除,並將新增資料庫重命名為原資料庫的名,此時除在日誌中為套用到資料庫中的事務丟失外其他資料均已恢復。

解決方案二:

完美解決辦法!!樓上兄弟不具體!
任何資料庫系統都無法避免崩潰的狀況,即使你使用了Clustered,雙機熱備……仍然無法完全根除系統中的單點故障,何況對於大部分用戶來說,無法承受這樣昂貴的硬體投資。所以,在系統崩潰的時候,如何恢復原有的寶貴資料就成為一個極其重要的問題了。

在恢復的時候,最理想的情況就是你的資料文件和日誌文件都完好無損了,這樣只需要sp_attach_db,把資料文件附加到新的資料庫上即可,或者在停機的時候把所有資料文件(一定要有master等)都copy到原有路徑下也行,不過一般不推薦這樣的做法,sp_attach_db比較好,雖然麻煩許多。

但是呢,一般資料庫崩潰的時候系統是未必能有時間把未完成的事務和髒頁等寫入磁牒的,這樣的情況sp_attach_db就會失敗。那麼,寄期望於DBA制定了一個良好的災難恢復計劃吧。按照你的恢復計劃,還原最新的完全制作備份,增量制作備份或者事務日誌制作備份,然後如果你的活動事務日誌還能讀得出來的話,恭喜你!你可以還原到崩潰前的狀態。

一般的服務機構都是沒有專職的DBA的,如果沒有可用的制作備份,更可能是最近一次制作備份的時間過於久遠而導致不可接受的資料損失,而且你的活動事務日誌也處於不可用的狀態,那就是最麻煩的情況了。

不幸的很的是,一般資料庫崩潰都是由於存儲子系統引起的,而這樣的情況是幾乎不可能有可用的日誌用於恢復的。
那麼就只好試一下這些方案了。當然,是要求至少你的資料文件是存在的,要是資料文件、日誌文件和制作備份都沒有了的話,別找我,你可以到樓頂上去唱「神啊,救救我吧」。

首先,你可以試一下sp_attach_single_file_db,試著恢復一下你的資料文件,雖然能恢復的可能性不大,不過假如這個資料庫剛好執行了一個checkpoint的話,還是有可能成功的。

如果你沒有好到有摸彩票的手氣,最重要的資料庫沒有像你期盼的那樣attach上去,不要氣餒,還是有別的方案的。

我們可以試著重新增立一個log,先把資料庫設定為emergency mode,sysdatabases的status為32768 就表示資料庫處於此狀態。

不過系統表是不能隨便改的,設定一下先
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go
然後
update sysdatabases set status = 32768 where name = '<db_name>'
現在,祈求滿天神佛的保佑吧,重新增立一個log文件。成功的機會還是相當大的,系統一般都會認可你新增立的日誌。如果沒有報告什麼錯誤,現在就可以鬆一口氣了。

雖然資料是恢復了,可是別以為事情就算完成了,正在進行的事務肯定是丟失了,原來的資料也可能受到一些損壞。

先把SQL Server 重新啟動一下,然後檢查你的資料庫吧。
先設定成單用戶模式,然後做dbcc
sp_dboption '<db_name>', 'single user', 'true'
DBCC CHECKDB('<db_name>')
如果沒有什麼大問題就可以把資料庫狀態改回去了,記得別忘了把系統表的修改選項關掉。
update sysdatabases set status = 28 where name = '<db_name>' --當然你的資料庫狀態可能不是這個,自己改為合適的值吧。也可以用sp_resetstatus
go
sp_configure 'allow updates', 0
reconfigure with override
Go

checkdb的時候可能報告有一些錯誤,這些錯誤的資料你可能就只好丟棄了。
checkdb有幾種修複選項,自己看著用吧,不過最後你可能還是得用REPAIR_ALLOW_DATA_LOSS,完成所有修復。
chekcdb並不能完成所有的修復,我們需要更進一步的修復,用DBCC CHECKTABLE對每一個表做檢查吧。
表的列表可以用sysobjects裡面得到,把OBJECTPROPERTY是IsTable的全部找出來檢查一下吧,這樣能夠基本上解決問題了,如果還報告錯誤,試著把資料select into到另一張表檢查一下。
這些都做完了之後,把所有索引、視圖、存儲程序、觸發器等重新增立一下。DBCC DBREINDEX也許可以幫你一些忙。

然後,就可以向boss吹噓一下你的豐功偉業,順便小小的提一下加薪的要求,如果(很有可能)不得逞的話,也只好回家睡覺去:'(
記得下次別忘了做好制作備份哦~

上面提到的指令、對像在Books Online中均有詳細說明,請注意參看。
Thank you for your reading.

1。分離被設定疑(suspend)的資料庫.可使用sp_detach_db,
EXEC sp_detach_db 'databasename', 'true'
2.附加資料庫可使用sp_attach_single_filedb
sp_attach_single_file_db @dbname = 'databasename',
@physname = 'Data\database.mdf'

別忘了把所有索引、視圖、存儲程序、觸發器等重新增立一下
可以這樣用sp_attach_db,很簡單,測試用PUBS通過。
程序如下:
1.停掉MSSQLSERVER,將MSSQL安裝目錄下的E:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf和E:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf文件移走。
2.重新啟動MSSQLSERVER,在SQL Server Enterprise Manager中可看到PUBS的圖示是灰色的加了個'(置疑)',刪除PUBS。至此是為了模擬Pubs資料庫只留下了pubs.mdf,(pubs_log.ldf不再用到)。
3.將pubs.mdf移到MSSQL安裝目錄下E:\Program Files\Microsoft SQL Server\MSSQL\Data\
4.在SQL查詢分析器中執行 exec sp_attach_db 'pubs' ,'E:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf',
會有錯誤提示:
設備啟動錯誤。物理檔案名 'e:\Program Files\Microsoft SQL Server\MSSQL\data\pubs_log.ldf' 可能有誤。
已新增名為 'E:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.LDF' 的新日誌文件。

不過沒關係,因為新日誌文件已新增了,呵呵。
用此方法只要有.mdf文件,就能回複數據庫。

本人系統為WIN98,SQL2000標準中文版。

望各位批評指正。


所有時間均為台北時間。現在的時間是 03:53 AM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1