Синхронизируйте локальную базу данных и базу данных живого сайта

У меня есть локальный веб-сайт, на котором пользователь каждый день добавляет элементы в базу данных Mysql. Сейчас хочу сделать живую версию сайта.

Но вместо того, чтобы добавлять элементы в обе базы данных, я хочу добавить только в локальную базу данных. И синхронизировать удаленную базу данных.

Локальный сайт использует XAMPP. Также я не думаю, что репликация - это то, как я хочу это сделать.

Я больше смотрю на способ PHP для выполнения этой задачи.

В настоящее время я понятия не имею, как этого добиться.

Любая идея о том, как это сделать?


person Dark King    schedule 27.02.2019    source источник
comment
Я не думаю, что репликация — это то, как я хочу это делать. Каковы ваши конкретные причины так думать?   -  person Patrick Q    schedule 28.02.2019


Ответы (2)


Самый быстрый способ сделать это с MySQL, но если вы хотите использовать только PHP, есть два способа сделать это, если вы хотите, чтобы оперативные данные отражали только локальные данные (т.е. вы можете удалить все данные и повторное извлечение данных). Поскольку это решение реализовано на PHP, вам придется перебирать каждую отдельную таблицу. Вы можете запустить PHP-скрипт, использующий PDO или MySQLi, но вам понадобится одна из двух стратегий удаления, перечисленных ниже:

1) TRUNCATE и SELECT FROM (быстро, но с потенциальными угрозами безопасности). Это больший риск, поскольку разрешения MySQL для TRUNCATE равны DROP и ALTER. Не команды, к которым вы хотите, чтобы у обычного пользователя базы данных был доступ. Вот SQL, чтобы осуществить это:

TRUNCATE live_database_name.table_name

INSERT INTO live_database_name.table_name SELECT * FROM local_database_name.table_name

2) DELETE FROM и SELECT FROM (чем больше у вас данных, тем медленнее, но безопаснее). Это решение медленнее, потому что вам нужно просмотреть каждую запись в таблице, а не удалять и заново создавать таблицу. Однако DELETE рассматривается как более безопасное разрешение для пользователя базы данных, поскольку он не может DROP целые таблицы. Вот что вам понадобится, чтобы его снять:

DELETE FROM live_database_name.table_name

INSERT INTO live_database_name.table_name SELECT * FROM local_database_name.table_name

person Daniel G    schedule 27.02.2019
comment
Я думаю о том, чтобы сохранить таблицу в локальной базе данных для записи всех действий вставки, обновления, удаления во всех таблицах, а затем использовать ее для создания резервных копий и импорта в удаленную базу данных, чтобы мне не пришлось очищать базу данных каждый раз и вставлять все снова. Также у меня есть изображения, связанные с каждой записью, поэтому со временем я думаю, что это не будет подходящим способом ОБРЕЗАТЬ каждый раз. Есть мысли по этому поводу? или как это реализовать? - person Dark King; 28.02.2019
comment
Вам нужно будет сравнить каждую запись в локальной базе данных с каждой записью в живой (что будет довольно медленно). Что-то, что делает SELECT * FROM local_database_name.table_name, и что-то, что делает SELET * FROM live_database_name.table_name. Затем вы можете перебирать строки, связывая их по уникальному идентификатору. Все, что не существовало в действующей базе данных или было обновлено, вы могли запустить SQL для обновления из двух массивов в PHP. - person Daniel G; 28.02.2019

Если вы не хотите настраивать схему репликации, почему бы просто не использовать (2 или 3) задания cron, создать локальный дамп / удаленный дамп / обновить удаленный с помощью локального дампа. И нет, это не лучший способ сделать это, но он работает...

Всего (2), дамп локального / удаленного обновления с локальным дампом, запуск ежедневного дампа в 1:00 и обновление !: 15:00

0 1 * * * mysqldump --host="localhost" --user="user" --password="password" database_name > backup_name.sql

15 1 * * * mysql --host="remote_host" --user="user" --password="password" --port="3306" database_name < backup_name.sql
person Stephanie Temple    schedule 27.02.2019
comment
Локальный сервер работает на Windows. - person Dark King; 28.02.2019