[英]error with storage 28 from storage engine with mysql
我的存储设备有问题。 我收到此错误
Got error 28 from storage engine
我已经检查了存储容量,它仍然可用,并且没有满。 这可能是什么原因? 我检查了一切都没有成功
可能我的主mysql数据目录或mysql tmp用尽了。 有人可以告诉我如何找到自己的位置以进行检查吗?
可能我的主mysql数据目录或mysql tmp用尽了。 有人可以告诉我如何找到自己的位置以进行检查吗?
发出以下命令分别检查服务器数据和临时目录的位置:
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.