数据导入导出工具pt-archiver
工具可以将MySQL的表数据导出到一个新表或者一个文件,也有自己的应用场景,比如数据归档,删除数据,数据合并等。
具体用法:
pt-archiver [OPTIONS] --source DSN --where WHERE

PT工具链接参数DSN一般适用于所有toolkit工具。
DSN的详细参数:
a:查询
A:字符集
b:true代表禁用binlog
D:数据库
u:数据库链接账号
p:数据库链接密码
h:主机IP
F:配置文件位置
i:是否使用某索引
m:插件模块
P:端口号
S:socket文件
t:表

具体使用,从一张表导入到另外一张表,要注意的是新表必须是已经建立好的一样的表结构,不会自动创建表,而且where条件是必须指定的:
[root@mxqmongodb2 bin]# ./pt-archiver --source h=172.16.16.35,P=3306,D=tpcc,t=new_orders,u=root,p=123456 --dest h=172.16.16.35,P=3306,D=test,t=new_orders,u=root,p=123456 --no-check-charset --where 'no_o_id>3800' --progress 1000 --no-delete --limit=1000 --statistics
TIME ELAPSED COUNT
2017-06-21T11:44:15 0 0
2017-06-21T11:45:20 64 1000
2017-06-21T11:46:24 128 2000
2017-06-21T11:47:28 192 3000
2017-06-21T11:48:31 255 4000
2017-06-21T11:49:34 318 5000
2017-06-21T11:50:39 383 6000
2017-06-21T11:51:41 445 7000
2017-06-21T11:52:45 509 8000
2017-06-21T11:53:48 572 9000
2017-06-21T11:53:52 576 9056
Started at 2017-06-21T11:44:15, ended at 2017-06-21T11:53:52
Source: D=tpcc,P=3306,h=172.16.16.35,p=...,t=new_orders,u=root
Dest: D=test,P=3306,h=172.16.16.35,p=...,t=new_orders,u=root
SELECT 9056
INSERT 9056
DELETE 0
Action Count Time Pct
commit 18114 568.6790 98.71
inserting 9056 4.9776 0.86
select 11 0.0689 0.01
other 0 2.4091 0.42

我们打开general_log,发现这个操作是一条一条执行的,每一条数据都是一个事物。例如下面:
2017-06-21T03:03:08.328427Z 17054 Query INSERT INTO `test`.`new_orders`(`no_o_id`,`no_d_id`,`no_w_id`) VALUES ('3230','7','1')
2017-06-21T03:03:08.328819Z 17054 Query commit
2017-06-21T03:03:08.362113Z 17053 Query commit
2017-06-21T03:03:08.362565Z 17054 Query INSERT INTO `test`.`new_orders`(`no_o_id`,`no_d_id`,`no_w_id`) VALUES ('3231','7','1')
2017-06-21T03:03:08.362977Z 17054 Query commit

而且整个处理过程不会对原表进行锁定,对于作为导出工具来说很优秀了。
具体使用,将表中数据导出到文件:
可以看下导出到文件:
[root@mxqmongodb2 bin]# ./pt-archiver --source h=172.16.16.35,P=3306,D=tpcc,t=new_orders,u=root,p=123456 --no-check-charset --where 'no_o_id>3800' --progress 1000 --no-delete --file "/home/sa/pt-archiver.dat" --limit=1000
TIME ELAPSED COUNT
2017-06-21T13:39:01 0 0
2017-06-21T13:39:02 0 1000
2017-06-21T13:39:02 0 2000
2017-06-21T13:39:02 0 3000
2017-06-21T13:39:02 1 4000
2017-06-21T13:39:03 1 5000
2017-06-21T13:39:03 1 6000
2017-06-21T13:39:03 1 7000
2017-06-21T13:39:04 2 8000
2017-06-21T13:39:04 2 9000
2017-06-21T13:39:04 2 9056

我们要注意的是--no-delete这个参数,默认情况下是不指定这个参数会直接将数据删除,我们最好还是指定一下。
看一下日志,他是通过主键取数据,每次取1000条,而且分割成不同的批次来取:
2017-06-21T05:39:04.332458Z 17063 Query SELECT /*!40001 SQL_NO_CACHE */ `no_o_id`,`no_d_id`,`no_w_id` FROM `tpcc`.`new_orders` FORCE INDEX(`PRIMARY`) WHERE (no_o_id>3800) AND ((`no_w_id` > '10') OR (`no_w_id` = '10' AND `no_d_id` > '10') OR (`no_w_id` = '10' AND `no_d_id` = '10' AND `no_o_id` > '3915')) ORDER BY `no_w_id`,`no_d_id`,`no_o_id` LIMIT 1000
2017-06-21T05:39:04.332963Z 17063 Query commit
2017-06-21T05:39:04.333220Z 17063 Quit

再看一下导出的文件,发现是固定格式的文件:
[root@mxqmongodb2 sa]# head -10 pt-archiver.dat
3801 1 1
3802 1 1
3803 1 1
3804 1 1
3805 1 1
3806 1 1
3807 1 1
3808 1 1
3809 1 1
3810 1 1

最后看一下删除数据:
mysql> select count(*) from test.new_orders where no_o_id>3900;
+----------+
| count(*) |
+----------+
| 862 |
+----------+
1 row in set (0.00 sec)

删除:
[root@mxqmongodb2 bin]# ./pt-archiver --source h=172.16.16.35,P=3306,D=test,t=new_orders,u=root,p=123456 --no-check-charset --where 'no_o_id>3900' --purge --limit=100
mysql> select count(*) from test.new_orders where no_o_id>3900;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)

然后看一下日志文件:
2017-06-21T05:59:46.655361Z 17065 Query SELECT /*!40001 SQL_NO_CACHE */ `no_o_id`,`no_d_id`,`no_w_id` FROM `test`.`new_orders` FORCE INDEX(`PRIMARY`) WHERE (no_o_id>3900) AND ((`no_w_id` > '6') OR (`no_w_id` = '6' AND `no_d_id` > '3') OR (`no_w_id` = '6' AND `no_d_id` = '3' AND `no_o_id` >= '3930')) ORDER BY `no_w_id`,`no_d_id`,`no_o_id` LIMIT 100
2017-06-21T05:59:46.656582Z 17065 Query DELETE FROM `test`.`new_orders` WHERE (`no_w_id` = '6' AND `no_d_id` = '3' AND `no_o_id` = '3931')
2017-06-21T05:59:46.657058Z 17065 Query commit
2017-06-21T05:59:46.710106Z 17065 Query DELETE FROM `test`.`new_orders` WHERE (`no_w_id` = '6' AND `no_d_id` = '3' AND `no_o_id` = '3932')
2017-06-21T05:59:46.710659Z 17065 Query commit
2017-06-21T05:59:46.756656Z 17065 Query DELETE FROM `test`.`new_orders` WHERE (`no_w_id` = '6' AND `no_d_id` = '3' AND `no_o_id` = '3933')
2017-06-21T05:59:46.757106Z 17065 Query commit
2017-06-21T05:59:46.814019Z 17065 Query DELETE FROM `test`.`new_orders` WHERE (`no_w_id` = '6' AND `no_d_id` = '3' AND `no_o_id` = '3934')
2017-06-21T05:59:46.814538Z 17065 Query commit
2017-06-21T05:59:46.869874Z 17065 Query DELETE FROM `test`.`new_orders` WHERE (`no_w_id` = '6' AND `no_d_id` = '3' AND `no_o_id` = '3935')
2017-06-21T05:59:46.870439Z 17065 Query commit
2017-06-21T05:59:46.926640Z 17065 Query SELECT 'pt-archiver keepalive'
2017-06-21T05:59:46.927001Z 17065 Query DELETE FROM `test`.`new_orders` WHERE (`no_w_id` = '6' AND `no_d_id` = '3' AND `no_o_id` = '3936')

是先分批量查出来,然后逐条进行删除。

转载于:https://www.cnblogs.com/shengdimaya/p/7063293.html

pt-archiver(数据导入导出工具)相关推荐

  1. ETL数据导入/导出工具 HData

    HData是一个异构的ETL数据导入/导出工具,致力于使用一个工具解决不同数据源(JDBC.Hive.HDFS.HBase.MongoDB.FTP.Http.CSV.Excel.Kafka等)之间数据 ...

  2. udaldump数据导入导出工具使用

    udal数据库数据导入导出工具udaldump使用示例 帮助查看 ./start -h usage: 参数说明 -bufSize,–bufSize 导入文件时使用的缓冲区大小(单位:Byte) -c, ...

  3. mysql navicat导入bcp_SQL Server数据导入导出工具BCP详解

    BCP是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据.BCP可以将数据库的表或视图直接导出,也能通过SELECT ...

  4. PLSQL_数据泵Datapump导入导出数据IMPDP / EXPDP(概念)(Oracle数据导入导出工具)(转)...

    一.摘要 在平常备库和数据库迁移的时候,当遇到大的数据库的时候在用exp的时候往往是需要好几个小时,耗费大量时间.oracle10g以后可以用expdp来导出数据库花费的时间要远小于exp花费的时间, ...

  5. Hadoop sqoop数据导入导出工具安装

    进入sqoop的conf目录,将sqoop-site-template.xml文件重命名为sqoop-site.xml,并修改如下内容:

  6. 数据如何导入oracle数据库,如何用Oracle导入导出工具来实现Oracle数据库移植?

    Oracle数据库作为目前市场的主流数据库之一,许多应用都在其上进行开发,由于Oracle数据库更新换代的原因和不同的应用程序提供商,可能会造成在一个单位的应用中存在Oracle的几种版本,如Orac ...

  7. Java操作百万数据量Excel导入导出工具类(程序代码教程)

    Java操作百万数据量Excel导入导出工具类(程序代码教程): # 功能实现1.自定义导入数据格式,支持配置时间.小数点类型(支持单/多sheet)(2种方式:本地文件路径导入(只支持xls.xls ...

  8. [转载]在SQL Server数据库之间进行数据导入导出,OPENDATASOURCE

    需要在c盘下先建立一个data.txt文件,然后在文件的第一行写上你要导出的列,不如说要导出id和name这两列,就在第一行写上 id,name 然后保存,使用下列SQL就可以了,你如果要保持原有的I ...

  9. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

最新文章

  1. 开发者 AI 转型指南
  2. 漂亮的验证码(.Net MVC)
  3. LNMP安装常见问题集锦(一)
  4. 【Flink】Flink 源码阅读笔记(18)- Flink SQL 中的流和动态表
  5. 多程序集版本冲突问题
  6. 阿里云镜像加速Docker
  7. 系统分析与设计第一次作业
  8. 华为C语言的编程规范
  9. java 导出word 带图片
  10. Unity Shader-Command Buffer的使用(景深与描边效果重置版)
  11. sqlite 中函数--nullif()、ifnull()、strftime()及时间格式函数
  12. 高精地图对自动驾驶来说有多重要?
  13. 怎么用计算机打出错误,电脑连接打印机怎么一直显示错误怎么办
  14. 金融工程学(一):概述
  15. linux系统的midi制作软件,MIDI音乐制作软件(MidiEditor)
  16. 你好,法语!A2课文汇总
  17. html中的城市代码大全,html代码大全
  18. 分享一个开源的QT的串口示波器
  19. SARscape报错Attempt to call undefined function:等问题
  20. 机电开关的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. 懂了这个道理,你才有可能赚大钱!
  2. linux——基本指令(2)
  3. 在线编程+视频面试,工程师“云招聘”的正确打开方式(附源码)
  4. 磁盘分区4K未对齐的解决方案
  5. CP2102修改设备serial、PID、VID的值
  6. linux怎么显示cp时间,Linux中cp文件或目录时如何显示进度?
  7. okhttp的MediaType.parse属性
  8. 专访东方网力董事长刘光:起底安防市场下的AI商业逻辑
  9. 2023最新仿小鸟云主机服务器IDC网站源码+支持WAP响应式
  10. python中repr_python中__str__和__repr__的区别