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

PHP 實現 MySQL 數據庫完整備份腳本

     編輯:PHP 相關知識

PHP 實現 MySQL 數據庫完整備份腳本

本文提供一個可直接使用的 PHP 函數 backupMySqlData(),支援結構與數據完整導出為 SQL 文件,適合定時任務或手動觸發備份。

完整備份函數

<?php
/**
 * PHP 備份 MySQL 數據庫
 * @param string $DbHost     數據庫主機
 * @param string $DbUser     用戶名
 * @param string $DbPwd      密碼
 * @param string $DbName     數據庫名
 * @param string $saveFileName 保存文件名(可選,默認帶時間戳)
 * @return void
 */
function backupMySqlData($DbHost, $DbUser, $DbPwd, $DbName, $saveFileName = '') {
    header("Content-Type: text/html; charset=utf-8");
    set_time_limit(0);
    ini_set('memory_limit', '512M');

    echo "數據備份中,請稍候...
"; // 使用 mysqli 替代已棄用的 mysql_* 函數 $mysqli = new mysqli($DbHost, $DbUser, $DbPwd, $DbName); if ($mysqli->connect_errno) { die('數據庫連接失敗: ' . $mysqli->connect_error); } $mysqli->set_charset('utf8'); $fileName = ($saveFileName ? $saveFileName : 'MySQL_backup_') . date('YmdHis') . '.sql'; $handle = fopen($fileName, 'w'); // 1. 獲取所有表名 $tables = []; $result = $mysqli->query("SHOW TABLES FROM `$DbName`"); while ($row = $result->fetch_row()) { $tables[] = $row[0]; } $result->free(); // 2. 導出表結構 foreach ($tables as $table) { $createResult = $mysqli->query("SHOW CREATE TABLE `$table`"); $row = $createResult->fetch_row(); $sql = "DROP TABLE IF EXISTS `$table`;\n" . $row[1] . ";\n\n"; fwrite($handle, $sql); $createResult->free(); } // 3. 導出數據 foreach ($tables as $table) { $dataResult = $mysqli->query("SELECT * FROM `$table`"); while ($row = $dataResult->fetch_row()) { $values = array_map(function($v) use ($mysqli) { return $v === null ? 'NULL' : "'" . $mysqli->real_escape_string($v) . "'"; }, $row); $sql = "INSERT INTO `$table` VALUES (" . implode(',', $values) . ");\n"; fwrite($handle, $sql); } $dataResult->free(); } fclose($handle); $mysqli->close(); echo "數據備份成功!文件:$fileName"; } // 調用示例 // backupMySqlData('localhost', 'root', 'password', 'your_db_name');

關鍵改進點(對比原版)

  • 採用 mysqli 面向對象 API,替代已移除的 mysql_* 函數。
  • 使用 fopen/fwrite 流式寫入,避免大數據集內存溢出。
  • 正確處理 NULL 值與特殊字符轉義(real_escape_string)。
  • 設置 set_time_limit(0) 與 memory_limit 防止超時/ OOM。

生產環境建議

  1. 改用 mysqldump 命令行工具(性能更高、鎖表選項更豐富)。
  2. 備份文件應壓縮(gzip)並異地存儲(對象存儲/異地服務器)。
  3. 定期驗證備份文件可恢復性(建立恢復演練機制)。
  4. 敏感環境下啟用 --single-transaction(InnoDB 熱備份)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved