当前脚本为备份docker启动的mysql, 如不是docker启动的数据库需要调整部分的脚本
创建脚本: vim mysql-bak.sh
以下为脚本:
- #!/bin/bash
- export PATH
- #备份时间
- DATA=`date +%Y-%m-%d`
- backTime=`date +%Y%m%d%H%M%S`
- #数据库用户名 ==== 注意修改====
- dbUser='root'
- #数据库密码 ==== 注意修改====
- dbPasswd='xxxxx'
- #需要备份的数据库 ==== 注意修改====
- dbName='xxxx'
- #日志备份到当前路径mysql文件夹下 ----需要填写日志存放的全路径--- ==== 注意修改====
- logpath=/data/apps/mysql23306/mysql/log
- #数据备份到当前路径mysql文件夹下 ----需要填写数据存放的全路径--- ==== 注意修改====
- datapath=/data/apps/mysql23306/mysql/data/${DATA}-${dbName}-backfils
- #自动创建目录
- if [ ! -d ${logpath} ];
- then
- mkdir -pv ${logpath}
- fi
- #自动创建目录
- if [ ! -d ${datapath} ];
- then
- mkdir -pv ${datapath}
- fi
- #日志记录头部
- echo "备份时间为${backTime},备份数据库表: ${dbName} 开始 日志: ${logpath} 数据: ${datapath}" >> ${logpath}/mysqllog.log
- echo "备份时间为${backTime},备份数据库表: ${dbName} 开始 日志: ${logpath} 数据: ${datapath}"
- #正式备份数据库 ==== 注意修改==== mysql-23306 需要调整为docker启动的mysql名称 【docker ps】 mysql NAMES字段的名称
- docker exec mysql-23306 mysqldump -u${dbUser} -p${dbPasswd} ${dbName} > ${datapath}/${backTime}-${dbName}.sql
- #备份成功以下操作
- if [ $? -eq 0 ];
- then
- cd $datapath
- #为节约硬盘空间,将数据库文件压缩,压缩需要时间,视sql文件大小决定,耐心等待即可
- tar zcvf ${backTime}.tar.gz ${backTime}-${dbName}.sql > /dev/null
- #删除原始文件,只留压缩后文件
- rm -f ${datapath}/${backTime}-${dbName}.sql
- echo "备份时间为${backTime},备份数据库表: ${dbName} 备份成功!! 日志路径: ${logpath} 数据路径: ${datapath}" >> ${logpath}/mysqllog.log
- echo "备份时间为${backTime},备份数据库表: ${dbName} 备份成功!! 日志路径: ${logpath} 数据路径: ${datapath}"
- else
- #备份失败则进行以下操作
- echo "备份时间为${backTime},备份数据库表: ${dbName} 备份失败!! 日志路径: ${logpath} 数据路径: ${datapath}" >> ${logpath}/mysqllog.log
- echo "备份时间为${backTime},备份数据库表: ${dbName} 备份失败!! 日志路径: ${logpath} 数据路径: ${datapath}"
- fi
- #删除14天前备份,也就是只保存14天内的备份
- find $datapath-name "*backfils" -type d -print -mtime +14 -exec rm -rf {} ; > /dev/null 2>&1
运行脚本: sh mysql-bak.sh
注意:如果是用定时任务执行备份语句的且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
样例: 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
把定时任务改为每分钟执行一次,再去数据或者日志文件目录查看是否成功