OracleデータをMySQLデータベースに抽出する実装プロセス

OracleデータをMySQLデータベースに抽出する実装プロセス

Oracle データベースから MySQL データベースへの移行では、Oracle データベース モデルを MySQL に移行することに加え、Oracle データベースのデータを MySQL データベースに移行することも重要なステップです。私は多くのデータ移行プログラムを使用しようとしましたが、パフォーマンスはあまり良くありませんでした。そこで、Oracle データベースのデータを MySQL に移行するためのプログラムを作成しました。具体的なプロセスは次のとおりです。

1. MySQLテーブル、フィールド、フィルタ条件の設定ファイルimp_data.sqlを抽出する

2. ETL_DIRディレクトリを作成する

3. OracleデータベースプログラムP_ETL_ORA_DATAを実行して、各テーブルのcsvデータファイルを生成し、MySQLにインポートするためのスクリプトファイルimp_data.sqlも生成します。

4. MySQLデータをインポートします。ファイルの内容は次のとおりです。

ファイル「alarm_hist_inc.csv」のデータをテーブル「alarm_hist_inc」に読み込みます。フィールドは「,」で終了し、行は「^」で囲まれ、「\r\n」で終了します。
ファイル「button_authority.csv」のデータをテーブル button_authority に読み込みます。フィールドは「,」で終了し、行は「^」で囲まれ、「\r\n」で終了します。
ファイル「c3_sms_hist_inc.csv」のデータをテーブル c3_sms_hist_inc に読み込み、フィールドは「,」で終了し、行は「^」で囲まれ、「\r\n」で終了します。
ファイル「datapermisson.csv」のデータをテーブル datapermisson に読み込み、「,」で終了するフィールド、「^」で囲まれ、「\r\n」で終了する行に挟まれます。

添付ファイル: データベース スクリプト P_ETL_ORA_DATA

プロシージャ P_ETL_ORA_DATA を作成または置換する
(
  P_ORA_DIR VARCHAR2、
  P_DATA_PATH VARCHAR2
) は
  タイプT_RECはレコードです(
    TBN VARCHAR2(40)、
    整数VARCHAR2(4000)
  TYPE T_TABS は T_REC のテーブルです。
  V_TABS T_TABS := T_TABS();
  V_ETL_DIR VARCHAR2(40) := P_ORA_DIR;
  V_LOAD_FILE UTL_FILE.FILE_TYPE;
  手順 ETL_DATA
  (
    P_SQL_STMT VARCHAR2、
    P_DATA_PATH VARCHAR2、
    P_TB_NAME VARCHAR2
  ) は
  始める
    宣言する
      V_VAR_COL VARCHAR2(32767);
      V_NUM_COL 数値;
      V_DATE_COL 日付;
      V_TMZ タイムスタンプ;
      V_COLS 数値;
      V_COLS_DESC DBMS_SQL.DESC_TAB;
      V_ROW_STR VARCHAR2(32767);
      V_COL_STR VARCHAR2(32767);
      V_SQL_ID 数値;
      V_SQL_REF SYS_REFCURSOR;
      V_EXP_FILE UTL_FILE.FILE_TYPE;
      データ型:
    始める
      V_DATA_PATH := P_DATA_PATH;
      REGEXP_SUBSTR(V_DATA_PATH, '\\$') が NULL の場合
      それから
        V_DATA_PATH := V_DATA_PATH || '\';
      終了の場合;
      V_DATA_PATH := REPLACE(V_DATA_PATH, '\', '\\');
      P_SQL_STMT の V_SQL_REF を開きます。
      V_SQL_ID := DBMS_SQL.TO_CURSOR_NUMBER(V_SQL_REF);
      DBMS_SQL.DESCRIBE_COLUMNS(V_SQL_ID、V_COLS、V_COLS_DESC);
      FOR I IN V_COLS_DESC.FIRST .. V_COLS_DESC.LAST
      ループ
        場合
          V_COLS_DESC(I).COL_TYPEが(1, 9, 96)の場合
            DBMS_SQL.DEFINE_COLUMN(V_SQL_ID、I、V_VAR_COL、32767);
          V_COLS_DESC(I).COL_TYPE = 2の場合
            DBMS_SQL.DEFINE_COLUMN(V_SQL_ID、I、V_NUM_COL);
          V_COLS_DESC(I).COL_TYPE = 12の場合
            DBMS_SQL.DEFINE_COLUMN(V_SQL_ID、I、V_DATE_COL);
          V_COLS_DESC(I).COL_TYPE = 180の場合
            DBMS_SQL.DEFINE_COLUMN(V_SQL_ID、I、V_TMZ);
        ケース終了;
      ループを終了;
      宣言する
        V_FLUSH_OVER PLS_INTEGER := 1;
        V_FILE_OVER PLS_INTEGER := 1;
        V_FILE_NO PLS_INTEGER := 1;
        V_FILE_NAME VARCHAR2(200);
        V_LINE VARCHAR2(400);
      始める
        DBMS_SQL.FETCH_ROWS(V_SQL_ID) > 0 の場合
        ループ
          V_FILE_OVER = 1の場合
          それから
            V_FILE_NAME := P_TB_NAME || '_' || V_FILE_NO || '.csv';
            V_EXP_FILE := UTL_FILE.FOPEN(V_ETL_DIR、V_FILE_NAME、OPEN_MODE => 'w'、MAX_LINESIZE => 32767);
          終了の場合;
          V_ROW_STR := '';
          FOR I IN 1 .. V_COLS
          ループ
            V_COL_STR := '\N';
            始める
              場合
                V_COLS_DESC(I).COL_TYPEが(1, 9, 96)の場合
                  DBMS_SQL.COLUMN_VALUE(V_SQL_ID、I、V_VAR_COL);
                  V_VAR_COLがNULLでない場合
                  それから
                    V_COL_STR := '^' || V_VAR_COL || '^';
                  終了の場合;
                V_COLS_DESC(I).COL_TYPE = 2の場合
                  DBMS_SQL.COLUMN_VALUE(V_SQL_ID、I、V_NUM_COL);
                  V_NUM_COLがNULLでない場合
                  それから
                    V_COL_STR := V_NUM_COL;
                  終了の場合;
                V_COLS_DESC(I).COL_TYPE = 12の場合
                  DBMS_SQL.COLUMN_VALUE(V_SQL_ID、I、V_DATE_COL);
                  V_DATE_COLがNULLでない場合
                  それから
                    V_COL_STR := '^' || TO_CHAR(V_DATE_COL, 'yyyy-mm-dd hh24:mi:ss') || '^';
                  終了の場合;
                V_COLS_DESC(I).COL_TYPEが(180, 181, 231)の場合
                  DBMS_SQL.COLUMN_VALUE(V_SQL_ID、I、V_TMZ);
                  V_TMZがNULLでない場合
                  それから
                    V_COL_STR := '^' || TO_CHAR(V_TMZ, 'yyyy-mm-dd hh24:mi:ss.ff6') || '^';
                  終了の場合;
              ケース終了;
              I = 1の場合
              それから
                V_ROW_STR := V_COL_STR;
              それ以外
                V_ROW_STR := V_ROW_STR || ',' || V_COL_STR;
              終了の場合;
            終わり;
          ループを終了;
          UTL_FILE.PUT_LINE(V_EXP_FILE、CONVERT(V_ROW_STR、'UTF8'));
          IF V_FILE_OVER > 200000 /*200000レコードごとに新しいファイルを作成する*/
          それから
            V_FILE_OVER := 1;
            V_FLUSH_OVER := 1;
            V_FILE_NO := V_FILE_NO + 1;
            UTL_FILE.FCLOSE(V_EXP_FILE);
            V_LINE := 'ファイル "' || V_DATA_PATH || V_FILE_NAME || '" のデータをテーブル ' || P_TB_NAME にロードします。
            V_LINE := V_LINE || ' フィールドは "," で終了し、行は "^" で囲まれ、行は "\r\n" で終了します。';
            UTL_FILE.PUT_LINE(V_LOAD_FILE、V_LINE);
            UTL_FILE.FFLUSH(V_LOAD_FILE);
            続く;
          終了の場合;
          V_FILE_OVER := V_FILE_OVER + 1;
          IF V_FLUSH_OVER > 2000 /* 2000レコードごとにキャッシュを更新し、ファイルに書き込みます*/
          それから
            UTL_FILE.FFLUSH(V_EXP_FILE);
            V_FLUSH_OVER := 1;
          それ以外
            V_FLUSH_OVER := V_FLUSH_OVER + 1;
          終了の場合;
        ループを終了;
        DBMS_SQL.CLOSE_CURSOR(V_SQL_ID);
        UTL_FILE.IS_OPEN(V_EXP_FILE)の場合
        それから
          UTL_FILE.FCLOSE(V_EXP_FILE);
          V_LINE := 'ファイル "' || V_DATA_PATH || V_FILE_NAME || '" のデータをテーブル ' || P_TB_NAME にロードします。
          V_LINE := V_LINE || ' フィールドは "," で終了し、行は "^" で囲まれ、行は "\r\n" で終了します。';
          UTL_FILE.PUT_LINE(V_LOAD_FILE、V_LINE);
          UTL_FILE.FFLUSH(V_LOAD_FILE);
        終了の場合;
      終わり;
    例外
      他の人が
        DBMS_SQL.IS_OPEN(V_SQL_ID)の場合
        それから
          DBMS_SQL.CLOSE_CURSOR(V_SQL_ID);
        終了の場合;
        UTL_FILE.IS_OPEN(V_EXP_FILE)の場合
        それから
          UTL_FILE.FCLOSE(V_EXP_FILE);
        終了の場合;
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
        DBMS_OUTPUT.PUT_LINE(P_SQL_STMT);
    終わり;
  終わり;
始める
  始める
    即時実行 'create table mysql_etl_tbs(tn varchar2(40),cn varchar2(40),ci number) ';
  例外
    他の人が
      NULL;
  終わり;
  EXECUTE IMMEDIATE 'テーブル mysql_etl_tbs を切り捨てる';
  宣言する
    V_CI PLS_INTEGER;
    40 バイト
    V_ETL_COLS VARCHAR2(32767);
    V_TBN VARCHAR2(30);
    V_ETL_CFG VARCHAR2(32767);
    V_CNF_FILE UTL_FILE.FILE_TYPE;
    V_FROM_POS PLS_INTEGER;
  始める
    V_CNF_FILE := UTL_FILE.FOPEN(V_ETL_DIR, 'ETL_TABS.CNF', 'r', 32767);
    ループ
      UTL_FILE.GET_LINE(V_CNF_FILE、V_ETL_CFG、32767);
      V_FROM_POS := REGEXP_INSTR(V_ETL_CFG, 'from', 1, 1, 0, 'i');
      V_ETL_COLS := SUBSTR(V_ETL_CFG, 1, V_FROM_POS - 1);
      V_ETL_COLS := REGEXP_SUBSTR(V_ETL_COLS, '(select)(.+)', 1, 1, 'i', 2);
      V_TBN := REGEXP_SUBSTR(V_ETL_CFG, '(\s+from\s+)(\w+)(\s*)', 1, 1, 'i', 2);
      V_TBN := UPPER(V_TBN);
      V_TABS.EXTEND();
      V_TABS(V_TABS.LAST).TBN := V_TBN;
      V_TABS(V_TABS.LAST).WHR := REGEXP_SUBSTR(V_ETL_CFG, '\s+where .+', 1, 1, 'i');
      V_CI := 1;
      ループ
        V_CN := REGEXP_SUBSTR(V_ETL_COLS, '\S+', 1, V_CI);
        V_CN が NULL の場合は終了します。
        V_CN := UPPER(V_CN);
        即時実行 'mysql_etl_tbs(tn,cn,ci) に値(:1,:2,:3) を挿入'
          V_TBN、V_CN、V_CI を使用します。
        専念;
        V_CI := V_CI + 1;
      ループを終了;
    ループを終了;
  例外
    UTL_FILE.INVALID_PATHの場合
      DBMS_OUTPUT.PUT_LINE('指定されたディレクトリ: ETL_DIR"' || '"無効です!');
      戻る;
    UTL_FILE.INVALID_FILENAMEの場合
      DBMS_OUTPUT.PUT_LINE('指定されたファイル: "ETL_TABS.CNF' || '"無効です!');
      戻る;
    NO_DATA_FOUNDの場合
      UTL_FILE.FCLOSE(V_CNF_FILE);
    他の人が
      DBMS_OUTPUT.PUT_LINE(SQLERRM);
      戻る;
  終わり;
  宣言する
    V_CUR_MATCH SYS_REFCURSOR;
    V_SQL_SMT VARCHAR2(32767);
    データ型:
    40 バイト
    V_CI PLS_INTEGER;
    V_COLUMN_NAME VARCHAR2(40);
    V_ETL_COLS VARCHAR2(32767);
    V_LINE VARCHAR2(4000);
    V_TBN VARCHAR2(40);
  始める
    V_LOAD_FILE := UTL_FILE.FOPEN(V_ETL_DIR、'load_data.sql'、OPEN_MODE => 'w'、MAX_LINESIZE => 32767);
    V_TABS.FIRST から V_TABS.LAST までの T_IX の場合
    ループ
      V_SQL_SMT := 'select tn,cn,column_name,ci from ( select * from mysql_etl_tbs where tn='':tbn:'' ) l left join user_tab_columns r on l.tn = r.table_name and l.cn= r.column_name order by ci';
      V_TBN := V_TABS(T_IX).TBN;
      V_SQL_SMT := REPLACE(V_SQL_SMT, ':tbn:', V_TBN);
      V_ETL_COLS := NULL;
      V_SQL_SMT の V_CUR_MATCH を開きます。
      ループ
        フェッチ V_CUR_MATCH
          V_TN、V_CN、V_COLUMN_NAME、V_CI に;
        V_CUR_MATCH%NOTFOUND の場合は終了します。
        V_CI > 1の場合
        それから
          V_ETL_COLS := V_ETL_COLS || ' , ';
        終了の場合;
        V_COLUMN_NAMEがNULLの場合
        それから
          V_ETL_COLS := V_ETL_COLS || ' キャスト(null を数値として) ' || V_CN;
        それ以外
          V_ETL_COLS := V_ETL_COLS || V_CN;
        終了の場合;
      ループを終了;
      V_CUR_MATCH を閉じます。
      V_TBN := LOWER(V_TBN);
      V_SQL_SMT := 'select ' || V_ETL_COLS || ' from ' || V_TBN || V_TABS(T_IX).WHR;
      ETL_DATA(V_SQL_SMT、P_DATA_PATH、V_TBN);
    ループを終了;
    UTL_FILE.IS_OPEN(V_LOAD_FILE)の場合
    それから
      UTL_FILE.FCLOSE(V_LOAD_FILE);
    終了の場合;
  終わり;
P_ETL_ORA_DATA の終了;

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQLからOracleへのリアルタイム同期ソリューションの詳細な説明
  • Mysql と Oracle でよく使用される複数テーブルの変更ステートメントの概要
  • MySQLとOracleの違いのまとめ(機能性能の比較、選択、使用時のSQLなど)
  • MySQLデータベースとOracleデータベース間のバックアップをインポートする
  • MySQLはOracleシーケンスに似たソリューションを実装しています
  • Oracle と MySQL の高可用性ソリューションの比較分析
  • MySQLとOracleの違いの比較:6つのトリガー
  • MySQL と Oracle の違いの比較: 5: ストアド プロシージャと関数
  • MySQLとOracleの違いの比較3つの機能
  • MySQLとOracleの誤解の詳細な説明

<<:  Axiosは繰り返しのリクエストをキャンセル

>>:  CentOS 8.0.1905 は ZABBIX 4.4 バージョンをインストールします (検証済み)

推薦する

Linux CentOS MySQL データベースのインストールと設定のチュートリアル

MySQLデータベースのインストールに関するメモ、みんなで共有a) MySQL ソースインストールパ...

Linux での Docker のインストールと展開の例

以下の記事を読んだ後、プロジェクトをサーバーにデプロイできます。Tomcat、JDK、MySQL な...

Linux でファイルを削除するさまざまな方法の効率の比較

Linux で大量のファイルを削除する効率をテストします。まず500,000個のファイルを作成する$...

JDカルーセル効果を実現するための純粋なHTMLとCSS

JD カルーセルは、動的な効果を追加せず、主に位置決めの知識を使用して、純粋な HTML と CS...

Linux 7.7 でスワップ パーティション SWAP を設定する方法

Linux システムの Swap パーティション、つまり swap パーティションは、一般に仮想メモ...

ウェブデザインのためのロイヤルブルーのカラーマッチング入門

古典的な色の組み合わせは力と権威を伝え、強いロイヤルブルーはあらゆる古典的な色の組み合わせの中心的な...

MySQL 5.7.27 のインストールと設定方法のグラフィックチュートリアル

MySQL 5.7.27のインストールチュートリアルは以下のように記録され、皆さんと共有されています...

MacでのMySQL初期化パスワード操作

Macでデータベースを操作する際に個人が遭遇するデータベース起動の問題の簡単な記録1. Apple-...

Webpack4プラグインの実装原理についての簡単な説明

目次序文知る練習すれば完璧になる序文wabpack では、ローダーの他にプラグインがコア機能です。プ...

Docker 環境での Jmeter の分散操作に関する詳細なチュートリアル

1. jmeterの基本イメージを構築するDockerfile は次のとおりです。 # Java 8...

axiosのシンプルなカプセル化と使用例コード

序文最近、プロジェクトを構築しているときに、リクエストのカプセル化について考え、どのようにカプセル化...

node.js で Web サーバーを作成する手順の詳細な説明

序文node.js でサーバーを作成するのは非常に簡単です。小さいながらも完全な Web サーバーを...

Tomcat のパフォーマンス最適化のための Apr モジュールの構築方法

序文Tomcat は、無数のチューニング オプションを備えた、広く使用されている Java Web ...

MySQLの空の値とnull値の違いを知っていますか?

序文最近、友人がSQLを書くときにnull値を判定する方法が間違っていて、プログラム内のデータにエラ...

Linux環境でrmによって誤って削除されたファイルを回復する方法

目次序文RMの後には希望はあるのでしょうか?最前線を使ってファイルを取得するextundeleteを...