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
。
- 我在这个分区中创建了一个 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 我需要为我的分区设置一些 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是解决这个问题的详细方案。
我想在非常大的 table 中索引一个非常大的列。默认 /tmp
没有足够的磁盘 space 并且正在抛出 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 我需要为我的分区设置一些 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是解决这个问题的详细方案。