Название: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: vvaaavv от Март 02, 2020, 14:22 Есть разработанная мной программа на Qt.
Она работает с Базой Данных на локальной машине, через QSqlDatabase::addDatabase("QODBC","First") Существует вторая База Данных в интернете на сервере, работает через QSqlDatabase::addDatabase("QMYSQL","Second") У обоих Баз Данных одинаковая структура. В первую пишутся все данные и читаются. Во вторую только пишутся (Insert, Update, Delete). Всё работает как полагается, если один пользователь. Пришло время подключить ещё одного пользователя (сервер в инете будет общий, Так же как и локально). Я так понимаю, что все изменения произведённые вторым пользователем никак не отобразятся у первого пользователя, ну по сути так же наоборот. Можно конечно было вывернуться в такой ситуации, чтобы ведущей БД был сервер в инете. Но здесь есть несколько минусов, самый основной, что интернета может не быть, какое-то время, а работать надо. Вот как выкрутиться из данной ситуации? Как правильно организовать синхронизацию? Гугл не понимает меня, что я от него хочу! :) Или пните в нужном направление, уже дня 3 потратил. А в голове только один бред. Заранее спасибо ответившим. Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: vbv от Март 02, 2020, 15:35 Для начала, думаю нужно понять для себя:
1. что именно подразумевается под "синхронизацией". 2. ................................ под базой данных. 3. ................................ сервером базы данных. 4. Как подключается пользователь? PS: Сервер будет общий ....., а база данных??? т.е. если сервер общий а у каждого пользователя своя база данных.... - они никогда одни и те-же данные не увидят. Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: sergek от Март 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). Транзакцию замыкаем аналогичным образом. Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: vvaaavv от Март 02, 2020, 17:51 На локальном узле таблицы имеют уникальный id и дополнительное поле, например phase boolean default false. При добавлении/изменении записи это поле принимает значение false. Спасибо огромное, Это как раз то что я хотел. Буду реализовывать...Только надо всё будет основательно продумать. Теперь есть представление в какую сторону двигаться! Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: vvaaavv от Март 02, 2020, 18:23 Для начала, думаю нужно понять для себя: Я в школе плохо учился, как вот только институт закончил сам не понимаю :)1. что именно подразумевается под "синхронизацией". ??? а что синхронизация какое-то имеет другое понятие? Объединение БД, что-бы они всегда были "Одинаковые" не?2. ................................ под базой данных. БД - Набор таблиц с полями и их значениями. Ну с сервером БД, да немного некорректно выразился, согласен. Для меня это такое место в сети интернет, где располагается моя БД.3. ................................ сервером базы данных. 4. Как подключается пользователь? Я же написал... через программу, которой всё равно кто ей пользуется, может пользоваться один человек, а может 10, Но это всё за одним компьютером. Надо поставить ещё один компьютер, только в другом городе, сколько там пользователей будет я не знаю :)Ну да тоже не до конца тему раскрыл, надо было больше информации написать... PS: Печалька! А почему не увидят? Не захотят? Не?Сервер будет общий ....., а база данных??? т.е. если сервер общий а у каждого пользователя своя база данных.... - они никогда одни и те-же данные не увидят. Меня уже поняли и уже посоветовали как можно организовать, если есть предложения, я готов выслушать, а так это всё вода. Спасибо за участие! Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: sergek от Март 02, 2020, 18:37 Код: Это как раз то что я хотел. Буду реализовывать... Ну, я не уверен, что вы хотели этого. Я описал возможный механизм синхронизации таблиц, но я не понял ничего про второго пользователя))Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: vvaaavv от Март 02, 2020, 18:57 Код: Это как раз то что я хотел. Буду реализовывать... Ну, я не уверен, что вы хотели этого. Я описал возможный механизм синхронизации таблиц, но я не понял ничего про второго пользователя))Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: sergek от Март 02, 2020, 19:24 А какие ещё есть варианты? Средствами самой СУБД, например.Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: vbv от Март 02, 2020, 19:59 Поддерживаю: Репликация средствами СУБД.
С несколькими локальными копиями, будет веселье, при записи в локальную базу и потом синхронизация...... Хотя, если нет счетчиков/триггеров и прочей серверной логики.... Название: Re: Синхронизация Базы данных Локальной и Ин& Отправлено: vvaaavv от Март 02, 2020, 20:10 Поддерживаю: Репликация средствами СУБД. Двусторонняя (Двунаправленная) репликация, вот что мне нужно. Вот как это называется. Буду гуглить, гугл начинает меня понимать... Спасибо всем, направили по нужному пути! Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: DarkHobbit от Март 04, 2020, 09:15 я походу всех сбил с толку с этим вторым пользователем. Необходима синхронизация между локальной БД и той что в Интернете. Вот это куда более конкретная формулировка! Могу вас похвалить, многие гораздо дольше доходят до постановки вопроса.Теперь ещё пара наводящих вопросов. Первое: Цитировать Она работает с Базой Данных на локальной машине, через QSqlDatabase::addDatabase("QODBC","First") Видно, что вторая БД реализована на СУБД MySQL. А что с первой? Она тоже сделана на MySQL? Просто через ODBC можно подключить практически любую СУБД.Существует вторая База Данных в интернете на сервере, работает через QSqlDatabase::addDatabase("QMYSQL","Second") Я это к чему спрашиваю... Если у вас обе СУБД одного типа, задачка чуток попроще, можно взять готовые средства репликации именно для неё (гугл по запросу "репликация для MySQL" выдаёт разные интересные статьи). А вот если СУБД разных типов, придётся писать суровый велосипед с квадратными колёсами. (Что у обоих БД одинаковая структура - это я прочёл. Но структура - это несколько другое.) Второе. Даже для одной СУБД правильная настройка репликации - не совсем тривиальная задача. Поэтому тщательно подумайте, вам точно надо реплицировать в обе стороны или хватит односторонней? (Она чуть попроще.) Название: Re: Синхронизация Базы данных Локальной и Ин& Отправлено: vvaaavv от Март 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" выдаёт разные интересные статьи). А вот если СУБД разных типов, придётся писать суровый велосипед с квадратными колёсами. (Что у обоих БД одинаковая структура - это я прочёл. Но структура - это несколько другое.) Второе. Даже для одной СУБД правильная настройка репликации - не совсем тривиальная задача. Поэтому тщательно подумайте, вам точно надо реплицировать в обе стороны или хватит односторонней? (Она чуть попроще.) Я пока сделал (т.е делаю, доделал чуток осталось (поправить интерфейс программы)) Копирование локальной БД на сервер БД в инете. (Делаю автоматически, было вручную. Не могу точно выразиться. Делаю, так, чтобы можно было всё это делать без моего участия. Т.е дорабатываю программу. Если взять во внимание мой первый пост в этой теме. То выполнялись все запросы в определённую функцию, которая делала так: в локальную сразу, и в инете. Если инета нет, то все запросы сохраняются в определённой таблице, где потом выполняются, потом удаляются) Потом сделаю репликацию в одну сторону с локальной БД, на сервер в инете. (Надо доделывать, пол пути пройдено) Потом буду делать двунаправленную. Нужно для того, чтобы два и более пользователя (Разные локальные компьютеры, на большом расстоянии, т.е не рядом) работали с одной БД как локально (если нет инета) так и онлайн. (Здесь может получиться зацикливание, вот с этим был вопрос. И ещё если добавить ещё один комп с программой, как быть с ним, чтобы у него тоже всё реплицировалось.) Как-то так... Извиняюсь заранее за ошибки, как смог так выразился. Если есть предложения как можно всё это дело реализовать, я только за. Рассмотрю варианты, предложения. Да и сам готов многое поменять, было бы желание и возможности. Учтите, что я чайник, я бы сказал так - я не профи. Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: sergek от Март 04, 2020, 14:30 мда.. Теперь много мусора, а суть задачи все равно ускользает.
Правильно ли я понял, что есть две независимые БД, с которыми работают две группы пользователей. Одну вы называете локальной (интересно, почему - к ней имеется доступ только по локальной по сети?) Другая расположена на каком-то сервере, с доступом по сети интернет. Обе БД выполняют одинаковую задачу, но две группы пользователей принципиально работают только со своими БД. И стоит задача синхронизации данных в обоих БД с учетом того, что взаимодействие этих БД через интернет может отсутствовать. Так? Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: Igors от Март 04, 2020, 14:55 [off]
мда.. Теперь много мусора, а суть задачи все равно ускользает. Как говорит один клиентКод: critique is easy [/off] Название: Re: Синхронизация Базы данных Локальной и Ин& Отправлено: DarkHobbit от Март 04, 2020, 16:07 Вот сейчас мне необходимо совместить две разные БД, которая одна локальная (MS Access (mdb)), другая в инете (MySQL) И здесь я вижу только двунаправленную репликацию для выполнения такой задачи. Я бы, честно говоря, смигрировал сначала с Access на MySQL даже для локальной БД (однонаправленная одноразовая миграция - задача ГОООРАЗДО более простая, чем организация двусторонней репликации в гетерогенной БД), а потом уже организовал репликацию средствами MySQL.(Access и MsSQL). СТОП!Так что же у вас в интернете: MySQL или MS SQL? Это вообще говоря две СОВСЕМ РАЗНЫЕ СУБД. И с технической, и с лицензионно-юридической точек зрения. Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: vvaaavv от Март 04, 2020, 16:41 Правильно ли я понял, что есть две независимые БД, с которыми работают две группы пользователей. Одну вы называете локальной (интересно, почему - к ней имеется доступ только по локальной по сети?) Есть программа, которая работает с БД, на этом же компьютере. (Не понимаю как ещё правильней-то: имеется в виду один комп вообще, без участия сети в целом, но с доступом в интернет)Другая расположена на каком-то сервере, с доступом по сети интернет. Да, расположена на каком-то сервере. Должна быть, такая же, точная копия:)Обе БД выполняют одинаковую задачу, но две группы пользователей принципиально работают только со своими БД. Как же на пальцах объяснить-то... попробую. Например есть точка "А" (Пункт приёма оборудования в ремонт, где производится приёмка, выдаётся бумажка клиенту, и это надо делать очень быстро, в любом случае и без участие интернета, если он пропал неожиданно), есть точка "Р" (Пункт ремонта этого оборудования, где тоже предстоит работать с данной программой)И стоит задача синхронизации данных в обоих БД с учетом того, что взаимодействие этих БД через интернет может отсутствовать. Так? Они находятся в разных местах. На разных улицах :) Интернет есть он постоянный, но бывает что не работает час в день, например. Если интернета нет, программа в любом случае должна работать, как на "А", так и на "Р". В данный момент вся работа программы и БД происходит на точке "А". Необходимо разгрузить точку "А" от лишней работы. Это так на пальцах. Всё бы ничего. Просто Точек Приёма есть ещё "Б", и "С". А ещё оператор, который принимает звонки от клиентов, со всех точек, звонит в "Р" или в "А", "Б", "С" чтобы узнать состояние оборудования, и перезванивает клиенту, что не совсем удобно. её тоже можно обозначить точкой "О". И вот в этих условиях происходит бардак и постоянные непонятки. Все три точки работают со своими БД. Необходимо объединить все базы в одну (Да хоть с нуля, лишь бы работали в дальнейшем) и чтобы все точки работали с ней. Вот такая задача! Пожелайте мне успехов!!! :) Название: Re: Синхронизация Базы данных Локальной и Ин& Отправлено: vvaaavv от Март 04, 2020, 16:44 Так что же у вас в интернете: MySQL или MS SQL? Это вообще говоря две СОВСЕМ РАЗНЫЕ СУБД. И с технической, и с лицензионно-юридической точек зрения. MySQL, не MS SQL, я знаю что они разные. MS SQL тоже можно обзавестись, за доп. плату.В том посту моём единственная опечатка. Прошу считать как MySQL. Название: Re: Синхронизация Базы данных Локальной и Ин& Отправлено: vvaaavv от Март 04, 2020, 18:16 Я бы, честно говоря, смигрировал сначала с Access на MySQL даже для локальной БД Я рассматривал данный вариант. Я конечно могу круто ошибаться: Мне не понравилось что нужно отдельно устанавливать MySQL на комп и настраивать его. Давным давно я с этим делом провозился достаточное количество времени. Необходимо просто поставить программу и что бы она работала. На MySQL возможно будет добиться такой реализации? я имею в виду на компьютер поставить так, что бы запустил и она установилась и моя программа работала с ней. (Я понимаю, что возможно всё, только сколько это займёт время) И как это сделать, если есть ссылки, дайте пожалуйста, почитаю. (Имел в виду правильную установку MySQL на комп и чтобы без заморочек работать в моей программе Qt C++, смигрировать не проблема, проблема будет потом, когда начнут меня дёргать каждый раз после переустановки виндовс, например)Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: sergek от Март 04, 2020, 19:33 Необходимо объединить все базы в одну (Да хоть с нуля, лишь бы работали в дальнейшем) и чтобы все точки работали с ней. Да, критиковать легко)) К тому же, как выясняется, дело все чудесатее - баз не 2, а много, и все они они должны синхронизироваться. Фактически, это совсем другая постановка задачи.Вот такая задача! Пожелайте мне успехов!!! :) Что ж, успехов! Название: Re: Синхронизация Базы данных Локальной и Ин& Отправлено: DarkHobbit от Март 04, 2020, 20:34 Мне не понравилось что нужно отдельно устанавливать MySQL на комп и настраивать его. Давным давно я с этим делом провозился достаточное количество времени. Необходимо просто поставить программу и что бы она работала. На MySQL возможно будет добиться такой реализации? я имею в виду на компьютер поставить так, что бы запустил и она установилась и моя программа работала с ней. Таки да, вы правы - локальная БД в плане настройки сама по себе проще, чем сервер. Кстати, помимо Access, ещё SQLite, которая вообще ничего не потребует, кроме DLL и Qtшного драйвера. Но если на одну чашу весов положить телодвижения по настройке MySQL (которые хорошо известны и описаны), а на другую - телодвижения по настройке репликации РАЗНЫХ СУБД (которую ещё надо свелосипедить), я бы лучше сделал первые. А самое обидное, что к настройке репликации тоже, скорее всего придётся возвращаться "после переустановки виндовс". Я бы перевёл всё на MySQL и написал бы простенькую инструкцию по действиям в случае переустановки. Совсем без обслуживания БД всё равно нельзя оставлять - как минимум, бэкапы делать нужно... Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: DarkHobbit от Март 10, 2020, 08:55 Вдогонку: даже в случае БД на Access она всё равно совсем без настройки не обойдётся. Надо, чтобы в системе был настроен источник ODBC, надо, чтобы был MS Office с Access и, скорее всего, не какой попало версии (знаю случай, когда админы на объекте, не подумав, накатили новый офис, после чего отвалились программы, завязанные на его COM-объекты)... Если всё равно инструкцию по обслуживанию системы писать, лучше уж унифицировать базы и инструкцию писать именно на этот случай.
Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: sergek от Март 10, 2020, 09:44 Почему-то никто не вспомнил про PostgreSQL)) Там вообще ничего настраивать не нужно. В Linux ставится одним нажатием sudo upt-get install.., в Windows уже не помню, но раза 3-4 подтвердить настройки по умолчанию. Работать с ней- одно удовольствие.
Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: vbv от Март 10, 2020, 10:28 Почему-то никто не вспомнил про PostgreSQL)) Там вообще ничего настраивать не нужно. В Linux ставится одним нажатием sudo upt-get install.., в Windows уже не помню, но раза 3-4 подтвердить настройки по умолчанию. Работать с ней- одно удовольствие. Видимо по причине отсутствия этой СУБД в вопросе. Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: vvaaavv от Март 10, 2020, 11:09 Надо, чтобы в системе был настроен источник ODBC, надо, чтобы был MS Office с Access и, скорее всего, не какой попало версии Я тоже так думал, пока не начал тестировать программу в разных Windows. Программа + файл БД (mdb, для старых БД Access 2000) Работает на ура, на моё удивление 7,8,10 и без разницы какой офис, Самое интересное, что Access вообще может быть не установлен. Сам был в шоке. Думал что Access придётся определённый ставить, а нет.(знаю случай, когда админы на объекте, не подумав, накатили новый офис, после чего отвалились программы, завязанные на его COM-объекты) Вот поэтому я решил больше никогда не писать в самом Access, по моей практике, всё что было придумано в Access 2002 уже не компилилось в 2007. Да и скорость выполнения в сотни раз медленнее. (Если брать расчёт в целом, не с Базами Данных)Если всё равно инструкцию по обслуживанию системы писать, лучше уж унифицировать базы и инструкцию писать именно на этот случай. Это уж понятно. Куда без этого.Почему-то никто не вспомнил про PostgreSQL)) Там вообще ничего настраивать не нужно. В Linux ставится одним нажатием sudo upt-get install.., в Windows уже не помню, но раза 3-4 подтвердить настройки по умолчанию. Работать с ней- одно удовольствие. Надо рассмотреть данный вариант, да и в интернете на сервере можно такую БД создать. Название: Re: Синхронизация Базы данных Локальной и Интернет сервера MySQL Отправлено: vvaaavv от Март 10, 2020, 14:36 А вообще куда намного интересней изобретать велосипед :)
К тому же не все таблицы нужны для репликации, есть такие таблицы, которые относятся только к самой программе на данном компьютере. Вроде всё сделал. Создал всякие вспомогательные функции и т.д. Как сделал: В общем создал новую таблицу Query_Table в которую засунул Id (Счётчик), DateTime (Дата время), Primary (логический), Query (Большой текст), User (логический). В неё записываются все запросы (только не Select) В локальной БД создаются 2 строки в этой таблицы (один к самой локальной БД, другой к инет БД), где если запрос был выполнен User помечается на true Создал функцию по таймеру (20 сек. пока поставил), которая собирает все невыполненные запросы из этой таблицы, и выполняет, если соединение установлено, затем отмечаются они как выполненные. Для обратной репликации: В инет БД создал такую же таблицу, только столбцов с User может быть больше (если два пользователя - то добавляется User_2) Там тоже, при удачном выполнение запроса - User = 1, если этот запрос поступил от него и был выполнен, а для User_2 = 0 (По умолчанию) В той же самой функции по таймеру, собирает все невыполненные запросы из инет БД и выполняет их, в случае успеха помечает нужного User как True. Только сегодня пару часов назад, начал тестировать. Вычисляю всевозможные отклонения, исключения и т.д Работы ещё много в этом направление. Подводные камни в любом случае появятся.! |