php实现数据库备份
使用 mysqldump 命令备份数据库
通过 PHP 的 exec() 或 shell_exec() 函数调用系统命令 mysqldump 实现备份。需要确保服务器已安装 MySQL 客户端工具,且 PHP 有执行系统命令的权限。
$dbHost = 'localhost';
$dbUser = 'username';
$dbPass = 'password';
$dbName = 'database_name';
$backupFile = '/path/to/backup/' . $dbName . '_' . date("Y-m-d_H-i-s") . '.sql';
$command = "mysqldump --host={$dbHost} --user={$dbUser} --password={$dbPass} {$dbName} > {$backupFile}";
exec($command, $output, $returnVar);
if ($returnVar === 0) {
echo "备份成功,文件保存在: " . $backupFile;
} else {
echo "备份失败,错误代码: " . $returnVar;
}
使用 PHP MySQLi 扩展逐表备份
通过 MySQLi 查询数据库结构及数据,逐表生成 SQL 语句并写入文件。适合无系统命令执行权限的环境。

$db = new mysqli('localhost', 'username', 'password', 'database_name');
$backupFile = '/path/to/backup/backup_' . date("Y-m-d_H-i-s") . '.sql';
$handle = fopen($backupFile, 'w');
// 获取所有表名
$tables = $db->query("SHOW TABLES");
while ($table = $tables->fetch_array()) {
$tableName = $table[0];
fwrite($handle, "-- 表结构: {$tableName}\n");
// 导出表结构
$createTable = $db->query("SHOW CREATE TABLE {$tableName}")->fetch_array();
fwrite($handle, $createTable[1] . ";\n\n");
// 导出表数据
$rows = $db->query("SELECT * FROM {$tableName}");
while ($row = $rows->fetch_assoc()) {
$values = array_map([$db, 'real_escape_string'], $row);
fwrite($handle, "INSERT INTO {$tableName} VALUES ('" . implode("', '", $values) . "');\n");
}
fwrite($handle, "\n");
}
fclose($handle);
$db->close();
使用 PDO 实现数据备份
通过 PDO 获取数据并生成 SQL 文件,兼容多种数据库类型。

$pdo = new PDO('mysql:host=localhost;dbname=database_name', 'username', 'password');
$backupFile = '/path/to/backup/backup_' . date("Y-m-d_H-i-s") . '.sql';
$handle = fopen($backupFile, 'w');
// 获取所有表名
$tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
foreach ($tables as $table) {
fwrite($handle, "-- 表结构: {$table}\n");
// 导出表结构
$createTable = $pdo->query("SHOW CREATE TABLE {$table}")->fetch(PDO::FETCH_ASSOC);
fwrite($handle, $createTable['Create Table'] . ";\n\n");
// 导出表数据
$rows = $pdo->query("SELECT * FROM {$table}");
while ($row = $rows->fetch(PDO::FETCH_ASSOC)) {
$values = array_map([$pdo, 'quote'], $row);
fwrite($handle, "INSERT INTO {$table} VALUES (" . implode(", ", $values) . ");\n");
}
fwrite($handle, "\n");
}
fclose($handle);
备份文件压缩与下载
将生成的 SQL 文件压缩为 ZIP 格式,并提供下载链接。
$backupFile = '/path/to/backup/backup.sql';
$zipFile = '/path/to/backup/backup.zip';
// 创建 ZIP 文件
$zip = new ZipArchive();
if ($zip->open($zipFile, ZipArchive::CREATE) === TRUE) {
$zip->addFile($backupFile, 'backup.sql');
$zip->close();
// 提供下载
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . basename($zipFile) . '"');
readfile($zipFile);
unlink($zipFile); // 删除临时文件
}
定时自动备份
结合 Cron 任务实现定时备份。创建 PHP 脚本后,通过服务器 Cron 设置定期执行。
# 每天凌晨 3 点执行备份
0 3 * * * /usr/bin/php /path/to/backup_script.php
注意事项
- 确保备份目录有写入权限。
- 敏感数据库信息应避免硬编码,建议使用配置文件或环境变量。
- 大数据库备份可能消耗较多内存,需调整 PHP 内存限制。
- 定期清理旧备份文件,避免磁盘空间不足。





