Как отразить базу данных MySQL, используя только один сервер - PullRequest
0 голосов
/ 08 мая 2009

Мне нужно часто дублировать одну базу данных на моем сервере MySQL в зеркальную базу данных на том же сервере MySQL.

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

Дублировать исходный код очень просто. Я просто использую rsync -a, чтобы скопировать все из каталога, содержащего производственную среду, в каталог зеркала и применить патч для обновления нескольких файлов конфигурации. Проблема заключается в дублировании базы данных, размер которой вырос почти до 3 ГБ.

Когда я использую mysqldump live_db | mysql mirror_db, копирование базы данных занимает вечность. Кроме того, в это время загрузка ЦП достигает 100%, и мое веб-приложение становится необычайно медленным.

Репликация базы данных, кажется, не вариант, так как у меня только один сервер MySQL. Для репликации требуется два сервера.

Каков наилучший способ дублировать производственную базу данных? Он не должен быть быстрым, но он не должен слишком сильно влиять на производительность системы. Люди по-прежнему смогут использовать мое веб-приложение, пока зеркальный скрипт работает в фоновом режиме.

Ответы [ 2 ]

1 голос
/ 08 мая 2009

Возможные решения, которые я могу придумать:

1) Купить более быстрый сервер

2) Скопируйте необработанные таблицы. Это не идеально, но если это только для тестирования, может быть жизнеспособным.

Я предполагаю, что вы используете таблицы MyISAM, но вот шаги:

  • В идеале запись заблокировать таблицы в производственной базе данных, игнорировать, если это невозможно
  • Скопируйте данные / индексы двоичной таблицы из /var/lib/mysql/production_schema (или аналогичного) в /var/lib/mysql/development_schema. rsync -a (запуск от имени root) было бы идеей сделать это с помощью.
  • перезагрузите сервер MySQL (это ваш единственный простой во всем процессе)
  • CHECK/REPAIR все вкладки в development_schema

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

3) подумайте, нужны ли вам все производственные данные в среде разработки. Можете ли вы быть умным и скопировать только часть данных?

0 голосов
/ 08 мая 2009

Если у вас есть таблицы MyISAM, вы можете использовать mysqlhotcopy .

...