印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
MovableType 記事の長さの制限値を変更する

Movable Type の記事用のフィールド長の制限値を大きくする。MySQL→Berkeley DB→MySQL で行う。ようやくピカチュウ問題が解決した。

■ ■ ■

Movable Type で,データベースに MySQL を使っているとき,長い記事を書くと途中で記事が切れてしまうことがある。これは,MySQL データベース上に用意している記事用のフィールドに上限があるためである。上限値は 65535 バイトで,400字詰め原稿用紙80枚分にあたる。通常はこのような長い記事を書くことは有り得ないが,コピペでは発生し得る。Toogle のアスキー文字の出力をそのまま貼り付けたら,途中で切れてしまったのだ。貼り付けた記事を書いた当時は,データベースに Berkeley DB を使っていたので全部表示されていたのだが,その後 MySQL に変換を行った際に表示されなくなってしまった。しかも,気がついたのはしばらくたってからだった(nlog(n): cpufreq には未対応だった)。重要な記事でもないので放置していたが,気持ちが悪いので直すことにした。問題の記事は nlog(n): Toogle - Google のイメージ検索結果を ASCII で表示 である。原因がピカチュウの記事だったので,私は勝手にこれを「ピカチュウ問題」と呼んでいる。

環境は Movable Type 2.661,OS は Vine Linux 3.2,データベースは MySQL 4.0.25 である。

私はデータベースをよく知らないので,ツールを使って「エイヤッ」とやることにした。一旦 Berkeley DB に変換してから,MySQL に戻すことにする。ツールとしては mt-sql2db.cgi: mt-db2sql.cgiの逆変換CGIスクリプト - Ogawa::Memoranda と Movable Type のパッケージに付属している mt-db2sql.cgi を使う。Berkeley DB への変換には mt-db-convert.cgi: MTデータベースの相互変換CGIスクリプト - Ogawa::Memoranda を使わせていただこうかと思ったのだが,こちらは Movable Type 3.1 と 3.2 にしか対応していない。Movable Type 2.661 には mt-sql2db.cgi しか使えない。

方針は次の通り。

  1. 最新の記事番号,コメント番号,トラックバック番号を控える
  2. (省略してしまったが,正しくはここでバックアップ)
  3. Berkeley DB 用のディレクトリを用意
  4. mt.cfg を編集して,Berkeley DB のパス指定を追加
  5. mt-sql2db.cgi で MySQL を Berkeley DB に変換
  6. MySQL 上に新しいデータベースを用意
  7. mt.cfg を編集して,新しいデータベースにアクセスするように変更
  8. schemas/mysql.dump を編集して,データベースの定義を変更
  9. mt-db2sql.cgi で Berkeley DB を MySQL に変換
  10. mt.cfg を編集して,Berkeley DB 用のディレクティブをコメントアウト
  11. サイト全体を再構築
  12. 再構築後の最新記事番号,コメント番号,トラックバック番号と控えを比較して確認

mt-sql2db.cgi を使う直前の mt.cfg では,Berkeley DB と MySQL の両方のためのディレクティブを有効にしておく。

DataSource ./db
ObjectDriver DBI::mysql
Database nlogn_db
DBUser nlogn_n

schemas/mysql.dump において,記事を定義しているのは entry_text と entry_text_more の2つである。entry_text が「エントリーの内容(body)」,entry_text_more が「追記(extend)」部分に対応する。このサイトでは,追記部分が長くなることがあるので,entry_text_more を最大 65535 バイトの「text」から最大 16777215 バイトの mediumtext に変更する (小粋空間: MySQLでエントリーのフィールドサイズを拡張する)。

create table mt_entry (
    entry_id integer not null auto_increment primary key,
    entry_blog_id integer not null,
    entry_status tinyint not null,
    entry_author_id integer not null,
    entry_allow_comments tinyint,
    entry_allow_pings tinyint,
    entry_convert_breaks varchar(30),
    entry_category_id integer,
    entry_title varchar(255),
    entry_excerpt text,
    entry_text text,
    entry_text_more mediumtext,
    entry_to_ping_urls text,
    entry_pinged_urls text,
    entry_keywords text,
    entry_tangent_cache text,
    entry_created_on datetime not null,
    entry_modified_on timestamp not null,
    entry_created_by integer,
    entry_modified_by integer,
    index (entry_blog_id),
    index (entry_status),
    index (entry_author_id),
    index (entry_created_on)
);

MySQL の新しいデータベースは,変換前のデータベースとは別の名前にして作る。mt.cfg は新しいデータベースの名前にする。

DataSource ./db
ObjectDriver DBI::mysql
Database nlogn_new_db
DBUser nlogn_new_n

Berkeley DB から MySQL への変換は以前にやった通りである (nlog(n): Berkeley DB から MySQL への移行を試す)。

サイトの再構築の前に,Berkeley DB 用のディレクティブをコメントアウトすることを忘れずに。

# DataSource ./db
ObjectDriver DBI::mysql
Database nlogn_new_db
DBUser nlogn_new_n

2005年12月31日追記:
すべてのコメントを表示するページ(nlog(n) - All Comments)の再構築に失敗し,つぎのメッセージが表示されるようになっていましたが,

MT::App::CMS=HASH(0x8e449c8) Use of uninitialized value in concatenation (.) or string at lib/MT/ObjectDriver/DBI.pm line 74.
MT::App::CMS=HASH(0x8e449c8) Use of uninitialized value in concatenation (.) or string at lib/MT/ObjectDriver/DBI.pm line 75.

MySQL サーバの再起動で再構築が成功するようになりました。

Posted by n at 2005-12-27 01:53 | Edit | Comments (2) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments

お久しぶりです(と言っても閲覧はほぼ毎日〜2,3日に1度見てますけど)

フィールドの拡張、ついに実行されましたか〜

うちのほうは現時点の最新のMovableType3.2-JA-2に振り回されてたのがどうにか安定して、システム自体を弄るほうよりも日記として扱えるようになってきたところです。
3.2で使えるようになったSQLiteでもこの問題があるのだろうかとちょっと悩み中だったりします……

3.2ではBerkeley DBはほとんど使えない状況です……

Posted by: ち印 at January 04, 2006 06:50

こんなことをやらなくても MySQL→MySQL で出来てしまえそうなのですが,データベースの知識がないので,遠回りになってしまいました。

MT 2.661 の情報は少なくなってきてしまいましたので,このまま使い続けるか,3.2 に移行するか,WordPress や Textpattern などの別システムに乗り換えるか悩み中です。

Posted by: n at January 04, 2006 20:59
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?