0

我经常需要从SQL服务器上的备份文件中恢复数据库,我有一个可配置的脚本来处理这一问题。基本上,脚本使用RESTORE命令,并且到处都有变量来替换数据库名称、bak文件文件夹等。然而,我面临的一个问题是恢复一个被拆分为多个文件的数据库,有时数量会增加到100。

因此,我的问题是如何使脚本动态化,以便我只需指定一个文件计数,脚本就会遍历所有文件并将其还原。据我所知,restore命令不允许这种灵活性。

我现在看到的一个选项是动态生成整个RESTORE命令,然后执行它,但我只想将其用作最后一个选项。

还有其他选择吗?

谢谢,

2个答案2

重置为默认值
2

我不确定我是否理解您所说的“指定文件计数”,但我使用某种脚本为自己实现测试环境。我希望它能帮助你。请随意问我

声明@fileListTable表(LogicalName nvarchar(128),物理名称nvarchar(260),[类型]字符(1),文件组名称nvarchar(128),大小数字(20.0),最大大小数值(20,0),文件ID bigint,CreateLSN数字(25.0),DropLSN数字(25.0),唯一ID唯一标识符,只读LSN数字(25.0),读写LSN数字(25.0),备份大小InBytes bigint,SourceBlockSize整数,文件组ID int,日志组GUID唯一标识符,DifferentialBaseLSN数字(25.0),DifferentialBaseGUID唯一标识符,IsReadOnl位,IsPresent位,TDEThumbprint varbinary(32))插入@fileListTable exec('从磁盘还原filelistonly=''C:\Share\BackUp\Reporting\Prod23.bak'')--听到我从备份中获取所有文件从@fileListTable中选择*声明@sctript nvarchar(最大值)选择@sctript='从磁盘还原数据库Prod=''C:\Share\BackUp\Reporting\Prod23.bak''WITH FILE=1,'+STUFF((选择结果.MoveTo+','来自(选择“将“”+LogicalName+“”移动到“E:\MobiledbnkDB_Report”+LogicalName+案例[类型]当“D”然后为“.mdf”时当“L”然后“.ldf”时end+“”作为MoveToFROM@fileListTable——将I模式文件收听到另一个文件夹)作为结果对于XML路径(“”),1, 0, '')+'空载,统计数据=5'使用主控形状如果存在(SELECT*FROM sys.databases d WITH(NOLOCK)where d.name='Prod')开始使用立即回滚更改数据库Prod set restricted_user删除数据库产品结束打印@sctript执行(@sctript)
0

我想您正在寻找的是我提出的一个解决方案,用于恢复未压缩的LiteSpeed文件。由于文件量因备份时litesteed可用的线程数而异,因此我们不知道需要包含多少文件才能恢复到报告环境。我使用Vladimir的stuff函数和另一个脚本来完成以下操作。用文件夹替换FILELOCATION并更新数据库、数据和日志文件名。

声明@BackupFolder nvarchar(100)=N'FILELOCATION'声明@BackupDirectory SYSNAME=@BackupFolder如果OBJECT_ID('tempdb..#DirTree')不为空删除表#DirTree创建表#DirTree(Id int标识(1,1),子目录nvarchar(255),深度smallint,文件标志位,ParentDirectoryID int)插入#DirTree(子目录、深度、文件标志)EXEC主机。。xp_dirtree@BackupDirectory,10,1更新#DirTree设置ParentDirectoryID=(从#DirTree d2选择最大(Id)其中深度=d.深度-1和d2.Id<d.Id)来自#DirTree d声明@ID内景,@备份文件VARCHAR(MAX),@深度TINYINT,@文件标志位,@父目录ID INT,@wkSubParentDirectoryID INT,@wk子目录VARCHAR(最大)声明@备份文件表(文件名路径VARCHAR(MAX),TransLogFlag自检,备份文件VARCHAR(MAX),数据库名称VARCHAR(MAX))声明文件光标光标本地FORWARD_ONLY FOR选择*FROM#DirTree WHERE FileFlag=1打开文件光标将下一个从FileCursor获取到@ID、,@备份文件,@深度,@文件标志,@父目录IDSET@wkSubParentDirectoryID=@ParentDirectoriIDWHILE@@FETCH_STATUS=0时开始--循环以反向生成路径,从备份文件开始,然后在循环中为子文件夹添加前缀当@wkSubParentDirectoryID不为空时开始SELECT@wkSubDirectory=子目录,@wkSupParentDirectoryID=父目录IDFROM#目录树WHERE ID=@wkSubParentDirectoryIDSELECT@BackupFile=@wkSubDirectory+“\”+@BackupFile结束SELECT@BackupFile=@BackupDirectory+@BackupFile插入@BackupFiles(FileNamePath)值(@BackupFile)将下一个从FileCursor获取到@ID、,@备份文件,@深度,@文件标志,@父目录IDSET@wkSubParentDirectoryID=@ParentDirectoryID结束关闭文件光标取消分配文件光标从#DirTree中选择@BackupFolder+“\”+子目录声明@filecount int=(从#DirTree中选择count(*))声明@sctript nvarchar(最大值)选择@sctript='从中恢复数据库rrreality'+STUFF((SELECT+','+结果.MoveTo来自(选择“DISK=N”+“FILELOCATION”+子目录+“”作为MoveToFROM#DirTree—将I模式文件收听到另一个文件夹)作为结果对于XML路径(“”),1,1,“)+”,文件=1将N''file''移动到N''file.mdf'',将N''file_Log''移动到N''L:\filelog.ldf'',空载,更换,状态=5'执行(@sctript)

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.