1. 程式人生 > >SQL Server資料庫被置疑的解決方案

SQL Server資料庫被置疑的解決方案

在企業使用SQL Server時,有時會因為各種原因遇到SQL Server資料庫置疑的情況,那麼是什麼原因產生資料庫置疑呢?對於這樣的問題要如何預防?遇到後要如何解決呢?本文主要對這幾個疑問進行解答。

  • 資料庫置疑產生的原因
    1. SQL Server所在分割槽空間是否夠?資料庫檔案大小是否達到最大檔案限制?

FAT32的格式只支援4G以內的檔案

  1. 資料庫檔案損壞或被非正常刪除時出現這種情況
  2. 病毒防火牆的掃描也會引起資料庫置疑
  3. SQL Server啟動時,將會嘗試獲得對資料庫檔案的排他訪問權,如果此時該檔案被其他程式佔用,或者遺失,資料庫將會被標記為置疑
  4. 電腦非法關機也會造成資料庫置疑
  5. 電腦磁碟有壞道有可能造成資料庫置疑
  • 資料庫置疑的預防
    1. 資料庫存放的碟符,空間是否夠大,經常檢查碟符的空間
    2. 資料庫存放的碟符的格式設定為NTFS格式
    3. 進行病毒清除時,儘量把SQL服務停掉,再進行檢查
    4. 儘量減少非正常關機
    5. 建議客戶購買後備電源
    6. 給客戶實施軟體之後一定要做好自動備份
    7. 建議客戶每隔一定時間手動備份一次
  • 資料庫置疑的修復
    1. 點選後臺登入時,如果提示如下圖片就有可能表示資料庫置疑了

  1. 需要確認檢查資料庫置疑,開啟企業管理器中的資料庫目錄,如下圖顯示錶示置疑

下面所有修復置疑的語法,在沒有特別提到時,預設資料庫都請選擇(Master)資料庫)

  1. 修復置疑(必須在SQL的查詢分析器中才能進行資料修復置疑工作)
  1. 開啟查詢分析器,當資料置疑之後在查詢分析器中是看不到置疑的資料庫名稱的,所以進入查詢分析器之後,所選資料庫預設(Master)資料庫即可。複製下面置疑語法到查詢分析器中執行。

--修復資料庫置疑的語法

SP_configure 'allow update',1

go

RECONFIGURE WITH OVERRIDE

go

update sysdatabases

set status=-32768

where name='zmsoftpos_cs'--資料庫名稱

go

dbccrebuild_log('zmsoftpos_cs','D:\zmsoftpos_cs_log')--

重新建立日誌

Go

update sysdatabases

set status=26

where name='zmsoftpos_cs'

Go

Sp_configure 'allow update',0

Go

Reconfigure with override

GO

備註:其中所有的“zmsoftpos_cs”是置疑的資料庫名稱,請根據客戶實際的置疑資料庫進行更改名稱,其他的內容不變

  1. 拷入置疑語法之後,請按F5執行,如果顯示框內顯示的內容如下表示置疑修復成功

  1. 置疑修復成功之後,再到如上圖的master下拉框架內就可以選擇所修復的置疑資料庫了,此時置疑是修復成功了,但是並不代表此資料庫就沒有問題了,請暫時不要進軟體,我們還需要檢查資料庫有沒有問題。
  1. 檢查修復置疑好的資料庫是否正常
  1. 開啟查詢分析器選中修復好的資料庫名稱,輸入“dbcc checkdb”語法,再按F5執行,根據資料庫的大小執行需要的時間不確定,請耐心等待,執行完之後在顯示框內就會顯示一些相關內容如下圖:

如上圖所示,把顯示框拖到最下面,如果“CHECKDB發現了 0個分配錯誤和 0個一致性錯誤”即表示此資料庫已經好了,不用再修復了,客戶即可進入軟體進行操作了。

備註:(以下的語法就不用再執行了)

  1. 如果執行“dbcc checkdb”後顯示框內顯示了很多紅色的記錄,那麼表示這個資料庫的有些表還有錯誤需要修復

  1. 修復過程如下:(修復過程中語法內的資料庫名稱都根據客戶使用的資料庫進行更改)
  1. 首先退出所有的客戶端軟體與企業管理器,只打開查詢分析器,預設資料庫“Master,拷入如下語法執行:

sp_dboption 'zmsoftpos_cs','single user','true'

備註:其中的資料庫名稱根據客戶使用的資料庫進行更改。此語法是把資料庫設定為“單使用者模式

  1. 設定為單使用者模式之後,拷入如下語法進行多次執行

dbcc checkdb(zmsoftpos_cs,REPAIR_REBUILD)

備註:資料庫名稱根據客戶使用的資料庫進行更改。此語法可以多次執行,也需要多次執行,每執行完一次拖到顯示框內的最後面如果“發現的是0個分配錯誤與O個一致性錯誤”就不用再修復了,只需執行下面語法即可

Sp_dboption 'zmsoftpos_cs','single User','False'

備註:下面的語法也不需執行了。

如果執行多次之後:“CHECKDB 發現了 N個分配錯誤和N個一致性錯誤”不會再次減少時,表示此語法修復不成功,需要進行下面的修復過程。

  1. 再把下面語法拷進入,進行多次執行:

dbcc checkdb ('zmsoftpos_cs',REPAIR_allow_data_loss)

備註:此語法的執行與上面“ B ”點中執行的語法過程一樣,執行到此步驟百分之九十以上的資料庫都是可以修復的。如果執行到最後分配錯誤與一致性錯誤還不減少,那麼執行下面的”D”操作

  1. 拷入如下語法執行:

 exec sp_MSforeachtable'dbcc dbreindex(''?'')'

備註:執行此語法時,此時的“Master ”資料庫名稱一定要選擇修復的資料庫名稱,執行才會生效。執行完成之後,再使用“dbcc checkdb”語法再檢查一次,如果是“發現的是0個分配錯誤與O個一致性錯誤”表示修復成功,如果是:“CHECKDB發現了N個分配錯誤和N個一致性錯誤

表示此資料庫壞得很歷害,使用此方法已不能修復成功了。必面使用其他方法了。最後不管修復成不成功都要使用下面的語法結尾:

Sp_dboption 'zmsoftpos_cs','single User', 'False'

備註:把之前的單使用者模組解除掉

  1. 在上面的修復過程中不能解決的問題,再使用BCP命令語法進行修復

例:以超市版本為例,超市版本的資料庫名稱為:zmsoftpos_cs

A、開啟帳套管理新建一個相同的帳套,資料庫名稱就會是zmsoftpos_cs_01的帳套名稱,新建好之後,一定要使用後臺登入進去一次,再退出後臺。

B、開啟查詢分析器,選擇好帳套資料庫“zmsoftpos_cs”把下面的語法拷進入按F5執行:

select 'if EXISTS(SELECT * FROM zmsoftpos_cs_01..sysobjectsWHERE name = ' + char(39) + name + char(39) + ')'+char(13)+ 'delete from zmsoftpos_cs_01..'+name fromzmsoftpos_cs..sysobjects where type='U'and name not in('system_sheet_setup','system_mode_file','system_image') order by name

執行完成之後在下面的顯示框架內就會出現如下語法:

使用滑鼠左擊一下圖片中紅色圓圈內的按鈕,就會選中下面的語法,然後再到紅色圓圈內的按鈕上點滑鼠右鍵,點選另存為,就會出現如下對話:

其中的儲存型別一定要先選擇所有檔案,然後再到檔名處,填寫好如圖片中輸入的名稱,然後點儲存!

C、以上的語法另存為之後,再拷入以下的語法執行:

select 'bcp zmsoftpos_cs..'+name+' out f:\data\'+name+'.txt-c -S127.0.0.1 -Usa_ -P422426362227001' from zmsoftpos_cs..sysobjects wherextype='U'

and name not in('system_sheet_setup','system_mode_file','system_image') order by name

備註:以上的語法中有一個檔案存放路徑,“f:\data\”此路徑根據實際的情況建立,然後更改過來,再執行。執行之後,按照上面的方法,點選另存為如下圖:

其中的儲存型別也要先選擇所有檔案,然後再到檔名中填入如圖上的名稱:匯出資料.bat檔名,然後再點儲存,儲存的路徑一定要是上面語法中設定中資料夾的路徑。

D、此時再選擇超市版本的zmsoftpos_cs_01的帳套名稱,然後在左上角的檔案中開啟找到之前儲存的“刪除資料.sql”的檔案,把其中的

deletefrom全部替換成“truncate table”,然後再按F5執行。

E、把D點的語法執行完成之後,還是選擇zmsoftpos_cs.01帳套再執行以下的語法:

select 'bcp zmsoftpos_cs_01..'+name+' in f:\data\'+name+'.txt-c -S127.0.0.1 -Usa_ -P422426362227001'

from zmsoftpos_cs..sysobjects where xtype='U' and name not in('system_sheet_setup','system_mode_file','system_image') order by name

其中的路徑f:\data\一定要與“C”點中的路徑一致。按F5執行之後,按照C點的步驟,把顯示框內的語法另存為“匯入資料.bat”的檔名,儲存到語法的路徑資料夾內。

F、以上的步驟操作完成之後,開啟以上語法存放的徑路,先雙擊匯出資料檔案,雙擊之後就會出現如下對話方塊架:

此介面表示,正在從原帳套裡面把資料匯出來,請您靜心等待,匯出完成之後此介面會自動關閉的。

等待完成之後,再雙擊”匯入資料.bat檔案,也會出現如上的介面。也請您靜心等待,匯出完成之後介面也會自動關閉。

G、以上的步驟都完成之後,請把zmsoftpos_cs_01的帳套,備份一次,然後把zmsoftpos_cszmsoftpos_cs_01兩個帳套都刪掉,然後新建超市版本的帳套,把恢復備份的zmsoftpos_cs_01檔案,此時您的資料庫修復的工作就大功告成了。。