SQL資料庫錶壞了的手動恢復方法

2021-08-25 01:13:34 字數 3361 閱讀 3236

今天接到客戶**,說運算元據無法儲存。經過分析,發現他的資料庫已經有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資料庫,證明客戶端沒有問題。問題...