mysql备份服务器中的_使用 Shell 备份远程服务器上的 MySQL 数据库到本机

适用场景:远程服务器上的 MySQL 不允许远程访问,此时我们需要先登录服务器,备份数据库后,将备份文件拉取到本机。

源码 mysqlDumpRemote2Local.sh

#!/bin/bash

################################################

# TODO: 登录远程服务器,备份指定数据库并下载到本地

# 示例:

# ./mysqlDumpRemote2Local.sh

#

# Author: whoru.S.Q

# Link: https://github.com/whorusq/linux-learning/blob/master/shell/mysqlDumpRemote2Local.sh

# Version: 1.0

################################################

# 待操作待服务器列表

# 格式:"描述,数据库名,数据库用户名,数据库密码,数据库端口号,SSH登录用户名,SSH服务器IP,SSH登录密码,SSH端口号"

HOSTS=(

"test,db_demo,root,pwd123456,3306,root,192.168.1.127,pwd3333,22"

)

HOSTS_LEN=`echo ${#HOSTS[*]}`

HOST_KEY=

# 服务器上备份文件的存放目录

DB_BACKUP_PATH=/opt/backup

# 当前脚本所处目录

BASE_PATH=$(cd "$(dirname "$0")";pwd)

# 入口

function main {

#检查基础设置

if [ "$HOST_LEN" == "0" ]; then

echo "您还没有配置待操作的服务器参数"

exit 1

fi

# 显示菜单

MENU="\n"

INDEX=1

for host in ${HOSTS[*]}

do

local host_name=`echo $host | awk -F ',' '{ print $1" ===> "$2}'`

MENU=$MENU"\t"$INDEX". "$host_name"\n"

INDEX=`expr $INDEX + 1`

done

echo -en $MENU"\n"

# 检查选择

checkChoice

# 开始导出操作

doDump

}

function checkChoice {

read -p "请输入序号选择待备份的数据库:" HOST_NUM

len=`echo "$HOST_NUM"|sed 's/[1-9]//g'`

if [ -n "$len" ]; then

ifGoon "输入有误,只支持1-9的数字,是否重新输入[y/n]:"

else

KEY=`expr $HOST_NUM - 1`

if [ $KEY -le $HOSTS_LEN ]; then

HOST_KEY=$KEY

else

ifGoon "未知的序号,是否重新输入[y/n]:"

fi

fi

}

function ifGoon {

echo -en "\033[32m==>\033[0m "

read -p $1 GOON

if [ "$GOON" == "y" ]; then

checkChoice

else

exit 0

fi

}

function doDump {

if [ -n "$SERVER_KEY" ]; then

echo "未知的序号"

exit 0

fi

# 从对应的配置中解析数据库和 SSH 参数

HOST=${HOSTS[$HOST_KEY]}

HOST_NAME=`echo $HOST | awk -F ',' '{ print $1 }'`

DB_NAME=`echo $HOST | awk -F ',' '{ print $2 }'`

DB_USER=`echo $HOST | awk -F ',' '{ print $3 }'`

DB_PWD=`echo $HOST | awk -F ',' '{ print $4 }'`

DB_PORT=`echo $HOST | awk -F ',' '{ print $5 }'`

SSH_USER=`echo $HOST | awk -F ',' '{ print $6 }'`

SSH_IP=`echo $HOST | awk -F ',' '{ print $7 }'`

SSH_PWD=`echo $HOST | awk -F ',' '{ print $8 }'`

SSH_PORT=`echo $HOST | awk -F ',' '{ print $9 }'`

# 备份文件名

DUMP_FILENAME=$HOST_NAME"_"`date +%Y%m%d%H%M%S`

echo -e "\n\033[32m==>\033[0m 操作开始 "

sleep 1

echo -e "\n\033[32m==>\033[0m 登录 ${HOST_NAME} 正式服务器,备份数据库"

sleep 1

expect -c "

spawn ssh ${SSH_USER}@${SSH_IP} -p ${SSH_PORT}

expect {

\"yes/no\" {send \"yes\n\"; exp_continue;}

\"*assword\" { send \"${SSH_PWD}\r\n\"; exp_continue ; sleep 3; }

\"Last*\" { send_user \"\n 登录成功 \n\";}

}

expect \"*]#\"

send \"ls ${DB_BACKUP_PATH} &>/dev/null && cd ${DB_BACKUP_PATH} || mkdir -p ${DB_BACKUP_PATH} && cd ${DB_BACKUP_PATH} \r\"

send \"mysqldump -u${DB_USER} -p${DB_PWD} -P ${DB_PORT} ${DB_NAME} > ${DUMP_FILENAME}.sql \r\"

send \"tar -zcvf ${DUMP_FILENAME}.tar.gz ${DUMP_FILENAME}.sql \r\"

send \"exit \r\"

interact

"

echo -e "\n\033[32m==>\033[0m 退出 ${HOST_NAME} 正式服务器 \n"

sleep 1

echo -e "\n\033[32m==>\033[0m 将备份文件拉取到本机 \n"

sleep 1

expect -c "

spawn scp -P $SSH_PORT $SSH_USER@$SSH_IP:$DB_BACKUP_PATH/$DUMP_FILENAME.tar.gz $BASE_PATH

expect {

\"*assword\" { send \"${SSH_PWD}\r\n\"; exp_continue ; }

}

"

echo -e "\n\033[32m==>\033[0m 操作结束,文件位置:"$BASE_PATH/$DUMP_FILENAME.tar.gz" \n"

}

# 运行

main

使用示例:

➜ ./mysqlDumpRemote2Local.sh

1. test ===> db_demo

请输入序号选择待备份的数据库:1

==> 操作开始

==> 登录 test 正式服务器,备份数据库

spawn ssh root@192.168.1.127 -p 22

root@192.168.1.127's password:

Last login: Tue Nov 13 13:43:53 2018 from xxxxxxxxx

登录成功

[root@ test ~]# ls /opt/backup &>/dev/null && cd /opt/backup || mkdir -p /opt/backup && cd /opt/backup

[root@ test backup]# mysqldump -uroot -ppwd123456 -P 3306 db_demo > test_20181113135359.sql

Warning: Using a password on the command line interface can be insecure.

[root@dbhs backup]# tar -zcvf test_20181113135359.tar.gz test_20181113135359.sql

test_20181113135359.sql

[root@dbhs backup]# exit

logout

Connection to 192.168.1.127 closed.

==> 退出 test 正式服务器

==> 将备份文件拉取到本机

spawn scp -P 22 root@192.168.1.127:/opt/backup/test_20181113135359.tar.gz /Users/xxxxx/mydev/linux-learning/shell

root@218.29.103.28's password:

test_20181113135359.tar.gz 100% 66KB 941.5KB/s 00:00

==> 操作结束,文件位置:/Users/xxxxx/mydev/linux-learning/shell/test_20181113135359.tar.gz

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

date转timestamp格式_技术分享 | MySQL:timestamp 时区转换导致 CPU %sy 高的问题

作者:高鹏文章末尾有他著作的《深入理解 MySQL 主从原理 32 讲》,深入透彻理解 MySQL 主从,GTID 相关技术知识。本文为学习记录,可能有误请谅解。本文建议PC端观看,效果更佳。这个问题是一个朋友遇到的风云&#xff0c…

mysql架构组成_第 2 章 MySQL 架构组成

麻雀虽小,五脏俱全。MySQL 虽然以简单著称,但其内部结构并不简单。本章从MySQL物理组成、逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成,希望能够让读者对 MySQL 有一个更全面深入的了解。2.1 MySQL物理文…

python列表生成器语法_python列表生产式和生成器

1.列表生成式:通过简洁的语法可以对一组元素进行过滤 格式:[exp for val in collection if condition] 例子1: a [x*xforxinxrange(1,10)ifx%20] print(a) 1)append(): 该方法用于在列表末尾添加新的对象,…

win2008 mysql端口_使用自定义端口连接SQL Server 2008的方法

使用过SQL Server的人大多都知道,SQL Server服务器默认监听的端口号是1433,但是我今天遇到的问题是我的机器上有三个数据库实例,这样使用TCP/IP远程连接时就产生了问题。如何在Microsoft SQL Server Management Studio里加入端口号连接呢&…

python基本命令range_Python的Range()函数(指南)

当需要执行特定次数的操作时,Python内置的range函数十分方便。 读罢本文,你将: 理解Python的range函数是如何工作的 了解Python 2和Python 3中的实现方式有何不同 看过了不少range()函数操作实例 有能力解决它的一些局限性 让我们开始吧&…

天涯python_python 網絡爬蟲(一)爬取天涯論壇評論

我是一個大二的學生,也是剛接觸python,接觸了爬蟲感覺爬蟲很有趣就爬了爬天涯論壇,中途碰到了很多問題,就想把這些問題分享出來,都是些簡單的問題,希望大佬們以寬容的眼光來看一個小菜鳥😄&…

python快递费用计算_[Python]简单用Python写个查询快递的程序最后附源代码

[Python] 纯文本查看 复制代码from requests_html import HTMLSession session HTMLSession() def sb(dh): 用来识别快递 返回快递种类! url http://www.kuaidi100.com/autonumber/autoComNum?resultv21&text dh header { Referer: http://www.kuaidi100.com/, User-A…

qos的_QoS 概述

QoS 是一个很大的领域,涉及到网络中的多个层次和环节。本文仅简要的谈谈 Endpoint 侧的 QoS 概念,将这些纷繁的概念名词串起来,便于理解。QoS 技术背景下图说明了 QoS workflow 中,各项技术的位置和关系摘自 < 端到端Q…

为什么python 为什么没有接口_python做接口测试的必要性

什么是接口测试 接口测试主要用于检测外部系统与内部系统之间,以及系统内部各 个子系统之间的交互点。其测试的重点是,检查数据的交换、传递和控 制管理过程,以及系统间的逻辑依赖关系等。 为什么要做接口测试 1.传统的测试方法成本急剧增加&…

路由器mysql密码重置密码_【验证】mysql root密码恢复

1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的状态下,其他的用户也可以任意地登录和修改MySQL的信息。可以采用将MySQL对外的…

centos daemonize_手把手教你在centos上配置Django项目(超详细步骤)

前言关于Django的部署,本人也踩了很多坑,这篇文章一步一步教你怎么进行部署,只需要你按照我的步骤来就OK了!这里我们使用的服务器是一个全新的服务器,没有安装任何东西。基础环境搭建步骤★ 注意:下面的步骤…

mysql8.0.17压缩包安装教程_mysql 8.0.16 压缩包安装配置方法图文教程

本文为大家分享了mysql 8.0.16 压缩包安装配置方法,供大家参考,具体内容如下运行环境:windows 10 x641、下载zip安装包:mysql8.0 for windows zip包:,进入页面后可以不用登录。后点击底部“no thanks, just…

python收集数据程序_基于Python语言的互联网数据收集软件的设计

软件建立所需的工具及其版本 编写环境与 IDE Python3.5.2 Windows10 PyCharm 2016.3 Sublime Text3 第三方库与版本号 Requests 2.12.1 BeautifulSoup 4.5.1 PYQT5 5.8.1 Pyinstaller 库的作用 用于爬虫编写 用于爬虫编写 用于软件 GUI 设计 用于封装 python 程序 1.1 百度地图…

Mysql保存是事件驱动吗_【CHRIS RICHARDSON 微服务系列】事件驱动的数据管理-5

编者的话 |本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的第五篇文章。第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点;第二和第三篇描述了微服务架构模块间通讯的不同方面;第四篇研究了服务发现中…