type
Post
status
Published
slug
2023/05/09/mysql-batch-import-csv-large-files
summary
tags
工具
category
学习思考
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM

前言

最近需要将一些数据导入到 mysql 中,一开始想的是使用 jetbrains 的 DataGrip 工具,但是在折腾了好久导入的时候发现,因为每个 csv 文件比较大的问题,导致每次导入的时候,数据都无法完整导入,600W条数据,可能只导入了100W,而且经常卡死(MMP,浪费了我那么多的时间,我还一个一个的修改对应的表定义,人麻了。。。。)
在经过查找资料之后发现,使用 LOAD DATA 语句能够更可靠的导入大数据文件,于是进行了一些工具的开发操作。

LOAD DATA 语法介绍

如果想进行批量导入,你可以使用LOAD DATA INFILE SQL语句,这种方法速度快,适合大数据文件。你可以在一个SQL脚本中写多个LOAD DATA INFILE语句,分别指定不同的csv文件的路径和格式,以及要导入的数据库和表名。例如:
LOAD DATA INFILE 'c:/csvdata/MSCallGraph_80.csv' INTO TABLE MSCallGraph FIELDS TERMINATED BY ',' ENCLOSED BY '\\"' IGNORE 1 ROWS; LOAD DATA INFILE 'c:/csvdata/MSCallGraph_81.csv' INTO TABLE MSCallGraph FIELDS TERMINATED BY ',' ENCLOSED BY '\\"' IGNORE 1 ROWS; ... LOAD DATA INFILE 'c:/csvdata/MSCallGraph_99.csv' INTO TABLE MSCallGraph FIELDS TERMINATED BY ',' ENCLOSED BY '\\"' IGNORE 1 ROWS;
然后你可以执行这个SQL脚本,就可以将所有的csv文件导入到同一个表中了。

shell 脚本自动化

这是一个可能的shell脚本,你可以根据你的需要修改它:
#!/bin/bash # A shell script to generate a SQL script for batch importing csv files into MySQL # The path of the csv files path="/home/tcy/test/" # The prefix of the csv files prefix="MSCallGraph_" # The suffix of the csv files suffix=".csv" # The range of the file numbers start=1 end=143 # The name of the SQL script sql_script="load_data.sql" # The name of the database table table="MSCallGraph" # The format of the csv files format="FIELDS TERMINATED BY ',' ENCLOSED BY '\\"' IGNORE 1 ROWS" # Create an empty SQL script file echo "" > $sql_script # Loop through the file numbers for i in $(seq $start $end) do # Construct the file name file=$path$prefix$i$suffix # Append a LOAD DATA INFILE statement to the SQL script file echo "LOAD DATA LOCAL INFILE '$file' INTO TABLE $table $format;" >> $sql_script done # Print a message to indicate the completion of the script echo "The SQL script $sql_script has been generated."

运行

运行前准备

创建对应的表

CREATE TABLE MSCallGraph ( traceid VARCHAR (255) NULL, timestamp VARCHAR (255) NULL, rpcid VARCHAR (255) NULL, um VARCHAR (255) NULL, rpctype VARCHAR (255) NULL, dm VARCHAR (255) NULL, interface VARCHAR (255) NULL, rt VARCHAR (255) NULL );

执行 sql 脚本

你可以使用以下方法来使用mysql运行这个SQL脚本:
  • 一种是在命令行中执行,这种方法比较快捷。你需要先登录到mysql服务器,然后指定要执行SQL脚本的数据库,然后使用重定向符号(<)来执行SQL脚本文件。例如:
mysql -u root -p 密码 -D MSCallGraph < load_data.sql
  • 另一种是在mysql中执行,这种方法比较灵活。你需要先登录到mysql服务器,然后指定要执行SQL脚本的数据库,然后使用source命令来执行SQL脚本文件。例如:
mysql> use MSCallGraph; mysql> source load_data.sql;
你可以根据你的需求和喜好选择一种方法来运行这个SQL脚本。
 
欢迎加入喵星计算机技术研究院,原创技术文章第一时间推送。
notion image
 
如何在 Arch Linux 中更改默认的 MySQL/MariaDB 数据目录WSL 中 systemd 的使用指南