通訊封包是指傳送到 MySQL 伺服器的單一 SQL 陳述式、傳送到用戶端的單一資料列,或從複寫來源伺服器傳送到複本的二進位記錄事件。
可傳輸到或從 MySQL 8.4 伺服器或用戶端的最大封包為 1GB。
當 MySQL 用戶端或 mysqld 伺服器接收到大於 max_allowed_packet
位元組的封包時,它會發出 ER_NET_PACKET_TOO_LARGE
錯誤並關閉連線。對於某些用戶端,如果通訊封包過大,您也可能會收到 Lost connection to MySQL server during query
錯誤。
用戶端和伺服器都有自己的 max_allowed_packet
變數,因此如果要處理大型封包,您必須在用戶端和伺服器中都增加這個變數。
如果您正在使用 mysql 用戶端程式,其預設的 max_allowed_packet
變數為 16MB。若要設定更大的值,請像這樣啟動 mysql
$> mysql --max_allowed_packet=32M
這會將封包大小設定為 32MB。
伺服器的預設 max_allowed_packet
值為 64MB。如果伺服器需要處理大型查詢 (例如,如果您正在使用大型 BLOB
欄位),您可以增加此值。例如,若要將變數設定為 128MB,請像這樣啟動伺服器
$> mysqld --max_allowed_packet=128M
您也可以使用選項檔案設定 max_allowed_packet
。例如,若要將伺服器的大小設定為 128MB,請在選項檔案中新增下列行
[mysqld]
max_allowed_packet=128M
增加這個變數的值是安全的,因為額外的記憶體僅在需要時才配置。例如,mysqld 僅在您發出長查詢或 mysqld 必須傳回大型結果資料列時才會配置更多記憶體。此變數的預設值較小是一種預防措施,可以捕捉用戶端和伺服器之間不正確的封包,並確保您不會因意外使用大型封包而耗盡記憶體。
如果您正在使用大型 BLOB
值,但尚未給予 mysqld 足夠的記憶體來處理查詢,您也可能會遇到大型封包的奇怪問題。如果您懷疑是這種情況,請嘗試在 mysqld_safe 指令碼的開頭新增 ulimit -d 256000,然後重新啟動 mysqld。