温馨提示×

Linux下ThinkPHP如何备份

小樊
32
2025-12-04 13:21:38
栏目: 编程语言

Linux下ThinkPHP备份实操指南

一 备份策略与准备

  • 备份对象通常包含两部分:一是数据库(如 MySQL/MariaDB),二是项目代码与配置(含上传目录、配置文件等)。
  • 建议准备一个专用备份目录(如 /opt/backups/your_project/),并确保运行备份的用户对该目录有读写权限,同时具备访问数据库的账号与权限
  • 为降低风险,备份文件应定期异地/离线保存,并做好保留周期容量规划。

二 数据库备份

  • 方式一 命令行 mysqldump(最通用)

    • 基本用法:
      • 交互式输入密码:
        mysqldump -h 127.0.0.1 -u 用户名 -p 数据库名 > /opt/backups/your_project/db_$(date +%F_%H-%M-%S).sql
        
      • 命令行直接带密码(注意安全):
        mysqldump -h 127.0.0.1 -u 用户名 -p'密码' 数据库名 > /opt/backups/your_project/db_$(date +%F_%H-%M-%S).sql
        
      • 常用增强参数(按需添加):
        --single-transaction --routines --triggers --hex-blob --set-gtid-purged=OFF
        
    • 恢复命令:
      mysql -h 127.0.0.1 -u 用户名 -p 数据库名 < /opt/backups/your_project/db_2025-12-04_10-00-00.sql
      
    • 说明:上述方法适用于所有基于 MySQLThinkPHP 应用,简单、可靠、便于自动化。
  • 方式二 在ThinkPHP中编程生成SQL备份(便于集成到后台)

    • 思路:使用 Db 类获取所有表名,遍历执行 SHOW CREATE TABLE 获取建表语句,再对每张表 SELECT * FROM 生成 INSERT 语句,写入 .sql 文件。
    • 示例(简化版):
      use think\Db;
      
      $tables = Db::query('SHOW TABLES');
      $backup = "SET FOREIGN_KEY_CHECKS=0;\n\n";
      foreach ($tables as $row) {
          $table = current($row);
          $ddl  = Db::query("SHOW CREATE TABLE `$table`")[0]['Create Table'];
          $backup .= "$ddl;\n\n";
          $data = Db::table($table)->select();
          foreach ($data as $row) {
              $cols = array_map(fn($c) => "`$c`", array_keys($row));
              $vals = array_map(fn($v) => is_null($v) ? 'NULL' : "'".addslashes($v)."'", $row);
              $backup .= "INSERT INTO `$table` (".implode(',', $cols).") VALUES (".implode(',', $vals).");\n";
          }
      }
      $backup .= "SET FOREIGN_KEY_CHECKS=1;\n";
      file_put_contents('/opt/backups/your_project/db_'.date('YmdHis').'.sql', $backup);
      
    • 提示:大数据量时建议改用 mysqldump 或分批导出,避免内存溢出与超时。

三 项目代码与上传目录备份

  • 打包整个项目目录(不含敏感或临时文件更稳妥):
    tar --exclude='runtime' --exclude='.git' --exclude='*.log' \
        -czvf /opt/backups/your_project/code_$(date +%F_%H-%M-%S).tar.gz \
        -C /var/www your_project
    
  • 仅备份配置与上传目录(常见做法):
    tar -czvf /opt/backups/your_project/config_upload_$(date +%F).tar.gz \
        /var/www/your_project/config /var/www/your_project/public/uploads
    
  • 说明:tar 是 Linux 下常用的归档与压缩工具,适合做目录级备份与迁移。

四 自动化与保留策略

  • 使用 crontab 定时执行(示例:每天 02:00 备份数据库与代码)
    0 2 * * * /usr/bin/mysqldump -h127.0.0.1 -u用户名 -p'密码' 数据库名 > /opt/backups/your_project/db_$(date +\%F).sql
    30 2 * * * tar --exclude='runtime' --exclude='.git' -czvf /opt/backups/your_project/code_$(date +\%F).tar.gz -C /var/www your_project
    
    • 注意:crontab 中 % 需转义为 %,否则会被当作换行。
  • 保留策略示例(保留最近 7 天):
    # 每天清理7天前的数据库与代码备份
    0 3 * * * find /opt/backups/your_project -name "db_*.sql" -mtime +7 -delete
    0 3 * * * find /opt/backups/your_project -name "code_*.tar.gz" -mtime +7 -delete
    
  • 建议将备份文件再同步到远程存储(如对象存储/内网备份机),提升可靠性。

五 恢复与校验

  • 数据库恢复:
    mysql -h 127.0.0.1 -u 用户名 -p 数据库名 < /opt/backups/your_project/db_2025-12-04_10-00-00.sql
    
    • 如遇到字符集问题,可在导入时指定:
      mysql -h 127.0.0.1 -u 用户名 -p --default-character-set=utf8mb4 数据库名 < backup.sql
      
  • 代码恢复:
    tar -xzvf /opt/backups/your_project/code_2025-12-04.tar.gz -C /var/www
    
  • 校验建议:
    • 检查备份文件大小修改时间是否合理。
    • 在测试环境抽样恢复验证表结构与数据一致性。
    • 定期做恢复演练,确保流程可用。

0