Я пытаюсь переместить таблицу базы данных на другой сервер; усложнение заключается в том, что машина, в настоящее время работающая с таблицей, имеет мало свободного места; поэтому я ищу решение, которое может работать через сеть.демпинг таблицы mysql в CSV (stdout), а затем туннелирование вывода на другой сервер
Я попытался mysqld загрузить базу данных с машины src и передать ее в mysql в dest; но моя база данных имеет 48 м строк и даже при отключении auto_commit & trx_commit cmd до 2; Я получаю некоторую собаку медленными временами.
mysqldump -uuser -ppass --opt dbname dbtable | mysql -h remove.server -uuser -pass dbname
Затем я попытался выполнить mysqldump строк по миллиону за раз; scp их к машине dest и сделать mysql < file.sql, но это, казалось, прогрессивно медленнее. Я достиг 7-го файла (7 000 000) строк; и последующий миллион импорта занял 240 минут.
Я немного поболтал, и 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 dump csv в stdout. Из того, что я прочитал, это не представляется возможным. Единственный способ, которым я могу это сделать, - создать FIFO и указать mysql для дампа там - затем написать скрипт, который одновременно считывает FIFO и отправляет его на сервер dest. Не совсем уверен в синтаксисе синхронизации с другим сервером; что подводит меня к моей следующей проблеме.
Предполагая, что я могу заставить mysql сбрасывать CSV в stdout, а не в файл; как мне затем передать этот вывод на сервер dest? Я рад, если я могу просто получить один файл csv на сервере dest, поскольку у него больше места; потому что тогда я могу просто использовать mysqlimport из файла.
Что приводит меня к следующему пункту ... Я хотел бы быть в состоянии сделать это:
mysqldump -uuser -ppass --opt dbname --tab /dev/stdout dbtable | mysqlimport -h remove.server -uuser -pass dbname
Но, похоже, mysqlimport doens't поддержки трубопровода к нему; вы должны передать ему файл.
Только что подумал, набрав это;
Можно ли использовать метод FIFO, указанный выше; затем запустите mysqlimport для чтения из FIFO и вставьте его в dest-сервер? Я думаю, единственная проблема в том, что mysql может сбрасывать быстрее, чем он может импортировать сервер dest; впоследствии заполняя сервер src.
Я немного потерял, как сделать dump mysql CSV для stdout и передать его по сети на сервер dest (желательно импортировать в то же время, но с удовольствием просто сбрасывать как файл в dest) ,
Любая помощь была бы принята с благодарностью!
Приветствия, Бен
UPDATE: Я использую InnoDB таблиц; и я не могу закрыть окно src в течение периода, превышающего 10 минут.
UPDATE: Я теперь с помощью SSHFS смонтировать реж на Dest на СРК и получить MySQL, чтобы сбросить CSV в эту папку - кажется, работает отлично. Тогда это просто вопрос использования mysqlimport для загрузки его в базу данных в dest.
UPDATE: Так что теперь мне удалось получить данные на поле Dest - импорт по-прежнему так медленно, как если бы это было сделано с вкладышами. 9-миллиметровые строки импортированы за 12 часов. Что-то здесь не так. Есть идеи?
UPDATE: Для тех, кто заинтересован ... Это не работает либо: http://forums.mysql.com/read.php?22,154964
Итак, я не могу писать в FIFO, потому что mysql жалуется, что файл уже существует. –
>> Теперь я использую sshfs для монтирования dir в dest на src и получения mysql для вывода csv в эту папку - кажется, работает отлично. # Не могли бы вы немного объяснить, как вы это сделали? – shantanuo
@shantanuo в основном на сервере 'src', вы настраиваете туннель на свой сервер' dest', используя следующую команду: 'sudo -u mysql sshfs user @ dest:/tmp/mysqlcsv/tmp/csvout'. В основном это означает, что скопируйте папку '/ tmp/mysqlcsv', расположенную в' dest', в локальную папку в '/ tmp/csvout'. Затем вы указываете mysql, чтобы выгрузить файл csv в папку '/ tmp/csvout' следующим образом: –