私はこのスクリプトをVPSで何年も使用しました。そして、それはまだ機能しています。
DBLIST=`mysql -uroot -pROOT_PASSWORD -ANe"SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','performance_schema')" | sed 's/,/ /g'`
MYSQLDUMP_OPTIONS="-uroot -pROOT_PASSWORD --single-transaction --routines --triggers"
BACKUP_DEST="/home/backup/db/"
for DB in `echo "${DBLIST}"`
do
mysqldump ${MYSQLDUMP_OPTIONS} ${DB} | gzip > ${BACKUP_DEST}/${DB}.sql.gz &
done
wait
tar -czvf /home/backup/db2/`date +\%G-\%m-\%d`_db.tar.gz ${BACKUP_DEST}
今、私は別のホスティングに移動しています。同じスクリプトを使用しようとしています(もちろん、新しい資格情報でROOT_PASSWORDを変更しました)が、なぜこれを取得するのかわかりません:
mysqldump: Got errno 32 on write
mysqldump: Got errno 32 on write
mysqldump: Got errno 32 on write
mysqldump: Got errno 32 on write
mysqldump: Got errno 32 on write
mysqldump: Got errno 32 on write
mysqldump: Got errno 32 on write
mysqldump: Got errno 32 on write
mysqldump: Got errno 32 on write
mysqldump: Got errno 32 on write
mysqldump: Got errno 32 on write
mysqldump: Got errno 32 on write
mysqldump: Got errno 32 on write
20:47:59 0 ~] $ perror 32
OS error code 32: Broken pipe
したがって、errno 32は「壊れたパイプ」です。 mysqldump出力をgzip
にパイピングしているため、これはmysqldumpが完了する前にgzipが終了したことを意味します。例えばディスクがいっぱいであるか、gzipがホストの所定の最大CPU時間/使用量を超えているためです。
フォルダー/ home/backup/db /(バックアップの保存に使用している)に書き込みアクセス許可があることを確認します(クイックチェック:そのフォルダーでchmod -R 777を使用して、スクリプトを実行して確認します)。
いくつかのタイプミスが原因で同じ問題が発生しました。
Dbユーザーの名前を間違って入力しました。私は"db_user_1"
彼が本当にいたとき"db_user1"
。
パイプの後、>
in gzip > myfile.tar.gz
。
しかし、できるだけ早くMySQL 5.6+にアップグレードすることをお勧めします。そうすることで、データベースパスワードを他のユーザーに公開することを停止できます。
StackOverflowで この回答 を確認してください。
同じ問題に直面した。正確な理由はわかりませんが、ユーティリティを追加すると、PVはすべて機能すると結論付けました。たぶんそれはあなたのシェルbash/shに依存します。
Sudo apt-get install pv
PipeViewerは非常に便利なユーティリティです。たとえば、ディスクへの書き込みプロセスを視覚化できます。
たとえばスクリプト
mysqldump ${MYSQLDUMP_OPTIONS} ${DB} | gzip | pv > ${BACKUP_DEST}/${DB}.sql.gz
CLIからmysqldump
を使用して、gzipやファイルにパイプしようとすると、「permission denied」エラーが発生しました。
Sudo
としても、mysqldump
をSudo
として実行しているにもかかわらず、パイプはまだ使用しようとしていたため、エラーが発生していましたログインしたユーザーアカウントシェルにとして出力を書き込みます。この場合、Shellユーザーアカウントには、ターゲットディレクトリへの書き込み権限がありませんでした。
これを回避するには、tee
コマンドとSudo
を組み合わせて使用できます。
mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p --all-databases | gzip -9 | Sudo tee /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz > /dev/null
| Sudo tee /var/backups/...
は、root
によってのみ書き込み可能なディレクトリにパイプできるようにするものです。 > /dev/null
は、tee
が出力を画面に直接ダンプするのを抑制します。
その非常に古いトピックですが、私はその問題に直面していて、それを見つけます:
私のファイル名:db_26/03.tar.gz
上記のようなエラーが発生します。しかし、私が使用する場合:db.tar.gz
エラーはありません。
そのため、ファイル名を確認する必要があります
Errno 32は「壊れたパイプ」であるため、パイプの宛先(この場合はgzip)でエラーが発生すると、errno 32が発生します。ディレクトリ構造が変更され、${BACKUP_DEST}
は、この問題が発生する既存のディレクトリを参照しなくなりました。
これをデバッグするには、他の何かをgzipコマンドにパイプするか、gzipを含まない非圧縮バックアップを作成します。
フォルダがあなたの場所、/ home/backup/db /に存在するかどうかを確認してください
いいえの場合、すべてのサブフォルダーを作成します。
コマンド:mkdir/home/backup/db /
その後、コマンドを再度実行してください。
DBのダンプができなかったことに驚きました。前日にできました。今、私はこのエラーを受け取っていました。
nosが言ったように、エラーメッセージはパイプが壊れていることを意味し、ディスクに出力を書き込めないことを意味します。私の場合、私のSSHユーザーは、mysqldump命令で、ターゲットのフォルダーに書き込む許可を持っていませんでした。
/ home/your_userディレクトリーにダンプを出力して、同じエラーが引き続き発生することを確認できます。そうすることで問題が解決しました。
Mysqldump出力をs3cmdにパイプすると、このエラーが表示されました。間違ったバージョンのs3cmdを使用したことが原因です。 Ubuntu TrustyおよびDebian Wheezyでは、s3cmdコマンドのパッケージバージョンはstdinをサポートしていません(バージョン1.1.0があるため)。