我想知道如何设置MySQL在Linux服务器上使用的内存量的上限。现在,MySQL将继续占用内存与每一个新的查询请求,使它最终耗尽内存。有没有一种方法来设置限制,使不超过该数量是由MySQL使用?
xkftehaa1#
MySQL的最大内存使用量在很大程度上取决于硬件,您的设置和数据库本身。
硬件是显而易见的部分。RAM越多,磁盘就越快。不过不要相信那些每月或每周的新闻。MySQL不会线性扩展-即使在Oracle硬件上也不会。这比这要复杂一些。底线是:对于MySQL的安装,我们没有一个通用的经验法则。2这完全取决于当前的使用情况或预测。
MySQL提供了无数的变量和开关来优化它的行为。如果你遇到问题,你真的需要坐下来阅读(f 'ing)手册。至于数据库,有几个重要的限制:
InnoDB
MyISAM
大多数MySQL关于stackoverflow的提示会告诉你5-8个所谓的重要设置。首先,并不是所有的设置都重要-例如,分配大量资源给InnoDB而不使用InnoDB没有多大意义,因为这些资源被浪费了。或者--很多人建议增加max_connection变量--好吧,他们不知道这也意味着MySQL将分配更多的资源来满足这些max_connections--如果需要的话。更明显的解决方案可能是关闭DBAL中的数据库连接或降低wait_timeout以释放这些线程。如果你明白我的意思--真的有很多很多东西要读和学。
max_connection
max_connections
wait_timeout
表引擎是一个非常重要的决定,许多人很早就忘记了这些,然后突然发现自己在与一个30 GB大小的MyISAM表战斗,它锁定并阻止了他们的整个应用程序。我并不是说 *MyISAM很烂 *,但是InnoDB可以调整到几乎或接近MyISAM的响应速度,并在UPDATE上提供行锁定,而MyISAM在写入时锁定整个表。如果你可以在自己的基础设施上运行MySQL,你可能还想看看percona server,因为它包括了Facebook和Google等公司的大量贡献(他们知道得很快),它还包括Percona自己的InnoDB的替代品,称为XtraDB。请参阅我的要点percona服务器(和客户端)设置(在Ubuntu上):http://gist.github.com/637669
UPDATE
XtraDB
数据库的大小是非常非常重要的--信不信由你,Intarwebs上的大多数人从来没有处理过一个大的、写密集的MySQL设置,但这些确实存在。有些人会说,“使用PostgreSQL!111”,但我们现在忽略它们。底线是:从大小来判断,关于硬件的决定是要做出的。你不能真正让一个80 GB的数据库在1 GB的RAM上快速运行。
它不是:越多越好。只需要设置索引,并且必须使用EXPLAIN检查使用情况。加上MySQL的EXPLAIN确实有限,但这是一个开始。
EXPLAIN
关于这些my-large.cnf和my-medium.cnf文件--我甚至不知道这些是为谁写的。自己写吧。
my-large.cnf
my-medium.cnf
tuning primer是一个很好的开始。它是一个bash脚本(提示:你需要Linux),它接受SHOW VARIABLES和SHOW STATUS的输出,并将其 Package 成有用的推荐。如果你的服务器已经运行了一段时间,推荐会更好,因为会有数据作为基础。调优入门并不是一个神奇的酱料,你仍然应该阅读它建议改变的所有变量。
SHOW VARIABLES
SHOW STATUS
我真的很喜欢推荐mysqlperformanceblog。这是一个很好的资源,可以提供各种与MySQL相关的技巧。而且不仅仅是MySQL,他们还知道很多关于正确的硬件或推荐AWS的设置等。这些家伙有多年的经验。当然,另一个很好的资源是planet-mysql。
m1m5dgzv2#
我们使用这些设置:
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
型
xzlaal3s3#
mysqld.exe正在使用480 mb的RAM。我发现我将此参数添加到my.ini
table_definition_cache = 400
字符串将内存使用量从400,000 + kb减少到105,000 kb
vom3gejh4#
数据库内存使用是一个复杂的主题,MySQL Performance Blog很好地回答了你的问题,并列出了很多原因,说明为什么“保留”内存是非常不切实际的。如果你真的想强加一个硬限制,你可以这样做,但你必须在操作系统层面上这样做,因为没有内置的设置。在Linux中,你可以利用ulimit,但你可能必须修改MySQL的启动方式,以强加这一点。最好的解决方案是调整服务器,这样通常的MySQL内存设置的组合将导致MySQL安装的内存使用量普遍较低。这当然会对数据库的性能产生负面影响,但您可以在my.ini中调整一些设置:
my.ini
key_buffer_size query_cache_size query_cache_limit table_cache max_connections tmp_table_size innodb_buffer_pool_size
字符串我会从那里开始,看看你是否能得到你想要的结果。有manyarticles关于调整MySQL内存设置。编辑:注意有些变量名为have changed in the newer 5.1.x releases of MySQL。举例来说:
table_cache
型现在是:
table_open_cache
9bfwbjaz5#
关于MYSQL是如何消耗内存的:https://dev.mysql.com/doc/refman/8.0/en/memory-use.html在/etc/my.cnf中:
/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内存的服务器上运行良好。
pb3s4cty6#
由于我没有足够的信誉点来支持以前的答案,我同意“table_definition_cache = 400”的答案在我的旧Centos服务器上工作。
k97glaaz7#
如果你正在寻找优化你的docker mysql容器,那么下面的命令可能会有所帮助。我能够从默认的480 mb到仅仅100 mbs运行mysql docker容器。docker run -d -p 3306:3306 -e MYSQL_DATABASE=test -e MYSQL_ROOT_PASSWORD=tooor -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
7条答案
按热度按时间xkftehaa1#
MySQL的最大内存使用量在很大程度上取决于硬件,您的设置和数据库本身。
硬件
硬件是显而易见的部分。RAM越多,磁盘就越快。不过不要相信那些每月或每周的新闻。MySQL不会线性扩展-即使在Oracle硬件上也不会。这比这要复杂一些。
底线是:对于MySQL的安装,我们没有一个通用的经验法则。2这完全取决于当前的使用情况或预测。
设置和数据库
MySQL提供了无数的变量和开关来优化它的行为。如果你遇到问题,你真的需要坐下来阅读(f 'ing)手册。
至于数据库,有几个重要的限制:
InnoDB
,MyISAM
,.)大多数MySQL关于stackoverflow的提示会告诉你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
。请参阅我的要点percona服务器(和客户端)设置(在Ubuntu上):http://gist.github.com/637669
大小
数据库的大小是非常非常重要的--信不信由你,Intarwebs上的大多数人从来没有处理过一个大的、写密集的MySQL设置,但这些确实存在。有些人会说,“使用PostgreSQL!111”,但我们现在忽略它们。
底线是:从大小来判断,关于硬件的决定是要做出的。你不能真正让一个80 GB的数据库在1 GB的RAM上快速运行。
索引
它不是:越多越好。只需要设置索引,并且必须使用
EXPLAIN
检查使用情况。加上MySQL的EXPLAIN
确实有限,但这是一个开始。建议配置
关于这些
my-large.cnf
和my-medium.cnf
文件--我甚至不知道这些是为谁写的。自己写吧。调优入门
tuning primer是一个很好的开始。它是一个bash脚本(提示:你需要Linux),它接受
SHOW VARIABLES
和SHOW STATUS
的输出,并将其 Package 成有用的推荐。如果你的服务器已经运行了一段时间,推荐会更好,因为会有数据作为基础。调优入门并不是一个神奇的酱料,你仍然应该阅读它建议改变的所有变量。
阅读
我真的很喜欢推荐mysqlperformanceblog。这是一个很好的资源,可以提供各种与MySQL相关的技巧。而且不仅仅是MySQL,他们还知道很多关于正确的硬件或推荐AWS的设置等。这些家伙有多年的经验。
当然,另一个很好的资源是planet-mysql。
m1m5dgzv2#
我们使用这些设置:
字符串
对于具有以下规格的服务器:
型
xzlaal3s3#
mysqld.exe正在使用480 mb的RAM。我发现我将此参数添加到my.ini
字符串
将内存使用量从400,000 + kb减少到105,000 kb
vom3gejh4#
数据库内存使用是一个复杂的主题,MySQL Performance Blog很好地回答了你的问题,并列出了很多原因,说明为什么“保留”内存是非常不切实际的。
如果你真的想强加一个硬限制,你可以这样做,但你必须在操作系统层面上这样做,因为没有内置的设置。在Linux中,你可以利用ulimit,但你可能必须修改MySQL的启动方式,以强加这一点。
最好的解决方案是调整服务器,这样通常的MySQL内存设置的组合将导致MySQL安装的内存使用量普遍较低。这当然会对数据库的性能产生负面影响,但您可以在
my.ini
中调整一些设置:字符串
我会从那里开始,看看你是否能得到你想要的结果。有manyarticles关于调整MySQL内存设置。
编辑:
注意有些变量名为have changed in the newer 5.1.x releases of MySQL。
举例来说:
型
现在是:
型
9bfwbjaz5#
关于MYSQL是如何消耗内存的:https://dev.mysql.com/doc/refman/8.0/en/memory-use.html
在
/etc/my.cnf
中:字符串
在256MB内存的服务器上运行良好。
pb3s4cty6#
由于我没有足够的信誉点来支持以前的答案,我同意“table_definition_cache = 400”的答案在我的旧Centos服务器上工作。
k97glaaz7#
如果你正在寻找优化你的docker mysql容器,那么下面的命令可能会有所帮助。我能够从默认的480 mb到仅仅100 mbs运行mysql docker容器。
docker run -d -p 3306:3306 -e MYSQL_DATABASE=test -e MYSQL_ROOT_PASSWORD=tooor -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