MySQL 最大内存使用量

我想知道如何才能设置一个上限的内存数量 MySQL 使用的 Linux 服务器。

现在,MySQL 将继续占用每个新查询请求的内存,以至于最终耗尽内存。有没有办法设置一个限制,使 MySQL 使用的数量不超过这个数量?

281546 次浏览

Database memory usage is a complex topic. The MySQL Performance Blog does a good job of covering your question, and lists many reasons why it's hugely impractical to "reserve" memory.

如果你真的想强加一个硬限制,你可以这样做,但是你必须在操作系统级别上这样做,因为没有内置的设置。在 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

I'd start there and see if you can get the results you want. There are 很多 物品 out there about adjusting MySQL memory settings.


编辑:

注意,有些变量名称为 在更新的5.1. x 版本的 MySQL 中已经发生了变化

例如:

table_cache

现在是:

table_open_cache

我们使用以下设置:

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

MySQL 的最大内存使用量很大程度上取决于硬件,您的设置 还有数据库本身。

五金店

硬件是最明显的部分。内存越多,越快的磁盘 FTW。但不要相信那些每月或每周的新闻信件。MySQL 不支持线性扩展——甚至在 Oracle 硬件上也不支持。没那么简单。

底线是: 对于 your MySQL 设置的推荐方法,没有一般的经验法则。这完全取决于当前的使用或预测。

Settings & database

MySQL 提供了无数的变量和开关来优化它的行为。如果你遇到问题,你真的需要坐下来阅读(f‘ ing)手册。

至于数据库——一些重要的限制因素:

  • 台式发动机(InnoDBMyISAM,...)
  • 尺寸
  • 指数
  • 用途

大多数关于堆栈溢出的 MySQL 提示会告诉你5-8个所谓的重要设置。首先,并不是所有的资源都很重要——例如,将大量资源分配给 InnoDB 而不使用 InnoDB 并没有多大意义,因为这些资源被浪费了。

或者——很多人建议增加 max_connection变量——好吧,他们不知道这也意味着 MySQL 将分配更多的资源来满足这些 max_connections——如果需要的话。更明显的解决方案可能是关闭 DBAL 中的数据库连接,或者降低 wait_timeout以释放这些线程。

If you catch my drift -- there's really a lot, lot to read up on and learn.

引擎

Table engines are a pretty important decision, many people forget about those early on and then suddenly find themselves fighting with a 30 GB sized MyISAM table which locks up and blocks their entire application.

我不是说 MyISAM 烂透了,但是 InnoDB可以调整到几乎或几乎和 MyISAM一样快的响应速度,并且在 UPDATE上提供诸如行锁定之类的功能,而 MyISAM在被写入时锁定整个表。

如果你有自由在自己的基础设施上运行 MySQL,你可能也想看看 Percona 服务器,因为它包含了很多来自 Facebook 和谷歌这样的公司的贡献(他们知道得很快) ,它也包含了 Percona 自己的代替 InnoDB的插件,称为 XtraDB

请参阅我的 percona-server (和-client)设置(在 Ubuntu 上)的要点: http://gist.github.com/637669

Size

数据库的大小是非常非常重要的——信不信由你,Intarwebs 上的大多数人从来没有处理过大量的 MySQL 设置,但这些设置确实存在。有些人会说,“使用 PostgreSQL! ! !111英寸,不过先别管他们。

The bottom line is: judging from the size, decision about the hardware are to be made. You can't really make a 80 GB database run fast on 1 GB 内存。

指数

不是的,人越多越好。只需要设置所需的索引,并且必须使用 EXPLAIN检查使用情况。此外,MySQL 的 EXPLAIN确实有限,但这只是一个开始。

建议配置

关于这些 my-large.cnfmy-medium.cnf文件——我甚至不知道这些是写给谁的。

调试雷管

A great start is the 调谐底漆. It's a bash script (hint: you'll need linux) which takes the output of SHOW VARIABLES and SHOW STATUS and wraps it into hopefully useful recommendation. If your server has ran some time, the recommendation will be better since there will be data to base them on.

然而,调音底漆并不是一种神奇的调味料。你还是应该研究一下它建议改变的所有变量。

读书

我真的很喜欢推荐 MysqlPerformance 博客。对于所有与 MySQL 相关的提示来说,它都是一个很好的资源。而且不仅仅是 MySQL,他们也知道很多关于正确的硬件或者为 AWS 推荐设置等等。这些人有很多年的经验。

当然,另一个很棒的资源是 Planet-mysql

Exe 在 RAM 中使用了480mb,我发现我把这个参数添加到了 my.ini 中

table_definition_cache = 400

将内存使用从400,000 + kb 减少到105,000 kb

关于 MYSQL 如何吞噬内存: https://dev.mysql.com/doc/refman/8.0/en/memory-use.html

/etc/my.cnf:

[mysqld]
...


performance_schema = 0


table_cache = 0
table_definition_cache = 0
max_connect_errors = 10


query_cache_size = 0
query_cache_limit = 0


...

在256MB 内存的服务器上做得很好。

如果您正在寻找优化您的 docker mysql 容器,那么下面的命令可能会有所帮助。我能够运行 mysql docker 容器从默认的480mb 到仅仅100mbs

Docker run-d-p 3306:3306-e MYSQL _ DATABASE = test-e MYSQL _ ROOT _ PASSWORD = toor-e MYSQL _ USER = test-e MYSQL _ PASSWORD = test-v/MYSQL:/var/lib/MYSQL —— name mysqldb MYSQL —— table _ Definition _ cache = 100—— Performance _ schema = 0—— default-entication-plugin = MYSQL _ nate _ password

由于我没有足够的声望值来支持之前的答案,因此我同意“ table _ Definition _ cache = 400”答案在我的旧 Centos 服务器上是可行的。