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 をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。 以下もご興味があるかもしれません:
|
>>: CentOS 8.0.1905 は ZABBIX 4.4 バージョンをインストールします (検証済み)
目次1. クラス1.1 コンストラクタ() 1.2 ゲッターとセッター1.3 これ1.4 静的プロパ...
1. ファイル削除コマンド:対応するディレクトリを検索します -mtime + 日数 -name &...
序文最近、高可用性プロジェクトに取り組む際には、データの同期が必要になっています。ノードが 2 つし...
目次0. モジュールとは何か1.モジュールの読み込み1.1 方法1 1.2 方法2 2. 輸出と輸入...
Windows システム向け MySQL インストール チュートリアルダウンロード1. https:...
1. CSSをアルファベット順に並べるアルファベット順ではありません:コードをコピーコードは次のとお...
MySQL 5.5 のインストールと構成のチュートリアル ノートを整理し、全員と共有します。 1.公...
サーバーの画像が他のウェブサイトからホットリンクされると、サーバーの帯域幅とアクセス速度に影響します...
Toutiao IT School で、CSS がフロントエンドの画像変形の問題を完璧に解決するとい...
ここでは、CSS テクニックを巧みに使用することで、HTML を変更せずにブログやテンプレートの外観...
先週、先生が私に数字当てゲームをするちょっとした宿題を出しました。とても面白いと思ったので、適当に書...
MySQL トランザクション サポートは、MySQL サーバー自体にバインドされているのではなく、ス...
今日、リモートデスクトップを実行してログインしているときにこのプロンプトを見つけました「MySQL ...
この記事の例では、ログインと登録を実装するためのspringboot+VUEの具体的なコードを参考ま...
Web プロジェクトを開発する場合、IIS をインストールする必要があります。IIS がインストール...