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

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

ただいまの
回答率

89.54%

MySQLのテーブルが更新されたらダンプしたい

解決済

回答 3

投稿 編集

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

Chironian

C++総合1位

WordPressのデータをGit管理したいと考えています。
Windows上にローカル環境をbitnamiを使って構築しました。
サーバとの同期はWordMoveを使ってなんとかできそうです。
(WordMoveは強力ですね。データベース内のURLを適切に変換してくれました。)

後はGitで管理したいのてすが、データベースの内容を管理するために、mysqldumpでテキスト・ファイルへ落としたいと考えています。
Windowsのタスクを使って例えば5分毎に落とすことは可能と思いますが、無駄に重くなる上、ローカルで固定ページ生成などの後、最大5分経過しないとGit作業ファイルに反映されないのも嫌らしいです。

そこで、データベースに更新があったらダンプしたいのですが、何か方法はないでしょうか?
そのようなプラグインがあればベストなのですが。

テーブル・ファイルの更新時刻の監視ではダメっぽいです。
PhpMyAdminでみてテーブルのサイズが大きくなっているのにファイルの方は元のサイズのままでした。
MySQLサービスを停止して初めて更新されました。メモリからファイルへ保存する頻度はそこそこ低そうです。


この辺の情報をネットで見つけることができなかったのですが、WordMoveの設定ファイルを見るとGitのファイル群を同期から外すようデフォルトで設定されているので、WordMoveとGitでWordpressのデータを管理している人はそこそこ居るはずなのです。なので、きっと同じ問題を既に解決している人が居るはずなのですが、見つけることができません。
ヒントだけでもぜひ教えて下さい。


【解決】
下記プラグインで動作しました。

<?php
/*
Plugin Name: save data-base
Plugin URI: 
Description: 投稿されたらデータベースを保存する
Version: 1.0.0
License: GPL2
*/
function save_db($post_id, $post, $update) 
{
    if (wp_is_post_revision($post_id))
    {
return;
    }

    $url=home_url('/');
    $token=strtok($url, ":");
    $token=strtok(":");
    if ($token != "//localhost/")
    {
return;
    }

    $dbHost = "ホスト名";
    $dbUser = "ユーザ名";
    $dbPass = "バスワード";
    $dbName = "データベース名";

    $filePath = ABSPATH."wp-content/";
    $fileName = 'database.sql';
    $mysqldump = ABSPATH."../../../mysql/bin/mysqldump ";
    $command = $mysqldump.$dbName." --host=".$dbHost." --user=".$dbUser." --password=".$dbPass." > ".$filePath.$fileName;
    system($command);
}
add_action('save_post', 'save_db', 10, 3);

?>

mysqldumpのパスはBitNamiがインストールする場所を前提としています。
phpもワードプレスのプラグインも初めてなので、色々可笑しいかも。


【追記】
結局、mysqldumpされるものではGit管理できませんでした。

まず、リストアが異常に遅いです。これはWordMoveのオプションを参考にして数秒程度でリストアできるようになりました。
次にテーブルが全て1行になってしまう問題が発生しました。Gitでマージする際に直ぐにコンフリクトしてしまいます。
mysqldump時に-c --order-by-primary --skip-extended-insertオプションを付けて投稿ごとに改行されるようになりました。

しかし、投稿にPRIMARY keyが記録され、別ブランチで生成した投稿に同じPRIMARY keyが割り当てられてしまいます。これがGitでコンフリクトします。
手動で解決も不可能ではないですが、あまり現実的な気がしません。


再度、プラグインを探してみたところ、VersionPressが見つかりました。(前回、結構探したのですが、ノイズが多すぎて見つからなかったようです。)

データベースの中身は、wordpress/wp-content/vpdb/の下に投稿毎にファイルを分けて保存され、しかも、投稿の改行も再現されてました。なのでGitのバージョン管理で期待通りにマージできそうです。

VersionPressが知らないPluginがデータベースへ保存しているデータ等はちゃんと管理できないかもしれませんが、そのような設定のマージが必要になるケースは稀でしょう。新しい方の上書きでコンフリクトを解決すれば概ねOKの筈です。
しかも、有り難いことにGPLv3での配布でした。GitHubからダウンロードできました。

バージョン3.02をWindows+BitNami環境で使ってみました。UnDoやRollBackはうまく動きませんでしたが、Gitで直接resetすれば戻りました。また、Gitでのブランチ切り替えやマージも動作しました。別のブランチで行った2つの投稿がちゃんとマージされました。(びっくりです。)
まだ若いソフトのようなので問題はそれなりにありそうですが、大事な部分はきちんと使えそうです。


【追記】
VersionPressを運用してみましたが、結局使えないと判断しました。

①データベース内にバイナリなテーブルを作る。
これが原因でWordMoveでpushできなくなります。
mysqldumpで保存後削除してpush→回復すれば行けるとは思います。

②ちょっと修正する度にcommitする。
そこで、一旦無効化して使った場合、無効化以前へ戻すことができませんでした。
これでは意味がないです。

以上により、私には使えないと判断しました。(使えそうと報告していたので訂正まで。)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+4

やったことはないのですが、WordPress 側のフックで更新を検知してWordMoveを起動するのは出来ませんか?

たとえばsave_postフックはDBの書き換えが終わってから呼ばれているので、ここで WordMove を何とか起動するとか。(リビジョンや添付画像も同じフックを通った気がしますのでそこは上手いこと振り分けるということで)プラグインの動作もローカルかどうかで振り分けられると思います。

【save_post | Hook | WordPress Developer Resources】
https://developer.wordpress.org/reference/hooks/save_post/

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/20 09:54

    回答、ありがとうございます。

    なるほど、WordPress側で保存するのですね!!
    軽く調べてみましたが、それほどたいへんではなさそうな感じですね。
    でも、WordPressやMySQLのプログラムを作ったことはないので、既にあるプラグインの情報がないかもう少しだけオープンさせて下さい。

    キャンセル

  • 2016/08/22 14:42

    少し時間がかかりましたが、小さなプラグインを作って動作するようになりました。
    ちょっと遅いですが、頻繁に更新するわけではないので、しばらく運用してみようと思います。
    ありがとうございました。

    キャンセル

+3

最初、トリガーを使えばいいのでは?と思ったのですが、多分そういうことではないのですよね。

検索してみて、こんなの見つけましたが、既に発見済みですかね
MySQLテーブルへの更新/削除イベントを逐次取得するFluentdプラグイン

あとは、tail -fでログ監視してとか、、、、ってこの方法古いのか
[Linux]「tail -f」での監視はもう古い!?超絶便利なlessコマンド - Qiita

いや、違うな、こういうことを自分でやろうと思えばできるけど、
よくありそうなことだからプラグインとかないの〜?っていう質問なのですね、きっと

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/20 22:49

    回答ありがとうございます。

    確かにFluentdプラグインは見てました。でも、すいません。内容を理解できませんでした。
    フックする話ではなくて「SQLクエリの実行結果の差分を見て」と書いてあるのでポーリングするのかなと感じたので、方向性が違うと思いそれ以上追求しませんでした。
    実際のところどうなのでしょう?

    > tail -fでログ監視

    投稿することで変更されるファイルが存在しないことまでは確認できてます。
    実際に保存されるまでにそれなりのタイムラグがあるようなのです。(実験ではMySQLを停止して初めてファイルへ保存されました。)

    > いや、違うな、こういうことを自分でやろうと思えばできるけど、
    > よくありそうなことだからプラグインとかないの〜?っていう質問なのですね、きっと

    やろうと思えばできる筈とは思いますが、そもそもMySQLもWordPressも素人なので学習にそこそこ時間が掛かるのです。なのでプラグインがあると嬉しいですし、ありそうな気がするので聞いてみました。

    キャンセル

+1

短答ですみません。
binlog を監視し続ける手はありそうでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/22 14:40 編集

    回答ありがとうございます。

    バイナリログならデータベース更新すると直ぐにファイルへ保存されるのですね。

    save_postを使う案で取り敢えず動きそうな感じです。
    まずは、こちらはしばらく使ってみます。何か問題が発生した際にはバイナリログ案にトライしてみたいと思います。

    キャンセル

  • 2016/08/22 15:24

    動いているならプラグインで良さそうですね。
    sync_binlog を 1にすれば、binlog にはすぐに書かれます。

    キャンセル

  • 2016/08/22 16:06

    なるほど。了解です。追加情報ありがとうござます。

    キャンセル

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

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