mysqldump 備份產生大量慢查詢,有辦法過濾麼?

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 版本的備份。
  • mysqldumpmysqld-long-query-time 選項的值不支持小數(eg:0.1),否則執行備份會報錯。

更多技術文章,請訪問:https://opensource.actionsky.com/

關於 SQLE

SQLE 是一款全方位的 SQL 質量管理平臺,覆蓋開發至生產環境的 SQL 審覈和管理。支持主流的開源、商業、國產數據庫,爲開發和運維提供流程自動化能力,提升上線效率,提高數據質量。

SQLE 獲取

類型 地址
版本庫 https://github.com/actiontech/sqle
文檔 https://actiontech.github.io/sqle-docs/
發佈信息 https://github.com/actiontech/sqle/releases
數據審覈插件開發文檔 https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章