清理Azure SQL数据同步中的元数据

时间:2016-03-14 17:09:11

标签: laravel azure azure-sql-database azure-data-sync

我们遇到Azure Sql Data Sync的性能问题,跟踪表非常庞大,并且可能比源表大(跟踪表为2-10GB)。这使得数据同步非常慢并且数据库密集。这在记录表中尤其痛苦,我们每个月都可以生成数据。

阅读https://jtabadero.wordpress.com/2012/08/23/things-you-need-to-know-about-sql-data-sync-service/第17项

  

数据同步服务会定期清理元数据。这将从跟踪表中删除超过保留期的条目。

     

例如,当这些更改长期传播到成员数据库时,没有必要保留已删除行的元数据。

     

目前,此保留期设置为45天。这意味着删除超过45天前删除的行的元数据将被清除。如果某个成员在此保留期内未同步,则该服务会将其检测为过期成员并阻止该成员进行同步。

听起来有一种方法可以安全地修剪这些数据,有没有办法在较短的时间内触发它?我们的数据库全天同步多次,在保留数据的第一天进行修剪是安全的。

1 个答案:

答案 0 :(得分:0)

  1. 删除要从源数据库中删除的所有数据
  2. 运行复制并等待其完成
  3. 我通常再次运行它,以防更多数据作为正常操作的一部分被删除
  4. 停止自动运行的复制
  5. 从中心和分支数据库中的跟踪表中删除tombstone = 1条记录
  6. 将您的复制重新设置为自动
  7. 我使用下面的脚本更轻松地"轻轻地"删除大量数据。通过使用上次同步时间,您可以最大限度地减少删除同步删除命令的可能性。

    declare @last_Sync datetime
    set @last_Sync = '5-1-16 5:00pm'
    
    select count(*) from datasync.XXX_dss_tracking with(nolock) where sync_row_is_tombstone=1 and last_change_datetime < @last_Sync
    
    declare @i int
    set @i=0
    
    while (@i<100) begin
        delete from datasync.XXX_dss_tracking  where xxx_id  in 
            (select top 1000 xxx_id from datasync.XXX_dss_tracking with (nolock) where sync_row_is_tombstone=1 and last_change_datetime < @last_Sync)
    
        set @i=@i+1
    end