首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

解析 mysqldump --delayed-insert 參數:避免鎖表的插入策略

     編輯:MySQL 資料庫相關知識

背景

預設 mysqldump 導出時會產生 LOCK TABLES ... WRITE 與 INSERT 語句,導入時會鎖表阻塞讀寫。若加入 --delayed-insert,生成的 SQL 會改為 INSERT DELAYED,不再加寫鎖,適合高併發環境導入歷史資料。

對比示例

未使用 --delayed-insert

LOCK TABLES `student` WRITE;
/*!40000 ALTER TABLE `student` DISABLE KEYS */;
INSERT INTO `student` VALUES (16,'hhah',3),(17,'22',3),(18,'ss',18);
/*!40000 ALTER TABLE `student` ENABLE KEYS */;
UNLOCK TABLES;

使用 --delayed-insert

/*!40000 ALTER TABLE `student` DISABLE KEYS */;
INSERT DELAYED INTO `student` VALUES (16,'hhah',3),(17,'22',3),(18,'ss',18);
/*!40000 ALTER TABLE `student` ENABLE KEYS */;

INSERT DELAYED 運作機制

  1. 執行緒將資料行放入該表專屬的「延遲佇列」,立即返回狀態給客戶端。
  2. 專屬的管理執行緒(handler thread)非同步從佇列取出資料寫入表中。
  3. 即使其他執行緒持有 READ/WRITE 鎖,仍可獲取 DELAYED 鎖;但會等待 ALTER TABLE 或 FLUSH TABLES 鎖釋放,確保表結構最新。
  4. 語法錯誤會即時回報客戶端,但 AUTO_INCREMENT 值、重複鍵錯誤數等資訊無法在客戶端獲取(mysql_info() 返回 NULL)。
  5. Binlog 在管理執行緒真正寫入行時更新;多行插入時,寫入第一行即更新。

適用場景與限制

  • 適用:日誌、統計類大量寫入、允許延遲可見的業務。
  • 不適用:需即時獲取自增 ID、強一致性要求、從庫複制(從庫忽略 DELAYED)。
  • 風險:佇列僅在記憶體中,kill -9 或崩潰會導致未刷盤資料遺失。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved