编写了一个完整的备份shell脚本,包含数据库和网站文件的备份:
一、脚本功能说明
- 数据库备份:备份wordpress数据库为SQL文件并压缩
- 网站文件备份:备份网站目录为tar.gz压缩包
- 配置文件备份:备份相关服务配置文件
- 自动清理:保留最近60天的备份,自动清理旧文件
- 日志报告:生成详细的备份报告和日志
- 错误处理:完善的错误检测和处理机制
二、使用前请修改
- 修改
DB_NAME为您的实际数据库名称,DB_USER为您的实际数据库用户名,WEB_DIR为您的实际网站目录,WEB_IP为您的实际服务器IP ,MYSQL_CONFIG_EDITOR_PATH为您的实际MySQL中的mysql_config_editor全路径,MYSQLDUMP_PATH为您的实际MySQL中的mysqldump全路径。 - 根据您的MySQL密码配置方式选择合适的方法
- 确认备份目录有足够的磁盘空间
这个脚本提供了完整的备份解决方案,并考虑了安全性和易用性。
三、备份脚本:backup.sh
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
#!/bin/bash # -------------------根据实际修改参数------------------------------------ # MySQL中的mysql_config_editor全路径,使用command -v mysql_config_editor或which mysql_config_editor命令查询路径 MYSQL_CONFIG_EDITOR_PATH="/www/server/mysql/bin/mysql_config_editor" # MySQL中的mysqldump全路径,使用command -v mysqldump或which mysqldump命令查询路径 MYSQLDUMP_PATH="/www/server/mysql/bin/mysqldump" # MySQL数据库配置 DB_NAME="wordpress" # 请根据实际数据库名称修改 DB_USER="wordpress" # 请根据实际数据库用户名修改 # 注意:密码可以通过多种方式提供,这里使用安全的方式 # 网站服务器IP WEB_IP="192.168.9.6" # 请根据实际网站服务器IP修改 # 网站文件配置 WEB_DIR="/www/wwwroot/192.168.9.6" # 请根据实际网站目录修改 # 安装Linux宝塔后,相关NGINX配置文件 CONFIG_FILES=("/www/server/panel/vhost/nginx/$WEB_IP.conf" "/www/server/panel/vhost/nginx/phpfpm_status.conf" "/www/server/panel/vhost/nginx/0.default.conf") # -------------------------------------------------------------------- # 备份脚本配置 BACKUP_DIR="/home/backups" # 备份文件存储目录 DATE=$(date +%Y%m%d_%H%M%S) # 备份时间戳 BACKUP_NAME="backup_$DATE" # 备份文件名 # 颜色输出函数 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color log() { echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}" } error() { echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}" } warn() { echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}" } # 创建备份目录 create_backup_dir() { if [ ! -d "$BACKUP_DIR" ]; then log "创建备份目录: $BACKUP_DIR" mkdir -p "$BACKUP_DIR" if [ $? -ne 0 ]; then error "无法创建备份目录" exit 1 fi fi } # 备份MySQL数据库 backup_database() { log "开始备份MySQL数据库: $DB_NAME" # 检查mysql_config_editor是否存在 if [ ! -f "$MYSQL_CONFIG_EDITOR_PATH" ]; then error "错误:在这个路径下, ${MYSQL_CONFIG_EDITOR_PATH} ,无法找到 mysql_config_editor " exit 1 fi # 检查mysqldump是否存在 if [ ! -f "$MYSQLDUMP_PATH" ]; then error "错误:在这个路径下, ${MYSQLDUMP_PATH} ,无法找到 mysqldump " exit 1 fi # 方法1:使用mysql_config_editor(安全) if $MYSQL_CONFIG_EDITOR_PATH print --login-path=backup > /dev/null 2>&1; then $MYSQLDUMP_PATH --login-path=backup --no-tablespaces $DB_NAME > "$BACKUP_DIR/${BACKUP_NAME}_database.sql" # 方法2:使用.mysqlpass文件(推荐) elif [ -f ~/.mysqlpass ]; then DB_PASS=$(cat ~/.mysqlpass) $MYSQLDUMP_PATH -u$DB_USER -p$DB_PASS --no-tablespaces $DB_NAME > "$BACKUP_DIR/${BACKUP_NAME}_database.sql" else warn "未找到数据库密码配置" exit 1 fi if [ $? -eq 0 ]; then log "数据库备份成功: ${BACKUP_NAME}_database.sql" # 压缩数据库备份 gzip "$BACKUP_DIR/${BACKUP_NAME}_database.sql" log "数据库备份已压缩" else error "数据库备份失败" return 1 fi } # 备份网站文件 backup_website() { log "开始备份网站文件" if [ ! -d "$WEB_DIR" ]; then error "网站目录不存在: $WEB_DIR" return 1 fi # 创建网站文件备份 tar -czf "$BACKUP_DIR/${BACKUP_NAME}_website.tar.gz" -C $(dirname "$WEB_DIR") $(basename "$WEB_DIR") 2>/dev/null if [ $? -eq 0 ]; then log "网站文件备份成功: ${BACKUP_NAME}_website.tar.gz" else error "网站文件备份失败" return 1 fi } # 备份配置文件 backup_config() { log "开始备份配置文件" CONFIG_BACKUP_FILE="$BACKUP_DIR/${BACKUP_NAME}_config.tar.gz" CONFIG_TEMP_DIR="/tmp/config_backup_$$" mkdir -p "$CONFIG_TEMP_DIR" # 复制存在的配置文件 for config_path in "${CONFIG_FILES[@]}"; do if [ -e "$config_path" ]; then cp -r "$config_path" "$CONFIG_TEMP_DIR/" 2>/dev/null fi done # 创建压缩包 if [ "$(ls -A "$CONFIG_TEMP_DIR")" ]; then tar -czf "$CONFIG_BACKUP_FILE" -C "$CONFIG_TEMP_DIR" . log "配置文件备份成功: ${BACKUP_NAME}_config.tar.gz" else warn "未找到任何配置文件" fi # 清理临时文件 rm -rf "$CONFIG_TEMP_DIR" } # 清理旧备份文件(保留最近60天的备份) clean_old_backups() { log "清理60天前的旧备份文件" find "$BACKUP_DIR" -name "backup_*.tar.gz" -type f -mtime +60 -delete find "$BACKUP_DIR" -name "backup_*.sql.gz" -type f -mtime +60 -delete log "旧备份清理完成" } # 生成备份报告 generate_report() { REPORT_FILE="$BACKUP_DIR/backup_report_$DATE.txt" { echo "=== 备份报告 ===" echo "备份时间: $(date)" echo "备份目录: $BACKUP_DIR" echo "备份文件:" ls -lh "$BACKUP_DIR" | grep "$BACKUP_NAME" echo "" echo "磁盘使用情况:" df -h "$BACKUP_DIR" echo "" echo "备份大小统计:" du -sh "$BACKUP_DIR" } > "$REPORT_FILE" log "备份报告已生成: backup_report_$DATE.txt" } # 主函数 main() { log "开始备份流程..." # 创建备份目录 create_backup_dir # 执行备份 backup_database backup_website backup_config # 清理旧备份 clean_old_backups # 生成报告 generate_report log "备份完成!所有文件保存在: $BACKUP_DIR" } # 执行主函数 main |
四、设置密码文件(强烈推荐)
首先切换到root账户,创建安全的密码文件(请根据实际修改相关user值和your_mysql_password参数):
|
1 2 3 4 5 6 7 |
# 使用mysql_config_editor(更安全) mysql_config_editor set --login-path=backup --host=localhost --user=wordpress --password # 或者创建密码文件(一定要确保权限安全) echo "your_mysql_password" > ~/.mysqlpass chmod 600 ~/.mysqlpass |
如果使用mysql_config_editor(更安全),出现 mysql_config_editor: command not found 的原因通常是系统中 没有安装包含该工具的 MySQL 客户端包,或 安装路径不在 PATH 环境变量中。mysql_config_editor 从 MySQL 5.7 开始才随 mysql-community-client(或对应发行版的 mysql-client)一起发布,5.6 及更早版本默认不带此命令。
首先确认已经安装MySQL>=5.7版本,使用命令查询:
|
1 2 |
which mysql_config_editor |
如果没有出现mysql_config_editor路径,是因为mysql_config_editor不在 /usr/bin 或 /usr/local/bin,首先切换到root账户,运行下面命令查询Linux宝塔安装MySQL后mysql_config_editor位置,把其所在目录加入 PATH:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 查找 MySQL 安装目录 find /www -name "mysql" -type d 2>/dev/null # 宝塔通常的 MySQL 安装路径 ls -la /www/server/mysql/ # 查看宝塔通常的 MySQL 的 bin 目录 ls -la /www/server/mysql/bin/ # 将宝塔通常的 MySQL bin 目录添加到 PATH echo 'export PATH=/www/server/mysql/bin:$PATH' >> ~/.bashrc source ~/.bashrc |
再次使用命令查询:
|
1 2 |
which mysql_config_editor |
出现mysql_config_editor路径:
|
1 2 |
/www/server/mysql/bin/mysql_config_editor |
验证版本:
|
1 2 |
mysql_config_editor --version |
能输出版本信息即表示问题已解决。
再次使用下面命令,创建安全的密码文件(请根据实际修改相关user用户值和your_mysql_password密码参数):
|
1 2 3 4 5 6 7 |
# 或者使用mysql_config_editor(更安全) mysql_config_editor set --login-path=backup --host=localhost --user=wordpress --password # 或者创建密码文件(一定要确保权限安全) echo "your_mysql_password" > ~/.mysqlpass chmod 600 ~/.mysqlpass |
五、设置系统级定时任务
解决方法:
在普通账户下,把脚本扔进系统级目录(/etc/cron.d/),由 root 的 cron 直接调度,脚本里所有命令天然就是 root 权限,也不用写 sudo。
- 将已经写好的
backup.sh脚本(不要 sudo),放入下面路径:/opt/admin/backup.sh -
给脚本加可执行、仅 root 可改
123sudo chmod 700 /opt/admin/backup.shsudo chown root:root /opt/admin/backup.sh - 放进 /etc/cron.d(推荐,时间可自定义)
新建文件/etc/cron.d/mybackup:12sudo vim /etc/cron.d/mybackup写入下面内容:
|
1 2 3 |
# 每月第一天 03:00 以 root 身份执行 0 3 1 * * root /opt/admin/backup.sh >> /var/log/backup.log 2>&1 |
保存后立即生效,无需重启 cron。
六、查看日志及备份文件
- 使用命令
cat /var/log/backup.log查看日志

- 使用命令
ls -lh /home/backups查看备份文件

也可以登陆Linux宝塔面板,查看备份文件。

一句话总结 :
把脚本交给 root 的 cron,脚本里所有命令就当 root 用,sudo 字样全部删掉,省心又安全。