上文(MySQL自我保護工具--pt-kill ) 提到用pt-kill工具來kill相關的會話,來達到保護數據庫的目的,本文再通過修改數據庫參數的方式達到阻斷長時間運行的SQL的目的。
1、參數介紹
mysql5.6及以后,數據庫端新增了新變量來限制語句最大執行時間,用于在服務端對select語句進行超時時間限制,能有效控制在數據庫(建議在主庫)的慢查詢情況,以達到保護數據庫穩定性的目的。
不過mysql5.7.8版本前后參數名有變更,例如:
mysql5.6 - mysql5.7.8前的版本中,參數名為:max_statement_time (毫秒)mysql5.7.8及以后,參數改成:max_execution_time (毫秒)
另外,該參數有global 及session 2種級別,即可在部分會話中動態調整本會話的超時時間。
2. 操作演示
在測試環境建一張大表用來演示,該案例可查看歷史文章或批量造數據實現。
因當前基本都使用5.7及以后版本,因此本次使用MySQL5.7版本數據庫進行演示。
2.1 參數默認值
mysql> show global variables like 'max_execution_time';| Variable_name | Value || max_execution_time | 0 |1 row in set (0.01 sec)
默認值為0,代表不限制最大執行時間。
例如執行如下SQL時,運行3s+
mysql> select count(*) from test1;| count(*) || 21991575 |1 row in set (3.89 sec)
2.2 修改參數演示
修改
![]()
mysql> set session max_execution_time=1000;Query OK, 0 rows affected (0.00 sec)mysql> show global variables like 'max_execution_time';| Variable_name | Value || max_execution_time | 0 |1 row in set (0.01 sec)mysql> show variables like 'max_execution_time';| Variable_name | Value || max_execution_time | 1000 |1 row in set (0.00 sec)
本會話的參數(session級別),演示本次會話的情況,這樣不會影響其他會話的運行,如需整個實例調整,則修改全局變量即可。
mysql> select count(*) from test1;ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded
此時執行查詢,則會因為超過1s而被中斷
PS:修改全局變量后,注意已經連接的會話是不生效的,另外,此參數,只對select起作用,對DDL及UPDATE、delete操作不生效,例如:
mysql> set session max_execution_time=1000;Query OK, 0 rows affected (0.00 sec)mysql> alter table test1 add tt int ;Query OK, 0 rows affected (25.65 sec)Records: 0 Duplicates: 0 Warnings: 0
3. 小結
生產環境較常見的情況是業務代碼已經超時退出了與數據庫的交互,但是數據庫里依舊運行著發起的SQL,如果頻繁發起重試,則,慢SQL會越來越多,導致數據庫負載高,影響穩定性及可用性。因此,建議部署pt-kill工具或者修改最大執行時間參數,避免長時間運行select語句運行。
相對于pt-kill工具,修改參數的方式較便捷,但局限性較大,因此需要根據業務需要進行部署。
1. MySQL高可用之MHA集群部署
2. mysql8.0新增用戶及加密規則修改的那些事3. 比hive快10倍的大數據查詢利器-- presto
4. 監控利器出鞘:Prometheus+Grafana監控MySQL、redis數據庫
5. PostgreSQL主從復制--物理復制
6. MySQL傳統點位復制在線轉為GTID模式復制
7. MySQL敏感數據加密及解密
8. MySQL數據備份及還原(一)
9. MySQL數據備份及還原(二)






