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

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

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

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

3回答

3504閲覧

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

Chironian

総合スコア23272

MySQL

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

2グッド

2クリップ

投稿2016/08/19 18:13

編集2016/09/09 05:52

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

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

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

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


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


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

php

1<?php 2/* 3Plugin Name: save data-base 4Plugin URI: 5Description: 投稿されたらデータベースを保存する 6Version: 1.0.0 7License: GPL2 8*/ 9function save_db($post_id, $post, $update) 10{ 11 if (wp_is_post_revision($post_id)) 12 { 13return; 14 } 15 16 $url=home_url('/'); 17 $token=strtok($url, ":"); 18 $token=strtok(":"); 19 if ($token != "//localhost/") 20 { 21return; 22 } 23 24 $dbHost = "ホスト名"; 25 $dbUser = "ユーザ名"; 26 $dbPass = "バスワード"; 27 $dbName = "データベース名"; 28 29 $filePath = ABSPATH."wp-content/"; 30 $fileName = 'database.sql'; 31 $mysqldump = ABSPATH."../../../mysql/bin/mysqldump "; 32 $command = $mysqldump.$dbName." --host=".$dbHost." --user=".$dbUser." --password=".$dbPass." > ".$filePath.$fileName; 33 system($command); 34} 35add_action('save_post', 'save_db', 10, 3); 36 37?>

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する。
そこで、一旦無効化して使った場合、無効化以前へ戻すことができませんでした。
これでは意味がないです。

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

takotakot, kei344👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

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

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

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

投稿2016/08/19 19:45

kei344

総合スコア69366

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

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

Chironian

2016/08/20 00:54

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

2016/08/22 05:42

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

0

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

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

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

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

投稿2016/08/20 01:59

Mr_Roboto

総合スコア2208

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

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

Chironian

2016/08/20 13:49

回答ありがとうございます。 確かにFluentdプラグインは見てました。でも、すいません。内容を理解できませんでした。 フックする話ではなくて「SQLクエリの実行結果の差分を見て」と書いてあるのでポーリングするのかなと感じたので、方向性が違うと思いそれ以上追求しませんでした。 実際のところどうなのでしょう? > tail -fでログ監視 投稿することで変更されるファイルが存在しないことまでは確認できてます。 実際に保存されるまでにそれなりのタイムラグがあるようなのです。(実験ではMySQLを停止して初めてファイルへ保存されました。) > いや、違うな、こういうことを自分でやろうと思えばできるけど、 > よくありそうなことだからプラグインとかないの〜?っていう質問なのですね、きっと やろうと思えばできる筈とは思いますが、そもそもMySQLもWordPressも素人なので学習にそこそこ時間が掛かるのです。なのでプラグインがあると嬉しいですし、ありそうな気がするので聞いてみました。
guest

0

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

投稿2016/08/20 16:03

takotakot

総合スコア1111

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

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

Chironian

2016/08/22 05:40 編集

回答ありがとうございます。 バイナリログならデータベース更新すると直ぐにファイルへ保存されるのですね。 save_postを使う案で取り敢えず動きそうな感じです。 まずは、こちらはしばらく使ってみます。何か問題が発生した際にはバイナリログ案にトライしてみたいと思います。
takotakot

2016/08/22 06:24

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

2016/08/22 07:06

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問