之前有关于MySQL磁盘及CPU的问题,接下来说下内存方面:
内存是重要的性能参数,内存使用率过高会导致系统响应速度变慢,严重时内存会耗尽,数据库实例会进行主备切换,导致业务中断。因此我们需要在内存异常升高时及时排查问题,避免影响业务。
如果您使用mysql客户端程序 发出查询并收到如下错误,则表示mysql没有足够的内存来存储整个查询结果:
mysql: Out of memory at line 42, 'malloc.c'
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory
相关阅读:
MySQL数据库CPU使用率过高,怎么办
MySQL性能调优之磁盘空间
MySQL内存消耗分为两类:可以控制的内存和不可以控制的内存。
主要内存消耗如下:
(1).每个连接需要的内存
(2).缓存分配内存
InnoDB缓冲池
InnoDB日志文件文件和MyISAM数据的操作系统缓存
MyISAM键缓存
查询缓存
无法手工配置的缓存,例如二进制日志文件和表定义
(3)线程缓存
(4)表缓存
(5)InnoDB数据字典
## 按主机分组的内存使用情况。默认情况下,行按使用的内存量降序排列
select * from sys.x$memory_by_host_by_current_bytes;
## 按线程分组。默认情况下,行按使用的内存量降序排列
select * from sys.x$memory_by_thread_by_current_bytes;
## 按用户分组。默认情况下,行按使用的内存量降序排列。
select * from sys.x$memory_by_user_by_current_bytes;
## 按分配类型(即按事件)分组。默认情况下,行按使用的内存量降序排列。
select * from sys.x$memory_global_by_current_bytes;
## 汇总了服务器内的总内存使用情况。
select * from sys.x$memory_global_total;
select * from performance_schema.memory_summary_by_account_by_event_name;
select * from performance_schema.memory_summary_by_host_by_event_name;
select * from performance_schema.memory_summary_by_thread_by_event_name;
select * from performance_schema.memory_summary_by_user_by_event_name;
select * from performance_schema.memory_summary_global_by_event_name;
select event_name,
current_alloc
from sys.memory_global_by_current_bytes
where event_name like '%innodb%';
select event_name,current_alloc from sys.memory_global_by_current_bytes limit 5;
select m.thread_id tid,
USER,
esc.DIGEST_TEXT,
total_allocated
FROM sys.memory_by_thread_by_current_bytes m,
performance_schema.events_statements_current esc
WHERE m.`thread_id` = esc.THREAD_ID
往者不可谏,来者犹可追