本文提供一個可直接使用的 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');
mysql_* 函數。fopen/fwrite 流式寫入,避免大數據集內存溢出。NULL 值與特殊字符轉義(real_escape_string)。set_time_limit(0) 與 memory_limit 防止超時/ OOM。mysqldump 命令行工具(性能更高、鎖表選項更豐富)。--single-transaction(InnoDB 熱備份)。