MariaDB ColumnStore使用LOAD DATA LOCAL INFILE覆盖旧数据不追加如何解决
问题原因与解决方案
默认情况下LOAD DATA LOCAL INFILE在MariaDB ColumnStore引擎下的行为是追加写入,出现覆盖写入的情况可以按以下步骤排查修正:
1. 排查前置清空逻辑
首先确认导入代码执行前,是否存在TRUNCATE TABLE、DELETE FROM 表名、删表重建等清空旧数据的操作,绝大多数覆盖场景都是导入前主动清理了旧数据导致的。
2. 修正表结构的自增ID配置
你当前表的id字段仅在注释中标注了自增属性,实际没有生效,且表没有主键约束:
ALTER TABLE `daily_sales_msr_fact` MODIFY COLUMN `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'autoincrement=1';
修正后如果导入文件中不包含id字段的值,数据库会自动为每一行导入的数据生成唯一自增ID,直接作为新行追加。
3. 调整LOAD DATA语句冲突规则
LOAD DATA默认不会覆盖旧数据,如果你之前的语句加了REPLACE关键字请删除,遇到唯一键冲突想保留旧数据的话可以加IGNORE关键字跳过冲突行:
LOAD DATA LOCAL INFILE '%s' IGNORE INTO TABLE %s LINES TERMINATED BY '\r\n' (%s)
4. 检查ColumnStore导入相关配置
确认ColumnStore的全局配置没有开启导入替换开关:
-- 查看配置值 SHOW VARIABLES LIKE 'columnstore_dataload_replace'; -- 如果值为ON,临时修改为OFF,永久生效需要修改my.cnf配置文件 SET GLOBAL columnstore_dataload_replace = OFF;
该参数开启后会在每次导入前自动清空目标表的所有数据。
5. 分区表特殊场景处理
如果你的表按date字段做了分区,每次导入相同日期数据时会默认覆盖对应分区的旧数据,需要保留新旧数据可以选择两种方案:
- 新增
import_batch字段,每次导入时赋值为当前批次的时间戳/编号,调整分区规则为date+import_batch联合分区 - 导入时不指定分区写入,默认追加到对应分区即可
6. 效果验证
每次导入前后执行统计行数的语句即可确认是否为追加写入:
SELECT COUNT(*) FROM daily_sales_msr_fact;
内容的提问来源于stack exchange,提问作者Shafiqul Islam
相关产品推荐
相关产品推荐

