您的位置:首页 >ubuntu php如何备份与恢复数据
发布于2026-04-28 阅读(0)
扫一扫,手机访问

数据备份与恢复,是项目运维的“生命线”。今天,我们就来深入聊聊在Ubuntu环境下,如何为你的PHP项目构建一套既全面又可靠的备份恢复体系。
一个完整的备份方案,绝不能只盯着代码。它应该像一张安全网,覆盖从数据到配置的每一个角落。具体来说,你需要关注以下几个核心层面:
mysqldump导出为.sql或.sql.gz格式,这不仅是标准做法,也便于后续的迁移和版本比对。public/、vendor/、storage/等关键目录)打包。使用tar.gz或zip格式,能在压缩率和兼容性之间取得良好平衡。php.ini、项目的.env或config.php等文件,往往包含了敏感信息和环境依赖,必须纳入备份范围。dd命令对系统盘进行镜像或快照。这相当于为整个服务器环境买了份“保险”。如果你的环境限制命令行访问(比如某些共享主机),那么用PHP脚本自己实现一套备份机制,就成了最实际的选择。
RecursiveDirectoryIterator和ZipArchive类,递归遍历并打包整个站点目录。mysqli扩展连接数据库,生成标准的CREATE和INSERT语句,导出为.sql文件。这里有个关键细节:在导入前,记得先写入SET FOREIGN_KEY_CHECKS=0;语句,可以有效避免因外键约束导致的导入失败。crontab设置定时任务,让备份自动执行。同时,脚本应记录操作日志,并自动清理超过保留期限(例如7天)的旧备份,避免磁盘被撑满。open($out, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
logMsg("无法创建 ZIP: $out");
exit(1);
}
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($webRoot, FilesystemIterator::SKIP_DOTS),
RecursiveIteratorIterator::LEA VES_ONLY
);
foreach ($iterator as $file) {
if (!$file->isDir()) {
$zip->addFile($file->getRealPath(), substr($file->getRealPath(), strlen($webRoot) + 1));
}
}
$zip->close();
chmod($out, 0600);
logMsg("已打包: $out");
// 2) 导出数据库
$cmd = sprintf(
'mysqldump -h%s -u%s -p%s --single-transaction --routines --triggers --default-character-set=utf8mb4 %s > %s 2>&1',
escapeshellarg($dbHost), escapeshellarg($dbUser), escapeshellarg($dbPass), escapeshellarg($dbName), escapeshellarg($sql)
);
exec($cmd, $outLines, $ret);
if ($ret !== 0) {
logMsg("导出数据库失败: " . implode("\n", $outLines));
exit(1);
}
chmod($sql, 0600);
logMsg("已导出: $sql");
// 3) 可选:加密备份(密钥单独保管)
$keyFile = "$backupRoot/backup.key";
if (!file_exists($keyFile)) {
$key = random_bytes(32);
file_put_contents($keyFile, $key, LOCK_EX);
chmod($keyFile, 0600);
}
$enc = "$out.enc";
$cmd = "openssl enc -aes-256-cbc -salt -in " . escapeshellarg($out) . " -out " . escapeshellarg($enc) . " -pass file:" . escapeshellarg($keyFile) . " 2>&1";
exec($cmd, $outLines, $ret);
if ($ret === 0) {
unlink($out);
logMsg("已加密: $enc");
} else {
logMsg("加密失败: " . implode("\n", $outLines));
}
0 2 * * * /usr/bin/php /var/backups/myproj/backup.phpopenssl enc -d -aes-256-cbc -in backup-2025-12-10_02-00-00.zip.enc -out backup.zip -pass file:/var/backups/myproj/backup.keyunzip backup.zip -d /var/www/myprojmysql -u$dbUser -p$dbPass -e "DROP DATABASE IF EXISTS $dbName; CREATE DATABASE $dbName CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 清空并重建数据库,再通过 mysql -u$dbUser -p$dbPass $dbName < backup.sql 导入数据。SET FOREIGN_KEY_CHECKS=0;,导入完成后再加上SET FOREIGN_KEY_CHECKS=1;重新启用约束。如果你拥有服务器的完整控制权,那么直接使用命令行和系统工具是更高效、更可靠的选择。
mysqldump -u root -p --single-transaction --routines --triggers --default-character-set=utf8mb4 mydb > /backups/mydb_$(date +%F).sql。使用--single-transaction参数可以在不锁表的情况下进行备份,对线上业务更友好。gzip /backups/mydb_$(date +%F).sql,能显著减少存储空间占用。mysql -u root -p mydb < /backups/mydb_2025-12-10.sql。如果备份是压缩的,可以使用管道操作:gunzip < /backups/mydb_2025-12-10.sql.gz | mysql -u root -p mydb。tar -czvf /backups/files_$(date +%F).tar.gz -C /var/www/myproj .。注意-C参数用于切换目录,这样打包出来的文件不会有冗长的绝对路径。php --ini | grep "Loaded Configuration File" | awk '{print $4}' | xargs -I {} sudo cp {} {}.bak_$(date +%F),这个命令组合能精准找到并备份当前加载的php.ini文件。sudo tar -czvf /backups/nginx_$(date +%F).tar.gz /etc/nginx /etc/php/$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')/fpm/php.ini,将Web服务器和PHP-FPM的配置一并打包。0 2 * * * /usr/bin/mysqldump -u root -p'******' mydb | gzip > /backups/mydb_$(date +\%F).sql.gz。rsync -a vz /backups/ user@backup.example.com:/backups/进行增量同步,或用scp直接传输。这是防止“服务器物理损坏”导致数据全丢的最后防线。sudo apt install timeshift安装,它提供图形化和命令行界面,可以选择RSYNC或BTRFS模式创建系统快照,并设置计划任务。在需要时,可以轻松选择还原点进行恢复。备份做得好,恢复才能快准稳。执行恢复前,请对照这份清单逐步操作:
.env等环境配置文件和密钥。www-data:www-data)。备份文件本身应设置为0600权限,限制访问。最后,我们来谈谈那些让备份方案真正变得专业和可靠的关键细节:
SELECT、SHOW VIEW、LOCK TABLES、TRIGGER等必要权限,而非完整的ALL PRIVILEGES。scp或rsync over SSH等加密通道。说到底,备份不是目的,能快速、正确地恢复才是。一套考虑周详的备份恢复方案,是你项目稳定运行的压舱石。希望这份指南能帮助你构建起自己的数据安全防线。
下一篇:币圈推荐哪种币
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9