我是数据库管理的新手,一直依靠论坛的建议和答案来帮助解决我的数据库挂起和太多的连接错误;我已经设法减少太多连接错误的频率,但我想在这个级别上消除它们。
根据 RolandoMySQLDBA 在 这篇文章中的回答,“如果 Open_tables 超过(Opened_tables / Uptime),我有理由担心......”
我的服务器规格是 2.0Mhz 和 484Mem;我有一个客户端,其每小时最多可处理 1000 个请求,并且主要处理他们的 2 个 InnoDB 表,这意味着一个小时内与两个表建立了大约 3000 个连接。
根据另一个论坛的建议,我对 my.cnf 进行了更改,它转化为:
[mysqld]
port = 3306
socket = /var/run/mysqld/mysqld.sock
skip-locking
key_buffer_size = 30M
max_allowed_packet = 1M
table_cache = 300
sort_buffer_size = 256K
read_buffer_size = 1M
read_rnd_buffer_size = 1M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8
net_buffer_length = 12K
thread_stack = 1M
innodb_buffer_pool_size=60M
interactive_timeout=300
wait_timeout=300
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 48M
sort_buffer_size = 48M
#key_buffer_size = 256M
#sort_buffer_size = 256M
#read_buffer = 2M
#write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
当我根据帖子检查opened_tables、open_tables和uptime的参数时,我得到了这些值:
Uptime = 78018
Opened_tables = 1606999
Open tables = 300
所以:Opened_tables / Uptime=1606999/78018= 20.6
但是,我的 Opened_tables 变量在 3 小时内没有改变;它是一样的。
在这些更改之后,服务器负载在过去 24 小时内(晚上)发生了两次,我没有记录这段时间的 Opened_tables 值;但正如您从计算中注意到的那样,当许多客户端请求通过时,Opened_tables 值在昨晚急剧增加。
线程变量的输出是:
Threads_cached | 7 |
| Threads_connected | 14 |
| Threads_created | 306 |
| Threads_running | 2
我从 mysql 文档(http://dev.mysql.com/doc/refman/5.5/en/server-status-variables.html#statvar_Threads_connected)中注意到我需要增加 thread_cache_size 。
我的 max_connections 是默认值;
所以基本上:
- 我需要增加thread_cache_size;
- 我需要增加 table_open_cache (但非常大的值也会导致不可靠性)
在发布此消息时,我刚刚遇到“连接过多”错误,无法获得 Opened_tables 和 Open_tables 的结果;另外,我无法通过另一个会话登录到服务器;我自动断开连接。
问题:
我应该使用什么方法来近似
thread_cache_size 和 table_open_cache 的值?我的 max_connections 是否太低?如何计算最佳 max_connections 设置?
如何减少“连接过多”错误(不创建另一个用户并让该用户成为建立连接的用户而不是 root)?
注意:不,我现在无法升级内存。谢谢。现在我处理这个问题的唯一方法是关闭端口表单传入消息(这不完全符合道德)或重新启动服务器以处理系统中的待处理消息并释放内存。
在我现在 有太多的连接错误之后- 我通过阻止接收端口解决了这个问题;我的变量现在是:
Opened_tables = 1970498
Open_tables =300
| Threads_cached | 6 |
| Threads_connected | 15 |
| Threads_created | 437 |
| Threads_running | 2 |
任何我明智有效地处理这个问题的建议将不胜感激。提前致谢。
[3]:
三点:
我没有看到您的“太多连接”和表缓存之间的直接联系。可能存在这样的联系,但您没有提供表明两者相关的信息。
我不同意关于“如果 Open_tables 超过(Opened_tables / Uptime),我有理由担心......”的建议。
您尚未列出 table_open_cache 和 table_definition_cache 设置。
table_cache
变量是旧变量。一些建议:
关于“连接太多”,请尝试以下方法: 设置
max_connections
一些合理的值,例如300
,抛出一个数字。设置open_files_limit
为非常高的值,例如8192
. 默认情况下,您只允许在 linux 上打开 1024 个文件。套接字、线程、表描述符——都映射到文件。您是否有一些连接池,其中包含许多打开(空闲)连接,并且有一些保持活动状态?一个典型的有多少进程SHOW PROCESSLIST
?关于表缓存:我建议设置一个高值。每小时有 3,000 次查询,您不会遇到问题。你为什么不设置:(
table_open_cache=2048
table_definition_cache=512
即使你可能只有几张桌子)关于打开表的建议,您应该对任何给定时间段内每秒(或分钟,等等)打开的表数更感兴趣,而不是查看自服务器开始运行以来打开的表的总数。所以你应该
opened_tables
每隔几分钟监控一次你的状态变量,然后计算一下。您通常希望看到一秒钟内打开的表少于 1 个。再一次,我在扔数字,但只是为了给你比例。open_tables
很高兴知道,也。在良好的使用情况下,它可能非常高,这意味着您的服务器正在积极地从表中读取。美好的!只要opened_tables/sec 的数量没有上升太高,这是不用担心的。“连接太多”可能还有其他原因。查询很长吗?这样他们只是积累?是否有一些后台任务无法完成?(您确实有一个
wait_timeout=300
很好的;但是,某些 PHP 作业可能每隔几秒钟就会发出新的查询,而无法正确关闭?再次注意:注意
SHOW PROCESSLIST
,看看会发生什么。