今回はXサーバーでマルチサイトを構築したときのデータベース分割方法をご紹介します。
いや、紹介すると言うよりは恥を忍んで公開します。
もっとスマートな方法があれば教えて頂けると幸いです。
![]()
なにはともあれ!
マルチサイトでも1サイト1DBは実現されました
XサーバーではMySQLを50個(x10プラン)も追加できるのですが、Wordpressのマルチサイトではデータベースを一つしか使えませんよね。
それはそれでメリットもあるのですが、管理やパフォーマンス(※使い方にもよる)を考えて複数のデータベースに分割することにしました。
サブサイトにも1DBを実現するSharDB
私の知る限りマルチサイトでのデータベース分割方法をネットで公開してくれている方は『ITかあさん』だけなのですが、ところどころで私との解釈に違いがあるためか(あるいはサーバーの仕様が違うためか)思い通りには進められませんでした。
そこで私なりの覚書を残しておこうと思います。
これから同じことを実現したい方は、『ITかあさん』と当サイトでの方法を噛み砕きながら理解することが出来るはずなので、それなりに需要があるのではないでしょうか。
![参考になるサイト]()
参考になるサイト
ということで、『ITかあさん』のページを別タブで開きながら当サイトを読むことを推奨します。
当サイトでは詳細の説明を省きます。
wp-content内の作業は最後の最後に行うべきなのだけど・・・
本来はdb.phpをwp-contentに入れるのは、DBのマイグレーションが済んでからである、とreadmeに書かれています!英語でよく理解できないけど。
でも私の環境では無理でした。(db.phpを入れる前と後ではDBの割り振りが変更されてしまう※1:失敗例)
それとshardb-admin.phpをmu-pluginsに入れるとエラーが出るので入れることができませんでした。※なのでネットワークで有効化の状態にしているだけです
マルチサイトでもDBを分割した方法
まずはMySQLのjapan3d_wp3を使用しているとした場合、$shardb_prefix = ‘japan3d_wp3’; をdb-settings.phpに追記します。(ITかあさんを参照)
更に$shardb_hash_length = 1;を1にしておき、あらかじめMySQLを追加しておきます。
$shardb_dataset = は何でも良いので2文字とか3文字の短めが良いと思います。
例. japan3d_wp3で分割する場合は、japan3d_wp30,japan3d_wp31,japan3d_wp32,・・・japan3d_wp39,japan3d_wp3a,japan3d_wp3b,japan3d_wp3c,japan3d_wp3d,japan3d_wp3e,japan3d_wp3fまでの計16個のDBを作成します。
$shardb_hash_length = 2;の場合は、japan3d_wp300から始まる256個のDB用なので、16個以内で収まるなら1にしましょう。
私は以下の手順で強引に成功しています。
- ネットワーク上のプラグインをすべて停止(した方が良い)
- SharDBをインストール
- db-settings.phpに3行を追加、そしてwp-config.phpと同じフォルダに追加(ITかあさんを参照)
- wp-config.phpにrequire(‘db-settings.php’);を追加(ITかあさんを参照)
- あらかじめ16個のDBを作る(MySQLなら親サイトと同じユーザーに対して権限も追加しておく)
- db.phpをwp-contentに追加※2:コツ
- SharDBプラグインをネットワークで有効化
- マルチサイトを追加していく※3:強引だけど
- shardb-admin.phpは最後まで使わない(エラーが出て使えなかった)
- 全作業が完了
強引だけど:あらかじめDBを16個用意してdb.phpを入れた状態で作業
db.phpを入れる時にも嵌りポイントがあったので、db.phpを入れられない場合は、下で説明しているコツを参考にしてください。
何故このような方法になったかについては、もう一つ下に失敗例も載せてあります。
そして、この方法が強引な理由ですが、サブサイトが割り振られるDBの予想ができません。
メインサイトはjapan3d_wp3globalに入るのは確実ですが、サブサイト1とサブサイト2が同じjapan3d_wp3bに割り振られたり、サブサイト3がjapan3d_wp31に割り振られたりするのです。
もしも全てのサイトを別々のDBに入れたい場合は、DBが重複するたびにサイトを削除して、再度サブサイトを追加する作業を繰り返します。
想像ですが、SharDBの仕様だと思います。
私は何度もサイトの削除と追加を繰り返すことで、1サイト1DBを実現しました。ほかに良い方法があれば教えてほしいです。
コツ:『db.php』をwp-contentにアップロードできない
これはXサーバーの仕様なのか・・・それは謎ですが、dp.phpをwp-contentフォルダにアップロードすることができませんでした。
その場合は適当な名前に変更してからアップロードしましょう。
例.ダウンロードしたdb.phpをdb-test.php等にリネームし、wp-contentにアップロードしてからdb.phpにリネームし直す
![dbにリネームし直す]()
dbにリネームし直す
※失敗例:MySQLを追加する前にSharDBを実行してみた
あらかじめデータベースを作らずにSharDBを実行した場合、SharDBは実行されるのですがDBを書き込む先がないので空回りします。
つまり何もおきません。
ではなぜMySQLを追加する前にSharDBを実行したか?
それはSharDBが割り振るDBの法則を理解できなかったからです。
SharDBがPartitionに割り振る挙動
SharDBは指定したDB名を規則的に利用するらしいです。
なぜ『らしい』なのかというと、私の環境では不規則だったからです。
追記※検証の結果、$shardb_hash_length = 2;であればjapan3d_wp3のあとに2桁のランダム数値、10を入れれば10桁のランダム数値が入るようです。ランダムなのがSharDBの仕様なのかな
![shardbの挙動がわからない]()
shardbの挙動がわからない
なのでMigrate Sitesボタンをクリックして、実行画面を確認してからDBを作成してみることにしたのですが・・・(以下失敗例)
![確認してからMySQLを追加]()
確認してからMySQLを追加
それと追加したMySQLに対してアクセス所有ユーザーを追加するのを忘れずに。
![親サイトと同じアクセス権]()
親サイトと同じアクセス権
さぁ!ここからMigrate Sitesを実行することでサブサイト1のデータをjapan3d_wp31にコピーできました!
db.phpをwp-contentに追加して全てが順調に進むかと思っていたのですが・・・db.phpを追加するとサブサイト1の割り当て先がjapan3d_wp39になっています。どうやらdb.phpを追加する前と後ではDBの割り当てが変化してしまうようです。
この失敗を踏まえて『強引だけど:あらかじめDBを16個用意してdb.phpを入れた状態で作業』に至ります。
1サイト1DBを実現した結果
特に問題もなく思い通りの運用ができています。
しかし、SharDBでマルチサイトの1サイト1DBを実現できたものの、スマートな方法は解りませんでした。
英語に強くてプログラムにも長けている猛者がおりましたら、どうか助けてください。