事情的起因 昨天
系統管理員告訴我
我們一個內部應用數據庫所在的磁盤空間不足了
我注意到數據庫事件日志文件XXX_Data
ldf文件已經增長到了
GB
於是我決意縮小這個日志文件
經過收縮數據庫等操作未果後
我犯了一個自進入行業以來的最大最愚蠢的錯誤:竟然誤刪除了這個日志文件!後來我看到所有論及數據庫恢復的文章上都說道:
無論如何都要保證數據庫日志文件存在
它至關重要
甚至微軟甚至有一篇KB文章講如何只靠日志文件恢復數據庫的
我真是不知道我那時候是怎麼想的?!
這下子壞了!這個數據庫連不上了
企業管理器在它的旁邊寫著
(置疑)
而且最要命的
這個數據庫從來沒有備份了
我唯一找得到的是遷移半年前的另外一個數據庫服務器
應用倒是能用了
但是少了許多記錄
表和存儲過程
真希望這只是一場噩夢!
數據庫日志文件的誤刪或別的原因引起數據庫日志的損壞
方法一 新建一個同名的數據庫
再停掉sql server(注意不要分離數據庫)
用原數據庫的數據文件覆蓋掉這個新建的數據庫
再重啟sql server
此時打開企業管理器時會出現置疑
先不管
執行下面的語句(注意修改其中的數據庫名)
完成後一般就可以訪問數據庫中的數據了
這時
數據庫本身一般還要問題
解決辦法是
利用
數據庫的腳本創建一個新的數據庫
並將數據導進去就行了
USE MASTER
GO
SP_CONFIGURE
ALLOW UPDATES
RECONFIGURE WITH OVERRIDE
GO
UPDATE SYSDATABASES SET STATUS =
WHERE NAME=
置疑的數據庫名
Go
sp_dboption
置疑的數據庫名
single user
true
Go
DBCC CHECKDB(
置疑的數據庫名
)
Go
update sysdatabases set status =
where name=
置疑的數據庫名
Go
sp_configure
allow updates
reconfigure with override
Go
sp_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 Master
Go
sp_configure
allow updates
reconfigure with override
Go
執行結果:
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
go
sp_configure
allow updates
reconfigure with override
Go
執行結果:
在 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 int
set @table_id=object_id(
表名
)
dbcc showcontig(@table_id)
第二步:重構表索引
dbcc dbreindex(
表名
pk_索引名
)
重做第一步
如發現掃描密度/Scan Density還是小於
%則重構表的所有索引
並不一定能達
%
dbcc dbreindex(
表名
)
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22169.html