首先总共有两个脚本:

#!/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

  1. #!/bin/bash
  2. echo "============备份开始=========================="
  3. #当前时间,用来命名sql文件
  4. DATETIME=$(date +%Y%m%d)
  5. backup_dir=/usr/mysqldump/back_22/dbname_$DATETIME
  6. #自动创建文件夹,如果文件夹不存在则自动创建
  7. echo "============自动创建今日文件夹=============="$backup_dir
  8. if [ ! -d $backup_dir ]; then
  9. mkdir -p $backup_dir;
  10. fi
  11. echo "========创建完成==========="
  12. #备份多个数据库
    #之所以这么写的原因是:mysqldump -u 账户 -p密码 --databases db1 db2 > $backup_dir/dbname_$DATETIME.sql
    #可以将多个数据库备份到一个文件中,但是我是需要分开备份,以后数据出了问题可以针对性的回复,所以每个备份文件名字都要是不一样的,所以这也是为啥后续有个压缩文件的原因
  13. mysqldump -u 账户 -p密码 dbname1> $backup_dir/dbname1_$DATETIME.sql
  14. mysqldump -u 账户 -p密码 dbname2 > $backup_dir/dbname2_$DATETIME.sql
  15. echo "========备份完成==========="
  16. #压缩下载的数据
  17. echo "========开始压缩==========="
  18. tar -czvf /usr/mysqldump/back_22/dbname_$DATETIME.tar.gz $backup_dir
  19. echo "========压缩成功==========="
  20. #开始将压缩文件上传到IP
  21. echo "========开始数据上传==========="
    #要注意,前面那个部分是调用第二个脚本的语句,是传入第二个脚本的变量名
  22. /data/script/send.sh smartcity_$DATETIME.tar.gz
  23. #判断是否上传成功
  24. echo "========上传成功==========="
  25. cd /usr/mysqldump/back_22
    #因为这里有两个文件,一个是文件夹、一个是压缩包,所以都要删除掉
  26. rm -f dbname_$DATETIME.tar.gz
  27. rm -fr dbnam_$DATETIME
  28. echo "========文件删除成功==========="

#!/usr/bin/expect

  1. #!/usr/bin/expect
  2. #获取文件名
  3. set file_name [lindex $argv 0]
  4. spawn scp -P22 /usr/mysqldump/back_22/$file_name 账户@IP:/data/backup/back_22
    #expect 是为了抓取scp 后界面返回的Password:关键字,当获取到这个关键字之后,然后填入到send的密码,实现人机交互
  5. expect "Password"
  6. send "密码\r"
  7. #设置超时时间
  8. set timeout 60
  9. expect eof

注意点:第二个脚本设置超时时间的,这个很坑,在网上找的资料要么就是没有设置,要么就是放在第一行,那么我遇到一个很坑的问题,就是第二个脚本数据上传每次都是上传没有结束就退出了,

我在第二个脚本退出前面写了一个超时时间,我猜测:文件从A服务器上传到B服务器上如果是出现了网络波动,没有设置超时时间,那么程序就要继续往下跑expect eof (退出),那么如果这个超时时间

放在了第一行,那么由于程序是顺序执行,所以在上传过程中会有网络波动,那么上传也会失败

那么在解决这个问题的过程中,我发现了关于判断SCP是否成功的两点经验,代码没有经过验证,但是可以两种运用在其他方面的思路

  1. #第一种方式:
    #用以下方式可以检查scp进程是否在跑,如果没有跑,那么cnt的值是0 ,主要的原理是通过while循环判断scp是否在跑
    cnt=`ps -ef|grep "scp"|grep "all"|grep -v grep|grep -v vi|wc -l`
  2. echo "正在上传中:"$cnt
  3. while [ $cnt == 0 ]
  4. do
  5. cnt=`ps -ef|grep "scp"|grep "all"|grep -v grep|grep -v vi|wc -l`
  6. echo "正在上传中:"$cnt
  7. sleep 30
  8. done
  9. echo "========上传成功==========="

    #第二种方式:
    #$? 用于直接判断上一个脚本是否已经跑完
  10. if [ $?==0 ]; then
  11. echo "========数据上传成功===========";
  12. cd /usr/mysqldump/back_22
  13. rm -f smartcity_$DATETIME.tar.gz
  14. rm -fr smartcity_$DATETIME
  15. echo "========文件删除成功==========="
  16. fi

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

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

  1. MySQL的数据库备份

    MySQL的数据库备份 备份的原因: 1.保证重要数据不丢失 2.数据转移 MySQL数据库备份方式: 1.方法1:在Sqlyog这种可视化工具中手动导出 2.方法2:直接拷贝物理文件(就是data文 ...

  2. PHP文件上传至另一台服务器

    PHP程序上传文件时,想指定上传到另一台服务器. move_uploaded_file这个方法第二个参数指定的存放路径需要和php程序文件一个服务器,没办法指定其他服务器的地址,本人才疏学浅,哪位大哥 ...

  3. 定时备份SQL SERVER的数据库并且把备份文件复制到另外一台服务器

    需求介绍:每天备份线上正式库并且把备份文件复制到测试服务器,测试服务器自动把数据库备份文件还原. 方案介绍: 第1步:在正式库上创建存储过程用来备份数据库和复制到测试服务器,然后新建作业每天定时执行创 ...

  4. Mysql主数据库+备份数据库部署教程

    转:http://www.111cn.net/database/mysql/76450.htm 本文我们来讲讲Mysql主备如何部署,这里说的主是指Mysql主数据库,备是从数据库,备可以是多个,也可 ...

  5. Mysql 5.* 数据库备份及导入

    作者:邓聪聪 倒出数据文件 1) 导出数据和表结构: 进入数据库查看表结构 msql -u用户名 -p密码 msql -u用户名 -p密码 -S /var/lib/mysql/mysql.sock  ...

  6. MySQL基础 - 数据库备份

    出于安全考虑,数据库备份是必不可少的,毕竟对于互联网公司数据才是价值的源泉~ 距离mysql账号为icebug,密码为icebug_passwd, 数据库为icebug_db mysqldump -u ...

  7. mysql之数据库备份

    1.可视化工具Navicat for mysql进行操作数据库备份 (1)备份数据库 (2)将备份的数据库进行加载

  8. mysql:数据库备份方案

    1. 数据库备份方案     1)没备份,跑路~     2)全量备份+增量备份 如果不小心“删库”,可以这么恢复: a. 将最近一次全量备份的全库找到,拷贝回来(文件一般比较大),解压,应用: b. ...

  9. docker镜像打包成tar包,上传到另一台服务器

    需要打包的服务器操作: 一.需要打包的服务器执行以下操作 docker save -o node.tar.gz calico/node #  docker save -o  要打镜像包的名称  镜像 ...

  10. 实战-MySQL定时增量备份(2)

    概要 引言 增量备份 恢复增量备份 定时备份 引言 在产品上线之后,我们的数据是相当重要的,容不得半点闪失,应该做好万全的准备,搞不好哪一天被黑客入侵或者恶意删除,那就 gg 了.所以要对我们的线上数 ...

随机推荐

  1. 《Python魔法大冒险》006 变量的迷雾

    小鱼和魔法师走了很久,终于来到了一个神秘的森林前.这片森林与众不同,它被一层厚厚的迷雾所包围,仿佛隐藏着无尽的秘密. 小鱼好奇地看着这片森林:"这是什么地方?" 魔法师:这是魔法森 ...

  2. 最接地气的.NET微服务框架

    前言: "人必有所执,方能有所成",从2018年底我就开始规划要写一个.NET微服务框架,5年了,今天终于正式发布了. 正文: Wing 致力于打造一个功能强大.最接地气的.NET ...

  3. 二叉搜索树(Binary Search Tree,BST)

    二叉搜索树(Binary Search Tree,BST) 二叉搜索树(Binary Search Tree),也称二叉查找树或二叉排序树,是一种特殊的二叉树,它满足以下性质 对于二叉搜索树的每个节点 ...

  4. 月工资不到10元的内容审核专员? - ChatGPT 在内容自动审查中的应用

    内容过滤筛查是指对网络上发布或传播的文本.图片.视频等内容进行审核和监管,以防止出现违法违规.暴力色情.虚假广告.电信诈骗等现象,维护网络安全和社会秩序. 内容过滤筛查是一个亟待解决的问题,因为网络内 ...

  5. ClickHouse(15)ClickHouse合并树MergeTree家族表引擎之GraphiteMergeTree详细解析

    GraphiteMergeTree该引擎用来对Graphite数据(图数据)进行瘦身及汇总.对于想使用ClickHouse来存储Graphite数据的开发者来说可能有用. 如果不需要对Graphite ...

  6. Java面向对象编程的三大特性:封装、继承、多态。

    一.封装 封装的核心在于私有化(private),大部分情况下,来封装对象的属性,很少有封装方法的.通过将对象的属性封装,提供对外的公共方法来访问属性是最常见的方式. public static cl ...

  7. Kraft模式下Kafka脚本的使用

    Kafka集群 版本:V3.5.1 名称 Node1 Node2 Node3 IP 172.29.145.157 172.29.145.182 172.29.145.183 (1)查看Kraft集群中 ...

  8. C#桶排序算法

    前言 桶排序是一种线性时间复杂度的排序算法,它将待排序的数据分到有限数量的桶中,每个桶再进行单独排序,最后将所有桶中的数据按顺序依次取出,即可得到排序结果. 实现原理 首先根据待排序数据,确定需要的桶 ...

  9. 使用Spring Integration接收TCP与UDP请求

    1. 简介 Spring Integration 是一个开源的项目,它是 Spring 生态系统的一部分,旨在简化企业集成(Enterprise Integration)的开发.它提供了一种构建消息驱 ...

  10. 从输入URL到页面加载完都发生了什么

    1.浏览器的地址栏输入URL并按下回车. 2.浏览器查找当前URL是否存在缓存,并比较缓存是否过期. 3.DNS解析URL对应的IP. 4.根据IP建立TCP连接(三次握手). 5.HTTP发起请求. ...