MySQL备份脚本
通过计划任务备份数据库,保留指定天数的数据
#!/bin/bash # 运行脚本前先创建一个备份用户,并授予权限 (建议创建一个专用的备份用户,尽量不要使用root用户) # mysql> grant select,insert,lock tables,show view,trigger on *.* to back@localhost identified by "oodaeh7phoe1iboh7Jua"; # mysql> flush privileges; back_user_name=root #备份账号 back_user_pass=oodaeh7phoe1iboh7Jua #备份账号密码 back_path=/data/mysql_backup #备份数据存放路径 back_date=`date +%F-%H` #备份日期 back_day=5 #备份保留的天数 # --------------------获取mysql中的数据库名-------------------- #这里默认没有备份系统默认自带库:information_schema、performance_schema、mysql、test库。 /usr/bin/mysql -u ${back_user_name} -p${back_user_pass} -e "show databases;" |grep -v Database |grep -v information_schema |grep -v performance_schema |grep -v "^mysql$" |grep -v "^test$" > /tmp/DBname # --------------------数据库备份--mysqldump备份-------------------- function MysQLBack () { #创建备份目录 if [ ! -d "${back_path}/${back_date}" ];then mkdir -p ${back_path}/${back_date} fi echo "--------------------${back_date}--------------------" >> ${back_path}/mysql_back.log #循环备份每个库 for db_name in `cat /tmp/DBname`; do /usr/bin/mysqldump --routines --triggers -u ${back_user_name} -p${back_user_pass} ${db_name} > ${back_path}/${back_date}/${db_name}-${back_date}\.sql if [ $? -eq 0 ];then echo "$db_name Back OK!" >> ${back_path}/mysql_back.log else echo "$db_name Back ERROR!" >> ${back_path}/mysql_back.log fi done echo "" >> ${back_path}/mysql_back.log } MysQLBack # --------------------删除自定义保留天数之前的备份数据,并随机保留两份-------------------- find /data/mysql_backup/ -maxdepth 1 -type d -and -ctime +${back_day} > /tmp/alldirname #找出保留天数之前的数据 # 过滤出所有的数据备份目录 如:2020-06-12-06 for dir_name in `cat /tmp/alldirname`; do if echo ${dir_name} |grep "[0-9]" >> /dev/null ; then echo ${dir_name} >> /tmp/delfile fi done # 随机保留两份 if [ ! -d "${back_path}/Oldest/" ];then mkdir -p ${back_path}/Oldest/ ; fi if [ -f "/tmp/delfile" ]; then for save in `cat /tmp/delfile |sort -R |head -n2`; do if [ -d ${save} ]; then cp -r ${save} ${back_path}/Oldest/ fi done # 删除自定义保留天数之前的备份数据 for del in `cat /tmp/delfile`; do if [ -d ${del} ]; then rm -rf ${del} fi done fi # 删除临时文件 rm -f /tmp/delfile && rm -f /tmp/alldirname && rm -f /tmp/DBname