SBクラウド株式会社logo

【PolarDBマイグレーションシリーズ】Oracle DatabaseからPolarDB-Oマイグレーション-Part3 データベースマイグレーション準備

Hi, データエンジニアの大原です。
Oracle DatabaseをPolarDB-O(Oracle)へマイグレーションするためのベストプラクティスが揃ってなかったので、SBC社内で実際にOracle Database導入からPolarDB-Oへのマイグレーションシナリオ検証しまとめてみました。
こちら長文になるので、全部でPart5に分けて紹介します。
Databaseマイグレーションはフルマラソンのようで地味に大変な作業なので、マイグレーションを検討もしくは実施中の方はPart1~Part5の記事を通じて、作業方法、現在の位置、道印、ロードマップなどの把握として参考に頂ければ大変幸いです。

Part1 OracleDatabaseセットアップ、事前準備
Part2 Oracle Database評価
Part3 データベースマイグレーション準備 ←本記事です
Part4 データベースマイグレーション実行
Part5 アプリケーションマイグレーションと改修

本記事では、Oracle DatabaseからPolarDB-Oマイグレーション-Part3 データベースマイグレーション準備 についてを紹介します。

PolarDBとは

PolarDBはAlibaba Cloudが開発したCloud Native Databaseサービスです。MySQL・PostgreSQLは100%、Oracleは高い互換性を持ちながら、ユーザーのワークロードに応じて垂直・水平スケーリングすることが出来るため、コストを大幅に削減できることが特徴です。

f:id:sbc_ohara:20210923094834p:plain f:id:sbc_ohara:20210923095110p:plain f:id:sbc_ohara:20210923095159p:plain

Oracle DatabaseからPolarDBへのマイグレーションについて

www.sbcloud.co.jp

最初に

この記事 Part3では、ターゲットとなるOracle Database(以降ターゲットDBと省略します)からPolarDB-O(Oracle互換性版)へマイグレーションをするための準備フェーズとなります。
Part2 の通りADAM診断レポートを通じてターゲットDBのフィードバックがあったと思うので、それを基にPolarDB-Oへどのようにマイグレーションするかといった準備作業の説明をします。     

f:id:sbc_ohara:20210922092601p:plain

5.Oracle Databaseオンラインマイグレーションと改修

ユーザーはパブリッククラウドデータベースリソースをアクティブ化し、オンラインデータベース構造の移行と改修をすることができます。

前提条件として、操作するユーザーのアカウント権限を事前に確認する必要があります。
Rootアカウントの場合はこの部分を無視してもかまいません。
RAMアカウントの場合、データベースマイグレーション改修画面にアクセス権限を与える必要があります。

5-1.マイグレーションプランを作成します

5-1-1.PolarDBインスタンスを作成します

1)PolarDBインスタンスを作成します
データベース評価によるお勧めの仕様は4 Cores 16 G Memory 128 G Diskです 

①AlibabaCloudをログインし、PolarDBコンソール画面を開きます

f:id:sbc_ohara:20210922093004p:plain

②インスタンス作成ボタンをクリックします

f:id:sbc_ohara:20210922093020p:plain

③PolarDBインスタンスを設定します
f:id:sbc_ohara:20210922093032p:plain

f:id:sbc_ohara:20210922093040p:plain

④TermsOfserviceをチェックします

f:id:sbc_ohara:20210922093059p:plain

⑤インスタンス情報を確認しBuyボタンをクリックします

f:id:sbc_ohara:20210922093115p:plain

⑥PolarDBインスタンス作成中はこのような画面になります

f:id:sbc_ohara:20210922093143p:plain

⑦PolarDBインスタンスが作成完了しました

f:id:sbc_ohara:20210922093200p:plain

2)ユーザーを作成します
①PolarDBインスタンスをクリックし、詳細画面を開きます

f:id:sbc_ohara:20210922093225p:plain

②Accountメニューをクリックします

f:id:sbc_ohara:20210922093234p:plain

③Account作成ボタンをクリックします

f:id:sbc_ohara:20210922093242p:plain

④アカウント名とパスワードを作成します

f:id:sbc_ohara:20210922093340p:plain

⑤アカウントが作成したので確認します

f:id:sbc_ohara:20210922093348p:plain

3)データベースを作成します
①データベース作成をクリックします

f:id:sbc_ohara:20210922093401p:plain

②データベース名とアカウントを設定します

f:id:sbc_ohara:20210922093410p:plain

③データベースが作成したので確認します

f:id:sbc_ohara:20210922093420p:plain

4)ホワイトリストを設定します
①ECS-OracleとECS-APPのIPをホワイトリストに追加します

f:id:sbc_ohara:20210922093431p:plain

f:id:sbc_ohara:20210922093439p:plain

f:id:sbc_ohara:20210922093446p:plain

f:id:sbc_ohara:20210922093453p:plain

5)パブリックエンドポイントを追加
①プライマリーのエンドポイントを追加します

f:id:sbc_ohara:20210922093532p:plain

f:id:sbc_ohara:20210922093540p:plain

f:id:sbc_ohara:20210922093547p:plain

②クラスターのエンドポイントを追加します

f:id:sbc_ohara:20210922093616p:plain

f:id:sbc_ohara:20210922093623p:plain

f:id:sbc_ohara:20210922093631p:plain

5-1-2.マイグレーションプロジェクトを作成します

1)RAMの権限を授与します
①初回Transform and Migrate DBページを開く際に、RAMの権限を与える必要があります

f:id:sbc_ohara:20210922095748p:plain

f:id:sbc_ohara:20210922095757p:plain

f:id:sbc_ohara:20210922095806p:plain

f:id:sbc_ohara:20210922095814p:plain

2)マイグレーションプロジェクトを作成します
①マイグレーションプロジェクト作成ボタンをクリックします

f:id:sbc_ohara:20210922095827p:plain

②PolarDBのVPCを確認します

f:id:sbc_ohara:20210922095836p:plain

③VPCとPolarDBを設定します

f:id:sbc_ohara:20210922095845p:plain

④DBとアカウントを設定します

f:id:sbc_ohara:20210922095855p:plain

⑤接続を確認します

f:id:sbc_ohara:20210922095906p:plain

f:id:sbc_ohara:20210922095913p:plain

⑥プロジェクトを作成します

f:id:sbc_ohara:20210922102255p:plain

⑦マイグレーションプロジェクトが作成したので確認します

f:id:sbc_ohara:20210922102305p:plain

5-2.ソースデータベースにADAMのホワイトリストを追加します

1)下記IPをソースデータベースのホワイトリストに追加します

39.100.131.0/24,47.241.17.0/24,149.129.255.0/24,47.254.192.180,47.89.251.0/24,47.245.13.0/24,47.75.108.0/24

f:id:sbc_ohara:20210922102324p:plain

f:id:sbc_ohara:20210922102331p:plain

f:id:sbc_ohara:20210922102341p:plain

f:id:sbc_ohara:20210922102348p:plain

f:id:sbc_ohara:20210922102356p:plain

5-3.ターゲットデータベースの事前検査(プリチェック)

1)マイグレーションプロジェクト詳細を確認します
①詳細ボタンをクリックします

f:id:sbc_ohara:20210922102408p:plain

②事前検査(プリチェック)の実行結果が表示されます

f:id:sbc_ohara:20210922102419p:plain

③詳細を確認します

f:id:sbc_ohara:20210922102429p:plain

5-4.ソースデータベースプランの検証(オプション)

1)ソースデータベース検証ボタンをクリックします
ソースデータベースの検証は必須でない手順です。オブジェクト移行の検証をスキップすると、ADAMは前回データベース収集の評価と分析の結果によって移行されます。
そのため、データが変更されていない場合は、このStepをスキップしても問題ありません。
ソースデータベース計画の検証は、ソースデータベースのデータとオブジェクトが前回データ収集されてから現在までの間に大きな変更があるかどうかを確認するのに役立ちます。これはソースデータベースをはじめサービス基盤やアプリケーションが一切止まることなく、データベース移行を無事完了するように差分をチェックしフォローしてくれます。

①ソースデータベースの情報を入力します

f:id:sbc_ohara:20210922102448p:plain

・IP:ソースデータベースのIPアドレス(8.211.143.78)
・ServiceName/SID:ソースデータベースのOracleのServiceNameまたはSID、(ServiceNameを設定します)
・Encode方法:ソースデータベースのEncodeを設定します。必須項目ではない(UTF-8を設定します)
・Port:ソースデータベースの接続Port(1521)
・ユーザー:データ収集アカウントを設定します(eoa_user)
・パスワード:データ収集パスワードを設定します(eoaPASSW0RD)

②接続テストします

f:id:sbc_ohara:20210922102504p:plain

f:id:sbc_ohara:20210922102512p:plain

③下記のボタンをクリックすることで、ソースデータベースの差分の検証をスキップすることができます

f:id:sbc_ohara:20210922102528p:plain

f:id:sbc_ohara:20210922102535p:plain

④ソースデータベースの検証ボタンをクリックし、ソースデータベースを検証します

f:id:sbc_ohara:20210922102547p:plain

f:id:sbc_ohara:20210922102554p:plain

2)ソースデータベースの検証結果を確認します
検証結果は手動で「無視」または「変換」をすることが出来ます。
無視:DDLオブジェクトの移行を無視します。
変換:NEW、CHANGEDはスマートで変換します。

f:id:sbc_ohara:20210922102654p:plain

f:id:sbc_ohara:20210922102702p:plain

5-5.スキーマのマイグレーション

①スキーママイグレーションボタンをクリックします

f:id:sbc_ohara:20210922102720p:plain

②マイグレーションルールを設定します

f:id:sbc_ohara:20210922102733p:plain

③SQLトリガーオーナー追加をオンにします

f:id:sbc_ohara:20210922102743p:plain

④スキーママイグレーション画面で開始をクリックします

f:id:sbc_ohara:20210922102755p:plain

f:id:sbc_ohara:20210922102803p:plain

f:id:sbc_ohara:20210922102810p:plain

f:id:sbc_ohara:20210922102818p:plain

⑤スキーママイグレーション完了します

f:id:sbc_ohara:20210922102832p:plain

⑥カスタマイズスキーママイグレーションボタンをクリックすれば、カスタマイズマイグレーションもできます

f:id:sbc_ohara:20210922102846p:plain

⑦スキーマ改修タブが表示されますので、確認します

f:id:sbc_ohara:20210922102902p:plain

⑧その他操作 すべてのオブジェクトを再移行:移行されたオブジェクトまたは移行されていないオブジェクトを含むDDLの再移行を開始します

f:id:sbc_ohara:20210922102913p:plain

f:id:sbc_ohara:20210922102921p:plain

  • 移行失敗したものを再開:もしスキーママイグレーションタスクの移行が失敗したら、このボタンをクリックすることでタスクを再開することができます
  • 移行の停止:マイグレーションタスクを停止することができます

5-6.ソースデータベース非互換性のオブジェクトの改修

5-6-1.非互換性のオブジェクトを確認します

1)スキーママイグレーション完了後、ステータスを確認します
①失敗したオブジェクト箇所を確認します

f:id:sbc_ohara:20210922103043p:plain

②「詳細とスキーマ改修」の詳細をクリックします

f:id:sbc_ohara:20210922103054p:plain

③スキーマ改修が必要な個所が表示されます

f:id:sbc_ohara:20210922103103p:plain

2)オブジェクト改修が必要な個所をダウンロードすることができます

f:id:sbc_ohara:20210922103113p:plain

f:id:sbc_ohara:20210922103120p:plain

f:id:sbc_ohara:20210922103126p:plain

5-6-2.非互換性のテーブルを改修します

今回の例の場合、マイグレーション失敗のオブジェクトはテーブル二つとビューが三つとなりました。
この失敗箇所に対する解決策として、ADAM診断レポートおよびエラーメッセージのアドバイスに基づいて対処する必要があります。
もしフォロー箇所もしくは解決策が不明な場合は、Alibaba Cloud Ticket centerへチケットをあげて、データベースサポートチームに連絡しながらデータベースの専門家達によるフォローアップで対処することもできます。

1)エラー箇所に基づいて、スキーマを確認し修正します
①エラー詳細:

2021-09-10 15:35:07 SHOPTEST TABLE TAB_TRANS_TEMP ERROR: cannot create temporary relation in non-temporary schema

f:id:sbc_ohara:20210922103139p:plain

②グローバルテンポラリテーブルの問題を修正します
PolarDBはグローバルテンポラリテーブルをサポートしています。ユーザーからはグローバルテンポラリテーブルを設定することが出来ないため、Alibaba Cloud Ticket centerへチケットをあげて、データベースサポートチームに連絡しながら対処してもらう必要があります。

f:id:sbc_ohara:20210922103152p:plain

f:id:sbc_ohara:20210922103200p:plain

f:id:sbc_ohara:20210922103208p:plain

③Alibaba Cloud Ticket centerにて、エラーメッセージとインスタンス情報などを入力してチケットをあげます

f:id:sbc_ohara:20210922104142p:plain

④データベースサポートチームにグローバルテンポラリテーブルをオンにすることを依頼します

f:id:sbc_ohara:20210922104154p:plain

f:id:sbc_ohara:20210922104201p:plain

⑤グローバルテンポラリテーブルのパラメータを確認します

show polar_num_active_global_temp_table;

f:id:sbc_ohara:20210922104216p:plain

⑥ステータスを変更後、グローバルテンポラリテーブルパラメータを確認します

show polar_num_active_global_temp_table;

f:id:sbc_ohara:20210922104229p:plain

⑦テーブルを改修します

f:id:sbc_ohara:20210922104243p:plain

f:id:sbc_ohara:20210922104251p:plain

f:id:sbc_ohara:20210922104258p:plain

f:id:sbc_ohara:20210922104305p:plain

f:id:sbc_ohara:20210922104313p:plain

f:id:sbc_ohara:20210922104321p:plain

f:id:sbc_ohara:20210922104328p:plain

f:id:sbc_ohara:20210922104335p:plain

f:id:sbc_ohara:20210922104342p:plain

f:id:sbc_ohara:20210922104349p:plain

5-6-3.非互換性のビューと関数を改修します

1)KANA_HIRAGANA_VIEWを改修します
①エラーメッセージを確認します

NANCYTEST VIEW KANA_HIRAGANA_VIEW ERROR: function utl_i18n.transliterate(character varying, unknown) does not exist

f:id:sbc_ohara:20210922104402p:plain

f:id:sbc_ohara:20210922104410p:plain

f:id:sbc_ohara:20210922104417p:plain

②DMSでPolarDBへ接続し、新しい関数を作成します
※PolarDBで関数を正しく設定します。今回はデモなので、あくまでも参考程度に頂ければ幸いです。

CREATE OR REPLACE FUNCTION nancytest.h2z_hana(text) 
  RETURNS text AS
$BODY$
    DECLARE
        zenkaku alias FOR $1;
        result text;
        i int;
        zt varchar[] = ARRAY['ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド', 'バ', 'ビ', 'ブ', 'ベ', 'ボ', 'パ', 'ピ', 'プ', 'ペ', 'ポ', 'ヴ'];
        ht varchar[] = ARRAY['ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド', 'バ', 'ビ', 'ブ', 'ベ', 'ボ', 'パ', 'ピ', 'プ', 'ペ', 'ポ', 'ヴ'];
    BEGIN
        result = zenkaku;
        -- 2バイトで変換
        FOR i IN 1..26 LOOP
            result = replace(result, ht[i], zt[i]);
        END LOOP;
        -- 1バイトで変換
        result = translate(result,
                   ' ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョワイエカケー、。・」「゙,<.>/?_}]*:+;{[~@|\\`^=-)(&%$#"!',
                   ' がぎぐげござじずぜぞだじずでどばびぶべぼぱぴぷぺぽゔあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんぁぃぅぇぉっゃゅょわいえかけー、。・」「゛,<.>/?_}]*:+;{[ ̄@|¥`^=-)(&%$#"!'
              );

        RETURN result;
    END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

f:id:sbc_ohara:20210922104902p:plain

③KANA_HIRAGANA_VIEWを改修します
改修前

CREATE OR REPLACE VIEW NANCYTEST.KANA_HIRAGANA_VIEW(KANA_HIRAGANA_NAME) AS
SELECT
    UTL_I18N.TRANSLITERATE(name, 'kana_HIRAGANA') AS kana_HIRAGANA_name
FROM
    ignore_case_products
where not regexp_like(name, '^[a-zA-Z0-9]'); 

f:id:sbc_ohara:20210922104920p:plain

改修後

CREATE OR REPLACE VIEW NANCYTEST.KANA_HIRAGANA_VIEW(KANA_HIRAGANA_NAME) AS
SELECT
    nancytest.h2z_hana(name) AS kana_HIRAGANA_name
FROM
    ignore_case_products
where not regexp_like(name, '^[a-zA-Z0-9]'); 

※マイグレーションプロセスが成功したら、マイグレーション後、上記の関数を修正することもできます

f:id:sbc_ohara:20210922104936p:plain

2)KANA_FWKATAKANA_VIEWを改修します
①エラーメッセージを確認します

NANCYTEST VIEW KANA_FWKATAKANA_VIEW ERROR: function utl_i18n.transliterate(character varying, unknown) does not exist

f:id:sbc_ohara:20210922104949p:plain

②DMSでPolarDBへ接続し、新しい関数を作成します

CREATE OR REPLACE FUNCTION nancytest.h2z_kana(text) 
  RETURNS text AS
$BODY$
    DECLARE
        zenkaku alias FOR $1;
        result text;
        i int;
        zt varchar[] = ARRAY['ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド', 'バ', 'ビ', 'ブ', 'ベ', 'ボ', 'パ', 'ピ', 'プ', 'ペ', 'ポ', 'ヴ'];
        ht varchar[] = ARRAY['ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド', 'バ', 'ビ', 'ブ', 'ベ', 'ボ', 'パ', 'ピ', 'プ', 'ペ', 'ポ', 'ヴ'];
    BEGIN
        result = zenkaku;
        -- 2バイトで変換
        FOR i IN 1..26 LOOP
            result = replace(result, ht[i], zt[i]);
        END LOOP;

        -- 1バイトで変換
        result = translate(result,
                   ' がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽヴあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョワイエカケー、。・」「゙,<.>/?_}]*:+;{[~@|\\`^=-)(&%$#"!',
                   ' ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョヮヰヱヵヶー、。・」「゛,<.>/?_}]*:+;{[ ̄@|¥`^=-)(&%$#"!'
              );
        RETURN result;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

f:id:sbc_ohara:20210922105008p:plain

③KANA_FWKATAKANA_VIEWを改修します
改修前

CREATE OR REPLACE VIEW NANCYTEST.KANA_FWKATAKANA_VIEW(KANA_FWKATAKANA_NAME) AS
SELECT
    UTL_I18N.TRANSLITERATE(name, 'kana_fwkatakana') AS kana_fwkatakana_name
FROM
    ignore_case_products
where not regexp_like(name, '^[a-zA-Z0-9]'); 

f:id:sbc_ohara:20210922105022p:plain

改修後

CREATE OR REPLACE VIEW NANCYTEST.KANA_FWKATAKANA_VIEW(KANA_FWKATAKANA_NAME) AS
SELECT
    nancytest.h2z_kana(name) AS kana_fwkatakana_name
FROM
    ignore_case_products
where not regexp_like(name, '^[a-zA-Z0-9]');

f:id:sbc_ohara:20210922105036p:plain

3)V_CONNECT_BYを改修します
①エラーメッセージ:

SHOPTEST VIEW V_CONNECT_BY ERROR: syntax error at or near "empno"

f:id:sbc_ohara:20210922105048p:plain

f:id:sbc_ohara:20210922105055p:plain

②改修前の関数を確認します

CREATE OR REPLACE VIEW "SHOPTEST"."V_CONNECT_BY"("EMPNO", "MGR", "LV") AS
select
    empno,
    mgr,
    level as lv
from
    tab_connect_by a start with mgr is null connect by(prior empno) = mgr
and deptno = 10
order by
    level;

f:id:sbc_ohara:20210922105109p:plain

③改修後も関数を確認します

CREATE OR REPLACE VIEW "SHOPTEST"."V_CONNECT_BY"("EMPNO", "MGR", "LV") AS
select
    empno,
    mgr,
    level as lv
from
    tab_connect_by a start with mgr is null connect by prior empno = mgr
and prior deptno = 10
order by
    level;

f:id:sbc_ohara:20210922105123p:plain

4)ADAM診断による移行失敗した箇所をすべて対応したことを確認します

f:id:sbc_ohara:20210922105135p:plain

ここまでADAM診断による移行失敗した箇所をすべて改修したので、エラーメッセージは0、無くすことができました。

5-7.増量ソースデータの比較(オプション)

増量ソースデータの比較はオプション操作です。 マイグレーション中、データの増分が少ない場合、スキップすることもできます。

f:id:sbc_ohara:20210922105148p:plain

f:id:sbc_ohara:20210922110619p:plain

f:id:sbc_ohara:20210922112431p:plain

f:id:sbc_ohara:20210922112439p:plain

ここまでADAMによる、Oracle Databaseオンラインマイグレーションでボトルネックとなる箇所の確認、および改修方法をご紹介しました。
次はPart4 データベースマイグレーション実行に移りたいと思います。

www.sbcloud.co.jp