8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

事务复制正在尝试更新尚不存在的行。为什么?

game_difficulty 2月前

41 0

我已经研究 SQL Server 2019 和事务复制一段时间了,但遇到了瓶颈。查看复制监视器时,我看到错误“未找到该行...

我已经研究 SQL Server 2019 和事务复制一段时间了,但遇到了瓶颈。查看复制监视器时,我看到错误“在对表‘[dbo].[MessageQueue]’应用主键为:[Id] = 6039250 的复制 UPDATE 命令时,在订阅服务器上未找到该行”。此错误发生在分发服务器发送给订阅服务器的第一批数据上。

我知道上面是我备份发布者之后添加的一行,但我希望在 UPDATE 之前复制 INSERT。

发行商/分销商:本地 SQL Server 2019 标准

订阅者:SQL 托管实例

我使用备份/恢复方法进行初始化,因为当我将其投入生产时,我要处理的是 2TB 的数据库。我的测试数据库只有 150GB。

以下是我采取的措施:

  • 创建发布者,我是通过 SSMS 向导完成的。
  • 将发布的订阅选项设置为“允许从备份文件初始化”= True
  • 将数据库备份到 Azure 存储帐户。我使用存储帐户的访问密钥作为凭证。另外,我不想破坏我的 DPM 服务器的日志链,所以我使用了 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
  • 然后从我的 SQL MI 运行恢复命令
use master
RESTORE DATABASE [myDatabase] 
FROM URL = N'https://<redacted>.blob.core.windows.net/backups/myDatabase_replication.bak'
  • 最后,我使用一些 SQL 创建了订阅。

注意 我注释掉了几个选项。我尝试使用 @sync_type , @backupdevicetype & @backupdevicename ,但无法绕过错误“无法打开备份设备‘https://redacted.blob.core.windows.net/backups/myDatabase_replication.bak’。操作系统错误 86(指定的网络密码不正确。”)。”。

由于某些未知的原因,sp_addsubscription 不支持传递凭据...无论如何,据我所知。

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

此时,我检查了复制监视器并看到了前面提到的错误。任何提示和/或指导都将不胜感激!

帖子版权声明 1、本帖标题:事务复制正在尝试更新尚不存在的行。为什么?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由game_difficulty在本站《sql-server》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 在完成完整备份和添加订阅之间是否会运行日志备份?在这种情况下,日志读取器可能不会复制插入,因为它的记录已经消失了。不过,我承认,这是一个不太可能的猜测

  • 日志备份每 15 分钟运行一次,备份到 Azure 需要一个小时,因此在我备份和创建订阅之间会发生多次日志备份。我会关闭日志备份并进行测试,然后再回复您。感谢 @rois 的提示

  • 我能够禁用 DPM 日志备份并再次进行设置。这次看起来好多了!检查 PK 的差异时,它们仅相差 1 个增量,而不是日志备份每 15 分钟运行一次时的几千个增量。但显然,即使相差 1 个也意味着它再次卡住了,所以我与工程团队进行了交谈,显然这个表是高度瞬态的,最终我们决定不复制这个表。

  • fl0w 2月前 0 只看Ta
    引用 5

    我想将您的答案标记为正确的@rois,因为设置复制时运行的日志备份肯定在我的问题中发挥了作用,我希望这个答案将来能够帮助其他人。

  • 复制是一项相当古老且被忽视的功能。 官方文档中 关于如何从备份初始化订阅的介绍在我看来非常简陋和含糊。

    遇到的问题很可能是由于在完成完整备份和添加订阅之间执行了日志备份。在这种情况下,日志读取器不会复制插入,因为它的记录已经消失了。

    我认为这篇 文章 在一定程度上支持了我的理论。它描述了以下步骤:

    1. 从发布者处进行完整备份
    2. 使用 NORECOVERY 在订阅服务器上恢复此备份
    3. 配置复制
    4. 对发布者进行非完整备份(DIFF 或 LOG)。
    5. 恢复非完整备份
    6. 使用上一个文件作为初始化源来配置订阅( @backupdevicename = N’<Path and name of backup file used for initialization>’ )

    注意 @backupdevicetype = URL 不支持使用。无法从 URL 恢复

返回
作者最近主题: