MySQL

の記事

  • WordPress マルチサイトを移行する際のメモ

    マルチサイトを移行する際につまづいたところを、自分のために書いておこう。

    当サイトの WordPress を長らく更新していなかった。
    更新ついでに、ダッシュボードで警告が出ていた PHPのバージョンと MySQL も更新しようとステージングサイトを用意することにした。Web に関わる仕事をしていながら ここをサボっていた理由は マルチサイトのためだ。

    (さらに…)
    WordPress マルチサイトを移行する際のメモ
  • WordPressで同じドメインの別サーバーに引っ越す

    サーバー機入れ替えのため、同じドメインで別サーバーに引っ越したときのメモ。

    (さらに…)

    WordPressで同じドメインの別サーバーに引っ越す
  • 追加したばかりのAUTO_INCREMENTを知る

    データベースにたったいま追加したばかりの行のAUTO_INCREMENTの値を知るには、PHPでmysql_insert_id()という関数がある。いつもこれを使っていたら、WordPressでは $wpdb->insert_id というメソッドがあることを知った。自分で追加したテーブルにも利用できる。

  • MySQLを5.1にアップデート

    面倒でほったらかしになっていたサーバまわりのアップデートを、連休中に行った。WordPress3.0がリリースされてからほぼ1年になるので、かなりサボっていたことになる。業務ではもちろん3.0以上を使用していながらも、当ブログは2.8のままだった。というのも、WordPressをバージョンアップするには、さくらインターネットでMySQLのバージョンを4から5に上げねばならなかったからだ。MySQLはMovableTypeと併用していることもあり、手を付けるのに勇気を要した。連休の目標はMySQLとWordPressを最新版にすることと決めた。

    さくらインターネットでのMySQLのバージョンアップは以下のとおりだ。データが少ないためかなんのトラブルもなく、30分もかからずに終わった。

    1. phpMyAdminですべてのテーブルをエクスポートする。複数サイトを運営しているので、サイトごとに分けてエクスポートした。文字コード(UTF-8)に気をつけながら、念のためSQL形式のほかWordPress形式やMT形式でもバックアップを取っておく。
    2. phpMyAdminからいったんログアウトし、さくらのコントロールパネルでデータベースを削除する。やり直しがきかない作業なので、バックアップ内容の確認に念を入れてから行う。
    3. 新しいphpMyAdminにログインし、データベースをMySQL5.1で新規作成する。ここでデータベースのサーバ名とパスワードが変更された。
    4. データベースの照合順序をutf8_generalciに設定し、SQLファイルをインポートする。
    5. wp-config.phpやmt-config.cgiでデータベースのサーバ名とパスワードを修正
    6. ブログの表示を確認して完了
  • コメントの表示数を制限する

    singleページでのコメントの表示数について、
    ディスカッション設定によりコメントを複数ページに分割表示できるものの、singleページを表示するタイミングで取得するコメントは常にその記事に関するコメントすべてとなる。つまりコメントを5件づつ表示する場合でも、その投稿についてコメントが100件あれば100件を取得している。

    あるサイトのサーバー負荷が異様に重くて調べたところ、特定の記事についてコメントが10000件以上ついているためと分かった。この10000件とは決してスパムではなく、singleページがFLASHゲームで遊ぶ構成になっているため人気ゲームにコメントがたくさんついてしまったのだ。コメントは最新の50件を5件づつ分割表示している。必要なコメントは50件なので、できれば古くなったコメントを削除してしまいたかった。しかしサイト運営者からは過去のコメントを削除しないようにと要求されている。
    そうこうしているうちに、問題となるslow queryが浮かび上がった。
    SELECT wp_comments.* FROM wp_comments WHERE comment_post_ID = '99' AND comment_approved = '1' ORDER BY comment_date_gm

    このSQL文はwp-includes/comment-template.phpのcomments_template()という関数にあった。singleページを表示するさいにグローバル変数の$commentsにコメント配列をセットしている部分である。

    ここにLIMITを追加すればよいのだろうがコアコードは修正できない。フォーラムで質問したところ、query フックでlimit句を追加するアドバイスをいただいた。しかし、コメント取得のSQL文は3とおりがあり並び順が固定の場合もあるため、どうも思ったとおりにいかない。そうこうしているうちに、コメントの取得に件数が制限できないのはコメント階層を考慮してのことだと気付いた。単純にLIMITを付けるだけではダメなのだ。

    今回はコメント階層を使っていないということもあり、comments_template()をfunction.phpにリネームコピーしてカスタマイズすることで対処した。 ここのSQL文のORDERをDESCにして、LIMITを追加。さらにsingle.phpからcomments_template()を呼んでいる部分を、新しい関数名に変更した。

    問題のsingleページはなんとか軽くなったように思う。
    こんな対応でよいのかな?10000件もコメントがつくとは想定外だ。

  • シングルサイトをマルチサイトに引っ越す

    いままでシングルサイトとして運営していたデータをWordPress3.0のマルチサイトとして移行するには、phpMyAdminでインポート作業を行う。
    MySQLのテーブル接頭辞が以下のようになっているとして、

    ・移行元:wp_
    ・移行先(2つめのブログ):wp_2_

    移行元のwp_というテーブルが、移行先の2つめのブログとなるwp_2_というテーブルに上書きされるようにする。インポートするのはwp_options、wp_users以外のテーブル全部、と思っておけばよい(この2つは絶対に移してはいけない)。そうすれば投稿やカテゴリ、コメントなどのほかContact Form 7といったプラグインのテーブルも移行される。

    さらに投稿者の再設定を行う。投稿者はwp-postsにユーザIDが入っているため、新しい環境のユーザIDに書き換える必要がある。phpMyAdminでクエリを発行して書き換える。

  • DBのテーブル名

    プラグインでSQL文を記述する場合の、テーブル名の参照のしかた、

    WORDPRESSで使用するテーブル名は”wp_”とは限らないため、プラグインでSQLを使う場合は、$wpdb->(接頭語より後の名前)でテーブルを参照する。例えば投稿テーブルは、$wpdb->postsとなる。
    または接頭語$wpdb->prefixを使って参照することもできる。投稿テーブルは、$wpdb->prefix .”posts”となる。
    自分で追加したテーブルは、$wpdb->prefix .”(接頭語より後の名前)”となる。