Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Дано: база у "соседей". Каждый день они пересоздают нам базу только с "нашими" данными, делают бакап и шлют его по 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.07.2018, 17:11 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
SERG1257, timestamp/rowversion храните последние значения по объктам и проверяете. По нему же и отбирается изменение/добавления ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2018, 17:18 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
но это конечно не идёт если условие :) авторЖелательно чтобы "соседи" ничего не меняли на их стороне ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2018, 17:19 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
TaPaKtimestamp/rowversion База пересоздается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2018, 17:19 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
SERG1257...Каждый день они пересоздают нам базу только с "нашими" данными... бэкап сжимаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2018, 17:22 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
SERG1257Дано: база у "соседей". Каждый день они пересоздают нам базу только с "нашими" данными, делают бакап и шлют его по FTP. Мы у себя его разворачиваем и все довольны. Проблема - канал узкий, база большая, хотелось бы ускорить, а по причине пересоздания дифф или лог неприменим. Какие есть варианты синхроницазии? Желательно чтобы "соседи" ничего не меняли на их стороне.Самое узкое место - пересылка неких данных, причём эта часть меняться не будет. Непонятно тогда, в чём вопрос, менять то ничего нельзя. Или я неправильно понял про допустимость изменений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2018, 17:24 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
msLexTaPaKtimestamp/rowversion База пересоздается так судя по всему из бекапа пересоздают и вырезают потом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2018, 17:29 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
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.07.2018, 19:31 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
SERG1257Идеальное решение - на их стороне анализировать обе базы - вчерашнюю и нынешнюю, формировать дельту, накатывать на вчерашнюю и посылать ее по узкому каналу. Но это означает дополнительную работу для них либо доступ нам к их базе. Так что у нас есть только наша вчерашняя база на нашей стороне и наша сегодняшняя база на их стороне/.Так надо оставлять вчерашнюю базу на их стороне. Тогда и доступа давать не надо, и анализировать можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 00:44 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
А в чем проблема? 1. "вечером" запускаем бэкап. 2. Сравниваем текущую и "вчерашнюю" базы, формируем и отправляем буфер отличий и дополнений. (если структура данных позволит это написать) 3. Разворачиваем бэкап на "вчерашнюю базу" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 03:17 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
982183А в чем проблема? 1. "вечером" запускаем бэкап. 2. Сравниваем текущую и "вчерашнюю" базы, формируем и отправляем буфер отличий и дополнений. (если структура данных позволит это написать)Проблема всего лишь в том, что у них не было вчерашней базы. Вот я и посоветовал просто её оставлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 10:30 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
Если нет ночного перерыва в работе, то это действительно может быть проблемой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 12:06 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
SERG1257, Попробуй уговорить их заменить этот скрипт Код: sql 1. 2. 3. своим Код: sql 1. 2. 3. 4. Ну или сгенери с not exists, если except не комильфо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 12:53 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
Пардон, так не совсем то получается... Мы ж токо дельту хотим. Если бы можно было оставить 2 базы на их стороне, одну "полную копию со вчера", а другую для дельты. Тогда вопрос действительно решался бы except-om Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 13:02 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
alexeyvgПроблема всего лишь в том, что у них не было вчерашней базы. Вот я и посоветовал просто её оставлять. Хорошая идея, мне в голову не пришла. Озадачу руководство, пусть забьют стрелу, начнут предъявы, разборки, поставят бутылку тамошнему админу составляют план действий. Однако вернемся к первому вопросу из топика: что можно сделать из того что есть? Кто нибудь уже строил подобный велосипед? Если строил, то описывал ли свои злоключения? Где могут быть грабли - типа CHECKSUM отстой, надо использовать BINARY_CHECKSUM или HASHBYTES и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 16:47 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
Они репликацией занимаются вручную... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 16:50 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
SERG1257, авторТо бишь если для всей таблицы CHECKSUM_AGG (можно и count(*) до кучи) не отличается от нашего, то изменений в таблице не было. Если отличается дробим таблицу на части и проверяем каждую часть чтобы не тащить CHECKSUM для каждой строки. так а с чем вы сверять будете, если нет предыдущей копии? Особенно про дробим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 16:50 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
TaPaK так а с чем вы сверять будете, если нет предыдущей копии? Особенно про дробим Предыдущая копия есть на нашей стороне канала. Но канал узкий, база большая, а дельта маленькая, но непредсказуемая. Идея была в том, чтобы разбить каждую таблицу на части достаточно большие, чтобы этих частей было немного и достаточно маленькие чтобы не реплицировать неизменные части. На примере есть таблица с датой d_tran Код: sql 1. запрос вернет нам всего несколько тысяч записей, сравним с таким же запросом по нашей вчерашней базе и сразу отсечем неизменные строки (с одинаковым hash) Владислав КолосовОни репликацией занимаются вручнуюИменно. Но пока не занимаюсь, а прорабатываю варианты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 18:28 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
SERG1257Где могут быть грабли - типа CHECKSUM отстой, надо использовать BINARY_CHECKSUM или HASHBYTES и т.п.CHECKSUM будет ошибаться, а HASHBYTES дольше считает, и даёт больше данных, так что теряется смысл его использования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 19:02 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
SERG1257, если у вас нет доступа к сформированным удалённым данным или другая сторона не желает выполнять дифференциальные выгрузки, то вы не решите проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 19:03 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
SERG1257Но канал узкий, база большая, а дельта маленькая, но непредсказуемая. Идея была в том, чтобы разбить каждую таблицу на части достаточно большие, чтобы этих частей было немного и достаточно маленькие чтобы не реплицировать неизменные части.Зависит от характера изменений. Если изменения размазаны, то смысла нет, т.к. оно у вас постоянно будет показывать, что в каждой части что то поменялось. Но в принципе может сработать, да. Хотя лучше сделать что то нормальное, получится дешевле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 19:04 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
alexeyvgCHECKSUM будет ошибаться,Вот это меня и напрягает. Хотя может я просто на воду дую. Будь там int(64) было бы легче. alexeyvg а HASHBYTES дольше считает, и даёт больше данныхУ HASHBYTES другая проблема, на вход CHECKSUM_AGG можно подать только int, то есть выбор только между CHECKSUM и BINARY_CHECKSUM alexeyvgЕсли изменения размазаны, то смысла нет, т.к. оно у вас постоянно будет показывать, что в каждой части что-то поменялось.Вот именно эту часть и будем реплицировать вместо всей большой таблицы. Владислав Колосов если у вас нет доступа к сформированным удалённым даннымДоступ по чтению туда есть. Владислав Колосов или другая сторона не желает выполнять дифференциальные выгрузки, то вы не решите проблему. А другая сторона ничего менять не хочет по причинам от меня не зависящим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 20:07 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
SERG1257alexeyvgЕсли изменения размазаны, то смысла нет, т.к. оно у вас постоянно будет показывать, что в каждой части что-то поменялось.Вот именно эту часть и будем реплицировать вместо всей большой таблицы.Ну да, каждую часть будете реплицировать ,то есть всю базу :-) SERG1257Владислав Колосовили другая сторона не желает выполнять дифференциальные выгрузки, то вы не решите проблему. А другая сторона ничего менять не хочет по причинам от меня не зависящим.Значит, ничего нельзя сделать. Апгрейдьте канал и сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 21:02 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
alexeyvgНу да, каждую часть будете реплицировать ,то есть всю базу :-)Это вряд ли, но я понял вашу мысль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 22:39 |
|
||
|
Синхронизация баз вручную
|
|||
|---|---|---|---|
|
#18+
SERG1257alexeyvgНу да, каждую часть будете реплицировать ,то есть всю базу :-)Это вряд ли, но я понял вашу мысль.Повторю, вариант вполне рабочий, но нужно смотреть распределение. И правильно выбрать способ подсчёта хеша, CHECKSUM будет давать много ошибок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 23:37 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=46&tid=1689413]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
147ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 519ms |

| 0 / 0 |
