原因: 伺服器超時關閉閒置連線 (預設 8 小時,由 wait_timeout 控制)、查詢封包過大 (超過 max_allowed_packet) 或封包錯誤。
解決:
wait_timeout 或在客戶端實作自動重連機制。max_allowed_packet (如 mysqld --max_allowed_packet=16M)。原因: 服務未啟動、Socket 檔案路徑錯誤/遺失、TCP/IP 埠號不符、主機名解析問題、Linux 核心崩潰導致執行緒殭屍。
排查步驟:
mysqld 進程存在 (ps aux | grep mysqld)。mysqladmin versionmysqladmin -h `hostname` versionmysqladmin --socket=/tmp/mysql.sock version/tmp/mysql.sock 是否被 cron 任務誤刪,若是請修改 my.cnf 指定新路徑:[mysqld] socket=/var/lib/mysql/mysql.sock[client] socket=/var/lib/mysql/mysql.sockskip-networking 參數、bind-address 設定。原因: 短時間內大量連線失敗 (預設 10 次),觸發 max_connect_errors 阻擋機制。
解決: 執行 mysqladmin flush-hosts 清除快取,並檢查網路穩定性。可調大 max_connect_errors (如 10000)。
原因: 連線數達上限 (預設 max_connections=100,實際允許 101,保留 1 給 SUPER 權限)。
解決: 修改 my.cnf 增加 max_connections,並優化程式連線池釋放機制。
原因: 結果集過大超出客戶端記憶體。
解決: 優化查詢減少回傳列、使用 mysql --quick (採用 mysql_use_result 串流讀取)。
解決: 同錯誤 1,調大客戶端與伺服器雙端的 max_allowed_packet。
解決: 增加 tmp_table_size、max_heap_table_size 或查詢前設定 SET SQL_BIG_TABLES=1 強制使用磁碟臨時表。
原因: API 呼叫順序錯誤 (如未 mysql_free_result 就發新查詢、或在 mysql_use_result 間發兩條回傳資料的查詢)。
原因: user 表密碼欄位長度不符 (舊版 16 字元 vs 新版 41 字元)、使用舊式密碼但未啟 --old-protocol、未用 PASSWORD() 函數加密就直接寫入密碼。
修正: 執行 scripts/add_long_password、用 PASSWORD() 更新密碼、或啟用 --old-protocol。
注意: Linux 區分大小寫,Windows 不區分但查詢中大小寫必須一致。用 SHOW TABLES 確認實際名稱。
'YYYY-MM-DD'。19970505)。'1998#08#15')。STRCMP(date_col, '19970505') 會進行字串比較而非日期比較,請用 date_col = '1997-05-05'。設定作業系統 TZ 環境變數 (如 TZ=Asia/Taipei) 於 safe_mysqld 或系統啟動腳本中。
BINARY 欄位屬性、STRCMP()、或 COLLATE utf8_bin。BINARY。NULL != '' (空字串)。NULL 代表「未知」,空字串代表「無」。IS NULL / IS NOT NULL,= NULL 永遠為假。NOT NULL)。ORDER BY 時 NULL 排最前,DESC 排最後。GROUP BY、ORDER BY、HAVING 可用別名;WHERE 不可用 別名 (執行順序關係)。
MySQL 不支援 DELETE ... JOIN 或子查詢刪除 (舊版)。建議流程:
SELECT 符合條件的 PK。DELETE 同條件。DELETE FROM related WHERE fk IN (PK列表)。EXPLAIN 分析執行計畫。FLOAT/DOUBLE 比較精度問題 (用 BETWEEN 或改 DECIMAL)。mysqldump --quick + 手動加入查詢) 回報官方。錯誤 Error on rename ... Errcode: 17 通常因前次 ALTER 中斷留下 A-xxx、B-xxx 暫存檔。進資料目錄刪除這些檔案即可恢復。
SQL 標準不保證 SELECT * 回傳順序,應明確列出欄位。若必須調整儲存順序:建新表 → INSERT SELECT → 刪舊表 → 改名。
MySQL 每分鐘檢查一次,每 6 分鐘記錄警告。釋放空間後自動繼續;或 mysqladmin kill 終止等待執行緒釋放鎖定。
mysql 資料庫 < script.sql
mysql < script.sql (腳本內含 USE db_name)
由 TMPDIR 環境變數決定 (預設 /tmp 或 /usr/tmp)。可在 safe_mysqld 或 my.cnf 設定 tmpdir。排序時臨時空間需求約 (欄位長度+指標大小) * 符合列數 * 2。
設定 /tmp 目錄 sticky bit:chmod +t /tmp,僅擁有者與 root 可刪除檔案。
參考官方手冊「權限系統運作機制」與「Access Denied 成因」章節。
chown -R mysql_user:mysql_group /path/to/datadir (注意符號連結需手動追蹤)。--user=mysql_user (啟動腳本或 su - mysql_user -c "mysqld &")。kill `cat /datadir/hostname.pid` (勿用 -9)。mysqld --skip-grant-tables &。mysql -u root mysql 進入無密碼模式。UPDATE user SET password=PASSWORD('新密碼') WHERE user='root'; FLUSH PRIVILEGES;。啟動前設定 UMASK=384 (八進位 600) 匯出環境變數再啟 safe_mysqld。
perror 23/24 確認。調小 table_cache (預設 64)、max_connections;或修改 safe_mysqld 中 ulimit -n 256 (需 OS 支援,tcsh 不支援 ulimit 需用 sh 執行)。