AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 34389
Accepted
Ombongi Moraa
Ombongi Moraa
Asked: 2013-02-09 02:47:07 +0800 CST2013-02-09 02:47:07 +0800 CST 2013-02-09 02:47:07 +0800 CST

mysql微调:open_tables,opened_tables

  • 772

我是数据库管理的新手,一直依靠论坛的建议和答案来帮助解决我的数据库挂起和太多的连接错误;我已经设法减少太多连接错误的频率,但我想在这个级别上消除它们。

根据 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 是默认值;

所以基本上:

  1. 我需要增加thread_cache_size;
  2. 我需要增加 table_open_cache (但非常大的值也会导致不可靠性)

在发布此消息时,我刚刚遇到“连接过多”错误,无法获得 Opened_tables 和 Open_tables 的结果;另外,我无法通过另一个会话登录到服务器;我自动断开连接。

问题:

  1. 我应该使用什么方法来近似
    thread_cache_size 和 table_open_cache 的值?

  2. 我的 max_connections 是否太低?如何计算最佳 max_connections 设置?

  3. 如何减少“连接过多”错误(不创建另一个用户并让该用户成为建立连接的用户而不是 root)?

    注意:不,我现在无法升级内存。谢谢。现在我处理这个问题的唯一方法是关闭端口表单传入消息(这不完全符合道德)或重新启动服务器以处理系统中的待处理消息并释放内存。


在我现在 有太多的连接错误之后- 我通过阻止接收端口解决了这个问题;我的变量现在是:

Opened_tables = 1970498 
Open_tables =300

| Threads_cached                    | 6          |
| Threads_connected                 | 15         |
| Threads_created                   | 437        |
| Threads_running                   | 2          |

任何我明智有效地处理这个问题的建议将不胜感激。提前致谢。

[3]:

mysql max-connections
  • 1 1 个回答
  • 5304 Views

1 个回答

  • Voted
  1. Best Answer
    Shlomi Noach
    2013-02-09T21:35:44+08:002013-02-09T21:35:44+08:00

    三点:

    • 我没有看到您的“太多连接”和表缓存之间的直接联系。可能存在这样的联系,但您没有提供表明两者相关的信息。

    • 我不同意关于“如果 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,看看会发生什么。

    • 2

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve