Синхронизировать идентичные таблицы в отдельных базах данных с php - PullRequest
1 голос
/ 19 ноября 2009

Я пытаюсь настроить PHP-скрипт для чтения нескольких таблиц MySQL из базы данных A, а затем вставлять их в базы данных B и C. Это действительно простой сценарий - копируемые таблицы могут быть даже очищены или удалены прежде чем они будут вставлены в них значения. Все базы данных находятся на одном сервере, и мне не нужно сохранять старые данные, просто перезаписать их.

Единственное, что я не могу сделать, это репликация таблиц; мои настройки хостинга не позволяют.

Я попробовал несколько методов, которые я придумал, и прочитал несколько вопросов и ответов здесь, в SO и в других местах, но я не нашел ответа - мой вопрос, вероятно, слишком прост! Это то, что я хотел бы вызвать из работы cron или вручную, возможно, максимум раз в день. Это даже не должно быть очень эффективным.

Спасибо, я ценю любую помощь, которую вы можете предложить - даже ссылки на предыдущие вопросы с ответом были бы хороши, если бы мой поиск был слабым.

Frank

Ответы [ 3 ]

2 голосов
/ 19 ноября 2009

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

При условии, что базы данных находятся в одном и том же экземпляре MySQL, вы можете просто использовать перекрестный запрос к базе данных, чтобы выбрать данные из одной таблицы и перенести их в другую. Например, включая ваше желание очистить стол перед раздачей:

TRUNCATE TABLE DatabaseA.Table1;
INSERT INTO DatabaseA.Table1A SELECT 
       ColumnFoo, ColumnBar, ColumnBaz 
       FROM DatabaseB.Table1B;

Вы можете записать это в PHP-скрипт, который затем может вызвать cron. Любой другой язык сценариев с адаптером MySQL, вероятно, подойдет.

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

Последнее замечание: если вы начнете использовать другие базы данных позже, помните, что не все из них поддерживают запросы между базами данных (я знаю, по крайней мере, PostgreSQL, который не поддерживает).

2 голосов
/ 13 января 2011

Вы могли бы просто сделать это:

Сначала создайте 3 таблицы.

  • A = таблица из базы данных A
  • B = таблица из базы данных B
  • C = таблица в любой из баз данных, но она должна быть одна ...

(Предположим, C находится в базе данных A)

TRUNCATE TABLE DatabaseA.C;
INSERT INTO DatabaseA.C SELECT 
   ColumnFoo, ColumnBar, ColumnBaz 
   FROM DatabaseB.B;
INSERT INTO DatabaseA.C SELECT 
   ColumnFoo, ColumnBar, ColumnBaz 
   FROM DatabaseA.A;
TRUNCATE TABLE DatabaseA.A;
TRUNCATE TABLE DatabaseB.B;
INSERT INTO DatabaseA.A SELECT 
   ColumnFoo, ColumnBar, ColumnBaz 
   FROM DatabaseA.C;
INSERT INTO DatabaseB.B SELECT 
   ColumnFoo, ColumnBar, ColumnBaz 
   FROM DatabaseA.C;

Теперь у вас есть обе базы данных, синхронизированные друг с другом, и данные не были потеряны.

Если я правильно понимаю слово «синхронизировать», это означает, что можно безопасно получать данные из обеих баз данных и смешивать их все вместе ...

Конечно, могут быть проблемы с идентификаторами и прочим, но если скорость индексации базы данных тоже синхронизирована, то это может просто помочь ...

Также проверьте эту ссылку: О перезаписи данных и идентичных ключах

1 голос
/ 19 ноября 2009

Есть несколько решений.

  • Настройка репликации таблиц. Эта функция MySQL предназначена для распределенных данных, но должна работать от базы данных к базе данных (хотя я не пробовал).

  • Периодически отбрасывать таблицу и воссоздавать с помощью: use b; drop table table; create table table as select * from a.table;</p> <p>use c; drop table table; create table table as select * from a.table; Это предполагает, что a содержит мастер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...