在使用bash的Ubuntu14.04终端上,我可以从主mysql db转储到从服务器:
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但是,我同时希望将mysqldump输出重定向到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?我不想先转储到一个文件,因为数据库是巨大的,它更有效的管道通过网络。
我还尝试使用多个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)错误1064 (42000)在第47行:您的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,以获得正确的语法。
发布于 2017-02-19 03:37:51
tee和head不能这样做,因为一旦head输出了所请求的行数,head就会关闭它的输入句柄,从而中断管道。下面是您所编写的命令应该看到的内容。
mysqldump: Got errno 32 on write
错误32是“断管”。
另一个错误--我怀疑--是因为坏了的管道导致mysql的输入句柄关闭,部分输出行已经写入,当发生这种情况时,它接收的文件结束被解释为语句的过早结束。
你需要一些中间的东西,它不会把管子弄坏。建议:瑞士军队电锯..。珀尔。
代之以:
| 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是完全安全的--它不会以任何方式操作数据,它会如实地把它写出来。当我需要动态修改备份流时,我通常会这样做。
https://stackoverflow.com/questions/42322813
复制相似问题