MySQL 表新增字段時(shí)報(bào)丟失連接錯(cuò)誤
1. 問(wèn)題描述
有一張MySQL數(shù)據(jù)庫(kù)表,業(yè)務(wù)變動(dòng),需要新增一個(gè)業(yè)務(wù)字段,于是直接用下面的SQL語(yǔ)句進(jìn)行字段新增:
ALTER TABLE table_name ADD `add_field` tinyint(1) DEFAULT NULL COMMENT '新增字段';
使用Navicat for MySQL執(zhí)行該語(yǔ)句會(huì)報(bào)一個(gè)錯(cuò)誤,如下圖所示:
2013 - Lost connection to MySQL server during query,翻譯過(guò)來(lái)就是在查詢過(guò)程中,MySQL服務(wù)器失去連接。
該問(wèn)題是大約一年前遇到的(2020年我寫(xiě)的文章),最近整理筆記看到了,趁有時(shí)間做一些整理記錄。但是當(dāng)時(shí)的具體環(huán)境已經(jīng)無(wú)法復(fù)現(xiàn)了。
2. 官方文檔
MySQL 官方文檔的附錄中有一篇是講 MySQL 服務(wù)器連接斷開(kāi)。下面是我翻譯的內(nèi)容:
此錯(cuò)誤消息有三個(gè)可能的原因。
通常它表示網(wǎng)絡(luò)連接有問(wèn)題,如果這個(gè)錯(cuò)誤經(jīng)常發(fā)生,你應(yīng)該檢查一下你的網(wǎng)絡(luò)狀況。如果提示的錯(cuò)誤消息包含"during query"字符,那么您遇到的情況可能就是這種原因。
有時(shí),當(dāng)幾百萬(wàn)行作為一個(gè)或多個(gè)查詢的一部分被發(fā)送時(shí),就會(huì)發(fā)生"during query"表單。如果您知道發(fā)生了這種情況,那么您應(yīng)該嘗試將net_read_timeout從默認(rèn)的30秒增加到60秒或足以完成數(shù)據(jù)傳輸?shù)母L(zhǎng)時(shí)間。
更少見(jiàn)的情況是,當(dāng)客戶端試圖初始化連接到服務(wù)器時(shí),會(huì)發(fā)生這種情況。在這種情況下,如果connect_timeout值被設(shè)置為幾秒,那么您可以通過(guò)將其增加到10秒來(lái)解決問(wèn)題,如果您的連接距離很長(zhǎng)或速度較慢,那么時(shí)間可能會(huì)更長(zhǎng)。你可以通過(guò)查詢Aborted_connects來(lái)確定你是否正在經(jīng)歷這種更不常見(jiàn)的原因。服務(wù)器每中止一個(gè)初始連接嘗試,它的值就會(huì)增加1。如果錯(cuò)誤消息包括"reading authorization packet",表明這正是您所需要的解決方案。
SHOW GLOBAL STATUS LIKE 'Aborted_connects'
如果原因不是以上所述的,你可能遇到了BLOB值大于max_allowed_packet的問(wèn)題,這可能導(dǎo)致某些客戶端出現(xiàn)此錯(cuò)誤。有時(shí)你可能還會(huì)看到一個(gè)ER_NET_PACKET_TOO_LARGE錯(cuò)誤,可以確定是需要提高max_allowed_packet值了。
SHOW VARIABLES LIKE '%max_allowed_packet%';
3. 解決辦法
通過(guò)查閱官方文檔,不難看出其實(shí)比較符合第一條解釋。結(jié)合當(dāng)時(shí)那家公司的網(wǎng)絡(luò),確實(shí)經(jīng)常的時(shí)斷時(shí)續(xù)的,網(wǎng)絡(luò)環(huán)境比較差。
MySQL的這個(gè)錯(cuò)誤除了官方說(shuō)的幾種情況,還需要針對(duì)自己的業(yè)務(wù)場(chǎng)景進(jìn)行適當(dāng)探索和甄別,具體情況具體分析。這里再記錄一下另一種可能,因?yàn)?code>ALTER TABLE操作是比較耗時(shí)的,所以也很有可能是因?yàn)槌瑫r(shí)原因報(bào)的錯(cuò)誤。查詢關(guān)于超時(shí)時(shí)間的系統(tǒng)變量:
SHOW VARIABLES LIKE '%timeout%';
高性能MySQL這本書(shū)的第四章Schema與數(shù)據(jù)優(yōu)化提到了以下內(nèi)容:
MySQL的ALTER TABLE操作的性能對(duì)大表來(lái)說(shuō)是個(gè)問(wèn)題。MySQL執(zhí)行大部分修改表結(jié)構(gòu)操作的方法是用新的結(jié)構(gòu)創(chuàng)建一個(gè)空表,從舊表中查出所有數(shù)據(jù)插入新表,然后刪除舊表。這樣操作可能需要花費(fèi)很長(zhǎng)時(shí)間,如果內(nèi)存不足表又很大,而且還有很多索引的情況下尤其如此。
一般而言,大部分ALTER TABLE操作將導(dǎo)致MySQL服務(wù)中斷。對(duì)于常見(jiàn)場(chǎng)景,能使用的技巧只有兩種:一種是先在一臺(tái)不提供服務(wù)的機(jī)器上執(zhí)行ALTER TABLE操作,然后和提供服務(wù)的主庫(kù)進(jìn)行切換;另一種技巧是影子拷貝,就是用要求的表結(jié)構(gòu)創(chuàng)建一張與源表無(wú)關(guān)的新表,然后通過(guò)重命名和刪表操作交換兩張表。
ALTER TABLE允許使用ALTER COLUMN、MODIFY COLUMN、CHANGE COLUMN三種語(yǔ)句修改列。這三種操作都是不一樣的。
可以結(jié)合MySQL錯(cuò)誤日志,找到需要修改的系統(tǒng)變量,進(jìn)行相應(yīng)修改即可。
到此這篇關(guān)于MySQL 表新增字段時(shí)報(bào)丟失連接錯(cuò)誤的文章就介紹到這了,更多相關(guān)MySQL 表新增字段時(shí)丟失內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 啟動(dòng)失敗(code=exited, status=1/FAILURE)異常解決方案
在MySQL服務(wù)啟動(dòng)時(shí)遇到啟動(dòng)失敗問(wèn)題,通過(guò)查看和分析錯(cuò)誤日志文件,找到并解決了配置文件中的錯(cuò)誤項(xiàng),成功重啟了MySQL服務(wù).文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
MySQL開(kāi)啟慢查詢?nèi)罩緇og-slow-queries的方法
MySQL中提供了一個(gè)慢查詢的日志記錄功能,可以把查詢SQL語(yǔ)句時(shí)間大于多少秒的語(yǔ)句寫(xiě)入慢查詢?nèi)罩荆粘>S護(hù)中可以通過(guò)慢查詢?nèi)罩镜挠涗浶畔⒖焖贉?zhǔn)確地判斷問(wèn)題所在2016-05-05
阿里云ECS云服務(wù)器(linux系統(tǒng))安裝mysql后遠(yuǎn)程連接不了(踩坑)
這篇文章主要介紹了阿里云ECS云服務(wù)器(linux系統(tǒng))安裝mysql后遠(yuǎn)程連接不了(踩坑),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
mysql優(yōu)化之路----hash索引優(yōu)化
本文是筆者自己做的關(guān)于mysql的優(yōu)化方面的小測(cè)試,暫時(shí)僅僅做了hash索引優(yōu)化的測(cè)試,以后會(huì)做更多方面,希望能夠給您帶來(lái)收獲,祝您工作愉快。2014-08-08
mysql數(shù)據(jù)庫(kù)卡頓問(wèn)題排查過(guò)程
介紹了四種排查數(shù)據(jù)庫(kù)問(wèn)題的方法,包括查看SQL運(yùn)行情況、庫(kù)和表信息、數(shù)據(jù)庫(kù)配置情況以及重啟數(shù)據(jù)庫(kù),每種方法都有具體的操作步驟和注意事項(xiàng),旨在幫助讀者解決數(shù)據(jù)庫(kù)資源不足、死鎖等問(wèn)題2025-02-02
CentOS 7.2下MySQL的安裝與相關(guān)配置
最近因?yàn)楣ぷ餍枰?,要在CentOS上安裝MySQL,在安裝的時(shí)候遇到了一點(diǎn)問(wèn)題,花了點(diǎn)時(shí)間解決了,感覺(jué)不管是官網(wǎng)還是網(wǎng)上的一些教程都不夠完整,不能一次性幫新手解決問(wèn)題,于是我就結(jié)合官網(wǎng)和網(wǎng)上的資源整理了下,現(xiàn)在分享給大家,希望對(duì)有需要的朋友們能有所幫助。2016-11-11

