怎么使用 数据传输 DTS 可以将本地 PostgreSQL 数据库实例的数据迁移到 RDS for PostgreSQL
使用 数据传输 DTS 可以将本地 PostgreSQL 数据库实例的数据迁移到 RDS for PostgreSQL 实例。PostgreSQL 迁移支持增量数据同步功能,可以实现在本地应用不停服的情况下,平滑完成 PostgreSQL 数据库的迁移工作。
本小节简单介绍使用 数据传输 DTS (以下简称 DTS)进行 PostgreSQL->RDS for PostgreSQL 数据迁移的任务配置流程。
迁移类型简介
结构迁移
DTS 将被迁移对象的结构定义迁移到目标实例。对于 PostgreSQL,DTS 支持结构迁移的对象包含:Table、trigger、view、sequence、function、user defined type、rule、domain、operation、aggregate。
全量数据迁移
DTS 将源数据库迁移对象的存量数据全部迁移到目标实例。
增量数据迁移
增量数据迁移将迁移过程中,本地 PostgreSQL 数据库实例的增量更新数据同步到目标 RDS for PostgreSQL 实例,最终实现本地 PostgreSQL 数据库实例同目标 RDS for PostgreSQL 实例保持动态数据同步的过程。使用增量数据迁移,可以实现在本地 PostgreSQL 数据库实例正常提供服务的同时,平滑完成本地 PostgreSQL->RDS For PostgreSQL 的数据迁移。
迁移限制
全量迁移支持的 PostgreSQL 版本为:9.2、9.3、9.4、9.5 及以上版本;增量迁移支持的源实例 PostgreSQL 版本:9.4.8、9.5 及以上版本。
迁移过程中,不支持 DDL 操作。
不支持迁移使用 C 语言编写的 function。
如果使用了对象名映射功能后,依赖这个对象的其他对象可能迁移失败。
迁移权限要求
当使用数据传输服务进行 PostgreSQL 迁移时,在不同迁移类型情况下,源跟目标数据库的迁移帐号权限要求如下:
迁移类型 | 结构迁移 | 全量迁移 | 增量数据迁移 |
---|---|---|---|
本地 PostgreSQL 实例 | pg_catalog 的 usage 权限 | 迁移对象的 select | superuser |
目标 RDS for PostgreSQL 实例 | 迁移对象的 create、usage 权限 | schema 的 owner | schema 的 owner |
迁移顺序
DTS 在进行 PostgreSQL->RDS For PostgreSQL 数据迁移时,为了解决对象间的依赖,提高迁移成功率。结构对象及数据的迁移顺序如下:
进行结构对象:Table、view、sequence、function、user defined type、rule、domain、operation、aggregate 的迁移
全量数据迁移
进行结构对象:trigger、foreign key 的迁移
全量数据迁移完成后,任务列表中的迁移进度为:结构迁移 100%,全量迁移 100%,迁移状态为“迁移中”,此时迁移任务正在进行步骤(3)中的对象的迁移。此时,请勿手动结束任务,否则会造成迁移数据丢失。待迁移状态显示为“迁移完成”后,表示全量数据迁移任务已经完成,这时可以安全地手动结束任务。
迁移步骤
下面详细介绍下使用 DTS 将本地的 PostgreSQL 数据库迁移到 RDS for PostgreSQL 的任务配置流程。
RDS实例数据库创建
在数据迁移过程中,如果待迁移的数据库在目标 RDS for PostgreSQL 实例中不存在,那么 DTS 自动会创建。但是对于如下两种情况,用户需要在配置迁移任务之前,手动创建数据库。
数据库名称不符合:RDS 定义规范(由小写字母、数字、下划线、中划线组成,字母开头,字母或数字结尾,最长 64 个字符)。
待迁移数据库,在本地 PostgreSQL 数据库实例和目标 RDS for PostgreSQL 实例中存储名称不同。
对于这两种情况,用户需要在配置迁移任务之前,先在 RDS 控制台完成数据库创建。具体参考RDS数据库创建流程。
迁移帐号创建
迁移任务配置,需要提供 PostgreSQL 数据库实例及目标 RDS for PostgreSQL 实例的迁移账号。迁移账号所需权限详见上文的 迁移权限要求。
如果您的本地 PostgreSQL 数据库实例或 RDS for PostgreSQL 实例的迁移账号尚未创建,那么可以参考如下流程创建迁移账号:
通过 PostgreSQL 客户端,在 PostgreSQL 中创建迁移账号。
如果您要使用增量迁移,那么创建的账号必须是 superuser,所以创建账号语句调整为:
参数说明:
username:要创建的账号名
password:该账号的登录密码
create user username with superuser password 'password'
create user username password 'password'
给迁移账号授权,本地 PostgreSQL 数据库实例及 RDS For PostgreSQL 实例的迁移账号权限要求详见上表。
参数说明:
privileges:该账号的操作权限,如 SELECT、INSERT、UPDATE 等。如果要授权该账号所有权限,则使用 ALL
tablename:表名。如果要授权该账号所有的表权限,则使用通配符 *
username:要授权的账号名
GRANT privileges ON tablename TO username;
逻辑流复制插件安装
如果您需要使用增量数据迁移进行不停机迁移,那么在任务配置之前,需要在本地 PostgreSQL 中安装 DTS 提供的逻辑流复制插件。
插件下载。
插件安装。
SELECT * FROM pg_create_logical_replication_slot('replication_slot_test', 'ali_decoding');
SELECT pg_drop_replication_slot('replication_slot_test');
解压下载的压缩包。
将 ali_decoding.so 文件拷贝到 PostgreSQL 安装路径的 lib 目录下。
如果用 rpm 包安装,那么这个绝对路径为:/usr/pgsql-{$version}/lib/,其中 $version 为版本号,例如如果版本为 9.5,那么绝对路径为:/usr/pgsql-9.5/lib。
将ali_decoding.contorl 文件拷贝到 PostgreSQL 安装路径下的share/extension 目录下。
如果用 rpm 包安装,那么这个绝对路径为:/usr/pgsql-${version}/share/extension/,其中 ${version}为 PostgreSQL 版本号,例如如果版本为 9.5,那么绝对路径为:/usr/pgsql-9.5/share/extension/。
测试安装是否成功。
使用 superuser 账号登录 PostgreSQL 客户端,运行如下 SQL,看是否能够成功创建 replication slot 。如果成功创建那么说明插件安装成功。
如果输出结果如下,说明插件安装成功。
测试成功后,使用如下 SQL 将 replication slot 删除掉。
迁移任务配置
当上面的所有前置条件都配置完成后,就可以开始正式的数据迁移了。下面详细介绍迁移任务配置流程。
进入数据传输 DTS 控制台,点击右上角的创建迁移任务,开始迁移任务配置。
本地 PostgreSQL 数据库实例跟目标 RDS for PostgreSQL 实例连接信息配置。
这个步骤主要配置 迁移任务名称,本地 PostgreSQL 数据库实例连接信息及目标 RDS for PostgreSQL 实例连接信息。其中:
实例类型:选择 RDS 实例
RDS 实例 ID: 配置迁移的目标 RDS for PostgreSQL 实例的实例 ID。 DTS 支持经典网络和 VPC 网络的 RDS for PostgreSQL 实例
数据库名称:连接 RDS for PostgreSQL 实例的默认数据库名
数据库账号:RDS For PostgreSQL 实例的连接账号
数据库密码:上面指定的 RDS for PostgreSQL 实例连接账号对应的密码
实例类型:选择 有公网 IP 的自建数据库
数据库类型: 选择 PostgreSQL
主机名或IP地址: 配置本地 PostgreSQL 数据库实例的访问地址,这个地址必须为公网访问方式
端口:本地 PostgreSQL 数据库实例的监听端口
数据库名称:连接本地 PostgreSQL 数据库实例的默认数据库名
数据库账号:本地 PostgreSQL 数据库实例的连接账号
数据库密码:本地 PostgreSQL 数据库实例连接账号对应的密码
任务名称
DTS 为每个任务自动生成一个任务名称,任务名称没有唯一性要求。您可以根据需要修改任务名称,建议为任务配置具有业务意义的名称,便于后续的任务识别。
源实例信息
目标实例信息
当配置完连接信息后,点击右下角 授权白名单 并进入下一步进行白名单授权。这个步骤 DTS 会将 DTS 服务器的 IP 地址添加到目标 RDS 实例的白名单中,避免因为 RDS 实例设置了白名单,导致 DTS 服务器连接不上 RDS for PostgreSQL 实例导致迁移失败。
选择迁移对象及迁移类型。
迁移类型
对于 PostgreSQL->RDS for PostgreSQL,支持 结构迁移、全量数据迁移、增量数据迁移。
如果只需要进行全量迁移,那么迁移类型选择:结构迁移 + 全量数据迁移。
如果需要进行不停机迁移,那么迁移类型选择:结构迁移 + 全量数据迁移+增量数据迁移。
迁移对象
选择您要迁移的对象。迁移对象选择的粒度可以为:库、表、列三个粒度。默认情况下,对象迁移到 RDS for PostgreSQL 实例后,对象名跟本地 PostgreSQL 数据库实例一致。如果您迁移的对象在源实例跟目标实例上名称不同,那么需要使用 DTS 提供的对象名映射功能,详细使用方式可以参考库表列映射。
预检查。
在迁移任务正式启动之前,会先进行前置预检查,只有预检查通过后,才能成功启动迁移。预检查的内容及修复方式可以参考本文末尾的 预检查简介 一节。
如果预检查失败,那么可以点击具体检查项后的按钮,查看具体的失败详情,并根据失败原因修复后,重新进行预检查。
启动迁移任务。
当预检查通过后,可以启动迁移任务,任务启动成功后,可以在任务列表中查看迁移的具体状态及迁移进度。
至此,完成本地 PostgreSQL 数据库实例到 RDS for PostgreSQL 实例的数据迁移任务配置。
预检查内容
DTS 在启动迁移之前,会进行前置预检查,本小节简单介绍 PostgreSQL->RDS for PostgreSQL 的预检查内容:
预检查项 | 检查内容 | 备注 |
---|---|---|
源库连接性检查 | 检查 DTS 服务同本地 PostgreSQL 数据库 实例的连通性 | (1) 填写信息是否有误?如果填写信息有误,请修改后重新预检查 (2) 检查端口是否配置从其他服务器连接 |
目的库连接性检查 | 检查 DTS 服务同目的 RDS for PostgreSQL 实例的连通性 | 检查填写信息是否有误,如果有误请先修改后重新预检查 |
源库版本检查 | 检查本地 PostgreSQL 数据库实例版本跟目标 RDS for PostgreSQL 是否一致 | 如果版本不一致,预检查会有提醒。可以根据提醒对本地 PostgreSQL 数据库实例进行升级或降级,也可以继续迁移 |
数据库可用性检查 | 检查待迁移数据库在目标 RDS for PostgreSQL 实例是否已存在 | 如果待迁移数据库命名规范不满足 RDS 实例要求,那么 DTS 在目标 RDS for PostgreSQL 实例创建待迁移数据库会报错失败,即数据库可用性检查会失败。此时可以参考 库表列映射 对迁移数据库进行重命名 |
源库权限检查 | 检查任务配置时,提供的本地 PostgreSQL 数据库实例的账号的权限是否满足要求 | 如果检查失败,那么请参考本文 迁移账号创建 一节对迁移账号进行授权后,重新进行预检查 |
目的库权限检查 | 检查任务配置时,提供的目的 RDS for PostgreSQL 数据库账号的权限是否满足要求 | 如果检查失败,那么请参考本文 迁移账号创建 一节对迁移账号进行授权后,重新进行预检查 |
同名对象存在性检查 | 检查待迁移对象在目标 RDS for PostgreSQL 实例中是否已经存在 | 如果检查失败,请将目标库中这些已经存在的对象删除后,重新进行预检查 |
源端同名对象存在性检查 | 检查要迁移到同一个数据库中的多个对象是否重名 | 如果检查失败,可以参考 库表列映射将重名对象进行重命名 |
约束完整性检查 | 检查待迁移对象依赖的父对象是否迁移 | 如果检查失败,那么可以修改迁移对象,同时迁移依赖的父对象后,重新预检查 |
增量拓扑冲突检查 | 检查同一个迁移对象是否已经存在迁移链路 | 如果存在冲突链路,那么需要删除掉冲突链路后,重新预检查 |
LC_MONETERY 一致性检查 | 检查源库、目标库的 Lc_monetery 定义是否一致 | 如果检查失败,可以修改目标 RDS For PostgreSQL 实例的 LC_MONETERY 定义,或者继续迁移 |
PostgreSQL 逻辑流复制插件检查 | 检查本地 PostgreSQL 实例是否安装了逻辑流复制插件 | 如果检查失败,可以参考下面的 逻辑流复制插件安装 一节安装逻辑流复制插件后重新预检查 |
PostgreSQL 逻辑流 slot 存在性检查 | 检查本地 PostgreSQL 数据库实例存在跟 DTS 创建的 replication slot 重名的 replication slot | 如果检查失败,可以删除本地 PostgreSQL 数据库实例中已经存在的同名 replication slot 后,重新预检查 |