Отправка таблицы mysql 10 ГБ на удаленный сервер - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь экспортировать большую таблицу myisam (10 ГБ) на удаленный сервер:

zcat mytable.sql.gz | mysql --host=xx --user=xx --port=xx --password=xx dw

При отправке gzip mysqldump происходит систематическая ошибка из-за конфигурации удаленного сервера (которую я не могу изменить) и оперативной памяти.

Я пытался создать дамп с одной вставкой на строку:

mysqldump db_name --extended-insert=FALSE --no-create-info=TRUE | gzip > mytable.sql.gz

и разделить его на 200M кусков:

split -C 200M --numeric-suffixes mytable.sql.gz /dumps/mytable_part    

Но отправил один из этих200M кусков занимает более 20 минут, поэтому отправка всей таблицы будет слишком медленной для обычного резервного копирования.Я думаю, что одна вставка на строку очень медленная.

Решением может быть создание нескольких дампов вставок, но с использованием групповых вставок, таких как INSERT INTO (field) VALUES (1), (2), ... но яЯ не уверен, что это возможно.

Есть ли обходной путь, о котором я не думал?

Ответы [ 3 ]

1 голос
/ 02 июля 2019
mysqldump \
  --extended-insert=FALSE \
  --no-create-info=TRUE \
  db_name \
| ssh \
    username@remote-host.example.com \
    mysql \
      --user=xx \
      --password=xx \
      dw

Как это работает:

mysqldump --extended-insert=FALSE --no-create-info=TRUE db_name Создает дамп MySQL для db_name и передает данные в вывод stdio.

| ssh username@remote-host.example.com Передает по трубопроводуstdio поток в соединение ssh с удаленным хостом

mysql --user=xx --password=xx dw Команда mysql, выполняемая на удаленном хосте соединением ssh.Он читает поток stdio, который передается через соединение ssh и создается из дампа MySQL.Этот дамп создается локально, передается через ssh и импортируется на удаленном хосте в базу данных dw.

Этот метод предпочтительнее, более безопасный и компактный, чем открытие протокола MySQL для широкого Интернета, чем любой компетентный администратор.будет отказываться делать.

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

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

0 голосов
/ 03 июля 2019

Для сжатия на проводе нет необходимости в ручном вызове gzip, флаг -C (сокращение для --compress) делает это с mysql (mysqldump db | mysql -C -h=remote).

В случае ответа Леа, использование ssh -C может ускорить время передачи.

В каждом случае я бы посоветовал вызывать mysqldump с флагом --lock-tables=false, чтобы уменьшить влияние блокировки наdumped db (очень мудрая вещь для производственных систем) ...

PS: Это должно было быть комментарием к предложению @ Билла Карвина , но, похоже, я этого не делаюдостаточно репутации, чтобы комментировать темы ...

0 голосов
/ 02 июля 2019

Вы можете взглянуть на rsync, который является вездесущим алгоритмом дельта-передачи с опциями для размера блока, отслеживания атрибутов, сжатия и туннелирования, однако это не поможет, если узким местом является диск I/O.

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