docker部署的mysql数据备份-linux定时执行

331 阅读2分钟

当前脚本为备份docker启动的mysql, 如不是docker启动的数据库需要调整部分的脚本

创建脚本: vim mysql-bak.sh

image.png 以下为脚本:

  1. #!/bin/bash
  2. export PATH
  3. #备份时间
  4. DATA=`date +%Y-%m-%d`
  5. backTime=`date +%Y%m%d%H%M%S`
  6. #数据库用户名 ==== 注意修改====
  7. dbUser='root'
  8. #数据库密码 ==== 注意修改====
  9. dbPasswd='xxxxx'
  10. #需要备份的数据库 ==== 注意修改====
  11. dbName='xxxx'
  12. #日志备份到当前路径mysql文件夹下 ----需要填写日志存放的全路径--- ==== 注意修改====
  13. logpath=/data/apps/mysql23306/mysql/log
  14. #数据备份到当前路径mysql文件夹下 ----需要填写数据存放的全路径--- ==== 注意修改====
  15. datapath=/data/apps/mysql23306/mysql/data/${DATA}-${dbName}-backfils
  16. #自动创建目录
  17. if [ ! -d ${logpath} ];
  18. then
  19. mkdir -pv ${logpath}
  20. fi
  21. #自动创建目录
  22. if [ ! -d ${datapath} ];
  23. then
  24. mkdir -pv ${datapath}
  25. fi
  26. #日志记录头部
  27. echo "备份时间为${backTime},备份数据库表: ${dbName} 开始 日志: ${logpath} 数据: ${datapath}" >> ${logpath}/mysqllog.log
  28. echo "备份时间为${backTime},备份数据库表: ${dbName} 开始 日志: ${logpath} 数据: ${datapath}"
  29. #正式备份数据库 ==== 注意修改==== mysql-23306 需要调整为docker启动的mysql名称 【docker ps】 mysql NAMES字段的名称
  30. docker exec mysql-23306 mysqldump -u${dbUser} -p${dbPasswd} ${dbName} > ${datapath}/${backTime}-${dbName}.sql
  31. #备份成功以下操作
  32. if [ $? -eq 0 ];
  33. then
  34. cd $datapath
  35. #为节约硬盘空间,将数据库文件压缩,压缩需要时间,视sql文件大小决定,耐心等待即可
  36. tar zcvf ${backTime}.tar.gz ${backTime}-${dbName}.sql > /dev/null
  37. #删除原始文件,只留压缩后文件
  38. rm -f ${datapath}/${backTime}-${dbName}.sql
  39. echo "备份时间为${backTime},备份数据库表: ${dbName} 备份成功!! 日志路径: ${logpath} 数据路径: ${datapath}" >> ${logpath}/mysqllog.log
  40. echo "备份时间为${backTime},备份数据库表: ${dbName} 备份成功!! 日志路径: ${logpath} 数据路径: ${datapath}"
  41. else
  42. #备份失败则进行以下操作
  43. echo "备份时间为${backTime},备份数据库表: ${dbName} 备份失败!! 日志路径: ${logpath} 数据路径: ${datapath}" >> ${logpath}/mysqllog.log
  44. echo "备份时间为${backTime},备份数据库表: ${dbName} 备份失败!! 日志路径: ${logpath} 数据路径: ${datapath}"
  45. fi
  46. #删除14天前备份,也就是只保存14天内的备份
  47. find $datapath-name "*backfils" -type d -print -mtime +14 -exec rm -rf {} ; > /dev/null 2>&1

运行脚本: sh mysql-bak.sh

image.png

image.png

注意:如果是用定时任务执行备份语句的且mysql是用docker部署的 需要把 -it 去掉否则会有下面这样的提示: Your docker exec command says it needs "pseudo terminal and runs in interactive mode" (-it flags) while cron doesn't attach to any TTYs.

大致意思 exec 加了 -it 参数就开启了一个终端,计划任务是无法进入任何终端的。

例如下列脚本: /usr/bin/docker exec -it mysql-23306 /usr/bin/mysqldump -uroot -pJinfu@2019##21 db_rdm_dev > /data/jinfu/apps/mysql-23306/mysql/data/db_rdm_dev_$current.sql

linux定时任务

修改定时任务: crontab -e

image.png

样例: 0 * * * * /bin/bash /data/apps/mysql23306/mysql-bak.sh >> /data/apps/mysql23306/mysql-bak.log

0 * * * * 表示每小时执行一次根据自己的需求进行调整 测试可以用 * * * * * 测试 表示每分钟执行一次

/data/apps/mysql23306/mysql-bak.sh 为上面脚本的位置

>> /data/apps/mysql23306/mysql-bak.log 是将运行的日保存到mysql-bak.log文件,可以不添加

修改完毕保存退出即可,定时任务会自动更新

查看定时任务列表: crontab -l

image.png

把定时任务改为每分钟执行一次,再去数据或者日志文件目录查看是否成功