powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Синхронизация PostgreSQL и MS SQL
18 сообщений из 18, страница 1 из 1
Синхронизация PostgreSQL и MS SQL
    #39962749
Миша56
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья подскажите решение для синхронизации для следующей задачи.

Есть баз под PostgreSQL есть MS SQL.
В базе PostgreSQL есть таблицы(а,б) клиенты и товары, есть таблица(с) с двумя полями id клиента и id товара, отношение многие ко многим. PostgreSQL подключен к MS SQL через linked server. Таблица с большая пара сотен миллионов записей. Проблема в том, что за один раз выкачать все поля таблицы с не представляется возможным, коннект обрывается на стороне PostgreSQL. Управлять PostgreSQL я не могу, повлиять на время тайм аута возможности нет. Гарантированно за сессию можно выкачивать до миллиона записей.

Есть ли какое то решение для синхронизации таблицы c такой же таблицей MS SQL в пакетном режиме(миллион обновлений за сессию) с использованием служебных полей PostgreeSQL например ? Возможности закачивать всю таблицу за раз нет. А для порционной закачки поля не предусмотрены.
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39962758
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миша56,

Если задача разовая, то можно выгрузить/загрузить через файл.
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39962780
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миша56,

так перебирайте батчами по id по всем таблицам...
where id>=0 and id<1000000
where id>=1000000 and id<2000000
и так далее
вот и будет вам порционная закачка...

а в служебные поля не влезайте.

если надо часто обновлять то надо на стороне источника данных вводить поле типа mtime и выбирать обновления только по нему
или что то поверх pgq (или самописной очереди) для выгрузки обновлений использовать.

В любом случае - это самостоятельная разработка и готовых инструментов скорее всего нет.
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39962980
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миша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, он останавливался, когда переносить уже было нечего.
Хорошо, если синхронизация в одну сторону и если уже перенесенные данные не меняются в источнике, хотя и это решаемо.
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39962987
Миша56
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Лузанов
Миша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, он останавливался, когда переносить уже было нечего.
Хорошо, если синхронизация в одну сторону и если уже перенесенные данные не меняются в источнике, хотя и это решаемо.


Так маленькими кусочками и читаю. Синхронизация в одну сторону, только вот в источнике данные могут удаляться и добавляться. В этом то и проблема.
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39963220
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миша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)

якори запоминаете для обеих таблиц, удаленных тоже может быть дофига.
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39963298
Миша56
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Предлагаемый Вами вариант похож на синхронизацию с использованием буферных таблиц. Вариант возможен. Но проблема осталась PostgreSQL рвет коннект и в таблице PostgreSQL нет никаких полей за которые можно уцепиться как за индекс, даже временной метки нет. Прихожу к единственному выводу использования для синхронизации служебных полей с номерами транзакций и сведениями о заморозках. Да не легко ... но попробовать стоит. Странно, что этого еще никто не сделал. Решение было бы универсальным.
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39963312
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миша56
Ролг Хупин,

Предлагаемый Вами вариант похож на синхронизацию с использованием буферных таблиц. Вариант возможен. Но проблема осталась PostgreSQL рвет коннект и в таблице PostgreSQL нет никаких полей за которые можно уцепиться как за индекс, даже временной метки нет. Прихожу к единственному выводу использования для синхронизации служебных полей с номерами транзакций и сведениями о заморозках. Да не легко ... но попробовать стоит. Странно, что этого еще никто не сделал. Решение было бы универсальным.


Как один из вариантов: вам достаточно таблицы-источника и пары вспомогательных таблиц на стороне SQL Server, но при условии, что
что:
1. такой синхронизатор один
2. данные на получателе не меняются, точнее, не надо синхронизировать в обратную сторону.

И все сработает. Вам нет смысла проверять получатель, если все делается в транзакции.
Второй путь типатакого же, но сделать внешнее приложение, скажем на c#, и оно будет делать как я описал, но отслеживать транзакцию.
Без таблиц вряд ли обойдетесь, но их можно вооще создать в третьей базе, хотя это, конечно, усложнение.
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39963359
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миша56
Задача не разовая, а ежедневная.

GoldenGate вам в руки.
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39963361
Миша56
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин

Как один из вариантов: вам достаточно таблицы-источника и пары вспомогательных таблиц на стороне SQL Server, но при условии, что
что:
1. такой синхронизатор один
2. данные на получателе не меняются, точнее, не надо синхронизировать в обратную сторону.


Не очень понятен смысл таблицы и источника на стороне MS SQL и пары вт на стороне MS SQL

1. и 2. выполняются

если в таблице PostgreSQL произошло например удаление, то никак это удаление отловить невозможно. PostgreSQL открыт только на чтение. Ничего добавлять или дописывать туда нельзя. Единственное что доступно это служебные поля но база и таблицы WITHOUT OID
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39963569
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Миша56,

Как такой вариант, на PG создается транспортная таблица

id - Счетчик
dCreateTime - опционально время создания записи
sType -тип операции вставка, обновление, удаление ('I', 'U', 'D')
idКлиента
idТовара

на оригинальную таблицу вешаем триггер который будет параллельно записывать в эту таблицу все изменения

в внешней БД из ПГ вычитывать только те данный у которых счетчик больше последнего принятого (+ некоторое время id выколотых строк, которые получатся из-за не завершенных транзакций). после успешной обработки двигать счетчик дальше.
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39963620
Миша56
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swa111,

по "условиям" задачки не вариант (
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39963666
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миша56
Есть ли какое то решение для синхронизации таблицы c такой же таблицей MS SQL в пакетном режиме(миллион обновлений за сессию)
SSIS-пакет
Соединение слиянием -> Условное разбиение -> и две ветки на удаление/вставку
SSIS очень хорошо с такими задачами справляется
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39963905
Миша56
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court
Миша56
Есть ли какое то решение для синхронизации таблицы c такой же таблицей MS SQL в пакетном режиме(миллион обновлений за сессию)
SSIS-пакет
Соединение слиянием -> Условное разбиение -> и две ветки на удаление/вставку
SSIS очень хорошо с такими задачами справляется


Поясните, пожалуйста.
Для реализации предложенного требуется upstream column defined. В таблице нет такого столбца. Можно конечно попробовать и использовать в качестве upstream column системные поля.
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39964054
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миша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/

...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39964062
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миша56
Swa111,

по "условиям" задачки не вариант (


Я мог ошибиться, все-таки вы не написали:

исходная база на PostgreSQL, а целевая на SQL Server?
Но моя версия работает и в этом случае.
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39964103
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой OLE DB провайдер вы используете для создания Linked server?
...
Рейтинг: 0 / 0
Синхронизация PostgreSQL и MS SQL
    #39964400
Миша56
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

штатный ODBC для postgreSQL
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Синхронизация PostgreSQL и MS SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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