ここでは、Amazon Redshift から AnalyticDB for PostgreSQL へデータを移行するための全体の手順について説明します。
全体の手順
一般に、この移行プロセスには次のプロセスが含まれます。
- 主に AnalyticDB for PostgreSQL と OSS など、 Alibaba Cloud 関連プロダクトの選択と環境構築。
- 特定の時点で AWS Redshift データベースから S3 (Amazon Simple Storage Service) に移行されるデータをエクスポート。
- CSV データファイルを移動するために OSSImport を設定して起動。
- Schema、Tables、Views および Functions を含む、AnalyticDB for PostgreSQL データベースの さまざまなオブジェクトの構築。
- OSS 外部テーブルからデータテーブルにデータをインポート。
移行データの一般的な手順は次のとおりです。
AWS の準備
カスタマーからの S3 資格情報へのアクセス提供
以下の情報を含みます。
- AccessKeyID と AccessKey Secret
- s3 のエンドポイント。s3.ap-southeast-2.amazonaws.com など。
- バケット名。 alibaba-hybrid-export など。
エクスポートデータの形式規則
- データを CSV 形式ファイルにエクスポート
- エクスポートファイルのサイズは最大 50 M
- ファイル内の列値の順序は、テーブル作成文の列順序と同様
- ファイル数は、AnalyticDB for PostgreSQL のセグメント数と同じか、またはセグメント数の倍数であることを推奨
推奨される Redshift UNLOAD コマンドオプション
AnalyticDB for PostgreSQL インポートに最適な Redshift UNLOAD オプションを提供します。 UNLOAD オプションの例は次のとおりです。
unload (‘select * from test’)to ‘s3://xxx-poc/testexport‘access_key_id ‘<Your access key id>’secret_access_key ‘<Your access key secret>’DELIMITER AS ‘,’ADDQUOTESESCAPENULL AS ‘NULL’MAXFILESIZE 50 mb ;
この UNLOAD コマンドの例では、以下のオプションを推奨します。
DELIMITER AS ‘,’ADDQUOTESESCAPENULL AS ‘NULL’MAXFILESIZE 50 mb
Redshift データベース内のオブジェクトの DDL 文の取得
スキーマ、テーブル、関数、ビューを含むがこれらに限定されないすべての DDL ステートメントを AWS Redshift からエクスポートします。
Alibaba Cloud の準備
Alibaba Cloud RAM サブアカウントの準備
- RAM アカウント ID
- RAM アカウントのパスワード
- RAM アカウントの Access Key ID
- RAM アカウントの Access Key Secret
OSS バケットの準備
AWS S3 バケットと同じエリアに Alibaba Cloud OSS バケットを作成します。 リージョン: オーストラリア (シドニー)
OSS バケットの作成後、 インターネットアクセスエンドポイントアドレスおよびバケットの ECS (内部ネットワーク) からのVPC ネットワークアクセスを OSS コンソールから取得できます。
OSSImport のダウンロードとインストール
- 100 Mbps のネットワーク帯域幅で、バケットの同じ領域に ECS を作成します。ここでは、ECS のオペレーティングシステムとして Windows x64 を 使用します。
- 作成した ECS への OSSImport ツールのダウンロードとインストールを行います。 OSSImport ツールの最新バージョンは、こちらです。
- OSSImport パッケージを解凍した後、以下のようなフォルダーとファイルが表示されます。
ossimport├── bin│ └── ossimport2.jar # The JAR including master, worker, tracker, and console modules├── conf│ ├── local_job.cfg # Standalone job configuration file│ └── sys.properties # Configuration file for the system running├── console.bat # Windows command line, which can run distributed call-in tasks├── console.sh # Linux command line, which can run distributed call-in tasks├── import.bat # The configuration file for one-click import and execution in Windows is the data migration job configured in conf/local_job.cfg, including start, migration, validation, and retry├── import.sh # The configuration file of one-click import and execution in Linux is the data migration job configured in conf/local_job.cfg, including start, migration, validation, and retry├── logs # Log directory└── README.md # Description documentation. We recommend that you carefully read the documentation before using this feature
OSSImport を使用した S3 から OSS へのデータファイルの移行
OSSImport の設定
ここでは、スタンドアロン展開モードで OSSImport を使用します。
conf/local_job.cfg ファイルを例として編集します。 ここでは、この方法で変更する必要があるパラメーター設定のみが提供されます。 OSSImportの 詳しい設定手順は「アーキテクチャと設定」にあります。
srcType=s3srcAccessKey=”your AWS Access Key ID”srcSecretKey=”your AWS Access Key Secret”srcDomain=s3.ap-southeast-2.amazonaws.comsrcBucket=alibaba-hybrid-exportsrcBucket=destAccessKey=”your Alibaba Cloud Access Key ID”destSecretKey=”your Alibaba Cloud Access Key Secret”destDomain=http://oss-ap-southeast-2-internal.aliyuncs.comdestBucket=alibaba-hybrid-export-1destPrefix=isSkipExistFile=true
OSSImport 移行タスクの開始
OSSImport スタンドアロン展開モードでは、 import.bat コマンドを実行して移行タスクを開始します。
タスクステータスのモニタリング
データ移行プロセス中に、コマンド実行ウィンドウの出力を確認できます。 一方、リソースマネージャを介してネットワーク帯域幅の占有率を確認できます。
この例では、ECS と OSS バケットが同じリージョンで展開されているため、ECS から OSS バケットへのデータアップロード (イントラネットエンドポイント) 間のネットワーク速度は制限されません。 しかし、インターネットを介して S3 から OSS へデータがダウンロードされるので、ECS からOSS への速度は実質的に S3 から ECS への速度と同じであり、アップロード速度はダウンロード速度によって制限されます。
失敗したタスクの再試行 (オプション)
サブタスクはネットワークその他の理由で失敗する可能性があります。 再試行は失敗したタスクだけを再試行し、 成功したタスクは再試行しません。 ECS ウィンドウの cmd.exe にある console.bat.retry
を 実行します。
OSS バケットに移行されたファイルの確認 (オプション)
ファイルは OSS コンソールから確認します。 ossbrowser クライアントツールを使ってバケットの操作ファイルを表示することを推奨します。 ossbrower はこちらから取得できます。
CSV ファイルによるデータスクラビング (オプション)
<ul class="ul" id="ul-vvd-jct-jgb">
<li class="li" id="li-sen-0ai-m4o">CSV ファイルの <code class="ph codeph" id="codeph-tsx-gcn-m2h">NULL</code> を空白に置き換えます。
</li>
<li class="li" id="li-hzp-thh-6uy">CSV ファイルの <code class="ph codeph" id="codeph-phd-ona-1ki">\,</code> を <code class="ph codeph" id="codeph-vyi-pzz-1mq">,</code> に置き換えます。
</li>
</ul>
<p class="p" id="p-lr7-8bi-a7q">このデータスクラブ操作では、ローカルで実行することを推奨します。 したがって、 スクラブが必要なデータファイルは最初に、ossbrower ツールを通じて ECS
にダウンロードする必要があります。 その上でデータスクラブ操作を行います。 その後、データスクラブされたファイルを別の新しく作成されたバケットへアップロードし、 オリジナルの
CSV ファイルと区別します。 オリジナル CSV ファイルのダウンロード、あるいは消去されたファイルのアップロードの際、 ossbrowser で OSS のイントラネットエンドポイントを通信に使用して、
イントラネットトラフィックにかかるコストを削減することを推奨します。
</p>
</section>
<section class="section" id="section-wvd-jct-jgb">
<h2 class="title sectiontitle" id="title-yrf-bza-we0">Redshift から AnalyticDB for PostgreSQL へのDDL 変換</h2>
<p class="p" id="p-22h-lcv-9pd">ここでは、AnalyticDB for PostgreSQL データベースオブジェクトを作成する前に必要な準備について説明します。主に、Redshift 構文形式の
DDL 文を AnalyticDB for PostgreSQL 構文形式に変換します。 同時に、変換規則についても簡単に説明します。
</p>
<p class="p" id="p-adr-461-hfb"><strong class="ph b" id="b-31c-28v-mj8">スキーマの作成</strong></p>
<p class="p" id="p-bp5-w6y-tid">これは PostgreSQL の構文形式に準拠したサンプルで、保存して <strong class="ph b" id="b-zr5-fw5-ffo">schema.sql</strong> を作成します。
</p>
<pre class="pre codeblock" id="codeblock-1lz-if7-nvx"><code>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;
関数の作成
<p class="p" id="p-6jf-cir-xo4">Redshift が SQL 関数を提供しているので、対応する関数はしばらくの間 AnalyticDB には提供されていません。ですので、これらの関数をカスタマイズするか書き直す必要があります。</p>
<ul class="ul" id="ul-yvd-jct-jgb">
<li class="li" id="li-8kh-u4x-zqf"><code class="ph codeph" id="codeph-zdw-l8p-pyk">CONVERT_TIMEZONE(a,b,c)</code> を 以下のコードで 置き換えます。
<pre class="pre codeblock" id="codeblock-sna-v8q-tpz"><code>timezone(b, timezone(a,c))</code></pre>
</li>
<li class="li" id="li-sg9-ppq-d2e">GETDATE() を 以下のコードで 置き換えます。
<pre class="pre codeblock" id="codeblock-c0c-eru-x0e"><code>current_timestamp(0):timestamp</code></pre>
</li>
<li class="li" id="li-hwo-avx-ap3">ユーザー定義関数 (UDF) を置き換えて最適化します。
<p class="p" id="p-rub-c47-tu7">たとえば、 Redshift の SQL 関数は、 以下のとおりです。</p>
<pre class="pre codeblock" id="codeblock-d5c-qtn-mki"><code>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;
以下の SQL 文で置き換えることにより、 パフォーマンスが向上します。
to_char(a - interval ‘4 hour’, ‘yyyy-mm-dd’)
<li class="li" id="li-bkl-92v-snd">その他の Redshift 標準 SQL 関数
<p class="p" id="p-2e8-6pp-5yr">練習では、 「<a title="" href="https://www.postgresql.org/docs/8.2/functions.html">PostgreSQL8.2 における関数と演算子</a>」に示されている PostgreSQL の標準 SQL 関数ライブラリーをご照会ください。 AnalyticDB for PostgreSQL と 互換性のない関数を手動で修正、
実装する必要があります。 以下が一般的に使用される関数の 参考例です。
</p>
</li>
<li class="li" id="li-dvq-3ys-fta">
<ul class="ul" id="ul-dwd-jct-jgb">
<li class="li" id="li-nii-l29-fgg"><a title="" href="https://docs.microsoft.com/en-us/sql/t-sql/functions/isnull-transact-sql?view=sql-server-2017">ISNULL()</a></li>
<li class="li" id="li-9zj-mze-cbd"><a title="" href="https://docs.aws.amazon.com/redshift/latest/dg/r_DATEADD_function.html">DATEADD()</a></li>
<li class="li" id="li-opo-8i7-9hm"><a title="" href="https://docs.aws.amazon.com/redshift/latest/dg/r_DATEDIFF_function.html">DATEDIFF()</a></li>
<li class="li" id="li-fxd-tx5-68a"><a title="" href="https://docs.aws.amazon.com/redshift/latest/dg/REGEXP_COUNT.html">REGEXP_COUNT()</a></li>
<li class="li" id="li-r1y-v3u-t5y"><a title="" href="https://docs.aws.amazon.com/redshift/latest/dg/r_LEFT.html">LEFT()</a></li>
<li class="li" id="li-j24-1ff-3zh"><a title="" href="https://docs.aws.amazon.com/redshift/latest/dg/r_LEFT.html">RIGHT()</a></li>
</ul>
</li>
</ul>
<p class="p" id="p-ocn-div-25n"><strong class="ph b" id="b-nk2-b3n-ody">テーブルの作成</strong></p>
<ul class="ul" id="ul-fwd-jct-jgb">
<li class="li" id="li-ywp-mm9-eqf">圧縮エンコードを変更します。 AnalyticDB for PostgreSQL は <a title="" href="https://docs.aws.amazon.com/redshift/latest/dg/c_Compression_encodings.html">Redshift Compression Encoding</a> をサポートしていません。 以下は サポートされていない圧縮エンコーディングです。
<ul class="ul" id="ul-gwd-jct-jgb">
<li class="li" id="li-7yt-vua-2g6">BYTEDICT</li>
<li class="li" id="li-mml-ttb-aj8">DELTA</li>
<li class="li" id="li-q2i-u6v-lef">DELTA32K</li>
<li class="li" id="li-2dt-2ur-v9k">LZO</li>
<li class="li" id="li-wst-udv-0x9">MOSTLY8</li>
<li class="li" id="li-int-3qj-a9s">MOSTLY16</li>
<li class="li" id="li-pbp-6qd-z6a">MOSTLY32</li>
<li class="li" id="li-eqy-43g-o9m">RAW (no compression)</li>
<li class="li" id="li-lfz-58a-6pi">RUNLENGTH</li>
<li class="li" id="li-8jm-b67-9g2">TEXT255</li>
<li class="li" id="li-db6-fft-sar">TEXT32K</li>
<li class="li" id="li-azr-zew-ocy">ZSTD</li>
</ul>
<p class="p" id="p-xq7-bga-i44">ENCODE XXXを削除し、CREATE TABLE 文に おける次のオプションに 置き換えます。</p>
<pre class="pre codeblock" id="codeblock-tpu-exg-a11"><code>with (COMPRESSTYPE={ZLIB|QUICKLZ|RLE_TYPE|NONE})</code></pre>
</li>
<li class="li" id="li-9d4-w2u-66z">配布キーを変更します。 Redshift は 3 つのタイプの配布キーをサポートしています。 詳細は、『<a title="" href="https://docs.aws.amazon.com/redshift/latest/dg/c_choosing_dist_sort.html">Distribution Styles</a>』をご参照ください。 その後、 以下にリストされたルールに従い、AnalyticDB for PostgreSQL の 配布キーを修正します。
<ul class="ul" id="ul-kwd-jct-jgb">
<li class="li" id="li-j4h-7xc-k2c">DISTSTYLE EVEN: <code class="ph codeph" id="codeph-ykh-rxh-lb0">distributed randomly</code> に置き換えます。
</li>
<li class="li" id="li-ke6-huy-day">DISTKEY: <code class="ph codeph" id="codeph-dwm-hgf-qby">distributed by (colname1,...)</code></li>
<li class="li" id="li-ghi-tj6-by0">ALL: サポートされていません。削除されています。</li>
</ul>
</li>
</ul>
<p class="p" id="p-y94-rj1-zks">SORT キーを変更します。 Redshift SORT キー句 <code class="ph codeph" id="codeph-2ob-kzj-2v5"><code class="ph codeph" id="codeph-27k-0g8-ssw">[ COMPOUND | INTERLEAVED ] SORTKEY (column_name [, ...] ) ]</code></code> における COMPOUND あるいは INTERLEAVED オプションを、次の句で置き換えます。
</p>
<pre class="pre codeblock" id="codeblock-k0d-05a-1kx"><code>with(APPENDONLY=true,ORIENTATION=column)
sortkey (volume);
例 1
<p class="p" id="p-cpm-x1z-qcl">以下の CREATE TABLE 文は Redshift からのものです。</p>
<pre class="pre codeblock" id="codeblock-sl1-k9n-4tn"><code>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 for PostgreSQL の構文に準拠する CREATE TABLE 文は次のようになります。
CREATE TABLE schema1.table1( filed1 VARCHAR(100) , filed3 INTEGER, filed5 INTEGER)WITH(APPENDONLY=true,ORIENTATION=column,COMPRESSTYPE=zlib)DISTRIBUTED BY (filed2)SORTKEY( filed1, filed2)
例 2
<p class="p" id="p-93w-wnd-229">ENCODE および SORTKEY オプションを含む Redshift の CREATE TABLE 文は次のとおりです。</p>
<pre class="pre codeblock" id="codeblock-5pf-mic-nk0"><code>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 for PostgreSQLの構文に準拠する CREATE TABLE 文は次のようになります。
CREATE TABLE schema2.table2( filed1 VARCHAR(50), filed2 VARCHAR(50), filed3 VARCHAR(20),)WITH(APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zlib)DISTRIBUTED randomlySORTKEY( filed1);
ビューの作成
<p class="p" id="p-zrg-ibu-lfl">テーブル作成と同様です。 修正する必要がある SQL 文がある場合は、AnalyticDB for PostgreSQL 構文に準拠した標準構文に従って修正します。</p>
</section>
<section class="section" id="section-vwd-jct-jgb">
<h2 class="title sectiontitle" id="title-evt-jbs-1fb">AnalyticDB for PostgreSQL インスタンスの作成と設定</h2>
<p class="p" id="p-70k-vgs-eon">Alibaba Cloud Document Center に詳細なトピックがあります。</p>
<ul class="ul" id="ul-wwd-jct-jgb">
<li class="li" id="li-4ef-65w-gr3"><a title="" href="~~50200#concept-r32-mgr-52b~~">インスタンスの作成</a></li>
<li class="li" id="li-nhs-mxt-slq"><a title="" href="~~50207#concept-v4f-dmr-52b~~">ホワイトリストの設定</a></li>
<li class="li" id="li-heb-sa6-bkt"><a title="" href="~~50206#concept-bhh-2mr-52b~~">アカウントの設定</a></li>
</ul>
</section>
<section class="section" id="section-xwd-jct-jgb">
<h2 class="title sectiontitle" id="title-b7f-4sb-mh3">データベースオブジェクトの作成</h2>
<p class="p" id="p-f27-zkb-j6n"><a title="" href="~~35428#concept-ncj-gmr-52b~~">AnalyticDB for PostgreSQL データベースへの接続</a>の指示に従って、 <strong class="ph b" id="b-g1y-uqp-ouv">psql</strong> あるいは <strong class="ph b" id="b-q5t-zub-i37">pgAdmin III 1.6.3</strong> を用いてインスタンスに接続します。
</p>
<p class="p" id="p-5kv-t0t-tt1">前述のルールに従って Redshift DDL ステートメントを、 AnalyticDB for PostgreSQL の構文基準に準拠した DDL 文に変換します。
その後、 これらの DDL 文を実行してデータベースオブジェクトを作成します。
</p>
</section>
<section class="section" id="section-ywd-jct-jgb">
<h2 class="title sectiontitle" id="title-0iy-0mo-suz">外部テーブルの作成</h2>
<p class="p" id="p-dg7-zhk-uxg">AnalyticDB for PostgreSQL は、外部テーブル (これは grossest と呼ばれます) を介して、OSS からの 並列インポートや OSS
への並列エクスポートをサポートします。 また、gzip 形式の OSS 外部テーブルファイルを圧縮して、 ストレージスペースとコストを削減します。 gpossext
関数は、 通常の text/CSV ファイルや gzip 形式の text/CSV ファイルを読み書きします。 下記を参照し、 <a title="" href="~~35457#concept-ofw-3mr-52b~~">OSS からの並列インポートまたは OSS への並列エクスポート</a>OSS 外部テーブルを 作成します。
</p>
</section>
<section class="section" id="section-zwd-jct-jgb">
<h2 class="title sectiontitle" id="title-zjz-m8d-rr9">INSERT INTO スクリプトを使用したデータインポート</h2>
<p class="p" id="p-gpy-xzy-b56">上記の作業と比較すると、このステップは単純で理解しやすいものです。 OSS 外部テーブルから通常のデータテーブルにデータを挿入するだけです。</p>
<p class="p" id="p-a5m-gqs-h8x">OSS 外部テーブルと AnalyticDB for PostgreSQL データベースオブジェクトが作成された後、 OSS 外部テーブルから AnalyticDB
for PostgreSQL のターゲットテーブルにデータを インポートするために、INSERT スクリプトを準備する必要があります。 INSERT スクリプトを
<span class="ph filepath" id="filepath-gmx-ben-ojm">insert.sql</span> として保存し、このファイルを実行します。
</p>
<p class="p" id="p-891-vtc-dki"> INSERT 文の形式は、<code class="ph codeph" id="codeph-8vn-2e6-rjj">INSERT INTO <TABLE NAME> SELECT * FROM <OSS EXTERNAL TABLE NAME></code> です。
</p>
<p class="p" id="p-5o6-tsg-iu3">例</p>
<pre class="pre codeblock" id="codeblock-sj0-dyp-oju"><code>INSERT INTO schema1.table1 SELECT * FROM oss_external_table.table1;</code></pre>
<p class="p" id="p-bw0-m7a-ikb">インポートが完了したら、SELECT 文を使用してインポートしたデータを検証し、それらをソースデータと比較します。</p>
</section>
<section class="section" id="section-axd-jct-jgb">
<h2 class="title sectiontitle" id="title-t2w-xzr-gni">VACUUM スクリプトを用いたデータベースのデフラグ</h2>
<p class="p" id="p-8le-uc4-6y2">OSS 外部テーブルが AnalyticDB for PostgreSQL にインポートされた後、 <code class="ph codeph" id="codeph-l2w-axp-lmz">VACUUM</code> スクリプトを実行してデータベースのデフラグを行います。 VACUUM スクリプトを <span class="ph filepath" id="filepath-3ju-af5-oqj">vacuum.sql</span> として保存し、このファイルを実行します。 VACUUMに関しての 詳細は、『<a title="" href="https://www.postgresql.org/docs/8.2/sql-vacuum.html">VACUUM</a>』をご参照ください。
</p>
</section>
</div>
</article>
</main>