metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-10-28 06:52 am
Entry tags:

Синхронизация содержимого баз

«Штирлиц бежал по Цветочной улице, а Плейшнеры все падали и падали»

Народ срется наобсуждает вечную тему - реализация синхронизации/репликации содержимого баз, применительно к Firebird. Вообще говоря, существуют готовые решения для такого, но, насколько я помню, любое подобное решение в итоге накладывает какие-то не совсем вменяемые ограничения на дизайн базы.
В принципе, мне это тоже предстоит реализовывать, но по той причине, что основную обезъянью работу за меня будет делать кодогенератор, меня больше волнуют теоретические и высокоуровненые аспекты, а думать я над ними сейчас не в состоянии. Скорее всего, сделаю составной ключ "ID базы, ID записи".

[identity profile] berezovsky.livejournal.com 2010-10-28 07:11 am (UTC)(link)
ну и пиздец там, "не читайте до обеда советских газет! sql.ru"

[identity profile] denisioru.livejournal.com 2010-10-28 07:34 am (UTC)(link)
Наличие такого списка ВНЕШНИХ инструментов для репликации говорит только о том, что все они разной степени допиленности и глюкавости, а сами разработчики просто не осилили данный функционал.

[identity profile] metaclass.livejournal.com 2010-10-28 07:45 am (UTC)(link)
Кстати, у FB нету логов транзакций, поэтому там классические методы репликации с родными логами БД не реализуются.
Количество какое-то неразумное, да.

[identity profile] denisioru.livejournal.com 2010-10-28 07:48 am (UTC)(link)
Очень часто, как замечено в треде на sql.ru, под логами транзакций подразумевают не сущность ".ldf/.trn-файл", а последовательность записей "лог изменений", который вполне и может формироваться сторонним софтом. Я даже примерно знаю как.

[identity profile] metaclass.livejournal.com 2010-10-28 08:19 am (UTC)(link)
А, я такие логи и буду делать, только это не софт их реализует, а триггера в базе данных.

Кстати, насчет MSSQL - существуют ли там сейчас row-level триггера? А то они были statement-level и меня это как-то печалило при реализации подобных логов - приходилось извращаться, чтобы записи update получить.

[identity profile] denisioru.livejournal.com 2010-10-28 08:23 am (UTC)(link)
ээ? rowlevel всмысле на каждую запись? Нет таких и я думаю не будет.
получить updateнутые записи достаточно просто:

select t1.*
from mytable t1
join inserted i on i.ID=t1.ID
join deleted i on i.ID=t1.ID

[identity profile] denisioru.livejournal.com 2010-10-28 08:23 am (UTC)(link)
бля, вот правильный вариант:

select t1.*
from mytable t1
join inserted i on i.ID=t1.ID
join deleted d on d.ID=t1.ID

[identity profile] gds.livejournal.com 2010-10-28 08:26 am (UTC)(link)
только рекомендую тщательно продумать откат "логов" в случае ошибок, генерируемых бд. Это не rocket science и тут нет "вызова", просто надо продумать.

[identity profile] metaclass.livejournal.com 2010-10-28 08:41 am (UTC)(link)
Откат транзакции к херам, какие еще там ошибки? Логи ж тоже в БД лежат, они тоже откатятся.
Между двумя базами - 2PC, у FB оно штатно работает.

Там другие проблемы - восстановление базы при сдыхании, правильный ордер накатывания логов и взаимодействие сервиса-синхронизатора с транзакциями (типа того, что если есть длинная транзакция, а во время ее закончилась коротенькая) - то сервис, подключившись, увидит данные короткой, а длинной нет, несмотря на то что она работала раньше.
(deleted comment)

[identity profile] vp.livejournal.com 2010-10-28 09:23 am (UTC)(link)
А кратенько рассказать можете, как она реализована? А то именно речь о том, что готовые реализации накладывают на архитектуру базы разные неудобоваримые требования