今天接到客戶**,說運算元據無法儲存。經過分析,發現他的資料庫已經有5g多的大小,而最終發現有張表的索引出錯了,用dbcc check也無力回天。
每次用select * from ln003082 語句查詢,都報如下錯誤:
伺服器: 訊息 605,級別 21,狀態 1,行 1
試圖從資料庫 'ln_fl0125' 中提取的邏輯頁 (1:629904) 屬於物件 '869578136',而非物件 'ln003082'。
連線中斷
沒辦法,只能想辦法恢復了。還好有幾位老手在身邊。於是通如以下步驟勉強恢復有效資料,當然,有部份單子資料是丟失了。只能叫客戶再去補了。
首先要確定哪些資料回不來了,通過游標來一一確定哪些資料無效了。
declare @bill_no varchar(20)
declare @shop_no varchar(20)
declare @qty int
declare terminal_changecursor cursor for
select bill_no,shop_no from terminal_change
group by shop_no,bill_no
order by shop_no,bill_no
open terminal_changecursor
fetch next from terminal_changecursor into @bill_no ,@shop_no
while @@fetch_status = 0
begin
fetch next from terminal_changecursor into @bill_no ,@shop_no
print @bill_no +'-'+@shop_no
if not (
(@bill_no='mb10010033' and @shop_no = 'p9zt') or
(@bill_no='mt90910001' and @shop_no = 'p9zt') or
(@bill_no='mt00110002' and @shop_no = 'p10d') or
(@bill_no='mb10010034' and @shop_no = 'p9zt') or
(@bill_no='mb10010035' and @shop_no = 'p9zt')
)select @qty=sum(bill_qty) from ln003082 where bill_no=@bill_no and shop_no=@shop_no
endend
deallocate terminal_changecursor
go通過上面的語句,可以查到哪些單號的資料出了問題。用if跳過有問題的資料,當select sum通過游標查詢時,如果有問題的資料,就會停下來中斷,根據print出來的單號,將其加入下次if中,這個步驟很枯燥。不過一般不會出現過多丟失的資料,也只能這樣一一確定了。
接下來就是根據查詢出來有問題的資料,進行過濾恢復了。
恢復方法指令碼如下:
主要有3步。
--說明:終端變動資料表壞了,丟失五張資料,請通知重傳
--1。重建表ln003082為ln003082_new,用於轉移有效資料
select * into ln003082_new from ln003082 where 1=2
gocreate index [ix_terminal_change_bill_no] on [dbo].[ln003082_new]([bill_no], [shop_no]) on [primary]
gocreate index [r_tc_goods_fk] on [dbo].[ln003082_new]([goods_no]) on [primary]
gocreate index [r_tc_shop_fk] on [dbo].[ln003082_new]([shop_no]) on [primary]
gocreate index [ix_terminal_change_valid_date] on [dbo].[ln003082_new]([valid_date]) on [primary]
gocreate index [ix_terminal_change] on [dbo].[ln003082_new]([acc_valid_date]) on [primary]
gocreate index [ix_terminal_change_inter_billno] on [dbo].[ln003082_new]([inter_billno], [shop_no]) on [primary]
go--2。將有效資料匯入ln003082_new
declare @bill_no varchar(20)
declare @shop_no varchar(20)
declare @qty int
declare terminal_changecursor cursor for
select bill_no,shop_no from terminal_change
group by shop_no,bill_no
order by shop_no,bill_no
open terminal_changecursor
fetch next from terminal_changecursor into @bill_no ,@shop_no
while @@fetch_status = 0
begin
fetch next from terminal_changecursor into @bill_no ,@shop_no
if not (
(@bill_no='mb10010033' and @shop_no = 'p9zt') or
(@bill_no='mt90910001' and @shop_no = 'p9zt') or
(@bill_no='mt00110002' and @shop_no = 'p10d') or
(@bill_no='mb10010034' and @shop_no = 'p9zt') or
(@bill_no='mb10010035' and @shop_no = 'p9zt')
)insert into ln003082_new select * from ln003082 where bill_no=@bill_no and shop_no=@shop_no
enddeallocate terminal_changecursor
go--3。將轉移好資料的表改名為ln003082
exec sp_rename 'ln003082','ln003082olderror'
exec sp_rename 'ln003082_new','ln003082'
**:
SQL資料庫錶壞了的手動恢復方法
今天接到客戶 說運算元據無法儲存。經過分析,發現他的資料庫已經有5g多的大小,而最終發現有張表的索引出錯了,用dbcc check也無力回天。每次用select from ln003082 語句查詢,都報如下錯誤 伺服器 訊息 605,級別 21,狀態 1,行 1 試圖從資料庫 ln fl0125 ...
SQL資料庫錶壞了的手動恢復方法
今天接到客戶 說運算元據無法儲存。經過分析,發現他的資料庫已經有5g多的大小,而最終發現有張表的索引出錯了,用dbcc check也無力回天。每次用select from ln003082 語句查詢,都報如下錯誤 伺服器 訊息 605,級別 21,狀態 1,行 1 試圖從資料庫 ln fl0125 ...
恢復SQL資料庫
復sql資料庫 近日,使用者打 請求技術支援,說素材採集資料庫連線不上,筆者在網管控制台啟動應用程式,發現確實如此,如圖1所示。圖1 錯誤資訊 筆者進行了簡單的測試 ping資料庫伺服器沒有問題,證明網路連線沒有問題 odbc連線也可以連線到資料庫伺服器的master資料庫,證明客戶端沒有問題。問題...