文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


B.3.2.8 封包過大

通訊封包是指傳送到 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