2017計算機等考三級數(shù)據(jù)庫輔導(dǎo):SQLServer數(shù)據(jù)庫恢復(fù)

字號:


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