因為公司生產環境使用的阿里雲RDS,修改參數相對方便,performance_schema預設為0,這次修改為1。修改之後提交參數,資料庫會重啟,建議在業務低高峰進行。
登入MySQL資料庫,執行下列SQL,開啟記憶體監控。
update performance_schema.setup_instruments set enabled = 'yes' where name like 'memory%';
開啟之後驗證一下。
select * from performance_schema.setup_instruments where name like 'memory%innodb%' limit 5;
**注意:**該命令是在線打開內存統計,所以只會統計打開後新增的內存對象,打開前的內存對像不會統計,建議您打開後等待一段時間再執行後續步驟,方便找出記憶體使用高的執行緒。
select event_name, SUM_NUMBER_OF_BYTES_ALLOC from performance_schema.memory_summary_global_by_event_name order by SUM_NUMBER_OF_BYTES_ALLOC desc LIMIT 10; +---------------------------------------+-------------------------------------+ | event_name | SUM_NUMBER_OF_BYTES_ALLOC | +---------------------------------------+-------------------------------------+ | memory/sql/Filesort_buffer::sort_keys | 763523904056 | | memory/memory/HP_PTRS | 118017336096 | | memory/sql/thd::main_mem_root | 114026214600 | | memory/mysys/IO_CACHE | 59723548888 | | memory/sql/QUICK_RANGE_SELECT::alloc | 14381459680 | | memory/sql/test_quick_select | 12859304736 | | memory/innodb/mem0mem | 7607681148 | | memory/sql/String::value | 1405409537 | | memory/sql/TABLE | 1117918354 | | memory/innodb/btr0sea | 984013872 | +---------------------------------------+-------------------------------------+
可以看到記憶體消耗最高的event是Filesort_buffer,根據經驗,這個應該是排序有關。
select thread_id, event_name, SUM_NUMBER_OF_BYTES_ALLOC from performance_schema.memory_summary_by_thread_by_event_name order by SUM_NUMBER_OF_BYTES_ALLOC desc limit 10; +---------------------+---------------------------------------+-------------------------------------+ | thread_id | event_name | SUM_NUMBER_OF_BYTES_ALLOC | +---------------------+---------------------------------------+-------------------------------------+ | 105 | memory/memory/HP_PTRS | 69680198792 | | 183 | memory/sql/Filesort_buffer::sort_keys | 49210098808 | | 154 | memory/sql/Filesort_buffer::sort_keys | 43304339072 | | 217 | memory/sql/Filesort_buffer::sort_keys | 37752275360 | | 2773 | memory/sql/Filesort_buffer::sort_keys | 31460644712 | | 218 | memory/sql/Filesort_buffer::sort_keys | 31128994280 | | 2331 | memory/sql/Filesort_buffer::sort_keys | 28763981248 | | 106 | memory/memory/HP_PTRS | 27938197584 | | 191 | memory/sql/Filesort_buffer::sort_keys | 27701610224 | | 179 | memory/sql/Filesort_buffer::sort_keys | 25624723968 | +---------------------+---------------------------------------+-------------------------------------+
可以看到記憶體消耗多的執行緒都跟Filesort_buffer
相關。
根據前邊我們查到的thread_id
去日誌裡尋找對應的SQL,阿里雲RDS稽核日誌相對還是比較強大的。我們直接根據thread_id直接檢索。
我們在日誌裡看到大量這樣的SQL,掃描行數在幾千到幾萬不等。儘管每次查詢的時間不長,通常在幾十到幾百毫秒之間,但並發請求的數量很大。
以上是MySQL生產庫記憶體異常增高怎麼排查的詳細內容。更多資訊請關注PHP中文網其他相關文章!