将PostgreSQL作为源端
1. 适用场景
本文适用于使用百度智能云数据传输服务DTS(以下简称 DTS), 将自建PostgreSQL中的数据迁移至DTS已经支持的数据目标端的场景。
2. 将PostgreSQL数据库作为DTS源端的限制
- 不支持包含时区类型列的时间戳。
- 增量同步不支持同步关系型数据库的DDL语句。
- 一个数据迁移任务只能对一个数据库进行数据迁移,如果有多个数据库需要迁移,则需要为每个数据库创建数据迁移任务。
- 如果源端数据库没有主键或唯一约束,且所有字段没有唯一性,可能会导致目标数据库中出现重复数据。
- 复制多个同名但名称具有不同大小写的表(例如,table1、TABLE1 和 Table1)会导致无法预测的行为。
- PostgreSQL至PostgreSQL的结构迁移,暂不支持trigger、extension的迁移。
- PostgreSQL至异构数据源的结构迁移,暂仅支持库表结构迁移,不支持函数、视图等其他对象的迁移。
3. 将PostgreSQL数据库作为源端的前置条件
3.1 环境要求
DTS支持将PostgreSQL 9.4 、10.10版本自建数据库作为源端。
3.2 数据库账号权限要求
源端:
数据库 | 全量迁移 | 增量迁移 |
---|---|---|
自建PostgreSQL数据库 | 迁移对象的select权限 | superuser |
自建PostgreSQL数据库,数据库账号创建及授权方法请参见CREATE USER和GRANT语法。
3.3 网络配置
将DTS的IP地址加入至自建PostgreSQL的配置文件pg_hba.conf中,并启用复制和套接字连接。
# Replication Instance
host all all 10.1.4.56/00 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
host replication dms 10.1.4.56/00 md5
PostgreSQL的pg_hba.conf配置文件控制客户端身份验证。文件通常存储在数据库集群的数据目录中。
3.4 源端自建PostgreSQL增量迁移准备工作
-
安装逻辑流复制插件
登录自建PostgreSQL所属的服务器,下载wal2json逻辑流复制插件,下载地址如下: https://github.com/eulerto/wal2json 按照官方指导安装wal2json插件。
-
修改PostgreSQL相关参数配置
修改postgresql.conf配置文件中的如下参数:
-
将max_replication_slots 设置为大于1的整数, max_replication_slots的值应根据您需要同时运行的任务数进行设置。例如,要同时运行十二个任务,您需要设置至少十二个slot。
示例:
max_replication_slots = 12
-
将wal_level 设置为logical,开启wal 逻辑日志。
示例:
wal_level = logical
-
将wal_sender_timeout 设置为0,复制连接处于不活跃状态的时间超过wal_sender_timeout 时,会被源端库终止。该参数的默认值为 60 秒,但我们建议您将该参数设置为零,这样会禁用超时机制。
示例:
wal_sender_timeout = 0
-
将max_wal_senders 设置为大于10的整数, max_wal_senders 参数用于设置可以运行的并发任务数,建议和max_replication_slots设置的值一致。
示例:
max_wal_senders = 12
-
- 重启PostgreSQL数据库
-
将要迁移表的replica identity设置为FULL
ALTER TABLE TABLENAME REPLICA IDENTITY FULL;
4. 使用PostgreSQL数据库作为源端
使用PostgreSQL数据库作为源端,在任务创建、任务配置、前置检查、任务启动、任务暂停、任务终止的操作流程请参考典型实践文档。 在任务配置参数和对象映射部分与其他数据源有些许不同。
4.1 任务配置参数
如上图所示。目前DTS的源端支持公网自建PostgreSQL实例,PostgreSQL源端配置参数说明如下:
- 接入类型:支持公网/BCC/BBC/DCC自建PostgreSQL实例。
- 数据类型:固定选择PostgreSQL。
- IP/端口:自建PostgreSQL数据库的访问IP与服务端口。
- 数据库:自建PostgreSQL数据库中待迁移的数据库名。
- 账号:自建PostgreSQL的数据库账号。
- 密码:该数据库账号对应的密码。
注意:当接入类型为 云数据库 RDS 时,仅需选择目标实例,无需填写连接信息及账号密码。
4.2 对象映射
PostgreSQL为三级schema,当需要向两级schema的目的端进行数据迁移时, DTS提供了两种库表名映射方式供用户选择。如下图所示,选择好的迁移对象会出现在右边的已选择对象列表中。DTS支持上下游库表名映射、列过滤黑白名单等功能。可以点击【编辑】,对每一个迁移对象配置映射和过滤规则。目标数据库对象可以映射为源库中database和schema:
- 1. 数据库对象映射为源库中的Database: 忽略PostgreSQL中的schema, PostgreSQL中不同schema下的表均映射到mysql指定库中,目标端库名默认使用源端的库名。
- 2. 数据库对象映射为源库中的Schema: 忽略PostgreSQL中的库名,PostgreSQL中不同schema映射为mysql中不同库,目标库名默认使用源端schema名。
完成对象映射配置后,点击【保存并预检查】,启动任务的前置检查。
5. DTS支持的PostgreSQL源端数据类型
下表列出了使用DTS时支持的PostgreSQL源端数据类型以及与DTS数据类型的默认映射。
有关如何查看目标端映射的数据类型的信息,请参阅有关目标端数据源的数据类型映射部分。
PostgreSQL数据类型 | DTS字段类型 |
---|---|
INTEGER | DTS_TYPE_INT4 |
INTEGER[] | DTS_TYPE_STRING |
TEXT[] | DTS_TYPE_STRING |
BIT | DTS_TYPE_BYTES |
BIT VARYING | DTS_TYPE_BYTES |
MONEY | DTS_TYPE_NUMBER |
CHARACTER | DTS_TYPE_STRING |
CHARACTER VARYING | DTS_TYPE_STRING |
TEXT | DTS_TYPE_STRING |
BYTEA | DTS_TYPE_BYTES |
COMPLEX | DTS_TYPE_STRING |
ENUM | DTS_TYPE_STRING |
CIDR | DTS_TYPE_STRING |
POINT | DTS_TYPE_STRING |
LINE | DTS_TYPE_STRING |
LSEG | DTS_TYPE_STRING |
BOX | DTS_TYPE_STRING |
PATH | DTS_TYPE_STRING |
POLYGON | DTS_TYPE_STRING |
CIRCLE | DTS_TYPE_STRING |
INET | DTS_TYPE_STRING |
MACADDR | DTS_TYPE_STRING |
MACADDR8 | DTS_TYPE_STRING |
JSON | DTS_TYPE_STRING |
SMALLINT | DTS_TYPE_INT2 |
BIGINT | DTS_TYPE_INT8 |
NUMERIC(P,S) | 如果精度介于 0 和 38 之间,则使用 DTS_TYPE_NUMBER, 如果精度为 39 或更大的值,则使用 DTS_TYPE_STRING |
DECIMAL(P,S) | 如果精度介于 0 和 38 之间,则使用 DTS_TYPE_NUMBER, 如果精度为 39 或更大的值,则使用 DTS_TYPE_STRING |
DECIMAL | DTS_TYPE_STRING |
NUMBER | DTS_TYPE_STRING |
DECIMAL(p) | DTS_TYPE_NUMBER |
NUMBER(p) | DTS_TYPE_NUMBER |
REAL | DTS_TYPE_FLOAT |
DOUBLE PRECISION | DTS_TYPE_DOUBLE |
SMALLSERIAL | DTS_TYPE_INT2 |
SERIAL | DTS_TYPE_INT4 |
BIGSERIAL | DTS_TYPE_INT8 |
TIME WITHOUT TIME ZONE | DTS_TYPE_TIME |
DATE | DTS_TYPE_DATE |
TIMESTAMP WITHOUT TIMEZONE | DTS_TYPE_DATETIME |
INTERVAL | DTS_TYPE_STRING |
BOOLEAN | DTS_TYPE_BOOLEAN |