mysqldump:写入时出现 errno 32
Posted
技术标签:
【中文标题】mysqldump:写入时出现 errno 32【英文标题】:mysqldump: Got errno 32 on write 【发布时间】:2014-04-12 20:29:50 【问题描述】:我多年来一直在我的 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
【问题讨论】:
【参考方案1】:20:47:59 0 ~] $ perror 32
OS error code 32: Broken pipe
所以 errno 32 是“断管”。您将 mysqldump 输出传送到 gzip
,因此这意味着 gzip 在 mysqldump 完成之前终止。可以例如是因为您的磁盘已满,或者 gzip 超过了您的主机设置的任何最大 CPU 时间/使用率。
【讨论】:
嗯.. 磁盘未满,CPU 空闲。 :( @MultiformeIngegno 您告诉我们您使用 VPS,您是否确认他们没有限制? VPS 限制 CPU 使用率并杀死使用过多 CPU 的进程是很常见的。无论如何,你现在有一个迹象表明 gzip 被杀死了,所以你可以玩弄它,例如不将输出通过管道传输到 gzip,而是直接传输到文件中,看看结果如何。 @nos 重新注意到 CPU 限制确实是我在 AWS 上的问题。我通过nice
ing 转储解决了它。
如果磁盘未满且 CPU 空闲,试试这个:创建一个基本的文本文件,然后在上面运行 gzip 命令,你很快就会意识到问题所在(我想它的方式相同的错误信息)【参考方案2】:
由于几个拼写错误,我遇到了同样的问题。
我输入了错误的 db 用户名。我有"db_user_1"
,而他真的是"db_user1"
。
在管道之后,我忘记了gzip > myfile.tar.gz
中的>
。
但我建议您尽快升级到 MySQL 5.6+,这样您就可以停止将数据库密码暴露给其他用户。
在 *** 上查看 this answer。
【讨论】:
【参考方案3】:确保文件夹 /home/backup/db/(您用于存储备份)具有写访问权限(快速检查:尝试在该文件夹上使用 chmod -R 777 并运行脚本以确保) .
【讨论】:
+1 这是我的问题,文件夹必须有 0777 CHMOD,在我的情况下它有 0755,所以这取决于 mysql 用户的权利【参考方案4】:我很惊讶我无法转储我的数据库,但我在前一天就可以做到。现在,我收到了这个错误。
正如nos所说,错误信息意味着Broken pipe,这意味着输出无法写入磁盘。在我的例子中,我的 SSH 用户没有权限在我的 mysqldump 指令中写入目标文件夹。
您可以在 /home/your_user 目录中输出您的转储以查看它,您仍然会遇到相同的错误。这样做解决了我的问题。
【讨论】:
【参考方案5】:面临同样的问题。 我不知道究竟是为什么,但如果你添加实用程序 PV 得出的结论是一切正常。也许这取决于你的 shell bash/sh。
sudo apt-get install pv
PipeViewer 它是一个非常有用的实用程序,它可以让您可视化写入磁盘的过程,例如。
例如脚本
mysqldump $MYSQLDUMP_OPTIONS $DB | gzip | pv > $BACKUP_DEST/$DB.sql.gz
【讨论】:
【参考方案6】:我在 CLI 中使用 mysqldump
并尝试通过管道传输到 gzip 和/或文件并收到“权限被拒绝”错误。
即使是sudo
,我也遇到了错误,因为虽然我以sudo
运行mysqldump
,但管道仍在尝试使用我登录到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
将其输出直接转储到屏幕上。
【讨论】:
【参考方案7】:检查文件夹是否存在于您的位置,/home/backup/db/
如果没有,则创建每个子文件夹。
命令: mkdir /home/backup/db/
然后再次运行您的命令。
【讨论】:
这也是我们的问题。我在新环境中运行 Deployer,并且不允许创建文件夹。当我手动创建文件夹时,它在后续运行中运行良好。【参考方案8】:Errno 32 是“损坏的管道”,因此管道目标(在本例中为 gzip)发生的任何错误都将导致 errno 32。如果目录结构已更改并且您的 $BACKUP_DEST
不再引用存在的目录会出现这个问题。
我会通过向您的 gzip 命令传递其他内容或创建不涉及 gzip 的未压缩备份来调试此问题。
【讨论】:
【参考方案9】:这个话题太老了,但我正面临这个问题并发现:
我的文件名:db_26/03.tar.gz
它引发了上述错误;但是当我使用时:db.tar.gz
没有错误。
所以你应该检查你的文件名
【讨论】:
我 +1 是因为它对我们有用,但如果有人能解释为什么这会解决它,我会非常喜欢它。对我们来说,如果命令是通过 cron 运行的,旧的文件名有效,但不是在命令行中。 您的文件名中有一个/
正斜杠,因此它试图在(不存在的)目录db_26
中使用03.tar.gz
【参考方案10】:
在将 mysqldump 输出传送到 s3cmd 时,我看到了这个错误。这是由于使用了错误版本的 s3cmd 造成的。在 Ubuntu Trusty 和 Debian Wheezy 上,s3cmd 命令的打包版本不支持标准输入(因为它们的版本为 1.1.0)。
【讨论】:
【参考方案11】:帮助我解决这个问题的是
export LANG=C
根据https://github.com/netz98/n98-magerun/issues/771运行mysqldump之前
【讨论】:
以上是关于mysqldump:写入时出现 errno 32的主要内容,如果未能解决你的问题,请参考以下文章
mysqldump:在写入时得到 errno 32(1and1 共享主机)作为 crontab
[Errno -101] NetCDF:打开 netcdf 文件时出现 HDF 错误