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

MySQL 大量數據導入導出實戰:繞過 phpMyAdmin 限制的腳本方案

     編輯:MySQL 資料庫相關知識

phpMyAdmin 雖然方便,但在處理超大數據集(如 10MB+)時,常因 PHP 上傳限制(預設 2MB)、單引號轉義錯誤等問題導致導入失敗。本文分享一套基於 PHP + 文本文件的「導出結構用 phpMyAdmin,導數據用腳本」的實戰方案,親測可穩定處理千萬級數據。

核心思路

  • 導出:phpMyAdmin 導出表結構(.sql);PHP 腳本讀取數據寫入純文本文件(.txt),每行一字段,特殊字符轉義。
  • 導入:phpMyAdmin 導入表結構;PHP 腳本讀取文本文件,重構 INSERT 語句批量寫入。
  • 傳輸:文本文件通過 FTP 在本地與服務器間傳輸,避開 HTTP 上傳大小限制。

導出腳本核心邏輯(export.php)

<?php
// 參數檢查
if (empty($_GET['table'])) exit();
$table = $_GET['table'];

// 連接資料庫(建議改用 mysqli/PDO)
mysql_connect("localhost", "user", "pass");
mysql_select_db("dbname");

$result = mysql_query("SELECT * FROM `$table`");
if (mysql_num_rows($result) == 0) exit();

$handle = fopen("$table.txt", "w");
$num_fields = mysql_num_fields($result);
// 首行寫入欄位數,便於導入時解析
fwrite($handle, $num_fields . "\r\n");

while ($row = mysql_fetch_row($result)) {
    for ($i = 0; $i < $num_fields; $i++) {
        // 將換行符統一替換為特殊標記,避免文本行混亂
        $val = str_replace(["\r\n", "\n"], "&&php2000mysqlreturn&&", $row[$i]);
        fwrite($handle, $val . "\r\n");
    }
    // 每行結束標記(可選,便於校驗)
    fwrite($handle, "------- php2000 dump data program V1.0 for MySQL --------\r\n");
}
fclose($handle);
echo "ok";
?>

導入腳本核心邏輯(import.php)

<?php
if (empty($_GET['table'])) exit();
$table = $_GET['table'];

mysql_connect("localhost", "user", "pass");
mysql_select_db("dbname");

$lines = file("$table.txt"); // 10MB 內可用;超大文件建議改用 fopen/fgets 逐行讀取
$num_fields = (int)trim($lines[0]);
$total_lines = count($lines);

for ($k = 1; $k < $total_lines; $k += $num_fields + 1) { // +1 跳過結束標記行
    $values = [];
    for ($i = 0; $i < $num_fields; $i++) {
        $idx = $k + $i;
        if ($idx >= $total_lines) break;
        // 還原換行符並轉義單引號
        $val = str_replace("&&php2000mysqlreturn&&", "\r\n", trim($lines[$idx]));
        $values[] = "'" . addslashes($val) . "'";
    }
    if (count($values) === $num_fields) {
        $sql = "INSERT INTO `$table` VALUES (" . implode(',', $values) . ")";
        mysql_query($sql);
        echo mysql_error() . " $k ";
    }
}
echo "ok";
?>

關鍵細節與避坑指南

  1. 特殊字符轉義:導出時將 \r\n/\n 替換為唯一標記(如 &&php2000mysqlreturn&&),導入時還原,完美保留文本格式。
  2. 大文件讀取:file() 會一次性載入記憶體,超過 50MB 建議改用 fopen() + fgets() 逐行處理。
  3. 編碼一致性:確保資料庫連接、PHP 腳本、文本文件編碼統一(推薦 UTF-8),避免中文亂碼。
  4. 效能優化:導入時可每 500-1000 條提交一次事務,或使用 LOAD DATA INFILE 替代 INSERT 大幅提速。
  5. 安全性:生產環境務必加入身份驗證、IP 白名單,避免腳本被濫用。

進階替代方案

若頻繁處理大數據遷移,建議直接使用 MySQL 原生工具:

  • mysqldump --tab=/path --fields-terminated-by=',' --lines-terminated-by='\n' 導出文本
  • mysqlimport 或 LOAD DATA INFILE 高速導入
  • 或使用 Percona XtraBackup 進行物理熱備份與還原

這套腳本方案無需修改 php.ini、無依賴第三方庫,適合虛擬主機、無權限修改服務器配置的場景,是中小型專案遷移大數據的實用利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved