大文件导入卡住是因为DBeaver默认单线程、小批次、启用socket_timeout,导致50万行CSV易触发超时中断或内存缓冲区满而界面无响应;必须强制调整socket_timeout、compress、多行列插入批次大小和最大线程数四项参数。

为什么大文件导入会卡住,而不是报错
因为 DBeaver 默认用单线程、小批次、带默认超时的 JDBC 模式读取并插入数据。50 万行 CSV 在默认配置下,可能触发 socket_timeout 中断连接,或因内存缓冲区填满导致界面无响应——你看到的是“卡住”,实际后台可能已静默失败或反复重试。尤其对 ClickHouse 或 PostgreSQL 这类对批量写入敏感的数据库,没调驱动参数就硬上,基本等于等超时。
必须改的 4 个连接与传输参数
这些不是“可选优化”,是大文件导入前的强制前置动作:
-
socket_timeout设为0(禁用)或至少600000(10 分钟),否则网络抖动或单批处理稍慢就会断连 -
compress设为false:本地或局域网导入时,压缩反而是 CPU 瓶颈,关掉能提速 30% 以上 - 在导入向导的“设置”页里,把
多行列插入批次大小调到5000(MySQL/PostgreSQL)或10000(ClickHouse),避免每行都发一次 INSERT -
最大线程数不要盲目拉满:8 核机器设8,16 核设12;线程过多反而引发 JDBC 连接争抢和内存溢出
CSV 文件本身得先“瘦身”再导入
很多卡顿根本不是 DBeaver 的问题,而是源文件带了不该有的东西:
- 删掉 Excel 导出时自动加的 BOM 头:用
vim或iconv -f UTF-8 -t UTF-8-BOM//IGNORE data.csv > clean.csv清理 - 确认分隔符:别信“CSV 就是逗号”,用
head -n1 data.csv | od -c看真实分隔符是\t、;还是| - 日期列提前归一化:如果源文件混着
MM/dd/yyyy和yyyy-mm-dd,DBeaver 采样推断会失败,整列被当字符串;用awk或 Python 先统一成 ISO 格式 - 数字列去掉千分位:
"1,234.56"不能直接进DECIMAL字段,正则替换掉逗号比指望类型转换更可靠
执行时盯什么,不盯什么
导入过程中,重点看三项实时指标,其他都是干扰:
- 进度条下方的“已处理行数”是否匀速增长——卡住时它会停在某个数字不动
- DBeaver 底部状态栏的“内存使用”:超过 1.5GB 就该暂停,检查
-XmxJVM 参数是否够(默认常为 1G) - 数据库端的活跃会话:比如在 PostgreSQL 里查
SELECT * FROM pg_stat_activity WHERE state = 'active';,看有没有卡在INSERT上的长事务 - 别盯着“CPU 占用率”——DBeaver 是 Java 应用,JVM GC 高不代表卡,可能是正常回收
真正容易被忽略的是:DBeaver 的“保存任务”不等于执行任务。你配完所有参数点“保存”,只是存了配置;必须回到任务列表里右键“执行”,才会真正跑起来。很多人卡在“以为已经开始了”,其实连第一行都没发出去。










