1.数据库备份 ,支持多数据库,清理过期备份数据
执行以下脚本文件进行数据库备份,会当前目录下创建mysql文件夹进行备份操作
需要注意的点:
1.不要使用xftp等工具创建sh脚本,会有字符无法识别的异常,正确做法是使用vim命令创建sh脚本
#编辑sh脚本
vim mysqlback.sh
2.备份时会锁表,尽量避免读写高峰期备份
#!/bin/bash #功能说明:本功能用于备份 #编写日期:2020/09/05 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH #数据库用户名 dbUser='root' #数据库密码 dbPasswd='password' #数据库IP dbIp='192.168.0.1' #需要备份的数据库,多个数据库用空格分开 dbName='test1 test2' #备份时间 backtime=`date +%Y%m%d%H%M%S` #日志备份到当前路径mysql文件夹下 logpath=$(pwd)/mysql/log #数据备份到当前路径mysql文件夹下 datapath=$(pwd)/mysql/data #自动创建目录 if [ ! -d ${logpath} ];then mkdir -pv ${logpath} fi #自动创建目录 if [ ! -d ${datapath} ];then mkdir -pv ${datapath} fi #日志记录头部 echo "备份时间为${backtime},备份数据库: ${dbName} 开始" >> ${logpath}/mysqllog.log echo "备份时间为${backtime},备份数据库: ${dbName} 开始" #正式备份数据库 for table in $dbName; do echo "备份时间为${backtime},备份数据库: ${table} 备份开始!!" >> ${logpath}/mysqllog.log echo "备份时间为${backtime},备份数据库: ${table} 备份开始!!" source=`/usr/local/mysql/bin/mysqldump --skip-lock-tables -u ${dbUser} -h ${dbIp} -p${dbPasswd} ${table} > ${datapath}/${backtime}-${table}.sql` 2>> ${logpath}/mysqllog.log; #备份成功以下操作 if [ "$?" == 0 ];then cd $datapath #为节约硬盘空间,将数据库文件压缩,压缩需要时间,视sql文件大小决定,耐心等待即可 tar zcvf ${backtime}-${table}.tar.gz ${backtime}-${table}.sql > /dev/null #删除原始文件,只留压缩后文件 rm -f ${datapath}/${backtime}-${table}.sql echo "备份时间为${backtime},备份数据库: ${table} 备份成功!!" >> ${logpath}/mysqllog.log echo "备份时间为${backtime},备份数据库: ${table} 备份成功!!" else #备份失败则进行以下操作 echo "备份时间为${backtime},备份数据库: ${table} 备份失败!!" >> ${logpath}/mysqllog.log echo "备份时间为${backtime},备份数据库: ${table} 备份失败!!" fi done #删除30天前备份,也就是只保存30天内的备份 find $datapath -name "*.tar.gz" -type f -print -mtime +30 -exec rm -rf {} ; > /dev/null 2>&1
执行成功后在当前路径下/mysql/data即可查看到备份的数据库压缩文件
2.单数据库单表备份 ,支持多表备份,清理过期备份数据
#!/bin/bash #功能说明:本功能用于备份 #编写日期:2020/09/05 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH #数据库用户名 dbUser='root' #数据库密码 dbPasswd='password' #数据库IP dbIp='192.168.0.1' #需要备份的数据库 dbName='test1' #需要备份的数据库表,多个数据表用空格分开 dbTableName='table1 table2' #备份时间 DATA=`date +%Y-%m-%d` backTime=`date +%Y%m%d%H%M%S` #日志备份到当前路径mysql文件夹下 logpath=$(pwd)/mysql/log #数据备份到当前路径mysql文件夹下 datapath=$(pwd)/mysql/data/${DATA}-${dbName}-backfils #自动创建目录 if [ ! -d ${logpath} ];then mkdir -pv ${logpath} fi #自动创建目录 if [ ! -d ${datapath} ];then mkdir -pv ${datapath} fi #日志记录头部 echo "备份时间为${backTime},备份数据库表: ${dbName}->${dbTableName} 开始" >> ${logpath}/mysqllog.log echo "备份时间为${backTime},备份数据库表: ${dbName}->${dbTableName} 开始" #正式备份数据库 for table in $dbTableName; do source=`/usr/local/mysql/bin/mysqldump --skip-lock-tables -u ${dbUser} -h ${dbIp} -p${dbPasswd} ${dbName} ${table} > ${datapath}/${backTime}-${dbName}-${table}.sql` 2>> ${logpath}/mysqllog.log; #备份成功以下操作 if [ "$?" == 0 ];then cd $datapath #为节约硬盘空间,将数据库文件压缩,压缩需要时间,视sql文件大小决定,耐心等待即可 tar zcvf ${backTime}-${table}.tar.gz ${backTime}-${dbName}-${table}.sql > /dev/null #删除原始文件,只留压缩后文件 rm -f ${datapath}/${backTime}-${dbName}-${table}.sql echo "备份时间为${backTime},备份数据库表: ${dbName}->${table} 备份成功!!" >> ${logpath}/mysqllog.log echo "备份时间为${backTime},备份数据库表: ${dbName}->${table} 备份成功!!" else #备份失败则进行以下操作 echo "备份时间为${backTime},备份数据库表: ${dbName}->${table} 备份失败!!" >> ${logpath}/mysqllog.log echo "备份时间为${backTime},备份数据库表: ${dbName}->${table} 备份失败!!" fi done #删除30天前备份,也就是只保存30天内的备份 find $datapath -name "*backfils" -type d -print -mtime +30 -exec rm -rf {} ; > /dev/null 2>&1
执行成功后在当前路径下/mysql/data即可查看到备份的数据库压缩文件
3.定时运行备份
查看当前服务器的定时任务
crontab -e
添加定时任务执行脚本,每天0点运行一次,根据业务需要调整时间
0 0 0 1/1 * cd /home/mysqlback;./mysqlback.sh
测试运行一下定时任务命令,查看是否运行正常
cd /home/mysqlback;./mysqlback.sh
运行后出现以下异常
-bash: ./mysqlback.sh: Permission denied
执行权限分配命令
chmod u+x *.sh
再次执行命令,备份成功