我们在生产中运行单节点MemSQL社区版,虽然不建议将MemSQL单节点用于生产用途,我们从POC开始并将其部署到Prod
今天我们遇到了以下问题,
(stderr)ERROR 1720(HY000)第3行:叶错误(10.0.0.28:3307):MemSQL对表(26255 MB)的内存使用量已达到'maximum_table_memory'全局变量(26064 MB)的值。此查询无法执行。
我们尝试删除一些数据,但由于以下异常,我们无法删除 错误代码:1712。叶错误(10.0.0.28:3307):没有足够的内存可用于完成当前请求。请求未得到处理。 46.836秒
然后我们将机器上的RAM加倍并重新启动memsql,但是叶子没有拿起额外的内存,然后我更改了memsql.cnf的内存设置(/ var / lib / memsql / leaf-3307 /)并重新启动叶节点,然后叶子拾取了额外的内存
理想情况下,内存不应该是硬编码的,而应该是机器上可用内存的百分比,重启后它应该选择额外的内存
当叶子拿起额外的内存时,我们开始遇到不同的问题
我们不断获得以下2个例外,当我们能够连接并重新启动应用程序(ETL)时,我们再次遇到同样的问题,我们尝试了10次,我们不知道发生了什么,我们尝试重新启动memsql,我们尝试重新平衡分区(我们知道它不起作用但仍然),我们尝试修复数据库但数据库处于在线模式,当叶子在碰到机器配置(AWS)后拾取额外内存时,我们清除(删除)来自其中一个表的一些数据,所以我们认为这可能会产生问题并重新创建表但仍然没有运气
ERROR 1731(HY000):数据库'reports_and_summary'可在磁盘恢复完成后35秒内查询。运行SHOW DATABASES EXTENDED并访问http://docs.memsql.com/5.5/concepts/database#states以获取更多信息
“数据库memsql的主键恢复”
最后唯一有用的是,我们升级了memsql版本,我认为它再次进行了全新安装,它开始工作,但如果没有新版本可供升级,那该怎么办?
是否有人遇到过类似的问题,可能是什么原因?
答案 0 :(得分:2)
1)如果您未在memsql.cnf文件中明确设置maximum_memory,则MemSQL会将maximum_memory设置为计算机上物理内存的90%,并将maximum_table_memory设置为计算机上物理内存的80%。有关详细信息,请参阅http://docs.memsql.com/docs/memory-management。因此,如果您添加更多内存并重新启动MemSQL,只要不受.cnf文件中的maximum_memory设置限制,它就会获取并使用新内存。
2)MemSQL需要使用内存来运行DELETE查询(它是一个多版本数据库 - DELETE查询不会立即物理删除行,它们会将它们标记为已删除。当DELETE提交行时可以删除如果没有其他查询正在使用行,则释放内存。如果你遇到运行删除的内存不足错误,最简单的方法就是在一个删除语句中删除更少的行(即,在删除时放置一个LIMIT 10000并运行几个DELETE而不是一个需要更多内存的大删除然后可用)。如果你的ok删除表中的所有数据,那么TRUNCATE TABLE使用的内存要少得多,然后是DELETE。您也可以运行SET GLOBAL maximum_memory并将maximum_memory调整为更高的值,但不建议这样做。
3)如果你打了一个"数据库正在恢复"错误,因为MemSQL在重启后还没有完成将所有数据从磁盘重新加载到内存中。如果您等待它完成恢复,那么数据将是可查询的。 MemSQL是一个内存优化的数据库,因此所有数据必须在内存中才能运行查询。如果您有MemSQL企业版,则可以使用冗余2运行,然后您不必等待恢复(另一个叶节点上已存储在内存中的另一个数据副本)。