MySQL 备份脚本解析

一.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值