コンテキスト:
サブシェル内のバックアップダンプから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
質問:
サブシェルを指示する前に、次のように出力を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
サブシェルの実行を完了する前にコマンドは失敗します)