MySQL 8.0.30 新功能,再也不用擔心大量無效日誌了!
作者:李富強,愛可生 DBA 團隊成員,熟悉 MySQL,TiDB,OceanBase 等數據庫。相信持續把對的事情做好一點,會有不一樣的收穫。
愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
本文約 1600 字,預計閱讀需要 5 分鐘。
新特性介紹
MySQL 8.0.30 版本中,mysqldump 邏輯備份工具引入了 mysqld-long-query-time 選項,用於設置 mysqldump 備份的會話級別慢查詢閾值 long_query_time
。
生產環境 long_query_time
一般設置的比較小,由於 mysqldump 備份時執行的是全表掃描,SQL 執行時間很容易超過 long_query_time
,導致慢查詢日誌中記錄大量備份產生的慢查詢。通過指定 mysqld-long-query-time
選項,給 mysqldump 單獨設定合適的會話級別慢查詢閾值,可以減少慢查詢日誌中大量無效慢查詢。
使用方法
mysqldump 指定備份選項 mysqld-long-query-time
爲具體的值,該選項取值範圍爲 0 到 31536000(365天),單位是秒。如果不指定此選項,mysqldump 產生的查詢是否屬於慢查詢根據全局變量 long_query_time
閾值來確定。
# 添加 mysqldump 備份選項爲 --mysqld-long-query-time=100
# 即小於 100s 的 mysqldump 備份語句不會記錄到慢查詢日誌中
mysqldump -ubackup_user -h10.186.58.39 -P3000 -p123456 --all-databases \
--mysqld-long-query-time=100 >/opt/all_databases.sql
對比實驗
mysqldump 不添加備份選項 mysqld-long-query-time
和添加備份選項 mysqld-long-query-time
對比測試,分別觀察慢查詢日誌內容。
環境信息
#數據庫服務器配置
8c16g150g(ssd)
#數據庫版本
MySQL localhost:3000 ssl SQL > select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.30 |
+-----------+
#mysqldump版本
[root@node1 ~]# mysqldump --version
mysqldump Ver 8.0.30 for Linux on x86_64 (MySQL Community Server - GPL)
#全局慢查詢閾值
MySQL localhost:3000 ssl SQL > show variables like '%long_query_time%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.100000 |
+-----------------+----------+
#慢查詢已開啓
MySQL localhost:3000 ssl SQL > show variables like '%slow_query_log%';
+---------------------+-------------------------------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /root/mysql-sandboxes/3000/sandboxdata/node1-slow.log |
+---------------------+-------------------------------------------------------+
#使用sysbench工具,分別造了數據量爲10w,100w,1000w,50000w共4張表
MySQL localhost:3000 ssl SQL > select count(*) from fq_10w.sbtest1;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+
1 row in set (0.1108 sec)
MySQL localhost:3000 ssl SQL > select count(*) from fq_100w.sbtest1;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+
1 row in set (0.3367 sec)
MySQL localhost:3000 ssl SQL > select count(*) from fq_1000w.sbtest1;
+----------+
| count(*) |
+----------+
| 10000000 |
+----------+
1 row in set (2.3046 sec)
MySQL localhost:3000 ssl SQL > select count(*) from fq_5000w.sbtest1;
+----------+
| count(*) |
+----------+
| 50000000 |
+----------+
1 row in set (8.7858 sec)
場景一
mysqldump 不添加備份選項 mysqld-long-query-time
進行數據庫備份。
#執行備份
[root@node1 ~]# mysqldump -ubackup_user -h10.186.58.39 -P3000 -p123456 --all-databases >/opt/all_databases.sql
#備份完成後,查看慢日誌,可以看到備份產生的查詢的Query_time只要超過全局變量long_query_time(0.1s)的值就會記錄到慢查詢日誌中
[root@node1 ~]# cat /root/mysql-sandboxes/3000/sandboxdata/node1-slow.log
# Time: 2024-03-20T06:25:51.689799Z
# User@Host: backup_user[backup_user] @ node1 [10.186.58.39] Id: 31
# Query_time: 77.574346 Lock_time: 0.000000 Rows_sent: 50000000 Rows_examined: 50000000
use fq_5000w;
SET timestamp=1710915874;
SELECT /*!40001 SQL_NO_CACHE */ * FROM `sbtest1`;
# Time: 2024-03-20T06:37:00.974869Z
# User@Host: backup_user[backup_user] @ node1 [10.186.58.39] Id: 32
# Query_time: 18.428685 Lock_time: 0.000000 Rows_sent: 10000000 Rows_examined: 10000000
use fq_1000w;
SET timestamp=1710916602;
SELECT /*!40001 SQL_NO_CACHE */ * FROM `sbtest1`;
# Time: 2024-03-20T06:37:02.571939Z
# User@Host: backup_user[backup_user] @ node1 [10.186.58.39] Id: 32
# Query_time: 1.527482 Lock_time: 0.000000 Rows_sent: 1000000 Rows_examined: 1000000
use fq_100w;
SET timestamp=1710916621;
SELECT /*!40001 SQL_NO_CACHE */ * FROM `sbtest1`;
# Time: 2024-03-20T06:37:02.754243Z
# User@Host: backup_user[backup_user] @ node1 [10.186.58.39] Id: 32
# Query_time: 0.125747 Lock_time: 0.000000 Rows_sent: 100000 Rows_examined: 100000
use fq_10w;
SET timestamp=1710916622;
SELECT /*!40001 SQL_NO_CACHE */ * FROM `sbtest1`;
場景二
mysqldump 添加備份選項 mysqld-long-query-time
進行數據庫備份。
#清空慢日誌文件
[root@node1 ~]# cat /dev/null > /root/mysql-sandboxes/3000/sandboxdata/node1-slow.log
[root@node1 ~]# cat /root/mysql-sandboxes/3000/sandboxdata/node1-slow.log
[root@node1 ~]#
#執行備份,根據場景1得知,備份5000w的表耗時77.57s,這裏我們指定備份選項mysqld-long-query-time爲100,嘗試把備份本身產生的慢查詢過濾掉
[root@node1 ~]# mysqldump -ubackup_user -h10.186.58.39 -P3000 -p123456 --all-databases --mysqld-long-query-time=100 >/opt/all_databases.sql
#備份完成後,查看慢日誌,可以看到慢日誌文件爲空,備份本身產生的慢查詢被過濾掉了
[root@node1 ~]# cat /root/mysql-sandboxes/3000/sandboxdata/node1-slow.log
[root@node1 ~]#
結論
MySQL 8.0.30 版本,通過給 mysqldump 指定 mysqld-long-query-time
選項,設定合適的會話級別慢查詢閾值,可以過濾掉備份產生的慢查詢。
知識補充
- MySQL 8.0.30 版本的 mysqldump 備份工具中的
mysqld-long-query-time
選項,也適用於 MySQL 5.7 版本的備份。 - mysqldump 的
mysqld-long-query-time
選項的值不支持小數(eg:0.1),否則執行備份會報錯。
更多技術文章,請訪問:https://opensource.actionsky.com/
關於 SQLE
SQLE 是一款全方位的 SQL 質量管理平臺,覆蓋開發至生產環境的 SQL 審覈和管理。支持主流的開源、商業、國產數據庫,爲開發和運維提供流程自動化能力,提升上線效率,提高數據質量。