一.MySQL 备份脚本
#!/bin/bash
# 定义变量
USER="root"
PASSWORD="123456"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d)
WEEKDAY=$(date +%u) # 1=星期一, 7=星期日# 创建备份目录
mkdir -p $BACKUP_DIR# 周日全备份,其他日子增量备份
if [ $WEEKDAY -eq 7 ]; then
# 全备份
echo "$(date): 开始全备份" >> $BACKUP_DIR/backup.log
mysqldump -u$USER -p$PASSWORD --all-databases --single-transaction | gzip > $BACKUP_DIR/full_$DATE.sql.gz
echo "$(date): 全备份完成" >> $BACKUP_DIR/backup.log
else
# 增量备份(备份binlog)
echo "$(date): 开始增量备份" >> $BACKUP_DIR/backup.log
mysql -u$USER -p$PASSWORD -e "FLUSH LOGS"
# 复制最新的binlog文件
cp /usr/local/mysql/data/mysql-bin.$(mysql -u$USER -p$PASSWORD -e "SHOW MASTER STATUS" | awk 'NR==2{print $1}' | sed 's/mysql-bin.//') $BACKUP_DIR/binlog_$DATE
echo "$(date): 增量备份完成" >> $BACKUP_DIR/backup.log
fi# 删除7天前的备份
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
find $BACKUP_DIR -name "binlog_*" -mtime +7 -delete
二. 脚本解析
1. 变量定义
USER="root" # MySQL用户名
PASSWORD="your_password" # MySQL密码(使用时替换为实际密码)
BACKUP_DIR="/backup/mysql" # 备份文件存储目录
DATE=$(date +%Y%m%d) # 当前日期(格式:20231006)
WEEKDAY=$(date +%u) # 星期几(1=星期一,7=星期日)
#!/bin/bash:指定用Bash解释器执行脚本。
关键变量:
USER/PASSWORD:连接MySQL的用户和密码。
BACKUP_DIR:所有备份文件将存储在此目录。
DATE和WEEKDAY:用于按日期命名备份文件和控制备份类型。
2. 创建备份目录
mkdir -p $BACKUP_DIR
-p:如果目录不存在则创建,避免报错。
3. 备份逻辑(核心部分)
情况一:周日全备份
if [ $WEEKDAY -eq 7 ]; then
echo "$(date): 开始全备份" >> $BACKUP_DIR/backup.log
mysqldump -u $USER -p $PASSWORD --all-databases --single-transaction | gzip > $BACKUP_DIR/full_$DATE.sql.gz
echo "$(date): 全备份完成" >> $BACKUP_DIR/backup.log
mysqldump关键参数:
--all-databases:备份所有数据库。
--single-transaction:在事务中执行备份,确保数据一致性。
gzip:压缩备份文件以节省空间。
> full_$DATE.sql.gz :输出到以日期命名的压缩文件(如full_20231006.sql.gz)
情况二:其他日期增量备份
else
echo "$(date): 开始增量备份" >> $BACKUP_DIR/backup.log
mysql -u$USER -p$PASSWORD -e "FLUSH LOGS"
cp /usr/local/mysql/data/mysql-bin.$(mysql -u$USER -p$PASSWORD -e "SHOW MASTER STATUS" | awk 'NR==2{print $1}' | sed 's/mysql-bin.//') $BACKUP_DIR/binlog_$DATE
echo "$(date): 增量备份完成" >> $BACKUP_DIR/backup.log
fi
FLUSH LOGS:强制MySQL创建新的binlog文件,确保增量备份的边界清晰。(如从mysql-bin.000123切换到mysql-bin.000124)
mysql -u$USER -p$PASSWORD -e "SHOW MASTER STATUS":获取当前binlog文件名(如mysql-bin.000123)。
awk 'NR==2{print $1}' :从SHOW MASTER STATUS的输出中提取第二行的第一列(即 mysql-bin.000123)
sed 's/mysql-bin.//':去掉mysql-bin.前缀把 mysql-bin.000123变成 000123。
/usr/local/mysql/data/mysql-bin.$(...):
作用:组合MySQL的binlog存储路径 + 文件名。
示例:
如果 SHOW MASTER STATUS返回 mysql-bin.000123,则最终路径是:
/var/lib/mysql/mysql-bin.000123
cp ... $BACKUP_DIR/binlog_$DATE
作用:将binlog文件复制到备份目录,并按日期命名(如 binlog_20231006)。
示例:
cp /var/lib/mysql/mysql-bin.000123 /backup/mysql/binlog_20231006
增量备份原理:MySQL的binlog记录了所有数据变更,通过定期保存binlog实现增量备份。
如果没有binlog文件 则再/etc/my.cnf 的 [mysqld] 里添加这一行 log_bin = mysql-bin (启用binlog,文件前缀为mysql-bin)
4. 清理旧备份
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
find $BACKUP_DIR -name "binlog_*" -mtime +7 -delete
作用:自动删除7天前的全备份(.gz文件)和增量备份(binlog_*文件)。
-mtime +7:匹配修改时间超过7天的文件。
-delete:直接删除文件
5. 日志记录
所有操作均通过echo追加到$BACKUP_DIR/backup.log,格式示例:
Mon Oct 6 03:00:01 UTC 2023: 开始全备份
Mon Oct 6 03:02:30 UTC 2023: 全备份完成
关键注意事项
MySQL配置要求:
必须启用binlog(检查my.cnf中是否有log_bin=ON)。
确保/usr/local/mysql/data是正确的binlog路径(根据实际配置调整)。
最后运行,然后查看/backup/mysql/backup.log

169

被折叠的 条评论
为什么被折叠?



