在MySQL中如何計算、統計重作日誌(redo log)的生成狀況呢? 例如10分鐘內,生成了多少M的redo log呢?30分鐘內又生成了多少M的redo log.....。MySQL沒有像Oracle中那樣的系統視圖統計這些數據,可是咱們能夠經過一些方法曲線的統計二進制日誌的生成量。html
雖然我在這篇博客「MySQL中Redo Log相關的重要參數總結」中介紹了,MySQL 8.0引入了innodb_dedicated_server自適應參數,可基於服務器的內存來動態設置innodb_buffer_pool_size,innodb_log_file_size和innodb_flush_method。默認狀況下,此參數是關閉的。可是在MySQL 8.0以前,經過計算重作日誌(redo log)的生成量來判斷判斷innodb_log_buffer_size和innodb_log_file_size的大小是否合適是很是必要的,我的認爲即便MySQL 8.0版本下,這個也是很是有參考和研究意義的。咱們經過統計、分析計算重作日誌(redo log)的生成量,從而判斷InnoDB的事務日誌文件大概能支撐多長時間就會切換。有具體數據支撐,你纔好分析判斷,不然巧婦也難爲無米之炊。mysql
在MySQL的information_schema.global_status或performance_schema.global_status中有個服務器狀態變量(Server Status Variables)Innodb_os_log_written,它記錄了Innodb的重作日誌(redo log)的生成量,它記錄寫入InnoDB重作日誌文件的字節數,它是一個累積值。官方文檔關於此服務器狀態變量的描述以下sql
Innodb_os_log_written服務器
The number of bytes written to the InnoDB redo log files.app
咱們主要經過一個計劃任務/事件調度按期的去採集Innodb_os_log_written服務器狀態變量獲取重作日誌的大小,將其存儲在innodb_log_size_his表中,方便分析統計。具體腳本以下:spa
注意:performance_schema.global_status是MySQL 5.7引入的,而MySQL 8.0開始,information_schema.global_status直接被丟棄了。因此注意MySQL版本,選擇合適腳本。3d
USE mysqls;
CREATE TABLE IF NOT EXISTS innodb_log_size_his
(
log_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '日誌編號',
log_date DATETIME COMMENT '記錄當前數據的時間',
log_size DOUBLE COMMENT 'redo log的大小,單位爲mb'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT 'redo日誌大小信息表';
--MySQL 5.*版本用下面腳本
DELIMITER &&
DROP PROCEDURE IF EXISTS `Record_Innodb_Log_Size`&&
CREATE PROCEDURE Record_Innodb_Log_Size()
BEGIN
INSERT INTO mysql.`innodb_log_size_his`
(
log_date,
log_size
)
SELECT now() AS log_date,
ROUND(CAST(VARIABLE_VALUE AS DOUBLE )/1024/1024, 1) as log_size
FROM information_schema.global_status
WHERE VARIABLE_NAME = 'innodb_os_log_written';
END &&
DELIMITER ;
--MySQL 8.0以上版本使用下面腳本
DELIMITER &&
DROP PROCEDURE IF EXISTS `Record_Innodb_Log_Size`&&
CREATE PROCEDURE Record_Innodb_Log_Size()
BEGIN
INSERT INTO mysql.`innodb_log_size_his`
(
log_date,
log_size
)
SELECT now() AS log_date,
ROUND(CAST(VARIABLE_VALUE AS DOUBLE )/1024/1024, 1) as log_size
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'innodb_os_log_written';
END &&
DELIMITER ;
而後建立MySQL的計劃任務/事件調度,這個能夠根據需求彈性設定。日誌
CREATE EVENT DPA_REDOLOG_SIZE
ON SCHEDULE EVERY 10 MINUTE STARTS '2020-10-16 08:00:00'
ON COMPLETION PRESERVE
DO CALL mysql.Record_Innodb_Log_Size;
而後你就能夠基於這個表作一些簡單的分析和統計了,例如,統計10分鐘內生成重作日誌生成了多少。以下所示:code
SELECT m.*
,@lag AS last_redo_size
,ROUND(m.log_size - @lag,2) AS gen_redo_size
,@lag:=log_size
FROM mysql.`innodb_log_size_his` m, (SELECT @lag :='') AS n
WHERE m.log_date >= date_add(now(), interval -1 day)
ORDER BY m.log_id;