Sql-Server

當我們恢復和恢復數據庫時?

  • January 9, 2021

恢復涉及將備份文件從輔助儲存(備份媒體)複製到磁碟。可以這樣做以替換損壞的文件或將數據庫複製/移動到新位置。

恢復是將重做日誌應用到數據庫以將其前滾的過程。可以前滾到特定時間點(災難發生之前),或者前滾到日誌文件中記錄的最後一個事務。

問題:為什麼將數據庫複製/移動到新位置是還原而不是恢復?

因為,正如還原和恢復概述文件所說:

恢復是 SQL Server 用於每個數據庫以事務一致(或乾淨)狀態啟動的過程。

恢復過程負責使一致的數據庫重新聯機,並且不必移動或從備份中恢復數據庫以執行該操作(崩潰的數據庫將在重新聯機之前觸發恢復)。恢復備份後,應進行恢復以保證數據庫的一致性。恢復和恢復密切相關。


如果您的桌面(或可以重新啟動的實驗室環境)中有 SQL Server,請執行以下步驟:

恢復:

  1. 重啟 SQL Server 服務;
  2. 連接到 SQL Server 並檢查 SQL Server 日誌Management > SQL Server Logs
  3. 在目前日誌中,查找如下消息:

恢復完成。這只是一條資訊性消息。無需使用者操作。

  1. 您沒有對備份進行任何還原,但由於 SQL Server 在使數據庫聯機之前執行了此操作,因此剛剛發生了恢復。

恢復:

  1. C:\BackupSQL在安裝了 SQL Server 的電腦上創建一個文件夾;
  2. 連接到 SQL Server 並執行以下命令:
EXEC sp_cycle_errorlog; --this will help you better see the relevant information for your question 

CREATE DATABASE Lab;

BACKUP DATABASE Lab TO DISK = 'C:\BackupSQL\Lab.bak';
BACKUP LOG Lab TO DISK = 'C:\BackupSQL\Lab.trn';

DROP DATABASE Lab;

RESTORE DATABASE Lab FROM DISK = 'C:\BackupSQL\Lab.bak' WITH NORECOVERY;
  1. 檢查目前日誌以查看如下消息:

數據庫“實驗室”標記為正在恢復,並且處於不允許執行恢復的狀態。

為具有工作池大小的數據庫“實驗室”啟動並行重做

$$ 4 $$.

1 個事務在數據庫“實驗室”(5:0) 中前滾。這只是一條資訊性消息。無需使用者操作。

0 個事務在數據庫“實驗室”(5:0) 中回滾。這只是一條資訊性消息。無需使用者操作。

數據庫“實驗室”上的還原已完成。數據庫現在可用。

  1. 如您所見,您發出了一個RESTORE並且 SQL Server 執行了還原恢復過程,以保證在您的請求結束時數據庫一致。

一致性:

想像一下,你欠我 500.00 美元,你要把錢從你的銀行賬戶轉到我的賬戶:

  1. 連接到 SQL Server 執行以下命令:USE Lab;
CREATE TABLE BankAccount(userName varchar(50), myMoney money);

INSERT INTO BankAccount(userName, myMoney)
VALUES ('Ronaldo', 1000.00), ('learn9909', 1000.00);

SELECT userName, myMoney FROM BankAccount;
  1. 如您所見,我們每個人都有U$$ 1000.00;
  2. 執行命令轉移資金:
BEGIN TRAN
   UPDATE BankAccount SET myMoney = myMoney - 500.00 WHERE userName = 'learn9909';
   WAITFOR DELAY '02:00'; --it waits for 2 hours before proceding
   UPDATE BankAccount SET myMoney = myMoney + 500.00 WHERE userName = 'Ronaldo';
COMMIT
  1. 在 Management Studio 上打開另一個選項卡並執行以下查詢:
SELECT userName, myMoney FROM BankAccount WITH (NOLOCK);
  1. 您可以看到 U$$ 500.00 從您的帳戶中減少了,但尚未添加到我的帳戶中;
  2. 現在讓我們通過突然結束 SQL Server 服務來導致數據庫崩潰:start menu > run > taskmgr. 查找名為SQL Server Windows NT之類的程序並結束它;
  3. 該事務在中間被中斷,當 SQL Server 服務再次可用時,它不會完成。如果它一直這樣,你就有大麻煩了,因為你

$$ 500.00 was taken from your account and you still owe me U $$500.00,我可以用我的銀行對賬單證明。為了避免這種不一致,SQL Server 在使數據庫聯機之前執行恢復過程。 8. 要再次啟動 SQL Server 服務並檢查我們的銀行帳戶start menu > run > services.msc,請查找 SQL Server 服務並啟動它; 9. 再次查詢該表,恢復過程完成了它的工作並將數據庫置於該半事務已撤消的一致狀態中,這讓您鬆了一口氣:

SELECT userName, myMoney FROM BankAccount;
  1. 您可以再次檢查 SQL Server 日誌並查看該過程,但再一次,沒有恢復備份,只發生了一個恢復過程。

引用自:https://dba.stackexchange.com/questions/282324