优化 Percona MySQL InnoDB 3.2TB 数据库

Jes*_*spi 2 mysql innodb optimization percona-server mysqltuner

(在你骂我白痴或开始大笑之前,请记住这对我来说是一笔真正的交易,我不能取消这个任务,因为它是一个更大项目的一部分)

我有一个数据库服务器,它的大小非常大,并且在非常小的服务器上运行,即。32GB 内存,24 核。在周末期间,我们将向机器添加 18GB 的​​ RAM 以使其更强大(白天的服务器负载跃升至平均 80 !!),直到我们解决使用该数据库的应用程序的性能问题。

我怀疑负载是由 DB 引起的,因为缺少可用 RAM(SWAP 中总是有大约 5GB)。

这个数据库有多个小表和一个巨大的表,它以大约 350,000 条记录/小时的速度接收 GPS 和 IO 数据,并且这个表按分区/月进行分区。

Mysqltuner 建议在所有表上运行优化表,但我读过在 InnoDB 表上这样做是无用的,而且需要很长时间。

这是脚本输出的一个片段:

General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
Reduce your overall MySQL memory footprint for system stability
Adjust your join queries to always utilize indexes
When making adjustments, make tmp_table_size/max_heap_table_size equal
Reduce your SELECT DISTINCT queries without LIMIT clauses
Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
  *** MySQL's maximum memory usage is dangerously high ***
  *** Add RAM before increasing MySQL buffer variables ***
  query_cache_limit (> 16M, or use smaller result sets)
  join_buffer_size (> 2.0M, or always use indexes with joins)
  tmp_table_size (> 16M)
  max_heap_table_size (> 16M)
  table_cache (> 4096)
  innodb_buffer_pool_size (>= 1726G)
Run Code Online (Sandbox Code Playgroud)

我应该盲目相信它还是有其他方法可以做到这一点?

我知道升级后首先要重新配置数据库,还有什么我应该注意的,我应该尝试什么?停机时间应该尽可能短,所以我真的不想运行一个会连续运行 5 小时的查询。

jyn*_*nus 5

忘记 mysqltuner 并检查人工建议。此工具会告诉您在某些情况下可能无用甚至有害的一般建议。优化表可能没用,但它会锁定您的表以进行写入。从长远来看,顾问可以为您节省时间和金钱。

交换对于 MySQL 来说应该是行不通的。确保调整您的innodb_buffer_pool_size以在不交换的情况下最大化内存使用率。请确保您了解可能还有其他使用内存的东西:文件系统缓存,日志记录和其他操作所需,以及每个客户端使用的内存,如连接缓冲区和排序缓冲区。加起来应该小于可用的物理内存,因为 MySQL/InnoDB 有自己的缓冲方式,如果它使用虚拟内存,实际上它在磁盘上,你会过得很糟糕。

如果不全面审查您的服务器,就很难提供万无一失的“一般建议”。但根据我的经验,90% 的问题都与查询和数据库设计有关,而不是与服务器配置有关。

但是,这里有一个好人(Peter Zaitsev)对 MySQL/Innodb 配置优化的一个很好的介绍。希望能帮助到你。