Skip to content

データベース同期(本番→ローカル) ​

本番環境のデータベースをローカル環境に同期するスクリプトの手順です。安全な実行手順は DB同期の安全ガイド を参照してください。

本番のデータを staging に取り込むときは、別のスクリプト scripts/sync-staging-data-from-production.sh を使う。staging には直近の日別記事・台データ・集計・リンク・ヒートマップのレイアウト・P-WORLD サムネ・有料記事の最新数件とマスタ類だけを入れ、有料記事の購入・会員・コメントなどの個人情報は入れない。手順と対象は ステージング環境デプロイ > 本番データの部分同期 を参照。

本番データをローカルに入れる ​

本番の差枚・リンク・考察日テーブル、必要なら日別記事の投稿内容をローカルへ取り込むときの正本です。

やりたいこと使うスクリプト挙動
初回セットアップ・スキーマ変更後・ローカル破損の復旧./scripts/sync-db-from-production.shDB 全体をダンプ→インポート(ローカルを本番で上書き)
有料記事執筆で「足りない月だけ」差枚・サマリ等を足したい./scripts/sync-db-month-from-production.sh YYYY-MM日付キー業務テーブルのみ REPLACE upsert(DROP しない)
期間指定で db2023 など業務テーブルだけ取りたい./scripts/sync-db-month-from-production.sh --from YYYY-MM-DD --to YYYY-MM-DD上記と同じ upsert。両端含む日付範囲
日別記事の投稿内容(post meta)を一部ローカルへコピーしたい上記に --with-daily-article-posts を付ける対象期間の daily_article を wp_posts REPLACE + wp_postmeta DELETE/INSERT
テーマ・プラグインも揃えたい(ローカル無効プラグインに注意)ファイル同期ガイド本ページの対象外

期間差分で同期する業務テーブル(例・接頭辞 wp_): db2023 / db_Link_day / db_Link_month / db_daily_article_kishu_single_day_summary / db_daily_article_kishu_count_delta / db_daily_article_consideration。

--with-daily-article-posts なしでは wp_posts / wp_postmeta は対象外。日別記事の本文相当は post_content ではなく post meta(kousatsu_date / halls / ホール別 *_pre / *_after)である。添付・uploads・コメント・ユーザー・タームは対象外。

有料記事 MCP で充足状況を確認するときは check_local_data_coverage(MCP 利用ガイド)を使う。不足月があれば、ユーザー許可のうえ ensure_local_month_data または月次スクリプトを実行する。任意期間・投稿コピーは CLI を使う(MCP の ensure_local_month_data は YYYY-MM のみ)。エージェントがチャット依頼で同期する手順は .cursor/skills/production-db-sync-to-local/SKILL.md を参照。

いつ DB だけを同期するか(推奨ケース) ​

ローカルでは本番と異なり 無効化するプラグイン や、開発用に入れたテーマ構成を残したいことが多いです。その場合はテーマ・プラグイン・uploads を触らず、DB のみ取り込むのが安全です。

やりたいこと使うスクリプト
本番相当の記事・差枚・考察データをローカルで見る(全体)./scripts/sync-db-from-production.sh
指定月の差枚・サマリ等だけ最新化したい./scripts/sync-db-month-from-production.sh YYYY-MM
任意期間の差枚・サマリ等だけ最新化したい./scripts/sync-db-month-from-production.sh --from … --to …
期間内の日別記事投稿(meta)も揃えたい上記 + --with-daily-article-posts
有料記事 MCP / WP-CLI Tool で最新データに近づけたい上記いずれか(用途に応じてフル or 期間差分)
テーマ・プラグインも揃えたい(ローカル無効プラグインに注意)ファイル同期ガイド

「ローカルを最新化して」と依頼されたエージェントも、特に指定がなければ DB のみを既定とします。執筆中の不足月だけなら 月次/期間差分を優先し、スキーマ変更・初回・破損時はフル同期を使います。プラグイン同期まで含める場合は明示してください。

設定 ​

  1. config/local.env.example を config/local.env にコピーします
bash
cp config/local.env.example config/local.env
  1. config/local.env を編集し、以下の情報を設定します
bash
# 本番環境のデータベース情報
PROD_DB_HOST=your_production_db_host  # 例: mysql16.conoha.ne.jp (ConoHa WING)
PROD_DB_NAME=your_production_db_name
PROD_DB_USER=your_production_db_user
PROD_DB_PASS=your_production_db_pass

# ローカル環境のデータベース情報(Local by Flywheelのデフォルト)
LOCAL_DB_NAME=local
LOCAL_DB_USER=root
LOCAL_DB_PASS=root

# 任意: テーブル接頭辞(未設定時は wp_)
# WP_TABLE_PREFIX=wp_

注意: config/local.env は .gitignore で除外されているため、リポジトリにコミットされません。

実行方法(フル同期) ​

⚠️ 警告: このスクリプトを実行すると、ローカル環境の既存データベースが本番環境のデータで完全に上書きされます。重要なローカルデータがある場合は、事前にバックアップを取ってください。

bash
# プロジェクトルートから実行
./scripts/sync-db-from-production.sh

スクリプトは以下の処理を自動で実行します:

  1. 設定ファイル (config/local.env) の読み込みと検証
  2. SSH接続の確認
  3. 本番環境からデータベースダンプを取得(SSH経由)
  4. ローカル環境のデータベースにインポート
  5. 一時ファイルの自動削除

実行方法(月次・期間差分同期) ​

ローカルにスキーマがある前提で、指定月または日付範囲の業務テーブル行だけを本番から upsert します。DB 全体の DROP は行いません。 YYYY-MM と --from / --to は併用できません。

bash
# 対象テーブルと WHERE のみ表示(月指定)
./scripts/sync-db-month-from-production.sh 2026-08 --dry-run

# 実行(確認プロンプトあり)
./scripts/sync-db-month-from-production.sh 2026-08

# 非対話(CI / 自動化向け)
./scripts/sync-db-month-from-production.sh 2026-08 --yes

# 任意期間(両端含む)
./scripts/sync-db-month-from-production.sh --from 2026-08-01 --to 2026-08-15 --dry-run
./scripts/sync-db-month-from-production.sh --from 2026-08-01 --to 2026-08-15

# 期間内の日別記事投稿(posts + postmeta)もコピー
./scripts/sync-db-month-from-production.sh --from 2026-08-01 --to 2026-08-15 --with-daily-article-posts
./scripts/sync-db-month-from-production.sh 2026-08 --with-daily-article-posts --yes
  • 同時実行は /tmp/sync-db-month.lock.d(mkdir ロック)でガードします
  • 破壊的フル同期とコマンド名を分けているため、誤ってフル同期を走らせにくくしています
  • --with-daily-article-posts 時は、同じ ID のローカル日別記事が本番内容で上書きされます(確認プロンプトで警告)
  • 投稿コピーは業務テーブル upsert のあと、db_daily_article_consideration と wp_posts(post_type=daily_article)の交差で得た post_id をキーにします。0 件なら投稿同期はスキップして成功扱いです
  • 投稿同期の順は「posts / postmeta ダンプ取得 → ローカル postmeta DELETE → インポート」です(ダンプ失敗時に meta だけ欠けるのを防ぐ)

セキュリティに関する注意事項 ​

  • パスワード管理:
    • データベース認証情報は config/local.env で管理し、.gitignore で除外されています
    • config/local.env のパーミッションは 600 に設定することを推奨します(chmod 600 config/local.env)
    • スクリプトは --defaults-extra-file オプションを使用してパスワードを安全に扱います。パスワードは一時的な設定ファイルに保存され、コマンドライン引数として渡されることはありません
    • 一時的な設定ファイルは自動的に削除されます。ただし、システムクラッシュやkill -9(SIGKILL)などの強制終了の場合は手動で削除してください
  • SSH鍵: SSH鍵のパーミッションは 600 に設定することを推奨します
  • SSH接続: ホスト鍵検証を有効にするため、事前に known_hosts に正しいホスト鍵を登録してください
    • 初回接続時: ssh-keyscan -p <SSH_PORT> <DEPLOY_HOST> >> ~/.ssh/known_hosts でホスト鍵を登録
    • または、UserKnownHostsFile オプションで専用ファイルを使用することも可能
  • 一時ファイル: ダンプファイルとMySQL設定ファイルは、スクリプトが正常終了または通常のシグナル(Ctrl+C等)で中断された場合は自動的に削除されます。ただし、システムクラッシュやkill -9(SIGKILL)などの強制終了の場合は手動で削除してください
    • 一時ファイルの場所:
      • ローカル: /tmp/db-sync-*.sql, /tmp/mysql-*-config-*.cnf, /tmp/mysqldump-error-*.log, /tmp/mysql-error-*.log
      • リモート(本番環境): /tmp/.db-sync-temp-*.cnf

トラブルシューティング ​

SSH接続エラー ​

bash
# SSH鍵のパーミッションを確認
ls -l ~/.ssh/your-private-key.pem

# パーミッションを600に設定
chmod 600 ~/.ssh/your-private-key.pem

データベース接続エラー ​

  • ローカル環境のデータベースが起動しているか確認してください
  • Local by Flywheel を使用している場合、サイトが起動していることを確認してください。加えて、wp を Mac のターミナル(ホスト)で実行すると DB 接続エラーになることがあります。その場合は WP-CLI 接続手順 のとおり、Local のサイトシェルから wp を実行してください
  • データベース名、ユーザー名、パスワードが正しいか確認してください

ダンプファイルが空の場合 ​

  • 本番環境での mysqldump コマンドの実行権限を確認してください
  • 本番環境のデータベース接続情報が正しいか確認してください

関連ドキュメント ​