MySQL 表新增字段時報丟失連接錯誤
1. 問題描述
有一張MySQL數(shù)據(jù)庫表,業(yè)務變動,需要新增一個業(yè)務字段,于是直接用下面的SQL語句進行字段新增:
ALTER TABLE table_name ADD `add_field` tinyint(1) DEFAULT NULL COMMENT '新增字段';
使用Navicat for MySQL執(zhí)行該語句會報一個錯誤,如下圖所示:
2013 - Lost connection to MySQL server during query,翻譯過來就是在查詢過程中,MySQL服務器失去連接。
該問題是大約一年前遇到的(2020年我寫的文章),最近整理筆記看到了,趁有時間做一些整理記錄。但是當時的具體環(huán)境已經(jīng)無法復現(xiàn)了。
2. 官方文檔
MySQL 官方文檔的附錄中有一篇是講 MySQL 服務器連接斷開。下面是我翻譯的內(nèi)容:
此錯誤消息有三個可能的原因。
通常它表示網(wǎng)絡連接有問題,如果這個錯誤經(jīng)常發(fā)生,你應該檢查一下你的網(wǎng)絡狀況。如果提示的錯誤消息包含"during query"字符,那么您遇到的情況可能就是這種原因。
有時,當幾百萬行作為一個或多個查詢的一部分被發(fā)送時,就會發(fā)生"during query"表單。如果您知道發(fā)生了這種情況,那么您應該嘗試將net_read_timeout從默認的30秒增加到60秒或足以完成數(shù)據(jù)傳輸?shù)母L時間。
更少見的情況是,當客戶端試圖初始化連接到服務器時,會發(fā)生這種情況。在這種情況下,如果connect_timeout值被設置為幾秒,那么您可以通過將其增加到10秒來解決問題,如果您的連接距離很長或速度較慢,那么時間可能會更長。你可以通過查詢Aborted_connects來確定你是否正在經(jīng)歷這種更不常見的原因。服務器每中止一個初始連接嘗試,它的值就會增加1。如果錯誤消息包括"reading authorization packet",表明這正是您所需要的解決方案。
SHOW GLOBAL STATUS LIKE 'Aborted_connects'
如果原因不是以上所述的,你可能遇到了BLOB值大于max_allowed_packet的問題,這可能導致某些客戶端出現(xiàn)此錯誤。有時你可能還會看到一個ER_NET_PACKET_TOO_LARGE錯誤,可以確定是需要提高max_allowed_packet值了。
SHOW VARIABLES LIKE '%max_allowed_packet%';
3. 解決辦法
通過查閱官方文檔,不難看出其實比較符合第一條解釋。結合當時那家公司的網(wǎng)絡,確實經(jīng)常的時斷時續(xù)的,網(wǎng)絡環(huán)境比較差。
MySQL的這個錯誤除了官方說的幾種情況,還需要針對自己的業(yè)務場景進行適當探索和甄別,具體情況具體分析。這里再記錄一下另一種可能,因為ALTER TABLE操作是比較耗時的,所以也很有可能是因為超時原因報的錯誤。查詢關于超時時間的系統(tǒng)變量:
SHOW VARIABLES LIKE '%timeout%';
高性能MySQL這本書的第四章Schema與數(shù)據(jù)優(yōu)化提到了以下內(nèi)容:
MySQL的ALTER TABLE操作的性能對大表來說是個問題。MySQL執(zhí)行大部分修改表結構操作的方法是用新的結構創(chuàng)建一個空表,從舊表中查出所有數(shù)據(jù)插入新表,然后刪除舊表。這樣操作可能需要花費很長時間,如果內(nèi)存不足表又很大,而且還有很多索引的情況下尤其如此。
一般而言,大部分ALTER TABLE操作將導致MySQL服務中斷。對于常見場景,能使用的技巧只有兩種:一種是先在一臺不提供服務的機器上執(zhí)行ALTER TABLE操作,然后和提供服務的主庫進行切換;另一種技巧是影子拷貝,就是用要求的表結構創(chuàng)建一張與源表無關的新表,然后通過重命名和刪表操作交換兩張表。
ALTER TABLE允許使用ALTER COLUMN、MODIFY COLUMN、CHANGE COLUMN三種語句修改列。這三種操作都是不一樣的。
可以結合MySQL錯誤日志,找到需要修改的系統(tǒng)變量,進行相應修改即可。
到此這篇關于MySQL 表新增字段時報丟失連接錯誤的文章就介紹到這了,更多相關MySQL 表新增字段時丟失內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
全面解析MySQL?Explain如何優(yōu)化SQL查詢性能
在?MySQL?中,EXPLAIN?關鍵字可以幫助我們分析查詢執(zhí)行計劃,從而優(yōu)化查詢性能,所以本文就來和大家詳細講講Explain是如何優(yōu)化SQL查詢性能的2023-05-05
linux下mysql開啟遠程訪問權限 防火墻開放3306端口
這篇文章主要為大家詳細介紹了linux下mysql開啟遠程訪問權限,防火墻開放3306端口,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01

