萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

Linux 命令列匯入大型 SQL 檔案最佳實踐

為什麼不用 phpMyAdmin?

  • 上傳大小限制(預設 2M~128M,受 upload_max_filesize/post_max_size/memory_limit 限制)。
  • 瀏覽器超時、記憶體溢位、無進度條。

標準匯入命令

mysql -u username -p database_name < /path/to/backup.sql

實例

mysql -u root -p mydb2 < /data/sqlbak/bak.sql

輸入密碼後靜待完成,無輸出即成功;報錯會顯示行號與錯誤訊息。

進階參數與技巧

參數/技巧用途範例
--max-allowed-packet=256M放大封包限制,防大行/大批次 INSERT 失敗mysql --max-allowed-packet=256M -u root -p db < dump.sql
--default-character-set=utf8mb4強制連線字元集,避免亂碼mysql --default-character-set=utf8mb4 -u root -p db < dump.sql
--force遇錯繼續執行(慎用,僅用於救援)mysql --force -u root -p db < dump.sql
--verbose / -v顯示執行進度(每條 SQL 輸出)mysql -v -u root -p db < dump.sql
管線解壓匯入直接匯入 .gz/.xz,省磁碟空間zcat dump.sql.gz | mysql -u root -p db
xzcat dump.sql.xz | mysql -u root -p db
PV 顯示進度條視覺化進度、速度、ETApv dump.sql | mysql -u root -p db
分庫匯出/匯入單庫操作,減少鎖爭用mysqldump -u root -p db1 | mysql -u root -p db1_new

大檔案效能優化

  1. 關閉自動提交:在 SQL 檔案開頭加 SET AUTOCOMMIT=0;,結尾加 COMMIT;(或使用 --disable-keys 針對 MyISAM)。
  2. 調大 InnoDB 參數:臨時調大 innodb_buffer_pool_size、innodb_log_file_size、innodb_flush_log_at_trx_commit=2(匯入期間犧牲 ACID 換速度,匯入後恢復)。
  3. 禁用外鍵檢查:SET FOREIGN_KEY_CHECKS=0; ... SET FOREIGN_KEY_CHECKS=1;。
  4. 禁用唯一檢查:SET UNIQUE_CHECKS=0; ... SET UNIQUE_CHECKS=1;。

常見錯誤與對策

錯誤原因解決
ERROR 2006 (HY000): MySQL server has gone away封包過大 / 超時增大 max_allowed_packet、wait_timeout
ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet'同前同前
ERROR 1062 (23000): Duplicate entry主鍵/唯一鍵衝突檢查資料、用 REPLACE 或 IGNORE
ERROR 1213 (40001): Deadlock並發匯入死鎖單線程匯入、按主鍵排序

總結

命令列 mysql < file.sql 是匯入大型 SQL 的**標準、高效、可控**方式。配合 pv 進度條、zcat 解壓管線、關鍵參數調優(max_allowed_packet、AUTOCOMMIT、FOREIGN_KEY_CHECKS),可穩定完成 TB 級匯入任務。

copyright © 萬盛學電腦網 all rights reserved