【发布时间】:2021-07-09 15:54:07
【问题描述】:
每周我必须恢复 2 个不同的数据库。我向 Epi 支持提交了一张票,他们给了我附加了不同日期的 .BAK 文件。
运行 SQL Server 2014(在远程服务器上)、Visual Studio 19(在本地计算机上)和集成服务项目。
到目前为止,我的 SSIS 包从 SQL Server 备份目录中删除了以前的 .BAK 文件,将新文件从我的下载文件夹移动到 SQL Server 备份目录,并删除了一个以前存在的备份(我喜欢删除它们,因为 WITH REPLACE 不会更新 LAST RESTORED DATE,我希望保持最新)。
我想我可以重新使用当我使用文件系统任务移动 BAK 文件以生成 RESTORE DATABASE 语句时的文件名和目录,但我不确定如何在 SSIS 中传递这些字段.
现在,我需要执行 SQL 任务以恢复数据库,但很难在一个具有动态文件名的语句中执行此操作。
我查看了许多不同的文章并尝试了不同的方法,但都没有奏效。
以下脚本是我希望能够运行的,但即使文件名是硬编码的,也会出现错误:
RESTORE DATABASE [Insite.Commerce.horizon.Sandbox] FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\horizon-sandbox-20210412.bak'
这个得出的错误如下:
Msg 5133, Level 16, State 1, Line 2 Directory lookup for the file "d:\sqldata\\Insite.Commerce.horizon.mdf" failed with the operating system error 21(The device is not ready.).
Msg 3156, Level 16, State 3, Line 2 File 'Insite.Commerce.horizon' cannot be restored to 'd:\sqldata\\Insite.Commerce.horizon.mdf'. Use WITH MOVE to identify a valid location for the file.
Msg 5133, Level 16, State 1, Line 2 Directory lookup for the file "l:\sqllogs\\Insite.Commerce.horizon_log.ldf" failed with the operating system error 3(The system cannot find the path specified.).
Msg 3156, Level 16, State 3, Line 2 File 'Insite.Commerce.horizon_log' cannot be restored to 'l:\sqllogs\\Insite.Commerce.horizon_log.ldf'. Use WITH MOVE to identify a valid location for the file.
Msg 3119, Level 16, State 1, Line 2 Problems were identified while planning for the RESTORE statement. Previous messages provide details.
Msg 3013, Level 16, State 1, Line 2 RESTORE DATABASE is terminating abnormally.
我不确定如何解决这些错误和/或它们是否相关,因为我不知道我是否以正确的方式在 SSIS 中进行数据库还原。
无论如何,到目前为止,我正在尝试在 SSIS 中执行以下 SQL 语句,以便将它生成的 SQL 语句作为结果或变量返回,该结果或变量可以传递给另一个 SQL 语句然后执行。见下文:
DECLARE @dirPath nvarchar(500) = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\'
DECLARE @tblgetfileList TABLE
(FileName nvarchar(500)
,depth int
,isFile int)
INSERT INTO @tblgetfileList
EXEC xp_DirTree @dirPath,1,1
select 'RESTORE DATABASE [Insite.Commerce.horizon.Sandbox] FROM DISK = ''C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\' + FileName + '''' from @tblgetfileList where isFile = 1 and FileName like 'horizon-sandbox-%.bak'
这个输出是:RESTORE DATABASE [Insite.Commerce.horizon.Sandbox] FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\horizon-sandbox-20210412.bak'
我尝试将此输出存储为变量,然后执行它。请参阅以下脚本:
DECLARE @dirPath nvarchar(500) = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\'
DECLARE @tblgetfileList TABLE
(FileName nvarchar(500)
,depth int
,isFile int)
INSERT INTO @tblgetfileList
EXEC xp_DirTree @dirPath,1,1
declare @sqltext varchar(max)
set @sqltext = '
select ''RESTORE DATABASE [Insite.Commerce.horizon.Sandbox] FROM DISK = ''C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\ + FileName + '''' from @tblgetfileList where isFile = 1 and FileName like ''horizon-sandbox-%.bak''
'
exec (@sqltext)
(@sqltext 的引号可能并不完美,但我在尝试运行时修复了它们)
此外,在此处的代码中看到的任何本地文件目录我都必须在远程服务器的 IPv4 地址前面加上,然后将文件目录更改为“C$”。所以,它看起来像“\\C$
长话短说,我不知道该怎么做。我不知道解决这个问题的最佳方法,也不知道如何执行它。
我一直使用 TSQL,并且认为自己是中级,但传递变量、递归查询和自动化/编程是我绝对需要处理的一些事情。所以,我可能会让这种方式变得比它需要的更复杂,而且它可能是一个简单的修复。
有没有更简单的方法?我可以利用我已经做过的吗?我假设我可以只编写一个查询来执行此操作,然后在 SSIS 执行 SQL 任务或执行 TSQL 语句任务中执行它。
最终目标只是能够获取新 BAK 文件的名称并在 SQL Server 中恢复该数据库
如果您需要更多信息,请告诉我!我可以根据需要编辑问题。
欢迎任何和所有的帮助! 提前谢谢!
【问题讨论】:
-
错误在这里告诉你问题。 “使用 WITH MOVE 确定文件的有效位置。”
-
谢谢@Larnu!是的,这是一个组成部分,但我需要的帮助比我想象的要多。它仍然没有解决我将如何使用动态文件名执行恢复。我将尝试弄清楚如何使用 WITH MOVE,但只有在使用硬编码文件名运行脚本后才会出现该错误。
-
我尝试运行
RESTORE DATABASE [Insite.Commerce.horizon.Sandbox] FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\horizon-sandbox-20210412.bak' with MOVE 'd:\sqldata\\Insite.Commerce.horizon.mdf' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA', MOVE 'l:\sqllogs\\Insite.Commerce.horizon_log.ldf' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA',但在我的下一条评论中收到以下错误消息。 -
Msg 3234, Level 16, State 2, Line 2 逻辑文件 'd:\sqldata\\Insite.Commerce.horizon.mdf' 不是数据库 'Insite.Commerce.horizon.Sandbox' 的一部分.使用 RESTORE FILELISTONLY 列出逻辑文件名。 Msg 3013, Level 16, State 1, Line 2 RESTORE DATABASE 异常终止。
-
所以,我用
RESTORE FILELISTONLY替换了RESTORE DATABASE,在[Insite.Commerce.horizon.Sandbox]附近出现语法错误
标签: sql-server database ssis automation restore