我想知道如何设置MySQL在Linux服务器上使用的内存量的上限。
现在,MySQL将继续占用每个请求的新查询内存,以便最终耗尽内存。有没有办法设置一个限制,以便MySQL不使用这个数量?
答案 0 :(得分:173)
MySQL的最大内存使用量在很大程度上取决于硬件,您的设置和数据库本身。
硬件是显而易见的部分。 RAM越多,磁盘越快 ftw 。不要相信那些每月或每周的新闻信件。 MySQL不会线性扩展 - 甚至不能在Oracle硬件上扩展。这有点棘手。
底线是:对于您的 MySQL设置的推荐,没有一般的经验法则。这一切都取决于当前的用法或预测。
MySQL提供无数变量和开关来优化其行为。如果遇到问题,你真的需要坐下来阅读(f'ing)手册。
至于数据库 - 一些重要的限制因素:
InnoDB
,MyISAM
,...)关于stackoverflow的大多数MySQL技巧都会告诉你5-8所谓的重要设置。首先,并非所有这些都很重要 - 例如为InnoDB分配大量资源而不使用InnoDB并没有多大意义,因为这些资源都被浪费了。
或者 - 很多人建议使用max_connection
变量 - 好吧,他们知道这也意味着MySQL会分配更多资源来满足那些max_connections
- 如果需要的话。更明显的解决方案可能是关闭DBAL中的数据库连接或降低wait_timeout
以释放这些线程。
如果你抓住了我的漂移 - 那里有很多很多东西需要阅读和学习。
表引擎是一个非常重要的决定,许多人在早期就忘记了这些,然后突然发现自己正在与一个30 GB大小的MyISAM
表进行斗争,这些表会锁定并阻止整个应用程序。
我不是说 MyISAM很糟糕,但InnoDB
可以调整为几乎或几乎与MyISAM
一样快,并提供行锁定等功能在UPDATE
上,而MyISAM
在写入时锁定整个表。
如果您可以自己在自己的基础架构上运行MySQL,那么您可能还想查看percona server,因为其中包括来自Facebook和Google等公司的很多贡献(他们知道速度很快),它还包括Percona自己的InnoDB
替代品,名为XtraDB
。
请参阅mycona-server(和-client)设置(在Ubuntu上):http://gist.github.com/637669
数据库大小非常非常重要 - 信不信由你,Intarwebs上的大多数人从来没有处理过大而且编写强烈的MySQL设置,但这些确实存在。有些人会说“使用PostgreSQL !!! 111”之类的话,但是现在让我们忽略它们。
底线是:从尺寸来判断,有关硬件的决定。你不能真正让1 GB的80 GB数据库快速运行 GB的RAM。
不是:越多越好。只需设置所需的索引,并且必须使用EXPLAIN
检查使用情况。除此之外,MySQL的EXPLAIN
确实有限,但这是一个开始。
关于这些my-large.cnf
和my-medium.cnf
个文件 - 我甚至不知道是谁写的。滚动你自己。
一个很好的开始是tuning primer。这是一个bash脚本(提示:你需要linux),它接受SHOW VARIABLES
和SHOW STATUS
的输出并将其包装成有希望的有用建议。如果您的服务器已经运行了一段时间,那么建议会更好,因为会有数据基于它们。
虽然调音底漆不是神奇的酱汁。你仍然应该阅读它建议改变的所有变量。
我真的很想推荐mysqlperformanceblog。它是各种MySQL相关技巧的绝佳资源。它不仅仅是MySQL,它们也非常了解合适的硬件或推荐AWS的设置等。这些人有多年的经验。
当然,另一个很棒的资源是planet-mysql。
答案 1 :(得分:35)
我们使用以下设置:
etc/my.cnf
innodb_buffer_pool_size = 384M
key_buffer = 256M
query_cache_size = 1M
query_cache_limit = 128M
thread_cache_size = 8
max_connections = 400
innodb_lock_wait_timeout = 100
对于具有以下规范的服务器:
Dell Server
CPU cores: Two
Processor(s): 1x Dual Xeon
Clock Speed: >= 2.33GHz
RAM: 2 GBytes
Disks: 1×250 GB SATA
答案 2 :(得分:19)
数据库内存使用是一个复杂的主题。 MySQL Performance Blog很好地涵盖了你的问题,并列出了为什么“保留”记忆非常不切实际的许多原因。
如果你真的想要施加硬限制,你可以这样做,但你必须在操作系统级别这样做,因为没有内置设置。在linux中,您可以使用ulimit,但是您可能必须修改MySQL启动的方式才能强制执行此操作。
最佳解决方案是调低服务器,以便通常的MySQL内存设置的组合将导致MySQL安装的内存使用量降低。这当然会对数据库的性能产生负面影响,但您可以在my.ini
中调整的一些设置是:
key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size
我会从那里开始,看看你是否能得到你想要的结果。关于调整MySQL内存设置,有many articles。
编辑:
请注意一些变量名称have changed in the newer 5.1.x releases of MySQL。
例如:
table_cache
现在:
table_open_cache
答案 3 :(得分:17)
mysqld.exe在RAM中使用480 MB。我发现我将此参数添加到my.ini
table_definition_cache = 400
将内存使用量从400,000+ kb减少到105,000kb
答案 4 :(得分:2)
/etc/my.cnf
中的:
[mysqld]
...
performance_schema = 0
table_cache = 0
table_definition_cache = 0
max-connect-errors = 10000
query_cache_size = 0
query_cache_limit = 0
...
在具有256MB内存的服务器上做得很好。
答案 5 :(得分:0)
如果您要优化docker mysql容器,则以下命令可能会有所帮助。我能够将mysql docker容器从默认的480mb运行到仅100 mbs
docker run -d -p 3306:3306 -e MYSQL_DATABASE = test -e MYSQL_ROOT_PASSWORD =太-e MYSQL_USER = test -e MYSQL_PASSWORD = test -v / mysql:/ var / lib / mysql --name mysqldb mysql- table_definition_cache = 100 --performance_schema = 0 --default-authentication-plugin = mysql_native_password