首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysqldump上执行一个头,同时将管道输送到mysql。

在mysqldump上执行一个头,同时将管道输送到mysql。
EN

Stack Overflow用户
提问于 2017-02-19 01:52:49
回答 1查看 767关注 0票数 0

在使用bash的Ubuntu14.04终端上,我可以从主mysql db转储到从服务器:

代码语言:javascript
复制
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,以便获得时间点信息:

代码语言:javascript
复制
--
-- 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语法错误(就好像它破坏了输出而没有发送完整的语句一样):

代码语言:javascript
复制
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重定向,但语法错误相同:

代码语言:javascript
复制
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服务器版本对应的手册,以获得正确的语法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-19 03:37:51

teehead不能这样做,因为一旦head输出了所请求的行数,head就会关闭它的输入句柄,从而中断管道。下面是您所编写的命令应该看到的内容。

mysqldump: Got errno 32 on write

错误32是“断管”。

另一个错误--我怀疑--是因为坏了的管道导致mysql的输入句柄关闭,部分输出行已经写入,当发生这种情况时,它接收的文件结束被解释为语句的过早结束。

你需要一些中间的东西,它不会把管子弄坏。建议:瑞士军队电锯..。珀尔。

代之以:

代码语言:javascript
复制
| tee >(head -30 >/tmp/pointintime.log) | 

在这方面:

代码语言:javascript
复制
| perl -p -e 'print STDERR $_ unless $. > 30' 2>/tmp/pointintime.log |

-e开关告诉Perl,而不是从文件中加载Perl脚本,脚本位于下面引用的字符串中。-p开关导致为STDIN的每一行运行这个小的单行“程序”,在此之后,每个输入行将被打印到STDOUT,当每一行通过时,输入行会临时出现在变量$_中,变量$.表示运行行计数器。当然,STDERR是第二个输出流,我们用2>捕获并重定向到您的日志文件,一旦$. > 30为真,就不会有更多的行写入您的日志.但它们都写在输出上。

就这么简单。

用这种方式将mysqldump通过Perl是完全安全的--它不会以任何方式操作数据,它会如实地把它写出来。当我需要动态修改备份流时,我通常会这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42322813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档