數據庫MDF損壞修復_第1頁
數據庫MDF損壞修復_第2頁
數據庫MDF損壞修復_第3頁
數據庫MDF損壞修復_第4頁
數據庫MDF損壞修復_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、sql server 2000文件中,ldf損壞了,但mdf還在,總結一下恢復方法:1)先及時把原來的數據庫文件(如test.mdf)備份到其他地方2) 停掉服務器3) 刪除這個test.mdf4) 重新建立一個test同名數據庫5)刪除這個新建立的test數據庫的test.ldf文件,并用開始備份好的test.mdf文件覆蓋這個新建立的test.mdf文件6)啟動數據庫服務器。此時會看到數據庫test的狀態為“置疑”。這時候不能對此數據庫進行任何操作。 .設置數據庫允許直接操作系統表。此操作可以在SQL Server Enterprise Manager里面選擇數據庫服務器,按右鍵,選擇“屬

2、性”,在“服務器設置”頁面中將“允許對系統目錄直接修改”7) 設置test為緊急修復模式update sysdatabases set status=-32768 where dbid=DB_ID('test')此時可以在SQL Server Enterprise Manager里面看到該數據庫處于“只讀置疑脫機緊急模式”可以看到數據庫里面的表,但是僅僅有系統表8 下面執行真正的恢復操作,重建數據庫日志文件dbcc rebuild_log('test','C:Program FilesMicrosoft SQL ServerMSSQLDatatest_l

3、og.ldf')執行過程中,如果遇到下列提示信息:服務器: 消息 5030,級別 16,狀態 1,行 1未能排它地鎖定數據庫以執行該操作。DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。說明您的其他程序正在使用該數據庫,如果剛才您在F步驟中使用SQL Server Enterprise Manager打開了test庫的系統表,那么退出SQL Server Enterprise Manager就可以了。正確執行完成的提示應該類似于:警告: 數據庫 'test' 的日志已重建。已失去事務的一致性。應運行 DBCC CHECKDB 以驗證物理一致性。將

4、必須重置數據庫選項,并且可能需要刪除多余的日志文件。DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。此時打開在SQL Server Enterprise Manager里面會看到數據庫的狀態為“只供DBO使用”。此時可以訪問數據庫里面的用戶表了。9 .驗證數據庫一致性dbcc checkdb('test')10 .設置數據庫為正常狀態sp_dboption 'test','dbo use only','false'如果沒有出錯,那么恭喜,現在就可以正常的使用恢復后的數據庫啦。11 最后一步,我們要將步驟E中

5、設置的“允許對系統目錄直接修改”一項恢復-以下是鄒老大寫的,樓主可以參考下SQL code USE master -創建數據庫 CREATE DATABASE db ON PRIMARY( NAME='db_data', FILENAME= 'c:db_data.mdf'), FILEGROUP db_fg1( NAME = 'db_fg1_data', FILENAME = 'c:db_fg1_data.ndf'),FILEGROUP db_fg2( NAME = 'db_fg2_data', FILENAME

6、= 'c:db_fg2_data.ndf') LOG ON( NAME='db_log', FILENAME ='c:db.ldf') GO -創建表 CREATE TABLE db.dbo.ta(id int) ON PRIMARY CREATE TABLE db.dbo.tb(id int) ON db_fg1 CREATE TABLE db.dbo.tc(id int) ON db_fg2 INSERT db.dbo.tb SELECT id FROM sysobjects GO-做文件組備份 BACKUP DATABASE db FILE

7、GROUP='db_fg1' TO DISK='c:db_fg1.bak' WITH FORMAT -備份后,再做數據處理 INSERT db.dbo.ta SELECT id FROM sysobjects GO /*-下面演示了破壞數據文件的處理,這些操作在操作系統中進行 1. 停止SQL Server服務(msqlserver服務) 2. 刪除文件 c:db_fg1_data.ndf (模擬破壞) 3. 重新SQL Server服務,此時數據庫DB置疑 -*/ GO -下面演示了如何恢復數據 -首先要備份當前日志 BACKUP LOG db TO DISK

8、='c:db_log.bak' WITH FORMAT,NO_TRUNCATE -利用文件組備份恢復破壞的文件 RESTORE DATABASE db FILEGROUP='db_fg1' FROM DISK='c:db_fg1.bak' WITH NORECOVERY -還原到日志點 RESTORE LOG db FROM DISK='c:db_log.bak' WITH RECOVERY -顯示已經恢復的數據 SELECT COUNT(*) FROM db.dbo.tb SELECT COUNT(*) FROM db.dbo.

9、ta GO -刪除測試 DROP DATABASE dbMSSQL數據庫損壞的修復命令DBCC簡介DBCC命令能對數據庫進行維護,重點介紹內容:一、CHECKALLOC 磁盤空間一致性二、CHECKCATALOG 系統表一致性三、CHECKCONSTRAINTS約束完整性四、CHECKDB 結構完整性五、CHECKTABLE 頁的完整性六、DBREINDEX 索引七、INDEXDEFRAG 整理索引碎片八、SHRINKDATABASE 釋放空間九、SHRINKFILE 釋放文件空間十、HELP 語句的語法信息一、DBCC CHECKALLOC檢查指定數據庫的磁盤空間分配結構一致性<單用戶

10、模式>。語法DBCC CHECKALLOC(database_name , NOINDEX<指定不檢查非系統表的非聚集索引>|REPAIR_ALLOW_DATA_LOSS<同REPAIR_REBUILD但刪除已損壞的內容,數據會丟失>|REPAIR_FAST<進行簡單的修復操作,數據不會丟失>|REPAIR_REBUILD<進行復雜的修復,數據不會丟失> )WITHALL_ERRORMSGS<顯示全部錯誤信息>|NO_INFOMSGS<不顯示錯誤信息>|,TABLOCK<獲取共享表鎖> , ESTIMAT

11、EONLY<顯示需要的臨時空間tempdb<此四個參數不重要> 例:use ufdata_999_2001goALTER DATABASE ufdata_999_2001 SET SINGLE_USER-SQL7.0下同(sp_dboption 'ufdata_999_2001','single_user', 'true')goDBCC CHECKALLOC('ufdata_999_2001 ', REPAIR_REBUILD) with NO_INFOMSGSgoALTER DATABASE ufdata_99

12、9_2001 SET MULTI_USER-SQL7.0(sp_dboption 'ufdata_999_2001','single_user', 'false')二、DBCC CHECKCATALOG檢查指定數據庫中的系統表內及系統表間的一致性。語法DBCC CHECKCATALOG ('database_name ' ) WITH NO_INFOMSGS 例:DBCC CHECKCATALOG ('ufdata_999_2001 ') with NO_INFOMSGS三、DBCC CHECKCONSTRAINT

13、S檢查指定表上的指定約束或所有約束的完整性。語法DBCC CHECKCONSTRAINTS( table_name | constraint_name ) WITH ALL_ERRORMSGS| ALL_CONSTRAINTS<對表上所有啟用及禁用的約束進行檢查> 例:DBCC CHECKCONSTRAINTS with ALL_CONSTRAINTS四、 DBCC CHECKDB檢查指定數據庫中的所有對象的分配和結構完整性<單用戶模>。語法DBCC CHECKDB( database_name , NOINDEX | REPAIR_ALLOW_DATA_LOSS |

14、REPAIR_FAST |REPAIR_REBUILD ) WITH ALL_ERRORMSGS , NO_INFOMSGS , TABLOCK , ESTIMATEONLY , PHYSICAL_ONLY 例:use ufdata_999_2001goALTER DATABASE ufdata_999_2001 SET SINGLE_USERDBCC CHECKDB (ufdata_999_2001, REPAIR_REBUILD) with NO_INFOMSGSgoALTER DATABASE ufdata_999_2001 SET MULTI_USERgo五、DBCC CHECKTAB

15、LE檢查指定表或視圖的數據、索引及 text、ntext 和 image 頁的完整性<單用戶模式>。語法DBCC CHECKTABLE( table_name | view_name , NOINDEX | index_id|REPAIR_ALLOW_DATA_LOSS|REPAIR_FAST | REPAIR_REBUILD ) WITH ALL_ERRORMSGS| NO_INFOMSGS , TABLOCK , ESTIMATEONLY , PHYSICAL_ONLY 例:use ufdata_999_2001goALTER DATABASE ufdata_999_2001

16、SET SINGLE_USERgoDBCC CHECKTABLE ('code', REPAIR_REBUILD) with NO_INFOMSGSgoALTER DATABASE ufdata_999_2001 SET MULTI_USER六、DBCC DBREINDEX重建指定數據庫中表的一個或多個索引。語法DBCC DBREINDEX( database.owner.table_name , index_name , fillfactor ) WITH NO_INFOMSGS 例:DBCC DBREINDEX (code) with NO_INFOMSGS七、DBCC I

17、NDEXDEFRAG整理指定的表或視圖的聚集索引和輔助索引碎片。語法DBCC INDEXDEFRAG ( database_name | database_id | 0 , table_name | table_id |view_name | view_id , index_name | index_id ) WITH NO_INFOMSGS 例:DBCC INDEXDEFRAG (ufdata_999_2001,code,ccode_name) with NO_INFOMSGS八、DBCC SHRINKDATABASE釋放指定數據庫中的數據文件空間。語法(SQL7.0用SHRINKDB)DB

18、CC SHRINKDATABASE( database_name , target_percent<釋放后數據庫文件中所要的剩余可用空間百分比> , NOTRUNCATE<據庫文件中保留所釋放的文件空間>TRUNCATEONLY<空間釋放給操作系統, target_percent無效 )例:DBCC SHRINKDATABASE (ufdata_999_2001,10)九、DBCC SHRINKFILE釋放相關數據庫的指定數據文件或日志文件空間。語法DBCC SHRINKFILE( file_name | file_id , target_size<是用兆字

19、節表示的所要的文件大小> | , EMPTYFILE | NOTRUNCATE | TRUNCATEONLY )例:USE ufdata_999_2001SP_HELPFILE 查看數據庫有關信息后修改下面的語句后執行即可GoDBCC SHRINKFILE (ufmodel, 70)DBCC SHRINKFILE (ufmodel_log, 7)GO十、DBCC HELP返回指定的 DBCC 語句的語法信息。語法DBCC HELP ( dbcc_statement | dbcc_statement_var | ? )例:Dbcc help(?)'KCMC_DB' 的 DB

20、CC 結果。'sysobjects' 的 DBCC 結果。對象 'sysobjects' 有 96 行,這些行位于 2 頁中。'sysindexes' 的 DBCC 結果。對象 'sysindexes' 有 105 行,這些行位于 4 頁中。'syscolumns' 的 DBCC 結果。對象 'syscolumns' 有 552 行,這些行位于 10 頁中。'systypes' 的 DBCC 結果。對象 'systypes' 有 26 行,這些行位于 1 頁中。

21、9;syscomments' 的 DBCC 結果。對象 'syscomments' 有 133 行,這些行位于 15 頁中。'sysfiles1' 的 DBCC 結果。對象 'sysfiles1' 有 2 行,這些行位于 1 頁中。'syspermissions' 的 DBCC 結果。對象 'syspermissions' 有 18 行,這些行位于 1 頁中。'sysusers' 的 DBCC 結果。對象 'sysusers' 有 12 行,這些行位于 1 頁中。's

22、ysproperties' 的 DBCC 結果。對象 'sysproperties' 有 0 行,這些行位于 0 頁中。'sysdepends' 的 DBCC 結果。對象 'sysdepends' 有 347 行,這些行位于 2 頁中。'sysreferences' 的 DBCC 結果。對象 'sysreferences' 有 11 行,這些行位于 1 頁中。'sysfulltextcatalogs' 的 DBCC 結果。對象 'sysfulltextcatalogs' 有

23、0 行,這些行位于 0 頁中。'sysfulltextnotify' 的 DBCC 結果。對象 'sysfulltextnotify' 有 0 行,這些行位于 0 頁中。'sysfilegroups' 的 DBCC 結果。對象 'sysfilegroups' 有 1 行,這些行位于 1 頁中。'T_AdmCardList' 的 DBCC 結果。對象 'T_AdmCardList' 有 124 行,這些行位于 1 頁中。'T_CardList2' 的 DBCC 結果。對象 'T

24、_CardList2' 有 18781 行,這些行位于 302 頁中。'dtproperties' 的 DBCC 結果。對象 'dtproperties' 有 0 行,這些行位于 0 頁中。'T_CardList' 的 DBCC 結果。對象 'T_CardList' 有 37114 行,這些行位于 413 頁中。'T_StuData' 的 DBCC 結果。服務器: 消息 8964,級別 16,狀態 1,行 1表錯誤: 對象 ID 1061578820。text、ntext 或 image 節點(位于頁 (1

25、:27399),槽 4,文本 ID 4472373248)未被引用。對象 'T_StuData' 有 549 行,這些行位于 150 頁中。'T_StuData2' 的 DBCC 結果。對象 'T_StuData2' 有 160 行,這些行位于 14 頁中。CHECKDB 發現了 0 個分配錯誤和 1 個一致性錯誤(在表 'T_StuData2' 中,該表的對象 ID 為 1061578820)。'T_CardCategory' 的 DBCC 結果。對象 'T_CardCategory' 有 3 行

26、,這些行位于 1 頁中。'T_CardTypeID' 的 DBCC 結果。對象 'T_CardTypeID' 有 7 行,這些行位于 1 頁中。'T_CardTypeList' 的 DBCC 結果。對象 'T_CardTypeList' 有 10 行,這些行位于 1 頁中。'T_EmpData' 的 DBCC 結果。對象 'T_EmpData' 有 430 行,這些行位于 17 頁中。'T_EmpData2' 的 DBCC 結果。對象 'T_EmpData2' 有 0

27、 行,這些行位于 1 頁中。'T_Print' 的 DBCC 結果。對象 'T_Print' 有 0 行,這些行位于 1 頁中。'T_BankBranch' 的 DBCC 結果。對象 'T_BankBranch' 有 1 行,這些行位于 1 頁中。'T_School' 的 DBCC 結果。對象 'T_School' 有 2 行,這些行位于 1 頁中。CHECKDB 發現了 0 個分配錯誤和 1 個一致性錯誤(在數據庫 'KCMC_DB' 中)。repair_allow_data_lo

28、ss 是最低的修復級別(對于由 DBCC CHECKDB (KCMC_DB ) 發現的錯誤而言)。DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。sql2005中的備份要在sql2000中還原,首先在sql2005中還原,然后選擇兼容sql2000(80),備份后再在sql2000種還原。用mdf和ldf來備份數據庫,首先要分離數據庫,右鍵備份數據庫-任務-分離,對數據庫分離,數據庫的readonly要為false。分離后,在sql的data目錄下找到要備份的mdf和ldf數據庫。還原時選擇附加數據庫,選擇對應的mdf和ldf文件,附加即可。要判斷要附加的數據庫是否為只

29、讀,如果是,要去掉只讀屬性。要附加的數據庫文件即mdf和ldf文件的安全設置中設置user用戶完全控制權限,即為數據庫文件的屬性,設置成功后才可以附加。否則會抱錯,要附加的數據庫為只讀。要導出數據庫腳本時,右鍵導出的數據庫-任務-生成腳本以下是sql語句備份還原數據庫:/*-備份數據庫 -鄒建 2003.10-*/ /*-調用示例 -備份當前數據庫exec p_backupdb bkpath='c:',bkfname='db_DATE_db.bak' -差異備份當前數據庫exec p_backupdb bkpath='c:',bkfname=&#

30、39;db_DATE_df.bak',bktype='DF' -備份當前數據庫日志exec p_backupdb bkpath='c:',bkfname='db_DATE_log.bak',bktype='LOG' -*/ if exists (select * from dbo.sysobjects where id = object_id(N'dbo.p_backupdb') and OBJECTPROPERTY(id, N'IsProcedure') = 1)drop procedur

31、e dbo.p_backupdbGO create proc p_backupdbdbname sysname='', -要備份的數據庫名稱,不指定則備份當前數據庫bkpath nvarchar(260)='', -備份文件的存放目錄,不指定則使用SQL默認的備份目錄bkfname nvarchar(260)='', -備份文件名,文件名中可以用DBNAME代表數據庫名,DATE代表日期,TIME代表時間bktype nvarchar(10)='DB', -備份類型:'DB'備份數據庫,'DF' 差

32、異備份,'LOG' 日志備份appendfile bit=1 -追加/覆蓋備份文件asdeclare sql varchar(8000)if isnull(dbname,'')='' set dbname=db_name()if isnull(bkpath,'')='' set bkpath=dbo.f_getdbpath(null)if isnull(bkfname,'')='' set bkfname='DBNAME_DATE_TIME.BAK'set bkfna

33、me=replace(replace(replace(bkfname,'DBNAME',dbname),'DATE',convert(varchar,getdate(),112),'TIME',replace(convert(varchar,getdate(),108),':','')set sql='backup '+case bktype when 'LOG' then 'log ' else 'database ' end +dbname+

34、9; to disk='''+bkpath+bkfname+''' with '+case bktype when 'DF' then 'DIFFERENTIAL,' else '' end+case appendfile when 1 then 'NOINIT' else 'INIT' endprint sqlexec(sql)go -/*-恢復數據庫 -鄒建 2003.10-*/ /*-調用示例-完整恢復數據庫exec p_RestoreDb bkfile

35、='c:db_20031015_db.bak',dbname='db' -差異備份恢復exec p_RestoreDb bkfile='c:db_20031015_db.bak',dbname='db',retype='DBNOR'exec p_backupdb bkfile='c:db_20031015_df.bak',dbname='db',retype='DF' -日志備份恢復exec p_RestoreDb bkfile='c:db_20031015_

36、db.bak',dbname='db',retype='DBNOR'exec p_backupdb bkfile='c:db_20031015_log.bak',dbname='db',retype='LOG' -*/ if exists (select * from dbo.sysobjects where id = object_id(N'dbo.p_RestoreDb') and OBJECTPROPERTY(id, N'IsProcedure') = 1)drop p

37、rocedure dbo.p_RestoreDbGO create proc p_RestoreDbbkfile nvarchar(1000), -定義要恢復的備份文件名dbname sysname='', -定義恢復后的數據庫名,默認為備份的文件名dbpath nvarchar(260)='', -恢復后的數據庫存放目錄,不指定則為SQL的默認數據目錄retype nvarchar(10)='DB', -恢復類型:'DB'完事恢復數據庫,'DBNOR' 為差異恢復,日志恢復進行完整恢復,'DF'

38、差異備份的恢復,'LOG' 日志恢復filenumber int=1, -恢復的文件號overexist bit=1, -是否覆蓋已經存在的數據庫,僅retype為killuser bit=1 -是否關閉用戶使用進程,僅overexist=1時有效asdeclare sql varchar(8000) -得到恢復后的數據庫名if isnull(dbname,'')=''select sql=reverse(bkfile),sql=case when charindex('.',sql)=0 then sqlelse substri

39、ng(sql,charindex('.',sql)+1,1000) end,sql=case when charindex('',sql)=0 then sqlelse left(sql,charindex('',sql)-1) end,dbname=reverse(sql) -得到恢復后的數據庫存放目錄if isnull(dbpath,'')='' set dbpath=dbo.f_getdbpath('') -生成數據庫恢復語句set sql='restore '+case retype when 'LOG' then 'log ' else 'database ' end+dbname+' from disk='''+bkfile+''''+' with file='+cast(fil

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論