我正在准备/测试我们的 ERP 和其他辅助系统到新数据库服务器的迁移。这将涉及将数据库备份从旧服务器恢复到新服务器上。
为了方便起见,我希望能够使用脚本/存储过程来恢复数据库,只需指向一个或多个包含备份文件(完整、差异和日志的组合)的目录,并可选择指定一个 STOPAT 时间,或者忽略它并在存在备份的情况下恢复到最近的可能时间。我还需要能够明确指定新文件位置(MOVE 选项),或者更一般地“将所有数据文件放在这里,并将所有日志文件放在这里”。该工具应查看所提供目录中的所有文件,并确定需要恢复哪些文件才能达到目标时间。
Management Studio 中的 GUI 恢复工具可以完成所有这些,但显然不能包含在脚本中。我希望能够编写一个在概念上与此类似的通用迁移脚本:
EXEC master..RestoreDB
@database='ERPSysDB',
@source='\\oldserver\Backup\oldserver\ERPSysDB\FULL,\\oldserver\Backup\oldserver\ERPSysDB\DIFF,\\oldserver\Backup\oldserver\ERPSysDB\LOG',
@datadir='D:\SQLServer\DATA',
@logdir='L:\SQLServer\DATA';
--Do various cleanup/post processing steps in ERPSysDB here
EXEC master..RestoreDB
@database='ERPCompanyDB',
@source='\\oldserver\Backup\oldserver\ERPCompanyDB\FULL,\\oldserver\Backup\oldserver\ERPCompanyDB\DIFF,\\oldserver\Backup\oldserver\ERPCompanyDB\LOG',
@datadir='D:\SQLServer\DATA',
@logdir='L:\SQLServer\DATA';
--More post-processing in ERPCompanyDB here
--Now restore a test copy of the database that we don't back up directly on the production server,
--using production database backups instead:
EXEC master..RestoreDB
@database='ERPCompanyDB',
@restoreas='ERPCompanyTestDB',
@source='\\oldserver\Backup\oldserver\ERPCompanyDB\FULL,\\oldserver\Backup\oldserver\ERPCompanyDB\DIFF,\\oldserver\Backup\oldserver\ERPCompanyDB\LOG',
@stopat='2018-11-01T08:00:00'
@with='MOVE ''ERPDataFile'' TO ''D:\SQLServer\DATA\ERPCompanyTestDB.mdf'', MOVE ''ERPLogFile'' TO ''L:\SQLServer\DATA\ERPCompanyTestDB.ldf''';
--Additional post-processing, database restores, etc...
是否有提供此功能的现有工具?我准备自己编写,但那将是相当复杂的代码块(尤其是错误/异常处理),所以我不想重新发明轮子。我更希望它可以在 T-SQL 中使用,即不是 PowerShell cmdlet,但是 CLR 存储过程会很好(并且很可能是实现它的更简单/更好的方法)。
这是我上周放在一起的东西,而不是在这个利基市场中找到任何其他东西。
https://github.com/dave-britten/RestoreDB
用法相当简单(尽管有许多选项可以自定义)。例如,我的测试服务器重新加载脚本可以执行类似这样的操作来恢复 Dynamics GP 系统数据库:
这会将数据库 DYNAMICS 恢复到最新的可用时间点,并自动将所有数据库文件移动到实例默认数据和日志目录。
另外两个有用的选项是@RestoreAs和@AutoRename,它们结合使用时,可以轻松地以不同的名称(例如测试副本)恢复数据库,并自动重命名数据库文件(将旧数据库名称替换为新的数据库名称)。
目前,RestoreDB 至少需要 SQL Server 2016,但我想让它与 2012 及更高版本一起使用。
如果你想使用 tsql 然后使用 - sp_RestoreGene。它是一个了不起的 SP,它将完全满足您的需求。
注意:我同意 Andy 的观点,您应该探索dbatools,因为它具有一些高级恢复功能。