【LINUX】MySQL 数据迁移指南:使用 LOAD DATA INFILE 高效导入 CSV 数据

百万数据的迁移耗时太久,所以采用服务器端直接加载:绕过客户端-服务端通信,直接由服务器读取。

1. 开始我就整理好了数据到txt格式,都是insert语句,但是需要csv格式,所以执行了。

sed -E 's/^INSERT INTO `t_student` VALUES \((.*)\);?/\1/' inserts.txt | sed "s/'//g" > your_file.csv

检查前几行结果

head -n 5 your_file.csv

处理完的数据格式:

fffff1fba5aa44639d03419cee7a6f3d, 001, 15719040470, 赵云, 118, 35, 2022-07-22 21:42:07

2. 权限问题

SHOW VARIABLES LIKE 'local_infile';  -- 需返回 ON

如果为 OFF,需临时启用:

-- 临时允许本地文件导入(需重启MySQL)
SET GLOBAL local_infile=1;

3. 执行导入命令,百万数据大概几秒完成。(也要看服务器性能)

mysql -u 用户名 -p school -e "
  LOAD DATA INFILE '/path/to/your_file.csv' 
  INTO TABLE t_student
  FIELDS TERMINATED BY ',' 
  LINES TERMINATED BY '\n';
"

-- 不设置SET GLOBAL local_infile=1,也可以执行下列代码代替

mysql -h localhost -u 用户名--local-infile=1 -p school -e "
  LOAD DATA LOCAL INFILE '/path/to/your_file.csv' 
  INTO TABLE t_student
  FIELDS TERMINATED BY ',' 
  LINES TERMINATED BY '\n'
"

如果文件在客户端机器(非MySQL服务器),改用 LOCAL:

LOAD DATA LOCAL INFILE '/path/to/your_file.csv' INTO TABLE t_student...

扩展:

如果数据量太大,可以选择分批执行 MySQL 数据导入(每10万条一批)

1. 准备分块文件

# 将大文件分割为多个小文件(每个10万行)
split -l 100000 -d --additional-suffix=.csv /home/your_file.csv /home/aa_part_

# 查看生成的分块文件
ls -lh /home/aa_part_*

2. 分批导入脚本

#!/bin/bash

# MySQL连接配置
USER="root"
DB="school"
TABLE="t_student"
HOST="localhost"  # 可以改为实际IP地址

# 读取密码而不显示在命令行
read -s -p "请输入MySQL密码: " PASSWORD
echo

# 遍历所有分块文件
for file in /home/aa_part_*.csv; do
  echo "正在导入: $file..."
  
  # 记录开始时间
  start_time=$(date +%s)
  
  # 使用标准TCP连接执行导入
  mysql -h $HOST -u $USER --local-infile=1 -p$PASSWORD $DB -e "
    LOAD DATA LOCAL INFILE '$file' 
    INTO TABLE $TABLE
    FIELDS TERMINATED BY ',' 
    LINES TERMINATED BY '\n'
  "
  
  # 检查执行结果
  if [ $? -eq 0 ]; then
    # 计算耗时
    end_time=$(date +%s)
    duration=$((end_time - start_time))
    echo "成功导入: $file (耗时: ${duration}秒)"
    
    # 可选:导入后删除已处理文件
    # rm -f "$file"
  else
    echo "错误: 导入 $file 失败"
    exit 1
  fi
done

echo "所有分块文件导入完成"

3. 检查脚本文件格式

file import_batch.sh

如果显示CRLF line terminators表示需要转换

sed -i 's/\r$//' import_batch.sh

4. 赋予执行权限

chmod +x import_batch.sh

5. 执行脚本

./import_batch.sh

【LINUX】MySQL 数据迁移指南:使用 LOAD DATA INFILE 高效导入 CSV 数据_第1张图片

你可能感兴趣的:(【LINUX】MySQL 数据迁移指南:使用 LOAD DATA INFILE 高效导入 CSV 数据)