『壹』 sql Server:無日誌恢復資料庫
事情的起因 昨天 系統管理員告訴我 我們一個內部應用資料庫所在的磁碟空間不足了 我注意到資料庫事件日誌文件XXX_Data ldf文件已經增長到了 GB 於是我決意縮小這個日誌文件 經過收縮資料庫等操作未果後 我犯了一個自進入行業以來的最大最愚蠢的錯誤:竟然誤刪除了這個日誌文件!後來我看到所有論及資料庫恢復的文章上都說道: 無論如何都要保證資料庫日誌文件存在 它至關重要 甚至微軟甚至有一篇KB文章講如何只靠日誌文件恢復資料庫的 我真是不知道我那時候是怎麼想的?!這下子壞了!這個資料庫連不上了 企業管理器在它的旁邊寫著 (置疑) 而且最要命的 這個資料庫從來沒有備份了 我唯一找得到的是遷移半年前的另外一個資料庫伺服器 應用倒是能用了 但是少了許多記錄 表和
存儲過程 真希望這只是一場噩夢!資料庫日誌文件的誤刪或別的原因引起資料庫日誌的損壞 方法一 新睜輪建一個同名的資料庫 再停掉sql server(注意不要分離資料庫) 用原資料庫的數據文件覆蓋掉這個新建的資料庫 再重啟sql server 此時打開企業管理器時會出現置疑 先不管 執行下面的語句(注意修改其中的資料庫名) 完成後一般就可以
訪問資料庫中的數據了 這時 資料庫本身一般還要問題 解決辦法是 利用資料庫的
腳本創建一個新的資料庫 並將數據導進去就行了 USE MASTERGOSP_CONFIGURE ALLOW UPDATES RECONFIGURE WITH OVERRIDEGOUPDATE SYSDATABASES SET STATUS = WHERE NAME= 置疑的資料庫名 Gosp_dboption 置疑雀臘的資料庫名 single user true GoDBCC CHECKDB( 置疑的資料庫名 )Goupdate sysdatabases set status = where name= 置疑的資料庫名 Gosp_configure allow updates reconfigure with overrideGosp_dboption 置疑的資料庫名 single user false Go 方法二 事情的起因昨天 系統管理員告訴我 我們一個內部應用資料庫所在的磁碟空間不足了 我注意到資料庫事件日誌文件XXX_Data ldf文件已經增長到了 GB 於是我決意縮小這個日誌文件 經過收縮資料庫等操作未果後 我犯了一個自進入行業以來的最大最愚蠢的錯誤:竟然誤刪除了這個日誌文件!後來我看到所有論及資料庫恢復的文章上都說道: 無論如何都要保證資料庫日誌文件存在 它至關重要 甚至微軟甚至有一篇KB文章講如何只靠日誌文件恢復資料庫的 我真是不知道我那時候是怎麼想的?!這下子壞了!這個資料庫連不上了 企業管理器在它的旁邊寫著 (置疑) 而且最要命的 這個資料庫從來沒有備份了 我唯一找得到的是遷移半年前的另外一個資料庫伺服器 應用倒是能用了 但是少了許多記錄 表和存儲過程 真希望這只是一場噩夢!沒有效果的恢復步驟附加資料庫_Rambo講過被刪除日誌文件中不存在活動日誌時 可以這么做來恢復:悉歲信 分離被置疑的資料庫 可以使用sp_detach_db 附加資料庫 可以使用sp_attach_single_file_db但是 很遺憾 執行之後 SQL Server質疑數據文件和日誌文件不符 所以無法附加資料庫數據文件 DTS數據導出不行 無法讀取XXX資料庫 DTS Wizard報告說 初始化上下文發生錯誤 緊急模式怡紅公子講過沒有日誌用於恢復時 可以這么做: 把資料庫設置為emergency mode 重新建立一個log文件 把SQL Server 重新啟動一下 把應用資料庫設置成單用戶模式 做DBCC CHECKDB 如果沒有什麼大問題就可以把資料庫狀態改回去了 記得別忘了把系統表的修改選項關掉我實踐了一下 把應用資料庫的數據文件移走 重新建立一個同名的資料庫XXX 然後停掉SQL服務 把原來的數據文件再覆蓋回來 之後 按照怡紅公子的步驟走 但是 也很遺憾 除了第 步之外 其他步驟執行非常成功 可惜 重啟SQL Server之後 這個應用資料庫仍然是置疑!不過 讓我欣慰的是 這么做之後 倒是能夠Select數據了 讓我大出一口氣 只不過 組件使用資料庫時 報告說: 發生錯誤: 未能在資料庫 XXX 中運行 BEGIN TRANSACTION 因為該資料庫處於迴避恢復模式 最終成功恢復的全部步驟設置資料庫為緊急模式停掉SQL Server服務;把應用資料庫的數據文件XXX_Data mdf移走;重新建立一個同名的資料庫XXX;停掉SQL服務;把原來的數據文件再覆蓋回來;運行以下語句 把該資料庫設置為緊急模式;運行 Use MasterGosp_configure allow updates reconfigure with overrideGo 執行結果:DBCC 執行完畢 如果 DBCC 輸出了錯誤信息 請與系統管理員聯系 已將配置選項 allow updates 從 改為 請運行 RECONFIGURE 語句以安裝 接著運行 update sysdatabases set status = where name = XXX 執行結果:(所影響的行數為 行)重啟SQL Server服務;運行以下語句 把應用資料庫設置為Single User模式;運行 sp_dboption XXX single user true 執行結果:命令已成功完成 ü 做DBCC CHECKDB;運行 DBCC CHECKDB( XXX ) 執行結果: XXX 的 DBCC 結果 sysobjects 的 DBCC 結果 對象 sysobjects 有 行 這些行位於 頁中 sysindexes 的 DBCC 結果 對象 sysindexes 有 行 這些行位於 頁中 syscolumns 的 DBCC 結果 ………ü 運行以下語句把系統表的修改選項關掉;運行 sp_resetstatus XXX gosp_configure allow updates reconfigure with overrideGo 執行結果:在 sysdatabases 中更新資料庫 XXX 的條目之前 模式 = 狀態 = (狀態 suspect_bit = ) 沒有更新 sysdatabases 中的任何行 因為已正確地重置了模式和狀態 沒有錯誤 未進行任何更改 DBCC 執行完畢 如果 DBCC 輸出了錯誤信息 請與系統管理員聯系 已將配置選項 allow updates 從 改為 請運行 RECONFIGURE 語句以安裝 重新建立另外一個資料庫XXX Lost;DTS導出向導運行DTS導出向導;復制源選擇EmergencyMode的資料庫XXX 導入到XXX Lost;選擇 在SQL Server資料庫之間復制對象和數據 試了多次 好像不行 只是復制過來了所有表結構 但是沒有數據 也沒有視圖和存儲過程 而且DTS向導最後報告復制失敗;所以最後選擇 從源資料庫復製表和視圖 但是後來發現 這樣總是只能復制一部分表記錄;於是選擇 用一條查詢指定要傳輸的數據 缺哪個表記錄 就導哪個;視圖和存儲過程是執行SQL語句添加的 維護Sql Server中表的索引在使用和創建資料庫索引中經常會碰到一些問題 在這里可以採用一些另類的方法解決… 第一步:查看是否需要維護 查看掃描密度/Scan Density是否為 %declare @table_id intset @table_id=object_id( 表名 )dbcc showcontig(@table_id) 第二步:重構表索引dbcc dbreindex( 表名 pk_索引名 ) 重做第一步 如發現掃描密度/Scan Density還是小於 %則重構表的所有索引 並不一定能達 % dbcc dbreindex( 表名 ) lishixin/Article/program/SQLServer/201311/22169
『貳』 日誌文件丟失或出錯的情況下如何恢復SQL資料庫
1. 新建資料庫(同名)
2. 停掉資料庫
3. 刪除新建資料庫的日誌文件,用要恢復的覆蓋mdf文件
4. 啟動資料庫伺服器
5. 設置資料庫允許直接操作系統表
6. 設置資料庫為緊急修復模式
update sysdatabases set status=-32768 where dbid=DB_ID('dbDataHome')
7. 重建資料庫日誌文件
dbcc rebuild_log('dbDataHome','D:\Data\dbData_Data.LDF')
8. 驗證資料庫一致性(可省略)
dbcc checkdb('dbDataHome')
9.設置資料庫為正常狀態
exec sp_dboption 'dbDataHome','dbo use only','false'
10. 最後一步,我們要將步驟E中設置的「允許對系統目錄直接修改」一項恢復。
『叄』 資料庫恢復中日誌文件是存在外存嗎
1、正確認識日誌文件。
一個Sql Server資料庫最少要包含一個mdf數據文件和一個ldf日誌文件。
mdf文件中包含了所有的資料庫對象和數據,例如表、存儲過程、用戶信息等等。
ldf文件中包含(或者曾經包含)了資料庫的所有事務日誌,但是不要指望僅僅通過ldf日誌文件來恢復資料庫!!
例如,想通過ldf文件和以前的完全備份將數據恢復到某個時間點,或者由於某些原因只剩下了ldf日誌文件,想通過ldf日誌文還原出mdf文件等等,這些都是行不通的。當然,必須承認通過一些三方工具或特殊的手段的確可能可以通過ldf文件恢復部分的數據。即便是這樣,一般情況下通過ldf文件恢復出你想要的數據的情況也是少之又少。
ldf日誌文件的真正作用應該是以下幾個:
做為事務日誌的一個物理存儲位置,讓我們可以把日誌從ldf文件中備份成日誌備份,我們可以通過日誌備份來還原資料庫。