Estou mexendo no SQL Server 2019 e na replicação transacional há algum tempo e me deparei com um obstáculo. Olhando para o monitor de replicação, estou vendo o erro "A linha não foi encontrada no Assinante ao aplicar o comando UPDATE replicado para a Tabela '[dbo].[MessageQueue]' com Chave(s) Primária(s): [Id] = 6039250" . Este erro ocorre logo no primeiro lote que o distribuidor envia ao assinante.
Eu sei que a linha acima foi adicionada após meu backup do editor, mas eu esperava que o INSERT fosse replicado antes do UPDATE.
Editor/distribuidor: padrão local do SQL Server 2019
Assinante: Instância Gerenciada de SQL
Estou usando o método de backup/restauração para inicializar, pois quando coloco isso em produção, estou lidando com um banco de dados de 2 TB. Meu banco de dados de teste tem apenas 150 GB.
Abaixo está o processo que segui para levantar as coisas:
- Crie o editor, fiz isso através do assistente SSMS.
- Defina as opções de assinatura da publicação para "Permitir inicialização de arquivos de backup" = True
- Faça backup do banco de dados em uma conta de armazenamento do Azure. Usei uma chave de acesso da conta de armazenamento como credencial. Também não queria quebrar a cadeia de log do meu servidor DPM, então usei o
COPY_ONLY
.
CREATE CREDENTIAL [credential_name_here]
WITH IDENTITY = '<storage account name>',
SECRET = '<redacted>'
BACKUP DATABASE [myDatabase] TO URL = N'https://<redacted>.blob.core.windows.net/backups/myDatabase_replication.bak'
WITH CREDENTIAL = 'credential_name_here'
,COMPRESSION, COPY_ONLY, STATS = 5
- Então, no meu SQL MI, executo o comando de restauração
use master
RESTORE DATABASE [myDatabase]
FROM URL = N'https://<redacted>.blob.core.windows.net/backups/myDatabase_replication.bak'
- Finalmente, criei a assinatura usando algum SQL.
Observe que tenho algumas opções comentadas. Tentei usar @sync_type
, @backupdevicetype
& @backupdevicename
mas não consegui superar o erro 'Não é possível abrir o dispositivo de backup' https://redacted.blob.core.windows.net/backups/myDatabase_replication.bak '. Erro 86 do sistema operacional (A senha de rede especificada não está correta). '.
Por alguma razão desconhecida, sp_addsubscription não suporta a passagem de uma credencial... bem, pelo que pude encontrar de qualquer maneira.
USE [myDatabase]
GO
EXEC sp_addsubscription
@publication = N'pub_myDatabase',
@subscriber = '<redacted>.<redacted>.database.windows.net',
@destination_db = N'myDatabase',
@sync_type = 'replication support only',
--@sync_type = 'initialize with backup',
--@backupdevicetype ='URL',
--@backupdevicename = 'https://<redacted>.blob.core.windows.net/backups/myDatabase_replication.bak',
@article = N'all',
@update_mode = N'read only',
@subscriber_type = 0
-- Configure the Distribution Agent job
exec [myDatabase]..sp_addpushsubscription_agent
@publication = N'pub_myDatabase',
@subscriber = '<redacted>.<redacted>.database.windows.net',
@subscriber_db = N'myDatabase',
@job_login = NULL, @job_password = NULL,
@subscriber_security_mode = 0,
@subscriber_login = '<redacted>', @subscriber_password = '<redacted>',
@frequency_type = 64, @frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 0, @frequency_subday_interval = 0 -- Continuous
GO
-- Start Distribution agent
exec [myDatabase]..sp_startpushsubscription_agent
@publication = N'pub_myDatabase',
@subscriber = '<redacted>.<redacted>.database.windows.net',
@subscriber_db = N'myDatabase'
GO
É nesse ponto que verifico o monitor de replicação e vejo o erro citado anteriormente. Qualquer dica e/ou orientação seria muito apreciada!
A replicação é um recurso bastante antigo e negligenciado. A documentação oficial sobre como inicializar a assinatura do backup é básica e ambígua IMO
Muito provavelmente, os problemas encontrados foram devido aos backups de log executados entre a conclusão do backup completo e a adição da assinatura. Neste caso o leitor de log não replica a inserção porque o registro dela já desapareceu.
Acho que este artigo apóia um pouco minha teoria. Ele descreve o cenário com as seguintes etapas:
@backupdevicename = N’<Path and name of backup file used for initialization>’
)Observe que o uso
@backupdevicetype = URL
não é suportado. Não há como restaurar a partir do URL