我正在尝试通过 SQL Server 中的变量生成完整备份
我使用的脚本如下
declare @fecha varchar(50)
declare @query varchar(500)
declare @dbname varchar(500);
declare @SERVERNAME varchar (50)
SET @dbname='PruebaBackup'
SET @SERVERNAME=(SELECT @@SERVERNAME AS 'SERVER NAME')
SET @fecha=(select convert(varchar, getdate(), 23))
SET @query=('BACKUP DATABASE [PruebaBackup] TO DISK = N''R:\SQL_Backup\Temporal\@SERVERNAME'+@dbname+@fecha+'.bak'''+
'WITH NOFORMAT, NOINIT, NAME = N''@dbname-Full Database Backup''
, SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10')
exec(@query)
在您当前的语句中,您将变量作为文本包含在连接的字符串中,因为您没有在正确的位置使用单引号。
您可能想尝试此解决方案:
(分成多列以增加可读性)
使用@@SERVERNAME 可能不是一个好的解决方案,因为如果您使用的是命名实例,它会包含一个反斜杠。例如
因此,对于您的数据,您会收到如下信息:
它可以工作,但可能不是您想要的。
我注意到您没有
COPY_ONLY
在备份脚本中使用该选项。这样做会重置DIFF
自上次完整备份以来更改的页面的标志。以下是显示分配状态的数据库页面的示例输出DIFF (1:6) = NOT CHANGED
:简而言之,建议
COPY_ONLY
在备份语句中使用(BACKUP 数据库语法)参数,以便在执行不属于贵公司备份策略的异地备份时不破坏差异备份链。参考: 仅复制备份(Microsoft Learn | SQL 文档)
或者简单地说:如果您的公司正在使用第三方工具备份数据库,并且计划在星期六创建完整备份并在所有其他日子的晚上 8 点创建 DIFF 备份,那么如果您创建一个异地备份,这会告诉备份下一个 DIFF 备份是基于你的异地备份。
如果您在哪里删除这个不合适的 FULL 备份文件,那么后续的 DIFF 将无法使用之前的 FULL 将您的数据库恢复到一致的状态,因为 DIFF 将引用您不合适的 FULL 备份,这可能已被删除。
这是在不使用该选项的情况下创建异地 (OOPL) 完整备份时 DIFF 备份将引用哪个完整备份的图形表示
COPY_ONLY
。周三晚上 8 点创建的 DIFF (D2) 备份将引用下午 2 点创建的 OOPL 备份 (F2)。如果删除此文件,则无法使用之后创建的 DIFF 恢复数据库,直到第三方备份工具创建新的 FULL (F3) 备份。
因此最好在异地完整备份中使用 COPY_ONLY 标志。图形表示将如下所示:
FULL 备份 (F2) 不会中断差异备份链 (D1)。他们都仍然引用完整备份 (F1)
因此,使用包含的标志可能会更好地创建您的脚本
COPY_ONLY
:请注意,备份命令接受许多选项的变量。即,无需为您的情况使用动态 SQL: