12

在开发服务器上,我尝试运行我已经使用了将近一年的相同脚本,最后得到了:mysqldump: Got errno 32 on write

上周,IT 系统管理员刚刚将虚拟服务器恢复到备份前几天,一切正常。

Drupal 安装很好,实时服务器也很好(开发服务器的副本)......我们在同一个盒子上大约有 30 个虚拟服务器,IT 系统管理员分配了很多资源。

这是我在开发人员上使用 df -h 得到的结果:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        18G  6.1G   12G  36% /
udev           1000M  4.0K 1000M   1% /dev
tmpfs           403M  228K  403M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none           1007M     0 1007M   0% /run/shm
/dev/sdb1       100G  8.1G   87G   9% /data
xxxx@dev1:~$ 

以及在命令行中运行我的脚本后的基本输出:

第 5416 行的错误 1005 (HY000):无法创建表 'content_type_ses_job_postings' (errno: 28) mysqldump:写入时出现错误 32 错误 2003 (HY000):无法在 '198.xx.xx 上连接到 MySQL 服务器。 xx' (111) LDAP 服务器 IP 已更新。

请注意,ERROR 2003即使一切正常,我最后也没有连接到 MySQL 服务器,所以虽然这不应该发生,但我认为这更多的是用户问题,因为数据库备份、保存,然后导入到“持有”数据库然后我在更新内容时切换到它,所以也许这就是问题,但它从来都不是一个特定的问题。

如果error 32与空间有关,空间问题可能出在哪里?如果它与权限有关,权限问题会出现在哪个文件夹上?但是,我不知道如何或什么可以动态更改任何地方的权限...我之前说过,我已经运行这些脚本大约 8 个月没有问题?

开发服务器的基础知识

  • MySQL 5.5.24
  • Ubuntu0.12.04.1
  • PHP 5.3
4

1 回答 1

20

看起来很奇怪

[root@*****]# perror 28
OS error code  28:  No space left on device
[root@*****]# perror 32
OS error code  32:  Broken pipe

由于 mysqldump 在随机位置不断中断,它与空间有关,并且没有磁盘满的情况,我会怀疑更深层次的问题:MySQL 数据包。什么是 MySQL 数据包?

根据本书第99页

图书形象

以下是第 1-3 段的解释:

MySQL 网络通信代码是在查询总是相当短的假设下编写的,因此可以以一个块的形式发送到服务器并由服务器处理,在 MySQL 术语中称为数据包。服务器为临时缓冲区分配内存来存储数据包,并请求足够的内存以完全容纳它。这种架构需要采取预防措施来避免服务器内存不足——这个选项可以实现数据包大小的上限。

与此选项相关的代码可在 sql/net_serv.cc中找到。查看my_net_read(),然后按照对my_real_read()的调用并特别注意 net_realloc()

此变量还限制了许多字符串函数的结果的长度。有关详细信息,请参阅sql/field.ccsql/intem_strfunc.cc

鉴于此解释,进行批量插入将相当快地加载/卸载 MySQL 数据包。当 max_allowed_pa​​cket 对于给定的数据负载太小时尤其如此。

我之前写过这个:MySQL 服务器已经消失,阻碍了大型转储的导入

尝试将mysqldump 的 max_allowed_pa​​cket提高到1G如下:

mysqldump --max-allowed-packet=1073741824 ...

并尝试mysqldump。

如果这不这样做,那么这样做:

将此添加到 my.cnf

[mysqld]
max_allowed_packet = 1G

然后,登录到 MySQLroot@localhost并运行它

mysql> SET GLOBAL max_allowed_packet = 1024 * 1024 * 1024;

并尝试mysqldump。

试试看 !!!

于 2013-07-08T19:52:33.997 回答