如何快速导出MySQL千万级大表数据_使用mysqldump导出CSV格式

夜晨小哥_4356

夜晨小哥_4356

2026-05-29

349人浏览

原创

mysqldump 不能直接导出标准 csv,--tab 实际生成制表符分隔文件且需 file 权限;推荐用 mysql 客户端配合 --batch 与 sed 简单转换,或 python + sscursor 流式导出以正确处理引号、换行、编码等细节。

如何快速导出mysql千万级大表数据_使用mysqldump导出csv格式

mysqldump 不能直接导出 CSV,别被 --tab 选项误导

很多人看到 mysqldump --tab 就以为能一键导出 CSV,其实它只是调用 SELECT ... INTO OUTFILE,生成的是制表符分隔的纯文本(不是逗号分隔),且要求 MySQL 用户有 FILE 权限、服务器本地写入权限,还默认不加引号、不转义特殊字符——拿到手的文件大概率在 Excel 里错列或报错。

真正可控的 CSV 导出,得绕过 mysqldump,改用其他方式。

用 mysql 客户端 + 输出重定向是最稳的轻量方案

如果你只要导出数据(不要建表语句),mysql 命令行工具配合 --batch 和字段分隔控制,比 mysqldump 更干净:

mysql -u user -p -h host db_name -e "SELECT * FROM huge_table" \
  --batch \
  --raw \
  --skip-column-names \
  --execute="SET SESSION group_concat_max_len = 1048576" \
  | sed 's/\t/,/g' | sed 's/"/""/g' | sed 's/^/"/;s/$/"/' > output.csv
  • --batch 关闭表格格式,输出 tab 分隔;--raw 防止反斜杠转义干扰
  • --skip-column-names 别让第一行是字段名(如需可去掉)
  • sed 's/\t/,/g' 把 tab 换成逗号——注意:这仅适用于字段内容不含 tab 或换行的场景
  • 如果字段含逗号、换行、双引号,必须加引号和转义,上面的 sed 只处理简单情况;复杂数据建议用 Python 脚本流式处理

千万级表别一次性 SELECT *,用 LIMIT + OFFSET 或主键范围分批

直接 SELECT * FROM huge_table 极易触发 MySQL 内存溢出、连接超时,或者导出文件中途断裂。必须分片:

Miller CSV TSV JSON 数据处理器
Miller CSV TSV JSON 数据处理器

Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。

下载
  • 确认表有自增主键 id(或带索引的时间字段),然后按范围拉取:
    SELECT * FROM huge_table WHERE id BETWEEN 1 AND 100000;
  • 用 mysqldump --where 结合循环导出:
    for i in {0..99}; do mysqldump -u u -p db huge_table --where="id BETWEEN $((i*100000+1)) AND $((i*100000+100000))" --no-create-info --skip-extended-insert >> data.sql; done
  • 导出为 SQL 后再用脚本转 CSV(比全量查更快更稳),避免单次查询锁表太久

真正要 CSV?用 Python + pymysql 流式读取最可靠

对格式、编码、NULL 处理、大字段(如 JSON、TEXT)有要求时,shell 方案很快见底。一个 20 行的 Python 脚本反而更省心:

import csv
import pymysql
conn = pymysql.connect(host='h', user='u', password='p', database='db', cursorclass=pymysql.cursors.SSCursor)
cursor = conn.cursor()
cursor.execute("SELECT * FROM huge_table")
with open("output.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f, quoting=csv.QUOTE_MINIMAL)
    writer.writerow([col[0] for col in cursor.description])  # header
    for row in cursor:
        writer.writerow(row)

关键点:SSCursor 启用服务器端游标,不把整张表 load 进内存;quoting=csv.QUOTE_MINIMAL 自动给含逗号/换行的字段加双引号;encoding="utf-8" 避免中文乱码。遇到 datetime 字段,记得在 writer.writerow() 前做 str() 或 .isoformat() 转换。

分批逻辑也容易加:在 execute 里拼 WHERE id > ? ORDER BY id LIMIT 10000,用上次最大 id 续跑就行。

导出过程本身不难,难的是你有没有提前想清楚字段里有没有换行符、NULL 怎么表示、要不要 header、目标系统认不认 BOM ——这些细节一漏,CSV 打开就是一团乱码或错列。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2829

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2188

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1160

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1098

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1296

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2018

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3140

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

13875

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

529

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 178人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 283人学习