0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【完全初心者向け】データベース更新でWebサービスが止まる問題を解決する方法

Posted at

はじめに

「データベースの構造を変更したら、サービスがエラーで止まっちゃった!」

こんな経験はありませんか?今回は、この問題を初心者でも理解できるように解説します。

そもそも何が問題なの?

身近な例で考えてみよう

想像してください。あなたがレストランを経営していて、メニュー表を更新することにしました。

【旧メニュー】
- ハンバーグ定食
- カレーライス
- オムライス

【新メニュー】
- ハンバーグ定食
- カレーライス
- オムライス
- パスタセット(新規追加!)

でも、キッチンのスタッフには新メニューのことを伝えていません。お客さんが「パスタセット」を注文したら...?

スタッフ「そんなメニュー知りません!」→ エラー発生!

これと同じことがWebサービスでも起きるんです。

Webサービスで起きる問題

1. コードとデータベースの不一致

【プログラム】「新しいデータ(パスタセット)を保存して!」
【データベース】「そんな項目ないよ!」→ エラー!

2. タイミングのズレ

実際のWebサービスでは、こんな流れで問題が起きます:

1. 新機能のコードをアップロード
2. でも、データベースはまだ古いまま
3. ユーザーがアクセス → エラー!

解決方法1:手動でマイグレーション

マイグレーションって何?

マイグレーション = データベースの引っ越し作業

古い構造から新しい構造に、データを保ちながら変更することです。

手動実行の手順

1. まず状態を確認

# 今のデータベースの状態を確認
npx prisma migrate status

これで「まだ適用されていない変更」が見えます。

2. バックアップを取る(超重要!)

# データのバックアップ
npm run db:backup

失敗した時のために、必ずバックアップを!

3. マイグレーションを実行

# 本番環境のデータベースを更新
DATABASE_URL="本番データベースのURL" npx prisma migrate deploy

4. 確認

サービスにアクセスして、正常に動いているか確認します。

解決方法2:GitHub Actionsで自動化

自動化のメリット

  • 忘れずに実行される
  • 人為的ミスが減る
  • 履歴が残る

設定方法

1. GitHubにシークレットを登録

1. GitHubのリポジトリを開く
2. Settings → Secrets → Actions
3. 「New repository secret」をクリック
4. Name: DATABASE_URL
5. Value: 本番データベースのURL

2. 自動実行ファイルを作成

.github/workflows/auto-migration.yml を作成:

name: 自動マイグレーション

on:
  push:
    branches: [main]  # mainにマージされたら実行

jobs:
  migrate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Node.jsをセットアップ
        uses: actions/setup-node@v4
        with:
          node-version: '20'
      
      - name: 依存関係をインストール
        run: npm install
      
      - name: マイグレーション実行
        env:
          DATABASE_URL: ${{ secrets.DATABASE_URL }}
        run: |
          echo "データベースを更新中..."
          npx prisma migrate deploy
          echo "完了!"

これで、コードをマージするだけで自動的にデータベースも更新されます!

より安全にする方法

段階的デプロイメント

一気に変更せず、段階的に進める方法です。

ステップ1:互換性のあるコードをデプロイ

// 新旧両方に対応するコード
function getMenuName(item) {
  // 新しい名前があれば使う、なければ古い名前を使う
  return item.newName || item.oldName;
}

ステップ2:データベースを更新

npm run migrate:production

ステップ3:古いコードを削除

// もう古い名前は使わない
function getMenuName(item) {
  return item.newName;
}

チェックリスト

マイグレーション前の確認事項:

  • バックアップは取った?
  • テスト環境で試した?
  • エラー時の対応方法は決めてる?
  • ユーザーへの影響は最小限?
  • 実行タイミングは適切?(深夜など)

トラブルシューティング

よくある問題と解決方法

1. 「Permission denied」エラー

# 権限がない場合は、正しいURLか確認
echo $DATABASE_URL

2. マイグレーションが失敗した

# 状態を確認
npx prisma migrate status

# 必要なら手動でSQLを実行
npx prisma db execute --file ./fix.sql

3. サービスが止まった

# すぐに前のバージョンに戻す
git revert HEAD
git push

まとめ

データベースの更新は慎重に行う必要がありますが、適切な手順を踏めば安全に実行できます。

重要なポイント:

  1. 必ずバックアップを取る
  2. テスト環境で試す
  3. 段階的に進める
  4. 自動化を活用する

最初は手動で慣れて、慣れたら自動化していきましょう!

参考リンク

質問があれば、コメント欄でお気軽にどうぞ!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?