这可以通过 influx_inspect CLI 工具 + 一些 bash/grep/tr/cut 后处理来完成。从 InfluxDB v1.2.4 导出 >300M 行时,它对我有用,没有内存问题。
关键是使用 influx_inspect - 像 influx -database 'metrics' -execute 'select * from cpu' -format 'csv' 这样的命令惨遭失败。
这样的脚本将使用 influx lineprotocol 格式的数据创建文件:
#!/bin/bash
month=2017-04
db=YOUR_DBNAME
rp=autogen
datadir=/data/influxdb/data
waldir=/data/influxdb/wal
outdir=/somepath/influx_export
for d in 0{1..9} 10 ; do
echo $(date) Running time influx_inspect export -database $db -retention $rp -datadir $datadir -waldir $waldir -compress -start ${month}-${d}T00:00:00Z -end ${month}-${d}T23:59:59Z -out $outdir/export.${month}-${d}.lineproto.gz
time influx_inspect export -database $db -retention $rp -datadir $datadir -waldir $waldir -compress -start ${month}-${d}T00:00:00Z -end ${month}-${d}T23:59:59Z -out $outdir/export.${month}-${d}.lineproto.gz
echo $(date) Done
done
然后这些 lineproto 文件可以通过后处理步骤转换为 CSV。
在我的情况下,输出文件中的数据行如下所示:
# some header lines then data lines:
device_interfaces,device=10.99.0.6,iface_in=998,iface_out=87 packets=1030000i 1488358500000000000
device_interfaces,device=10.99.0.6,iface_in=998,iface_out=87 packets=2430000i 1488358800000000000
device_interfaces,device=10.99.0.6,iface_in=998,iface_out=875 bytes=400000i 1488355200000000000
device_interfaces,device=10.99.0.6,iface_in=998,iface_out=875 bytes=400000i 1488356400000000000
device_interfaces,device=10.99.0.6,iface_in=998,iface_out=875 packets=10000i 1488355200000000000
这里的坏处是测量的数据字段以单独的行和随机顺序出现。
在我的例子中,转换脚本只是将每个测量数据字段(数据包和字节)放入一个单独的 CSV 文件中(我稍后将它们加入数据库中)。您可能需要自定义或编写自己的。
MEASUREMENT=YOUR_MEASUREMENT_NAME
for file in *lineproto.gz ; do
echo -e "--- $(date) Processing file $file ...."
for field in packets bytes ; do
# uncompress, strip some header lines, delete junk chars and measurement name, replace spaces with comma
gzip -dc ${file} | grep "${MEASUREMENT},device" | grep $field | tr -d a-zA-Z_=- | tr -s ' ' , | cut -b1 --complement >> field_${field}.csv
echo -e "Conversion for $db field ${field} done"
done
echo -e "--- File $file processed at $(date)"
done