Mysql添加字段或索引導(dǎo)致鎖表的處理方式
mysql添加字段或索引為什么會鎖表
前幾天,在生產(chǎn)環(huán)境對數(shù)據(jù)庫的一張大表進(jìn)行新增字段的操作,結(jié)果直接導(dǎo)致該表被鎖,所有該表的增刪改查操作全部阻塞,服務(wù)器負(fù)載飆高,進(jìn)而影響到了線上業(yè)務(wù)。
鎖表時查看服務(wù)器日志,發(fā)現(xiàn)有大量如下圖所示的報錯信息

從上圖分析可得數(shù)據(jù)庫連接池已經(jīng)沒有空閑的連接可用了,為了快速能夠解決這個問題,使用show processlist顯示 數(shù)據(jù)庫所有正在運(yùn)行的線程相關(guān)信息,根據(jù)執(zhí)行時間可以準(zhǔn)確判斷出新增字段對應(yīng)的線程(如下圖所示),由于新增字段鎖表導(dǎo)致其他增刪改該表語句處于等待狀態(tài),通過 kill processId 殺掉修改表結(jié)構(gòu)的語句,馬上恢復(fù)了正常。

事后,通過網(wǎng)上查閱資料,對于造成數(shù)據(jù)庫鎖表原因分析和復(fù)盤,不同的mysql版本對于添加字段導(dǎo)致鎖表有著不同的處理方式。
mysql版本5.6之前的處理 :
- 首先創(chuàng)建新的臨時表,復(fù)制原表結(jié)構(gòu),并新增新字段
- 然后把原表中數(shù)據(jù)導(dǎo)入到臨時表
- 刪除原表
- 最后重命名臨時表為原表名
通過mysql官網(wǎng)得知,MySQL 5.6后支持Online DDL(在線DDL),Online DDL就是允許在表上執(zhí)行DDL的操作(例如創(chuàng)建字段)的同時不阻塞并發(fā)的DML(SELECT、UPDATE、INSERT、DELETE)操作,也就是說在執(zhí)行DDL語句時,提供無鎖加字段或索引的機(jī)制,即在DDL語句后加 ALGORITHM=INPLACE,LOCK=NONE。
mysql版本5.6之后的處理 :
- 例子:ALTER TABLE 表名ADD COLUMN …(此處省略),ALGORITHM = INPLACE, LOCK = NONE;
ALGORITHM 描述的是DDL的實(shí)現(xiàn)方式,LOCK 描述的是執(zhí)行DDL是否加鎖
ALGORITHM 有三個參數(shù):
Default (默認(rèn),由mysql自行決定) ,
INPLACE (對當(dāng)前表在引擎層對數(shù)據(jù)改動)
COPY (采用拷表方式進(jìn)行表變更,缺點(diǎn):需要多一倍存儲,表很大的時候,可能因?yàn)榇疟P的容量不足而操作失敗)
LOCK 有四個參數(shù)
NONE (無鎖)
SHARED (共享鎖)
DEFAULT (默認(rèn),由mysql自行決定)
EXCLUSIVE (互斥鎖)
總結(jié):
mysql 5.6后為了避免mysql添加字段或索引鎖表的問題只需要在添加字段或索引的執(zhí)行語句后加 ALGORITHM = INPLACE, LOCK = NONE;
對于大表的修改最好滿足以下條件:
盡量選擇流量小的時候才執(zhí)行sql執(zhí)行前需要查看是否有未提交的事務(wù)預(yù)先在預(yù)發(fā)布環(huán)境先行模擬對應(yīng)的場景,評估風(fēng)險
到此這篇關(guān)于Mysql添加字段或索引導(dǎo)致鎖表的處理方式的文章就介紹到這了,更多相關(guān)Mysql添加字段導(dǎo)致鎖表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql中distinct與group by的去重方面的區(qū)別
distinct簡單來說就是用來去重的,而group by的設(shè)計目的則是用來聚合統(tǒng)計的,兩者在能夠?qū)崿F(xiàn)的功能上有些相同之處,但應(yīng)該仔細(xì)區(qū)分,因?yàn)橛缅e場景的話,效率相差可以倍計。2020-03-03
mysql表分區(qū)的方式和實(shí)現(xiàn)代碼示例
通俗地講表分區(qū)是將一個大表,根據(jù)條件分割成若干個小表,下面這篇文章主要給大家介紹了關(guān)于mysql表分區(qū)的方式和實(shí)現(xiàn)代碼,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
安裝MySQL 5.7出現(xiàn)報錯:unknown variable ‘mysqlx_port
這篇文章主要介紹了安裝MySQL 5.7出現(xiàn)報錯:unknown variable ‘mysqlx_port=0.0‘的解決方法,文中通過圖文結(jié)合的方式介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-06
MySQL計劃任務(wù)(事件調(diào)度器) Event Scheduler介紹
MySQL5.1.x版本中引入了一項(xiàng)新特性EVENT,顧名思義就是事件、定時任務(wù)機(jī)制,在指定的時間單元內(nèi)執(zhí)行特定的任務(wù),因此今后一些對數(shù)據(jù)定時性操作不再依賴外部程序,而直接使用數(shù)據(jù)庫本身提供的功能2013-10-10
MySQL-MMM安裝指南(Multi-Master Replication Manager for MySQL)
這篇文章主要介紹了mysql Multi-Master Replication Manager for MySQL的安裝方法,需要的朋友可以參考下2014-02-02

