今天一不小心把sqlserver數(shù)據(jù)庫初始化了,在網(wǎng)上找了半天發(fā)現(xiàn)了幾篇帖子,受益非淺,記錄下:
DB2中可以使得數(shù)據(jù)庫回復(fù)到指定的時(shí)間點(diǎn),SQL Server數(shù)據(jù)庫的Recovery Model為full 或者Bulk copy的時(shí)候,是可以從日志來恢復(fù)數(shù)據(jù)庫的。實(shí)際上日志中記錄的一條一條的transact sql語句,恢復(fù)數(shù)據(jù)庫的時(shí)候會(huì)redo這些sql語句。 前提條件:myBBS是數(shù)據(jù)庫test中的一個(gè)表,數(shù)據(jù)庫test的Recovery Model為Full,Auto Close,Auto Shrink兩個(gè)選項(xiàng)未選中。數(shù)據(jù)庫test的data files和log files均為默認(rèn)的自動(dòng)增長狀態(tài)。
A:2004/10/13,16:00進(jìn)行數(shù)據(jù)庫備份,backup database test to disk='d:\db\1600.bak' with init
B:2004/10/14,13:00對數(shù)據(jù)庫進(jìn)行了update,delete等操作;
C:2004/10/15,18:00使用delete mybbs where id>300時(shí),語句誤寫成delete mybbs,因而刪除了表mybbs中的所有數(shù)據(jù)。
現(xiàn)在在C點(diǎn),C點(diǎn)對數(shù)據(jù)庫進(jìn)行了誤操作,我們希望數(shù)據(jù)庫能夠恢復(fù)到C之前的狀態(tài),比如恢復(fù)到10月15日17:59分的狀態(tài)。
要恢復(fù)數(shù)據(jù)庫B點(diǎn),使用的是A點(diǎn)備分的數(shù)據(jù)庫1600.bak;而使用的日志備分是最新的備分1820.logs;因而進(jìn)行如下操作:
--備分日志:
BACKUP LOG test TO DISK='d:\1820.logs' WITH INIT
--恢復(fù)數(shù)據(jù)庫1600.bak,使用WITH NORECOVERY參數(shù):
RESTORE DATABASE test from disk='d:\db\1640.bak' WITH NORECOVERY
--使用日志恢復(fù)數(shù)據(jù)庫到10月15日17:59分:
RESTORE LOG test FROM disk='d:\1820.logs' WITH RECOVERY,SAT='10/15/2004 17:59'
上面的三條Transact SQL語句的對應(yīng)過程:
1.恢復(fù)數(shù)據(jù)庫到A點(diǎn);
2.執(zhí)行A-B之間的log記錄,把數(shù)據(jù)庫恢復(fù)到B點(diǎn).
這樣就恢復(fù)數(shù)據(jù)庫到了指定的時(shí)間點(diǎn)。如果恢復(fù)不成功,可能的原因是:1.未使用正確的備分?jǐn)?shù)據(jù)庫;2.數(shù)據(jù)庫選項(xiàng)選中了Auto Shrink.
Server 2005 聯(lián)機(jī)叢書(2007 年 9 月)
執(zhí)行數(shù)據(jù)庫完整還原(完整恢復(fù)模式)
數(shù)據(jù)庫完整還原的目的是還原整個(gè)數(shù)據(jù)庫。整個(gè)數(shù)據(jù)庫在還原期間處于離線狀態(tài)。在數(shù)據(jù)庫的任何部分變?yōu)樵诰€之前,必須將所有數(shù)據(jù)恢復(fù)到同一點(diǎn),即數(shù)據(jù)庫的所有部分都處于同一時(shí)間點(diǎn)并且不存在未提交的事務(wù)。
在完整恢復(fù)模式下,數(shù)據(jù)庫可以還原到特定時(shí)間點(diǎn)。時(shí)間點(diǎn)可以是最新的可用備份、特定的日期和時(shí)間或者標(biāo)記的事務(wù)。
安全說明:
建議您不要從未知源或不可信源附加或還原數(shù)據(jù)庫。這些數(shù)據(jù)庫可能包含執(zhí)行非預(yù)期 Transact-SQL 代碼的惡意代碼,或通過修改架構(gòu)或物理數(shù)據(jù)庫結(jié)構(gòu)導(dǎo)致錯(cuò)誤。使用來自未知源或不可信源的數(shù)據(jù)庫前,請?jiān)诜巧a(chǎn)服務(wù)器上針對數(shù)據(jù)庫運(yùn)行 DBCC CHECKDB,然后檢查數(shù)據(jù)庫中的代碼,例如存儲(chǔ)過程或其他用戶定義代碼。
還原完整數(shù)據(jù)庫
通常,將數(shù)據(jù)庫恢復(fù)到故障點(diǎn)分為下列基本步驟:
備份活動(dòng)事務(wù)日志(稱為日志尾部)。此操作將創(chuàng)建尾日志備份。如果活動(dòng)事務(wù)日志不可用,則該日志部分的所有事務(wù)都將丟失。
限制條件三:要對某些列取別名,并保證列名的。
在表關(guān)聯(lián)查詢的時(shí)候,當(dāng)不同表的列名相同時(shí),只需要加上表的前綴即可。不需要對列另外進(jìn)行命名。但是,在創(chuàng)建視圖時(shí)就會(huì)出現(xiàn)問題,數(shù)據(jù)庫會(huì)提示“duplicate column name”的錯(cuò)誤提示,警告用戶有重復(fù)的列名。有時(shí)候,用戶利用Select語句連接多個(gè)來自不同表的列,若擁有相同的名字,則這個(gè)語句仍然可以執(zhí)行。但是,若把它復(fù)制到創(chuàng)建視圖的窗口,創(chuàng)建視圖時(shí),就會(huì)不成功。
查詢語句跟創(chuàng)建視圖的查詢語句還有很多類似的差異。如有時(shí)候,我們在查詢語句中,可能會(huì)比較頻繁的采用一些算術(shù)表達(dá)式;或者在查詢語句中使用函數(shù)等等。在查詢的時(shí)候,我們可以不給這個(gè)列“取名”。數(shù)據(jù)庫在查詢的時(shí)候,會(huì)自動(dòng)給其命名。但是,在創(chuàng)建視圖時(shí),數(shù)據(jù)庫系統(tǒng)就會(huì)給你出難題。系統(tǒng)會(huì)提醒你為列取別名。
從以上兩個(gè)例子中,我們可以看出,雖然視圖是對SQL語句的封裝,但是,兩者仍然有差異。創(chuàng)建視圖的查詢語句必須要遵守一定的限制。如要保證視圖的各個(gè)列名的;如果自阿視圖中某一列是一個(gè)算術(shù)表達(dá)式、函數(shù)或者常數(shù)的時(shí)候,要給其取名字,等等。
限制條件四:權(quán)限上的雙重限制。
為了保障基礎(chǔ)表數(shù)據(jù)的安全性,在視圖創(chuàng)建的時(shí)候,其權(quán)限控制比較嚴(yán)格。
一方面,若用戶需要?jiǎng)?chuàng)建視圖,則必須要有數(shù)據(jù)庫視圖創(chuàng)建的權(quán)限。這是視圖建立時(shí)必須遵循的一個(gè)基本條件。如有些數(shù)據(jù)庫管理員雖然具有表的創(chuàng)建、修改權(quán)限;但是,這并不表示這個(gè)數(shù)據(jù)庫管理員就有建立視圖的權(quán)限。恰恰相反,在大型數(shù)據(jù)庫設(shè)計(jì)中,往往會(huì)對數(shù)據(jù)庫管理員進(jìn)行分工。建立基礎(chǔ)表的就只管建立基礎(chǔ)表;負(fù)責(zé)創(chuàng)建視圖的就只有創(chuàng)建視圖的權(quán)限。
其次,在具有創(chuàng)建視圖權(quán)限的同時(shí),用戶還必須具有訪問對應(yīng)表的權(quán)限。如某個(gè)數(shù)據(jù)庫管理員,已經(jīng)有了創(chuàng)建視圖的權(quán)限。此時(shí),若其需要?jiǎng)?chuàng)建一張員工工資信息的視圖,還不一定會(huì)成功。這還要這個(gè)數(shù)據(jù)庫管理員有美譽(yù)跟工資信息相關(guān)的基礎(chǔ)表的訪問權(quán)限。如建立員工工資信息這張視圖一共涉及到五張表,則這個(gè)數(shù)據(jù)庫管理員就需要擁有者每張表的查詢權(quán)限。若沒有的話,則建立這張視圖就會(huì)以失敗告終。
第三,就是視圖權(quán)限的繼承問題。如上面的例子中,這個(gè)數(shù)據(jù)庫管理員不是基礎(chǔ)表的所有者。但是經(jīng)過所有者的授權(quán),他就可以對這個(gè)基礎(chǔ)表進(jìn)行訪問,就可以以此為基礎(chǔ)建立視圖。但是,這個(gè)數(shù)據(jù)庫管理員有沒有把對這個(gè)基礎(chǔ)表的訪問權(quán)限再授權(quán)給其他人呢?如他能否授權(quán)給A用戶訪問員工考勤信息表呢?答案是不一定。默認(rèn)情況下,數(shù)據(jù)庫管理員不能夠再對其他用戶進(jìn)行授權(quán)。但是,若基礎(chǔ)表的所有者,把這個(gè)權(quán)利給了數(shù)據(jù)庫管理員之后,則他就可以對用戶進(jìn)行重新授權(quán)。讓數(shù)據(jù)庫管理員可以給A用戶進(jìn)行授權(quán),讓其可以進(jìn)行相關(guān)的操作。
可見,視圖雖然靈活,安全,方便,但是其仍然有比較多的限制條件。根據(jù)筆者的經(jīng)驗(yàn),一般在報(bào)表、表單等等工作上,采用視圖會(huì)更加的合理。因?yàn)槠銼QL語句可以重復(fù)使用。而在基礎(chǔ)表更新上,包括紀(jì)錄的更改、刪除或者插入上,往往是直接對基礎(chǔ)表進(jìn)行更新。對于一些表的約束,可以通過觸發(fā)器、規(guī)則等等來實(shí)現(xiàn);甚至可以通過前臺(tái)SQL語句直接實(shí)現(xiàn)約束。作為數(shù)據(jù)庫管理員,要有這個(gè)能力,能夠判斷在什么時(shí)候使用視圖,什么時(shí)候直接調(diào)用基礎(chǔ)表。
重要提示:
在大容量日志恢復(fù)模式下,備份任何包含大容量日志操作的日志都需要訪問數(shù)據(jù)庫中的所有數(shù)據(jù)文件。如果無法訪問該數(shù)據(jù)文件,則不能備份事務(wù)日志。在這種情況下,您必須手動(dòng)重做自最近備份日志以來所做的所有更改。
有關(guān)詳細(xì)信息,請參閱尾日志備份。
還原最新完整數(shù)據(jù)庫備份而不恢復(fù)數(shù)據(jù)庫 (RESTORE DATABASE database_name FROM backup_device WITH NORECOVERY)。
如果存在差異備份,則還原最新的差異備份而不恢復(fù)數(shù)據(jù)庫 (RESTORE DATABASE database_name WITH NORECOVERY)。
從還原備份后創(chuàng)建的第一個(gè)事務(wù)日志備份開始,使用 NORECOVERY 依次還原日志。
恢復(fù)數(shù)據(jù)庫 (RESTORE DATABASE database_name WITH RECOVERY)。此步驟也可以與還原上一次日志備份結(jié)合使用。
數(shù)據(jù)庫完整還原通常可以恢復(fù)到日志備份中的某一時(shí)間點(diǎn)或標(biāo)記的事務(wù)。但是,在大容量日志恢復(fù)模式下,如果日志備份包含大容量更改,則不能進(jìn)行時(shí)點(diǎn)恢復(fù)。有關(guān)詳細(xì)信息,請參閱將數(shù)據(jù)庫還原到備份中的某個(gè)時(shí)間點(diǎn)。
還原整個(gè)數(shù)據(jù)庫時(shí),應(yīng)使用單一還原順序。下面的示例說明還原順序中用于將數(shù)據(jù)庫還原到故障點(diǎn)的數(shù)據(jù)庫完整還原方案的關(guān)鍵選項(xiàng)。還原順序由通過一個(gè)或多個(gè)還原階段來移動(dòng)數(shù)據(jù)的一個(gè)或多個(gè)還原操作組成。將省略與此目的不相關(guān)的語法和詳細(xì)信息。
數(shù)據(jù)庫將還原并前滾。數(shù)據(jù)庫差異用于減少前滾時(shí)間。此還原順序用于避免丟失工作;上次還原的備份為尾日志備份。
還原順序的基本 RESTORE 語法是:
RESTORE DATABASE database FROM full database backup WITH NORECOVERY;
RESTORE DATABASE database FROM full_differential_backup WITH NORECOVERY;
RESTORE LOG database FROM log_backup WITH NORECOVERY; 對于其他每個(gè)日志備份,重復(fù)此還原日志步驟。
RESTORE DATABASE database WITH RECOVERY;
對于以下示例,AdventureWorks 示例數(shù)據(jù)庫已設(shè)置為在數(shù)據(jù)庫備份之前使用完整恢復(fù)模式。此示例將創(chuàng)建 AdventureWorks 數(shù)據(jù)庫的尾日志備份。接下來,示例將還原較早的完整數(shù)據(jù)庫備份和日志備份,然后還原尾日志備份。示例將在最后的單獨(dú)步驟中恢復(fù)數(shù)據(jù)庫。
注意:
此示例使用在完整數(shù)據(jù)庫備份的“在完整恢復(fù)模式下使用數(shù)據(jù)庫備份”部分中創(chuàng)建的數(shù)據(jù)庫備份和日志備份。 此示例以 ALTER DATABASE 語句開頭,該語句將恢復(fù)模式設(shè)置為 FULL。復(fù)制代碼:
USE master; --Make sure the database is using the full recovery model.
ALTER DATABASE AdventureWorks SET RECOVERY FULL;
GO
--Create tail-log backup.
BACKUP LOG AdventureWorks TO DISK
= 'Z:\SQLServerBackups\AdventureWorks.bak''Z:
\SQLServerBackups\AdventureWorks.bak' WITH NORECOVERY;
GO --Restore the full database backup (from backup set 1).
RESTORE DATABASE AdventureWorks
FROM DISK = 'Z:\SQLServerBackups\AdventureWorks.bak'
WITH FILE=1,
NORECOVERY;
--Restore the regular log backup (from backup set 2).
RESTORE LOG AdventureWorks
FROM DISK = 'Z:\SQLServerBackups\AdventureWorks.bak'
WITH FILE=2,
NORECOVERY;
--Restore the tail-log backup (from backup set 3).
RESTORE LOG AdventureWorks
FROM DISK = 'Z:\SQLServerBackups\AdventureWorks.bak'
WITH FILE=3,
NORECOVERY;
GO --recover the database:
RESTORE DATABASE AdventureWorks
WITH RECOVERY;
GO
恢復(fù)到故障點(diǎn)
還原完整數(shù)據(jù)庫備份
sqlserver 還原到時(shí)間點(diǎn)
rs1_mainContentContainer_ctl25" |ctl00_rs1_mainContentContainer_ctl25',this);" >如何還原數(shù)據(jù)庫備份 (Transact-SQL)
如何還原數(shù)據(jù)庫備份 (SQL Server Management Studio)
如何通過現(xiàn)有的數(shù)據(jù)庫備份創(chuàng)建新的數(shù)據(jù)庫 (SQL Server Management Studio)
還原差異數(shù)據(jù)庫備份
如何還原差異數(shù)據(jù)庫備份 (Transact-SQL)
如何還原差異數(shù)據(jù)庫備份 (SQL Server Management Studio)
還原事務(wù)日志備份
還原數(shù)據(jù)備份之后,必須還原所有后續(xù)的事務(wù)日志備份,然后再恢復(fù)數(shù)據(jù)庫。
如何應(yīng)用事務(wù)日志備份 (Transact-SQL)
如何還原事務(wù)日志備份 (SQL Server Management Studio)
使用 SQL Server 管理對象 (SMO) 還原備份
SqlRestore
恢復(fù)到時(shí)間點(diǎn)
在完整恢復(fù)模式下,數(shù)據(jù)庫可以還原到日志備份內(nèi)的特定時(shí)間點(diǎn)。時(shí)間點(diǎn)可以是特定的日期和時(shí)間、標(biāo)記的事務(wù)或日志序列號(hào) (LSN)。有關(guān)詳細(xì)信息,請參閱將數(shù)據(jù)庫還原到備份中的某個(gè)時(shí)間點(diǎn)。
對 SQL Server 早期版本中備份的支持
在 SQL Server 2005 中,您可以還原使用 SQL Server 7.0 版、SQL Server 2000 或 SQL Server 2005 創(chuàng)建的數(shù)據(jù)庫備份。但是,SQL Server 2005 無法還原使用 SQL Server 7.0 或 SQL Server 2000 創(chuàng)建的 master、model 和 msdb 備份。此外,包含創(chuàng)建索引操作的 SQL Server 7.0 日志備份無法還原到 SQL Server 2000 或 SQL Server 2005。
SQL Server 2005 使用與 SQL Server 早期版本不同的默認(rèn)路徑。因此,若要從備份還原在 SQL Server 7.0 或 SQL Server 2000 的默認(rèn)位置中創(chuàng)建的數(shù)據(jù)庫,必須使用 MOVE 選項(xiàng)。有關(guān)新默認(rèn)路徑的信息,請參閱 SQL Server 2005 的默認(rèn)實(shí)例和命名實(shí)例的文件位置。
注意:
使用 SQL Server 6.5 或早期版本創(chuàng)建的數(shù)據(jù)庫備份采用的格式不兼容,無法在 SQL Server 2005 中還原。有關(guān)如何將使用 SQL Server 6.5 或早期版本創(chuàng)建的數(shù)據(jù)庫升級(jí)到 SQL Server 2005 的信息,請參閱從 SQL Server 6.5 或更早版本復(fù)制數(shù)據(jù)庫。