Слияние БД

Доброго времени суток!
Вопрос следующий: существует ли приложение, позволяющее выполнять регулярное (например, раз в час) слияние нескольких однотипных баз в одну.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Я знаю, одно коммерческое

Я знаю, одно коммерческое приложение, которое умело загружать данные из одной БД в другую: Ardent DataStage. Но функции этого приложения несколько шире - это скорее шлюз, который позволяет собрать данные из разных источников и прогрузить их в какую-то консолидированную БД.

А в вашем случае надо решить несколько вопросов:
1. Как быть с конфликтами? Например у вас в разных базах появились данные, которые противоречат условию уникальности в итоговой таблице: как выбрать правильные данные?
2. Как быть с дублями? Например, вы уже слили данные из базы, а теперь это делать снова?

В моём опыте работы, делали то что вы написали, но делали не с помощью слияния баз, а с помощью формирования файла выгрузок, т.е. файла с записями, которые добавились/изменились/удалились с момента последней актуализации БД филиала с центральным офисом. Причём структура БД была разработана именно так, чтобы учитывать филиалы и возможности выгрузок в обе стороны.

admin, спасибо за

admin, спасибо за затрачиваемое время!

1. Данные в разных БД независимы. Ключи предполагаю генерировать по принципу: ID = X + номер, где Х - символьное обозначение базы. Такой ход, кажется, решает эту проблему.. Ключ в одной колонке, составной что-то подсказывает что делать не стоит, ибо при слиянии могут начаться разные непонятки..
2. В этом то основная проблема и заключается.. и идей, к сожалению, пока нет ;((

Выгрузка в файл, наверное решит 2-й вопрос, но не совсем понимаю как её реализовать? Не подскажите, куда копать и что курить? ))

Уточнение: данные в базах будут только добавляться, ну и , например, через неделю - удаляться, причем из целевой БД их уже не надо удалять.

Я бы, например, сделал для

Я бы, например, сделал для каждой записи поле timestamp которое содержит дату и время удаления/исправления. Тогда соответственно и выгружал бы те данные, у которых это поле больше определённого значения.

Выгружать можно разными способами, начиная от самописного скрипта на perl, java или php, заканчивая штатной командой COPY:
http://postgresql.ru.net/manual/sql-copy.html

из файла, например, можно грузить каждый файл в свою отдельную таблицу, а затем уже генерировать один SQL-запрос, который соберёт данные из этих таблиц в одну и загрузит в консолидированную. А можно тоже загружать самописным скриптом, проверяя на наличие данных, чтобы сделать UPDATE вместо INSERT.

Понятно, что это так, навскидку, далее надо самому смотреть как наиболее удобно и правильно всё сделать.

ОГРОМНОЕ спасибо за помощь и

ОГРОМНОЕ спасибо за помощь и идею!!

Буду думать над реализацией.. или придумывать альтернативные пути ))

з.ы. результат, если будет, постараюсь выложить на форум..

Решение

Решил проблему следующим способом - в каждой реплицируемых таблиц (исходных баз) создал поле СТАТУС (при инсерте записи ставится "1").
Далее написал несколько программ (сервер и клиент), которые при взятии на репликацию (select на каждом клиенте в файл или через сокет) ставят "2", и если прошёл инсерт в целевую бд (уже на целевом сервере) ставим "3".

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023