當 SQL 文件超過 phpMyAdmin 等工具的上傳/內存限制(通常 > 50MB),需採用命令行或分批處理方案。本文整理四種成熟方案,覆蓋不同場景與權限條件。
直接使用 mysql 與 mysqldump,繞過 Web 服務器限制。
# 關鍵:參數與值之間無空格(-uroot 而非 -u root)
mysql -uroot -proot dbname < /path/to/backup.sql
# 導出整庫
mysqldump -uroot -proot dbname > /path/to/dump.sql
# 導出單表
mysqldump -uroot -proot dbname tablename > /path/to/table.sql
# 僅導出結構(不含數據)
mysqldump -uroot -proot -d dbname > /path/to/schema.sql
將大 SQL 文件按語句分割,逐條執行,避免超時與內存溢出。
<?php
// 配置區
$file_name = 'large_backup.sql';
$dbhost = 'localhost';
$dbuser = 'user';
$dbpass = 'pass';
$dbname = 'dbname';
set_time_limit(0); // 取消執行時間限制
$fp = @fopen($file_name, 'r') or die("無法打開文件: $file_name");
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die("數據庫連接失敗: $dbhost");
mysql_select_db($dbname, $conn) or die("數據庫選擇失敗: $dbname");
mysql_query('SET NAMES utf8', $conn);
echo "開始導入...\n";
$count = 0;
while ($sql = getNextSQL($fp)) {
if (!mysql_query($sql, $conn)) {
echo "執行錯誤: " . mysql_error($conn) . "\n";
echo "SQL: $sql\n";
break;
}
$count++;
if ($count % 100 === 0) echo "已執行 $count 條語句\n";
}
echo "導入完成,共執行 $count 條語句\n";
fclose($fp);
mysql_close($conn);
/**
* 從文件流逐條讀取 SQL 語句(以分號結尾為界)
*/
function getNextSQL($fp) {
$sql = '';
while ($line = fgets($fp, 65536)) {
$line = trim($line);
// 跳過註釋行
if (strlen($line) >= 2 && $line[0] === '-' && $line[1] === '-') continue;
$sql .= $line . "\n";
// 以分號結尾視為一條完整語句
if (strlen($line) > 0 && $line[strlen($line)-1] === ';') break;
}
return $sql ?: false;
}
?>
在 MySQL 交互式客戶端中執行,適合已登入服務器的場景。
mysql -uroot -proot
mysql> USE target_db;
mysql> SET NAMES utf8;
mysql> SOURCE /path/to/backup.sql;
也可封裝為 PHP 腳本調用(需 mysql_query 支持多語句或啟用 mysqli::multi_query):
<?php
$conn = mysql_connect('localhost', 'root', 'root') or die(mysql_error());
mysql_select_db('target_db', $conn);
mysql_query("SET NAMES 'utf8'", $conn);
// 注意:mysql_query 不支持多語句,此處僅為示意
// 實際建議使用 mysqli_multi_query 或方案二
?>
backup.sql 上傳至網站根目錄import.php:
<?php
system("mysql -hdbhost -udbuser -ppassword dbname < backup.sql");
echo "導入成功";
?>
import.php 觸發導入注意:需確保 Web 進程有執行 system() 權限,且 MySQL 客戶端在 PATH 中。生產環境建議加密驗證或刪除腳本。
| 場景 | 推薦方案 | 優點 | 缺點 |
|---|---|---|---|
| 有服務器 Shell 訪問權限 | 方案一 | 速度最快、最穩定、無大小限制 | 需命令行操作 |
| 僅有 FTP/Web 權限 | 方案二 | 通用性強、可控制批次、可監控進度 | PHP 執行較慢、需調整超時 |
| 已在 MySQL 客戶端中 | 方案三 | 無需退出客戶端、可見實時錯誤 | 需交互式登入 |
| 非技術人員操作 | 方案四 | 瀏覽器一鍵觸發、無需技術背景 | 安全風險高、依賴 system() |
ALTER TABLE ... DISABLE KEYS),導入後重建SET NAMES)ANALYZE TABLE 更新統計信息