首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 超大 SQL 文件導入導出方案總結

     編輯:MySQL 綜合教學

當 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

方案二:PHP 分批導入腳本(適用於無 Shell 權限)

將大 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 客戶端 SOURCE 命令

在 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 或方案二
?>

方案四:Web 觸發導入(非技術人員友好)

  1. 將 backup.sql 上傳至網站根目錄
  2. 創建 import.php:
    <?php
    system("mysql -hdbhost -udbuser -ppassword dbname < backup.sql");
    echo "導入成功";
    ?>
  3. 瀏覽器訪問 import.php 觸發導入

注意:需確保 Web 進程有執行 system() 權限,且 MySQL 客戶端在 PATH 中。生產環境建議加密驗證或刪除腳本。

方案選擇指南

場景推薦方案優點缺點
有服務器 Shell 訪問權限方案一速度最快、最穩定、無大小限制需命令行操作
僅有 FTP/Web 權限方案二通用性強、可控制批次、可監控進度PHP 執行較慢、需調整超時
已在 MySQL 客戶端中方案三無需退出客戶端、可見實時錯誤需交互式登入
非技術人員操作方案四瀏覽器一鍵觸發、無需技術背景安全風險高、依賴 system()

關鍵提示

  • 導入前務必 備份目標庫
  • 大數據量導入建議 暫時關閉索引(ALTER TABLE ... DISABLE KEYS),導入後重建
  • 確保 SQL 文件與數據庫 字符集一致(SET NAMES)
  • 導入後執行 ANALYZE TABLE 更新統計信息
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved