本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
您可通過阿里云在線遷移服務或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 PARQUET或CSV格式。
導出數據時,建議使用并行導出(PARALLEL ON),提高導出效率,生成更多文件分片。
導出數據時,建議通過MAXFILESIZE參數設置合適的文件段大小,盡可能生成多個文件段,推薦數量為AnalyticDB PostgreSQL版實例的節點個數的整數倍,便于后續OSS外表并行導入AnalyticDB PostgreSQL版,提高效率。
步驟二:將Amazon S3數據同步到阿里云OSS
本文提供了在線遷移服務和ossimport工具兩種同步方法。
在線遷移服務
登錄阿里云數據遷移服務控制臺。
分別創建用于數據同步的源地址和目標地址。
在左側導航欄中,選擇
。單擊創建數據地址,創建源地址。
在創建數據地址面板,配置如下參數,然后單擊確定。
參數
是否必選
說明
數據類型
是
選擇AWS S3。
數據名稱
是
輸入3~63位字符。不支持短劃線(-)和下劃線(_)之外的特殊字符。
Endpoint
是
輸入AWS S3的訪問域名。更多信息,請參見管理接入點。
重要鏈接文檔僅供參考,由于源站變更,文檔可能已經過時。
Bucket
是
輸入待遷移數據所在的AWS S3存儲桶名稱。
說明存儲桶名稱要求開頭和結尾不帶空格、換行、制表符等非法字符。
Prefix
是
您可以指定數據路徑前綴遷移部分數據。
指定前綴:遷移指定目錄(前綴)下的數據。格式要求不能以正斜線(/)開頭,必須以正斜線(/)結尾。
不指定前綴:遷移整個Bucket中的數據。
AccessKey Id和SecretAccess Key
是
輸入創建的IAM用戶的訪問密鑰,用于AWS S3進行身份識,確認該用戶是否有讀取源數據的權限。
再次單擊創建數據地址,創建目標地址。
在創建數據地址面板,配置如下參數,然后單擊確定。
參數
是否必選
說明
數據類型
是
選擇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~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中存在至少一個不同,則執行覆蓋。
全覆蓋:對于同名文件,不進行任何判斷,直接執行覆蓋。
不覆蓋:對于同名文件,不進行任何判斷,直接執行跳過。
警告條件覆蓋或最后修改時間優先無法嚴格保證一定不會覆蓋更新的文件,存在舊文件覆蓋新文件的風險。
若您選擇條件覆蓋或最后修改時間優先覆蓋策略時,請務必確保源端文件能返回LastModified、Size、Content-Type等信息,否則覆蓋策略可能失效,產生非預期的遷移結果。
在性能調優頁簽的數據預估區域,填寫待遷移存儲量和待遷移文件個數。
說明為了遷移任務的順利進行,請盡量準確進行數據預估。更多信息,請參見預估遷移數據。
可選:在性能調優頁簽的流量控制區域,設置限流時間段和最大流量,然后單擊添加。
說明為了不影響您在線業務的訪問,建議您根據業務訪問的波峰和波谷來設置遷移時的限流時間段和最大流量。
單擊創建,等待遷移任務完成。
ossimport
下載并安裝單機模式的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 # 說明文檔,強烈建議使用前仔細閱讀
配置單機模式的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概述。
運行ossimport將數據同步至OSS。單機版ossimport的具體操作,請參見單機部署。
步驟三:創建用于裝載數據的目標表
在AnalyticDB PostgreSQL版實例中創建用于裝載Amazon Redshift的數據的目標表。目標表結構需與源表結構一致,建表語法,請參見CREATE TABLE。
如需修改DDL定義,例如SCHEMA、TABLE、FUNCTION、VIEW等對象信息,請參見DDL語法轉換。
步驟四:將OSS數據導入AnalyticDB PostgreSQL版實例
您可以通過COPY命令或OSS外表將數據導入AnalyticDB PostgreSQL版:
使用COPY命令導入OSS數據的方法,請參見使用COPY或UNLOAD命令導入或導出數據到OSS。
使用OSS外表導入OSS數據的方法,請參見導入OSS數據到本地表。
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語句,包含ENCODE和SORTKEY選項:
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子句。