コンテキスト:

コンテキスト:

コンテキスト:

サブシェル内のバックアップダンプから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


質問:

サブシェルを指示する前に、次のように出力を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サブシェルの実行を完了する前にコマンドは失敗します)

ベストアンサー1

おすすめ記事