在网站或应用的日常运维中,数据库备份是保障数据安全的核心环节,使用php编写备份脚本可以灵活适配不同的业务场景,实现按需或自动备份MySQL数据库的需求。

核心实现原理
php备份MySQL数据库的核心思路是通过执行mysqldump命令导出数据库内容,或者通过php自身的数据库扩展读取表结构和数据,拼接成可执行的SQL语句后写入文件。前者实现更简单且兼容性更好,是更常用的方案。
基础备份脚本实现
下面是一个基础的单数据库备份脚本,支持导出指定数据库的完整结构和数据:
<?php
// 数据库配置参数
$db_host = '127.0.0.1'; // 数据库地址
$db_user = 'root'; // 数据库用户名
$db_pass = '123456'; // 数据库密码
$db_name = 'test_db'; // 要备份的数据库名
$backup_dir = './backup/'; // 备份文件存储目录
// 创建备份目录,如果不存在的话
if (!is_dir($backup_dir)) {
mkdir($backup_dir, 0777, true);
}
// 生成备份文件名,包含日期时间
$backup_file = $backup_dir . $db_name . '_' . date('Ymd_His') . '.sql';
// 拼接mysqldump命令,注意路径需要根据实际环境调整
// Windows环境下mysqldump路径类似 D:/wamp/bin/mysql/mysql5.7.26/bin/mysqldump
// Linux环境下一般在 /usr/bin/mysqldump
$mysqldump_path = 'mysqldump';
$command = sprintf(
'%s -h%s -u%s -p%s %s > %s',
$mysqldump_path,
$db_host,
$db_user,
$db_pass,
$db_name,
$backup_file
);
// 执行命令并获取执行结果
exec($command, $output, $return_code);
if ($return_code === 0) {
echo '数据库备份成功,备份文件路径:' . $backup_file;
} else {
echo '数据库备份失败,错误码:' . $return_code;
}
?>
多数据库自动备份优化
如果需要备份多个数据库,或者需要对备份文件做进一步处理,可以对脚本做如下优化:
- 支持配置多个数据库名称,循环执行备份逻辑
- 自动清理超过指定天数的旧备份文件,节省存储空间
- 备份完成后发送通知,比如邮件或者站内信提醒备份结果
下面是优化后的多数据库备份脚本示例:
<?php
// 配置项
$config = [
'db_host' => '127.0.0.1',
'db_user' => 'root',
'db_pass' => '123456',
'db_list' => ['test_db', 'blog_db', 'shop_db'], // 要备份的数据库列表
'backup_dir' => './backup/',
'keep_days' => 7, // 备份文件保留天数,超过的自动删除
'mysqldump_path' => 'mysqldump'
];
// 创建备份目录
if (!is_dir($config['backup_dir'])) {
mkdir($config['backup_dir'], 0777, true);
}
// 循环备份每个数据库
$backup_result = [];
foreach ($config['db_list'] as $db_name) {
$backup_file = $config['backup_dir'] . $db_name . '_' . date('Ymd_His') . '.sql';
$command = sprintf(
'%s -h%s -u%s -p%s %s > %s',
$config['mysqldump_path'],
$config['db_host'],
$config['db_user'],
$config['db_pass'],
$db_name,
$backup_file
);
exec($command, $output, $return_code);
$backup_result[$db_name] = $return_code === 0 ? '成功' : '失败(错误码:' . $return_code . ')';
}
// 清理旧备份文件
$current_time = time();
$handle = opendir($config['backup_dir']);
while (($file = readdir($handle)) !== false) {
if ($file == '.' || $file == '..') {
continue;
}
$file_path = $config['backup_dir'] . $file;
if (is_file($file_path)) {
// 获取文件修改时间,判断是否超过保留天数
if ($current_time - filemtime($file_path) > $config['keep_days'] * 86400) {
unlink($file_path);
}
}
}
closedir($handle);
// 输出备份结果
echo '本次备份结果:<br/>';
foreach ($backup_result as $db => $res) {
echo $db . ':' . $res . '<br/>';
}
?>
配置自动定时备份
脚本编写完成后,需要结合系统的定时任务实现自动备份,不需要手动执行脚本。
Linux环境配置
使用crontab配置定时任务,比如每天凌晨2点执行备份脚本:
# 编辑crontab配置 crontab -e # 添加如下内容,注意替换脚本的实际路径 0 2 * * * /usr/bin/php /data/www/backup_db.php >> /data/www/backup_log.log 2>&1
Windows环境配置
使用任务计划程序创建定时任务,触发条件设置为需要的时间,操作选择启动程序,程序填php.exe的路径,参数填备份脚本的绝对路径即可。
注意事项
- mysqldump的路径需要根据实际安装的MySQL位置调整,避免命令执行失败
- 数据库密码如果包含特殊字符,需要在命令中做好转义处理
- 备份目录需要有写入权限,否则无法生成备份文件
- 建议定期校验备份文件的可用性,避免出现备份文件损坏的情况