MySQL 一則慢日志監控誤報的問題分析與解決
之前因為各種原因,有些報警沒有引起重視,最近放假馬上排除瞭一些潛在的人為原因,發現數據庫的慢日志報警有些奇怪,主要表現是慢日志報警不屬實,收到報警的即時通信提醒後,隔一會去數據庫裡面去排查,發現慢日志的性能似乎沒有那麼差(我設置的一個閾值是60)。
排查過幾次代碼層面的邏輯,沒有發現明顯的問題,幾次下來,問題依舊,這可激發瞭修正的念頭,決定認真看看到底是什麼原因。
後端使用的是基於ORM的模式,數據都存儲在模型MySQL_slowlog_sql_history對應的表中。
代碼層面是類似如下的邏輯:
MySQL_slowlog_sql_history.objects.filter(create_time__gt=’2020-01-29 11:00:00′,Query_time_pct_95__gt=60)
傳入的時間是動態的,然後閾值取60秒,按照預期如果報警出來就肯定是有問題的。
為瞭進一步驗證,我把閾值時間修改為600,竟然還是報出錯誤,執行7~8秒的慢查詢照樣會報出來。
我使用debug的方式得到瞭ORM解析得到的SQL:
SELECT...`mysql_slowlog_sql_history`.`create_time`, `mysql_slowlog_sql_history`.`memo` FROM `mysql_slowlog_sql_history` WHERE (`mysql_slowlog_sql_history`.`create_time` > '2020-01-29 11:00:00' AND `mysql_slowlog_sql_history`.`Query_time_pct_95` > '600') LIMIT 21; args=(u'2020-01-29 11:00:00', u'600')
看SQL沒問題啊。
我自己在客戶端執行,確實是好好的,隻過濾出瞭600秒以上的結果。
select ip_addr,db_port from mysql_slowlog_sql_history where create_time>'2020-01-29 00:00:00' and Query_time_pct_95 > 600;
對著這個結果我開始反思,到底是什麼原因呢?
我看著模型的字段定義開始有所悟,然後快速驗證瞭一番。
為瞭方便說明,我創建瞭一個測試表test_dummy.
create table test_dummy(id int primary key auto_increment,Query_time_pct_95 varchar(100));
初始化幾條數據。
insert into test_dummy(Query_time_pct_95 ) values('8.83736'),('7.70056'),('5.09871'),('4.32582'); +----+-------------------+ | id | Query_time_pct_95 | +----+-------------------+ | 1 | 8.83736 | | 4 | 7.70056 | | 7 | 5.09871 | | 10 | 4.32582 | +----+-------------------+ 4 rows in set (0.00 sec)
然後使用如下的兩條語句來進行對比測試。
mysql> select *from test_dummy where Query_time_pct_95>600; Empty set (0.00 sec)
mysql> select *from test_dummy where Query_time_pct_95>'600'; +----+-------------------+ | id | Query_time_pct_95 | +----+-------------------+ | 1 | 8.837364 | | 2 | 7.700558 | +----+-------------------+ 2 rows in set (0.00 sec)
可以看到,使用瞭整型數值的時候,沒有返回結果,而使用瞭字符類型的時候,匹配的結果是按照最左匹配的模式來進行過濾的,也就意味著在數據庫層面對於浮點數的處理還是差別很大的。
所以這個問題的快速修復方式就是在數據庫層面修改數據表的類型為float,而在精度損失方面這塊的影響是可以忽略不計的。
再次驗證,這個問題就沒有再次出現。
以上就是MySQL 一則慢日志監控誤報的問題分析與解決的詳細內容,更多關於MySQL慢日志監控誤報的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- MySQL之select、distinct、limit的使用
- MySQL 數據類型詳情
- mysql中insert ignore、insert和replace的區別及說明
- MySQL中關於null值的一個小問題
- MySQL 5.7常見數據類型