Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Синхронизация баз вручную / 25 сообщений из 28, страница 1 из 2
11.07.2018, 17:11
    #39672679
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
Доброго времени суток.
Дано: база у "соседей". Каждый день они пересоздают нам базу только с "нашими" данными, делают бакап и шлют его по 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)

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

Вопрос: делал ли кто-нибудь что-нибудь подобное?
Видит ли кто нибудь подводные камни, скрытые грабли и т.п?
...
Рейтинг: 0 / 0
11.07.2018, 17:18
    #39672682
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
SERG1257,

timestamp/rowversion храните последние значения по объктам и проверяете. По нему же и отбирается изменение/добавления
...
Рейтинг: 0 / 0
11.07.2018, 17:19
    #39672683
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
но это конечно не идёт если условие :)
авторЖелательно чтобы "соседи" ничего не меняли на их стороне
...
Рейтинг: 0 / 0
11.07.2018, 17:19
    #39672685
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
TaPaKtimestamp/rowversion
База пересоздается
...
Рейтинг: 0 / 0
11.07.2018, 17:22
    #39672686
Alexander Us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
SERG1257...Каждый день они пересоздают нам базу только с "нашими" данными...
бэкап сжимаете?
...
Рейтинг: 0 / 0
11.07.2018, 17:24
    #39672689
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
SERG1257Дано: база у "соседей". Каждый день они пересоздают нам базу только с "нашими" данными, делают бакап и шлют его по FTP. Мы у себя его разворачиваем и все довольны.
Проблема - канал узкий, база большая, хотелось бы ускорить, а по причине пересоздания дифф или лог неприменим.

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

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

Или я неправильно понял про допустимость изменений?
...
Рейтинг: 0 / 0
11.07.2018, 17:29
    #39672692
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
msLexTaPaKtimestamp/rowversion
База пересоздается
так судя по всему из бекапа пересоздают и вырезают потом.
...
Рейтинг: 0 / 0
11.07.2018, 19:31
    #39672730
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
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Самое узкое место - пересылка неких данных, причём эта часть меняться не будет.
Непонятно тогда, в чём вопрос, менять то ничего нельзя.
Или я неправильно понял про допустимость изменений? Идеальное решение - на их стороне анализировать обе базы - вчерашнюю и нынешнюю, формировать дельту, накатывать на вчерашнюю и посылать ее по узкому каналу.
Но это означает дополнительную работу для них либо доступ нам к их базе.
Так что у нас есть только наша вчерашняя база на нашей стороне и наша сегодняшняя база на их стороне.
Раз в неделю допустимо делать бакап/рестор чтобы полностью синхронизировать базы, а в рабочие дни хотелось бы синхронизировать скриптом.
...
Рейтинг: 0 / 0
12.07.2018, 00:44
    #39672808
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
SERG1257Идеальное решение - на их стороне анализировать обе базы - вчерашнюю и нынешнюю, формировать дельту, накатывать на вчерашнюю и посылать ее по узкому каналу.
Но это означает дополнительную работу для них либо доступ нам к их базе.
Так что у нас есть только наша вчерашняя база на нашей стороне и наша сегодняшняя база на их стороне/.Так надо оставлять вчерашнюю базу на их стороне.
Тогда и доступа давать не надо, и анализировать можно.
...
Рейтинг: 0 / 0
12.07.2018, 03:17
    #39672814
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
А в чем проблема?
1. "вечером" запускаем бэкап.
2. Сравниваем текущую и "вчерашнюю" базы, формируем и отправляем буфер отличий и дополнений.
(если структура данных позволит это написать)
3. Разворачиваем бэкап на "вчерашнюю базу"
...
Рейтинг: 0 / 0
12.07.2018, 10:30
    #39672932
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
982183А в чем проблема?
1. "вечером" запускаем бэкап.
2. Сравниваем текущую и "вчерашнюю" базы, формируем и отправляем буфер отличий и дополнений.
(если структура данных позволит это написать)Проблема всего лишь в том, что у них не было вчерашней базы.

Вот я и посоветовал просто её оставлять.
...
Рейтинг: 0 / 0
12.07.2018, 12:06
    #39673030
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
Если нет ночного перерыва в работе, то это действительно может быть проблемой.
...
Рейтинг: 0 / 0
12.07.2018, 12:53
    #39673078
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
SERG1257,

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

Код: sql
1.
2.
3.
 truncate database_for_them.dbo.mytable
  insert into database_for_them.dbo.mytable
  select * from ourdatabase.dbo.mytable where some_conditions=true



своим
Код: sql
1.
2.
3.
4.
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 не комильфо
...
Рейтинг: 0 / 0
12.07.2018, 13:02
    #39673089
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
Пардон, так не совсем то получается... Мы ж токо дельту хотим.
Если бы можно было оставить 2 базы на их стороне, одну "полную копию со вчера", а другую для дельты. Тогда вопрос действительно решался бы except-om

Код: sql
1.
2.
3.
4.
insert into database_for_them_daily_delta.dbo.mytable
  select * from ourdatabase.dbo.mytable where some_conditions=true
	except 
  select * from database_for_them.dbo.mytable
...
Рейтинг: 0 / 0
12.07.2018, 16:47
    #39673245
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
alexeyvgПроблема всего лишь в том, что у них не было вчерашней базы.
Вот я и посоветовал просто её оставлять. Хорошая идея, мне в голову не пришла.
Озадачу руководство, пусть забьют стрелу, начнут предъявы, разборки, поставят бутылку тамошнему админу составляют план действий.
Однако вернемся к первому вопросу из топика: что можно сделать из того что есть?
Кто нибудь уже строил подобный велосипед?
Если строил, то описывал ли свои злоключения?
Где могут быть грабли - типа CHECKSUM отстой, надо использовать BINARY_CHECKSUM или HASHBYTES и т.п.
...
Рейтинг: 0 / 0
12.07.2018, 16:50
    #39673248
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
Они репликацией занимаются вручную...
...
Рейтинг: 0 / 0
12.07.2018, 16:50
    #39673250
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
SERG1257,

авторТо бишь если для всей таблицы CHECKSUM_AGG (можно и count(*) до кучи) не отличается от нашего, то изменений в таблице не было. Если отличается дробим таблицу на части и проверяем каждую часть чтобы не тащить CHECKSUM для каждой строки.
так а с чем вы сверять будете, если нет предыдущей копии? Особенно про дробим
...
Рейтинг: 0 / 0
12.07.2018, 18:28
    #39673308
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
TaPaK так а с чем вы сверять будете, если нет предыдущей копии? Особенно про дробим Предыдущая копия есть на нашей стороне канала.
Но канал узкий, база большая, а дельта маленькая, но непредсказуемая.

Идея была в том, чтобы разбить каждую таблицу на части достаточно большие, чтобы этих частей было немного и достаточно маленькие чтобы не реплицировать неизменные части.
На примере есть таблица с датой d_tran
Код: sql
1.
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)

Владислав КолосовОни репликацией занимаются вручнуюИменно. Но пока не занимаюсь, а прорабатываю варианты.
...
Рейтинг: 0 / 0
12.07.2018, 19:02
    #39673317
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
SERG1257Где могут быть грабли - типа CHECKSUM отстой, надо использовать BINARY_CHECKSUM или HASHBYTES и т.п.CHECKSUM будет ошибаться, а HASHBYTES дольше считает, и даёт больше данных, так что теряется смысл его использования.
...
Рейтинг: 0 / 0
12.07.2018, 19:03
    #39673320
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
SERG1257,

если у вас нет доступа к сформированным удалённым данным или другая сторона не желает выполнять дифференциальные выгрузки, то вы не решите проблему.
...
Рейтинг: 0 / 0
12.07.2018, 19:04
    #39673322
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
SERG1257Но канал узкий, база большая, а дельта маленькая, но непредсказуемая.

Идея была в том, чтобы разбить каждую таблицу на части достаточно большие, чтобы этих частей было немного и достаточно маленькие чтобы не реплицировать неизменные части.Зависит от характера изменений. Если изменения размазаны, то смысла нет, т.к. оно у вас постоянно будет показывать, что в каждой части что то поменялось.
Но в принципе может сработать, да.
Хотя лучше сделать что то нормальное, получится дешевле.
...
Рейтинг: 0 / 0
12.07.2018, 20:07
    #39673342
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
alexeyvgCHECKSUM будет ошибаться,Вот это меня и напрягает. Хотя может я просто на воду дую. Будь там int(64) было бы легче.
alexeyvg а HASHBYTES дольше считает, и даёт больше данныхУ HASHBYTES другая проблема, на вход CHECKSUM_AGG можно подать только int, то есть выбор только между CHECKSUM и BINARY_CHECKSUM

alexeyvgЕсли изменения размазаны, то смысла нет, т.к. оно у вас постоянно будет показывать, что в каждой части что-то поменялось.Вот именно эту часть и будем реплицировать вместо всей большой таблицы.
Владислав Колосов если у вас нет доступа к сформированным удалённым даннымДоступ по чтению туда есть.
Владислав Колосов или другая сторона не желает выполнять дифференциальные выгрузки, то вы не решите проблему. А другая сторона ничего менять не хочет по причинам от меня не зависящим.
...
Рейтинг: 0 / 0
12.07.2018, 21:02
    #39673367
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
SERG1257alexeyvgЕсли изменения размазаны, то смысла нет, т.к. оно у вас постоянно будет показывать, что в каждой части что-то поменялось.Вот именно эту часть и будем реплицировать вместо всей большой таблицы.Ну да, каждую часть будете реплицировать ,то есть всю базу :-)
SERG1257Владислав Колосовили другая сторона не желает выполнять дифференциальные выгрузки, то вы не решите проблему. А другая сторона ничего менять не хочет по причинам от меня не зависящим.Значит, ничего нельзя сделать. Апгрейдьте канал и сервер.
...
Рейтинг: 0 / 0
12.07.2018, 22:39
    #39673402
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
alexeyvgНу да, каждую часть будете реплицировать ,то есть всю базу :-)Это вряд ли, но я понял вашу мысль.
...
Рейтинг: 0 / 0
12.07.2018, 23:37
    #39673416
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация баз вручную
SERG1257alexeyvgНу да, каждую часть будете реплицировать ,то есть всю базу :-)Это вряд ли, но я понял вашу мысль.Повторю, вариант вполне рабочий, но нужно смотреть распределение. И правильно выбрать способ подсчёта хеша, CHECKSUM будет давать много ошибок.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Синхронизация баз вручную / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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