выгрузка таблицы mysql в CSV (stdout) и затем туннелирование вывода на другой сервер - PullRequest
3 голосов
/ 16 февраля 2011

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

Я попытался mysqldumping базы данных с машины src и передать ее в mysql в dest; но моя база данных имеет 48-метровые строки и даже при отключении auto_commit & trx_commit cmd до 2; Я получаю немного медленных собак.

mysqldump -uuser -ppass --opt dbname dbtable  | mysql -h remove.server  -uuser -pass dbname

Затем я попытался выполнить mysqldump строк по миллиону за раз; скопируйте их на сервер dest и выполните mysql

Я немного почитал, и MySQL предлагает, чтобы импорт в стиле CSV LOAD IN FILE был в ~ 20 раз быстрее, чем вставки. Так что теперь я застрял.

Я могу понять, как экспортировать как CSV, используя стандартный синтаксис sql:

SELECT *
INTO OUTFILE '/tmp/tmpfile'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
FROM table;

но, очевидно, это не сработает, так как быстро уничтожит и без того мало места на диске. Поэтому я искал переключатель, который позволяет mysqldump выводить csv в стандартный вывод. Из того, что я прочитал, это не представляется возможным. Единственный способ сделать это - создать FIFO и указать mysql для создания дампа - затем написать скрипт, который одновременно читает FIFO и отправляет его на сервер dest. Хотя не совсем уверен в синтаксисе синхронизации с другим сервером; что подводит меня к моей следующей проблеме.

Предполагая, что я могу заставить mysql выводить CSV-файлы на стандартный вывод, а не в файл; Как мне затем передать этот вывод на сервер Dest? Я рад, что могу просто получить один CSV-файл на сервере Dest, так как на нем больше места; потому что тогда я могу просто использовать mysqlimport из файла.

Что подводит меня к следующему пункту ... Я бы хотел сделать это:

mysqldump -uuser -ppass --opt dbname --tab /dev/stdout dbtable  | mysqlimport -h remove.server  -uuser -pass dbname 

Но похоже, что mysqlimport не поддерживает передачу по нему; Вы должны передать файл.

Просто подумал, печатая это;

Можно ли использовать метод FIFO, указанный выше; затем получить mysqlimport для чтения из FIFO и вставить в сервер dest? Я предполагаю, что единственная проблема заключается в том, что mysql может создавать дамп быстрее, чем он может выполнять импорт на сервер dest; впоследствии заполняя сервер src.

Я немного растерялся из-за того, как сделать дамп mysql CSV для stdout и передать его по сети на сервер dest (желательно импортировать в то же время, но с удовольствием просто дампа в виде файла на dest).

Любая помощь будет принята с благодарностью!

Ура, Бен


ОБНОВЛЕНИЕ: Я использую таблицы innodb; и я не могу закрыть окно src в течение более 10 минут.


ОБНОВЛЕНИЕ: Сейчас я использую sshfs для монтирования dir на dest на src и получаю mysql для выгрузки csv в эту папку - похоже, работает отлично. Тогда нужно просто использовать mysqlimport для загрузки его в базу данных по адресу dest.


ОБНОВЛЕНИЕ: Так что теперь мне удалось перенести данные в поле назначения - импорт все еще такой же медленный, как если бы это было сделано с помощью INSERTS. 9 млн рядов за 12 часов. Здесь что-то не так. Есть идеи?


ОБНОВЛЕНИЕ: Для заинтересованных ... Это тоже не работает: http://forums.mysql.com/read.php?22,154964

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Оказывается, проблема была с хостом, в который я вставлял.Недостаточно ОЗУ + медленный компьютер вызвал резервное копирование запросов.

1 голос
/ 16 февраля 2011

вам потребуется mysqlhostcopy, которые поддерживают scp, разумеется, физическое расстояние между серверами вызывает проблемы с трафиком

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