從一些常見的錯誤聊聊mysql服務端的關鍵配置

来源:https://www.cnblogs.com/Jcloud/archive/2023/08/22/17648501.html
-Advertisement-
Play Games

MySQL服務端配置對使用方來說是不可更改的,需要聯繫DBA進行操作。這些配置操作對我們來說是一個黑盒,但是瞭解核心配置可以幫助我們快速定位資料庫問題原因。 ...


背景

每一年都進行大促前壓測,每一次都需要再次關註到一些基礎資源的使用問題,訂單中心這邊資料庫比較多,最近頻繁報資料庫異常,所以對資料庫一些配置問題也進行了研究,本文給出一些常見的資料庫配置,說明這些配置對我們資料庫使用的影響。目前,MySQL服務端配置對使用方來說是不可更改的,需要聯繫DBA進行操作。這些配置操作對我們來說是一個黑盒,但是瞭解核心配置可以幫助我們快速定位資料庫問題原因。

問題彙總

問題一、too many connections

資料庫服務端配置:max_connections
這個問題我們這邊線上遇到過,對於同一個資料庫,有多個系統都連接了資料庫,導致連接資料庫的機器比較多,在資料庫qps比較大時,創建的連接數比較大,導致連接的總數超過了資料庫服務端連接的限制閾值,從而報了這個錯誤。

舉個慄子:如果max_connections設置為1000,我們這邊有200台機器,每台機器最大連接數為20,在連接比較大時,可能大致連接的總數為200 * 20 = 4000 > 1000,超過資料庫的限制。

下麵讓我們在本地演示一下這種錯誤:

首先查詢當前服務端最大連接數:

如果這個參數太大,不好演示的話,可以通過如下參數,將這個數值改小些

下麵通過客戶端嘗試連接資料庫,可以看到,直接報錯了

對於這種問題有兩種解決辦法:
第一種:聯繫DBA將max_connections設置的大一些,DBA之前反饋max_connections這個參數有自動增長的邏輯;
第二種方法:如果資料庫操作qps並不是很大,可以將每台機器的資料庫連接最大值設置小一些,如果設置了初始化連接大小,要考慮機器數的增長,隨著機器數的增長,連接的總數肯定會遞增的。

問題二、慢日誌長時間執行導致服務不可用

資料庫庫服務端配置:max_execution_time
之前寫了一篇文章聊了一下如何在客戶端配置參數解決慢日誌長時間執行問題,這個在本地驗證是沒有問題的,但是由於我們線上環境使用的是JED,JED的架構多了中間代理層,在客戶端執行KILL QUERY CONNECTION_ID會提示失敗,導致沒法停止慢sql(這個好坑,據說JED後期會優化這個問題)。

既然目前客戶端沒法控制慢sql停止,從官網上看了一下mysql服務端的配置參數,發現有一個參數能夠控制服務端主動超時停止sql,參數變數:max_execution_time,本地環境驗證如下:

首先將sql執行超時時間設置為2s:

然後執行一個sleep函數,讓執行時間達到10s,可以看出來執行直接中斷了,因為超過了2s的最大超時時間:

問題三、服務端連接都斷開了,但是客戶端還用無效連接發送請求

資料庫庫服務端配置:wait_timeout
之前線上用的是mysql,通過mysql驅動包直連資料庫,資料庫服務端預設連接空閑時間是8小時,後來響應公司號召,將傳統的mysql切到了jed(底層也是mysql), jed由於網關層的存在,客戶端是通過mysql驅動包跟網關層進行直連,網關這一層資料庫空閑連接超時時間僅僅10分鐘,當時在客戶端進行空閑連接探活時間超過10分鐘,導致資料庫報錯頻繁。現在已經找不到歷史的資料庫異常日誌了,本地模擬了一下,驗證如下:

先將本地空閑連接超時設置為10s

驗證源碼如下,讓兩條sql執行時間超過10s,可以發現第二次執行sql時執行報錯了

所以,如果換了數據源,需要確認下服務端的空閑連接超時時間設置,免得配置的值和客戶端檢測空閑連接健康性檢測間隔不匹配,出現意料不到的結果。

註:我們這邊使用的是DBCP數據源連接池,配置如下:

<bean id="abstractParallelProductWriteDataSource" class="org.apache.commons.dbcp.BasicDataSource" abstract="true" destroy-method="close" init-method="createDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="username" value="${db.online.write.username}" />
        <property name="password" value="${db.online.write.password}" />
        <property name="initialSize" value="3" />
        <property name="minIdle" value="3" /><!--最小鏈接數 -->
        <property name="maxIdle" value="3" /><!--最大鏈接數 -->
        <property name="maxActive" value="8" /><!--最大活躍鏈接數 -->
        <property name="maxWait" value="200" />
        <property name="validationQuery" value="select 1" />
        <property name="testOnBorrow" value="false" />
        <property name="removeAbandonedTimeout" value="10" />
        <property name="removeAbandoned" value="true" />
        <!-- 池中的連接空閑10分鐘後被回收,預設值就是30分鐘 -->
        <property name="minEvictableIdleTimeMillis" value="600000" />
        <!-- 每5分鐘運行一次空閑連接回收器 -->
        <property name="timeBetweenEvictionRunsMillis" value="300000" />
        <!--指明連接是否被空閑連接回收器(如果有)進行檢驗.如果檢測失敗,則連接將被從池中去除 -->
        <property name="testWhileIdle" value="true"/>
        <!--在每次空閑連接回收器線程(如果有)運行時檢查的連接數量,預設值是3 -->
        <property name="numTestsPerEvictionRun" value="5"/>
    </bean>


timeBetweenEvictionRunsMillis這個參數配置的是檢測空閑連接的間隔時間,如果服務端空閑連接10分鐘就斷開了,這個時間需要小於10分鐘。minEvictableIdleTimeMillis這個時間是判斷當前連接已經空閑了多久了,目前配置的是10分鐘。

其他關鍵配置彙總

  1. thread_handling
    配置了服務端的線程處理模型,主要的值有no-threads、one-thread-per-connection、loaded-dynamically。其中no-threads表示同一時刻只能有一個連接被一個線程處理。one-thread-per-connection表示對於每一個連接請求都有一個線程來處理。loaded-dynamically是mysql的線程池模式,目前預設的是one-thread-per-connection,所以連接太多的話,也會導致創建的線程快速增加,消耗系統的資源。

  2. slow_query_log
    用來控制是否列印慢日誌,如果需要分析系統性能情況,可以打開這個開關,進行慢日誌分析。

  3. profiling
    是否啟用sql查詢性能分析,類似於debug日誌,線上環境需要關閉,比較耗性能,這個參數後面mysql版本會廢棄掉,現在還是可以先使用著,新的使用方式可以參考:https://dev.mysql.com/doc/refman/8.0/en/performance-schema-query-profiling.html。

由於這個參數線上是關閉著,只能讓DBA臨時幫忙查詢下分析結果,平常也沒咋用,感覺還是一個不錯的工具,分析結果類似下麵截圖:

總結

mysql服務端配置太多,目前工作中主要接觸了上述這些配置,感覺還不錯的,在平常分析資料庫問題上能夠給予一定的幫助,大家也可以去多瞭解一下,更多的配置可以參考官方文檔:mysql服務端配置官網

作者:京東零售 薑昌偉

來源:京東雲開發者社區 轉載請註明來源


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

-Advertisement-
Play Games
更多相關文章
  • 先決條件 Visual Studio 2019 v16.9 預覽版1或更高版本(通過WSL可選組件進行.NET調試)。若要檢查 WSL 組件,請選擇 “工具” > “獲取工具和功能” 。 在 Visual Studio 安裝程式中,選擇 “單個組件”,然後鍵入 “WSL” 搜索安裝組件 。 安裝WS ...
  • ## 中台框架後端項目 Admin.Core 的介紹與配置說明 > 中台admin是前後端分離許可權管理系統,Admin.Core為後端項目,基於.NET 7.0開發。 > 支持多租戶、數據許可權、動態 Api、任務調度、OSS 文件上傳、滑塊拼圖驗證、多資料庫,分散式緩存、分散式事務等 - 介面文檔一 ...
  • [toc] # 模擬Linux文件管理員系統-shell實現 **註:此腳本僅供學習使用,具體需要根據實際情況進行測試調整。** ## 1 系統要求 ![](https://img2023.cnblogs.com/blog/3262925/202308/3262925-202308211934402 ...
  • 1、LDAP介紹 LDAP是一個基於X.500標準的輕量目錄訪問協議,與X.500不同,LDAP協議支持TCP/IP連接。全稱為Lightweight Directory Access Protocol(輕量目錄訪問協議),是用戶、設備和客戶端與目錄伺服器通信的標準協議。LDAP協議幫助用戶對IT資 ...
  • Shell編程是一種在命令行環境中編寫程式的技術,常用於Linux和Unix系統。它主要使用Shell腳本語言來編寫程式。Shell編程常用於系統管理、自動化任務、批處理等領域。 常用的Shell腳本語言包括Bash、Csh、Tcsh和Zsh等。Bash是最常用的Shell編程語言,它是大多數Li... ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230821150719320-729006736.png) # 1. 創建數據表 ## 1.1. sql ```sql CREATE TABLE person (person ...
  • 當使用了多個資料庫來提供服務時,最為關鍵的點是如何讓每一個資料庫比較均勻的承擔壓力,而不至於其中的某些資料庫壓力過大,某些資料庫沒什麼壓力。這其中的關鍵點之一就是拆分鍵的設計 ...
  • 近日,第14屆中國資料庫技術大會(DTCC2023)在北京國際會議中心順利舉行。大會以“數智賦能 共築未來”為主題,邀請了上百位行業專家,一起探討新時代下各類型資料庫的最新動態和應用實踐,帶來一場資料庫領域的年度盛宴。在上午的主會場,華為雲資料庫服務產品部總經理蘇光牛圍繞“打造最可信資料庫,華為雲G ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...