Сервер №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"
Вы можете сделать это без промежуточного файла, а также сбросить указатели репликации в процессе, чтобы вы не пропустили никаких обновлений (и вам пришлось бы повторно синхронизировать)
Остановить репликацию ведомого
раб> mysql 'остановка подчиненного;'
сбросить мастер к подчиненному, используя --master-data=1
флаг
master> mysqldump -e --master-data = 1 - single-transaction $ DATABASE | ssh -C пользователь @ подчиненный 'mysql $ DATABASE'
начать репликацию на ведомом
ведомый> 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.
Лучше всего, если репликация невозможна и на локальном сервере недостаточно места на диске, это выдержать время простоя и выполнить полную синхронизацию с живыми файлами базы данных.
В зависимости от скорости сетевого подключения это, вероятно, приведет к меньшему времени простоя, чем установка нового диска.
В качестве альтернативы рассмотрите возможность добавления к серверу временного запоминающего устройства 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 ГБ это может занять некоторое время и все равно потребовать, чтобы вы сделали ее доступной только для чтения, если вам нужна согласованность.