将 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
指向。
/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 向量化?
2022-01-07:下一个排列。实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。 如果不存在下一个更大的排列,则将数字重新排列成