本文主要介绍一下Linux下如何对MySql数据库进行自动备份,并使用qshell将备份文件上传至七牛云存储上,并保留7天的备份数据。
qshell介绍
qshell 是利用 七牛文档上公开的 API 实现的一个方便开发者测试和使用七牛 API 服务的命令行工具。该工具设计和开发的主要目的就是帮助开发者快速解决问题。目前该工具融合了七牛存储、CDN、以及其他的一些七牛服务中经常使用到的方法对应的便捷命令。
一、下载qshell
wget https://github.com/qiniu/qshell/releases/download/v2.14.0/qshell-v2.14.0-linux-amd64.tar.gz
tar -xvf qshell-v2.14.0-linux-amd64.tar.gz
mv qshell /usr/bin/
chmod +x /usr/bin/qshell
此时执行 qshell ,如果输出了帮助信息,说明你安装和设置都已经完成。
二、编写shell脚本
#!/bin/bash
username="数据库账户"
password="数据库密码"
backup_dir="/data/backup/mysql"
log_file="/data/backup/mysqlbak.log"
keep_day=7
access_key="七牛AccessKey"
secret_key="七牛SecretKey"
qiniu_name="自定义账户名"
bucket_name="空间名"
# 清除并初始化日志文件
> "$log_file"
echo "-------------------------------------------" >> "$log_file"
echo "$(date) 开始备份数据库" >> "$log_file"
echo "--------------------------" >> "$log_file"
# 创建备份目录
mkdir -p "$backup_dir"
# 指定要备份的数据库列表
databases="mydb1 mydb2"
for db in $databases; do
echo "开始备份数据库 [$db]" >> "$log_file"
backup_path="$backup_dir/$db-$(date +%Y%m%d%H%M%S)"
mkdir -p "$backup_path"
tables=$(mysql -u "$username" -p"$password" "$db" -e "SHOW TABLES;" | grep -v "Tables_in_$db")
for table in $tables; do
backup_file="$backup_path/$table.sql"
# linux的crond服务不会将mysqldump的脚本在mysql安装路径bin下执行的。故需要在脚本前面手动指定mysql的bin路径
/usr/local/mysql/bin/mysqldump -u "$username" -p"$password" --skip-lock-tables --single-transaction --compatible=ansi "$db" "$table" > "$backup_file"
if [ $? -ne 0 ]; then
echo "备份表 [$db.$table] 失败" >> "$log_file"
continue
fi
done
# 压缩备份目录
tar -czf "$backup_path.tar.gz" -C "$backup_path" .
if [ $? -ne 0 ]; then
echo "压缩备份目录失败" >> "$log_file"
rm -rf "$backup_path"
continue
fi
# 上传备份文件至七牛云存储
qshell account "$access_key" "$secret_key" "$qiniu_name" > /dev/null
qshell rput "$bucket_name" "database/$(basename "$backup_path.tar.gz")" "$backup_path.tar.gz" true >> "$log_file" 2>&1
if [ $? -ne 0 ]; then
echo "上传备份文件失败" >> "$log_file"
else
echo "上传完成" >> "$log_file"
fi
# 删除原始备份目录
rm -rf "$backup_path"
echo "数据库 [$db] 备份完成" >> "$log_file"
echo "-------------------------------------------" >> "$log_file"
done
# 删除7天前的备份文件
find "$backup_dir" -type f -name '*.tar.gz' -mtime +$keep_day -exec rm -f {} \; >> "$log_file" 2>&1
echo "$(date) 所有数据库备份完成" >> "$log_file"
如果脚本是在windows下编写的脚本可能会报/bin/bash^M: bad interpreter: No such file or directory
错误,这个错误通常发生在尝试在Unix-like系统上运行脚本文件时,该文件是在Windows环境下编辑的。Windows使用回车换行符(CRLF,即\r\n),而Unix使用换行符(LF,即\n)。在这种情况下,文件中的换行符被错误地转换成了回车符(Carriage Return,即\r),这就导致了脚本解释器路径的错误。执行dos2unix baksql.sh
命令转换文件格式即可。
三、创建定时任务
输入命令crontab -e
进入定时任务编辑器。
# 每天凌晨2点执行备份脚本
0 2 * * * /data/backup/baksql.sh