shell笔记:定时自动备份mysql数据库并上传到oss

上周,我们在写一些清理数据的脚本时,由于不同开发人员的脚本执行顺序没有详细对接,导致有一张表的某个字段丢失了一天的数据,虽然后来费了好大精力想办法弥补回来,但类似的情况最好还是杜绝,至少需要一个自动备份数据库的工具。

需求分析

导致数据丢失的原因有很多,员工操作失误,服务器硬盘挂了(机房烧了),服务器被人黑了然后篡改数据库了,甚至是员工删库跑路了,都是有可能的。

那我们需要把数据库备份到一个大概率不会发送这些情况的地方,比如阿里云的oss上。

这个傻瓜式的备份工具至少应该具备以下功能:

  1. 定时备份数据库;
  2. 压缩打包后上传到oss,删除本地压缩包;
  3. 删除oss上超出指定时效的备份(避免占用控键无止境的增大);

oss工具ossutil

为了操作oss我们需要用到oss官方提供的工具ossutil;并给它执行权限,创建软连接。

wget http://gosspublic.alicdn.com/ossutil/1.6.19/ossutil64
cp ossutil64 /opt/tools/
chmod 755 /opt/tools/ossutil64
sudo ln -s /opt/tools/ossutil64 /usr/local/bin/ossutil64

知识点

  • mysqldump命令中如何排除不需要的表,或者指定备份哪些表
  • oss工具ossutil64的基本用法
  • shell中如何生成随机字符串
  • shell中如何获取几天前的时间
  • shell中如何定义数组并进行循环

开箱即用的shell脚本

借鉴网友的智慧,总结经过不断的测试和优化,下面是一个成熟可用的开箱即用的shell脚本:

#!/bin/sh
# mysql程序根目录
base_mysql_path=/usr/local/mysql
# 数据包临时目录
mysql_dump_path=/temp/backup
# 数据库配置
mysql_user="root"
mysql_pass="root"
# oss 配置 如果服务器跟oss是内网,记得使用内网地址
oss_endpoint="oss-cn-shanghai-internal.aliyuncs.com"
oss_bucket="test"
oss_accesskeyid="accesskeyid"
oss_accesskeysecret="accesskeysecret"
# 需要备份的数据库名
database="test_db"
random=`cat /proc/sys/kernel/random/uuid  | md5sum |cut -c 1-9`
backup_name=${database}"_"`date +%Y%m%d`"_"${random}
echo "备份到 "${backup_name}
# 删除10天前的备份文件,修改10
del_name=${database}"_"`date -d"10 day ago" +%Y%m%d`
# 需要忽略的表
excluded_tables=(table1 table2 table3)
ignore_tables_string=""
for table in "${excluded_tables[@]}"
do :
   ignore_tables_string+=" --ignore-table=${database}.${table}"
done
echo "开始备份 "`date +%Y-%m-%d\ %H:%M:%S`
cd ${mysql_dump_path}
# mysqldump database -uroot -proot --tables table1 table2 > backup.sql
${base_mysql_path}/bin/mysqldump -u${mysql_user} -p${mysql_pass} ${database} ${ignore_tables_string} > ${backup_name}.sql
# 压缩包
tar zcf ${backup_name}.tar.gz ${backup_name}.sql
rm -f ${backup_name}.sql
# 上传到 oss
echo "上传到oss中 "`date +%Y-%m-%d\ %H:%M:%S`
/usr/local/bin/ossutil64 cp ${backup_name}.tar.gz oss://${oss_bucket}/backup/${backup_name}.tar.gz -f -e ${oss_endpoint} -i ${oss_accesskeyid} -k ${oss_accesskeysecret}
echo "删除 "${del_name}
/usr/local/bin/ossutil64 rm oss://${oss_bucket}/mysql/backup/${del_name} -r -f -e ${oss_endpoint} -i ${oss_accesskeyid} -k ${oss_accesskeysecret}
rm -f ${backup_name}.tar.gz
echo "备份完成 "`date +%Y-%m-%d\ %H:%M:%S`

将以上内容写入到sh文件/opt/tools/shell/mysql_backup_test.sh中。

定时执行

使用crontab配置每天凌晨3点15分执行备份:

15 3 * * * /opt/tools/shell/mysql_backup_test.sh >> /opt/tools/shell/mysql_backup_test.log 2>&1

使用备份包恢复数据库

方法1:解压tar.gz压缩包得到sql文件,然后在mysql中去恢复。

mysql -uroot -p
use test
source /tmp/test.sql;

方法2:直接导入tar.gz压缩包到mysql

tar xzOf test.tar.gz | mysql -uroot -p test

参考文章

shell笔记:定时自动备份mysql数据库并上传到oss

原文链接:https://beltxman.com/3251.html,若无特殊说明本站内容为行星带原创,未经同意禁止转载!

更多精彩,敬请关注本博微信公众号:hsu1943

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll to top