MYSQL連接相關參數和狀態值詳解

来源:https://www.cnblogs.com/rangle/archive/2018/01/08/8241991.html
-Advertisement-
Play Games

針對mysql的連接參數和狀態值,本文做些介紹和對比 一、MYSQL連接參數變數 1、常用連接數限制參數 show variables like '%connect%'; 2、超時參數 mysql -e "show variables like '%timeout%'" 二、MySQL連接狀態變數 ...


針對mysql的連接參數和狀態值,本文做些介紹和對比

一、MYSQL連接參數變數

1、常用連接數限制參數

show variables like '%connect%';

| max_connect_errors | 999999999 |      ##允許單用戶連接錯誤最大值,超過後在不刷新狀態的情況下,禁止該用戶新連接
| max_connections | 6000 |           ##實例最大連接數限制
| max_user_connections | 0 |          ##但用戶連接最大限制,預設0表示無限制,遵守總連接數小於等於max_connections
| connect_timeout  | 10     |         ##用戶連接超時限制,超過10秒,如果依舊無法連接到mysql,則終止連接

2、超時參數

mysql -e "show variables  like '%timeout%'" 

+-----------------------------+----------+
| connect_timeout             | 10       |    ##連接超時,10秒
| delayed_insert_timeout      | 300      |    ##延遲插入超時時間,300秒
| have_statement_timeout      | YES      |    ##
| innodb_flush_log_at_timeout | 1        |    ##刷新redo log buffer超時時間,1秒
| innodb_lock_wait_timeout    | 120      |    ##事務等待獲取資源等待的最長時間,超過這個時間還未分配到資源則會返回應用失敗,120秒
| innodb_rollback_on_timeout  | ON       |
| interactive_timeout         | 28800    |    ##mysql客戶端交互連接超時時間,預設8小時,用於控制sleep超時
| lock_wait_timeout           | 31536000 |    ##主要針對DDL產生的metadata locks超時時間
| net_read_timeout            | 60       |    ##網路讀取數據超時時間,60秒
| net_write_timeout           | 60       |    ##為網路寫入數據超時間60秒
| rpl_stop_slave_timeout      | 31536000 |    ##停止從庫服務超時時間
| slave_net_timeout           | 60       |    ##slave網路超時時間
| thread_pool_idle_timeout    | 60       |
| wait_timeout                | 28800    |    ##jdbc/odbc連接超時時間,預設8小時,用於控制sleep超時
+-----------------------------+----------+

 

二、MySQL連接狀態變數

1、常用鏈接狀態變數

show global status like '%connect%';

+-----------------------------------------------+----------+
| Connection_errors_max_connections             | 1906160  |    ##用戶最大錯誤連接數
| Connections                                   | 87341259 |    ##歷史用戶連接累積值
| Max_used_connections                          | 10242    |    ##歷史最大連接用戶數,processlist看到的連接數
| Threads_connected                             | 298      |    ##當前用戶連接數,當前processlist數

show global status like '%Threads_running%'; 

| Threads_running | 2     |                        ##當前用戶連接處於running狀態的數目,非sleep

show global status like '%abort%';

+------------------+----------+
| Aborted_clients  | 85050948 |                      ##非法終止客戶端連接的狀態統計,例如通過kill終止連接
| Aborted_connects | 1905528  |                      ##非法連接操作狀態統計,例如用戶密碼錯誤

 

三、常見問題分析

1、最大連接數超出限制

 動態調整最大連接參數變數,然後通過連接嘗試

mysql> set global max_connections=2;
[root@localhost ~]# mysql
ERROR 1040 (HY000): Too many connections
##此時連接超出的嘗試,不會經過許可權驗證,因此不會記錄Aborted_connects變數值

如遇到此問題即表示用戶連接超出了最大連接限制,需要增大連接數

mysql> set global max_connections=350;
##動態調整後,需要將/etc/my.cnf配置參數中的max_connections=350也要做相應調整,這個參數可以根據狀態量值Max_used_connections 評估

2、用戶連接錯誤數超出限制

動態調整最大連接錯誤數變數限制,然後通過嘗試失敗登錄,主機對應的普通用戶會被阻塞,超級用戶不限

max_connect_errors官方解釋如下:

If more than this many successive connection requests from a host are interrupted without a successful connection, 
the server blocks that host from further connections. You can unblock blocked hosts by flushing the host cache.

To do so, issue a FLUSH HOSTS statement or execute a mysqladmin flush-hosts command.

If a connection is established successfully within fewer than max_connect_errors attempts after a previous connection was interrupted,
the error count for the host is cleared to zero. However, once a host is blocked, flushing the host cache is the only way to unblock it.
The default is 100.

手動調整參數測試(telnet 10.1.0.1 3306 五次斷鏈,用戶會被鎖)

mysql> set global max_connect_errors=5;

 通過測試發現用戶直接錯誤密碼連接,不會導致用戶被鎖,主要通過performance_schema下的host_cache表查看相關阻塞信息

mysql> select IP,HOST,HOST_VALIDATED,SUM_CONNECT_ERRORS ,COUNT_HANDSHAKE_ERRORS,COUNT_HOST_BLOCKED_ERRORS   from host_cache;
+----------------+-------+----------------+--------------------+------------------------+---------------------------+
| IP             | HOST  | HOST_VALIDATED | SUM_CONNECT_ERRORS | COUNT_HANDSHAKE_ERRORS | COUNT_HOST_BLOCKED_ERRORS |
+----------------+-------+----------------+--------------------+------------------------+---------------------------+
| 10.1.0.1    | NULL  | NO             |                  0 |                      5 |                         0 |
| 10.1.0.100 | node1 | YES            |                  0 |                      0 |                         0 |
+----------------+-------+----------------+--------------------+------------------------+---------------------------+

哪些連接會導致用戶被鎖?導致必須通過flush hosts釋放host_cache,具體如下:

| COUNT_NAMEINFO_TRANSIENT_ERRORS            | bigint(20)       | NO   |     | NULL                |       |
| COUNT_NAMEINFO_PERMANENT_ERRORS            | bigint(20)       | NO   |     | NULL                |       |
| COUNT_FORMAT_ERRORS                        | bigint(20)       | NO   |     | NULL                |       |
| COUNT_ADDRINFO_TRANSIENT_ERRORS            | bigint(20)       | NO   |     | NULL                |       |
| COUNT_ADDRINFO_PERMANENT_ERRORS            | bigint(20)       | NO   |     | NULL                |       |
| COUNT_FCRDNS_ERRORS                        | bigint(20)       | NO   |     | NULL                |       |
| COUNT_HOST_ACL_ERRORS                      | bigint(20)       | NO   |     | NULL                |       |
| COUNT_NO_AUTH_PLUGIN_ERRORS                | bigint(20)       | NO   |     | NULL                |       |
| COUNT_AUTH_PLUGIN_ERRORS                   | bigint(20)       | NO   |     | NULL                |       |
| COUNT_HANDSHAKE_ERRORS                     | bigint(20)       | NO   |     | NULL                |       |
| COUNT_PROXY_USER_ERRORS                    | bigint(20)       | NO   |     | NULL                |       |
| COUNT_PROXY_USER_ACL_ERRORS                | bigint(20)       | NO   |     | NULL                |       |
| COUNT_AUTHENTICATION_ERRORS                | bigint(20)       | NO   |     | NULL                |       |
| COUNT_SSL_ERRORS                           | bigint(20)       | NO   |     | NULL                |       |
| COUNT_MAX_USER_CONNECTIONS_ERRORS          | bigint(20)       | NO   |     | NULL                |       |
| COUNT_MAX_USER_CONNECTIONS_PER_HOUR_ERRORS | bigint(20)       | NO   |     | NULL                |       |
| COUNT_DEFAULT_DATABASE_ERRORS              | bigint(20)       | NO   |     | NULL                |       |
| COUNT_INIT_CONNECT_ERRORS                  | bigint(20)       | NO   |     | NULL                |       |
| COUNT_LOCAL_ERRORS                         | bigint(20)       | NO   |     | NULL                |       |
| COUNT_UNKNOWN_ERRORS                       | bigint(20)       | NO   |     | NULL                |       |

解決方法就是:flush hosts或mysqladmin flush-hosts 

mysql> select ip,host,HOST_VALIDATED,SUM_CONNECT_ERRORS ,COUNT_HANDSHAKE_ERRORS,COUNT_HOST_BLOCKED_ERRORS   from host_cache;
+----------------+-------+----------------+--------------------+------------------------+---------------------------+
| ip             | host  | HOST_VALIDATED | SUM_CONNECT_ERRORS | COUNT_HANDSHAKE_ERRORS | COUNT_HOST_BLOCKED_ERRORS |
+----------------+-------+----------------+--------------------+------------------------+---------------------------+
| 10.1.0.1    | NULL  | NO             |                  0 |                      5 |                         0 |
| 10.1.0.100 | node1 | YES            |                  0 |                      0 |                         0 |
+----------------+-------+----------------+--------------------+------------------------+---------------------------+
2 rows in set (0.00 sec)

mysql> flush hosts;
Query OK, 0 rows affected (0.00 sec)

mysql> select ip,host,HOST_VALIDATED,SUM_CONNECT_ERRORS ,COUNT_HANDSHAKE_ERRORS,COUNT_HOST_BLOCKED_ERRORS   from host_cache;
Empty set (0.00 sec)

3、aborted連接值非常高

abort連接狀態值主要有兩個,分別是 Aborted_clients和Aborted_connects,其中兩個變數值含義如下:

Aborted_clientsThe number of connections that were aborted because the client died without closing the connection properly. 

Aborted_connects:The number of failed attempts to connect to the MySQL server

下麵的狀態變數主要是用戶最大連接超過後,有多少嘗試連接的錯誤統計:

Connection_errors_max_connections:The number of connections refused because the server max_connections limit was reached

Aborted_clients和Aborted_connects參數對比,兩個狀態值在什麼情況下會變化?

Aborted_clients主要是因為客戶端非正常關閉,次值就會不斷增加,具體場景如下:

(1)手動殺死連接,kill的方式
(2)mysql客戶端超時interactive_timeout,結束sleep
(3)程式超時wait_timeout,異常結束sleep
(4)The client program did not call mysql_close() before exiting.
(5)The client program ended abruptly in the middle of a data transfer.

Aborted_connects主要是連接Mysql失敗的次數,具體場景如下:

(1)用戶名密碼錯誤
(2)登陸許可權不足
(3)連接超時,connect_timeout
(4) max_allowed_packet variable value is too small or queries require more memory than you have allocated for mysqld

針對aborted連接非常高,首先判斷是aborted_clients還是aborted_connects,然後具體情況具體分析,如果是aborted_connects可以通過tcpdump和error log日誌判斷具體連接失敗、導致abort的主機、用戶等信息。

tcpdump -s 1500 -w tcp.out port 3306

tcpdump參數選項如下:
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾數據報的類型
(2)-i eth1 : 只抓經過介面eth1的包
(3)-t : 不顯示時間戳
(4)-s 0 : 抓取數據包時預設抓取長度為68位元組。加上-S 0 後可以抓到完整的數據包
(5)-c 100 : 只抓取100個數據包
(6)dst port ! 22 : 不抓取目標埠是22的數據包
(7)src net 192.168.1.0/24 : 數據包的源網路地址為192.168.1.0/24
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析

4、連接數不斷增加

 mysql連接數有時候會不斷增加,這種情況一般由以下幾種原因

(1)長連接,processlist不斷遞增
(2)連接池初始化設置過大,程式不關閉連接,只增加連接

解決方案:調整sleep合理超時時間;檢查程式代碼,確定是否關閉資料庫連接操作;檢查連接池配置,調整合適的初始化連接值和最大連接值

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 SQL Server Service Broker 用來創建用於交換消息的會話。消息在目標和發起方這兩個端點之間進行交換。消息用於傳輸數據和觸發消息收到時的處理過程。目標和發起方既可以在同一資料庫引擎實例的同一資料庫或不同資料庫中,也可以在不同資料庫引擎實例的同一資料庫或不同資料庫中。 每個 ...
  • 大數據簡介 大數據的概念 Volume(數據容量)、Variety(數據類型)、Viscosity(價值密度)、Velocity(速度)、Veracity(真實性) 大數據的性質 非結構性、不完備性、時效性、安全性、可靠性 大數據處理的全過程 數據採集與記錄 --> 數據抽取、清洗、標記 --> 數 ...
  • RHEL6+oracle11.2 無界面化命令安裝如下: 1.所需安裝軟體包檢查: yum install binutils-2.* compat-libcap1* compat-libstdc++-33-* gcc-4.* gcc-c++-4.* glibc-2.* glibc-devel-2.* ...
  • oracle 序列的創建與使用 (2012-03-15 16:14:09) 轉載 oracle 序列的創建與使用 轉載 在Oracle中,可以使用序列自動生成一個整數序列,主要用來自動為表中的數據類型的主鍵列提供有序的唯一值,這樣就可以避免在向表中添加數據時,手工指定主鍵值。而且使用手工指定主鍵值這 ...
  • 1.1 前言 在進行MySQL的優化之前必須要瞭解的就是MySQL的查詢過程,很多的查詢優化工作實際上就是遵循一些原則讓MySQL的優化器能夠按照預想的合理方式運行而已。更多關於MySQL查詢相關參照:http://www.cnblogs.com/clsn/p/8038964.html#_label ...
  • 學習目標 -瞭解分析函數作用和類型 -使用分析函數產生報告 分析函數 分析函數用於計算一些基於組的聚合值,它與聚合函數的區別在於,分析函數每組返回多行,聚合函數每組返回一行。 一般分析函數 ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...) 按分區或返回 ...
  • 查詢出重覆記錄 select * from 重覆記錄欄位 in ( select 重覆記錄欄位 form 數據表 group by 重覆記錄欄位 having count(重覆記錄欄位)>1) ...
  • 應儘量避免在where中使用!=或<>操作符。否則會進行全表查詢 對於查詢,避免全盤掃描,考慮在where或order by涉及到的列上建立索引 避免在where中進行null值判斷,否則會進行全表掃描 查詢時,避免*查詢全部,按要求指定的查 In和not in也要慎用,否則會導致全表掃描 不要寫一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...