全部產品
Search
文件中心

:Amazon Redshift應用和資料移轉至AnalyticDB PostgreSQL

更新時間:Jun 19, 2024

您可通過阿里雲線上遷移服務或ossimport遷移工具將Amazon Redshift資料移轉至雲原生資料倉儲AnalyticDB PostgreSQL版

準備工作

  • 需要遷移的Amazon Redshift執行個體。

  • 用於匯出Amazon Redshift資料的Amazon S3服務。

  • 已開通阿里雲Object Storage Service服務(OSS)。OSS的詳細資料,請參見什麼是Object Storage Service

  • 已建立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子句。