使用shell分页读取600万+的MySQL数据脚本

shell-mysql (1)脚本背景: 由于要在Linux上,远程读取mysql的表的数据,然后做一定清洗后,把数据上传至Hadoop集群中,使用Java写吧,感觉太麻烦了,得在Win上开发好,还得打成jar包, 上传到Linux上,如果那里出了问题,还得重复这样,非常不方便,那就用shell写一个吧,也不需要什么jdbc驱动包,只需要在Linux上装个MySQL的 客户端即可,用一行yum命令即可搞定,所以就花了点时间,封装了一个小脚本 (2)功能介绍: 直接在Linux下使用shell脚本远程分页读取MySQL表的数据的一个小脚本,已测过读取600万+的数据 效率与jdbc相差无几 (3)脚本介绍: 主要有三个脚本构成 1,page.sh 这是一主脚本,里面定义了分页的条件,大家看下便知 2,f.sh 一个小包装的脚本吧,里面会用sed去掉表头一些信息 3,port.sh 分页读取数据的执行脚本 (4)如何使用? 使用非常简单,需要改下page.sh里面的查询字段,以及分页查询的数量,默认是10000,然后执行sh page.sh databaseName tableName传入数据库名和表名即可 Github项目地址

Shell代码

  1. #第一个参数表名
  2. #第二个参数是start
  3. #第三个参数是offset
  4. #分页读取数据后,删除第一行表头,并写入一个文件中,文件名与表名一样
  5. sh port.sh $1 $2 $3 | sed '1d' >> tables/$1
  6. #删除无用的html字符
  7. #sed -i 's/<[^>]*>//g;/^$/d' tables/$1
  8. #删除无用的一些特殊符号
  9. #sed -i 's/[a-zA-Z\.():;><-]//g' tables/$1

Shell代码

  1. #登陆mysql,负责查询某个表数据总量
  2. MYSQL=`which mysql`
  3. count=`$MYSQL -hmysqlhost --default-character-set=utf8 -P3306 -uname -ppwd <<EOF
  4. use $1;
  5. select count(1) from $2 ;
  6. EOF`
  7. #得到某一个表的总数量
  8. count=`echo "$count" | sed '1d' `
  9. #定义一个每页读取的最大数量
  10. pageSize=10000
  11. #计算总共的分页数
  12. totalPage=0;
  13. #判断总数量,求模是否等于0,等于0,就是相除多少页
  14. temp=` echo "$count%$pageSize" | bc `
  15. if [ 0 -eq $temp ] ;then
  16. totalPage=`echo "$count/$pageSize" | bc`
  17. else
  18. #否则,就是相除后+1,作为总的分页数
  19. totalPage=`echo "$count/$pageSize+1" | bc`
  20. fi
  21. echo "总数量:$count 每页读取数量:$pageSize 分页数量:$totalPage"
  22. #把总页数减一,方便分页处理,因为后面咱的下标从0开始
  23. totalPage=`echo "$totalPage-1" | bc `
  24. #echo "处理后:$totalPage"
  25. #for循环遍历总页数
  26. for page in `seq 0 $totalPage`
  27. do
  28. #计算每页的偏移量
  29. offset=`echo "$page*$pageSize" | bc `
  30. echo "当前处理到第$page页,分页信息: limit $offset $pageSize "
  31. ###第一个参数表名
  32. ###第二个参数偏移量
  33. ###第三个参数每页读取数据
  34. #调用f.sh获取数据
  35. sh f.sh $1 $offset $pageSize
  36. done
  37. #sed -i 's/<[^>]*>//g;/^$/d' tables/$1
  38. #sed -i 's/[a-zA-Z\.():;><-]//g' tables/$1

Shell代码

  1. #连接mysql
  2. # -h主机地址 -u用户名 -p密码
  3. #下面的语句,是登陆到数据库后,使用某个数据库,然后根据条件查询表
  4. MYSQL=`which mysql`
  5. $MYSQL -hmysqlhost --default-character-set=utf8 -P3306 -uname -ppwd <<EOF
  6. use db_conform;
  7. select concat_ws('#',ifNull(id,''),ifNULL(title,''),ifNULL(replace(replace(replace(content ,'\n','' ), '\r' , '' ),'#','' ) ,''),ifNULL(doc_no,'')) from $1 limit $2 , $3 ;
  8. EOF
  9. #echo $query

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2015-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP在线

PHP使用SOAP调用.net的WebService问题

项目的需求,需要和一个.net系统进行数据交换,合作方提供了一个WebService接口。这个与一般的PHP POST或GET传值再查库拿数据的思路有点不一样,...

3596
来自专栏LanceToBigData

linux(七)之linux系统中查找文件

前面介绍一篇文章介绍了关于vi编辑器的使用,感觉是不是那么多的命令怎么记得住呀,小编也是这样让认为的,但是慢慢的发现,其实还是很有意思的。正所谓熟能生巧多练习,...

28910
来自专栏云计算教程系列

如何在Ubuntu 18.04上使用RVM安装Ruby on Rails

Ruby on Rails是一个流行的Web应用程序框架,旨在帮助您开发成功的项目,同时编写更少的代码。为了使Web开发变得有趣并且受到强大社区的支持,Ruby...

4270
来自专栏用户2442861的专栏

Visual Stdio的中的dll和lib

http://blog.csdn.net/dodomouse/article/details/12843821

681
来自专栏黑泽君的专栏

用gcc编译c语言程序以及其编译过程

对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言的执行过程,加深对c语言的理解很重要!!!

1361
来自专栏逆向与安全

GDB多线程调试分析

多线程调试的主要任务是准确及时地捕捉被调试程序线程状态的变化的事件,并且GDB针对根据捕捉到的事件做出相应的操作,其实最终的结果就是维护一根叫thread li...

1090
来自专栏Java进阶之路

nginx配置自定义变量实现日志动态分发

Nginx是一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存。下载地址:www.nginx.org。

2992
来自专栏散尽浮华

nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理

Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案。nginx可以用轮询、IP哈希、URL哈希等方式...

7046
来自专栏Laoqi's Linux运维专列

Linux入门到精pao通lu

2884
来自专栏Python绿色通道

Python分布式进程

分布式进程是指的是将Process进程分布到多台机器上,充分利用多台机器的性能完成复杂的任务。在Thread和Process中,应当优选Process,因为Pr...

1341

扫码关注云+社区

领取腾讯云代金券