Форум » LetoDB, HbNetio. » Вопросы синхронизации MySQL и LetoDB » Ответить

Вопросы синхронизации MySQL и LetoDB

Andrey: Есть сервер, на нем установлен MySQL и LetoDB. Как в режиме реального времени переносить данные из LetoDB в MySQL ?

Ответов - 10

SergKis: Andrey пишетКак в режиме реального времени переносить данные из LetoDB в MySQL ? должен быть клиент для letodb (ловить изменения) и клиент mysql (переносить изменения) в одном приложении, возможно работающий на сервере, но это не обязятельно - вопрос времени появления данных в mysql 1 сек., 30 сек, 60 сек, 10 мин, ...

Andrey: SergKis пишет: вопрос времени появления данных в mysql 1 сек., 30 сек, 60 сек, 10 мин, ... Может и неправильно ставлю вопрос, но пытаюсь пока для себя понять: по какому событию клиент mysql может определить что база на LetoDb изменилась ? По таймеру не хотелось бы... Т.е. есть несколько баз base01.dbf, base02.dbf и т.д. В каждой базе с разной периодичностью, меняются/добавляются записи. Я конечно могу рядом с базой выкладывать семафорный файл (сразу из программы делать) - допустим base01.txt, а в нем через ";" указывать номера измененных записей. А после обработки клиентом mysql стирать этот файл. Но это по моему не совсем правильно... Там несколько исключений появляется. Как делаются такие системы (по синхронизации) разных баз ?

SergKis: Andrey пишет:по какому событию клиент mysql может определить что база на LetoDb изменилась ? алгоритм примерно такой: 0. коннект к letodb и mysql уже есть 1. имеем список соответсвия таблица leto, таблица mysql, данные последнего обмена 2. в таблицы из списка в структуру добавим поле "^" - версия записи или "=" - timestamp время последней модификации (заполняет rdd), делаем тэг в индекс таблицы на это поле 3.клиент letodb проходит по списку, открывает таблицу leto, OrdSetFocus(на тэг модификации), dbGoBottom() и сравнивает данные последнего обмена и значение из поля, если не равны, ставим scope или подвод в табл. letodb и все оставшиеся записи переносим в таблицу mysql, заносим значение из поля в данные последнего обмена. 4. так отрабатываем всю таблицу соответсвия до конца


SergKis: PS. letodb и mysql могут находиться на разных серверах. Если программа все время висит, то запуск - таймер, если актуальность 5-10 минут и больше запускай чем хочешь, сам или планировщик, большого значение это не имеет, на мой взгляд

Andrey: SergKis пишет: алгоритм примерно такой: Супер !

SergKis: Andrey напомню, таблица mysql длжна иметь уникальный ключ, находящийся и в таблице letodb и данные в mysql вносить командой InsertUpdate по ключу

Andrey: SergKis пишет: 2. в таблицы из списка в структуру добавим поле "^" - версия записи или "=" - timestamp время последней модификации (заполняет rdd), делаем тэг в индекс таблицы на это поле База локальная в другом часовом поясе. ЛетоДБ на сервере в Москве, московский часовой пояс. Если поле делаю типа "=" - timestamp, то как значение этого поля запишется на сервер ЛетоДБ и как потом сравнить(получить) новые записи с ЛетоДБ на базу MySQL ? Я поле типа "=" никогда не использовал....

SergKis: Andrey пишет:Я поле типа "=" никогда не использовал По твоему описанию 3-и базы: 1. локальная 2. letodb 3. MySQL что куда не понятно. Предполакаю local => letodb => MySQL. Говорим о letodb => MySQL. Я еще не перешел на эту версию letodb. сечас (2-х поточная версия) использую симв. поле 17 байт с заполнением в триггере DtoS(Date()+StrTran(Time(), ':', '')+right(hb_ntos(hb_milliseconds()), 3), делаю тег и пляшу ... меняются данные letodb, выборка изменений на local базу. Из letodb выбирать изменненые записи, без разницы часовой пояс. Обрабатываешь и запоминаешь время сервера с letodb клиентом выборки. Изучи преобразования типа TimeStamp в строку и обратно - пригодится. Можно вместо поля = использовать ^ - версия записи (каждая запись будет иметь свой номер-счетчик) и работать от нее.

Andrey: SergKis пишет: что куда не понятно. Предполагаю local => letodb => MySQL. Говорим о letodb => MySQL. Всё правильно ! SergKis пишет: Можно вместо поля = использовать ^ А что лучше использовать для быстрой выборке из letodb для MySQL ? Если использовать тип "=" то можно наверно держать открытым индекс по этому полю и сравнивать это поле с MySQL. Допустим 10 записей в letodb было изменено. делаем цикл по базе letodb и сравниваем с аналогичным полем MySQL. Как попадается 1-ое одинаковое значение (11-я запись) в MySQL, то выход из цикла. В результате придётся пробегать не всю базу а только часть её. Правильно ли я понял алгоритм сравнения ?

SergKis: Andrey пишет:Допустим 10 записей в letodb было изменено. делаем цикл по базе letodb и сравниваем с аналогичным полем MySQL Об этом, я вообще не говорил, прочитай алгоритм сначала и медленно (с карандашем). Речь шла о загрузке изменений из letodb => MySQL и все. Что использовать = или ^, это тебе решать. Создай (для простоты DBFCDX) тестируй и анализируй. Главное, правильно, сформулируй чего хочешь достигнуть, какую архитектуру строишь.



полная версия страницы