2017-02-19 19 views
0

На Ubuntu 14.04 терминала с помощью Баша, я в состоянии сбросить с главной БД MySQL к ведомому:Выполните голова на туздЫшпре в то же время, как трубопровод для MySQL

mysqldump --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data=2 --user=myuser --password=[password] --host=127.0.0.1 mydb | mysql --max_allowed_packet=128M -h 192.168.1.110 -u myuser -p[password] otherdb 

Но я одновременно хочу, чтобы перенаправить выход туздЫшпр к head -30 > /tmp/pointintime.log, так что я могу получить момент времени информация:

-- 
-- Position to start replication or point-in-time recovery from 
-- 

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.049868', MASTER_LOG_POS=107; 

Как это сделать? Я попытался с помощью tee, но это приводит к SQL синтаксических ошибок в конце импорта ведомого (как будто его ломка выхода и не посылать полные заявления):

mysqldump --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data=2 --user=myuser --password=[password] --host=127.0.0.1 mydb | tee >(head -30 >/tmp/pointintime.log) | mysql --max_allowed_packet=128M -h 192.168.1.110 -u myuser -p[password] otherdb 

Как mysqldump импорт к подчиненному БД MySQL и одновременно извлечь head -30 свалки? Я не хочу сначала сбрасывать файл, потому что db огромен, его более эффективен для работы по сети.

Я также попытался с помощью нескольких tee переадресаций имели ту же ошибку синтаксиса:

mysqldump --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data=2 --user=myuser --password=[password] --host=127.0.0.1 mydb | tee >(mysql --max_allowed_packet=128M -h 192.168.1.110 -u myuser -p[password] otherdb) >(head -30 >/tmp/pointintime.log) 

ERROR 1064 (42000) at line 47: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near..

ответ

1

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

mysqldump: Got errno 32 on write

Ошибка 32 "Broken трубы."

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

Вам нужно что-то посередине, которое не сломает трубу. Предложение: швейцарская армейская бензопила ... Perl.

Заменить это:

| tee >(head -30 >/tmp/pointintime.log) | 

с этим:

| perl -p -e 'print STDERR $_ unless $. > 30' 2>/tmp/pointintime.log | 

Коммутатор -e говорит Perl, что вместо загрузки сценария Perl из файла, что сценарий находится внутри строки в кавычках, который следует , Переключатель -p заставляет эту маленькую однострочную «программу» запускаться для каждой строки STDIN, после чего каждая строка ввода будет напечатана на STDOUT, причем входная строка временно появляется в переменной $_ по мере прохождения каждой линии, а переменная $., указывающая счетчик бегущей строки. Конечно, STDERR - это второй выходной поток, который мы улавливаем с помощью 2> и перенаправляем ваш файл журнала, и как только $. > 30 истинно, больше строк не записывается в ваш журнал ... но все они записываются на выход.

Простой как это.

Трубопровод mysqldump через Perl таким образом полностью безопасен - он не будет манипулировать данными каким-либо образом, он будет записывать его точно так же, как он появился.Я обычно делаю это, когда мне нужно модифицировать резервный поток «на лету».

+0

приятно, оцените подробное объяснение тоже. – joshweir

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

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