我在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
答案 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)
由于一些拼写错误,我遇到了同样的问题。
我错误地输入了db用户的名字。当他真的"db_user_1"
时,我"db_user1"
。
在管道之后,我忘记了>
中的gzip > myfile.tar.gz
。
但我建议您尽快升级到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)