質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

MySQLで別サーバーからデータを同期する方法

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,037

score 7

前提

元データ

サーバー名 server.test01.com
DB名 test01
テーブル名 users

同期先

サーバー名 server.test02.com
DB名 test02
テーブル名 customers

やりたいこと

現在Laravelで新規開発を行っています。
既存サービス(FuelPHP)のユーザデータを利用するためにデータを同期する必要があります。

元データのusersテーブルのうち、条件を満たすデータを
同期先のcustomersテーブルに挿入し、元データに変更がある場合は同期先を上書きしたいです。
(同期先のサービス内でこのデータを編集・削除することはありません)
1日1回同期先のサーバーからCRONを使ってこの作業を行います。
サーバーはどちらもさくらのマネージドサーバーです。

同じサーバーにある別のDBからであれば、以下のSQL文でデータが同期できる事を確認しています。

INSERT INTO customers(id, email, password, username, delete_flg)
SELECT id, email, password, username, delete_flg
FROM test01.users
INNER JOIN test01.seller 
ON test01.users.id = test01.seller.user_id
WHERE not exists(
SELECT ‘X’
FROM customers
WHERE 
 customers.id = test01.users.id 
 )
AND test01.seller.product_id = 1

 UPDATE customers, test01.users
 SET
   customers.email = test01.users.email,
  customers.password = test01.users.password,
  customers.username = test01.users.username,
  customers.delete_flg = test01.users.delete_flg,

WHERE
 engineers.id = test01.users.id 

これを異なるサーバーでやりたい場合どのようにすればよいのでしょうか。

また上記の目的が達成できれば方法はSQLで無くても構いません。
(CSVファイルを使う方法もあると聞きました)
他に良い方法があれば教えて頂きたいです。

回答のために必要な情報がありましたらお知らせ下さい。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

よくある方法としては以下の様な方法でしょうか。

  1. mysqldumpで同期元のテーブルをダンプする
  2. SCP等でダンプデータを移動させる
  3. 同期先でダンプデータをインポートする
  4. 同期先で質問中のクエリを実行する

全てコマンドで実行できる操作なので、方法を確立出来たらcronを使って定期自動実行の設定を行います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/14 11:34

    返信遅くなりました。回答ありがとうございます!
    ダンプデータを移動してインポートした上で処理を行えばいいのですね。この方法でやってみます。

    キャンセル

+1

MySQLの基本機能にレプリケーションがあります。
レプリケーションではどうしてもダメな場合以外はレプリケーションを使いましょう。

MySQL入門 レプリケーション編@Qiita

基本機能なので"MySQL レプリケーション"でググれば情報はたくさん出てきます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/11 18:39

    ありがとうございます。基本的にはレプリケーションを使えば良いのですね!
    ただ今回はクライアントからリアルタイムでの同期は負荷がかかるので必要ない、1日1回で十分と言われています。この場合はレプリケーションは使えないですよね・・

    キャンセル

  • 2020/01/11 18:55

    機能として「遅延レプリケーション」ってのはありますよ。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る