首页 > 数据库 >mysql 定时 数据库备份并上传到另一台服务器上,上传结束并删除源文件

mysql 定时 数据库备份并上传到另一台服务器上,上传结束并删除源文件

时间:2023-12-25 18:14:11浏览次数:40  
标签:grep 另一台 backup DATETIME 源文件 expect mysql echo 上传

首先总共有两个脚本:

#!/bin/bash:主要用于进行数据库备份、压缩、删除,单独运行命令是:bash  XXX.sh

#!/usr/bin/expect:主要用于进行数据备份文件的上传,单独运行命令是:expect XXX.sh

这两个脚本都需要具有777权限:chmod 777 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"
#/r 所存在的意义是,类似是敲下回车键,一种人机互动的意思 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

后面还会在备份存放服务器上加一个脚本,用于定时删除太长时间的备份文件,只保留一段时间的备份

 

标签:grep,另一台,backup,DATETIME,源文件,expect,mysql,echo,上传
From: https://www.cnblogs.com/zhu-qi/p/17926683.html

相关文章

  • scrapy中运行一段时间报错pymysql.err.InterfaceError: (0, '')
    错误信息Traceback(mostrecentcalllast):File"/home/anaconda3/envs/python36/lib/python3.6/site-packages/twisted/python/threadpool.py",line250,ininContextresult=inContext.theWork()File"/home/anaconda3/envs/python36/lib/p......
  • Ubuntu - 安装 MySQL 8
    以下是在Ubuntu上安装MySQL8的完整步骤:步骤1:更新包列表首先,打开终端并执行以下命令来确保包列表是最新的:sudoaptupdate步骤2:安装MySQL8服务器接下来,使用以下命令安装MySQL8服务器:sudoaptinstallmysql-server步骤3:启动MySQL服务安装完成后,启动MySQL......
  • MySql索引及简单的事务分析
    索引什么是MySql索引?索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。包含着对数据表里所有记录的引用指针。索引的易忽略点:索引相当于书的目录,可以加快查找的速度,但同时也提高了增、删、改的开销;索引也提高了空间的开销,构造索引也就需要额外的硬盘......
  • MySQL运维15-一主一从读写分离
    一、读写分离介绍读写分离,是把数据库的读和写分开操作,以应对不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效的减轻单台数据库的压力。二、一主一从原理MySQL的主从复制是基于二进制(binlog)实现的说明1:当主服务器的MySQL执行了DM......
  • mysql设计表名称要不要加表前缀
    在MySQL中设计表时,是否添加表前缀主要取决于你的具体需求和设计考虑。以下是一些关于是否使用表前缀的考虑因素:1,避免表名冲突:如果你的应用程序要与其他应用程序或系统共享数据库,或者你预计将来会有多个应用程序或系统使用同一个数据库,使用表前缀可以帮助避免表名冲突。例如,你......
  • MYSQL varchar和nvarchar一些学习
    MYSQLvarchar和nvarchar一些学习背景先试用utfmb3的格式进行一下简单验证注意脚本都是一样的.createdatabasezhaobsh;usezhaobsh;createtablezhaobsh(zhaobshvarcharvarchar(30),zhaobshnvarcharnvarchar(30));insertintozhaobshvalues('123abc','1......
  • MySQL 查看版本的 5 种方法
    mysql数据库查看版本号SELECTVERSION();linux查看版本号mysqld-Vmysql-version 方法一:登录MySQL每次通过mysql客户端连接服务器之后,都会显示一个欢迎信息,里面包含了服务器的版本:mysql-urootEnterpassword:******WelcometotheMySQLmonitor.Commandsend......
  • 第81讲:清理MySQL Binlog二进制日志的方式
    1.清理Binlog二进制日志的依据Binlog日志非常重要,但是占用的磁盘空间也很大,我们也需要定期的去清理二进制日志,在MySQL数据库中,提供了自动清理Binlog日志的参数,根据指定的天数,保留n天内的Binlog日志,也可以手动人为删除。在手动删除Binlog日志时,要切记不要使用rm-rf直接删除Binlog......
  • MySQL 主从故障排查
    MySQL主从复制是一种常见的数据库架构,用于提高数据库的可用性和性能。但是,在实际应用中,主从故障是难免的。本文详细介绍一套MySQL主从故障排查方案。一确认主从状态首先要确定主从复制的状态,可以通过执行以下命令来检查:1)SHOWMASTERSTATUS;命令用于显示主库的状态信息,包括以下列......
  • mysql开发包安装
    1.下载MySQL的yum源安装包,例如:wgethttp://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm2.安装yum源安装包,例如:sudoyumlocalinstallmysql57-community-release-el7-7.noarch.rpm3.安装mysql-community-devel-5.7.44,例如:sudoyuminstallmysql-community-d......