pt-archiver(數據導入導出工具)


數據導入導出工具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')

 

是先分批量查出來,然后逐條進行刪除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM