首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL密碼過期導致連接失效排查實戰:從連接池超時到密碼策略根因定位

     編輯:MySQL 資料庫相關知識

故障現象演進

  1. 現象1:An attempt by a client to checkout a Connection has timed out — 連接池獲取連接超時
  2. 誤判方向:調大cpool.checkoutTimeout(500→18000→36000)、擴大maxPoolSize(100),無效
  3. 現象2:Connections could not be acquired from the underlying database! — 底層數據庫無法獲取連接

根因定位:MySQL密碼過期策略

靈感來源:Oracle 11g默認密碼180天過期。MySQL 5.7+默認啟用default_password_lifetime=360(天),密碼過期後:

  • 新連接被拒絕(ERROR 1820 (HY000): You must reset your password)
  • 連接池重試、超時、最終耗盡
  • 應用層表現為獲取連接超時,極易誤判為網絡/連接池問題

解決方案

臨時修復(重置密碼)

-- 以root登錄
ALTER USER 'app_user'@'%' IDENTIFIED BY 'new_password' PASSWORD EXPIRE NEVER;
FLUSH PRIVILEGES;

永久關閉密碼過期(生產環境建議)

[mysqld]
default_password_lifetime = 0  -- 0表示永不過期
-- 或單用戶級別
ALTER USER 'app_user'@'%' PASSWORD EXPIRE NEVER;

驗證修復

SELECT user, host, password_expired, password_last_changed 
FROM mysql.user WHERE user='app_user';

重啟MySQL與應用服務(Tomcat等),連接恢復正常。

預防體系

  • 監控告警:定期查詢password_expired='Y'用戶,提前30天告警
  • 配置管理:my.cnf顯式設置default_password_lifetime=0
  • 密碼輪換:自動化腳本定期輪換,避免過期
  • 文檔記錄:故障複盤錄入知識庫,避免二次踩坑

教訓:連接池超時往往是症狀而非病因,向下穿透到數據庫錯誤日誌、狀態變量,才能定位真實根因。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved