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