自建Greenplum迁移到AnalyticDB PostgreSQL版

重要

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

云原生数据仓库AnalyticDB PostgreSQL版基于Greenplum构建,并深度优化演进,支持向量化计算,在Multi-Master架构下支持事务处理,对外接口完全兼容社区版Greenplum。本文介绍如何将自建Greenplum集群的数据迁移至AnalyticDB PostgreSQL版实例。

迁移流程

  1. 评估迁移风险,确定迁移方案和计划。

  2. 采购AnalyticDB PostgreSQL版测试实例,验证迁移方案(包含数据迁移验证和应用迁移验证)。

  3. 采购AnalyticDB PostgreSQL版生产实例,迁移自建Greenplum集群生产库。

  4. 将业务切换到AnalyticDB PostgreSQL版生产实例,验证业务。

注意事项

  • 目前仅支持数据迁移,不支持数据同步,如果迁移过程中新写入了数据,需要在迁移完成后主动补数。

  • 请尽量在业务停止写入的情况下进行迁移。如果迁移过程中业务不暂停,数据迁移会对业务性能产生一定影响,且数据迁移速度会降低。

  • 迁移完成后,AnalyticDB PostgreSQL版实例会执行ANALYZE来收集统计信息,以生成合适的执行计划。执行ANALYZE过程中,Master节点的CPU水位会暂时升高,CPU水位升高的时间由数据量决定。

  • 新建的AnalyticDB PostgreSQL版实例的Segment节点数量建议大于或等于源Greenplum集群的节点数量。如果使用gpcopy进行迁移,节点数量相同的情况下可以获得最佳迁移速度。

  • 请确认自建Greenplum集群与AnalyticDB PostgreSQL版实例支持的插件(Extension)差异,关于AnalyticDB PostgreSQL版支持的插件,请参见扩展插件列表

  • AnalyticDB PostgreSQL版实例与Greenplum 4X版本的语法存在部分语法不兼容的情况,需要您手动修改。

  • 如果自建Greenplum集群中有分区表或INHERIT表,建议您从子表粒度迁移。

选择迁移方法

迁移方法

场景

使用gpcopy迁移数据

自建Greenplum集群可以访问AnalyticDB PostgreSQL版实例。

重要

AnalyticDB PostgreSQL版存储弹性模式7.0版和Serverless实例暂不支持使用gpcopy迁移数据。

使用gptransfer迁移数据

AnalyticDB PostgreSQL版实例可以访问自建Greenplum集群。

使用OSS外表迁移数据

自建Greenplum集群和AnalyticDB PostgreSQL版实例无法互相访问。

使用gpcopy迁移数据

  1. 提交工单联系阿里云技术支持,并将AnalyticDB PostgreSQL版实例ID、自建Greenplum集群的IP地址和端口号、可用于迁移数据的Greenplum superuser权限账号和安装自建Greenplum集群的服务器的IP地址提供给阿里云技术支持。

  2. 在AnalyticDB PostgreSQL版实例设置IP白名单为0.0.0.0/0,允许外部IP访问。

    警告

    设置为0.0.0.0/0表示对访问的IP地址来源不作任何限制,此时AnalyticDB PostgreSQL版实例将面临高安全风险,请在数据迁移完成后立即修改IP白名单。

  3. 在自建Greenplum集群所在的服务器上下载gpcopy,同时让阿里云技术支持在AnalyticDB PostgreSQL版实例上下载并安装gpcopy。

    说明

    本文使用的gpcopy版本为2.3.2,建议您使用2.3.x版本的gpcopy迁移数据。如果使用2.4.x版本的gpcopy迁移,需要开启SSL链路加密。AnalyticDB PostgreSQL版实例设置SSL加密的方法,请参见设置SSL加密

  4. 在gpcopy压缩包所在的目录下执行以下脚本,用以安装gpcopy。

    #!/bin/bash
    
    tar xzvf gpcopy-2.3.2.tar.gz 
    
    cd gpcopy-2.3.2/
    cp gpcopy $GPHOME/bin
    cp gpcopy_helper $GPHOME/bin
    chmod 755 $GPHOME/bin/gpcopy
    chmod 755 $GPHOME/bin/gpcopy_helper
    
    host_sql=`psql -A -t -c "select address from gp_segment_configuration where role = 'p' and content >= 0 group by address"`
    host=(${host_sql})
    host_len=${#host[@]}
    
    host_str=""
    for ((i=0; i<$host_len; ++i)); do
        host_str=$host_str" -h "${host[$i]}
    done
    
    gpscp $host_str gpcopy_helper =:$GPHOME/bin
    gpssh $host_str -e "chmod 755 $GPHOME/bin/gpcopy_helper"
  5. 执行以下命令迁移数据。

    gpcopy --full --source-host <SOURCEHOST> --source-port <SOURCEPORT> --source-user <SOURCEUSER> --dest-host <DESTHOST> --dest-port <DESTPORT> --dest-user <DESTUSER> --jobs 4 --drop --validate count

    参数说明如下:

    参数

    说明

    --full

    表示全量迁移Greenplum集群的数据。

    如果只迁移Greenplum集群中的一个数据库,可以替换为-d <数据库名称>进行迁移。

    --jobs

    表示迁移任务的并发数,默认为4,即并行传输4张表。

    您需要根据业务需求调整并发数,建议设置为连接数的2*n+1个。

    <SOURCEHOST>

    自建Greenplum集群所在的服务器的IP地址。

    如果在自建Greenplum集群所在的服务器上执行迁移命令,可以使用localhost代替。

    <SOURCEPORT>

    自建Greenplum集群的端口号,默认为5432。

    您可以在自建Greenplum集群所在的服务器上执行gpstate -s命令查看实际端口号。

    <SOURCEUSER>

    自建Greenplum集群下具有superuser权限的账号。

    <DESTHOST>

    AnalyticDB PostgreSQL版实例的Master节点的IP地址,请联系阿里云技术支持获取。

    <DESTPORT>

    AnalyticDB PostgreSQL版实例的Master节点的端口号,请联系阿里云技术支持获取。

    <DESTUSER>

    AnalyticDB PostgreSQL版实例下superuser权限账号,请联系阿里云技术支持进行获取。

  6. 完成迁移后需要将AnalyticDB PostgreSQL版实例的IP白名单修改为业务所需的IP地址,并让阿里云技术支持将安全组、pg_hba免密、superuser权限账号等信息进行复原。

使用gptransfer迁移数据

  1. 创建AnalyticDB PostgreSQL版实例的初始账号,操作方法,请参见创建初始账号

  2. 将AnalyticDB PostgreSQL版实例的IP白名单设置为0.0.0.0/0,允许外部IP访问。

    警告

    设置为0.0.0.0/0表示对访问的IP地址来源不作任何限制,此时AnalyticDB PostgreSQL版实例将面临高安全风险,请在数据迁移完成后立即修改IP白名单。

  3. 将AnalyticDB PostgreSQL版实例的内核版本升级至最新版,如何查看内核版本和升级内核版本,请参见查看内核小版本版本升级

  4. 提交工单联系阿里云技术支持,将AnalyticDB PostgreSQL版的实例ID、自建Greenplum集群的IP地址和端口号、可以用于迁移数据的Greenplum的账号、Greenplum集群所在服务器的IP地址等信息提供给阿里云技术支持。

  5. 等待数据迁移完成。

  6. 将AnalyticDB PostgreSQL版实例的IP白名单修改为业务所需的IP地址,并对数据进行验证。完成后即可将业务的连接地址切换至AnalyticDB PostgreSQL版实例。

使用OSS外表迁移数据

Schema迁移

  1. 在自建Greenplum集群的Master节点,通过pg_dumpall或pg_dump工具导出DDL Schema,Bash命令示例如下。

    export PGHOST=<自建Greenplum集群的IP地址>
    export PGPORT=<自建Greenplum集群的端口号>
    export PGUSER=<自建Greenplum集群的superuser权限账号>
    export PGPASSWORD=<以上superuser权限账号的密码>
    
    #-- Greenplum 4X版本导出全部Schema。
    pg_dumpall -s -q --gp-syntax  > full_schema.sql
    
    #-- Greenplum 5X或6X版本导出全部Schema。
    pg_dumpall -s --gp-syntax  > full_schema.sql
  2. 使用psql登录自建Greenplum集群,检查是否存在自定义library,如果存在自定义library,则需要手动在AnalyticDB PostgreSQL版数据库中创建对应的Schema。检查否存在自定义library的语句如下。

    SELECT * FROM pg_catalog.pg_library;
  3. 在服务器上执行DDL Schema,Bash命令示例如下。

    export PGHOST=<AnalyticDB PostgreSQL实例的连接地址>
    export PGPORT=<AnalyticDB PostgreSQL实例的端口号>
    export PGUSER=<AnalyticDB PostgreSQL实例的初始账号>
    export PGPASSWORD=<AnalyticDB PostgreSQL实例的初始账号的密码>
    
    psql postgres -f full_schema.sql > psql.log 2>&1 &

    Bash命令执行过程中请注意psql.log文件中是否产生错误信息,并对错误信息进行分析解决。错误信息基本都与SQL语法有关(尤其4X版本),不兼容项的相关检查,请参见4.3版本与6.0版本兼容性注意事项4.3版升级6.0版不兼容项检查参考指南

表数据迁移

  1. 导出自建Greenplum集群的数据,您可以通过COPY TO命令或GPFDIST外表两种方法导出。

    • COPY TO命令

      在psql客户端使用COPY TO命令导出表数据,SQL示例如下:

      • Greenplum 4X、5X、6X版本导出表数据的语句示例如下。

        COPY public.t1 TO '/data/gpload/public_t1.csv' FORMAT CSV ENCODING 'UTF8';
      • Greenplum 5X、6X版本支持ON SEGMENT语句,可以使用以下语句。

        COPY public.t1 TO '<SEG_DATA_DIR>/public_t1_<SEGID>.csv' FORMAT CSV ENCODING 'UTF8' 
        ON SEGMENT;
        说明

        请不要修改字符串<SEGID>,系统在导出时会自动生成对应的<SEGID>。字符串<SEG_DATA_DIR>您可以根据需求保持原样或自定义一个绝对路径。

        COPY命令具体使用方式,请参见COPY

    • GPFDIST外表

      1. 启动GPFDIST服务(GPFDIST在自建Greenplum启动程序的bin目录下),Bash命令如下:

        mkdir -p /data/gpload
        gpfdist -d /data/gpload -p 8000 & 
      2. 使用psql连接自建Greenplum数据库,导出表数据,SQL示例如下。

        -- public.t1为已知要迁移的表
        CREATE WRITABLE EXTERNAL TABLE ext_w_t1 (LIKE public.t1)
        LOCATION ('gpfdist://<Greenplum连接地址>:8000/public_t1.csv') FORMAT 'CSV' ENCODING 'UTF8';
        
        -- 写入外表
        INSERT INTO ext_w_t1 SELECT * FROM public.t1;
  2. 将导出的数据上传到阿里云OSS上,如何将数据上传到阿里云OSS,请参见控制台上传文件

    说明

    阿里云OSS需要和AnalyticDB PostgreSQL版实例在同一地域。

  3. 使用OSS外表将数据导入到AnalyticDB PostgreSQL版实例中。具体操作,请参见导入OSS数据到本地表

数据验证

对比AnalyticDB PostgreSQL版实例内的数据与自建Greenplum集群内的数据,确保数据和业务没有区别。数据验证分为数据一致性验证和业务一致性验证:

  • 数据一致性验证:您可以全量对比数据也可以抽样对比数据,抽样对比需要重点验证表数据量是否一致和数值类型字段聚合计算结果是否一致。

  • 业务一致性验证:您需要将应用系统配置源指向AnalyticDB PostgreSQL版实例,检查业务功能和执行结果是否正常。

其他迁移方式

您可也以使用阿里云DataWorks工具来迁移数据。具体操作,请参见DataWorks数据集成