繁体   English   中英

从存储引擎与MySQL的存储28错误

[英]error with storage 28 from storage engine with mysql

我的存储设备有问题。 我收到此错误

 Got error 28 from storage engine 

我已经检查了存储容量,它仍然可用,并且没有满。 这可能是什么原因? 我检查了一切都没有成功

可能我的主mysql数据目录或mysql tmp用尽了。 有人可以告诉我如何找到自己的位置以进行检查吗?

可能我的主mysql数据目录或mysql tmp用尽了。 有人可以告诉我如何找到自己的位置以进行检查吗?

TL; DR

发出以下命令分别检查服务器数据和临时目录的位置:

SHOW GLOBAL VARIABLES LIKE 'datadir'
SHOW GLOBAL VARIABLES LIKE 'tmpdir'

这些变量的值通常是绝对路径(相对于运行服务器的任何chroot监狱),但是如果它们恰好是相对路径,则它们将相对于启动服务器的进程的工作目录。

然而...

“ MySQL数据目录” (已添加重点)所述:

以下列表简要描述了通常在数据目录中找到的项目...

通过重新配置服务器,可以将上述列表中的某些项目重新放置在其他位置。 另外,使用--datadir选项可以更改数据目录本身的位置。 对于给定的MySQL安装,请检查服务器配置以确定是否已移动项目。

因此,您可能还希望检查许多其他变量的值,包括:

  • pid_file
  • ssl_%
  • %_log_file
  • innodb_data_home_dir
  • innodb_log_group_home_dir
  • innodb_temp_data_file_path
  • innodb_undo_directory
  • innodb_buffer_pool_filename

如果您的服务器没有响应...

您还可以检查服务器的启动配置。

如在“ 指定程序选项”下记录的,“ 通过检查环境变量,然后通过处理选项文件,然后通过检查命令行 ”来确定服务器的启动配置其中优先于较早选项的较新选项。

该文档还列出了在Unix和类似Unix的系统上读取选项文件的位置(如果需要)。 请注意,服务器读取的那些文件的部分由服务器启动的方式决定,如服务器命令选项的第二和第三段所述。

找到MySQL存储文件的位置后,在shell中运行命令:

df -Ph <pathname>

其中<pathname>是要测试的每个位置。 一些磁盘可能位于同一磁盘卷上,因此当df报告它们时,它们将显示为相同的磁盘卷。

[vagrant@localhost ~]$ mysql -e 'select @@datadir'
+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+

[vagrant@localhost ~]$ df -Ph /var/lib/mysql
Filesystem                       Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00   38G  3.7G   34G  10% /

这告诉我datadir的磁盘卷是根卷,包括顶级目录“ / ”及其下的所有内容。 该卷已满10%,未使用34G。

如果datadir达到100%的卷,那么当您插入新数据并且需要扩展MySQL表空间或写入日志文件时,您将开始看到errno 28问题。

在这种情况下,您需要弄清楚正在占用多少空间。 它可能在MySQL目录下,或者像我这样,您的datadir可能是更大的磁盘卷的一部分,而其他所有文件都位于该磁盘卷中。 在这种情况下,系统上文件的任何积累都可能导致磁盘已满。 例如,日志文件或临时文件,即使它们与MySQL无关。

我将从磁盘卷的顶部开始,然后使用du找出哪些目录已满。

[vagrant@localhost ~]$ sudo du -shx /*
33M     /boot
34M     /etc
40K     /home
28M     /opt
4.0K    /tmp
2.0G    /usr
941M    /vagrant
666M    /var

注意:如果df命令告诉您datadir在单独的磁盘卷上,则应从该卷的安装点开始。 一个磁盘卷使用的空间不计入另一磁盘卷。

现在,我看到/usr占用了顶层目录的最大空间。 向下钻取,看看在此之下占用了什么空间:

[vagrant@localhost ~]$ sudo du -shx /usr/*
166M    /usr/bin
126M    /usr/include
345M    /usr/lib
268M    /usr/lib64
55M     /usr/libexec
546M    /usr/local
106M    /usr/sbin
335M    /usr/share
56M     /usr/src

继续逐级向下钻取。

通常,罪魁祸首最终变得非常清晰。 就像您有一些巨大的500G日志文件/var/log ,这个文件已经增长了几个月。

HTTP服务器日志就是典型的罪魁祸首。


对您的评论:

听起来您有一个单独的数据库存储卷。 那很好。

您刚刚将du输出添加到上面的问题中。 我看到在您的1.4T磁盘卷中,迄今为止最大的单个文件是:

1020G   /vol/db1/mysql/_fool_Gerg_sql_200e_4979_main_16419_2_18.tokudb$

这似乎是一个TokuDB表空间。 此处提供有关TokuDB如何处理完整磁盘的信息: https ://www.percona.com/doc/percona-server/LATEST/tokudb/tokudb_faq.html#full-disks

我不会删除这些文件。 我对TokuDB的了解不如对InnoDB的了解,但我认为这些文件是重要的数据文件。 如果删除它们,则将丢失部分数据,并且可能会破坏其余数据。

我发现了这篇文章,其中详细说明了文件的用途: https : //www.percona.com/blog/2014/07/30/examining-the-tokudb-mysql-storage-engine-file-structure/

该手册还说:

从现有表中删除大量行,然后关闭表可能会释放一些空间,但可能不会。 删除行可能只是在TokuDB数据文件中留下未使用的空间(可用于新插入),而不是缩小文件(内部碎片)。

因此,您可以从表中删除行,但是磁盘上的物理文件可能不会缩小。 最终,您可以释放足够的空间来使用ALTER TABLE <tablename> ENGINE=TokuDB ROW_FORMAT=TOKUDB_SMALL;来构建新的TokuDB数据文件ALTER TABLE <tablename> ENGINE=TokuDB ROW_FORMAT=TOKUDB_SMALL; (请参阅https://dba.stackexchange.com/questions/48190/tokudb-optimize-table-does-not-reclaim-disk-space

但这将需要足够的可用磁盘空间来构建新表。

所以,恐怕您已经把自己画在了一个角落。 您不再有足够的磁盘空间来重建大型表。 您绝不能让可用磁盘空间小于重建最大表所需的空间。

此时,您可能必须使用mysqldump从最大表中转储数据。 不一定是整个表,而是您想要保留的表(了解mysqldump --where选项)。 然后DROP TABLE以完全删除该大表。 我认为这将释放磁盘空间,而使用DELETE则不会。

db1卷上没有足够的空间来保存转储文件,因此您必须将其保存到另一个卷。 看来您在/ vol / cbgb1上有更大的音量,但我不知道它是否已满。

我会把整个东西丢掉,以备存档之用。 然后再次转储一个子集。

mkdir /vol/cbgdb1/backup
mysqldump fool Gerg | gzip -c > /vol/cbgdb1/backup/Gerg-dump-full.sql.gz
mysqldump fool Gerg --where "id > 8675309" | gzip -c > /vol/cbgb1/backup/Gerg-dump-partial.sql.gz

我完全在猜测--where的参数。 您必须决定如何选择部分转储。

删除大表后,重新加载转储的部分数据:

gunzip -c /vol/cbgb1/backup/Gerg-dump-partial.sql.gz | mysql fool

如果我在示例中给出了您不太了解的命令,建议您在尝试之前先学习它们。 或找到与这些命令更熟悉的人配对。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM