1. 程式人生 > >資料庫恢復

資料庫恢復



當資料庫失效時,請記錄下當前時間,然後遵循下面步驟進行恢復。

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步。

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'

當資料庫失效時,請記錄下當前時間,然後遵循下面步驟進行恢復。

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步。

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'