MSSQL 数据库恢复

18
902字 · 4分钟

恢复环境

IP:192.168.218.130

恢复库:TUOPU_XXMS_XX

恢复文件:TUOPU_XXMS_XX_backup_2000_01_04_030003_2013832.bak

恢复方案

登录SQL Server Management Studio 2022客户端,执行数据库还原

MSSQL 数据库恢复

 

弹出【还原对话框】

MSSQL 数据库恢复

嗯嗯嗯 ,还原的时候,报错。。。。

标题: Microsoft SQL Server Management Studio
------------------------------
还原数据库“TUOPU_HRMS_AX”时失败。 (Microsoft.SqlServer.Management.RelationalEngineTasks)
------------------------------
其他信息:
Microsoft.Data.SqlClient.SqlError: BACKUP LOG cannot be performed because there is no current database backup. (Microsoft.SqlServer.Smo)
有关帮助信息,请单击: https://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=17.100.40.0&LinkId=20476
------------------------------
按钮:
确定
------------------------------

嗯,换个Navicat Premium 17 客户端试试

还是报错,提示

[RES] Database restore start
[RES] (Full) TUOPU_XXMS_XX_backup_2026_01_04_030003_2013832 [2026-01-04 03:06:07.000]
[ERR] [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The backup set holds a backup of a database other than the existing 'TUOPU_XXMS_XX' database. (3154)
[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]RESTORE DATABASE is terminating abnormally. (3013)
[RES] Finished - Database restore unsuccessfully

嗯,再换个方案吧

终极解决方案(纯 SQL 脚本,最可靠)

按照以下步骤执行,确保以管理员身份运行 SSMS,并且选中master数据库执行脚本:

步骤 1:终止数据库所有连接

USE master;
GO

-- 替换为你的备份文件实际路径
RESTORE FILELISTONLY 
FROM DISK = '【你的备份文件路径】'  -- 比如 'D:\Backup\TUOPU_XXMS_XX_backup_2026_01_04_030003_2013832.bak'
GO

执行结果,如下
MSSQL 数据库恢复

执行后会返回结果集,重点关注两列:
  • LogicalName:数据库文件的逻辑名(比如 TUOPU_XXMS_XX_DataTUOPU_XXMS_XX_Log);
  • PhysicalName:备份里记录的物理文件路径(比如 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\原始数据库名.mdf

步骤 2:执行带「文件移动」的强制还原脚本

根据步骤 1 查到的 LogicalName,修改以下脚本并执行(示例中用 原始数据文件逻辑名/原始日志文件逻辑名 占位,你要替换成实际值):

USE master;
GO

-- 1. 终止目标数据库所有连接
DECLARE @kill varchar(8000) = '';  
SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(5), session_id) + ';'  
FROM sys.dm_exec_sessions 
WHERE database_id = DB_ID('TUOPU_XXMS_XX');  
EXEC(@kill);
GO

-- 2. 核心还原脚本(必须替换以下4处占位符)
RESTORE DATABASE TUOPU_HRMS_AX
FROM DISK = '【你的备份文件完整路径】'  -- 比如 'D:\Backup\TUOPU_XXMS_XX_backup_2026_01_04_030003_2013832.bak'
WITH
    REPLACE,  -- 强制覆盖现有数据库
    RECOVERY, -- 还原后数据库可用
    -- 关键:移动文件,替换下面的「原始数据文件逻辑名」「原始日志文件逻辑名」为步骤1查到的值
    MOVE '【原始数据文件逻辑名】' TO 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\TUOPU_XXMS_XX.mdf',
    MOVE '【原始日志文件逻辑名】' TO 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\TUOPU_XXMS_XX.ldf',
    STATS = 10; -- 显示还原进度
GO

执行案例

本初恢复文件请依据实际文件来恢复,

USE master;
GO

-- 第一步:杀死所有连接到TUOPU_XXMS_XX的进程(避免文件占用)
DECLARE @killCmd NVARCHAR(MAX) = N'';
SELECT @killCmd += N'KILL ' + CAST(session_id AS NVARCHAR(10)) + N';'
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID(N'TUOPU_XXMS_XX');

EXEC sp_executesql @killCmd;
GO

-- 第二步:设置数据库为单用户模式(确保无其他干扰)
ALTER DATABASE TUOPU_XXMS_XX SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

-- 第三步:核心还原(已替换为你的逻辑名和Linux路径)
RESTORE DATABASE TUOPU_XXMS_XX
FROM DISK = N'/var/opt/mssql/data/TUOPU_XXMS_XX_backup_2026_01_04_030003_2013832.bak'
WITH
    REPLACE,                          -- 强制覆盖现有数据库
    RECOVERY,                         -- 还原后数据库直接可用
    -- 关键:MOVE子句映射到Linux SQL Server默认数据目录
    MOVE N'tuopu_hrms_Data' TO N'/var/opt/mssql/data/TUOPU_XXMS_XX.mdf',  -- 目标数据文件路径
    MOVE N'tuopu_hrms_Log' TO N'/var/opt/mssql/data/TUOPU_XXMS_XX.ldf',    -- 目标日志文件路径
    STATS = 10;                       -- 显示还原进度(每10%更新一次)
GO

-- 第四步:恢复为多用户模式
ALTER DATABASE TUOPU_XXMS_XX SET MULTI_USER;
GO

MSSQL 数据库恢复

数据还原ok

本文发布于 35 天前,内容仍有参考价值