Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Клонирование постоянная синхронизация таблиц) / 14 сообщений из 14, страница 1 из 1
08.08.2018, 17:24
    #39684960
MathewSun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
Доброе.
Копируем данные до актуального состояния из одной таблицы в другую.
Каждую минуту в агенте выполняется задание по синхронизации основной таблицы и вторичной с этим кодом:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare @idMin bigint = 0
declare @rc int = 1
declare @cmd nvarchar(max)
              
select @rc = 1, @idMin = 0
while @rc>0 begin
    select top 1 @idMin = id from [dbo].a_activity ac order by id desc
    
    select @cmd = N'
select * from openquery(server2, ''select top 10000 * from dbo.activity with(nolock) 
where id>' + cast(@idMin as nvarchar(15))+ ' 
order by id'') oq'
    insert dbo.a_activity
    exec(@cmd)
    select @rc =@@rowcount
end    



Это действительно правильный способ?
Может есть более правильный способ?
...
Рейтинг: 0 / 0
08.08.2018, 17:37
    #39684971
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
MathewSunЭто действительно правильный способ?
Может есть более правильный способ?
это заново изобретенный велосипед

оригинальное решение от микрософт - репликация
https://docs.microsoft.com/en-us/sql/relational-databases/replication/transactional/transactional-replication
...
Рейтинг: 0 / 0
08.08.2018, 17:46
    #39684974
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
Синхронизация с nolock? O_o
...
Рейтинг: 0 / 0
08.08.2018, 18:22
    #39684988
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
MathewSun,

репликация слишком банальна... 1:1, статью исключить - проблема, те же джобы постоянно крутятся, не дай бог разъедется восстановить без бэкапов - тоже проблема. конфликты если возникли - убиться можно пока разберешься..

в этом плане интереснее change tracking + service broker..
легкий, простой, шустрый и стока понаворотить можно..
...
Рейтинг: 0 / 0
08.08.2018, 18:30
    #39684993
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
...
Рейтинг: 0 / 0
08.08.2018, 18:53
    #39685010
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
komrad,

про это и говорю, что банально.

нет, я не против репликации, просто описал на что нарывался и чем проблему решил.
...
Рейтинг: 0 / 0
09.08.2018, 13:47
    #39685540
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
MathewSun, Интересно, а в исходной таблице данные никогда не обновляются, удаляются, а только вставляются?
...
Рейтинг: 0 / 0
09.08.2018, 20:19
    #39685751
MathewSun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
uaggster,

Да, это собирается статистика посещения, в день приходит по 300.000 записей, в Агенте SQL Server этот код запускается каждую минуту.
Что-то мне подсказывает что это кривое решение..)
...
Рейтинг: 0 / 0
10.08.2018, 10:38
    #39685908
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
MathewSun,

И в чем Вы видите кривоту? В принципе, простое и надежное решение для Вашей задачи. С репликацией, скорее всего, не справитесь.

В день приходит 300000 записей, обновление производите каждую минуту, т.е. скорость изменения 300000/(24*60)=208 строк в минуту. C top 10000 можно обойтись и без цикла while, и даже без top, т.к. есть where id>idMin. Да у Вас и id это nvarchar(15), ужас! 30 байт вместо 4!

Есть ли смысл синхронизировать так часто? Что произойдет если интервал синхронизации увеличить до 60 минут? Мироздание не рухнет? В смысле статистика не протухнет?
...
Рейтинг: 0 / 0
10.08.2018, 11:38
    #39685958
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
Проблема этого решения в том, что при каноническом подходе чтения будут ожидать записи и наоборот.
Если простои в записи недопустимы, то можно использовать Read Uncommitted чтения, что автоматически приводит к чтению неподтвержденных транзакций, переключить сервер или базу в режим версионирования, использовать In-memory таблицу и тому подобное. Но все эти методы имеют недостатки. Более-менее сбалансированным решением мне видится настройка CDC, но она требует определенной практики.
...
Рейтинг: 0 / 0
10.08.2018, 12:41
    #39686015
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
Владислав Колосов,

зачем для статистики посещений CDC? СТ за глаза.
...
Рейтинг: 0 / 0
10.08.2018, 14:36
    #39686096
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
ShIgor,

В СТ "каждая таблица, включенная для отслеживания изменений, содержит внутреннюю таблицу на диске, которая используется функциями отслеживания изменений для определения версии изменения и строк, измененных после определенной версии". Т.е. в планы модифицирующего запроса к отслеживаемой таблице будут включены операции вставки во внутреннюю таблицу информации об изменениях, что увеличивает нагрузку. О чем и беспокоится Владислав Колосов. К тому же ТС хочет иметь копию на другом сервере, т.е. нужна операция копирования из этих внутренних таблиц в таблицу ТС.

В данной задаче копируются только те строки, которые появились после последней синхронизации. Связь между серверами уже есть, исходное решение работает, но у ТС есть сомнение, не криво ли оно? С моей точки зрения это нормальное решение, не требующее дополнительных настроек сервера. Его можно немного упростить:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @idMin bigint = 0;
declare @cmd nvarchar(1000);
              
select top 1 @idMin = id from dbo.a_activity ac order by id desc;
    
set @cmd = N'select * from openquery(server2, ''select * from dbo.activity where id>' + cast(@idMin as nvarchar(15)) + ''')';
--print @cmd;

insert dbo.a_activity
  exec(@cmd)


Осталось выяснить как часто нужно выполнять эту операцию.
...
Рейтинг: 0 / 0
10.08.2018, 14:46
    #39686100
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
MathewSun,

Решение полная дрянь.
1. Ну фиг с ним с изменениями
2. Nolock оставить - получаете непонятно что.
3. Nolock убрать можете получить пропуски.

Если хотите без CT для этого есть rowversion/timestamp + min_active_rowversion
...
Рейтинг: 0 / 0
10.08.2018, 14:57
    #39686107
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование постоянная синхронизация таблиц)
MathewSunЧто-то мне подсказывает что это кривое решение..)Правильное решения вам уже назвали - штатная репликация. В вашем случае транзакционная.
Перечисленные в 21634858 якобы проблемы, на самом деле таковыми не являются.

Ваше текущее решение, CT, CDC, Service Broker как средство доставки и т.п. - просто изобретение своего велосипеда с неясными перспективами уверенной езды на нем.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Клонирование постоянная синхронизация таблиц) / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]