重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
標(biāo)題:[MySQL]MSSQL數(shù)據(jù)庫(kù)823錯(cuò)誤解決方法
創(chuàng)新互聯(lián)建站是一家專(zhuān)注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作和遂寧托管服務(wù)器的網(wǎng)絡(luò)公司,有著豐富的建站經(jīng)驗(yàn)和案例。
出處:
時(shí)間:Sat, 12 Apr 2008 10:12:27 +0000
作者:ah011
地址:
內(nèi)容:
1.日志文件被破壞823錯(cuò)誤
----------------------
日志文件被破壞的數(shù)據(jù)庫(kù)文件,通過(guò)如下方法附加上去后,數(shù)據(jù)庫(kù)里所有的表都不能訪(fǎng)問(wèn),提示錯(cuò)誤832,請(qǐng)問(wèn)要如何解決??
use master
go
sp_configure 'allow updates',1
go
reconfigure with override
go
update sysdatabases set status=-32768 where dbid=DB_ID('linyi_pljy')
go
dbcc rebuild_log('linyi_pljy','e:\Program Files\Microsoft SQL Server\MSSQL\Data\linyi_pljy_log.ldf')
go
sp_dboption 'linyi_pljy','dbo use only','false'
go
sp_configure 'allow updates',0
go
reconfigure with override
go
---------------------
2.附加數(shù)據(jù)庫(kù)文件時(shí),提示823錯(cuò)誤
----------------------
EXEC sp_configure 'allow updates',1 RECONFIGURE WITH OVERRIDE /* 打開(kāi)修改系統(tǒng)表的開(kāi)關(guān) */
update sysdatabases set status = 32768 where name = '數(shù)據(jù)庫(kù)名'
DBCC REBUILD_LOG ('數(shù)據(jù)庫(kù)名', 'E: dzzdatabase dzz1204_Log.LDF' )
update sysdatabases set status = 0 where name = '數(shù)據(jù)庫(kù)名'
restore database 數(shù)據(jù)庫(kù)名 WITH RECOVERY
EXEC sp_configure 'allow updates',0 RECONFIGURE WITH OVERRIDE /* 關(guān)閉打開(kāi)修改系統(tǒng)表的開(kāi)關(guān) */
3因?yàn)橥k姷仍蛟斐蒑SSQL數(shù)據(jù)庫(kù),提示823錯(cuò)誤
----------------------
USE MASTER
GO
sp_dboption 'databaseName', 'single user', 'true'
Go
DBCC CHECKDB('databaseName', REPAIR_REBUILD)
Go
USE databaseName
go
exec sp_msforeachtable 'DBCC CHECKTABLE('''?''',REPAIR_REBUILD)'
go
sp_dboption 'databaseName', 'single user', 'false'
Go
如果還不行,可以采用允許丟失數(shù)據(jù)的方式修復(fù),如下:
USE MASTER
GO
sp_dboption 'databaseName', 'single user', 'true'
Go
DBCC CHECKDB('databaseName', REPAIR_ALLOW_DATA_LOSS)
Go
USE databaseName
go
exec sp_msforeachtable 'DBCC CHECKTABLE('''?''',REPAIR_REBUILD)'
go
sp_dboption 'databaseName', 'single user', 'false'
Go
4.數(shù)據(jù)庫(kù)恢復(fù)資料
----------------------
SQL Server數(shù)據(jù)庫(kù)備份有兩種方式,一種是使用BACKUP DATABASE將數(shù)據(jù)庫(kù)文件備份出去,另外一種就是直接拷貝數(shù)據(jù)庫(kù)文件mdf和日志文件ldf的方式。下面將主要討論一下后者的備份與恢復(fù)。本文假定您能熟練使用SQL Server Enterprise Manager(SQL Server企業(yè)管理器)和SQL Server Quwey Analyser(SQL Server查詢(xún)分析器)
1、正常的備份、恢復(fù)方式
正常方式下,我們要備份一個(gè)數(shù)據(jù)庫(kù),首先要先將該數(shù)據(jù)庫(kù)從運(yùn)行的數(shù)據(jù)服務(wù)器中斷開(kāi),或者停掉整個(gè)數(shù)據(jù)庫(kù)服務(wù)器,然后復(fù)制文件。
卸下數(shù)據(jù)庫(kù)的命令:Sp_detach_db 數(shù)據(jù)庫(kù)名
連接數(shù)據(jù)庫(kù)的命令:Sp_attach_db或者sp_attach_single_file_db
s_attach_db [@dbname =] ′dbname′, [@filename1 =] ′filename_n′ [,...16]
sp_attach_single_file_db [@dbname =] ′dbname′, [@physname =] ′physical_name′
使用此方法可以正確恢復(fù)SQL Sever7.0和SQL Server 2000的數(shù)據(jù)庫(kù)文件,要點(diǎn)是備份的時(shí)候一定要將mdf和ldf兩個(gè)文件都備份下來(lái),mdf文件是數(shù)據(jù)庫(kù)數(shù)據(jù)文件,ldf是數(shù)據(jù)庫(kù)日志文件。
例子:
假設(shè)數(shù)據(jù)庫(kù)為test,其數(shù)據(jù)文件為test_data.mdf,日志文件為test_log.ldf。下面我們討論一下如何備份、恢復(fù)該數(shù)據(jù)庫(kù)。
卸下數(shù)據(jù)庫(kù):sp_detach_db 'test'
連接數(shù)據(jù)庫(kù):sp_attach_db 'test','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_data.mdf','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf'
sp_attach_single_file_db 'test','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_data.mdf'
2、只有mdf文件的恢復(fù)技術(shù)
由于種種原因,我們?nèi)绻?dāng)時(shí)僅僅備份了mdf文件,那么恢復(fù)起來(lái)就是一件很麻煩的事情了。
如果您的mdf文件是當(dāng)前數(shù)據(jù)庫(kù)產(chǎn)生的,那么很僥幸,也許你使用sp_attach_db或者sp_attach_single_file_db可以恢復(fù)數(shù)據(jù)庫(kù),但是會(huì)出現(xiàn)類(lèi)似下面的提示信息
設(shè)備激活錯(cuò)誤。物理文件名 'C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF' 可能有誤。
已創(chuàng)建名為 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.LDF' 的新日志文件。
但是,如果您的數(shù)據(jù)庫(kù)文件是從其他計(jì)算機(jī)上復(fù)制過(guò)來(lái)的,那么很不幸,也許上述辦法就行不通了。你也許會(huì)得到類(lèi)似下面的錯(cuò)誤信息
服務(wù)器: 消息 1813,級(jí)別 16,狀態(tài) 2,行 1
未能打開(kāi)新數(shù)據(jù)庫(kù) 'test'。CREATE DATABASE 將終止。
設(shè)備激活錯(cuò)誤。物理文件名 'd:\test_log.LDF' 可能有誤。
怎么辦呢?別著急,下面我們舉例說(shuō)明恢復(fù)辦法。
A.我們使用默認(rèn)方式建立一個(gè)供恢復(fù)使用的數(shù)據(jù)庫(kù)(如test)。可以在SQL Server Enterprise Manager里面建立。
B.停掉數(shù)據(jù)庫(kù)服務(wù)器。
C.將剛才生成的數(shù)據(jù)庫(kù)的日志文件test_log.ldf刪除,用要恢復(fù)的數(shù)據(jù)庫(kù)mdf文件覆蓋剛才生成的數(shù)據(jù)庫(kù)數(shù)據(jù)文件test_data.mdf。
D.啟動(dòng)數(shù)據(jù)庫(kù)服務(wù)器。此時(shí)會(huì)看到數(shù)據(jù)庫(kù)test的狀態(tài)為“置疑”。這時(shí)候不能對(duì)此數(shù)據(jù)庫(kù)進(jìn)行任何操作。
E.設(shè)置數(shù)據(jù)庫(kù)允許直接操作系統(tǒng)表。此操作可以在SQL Server Enterprise Manager里面選擇數(shù)據(jù)庫(kù)服務(wù)器,按右鍵,選擇“屬性”,在“服務(wù)器設(shè)置”頁(yè)面中將“允許對(duì)系統(tǒng)目錄直接修改”一項(xiàng)選中。也可以使用如下語(yǔ)句來(lái)實(shí)現(xiàn)。
use master
go
sp_configure 'allow updates',1
go
reconfigure with override
go
F.設(shè)置test為緊急修復(fù)模式
update sysdatabases set status=-32768 where dbid=DB_ID('test')
此時(shí)可以在SQL Server Enterprise Manager里面看到該數(shù)據(jù)庫(kù)處于“只讀\置疑\脫機(jī)\緊急模式”可以看到數(shù)據(jù)庫(kù)里面的表,但是僅僅有系統(tǒng)表
G.下面執(zhí)行真正的恢復(fù)操作,重建數(shù)據(jù)庫(kù)日志文件
dbcc rebuild_log('test','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf')
執(zhí)行過(guò)程中,如果遇到下列提示信息:
服務(wù)器: 消息 5030,級(jí)別 16,狀態(tài) 1,行 1
未能排它地鎖定數(shù)據(jù)庫(kù)以執(zhí)行該操作。
DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請(qǐng)與系統(tǒng)管理員聯(lián)系。[brown]
說(shuō)明您的其他程序正在使用該數(shù)據(jù)庫(kù),如果剛才您在F步驟中使用SQL Server Enterprise Manager打開(kāi)了test庫(kù)的系統(tǒng)表,那么退出SQL Server Enterprise Manager就可以了。
正確執(zhí)行完成的提示應(yīng)該類(lèi)似于:
[brown]警告: 數(shù)據(jù)庫(kù) 'test' 的日志已重建。已失去事務(wù)的一致性。應(yīng)運(yùn)行 DBCC CHECKDB 以驗(yàn)證物理一致性。將必須重置數(shù)據(jù)庫(kù)選項(xiàng),并且可能需要?jiǎng)h除多余的日志文件。
DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請(qǐng)與系統(tǒng)管理員聯(lián)系。
此時(shí)打開(kāi)在SQL Server Enterprise Manager里面會(huì)看到數(shù)據(jù)庫(kù)的狀態(tài)為“只供DBO使用”。此時(shí)可以訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)里面的用戶(hù)表了。
H.驗(yàn)證數(shù)據(jù)庫(kù)一致性(可省略)
dbcc checkdb('test')
一般執(zhí)行結(jié)果如下:
CHECKDB 發(fā)現(xiàn)了 0 個(gè)分配錯(cuò)誤和 0 個(gè)一致性錯(cuò)誤(在數(shù)據(jù)庫(kù) 'test' 中)。
DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請(qǐng)與系統(tǒng)管理員聯(lián)系。
I.設(shè)置數(shù)據(jù)庫(kù)為正常狀態(tài)
sp_dboption 'test','dbo use only','false'
如果沒(méi)有出錯(cuò),那么恭喜,現(xiàn)在就可以正常的使用恢復(fù)后的數(shù)據(jù)庫(kù)啦。
J.最后一步,我們要將步驟E中設(shè)置的“允許對(duì)系統(tǒng)目錄直接修改”一項(xiàng)恢復(fù)。因?yàn)槠綍r(shí)直接操作系統(tǒng)表是一件比較危險(xiǎn)的事情。當(dāng)然,我們可以在SQL Server Enterprise Manager里面恢復(fù),也可以使用如下語(yǔ)句完成
sp_configure 'allow updates',0
go
reconfigure with override
go
sqlserver附加數(shù)據(jù)庫(kù)錯(cuò)誤823的解決方案2008-10-13 15:06sqlserver附加數(shù)據(jù)庫(kù)錯(cuò)誤823的解決方案一、SQL-Server附加數(shù)據(jù)庫(kù)時(shí)失敗。
1、異常情況:服務(wù)器在正常運(yùn)行的情況下突然斷電,導(dǎo)致數(shù)據(jù)庫(kù)文件損壞,具體表現(xiàn)是:數(shù)據(jù)庫(kù)名后面有“(置疑)”字樣。
2、異常分析:關(guān)于823錯(cuò)誤的 SQL-SERVER 中的幫助:
================================
錯(cuò)誤 823
嚴(yán)重級(jí)別 24
消息正文
在文件 "%4!" 的偏移量 %3! 處的 %2! 過(guò)程中,檢測(cè)到 I/O 錯(cuò)誤 %1!。
解釋
Microsoft SQL Server 在對(duì)某設(shè)備進(jìn)行讀或?qū)懻?qǐng)求時(shí)遇到 I/O 錯(cuò)誤。該錯(cuò)誤通常表明磁盤(pán)問(wèn)題。但是,錯(cuò)誤日志中在錯(cuò)誤 823 之前記錄的其它核心消息應(yīng)指出涉及了哪個(gè)設(shè)備。
3、解決辦法:
在SQL-Server企業(yè)管理器中,新建同名數(shù)據(jù)庫(kù)(這里假設(shè)為T(mén)est)后,停止數(shù)據(jù)庫(kù),把損壞的數(shù)據(jù)庫(kù)文件Data.mdf和Test_log.LDF覆蓋剛才新建數(shù)據(jù)庫(kù)目錄下的Data.mdf和Test_log.LDF,同時(shí)刪除Test_log.LDF文件;啟動(dòng)數(shù)據(jù)庫(kù)服務(wù),發(fā)現(xiàn)數(shù)據(jù)庫(kù)名Test后面有“置疑”字樣。不要緊,打開(kāi)SQL自帶查詢(xún)分析器,分別執(zhí)行如下SQL語(yǔ)句:
第一、
exec sp_configure 'allow updates',1 RECONFIGURE WITH OVERRIDE /* 打開(kāi)修改系統(tǒng)表的開(kāi)關(guān) */
第二、
update sysdatabases set status=32768 where name='數(shù)據(jù)庫(kù)名' /* 設(shè)置數(shù)據(jù)庫(kù)狀態(tài) */
第三、
DBCC REBUILD_LOG ('數(shù)據(jù)庫(kù)名','D:\database\Test_Log.LDF') /* 重建LDF文件 */
第四、
update sysdatabases set status=0 where name='數(shù)據(jù)庫(kù)名' /* 重置數(shù)據(jù)庫(kù)狀態(tài) */
第五、
restore database 數(shù)據(jù)庫(kù)名 WITH RECOVERY /* 恢復(fù)數(shù)據(jù)庫(kù) */
第六、
exec sp_configure 'allow updates',0 RECONFIGURE WITH OVERRIDE /* 關(guān)閉打開(kāi)修改系統(tǒng)表的開(kāi)關(guān) */
按照此方法操作,應(yīng)該能修復(fù)數(shù)據(jù)庫(kù)正常訪(fǎng)問(wèn)了。如果問(wèn)題依然存在,最笨的一個(gè)方法就是新建另一個(gè)數(shù)據(jù)庫(kù),把原數(shù)據(jù)庫(kù)(Test)各個(gè)表的數(shù)據(jù)導(dǎo)出到新建數(shù)據(jù)庫(kù)表中。
============================================================
補(bǔ)充說(shuō)明:用上面的六步把數(shù)據(jù)庫(kù)置疑的問(wèn)題解決了,但是數(shù)據(jù)庫(kù)表里還有損壞的表(inf_gdscode),把壞表導(dǎo)出的時(shí)候也不成功。最后在查詢(xún)分析器里運(yùn)行:
USE nmgbt_hcxuexipos (數(shù)據(jù)庫(kù)名)
GO
DBCC CHECKTABLE ('inf_gdscode',REPAIR_ALLOW_DATA_LOSS)
GO
如果庫(kù)文件和日志文件一塊附加都附加不上的話(huà),按以下步驟操作:
1,在sqlserver中新建庫(kù)(新建沒(méi)有表的空庫(kù),庫(kù)名為你附加失敗的庫(kù)名),記住數(shù)據(jù)庫(kù)文件存放地址(最好指定目錄)。
2,停止sqlserver服務(wù),在新建的庫(kù)文件目錄下將日志文件刪除(.ldf),然后將附加失敗的庫(kù)文件覆蓋進(jìn)去。
3,啟動(dòng)sqlserver服務(wù),但不停止一切連接該庫(kù)的服務(wù)。
然后執(zhí)行語(yǔ)句:
use master
go
alter database db_name set emergency
go
4、置為單用戶(hù)模式,并重建日志:
alter database db_name set single_user with rollback immediate
go
alter database db_name Rebuild Log on (name=log_name,filename='C:\log_name.ldf')
go
alter database dbname set multi_user
go
其中日志文件目錄及文件名按實(shí)際情況填寫(xiě)。
5、dbcc checkdb嘗試修復(fù)庫(kù)。
Use master
go
sp_dboption 數(shù)據(jù)庫(kù)名, single, true
dbcc checkdb(dbname,REPAIR_ALLOW_DATA_LOSS)
dbcc checkdb(dbname,REPAIR_REBUILD)
go
sp_dboption 數(shù)據(jù)庫(kù)名, single, false
go
如果修復(fù)過(guò)程中有錯(cuò)誤則庫(kù)損壞嚴(yán)重,可能修復(fù)失敗。