cjh*_*ell 13 mysql memory docker
oom_killer由于 mysql 在插入longblob列时大量消耗内存,我的 MySQL 实例被 Linux 杀死。还原包含非常大longblob列的 mysqldump 时会发生这种情况。
我已经浏览过类似这个博客的内容,它建议将各种读/写缓冲区设置为不同的大小以限制内存消耗。但是,尽管提到的脚本在调整后输出了 350MB 的“TOTAL (MAX)”内存,mysql 在最终被杀死之前仍然会很高兴地吞噬千兆字节的内存。
这是通过 Docker 的复制:
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=foobar -d --name mysql-longblob mysql:5.7
mysql -h 127.0.0.1 -P 3306 -u root --password -e "CREATE DATABASE blobs; USE blobs; CREATE TABLE longblob_test (bigcol LONGBLOB NOT NULL) ENGINE = InnoDB;"
mysql -h 127.0.0.1 -P 3306 -u root --password -e \
"SET GLOBAL max_allowed_packet=536870912;" # 512MB
mysql -h 127.0.0.1 -P 3306 -u root --password -D blobs -e "source ./500MB.sql"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,docker stats 报告了大约 1.8GB 的内存消耗,然后它因超出限制而被 OOM 杀死。在空闲时,mysql 报告了 ~200MB 内存。
其中 500MB.sql 是一个在形状中插入 500MB 文本块的文件:
INSERT INTO longblob_test VALUES ('500MB_WORTH_OF_TEXT_HERE')
Run Code Online (Sandbox Code Playgroud)
所以有几个问题:
1)为什么mysql需要吃1.6GB的内存来摄取一个500MB的列?
2) 如何设置 mysql 的硬上限以防止它超过“x”个内存量?
PS:您可能想告诉我这很愚蠢,您不应该在数据库中存储 500MB 以上的 blob。我绝对100%同意!但这是一种不幸的情况,在这种情况下无法重新构建数据存储。
客户端和服务器都在同一个docker空间吗?
我希望客户端加载 500MB,将其扩展为十六进制(1.0GB),然后将其发送到服务器。那么服务器可能需要类似的空间来进行解析。
所以,我想需要 6x。请注意,“日志文件”需要是最大 blob 的 10 倍。所以也许 10x 就是您需要的数字。那只是在服务器上。
回复 10 倍:
----- 2014-12-01 5.6.22 正式发布 -- 错误修复 -- InnoDB -----
MySQL 5.6.20 补丁 Bug #16963396 / MySQL BLOB写入重做日志文件大小的 10%。这一限制已被放宽。重做日志BLOB写入现在限制为总重做日志大小 ( innodb_log_file_size * innodb_log_files_in_group ) 的 10%。因此,innodb_log_file_size * innodb_log_files_in_group应比表行中找到的最大BLOB数据大小加上其他可变长度字段( VARCHAR、VARBINARY和TEXT类型字段)的长度大 10 倍。如果innodb_log_file_size * innodb_log_files_in_group已经足够大或者您的表不包含BLOB,则无需执行任何操作。(错误#73707,错误#19498877)
参考文献:另请参阅:Bug #16963396。
----- 2014-12-01 5.6.22 正式发布 -- 错误修复 -- InnoDB -----
MySQL 5.6.20 补丁 Bug #16963396 / MySQL BLOB写入重做日志文件大小的 10%。这一限制已被放宽。重做日志BLOB写入现在限制为总重做日志大小 ( innodb_log_file_size * innodb_log_files_in_group ) 的 10%。
因此,innodb_log_file_size * innodb_log_files_in_group应比表行中找到的最大BLOB数据大小加上其他可变长度字段( VARCHAR、VARBINARY和TEXT类型字段)的长度大 10 倍。如果innodb_log_file_size * innodb_log_files_in_group已经足够大或者您的表不包含BLOB数据,则无需执行任何操作。(错误#73707,错误#19498877)
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |