ご質問
パイプの途中でエラーが発生したときに、パイプで繋がれた後続の処理を実行しない方法はありますか?
または、別のアプローチで同様のことが実現できる方法は無いですか?
やりたいこと
- MySQLのバックアップ(
mysqldump
をリモートのストレージに書き込みたい - ローカルには中間ファイルを作成する空き容量が無い
- リモートにも、以下の理由から中間ファイルを作りたくない
- 従量課金である (Azure Blob Storage)
- インターネット越しであり、何度も送信して無駄に帯域を使いたくない
mysqldump
に失敗した場合、リモートのファイルが空ファイルまたは中途半端なファイルで上書きされることを防止したいmysqldump
の失敗とは、例えば以下の状況を想定しています- MySQLの接続数が上限に達しており接続できない
- MySQLサーバーが停止している等で接続できない
今検討中のコマンド
sh
1set -o pipefail 2mysqldump --defaults-file=~/my.conf \ 3 --single-transaction \ 4 --routines \ 5 --triggers \ 6 --events \ 7 --master-data=2 \ 8 --quick \ 9 <database_name> \ 10 | gzip \ 11 | blobxfer upload --storage-account-key <account_key> \ 12 --storage-url https://hoge/path/to/file \ 13 --local-path -
mysqldumpの結果をgzipで圧縮し、Azure Blob Storageに送信する動作を、
パイプで繋げております。
MySQLの認証情報は~/my.conf
から読み込みます。
set -o pipefail
により、パイプの途中でエラーが発生したことはわかりますが、
リモートへの送信処理が実行されてしまうと、エラーが発生した際の標準出力で上書きされてしまいます。
エラー発生時の標準出力はおそらく空データだと思っております。
(全てのエラーを把握できているわけではないので、空データが保障されるかは不明です)
環境
- OS: Ubuntu 18.04
- シェル: bash 4.4.20
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/01 06:58