Назад | Перейти на главную страницу

Резервное копирование базы данных MySQL по сети

Сервер №1 - это сервер базы данных MySQL, работающий на Debian, который содержит множество таблиц и одну конкретную таблицу размером более 100 ГБ.

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

В настоящее время на жестком диске сервера №1 недостаточно места для выполнения полного дампа базы данных (т.е. менее 100 ГБ свободного места). Помимо обновления оборудования, которое потребует простоя, как лучше всего получить дамп базы данных с сервера №1 на сервер №2 в целости и сохранности, без повреждений и без заполнения жесткого диска на сервере №1 в процессе?

Быстрый и грязный способ (Начиная с Сервера №1):

mysqldump -u root -p bigdb | bzip2 -c | ssh -T user@server2 "cat > backup.sql.bz2"

Вы можете сделать это без промежуточного файла, а также сбросить указатели репликации в процессе, чтобы вы не пропустили никаких обновлений (и вам пришлось бы повторно синхронизировать)

  1. Остановить репликацию ведомого

    раб> mysql 'остановка подчиненного;'

  2. сбросить мастер к подчиненному, используя --master-data=1 флаг

    master> mysqldump -e --master-data = 1 - single-transaction $ DATABASE | ssh -C пользователь @ подчиненный 'mysql $ DATABASE'

  3. начать репликацию на ведомом

    ведомый> mysql 'запуск ведомого'

--master-data=1 заставляет mysqldump выдавать CHANGE MASTER TO ... настройки в верхней части дампа, чтобы установить двоичный журнал репликации и смещение к точной точке в двоичном журнале мастеров на момент создания дампа

-e использует расширенный формат вывода, в основном несколько наборов значений для каждого оператора вставки, который более эффективен как на проводе, так и при применении к ведомому устройству.

--single-transation сообщает mysql открыть транзакцию для всего дампа, а не использовать LOCK TABLES.

Вы можете сбрасывать базы данных mysql с удаленного хоста, просто используйте аргумент --host или -h с mysqldump

server2# mysqldump -h server1 -u root -p --opt | gzip > database.sql.gz
server2# zcat database.sql.gz | mysql -u root -p

Очевидно, вы можете пропустить дамп на диск, но импорт, как правило, медленнее, чем дамп. Если ваш ЦП на server2 является узким местом, а ваш диск работает быстро, вы можете пропустить этап gzip, чтобы минимизировать время простоя на главном сервере.

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

Очевидно NFS, если между серверами нет межсетевого экрана. Если у вас есть брандмауэр, вам может потребоваться перенастроить его, чтобы разрешить дополнительный трафик для работы NFS.

Аналогичное решение, немного более сложное, заключалось бы в использовании smbmount на server1 и smbd на server2.

Если вы не хотите возиться с брандмауэром (или не хотите отправлять незашифрованные данные между серверами), я бы порекомендовал sshfs.

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

  1. Изящно завершите работу MySQL
  2. Перемонтируйте раздел MySQL как доступный только для чтения (это поможет, если вы что-нибудь взорвите)
  3. Используйте rsync, wget или что-то подобное, чтобы получить всю копию набора данных и передать ее на второй сервер.
  4. Перемонтируйте раздел MySQL как чтение-запись
  5. Перезагрузите MySQL

В зависимости от скорости сетевого подключения это, вероятно, приведет к меньшему времени простоя, чем установка нового диска.

В качестве альтернативы рассмотрите возможность добавления к серверу временного запоминающего устройства USB и используйте его для получения полного дампа базы данных. Это должно привести к нулевому простою.

Если коробки находятся на разумном физическом расстоянии друг от друга, вы можете подключить USB-накопитель и сделать там свою базу данных.

Другой альтернативой может быть ssh / pipe, если он работает на nix-box, хотя в зависимости от того, какой бэкэнд вы используете для хранения, блокировка таблицы может быть болезненной для большой таблицы, если вы пытаетесь оставить запущенный mysqlprocess.

Из mysqlbox2 что-то вроде:

ssh mysqlbox1 "mysqldump <options for username/pw/tables-to-dump>" > /path/to/spacious/fs/dbdump

Если вы используете только таблицы myisam, выключите mysql и скопируйте файлы данных с server1 на server2. Вы также можете сохранить mysql и поставить его в режим только для чтения с глобальной блокировкой чтения, а затем скопировать таблицы.

Редактирование для ясности и добавление:

Вы также можете mysqldump для таблиц на server1 в stdout и конвейер для mysql, подключенного к server2. Но с таблицей 100 ГБ это может занять некоторое время и все равно потребовать, чтобы вы сделали ее доступной только для чтения, если вам нужна согласованность.