我們要將步驟E中設定的“允許對系統目錄直接修改”一項恢復。因為平時直接作業系統表是一件比較危險的事情。當然,我們可以在SQL Server Enterprise Manager裡面恢復,也可以使用如下語句完成
基本介紹
- 中文名:sql資料庫修復
- 外文名:SQL Server
- 恢復有幾步:10步
- 注意事項:不要分離資料庫
恢復步驟:
--a.將smlog_log.ldf檔案備份到其它目錄下;
--b.將源目錄下的smlog_log.ldf檔案改名為smlog_log_bak.ldf;
--c.執行以下語句修改資料庫的狀態:
use Master
go
update sysdatabases set status=32768 where name='資料庫名稱' --修改狀態,設為緊急狀態
go
shutdown with nowait --停止資料庫伺服器
go
--d.退出SQL並在(COMMAND)命令行模式中通過下面的代碼重新啟動SQL:
sqlservr-c -T3608 -T4022 --安全模式啟動SQL SERVER
--e.在查詢分析器中執行以下語句來查看剛剛修改過狀態的資料庫狀態:
select Name,Status from sysdatabases where Name='資料庫名稱'
--f.執行以下代碼新建日誌檔案:
DBCCtraceon(3604)--跟蹤
dbcc rebuild_log('資料庫名稱','日誌檔案全路徑') --檔案名稱要有全路徑和擴展名
--dbcc rebuild_log('prs_msc','d:\mscsql\mssql\data\prs_msc_log.ldf
--g.將資料庫置回正常狀態:
update sysdatabases set status=0 where name='資料庫名稱'
--h.重新啟動資料庫後執行以下語句檢查資料庫:
DBCC CHECKDB --如果執行完有錯誤用以下語句修復
--i.要修複數據庫必需將資料庫改為單用戶模式:
Exce sp_DBOption '資料庫名稱','single user','true'---('false'恢復多用戶)
--j.執行以下語句修複數據庫:
DBCC CHECKDB('資料庫名稱',REPAIR_ALLOW_DATA_LOSS)
REPAIR_ALLOW_DATA_LOSS:是比較高級的修複方式
REPAIR_FAST:是簡單快速的修複方式
/*
處理狀態就為"置疑"的資料庫
備份數據檔案
1.新建一個同名的資料庫(數據檔案與原來的要一致)
2.再停掉sql server(注意不要分離資料庫)
3.用原資料庫的數據檔案覆蓋掉這個新建的資料庫
4.再重啟sql server
5.此時打開企業管理器時會出現置疑,先不管,執行下面的語句(注意修改其中的資料庫名)
6.完成後一般就可以訪問資料庫中的數據了,這時,資料庫本身一般還要問題,解決辦法是,利用資料庫的腳本創建一個新的資料庫,並將數據導進去就行了.
*/
USE MASTER
GO
SP_CONFIGURE 'ALLOW UPDATES',1
GO
RECONFIGURE WITH OVERRIDE
GO
UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的資料庫名'
Go
sp_dboption '置疑的資料庫名','single user','true'
Go
DBCC CHECKDB('置疑的資料庫名')
Go
update sysdatabases set status=28 where name='置疑的資料庫名'
Go
sp_configure 'allow updates',0
GO
reconfigure with override
Go
sp_dboption '置疑的資料庫名', 'single user','false'
Go
/*
只有mdf檔案的恢復技術
由於種種原因,我們如果當時僅僅備份了mdf檔案,那么恢復起來就是一件很麻煩的事情了。
如果您的mdf檔案是當前資料庫產生的,那么很僥倖,也許你使用sp_attach_db或者sp_attach_single_file_db可以恢複數據庫,但是會出現類似下面的提示信息
設備激活錯誤。物理檔案名稱 'C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF' 可能有誤。
已創建名為 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.LDF' 的新日誌檔案。
但是,如果您的資料庫檔案是從其他計算機上複製過來的,那么很不幸,也許上述辦法就行不通了。你也許會得到類似下面的錯誤信息
伺服器: 訊息 1813,級別 16,狀態 2,行 1
未能打開新資料庫 'test'。CREATE DATABASE 將終止。
設備激活錯誤。物理檔案名稱 'd:\test_log.LDF' 可能有誤。
恢復辦法
*/
--A.我們使用默認方式建立一個供恢復使用的資料庫(如test)。可以在SQL Server Enterprise Manager裡面建立。
--B.停掉資料庫伺服器。
--C.將剛才生成的資料庫的日誌檔案test_log.ldf刪除,用要恢復的資料庫mdf檔案覆蓋剛才生成的資料庫數據檔案test_data.mdf。
--D.啟動資料庫伺服器。此時會看到資料庫test的狀態為“置疑”。這時候不能對此資料庫進行任何操作。
--E.設定資料庫允許直接作業系統表。此操作可以在SQL Server Enterprise Manager裡面選擇資料庫伺服器,按右--鍵,選擇“屬性”,在“伺服器設定”頁面中將“允許對系統目錄直接修改”一項選中。也可以使用如下語句來實現。
use master
go
sp_configure 'allow updates',1
go
reconfigure with override
go
--F.設定test為緊急修復模式
--在查詢管理器里設定如下命令:
update sysdatabases set status=-32768 where dbid=DB_ID('test')
--此時可以在SQL Server Enterprise Manager裡面看到該資料庫處於“唯讀\置疑\脫機\緊急模式”可以看到資料庫裡面的表,但是僅僅有系統表
--G.下面執行真正的恢復操作,重建資料庫日誌檔案
dbcc rebuild_log('test','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf')
/*
執行過程中,如果遇到下列提示信息:
伺服器: 訊息 5030,級別 16,狀態 1,行 1
未能排它地鎖定資料庫以執行該操作。
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯繫。
說明您的其他程式正在使用該資料庫,如果剛才您在F步驟中使用SQL Server Enterprise Manager打開了test庫的系統表,那么退出SQL Server Enterprise Manager就可以了。
正確執行完成的提示應該類似於:
警告: 資料庫 'test' 的日誌已重建。已失去事務的一致性。應運行 DBCC CHECKDB 以驗證物理一致性。將必須重置資料庫選項,並且可能需要刪除多餘的日誌檔案。
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯繫。
此時打開在SQL Server Enterprise Manager裡面會看到資料庫的狀態為“只供DBO使用”。此時可以訪問資料庫裡面的用戶表了。
*/
--H.驗證資料庫一致性(可省略)
dbcc checkdb('test')
/*一般執行結果如下:
CHECKDB 發現了 0 個分配錯誤和 0 個一致性錯誤(在資料庫 'test' 中)。
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯繫。*/
--I.設定資料庫為正常狀態
sp_dboption 'test','dbo use only','false'
--如果沒有出錯,那么恭喜,現在就可以正常的使用恢復後的資料庫啦。
--J.最後一步,我們要將步驟E中設定的“允許對系統目錄直接修改”一項恢復。因為平時直接作業系統表是一件比較危險的事情。當然,我們可以在SQL Server Enterprise Manager裡面恢復,也可以使用如下語句完成
sp_configure 'allow updates',0
go
reconfigure with override
go
--日誌檔案出現問題(丟失或檔案格式非法),怎么使資料庫恢復正常
--如果用sp_attach_single_file 'TEST','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.mdf'失敗則需要用下列步驟完成
--1.將置疑的資料庫分離,將mdf檔案移走或改名!
sp_detach_db 'TEST'
--2.重新在原來目錄下建立同名的資料庫TEST
--3.停掉SQL Service,將先前的mdf檔案拷貝回來覆蓋(或改名),刪除原來的log檔案(或改名)
--4.啟動SQL Service(否則下面的語句沒辦法運行)
--5.將資料庫設成緊急模式(status=32768)
sp_configure 'allow updates',1
reconfigure with override
update sysdatabases set status=32768 where name='TEST'
--重新建立日誌檔案
DBCC traceon(3604)
dbcc rebuild_log('test','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf')
Go
--6.重新啟動SQL Service
--7.將資料庫設定成單用戶模式(下面三個語句均可)
--sp_dboption 'TEST','single user','true'
update sysdatabases set status=4096 where name='TEST'
--alter database TEST set Single_user
--8.檢查資料庫的完整性和一致性,OK了就可以用了
DBCC CheckDB(TEST)
--9.將數據的訪問許可權設定成多用戶模式
sp_dboption 'TEST','single user','false'
--或alter database TEST set multi_user
--10.關閉高級選項
sp_configure 'allow updates',0
reconfigure with override
--結束