首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 導出 MySQL 數據庫完整 SQL 備份腳本 (結構+數據)

     編輯:PHP 相關知識

功能特性

  • 導出指定數據庫所有表結構 (CREATE TABLE) 含引擎、字符集、自增、註釋
  • 導出所有表數據 (INSERT 語句) 含字段名、轉義處理
  • 支援大數據量:設置 max_execution_time、分批處理
  • 直接輸出下載 .sql 文件,適合定時備份/遷移

完整腳本 (db_backup.php)

<?php
ini_set('max_execution_time', 300);
ini_set('memory_limit', '512M');

/** 配置區 **/
$host     = 'localhost';
$dbname   = 'your_database';
$username = 'root';
$password = '';
$charset  = 'utf8mb4';
/************/

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $dbname . '_' . date('Ymd_His') . '.sql"');
header('Pragma: no-cache');
header('Expires: 0');

$mysqli = new mysqli($host, $username, $password, $dbname);
if ($mysqli->connect_errno) {
    die("連線失敗: {$mysqli->connect_error}");
}
$mysqli->set_charset($charset);

$crlf = "\r\n";
$output = "-- {$dbname} backup at " . date('Y-m-d H:i:s') . $crlf . $crlf;

// 禁用外鍵檢查
$output .= "SET FOREIGN_KEY_CHECKS = 0;{$crlf}{$crlf}";

$tables = $mysqli->query("SHOW TABLES");
while ($row = $tables->fetch_row()) {
    $table = $row[0];
    
    // 1. 表結構
    $create = $mysqli->query("SHOW CREATE TABLE `{$table}`")->fetch_row();
    $output .= "-- Table: {$table}{$crlf}";
    $output .= "DROP TABLE IF EXISTS `{$table}`;{$crlf}";
    $output .= $create[1] . ";{$crlf}{$crlf}";
    
    // 2. 表數據
    $result = $mysqli->query("SELECT * FROM `{$table}`");
    $fields = [];
    while ($finfo = $result->fetch_field()) {
        $fields[] = "`{$finfo->name}`";
    }
    $fieldList = implode(', ', $fields);
    
    $batch = 0;
    $batchSize = 500; // 批次提交大小
    $insertPrefix = "INSERT INTO `{$table}` ({$fieldList}) VALUES ";
    $values = [];
    
    while ($row = $result->fetch_row()) {
        $escaped = array_map(fn($v) => $v === null ? 'NULL' : "'" . $mysqli->real_escape_string($v) . "'", $row);
        $values[] = '(' . implode(', ', $escaped) . ')';
        $batch++;
        
        if ($batch >= $batchSize) {
            $output .= $insertPrefix . implode(', ', $values) . ";{$crlf}";
            $values = [];
            $batch = 0;
            // 定期刷新輸出緩衝,防止記憶體過大
            echo $output;
            $output = '';
        }
    }
    
    if ($values) {
        $output .= $insertPrefix . implode(', ', $values) . ";{$crlf}";
    }
    $output .= $crlf;
    
    // 釋放結果集
    $result->free();
}

$output .= "SET FOREIGN_KEY_CHECKS = 1;{$crlf}";
echo $output;
$mysqli->close();

關鍵技術點解析

點說明
SHOW CREATE TABLE獲取完整建表 SQL,含 ENGINE、AUTO_INCREMENT、CHARSET、COMMENT 等
real_escape_string防止數據中引號、換行符破壞 SQL 語法
批次 INSERT單條 INSERT 效能極低,批次 500-1000 行平衡內存與速度
禁用外鍵導入時避免順序依賴報錯
輸出緩衝控制大庫分批 echo 輸出,避免 PHP 內存耗盡

進階增強建議

  1. 壓縮輸出:header('Content-Encoding: gzip'); echo gzencode($output);
  2. 並行導出:大表拆分多進程導出,再合併文件
  3. 增量備份:記錄 binlog 位點,配合 mysqldump --master-data
  4. 物理備份:Percona XtraBackup 熱備份不鎖表,生產環境首選
  5. 驗證校驗和:導出後計算 SHA256,導入前校驗完整性

替代方案對比

方案優點缺點
PHP 腳本無依賴、可嵌入應用、Web 下載大庫慢、受 PHP 限制、無鎖表一致性
mysqldump官方工具、支援單事務一致性、壓縮、並行需 Shell 訪問權限
XtraBackup物理熱備、不鎖表、恢復快部署複雜、需 root、僅支援 InnoDB
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved