科脈等超市系統(tǒng)數(shù)據(jù)庫損壞常規(guī)修復方法數(shù)據(jù)庫損壞常規(guī)處理方法-sql server數(shù)據(jù)庫修復-刪除表中重復的數(shù)據(jù)
廣告:
一、數(shù)據(jù)庫為什么會損壞
在了解數(shù)據(jù)庫損壞之前,首先我們要了解一下SQL Server是如何將數(shù)據(jù)保存到數(shù)據(jù)文件(MDF、NDF等),無論數(shù)據(jù)更新還是插入,數(shù)據(jù)都需要首先在內(nèi)存中Buffer Pool駐留,然后通過CheckPoint和Lazy writer等過程將內(nèi)存中的數(shù)據(jù)再持久化到磁盤,所以在這個過程中,會受到很多方面的影響,比如:電壓不穩(wěn)定、突然斷電、溫度過高或過低、潮濕程度、非法關機、硬盤壞道等都有可能會造成數(shù)據(jù)庫損壞。
通過上述,我們不難看出數(shù)據(jù)庫損壞是會受到很多方面影響,無法完全避免數(shù)據(jù)庫損壞,因此為了把數(shù)據(jù)庫損失降到最低,建議勤做數(shù)據(jù)備份。如果遇到數(shù)據(jù)庫損壞,我們應當如何處理?
二、數(shù)據(jù)庫損壞常規(guī)修復方法
溫馨提示:修復數(shù)據(jù)庫前,請做好數(shù)據(jù)備份,因為在修復數(shù)據(jù)庫過程中可能會造成數(shù)據(jù)丟失或者修復不了,如經(jīng)過常規(guī)修復后還有問題,
數(shù)據(jù)庫損壞常規(guī)修復方法可分別為:一致性錯誤修復和數(shù)據(jù)庫置疑修復,以下修復數(shù)據(jù)庫名稱都假設以kmjxc為準,(如庫名不是kmjxc請更改對應的庫名)
2.1、SQL2000數(shù)據(jù)庫置疑修復必要條件
1.原庫的MDF數(shù)據(jù)文件必須是完好的
2.1.1、修復步驟1:前期準備
停止SQL數(shù)據(jù)庫服務,將置疑數(shù)據(jù)庫的MDF文件和LDF文件復制備份一份(復制到其他路徑);
啟動SQL數(shù)據(jù)庫服務,進入SQL企業(yè)管理器,在左側數(shù)據(jù)庫里面找到置疑的庫,右鍵刪除。
2.1.2、修復步驟2:倉庫科脈空庫
使用御商安裝包DB_setup 文件夾中的db_setup.exe程序,創(chuàng)建一個空庫,空庫的名稱與原庫一致;
將上一步中備份的置疑數(shù)據(jù)庫的MDF文件復制過來覆蓋現(xiàn)創(chuàng)建的空庫。
2.1.3、修復步驟3:把數(shù)據(jù)庫設置為緊急模式
打開SQL查詢分析器,選到master數(shù)據(jù)庫,輸入以下語句執(zhí)行(一條一條執(zhí)行)
sp_configure 'allow',1
reconfigure with override
update sysdatabases set status=32768 where name = 'kmjxc'
2.1.4、修復步驟4:重建數(shù)據(jù)庫日志文件
D:\MSSQL$PROD\Data\ 為存放數(shù)據(jù)庫文件的路徑
KMJXC_log2.ldf 為一個新的不存在的文件,在執(zhí)行以下語句時將自動建立
dbcc rebuild_log('kmjxc','D:\MSSQL$PROD\Data\KMJXC_log2.ldf')
2.1.5、修復步驟5:取消數(shù)據(jù)庫緊急模式
打開SQL查詢分析器,選到master數(shù)據(jù)庫,輸入以下語句執(zhí)行(一條一條執(zhí)行)
update sysdatabases set status=0 where name = 'kmjxc'
restore database kmjxc with recovery
sp_configure 'allow',0
reconfigure with override
2.1.6、修復步驟6:重啟SQL服務
以上操作完成后,打開服務管理器(要在開始菜單中找到或右下角的狀態(tài)欄中找到),將SQL Server服務停止,再啟動。到此,置疑修復完成,可到企業(yè)管理器中查看數(shù)據(jù)庫是否正常。
2.2、SQL2005\2008數(shù)據(jù)庫置疑修復
2.2.1、修復步驟1:設置數(shù)據(jù)庫為緊急模式
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go
alter database 置疑數(shù)據(jù)庫名 set emergency
go
2.2.2、 修復步驟2:設置單用戶模式
alter database置疑數(shù)據(jù)庫名set single_user
2.2.3、 修復步驟3:建數(shù)據(jù)庫日志文件
dbcc checkdb('置疑數(shù)據(jù)庫名',REPAIR_ALLOW_DATA_LOSS)
2.2.4、修復步驟4:取消單用戶模式
alter database置疑數(shù)據(jù)庫名set multi_user
2.2.5、修復步驟5:取消數(shù)據(jù)庫緊急模式
alter database 置疑數(shù)據(jù)庫名set online
三、 數(shù)據(jù)庫一致性錯誤修復
修復數(shù)據(jù)庫名稱都假設以kmjxc為準,(如庫名不是kmjxc請更改對應的庫名)
修復步驟1:檢測數(shù)據(jù)庫
打開SQL查詢分析器,選擇需要檢測的數(shù)據(jù)庫,執(zhí)行dbcc checkdb語句可以檢測數(shù)據(jù)庫是否有分配性和一致性錯誤
修復步驟2:設置數(shù)據(jù)庫為單用戶
如在檢測出有分配性和一致性錯誤,證明數(shù)據(jù)庫已損壞,需要將數(shù)據(jù)庫設置為單用戶才能進行數(shù)據(jù)庫的修復,使用以下語句設置數(shù)據(jù)庫為單用戶
EXEC sp_dboption ' kmjxc ', 'single user', 'TRUE'
修復步驟3:修復數(shù)據(jù)庫、數(shù)據(jù)庫索引
使用以下語句進行數(shù)據(jù)庫修復,先執(zhí)行修復數(shù)據(jù)庫,再執(zhí)行修復數(shù)據(jù)庫索引,這兩個可交替重復執(zhí)行。
dbcc checkdb ('kmjxc',repair_allow_data_loss) -- 修復數(shù)據(jù)庫
dbcc checkdb ('kmjxc',REPAIR_REBUILD) -- 修復數(shù)據(jù)庫索引
修復步驟4:查詢錯誤ID的表名
在修復數(shù)據(jù)庫的過程中,如果有出現(xiàn)個別錯誤是某個表損壞,會有提示表ID,可使用以下語句查詢這個ID是哪張表,再針對這張表進行修復。
SELECT * FROM sysobjects where id = ‘此處填入表ID’ --查詢錯誤ID的表名
修復步驟5:修復表、表索引
使用以下語句進行數(shù)據(jù)庫修復,先執(zhí)行修復表,再執(zhí)行修復表索引,這兩個可交替重復執(zhí)行。
dbcc checktable ('此處填入表名',repair_allow_data_loss) -- 修復表
dbcc checktable ('此處填入表名',REPAIR_REBUILD) -- 修復表索引
修復步驟6:設置數(shù)據(jù)庫為多用戶
修復完成后,需要將數(shù)據(jù)庫設置成多用戶模式
EXEC sp_dboption 'kmjxc', 'single user', 'false'
修復步驟7:發(fā)生鍵次錯誤,索引重復的處理方法
以pos_t_saleflow_pre表為例在SQL查詢分析器的左側,找到pos_t_saleflow_pre表,展開,在約束中找到以PK開頭的主鍵約束,右鍵 – 在新窗口中編寫對象腳本為 – 創(chuàng)建,將創(chuàng)建出來的腳本保存作個備份,記住腳本中是以哪個字段為主鍵(以下語句中會使用到,因語句中以主鍵分組來查詢是否有重復),然后再右鍵刪除此主鍵約束,再使用以下語句查詢是否有重復值,如果有,則刪除。刪除重復值后,再用備份的腳本重新創(chuàng)建主鍵。
--查詢是否存在重復的數(shù)據(jù)
dbcc checktable('pos_t_saleflow_pre')
select flow_no, flow_id
from pos_t_saleflow_pre
group by flow_no, flow_id
having count(1) > 1
--刪除表中重復的數(shù)據(jù)
while exists(select flow_no, flow_id
from pos_t_payflow_pre
group by flow_no, flow_id
having count(1) > 1)
begin
set rowcount 1
delete a
from pos_t_payflow_pre a
inner join (select flow_no, flow_id
from pos_t_payflow_pre
group by flow_no, flow_id
having count(1) > 1) b on a.flow_no = b.flow_no and a.flow_id = b.flow_id
set rowcount 0
end
四、小結
此文檔闡述了數(shù)據(jù)庫損壞的概念、及數(shù)據(jù)庫常規(guī)的修復操作步驟。如按數(shù)據(jù)庫常規(guī)修復步驟無法修復,請聯(lián)系第三方專業(yè)修復公司。
數(shù)據(jù)庫問題修復聯(lián)系電話:13631399978(微信同號)
廣告: