Russian Qt Forum
Ноябрь 26, 2024, 02:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Синхронизация Базы данных Локальной и Интернет сервера MySQL  (Прочитано 17702 раз)
vvaaavv
Новичок

Offline Offline

Сообщений: 11


Просмотр профиля
« : Март 02, 2020, 14:22 »

Есть разработанная мной программа на Qt.
Она работает с Базой Данных на локальной машине, через QSqlDatabase::addDatabase("QODBC","First")
Существует вторая База Данных в интернете на сервере, работает через QSqlDatabase::addDatabase("QMYSQL","Second")
У обоих Баз Данных одинаковая структура.
В первую пишутся все данные и читаются.
Во вторую только пишутся (Insert, Update, Delete).
Всё работает как полагается, если один пользователь.

Пришло время подключить ещё одного пользователя (сервер в инете будет общий, Так же как и локально).
Я так понимаю, что все изменения произведённые вторым пользователем никак не отобразятся у первого пользователя, ну по сути так же наоборот.

Можно конечно было вывернуться в такой ситуации, чтобы ведущей БД был сервер в инете. Но здесь есть несколько минусов, самый основной, что интернета может не быть, какое-то время, а работать надо.

Вот как выкрутиться из данной ситуации?
Как правильно организовать синхронизацию?


Гугл не понимает меня, что я от него хочу! Улыбающийся
Или пните в нужном направление, уже дня 3 потратил. А в голове только один бред.
Заранее спасибо ответившим.
Записан
vbv
Чайник
*
Offline Offline

Сообщений: 59


Просмотр профиля
« Ответ #1 : Март 02, 2020, 15:35 »

Для начала, думаю нужно понять для себя:
1. что именно подразумевается под "синхронизацией".
2. ................................ под базой данных.
3. ................................ сервером базы данных.
4. Как подключается пользователь?

PS:
Сервер будет общий ....., а база данных???
т.е. если сервер общий а у каждого пользователя своя база данных....  - они никогда одни и те-же данные не увидят.



Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #2 : Март 02, 2020, 15:37 »

С пониманием того, что вы хотите, не только у гугла проблемы)) Если речь о синхронизации сервера с локальным узлом, то могу предложить такую распределенную транзакцию.
На локальном узле таблицы имеют уникальный id и дополнительное поле, например phase boolean default false. При добавлении/изменении записи это поле принимает значение false.
По таймеру некая функция отбирает все записи с phase=false и отправляет на сервер. Протокол, API и формат - по вкусу. Мне нравится https+REST API+json.
Сервер по получении такой порции у себя в БД удаляет записи с полученными id и вставляет новые/измененные записи.
На узел отправляется список обновленных id. На узле для этих записей phase устанавливается true. Транзакция завершена.
Для удаления записей нужна вспомогательная таблица, куда записывается имя таблицы и id удаляемых записей. В REST API сервера для этой функции предусматриваем отдельный ресурс (URL). Транзакцию замыкаем аналогичным образом.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
vvaaavv
Новичок

Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #3 : Март 02, 2020, 17:51 »

На локальном узле таблицы имеют уникальный id и дополнительное поле, например phase boolean default false. При добавлении/изменении записи это поле принимает значение false.
Спасибо огромное, Это как раз то что я хотел. Буду реализовывать...
Только надо всё будет основательно продумать. Теперь есть представление в какую сторону двигаться!
Записан
vvaaavv
Новичок

Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #4 : Март 02, 2020, 18:23 »

Для начала, думаю нужно понять для себя:
Я в школе плохо учился, как вот только институт закончил сам не понимаю Улыбающийся
1. что именно подразумевается под "синхронизацией".
Непонимающий а что синхронизация какое-то имеет другое понятие? Объединение БД, что-бы они всегда были "Одинаковые" не?
2. ................................ под базой данных.
3. ................................ сервером базы данных.
БД - Набор таблиц с полями и их значениями. Ну с сервером БД, да немного некорректно выразился, согласен. Для меня это такое место в сети интернет, где располагается моя БД.
4. Как подключается пользователь?
Я же написал... через программу, которой всё равно кто ей пользуется, может пользоваться один человек, а может 10, Но это всё за одним компьютером. Надо поставить ещё один компьютер, только в другом городе, сколько там пользователей будет я не знаю Улыбающийся
Ну да тоже не до конца тему раскрыл, надо было больше информации написать...
PS:
Сервер будет общий ....., а база данных???
т.е. если сервер общий а у каждого пользователя своя база данных....  - они никогда одни и те-же данные не увидят.
Печалька! А почему не увидят? Не захотят? Не?

Меня уже поняли и уже посоветовали как можно организовать,
если есть предложения, я готов выслушать, а так это всё вода. Спасибо за участие!
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #5 : Март 02, 2020, 18:37 »

Код:
Это как раз то что я хотел. Буду реализовывать...
Ну, я не уверен, что вы хотели этого. Я описал возможный механизм синхронизации таблиц, но я не понял ничего про второго пользователя))
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
vvaaavv
Новичок

Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #6 : Март 02, 2020, 18:57 »

Код:
Это как раз то что я хотел. Буду реализовывать...
Ну, я не уверен, что вы хотели этого. Я описал возможный механизм синхронизации таблиц, но я не понял ничего про второго пользователя))
В голове бардак образовался, я походу всех сбил с толку с этим вторым пользователем. Необходима синхронизация между локальной БД и той что в Интернете. Так будет правильней. А какие ещё есть варианты?

Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #7 : Март 02, 2020, 19:24 »

А какие ещё есть варианты?
Средствами самой СУБД, например.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
vbv
Чайник
*
Offline Offline

Сообщений: 59


Просмотр профиля
« Ответ #8 : Март 02, 2020, 19:59 »

А какие ещё есть варианты?
Средствами самой СУБД, например.
Поддерживаю: Репликация средствами СУБД.

С несколькими локальными копиями, будет веселье, при записи в локальную базу и потом синхронизация......
Хотя, если нет счетчиков/триггеров и прочей серверной логики....
Записан
vvaaavv
Новичок

Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #9 : Март 02, 2020, 20:10 »

А какие ещё есть варианты?
Средствами самой СУБД, например.
Поддерживаю: Репликация средствами СУБД.
Двусторонняя (Двунаправленная) репликация, вот что мне нужно. Вот как это называется. Буду гуглить, гугл начинает меня понимать...

Спасибо всем, направили по нужному пути!
« Последнее редактирование: Март 03, 2020, 11:59 от vvaaavv » Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« Ответ #10 : Март 04, 2020, 09:15 »

я походу всех сбил с толку с этим вторым пользователем. Необходима синхронизация между локальной БД и той что в Интернете.
Вот это куда более конкретная формулировка! Могу вас похвалить, многие гораздо дольше доходят до постановки вопроса.

Теперь ещё пара наводящих вопросов.

Первое:
Цитировать
Она работает с Базой Данных на локальной машине, через QSqlDatabase::addDatabase("QODBC","First")
Существует вторая База Данных в интернете на сервере, работает через QSqlDatabase::addDatabase("QMYSQL","Second")
Видно, что вторая БД реализована на СУБД MySQL. А что с первой? Она тоже сделана на MySQL? Просто через ODBC можно подключить практически любую СУБД.
Я это к чему спрашиваю... Если у вас обе СУБД одного типа, задачка чуток попроще, можно взять готовые средства репликации именно для неё (гугл по запросу "репликация для MySQL" выдаёт разные интересные статьи).
А вот если СУБД разных типов, придётся писать суровый велосипед с квадратными колёсами.
(Что у обоих БД одинаковая структура - это я прочёл. Но структура - это несколько другое.)

Второе. Даже для одной СУБД правильная настройка репликации - не совсем тривиальная задача. Поэтому тщательно подумайте, вам точно надо реплицировать в обе стороны или хватит односторонней? (Она чуть попроще.)
Записан

Мои проекты на Qt: DoubleContact, LInvert
vvaaavv
Новичок

Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #11 : Март 04, 2020, 13:27 »

Видно, что вторая БД реализована на СУБД MySQL. А что с первой? Она тоже сделана на MySQL? Просто через ODBC можно подключить практически любую СУБД.
В общем предыстория. В 2007 году по просьбе друзей бизнесменов, я написал программу, которая работает на MS Access и использует БД mdb. И друзьям понравилась, да я и сам пользовался её, до 2014 года, где постоянно дорабатывал её. Пока не вышел из того бизнеса. Главным выбором почему именно Access: было надо, чтобы поставил прогу и она работала, без всяких настроек ODBC и т.д, т.е без лишнего геморроя. Да и программировать я мог только в Access (Институт однако Улыбающийся ) Друзья продолжали работать с программой.
Жизнь идёт дальше и меняются реалии, сейчас эта программа морально и физически устарела Улыбающийся Я решил отойти от Access в целом. Начал изучать С++ и Qt.
Пол года назад переписал программу под Qt C++, Естественно БД оставил на mdb (Access). Даже с драйверами ODBC не пришлось возиться. Просто поставил и работай, даже самого Access не надо на локальной машине, вообще красота.
Была поставлена задача, где будет использоваться БД на сервере в инете. Я конечно думал что будет больше возни, но оказалось всё намного проще. И программа спокойно работает с такой БД. Пришлось конечно исправлять запросы, на совместимость обоих систем (Access и MsSQL).
Здесь есть большой минус, что интернет должен быть всегда. что не всегда так. Улыбающийся

Вот сейчас мне необходимо совместить две разные БД, которая одна локальная (MS Access (mdb)), другая в инете (MySQL)
И здесь я вижу только двунаправленную репликацию для выполнения такой задачи. Скорее всего буду изобретать велосипед Улыбающийся Потому что, средствами самой СУБД это точно не получится. Ну по крайней мере без всяких костылей.

Я это к чему спрашиваю... Если у вас обе СУБД одного типа, задачка чуток попроще, можно взять готовые средства репликации именно для неё (гугл по запросу "репликация для MySQL" выдаёт разные интересные статьи).
А вот если СУБД разных типов, придётся писать суровый велосипед с квадратными колёсами.
(Что у обоих БД одинаковая структура - это я прочёл. Но структура - это несколько другое.)

Второе. Даже для одной СУБД правильная настройка репликации - не совсем тривиальная задача. Поэтому тщательно подумайте, вам точно надо реплицировать в обе стороны или хватит односторонней? (Она чуть попроще.)

Я пока сделал (т.е делаю, доделал чуток осталось (поправить интерфейс программы)) Копирование локальной БД на сервер БД в инете. (Делаю автоматически, было вручную. Не могу точно выразиться. Делаю, так, чтобы можно было всё это делать без моего участия. Т.е дорабатываю программу. Если взять во внимание мой первый пост в этой теме. То выполнялись все запросы в определённую функцию, которая делала так: в локальную сразу, и в инете. Если инета нет, то все запросы сохраняются в определённой таблице, где потом выполняются, потом удаляются)
Потом сделаю репликацию в одну сторону с локальной БД, на сервер в инете. (Надо доделывать, пол пути пройдено)
Потом буду делать двунаправленную. Нужно для того, чтобы два и более пользователя (Разные локальные компьютеры, на большом расстоянии, т.е не рядом) работали с одной БД как локально (если нет инета) так и онлайн. (Здесь может получиться зацикливание, вот с этим был вопрос. И ещё если добавить ещё один комп с программой, как быть с ним, чтобы у него тоже всё реплицировалось.)

Как-то так... Извиняюсь заранее за ошибки, как смог так выразился.

Если есть предложения как можно всё это дело реализовать, я только за. Рассмотрю варианты, предложения. Да и сам готов многое поменять, было бы желание и возможности.
Учтите, что я чайник, я бы сказал так - я не профи.
« Последнее редактирование: Март 04, 2020, 13:49 от vvaaavv » Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #12 : Март 04, 2020, 14:30 »

мда.. Теперь много мусора, а суть задачи все равно ускользает.
Правильно ли я понял, что есть две независимые БД, с которыми работают две группы пользователей. Одну вы называете локальной (интересно, почему - к ней имеется доступ только по локальной по сети?)
Другая расположена на каком-то сервере, с доступом по сети интернет.
Обе БД выполняют одинаковую задачу, но две группы пользователей принципиально работают только со своими БД.
И стоит задача синхронизации данных в обоих БД с учетом того, что взаимодействие этих БД через интернет может отсутствовать.
Так?
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Март 04, 2020, 14:55 »

[off]
мда.. Теперь много мусора, а суть задачи все равно ускользает.
Как говорит один клиент
Код:
critique is easy
Улыбающийся
[/off]
Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« Ответ #14 : Март 04, 2020, 16:07 »

Вот сейчас мне необходимо совместить две разные БД, которая одна локальная (MS Access (mdb)), другая в инете (MySQL) И здесь я вижу только двунаправленную репликацию для выполнения такой задачи.
Я бы, честно говоря, смигрировал сначала с Access на MySQL даже для локальной БД (однонаправленная одноразовая миграция - задача ГОООРАЗДО более простая, чем организация двусторонней репликации в гетерогенной БД), а потом уже организовал репликацию средствами MySQL.
(Access и MsSQL).
СТОП!
Так что же у вас в интернете: MySQL или MS SQL? Это вообще говоря две СОВСЕМ РАЗНЫЕ СУБД. И с технической, и с лицензионно-юридической точек зрения.
« Последнее редактирование: Март 04, 2020, 16:09 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.163 секунд. Запросов: 23.