通訊封包是指傳送到 MySQL 伺服器的單一 SQL 語法,傳送到用戶端的單一資料列,或從複製來源伺服器傳送到複本的二進制日誌事件。
可以從 MySQL 9.0 伺服器或用戶端傳輸的最大封包大小為 1GB。
當 MySQL 用戶端或 mysqld 伺服器收到大於 max_allowed_packet
位元組的封包時,它會發出 ER_NET_PACKET_TOO_LARGE
錯誤並關閉連線。如果通訊封包太大,某些用戶端也可能會收到 查詢期間遺失與 MySQL 伺服器的連線
錯誤。
用戶端和伺服器都有自己的 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。