Sqlserver系統資料庫和使用者資料庫日誌檔案全部丟失的恢復

lusklusklusk發表於2021-06-21

系統資料庫和使用者資料庫日誌都丟失的情況下,資料庫無法啟動,需要先重建系統資料庫日誌檔案以便把sqlserver service拉起來,再重建使用者資料庫

試過但是行不通的辦法
1、-mClient單使用者模式下啟動資料庫並重建系統資料庫日誌,即使用net start "SQL Server (MSSQLSERVER)" -m"Microsoft SQL Server Management Studio - Query"進入資料庫重建系統資料庫日誌,出現報錯,系統資料庫日誌不允許重建
System databases master, model, and tempdb cannot have their logs rebuilt.
2、設定啟動項-T3608,即在SQL Server Configuration Manager裡面對應的sqlserver service服務新增啟動項引數-T3608,sqlserver service伺服器還是起不來
-T3608 禁止 SQL Server 自動啟動和恢復除 master 資料庫之外的任何資料庫。
3、使用安裝包repair現有sqlserver例項,行不通,因為repair其實是需要sqlserver例項有startup handle,而系統資料庫日誌都丟失的情況下,sqlserver例項壓根無法啟動,也就麼有startup handle的概念,所以repair一個沒有系統資料庫日誌的sqlserver例項會報錯:Could not find the Database Engine startup handle
4、完全解除安裝,再重新安裝,這個時候是可以把資料庫拉起來的,不過master庫的東西和msdb庫的東西都丟失了,不過可以重建msdb庫,重建msdb的前提是master和model庫必須正常,也就是一個資料庫能用,必須保證master和model庫正常,因為一個sqlserver 例項能否使用必須有tempdb,而tempdb依賴model,model依賴master



Sqlserver系統資料庫和使用者資料庫日誌檔案丟失的恢復方法

1、系統資料庫有備份的話,可以把系統資料庫以重新命名的方式當成使用者資料庫恢復到其他例項,但是必須保證恢復後的資料檔案和日誌檔案的名稱和之前一樣,再把恢復後的資料檔案和日誌檔案拷貝回出問題的例項。比如A例項的系統資料庫master的日誌檔案丟失了,可以把A例項的master庫恢復到B例項master_test庫,但是必須保證B的master_test庫的資料檔案和日誌檔名稱和A庫的master庫的資料檔案和日誌檔名稱一致,再把B的master_test庫的資料檔案和日誌檔名稱拷貝回A例項master庫對應的目錄,這樣A例項就可以啟動了

2、如果系統資料庫沒有備份,則在其他例項上建立一個資料庫,資料檔案和日誌檔名稱和丟失的系統資料庫一樣,再把新建的資料庫offline,把這個新建資料庫的資料檔案和日誌檔案改名或拷貝到其他目錄,再把丟失日誌的系統資料庫資料檔案拷貝到這個新建資料庫的對應的目錄,再執行rebuild log,這樣這個資料檔案就自動生成了日誌檔案,再把這個系統資料庫資料檔案和日誌檔案拷貝回丟失系統資料庫日誌檔案的目錄,這時這個曾經丟失了系統資料庫日誌檔案的sqlserver例項就可以啟動了,參見如下示例

假如A例項的master和model和msdb的日誌檔案都丟了
2.1、在B例項建立和master、model、msdb同名資料庫檔案FILENAME的使用者資料庫master_test、model_test、msdb_test

CREATE DATABASE [master_test] 
ON PRIMARY(NAME = N'master', FILENAME = N'E:\master.mdf')
LOG ON (NAME = N'mastlog', FILENAME = N'E:\mastlog.ldf')
GO
CREATE DATABASE [model_test] 
ON PRIMARY(NAME = N'modeldev', FILENAME = N'E:\model.mdf')
LOG ON (NAME = N'modellog', FILENAME = N'E:\modellog.ldf')
GO
CREATE DATABASE [msdb_test] 
ON PRIMARY(NAME = N'MSDBData', FILENAME = N'E:\msdbdata.mdf')
LOG ON (NAME = N'MSDBLog', FILENAME = N'E:\MSDBLog.ldf')
GO


2.2、在B例項對這三個使用者資料庫master_test、model_test、msdb_test進行offline離線操作

alter database [master_test] set offline
alter database [model_test] set offline
alter database [msdb_test] set offline


2.3、再在B例項把master_test、model_test、msdb_test資料檔案和日誌檔案拷貝到其他目錄或改名,再把A例項的master、model、msdb資料檔案拷貝到B例項master_test、model_test、msdb_test資料庫對應目錄,再執行REBUILD LOG,這樣A例項的master、model、msdb資料檔案其實就有日誌檔案,把這些資料檔案和日誌拷貝會A例項對應目錄,A例項就可以啟動了

ALTER DATABASE [master_test] REBUILD LOG ON (NAME=master_log, FILENAME='E:\mastlog.ldf');
ALTER DATABASE [model_test] REBUILD LOG ON (NAME=modellog, FILENAME='E:\modellog.ldf');
ALTER DATABASE [msdb_test] REBUILD LOG ON (NAME=MSDBLog, FILENAME='E:\msdblog.ldf');

會有如下警告,說明生成了新的日誌檔案
Warning: The log for database 'master_test' has been rebuilt. Transactional consistency has been lost. The RESTORE chain was broken, and the server no longer has context on the previous log files, so you will need to know what they were. You should run DBCC CHECKDB to validate physical consistency. The database has been put in dbo-only mode. When you are ready to make the database available for use, you will need to reset database options and delete any extra log files.
Warning: The log for database 'model_test' has been rebuilt. Transactional consistency has been lost. The RESTORE chain was broken, and the server no longer has context on the previous log files, so you will need to know what they were. You should run DBCC CHECKDB to validate physical consistency. The database has been put in dbo-only mode. When you are ready to make the database available for use, you will need to reset database options and delete any extra log files.
Warning: The log for database 'msdb_test' has been rebuilt. Transactional consistency has been lost. The RESTORE chain was broken, and the server no longer has context on the previous log files, so you will need to know what they were. You should run DBCC CHECKDB to validate physical consistency. The database has been put in dbo-only mode. When you are ready to make the database available for use, you will need to reset database options and delete any extra log files.

3、再回到A例項,在A例項執行如下語句,把生成的語句再執行一遍就可以rebuild 使用者資料庫的日誌檔案,並設定資料庫的訪問限制為多使用者

select 'ALTER DATABASE ['+db_name(database_id)+'] REBUILD LOG ON (NAME='+name+', 
FILENAME='''+physical_name+''');' from master.sys.master_files where type_desc='LOG' and database_id>4
select 'ALTER DATABASE ['+db_name(database_id)+'] SET MULTI_USER WITH NO_WAIT' 
from master.sys.master_files where type_desc='LOG' and database_id>4



備註:目前官方文件沒有ALTER DATABASE REBUILD LOG的操作,sqlserver不推薦這種操作

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2777662/,如需轉載,請註明出處,否則將追究法律責任。

相關文章