还原数据库的日期和时间的文件名

时间:2018-08-08 11:48:34

标签: sql-server database datetime filenames restore

我正在尝试获取一个每日.bak文件,该文件具有静态名称,但文件名中的日期和时间戳格式为'Filename_yyyyMMdd_hhmm.bak'。

如果我手动输入与文件匹配的时间,我创建的脚本会起作用,但是当我尝试使其自动化时,它将无法工作,因为生成文件的时间会改变(通常仅需几分钟即可解决。< / p>

有人可以提供帮助以解决此问题吗?

    DECLARE @BackupFile varchar(1000)

    SELECT @BackupFile = SELECT '\NETWORKLOCATION\FILENAME_' + FORMAT(CAST(GETDATE()  AS date),'yyyyMMdd') + '_HHmm.bak')

    RESTORE DATABASE [Test]
    FROM DISK = @BackupFile
    WITH REPLACE

我正在使用SQL Server。

1 个答案:

答案 0 :(得分:0)

T-SQL在处理文件时非常受限制。对于复杂的任务,最好使用Ola Hallengren的Backup script和Brent Ozar的sp_DatabaseRestore这样的脚本。

Ola Hallengren的脚本可以通过验证,清除等方式备份一个或多个数据库。语句:

EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'FULL',
@Verify = 'Y',
@Compress = 'Y',
@CheckSum = 'Y',
@CleanupTime = 24

将找到所有用户数据库,并在c:\Backup中创建完整备份,其名称格式为:

SERVER_DATABASE_FULL_YYYYMMDD_hhmmss.bak

它还将验证备份并清除较旧的备份

Brent Ozar的脚本可自动恢复使用Ola Hallengren的命名约定创建的备份。

此调用将恢复数据库LogShipMe的最新完整备份:

EXEC dbo.sp_DatabaseRestore 
  @Database = 'LogShipMe', 
  @BackupPathFull = 'D:\Backup\SQL2016PROD1A\LogShipMe\FULL\', 
  @BackupPathLog = 'D:\Backup\SQL2016PROD1A\LogShipMe\LOG\', 
  @ContinueLogs = 0, 
  @RunRecovery = 1;

如果您查看sp_DatabaseRestore的源代码,您会发现您真的不想自己编写此代码。使用以下文件检索文件:

SET @cmd = N'DIR /b "' + @BackupPathFull + N'"';

INSERT INTO @FileList (BackupFile)
EXEC master.sys.xp_cmdshell @cmd; 

将所有文件放入表变量中,以便可以对其进行过滤,排序等。