mysql 定时 数据库备份并上传到另一台服务器上,上传结束并删除源文件
2023/12/26 1:03:07
本文主要是介绍mysql 定时 数据库备份并上传到另一台服务器上,上传结束并删除源文件,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
首先总共有两个脚本:
#!/bin/bash:主要用于进行数据库备份、压缩、删除,单独运行命令是:bash XXX.sh
#!/usr/bin/expect:主要用于进行数据备份文件的上传,单独运行命令是:expect XXX.sh
分成两个脚本写的原因是:expect 主要是用于ssh 远程上传是需要输入密码,有了这个脚本则可以自动输入密码。同时由于无法在#!/bin/bash脚本上直接写自动输入密码的语句,所以写了两个脚本。
同时有一个前提:如果两台服务器是免密操作的,则不用写两个脚本,直接在#!/bin/bash 脚本中写 scp 就可以
expect 是需要自动安装的一个插件:
yum -y install expect
安装成功后:
输入:expect
返回:expect1.1>
则安装成功
现在上代码:
#!/bin/bash
#!/bin/bash echo "============备份开始==========================" #当前时间,用来命名sql文件 DATETIME=$(date +%Y%m%d) backup_dir=/usr/mysqldump/back_22/dbname_$DATETIME #自动创建文件夹,如果文件夹不存在则自动创建 echo "============自动创建今日文件夹=============="$backup_dir if [ ! -d $backup_dir ]; then mkdir -p $backup_dir; fi echo "========创建完成===========" #备份多个数据库 #之所以这么写的原因是:mysqldump -u 账户 -p密码 --databases db1 db2 > $backup_dir/dbname_$DATETIME.sql #可以将多个数据库备份到一个文件中,但是我是需要分开备份,以后数据出了问题可以针对性的回复,所以每个备份文件名字都要是不一样的,所以这也是为啥后续有个压缩文件的原因 mysqldump -u 账户 -p密码 dbname1> $backup_dir/dbname1_$DATETIME.sql mysqldump -u 账户 -p密码 dbname2 > $backup_dir/dbname2_$DATETIME.sql echo "========备份完成===========" #压缩下载的数据 echo "========开始压缩===========" tar -czvf /usr/mysqldump/back_22/dbname_$DATETIME.tar.gz $backup_dir echo "========压缩成功===========" #开始将压缩文件上传到IP echo "========开始数据上传===========" #要注意,前面那个部分是调用第二个脚本的语句,是传入第二个脚本的变量名 /data/script/send.sh smartcity_$DATETIME.tar.gz #判断是否上传成功 echo "========上传成功===========" cd /usr/mysqldump/back_22 #因为这里有两个文件,一个是文件夹、一个是压缩包,所以都要删除掉 rm -f dbname_$DATETIME.tar.gz rm -fr dbnam_$DATETIME echo "========文件删除成功==========="
#!/usr/bin/expect
#!/usr/bin/expect #获取文件名 set file_name [lindex $argv 0] spawn scp -P22 /usr/mysqldump/back_22/$file_name 账户@IP:/data/backup/back_22 #expect 是为了抓取scp 后界面返回的Password:关键字,当获取到这个关键字之后,然后填入到send的密码,实现人机交互 expect "Password" send "密码\r" #设置超时时间 set timeout 60 expect eof
注意点:第二个脚本设置超时时间的,这个很坑,在网上找的资料要么就是没有设置,要么就是放在第一行,那么我遇到一个很坑的问题,就是第二个脚本数据上传每次都是上传没有结束就退出了,
我在第二个脚本退出前面写了一个超时时间,我猜测:文件从A服务器上传到B服务器上如果是出现了网络波动,没有设置超时时间,那么程序就要继续往下跑expect eof (退出),那么如果这个超时时间
放在了第一行,那么由于程序是顺序执行,所以在上传过程中会有网络波动,那么上传也会失败
那么在解决这个问题的过程中,我发现了关于判断SCP是否成功的两点经验,代码没有经过验证,但是可以两种运用在其他方面的思路
#第一种方式: #用以下方式可以检查scp进程是否在跑,如果没有跑,那么cnt的值是0 ,主要的原理是通过while循环判断scp是否在跑 cnt=`ps -ef|grep "scp"|grep "all"|grep -v grep|grep -v vi|wc -l` echo "正在上传中:"$cnt while [ $cnt == 0 ] do cnt=`ps -ef|grep "scp"|grep "all"|grep -v grep|grep -v vi|wc -l` echo "正在上传中:"$cnt sleep 30 done echo "========上传成功===========" #第二种方式: #$? 用于直接判断上一个脚本是否已经跑完 if [ $?==0 ]; then echo "========数据上传成功==========="; cd /usr/mysqldump/back_22 rm -f smartcity_$DATETIME.tar.gz rm -fr smartcity_$DATETIME echo "========文件删除成功===========" fi
后面还会在备份存放服务器上加一个脚本,用于定时删除太长时间的备份文件,只保留一段时间的备份
这篇关于mysql 定时 数据库备份并上传到另一台服务器上,上传结束并删除源文件的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-07MySQL读写分离入门:轻松掌握数据库读写分离技术
- 2024-12-07MySQL读写分离入门教程
- 2024-12-07MySQL分库分表入门详解
- 2024-12-07MySQL分库分表入门指南
- 2024-12-07MySQL慢查询入门:快速掌握性能优化技巧
- 2024-12-07MySQL入门:新手必读的简单教程
- 2024-12-07MySQL入门:从零开始学习MySQL数据库
- 2024-12-07MySQL索引入门:新手快速掌握MySQL索引技巧
- 2024-12-06BinLog学习:MySQL数据库BinLog入门教程
- 2024-12-06Binlog学习:MySQL数据库的日志管理入门教程