MySQL的表是一組有意義的數(shù)據(jù)的集合,通常會(huì)在表中定義多個(gè)字段來(lái)存儲(chǔ)數(shù)據(jù)。該數(shù)據(jù)集合持續(xù)增長(zhǎng),業(yè)務(wù)需求發(fā)生變化,系統(tǒng)需要改變表的結(jié)構(gòu)以滿(mǎn)足后續(xù)需求。這時(shí)我們就需要增加表字段,可是在進(jìn)行表結(jié)構(gòu)修改的時(shí)候,我們可能會(huì)遇到數(shù)據(jù)的一些問(wèn)題,比如表被鎖定。
在向表中增加字段時(shí),MySQL會(huì)對(duì)這個(gè)表進(jìn)行鎖定,在所有操作完成前,表會(huì)一直處于鎖定狀態(tài),其他用戶(hù)將無(wú)法對(duì)該表進(jìn)行修改或查詢(xún)操作。這對(duì)于大型生產(chǎn)系統(tǒng)來(lái)說(shuō),可能會(huì)對(duì)業(yè)務(wù)造成一定的影響。
通過(guò)使用預(yù)定義的語(yǔ)句和選項(xiàng),我們可以緩解這種情況。在向表中添加新字段的同時(shí),使用 ALTER TABLE 語(yǔ)句將鎖定時(shí)長(zhǎng)降至最低。
ALTER TABLE 表名稱(chēng) ADD COLUMN 列名稱(chēng) 數(shù)據(jù)類(lèi)型;
在你執(zhí)行該命令之前,請(qǐng)確保已經(jīng)備份了你的表。你可以使用以下語(yǔ)句備份你的表:
CREATE TABLE 表名稱(chēng)_backup AS SELECT * FROM 表名稱(chēng);
通過(guò)這種方式,當(dāng)你在執(zhí)行 ALTER TABLE 命令時(shí),就可以快速地將表的結(jié)構(gòu)修改完成,減少表被鎖定的時(shí)間,從而避免大量的業(yè)務(wù)影響。我們可以使用 SHOW OPEN TABLES 命令來(lái)查看當(dāng)前處于鎖定狀態(tài)的表。
SHOW OPEN TABLES WHERE In_use >0;
通過(guò)操作系統(tǒng)和系統(tǒng)級(jí)別的工具,也可以在表被鎖定時(shí)監(jiān)控它的活動(dòng)和性能數(shù)據(jù),以確保修改表結(jié)構(gòu)的時(shí)間最小,最大程度地減少業(yè)務(wù)影響。