PGLoader:将其它数据库数据迁移至 PostgreSQL 的工具
pgloader 可将数据从各种来源加载到PostgreSQL中。它能实时转换读取的数据,并在加载前后提交原始SQL语句。它使用PostgreSQL的 COPY 协议将数据流式传输到服务器,并通过填充一对reject.dat和reject.log文件来处理错误。
由于能够直接从数据库源加载数据,pgloader 还支持从其他产品迁移到PostgreSQL。在这种操作模式下,pgloader 可通过单个无人值守的命令处理迁移的模式和数据部分,从而实现持续迁移。
功能概述
pgloader 有两种操作模式:从文件加载数据和迁移数据库。在这两种情况下,pgloader 都使用PostgreSQL的COPY协议,该协议通过流式传输以非常高效的方式发送数据。
将文件内容加载到PostgreSQL中
从文件加载数据时,pgloader 具备以下功能:
- 支持多种源格式:pgloader 支持多种基于文件的格式,包括CSV系列、固定列格式、dBase文件(
db3)和IBM IXF文件。下一节会介绍SQLite数据库引擎:pgloader 将SQLite视为数据库源,并能从SQLite目录中发现模式。
- 实时数据转换:通常,从CSV文件(或其他格式)读取的数据在发送到PostgreSQL之前需要进行一些调整和清理。例如,在geolite示例中,我们可以看到整数值被重写为IP地址范围,这样就能直接针对
ip4r列。
- 完整字段投影:pgloader 支持将数据加载到比文件中字段更少或更多的字段中,并在将读取的数据发送到PostgreSQL之前对其进行一些计算。
- 从归档文件读取文件:pgloader 支持zip、tar和gzip等归档格式:归档文件会在临时目录中解压,然后加载解压后的文件。
- HTTP(S)支持:pgloader 知道如何直接使用HTTP下载源文件或源归档文件。使用
curl -O- http://... | pgloader并从标准输入读取数据可能更好,这样可实现从数据源到PostgreSQL的数据流式传输。
- 目标模式发现:当加载到现有表中时,pgloader 会考虑现有列,并可能自动为你猜测CSV格式。
- 出错时停止/出错时继续下一行:在某些情况下,源数据损坏严重,无法完整迁移。从文件加载数据时,pgloader 的默认设置是使用
on error resume next选项,即PostgreSQL拒绝的行会被保存,迁移继续处理其他行。在其他情况下,只加载部分输入数据可能并非良策,此时可以使用on error stop选项。
- 预/后SQL命令:此功能允许pgloader命令包含在加载文件前后运行的SQL命令。这可能是先创建一个表,然后将数据加载到其中,接着对数据进行更多处理(从而实现一个ELT管道),或者在数据准备好后立即创建特定的索引。
一键迁移到PostgreSQL
通过单个命令迁移整个数据库时,pgloader 具备以下功能:
- 一键迁移:整个迁移通过单个命令行启动,然后无人值守运行。pgloader 旨在集成到完全自动化的工具中,你可以根据需要多次重复使用。
- 模式发现:通过源数据库的SQL目录对其进行内省,以获取表、属性(包括数据类型、默认值、非空约束等)、主键约束、外键约束、索引、注释等列表。这将为从源数据库迁移到目标数据库的所有对象提供一个内部数据库目录。
- 用户定义的转换规则:某些源数据库对其数据类型的定义可能与PostgreSQL中等效数据类型的实现不兼容。例如,自版本3起,SQLite具有动态类型系统,这显然与关系的概念不兼容。又如,MySQL接受零年的日期时间,而这在日历中并不存在,并且MySQL没有布尔数据类型。从其他源数据库技术迁移到PostgreSQL时,必须做出数据类型转换选择。pgloader 实现了可靠的默认设置,你可以依赖这些设置,并且还为特定情况提供了用户定义数据类型转换规则的功能。其目的是允许用户指定迁移的方式,以便迁移可重复,并包含在持续迁移过程中。
- 实时数据转换:用户定义的转换规则会伴随着数据的实时重写。例如,默认情况下,零日期(不仅仅是年份,MySQL接受
0000 - 00 - 00作为有效日期时间)会被重写为NULL值。
- 部分迁移:可以在迁移中仅包含源数据库表的部分列表,或者排除源数据库中的某些表。
- 仅模式、仅数据:这是pgloader的ORM兼容性功能,即可以使用你的ORM创建模式,然后让pgloader将数据迁移到这个已创建的模式中。这样做时,pgloader 可以对目标模式进行重新索引:在使用COPY将源数据库中的数据加载到PostgreSQL之前,pgloader 会删除索引和约束,并在数据加载完成后重新安装完全相同的定义。这样操作的原因当然是为了数据加载性能。
- 可重复(删除+创建):默认情况下,pgloader 会在目标PostgreSQL数据库中先发出DROP语句,然后再发出任何CREATE语句,这样你就可以根据需要多次重复迁移,直到迁移规范和规则没有错误为止。可以安排在代码迁移项目的整个期间每晚(甚至更频繁!)运行数据迁移。有关该方法的更多详细信息,请参阅持续迁移方法。
- 出错时停止/出错时继续下一行:pgloader 从数据库迁移时的默认行为是
on error stop。其理念是让用户修复迁移规范或源数据,然后再次运行该过程,直到成功为止。在某些情况下,源数据损坏严重,无法完整迁移,这时可能需要使用on error resume next选项,即PostgreSQL拒绝的行会被保存,迁移继续处理其他行。
- 预/后SQL命令、模式后SQL命令:虽然pgloader 会根据PostgreSQL的期望重写模式,甚至为此提供用户定义数据类型转换规则支持,但有时需要在迁移周围添加一些特定的SQL命令。pgloader 本身就支持这一点,无需在其周围编写脚本。
- 在线更改模式:有时迁移到PostgreSQL也是一个回顾和修正过去做出的错误决策的好机会,或者只是修正与PostgreSQL不相关的决策。pgloader 命令语法允许更改pgloader对目标目录的内部表示,以便目标模式的创建方式与源模式略有不同。支持的更改包括指定不同的模式或表名称。
- 物化视图,或实时模式重写:在某些情况下,模式重写不仅仅是重命名SQL对象,而是一个完整的规范化过程。因为PostgreSQL在大多数工作负载下都非常擅长在生产环境中运行规范化模式。pgloader 通过支持从视图定义进行迁移,实现了实时模式重写的完全灵活性。视图属性列表在PostgreSQL中成为表定义,并且通过查询源系统上的视图来获取数据。SQL视图允许使用SELECT投影子句在列级别实现内容过滤,并使用WHERE限制子句在行级别实现内容过滤。还可以通过JOIN从参考表回填数据。
- 分发到Citus:从PostgreSQL迁移到Citus时,过程的一个重要部分是根据分布键调整模式。有关完整示例,请参阅Citus文档中的准备表和导入数据,了解如何进行此操作。使用pgloader 时,可以指定分布键和参考表,让pgloader 自行处理表、索引、主键和外键定义的调整。
- 编码覆盖:MySQL实际上并不强制数据库中数据的编码与在数据库、表或属性级别定义的元数据中已知的编码相匹配。有时,为了理解文本的含义,需要覆盖元数据,pgloader 使这一操作变得容易。
https://github.com/dimitri/pgloader
http://pgloader.io/