最近遇到很多业务需求,需要进行数据导出工作,由于有格式要求,故之前一直使用mysqldump的方法。

mysqldump -uuser -ppassword -S mysql.sock -t db table -T /data1/dbatemp/

  当然可以根据需求增加分隔符和行结束符。--fields-terminated-by和--lines-terminated-by,其他也可以增加where条件进行检索,可以自行使用--help查询。

  但是后续由于业务需求比较频发,同事需求数据容量越来越大,已经不适合在localhost进行操作,需要一台中心管理机来统一进行管理,这时候mysqldump加-T参数导出CSV格式只能在本地操作的局限性就不能满足要求了。于是开始转而需求其他方法,研究了一下percona的工具pt-archive,发现可以满足我们的需求,于是开始使用,但是在实际使用过程中发现一个问题,导致pt-archinve完全无法使用,这就是速度问题。同mysqldump对比,pt-archive的速度完全无法接受,经过实际测试,不加参数的pt-archive比mysqldump要慢很多,属于完全无法使用状态。

  我们的实验环境如下,mysql版本5.5,服务器是12块盘的SAS服务器,目标数据库表大小872M。

  使用mysqldump的导出信息如下:

time mysqldump -uroot -p -S /tmp/mysql10010.sock -t gemini table_definition_20130821 -T /data1/dbatemp/mysql10010/ 

real    0m9.679s
user 0m0.004s
sys 0m0.001s

  使用pt-archive的导出信息如下:

time pt-archiver --source u=root,p=,h=localhost,S=/tmp/mysql10010.sock,D=gemini,t=table_definition_20130821 --no-delete --where "1=1" --no-check-charset --file=/data1/dbatemp/mysql10010/4.txt  --statistics

real    9m5.620s
user 3m58.810s
sys 0m38.124s

  一个9s多,一个9m多,相差近60倍,导致pt-archive完全无法使用。根据--statistics的输出结果我们可以看到select占了很大一部分。

Action          Count       Time        Pct
select 1065539 294.1826 52.01
commit 1065539 54.3843 9.62
print_file 1065538 8.0095 1.42
other 0 209.0001 36.95

  从而我们的加速思路即为如何减少select占用的时间,开启general log之后,发现为一个大select后跟着一个commit,众所周知,大select的查询效率非常慢。那么我们尝试这将一个大select分片成很多个小select,看看会不会降低查询时间。这里就要使用--limit参数了。

time pt-archiver --source u=root,p=,h=localhost,S=/tmp/mysql10010.sock,D=gemini,t=table_definition_20130821 --no-delete --where "1=1" --no-check-charset --file=/data1/dbatemp/mysql10010/4.txt --limit=1000 --statistics

real    3m13.553s
user 2m15.873s
sys 0m26.648s Action Count Time Pct
commit 1065539 46.1518 23.86
print_file 1065538 6.2581 3.24
select 1067 4.6308 2.39
other 0 136.3800 70.51

  从上面可以看出增加了--limit参数之后,速度快了很多,基本是原来不加参数的1/3,但是和dump比较还是相差很多,仍然有将近20倍的差距,还处于不可用状态。根据状态分析,这次commit所占的时间比较多。再次查看general log,发现一次select后,跟着n个commit,导致commit的时间非常大。思考采用--txn-size参数来控制commit的次数。


time pt-archiver --source u=root,p=,h=localhost,S=/tmp/mysql10010.sock,D=gemini,t=table_definition_20130821 --no-delete --where "1=1" --no-check-charset --file=/data1/dbatemp/mysql10010/4.txt --limit=1000 --txn-size=1000 --statistics
real    1m57.196s
user 1m41.504s
sys 0m10.627s Action Count Time Pct
print_file 1065538 4.9122 4.19
select 1067 4.4760 3.82
commit 1066 0.1161 0.10
other 0 107.5997 91.88

  增加txn-size之后,速度再次提高,提升幅度在30%,虽然标准值仍和mysqldump比有较大差距。从状态分析结果看,主要时间消耗再other上了,但是由于输出没有明确指向,故有很多可能。只能在从pt-archive的参数中查找看是否还有优化的选项。

  首先,尝试加入--buffer参数,并没明显提高

Action          Count       Time        Pct
select 1067 5.1447 4.40
print_file 1065538 0.3666 0.31
commit 1066 0.1133 0.10
flush 1066 0.0173 0.01
other 0 111.2178 95.17 real 1m56.989s
user 1m45.411s
sys 0m7.626s

  然后加入--ascend-first参数测试

Action          Count       Time        Pct
select 1067 4.6041 4.31
commit 1066 0.1501 0.14
flush 1066 0.0101 0.01
print_file 1065538 -0.4222 -0.40
other 0 102.4029 95.93 real 1m46.876s
user 1m34.415s
sys 0m6.143s

  可以看出仍然变化不大,经过多次测试之后,添加只使用主键参数可以将时间缩减近1m之内。

time pt-archiver --source u=root,p=,h=localhost,S=/tmp/mysql10010.sock,D=gemini,t=table_definition_20130821 --no-delete --where "1=1" --no-check-charset --statistics --buffer --limit= --commit-each --no-check-charset --primary-key-only --share-lock --file=/data1/dbatemp/mysql10010/.txt

Action          Count       Time        Pct
select 1.1020 1.94
commit 0.0358 0.06
flush 0.0009 0.00
print_file -5.2057 -9.18
other 60.7444 107.18 real 0m56.810s
user 0m54.604s
sys 0m0.629s 

pt-archive提速的实践经验的更多相关文章

  1. CI Weekly #6 | 再谈 Docker / CI / CD 实践经验

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  2. 根据实践经验,讲述些学习Java web能少走的弯路,内容摘自java web轻量级开发面试教程

    在和不少比较上进的初级程序员打交道的过程中,我们总结出了一些能帮到合格程序员尽快进阶的经验,从总体上来讲,多学.多实践不吃亏.本文来是从 java web轻量级开发面试教程从摘录的. 1  哪些知识点 ...

  3. 华为云对Kubernetes在Serverless Container产品落地中的实践经验

    华为云容器实例服务,它基于 Kubernetes 打造,对最终用户直接提供 K8S 的 API.正如前面所说,它最大的优点是用户可以围绕 K8S 直接定义运行应用. 这里值得一提是,我们采用了全物理机 ...

  4. 关于Flask使用Celery的实践经验分享

      最近大Boss反馈Celery经常出现问题,几经实践终于把问题解决了!于是乎有了这篇博客的诞生,算是一个实践经验的分享吧! 软件版本如下: Celery () Flask () RabbitMQ( ...

  5. 领域驱动设计(DDD)的实践经验分享之ORM的思考

    原文:领域驱动设计(DDD)的实践经验分享之ORM的思考 最近一直对DDD(Domain Driven Design)很感兴趣,于是去网上找了一些文章来看看,发现它确实是个好东西.于是我去买了两本关于 ...

  6. 领域驱动设计(DDD)的实践经验分享之持久化透明

    原文:领域驱动设计(DDD)的实践经验分享之持久化透明 前一篇文章中,我谈到了领域驱动设计中,关于ORM工具该如何使用的问题.谈了很多我心里的想法,大家也对我的观点做了一些回复,或多或少让我深深感觉到 ...

  7. Sobol 序列并行化的实践经验

    目录 Sobol 序列并行化的实践经验 随机数发生器并行化的常见策略 Sobol 序列的原理和跳转功能 Sobol 序列并行化实践 分块策略 蛙跳策略 蛙跳策略的计算量分析 减少异或计算的技巧 分块策 ...

  8. AJAX跨域与JSONP的一点实践经验

    前几个周,项目中遇到了AJAX跨域的问题,然后找资料解决了. 首先要说明一点,关于AJAX的跨域原理和实践,我的经验还是比较少的,我只是大致看了下网上的资料,结合自己的理解,找到了解决办法,暂时不去仔 ...

  9. 在单体应用的一些DDD实践经验

    阅读此文需要一定的DDD基础,如果你是第一次接触DDD读者,建议先去阅读一些DDD相关的书籍或者文章之后再来阅读本文. 背景 自从我在团队中推行DDD以来,我们团队经历了一系列的磨难--先是把核心项目 ...

随机推荐

  1. 关于linux系统如何实现fork的研究(二)【转】

    转自:http://www.aichengxu.com/linux/7166015.htm 本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 前一篇关于li ...

  2. Power Profiles for Android

    http://source.android.com/devices/tech/power.html Battery usage information is derived from battery ...

  3. 利用Google API生成二维码

    什么是二维码:二维码是二维条形码的一种,可以将网址.文字.照片等信息通过相应的编码算法编译成为一个方块形条码图案,手机用户可以通过摄像头和解码软件将相关信息重新解码并查看内容.读取方式:利用30万画素 ...

  4. oracle 一个网站

    http://www.oracle.com/technetwork/cn/articles/11g-pivot-101924-zhs.html

  5. LightOJ 1323 Billiard Balls(找规律(蚂蚁爬木棍))

    题目链接:https://vjudge.net/contest/28079#problem/M 题目大意: 一个边界长为L宽为W的平面同时发射n个台球,运动K秒,台球碰到桌面及两(多)个台球相撞情况如 ...

  6. IOS-优质应用推荐

    壁纸应用 cuto 免费 点击下载 shots 收费 点击下载 Cutisan 锁屏壁纸制作下载地址 待办事项 TodayMind - 提醒事项触手可及 点击下载 滴答清单 点击下载 Microsof ...

  7. Mysql学习之order by的工作原理

    在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求.假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名.年龄. 查询语句为: ; 全字段排序 为 ...

  8. mvc部署

    权限中加入windows 2008中加入SERVICE,windows2003中加入NETWORK SERVICE

  9. 【LOJ】#2174. 「FJOI2016」神秘数

    题解 这道题的结论很显然= = 就是暴力求的话,把一个区间的数排一下序,如果当前这个数大于前面所有数的前缀和+1,那么前缀和+1即我们所求的答案 那么我们设置一个当前答案(初始为1),在主席树上求出来 ...

  10. 开源IDS系列--snorby 进程正常,但是worker无法启动 The Snorby worker is not currently running

    设置页面报错:   The Snorby worker is not currently running. It's imperative you start the worker immediate ...