[sql server] 從日誌中還原的資料

來源:互聯網
上載者:User

資料一(鄒建)

 

--建立測試資料庫
CREATE   DATABASE   Db
GO

--對資料庫進行備份
BACKUP   DATABASE   Db   TO   DISK= 'c:/db.bak '   WITH   FORMAT
GO

--建立測試表
CREATE   TABLE   Db.dbo.TB_test(ID   int)

--延時1秒鐘,再進行後面的操作(這是由於SQL   Server的時間精度最大為百分之三秒,不延時的話,可能會導致還原到時間點的操作失敗)
WAITFOR   DELAY   '00:00:01 '
GO

--假設我們現在誤操作刪除了   Db.dbo.TB_test   這個表
DROP   TABLE   Db.dbo.TB_test

--儲存刪除表的時間
SELECT   dt=GETDATE()   INTO   #
GO

--在刪除操作後,發現不應該刪除表   Db.dbo.TB_test

--下面示範了如何恢複這個誤刪除的表   Db.dbo.TB_test

--首先,備份交易記錄(使用交易記錄才能還原到指定的時間點)
BACKUP   LOG   Db   TO   DISK= 'c:/db_log.bak '   WITH   FORMAT
GO

--接下來,我們要先還原完全備份(還原日誌必須在還原完全備份的基礎上進行)
RESTORE   DATABASE   Db   FROM   DISK= 'c:/db.bak '   WITH   REPLACE,NORECOVERY
GO

--將交易記錄還原到刪除操作前(這裡的時間對應上面的刪除時間,並比刪除時間略早
DECLARE   @dt   datetime
SELECT   @dt=DATEADD(ms,-20,dt)   FROM   #     --擷取比表被刪除的時間略早的時間
RESTORE   LOG   Db   FROM   DISK= 'c:/db_log.bak '   WITH   RECOVERY,STOPAT=@dt
GO

--查詢一下,看錶是否恢複
SELECT   *   FROM   Db.dbo.TB_test

/*--結果:
ID                    
-----------  

(所影響的行數為   0   行)
--*/

--測試成功
GO

--最後刪除我們做的測試環境
DROP   DATABASE   Db
DROP   TABLE   #

 

 

資料二(htl)

 

SQL交易記錄還原執行個體 收藏
USE master
GO
-- 建立測試資料庫
CREATE DATABASE db_test GO

-- 對資料庫進行備份
BACKUP DATABASE db_test
TO DISK = 'c:/db_test.bak'
WITH FORMAT
GO

-- 建立測試表
CREATE TABLE db_test.dbo.tb_test(
    ID int)

-- 延時 1 秒鐘,再進行後面的操作(這是由於SQL Server的時間精度最大為百分之三秒,不延時的話,可能會導致還原到時間點的操作失敗)
WAITFOR DELAY '00:00:01'
GO

-- 假設我們現在誤操作刪除了 db_test.dbo.tb_test 這個表
DROP TABLE db_test.dbo.tb_test
GO

--在刪除操作後,發現不應該刪除表 db_test.dbo.tb_test

--下面示範了如何恢複這個誤刪除的表 db_test.dbo.tb_test

--首先,備份交易記錄(使用交易記錄才能還原到指定的時間點)
BACKUP LOG db_test
TO DISK = 'c:/db_test_log.bak'
WITH FORMAT
GO

-- 擷取可嘗試的時間範圍
IF OBJECT_ID(N'tempdb..#') IS NOT NULL
    DROP TABLE #
CREATE TABLE #(
    BackupName nvarchar(128) ,
    BackupDescription nvarchar(255) ,
    BackupType smallint ,
    ExpirationDate datetime ,
    Compressed tinyint ,
    Position smallint ,
    DeviceType tinyint ,
    UserName nvarchar(128) ,
    ServerName nvarchar(128) ,
    DatabaseName nvarchar(128) ,
    DatabaseVersion int ,
    DatabaseCreationDate datetime ,
    BackupSize numeric(20,0) ,
    FirstLSN numeric(25,0) ,
    LastLSN numeric(25,0) ,
    CheckpointLSN numeric(25,0) ,
    DatabaseBackupLSN numeric(25,0) ,
    BackupStartDate datetime ,
    BackupFinishDate datetime ,
    SortOrder smallint ,
    CodePage smallint ,
    UnicodeLocaleId int ,
    UnicodeComparisonStyle int ,
    CompatibilityLevel tinyint ,
    SoftwareVendorId int ,
    SoftwareVersionMajor int ,
    SoftwareVersionMinor int ,
    SoftwareVersionBuild int ,
    MachineName nvarchar(128) ,
    Flags int ,
    BindingID uniqueidentifier ,
    RecoveryForkID uniqueidentifier ,
    Collation nvarchar(128) ,
    FamilyGUID uniqueidentifier ,
    HasBulkLoggedData bit ,
    IsSnapshot bit ,
    IsReadOnly bit ,
    IsSingleUser bit ,
    HasBackupChecksums bit ,
    IsDamaged bit ,
    BeginsLogChain bit ,
    HasIncompleteMetaData bit ,
    IsForceOffline bit ,
    IsCopyOnly bit ,
    FirstRecoveryForkID uniqueidentifier ,
    ForkPointLSN numeric(25,0) NULL,
    RecoveryModel nvarchar(60) ,
    DifferentialBaseLSN numeric(25,0) NULL,
    DifferentialBaseGUID uniqueidentifier ,
    BackupTypeDescription nvarchar(60) ,
    BackupSetGUID uniqueidentifier NULL
)
INSERT # EXEC(N'
RESTORE HEADERONLY
FROM DISK = ''c:/db_test.bak''
WITH FILE = 1
RESTORE HEADERONLY
FROM DISK = ''c:/db_test_log.bak''
WITH FILE = 1
')
--SELECT
--    *
--FROM #

-- 定義嘗試的時間範圍,以及嘗試時間點的間隔
DECLARE
    @start_date datetime,
    @stop_date datetime,
    @try_step_millsecond int,
    @msg nvarchar(1000)
SELECT
    @start_date = MIN(BackupFinishDate),  -- 嘗試尋找誤刪除資料的開始時間
    @stop_date = MAX(BackupFinishDate),   -- 嘗試尋找誤刪除資料的結束時間
    @try_step_millsecond = 500            -- 每 500 毫秒為一個時間點找一次資料
FROM #

-- 還原完全備份
RESTORE DATABASE db_test
FROM DISK = 'c:/db_test.bak'
WITH REPLACE,
    NORECOVERY

-- 還原記錄備份到各點,以尋找出所需資料
WHILE @start_date < @stop_date
BEGIN
    SELECT
        @start_date = DATEADD(ms, @try_step_millsecond, @start_date),
        @msg = N'嘗試時間點: ' + CONVERT(varchar(50), @start_date, 121)

    RAISERROR(@msg, 10, 1) WITH NOWAIT
    BEGIN TRY
        -- 還原日誌到指定的點,並通過 STANDBY 使資料庫能唯讀訪問
        RESTORE LOG db_test
        FROM DISK = 'c:/db_test_log.bak'
        WITH STOPAT = @start_date,
            STANDBY = 'c:/db_test_redo.bak'

        -- 檢查需要的資料是否存在
        IF OBJECT_ID(N'db_test.dbo.tb_test') IS NOT NULL
        BEGIN
            -- 顯示還原的時間點
            SELECT Restoreto = @start_date
            -- 完成資料庫還原,使資料庫可讀寫
            RESTORE LOG db_test
            WITH RECOVERY

            SELECT
                @start_date = @stop_date
        END
    END TRY
    BEGIN CATCH
    END CATCH
END
GO

--最後刪除測試環境
DROP DATABASE db_test
DROP TABLE #

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/htl258/archive/2009/04/03/4041741.aspx

 

資料三(dawugui)

 

/*
標題:Log Explorer for SQL Server v4.0.2的和使用說明
作者:愛新覺羅·毓華
時間:2008-07-14
地點:新疆烏魯木齊
資料來源:http://topic.csdn.net/u/20090305/00/849723bf-74ad-495f-8fc6-22d2108beb10.html?seed=1633183628
*/

1、Lumigent Log Explorer for SQL Server v4.0.2 特別版
   http://down.chinaz.com/soft/7887.htm
   Log Explorer for SQL Server 4.2 註冊碼
   wv5rc-uxvpz-e33-nr4694qs2

2、Log Explorer for SQL Server v4.0.2
   安裝完畢後,註冊該程式(壓縮檔有註冊機)
   開啟log explorer file=>attach log file->選擇伺服器和登陸方式->connect->
   選擇資料庫->attach->左面對話方塊中browse->view log->就可以看到log記錄了
   點擊“View DDL Commands”裡面就有很多drop table 命令
   點擊下面的“undo”按鈕是產生表結構的語句(create table ....)
   點擊下面的“Salvage”按鈕是產生插入語句的(insert into ...values....)
   想恢複的話: 右鍵log記錄 undo transation->選擇儲存檔案名稱和路徑->然後開啟該檔案到查詢分析器裡執行T-sql代碼就可以了

   例如 如果log是delete table where ...的話,產生的檔案代碼就是insert table ....

   log explorer使用的幾個問題
   1)、對資料庫做了完全、差異和記錄備份
       備份時選用了刪除交易記錄中不活動的條目
       再用Log explorer打試圖看日誌時
       提示No log recorders found that match the filter,would you like to view unfiltered data
       選擇yes,就看不到剛才的記錄了
       如果不選用了刪除交易記錄中不活動的條目
       再用Log explorer打試圖看日誌時,就能看到原來的日誌
   2)、修改了其中一個表中的部分資料,此時用Log explorer看日誌,可以作日誌恢複
   3)、然後恢複備份,(注意:恢複是斷開log explorer與資料庫的串連,或串連到其他資料上,
       否則會出現資料庫正在使用無法恢複)
       恢複完後,再開啟log explorer 提示No log recorders found that match the filter,would you like to view unfiltered data
       選擇yes,就看不到剛才在2中修改的日誌記錄,所以無法做恢複.
   4)、不要用SQL的備份功能備份,搞不好你的日誌就破壞了.
       正確的備份方法是:
       停止SQL服務,複製資料檔案及記錄檔進行檔案備份.
       然後啟動SQL服務,用log explorer恢複資料
   5)、如果你的資料庫的日誌恢複模型是simple,那就不可能用log explorer恢複
   6)、Log explorer必須安裝在要恢複資料庫的sql server伺服器上,或者在sql server伺服器上安裝服務端,在操作的電腦上安裝用戶端進行資料恢複

3、如果資料量比較大的話,使用磁帶機和叢集的話,安裝了正版的VERITAS ,恢複資料是比較好的方法。
   下面是該軟體重要的新功能:
   1)、災難恢複演習(Disaster Recovery Fire Drill)--能夠自由測試、規劃和檢驗災難恢複計劃,而不會中斷生產過程。
   2)、叢集模擬器(Cluster Simulator)--可測試應用程式中斷切換方案,以驗證應用的可用性,確認應用是否根據計劃的故障切換策略和應用需求,遷移到最適當的伺服器。
   3)、全域叢集選件(Global Cluster Option)--當可用性要求從本地遷移到廣域災難恢複時,能夠快速、輕鬆地升級到任何體繫結構。
   4)、即時訪問複製資料--在複製資料的同時,能夠即時訪問資料,只佔用客戶的部分可用儲存容量。
   5)、卷複製顧問工具(Volume Replicator Advisor)--準確地分析頻寬需求,確保應用得到最佳化。

4、幾點恢複資料心得:
   1)、平時需要做好雙機熱備份,日備份,月備份,年備份,資料複製,異常記錄等工作,在資料丟失的情況下才能做到心中不急。
   2)、如果硬碟損害錯誤,或者誤刪除資料庫的時候,可以考慮用Easyrecovery或者Recover4all等軟體恢複刪除或者受到損害的檔案,再恢複資料。
   3)、如果實在遇到自然因素,網路又斷開了複製操作的情況下,建議只有手工"造取"一批資料出來彌補遺失資料,一般選取類似緯度(如時間、地區等)的資料。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.