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

PHP 實現 MySQL 數據庫完整備份導出 SQL 文件完整代碼詳解

     編輯:PHP 相關知識

在 PHP 開發中,數據庫備份是維護工作的核心環節。本文提供一套完整的 PHP 腳本,能將 MySQL 數據庫整庫導出為標準 SQL 文件,包含表結構、索引、引擎屬性及數據內容,適合定時備份或遷移場景使用。

核心功能特點

  • 支援導出完整建表語句(含 ENGINE、AUTO_INCREMENT、CHARSET、COLLATE、COMMENT 等細節)
  • 可靈活控制是否備份結構、數據,或兩者兼備
  • 自動設置 UTF-8 編碼,避免中文亂碼
  • 通過 HTTP Header 直接觸發瀏覽器下載 .sql 文件
  • 設置較長執行時間限制,防止大數據量導出中斷

完整實現代碼

<?php
ini_set("max_execution_time", "180"); // 避免數據量過大導出不全

/**
 * 程序功能:MySQL 數據庫備份
 * 原作者:唐小剛
 * 修改者:何錦盛 (2009/11/7)
 * 修改內容:新增 get_table_structure 函數,獲取更豐富的建表細節
 */

// 數據庫連接配置
$host = "";        // 數據庫地址
$dbname = "";      // 數據庫名
$username = "";    // 用戶名
$passw = "";       // 密碼

// 生成文件名:日期-數據庫名.sql
$filename = date("Y-m-d_H-i-s") . "-" . $dbname . ".sql";

// 設置下載 Header
header("Content-disposition: filename=" . $filename);
header("Content-type: application/octet-stream");
header("Pragma: no-cache");
header("Expires: 0");

// 連接數據庫
$dbconn = mysql_connect($host, $username, $passw);
mysql_select_db($dbname, $dbconn);
mysql_query("SET NAMES 'utf8'");

// 獲取所有表
$tables = mysql_list_tables($dbname, $dbconn);
$num_tables = @mysql_num_rows($tables);

$crlf = "\r\n";
print "-- filename=" . $filename . $crlf;

// 遍歷每張表導出結構與數據
for ($i = 0; $i < $num_tables; $i++) {
    $table = mysql_tablename($tables, $i);
    print $crlf;
    
    // 導出表結構(包含引擎、字符集、自增值等完整信息)
    echo get_table_structure($dbname, $table, $crlf) . ";" . $crlf . $crlf;
    
    // 導出表數據
    echo get_table_content($dbname, $table, $crlf);
}

/**
 * 獲取完整表結構(SHOW CREATE TABLE)
 */
function get_table_structure($db, $table, $crlf) {
    global $drop;
    $schema_create = "";
    
    if (!empty($drop)) {
        $schema_create .= "DROP TABLE IF EXISTS `$table`;" . $crlf;
    }
    
    $result = mysql_db_query($db, "SHOW CREATE TABLE $table");
    $row = mysql_fetch_array($result);
    $schema_create .= $crlf . "-- " . $row[0] . $crlf;
    $schema_create .= $row[1] . $crlf;
    
    return $schema_create;
}

/**
 * 獲取表數據(INSERT 語句)
 */
function get_table_content($db, $table, $crlf) {
    $schema_create = "";
    $result = mysql_db_query($db, "SELECT * FROM $table");
    
    while ($row = mysql_fetch_row($result)) {
        $schema_insert = "INSERT INTO `$table` VALUES (";
        
        for ($j = 0; $j < mysql_num_fields($result); $j++) {
            if (!isset($row[$j])) {
                $schema_insert .= " NULL,";
            } elseif ($row[$j] != "") {
                $schema_insert .= " '" . addslashes($row[$j]) . "',";
            } else {
                $schema_insert .= " '',";
            }
        }
        
        $schema_insert = preg_replace("/,$/", "", $schema_insert);
        $schema_insert .= ");" . $crlf;
        $schema_create .= $schema_insert;
    }
    
    return $schema_create;
}
?>

使用說明與注意事項

  1. 配置連接信息:填寫 $host、$dbname、$username、$passw 四個變量
  2. 控制導出內容:
    • 不需要表結構:註釋掉 echo get_table_structure(...)
    • 不需要表數據:註釋掉 echo get_table_content(...)
  3. 編碼處理:代碼已設置 SET NAMES 'utf8',確保中文數據正確導出
  4. 大數據量優化:ini_set("max_execution_time", "180") 可根據實際情況調大
  5. 舊版函數提示:代碼使用 mysql_* 函數(PHP 5.5+ 棄用,7.0+ 移除),生產環境建議改用 mysqli 或 PDO 重寫

改進建議

若在現代 PHP 版本(7.0+)運行,建議將 mysql_* 替換為 mysqli 預處理語句,並增加異常處理、日誌記錄、壓縮輸出(gzencode)等功能,構建更健壯的備份工具。

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