Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Синхронизация баз вручную  [new]
SERG1257
Member

Откуда:
Сообщений: 2605
Доброго времени суток.
Дано: база у "соседей". Каждый день они пересоздают нам базу только с "нашими" данными, делают бакап и шлют его по FTP. Мы у себя его разворачиваем и все довольны.
Проблема - канал узкий, база большая, хотелось бы ускорить, а по причине пересоздания дифф или лог неприменим.

Какие есть варианты синхроницазии?
Желательно чтобы "соседи" ничего не меняли на их стороне.
Предполагаю, что за день база не могла сильно поменятся.
Старый добрый бакап/рестрор вполне подходит для выходных.

Я пока думаю в сторону CHECKSUM_AGG(CHECKSUM(поля, которые нам нужны))
То бишь если для всей таблицы CHECKSUM_AGG (можно и count(*) до кучи) не отличается от нашего, то изменений в таблице не было. Если отличается дробим таблицу на части и проверяем каждую часть чтобы не тащить CHECKSUM для каждой строки.
Для таблиц с датой проще всего взять дату в качестве диапазона разбиения
select CHECKSUM_AGG(CHECKSUM), count(*) from table group by year(date_field)
select CHECKSUM_AGG(CHECKSUM), count(*) where year(date_field)='2018' from table group by month(date_field)
select CHECKSUM_AGG(CHECKSUM), count(*) where month(date_field)=07 from table group by day(date_field)

Для таблиц без даты (справочников), ну пусть будут первые буквы от значения не суть важно.

Вопрос: делал ли кто-нибудь что-нибудь подобное?
Видит ли кто нибудь подводные камни, скрытые грабли и т.п?
11 июл 18, 17:11    [21563427]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
SERG1257,

timestamp/rowversion храните последние значения по объктам и проверяете. По нему же и отбирается изменение/добавления
11 июл 18, 17:18    [21563453]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
но это конечно не идёт если условие :)
автор
Желательно чтобы "соседи" ничего не меняли на их стороне
11 июл 18, 17:19    [21563456]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
msLex
Member

Откуда:
Сообщений: 5683
TaPaK
timestamp/rowversion

База пересоздается
11 июл 18, 17:19    [21563458]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
Alexander Us
Member

Откуда:
Сообщений: 981
SERG1257
...Каждый день они пересоздают нам базу только с "нашими" данными...

бэкап сжимаете?
11 июл 18, 17:22    [21563474]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27439
SERG1257
Дано: база у "соседей". Каждый день они пересоздают нам базу только с "нашими" данными, делают бакап и шлют его по FTP. Мы у себя его разворачиваем и все довольны.
Проблема - канал узкий, база большая, хотелось бы ускорить, а по причине пересоздания дифф или лог неприменим.

Какие есть варианты синхроницазии?
Желательно чтобы "соседи" ничего не меняли на их стороне.
Самое узкое место - пересылка неких данных, причём эта часть меняться не будет.

Непонятно тогда, в чём вопрос, менять то ничего нельзя.

Или я неправильно понял про допустимость изменений?
11 июл 18, 17:24    [21563484]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
msLex
TaPaK
timestamp/rowversion

База пересоздается

так судя по всему из бекапа пересоздают и вырезают потом.
11 июл 18, 17:29    [21563522]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
SERG1257
Member

Откуда:
Сообщений: 2605
Alexander Us
бэкап сжимаете?
Разумеется
TaPaK
так судя по всему из бекапа пересоздают и вырезают потом.
Эти добрые люди делают
truncate database_for_them.dbo.mytable
insert into database_for_them.dbo.mytable
select * from ourdatabase.dbo.mytable where some_conditions=true

Либо вообще (не выяснял подробностей)
drop database database_for_them
create database database_for_them
select * into database_for_them.dbo.mytable
from ourdatabase.dbo.mytable where some_conditions=true

так что на timestamp/rowversion надежды нет.

alexeyvg
Самое узкое место - пересылка неких данных, причём эта часть меняться не будет.
Непонятно тогда, в чём вопрос, менять то ничего нельзя.
Или я неправильно понял про допустимость изменений?
Идеальное решение - на их стороне анализировать обе базы - вчерашнюю и нынешнюю, формировать дельту, накатывать на вчерашнюю и посылать ее по узкому каналу.
Но это означает дополнительную работу для них либо доступ нам к их базе.
Так что у нас есть только наша вчерашняя база на нашей стороне и наша сегодняшняя база на их стороне.
Раз в неделю допустимо делать бакап/рестор чтобы полностью синхронизировать базы, а в рабочие дни хотелось бы синхронизировать скриптом.
11 июл 18, 19:31    [21563836]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27439
SERG1257
Идеальное решение - на их стороне анализировать обе базы - вчерашнюю и нынешнюю, формировать дельту, накатывать на вчерашнюю и посылать ее по узкому каналу.
Но это означает дополнительную работу для них либо доступ нам к их базе.
Так что у нас есть только наша вчерашняя база на нашей стороне и наша сегодняшняя база на их стороне/.
Так надо оставлять вчерашнюю базу на их стороне.
Тогда и доступа давать не надо, и анализировать можно.
12 июл 18, 00:44    [21564605]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
982183
Member

Откуда: VL
Сообщений: 2491
А в чем проблема?
1. "вечером" запускаем бэкап.
2. Сравниваем текущую и "вчерашнюю" базы, формируем и отправляем буфер отличий и дополнений.
(если структура данных позволит это написать)
3. Разворачиваем бэкап на "вчерашнюю базу"
12 июл 18, 03:17    [21564647]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27439
982183
А в чем проблема?
1. "вечером" запускаем бэкап.
2. Сравниваем текущую и "вчерашнюю" базы, формируем и отправляем буфер отличий и дополнений.
(если структура данных позволит это написать)
Проблема всего лишь в том, что у них не было вчерашней базы.

Вот я и посоветовал просто её оставлять.
12 июл 18, 10:30    [21565095]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
982183
Member

Откуда: VL
Сообщений: 2491
Если нет ночного перерыва в работе, то это действительно может быть проблемой.
12 июл 18, 12:06    [21565606]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 265
SERG1257,

Попробуй уговорить их заменить этот скрипт

 truncate database_for_them.dbo.mytable
  insert into database_for_them.dbo.mytable
  select * from ourdatabase.dbo.mytable where some_conditions=true


своим
insert into database_for_them.dbo.mytable
  select * from ourdatabase.dbo.mytable where some_conditions=true
	except 
  select * from database_for_them.dbo.mytable


Ну или сгенери с not exists, если except не комильфо
12 июл 18, 12:53    [21565786]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 265
Пардон, так не совсем то получается... Мы ж токо дельту хотим.
Если бы можно было оставить 2 базы на их стороне, одну "полную копию со вчера", а другую для дельты. Тогда вопрос действительно решался бы except-om

insert into database_for_them[b]_daily_delta[/b].dbo.mytable
  select * from ourdatabase.dbo.mytable where some_conditions=true
	except 
  select * from database_for_them.dbo.mytable
12 июл 18, 13:02    [21565823]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
SERG1257
Member

Откуда:
Сообщений: 2605
alexeyvg
Проблема всего лишь в том, что у них не было вчерашней базы.
Вот я и посоветовал просто её оставлять.
Хорошая идея, мне в голову не пришла.
Озадачу руководство, пусть забьют стрелу, начнут предъявы, разборки, поставят бутылку тамошнему админу составляют план действий.
Однако вернемся к первому вопросу из топика: что можно сделать из того что есть?
Кто нибудь уже строил подобный велосипед?
Если строил, то описывал ли свои злоключения?
Где могут быть грабли - типа CHECKSUM отстой, надо использовать BINARY_CHECKSUM или HASHBYTES и т.п.
12 июл 18, 16:47    [21566595]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5987
Они репликацией занимаются вручную...
12 июл 18, 16:50    [21566607]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
SERG1257,

автор
То бишь если для всей таблицы CHECKSUM_AGG (можно и count(*) до кучи) не отличается от нашего, то изменений в таблице не было. Если отличается дробим таблицу на части и проверяем каждую часть чтобы не тащить CHECKSUM для каждой строки.

так а с чем вы сверять будете, если нет предыдущей копии? Особенно про дробим
12 июл 18, 16:50    [21566610]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
SERG1257
Member

Откуда:
Сообщений: 2605
TaPaK
так а с чем вы сверять будете, если нет предыдущей копии? Особенно про дробим
Предыдущая копия есть на нашей стороне канала.
Но канал узкий, база большая, а дельта маленькая, но непредсказуемая.

Идея была в том, чтобы разбить каждую таблицу на части достаточно большие, чтобы этих частей было немного и достаточно маленькие чтобы не реплицировать неизменные части.
На примере есть таблица с датой d_tran
select checksum_agg(checksum(some_data)) as hash, convert(char(8),d_tran,112) from mytable group by convert(char(8),d_tran,112)

запрос вернет нам всего несколько тысяч записей, сравним с таким же запросом по нашей вчерашней базе и сразу отсечем неизменные строки (с одинаковым hash)

Владислав Колосов
Они репликацией занимаются вручную
Именно. Но пока не занимаюсь, а прорабатываю варианты.
12 июл 18, 18:28    [21566948]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27439
SERG1257
Где могут быть грабли - типа CHECKSUM отстой, надо использовать BINARY_CHECKSUM или HASHBYTES и т.п.
CHECKSUM будет ошибаться, а HASHBYTES дольше считает, и даёт больше данных, так что теряется смысл его использования.
12 июл 18, 19:02    [21567044]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5987
SERG1257,

если у вас нет доступа к сформированным удалённым данным или другая сторона не желает выполнять дифференциальные выгрузки, то вы не решите проблему.
12 июл 18, 19:03    [21567052]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27439
SERG1257
Но канал узкий, база большая, а дельта маленькая, но непредсказуемая.

Идея была в том, чтобы разбить каждую таблицу на части достаточно большие, чтобы этих частей было немного и достаточно маленькие чтобы не реплицировать неизменные части.
Зависит от характера изменений. Если изменения размазаны, то смысла нет, т.к. оно у вас постоянно будет показывать, что в каждой части что то поменялось.
Но в принципе может сработать, да.
Хотя лучше сделать что то нормальное, получится дешевле.
12 июл 18, 19:04    [21567058]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
SERG1257
Member

Откуда:
Сообщений: 2605
alexeyvg
CHECKSUM будет ошибаться,
Вот это меня и напрягает. Хотя может я просто на воду дую. Будь там int(64) было бы легче.
alexeyvg
а HASHBYTES дольше считает, и даёт больше данных
У HASHBYTES другая проблема, на вход CHECKSUM_AGG можно подать только int, то есть выбор только между CHECKSUM и BINARY_CHECKSUM

alexeyvg
Если изменения размазаны, то смысла нет, т.к. оно у вас постоянно будет показывать, что в каждой части что-то поменялось.
Вот именно эту часть и будем реплицировать вместо всей большой таблицы.
Владислав Колосов
если у вас нет доступа к сформированным удалённым данным
Доступ по чтению туда есть.
Владислав Колосов
или другая сторона не желает выполнять дифференциальные выгрузки, то вы не решите проблему.
А другая сторона ничего менять не хочет по причинам от меня не зависящим.
12 июл 18, 20:07    [21567158]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27439
SERG1257
alexeyvg
Если изменения размазаны, то смысла нет, т.к. оно у вас постоянно будет показывать, что в каждой части что-то поменялось.
Вот именно эту часть и будем реплицировать вместо всей большой таблицы.
Ну да, каждую часть будете реплицировать ,то есть всю базу :-)
SERG1257
Владислав Колосов
или другая сторона не желает выполнять дифференциальные выгрузки, то вы не решите проблему.
А другая сторона ничего менять не хочет по причинам от меня не зависящим.
Значит, ничего нельзя сделать. Апгрейдьте канал и сервер.
12 июл 18, 21:02    [21567233]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
SERG1257
Member

Откуда:
Сообщений: 2605
alexeyvg
Ну да, каждую часть будете реплицировать ,то есть всю базу :-)
Это вряд ли, но я понял вашу мысль.
12 июл 18, 22:39    [21567359]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27439
SERG1257
alexeyvg
Ну да, каждую часть будете реплицировать ,то есть всю базу :-)
Это вряд ли, но я понял вашу мысль.
Повторю, вариант вполне рабочий, но нужно смотреть распределение. И правильно выбрать способ подсчёта хеша, CHECKSUM будет давать много ошибок.
12 июл 18, 23:37    [21567457]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
982183
Member

Откуда: VL
Сообщений: 2491
Хэш можно заменить временем последнего обновления строки.
13 июл 18, 04:25    [21567648]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
SERG1257
Member

Откуда:
Сообщений: 2605
982183
Хэш можно заменить временем последнего обновления строки
к сожалению нельзя
13 июл 18, 06:17    [21567662]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз вручную  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
включить cdc и работать с ним
13 июл 18, 08:37    [21567758]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить