Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Data migration from As400 to MySQL using Node

Nao
January 21, 2025
28

Data migration from As400 to MySQL using Node

基幹システムのData migration

Nao

January 21, 2025
Tweet

Transcript

  1. システム構成での課題 • 在庫がリアルタイムではない ◦ 手作業で在庫アップロード ◦ 欠品状態での購入が起こり得る ▪ 70%在庫表示でカバー •

    ECサイトのデータは基幹に戻せない ◦ ECサイト経由の受注は、再度基幹で受注入力する必要がある 人の作業が多すぎる
  2. そもそも概念が違う • テーブル(AS400ではライブラリと呼ぶ)の連結でデータを取得する想定なし • カラム(AS400ではフィールドと呼ぶ)が全て固定長 ◦ 品名1は「”TM-96-12 ”」など ◦ 品名1はユニークキー的もの

    • テーブル名やカラム名が全て推測しにくい情報 ◦ 商品マスターは「FXMVJB00」 ◦ 品名1は、「HIN1CD」 データ連携 & マイグレーションの課題 MySQLと構造が異なるため、データマイグレーションの対応が必要
  3. 第一Phase システム構成図(ECサイトリプレイス) 社内NW Client PC CSBridge ECサイト(Rails) MacMini (サーバー) AS400

    MacMiniを使い、Cronで在庫情報をUpdate 在庫情報 その他マスターデータ
  4. • NodeでODBCを使いAS400にアクセス ◦ SQLを使い、データ取得 • Nodeで取得したJSONデータをActiveStorageに保存 • 上記をテーブル毎に繰り返し • 全てのデータ取得完了後、NodeからActiveJobをキック

    • ActiveJobでJSONデータを解析 ◦ フィールドのマッピングや変換 • 対象テーブルにデータ登録 ◦ データ登録は、Activerecord-importを利用(upsert) JSONファイル作成&利用
  5. MacMiniの仕組み(改善版) AS400 Docker node-mysql2 image pull CSVファイル as400_table_xxx • JSONファイルをCSVファイル生成に変更

    • CSVファイルをnode-mysql2を使い、LOAD DATA INFILE構文でimport ◦ そのままのデータを投入するテーブルを用意 • テーブルごとに上記を繰り返し実行 products transform
  6. LOAD DATA INFILE importの差分 & 全件import • Railsに対象テーブルの最新作成日時と最新更新日時を取得 ◦ いつ最後に処理を実行したかを判断可能

    • 次回importはその日時より後に作成されたレコードを取得する SQLとする • 作成日時と更新日時が正常に更新されないテーブル • 物理削除されるテーブル(削除レコードが追えない) 上記は、件数次第では毎回全件 importとする