今天的一個需求上線需要在數據庫的某個表中增加一個字段。這個數據庫是服務中一個業務量比較少的數據庫,與主要業務的數據庫是隔離的。執行增加操作後生效比較慢,沒有關注,過了一段時間收到服務超時量報警。
分析原因:
修改的數據庫表數據量比較大,修改數據庫字段時會鎖住表。
線上業務雖然很少的業務請求會想表中插入數據,當表鎖住後會造成數據庫連接掛起,當大量連接數據庫的線程被掛起之後,服務線程池中的有效線程就會大量減少,此時會造成大量請求超時。
這時用工具連接數據庫時會報錯:1040 too many connections
這個錯誤的原因就是,數據庫的連接量過多無法連接。原因就是服務中插入數據的數據庫連接都被掛住引起總的數據庫連接數達到配置的最大量,拒絕更多的連接請求。
解決:
重啓數據庫服務。
重啓之後超時請求消失。
總結:
Mysql在5.6版本之前,直接修改表結構的過程中會鎖表,具體的操作步驟如下:
(1)首先創建新的臨時表,表結構通過命令ALTAR TABLE新定義的結構
(2)然後把原表中數據導入到臨時表
(3)刪除原表
(4)最後把臨時表重命名爲原來的表名
具體操作可以再深入學習。