Amazon Redshift应用和数据迁移至AnalyticDB PostgreSQL

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

您可通过阿里云在线迁移服务或ossimport迁移工具将Amazon Redshift数据迁移至云原生数据仓库AnalyticDB PostgreSQL版

准备工作

  • 需要迁移的Amazon Redshift实例。

  • 用于导出Amazon Redshift数据的Amazon S3服务。

  • 已开通阿里云对象存储服务(OSS)。OSS的详细信息,请参见什么是对象存储OSS

  • 已创建OSS存储空间,请参见创建存储空间

    说明

    建议OSS存储空间与AnalyticDB PostgreSQL版实例在同一地域,便于后续数据导入数据库中。

  • 已创建AnalyticDB PostgreSQL版实例,如何选择实例规格,请参见规格选型

规格选型

以下内容将指导您如何根据源Amazon Redshift实例规格选择目标AnalyticDB PostgreSQL版的规格。

Amazon Redshift实例由Leader Node和多个Compute Node组成。

  • Leader Node:相当于AnalyticDB PostgreSQL版的Master节点,负责与客户端通信,分析和制定执行计划,实施数据库操作。

  • Compute Node:相当于AnalyticDB PostgreSQL版的Segment节点,由多个Node Slices组成。每个Node Slices都相当于AnalyticDB PostgreSQL版的单个Segment节点,负责实际的数据存储和查询计算。

当创建AnalyticDB PostgreSQL版实例时,如果不知道如何选择规格,根据Amazon Redshift中每个Node Slice的规格来选择合适的AnalyticDB PostgreSQL版节点规格。

示例

源Amazon Redshift实例包含4个Compute Node(每个Node下包含两个Node Slices),每个Node Slices规格为2核16 GB,存储为1 TB。

根据源Amazon Redshift实例规格,您在创建AnalyticDB PostgreSQL版实例时,可以选择8个Segment节点,节点规格为2C16GB;每个Segment节点的存储容量选择1000 GB。

说明
  • 创建AnalyticDB PostgreSQL版实例具体操作,请参见创建实例

  • 存储磁盘类型建议选择ESSD云盘,I/O性能比高效云盘更佳。

操作步骤

步骤一:将Amazon Redshift的数据导出到Amazon S3

您可以使用UNLOAD命令进行导出,如何导出,请参见UNLOAD

UNLOAD命令语法如下。

UNLOAD ('select-statement')
TO 's3://object-path/name-prefix'
authorization
[ option [ ... ] ]

where option is
{ [ FORMAT [ AS ] ] CSV | PARQUET
| PARTITION BY ( column_name [, ... ] ) [ INCLUDE ]
| MANIFEST [ VERBOSE ] 
| HEADER           
| DELIMITER [ AS ] 'delimiter-char' 
| FIXEDWIDTH [ AS ] 'fixedwidth-spec'   
| ENCRYPTED [ AUTO ]
| BZIP2  
| GZIP 
| ZSTD
| ADDQUOTES 
| NULL [ AS ] 'null-string'
| ESCAPE
| ALLOWOVERWRITE
| CLEANPATH
| PARALLEL [ { ON | TRUE } | { OFF | FALSE } ]
| MAXFILESIZE [AS] max-size [ MB | GB ] 
| REGION [AS] 'Amazon-region' }
说明
  • 导出数据时,建议使用FORMAT AS PARQUETCSV格式。

  • 导出数据时,建议使用并行导出(PARALLEL ON),提高导出效率,生成更多文件分片。

  • 导出数据时,建议通过MAXFILESIZE参数设置合适的文件段大小,尽可能生成多个文件段,推荐数量为AnalyticDB PostgreSQL版实例的节点个数的整数倍,便于后续OSS外表并行导入AnalyticDB PostgreSQL版,提高效率。

步骤二:将Amazon S3数据同步到阿里云OSS

本文提供了在线迁移服务和ossimport工具两种同步方法。

在线迁移服务

  1. 登录阿里云数据迁移服务控制台

  2. 分别创建用于数据同步的源地址和目标地址。

    1. 在左侧导航栏中,选择在线迁移服务 > 数据地址

    2. 单击创建数据地址,创建源地址。

    3. 创建数据地址面板,配置如下参数,然后单击确定

      参数

      是否必选

      说明

      数据类型

      选择AWS S3

      数据名称

      输入3~63位字符。不支持短划线(-)和下划线(_)之外的特殊字符。

      Endpoint

      输入AWS S3的访问域名。更多信息,请参见管理接入点

      重要

      链接文档仅供参考,由于源站变更,文档可能已经过时。

      Bucket

      输入待迁移数据所在的AWS S3存储桶名称。

      说明

      存储桶名称要求开头和结尾不带空格、换行、制表符等非法字符。

      Prefix

      您可以指定数据路径前缀迁移部分数据。

      • 指定前缀:迁移指定目录(前缀)下的数据。格式要求不能以正斜线(/)开头,必须以正斜线(/)结尾。

      • 不指定前缀:迁移整个Bucket中的数据。

      AccessKey IdSecretAccess Key

      输入创建的IAM用户的访问密钥,用于AWS S3进行身份识,确认该用户是否有读取源数据的权限。

    4. 再次单击创建数据地址,创建目标地址。

    5. 创建数据地址面板,配置如下参数,然后单击确定

      参数

      是否必选

      说明

      数据类型

      选择OSS

      数据名称

      输入3~63位字符。不支持短划线(-)和下划线(_)之外的特殊字符。

      数据所在区域

      选择目的地址所在的地域。

      开通并使用传输加速

      在线迁移服务使用OSS的传输加速服务,需要开通Bucket的传输加速服务。开启传输加速后,会在30分钟内生效,请在30分钟后再创建迁移任务。

      重要

      开启了传输加速的Bucket会收取传输加速费用。关于传输加速的更多信息,请参见传输加速

      OSS Endpoint

      根据您目的数据所在区域,选择一个Endpoint。关于Endpoint的具体信息,请参见访问域名

      说明

      将第三方数据迁移到OSS时,只能选择外网Endpoint访问OSS。

      AccessKey Id和AccessKey Secret

      输入创建的RAM用户的AccessKey,用于OSS进行身份识别,确认该用户是否有写入迁移数据的权限。

      OSS Bucket

      选择或输入迁移目的所在的存储桶(Bucket)名称。

      OSS Prefix

      数据路径前缀。

      • 指定前缀:您可以设置数据路径前缀将源数据迁移至指定目录下。格式要求不能以正斜线(/)开头,必须以正斜线(/)结尾,例如data/to/oss/

      • 不指定前缀:不设置数据路径前缀时,会将源数据迁移至目的Bucket的根目录。

      重要

      若您迁移的源地址文件中有以正斜线(/)开头的文件名,配置目的地址的时候需要添加一个OSS Prefix,否则会导致迁移失败。例如:需要迁移的文件中包含/test/test.png这个文件,您需要添加一个OSS Prefix,如:oss/。当迁移完成后,/test/test.png的OSS文件名变为oss//test/test.png。

  3. 创建在线迁移任务。

    1. 在左侧导航栏中,选择在线迁移服务 > 迁移任务

    2. 单击创建迁移任务

    3. 创建迁移任务面板,阅读迁移服务条款协议,选中我理解如上条款,并开通数据迁移服务,单击下一步

    4. 在弹出的费用提示对话框,单击确认,继续创建

    5. 配置任务页签,配置如下参数,单击下一步

      参数

      是否必选

      说明

      任务名称

      输入3~63位字符。不支持短划线(-)和下划线(_)之外的特殊字符。

      源地址

      选择已创建的源地址。

      目的地址

      选择已创建的目的地址。

      指定目录

      设置迁移时包含或排除指定目录下的文件和子目录。

      • 不过滤:不过滤迁移目录。

      • 排除:迁移时,不迁移排除目录下的文件和子目录。

        例如,当您只想迁移root_dir/下除了root_dir/bad_sub1/root_dir/bad_sub2/之外的所有目录时,您可以选择排除模式,然后添加两项bad_sub1/bad_sub2/

      • 包含:迁移时,只迁移包含目录下的文件和子目录。

        例如,当您只想迁移root_dir/下的root_dir/good_sub1/root_dir/good_sub2/这两个目录时,您可以选择包含模式,然后添加两项good_sub1/good_sub2/

      说明
      • 目录中仅支持数字和大小写字母,除此之外的特殊字符可能会导致迁移失败。

      • 目录不能以正斜线(/)或者反斜线(\)开头,并且目录中不能出现两个正斜线(//),两个半角句号(..)和半角双引号("),提交的所有目录总字符长度不能超过10 KB。

      • 目录要以正斜线(/)结尾,例如docs/

      • 最多可设置20个排除目录或者包含目录。

      迁移方式

      选择迁移数据的方式。

      • 全量迁移:根据迁移起点时间迁移一次指定迁移起点时间之后的全量数据,数据迁移完成后任务结束。

        如果迁移完成后源数据有变化,您可以再次提交全量迁移任务,系统将仅迁移变化的数据。

      • 增量迁移:按设定的增量迁移间隔增量迁移次数执行迁移任务。

        • 首次根据迁移起点时间迁移指定迁移起点时间之后的全量数据。首次迁移完成后,按照增量迁移时间间隔执行增量迁移任务,将源地址从前次迁移任务开始后到下次迁移开始前新增或修改的增量数据迁移至目的地址。

        • 如果配置的增量迁移次数是N,则执行1次全量迁移,之后执行N-1次增量迁移。

          例如:设置迁移间隔1小时,迁移次数5次,迁移起点时间为2019-03-05 08:00,当前时间为2019-03-10 08:00。则首次迁移最后修改时间在2019-03-05 08:00~2019-03-10 08:00之间的文件。假设迁移任务1小时完成,第二次迁移则从2019-03-10 10:00(迁移1小时,迁移间隔1小时)开始,迁移最后修改时间在2019-03-10 08:00~2019-03-10 10:00之间的文件,共进行1次全量迁移和4次增量迁移。

      重要

      全量迁移和增量迁移均会在每次迁移开始前,对源地址和目的地址的文件进行对比。如果迁移同名文件,则以下三种情况的目标地址文件会被覆盖。

      • 源地址文件与目标地址文件的Content-Type不一致,目标地址文件会被覆盖。

      • 源地址文件的最后修改时间晚于目标地址文件的最后修改时间,目标地址文件会被覆盖。

      • 源地址文件与目标地址文件的大小不一致,目标地址文件会被覆盖。

      迁移文件起点时间

      选择迁移文件的起点时间。

      • 迁移全部:迁移所有时间的文件。

      • 指定时间:只迁移指定时间之后创建或修改的文件。

        例如指定时间设置为2018-11-01 08:00:00,则只迁移2018年11月01日8点之后创建或修改的文件,在这个时间之前创建或修改的文件被忽略。

      增量迁移间隔

      是(针对增量迁移)

      默认值1小时,最大值24小时。

      增量迁移次数

      是(针对增量迁移)

      默认值1次,最大值30次。

      文件覆盖方式

      源地址中文件和目的地址中文件同名时,迁移过程中执行的覆盖方式。包括如下选项:

      • 最后修改时间优先:对于同名文件,判断两个文件的LastModified,即最后修改时间。

        • 如果源地址中文件的LastModified晚于目的地址中文件的LastModified,则执行覆盖。

        • 如果源地址中文件的LastModified早于目的地址中文件的LastModified,则执行跳过。

        • 如果两个文件的LastModified相同,则继续判断两个文件的Size和Content-Type是否均相同。

          如果两个文件的Size和Content-Type均相同,则执行跳过;如果两个文件的Size或者Content-Type中存在至少一个不同,则执行覆盖。

      • 条件覆盖:对于同名文件,判断两个文件的LastModified、Size和Content-Type是否相同。

        • 如果两个文件的LastModified、Size和Content-Type均相同,则执行跳过。

        • 如果两个文件的LastModified、Size和Content-Type中存在至少一个不同,则执行覆盖。

      • 全覆盖:对于同名文件,不进行任何判断,直接执行覆盖。

      • 不覆盖:对于同名文件,不进行任何判断,直接执行跳过。

        警告
        • 条件覆盖最后修改时间优先无法严格保证一定不会覆盖更新的文件,存在旧文件覆盖新文件的风险。

        • 若您选择条件覆盖最后修改时间优先覆盖策略时,请务必确保源端文件能返回LastModifiedSizeContent-Type等信息,否则覆盖策略可能失效,产生非预期的迁移结果。

    6. 性能调优页签的数据预估区域,填写待迁移存储量待迁移文件个数

      说明

      为了迁移任务的顺利进行,请尽量准确进行数据预估。更多信息,请参见预估迁移数据

    7. 可选:性能调优页签的流量控制区域,设置限流时间段最大流量,然后单击添加

      说明

      为了不影响您在线业务的访问,建议您根据业务访问的波峰和波谷来设置迁移时的限流时间段最大流量

    8. 单击创建,等待迁移任务完成。

ossimport

  1. 下载并安装单机模式的ossimport,如何下载并安装,请参见ossimport概述

    单机模式的ossimport软件的文件结构如下:

    ossimport
    ├── bin
    │   └── ossimport2.jar  # 包括Master、Worker、TaskTracker、Console四个模块的总jar
    ├── conf
    │   ├── local_job.cfg   # Job配置文件
    │   └── sys.properties  # 系统运行参数配置文件
    ├── console.bat         # Windows命令行,可以分布执行调入任务
    ├── console.sh          # Linux命令行,可以分布执行调入任务
    ├── import.bat          # Windows一键导入,执行配置文件为conf/local_job.cfg配置的数据迁移任务,包括启动、迁移、校验、重试
    ├── import.sh           # Linux一键导入,执行配置文件为conf/local_job.cfg配置的数据迁移任务,包括启动、迁移、校验、重试
    ├── logs                # 日志目录
    └── README.md           # 说明文档,强烈建议使用前仔细阅读
  2. 配置单机模式的ossimport。

    您仅需修改配置文件conf/local_job.cfg中的如下参数。

    srcType=s3
    srcAccessKey=<Amazon的AccessKey ID>
    srcSecretKey=<Amazon的AccessKey Secret>
    srcDomain=<Amazon S3对应地域的域名>
    srcBucket=<Amazon S3的Bucket名称>
    destAccessKey=<阿里云的AccessKey ID>
    destSecretKey=<阿里云的AccessKey Secret>
    destDomain=<阿里云OSS对应地域的endpoint>
    destBucket=<阿里云OSS的Bucket名称>
    destPrefix=
    isSkipExistFile=true

    关于ossimport配置的详细信息,请参见ossimport概述

  3. 运行ossimport将数据同步至OSS。单机版ossimport的具体操作,请参见单机部署

步骤三:创建用于装载数据的目标表

AnalyticDB PostgreSQL版实例中创建用于装载Amazon Redshift的数据的目标表。目标表结构需与源表结构一致,建表语法,请参见CREATE TABLE

如需修改DDL定义,例如SCHEMA、TABLE、FUNCTION、VIEW等对象信息,请参见DDL语法转换

步骤四:将OSS数据导入AnalyticDB PostgreSQL版实例

您可以通过COPY命令或OSS外表将数据导入AnalyticDB PostgreSQL版

DDL语法转换

Amazon Redshift DDL语法与AnalyticDB PostgreSQL版DDL语法略有不同,迁移前您需要对这些语法进行转换。

CREATE SCHEMA

按照AnalyticDB PostgreSQL版语法标准创建Schema,示例如下:

CREATE SCHEMA schema1 AUTHORIZATION xxxpoc;
GRANT ALL ON SCHEMA schema1 TO xxxpoc;
GRANT ALL ON SCHEMA schema1 TO public;
COMMENT ON SCHEMA model IS 'for xxx migration  poc test';

CREATE SCHEMA oss_external_table AUTHORIZATION xxxpoc;

CREATE FUNCTION

由于AnalyticDB PostgreSQL版不兼容Amazon Redshift的部分SQL函数,因此您需要定制或者重写这些函数。示例如下:

  • CONVERT_TIMEZONE(a,b,c),使用如下语句替换:

    timezone(b, timezone(a,c))
  • GETDATE(),使用如下语句替换:

    current_timestamp(0):timestamp
  • 用户定义函数(UDF)替换或优化。Redshift示例函数如下:

    CREATE OR REPLACE FUNCTION public.f_jdate(dt timestamp without time zone)
    RETURNS character varying AS
    '      from datetime import timedelta, datetime
           if dt.hour < 4:
                  d = timedelta(days=-1)
                  dt = dt + d
           return str(dt.date())'
    LANGUAGE plpythonu IMMUTABLE;
    COMMIT;

    使用如下语句替换:

    to_char(a - interval '4 hour', 'yyyy-mm-dd')
  • 其他Amazon Redshift标准的函数。

    您可以在Functions and Operators中查看标准的PostgreSQL函数的用法,修改或自行实现Amazon Redshift和AnalyticDB PostgreSQL版不兼容的函数,例如:

CREATE TABLE

  • 修改表名

    Amazon Redshift的表名最大有效长度为127个字节,而AnalyticDB PostgreSQL版的表名默认最大有效长度为63字节。若表、函数、视图等对象名称超过63个有效字符时,需要裁剪名称。

  • 修改压缩算法

    您需要删除Amazon Redshift建表语句中的ENCODE XXX,用如下子句代替。

    WITH (COMPRESSTYPE={ZLIB|ZSTD|RLE_TYPE|NONE})

    AnalyticDB PostgreSQL版支持的压缩算法,请参见压缩

  • 修改分布键

    Amazon Redshift支持三种分布键(分配)。您需按照如下规则修改分布键:

    • EVEN分配:可用DISTRIBUTED RANDOMLY代替。

    • KEY分配:可用DISTRIBUTED BY (column, [ ... ] )代替。

    • ALL分配:可用DISTRIBUTED REPLICATED代替。

  • 修改排序键(SortKey)

    删除Amazon Redshift的排序键子句[ COMPOUND | INTERLEAVED ] SORTKEY (column_name [, ...] ) ]中的COMPOUND或者INTERLEAVED选项,使用如下子句代替。

    order by (column, [ ... ])

示例如下:

  • 示例一:

    Amazon Redshift的CREATE TABLE语句:

    CREATE TABLE schema1.table1
    (
        filed1 VARCHAR(100) ENCODE lzo,
        filed2 INTEGER DISTKEY,
        filed3 INTEGER,
        filed4 BIGINT ENCODE lzo,
        filed5 INTEGER
    )
    INTERLEAVED SORTKEY
    (
        filed1,
        filed2
    );

    转换成AnalyticDB PostgreSQL版的CREATE TABLE语句:

    CREATE TABLE schema1.table1
    (
        filed1 VARCHAR(100) ,
        filed2 INTEGER,
        filed3 INTEGER,
        filed4 BIGINT,
        filed5 INTEGER
    )
    WITH(APPENDONLY=true,ORIENTATION=column,COMPRESSTYPE=zstd)
    DISTRIBUTED BY (filed2)
    ORDER BY (filed1, filed2);
    
    -- 排序
    SORT schema1.table1;
    MULTISORT schema1.table1;
  • 示例二:

    Amazon Redshift的CREATE TABLE语句,包含ENCODESORTKEY选项:

    CREATE TABLE schema2.table2
    (
        filed1 VARCHAR(50) ENCODE lzo,
        filed2 VARCHAR(50) ENCODE lzo,
        filed3 VARCHAR(20) ENCODE lzo,
    )
    DISTSTYLE EVEN
    INTERLEAVED SORTKEY
    (
        filed1
    );

    转换成AnalyticDB PostgreSQL版的CREATE TABLE语句:

    CREATE TABLE schema2.table2
    (
        filed1 VARCHAR(50),
        filed2 VARCHAR(50),
        filed3 VARCHAR(20),
    )
    WITH(APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zstd)
    DISTRIBUTED randomly
    ORDER BY (filed1);
    
    -- 排序
    SORT schema2.table2;
    MULTISORT schema2.table2;
    说明

    更多sortkey信息,请参见列存表使用排序键和粗糙集索引加速查询

CREATE VIEW

您需要将Amazon Redshift的CREATE VIEW语句转换成符合AnalyticDB PostgreSQL版语法的SQL语句。CREATE VIEW与CREATE TABLE的转换规则基本一致。

说明

不支持WITH NO SCHEMA BINDING子句。