php实现数据库备份
PHP实现数据库备份的方法
使用mysqldump命令
通过PHP的exec()或shell_exec()函数调用系统命令mysqldump可以快速备份MySQL数据库。
$db_host = 'localhost';
$db_user = 'username';
$db_pass = 'password';
$db_name = 'database_name';
$backup_file = 'backup_' . date('Y-m-d') . '.sql';
$command = "mysqldump --host=$db_host --user=$db_user --password=$db_pass $db_name > $backup_file";
exec($command);
确保PHP有执行系统命令的权限,并且mysqldump路径已加入系统环境变量。
使用PHP原生MySQL函数
如果无法使用命令行工具,可以通过PHP的MySQL函数逐表备份数据。
$conn = new mysqli('localhost', 'username', 'password', 'database_name');
$tables = array();
$result = $conn->query("SHOW TABLES");
while ($row = $result->fetch_row()) {
$tables[] = $row[0];
}
$output = '';
foreach ($tables as $table) {
$result = $conn->query("SELECT * FROM $table");
$num_fields = $result->field_count;
$output .= "DROP TABLE IF EXISTS $table;";
$row2 = $conn->query("SHOW CREATE TABLE $table")->fetch_row();
$output .= "\n\n" . $row2[1] . ";\n\n";
while ($row = $result->fetch_row()) {
$output .= "INSERT INTO $table VALUES(";
for ($j = 0; $j < $num_fields; $j++) {
$row[$j] = addslashes($row[$j]);
$row[$j] = str_replace("\n", "\\n", $row[$j]);
if (isset($row[$j])) {
$output .= '"' . $row[$j] . '"';
} else {
$output .= '""';
}
if ($j < ($num_fields - 1)) {
$output .= ',';
}
}
$output .= ");\n";
}
$output .= "\n\n\n";
}
$backup_file = 'backup_' . date('Y-m-d') . '.sql';
file_put_contents($backup_file, $output);
使用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;";
$create = $db->query("SHOW CREATE TABLE $table")->fetch(PDO::FETCH_ASSOC);
$output .= "\n\n" . $create['Create Table'] . ";\n\n";
$rows = $db->query("SELECT * FROM $table")->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
$output .= "INSERT INTO $table VALUES(";
$values = array_map(function($value) {
return '"' . str_replace('"', '\"', $value) . '"';
}, array_values($row));
$output .= implode(',', $values) . ");\n";
}
$output .= "\n\n\n";
}
file_put_contents('backup.sql', $output);
自动备份与压缩
为节省空间,可以自动压缩备份文件。
$backup_file = 'backup_' . date('Y-m-d') . '.sql';
$gzbackup_file = $backup_file . '.gz';
// 生成SQL备份文件后
$data = file_get_contents($backup_file);
$gzdata = gzencode($data, 9);
file_put_contents($gzbackup_file, $gzdata);
unlink($backup_file); // 删除原始SQL文件
定时自动备份
结合crontab可以实现定时自动备份。
# 在服务器crontab中添加(每天凌晨3点执行)
0 3 * * * /usr/bin/php /path/to/backup_script.php
备份脚本需要有写入权限,建议存储在非web可访问目录确保安全。对于大型数据库,建议分批处理或使用专业备份工具。







