奇怪的“/var/lib/mysql 太满!”消息,分区几乎为空

奇怪的“/var/lib/mysql 太满!”消息,分区几乎为空

我刚刚在我的服务器上遇到一个奇怪的问题:这是一个我刚刚设置的基本 LAMP 服务器,当我尝试重新启动 MySQL 时,出现以下错误。

/etc/init.d/mysql: ERROR: The partition with /var/lib/mysql is too full!

很奇怪的是,我没有为 /var/ 设置特殊分区,并且我使用 df 和 mount 查看了它,但我的分区几乎都是空的!

>> df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       254G  8.8G  232G   4% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            3.9G  4.0K  3.9G   1% /dev
tmpfs           798M  452K  797M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.9G     0  3.9G   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/sda1       180M   35M  133M  21% /boot
/dev/sda3       656G   70M  623G   1% /home

因此我在 Google 上搜索并查看了那里的旧问题,但除了 MySQL 中未经确认的“错误报告”(并且其解决方法对我来说不起作用)之外,我什么也没找到。

所以我很茫然。

现在我的服务器开始出现奇怪的事情:当我对一个相当大的文件(~1Go)执行 LOAD DATA INFILE 时,它加载了一个小时,然后清空了我正在加载它的表...就像它因为空间不足而拒绝数据一样。

注意:我还执行了 df -i,它们都在 1%...注意:当我尝试以 root 身份使用“sudo”执行此操作时,我得到以下信息

sudo /etc/init.d/mysql restart
* Stopping MySQL database server mysqld                   [ OK ]
* Starting MySQL database server mysqld                   [fail]

这更糟糕,因为我不知道为什么......但我猜这又是“太满”的问题。

[编辑:] 我的文件系统:

>> df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda2      ext4      254G  8.9G  232G   4% /
none           tmpfs     4.0K     0  4.0K   0% /sys/fs/cgroup
udev           devtmpfs  3.9G  4.0K  3.9G   1% /dev
tmpfs          tmpfs     798M  460K  797M   1% /run
none           tmpfs     5.0M     0  5.0M   0% /run/lock
none           tmpfs     3.9G     0  3.9G   0% /run/shm
none           tmpfs     100M     0  100M   0% /run/user
/dev/sda1      ext4      180M   35M  133M  21% /boot
/dev/sda3      ext4      656G   70M  623G   1% /home

以下是“ps aux | grep mysql”的结果:

mysql      851  0.2  2.1 619960 177832 ?       Sl   Apr14   2:53 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
mysql    20977  0.1  0.4 380728 34228 ?        Ssl  11:28   0:00 /usr/sbin/mysqld
ruuser      21111  0.0  0.0  11696   936 pts/1    S+   11:29   0:00 grep --color=auto mysql
root     32425  0.0  0.0   4440   748 ?        S    Apr14   0:00 /bin/sh /usr/bin/mysqld_safe

答案1

您是否检查过 MySQL 是否尚未启动?出于某种原因,它有时会说分区太满,只是因为 mysql 守护进程已启动。

您可以使用“ps aux | grep mysql”进行检查。如果您看到一些 mysql 进程正在运行,请尝试使用“service mysql stop”停止它们。如果仍有 mysql 进程,请使用“kill $PID”终止它们,将 $PID 替换为其各自的 PID。

尝试使用“service mysql start”再次启动 mysql。

答案2

出现该消息的原因是(我怀疑)mysql实例打开了一个临时文件,并在保留其句柄的同时将其删除。 这样,当进程终止时,该文件将自动被删除,因为引用计数将达到0。

您可以使用 lsof(以 root 或 mysql 服务用户身份)验证这一点。(deleted)如果是这种情况,您将在输出中看到提及。它创建的临时文件将是 mysql 预订一些空间的有效方法(它可能会生成一个相当大的稀疏文件),这可以解释原因。“空间不足”类型消息的另一个可能原因可能是缺少 inode(df -hi将显示它)——但这通常仅在处理大量小文件(例如代理缓存)时才会遇到。

正如其他人所指出的,这可能是另一个 MySQL 进程正在运行的症状。在这种情况下,使用脚本停止服务;验证没有服务正在运行;如果有,请终止任何剩余的服务;然后开始使用脚本;验证它是否启动。

相关内容