场景

我有 2.5t 文件要导入数据库,切割导入

控制并发。

代码


#!/bin/bash

# 把csv文件分割成10个小文件
# -n l/10 表示按行把文件分割成10个相等的部分
# -d 表示用数字作为输出文件的后缀
# --additional-suffix=.csv 表示给输出文件加上.csv的扩展名
# data.csv 是输入文件的名字
# data_part_ 是输出文件的前缀
split -n l/10 -d --additional-suffix=.csv data.csv data_part_

# 遍历文件并用psql导入
# for f in data_part_*.csv 表示对所有符合data_part_*.csv模式的文件进行循环
# psql -c 表示执行一条命令并退出
# \copy 是一个psql命令,可以在文件和表之间进行批量复制数据
# persons(first_name,last_name,dob,email) 是要复制到的表和列
# from '$f' 表示从循环中的当前文件复制
# delimiter ',' 表示用逗号作为字段分隔符
# csv header 表示文件有一行标题,包含列名
for f in data_part_*.csv; do
  psql -c "\copy persons(first_name,last_name,dob,email) from '$f' delimiter ',' csv header"
done

# 或者用parallel命令同时运行多个导入
# parallel 是一个shell工具,可以用一个或多个计算机并行执行任务
# -j 4 表示一次使用4个任务
# psql -c 和上面一样
# ::: 表示后面的参数作为输入源
# data_part_*.csv 表示用所有符合模式的文件作为输入源
parallel -j 4 psql -c "\copy persons(first_name,last_name,dob,email) from '{}' delimiter ',' csv header" ::: data_part_*.csv

后台执行

使用 nohup 挂后台执行。

nohup 
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐