Автор | Сообщение |
|
| постоянный участник
|
Пост N: 4092
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.04.15 21:42. Заголовок: Вопросы синхронизации MySQL и LetoDB
Есть сервер, на нем установлен MySQL и LetoDB. Как в режиме реального времени переносить данные из LetoDB в MySQL ?
|
|
|
Ответов - 10
[только новые]
|
|
|
| постоянный участник
|
Пост N: 537
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.04.15 23:22. Заголовок: Andrey пишетКак в ре..
Andrey пишет цитата: | Как в режиме реального времени переносить данные из LetoDB в MySQL ? |
| должен быть клиент для letodb (ловить изменения) и клиент mysql (переносить изменения) в одном приложении, возможно работающий на сервере, но это не обязятельно - вопрос времени появления данных в mysql 1 сек., 30 сек, 60 сек, 10 мин, ...
|
|
|
|
| постоянный участник
|
Пост N: 4094
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.04.15 23:41. Заголовок: SergKis пишет: вопр..
SergKis пишет: цитата: | вопрос времени появления данных в mysql 1 сек., 30 сек, 60 сек, 10 мин, ... |
| Может и неправильно ставлю вопрос, но пытаюсь пока для себя понять: по какому событию клиент mysql может определить что база на LetoDb изменилась ? По таймеру не хотелось бы... Т.е. есть несколько баз base01.dbf, base02.dbf и т.д. В каждой базе с разной периодичностью, меняются/добавляются записи. Я конечно могу рядом с базой выкладывать семафорный файл (сразу из программы делать) - допустим base01.txt, а в нем через ";" указывать номера измененных записей. А после обработки клиентом mysql стирать этот файл. Но это по моему не совсем правильно... Там несколько исключений появляется. Как делаются такие системы (по синхронизации) разных баз ?
|
|
|
|
| постоянный участник
|
Пост N: 538
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.04.15 00:15. Заголовок: Andrey пишет:по како..
Andrey пишет: цитата: | по какому событию клиент mysql может определить что база на LetoDb изменилась ? |
| алгоритм примерно такой: 0. коннект к letodb и mysql уже есть 1. имеем список соответсвия таблица leto, таблица mysql, данные последнего обмена 2. в таблицы из списка в структуру добавим поле "^" - версия записи или "=" - timestamp время последней модификации (заполняет rdd), делаем тэг в индекс таблицы на это поле 3.клиент letodb проходит по списку, открывает таблицу leto, OrdSetFocus(на тэг модификации), dbGoBottom() и сравнивает данные последнего обмена и значение из поля, если не равны, ставим scope или подвод в табл. letodb и все оставшиеся записи переносим в таблицу mysql, заносим значение из поля в данные последнего обмена. 4. так отрабатываем всю таблицу соответсвия до конца
|
|
|
|
| постоянный участник
|
Пост N: 539
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.04.15 00:22. Заголовок: PS. letodb и mysql м..
PS. letodb и mysql могут находиться на разных серверах. Если программа все время висит, то запуск - таймер, если актуальность 5-10 минут и больше запускай чем хочешь, сам или планировщик, большого значение это не имеет, на мой взгляд
|
|
|
|
| постоянный участник
|
Пост N: 4096
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.04.15 00:52. Заголовок: SergKis пишет: алго..
SergKis пишет: Супер !
|
|
|
|
| постоянный участник
|
Пост N: 541
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.04.15 01:10. Заголовок: Andrey напомню, таб..
Andrey напомню, таблица mysql длжна иметь уникальный ключ, находящийся и в таблице letodb и данные в mysql вносить командой InsertUpdate по ключу
|
|
|
|
| постоянный участник
|
Пост N: 4142
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.04.15 21:57. Заголовок: SergKis пишет: 2. в..
SergKis пишет: цитата: | 2. в таблицы из списка в структуру добавим поле "^" - версия записи или "=" - timestamp время последней модификации (заполняет rdd), делаем тэг в индекс таблицы на это поле |
| База локальная в другом часовом поясе. ЛетоДБ на сервере в Москве, московский часовой пояс. Если поле делаю типа "=" - timestamp, то как значение этого поля запишется на сервер ЛетоДБ и как потом сравнить(получить) новые записи с ЛетоДБ на базу MySQL ? Я поле типа "=" никогда не использовал....
|
|
|
|
| постоянный участник
|
Пост N: 620
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.04.15 22:58. Заголовок: Andrey пишет:Я поле ..
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 в строку и обратно - пригодится. Можно вместо поля = использовать ^ - версия записи (каждая запись будет иметь свой номер-счетчик) и работать от нее.
|
|
|
|
| постоянный участник
|
Пост N: 4143
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.04.15 23:57. Заголовок: SergKis пишет: что ..
SergKis пишет: цитата: | что куда не понятно. Предполагаю local => letodb => MySQL. Говорим о letodb => MySQL. |
| Всё правильно ! SergKis пишет: цитата: | Можно вместо поля = использовать ^ |
| А что лучше использовать для быстрой выборке из letodb для MySQL ? Если использовать тип "=" то можно наверно держать открытым индекс по этому полю и сравнивать это поле с MySQL. Допустим 10 записей в letodb было изменено. делаем цикл по базе letodb и сравниваем с аналогичным полем MySQL. Как попадается 1-ое одинаковое значение (11-я запись) в MySQL, то выход из цикла. В результате придётся пробегать не всю базу а только часть её. Правильно ли я понял алгоритм сравнения ?
|
|
|
|
| постоянный участник
|
Пост N: 621
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.04.15 08:08. Заголовок: Andrey пишет:Допусти..
Andrey пишет: цитата: | Допустим 10 записей в letodb было изменено. делаем цикл по базе letodb и сравниваем с аналогичным полем MySQL |
| Об этом, я вообще не говорил, прочитай алгоритм сначала и медленно (с карандашем). Речь шла о загрузке изменений из letodb => MySQL и все. Что использовать = или ^, это тебе решать. Создай (для простоты DBFCDX) тестируй и анализируй. Главное, правильно, сформулируй чего хочешь достигнуть, какую архитектуру строишь.
|
|
|
|