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 バージョンをインストールします (検証済み)

推薦する

JSは10進数を16進数に変換するサンプルコードを実装します

序文コードを書くと、時々基数変換の問題に遭遇します。一般的な変換には、2進数、8進数、10進数、16...

フロントエンドネットワーク、JavaScriptの最適化、開発のヒントについて簡単に説明します。

1. ネットワークの最適化YSlowには23のルールがあります。これら数十のルールは、主に、不要な...

キャッシュサーバーを構築するためのMemcached方式

序文多くの Web アプリケーションは、リレーショナル データベース管理システム (RDBMS) に...

Dockerはホスト間のネットワーク通信を実現するためにMacvlanを導入する

基本的な概念: Macvlanの動作原理: Macvlan は、Linux カーネルでサポートされて...

フロントエンド JavaScript ハウスキーパー package.json

目次1. 必須属性1. 名前2. バージョン2. 説明情報1. 説明2. キーワード3. 著者4. ...

MySQLクエリキャッシュの簡単な使い方の詳細な説明

目次1. クエリキャッシュの実装プロセス2. クエリキャッシュを構成する3. クエリキャッシュを有効...

Docker で MySQL を起動したときに SQL 文を自動的に実行する方法

Docker で MySQL コンテナを作成する場合、コンテナの起動後にデータベースとテーブルが自動...

HTML に埋め込まれた MP4 形式のビデオが再生できないのはなぜですか?

次のコードは、私の test.html にあります。ビデオは、c:\test.html などの絶対パ...

HTMLの基礎: HTMLの基本構造

HTML ハイパーテキスト ドキュメントの基本構造は、ドキュメント ヘッダーとドキュメント本体の 2...

MySQLで行を列に変換する方法

MySQL の行から列への操作いわゆる行から列への操作は、テーブルの行情報を列情報に変換することです...

Docker コマンドラインの完全ガイド (知っておくべき 18 のこと)

序文Docker イメージは Dockerfile といくつかの必要な依存関係で構成され、Docke...

MySQL マスタースレーブ同期メカニズムと同期遅延問題追跡プロセス

序文DBA として、仕事中に MySQL マスターとスレーブの同期遅延の問題に遭遇することがよくあり...

Vue でユーザー権限に基づいてルートを動的に追加する方法

ユーザーの権限に応じて異なるメニュー ページを表示します。知識ポイントルートガード(事前ガードを使用...

Linux でユーザー アカウントをロックおよびロック解除する 3 つの方法

組織内で何らかのパスワード ポリシーがすでに実装されている場合は、この記事を読む必要はありません。た...

インデックスを設計する際の原則は何ですか? インデックスの障害を回避するにはどうすればよいでしょうか?

目次主キーインデックス頻繁にクエリされるフィールドのインデックスを作成する大きなフィールドのインデッ...