[テンプレ]データの移行

関連テンプレ構成
テンプレート
# データの移行

## 移行対象データの範囲

### 移行対象データ一覧

本プロジェクトで移行対象とするデータの範囲を以下に示します。

| No | データ種別 | テーブル/ファイル名 | 移行対象範囲 | 件数(概算) | 優先度 |
|----|----------|------------------|-------------|------------|--------|
| 1 | マスタ | 顧客マスタ | 全件 | 10,000| High |
| 2 | マスタ | 商品マスタ | 全件 | 5,000| High |
| 3 | マスタ | 社員マスタ | 全件 | 500| High |
| 4 | トランザクション | 受注データ | 過去3年分 | 50,000| High |
| 5 | トランザクション | 売上データ | 過去3年分 | 80,000| High |
| 6 | トランザクション | 在庫データ | 最新のみ | 3,000| Middle |
| 7 | ログ | アクセスログ | 移行対象外 | - | - |

**記述例:**
- **マスタデータ**: 最新の有効データを全件移行
- **トランザクションデータ**: 20221月以降のデータを移行対象とする
- **履歴データ**: 過去5年分の履歴を保持

### 移行対象外データ

以下のデータは移行対象外とします。

| No | データ種別 | 理由 | 代替措置 |
|----|----------|------|---------|
| 1 | テストデータ | 新システムで再作成 | 新規作成 |
| 2 | 削除済みデータ | 業務上不要 | 参照用に旧環境保管 |
| 3 | 2021年以前のログ | 保管義務なし | 廃棄 |

---

## 移行方式

### 移行方式の選定

本プロジェクトでは、以下の理由により**一括移行方式**を採用します。

**選定理由:**
- システム規模が中小規模であり、移行データ量が限定的
- 業務停止時間(週末48時間)が確保可能
- 並行稼働によるデータ不整合リスクを回避したい
- コスト・期間の観点から最も効率的

### 移行方式の比較

```mermaid
graph LR
    A[移行方式] --> B[一括移行]
    A --> C[段階移行]
    A --> D[並行稼働]
    
    B --> B1[採用]
    C --> C1[不採用]
    D --> D1[不採用]
    
    style B1 fill:#90EE90
    style C1 fill:#FFB6C1
    style D1 fill:#FFB6C1
```

| 方式 | メリット | デメリット | 判定 |
|------|---------|-----------|------|
| 一括移行 | ・シンプルで管理しやすい<br>・データ不整合が発生しにくい<br>・コストが最小 | ・業務停止時間が必要<br>・失敗時の影響大 | ✅採用 |
| 段階移行 | ・リスク分散可能<br>・業務影響を最小化 | ・複雑で工数大<br>・データ整合性管理が困難 | ❌不採用 |
| 並行稼働 | ・リスク最小<br>・段階的な切替可能 | ・二重メンテナンス<br>・同期の複雑さ<br>・コスト大 | ❌不採用 |

---

## 移行方法(技術的アプローチ)

### データ移行フロー

```mermaid
graph LR
    A[旧システム] -->|①抽出| B[変換処理]
    B -->|②変換| C[検証]
    C -->|③検証| D[新システム]
    D -->|④登録| E[確認]
    
    B -.エラー.-> F[エラーログ]
    C -.エラー.-> F
    D -.エラー.-> F
```

### 移行処理の流れ

#### データ抽出(Extract)

**方法:**
- 旧システムのDBから直接SQL抽出
- またはCSVエクスポート機能を使用

**抽出ツール:**
- 標準: SQL*Loader / mysqldump
- カスタムツール: 移行用Pythonスクリプト

**記述例:**
```sql
-- 顧客マスタ抽出クエリ
SELECT 
    customer_id,
    customer_name,
    email,
    registration_date
FROM customers
WHERE delete_flag = 0;
```

#### データ変換(Transform)

**変換処理内容:**
- 文字コード変換(Shift-JISUTF-8)
- 日付フォーマット統一(YYYYMMDDYYYY-MM-DD)
- コード体系変換(旧コード → 新コード)
- NULL値の処理

**変換ツール:**
- ETLツール: Talend / Pentaho
- スクリプト: Python pandas

**記述例:**
```python
# 日付フォーマット変換
df['registration_date'] = pd.to_datetime(
    df['registration_date'], 
    format='%Y%m%d'
).dt.strftime('%Y-%m-%d')
```

#### データ検証(Validation)

**検証項目:**
- 必須項目チェック
- データ型チェック
- 桁数チェック
- 重複チェック
- 参照整合性チェック

**検証基準:**
| 検証項目 | 判定基準 | 対応 |
|---------|---------|------|
| エラー率 | 0.1%未満 | エラーデータは手動修正 |
| 件数一致 | 100% | 不一致時は原因調査 |

#### データ登録(Load)

**登録方法:**
- バルクインサート(一括登録)
- APIによる登録
- 手動登録(例外のみ)

**登録順序:**
```mermaid
graph TD
    A[マスタデータ] --> B[トランザクションデータ]
    
    A1[顧客マスタ] --> A
    A2[商品マスタ] --> A
    A3[社員マスタ] --> A
    
    B1[受注データ] --> B
    B2[売上データ] --> B
```

---

## データ変換の考え方

### マッピング定義

旧システムから新システムへのデータ項目対応を定義します。

#### マッピング定義例:顧客マスタ

| No | 旧項目名 | 新項目名 | 変換ルール | 備考 |
|----|---------|---------|-----------|------|
| 1 | CUST_ID | customer_id | そのまま | 主キー |
| 2 | CUST_NAME | customer_name | トリム処理 | 前後空白削除 |
| 3 | MAIL_ADDR | email | 小文字変換 | 正規化 |
| 4 | REG_DATE | registration_date | YYYY-MM-DD形式 | 日付変換 |
| 5 | DEL_FLG | is_deleted | 0false, 1true | boolean変換 |

### コード変換定義

コード体系が変更される場合の変換ルールを定義します。

#### コード変換例:都道府県コード

| 旧コード | 新コード | 都道府県名 |
|---------|---------|-----------|
| 01 | 13 | 東京都 |
| 02 | 27 | 大阪府 |
| 03 | 14 | 神奈川県 |

### データ変換の例外処理

**NULL値の扱い:**
- 必須項目でNULLの場合: デフォルト値を設定
- 任意項目でNULLの場合: NULLのまま移行

**不正データの扱い:**
- エラーリスト出力
- 業務部門と協議の上、手動修正

---

## 移行・並行稼働期間のデータ同期

### データ同期の必要性

本プロジェクトでは**一括移行方式**を採用するため、基本的に並行稼働期間は設けません。
ただし、以下のケースで一時的な同期が必要となる場合があります。

**同期が必要なケース:**
- リハーサル後の本番移行までの期間(差分データのみ)
- 移行失敗時の切り戻し後の再移行

### 差分データ同期方式

```mermaid
graph LR
    A[旧システム] -->|①変更データ抽出| B[差分ファイル]
    B -->|②差分適用| C[新システム]
    
    A -.タイムスタンプで判定.-> B
```

**同期対象:**
- リハーサル実施日以降に更新されたデータのみ

**同期頻度:**
- 本番移行直前の1回のみ

**同期方法:**
- タイムスタンプによる差分抽出
- 更新日時が最新のデータのみを対象

---

## リハーサル

移行リハーサルの詳細については、**6.5 移行リハーサル**の章を参照してください。

**リハーサルの目的:**
- 移行手順の妥当性確認
- 移行時間の計測
- エラー発生時の対応確認

**リハーサル実施回数:**
- 最低2回(初回リハーサル + 本番前最終リハーサル)

---

## リスクとバックアップ

移行リスクと切り戻し方針の詳細については、**6.3 移行リスク管理・切り戻し**の章を参照してください。

**主要なリスク:**
- データ移行失敗
- 移行時間の超過
- データ不整合の発生

**バックアップ方針:**
- 移行前: 旧システムの完全バックアップ取得
- 移行後: 新システムの初期バックアップ取得
- 保管期間: 最低3ヶ月

**切り戻し判断基準:**
- 重大な業務影響が発生した場合
- データ不整合が許容範囲を超えた場合
- 移行時間が予定を大幅に超過した場合

---

## 移行ツール

### 使用ツール一覧

| ツール名 | 用途 | 選定理由 |
|---------|------|---------|
| Python pandas | データ変換 | 柔軟性・拡張性が高い |
| MySQL Workbench | データ抽出・登録 | 標準ツールで安定性が高い |
| Excel | マッピング定義管理 | 業務部門との共有が容易 |

### カスタムツールの開発

以下のカスタムツールを開発します。

**データ検証ツール:**
- 入力: 変換後CSVファイル
- 処理: 必須チェック、形式チェック、重複チェック
- 出力: エラーリスト(CSV)

**差分抽出ツール:**
- 入力: 旧システムDB
- 処理: タイムスタンプによる差分判定
- 出力: 差分データ(CSV)

---

## 移行データの品質管理

### 品質基準

| 品質項目 | 目標値 | 測定方法 |
|---------|-------|---------|
| データ完全性 | 100% | 件数突合 |
| データ正確性 | 99.9%以上 | サンプリング検証 |
| エラー率 | 0.1%未満 | エラーログ集計 |

### 検証手順

```mermaid
graph TD
    A[移行実施] --> B[件数チェック]
    B --> C{一致?}
    C -->|Yes| D[サンプリング検証]
    C -->|No| E[原因調査]
    E --> F[修正]
    F --> A
    D --> G{OK?}
    G -->|Yes| H[移行完了]
    G -->|No| E
```

**検証レベル:**
1. **全件検証**: 件数、主キー、必須項目
2. **サンプリング検証**: 10%抽出による詳細確認
3. **業務検証**: 業務部門による受入確認

---
プレビュー

データの移行

移行対象データの範囲

移行対象データ一覧

本プロジェクトで移行対象とするデータの範囲を以下に示します。

No データ種別 テーブル/ファイル名 移行対象範囲 件数(概算) 優先度
1 マスタ 顧客マスタ 全件 10,000件 High
2 マスタ 商品マスタ 全件 5,000件 High
3 マスタ 社員マスタ 全件 500件 High
4 トランザクション 受注データ 過去3年分 50,000件 High
5 トランザクション 売上データ 過去3年分 80,000件 High
6 トランザクション 在庫データ 最新のみ 3,000件 Middle
7 ログ アクセスログ 移行対象外 - -

記述例:

  • マスタデータ: 最新の有効データを全件移行
  • トランザクションデータ: 2022年1月以降のデータを移行対象とする
  • 履歴データ: 過去5年分の履歴を保持
移行対象外データ

以下のデータは移行対象外とします。

No データ種別 理由 代替措置
1 テストデータ 新システムで再作成 新規作成
2 削除済みデータ 業務上不要 参照用に旧環境保管
3 2021年以前のログ 保管義務なし 廃棄

移行方式

移行方式の選定

本プロジェクトでは、以下の理由により一括移行方式を採用します。

選定理由:

  • システム規模が中小規模であり、移行データ量が限定的
  • 業務停止時間(週末48時間)が確保可能
  • 並行稼働によるデータ不整合リスクを回避したい
  • コスト・期間の観点から最も効率的
移行方式の比較
graph LR
    A[移行方式] --> B[一括移行]
    A --> C[段階移行]
    A --> D[並行稼働]

    B --> B1[採用]
    C --> C1[不採用]
    D --> D1[不採用]

    style B1 fill:#90EE90
    style C1 fill:#FFB6C1
    style D1 fill:#FFB6C1
方式 メリット デメリット 判定
一括移行 ・シンプルで管理しやすい<br>・データ不整合が発生しにくい<br>・コストが最小 ・業務停止時間が必要<br>・失敗時の影響大 ✅採用
段階移行 ・リスク分散可能<br>・業務影響を最小化 ・複雑で工数大<br>・データ整合性管理が困難 ❌不採用
並行稼働 ・リスク最小<br>・段階的な切替可能 ・二重メンテナンス<br>・同期の複雑さ<br>・コスト大 ❌不採用

移行方法(技術的アプローチ)

データ移行フロー
graph LR
    A[旧システム] -->|①抽出| B[変換処理]
    B -->|②変換| C[検証]
    C -->|③検証| D[新システム]
    D -->|④登録| E[確認]

    B -.エラー.-> F[エラーログ]
    C -.エラー.-> F
    D -.エラー.-> F
移行処理の流れ
データ抽出(Extract)

方法:

  • 旧システムのDBから直接SQL抽出
  • またはCSVエクスポート機能を使用

抽出ツール:

  • 標準: SQL*Loader / mysqldump
  • カスタムツール: 移行用Pythonスクリプト

記述例:

-- 顧客マスタ抽出クエリ
SELECT
    customer_id,
    customer_name,
    email,
    registration_date
FROM customers
WHERE delete_flag = 0;
データ変換(Transform)

変換処理内容:

  • 文字コード変換(Shift-JIS → UTF-8)
  • 日付フォーマット統一(YYYYMMDD → YYYY-MM-DD)
  • コード体系変換(旧コード → 新コード)
  • NULL値の処理

変換ツール:

  • ETLツール: Talend / Pentaho
  • スクリプト: Python pandas

記述例:

# 日付フォーマット変換
df['registration_date'] = pd.to_datetime(
    df['registration_date'],
    format='%Y%m%d'
).dt.strftime('%Y-%m-%d')
データ検証(Validation)

検証項目:

  • 必須項目チェック
  • データ型チェック
  • 桁数チェック
  • 重複チェック
  • 参照整合性チェック

検証基準:

検証項目 判定基準 対応
エラー率 0.1%未満 エラーデータは手動修正
件数一致 100% 不一致時は原因調査
データ登録(Load)

登録方法:

  • バルクインサート(一括登録)
  • APIによる登録
  • 手動登録(例外のみ)

登録順序:

graph TD
    A[マスタデータ] --> B[トランザクションデータ]

    A1[顧客マスタ] --> A
    A2[商品マスタ] --> A
    A3[社員マスタ] --> A

    B1[受注データ] --> B
    B2[売上データ] --> B

データ変換の考え方

マッピング定義

旧システムから新システムへのデータ項目対応を定義します。

マッピング定義例:顧客マスタ
No 旧項目名 新項目名 変換ルール 備考
1 CUST_ID customer_id そのまま 主キー
2 CUST_NAME customer_name トリム処理 前後空白削除
3 MAIL_ADDR email 小文字変換 正規化
4 REG_DATE registration_date YYYY-MM-DD形式 日付変換
5 DEL_FLG is_deleted 0→false, 1→true boolean変換
コード変換定義

コード体系が変更される場合の変換ルールを定義します。

コード変換例:都道府県コード
旧コード 新コード 都道府県名
01 13 東京都
02 27 大阪府
03 14 神奈川県
データ変換の例外処理

NULL値の扱い:

  • 必須項目でNULLの場合: デフォルト値を設定
  • 任意項目でNULLの場合: NULLのまま移行

不正データの扱い:

  • エラーリスト出力
  • 業務部門と協議の上、手動修正

移行・並行稼働期間のデータ同期

データ同期の必要性

本プロジェクトでは一括移行方式を採用するため、基本的に並行稼働期間は設けません。
ただし、以下のケースで一時的な同期が必要となる場合があります。

同期が必要なケース:

  • リハーサル後の本番移行までの期間(差分データのみ)
  • 移行失敗時の切り戻し後の再移行
差分データ同期方式
graph LR
    A[旧システム] -->|①変更データ抽出| B[差分ファイル]
    B -->|②差分適用| C[新システム]

    A -.タイムスタンプで判定.-> B

同期対象:

  • リハーサル実施日以降に更新されたデータのみ

同期頻度:

  • 本番移行直前の1回のみ

同期方法:

  • タイムスタンプによる差分抽出
  • 更新日時が最新のデータのみを対象

リハーサル

移行リハーサルの詳細については、6.5 移行リハーサルの章を参照してください。

リハーサルの目的:

  • 移行手順の妥当性確認
  • 移行時間の計測
  • エラー発生時の対応確認

リハーサル実施回数:

  • 最低2回(初回リハーサル + 本番前最終リハーサル)

リスクとバックアップ

移行リスクと切り戻し方針の詳細については、6.3 移行リスク管理・切り戻しの章を参照してください。

主要なリスク:

  • データ移行失敗
  • 移行時間の超過
  • データ不整合の発生

バックアップ方針:

  • 移行前: 旧システムの完全バックアップ取得
  • 移行後: 新システムの初期バックアップ取得
  • 保管期間: 最低3ヶ月

切り戻し判断基準:

  • 重大な業務影響が発生した場合
  • データ不整合が許容範囲を超えた場合
  • 移行時間が予定を大幅に超過した場合

移行ツール

使用ツール一覧
ツール名 用途 選定理由
Python pandas データ変換 柔軟性・拡張性が高い
MySQL Workbench データ抽出・登録 標準ツールで安定性が高い
Excel マッピング定義管理 業務部門との共有が容易
カスタムツールの開発

以下のカスタムツールを開発します。

データ検証ツール:

  • 入力: 変換後CSVファイル
  • 処理: 必須チェック、形式チェック、重複チェック
  • 出力: エラーリスト(CSV)

差分抽出ツール:

  • 入力: 旧システムDB
  • 処理: タイムスタンプによる差分判定
  • 出力: 差分データ(CSV)

移行データの品質管理

品質基準
品質項目 目標値 測定方法
データ完全性 100% 件数突合
データ正確性 99.9%以上 サンプリング検証
エラー率 0.1%未満 エラーログ集計
検証手順
graph TD
    A[移行実施] --> B[件数チェック]
    B --> C{一致?}
    C -->|Yes| D[サンプリング検証]
    C -->|No| E[原因調査]
    E --> F[修正]
    F --> A
    D --> G{OK?}
    G -->|Yes| H[移行完了]
    G -->|No| E

検証レベル:

  1. 全件検証: 件数、主キー、必須項目
  2. サンプリング検証: 10%抽出による詳細確認
  3. 業務検証: 業務部門による受入確認