`
pda158
  • 浏览: 189836 次
社区版块
存档分类
最新评论

使用ssh远程执行命令批量导出数据库到本地

阅读更多
前天正在跟前端的同事调试功能。服务器开好,模拟的玩家登录好,就在倒计时。这时突然运营的同事跑过来说要统计几个服务器玩家的一些情况,也就是需要从几个服的数据库导出部分玩家的数据。好吧,我看了一下时间,11:47。心想,跟前端调试完,去吃个饭再午休一下那就下午再给吧。没想对方来一句"就导个数据库而已,要这么久么?",而且还是直接跟我上司说的。我嚓,好吧,我导。可问题来了,平时的统计是由php做的,批量部署这些是由运维做的。服务端完全没有对应的工具。而且服务器是在阿里云上的,数据库的用户是限制了ip段登录的,我所在的ip没法登录的。于是,只好终止调试,切ip,写sql,然后用navicat手动一个个服务器导出数据到excel。
  事后想想,还是写个脚本吧,不然以后还是会被坑的。
  从环境来看,数据库不能直接登录,没法直接导出。不过可以由运维提供key通过ssh登录到远程服务器再将数据导出到本地。
  先配置ssh通过key登录服务器。这里略过...
  然后就是通过ssh执行命令。先看一下ssh的帮助文档:
  usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
  [-D [bind_address:]port] [-E log_file] [-e escape_char]
  [-F configfile] [-I pkcs11] [-i identity_file]
  [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec]
  [-O ctl_cmd] [-o option] [-p port]
  [-Q cipher | cipher-auth | mac | kex | key]
  [-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port]
  [-w local_tun[:remote_tun]] [user@]hostname [command]
  最后一项就是执行指令的。假如远程服务器地址为180.97.33.108,开启的ssh端口为998,ssh用户名为xzc,然后想通过在远程服务器上执行命令ls,那么脚本应该这么写:
  ssh xzc@180.97.33.108 -p 998 "ls"
  如果ssh的认证key已配置好,那么会把登录后当前目录下的文件列出来,当然第一次登录会提示保存远程服务器的指纹。现在是要导出数据库的数据,那么需要把ls命令换成导出数据库的命令。
  echo "select * from user;" | mysql xzc_db -uxzc -pxzcpwd
  #或者
  mysql xzc_db -uxzc -pxzcpwd -e "select * from user"
  上面两命令都可以使用数据库用户xzc,密码xzcpwd从数据库xzc_db打印出user表,使用的是默认的本地数据库地址localhost,默认的端口。如果不是默认,需要指定。
  登录OK了,打印也OK了,那么下一步就是导出到文件了。这在bash也就是一个 > 的事。把上面的命令拼起来就是:
  ssh xzc@180.97.33.108 -p 998 'echo "select * from user;" | mysql xzc_db -uxzc -pxzcpwd' > user.txt
  这样就把user表导出来本地的user.txt中了。注意"> user.txt"如果放到 ''里则是在远程服务器执行,导出的文件在远程服务器。文件现在也有了,不过是txt,这样交给运营不太好吧。那就导出excel吧。不过遗憾的是我查了N多资料,也找不到mysql不依赖第三方插件或工具导出原生excel的方法。而navicat导出的可是货真价实的excel,如果用notepad++之类的文本工具打开是会乱码的,并且导出的文件不会有编码问题。幸好如果一个txt以tab分割的话,excel也是能认得出来的。于是把user.txt改名user.xls就可以了。但这样做的问题是excel会按自己的方式处理内容的。比如把一个很大的数字转换成科学记数法形式。这些都得手动去处理一下了。
最后,就是写成脚本批量操作了。附上我使用的脚本一个:
  #!/bin/bash
  # 通过ssh远程执行远程指令
  # 需要先部署key认证,保证ssh只需要ip、port即可连接
  # 如果需要和远程服务器交互,请参考ssh的-t、-tt参数
  # 如果需要反复登录服务器执行多条指令,请使用ssh的通道重用
  # 参考:http://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing
  # 使用通道需要注意退出通道,如"ssh github.com -O exit"或者"ssh github.com -O stop"
  #                                              --by coding my life
  #分别设置ssh用户名、数据库用户名、数据库密码、导出数据
  SSH_USER='xzc_ssh'
  DB_USER='xzc_db'
  DB_PWD='xzc_db_pwd123'
  EXP_PATH=export_data/
  # 执行远程命令
  # $1 服务器ip
  # $2 ssh端口
  # $3 指令
  function exec_remote_command()
  {
  ssh $SSH_USER@$1 -p $2 '$3'
  }
  # 执行远程sql,导出数据
  # $1 服务器ip
  # $2 ssh端口
  # $3 指令,多个sql指令如select * from user;select * from bag;也可执行,但结果将会写到同一个文件
  # s4 服务器
  # $5 导出文件
  function export_remote_sql()
  {
  echo export from $4 ...
  cmd="echo \"$3\" | mysql $4 -u$DB_USER -p$DB_PWD --default-character-set=utf8"
  ssh $SSH_USER@$1 -p $2 "$cmd" > $EXP_PATH$4_$5    #如果要导出到远程服务器,将把 > $EXP_PATH$4_$5放到cmd中
  }
  # $1 区服名
  # $2 ip
  # $3 端口
  function exec_sqls()
  {
  cat SQLS | while read sql ; do
  fc=${sql:0:1}
  if [ "#" == "$fc" ]; then    #被注释的不处理
  continue
  fi
  #sql语句中包含空格,不能再以空格来区分。最后一个空格后的是导出的文件名
  exp_file="${sql##* }"                #两个#表示正则以最大长度匹配*和一个空格(*后面的空格),截取余下的赋值给exp_file
  sql_cmd="${sql%% $exp_file}"         #两个%表示从右至左删除%%以后的内容
  export_remote_sql $2 $3 "$sql_cmd" $1 "$exp_file"
  done
  }
  # 需要在当前目录下创建服务器列表文件SERVERS,格式为"数据库名 ip ssh端口",如"xzc_game_s99 127.0.0.1 22"
  # 需要在当前目录下创建sql命令列表文件SQLS,格式为"sql语句 导出的文件",如"select * from user; user.xls"
  # 多个sql请注意用;分开,sql必须以;结束
  # 文件名中不能包含空格,最终导出的文件为"数据库名_文件名",如"xzc_game_s99_user.xls"
  mkdir -p $EXP_PATH
  cat SERVERS | while read server ; do
  fc=${server:0:1}
  if [ "#" == "$fc" ]; then    #被注释的不处理
  continue
  fi
  name=`echo $server|awk '{print $1}'`
  ip=`echo $server|awk '{print $2}'`
  port=`echo $server|awk '{print $3}'`
  exec_sqls $name $ip $port
  done
  当前目录下的文件如下,其中SERVERS是服务器列表,里面指定数据库名,ip,ss端口,SQLS则指定sql指令及导出的文件名。这两个文件里以#开头的都不会处理:
  xzc@xzc-HP-ProBook-4446s:~/桌面/remote_cmd$ ls
  remote_cmd.sh  SERVERS  SQLS
  xzc@xzc-HP-ProBook-4446s:~/桌面/remote_cmd$ cat SERVERS
  xzc_game_s99 120.0.0.99 6162
  xzc_game_s91 120.0.0.91 6162
  xzc_game_s92 120.0.0.92 6162
  xzc_game_s93 120.0.0.93 6162
  xzc_game_s94 120.0.0.94 6162
  #xzc_game_s91 120.0.0.91 6162
  xzc@xzc-HP-ProBook-4446s:~/桌面/remote_cmd$ cat SQLS
  #select * money from money; money.xls
  select * from user; user.xls
  xzc@xzc-HP-ProBook-4446s:~/桌面/remote_cmd$
  到这里,脚本基本完成了要求。
4
2
分享到:
评论

相关推荐

    linux下使用ssh远程执行命令批量导出数据库到本地

    主要介绍了linux下使用ssh远程执行命令批量导出数据库到本地,需要的朋友可以参考下

    数据库审计系统需求说明.docx

    内置高危SQL查询和注入、远程命令执行、跨站脚本攻击、 FTP和telnet高危指 令等审计规则不少于 300种。 规则可支持导入、导出、优先级调整、分组、批量加载等。 9 白名单 支持用户名、操作类型、IP地址、客户端工具...

    最新SQLyog MySQL GUI x86 11.2.0-4 Ultimate 多语言版本 带序列号

    一款图形化界面的MySQL数据库管理工具,可以让你轻松的远程维护数据库。该工具主要包含以下功能: (1)小巧的自动完成。 (2)HTTP/HTTPS和SSH通道。 (3)向导化的汇入工具包。 (4)结构化的同步,可以设定任务...

    Webyog SQLyog Ultimate 12.0.9中文版注册版.rar

    通过互联网你能够在任何地方远程管理你的MYSQL数据库,支持HTTP/HTTPS/SSH安全通道,能够批量导入各种类型的数据,速度极快的SQL脚本执行速度,完全智能化的SQL自动完成语句,支持使用SSL加密隧道,使用客户端认证...

    Hadoop权威指南(中文版)2015上传.rar

    使用远程调试器 作业调优 分析任务 MapReduce的工作流 将问题分解成MapReduce作业 运行独立的作业 第6章 MapReduce的工作机制 剖析MapReduce作业运行机制 作业的提交 作业的初始化 任务的分配 任务的执行 进度和状态...

    Hadoop权威指南 第二版(中文版)

     使用远程调试器  作业调优  分析任务  MapReduce的工作流  将问题分解成MapReduce作业  运行独立的作业 第6章 MapReduce的工作机制  剖析MapReduce作业运行机制  作业的提交  作业的初始化  任务的分配 ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    4.1.2 使用JDBC执行数据库访问 180 4.1.3 使用WebLogic服务器管理的 数据源 182 4.1.4 使用JBoss服务器管理的数据源 187 4.2 事务和JTA 191 4.2.1 事务的基本概念 191 4.2.2 分布式事务处理、XA规范和 2PC协议 192 ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    09 基于tcp实现远程执行命令测试结果 10 粘包现象 11 粘包解决方法 第31章 01 上节课复习 02 socketserver实现并发 03 socketserver模块介绍 04 socketserver源码分析tcp版本 05 socketserver源码分析udp版 06 ftp...

    java开源包5

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包8

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    JAVA上百实例源码以及开源项目

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,...

    JAVA上百实例源码以及开源项目源代码

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,...

    java开源包1

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包11

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包2

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包3

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包6

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

Global site tag (gtag.js) - Google Analytics