全部产品
阿里云办公

将本地 PostgreSQL 迁移至 RDS for PostgreSQL

更新时间:2018-08-09 10:17:49

使用 数据传输 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 数据迁移时,为了解决对象间的依赖,提高迁移成功率。结构对象及数据的迁移顺序如下:

  1. 进行结构对象:Table、view、sequence、function、user defined type、rule、domain、operation、aggregate 的迁移
  2. 全量数据迁移
  3. 进行结构对象:trigger、foreign key 的迁移

全量数据迁移完成后,任务列表中的迁移进度为:结构迁移 100%,全量迁移 100%,迁移状态为“迁移中”,此时迁移任务正在进行步骤(3)中的对象的迁移。此时,请勿手动结束任务,否则会造成迁移数据丢失。待迁移状态显示为“迁移完成”后,表示全量数据迁移任务已经完成,这时可以安全地手动结束任务。

迁移步骤

下面详细介绍下使用 DTS 将本地的 PostgreSQL 数据库迁移到 RDS for PostgreSQL 的任务配置流程。

RDS实例数据库创建

在数据迁移过程中,如果待迁移的数据库在目标 RDS for PostgreSQL 实例中不存在,那么 DTS 自动会创建。但是对于如下两种情况,用户需要在配置迁移任务之前,手动创建数据库。

  1. 数据库名称不符合:RDS 定义规范(由小写字母、数字、下划线、中划线组成,字母开头,字母或数字结尾,最长 64 个字符)。
  2. 待迁移数据库,在本地 PostgreSQL 数据库实例和目标 RDS for PostgreSQL 实例中存储名称不同。

对于这两种情况,用户需要在配置迁移任务之前,先在 RDS 控制台完成数据库创建。具体参考RDS数据库创建流程

迁移帐号创建

迁移任务配置,需要提供 PostgreSQL 数据库实例及目标 RDS for PostgreSQL 实例的迁移账号。迁移账号所需权限详见上文的 迁移权限要求。

如果您的本地 PostgreSQL 数据库实例或 RDS for PostgreSQL 实例的迁移账号尚未创建,那么可以参考如下流程创建迁移账号:

  1. 通过 PostgreSQL 客户端,在 PostgreSQL 中创建迁移账号。

    1. create user username password 'password'

    如果您要使用增量迁移,那么创建的账号必须是 superuser,所以创建账号语句调整为:

    1. create user username with superuser password 'password'

    参数说明:

    • username:要创建的账号名
    • password:该账号的登录密码
  2. 给迁移账号授权,本地 PostgreSQL 数据库实例及 RDS For PostgreSQL 实例的迁移账号权限要求详见上表。

    1. GRANT privileges ON tablename TO username;

    参数说明:

    • privileges:该账号的操作权限,如 SELECT、INSERT、UPDATE 等。如果要授权该账号所有权限,则使用 ALL
    • tablename:表名。如果要授权该账号所有的表权限,则使用通配符 *
    • username:要授权的账号名

逻辑流复制插件安装

如果您需要使用增量数据迁移进行不停机迁移,那么在任务配置之前,需要在本地 PostgreSQL 中安装 DTS 提供的逻辑流复制插件。

  1. 插件下载。

    PostgreSQL 9.4 版本

    PostgreSQL 9.5 版本

    PostgreSQL 9.6版本

    PostgreSQL 10.0版本

  2. 插件安装。

    1. 解压下载的压缩包。
    2. 将 ali_decoding.so 文件拷贝到 PostgreSQL 安装路径的 lib 目录下。

      如果用 rpm 包安装,那么这个绝对路径为:/usr/pgsql-{$version}/lib/,其中 $version 为版本号,例如如果版本为 9.5,那么绝对路径为:/usr/pgsql-9.5/lib。

    3. 将ali_decoding.contorl 文件拷贝到 PostgreSQL 安装路径下的share/extension 目录下。

      如果用 rpm 包安装,那么这个绝对路径为:/usr/pgsql-${version}/share/extension/,其中 ${version}为 PostgreSQL 版本号,例如如果版本为 9.5,那么绝对路径为:/usr/pgsql-9.5/share/extension/。

    4. 测试安装是否成功。

      使用 superuser 账号登录 PostgreSQL 客户端,运行如下 SQL,看是否能够成功创建 replication slot 。如果成功创建那么说明插件安装成功。

      1. SELECT * FROM pg_create_logical_replication_slot('replication_slot_test', 'ali_decoding');

      如果输出结果如下,说明插件安装成功。

      PostgreSQL 迁移_步骤 4

      测试成功后,使用如下 SQL 将 replication slot 删除掉。

      1. SELECT pg_drop_replication_slot('replication_slot_test');

迁移任务配置

当上面的所有前置条件都配置完成后,就可以开始正式的数据迁移了。下面详细介绍迁移任务配置流程。

  1. 进入数据传输 DTS 控制台,点击右上角的创建迁移任务,开始迁移任务配置。
  2. 本地 PostgreSQL 数据库实例跟目标 RDS for PostgreSQL 实例连接信息配置。

    这个步骤主要配置 迁移任务名称,本地 PostgreSQL 数据库实例连接信息及目标 RDS for PostgreSQL 实例连接信息。其中:

    • 任务名称

      DTS 为每个任务自动生成一个任务名称,任务名称没有唯一性要求。您可以根据需要修改任务名称,建议为任务配置具有业务意义的名称,便于后续的任务识别。

    • 源实例信息

      • 实例类型:选择 有公网 IP 的自建数据库
      • 数据库类型: 选择 PostgreSQL
      • 主机名或IP地址: 配置本地 PostgreSQL 数据库实例的访问地址,这个地址必须为公网访问方式
      • 端口:本地 PostgreSQL 数据库实例的监听端口
      • 数据库名称:连接本地 PostgreSQL 数据库实例的默认数据库名
      • 数据库账号:本地 PostgreSQL 数据库实例的连接账号
      • 数据库密码:本地 PostgreSQL 数据库实例连接账号对应的密码
    • 目标实例信息

      • 实例类型:选择 RDS 实例
      • RDS 实例 ID: 配置迁移的目标 RDS for PostgreSQL 实例的实例 ID。 DTS 支持经典网络和 VPC 网络的 RDS for PostgreSQL 实例
      • 数据库名称:连接 RDS for PostgreSQL 实例的默认数据库名
      • 数据库账号:RDS For PostgreSQL 实例的连接账号
      • 数据库密码:上面指定的 RDS for PostgreSQL 实例连接账号对应的密码

      PostgreSQL 迁移_步骤 1

      当配置完连接信息后,点击右下角 授权白名单 并进入下一步进行白名单授权。这个步骤 DTS 会将 DTS 服务器的 IP 地址添加到目标 RDS 实例的白名单中,避免因为 RDS 实例设置了白名单,导致 DTS 服务器连接不上 RDS for PostgreSQL 实例导致迁移失败。

  3. 选择迁移对象及迁移类型。

    • 迁移类型

      对于 PostgreSQL->RDS for PostgreSQL,支持 结构迁移、全量数据迁移、增量数据迁移。

      如果只需要进行全量迁移,那么迁移类型选择:结构迁移 + 全量数据迁移。

      如果需要进行不停机迁移,那么迁移类型选择:结构迁移 + 全量数据迁移+增量数据迁移。

    • 迁移对象

      选择您要迁移的对象。迁移对象选择的粒度可以为:库、表、列三个粒度。默认情况下,对象迁移到 RDS for PostgreSQL 实例后,对象名跟本地 PostgreSQL 数据库实例一致。如果您迁移的对象在源实例跟目标实例上名称不同,那么需要使用 DTS 提供的对象名映射功能,详细使用方式可以参考库表列映射

      PostgreSQL 迁移_步骤 2

  4. 预检查。

    在迁移任务正式启动之前,会先进行前置预检查,只有预检查通过后,才能成功启动迁移。预检查的内容及修复方式可以参考本文末尾的 预检查简介 一节。

    如果预检查失败,那么可以点击具体检查项后的按钮,查看具体的失败详情,并根据失败原因修复后,重新进行预检查。

    PostgreSQL 迁移_步骤 3

  5. 启动迁移任务。

    当预检查通过后,可以启动迁移任务,任务启动成功后,可以在任务列表中查看迁移的具体状态及迁移进度。

    至此,完成本地 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 后,重新预检查