此脚本适用于 MySQL 各个生命周期的版本
#!/bin/bash
# mybackup.sh# 备份保留天数,建议保留三天
days=7
# 备份时间
time=$(date +%Y%m%d%H%M%S)
# 备份保存路径
backup_dir=/opt/backup
# 备份工具
tool=mysqldump
# 端口
port="3306"
# 是否采用 --all-databases 备份所有数据库,是填写 Y,否填其他
read -p "是否备份所有数据库?(Y/N): " bak_all
# 将要备份的数据库,填写将要备份的数据库名
if [ "$bak_all" != "Y" ]; thenread -p "请输入要备份的数据库名,多个数据库用空格分隔: " database_inputIFS=' ' read -r -a database_arr <<< "$database_input"
fi# 输入账号和密码
read -p "请输入 MySQL 用户名: " username
read -s -p "请输入 MySQL 密码: " password
echo# 检查文件夹是否存在,不存在则创建
if [ ! -d "$backup_dir/mysqlbak_$time" ]; thenmkdir -p "$backup_dir/mysqlbak_$time"
fi# 备份数据库
if [ "$bak_all" == "Y" ]; then$tool -u"$username" -p"$password" -P"$port" --master-data=2 --single-transaction --set-gtid-purged=on --all-databases | gzip > "$backup_dir/mysqlbak_$time/mysqlbak_all_$time.sql.gz"
elsefor database in "${database_arr[@]}"; do$tool -u"$username" -p"$password" -P"$port" --master-data=2 --single-transaction --set-gtid-purged=on "$database" | gzip > "$backup_dir/mysqlbak_$time/mysqlbak_${database}_${time}.sql.gz"done
fi# 备份 binlog 日志
# 获取当前的 binlog 文件列表
binlog_files=$(mysql -u"$username" -p"$password" -P"$port" -e "SHOW BINARY LOGS;" | awk 'NR>1 {print $1}')
for binlog_file in $binlog_files; domysqlbinlog -u"$username" -p"$password" -P"$port" "$binlog_file" > "$backup_dir/mysqlbak_$time/${binlog_file}_${time}.log"
done# 删除指定天数前的备份
find "$backup_dir" -maxdepth 1 -type d -mtime +$days -name 'mysqlbak*' -exec rm -rf {} \;
脚本说明:
-
账号和密码输入:
- 使用
read
命令在脚本运行时提示用户输入 MySQL 用户名和密码,其中-s
选项用于隐藏密码输入。
- 使用
-
数据库选择:
-
备份数据库:
-
备份 binlog 日志:
-
删除旧备份:
- 使用
find
命令删除指定天数前的备份文件夹。
- 使用
使用方法:
- 将上述脚本保存为
mybackup.sh
。 - 给脚本添加执行权限:
chmod +x mybackup.sh
- 运行脚本:
./mybackup.sh
注意事项:
- 确保用户输入的账号和密码具有足够的权限来执行备份操作。