【PolarDBマイグレーションシリーズ】Oracle DatabaseからPolarDB-Oマイグレーション-Part3 データベースマイグレーション準備
【PolarDBマイグレーションシリーズ】Oracle DatabaseからPolarDB-Oマイグレーション-Part3 データベースマイグレーション準備
はじめに
本記事では、Oracle DatabaseからPolarDB-Oマイグレーション-Part3 データベースマイグレーション準備 についてを紹介します。
こちら長文になるので、全部でPart5に分けて紹介します。
Part1 OracleDatabaseセットアップ、事前準備
Part2 Oracle Database評価
Part3 データベースマイグレーション準備←本記事です
Part4 データベースマイグレーション実行
Part5 アプリケーションマイグレーションと改修
PolarDBとは
PolarDBはAlibaba Cloudが開発したCloud Native Databaseサービスです。MySQL・PostgreSQLは100%、Oracleは高い互換性を持ちながら、ユーザーのワークロードに応じて垂直・水平スケーリングすることが出来るため、コストを大幅に削減できることが特徴です。
最初に
この記事 Part3では、ターゲットとなるOracle Database(以降ターゲットDBと省略します)からPolarDB-O(Oracle互換性版)へマイグレーションをするための準備フェーズとなります。
Part2 の通りADAM診断レポートを通じてターゲットDBのフィードバックがあったと思うので、それを基にPolarDB-Oへどのようにマイグレーションするかといった準備作業の説明をします。
5.Oracle Databaseオンラインマイグレーションと改修
ユーザーはパブリッククラウドデータベースリソースをアクティブ化し、オンラインデータベース構造の移行と改修をすることができます。
前提条件として、操作するユーザーのアカウント権限を事前に確認する必要があります。
Rootアカウントの場合はこの部分を無視してもかまいません。
RAMアカウントの場合、データベースマイグレーション改修画面にアクセス権限を与える必要があります。
5-1.マイグレーションプランを作成します
5-1-1.PolarDBインスタンスを作成します
1)PolarDBインスタンスを作成します
データベース評価によるお勧めの仕様は4 Cores 16 G Memory 128 G Diskです
①AlibabaCloudをログインし、PolarDBコンソール画面を開きます
②インスタンス作成ボタンをクリックします
③PolarDBインスタンスを設定します
④TermsOfserviceをチェックします
⑤インスタンス情報を確認しBuyボタンをクリックします
⑥PolarDBインスタンス作成中はこのような画面になります
⑦PolarDBインスタンスが作成完了しました
2)ユーザーを作成します
①PolarDBインスタンスをクリックし、詳細画面を開きます
②Accountメニューをクリックします
③Account作成ボタンをクリックします
④アカウント名とパスワードを作成します
⑤アカウントが作成したので確認します
3)データベースを作成します
①データベース作成をクリックします
②データベース名とアカウントを設定します
③データベースが作成したので確認します
4)ホワイトリストを設定します
①ECS-OracleとECS-APPのIPをホワイトリストに追加します
5)パブリックエンドポイントを追加
①プライマリーのエンドポイントを追加します
②クラスターのエンドポイントを追加します
5-1-2.マイグレーションプロジェクトを作成します
1)RAMの権限を授与します
①初回Transform and Migrate DBページを開く際に、RAMの権限を与える必要があります
2)マイグレーションプロジェクトを作成します
①マイグレーションプロジェクト作成ボタンをクリックします
②PolarDBのVPCを確認します
③VPCとPolarDBを設定します
④DBとアカウントを設定します
⑤接続を確認します
⑥プロジェクトを作成します
⑦マイグレーションプロジェクトが作成したので確認します
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
5-3.ターゲットデータベースの事前検査(プリチェック)
1)マイグレーションプロジェクト詳細を確認します
①詳細ボタンをクリックします
②事前検査(プリチェック)の実行結果が表示されます
③詳細を確認します
5-4.ソースデータベースプランの検証(オプション)
1)ソースデータベース検証ボタンをクリックします
ソースデータベースの検証は必須でない手順です。オブジェクト移行の検証をスキップすると、ADAMは前回データベース収集の評価と分析の結果によって移行されます。
そのため、データが変更されていない場合は、このStepをスキップしても問題ありません。
ソースデータベース計画の検証は、ソースデータベースのデータとオブジェクトが前回データ収集されてから現在までの間に大きな変更があるかどうかを確認するのに役立ちます。これはソースデータベースをはじめサービス基盤やアプリケーションが一切止まることなく、データベース移行を無事完了するように差分をチェックしフォローしてくれます。
①ソースデータベースの情報を入力します
・IP:ソースデータベースのIPアドレス(8.211.143.78)・ServiceName/SID:ソースデータベースのOracleのServiceNameまたはSID、(ServiceNameを設定します)・Encode方法:ソースデータベースのEncodeを設定します。必須項目ではない(UTF-8を設定します)・Port:ソースデータベースの接続Port(1521)・ユーザー:データ収集アカウントを設定します(eoa_user)・パスワード:データ収集パスワードを設定します(eoaPASSW0RD)
②接続テストします
③下記のボタンをクリックすることで、ソースデータベースの差分の検証をスキップすることができます
④ソースデータベースの検証ボタンをクリックし、ソースデータベースを検証します
2)ソースデータベースの検証結果を確認します
検証結果は手動で「無視」または「変換」をすることが出来ます。
無視:DDLオブジェクトの移行を無視します。
変換:NEW、CHANGEDはスマートで変換します。
5-5.スキーマのマイグレーション
①スキーママイグレーションボタンをクリックします
②マイグレーションルールを設定します
③SQLトリガーオーナー追加をオンにします
④スキーママイグレーション画面で開始をクリックします
⑤スキーママイグレーション完了します
⑥カスタマイズスキーママイグレーションボタンをクリックすれば、カスタマイズマイグレーションもできます
⑦スキーマ改修タブが表示されますので、確認します
⑧その他操作 すべてのオブジェクトを再移行:移行されたオブジェクトまたは移行されていないオブジェクトを含むDDLの再移行を開始します
- 移行失敗したものを再開:もしスキーママイグレーションタスクの移行が失敗したら、このボタンをクリックすることでタスクを再開することができます
- 移行の停止:マイグレーションタスクを停止することができます
5-6.ソースデータベース非互換性のオブジェクトの改修
5-6-1.非互換性のオブジェクトを確認します
1)スキーママイグレーション完了後、ステータスを確認します
①失敗したオブジェクト箇所を確認します
②「詳細とスキーマ改修」の詳細をクリックします
③スキーマ改修が必要な個所が表示されます
2)オブジェクト改修が必要な個所をダウンロードすることができます
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
②グローバルテンポラリテーブルの問題を修正します
PolarDBはグローバルテンポラリテーブルをサポートしています。ユーザーからはグローバルテンポラリテーブルを設定することが出来ないため、Alibaba Cloud Ticket centerへチケットをあげて、データベースサポートチームに連絡しながら対処してもらう必要があります。
③Alibaba Cloud Ticket centerにて、エラーメッセージとインスタンス情報などを入力してチケットをあげます
④データベースサポートチームにグローバルテンポラリテーブルをオンにすることを依頼します
⑤グローバルテンポラリテーブルのパラメータを確認します
show polar_num_active_global_temp_table;
⑥ステータスを変更後、グローバルテンポラリテーブルパラメータを確認します
show polar_num_active_global_temp_table;
⑦テーブルを改修します
5-6-3.非互換性のビューと関数を改修します
1)KANA_HIRAGANA_VIEWを改修します
①エラーメッセージを確認します
NANCYTEST VIEW KANA_HIRAGANA_VIEW ERROR: function utl_i18n.transliterate(character varying, unknown) does not exist
②DMSでPolarDBへ接続し、新しい関数を作成します
※PolarDBで関数を正しく設定します。今回はデモなので、あくまでも参考程度に頂ければ幸いです。
CREATE OR REPLACE FUNCTION nancytest.h2z_hana(text)RETURNS text AS$BODY$DECLAREzenkaku alias FOR $1;result text;i int;zt varchar[] = ARRAY['ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド', 'バ', 'ビ', 'ブ', 'ベ', 'ボ', 'パ', 'ピ', 'プ', 'ペ', 'ポ', 'ヴ'];ht varchar[] = ARRAY['ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド', 'バ', 'ビ', 'ブ', 'ベ', 'ボ', 'パ', 'ピ', 'プ', 'ペ', 'ポ', 'ヴ'];BEGINresult = zenkaku;-- 2バイトで変換FOR i IN 1..26 LOOPresult = replace(result, ht[i], zt[i]);END LOOP;-- 1バイトで変換result = translate(result,' ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョワイエカケー、。・」「゙,<.>/?_}]*:+;{[~@|\\`^=-)(&%$#"!',' がぎぐげござじずぜぞだじずでどばびぶべぼぱぴぷぺぽゔあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんぁぃぅぇぉっゃゅょわいえかけー、。・」「゛,<.>/?_}]*:+;{[ ̄@|¥`^=-)(&%$#"!');RETURN result;END;$BODY$LANGUAGE 'plpgsql' VOLATILE;
③KANA_HIRAGANA_VIEWを改修します
改修前
CREATE OR REPLACE VIEW NANCYTEST.KANA_HIRAGANA_VIEW(KANA_HIRAGANA_NAME) ASSELECTUTL_I18N.TRANSLITERATE(name, 'kana_HIRAGANA') AS kana_HIRAGANA_nameFROMignore_case_productswhere not regexp_like(name, '^[a-zA-Z0-9]');
改修後
CREATE OR REPLACE VIEW NANCYTEST.KANA_HIRAGANA_VIEW(KANA_HIRAGANA_NAME) ASSELECTnancytest.h2z_hana(name) AS kana_HIRAGANA_nameFROMignore_case_productswhere not regexp_like(name, '^[a-zA-Z0-9]');
※マイグレーションプロセスが成功したら、マイグレーション後、上記の関数を修正することもできます
2)KANA_FWKATAKANA_VIEWを改修します
①エラーメッセージを確認します
NANCYTEST VIEW KANA_FWKATAKANA_VIEW ERROR: function utl_i18n.transliterate(character varying, unknown) does not exist
②DMSでPolarDBへ接続し、新しい関数を作成します
CREATE OR REPLACE FUNCTION nancytest.h2z_kana(text)RETURNS text AS$BODY$DECLAREzenkaku alias FOR $1;result text;i int;zt varchar[] = ARRAY['ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド', 'バ', 'ビ', 'ブ', 'ベ', 'ボ', 'パ', 'ピ', 'プ', 'ペ', 'ポ', 'ヴ'];ht varchar[] = ARRAY['ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド', 'バ', 'ビ', 'ブ', 'ベ', 'ボ', 'パ', 'ピ', 'プ', 'ペ', 'ポ', 'ヴ'];BEGINresult = zenkaku;-- 2バイトで変換FOR i IN 1..26 LOOPresult = replace(result, ht[i], zt[i]);END LOOP;-- 1バイトで変換result = translate(result,' がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽヴあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョワイエカケー、。・」「゙,<.>/?_}]*:+;{[~@|\\`^=-)(&%$#"!',' ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョヮヰヱヵヶー、。・」「゛,<.>/?_}]*:+;{[ ̄@|¥`^=-)(&%$#"!');RETURN result;END;$BODY$LANGUAGE 'plpgsql' VOLATILE;
③KANA_FWKATAKANA_VIEWを改修します
改修前
CREATE OR REPLACE VIEW NANCYTEST.KANA_FWKATAKANA_VIEW(KANA_FWKATAKANA_NAME) ASSELECTUTL_I18N.TRANSLITERATE(name, 'kana_fwkatakana') AS kana_fwkatakana_nameFROMignore_case_productswhere not regexp_like(name, '^[a-zA-Z0-9]');
改修後
CREATE OR REPLACE VIEW NANCYTEST.KANA_FWKATAKANA_VIEW(KANA_FWKATAKANA_NAME) ASSELECTnancytest.h2z_kana(name) AS kana_fwkatakana_nameFROMignore_case_productswhere not regexp_like(name, '^[a-zA-Z0-9]');
3)V_CONNECT_BYを改修します
①エラーメッセージ:
SHOPTEST VIEW V_CONNECT_BY ERROR: syntax error at or near "empno"
②改修前の関数を確認します
CREATE OR REPLACE VIEW "SHOPTEST"."V_CONNECT_BY"("EMPNO", "MGR", "LV") ASselectempno,mgr,level as lvfromtab_connect_by a start with mgr is null connect by(prior empno) = mgrand deptno = 10order bylevel;
③改修後も関数を確認します
CREATE OR REPLACE VIEW "SHOPTEST"."V_CONNECT_BY"("EMPNO", "MGR", "LV") ASselectempno,mgr,level as lvfromtab_connect_by a start with mgr is null connect by prior empno = mgrand prior deptno = 10order bylevel;
4)ADAM診断による移行失敗した箇所をすべて対応したことを確認します
ここまでADAM診断による移行失敗した箇所をすべて改修したので、エラーメッセージは0、無くすことができました。
5-7.増量ソースデータの比較(オプション)
増量ソースデータの比較はオプション操作です。 マイグレーション中、データの増分が少ない場合、スキップすることもできます。
最後に
ここまでADAMによる、Oracle Databaseオンラインマイグレーションでボトルネックとなる箇所の確認、および改修方法をご紹介しました。
次はPart4 データベースマイグレーション実行に移りたいと思います。
http://sbopsv.github.io/cloud-tech/usecase-PolarDB/PolarDB_004_oracle-migration-part4