我需要完全自动化 SQL Server 恢复,请帮助我

我需要完全自动化 SQL Server 恢复,请帮助我

我是 SQL Server 新手,没有自动恢复的经验

我需要一个脚本来从 .bak 文件恢复数据库并将 logical_data 和 logical_log 文件移动到特定路径。

我可以:

从磁盘恢复 filelistonly ='D:\backups\my_backup.bak'

这将给我一个带有 LogicalName 列的结果集,接下来我需要在恢复命令中使用结果集中的逻辑名称:

从磁盘 ='d:\backups\my_backups.bak' 使用文件 = 1 恢复数据库 my_db_name,将'logical_data_file' 移动到'd:\data\mydb.mdf',将'logical_log_file' 移动到'd:\data\mylog.ldf'

如何将第一个结果集中的逻辑名称捕获到可以提供给“移动”命令的变量中?

我认为解决方案可能很简单,但是我对 SQL Server 还很陌生。

答案1

您应该能够使用它。使用 select 运行它以查看输出。使用您的 @dbName 和 @backup_path 值

DECLARE @nsql nvarchar(MAX)
DECLARE @backup_path nvarchar(MAX) = 'd:\backups\my_backups.bak'
DECLARE @dbName sysname = 'my_db_name'
DECLARE @logical_log sysname
DECLARE @physical_log sysname
DECLARE @logical_data sysname
DECLARE @physical_data sysname
DECLARE @file TABLE (file_id int, logical_file_name varchar( 256), physical_name varchar(256))

SET @nsql = 'SELECT file_id, name as [logical_file_name],physical_name 
FROM '+QUOTENAME( @dbName)+ '.sys.database_files'

INSERT INTO @file EXEC master .dbo .sp_executesql @nsql

SELECT @logical_data = logical_file_name, @physical_data = physical_name 
FROM @file WHERE file_id = 1
SELECT @logical_log = logical_file_name, @physical_log = physical_name 
FROM @file WHERE file_id = 2

SET @nsql = 'restore database '+QUOTENAME( @dbName)+ ' from disk='''+@backup_path+''' with file=1, move '''+@logical_data+''' to '''+@physical_data+''', move '''+@logical_log+''' to '''+@physical_log+''', REPLACE'
SELECT @nsql
--EXEC master.dbo.sp_executesql @nsql

相关内容