上下文:
我在子 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
为空格 ( ) 。\s
sed
问题:
在指示子 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 执行之前失败)