上下文:

上下文:

上下文:

我在子 shell 内从备份转储生成 SQL,然后将其通过管道传输到 mysql 执行:

(
 echo "SET FOREIGN_KEY_CHECKS=0;";
 tar --to-stdout -xvjf archive.tar;
 echo "SET FOREIGN_KEY_CHECKS=1;";
) | mysql -h 127.0.0.1 -P 3306 -D mydatabase

这很好用;我可以看到表中恢复的数据。


不幸的是mysqld它是 Kubernetes 集群的一部分,所以我需要通过以下方式转发 SQL 输出kubectl exec

(
 echo "SET FOREIGN_KEY_CHECKS=0;";
 tar --to-stdout -xvjf archive.tar;
 echo "SET FOREIGN_KEY_CHECKS=1;";
) | kubectl exec -i mysql-pod -- mysql -D mydatabase

失败并崩溃:

x backup-dump.sql
第 143 行出现错误 2006 (HY000):MySQL 服务器已消失,
命令以退出代码 1 终止
:写入错误
tar:错误退出因先前的错误而延迟。

经过一些调试,我发现制表符 ( \t) 破坏了tar提取;修复方法是通过正则表达式将所有替换\t为空格 ( ) 。\ssed


问题:

在指示子 shell 之前,需要使用 ,对输出tar进行标准化sed标准输出mysql

问题:

为什么命令通过管道传输到 Kubernetes 时失败?什么是一种可以理解/不复杂的方式拦截stdout并添加中间管道可以与kubectl?

我试过

(
 echo "SET FOREIGN_KEY_CHECKS=0;";
 tar --to-stdout -xvjf archive.tar | sed 's/\t/\s/g';
 echo "SET FOREIGN_KEY_CHECKS=1;";
) | mysql -D mydatabase

(但不执行正则表达式替换;tar不输出到pipe

(
 echo "SET FOREIGN_KEY_CHECKS=0;";
 tar --to-stdout -xvjf archive.tar;
 echo "SET FOREIGN_KEY_CHECKS=1;";
) \
  | sed 's/\t/\s/g' \
  | mysql -D mydatabase

(但tar命令在完成子 shell 执行之前失败)

相关内容