将 innodb_tmpdir 变量更改为更大的分区时,Mysql 抛出内存不足

Posted

技术标签:

【中文标题】将 innodb_tmpdir 变量更改为更大的分区时,Mysql 抛出内存不足【英文标题】:Mysql throwing Out of Memory when changing innodb_tmpdir variable to larger partition 【发布时间】:2021-05-20 07:43:57 【问题描述】:

我想在一个非常大的表中索引一个非常大的列。默认/tmp没有足够的磁盘空间,正在抛出no space left on device error。

我有一个更大的分区,我可以将innodb_tmpdir 指向。

我在这个分区中创建了一个 tmp 目录:/mnt/partition/tmp 将此目录的权限更改为777 chmod -R 777 /mnt/partition/tmp 然后我通过mysql客户端设置innodb_tmpdir变量指向这个目录:SET VARIABLE innodb_tmpdir='/mnt/partition/tmp'; 通过执行正确设置变量:SHOW VARIABLES LIKE 'innodb_tmpdir';

当我尝试使用以下基本命令结构创建索引时出现问题:

create index a on b (c, d, e, f);

立即抛出以下错误:

ERROR 1041 (HY000): Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space

这个错误是怎么回事? o 我需要为我的分区设置一些权限/配置?

注意 1 我是通过终端控制台而不是第三方客户端运行所有这些(即在前台而不是在后台)

注意 2 如果我不设置 innodb_tmpdir 并将所有内容保持为默认值,则 index 命令运行时不会出现此问题。 (显然,由于磁盘空间有限,它在中途崩溃,这是我更改 tmpdir 的真正原因

my.cnf

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[mysqld]
innodb_buffer_pool_size=4G
innodb_buffer_pool_instances=8
wait_timeout=604800
interactive_timeout=604800
local_infile=ON
binlog_expire_logs_seconds=600
skip-log-bin

交换大小: 8.39GB

MYSQL 版本: 8

机器完全专用于mysql

【问题讨论】:

MySQL 的版本是多少? 32 位还是 64 位?您可以添加 my.cnf 的全部内容吗?机器有多少内存/交换?除了 mysql 之外,还有什么需要内存的吗? @pQd 添加了有问题的详细信息。可能仅仅是因为我从终端而不是后台在前台运行客户端吗? (它似乎是由第三方客户端在后台创建索引) 在后台运行 - 我怀疑。你能添加以下信息吗:总可用内存[只包括命令'free'的输出],mysql的确切版本[只包括mysql命令行显示的横幅],它是32位还是64位构建的信息[运行“显示变量喜欢'version_compile_machine';"从mysql命令行]。 /etc/mysql/conf.d/, /etc/mysql/mysql.conf.d/ 是空的吗?如果不是 - 请包括保存在那里的所有文件的内容。谢谢! SET 是否与 ALTER 在同一连接中完成? @RickJames - 感谢您对缓冲池总大小的评论。 【参考方案1】:

在您的配置中,您为 MySQL 提供 4GB 内存用于缓冲池。是否覆盖了可用的物理内存?您实际上有 > 6GB 或更多可用 RAM 吗?如果不是 - 请从减少 innodb 缓冲池的大小开始,这样总数量会比可用物理内存低几 GB。

【讨论】:

【参考方案2】:

问题已解决。原因是 Ubuntu 的 Apparmour 阻止了 mysql 访问其他文件系统。您需要更改 apparmour 的配置以允许对分区进行读写

This是解决这个问题的详细解决方案。

【讨论】:

以上是关于将 innodb_tmpdir 变量更改为更大的分区时,Mysql 抛出内存不足的主要内容,如果未能解决你的问题,请参考以下文章

无法在嵌套循环中使用 pandas 附加更大的数据帧。如何更改为 numpy 向量化?

C#如何将新变量的基类中的变量值更改为派生类

编译 Prefix.pch 文件时出错,导致更大的问题

如何将刷卡器中的分页项目符号更改为文本?

2022-01-07:下一个排列。实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。 如果不存在下一个更大的排列,则将数字重新排列成

C++ 将两个 int 数组连接成一个更大的数组