Estou tentando gerar um backup completo por variáveis no SQL Server
O script que estou usando é o seguinte
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)
Mas quando recebo o backup o nome do host não é impresso, você pode me aconselhar sobre como usar a variável para imprimi-lo no nome, por favor
Em sua declaração atual, você está incluindo variáveis como texto em sua string concatenada, porque não está usando aspas simples no lugar certo.
Você pode querer tentar esta solução:
(dividido em várias colunas para aumentar a legibilidade)
Usar @@SERVERNAME pode não ser uma boa solução, porque contém uma barra invertida se você estiver usando uma instância nomeada. Por exemplo
Assim, com seus dados, você receberia algo assim:
Pode funcionar, mas pode não ser o que você pretende.
Percebi que você não está usando a
COPY_ONLY
opção em seu script de backup. Isso redefine oDIFF
sinalizador das páginas que foram alteradas desde o último backup COMPLETO. Segue um exemplo de saída de uma página de banco de dados que mostra oDIFF (1:6) = NOT CHANGED
status de alocação:Em suma, é recomendável usar o
COPY_ONLY
parâmetro (BACKUP Database Syntax) em sua instrução de backup para não quebrar as cadeias de backup diferencial ao realizar backups fora do local, que não fazem parte da estratégia de backup da sua empresa.Referência: backups somente cópia (Microsoft Learn | SQL Docs)
Ou, em termos simples: se sua empresa estiver fazendo backup de bancos de dados com uma ferramenta de terceiros e a programação criar um backup COMPLETO no sábado e backups DIFF em todos os outros dias às 20h, se você criar um backup fora do local, isso dirá ao backup que o próximo backup DIFF é baseado em seu backup fora do local.
Se você excluir este arquivo de backup COMPLETO fora do local, o DIFF subsequente não poderá ser usado para restaurar seu banco de dados para um estado consistente usando um FULL anterior porque o DIFF fará referência ao seu backup COMPLETO fora do local, o que pode foram excluídos.
Aqui, uma representação gráfica de qual backup COMPLETO um backup DIFF fará referência ao criar um backup COMPLETO fora do local (OOPL) sem usar a
COPY_ONLY
opção.O backup DIFF (D2) na quarta-feira, criado às 20h, fará referência ao backup OOPL (F2), criado às 14h. Se você excluir este arquivo, não será possível restaurar o banco de dados usando os DIFFs criados posteriormente, até que a ferramenta de backup de terceiros crie um novo backup COMPLETO (F3).
Portanto, é melhor usar o sinalizador COPY_ONLY em backups COMPLETOS fora do local. A representação gráfica ficará assim:
O backup COMPLETO (F2) não quebra a cadeia de backup Diferencial (D1). Todos eles ainda fazem referência ao backup COMPLETO (F1)
Portanto, seu script pode ser melhor criado com o
COPY_ONLY
sinalizador incluído:Observe que o comando backup aceita variáveis para muitas das opções. Ou seja, não precisa usar SQL dinâmico para o seu caso: