Skip to content

SQL Server 从 BAK 文件还原数据库实战 ​

💡 场景说明

在日常开发与测试中,我们经常需要将生产环境的数据库备份(BAK 文件)还原到本地或测试环境进行排障。这通常涉及到一个数据库的多个副本共存,需要妥善处理逻辑文件名与物理文件路径的冲突。


1. UI 还原法 (SSMS) ​

这是最常用的直观操作方式,但在还原为“新副本”时需要注意细节配置:

  1. 新建/选择数据库:右键点击“数据库” -> “还原数据库”。
  2. 选择源:选择“设备”,找到你的 .bak 文件。
  3. 目标数据库:修改目标数据库名称(例如在原名后加 _Test)。
  4. 🔴 关键配置 (选项):
    • 勾选 覆盖现有数据库 (WITH REPLACE)。
    • 在“文件”页签中,必须手动修改“还原为”列中的物理路径,确保 .mdf 和 .ldf 文件名不与现有数据库冲突。

2. 脚本还原法 (T-SQL) ​

当 UI 界面提示“备份集与现有数据库不同”或需要自动化处理时,使用脚本是最可靠的方案。

2.1 核心脚本模板 ​

使用 MOVE 指令重定向逻辑文件到新的物理位置。

sql
-- 1. 首先查看备份文件中的逻辑文件名
RESTORE FILELISTONLY FROM DISK = 'D:\Backup\SourceDB.bak';

-- 2. 执行还原并重定向路径
RESTORE DATABASE [TargetDB_Name]
FROM DISK = 'D:\Backup\SourceDB.bak'
WITH REPLACE,
    STATS = 10,
    MOVE 'SourceDB_Data' TO 'C:\SQLData\TargetDB_Name.mdf',
    MOVE 'SourceDB_Log'  TO 'C:\SQLData\TargetDB_Name_log.ldf';
GO

2.2 参数解析 ​

  • WITH REPLACE:允许覆盖已存在的同名数据库(如果存在)。
  • MOVE ... TO ...:这是还原为副本的关键。第一个参数是备份文件内部的逻辑文件名,第二个参数是新的物理文件路径。
  • STATS = 10:每完成 10% 的进度就显示一次状态。

3. 常见问题排障 ​

  • 逻辑名不匹配:如果不知道逻辑名,务必先运行 RESTORE FILELISTONLY。
  • 权限不足:确保 SQL Server 服务账号对目标文件夹拥有读写权限。
  • 独占访问冲突:如果提示无法获得独占访问权,请参考解决数据库还原时的独占访问冲突。

🔗 参考资料

方舟 · Ark