相信大多数DBA都遇见过这样一个场景:开发同事给到一个非常大的SQL文件,里面包含了几千万甚至几亿行记录,这个时候我们应该怎么处理呢?如果直接导入的话,一方面串行执行效率比较低,另一方面大事务也可能导致主从复制延迟。pt-fifo-split这个工具,可以对大文件进行切割,就可以很好解决这个问题。
(1)基本语法
pt-fifo-split [OPTIONS] [FILE]
(2)常见选项
--fifo:临时文件位置,默认是/tmp/pt-fifo-split
--force:当临时文件存在时,移除并重建临时文件
--lines:控制每次读取的行数
--offset:控制从第几行开始分割
--statistics:打印统计信息
(1)首先,有一个100w行记录的数据文件
$ wc -l sbtest1.txt
1000000 sbtest1.txt
(2)其次,需要编写一个脚本,去获取数据
$ cat fifo_get.sh
#!/bin/bash
filename=/tmp/sbtest1
n=1
while [ -e /tmp/pt-fifo-split ];
do
cat /tmp/pt-fifo-split > "$filename"_"$n".txt ;
let n++
done
(3)会话1执行文件切割
$ pt-fifo-split --lines 10000 --statistics sbtest1.txt
chunks lines time overall current
1 10000 14 714.29 714.29
2 20000 14 1428.57 10000.00
3 30000 14 2142.86 10000.00
4 40000 14 2857.14 10000.00
5 50000 14 3571.43 10000.00
6 60000 14 4285.71 10000.00
7 70000 14 5000.00 10000.00
8 80000 14 5714.29 10000.00
9 90000 14 6428.57 10000.00
10 100000 14 7142.86 10000.00
11 110000 14 7857.14 10000.00
12 120000 14 8571.43 10000.00
13 130000 15 8666.67 10000.00
14 140000 15 9333.33 10000.00
15 150000 15 10000.00 10000.00
16 160000 15 10666.67 10000.00
17 170000 15 11333.33 10000.00
18 180000 15 12000.00 10000.00
19 190000 15 12666.67 10000.00
20 200000 15 13333.33 10000.00
21 210000 15 14000.00 10000.00
22 220000 15 14666.67 10000.00
23 230000 15 15333.33 10000.00
24 240000 15 16000.00 10000.00
25 250000 15 16666.67 10000.00
26 260000 15 17333.33 10000.00
27 270000 15 18000.00 10000.00
28 280000 15 18666.67 10000.00
29 290000 15 19333.33 10000.00
30 300000 15 20000.00 10000.00
31 310000 15 20666.67 10000.00
32 320000 15 21333.33 10000.00
33 330000 15 22000.00 10000.00
34 340000 15 22666.67 10000.00
35 350000 15 23333.33 10000.00
36 360000 15 24000.00 10000.00
37 370000 15 24666.67 10000.00
38 380000 15 25333.33 10000.00
39 390000 15 26000.00 10000.00
40 400000 15 26666.67 10000.00
41 410000 15 27333.33 10000.00
42 420000 15 28000.00 10000.00
43 430000 15 28666.67 10000.00
44 440000 15 29333.33 10000.00
45 450000 15 30000.00 10000.00
46 460000 15 30666.67 10000.00
47 470000 15 31333.33 10000.00
48 480000 15 32000.00 10000.00
49 490000 15 32666.67 10000.00
50 500000 15 33333.33 10000.00
51 510000 15 34000.00 10000.00
52 520000 15 34666.67 10000.00
53 530000 15 35333.33 10000.00
54 540000 15 36000.00 10000.00
55 550000 15 36666.67 10000.00
56 560000 15 37333.33 10000.00
57 570000 15 38000.00 10000.00
58 580000 15 38666.67 10000.00
59 590000 15 39333.33 10000.00
60 600000 15 40000.00 10000.00
61 610000 15 40666.67 10000.00
62 620000 15 41333.33 10000.00
63 630000 15 42000.00 10000.00
64 640000 15 42666.67 10000.00
65 650000 15 43333.33 10000.00
66 660000 15 44000.00 10000.00
67 670000 15 44666.67 10000.00
68 680000 15 45333.33 10000.00
69 690000 15 46000.00 10000.00
70 700000 15 46666.67 10000.00
71 710000 15 47333.33 10000.00
72 720000 15 48000.00 10000.00
73 730000 15 48666.67 10000.00
74 740000 15 49333.33 10000.00
75 750000 15 50000.00 10000.00
76 760000 15 50666.67 10000.00
77 770000 16 48125.00 10000.00
78 780000 16 48750.00 10000.00
79 790000 16 49375.00 10000.00
80 800000 16 50000.00 10000.00
81 810000 16 50625.00 10000.00
82 820000 16 51250.00 10000.00
83 830000 16 51875.00 10000.00
84 840000 16 52500.00 10000.00
85 850000 16 53125.00 10000.00
86 860000 16 53750.00 10000.00
87 870000 16 54375.00 10000.00
88 880000 16 55000.00 10000.00
89 890000 16 55625.00 10000.00
90 900000 16 56250.00 10000.00
91 910000 16 56875.00 10000.00
92 920000 16 57500.00 10000.00
93 930000 16 58125.00 10000.00
94 940000 16 58750.00 10000.00
95 950000 16 59375.00 10000.00
96 960000 16 60000.00 10000.00
97 970000 16 60625.00 10000.00
98 980000 16 61250.00 10000.00
99 990000 16 61875.00 10000.00
100 1000000 16 62500.00 10000.00
(4)会话2执行数据获取
$ sh fifo_get.sh
$ wc -l sbtest1*
10000 sbtest1_100.txt
10000 sbtest1_10.txt
10000 sbtest1_11.txt
10000 sbtest1_12.txt
10000 sbtest1_13.txt
10000 sbtest1_14.txt
10000 sbtest1_15.txt
10000 sbtest1_16.txt
10000 sbtest1_17.txt
10000 sbtest1_18.txt
10000 sbtest1_19.txt
10000 sbtest1_1.txt
10000 sbtest1_20.txt
10000 sbtest1_21.txt
10000 sbtest1_22.txt
10000 sbtest1_23.txt
10000 sbtest1_24.txt
10000 sbtest1_25.txt
10000 sbtest1_26.txt
10000 sbtest1_27.txt
10000 sbtest1_28.txt
10000 sbtest1_29.txt
10000 sbtest1_2.txt
10000 sbtest1_30.txt
10000 sbtest1_31.txt
10000 sbtest1_32.txt
10000 sbtest1_33.txt
10000 sbtest1_34.txt
10000 sbtest1_35.txt
10000 sbtest1_36.txt
10000 sbtest1_37.txt
10000 sbtest1_38.txt
10000 sbtest1_39.txt
10000 sbtest1_3.txt
10000 sbtest1_40.txt
10000 sbtest1_41.txt
10000 sbtest1_42.txt
10000 sbtest1_43.txt
10000 sbtest1_44.txt
10000 sbtest1_45.txt
10000 sbtest1_46.txt
10000 sbtest1_47.txt
10000 sbtest1_48.txt
10000 sbtest1_49.txt
10000 sbtest1_4.txt
10000 sbtest1_50.txt
10000 sbtest1_51.txt
10000 sbtest1_52.txt
10000 sbtest1_53.txt
10000 sbtest1_54.txt
10000 sbtest1_55.txt
10000 sbtest1_56.txt
10000 sbtest1_57.txt
10000 sbtest1_58.txt
10000 sbtest1_59.txt
10000 sbtest1_5.txt
10000 sbtest1_60.txt
10000 sbtest1_61.txt
10000 sbtest1_62.txt
10000 sbtest1_63.txt
10000 sbtest1_64.txt
10000 sbtest1_65.txt
10000 sbtest1_66.txt
10000 sbtest1_67.txt
10000 sbtest1_68.txt
10000 sbtest1_69.txt
10000 sbtest1_6.txt
10000 sbtest1_70.txt
10000 sbtest1_71.txt
10000 sbtest1_72.txt
10000 sbtest1_73.txt
10000 sbtest1_74.txt
10000 sbtest1_75.txt
10000 sbtest1_76.txt
10000 sbtest1_77.txt
10000 sbtest1_78.txt
10000 sbtest1_79.txt
10000 sbtest1_7.txt
10000 sbtest1_80.txt
10000 sbtest1_81.txt
10000 sbtest1_82.txt
10000 sbtest1_83.txt
10000 sbtest1_84.txt
10000 sbtest1_85.txt
10000 sbtest1_86.txt
10000 sbtest1_87.txt
10000 sbtest1_88.txt
10000 sbtest1_89.txt
10000 sbtest1_8.txt
10000 sbtest1_90.txt
10000 sbtest1_91.txt
10000 sbtest1_92.txt
10000 sbtest1_93.txt
10000 sbtest1_94.txt
10000 sbtest1_95.txt
10000 sbtest1_96.txt
10000 sbtest1_97.txt
10000 sbtest1_98.txt
10000 sbtest1_99.txt
10000 sbtest1_9.txt
1000000 sbtest1.txt
2000000 total
(5)至此,文件切割完成,接下来可以将切割后的文件,并行导入到数据库中
通过pt-fifo-split这个工具,可以快速将大文件进行切割,非常方便。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。