Não foi possível espelhar um banco de dados SQL Server 2012

11

Ao tentar espelhar um banco de dados usando o seguinte comando

ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ

Eu obtenho o seguinte erro

A mensagem 1475, nível 16, estado 105,
banco de dados da linha 1 "test0916aj8CJ" pode conter alterações registradas em massa que não foram copiadas. Faça um backup de log no banco de dados principal ou no banco de dados principal. Em seguida, restaure esse backup no banco de dados espelho para habilitar o espelhamento de banco de dados ou em todos os bancos de dados secundários para permitir a associação ao grupo de disponibilidade.

Isso pode ser feito sem o backup do banco de dados? Ou devo fazer backup e descartar o backup. É para um banco de dados recém-criado, então não preciso do backup de qualquer maneira neste momento.

Eu tentei o seguinte ...

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL
WITH COPY_ONLY, NOFORMAT, INIT,
NAME = Ntest-Full Database Backup’,
SKIP, NOREWIND, NOUNLOAD
GO

mas o método acima também não funcionou.

obrigado

Conta
fonte
Algumas coisas ... Na verdade, você não está espelhando esse comando, mas adicionando um banco de dados a um grupo de disponibilidade. O que me faz perguntar sobre como o AG está configurado, em que modo de recuperação seus bancos de dados estão e por que, para corrigir um problema de log, você está executando um backup COPY_ONLY que deixa o log intacto e não é o que o erro está especificando. ? Parece-me que você está faltando alguns passos ou está muito confuso sobre o que está tentando fazer.
Steve Mangiameli 16/09/2015

Respostas:

15

É fácil reproduzir o erro que você recebeu

  • Crie banco de dados no modo de recuperação completa no Primário.
  • Crie banco de dados no modo de recuperação completa no secundário.
  • Inicie a GUI e tente configurar o espelhamento entre Primário e Secundário.

Abaixo está o erro que você receberá:

O banco de dados "test_mirroring_kin" pode conter alterações registradas em massa que não foram armazenadas em backup. Faça um backup de log no banco de dados principal ou no banco de dados principal. Em seguida, restaure esse backup no banco de dados espelho para habilitar o espelhamento de banco de dados ou em todos os bancos de dados secundários para permitir a associação ao grupo de disponibilidade. (Microsoft SQL Server, erro: 1475)

insira a descrição da imagem aqui

Vamos entender o que é esse erro:

Você configurou seu banco de dados no modo de recuperação COMPLETO e acha que o banco de dados está realmente no modo de recuperação COMPLETO.

O exposto acima não é verdade. Depois de criar o banco de dados, se você não fizer um backup COMPLETO, mesmo que o banco de dados esteja no modo de recuperação COMPLETO, ele estará na recuperação pseudo-SIMPLES

Você pode verificá-lo facilmente usando dbcc dbinfo-> dbi_dbbackupLSNter valor 0:0:0(0x00000000:00000000:0000)ou usar o script de Paul Randal

dbcc traceon (3604)
go
dbcc dbinfo('test_mirroring_kin') with tableresults
go
dbcc traceoff (3604)

insira a descrição da imagem aqui

Editar: Mesmo fazer um primeiro backup completo com a COPY_ONLYopção também não estabelece uma cadeia de backup

backup database test_mirroring_kin
to disk = 'D:\test_mirroring_kin_FULL.bak'
with init, stats=10, COPY_ONLY

dbcc dbinfo-> dbi_dbbackupLSNainda está tendo o valor de 0:0:0(0x00000000:00000000:0000). Isso significa que o banco de dados ainda está no modo de recuperação pseudo-simples.

O que você precisa fazer para resolver o erro acima?

Você precisa fazer um backup completo + um backup do log de transações no primário e, em seguida, restaurá-lo no banco de dados secundário with norecoverye depois ingressar no banco de dados no grupo AG ou no Espelhamento.

Como uma nota lateral e por uma questão de integridade, para o seu roteiro backup to NUL, leia este post de Gail Shaw.

Kin Shah
fonte
5

Por que TO DISK = N’NUL’?

Não entendo por que você está usando TO DISK = N’NUL’:

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL

Se você fizer isso, o backup será salvo em NUL(ou seja, = para lugar nenhum / nada) e não poderá ser usado porque o arquivo não existe.

Embora NULtambém possa ser usado como destino para backups de LOG, também não deve ser usado, especialmente em servidores Prod, pois os LOGs serão perdidos e a cadeia de backup será interrompida. (~ semelhante a SHRINKFILE)

Backup do LOG

Antes de adicionar um banco de dados ao grupo, você deve prepará-lo. Quando você deseja preparar um banco de dados secundário, pelo menos 1 backup do log de transações deve ser executado e restaurado. O espelho o utiliza para descobrir quais transações já foram sincronizadas no banco de dados secundário e quais ainda não estão sincronizadas com o banco de dados primário.

Portanto, você deve fazer backup dos logs de transação no banco de dados primário:

BACKUP LOG [test0916aj8CJ] TO  DISK = N'....bak' 
WITH  COPY_ONLY, FORMAT, INIT,  NAME = N'test0916aj8CJ-Transaction Log  Backup', STATS = 10

A COPY_ONLYopção deve ser usada. Ele garante que os logs não sejam truncados no final do backup do LOG.

Cadeia de backup do banco de dados primário

No entanto, você não pode restaurar um backup de log sozinho, ou seja, sem uma cadeia de backup (consulte a resposta do Kin também). Isso significa que o backup do log de transações deve ser realizado após a realização de um backup completo do banco de dados (+ um diferencial opcional, se necessário).

Como a COPY_ONLYopção não quebra a cadeia de backup, ela também não cria uma cadeia de backup. A COPY_ONLYopção não pode ser usada para o backup do banco de dados.

Backups em ordem:

  • Backup completo do banco de dados sem a COPY_ONLYopção
  • Backup diferencial opcional
  • 1 LOG de backup com COPY_ONLYopção
  • outro (ou mais) backup de LOG, se necessário ...

Restaurar o banco de dados secundário

Em seguida, o backup do banco de dados deve ser restaurado (+ diferencial) no secundário.

Ele deve ser restaurado com a NORECOVERYopção, porque você também deseja restaurar os backups de LOG depois que o backup COMPLETO for restaurado.

Finalmente, você restaurará o backup do LOG. Você ainda precisa usar a NORECOVERYopção porque o espelho continuará restaurando as transações uma vez no local.

  • Restaure o backup COMPLETO com a NORECOVERYopção
  • Restaure o backup DIFF com a NORECOVERYopção
  • Restaure todos os backups do LOG em ordem com a NORECOVERYopção

Vamos juntar tudo (adaptá-lo ao seu ambiente)

  • No servidor principal, execute:

    USE master
    Go
    BACKUP DATABASE [test0916aj8CJ] TO DISK = N'....bak'
    WITH FORMAT, INIT, NAME = N'test0916aj8CJ-Full Database Backup', STATS = 10
    GO
    BACKUP LOG [test0916aj8CJ] TO DISK = N'....bak' 
    WITH COPY_ONLY, FORMAT, INIT, NAME = N'test0916aj8CJ-Transaction Log Backup', STATS = 10
    GO
  • No servidor secundário, execute:

    USE master
    Go
    RESTORE DATABASE [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
    GO
    RESTORE LOG [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
  • Você pode então continuar adicionando o novo banco de dados secundário ao grupo de disponibilidade ...

Ações opcionais

  • É melhor definir a opção DISK como uma pasta compartilhada disponível nos servidores Primário e Secundário.
  • Também é melhor armazenar arquivos de banco de dados em um disco e local semelhantes nos servidores primário e secundário.
Julien Vavasseur
fonte