签入版本
This commit is contained in:
@@ -16,27 +16,31 @@
|
||||
# -proot → 数据库密码(生产环境建议用 -p 后不跟密码,交互式输入)
|
||||
# rxthinkcmf... → 要备份的数据库名
|
||||
# > backup_*.sql → 输出到文件,$(date +%Y%m%d) 自动生成日期后缀
|
||||
mysqldump -u root -proot rxthinkcmf.thinkphp6.elevue > backup_$(date +%Y%m%d).sql
|
||||
mysqldump -u root -proot rxthinkcmf.laravel13.elevue > backup_$(date +%Y%m%d).sql
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 压缩备份(推荐 — 可节省 70%+ 磁盘空间)
|
||||
# -----------------------------------------------------------------------------
|
||||
# | gzip → 将 mysqldump 输出通过管道传给 gzip 压缩
|
||||
mysqldump -u root -proot rxthinkcmf.thinkphp6.elevue | gzip > backup_$(date +%Y%m%d).sql.gz
|
||||
mysqldump -u root -proot rxthinkcmf.laravel13.elevue | gzip > backup_$(date +%Y%m%d).sql.gz
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 仅备份表结构(不含数据 — 用于对比表结构变更)
|
||||
# -----------------------------------------------------------------------------
|
||||
# --no-data → 只导出 CREATE TABLE 语句,不导出数据
|
||||
mysqldump -u root -proot --no-data rxthinkcmf.thinkphp6.elevue > schema_$(date +%Y%m%d).sql
|
||||
mysqldump -u root -proot --no-data rxthinkcmf.laravel13.elevue > schema_$(date +%Y%m%d).sql
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 仅备份数据(不含表结构 — 用于数据迁移)
|
||||
# -----------------------------------------------------------------------------
|
||||
# --no-create-info → 只导出 INSERT 语句,不导出 CREATE TABLE
|
||||
mysqldump -u root -proot --no-create-info rxthinkcmf.thinkphp6.elevue > data_$(date +%Y%m%d).sql
|
||||
mysqldump -u root -proot --no-create-info rxthinkcmf.laravel13.elevue > data_$(date +%Y%m%d).sql
|
||||
```
|
||||
|
||||
:::info 大库提示
|
||||
本项目初始化数据约 216MB(导出后更大),全量备份建议使用压缩(gzip),并避开业务高峰时段。
|
||||
:::
|
||||
|
||||
### 自动备份脚本
|
||||
|
||||
```bash
|
||||
@@ -52,7 +56,7 @@ mysqldump -u root -proot --no-create-info rxthinkcmf.thinkphp6.elevue > data_$(d
|
||||
# 配置参数(按实际环境修改)
|
||||
# -----------------------------------------------------------------------------
|
||||
BACKUP_DIR="/backup/mysql" # 备份文件存放目录
|
||||
DB_NAME="rxthinkcmf.thinkphp6.elevue" # 要备份的数据库名
|
||||
DB_NAME="rxthinkcmf.laravel13.elevue" # 要备份的数据库名
|
||||
DB_USER="root" # 数据库用户名
|
||||
DB_PASS="root" # 数据库密码
|
||||
DATE=$(date +%Y%m%d_%H%M%S) # 当前时间戳(年月日_时分秒)
|
||||
@@ -119,7 +123,8 @@ crontab -e
|
||||
# -z → 用 gzip 压缩
|
||||
# -f → 指定输出文件名
|
||||
# $(date +%Y%m%d) → 自动生成日期后缀
|
||||
tar -czf /backup/uploads_$(date +%Y%m%d).tar.gz /opt/data/uploads/
|
||||
# 本项目上传目录默认在 public/uploads/(FILE_UPLOAD_DIR=uploads)
|
||||
tar -czf /backup/uploads_$(date +%Y%m%d).tar.gz /www/api/public/uploads/
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 上传文件自动备份脚本
|
||||
@@ -128,7 +133,7 @@ tar -czf /backup/uploads_$(date +%Y%m%d).tar.gz /opt/data/uploads/
|
||||
BACKUP_DIR="/backup/uploads" # 备份存放目录
|
||||
DATE=$(date +%Y%m%d) # 日期后缀
|
||||
mkdir -p $BACKUP_DIR # 创建目录(如不存在)
|
||||
tar -czf $BACKUP_DIR/uploads_$DATE.tar.gz /opt/data/uploads/ # 压缩打包
|
||||
tar -czf $BACKUP_DIR/uploads_$DATE.tar.gz /www/api/public/uploads/ # 压缩打包
|
||||
find $BACKUP_DIR -name "uploads_*.tar.gz" -mtime +30 -delete # 清理 30 天前的备份
|
||||
```
|
||||
|
||||
@@ -141,25 +146,29 @@ find $BACKUP_DIR -name "uploads_*.tar.gz" -mtime +30 -delete # 清理 30 天
|
||||
# 从 SQL 文件恢复(全量覆盖)
|
||||
# -----------------------------------------------------------------------------
|
||||
# < backup_*.sql → 将文件内容作为 mysql 命令的输入
|
||||
mysql -u root -proot rxthinkcmf.thinkphp6.elevue < backup_20260920.sql
|
||||
mysql -u root -proot rxthinkcmf.laravel13.elevue < backup_20260920.sql
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 从压缩文件恢复(gunzip 解压后传给 mysql)
|
||||
# -----------------------------------------------------------------------------
|
||||
# gunzip < file.sql.gz → 解压并输出到标准输出
|
||||
# | mysql → 通过管道传给 mysql 命令执行
|
||||
gunzip < backup_20260920.sql.gz | mysql -u root -proot rxthinkcmf.thinkphp6.elevue
|
||||
gunzip < backup_20260920.sql.gz | mysql -u root -proot rxthinkcmf.laravel13.elevue
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 恢复到新数据库(安全起见 — 先验证再切换)
|
||||
# -----------------------------------------------------------------------------
|
||||
# 1. 创建临时验证数据库
|
||||
mysql -u root -proot -e "CREATE DATABASE `rxthinkcmf.thinkphp6.elevue_restore`;"
|
||||
mysql -u root -proot -e "CREATE DATABASE \`rxthinkcmf.laravel13.elevue_restore\`;"
|
||||
# 2. 恢复备份到临时库
|
||||
mysql -u root -proot rxthinkcmf.thinkphp6.elevue_restore < backup_20260920.sql
|
||||
mysql -u root -proot rxthinkcmf.laravel13.elevue_restore < backup_20260920.sql
|
||||
# 3. 验证数据无误后,重命名数据库(需停机操作)
|
||||
```
|
||||
|
||||
:::warning 恢复后清理缓存
|
||||
恢复数据库后务必执行 `php artisan cache:clear`(或 `php artisan dict:clear-cache`),避免 Redis 中的旧字典/参数缓存与新数据不一致。
|
||||
:::
|
||||
|
||||
### 恢复上传文件
|
||||
|
||||
```bash
|
||||
@@ -177,7 +186,7 @@ tar -xzf /backup/uploads_20260920.tar.gz -C /
|
||||
# 仅恢复特定子目录(如只恢复文章附件)
|
||||
# -----------------------------------------------------------------------------
|
||||
# 在归档文件名后追加要解压的路径前缀
|
||||
tar -xzf /backup/uploads_20260920.tar.gz -C / www/uploads/article/
|
||||
tar -xzf /backup/uploads_20260920.tar.gz -C / www/api/public/uploads/article/
|
||||
```
|
||||
|
||||
## 备份验证
|
||||
@@ -196,7 +205,7 @@ tar -xzf /backup/uploads_20260920.tar.gz -C / www/uploads/article/
|
||||
# =============================================================================
|
||||
|
||||
BACKUP_FILE=$1 # 第一个参数:备份文件路径
|
||||
VERIFY_DB="rxthinkcmf.thinkphp6.elevue_verify" # 临时验证数据库名
|
||||
VERIFY_DB="rxthinkcmf.laravel13.elevue_verify" # 临时验证数据库名
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 创建验证数据库(先删除旧的,再创建新的)
|
||||
@@ -217,8 +226,8 @@ gunzip < $BACKUP_FILE | mysql -u root -p $VERIFY_DB
|
||||
TABLE_COUNT=$(mysql -u root -p -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$VERIFY_DB';")
|
||||
echo "恢复的表数量: $TABLE_COUNT"
|
||||
|
||||
# 检查用户表数据量(验证核心数据是否完整)
|
||||
USER_COUNT=$(mysql -u root -p -N -e "SELECT COUNT(*) FROM $VERIFY_DB.think_user;")
|
||||
# 检查用户表数据量(验证核心数据是否完整,注意本项目表前缀为 laravel_)
|
||||
USER_COUNT=$(mysql -u root -p -N -e "SELECT COUNT(*) FROM $VERIFY_DB.laravel_user;")
|
||||
echo "用户数量: $USER_COUNT"
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
@@ -243,4 +252,5 @@ echo "备份验证完成"
|
||||
- 异地保留最近 30 天的备份
|
||||
- 每月进行一次恢复测试
|
||||
- 备份文件加密存储(如含敏感数据)
|
||||
- 数据库与 `public/uploads/`、`.env` 一并纳入备份范围(.env 单独加密保管)
|
||||
:::
|
||||
|
||||
Reference in New Issue
Block a user