powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Синхронизация баз вручную
25 сообщений из 28, страница 1 из 2
Синхронизация баз вручную
    #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
Синхронизация баз вручную
    #39672682
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257,

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

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

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

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

Вот я и посоветовал просто её оставлять.
...
Рейтинг: 0 / 0
Синхронизация баз вручную
    #39673030
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нет ночного перерыва в работе, то это действительно может быть проблемой.
...
Рейтинг: 0 / 0
Синхронизация баз вручную
    #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
Синхронизация баз вручную
    #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
Синхронизация баз вручную
    #39673245
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgПроблема всего лишь в том, что у них не было вчерашней базы.
Вот я и посоветовал просто её оставлять. Хорошая идея, мне в голову не пришла.
Озадачу руководство, пусть забьют стрелу, начнут предъявы, разборки, поставят бутылку тамошнему админу составляют план действий.
Однако вернемся к первому вопросу из топика: что можно сделать из того что есть?
Кто нибудь уже строил подобный велосипед?
Если строил, то описывал ли свои злоключения?
Где могут быть грабли - типа CHECKSUM отстой, надо использовать BINARY_CHECKSUM или HASHBYTES и т.п.
...
Рейтинг: 0 / 0
Синхронизация баз вручную
    #39673248
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Они репликацией занимаются вручную...
...
Рейтинг: 0 / 0
Синхронизация баз вручную
    #39673250
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257,

авторТо бишь если для всей таблицы CHECKSUM_AGG (можно и count(*) до кучи) не отличается от нашего, то изменений в таблице не было. Если отличается дробим таблицу на части и проверяем каждую часть чтобы не тащить CHECKSUM для каждой строки.
так а с чем вы сверять будете, если нет предыдущей копии? Особенно про дробим
...
Рейтинг: 0 / 0
Синхронизация баз вручную
    #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
Синхронизация баз вручную
    #39673317
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257Где могут быть грабли - типа CHECKSUM отстой, надо использовать BINARY_CHECKSUM или HASHBYTES и т.п.CHECKSUM будет ошибаться, а HASHBYTES дольше считает, и даёт больше данных, так что теряется смысл его использования.
...
Рейтинг: 0 / 0
Синхронизация баз вручную
    #39673320
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257,

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

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

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


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