mysqldump:写错了32

时间:2014-03-09 21:15:49

标签: mysql ubuntu mysqldump

我在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

10 个答案:

答案 0 :(得分:36)

20:47:59 0 ~] $ perror 32
OS error code  32:  Broken pipe

所以errno 32是“破管”。你正在将mysqldump输出传递给gzip,所以这意味着在mysqldump完成之前gzip终止了。例如可以因为您的磁盘已满,或者gzip超过了主机所用的最大CPU时间/使用量。

答案 1 :(得分:9)

确保文件夹/ home / backup / db /(用于存储备份的文件夹)具有写访问权限(快速检查:尝试在该文件夹上使用chmod -R 777并运行脚本以确保)

答案 2 :(得分:8)

由于一些拼写错误,我遇到了同样的问题。

  1. 我错误地输入了db用户的名字。当他真的"db_user_1"时,我"db_user1"

  2. 在管道之后,我忘记了>中的gzip > myfile.tar.gz

  3. 但我建议您尽快升级到MySQL 5.6+,这样就可以停止向其他用户公开数据库密码。

    在StackOverflow上查看this answer

答案 3 :(得分:2)

我在CLI中使用mysqldump并试图通过管道传输gzip和/或文件并获得“权限被拒绝”错误。

即使sudo,我收到错误,因为虽然我mysqldump作为sudo运行,但管道仍在尝试使用我登录的用户帐户以shell 来编写输出。在这种情况下,我的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将其输出直接转储到屏幕上。

答案 4 :(得分:1)

它是如此古老的话题,但我正面临着这个问题并发现:

我的文件名:db_26/03.tar.gz它引发了如上所述的错误;但是当我使用:db.tar.gz时没有错误。

所以你应该检查你的文件名

答案 5 :(得分:1)

检查您所在的位置/ home / backup / db /

中是否存在该文件夹

如果不是,请创建每个子文件夹。

命令: mkdir / home / backup / db /

然后再次运行你的命令。

答案 6 :(得分:1)

我很惊讶我无法转储我的数据库,我能够在前一天做到这一点。现在,我收到了这个错误。

nos 所述,错误信息表示Broken pipe,表示输出无法写入磁盘。在我的情况下,我的SSH用户无权在我的mysqldump指令中写入我所针对的文件夹

您可以在/ home / your_user目录中输出转储以查看它仍然会收到相同的错误。这样做解决了我的问题。

答案 7 :(得分:1)

Errno 32是"断管"因此管道目标(在本例中为gzip)发生的任何错误都将导致错误32.如果目录结构已更改且您的${BACKUP_DEST}不再引用存在的目录,则会出现此问题。

我会通过在gzip命令中管道其他东西或者创建一个不涉及gzip的未压缩备份来调试它。

答案 8 :(得分:0)

当将mysqldump输出管道输出到s3cmd时,我看到了这个错误。它是由使用错误版本的s3cmd引起的。在Ubuntu Trusty和Debian Wheezy上,s3cmd命令的打包版本不支持stdin(因为它们的版本为1.1.0)。

答案 9 :(得分:0)

帮我解决这个问题的是

export LANG=C

在每个https://github.com/netz98/n98-magerun/issues/771运行mysqldump之前