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

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

新規登録して質問してみよう
ただいま回答率
85.51%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

13722閲覧

PHP、MySQLで別のDBにコピーしたい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

0クリップ

投稿2016/03/08 16:13

編集2016/03/09 11:59

PHP、MySQLで別のDBに接続してテーブルの中身のデータをコピーしたいです。

コピー元: DB名→db1 テーブル名→test1
コピー先: DB名→db2 テーブル名→test2

テーブルの構造はあらかじめ全く同じ状態にしてあります。
以下のような感じで試してはいますが、失敗してしまいます。

$cnt1 = mysql_connect("host1", "db1", "password1") ;
mysql_select_db("test1", $cnt1);

$cnt2 = mysql_connect("host2", "db2", "password2") ;
mysql_select_db("test2", $cnt2);

$sql = "INSERT INTO db2.test2 SELECT * FROM db1.test1";
$result = mysql_query($sql, $cnt2)or die("shipai");

ご教授いただければ幸いです。

またバックアップなども考えているため、差分などでコピーができれば一番嬉しいのですが、方法がよくわからずじまいです...

よろしくお願いいたします。

追記
アドバイスいただきました皆様ありがとうございます。
エラーメッセージは以下のような内容でした

Warning</b>: mysql_error() expects parameter 1 to be resource, string given in /ディレクトリのパス/ ●●行目

自身でもエラー内容で調べてみてSQL文の前の分の何かがおかしいと
気づきました。

追記
エラーメッセージを確認しつつ、
何度か試したところ、解決にいたりました。
結果的には、SQL構文が誤字していたのと、
コピー先に権限などがなかったため、付与して試して解決となりました。
(他にでたエラー:INSERT command denied to user)

バックアップの参考等やアドバイス等々みなさまありがとうございました。

yodel👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unau

2016/03/08 21:29

エラーメッセージも添えて質問したほうがいいと思います。質問するかしないかは別として、エラーメッセージを確認するようにすべきだと思います。
退会済みユーザー

退会済みユーザー

2016/03/08 23:45

すみません。判明次第、エラー内容追記いたします
guest

回答4

0

質問文のコードについて

MySQLの場合は一つのSQL文から複数のサーバーに問い合わせることはできません。
今回の例でいうと、host1からSELECTした結果をPHPで変数で保持し、別のクエリでhost2にINSERTする必要があります。データ量が多くメモリに乗り切らないようだとこの方法は難しくなってきますね。

バックアップについて

単純に「バックアップ」と言っても、その目的・規模や本サーバーのサービスレベルによって手法が大きく変わります。
私の認識では以下のいずれか、またはこれらを組み合わせて実装を検討します。

  • レプリケーション
  • 論理バックアップ(mysqldump,mysqlpump)
  • 物理バックアップ(MySQLを停止させてデータディレクトリまるごとファイルコピー)
  • OSや別ミドルウェアの機能を使う(スナップショットなど)

もし「二つのサーバーのデータを同期させておきたい」ならterionさんも提案しているレプリケーションが一番運用しやすいと思います。「PHPとSQL文」だけの世界と違ってインフラよりで少しハードルが上がるかもしれませんが、MySQLはレプリケーションの設定が比較的簡単だと思います。

余計かもしれませんが書籍の紹介を追加させていただきます。
技術評論社 エキスパートのための MySQL[運用+管理]トラブルシューティングガイド
これの「第6章 堅牢な運用を実現するために」が参考になると思います。

投稿2016/03/09 00:27

編集2016/03/09 01:00
dupont_kedama

総合スコア925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/09 11:54

アドバイスありがとうございます。 バックアップについては特に明確な方針もなく、詳しくも知らずでしたので、 教えていただきました種類や参考などが大変勉強になります。ありがとうございます。
guest

0

MySQL同士ならレプリケーション機能をつかうのはどうでしょうか?

レプリケーションとは、データベース管理システムが持つ機能の一つで、あるデータベースとまったく同じ内容の複製(レプリカ)を別のコンピュータ上に作成し、常に内容を同期させる機能。 負荷分散や耐障害性の向上などを目的に行われる。

https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

投稿2016/03/08 23:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/09 00:17

アドバイスありがとうございます そのような方法もあったのですね! 帰宅したらまた実験してみたいとおもいます!
guest

0

ベストアンサー

die("shipai");

die(mysql_error($cnt2));

にすると、mysql_query が、失敗した場合にエラーメッセージが、表示されるので、エラーメッセージを教えてもらえますか。

余談ですが、古い mysql 関数よりは、mysqli 関数を使うことをお勧めします。
参考: http://php.net/manual/ja/mysqlinfo.api.choosing.php

投稿2016/03/08 23:05

CHERRY

総合スコア25164

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/08 23:40

アドバイスありがとうございます エラーの出し方なども、わからなかったため助かります 後ほど都合がつきしだい、エラーの内容を追記させていただきます
guest

0

差分でバックアップしたい理由はなんでしょうか。バックアップにかかる時間でしょうか。
方針としては
0. データベースから差分データを引っ張って、バックアップ先データベースに追加
0. データベースから全データを引っ張って、前回バックアップデータとの比較で差分データを作り、バックアップ先データベースに追加
があるかな、と思います。前者の場合、差分バックアップしたいテーブルの各レコードに更新日時を入れるカラムが必要になると思います。

投稿2016/03/08 21:34

unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/08 23:43

アドバイスありがとうございます 差分にしたい理由は、差分にしないと時間がかかってしまうものかな と思ったくらいでした。 明確な方針もとくになかったため、 記載していただいた方針、参考になります。ありがとうございます
unau

2016/03/08 23:59

差分にする必要ありということがわかってから差分にする検討をすしたほうがいいと思います。サービスのアクセス数やサービスレベルなどから事前に予測がつくケースもありますし、実証実験してもいいですし、場合によってはやってみてこりゃあかんわと思ってから対処しても間に合うこともありますし。 すべてのケースで有効なわけではないですが、アクセスが少ない時間帯に全データのバックアップするので十分なことも多いかと思います。私が今管理しているサービスでは、本番環境のデータベースを mysqldump して保存、SQL の内部を開発環境用に書き換えて開発環境のデータベースに全とっかえというのを dairy でやっています。ついでに五日分の dump データをローテーションで保存と。
退会済みユーザー

退会済みユーザー

2016/03/09 11:51

アドバイスありがとうございます。 差分にするかどうかは後からの判断でも十分なのですね。今後の参考になります。 では、今回はまだ量もそこまで膨大というありませんので、 差分うんぬんは、一旦保留にしようかと思います。 差分については明確な方針も定まらぬまま、なんとなくの思いだけだったのですが、 参考や方針等ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問