在 SQL Server 中如何還原多個資料庫 (3 種方法)
如何在 SQL Server 中一次還原多個資料庫?通常您可以使用高效的 T-SQL 指令碼,或嘗試一個具有較少限制的強大軟體。
你能同时恢复多个SQL数据库吗?
可惜的是,SSMS GUI只支持一次恢复一个数据库。如果你将多个数据库备份到多个bak文件中,你能同时恢复它们吗?
答案是肯定的。一般来说,你可以使用有效的T-SQL脚本一次性恢复多个数据库,但前提是备份文件的命名必须与对应的数据库完全一致,且没有额外的日期/时间等信息。
如果你希望更灵活地操作,还有一个简单的替代方法。只需选择你偏好的方式。
在SQL Server中恢复多个数据库的前提条件
在SQL Server中恢复多个数据库可能是一个复杂的过程。为了最小化停机时间,你必须在开始之前满足以下几个先决条件:
- 拥有管理权限,并能够访问备份文件。
- 每个备份文件中只能有一个数据库备份。
- 备份文件的数据库中仅能包含两个文件:日志文件和数据文件。
- 由于我们使用数据库名称来命名其物理文件在磁盘上的名称,因此所恢复的新数据库中的物理文件名允许使用的字符必须被允许。
方法1. 使用xp_cmdshell从bak文件恢复多个数据库
你可以使用一个脚本从文件夹中恢复SQL Server中的多个数据库。但在此之前,请连接到实例并且启用xp_cmdshell。
1. 点击新建查询,然后输入以下命令:
-- 允许更改高级选项。
EXEC sp_configure "show advanced options", 1;
GO
-- 更新当前配置的高级选项值。
RECONFIGURE;
GO
-- 启用该功能。
EXEC sp_configure "xp_cmdshell", 1;
GO
-- 更新当前配置的该功能值。
RECONFIGURE;
GO
执行该查询,该功能将被启用。
2. 您可以使用以下腳本恢復多個 SQL Server 數據庫(請將“D:\backup\”替換為您自己的包含所有備份文件的文件夾):
DECLARE @FilesCmdshell TABLE (
outputCmd NVARCHAR (255)
)
DECLARE @FilesCmdshellCursor CURSOR
DECLARE @FilesCmdshellOutputCmd AS NVARCHAR(255)
INSERT INTO @FilesCmdshell (outputCmd) EXEC master.sys.xp_cmdshell "dir /B D:\backup\*.bak"
SET @FilesCmdshellCursor = CURSOR FOR SELECT outputCmd FROM @FilesCmdshell
OPEN @FilesCmdshellCursor
FETCH NEXT FROM @FilesCmdshellCursor INTO @FilesCmdshellOutputCmd
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @cmd NVARCHAR(MAX) = "RESTORE DATABASE [" SUBSTRING(@FilesCmdshellOutputCmd, 0, CHARINDEX(".", @FilesCmdshellOutputCmd)) "] FROM DISK = N"'D:\backup\" SUBSTRING(@FilesCmdshellOutputCmd, 0, CHARINDEX(".", @FilesCmdshellOutputCmd)) ".bak"' WITH FILE = 1, NOUNLOAD, STATS = 10"
EXEC(@cmd)
FETCH NEXT FROM @FilesCmdshellCursor INTO @FilesCmdshellOutputCmd
END
✎注意:如果收到“數據庫的日誌文件尾端尚未被備份。如果其中包含您不想丟失的工作,請使用BACKUP LOG WITH NORECOVERY來備份日誌。使用RESTORE語句的WITH REPLACE或WITH STOPAT子句僅覆蓋日誌的內容”錯誤提示,解決方法如提示所說。
例如,您可以將恢復命令修改為“…WITH FILE = 1, REPLACE, NOUNLOAD, STATS = 10”
方法2. 生成还原所有 SQL Server 数据库的脚本
另外,您可以使用脚本来生成还原所有 SQL Server 数据库的命令,并将它们组合成一个新的脚本来执行。
1. 单击新建查询,在 SQLQuery 窗口中输入以下命令:
DECLARE @folderpath VARCHAR (1000)
SELECT @folderpath = "D:\Backup\" -- 备份位置
SELECT "RESTORE DATABASE[" NAME "] FROM DISK = "'" @folderpath name ".bak"' WITH NORECOVERY,
REPLACE, STATS = 5"
FROM master.sys.databases
WHERE name NOT IN ("master","model","msdb","tempdb","distribution")
这将生成一系列命令,用于从相应的 bak 文件还原 SQL Server 中的多个数据库。
2. 在结果中右键单击任意命令,选择全选,然后复制它们(或使用 Ctrl A 和 Ctrl C)。
3. 将这些命令粘贴到 SQLQuery 窗口中作为一个新脚本来执行,它将从具有相应文件名的 bak 文件还原 SQL Server 的所有数据库。
方法3. 使用 GUI 备份和还原多个 SQL 数据库(最简单)
上述脚本仅适用于您的 bak 文件与 SQL 数据库完全按照名称相对应的情况,这在实践中非常限制。因此,我想提供一种更便捷的方法来备份和还原多个数据库,甚至整个实例。
AOMEI Cyber Backup 是一個可靠的集中管理解决方案,用於在局域網中的所有桌面、筆記本和服务器上备份和恢复SQL 数据库。
它可在 Windows 11/10/ 8.1/8/7、Windows 服务器 2022/2019/2016/2012(R2)/2008(R2)上使用,并支持备份 SQL Server 2005 到 2022 的版本。除了SQL 数据库外,它还支持 Hyper-V 和 VMware 的虚拟机备份。
- 运行下载的 .exe 文件安装 AOMEI Cyber Backup,并启动其主界面。点击 Source Device -> Microsoft SQL -> Add Microsoft SQL。
- 选择 Download proxy program 或 Copy link 下载代理程序并将其安装在安装了 SQL Server 的设备上。然后,切换到 Already installed proxy 以选择该设备。
- 接下来,点击
-> Authentication 验证数据库实例。您可以选择 Windows Authentication 或 SQL Authentication。
这样,您现在可以为已添加的 SQL Server 安排数据备份。
◉ 如何备份 SQL Server 中的多个数据库:
1. 点击 Backup Task -> Create New Task,选择备份类型为 Microsoft SQL Backup。
2. 點擊裝置名稱以指定要備份的 SQL 實例和數據庫。您可以根據需要選擇一個或多個數據庫。
3. 選擇一個目標存儲位置來保存 SQL 備份。您可以指定本地路徑或網絡路徑。
4. 配置計劃以每天、每週或每月執行 SQL 數據庫備份,並選擇完整、增量或差異備份方法。
點擊開始備份以創建並執行任務。完成後,您可以在備份任務選項卡中找到它。
✍更多有用功能:
- 備份清理可幫助您自動刪除較舊的備份版本,從而節省存儲空間。
- 電子郵件通知可使您在任務異常或成功時收到電子郵件通知。
- 存檔可幫助您將備份文件存檔到 AWS S3 存儲中。
◉ 如何從備份中恢復多個數據庫:
1. 在左側菜單欄中點擊備份任務,找到要恢復的任務,然後點擊 -> 恢復。
2. 選擇您要從還原 SQL 資料庫的備份版本。
3. 接下來,選擇您要還原到的目標位置。有兩種選項:
- 還原至原位置(預設):在原地恢復,可以將 SQL 資料庫還原到較舊的版本。
- 還原至新位置:選擇另一個目標來進行空間外恢復。您可以指定新資料庫的名稱並修改存儲位置。
覆蓋具有相同名稱的資料庫:如果您選中此選項,備份的資料庫將覆蓋具有相同名稱的目標資料庫。如果未選中此選項,還原時將忽略具有相同名稱的目標資料庫。
4. 在完成所有設定後,按一下開始還原以開始還原進程,並耐心等待完成。您可以點擊 按鈕查看還原詳細信息或取消還原。
✍注意事項:
- “還原到原始位置”必須確認原始位置存在。否則,你只能選擇“還原到新位置”。
- “還原到原始位置”將覆蓋或刪除原始資料庫的數據,如果原始資料庫有重要數據,建議選擇“還原到新位置”。
結論
SSMS還原GUI只允許一次還原一個資料庫。如果您想在SQL Server中同時還原多個資料庫,最常用的方法是使用T-SQL腳本。但是,它對備份文件名有嚴格的限制,並且使像將資料庫還原到另一個實例這樣的操作難以實現。因此,您也可以嘗試使用SQL備份軟體-AOMEI Cyber Backup。
它使操作變得更加簡單。例如,您可以通過幾個簡單的點擊自動備份SQL資料庫,並通過同樣簡單的操作一次還原多個資料庫。