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

Mysql throwing Out of Memory when changing innodb_tmpdir variable to larger partition

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

我有一个更大的分区,我可以在其中指向 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 我需要为我的分区设置一些 permissions/configs?

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

注意 2 如果我不设置 innodb_tmpdir 并将所有内容都保留为默认值,则 index 命令运行时不会出现此问题。 (显然,由于磁盘 space 有限,它在中途崩溃,这就是我更改 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 4GB 内存。是否覆盖了可用的物理内存?您实际上有 > 6GB 或更多的 RAM 可用吗?如果不是 - 请从减小 innodb 缓冲池的大小开始,这样总数量比可用物理内存少几 GB。

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

上读写

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