使用动态文件名的 SSIS 还原数据库
SSIS Restore Database with Dynamic File Name
每周我都要恢复 2 个不同的数据库。我向 Epi 支持提交了一张票,他们给了我附加了不同日期的 .BAK 文件。
运行 SQL Server 2014(在远程服务器上),Visual Studio 19(在本地计算机上)和集成服务项目。
到目前为止,我的 SSIS 包从 SQL Server Backup 目录中删除了以前的 .BAK 文件,将新文件从我的 Downloads 文件夹移动到 SQL Server Backup 目录,并删除了以前的一个现有备份(我喜欢删除它们,因为 WITH REPLACE 不会更新上次恢复日期,我喜欢让它们保持最新状态)。
我想我可以重新使用当我使用文件系统任务移动 BAK 文件以生成 RESTORE DATABASE 语句时的文件名和目录,但我不确定如何传递这些字段在 SSIS 中。
现在,我需要执行 SQL TASK 来恢复数据库,但是很难在一个带有动态文件名的语句中执行它。
我看了很多不同的文章并尝试了不同的方法,但是 none 奏效了。
下面的脚本是我想要的运行,但即使文件名是硬编码的,我也会出错:
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.
我不确定如何解决这些错误 and/or 如果它们是相关的,因为我不知道我是否以正确的方式在 SSIS 中进行数据库恢复。
无论如何,截至目前,我正在尝试在 SSIS 中执行以下 SQL 语句,以便 return 它生成的 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$<目录的其余部分>”。这是因为我 运行 在我的本地机器上安装 SSIS 包,它在远程服务器上完成这项工作。
长话短说,我不知道该怎么做。我不知道解决这个问题的最佳方法,也不知道如何执行它。
我一直使用 TSQL 并且认为自己处于中等水平,但是传递变量、递归查询和 automation/programming 是我绝对需要处理的一些事情。所以,我可以让这种方式变得比它需要的更复杂,它可能是一个简单的修复。
有没有更简单的方法?我可以利用我已经做过的事情吗?我假设我可以只编写一个查询来执行此操作,然后在 SSIS Execute SQL Task 或 Execute TSQL Statement Task.[=20 中执行该查询=]
最终目标只是能够获取新 BAK 文件的名称并在 SQL 服务器 [= 中恢复该数据库79=]
如果您需要更多信息,请告诉我!我可以根据需要编辑问题。
欢迎任何帮助!
提前致谢!
需要使用 WITH MOVE,但数据库名称已更改,因此所有逻辑文件名也必须更改。
简而言之,我所做的就是使用 SSMS 中的 UX 来设置数据库还原。
我从我的设备中选择了我的文件,并根据需要更改了“还原到”名称。然后,我单击了还原数据库 window 左上角的“脚本”,然后单击了“新建查询编辑器 Window”。
这将所有内容编写成一个新查询。它包括需要进行的 WITH MOVE 和一些其他设置。
尽管如此,我如何在 SSIS 中使用它是我将新脚本复制到 SSIS 中的执行 SQL 任务,但我将该文本添加到另一个动态查询中,该查询获取了我需要的文件名。
这是恢复的完整查询:
DECLARE @dirPath nvarchar(500) = '\<IPv4 Address>\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)
select @sqltext=
'RESTORE DATABASE [Insite.Commerce.horizon.Sandbox] FROM DISK = N''\<IPv4 Address>\C$\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\' + FileName + '''' +
' WITH FILE = 1, MOVE N''Insite.Commerce.horizon'' TO N''\<IPv4 Address>\C$\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Insite.Commerce.horizon.Sandbox.mdf'', ' +
'MOVE N''Insite.Commerce.horizon_log'' TO N''\<IPv4 Address>\C$\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Insite.Commerce.horizon.Sandbox_log.ldf'', NOUNLOAD, STATS = 5'
from @tblgetfileList where isFile = 1 and FileName like 'horizon-sandbox-%.bak'
exec (@sqltext)
每周我都要恢复 2 个不同的数据库。我向 Epi 支持提交了一张票,他们给了我附加了不同日期的 .BAK 文件。
运行 SQL Server 2014(在远程服务器上),Visual Studio 19(在本地计算机上)和集成服务项目。
到目前为止,我的 SSIS 包从 SQL Server Backup 目录中删除了以前的 .BAK 文件,将新文件从我的 Downloads 文件夹移动到 SQL Server Backup 目录,并删除了以前的一个现有备份(我喜欢删除它们,因为 WITH REPLACE 不会更新上次恢复日期,我喜欢让它们保持最新状态)。
我想我可以重新使用当我使用文件系统任务移动 BAK 文件以生成 RESTORE DATABASE 语句时的文件名和目录,但我不确定如何传递这些字段在 SSIS 中。
现在,我需要执行 SQL TASK 来恢复数据库,但是很难在一个带有动态文件名的语句中执行它。
我看了很多不同的文章并尝试了不同的方法,但是 none 奏效了。
下面的脚本是我想要的运行,但即使文件名是硬编码的,我也会出错:
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.
我不确定如何解决这些错误 and/or 如果它们是相关的,因为我不知道我是否以正确的方式在 SSIS 中进行数据库恢复。
无论如何,截至目前,我正在尝试在 SSIS 中执行以下 SQL 语句,以便 return 它生成的 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$
长话短说,我不知道该怎么做。我不知道解决这个问题的最佳方法,也不知道如何执行它。
我一直使用 TSQL 并且认为自己处于中等水平,但是传递变量、递归查询和 automation/programming 是我绝对需要处理的一些事情。所以,我可以让这种方式变得比它需要的更复杂,它可能是一个简单的修复。
有没有更简单的方法?我可以利用我已经做过的事情吗?我假设我可以只编写一个查询来执行此操作,然后在 SSIS Execute SQL Task 或 Execute TSQL Statement Task.[=20 中执行该查询=]
最终目标只是能够获取新 BAK 文件的名称并在 SQL 服务器 [= 中恢复该数据库79=]
如果您需要更多信息,请告诉我!我可以根据需要编辑问题。
欢迎任何帮助! 提前致谢!
需要使用 WITH MOVE,但数据库名称已更改,因此所有逻辑文件名也必须更改。
简而言之,我所做的就是使用 SSMS 中的 UX 来设置数据库还原。
我从我的设备中选择了我的文件,并根据需要更改了“还原到”名称。然后,我单击了还原数据库 window 左上角的“脚本”,然后单击了“新建查询编辑器 Window”。
这将所有内容编写成一个新查询。它包括需要进行的 WITH MOVE 和一些其他设置。
尽管如此,我如何在 SSIS 中使用它是我将新脚本复制到 SSIS 中的执行 SQL 任务,但我将该文本添加到另一个动态查询中,该查询获取了我需要的文件名。
这是恢复的完整查询:
DECLARE @dirPath nvarchar(500) = '\<IPv4 Address>\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)
select @sqltext=
'RESTORE DATABASE [Insite.Commerce.horizon.Sandbox] FROM DISK = N''\<IPv4 Address>\C$\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\' + FileName + '''' +
' WITH FILE = 1, MOVE N''Insite.Commerce.horizon'' TO N''\<IPv4 Address>\C$\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Insite.Commerce.horizon.Sandbox.mdf'', ' +
'MOVE N''Insite.Commerce.horizon_log'' TO N''\<IPv4 Address>\C$\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Insite.Commerce.horizon.Sandbox_log.ldf'', NOUNLOAD, STATS = 5'
from @tblgetfileList where isFile = 1 and FileName like 'horizon-sandbox-%.bak'
exec (@sqltext)