web-dev-qa-db-ja.com

mysqldump:書き込み時にerrno 32を取得しました

私はこのスクリプトを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
33
20:47:59 0 ~] $ perror 32
OS error code  32:  Broken pipe

したがって、errno 32は「壊れたパイプ」です。 mysqldump出力をgzipにパイピングしているため、これはmysqldumpが完了する前にgzipが終了したことを意味します。例えばディスクがいっぱいであるか、gzipがホストの所定の最大CPU時間/使用量を超えているためです。

36
nos

フォルダー/ home/backup/db /(バックアップの保存に使用している)に書き込みアクセス許可があることを確認します(クイックチェック:そのフォルダーでchmod -R 777を使用して、スクリプトを実行して確認します)。

いくつかのタイプミスが原因で同じ問題が発生しました。

  1. Dbユーザーの名前を間違って入力しました。私は"db_user_1"彼が本当にいたとき"db_user1"

  2. パイプの後、> in gzip > myfile.tar.gz

しかし、できるだけ早くMySQL 5.6+にアップグレードすることをお勧めします。そうすることで、データベースパスワードを他のユーザーに公開することを停止できます。

StackOverflowで この回答 を確認してください。

8
Buttle Butkus

同じ問題に直面した。正確な理由はわかりませんが、ユーティリティを追加すると、PVはすべて機能すると結論付けました。たぶんそれはあなたのシェルbash/shに依存します。

Sudo apt-get install pv

PipeViewerは非常に便利なユーティリティです。たとえば、ディスクへの書き込みプロセスを視覚化できます。

たとえばスクリプト

mysqldump ${MYSQLDUMP_OPTIONS} ${DB} | gzip | pv > ${BACKUP_DEST}/${DB}.sql.gz
2
PRIHLOP

CLIからmysqldumpを使用して、gzipやファイルにパイプしようとすると、「permission denied」エラーが発生しました。

Sudoとしても、mysqldumpSudoとして実行しているにもかかわらず、パイプはまだ使用しようとしていたため、エラーが発生していましたログインしたユーザーアカウントシェルにとして出力を書き込みます。この場合、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が出力を画面に直接ダンプするのを抑制します。

2
alexw

その非常に古いトピックですが、私はその問題に直面していて、それを見つけます:

私のファイル名:db_26/03.tar.gz上記のようなエラーが発生します。しかし、私が使用する場合:db.tar.gzエラーはありません。

そのため、ファイル名を確認する必要があります

1
Muhammet Arslan

Errno 32は「壊れたパイプ」であるため、パイプの宛先(この場合はgzip)でエラーが発生すると、errno 32が発生します。ディレクトリ構造が変更され、${BACKUP_DEST}は、この問題が発生する既存のディレクトリを参照しなくなりました。

これをデバッグするには、他の何かをgzipコマンドにパイプするか、gzipを含まない非圧縮バックアップを作成します。

1
reor

フォルダがあなたの場所、/ home/backup/db /に存在するかどうかを確認してください

いいえの場合、すべてのサブフォルダーを作成します。

コマンド:mkdir/home/backup/db /

その後、コマンドを再度実行してください。

DBのダンプができなかったことに驚きました。前日にできました。今、私はこのエラーを受け取っていました。

nosが言ったように、エラーメッセージはパイプが壊れていることを意味し、ディスクに出力を書き込めないことを意味します。私の場合、私のSSHユーザーは、mysqldump命令で、ターゲットのフォルダーに書き込む許可を持っていませんでした

/ home/your_userディレクトリーにダンプを出力して、同じエラーが引き続き発生することを確認できます。そうすることで問題が解決しました。

1
Brac

Mysqldump出力をs3cmdにパイプすると、このエラーが表示されました。間違ったバージョンのs3cmdを使用したことが原因です。 Ubuntu TrustyおよびDebian Wheezyでは、s3cmdコマンドのパッケージバージョンはstdinをサポートしていません(バージョン1.1.0があるため)。

0
Ryan

この問題で私を助けたのは

export LANG=C

https://github.com/netz98/n98-magerun/issues/771 ごとにmysqldumpを実行する前に

0