一行命令跨库迁移:ingestr 数据管道实战
手把手教你用 ingestr 工具,通过一条命令完成 MySQL 到 DuckDB 的数据迁移,详解全量与增量同步策略,快速搭建轻量级 ETL 管道,告别复杂脚本编写,提升数据搬移效率。

一行命令跨库迁移:ingestr 数据管道实战
上周团队分析师找我帮忙从线上 MySQL 同步用户行为表到本地 DuckDB 做分析。跨库迁移这类需求很常见,但传统方案往往需要写脚本、处理连接池、手动映射类型,或者引入 Airflow 等重型工具。如果只是偶尔搬运单表数据,有没有更轻量的解法?
这周我试用了 ingestr,用一行命令跑通了 MySQL 到 DuckDB 的全量迁移,增量同步也仅需追加参数。本文将完整还原实操过程,跟着步骤 15 分钟内即可搭建自己的数据管道。
环境准备
确保满足以下基础条件:
- 系统:macOS / Linux / WSL(本文演示命令全平台通用)
- Python:3.9+(采用 pip 安装路径)
- 源数据库:本地或远程的 MySQL/PostgreSQL 实例
- 目标库:本文使用 DuckDB(零配置本地文件,最适合演示)
若暂无现成数据库,可直接用 Docker 快速拉起测试环境。
安装 ingestr
推荐使用 pip 安装,自动处理底层 dlt 依赖:
bash
pip install ingestr
安装完成后验证版本:
bash
ingestr --version
注:ingestr 用 Go 编写但无需编译,pip 包已包含预编译二进制与 Python 胶水层。
构造测试数据
通过 Docker 启动 MySQL 并初始化数据:
bash
docker run -d --name demo-mysql \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_DATABASE=appdb \
-p 3306:3306 mysql:8.0
执行建表与数据插入:
bash
docker exec -i demo-mysql mysql -uroot -proot123 appdb <<EOF
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(200),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO users (name, email) VALUES
('张三', 'zhangsan@example.com'),
('李四', 'lisi@example.com'),
('王五', 'wangwu@example.com'),
('赵六', 'zhaoliu@example.com'),
('钱七', 'qianqi@example.com');
EOF
此时 appdb.users 表已包含 5 条测试记录。
核心实战:MySQL → DuckDB 迁移
ingestr 的核心命令结构极其直观,通过 URI 指定数据流向:
bash
ingestr ingest \
--source-uri 'mysql://root:root123@127.0.0.1:3306/appdb' \
--source-table 'appdb.users' \
--dest-uri 'duckdb:///mydata.duckdb' \
--dest-table 'appdb.users'
参数说明:
| 参数 | 作用 |
|---|---|
--source-uri |
源库连接串(SQLAlchemy 标准格式) |
--source-table |
源表名(格式:database.table) |
--dest-uri |
目标库路径(DuckDB 使用本地文件) |
--dest-table |
目标表名 |
执行后观察输出日志确认迁移结果。验证数据是否落地:
python
import duckdb
conn = duckdb.connect('mydata.duckdb')
print(conn.execute('SELECT * FROM users').fetchall())
字段类型已自动完成映射,无需额外处理。
增量同步策略
生产环境通常需要仅同步新增数据。ingestr 提供三种增量模式:
- append:追加新记录(依赖递增字段)
- merge:按主键合并更新
- delete+insert:清空后重新写入
以增量追加为例:
bash
ingestr ingest \
--source-uri 'mysql://root:root123@127.0.0.1:3306/appdb' \
--source-table 'appdb.users' \
--dest-uri 'duckdb:///mydata.duckdb' \
--dest-table 'appdb.users' \
--incremental-strategy append \
--incremental-key id
关键参数解析:
--incremental-strategy:指定同步策略--incremental-key:标记增量判断字段(需单调递增)
⚠️ 注意:若源表使用 UUID 主键,incremental-key 策略将失效,需改用 merge 模式或时间戳字段。
高频问题排查
连接失败怎么办?
检查 URI 端口与密码是否正确。特殊字符(如 @//)需进行 URL 编码(例如 p@ss → p%40ss)。
大表迁移卡顿?
添加 --batch-size 控制单次拉取量,如 --batch-size 10000。同时确认源库权限与连接数充足。
云数仓认证配置?
BigQuery 等目标库可通过连接串传递凭证路径:
--dest-uri 'bigquery://my-project?credentials_path=/path/to/service-account.json'
如何实现定时任务?
结合 cron 调度 CLI 命令:
cron
0 2 * * * /path/to/python -m ingestr ingest --source-uri ... --dest-uri ...
复杂流水线可集成 Airflow 或 Bruin 进行编排。
下一步探索
- 尝试 CSV 文件导入 Postgres:
--source-uri 'file:///path/to/data.csv' - 研究
--dest-write-disposition参数掌握写入策略 - 查阅 官方文档 获取 20+ 数据源适配清单
ingestr 的价值在于将 ETL 复杂度收敛至单条命令。当数据搬运不再消耗精力,团队才能真正聚焦于数据价值的挖掘。
项目仓库:bruin-data/ingestr · Star 3615 · 语言 Go