我正在尝试监视 MySQL 5.7 InnoDB 缓冲池中使用的字节总数,该缓冲池最多可达到 100GB,Innodb_buffer_pool_bytes_data
但当我查询它时,这个状态变量似乎是一个 32 位无符号整数,因此当字节超过 2^32 时它就会溢出。
在 MySQL 内部它似乎是一个无符号长整数(https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/include/srv0srv.h#L892)?
起初我以为溢出发生在我的监控堆栈(Telegraf+InfluxDB+Grafana)中-
Grafana 图表显示 Interger Overflow 随时间的变化情况,目前 Innodb_buffer_pool_bytes_data 为 490MB
- 但直接查询 MySQL 似乎表明它来自 MySQL 而不是在我的监控解决方案中:
SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_buffer_pool_bytes_data"
- 产生的490371968
样本时间戳与上面 Grafana 中看到的大致相同。
如何才能准确监测真实值?
答案1
该图显示 MySQL 大约在 12:16 重启(或服务器重启)。buffer_pool 将不断增长直至达到innodb_buffer_pool_size
。
如果没有足够的 RAM 用于 buffer_pool(以及其他内容),则它可能会崩溃。该设置应设置为可用 RAM 的 70% 左右。