ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PostgreSQL数据迁移的新姿势:pgloader一条命令搞定MySQL、SQLite与CSV

PostgreSQL数据迁移的新姿势:pgloader一条命令搞定MySQL、SQLite与CSV PostgreSQL数据迁移的新姿势pgloader一条命令搞定MySQL、SQLite与CSV【免费下载链接】pgloaderMigrate to PostgreSQL in a single command!项目地址: https://gitcode.com/gh_mirrors/pg/pgloader想象一下这个场景你刚把一套业务系统从 MySQL 迁移到 PostgreSQL发现除了导出数据还要手动建表、改字段类型、处理0000-00-00这种 MySQL 独有日期、重建索引和外键……整整一周都耗在上面。如果告诉你这一切可以被一条命令代替呢pgloader 就是那个一条命令完成 PostgreSQL 数据迁移的工具。它专为 PostgreSQL 设计能自动完成数据源结构发现、类型转换、数据清洗和批量写入并把出错的行单独隔离到拒绝文件里而不是像传统 COPY 那样一错全停。为什么说它是迁移界的最省心方案pgloader 的核心优势不在于快而在于扛得住脏数据。传统做法里PostgreSQL 的 COPY 是事务性的输入里哪怕只有一行坏数据整个表的数据都会被回滚而 pgloader 会把坏行写进独立的 reject 文件同时继续加载好数据。把它和另外两种常见方案放在一起看更清楚对比维度pgloader手写COPY脚本外部数据包装器(FDW)一行坏数据的影响隔离到拒绝文件继续导入整批回滚查询时报错结构迁移自动发现并建表手动编写DDL只读映射不建表类型转换内置映射可自定义规则完全手动由FDW定义决定数据清洗边导入边转换需要预处理不支持学习成本一条命令起步中高一句话总结你是想花半小时配置一个自动化方案还是想花一周手写迁移脚本大部分人的答案都很明确。三步完成pgloader安装与验证pgloader 目前有两个版本路线v4 是完全用 Clojure/JVM 重写的版本分发为单个自包含 JAR只需要 Java 21 及以上环境推荐优先使用。第一步确认Java环境。v4 要求 Java 21用java -version检查即可。第二步获取程序包。三种方式任选其一方式A推荐直接下载官方预构建的 JAR然后用java -jar pgloader.jar运行方式B源码编译在类 Unix 系统上克隆源码后执行make完成后可执行文件在./build/bin/pgloadergit clone https://gitcode.com/gh_mirrors/pg/pgloader cd pgloader make方式C系统包Debian/Ubuntu 用户可尝试apt-get install pgloader不过仓库里很可能是较旧的 v3 版本。第三步验证是否可用。任何方式装好后运行下面命令能打印出版本号和完整参数说明就算成功了java -jar pgloader.jar --version java -jar pgloader.jar --help 小贴士如果服务器内存有限用源码编译时可以调整动态内存大小例如make DYNSIZE1024表示用 1GB 堆内存避免大迁移时内存吃紧。四个看完就能上手的实战场景场景一把 CSV 文件导入已有表这是最基础的用法。你有一份data.csv目标表已经在 PostgreSQL 里建好了那么一条命令搞定java -jar pgloader.jar --type csv \ --field id --field name --field email \ --with truncate \ --with fields terminated by , \ data.csv postgresql://userlocalhost/mydb?tablenameusers它做了什么--field声明每一列的字段名--with truncate先清空目标表fields terminated by ,指定分隔符目标连接串里的?tablenameusers告诉 pgloader 数据写进哪张表。执行后会输出每张表的读取行数、导入行数、错误数和耗时汇总。场景二用管道从标准输入流式导入数据源不一定是文件还可以是标准输入。配合 Unix 管道你能实现边解压边导入无需在磁盘上展开大文件gunzip -c source.csv.gz | java -jar pgloader.jar --type csv \ --field usps,geoid,aland,awater \ --with skip header 1 \ --with fields terminated by \t \ - postgresql:///pgloader?districts_longlat注意这里的数据源是一个-意思是标准输入。这种方式特别适合压缩包、日志流这类没法直接落盘的场景操作系统负责管道缓冲pgloader 负责把数据流式写进 PostgreSQL。场景三SQLite 数据库一步迁移如果你要从 SQLite 整体搬到一个新 PostgreSQL 数据库只需要两条命令——一条建库一条迁移createdb newdb java -jar pgloader.jar ./test/sqlite/sqlite.db postgresql:///newdb执行后会得到什么pgloader 会打开 SQLite 文件、自动发现所有表结构含索引和外键把 SQLite 的数据类型转换成 PostgreSQL 等价类型然后把数据全部搬过去。全程无需你手写一行 DDL。场景四MySQL 完整迁移结构数据一起搬MySQL 是 pgloader 最拿手的场景连 auto_increment 都会自动转成 bigserialcreatedb pagila java -jar pgloader.jar mysql://rootlocalhost/sakila postgresql:///pagila这一条命令迁移的范围包括表结构、索引、主外键约束、注释、序列和自增字段。MySQL 的0000-00-00这类无效日期会被自动转成 NULL因为日历里从来没有第零年。 小贴士如果只想迁移某一张表可以在源连接串里带上表名例如mysql://rootlocalhost/sakila?tablenamefilmpgloader 就只处理这一张表。复杂迁移任务用配置文件编排每一步当迁移需求超过一条命令能表达的范围比如要过滤某些表、改表名、加前置SQL就该写.load配置文件了。pgloader 的配置文件是一套类似 SQL 的领域专用语言DSL数据库管理员能快速看懂LOAD DATABASE FROM mysql://rootlocalhost/sakila INTO postgresql://localhost:54393/sakila WITH include drop, create tables, create indexes, reset sequences, workers 8, concurrency 1, multiple readers per thread, rows per range 50000 SET PostgreSQL PARAMETERS maintenance_work_mem to 128MB, work_mem to 12MB, search_path to sakila, public, $user CAST type datetime to timestamptz, type date drop not null drop default using zero-dates-to-null, type year to integer ALTER TABLE NAMES MATCHING film RENAME TO films BEFORE LOAD DO $$ create schema if not exists pagila; $$;各关键子句的作用一眼就能对上子句作用例子WITH控制迁移行为create tables,workers8SET设置源/目标数据库会话参数work_mem12MBCAST自定义类型转换规则datetime→timestamptzALTER TABLE ... MATCHING按正则或表名批量改名/改schemafilm→filmsBEFORE/AFTER LOAD DO迁移前后执行SQL建schema、收尾建索引配置写好后运行方式和命令行一样简单java -jar pgloader.jar my-migration.load详细的 DSL 语法说明可以参考仓库里的 docs/command.rst各数据源的具体选项见 docs/ref/mysql.rst 这类参考页。四个高频坑与排障指南坑一字符编码乱码。源文件是 latin1 编码却按 UTF-8 解析中文全变问号。解决办法是指定编码或者用--list-encodings查看 pgloader 支持的所有编码java -jar pgloader.jar --encoding latin1 source.csv postgresql:///targetdb坑二日期格式报错。除了 MySQL 的0000-00-00还有各种MM/DD/YYYY和DD/MM/YYYY混用。可以用 CAST 规则统一处理或用--with date format DD/MM/YYYY之类选项声明格式。坑三大文件内存吃紧。一次加载千万行数据导致 JVM 内存溢出。先调小批处理量必要时再调大 JVM 堆java -Xmx2g -jar pgloader.jar big.load坑四网络连接中断。远程数据库迁移一半断连。用 SET 子句配置连接保活参数SET connect_timeout to 120, keepalives_idle to 60, keepalives_interval to 10。无论哪种错误pgloader 都会在输出目录生成一对reject.dat坏数据和reject.log错误原因这是你排障的第一手资料比对着黑屏日志猜要高效得多。三个立竿见影的性能配置对大数据量迁移下面三个配置组合起来效果最明显WITH batch rows 50000, -- 每批写入5万行 batch size 100MB, -- 每批最大100MB prefetch rows 100000, -- 预取10万行 workers 8, -- 8个工作线程 concurrency 4, -- 4个并发连接 max parallel create index 2 -- 索引并行创建数批量参数决定写入粒度批次太小网络往返开销大批次太大内存峰值高。从batch rows 10000起步按监控结果调整。workers 与 concurrency 决定并行度workers 是线程数concurrency 是并发连接数两者不要盲目调大要和目标库的 CPU/IO 能力匹配。索引策略决定总时长先导数据、后建索引通常比边导边建快配合create indexes选项让 pgloader 在数据加载完成后统一建索引。 小贴士先用--dry-run只检查连接和数据源不实际加载任何数据用--summary report.txt把统计报告写到文件方便对比调参前后的效果。从这里继续深入上手之后你想探索的下一步都在项目仓库里官方文档与命令参考docs/各数据源的迁移教程docs/tutorial/真实可运行的测试配置文件test/测试数据与完整示例test/data/如果你正在规划 PostgreSQL 数据迁移其实没有比先用一条命令跑通流程更快的验证方式。好的工具让复杂的工作变简单pgloader 已经把结构迁移、数据清洗、错误隔离、性能调优都替你考虑好了剩下要做的就是把它用起来。现在就去克隆仓库编译一个 pgloader把第一份 CSV 数据搬进 PostgreSQL 吧——你会发现过去要忙一周的事今天一杯咖啡的时间就够了。【免费下载链接】pgloaderMigrate to PostgreSQL in a single command!项目地址: https://gitcode.com/gh_mirrors/pg/pgloader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表