phpMyAdmin 匯入 SQL 檔常遇「Cannot modify header information」、「腳本逾時」、「記憶體溢位」、「上傳大小限制」等錯誤。本文提供命令列 source 指令零依賴解法、大檔案分卷策略與參數調優清單。
| 錯誤現象 | 根本原因 |
|---|---|
| Cannot modify header information - headers already sent | PHP 輸出緩衝衝突、BOM 頭、錯誤輸出提前發送 Header |
| Maximum execution time of 300 seconds exceeded | 大檔案執行超時 |
| Allowed memory size exhausted | PHP memory_limit 不足 |
| Upload file size limit (2MB default) | upload_max_filesize / post_max_size 限制 |
| SQL 語法錯誤但命令列正常 | phpMyAdmin 解析/分割 SQL 邏輯缺陷 |
mysql -u root -p
-- 或指定資料庫直接登入
mysql -u root -p target_database
USE target_database;
SOURCE /full/path/to/backup.sql;
SOURCE "D:\My Backups\db.sql";bin/ 下,僅需檔名:SOURCE backup.sql;C:\> mysqldump -u root -p --add-drop-table --tables test test_table > C:\test_table.sql
Enter password: ******
C:\> mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor...
mysql> USE test
Database changed
mysql> TRUNCATE TABLE test_table;
Query OK, 4 rows affected (0.02 sec)
mysql> SELECT * FROM test_table;
Empty set (0.00 sec)
mysql> SOURCE C:\test_table.sql
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
GSplit、HJSplit、PowerShell Get-Content -ReadCount 10000split -l 10000 backup.sql part_ (每 1 萬行一檔)@echo off
SET MYSQL_BIN="C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe"
SET DB=target_db
SET PARTS_DIR=D:\sql_parts\
FOR %%F IN (%PARTS_DIR%*.sql) DO (
echo 正在匯入 %%F ...
%MYSQL_BIN% -u root -p%DB_PASS% %DB% < "%%F"
IF ERRORLEVEL 1 (
echo 匯入失敗於 %%F,請檢查
pause
exit /b 1
)
)
echo 全部匯入完成
; php.ini 關鍵調整
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 3600
max_input_time = 3600
memory_limit = 512M
; phpMyAdmin config.inc.php
$cfg['ExecTimeLimit'] = 3600;
$cfg['MemoryLimit'] = '512M';
$cfg['UploadDir'] = '/var/lib/phpmyadmin/upload/'; // 伺服器端上傳目錄,繞過瀏覽器上傳
$cfg['SaveDir'] = '/var/lib/phpmyadmin/save/';
UploadDir:用 SFTP/SCP 將大 SQL 傳至伺服器目錄,phpMyAdmin 下拉選單直接選擇匯入,**繞過瀏覽器上傳限制**。mysqldump --single-transaction --quick --no-autocommit \
--extended-insert=FALSE --max_allowed_packet=1G \
-u root -p db > backup.sql
--extended-insert=FALSE:每行獨立 INSERT,便於分割/除錯,檔案較大但更穩健。--quick:流式讀取,不緩存全表結果集。SQL 檔案大小 ├─ < 50MB → phpMyAdmin (調優後) 或 source 均可 ├─ 50MB - 500MB → source 指令首選 ├─ > 500MB → 分卷 + source 批次腳本 └─ 任何大小 → source 指令為最穩健、零依賴、最高效方案
拋棄 phpMyAdmin 匯入大檔案的幻想,**命令列 source 是 DBA 的標準動作**,穩定、可控、可腳本化、可監控。