|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Друзья подскажите решение для синхронизации для следующей задачи. Есть баз под PostgreSQL есть MS SQL. В базе PostgreSQL есть таблицы(а,б) клиенты и товары, есть таблица(с) с двумя полями id клиента и id товара, отношение многие ко многим. PostgreSQL подключен к MS SQL через linked server. Таблица с большая пара сотен миллионов записей. Проблема в том, что за один раз выкачать все поля таблицы с не представляется возможным, коннект обрывается на стороне PostgreSQL. Управлять PostgreSQL я не могу, повлиять на время тайм аута возможности нет. Гарантированно за сессию можно выкачивать до миллиона записей. Есть ли какое то решение для синхронизации таблицы c такой же таблицей MS SQL в пакетном режиме(миллион обновлений за сессию) с использованием служебных полей PostgreeSQL например ? Возможности закачивать всю таблицу за раз нет. А для порционной закачки поля не предусмотрены. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 12:13 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Миша56, Если задача разовая, то можно выгрузить/загрузить через файл. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 12:42 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Миша56, так перебирайте батчами по id по всем таблицам... where id>=0 and id<1000000 where id>=1000000 and id<2000000 и так далее вот и будет вам порционная закачка... а в служебные поля не влезайте. если надо часто обновлять то надо на стороне источника данных вводить поле типа mtime и выбирать обновления только по нему или что то поверх pgq (или самописной очереди) для выгрузки обновлений использовать. В любом случае - это самостоятельная разработка и готовых инструментов скорее всего нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 13:23 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Миша56 Друзья подскажите решение для синхронизации для следующей задачи. Есть баз под PostgreSQL есть MS SQL. В базе PostgreSQL есть таблицы(а,б) клиенты и товары, есть таблица(с) с двумя полями id клиента и id товара, отношение многие ко многим. PostgreSQL подключен к MS SQL через linked server. Таблица с большая пара сотен миллионов записей. Проблема в том, что за один раз выкачать все поля таблицы с не представляется возможным, коннект обрывается на стороне PostgreSQL. Управлять PostgreSQL я не могу, повлиять на время тайм аута возможности нет. Гарантированно за сессию можно выкачивать до миллиона записей. Есть ли какое то решение для синхронизации таблицы c такой же таблицей MS SQL в пакетном режиме(миллион обновлений за сессию) с использованием служебных полей PostgreeSQL например ? Возможности закачивать всю таблицу за раз нет. А для порционной закачки поля не предусмотрены. Раз linked server, значит вы пытаетесь на стороне SQL Server это решать? Как выше было сказано читайте не миллионами, а небольшими кусками, если транзакция прошла отмечайте флажками, что уже прочитано, если транзакция оборвалась - повторяйте с того же места. Я делал что-то подобное через SQL Server Service Broker, он останавливался, когда переносить уже было нечего. Хорошо, если синхронизация в одну сторону и если уже перенесенные данные не меняются в источнике, хотя и это решаемо. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 18:15 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Павел Лузанов Миша56, Если задача разовая, то можно выгрузить/загрузить через файл. Задача не разовая, а ежедневная. За день данные могут измениться. Maxim Boguk Миша56, так перебирайте батчами по id по всем таблицам... where id>=0 and id<1000000 where id>=1000000 and id<2000000 и так далее вот и будет вам порционная закачка... а в служебные поля не влезайте. если надо часто обновлять то надо на стороне источника данных вводить поле типа mtime и выбирать обновления только по нему или что то поверх pgq (или самописной очереди) для выгрузки обновлений использовать. В любом случае - это самостоятельная разработка и готовых инструментов скорее всего нет. перебирать батчами по id не получится . В таблице с отношение многие ко многим. Это таблица связей(там всего два поля) в которую связи могут добавляться, а могут удаляться. Руки чешутся спользовать служебные поля для этих целей ). Не очень ясно почему бы нет. Если операций чистки базы не будет от счетчики транзаций не обнуляются. Транзакций в день то как раз не много тысяча максимум. Ролг Хупин Миша56 Друзья подскажите решение для синхронизации для следующей задачи. Есть баз под PostgreSQL есть MS SQL. В базе PostgreSQL есть таблицы(а,б) клиенты и товары, есть таблица(с) с двумя полями id клиента и id товара, отношение многие ко многим. PostgreSQL подключен к MS SQL через linked server. Таблица с большая пара сотен миллионов записей. Проблема в том, что за один раз выкачать все поля таблицы с не представляется возможным, коннект обрывается на стороне PostgreSQL. Управлять PostgreSQL я не могу, повлиять на время тайм аута возможности нет. Гарантированно за сессию можно выкачивать до миллиона записей. Есть ли какое то решение для синхронизации таблицы c такой же таблицей MS SQL в пакетном режиме(миллион обновлений за сессию) с использованием служебных полей PostgreeSQL например ? Возможности закачивать всю таблицу за раз нет. А для порционной закачки поля не предусмотрены. Раз linked server, значит вы пытаетесь на стороне SQL Server это решать? Как выше было сказано читайте не миллионами, а небольшими кусками, если транзакция прошла отмечайте флажками, что уже прочитано, если транзакция оборвалась - повторяйте с того же места. Я делал что-то подобное через SQL Server Service Broker, он останавливался, когда переносить уже было нечего. Хорошо, если синхронизация в одну сторону и если уже перенесенные данные не меняются в источнике, хотя и это решаемо. Так маленькими кусочками и читаю. Синхронизация в одну сторону, только вот в источнике данные могут удаляться и добавляться. В этом то и проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 18:37 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Миша56 Павел Лузанов Миша56, Если задача разовая, то можно выгрузить/загрузить через файл. Задача не разовая, а ежедневная. За день данные могут измениться. Maxim Boguk Миша56, так перебирайте батчами по id по всем таблицам... where id>=0 and id<1000000 where id>=1000000 and id<2000000 и так далее вот и будет вам порционная закачка... а в служебные поля не влезайте. если надо часто обновлять то надо на стороне источника данных вводить поле типа mtime и выбирать обновления только по нему или что то поверх pgq (или самописной очереди) для выгрузки обновлений использовать. В любом случае - это самостоятельная разработка и готовых инструментов скорее всего нет. перебирать батчами по id не получится . В таблице с отношение многие ко многим. Это таблица связей(там всего два поля) в которую связи могут добавляться, а могут удаляться. Руки чешутся спользовать служебные поля для этих целей ). Не очень ясно почему бы нет. Если операций чистки базы не будет от счетчики транзаций не обнуляются. Транзакций в день то как раз не много тысяча максимум. Ролг Хупин пропущено... Раз linked server, значит вы пытаетесь на стороне SQL Server это решать? Как выше было сказано читайте не миллионами, а небольшими кусками, если транзакция прошла отмечайте флажками, что уже прочитано, если транзакция оборвалась - повторяйте с того же места. Я делал что-то подобное через SQL Server Service Broker, он останавливался, когда переносить уже было нечего. Хорошо, если синхронизация в одну сторону и если уже перенесенные данные не меняются в источнике, хотя и это решаемо. Так маленькими кусочками и читаю. Синхронизация в одну сторону, только вот в источнике данные могут удаляться и добавляться. В этом то и проблема. Вот, вы подтвердили. Если бы этого не было, тогда было бы проще - читаете кусками, перекладываете в линкед сервер и х.с.н. А так - вы реально хотите поддерживать синхронизацию удаленных и измененных записей ? это головняк. Тогда я бы делал так: в таблице -источнике (в базе на SQL Server) добавляем поле типа timestamp, добавляем рабочую таблицу для удаленных : туда (в тргигере) пишутся иды удаленных записей. Синхронизация состоит из 2 частей: 1. обработка таблицы удаленных записей - удаляем в целевой те же записи 2. обработка основной таблицы - новые и измененные (timestamp) якори запоминаете для обеих таблиц, удаленных тоже может быть дофига. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 10:37 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Ролг Хупин, Предлагаемый Вами вариант похож на синхронизацию с использованием буферных таблиц. Вариант возможен. Но проблема осталась PostgreSQL рвет коннект и в таблице PostgreSQL нет никаких полей за которые можно уцепиться как за индекс, даже временной метки нет. Прихожу к единственному выводу использования для синхронизации служебных полей с номерами транзакций и сведениями о заморозках. Да не легко ... но попробовать стоит. Странно, что этого еще никто не сделал. Решение было бы универсальным. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 13:03 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Миша56 Ролг Хупин, Предлагаемый Вами вариант похож на синхронизацию с использованием буферных таблиц. Вариант возможен. Но проблема осталась PostgreSQL рвет коннект и в таблице PostgreSQL нет никаких полей за которые можно уцепиться как за индекс, даже временной метки нет. Прихожу к единственному выводу использования для синхронизации служебных полей с номерами транзакций и сведениями о заморозках. Да не легко ... но попробовать стоит. Странно, что этого еще никто не сделал. Решение было бы универсальным. Как один из вариантов: вам достаточно таблицы-источника и пары вспомогательных таблиц на стороне SQL Server, но при условии, что что: 1. такой синхронизатор один 2. данные на получателе не меняются, точнее, не надо синхронизировать в обратную сторону. И все сработает. Вам нет смысла проверять получатель, если все делается в транзакции. Второй путь типатакого же, но сделать внешнее приложение, скажем на c#, и оно будет делать как я описал, но отслеживать транзакцию. Без таблиц вряд ли обойдетесь, но их можно вооще создать в третьей базе, хотя это, конечно, усложнение. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 13:26 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Миша56 Задача не разовая, а ежедневная. GoldenGate вам в руки. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 14:14 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Ролг Хупин Как один из вариантов: вам достаточно таблицы-источника и пары вспомогательных таблиц на стороне SQL Server, но при условии, что что: 1. такой синхронизатор один 2. данные на получателе не меняются, точнее, не надо синхронизировать в обратную сторону. Не очень понятен смысл таблицы и источника на стороне MS SQL и пары вт на стороне MS SQL 1. и 2. выполняются если в таблице PostgreSQL произошло например удаление, то никак это удаление отловить невозможно. PostgreSQL открыт только на чтение. Ничего добавлять или дописывать туда нельзя. Единственное что доступно это служебные поля но база и таблицы WITHOUT OID ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 14:15 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Миша56, Как такой вариант, на PG создается транспортная таблица id - Счетчик dCreateTime - опционально время создания записи sType -тип операции вставка, обновление, удаление ('I', 'U', 'D') idКлиента idТовара на оригинальную таблицу вешаем триггер который будет параллельно записывать в эту таблицу все изменения в внешней БД из ПГ вычитывать только те данный у которых счетчик больше последнего принятого (+ некоторое время id выколотых строк, которые получатся из-за не завершенных транзакций). после успешной обработки двигать счетчик дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 19:24 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Swa111, по "условиям" задачки не вариант ( ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 20:47 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Миша56 Есть ли какое то решение для синхронизации таблицы c такой же таблицей MS SQL в пакетном режиме(миллион обновлений за сессию) Соединение слиянием -> Условное разбиение -> и две ветки на удаление/вставку SSIS очень хорошо с такими задачами справляется ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 22:03 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
court Миша56 Есть ли какое то решение для синхронизации таблицы c такой же таблицей MS SQL в пакетном режиме(миллион обновлений за сессию) Соединение слиянием -> Условное разбиение -> и две ветки на удаление/вставку SSIS очень хорошо с такими задачами справляется Поясните, пожалуйста. Для реализации предложенного требуется upstream column defined. В таблице нет такого столбца. Можно конечно попробовать и использовать в качестве upstream column системные поля. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2020, 10:35 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Миша56 court пропущено... SSIS-пакет Соединение слиянием -> Условное разбиение -> и две ветки на удаление/вставку SSIS очень хорошо с такими задачами справляется Поясните, пожалуйста. Для реализации предложенного требуется upstream column defined. В таблице нет такого столбца. Можно конечно попробовать и использовать в качестве upstream column системные поля. я исхожу из сабжевого поста Миша56 есть таблица(с) с двумя полями id клиента и id товара в "Соединение слиянием" (с установленным full join) связываешь набор из ПГ и набор из МС по 2-м полям - то, чего не окажется "слева" - удалить из МС - то, чего не окажется "справа" - вставить в МС ... вот вроде как в тему пример (только у тебя на 2-е ветки, без апдейта) https://www.mssqltips.com/sqlservertip/5082/synchronize-table-data-using-a-merge-join-in-ssis/ ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2020, 13:34 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Миша56 Swa111, по "условиям" задачки не вариант ( Я мог ошибиться, все-таки вы не написали: исходная база на PostgreSQL, а целевая на SQL Server? Но моя версия работает и в этом случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2020, 13:42 |
|
Синхронизация PostgreSQL и MS SQL
|
|||
---|---|---|---|
#18+
Какой OLE DB провайдер вы используете для создания Linked server? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2020, 14:51 |
|
|
start [/forum/search_topic.php?author=excellion&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 493ms |
total: | 633ms |
0 / 0 |