Skip to content

pt-fifo-split

"虚拟"切分大文件:按行数分块,通过 FIFO 管道逐块输出,而不真正拆分文件。

语法

bash
pt-fifo-split [OPTIONS] [FILE]

pt-fifo-split 会把 FILE 切分并把行写入 FIFO。不指定 FILE 或 FILE 为 - 时读取标准输入。

以每次 100 万行的分块方式读取 hugefile.txt(不物理切分文件):

bash
pt-fifo-split --lines 1000000 hugefile.txt
while [ -e /tmp/pt-fifo-split ]; do cat /tmp/pt-fifo-split; done

用法示例

pt-fifo-split 本身不连库、不涉及密码,只负责把文件按行切块写进 FIFO;下游消费命令(如 mysql)的连接按各自的默认配置走。命令可直接复制,替换其中的文件名、行数与 FIFO 路径即可。每个场景都需要配套一个"只要 FIFO 还在就读取"的循环来消费分块。

场景:把超大的 SQL 文件分批导入

dump 文件大到一次性 mysql < file 会撑爆内存或锁太久时,按每批 1 万行切块喂给 mysql,可控又不必真拆分文件:

bash
pt-fifo-split --lines 10000 bigdata.sql
while [ -e /tmp/pt-fifo-split ]; do mysql mydb < /tmp/pt-fifo-split; done

场景:直接对管道输出分块

没有现成文件、数据是 mysqldump 的实时输出时,让 pt-fifo-split 从标准输入读(不指定 FILE 即默认读 STDIN),照样逐块消费:

bash
mysqldump mydb | pt-fifo-split --lines 5000
while [ -e /tmp/pt-fifo-split ]; do cat /tmp/pt-fifo-split; done

场景:换 FIFO 路径并强制重建

上一次运行残留了同名 FIFO、或想用一个语义更清晰的路径时,用 --fifo 改路径、--force 强制删旧建新:

bash
pt-fifo-split --fifo /tmp/import.fifo --force --lines 2000 hugefile.txt
while [ -e /tmp/import.fifo ]; do cat /tmp/import.fifo; done

场景:跳过首行表头

数据首行是列头、而下游每批都接到表头会出错时,用 --offset 1 跳过第一行,只把数据行写进 FIFO:

bash
pt-fifo-split --offset 1 --lines 10000 data.csv
while [ -e /tmp/pt-fifo-split ]; do cat /tmp/pt-fifo-split; done

场景:边处理边看进度统计

长时间分块处理想掌握节奏,加 --statistics 在每块之间打印分块数、行数、耗时与行速率:

bash
pt-fifo-split --statistics --lines 50000 hugefile.txt
while [ -e /tmp/pt-fifo-split ]; do cat /tmp/pt-fifo-split; done

场景:超大日志按块交给下游分析

不只是入库,任何"逐块处理"都适用——比如把超大的访问日志按每块 10 万行交给 grep 统计错误数:

bash
pt-fifo-split --lines 100000 access.log
while [ -e /tmp/pt-fifo-split ]; do grep -c "ERROR" /tmp/pt-fifo-split; done

功能说明

pt-fifo-split 让你可以像读取"只包含文件中部分行"的文件一样读取大文件: 再次读取时,它包含下一批行;全部读完之后,该文件会消失。 仅支持 Unix 类操作系统。

可以在命令行指定多个文件;不指定或使用特殊文件名 - 时,从标准输入读取行。

选项

选项说明
--[no]buffer-stdout默认开启 STDOUT 缓冲;使用 tee、kubectl logs 等后处理工具想看到实时进度时可关闭
--config类型:Array。读取逗号分隔的配置文件列表;如指定必须放在命令行第一个选项的位置
--fifo类型:string;默认:/tmp/pt-fifo-split。可供读取行的 FIFO 名称
--force若 FIFO 已存在则先删除再重建
--help显示帮助并退出
--lines类型:int;默认:1000。每个分块读取的行数
--offset类型:int;默认:0。从第 N 行开始。0 表示所有行都输出;1 与 0 相同;2 表示跳过第 1 行,从第 2 行开始输出
--pid类型:string。创建指定的 PID 文件。若 PID 文件已存在且其中的 PID 与当前 PID 不同,工具不会启动;若其中的 PID 已不再运行,工具会以当前 PID 覆盖该文件。工具退出时自动删除 PID 文件
--statistics在分块之间打印统计信息:分块数、行数、耗时,以及整体和最后一个分块的行速率
--version显示版本并退出

其他信息

  • 通用说明:已知问题的反馈方式、PTDEBUG 调试安全提示、系统要求基线,见 通用说明

更多细节请阅读 官方文档

Percona Toolkit 中文文档 · 社区维护的第三方学习站