SQLServer恢復表級資料

2021-09-22 20:45:46 字數 2465 閱讀 6128

原文:

sqlserver恢復表級資料

最近幾天,公司的技術維護人員頻繁讓我恢復資料庫,因為他們總是少了where條件,導致update、delete出現了無法恢復的後果,加上那些庫都是幾十g。恢復起來少說也要十幾分鐘。為此,找了一些資料和工作總結,給出一下幾個方法,用於快速恢復表,而不是庫,但是切記,防範總比亡羊補牢好。

在生產環境或者開發環境,往往都有某些非常重要的表。這些表存放了核心資料。當這些表出現資料損壞時,需要盡快還原。但是,正式環境的資料庫往往都是非常大的,統計資料表明,1t的資料庫還原時間接近24小時,所以因為乙個表而還原乙個庫,不單空間,甚至時間上都是乙個很大的挑戰。本文介紹如何恢復單錶,而不需要恢復整個庫。

現在假設乙個表:test_table。我們需要盡快恢復這個表,並且把恢復過程中對其他表和使用者的影響降到最低。

sqlserver(特別是2008以後),具有很多備份及恢復功能:完整、部分、檔案、差異和事務備份。而恢復模式的選擇嚴重影響備份策略和備份型別。

這對於小資料庫來說不失為一種好的辦法,用備份還原乙個新的庫,並把新庫中的表資料同步回去。你可以做完整恢復,或者時間點恢復。但是對於大資料庫,是非常耗時和耗費磁碟空間的。這個方法僅僅用於還原資料,在還原資料(就是同步資料)的時候,你

要考慮觸發器、外來鍵等因素。

你可能想恢復最近的資料庫備份,並回滾到某個時間點,即發生意外前的某個時刻。此時可以使用stopat子句,但是前提是必須為完整或大容量日誌恢復模式。下面是例子:

restore database 需要恢復的資料庫

from 資料庫備份

with file=3, norecovery ;

restore log需要恢復的資料庫

from資料庫備份

with file=4, norecovery, stopat = 'oct 22, 2012 02:00 am' ;

restore database 需要恢復的資料庫 with recovery ;

注意:這種方法的主要缺點是會覆蓋掉從stopat指定時間點之後所修改的所有資料。所以要衡量好得失。

建立資料庫快照。當發生意外時,可以從快照中直接獲取原來的資料。但是

必須是在發生意外之前建立的快照。這在核心表不經常更新,特別是有規律更新時很有用。但是當表經常、不定期被更新,或者很多使用者在訪問時,這種方法就不可取了。當需要使用這種方法時,記得在每次更新前先建立快照。

你可以建立乙個新的資料庫,並把test_table移動到這個庫裡面。當你需要恢復的時候,你只需要恢復這個非常小的資料庫即可。訪問源資料庫的資料時,最簡單的方法就是建立乙個檢視,選擇test_table表中所有列的所有資料。但是注意這個方法需要在建立檢視前,重新命名或者刪除源資料庫的表:

use 需要恢復的資料庫 ;

gocreate view test_table

as select *

from 備份資料庫.架構名.test_table ;

go

使用這種方法,可以對檢視使用select /insert/update/delete語句,就像直接操作實體表似得。當test_table更改時,要使用sp_refreshview儲存過程來更新元資料。

和方案4類似,把表移到另外乙個資料庫,然後對源資料庫的這個表建立乙個同義詞:

use 需要恢復的資料庫 ;

gocreate synonym test_table

for 新資料庫.架構名.test_table ;

go

這個方法的有點就是你不需要擔心元資料更新所帶來的結構變更不及時。但是這個方法的問題就是不能在ddl語句中引用同義詞,或者不能在鏈結伺服器中找到。

你可以建立乙個作業,使用bcp定期匯出資料。但是這種方法的缺點和

方案1類似,需要找到哪天的檔案並導進去,同時要考慮觸發器和外來鍵問題。 方法

優點缺點

還原資料庫

快且容易

適用於小庫,且要注意觸發器和外來鍵等

還原日誌

能指定時間點

所有時間點後的新資料會被覆蓋

資料庫快照

當表不是經常更新時很有用

當表並行更新時,快照容易出現問題

檢視把錶的資料於庫分開,沒有資料丟失

元資料需要週期性更新,並要定期維護新資料庫

同義詞把錶的資料於庫分開,沒有資料丟失

在鏈結伺服器上不能用,並要定期維護新資料庫

bcp擁有表的專用備份

需要額外的空間、還會出現觸發器、外來鍵等問題

良好的程式設計習慣和良好的備份機制才是解決問題的根本,以上的措施都僅僅是乙個亡羊補牢的辦法。可能有人說sqlserver 新版本不是有部分還原嗎?我們來看看聯機叢書的說明:

可以看到,其他這種方法很難還原乙個表,但是當庫小的時候,倒可以試試。

sql server 資料恢復

1 備份當前資料庫的事務日誌 backup log 資料庫名 to disk n 備份檔案名 with norecovery 2 恢復乙個誤刪除之前的完全備份 restore database 資料庫名 from disk n 資料庫上一次完全備份的檔名 with norecovery,replac...

SQL Server頁級別的資料恢復

1.最近的完整備份 backup database dbname to disk n c test.bak 2.發現錯誤頁 可以人為破壞 select from msdb.dbo.suspect pages 3.立即備份日誌1 backup log dbname to disk c test log...

SQL SERVER 資料誤操作的恢復

事務日誌忠實地記錄了資料庫的活動,所以基於這些記錄的活動就可以隨心所欲地將資料庫的狀態恢復到特定的即時點或故障點。事務日誌備份只能與完整恢復和大容量日誌記錄恢復模型一起使用。在簡單模型下,事務日誌可能被破壞,所以事務日誌可能不連續,不連續的事務日誌備份沒有意義,因為基於日誌的恢復要求日誌是連續的。因...