php实现数据库备份
使用 mysqldump 命令
在 PHP 中调用系统命令 mysqldump 是最常见的数据库备份方法。该方法适用于 MySQL 或 MariaDB 数据库。
$dbHost = 'localhost';
$dbUser = 'username';
$dbPass = 'password';
$dbName = 'database_name';
$backupFile = 'backup_' . date('Y-m-d') . '.sql';
$command = "mysqldump --host=$dbHost --user=$dbUser --password=$dbPass $dbName > $backupFile";
system($command);
该方法会生成一个 SQL 文件,包含数据库结构和数据。
使用 PHP 原生函数
对于小型数据库,可以使用 PHP 的数据库函数逐表备份:

$conn = new mysqli('localhost', 'username', 'password', 'database_name');
$tables = array();
$result = $conn->query("SHOW TABLES");
while($row = $result->fetch_row()) {
$tables[] = $row[0];
}
$return = '';
foreach($tables as $table) {
$result = $conn->query("SELECT * FROM $table");
$numColumns = $result->field_count;
$return .= "DROP TABLE IF EXISTS $table;";
$row2 = $conn->query("SHOW CREATE TABLE $table")->fetch_row();
$return .= "\n\n".$row2[1].";\n\n";
for($i = 0; $i < $numColumns; $i++) {
while($row = $result->fetch_row()) {
$return .= "INSERT INTO $table VALUES(";
for($j=0; $j < $numColumns; $j++) {
$row[$j] = addslashes($row[$j]);
$row[$j] = str_replace("\n","\\n",$row[$j]);
if (isset($row[$j])) { $return .= '"'.$row[$j].'"' ; } else { $return .= '""'; }
if ($j < ($numColumns-1)) { $return.= ','; }
}
$return .= ");\n";
}
}
$return .= "\n\n\n";
}
$handle = fopen('backup.sql','w+');
fwrite($handle,$return);
fclose($handle);
使用 PDO 扩展
PDO 提供了更通用的数据库备份方法,适用于多种数据库系统:
$db = new PDO('mysql:host=localhost;dbname=database_name', 'username', 'password');
$tables = $db->query('SHOW TABLES')->fetchAll(PDO::FETCH_COLUMN);
$output = '';
foreach ($tables as $table) {
$output .= "DROP TABLE IF EXISTS $table;\n";
$create = $db->query("SHOW CREATE TABLE $table")->fetch(PDO::FETCH_ASSOC);
$output .= $create['Create Table'] . ";\n\n";
$rows = $db->query("SELECT * FROM $table")->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
$columns = array_map(function($value) use ($db) {
return $db->quote($value);
}, array_values($row));
$output .= "INSERT INTO $table VALUES (" . implode(', ', $columns) . ");\n";
}
$output .= "\n";
}
file_put_contents('backup.sql', $output);
定时自动备份
结合 cron 任务可以实现定时自动备份:

// backup.php 文件内容
$filename = 'backup_' . date('Y-m-d') . '.sql.gz';
$command = "mysqldump --host=localhost --user=username --password=password database_name | gzip > $filename";
system($command);
然后在 crontab 中添加:
0 3 * * * /usr/bin/php /path/to/backup.php
备份到远程服务器
将备份文件传输到远程服务器增加安全性:
$localFile = 'backup.sql';
$remoteFile = '/remote/path/backup.sql';
$sshUser = 'username';
$sshHost = 'remote.server.com';
// 生成备份文件
// ...
// 使用 SCP 传输
$command = "scp $localFile $sshUser@$sshHost:$remoteFile";
system($command);
注意事项
数据库备份时应考虑以下安全措施:
- 不要在 PHP 文件中硬编码数据库凭据
- 备份文件应存储在 web 根目录之外
- 对备份文件设置适当的文件权限
- 考虑加密敏感数据备份
- 定期测试备份文件的恢复功能
对于大型数据库,建议使用专业备份工具或数据库管理系统自带的功能,PHP 方法更适合中小型数据库的定期备份需求。






