2011-02-16 8 views
3

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

+0

Итак, я не могу писать в FIFO, потому что mysql жалуется, что файл уже существует. –

+0

>> Теперь я использую sshfs для монтирования dir в dest на src и получения mysql для вывода csv в эту папку - кажется, работает отлично. # Не могли бы вы немного объяснить, как вы это сделали? – shantanuo

+0

@shantanuo в основном на сервере 'src', вы настраиваете туннель на свой сервер' dest', используя следующую команду: 'sudo -u mysql sshfs user @ dest:/tmp/mysqlcsv/tmp/csvout'. В основном это означает, что скопируйте папку '/ tmp/mysqlcsv', расположенную в' dest', в локальную папку в '/ tmp/csvout'. Затем вы указываете mysql, чтобы выгрузить файл csv в папку '/ tmp/csvout' следующим образом: –

ответ

1

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

1

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

+0

ah sorry; Я должен был упомянуть, что я использую таблицы innodb. –

 Смежные вопросы

  • Нет связанных вопросов^_^