Очистка метаданных в Azure SQL Data Sync

В Azure Sql Data Sync мы сталкиваемся с проблемами производительности, из-за которых таблицы отслеживания огромны и могут быть больше исходных таблиц (2-10 ГБ для таблиц отслеживания). Это делает синхронизацию данных очень медленной и интенсивной. Это особенно болезненно для журналируемых таблиц, где мы можем генерировать данные каждый месяц.

Чтение https://jtabadero.wordpress.com/2012/08/23/things-you-need-to-know-about-sql-data-sync-service/ пункт 17

Служба синхронизации данных периодически выполняет очистку метаданных. Это удаляет записи из таблицы отслеживания, которые превышают срок хранения.

Например, нет смысла хранить метаданные для удаленных строк, когда эти изменения уже давно распространены в базе данных участников.

В настоящее время этот срок хранения составляет 45 дней. Это означает, что удаляются метаданные для строк, удаленных более 45 дней назад. Если участник не синхронизировался в течение этого периода хранения, служба обнаружит его как устаревшего участника и предотвратит синхронизацию этого участника.

Похоже, есть способ безопасно обрезать эти данные, есть ли способ вызвать это на более короткий период? Наша база данных синхронизируется много раз в течение дня, и было бы безопасно обрезать данные за 1 день хранения.

1 ответ

  1. Удалить все данные, которые вы хотите удалить из исходной базы данных
  2. Запустите Replication и дождитесь его завершения
  3. Я обычно запускаю его еще раз, на случай, если больше данных было удалено как часть обычных операций
  4. Остановить репликацию от автоматического запуска
  5. Удалите записи tombstone=1 из таблиц отслеживания в базе данных концентратора и луча
  6. Включите репликацию обратно в автоматический

Я использовал приведенный ниже скрипт, чтобы более "аккуратно" удалить множество данных. Используя время последней синхронизации, вы можете минимизировать вероятность того, что удалите команду удаления синхронизации.

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
Другие вопросы по тегам