Sql-Server

SQL Server 上的備份和還原(遷移)中缺少表

  • January 23, 2022

我正在嘗試將工作中的 SQL Server 實例上的小型數據庫的結構和內容複製到我家用電腦上的實例中。看起來這應該是一個簡單的兩分鐘操作,但是當我按照手冊上說的去做時,實際上九個表中只有四個在我的家用電腦上得到了恢復。至於為什麼其他五張桌子被排除在外,沒有明顯的韻律或理由。這是一個入門數據庫項目,暫時沒有什麼花哨的東西——只有九個簡單的表,甚至還沒有應用任何約束或觸發器。

我不是經驗豐富的 DBA。我想我以前做過這件事沒有發生任何事故,但我不記得了。這種事情不是我的正常工作。是否有我可能犯的任何新手錯誤——我需要覆蓋任何荒謬的預設 SSMS 設置以使所有 DBA 任務中最基本的任務真正工作?

這可能是發生了什麼(這是一個很常見的情況,所以不要氣餒):

  1. 您在某個時間點備份了數據庫(例如TO DISK = '\\somelocation\file.bak'
  2. 您對數據庫進行了更改
  3. 您再次備份數據庫(相同'\\somelocation\file.bak'
  4. 您從該文件恢復了備份,其中包含多個備份,但沒有指定您想要的備份。

您可以通過執行以下命令進行驗證:

RESTORE HEADERONLY FROM DISK = N'<location>\<filename>.bak';

如果我的猜測是正確的,這將返回多行。最高的一個Position是(通常)最近的備份。預設情況下恢復的那個(如果你沒有指定你想要的那個)是Position = 1的備份。沒有什麼會警告您您沒有服用最新的。

如果要繼續嘗試從此備份恢復,則需要添加WITH FILE = <highest position in the above output>到 restore 命令。檢查輸出的所有行並驗證BackupStartDate以確保您選擇了最新的備份。

(我有點希望這個論點是Position = ,並且有一個神奇的關鍵字來表示“採取最新的,愚蠢的。”)

但我建議只對新文件名進行新備份,並可能丟棄現有文件名(如果您只對最近的備份感興趣,這可能比需要的大得多)。

如果您想隨著時間的推移保留多個備份副本,請在文件名中使用時間戳進行備份。然後你就有了單獨的文件,你可以立即準確地關聯每個文件的拍攝時間。

如果要完全覆蓋舊備份,則將其WITH INIT用作備份語句的一部分。我建議您使用新文件名進行新備份,使用WITH INIT,然後嘗試恢復該備份。

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