全部产品
数据传输服务DTS

本地PostgreSQL迁移至RDS for PostgreSQL

更新时间:2017-06-07 13:26:11   分享:   

使用数据传输DTS可以将本地PostgreSQL实例的数据迁移到RDS For PostgreSQL实例。PostgreSQL迁移支持增量数据同步功能,可以实现在本地应用不停服的情况下,平滑完成PostgreSQL数据库的迁移工作。

本小节简单介绍使用DTS进行PostgreSQL->RDS for PostgreSQL数据迁移的任务配置流程。

迁移类型简介

  • 结构迁移

    数据传输DTS将迁移对象的结构定义迁移到目标实例。对于PostgreSQL,数据传输服务支持结构迁移的对象包含:Table、trigger、view、sequence、function、user defined type、rule、domain、operation、aggregate

  • 全量数据迁移

    数据传输DTS将源数据库迁移对象的存量数据全部迁移到目标实例。

  • 增量数据迁移

    增量数据迁移将迁移过程中,本地PostgreSQL实例的增量更新数据同步到目标RDS实例,最终实现本地PostgreSQL同目标RDS实例进入动态数据同步的过程。使用增量数据迁移,可以实现在本地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实例 迁移对象的create、usage权限 schema的owner schema的owner

迁移顺序

数据传输服务在进行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实例中不存在,那么DTS自动会创建。但是对于如下两种情况,用户需要在配置迁移任务之前,手动创建数据库。

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

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

迁移帐号创建

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

如果您的本地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版本

  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实例的实例ID。 DTS支持经典网络、VPC网络的RDS实例
      • 数据库名称:连接RDS For PostgreSQL的默认数据库名
      • 数据库账号:RDS For PostgreSQL实例的连接账号
      • 数据库密码:上面RDS For PostgreSQL实例连接账号对应的密码

      PostgreSQL迁移_步骤1

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

  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实例的连通性 检查填写信息是否有误,如果有误请先修改后重新预检查
目的库连接性检查 检查DTS服务同目的RDS For PostgreSQL实例的连通性 检查填写信息是否有误,如果有误请先修改后重新预检查
源库版本检查 检查本地PostgreSQL版本跟目标RDS For PostgreSQL是否一致 如果版本不一致,预检查会有提醒。可以根据提醒对本地PostgreSQL进行升级或降级,也可以继续迁移
数据库可用性检查 检查待迁移数据库在目标RDS For PostgreSQL是否已存在 如果待迁移数据库命名规范不满足RDS实例要求,那么DTS在目标RDS实例创建待迁移数据库会报错失败,即数据库可用性检查会失败。此时可以参考 库表列映射 对迁移数据库进行重命名
源库权限检查 检查任务配置时,提供的本地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后,重新预检查
本文导读目录
本文导读目录
以上内容是否对您有帮助?