當數據庫失效時,請記錄下當前時間,然後遵循下面步驟進行恢復。
1. 備份數據庫
成功,使用備份文件還原數據庫,轉第2步。
失敗,轉第3步。
2. 還原數據庫(在另一個服務器操作)
(1)DECLARE @backup_device nvarchar(128), @log_backup_device nvarchar(128)
set @backup_device = N'F:/database/myDb.bak'
restore database MyDb
from disk = @backup_device
WITH REPLACE , file=5
(2)根據事務日誌來恢復到具體某個時間點
--首先基於一個完全備份點開始做事務日誌還原,注意[NORECOVERY]參數
RESTORE database (數據庫名) from 完全備份設備名with REPLACE,NORECOVERY,
MOVE 'MyDb' TO 'D:/FMyDb_0606.mdf',
MOVE 'FMyDb_Log' TO 'D:/FMyDb_Log_0606.ldf'
--開始事務日誌
A.查看事務日誌點:RESTORE HEADERONLY from disk='事務日誌的備份的文件完全路徑或備份設備名'
B.開始恢復
restore LOG 數據庫名from事務日誌備份設備名with FILE=1, NORECOVERY
restore LOG 數據庫名from事務日誌備份設備名with FILE=2, NORECOVERY
restore LOG 數據庫名from事務日誌備份設備名with FILE=3,NORECOVERY --倒數第二個備份日誌
restore LOG 數據庫名from事務日誌備份設備名with FILE=4,RECOVERY --最後一個備份日誌
執行失敗的話,轉下一步。
3. 複製數據庫mdb, ldf文件
執行 net stop mssqlserver 停止SQL Server服務,複製數據庫mdb, ldf文件。
成功複製2個文件已經其他文件組,轉第4步。
只能複製mdb文件,轉第5步。
只能複製ldf文件,轉第8步。
4. 附加數據庫(數據庫文件與日誌文件)
CREATE DATABASE [MyDb2] ON
( FILENAME = N'F:/back/MyDb.mdf' )
,( FILENAME = N'F:/back/MyDb_log.ldf' )
FOR ATTACH
如果出現失敗,轉第5步。
CREATE DATABASE [MyDb2] ON
( FILENAME = N'F:/back/MyDb.mdf' )
FOR ATTACH_REBUILD_LOG
如果失敗,在SQL2000下,可以嘗試(2005版本沒有該功能)
dbcc rebuild_log('MyDb','F:/MyDb_log.ldf')
轉第6步。
當服務器因爲硬件失敗導致數據庫失效時,可能出現以下錯誤,轉第6步:
文件激活失敗。物理文件名稱'f:/database/MyDb/MyDb_log.ldf'可能不正確。
由於數據庫沒有完全關閉,無法重新生成日誌。
6. 強制附加數據庫
a) 新建一個同名數據庫
CREATE DATABASE [MyDb_temp]
ON (NAME=MyDb_temp, FILENAME = N'F:/temp/MyDb.mdf' )
LOG ON (NAME=MyDb_temp _Log, FILENAME = N'F:/temp/MyDb_log.ldf')
b) 停止SqlServer
c) 將備份的數據庫覆蓋F:/temp/MyDb.mdf
d) 啓動SqlServer,(MyDb_temp將變爲不可用)
查看數據庫狀態
SELECT * FROM SYS.DATABASES
SELECT * FROM sys.database_recovery_status
e) 將數據庫改爲緊急恢復模式
ALTER DATABASE MyDb SET EMERGENCY
f) 修復數據庫
DBCC CheckDB ('MyDb')
g) 將數據庫改爲但用戶模式
ALTER DATABASE MyDb SET SINGLE_USER
h) 再帶參數修復數據庫
DBCC CheckDB ('MyDb', REPAIR_REBUILD )
i) 將數據庫改爲正常模式
ALTER DATABASE MyDb SET ONLINE
如果無法創建數據庫日誌,i步驟將失敗,這時候如果能看到數據庫表,和進行Select操作,轉第7步。
7. 提取數據庫數據
a) 創建一個新的臨時數據庫
b) 導出數據
執行 SELECT 'SELECT * INTO MyDb2..'+name+' FROM '+ name FROM sys.objects WHERE TYPE = 'U' AND name!='sysdiagrams'
產生數據導出語句,執行他們,將數據複製到新數據庫
c) 導出存儲過程:待續
d) 導出觸發器:待續
e) 導出函數:待續
f) 導出自定義數據類型:待續
g) 導出用戶:待續
h) 將新數據庫還原到目標服務器
備份/還原這個新建的數據庫到目標服務器
i) 修復孤立用戶(SQL 2005 版)
a) EXEC sp_change_users_login 'Auto_Fix', 'GameServer';
b) EXEC sp_change_users_login 'Auto_Fix', 'backoffice';
c) EXEC sp_change_users_login 'Auto_Fix', 'adminsoft';
j) 修復數據庫擁有者
EXEC sp_changedbowner 'sa'
總結:還是定時備份好。。。
- THE END -
有問題或者想和大家交流歡迎在本文下方留言或到博客原文處諮詢本文作者。
本文作者:CSDN博客作者-greenery
博客地址:
http://blog.csdn.net/greenery/article/details/2570242
如果你有好的原創文章想與大家分享,歡迎投稿。
當數據庫失效時,請記錄下當前時間,然後遵循下面步驟進行恢復。
1. 備份數據庫
成功,使用備份文件還原數據庫,轉第2步。
失敗,轉第3步。
2. 還原數據庫(在另一個服務器操作)
(1)DECLARE @backup_device nvarchar(128), @log_backup_device nvarchar(128)
set @backup_device = N'F:/database/myDb.bak'
restore database MyDb
from disk = @backup_device
WITH REPLACE , file=5
(2)根據事務日誌來恢復到具體某個時間點
--首先基於一個完全備份點開始做事務日誌還原,注意[NORECOVERY]參數
RESTORE database (數據庫名) from 完全備份設備名with REPLACE,NORECOVERY,
MOVE 'MyDb' TO 'D:/FMyDb_0606.mdf',
MOVE 'FMyDb_Log' TO 'D:/FMyDb_Log_0606.ldf'
--開始事務日誌
A.查看事務日誌點:RESTORE HEADERONLY from disk='事務日誌的備份的文件完全路徑或備份設備名'
B.開始恢復
restore LOG 數據庫名from事務日誌備份設備名with FILE=1, NORECOVERY
restore LOG 數據庫名from事務日誌備份設備名with FILE=2, NORECOVERY
restore LOG 數據庫名from事務日誌備份設備名with FILE=3,NORECOVERY --倒數第二個備份日誌
restore LOG 數據庫名from事務日誌備份設備名with FILE=4,RECOVERY --最後一個備份日誌
執行失敗的話,轉下一步。
3. 複製數據庫mdb, ldf文件
執行 net stop mssqlserver 停止SQL Server服務,複製數據庫mdb, ldf文件。
成功複製2個文件已經其他文件組,轉第4步。
只能複製mdb文件,轉第5步。
只能複製ldf文件,轉第8步。
4. 附加數據庫(數據庫文件與日誌文件)
CREATE DATABASE [MyDb2] ON
( FILENAME = N'F:/back/MyDb.mdf' )
,( FILENAME = N'F:/back/MyDb_log.ldf' )
FOR ATTACH
如果出現失敗,轉第5步。
CREATE DATABASE [MyDb2] ON
( FILENAME = N'F:/back/MyDb.mdf' )
FOR ATTACH_REBUILD_LOG
如果失敗,在SQL2000下,可以嘗試(2005版本沒有該功能)
dbcc rebuild_log('MyDb','F:/MyDb_log.ldf')
轉第6步。
當服務器因爲硬件失敗導致數據庫失效時,可能出現以下錯誤,轉第6步:
文件激活失敗。物理文件名稱'f:/database/MyDb/MyDb_log.ldf'可能不正確。
由於數據庫沒有完全關閉,無法重新生成日誌。
6. 強制附加數據庫
a) 新建一個同名數據庫
CREATE DATABASE [MyDb_temp]
ON (NAME=MyDb_temp, FILENAME = N'F:/temp/MyDb.mdf' )
LOG ON (NAME=MyDb_temp _Log, FILENAME = N'F:/temp/MyDb_log.ldf')
b) 停止SqlServer
c) 將備份的數據庫覆蓋F:/temp/MyDb.mdf
d) 啓動SqlServer,(MyDb_temp將變爲不可用)
查看數據庫狀態
SELECT * FROM SYS.DATABASES
SELECT * FROM sys.database_recovery_status
e) 將數據庫改爲緊急恢復模式
ALTER DATABASE MyDb SET EMERGENCY
f) 修復數據庫
DBCC CheckDB ('MyDb')
g) 將數據庫改爲但用戶模式
ALTER DATABASE MyDb SET SINGLE_USER
h) 再帶參數修復數據庫
DBCC CheckDB ('MyDb', REPAIR_REBUILD )
i) 將數據庫改爲正常模式
ALTER DATABASE MyDb SET ONLINE
如果無法創建數據庫日誌,i步驟將失敗,這時候如果能看到數據庫表,和進行Select操作,轉第7步。
7. 提取數據庫數據
a) 創建一個新的臨時數據庫
b) 導出數據
執行 SELECT 'SELECT * INTO MyDb2..'+name+' FROM '+ name FROM sys.objects WHERE TYPE = 'U' AND name!='sysdiagrams'
產生數據導出語句,執行他們,將數據複製到新數據庫
c) 導出存儲過程:待續
d) 導出觸發器:待續
e) 導出函數:待續
f) 導出自定義數據類型:待續
g) 導出用戶:待續
h) 將新數據庫還原到目標服務器
備份/還原這個新建的數據庫到目標服務器
i) 修復孤立用戶(SQL 2005 版)
a) EXEC sp_change_users_login 'Auto_Fix', 'GameServer';
b) EXEC sp_change_users_login 'Auto_Fix', 'backoffice';
c) EXEC sp_change_users_login 'Auto_Fix', 'adminsoft';
j) 修復數據庫擁有者
EXEC sp_changedbowner 'sa'
總結:還是定時備份好。。。
- THE END -
有問題或者想和大家交流歡迎在本文下方留言或到博客原文處諮詢本文作者。
本文作者:CSDN博客作者-greenery
博客地址:
http://blog.csdn.net/greenery/article/details/2570242
如果你有好的原創文章想與大家分享,歡迎投稿。