レンタルWebサーバ(さくらインターネット 共用サーバ)のソフトウエアが徐々にバージョンアップされ、今まで使ってきた Movable Type 3.33-ja が「記事更新」のときにエラーが発生するようになった。
このWebサイトはMovable TypeでスタティックHTMLを書き出して公開しているので、CMSを不特定多数がアクセスすることはない。(Movable typeのインストールされているディレクトリは、Apache側でアクセス制限をかけている)
アップデートの目的は、CMSのセキュリティホールを塞ぐことではなく、単に編集時にエラーが出ないバージョンまで上げればよいだけだ。
Googleで情報収集したところ、最新版(Movable Type 7)にアップデートした場合、CMSで管理するページ数が1000ページを超えると、sqlite3の致命的エラーが出るそうな。問題が発生しないのは、一つ前のバージョン(Movable Type 6)までとのことだ。
エラーを回避しながら、少しずつバージョンアップしていく
現在公開されているMovable Type 6系統のversion 6.7.5に一気にアップデートしようとしたところ、データベース再構築の画面が表示される前にエラーが出て終了してしまう。
成功したアップデートの流れは
Version 3.33 から Version 5.01 へ
Version 5.01 から MTOS Version 5.2.13 へ
MTOS Version 5.2.13 から Version 6.7.5 へ
と3段階に分けて徐々にバージョンアップしていった
それぞれのバージョンの入手先は
・ Movable Type公式Webページのディレクトリからは、MTOS(Movable Type Open Source)の全バージョンがダウンロードできる
・ Movable Type 開発者Blogで紹介されているGitHub - movabletypeからは、最新バージョンまでの全てのバージョンがダウンロードできる
データベース肥大化への対処
現在のデータベースの利用サイズをテーブルごとに表示して、何処にサイズ肥大化があるか調べる。
$ sqlite3_analyzer mt.db /** Disk-Space Utilization Report For mt.db Page size in bytes................................ 1024 Pages in the whole file (measured)................ 156547 Pages in the whole file (calculated).............. 156547 Pages that store data............................. 153047 97.8% Pages on the freelist (per header)................ 3500 2.2% Pages on the freelist (calculated)................ 3500 2.2% Pages of auto-vacuum overhead..................... 0 0.0% Number of tables in the database.................. 48 Number of indices................................. 224 Number of defined indices......................... 210 Number of implied indices......................... 14 Size of the file in bytes......................... 160304128 Bytes of user payload stored...................... 154207818 96.2% *** Page counts for all tables with their indices ***************************** MT_ENTRY_REV...................................... 125016 79.9% MT_ENTRY.......................................... 21715 13.9% MT_SESSION........................................ 4113 2.6% MT_TEMPLATE_REV................................... 1294 0.83% MT_TEMPLATE....................................... 319 0.20% MT_FILEINFO....................................... 135 0.086% MT_ENTRY_META..................................... 65 0.042% SQLITE_SCHEMA..................................... 61 0.039% 〜 以下省略 〜
編集履歴を有効にしている場合は、mt_entry_rev テーブルに大量の履歴データがたまり続ける。編集履歴を無効にした後、履歴データを全消去する。(sqlite3の場合のコマンドの例)
$ sqlite3 mt.db sqlite> delete from mt_entry_rev;
自動保存(AS)、キャッシュ(CO)、ユーザセッション保持(US)などのデータが保存されているのだが、全て削除して問題ないなら全削除する。
$ sqlite3 mt.db sqlite> delete from mt_session;
sqliteデータベースを利用している場合は、データベースの最適化を行って削除領域を開放してやる。
$ sqlite mt.db sqlite> VACUUM;
データベース最適化の結果は... (160 MBytes から 24 MBytes に縮小化した)
$ ls -la -rw-r--r-- 1 user users 160304128 21/02/15 22:20 mt.db ↓ mt_entry_rev を全削除 -rw-r--r-- 1 user users 28705792 21/02/15 23:02 mt.db ↓ mt_session を全削除 -rw-r--r-- 1 user users 24507392 21/02/15 23:21 mt.db
プレビューのファイルが消去されずに残存するのを防ぐ
mt-preview-8b9957aec0ae0d755a91e99e411fd1417210697a.html
というようなプレビュー用htmlファイルが残存してしまうので、「旧方式のプレビュー」に変更する。 (参考公式Web:https://www.movabletype.jp/faq/preview-failed.html)
PreviewInNewWindow 0
Movable Typeの編集画面の配色を、少し目に優しく...
編集画面は白基調で、現在のトレンドの目に優しい配色やダークテーマからはかけ離れた輝度。これを少しだけ明るさを抑えたものにしてみる。
$ diff -r mt6/ movabletype-mt6.7.5/ Only in mt6/: .htaccess Only in mt6/: db Only in mt6/: mt-config.cgi diff -r mt6/mt-static/css/editor/common.css movabletype-mt6.7.5/mt-static/css/editor/common.css 86c86 < background-color: #eee !important; --- > background-color: #ffffff; diff -r mt6/mt-static/css/form.css movabletype-mt6.7.5/mt-static/css/form.css 237c237 < background-color: #eee; --- > background-color: #ffffff; diff -r mt6/mt-static/css/structure.css movabletype-mt6.7.5/mt-static/css/structure.css 1916c1916 < background-color: #eeeee0; --- > background-color: #ffffff; 1922c1922 < color: #333; --- > color: #0076BF; 2796c2796 < background-color: #ddddd5; --- > background-color: #ffffff; 2844c2844 < background-color: #bbbbb5; --- > background-color: #fbfbfb; 2854c2854 < background-color: #fffaf0; --- > background-color: #e3f3fc; Only in mt6/mt-static/support: dashboard Only in mt6/mt-static/support: theme_thumbnails Only in mt6/mt-static/support: uploads Only in mt6/mt-static/support: userpics
それぞれのCSSファイルごとに記述すると、次のようになる
mt-static/css/editor/common.css 86行目付近
#editor-content textarea { /* background-color: #ffffff; */ background-color: #eee !important; }
mt-static/css/form.css 237行目付近
.text { /* background-color: #ffffff; */ background-color: #eee; }
mt-static/css/structure.css 1916行目付近
body { /* background-color: #ffffff;*/ background-color: #eeeee0; } a, a:link, a:visited{ /* color: #0076BF; */ color: #333; }
2796行目付近
.menu-nav { /* background-color: #ffffff; */ background-color: #ddddd5; }
2844行目付近
.sub-menu { /* background-color: #fbfbfb; */ background-color: #bbbbb5; } .sub-menu-link.current { /* background-color: #e3f3fc; */ background-color: #fffaf0; }
Movable Type 3.33 と 6.7.5 の間でデータベース構造の違いがあるのか
$ sqlite3 mtdata.db SQLite version 3.7.17 2013-05-20 00:56:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .tables mt_author mt_entry mt_objecttag mt_tag mt_blog mt_fileinfo mt_permission mt_tbping mt_category mt_ipbanlist mt_placement mt_template mt_comment mt_log mt_plugindata mt_templatemap mt_config mt_notification mt_session mt_trackback sqlite> select * from sqlite_master; ~ 中略 ~ table|mt_entry|mt_entry|39|CREATE TABLE mt_entry ( entry_id integer not null primary key, entry_allow_comments boolean, entry_allow_pings boolean, entry_atom_id varchar(255), entry_author_id integer not null, entry_basename varchar(255), entry_blog_id integer not null, entry_category_id integer, entry_convert_breaks varchar(30), entry_excerpt text, entry_keywords text, entry_pinged_urls text, entry_status smallint not null, entry_tangent_cache text, entry_text text, entry_text_more text, entry_title varchar(255), entry_to_ping_urls text, entry_week_number integer, entry_created_on datetime, entry_created_by integer, entry_modified_on timestamp not null, entry_modified_by integer ) index|mt_entry_basename|mt_entry|41|CREATE INDEX mt_entry_basename on mt_entry (entry_basename) index|mt_entry_author_id|mt_entry|42|CREATE INDEX mt_entry_author_id on mt_entry (entry_author_id) index|mt_entry_modified_on|mt_entry|43|CREATE INDEX mt_entry_modified_on on mt_entry (entry_modified_on) index|mt_entry_created_on|mt_entry|45|CREATE INDEX mt_entry_created_on on mt_entry (entry_created_on) index|mt_entry_status|mt_entry|46|CREATE INDEX mt_entry_status on mt_entry (entry_status) index|mt_entry_blog_id|mt_entry|47|CREATE INDEX mt_entry_blog_id on mt_entry (entry_blog_id) index|mt_entry_week_number|mt_entry|48|CREATE INDEX mt_entry_week_number on mt_entry (entry_week_number)
$ sqlite3 mt.db SQLite version 3.7.17 2013-05-20 00:56:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .tables mt_accesstoken mt_comment_meta mt_log mt_tbping_meta mt_asset mt_config mt_notification mt_template mt_asset_meta mt_entry mt_objectasset mt_template_meta mt_association mt_entry_meta mt_objectscore mt_template_rev mt_author mt_entry_rev mt_objecttag mt_templatemap mt_author_meta mt_entry_summary mt_permission mt_touch mt_author_summary mt_failedlogin mt_placement mt_trackback mt_blog mt_field mt_plugindata mt_ts_error mt_blog_meta mt_fileinfo mt_role mt_ts_exitstatus mt_category mt_filter mt_session mt_ts_funcmap mt_category_meta mt_formatted_text mt_tag mt_ts_job mt_comment mt_ipbanlist mt_tbping sqlite> select * from sqlite_master; ~ 中略 ~ table|mt_entry|mt_entry|81|CREATE TABLE mt_entry ( entry_id integer NOT NULL PRIMARY KEY, entry_allow_comments boolean, entry_allow_pings boolean, entry_atom_id varchar(255), entry_author_id integer NOT NULL, entry_authored_on datetime, entry_basename varchar(255), entry_blog_id integer NOT NULL, entry_category_id integer, entry_class varchar(255) DEFAULT 'entry', entry_comment_count integer DEFAULT 0, entry_convert_breaks varchar(60), entry_created_by integer, entry_created_on datetime, entry_excerpt text, entry_keywords text, entry_modified_by integer, entry_modified_on datetime, entry_ping_count integer DEFAULT 0, entry_pinged_urls text, entry_status smallint NOT NULL, entry_tangent_cache text, entry_template_id integer, entry_text text, entry_text_more text, entry_title varchar(255), entry_to_ping_urls text, entry_unpublished_on datetime, entry_week_number integer, entry_current_revision integer NOT NULL DEFAULT 0 ) index|mt_entry_author_id|mt_entry|13434|CREATE INDEX mt_entry_author_id ON mt_entry (entry_author_id) index|mt_entry_tag_count|mt_entry|13451|CREATE INDEX mt_entry_tag_count ON mt_entry (entry_status,entry_class,entry_blog_id,entry_id) index|mt_entry_status|mt_entry|13202|CREATE INDEX mt_entry_status ON mt_entry (entry_status) index|mt_entry_blog_stat_date|mt_entry|13218|CREATE INDEX mt_entry_blog_stat_date ON mt_entry (entry_blog_id,entry_class,entry_status,entry_authored_on,entry_id) index|mt_entry_blog_author|mt_entry|13288|CREATE INDEX mt_entry_blog_author ON mt_entry (entry_blog_id,entry_class,entry_author_id,entry_authored_on) index|mt_entry_blog_basename|mt_entry|13353|CREATE INDEX mt_entry_blog_basename ON mt_entry (entry_blog_id,entry_basename) index|mt_entry_class_unpublished|mt_entry|13399|CREATE INDEX mt_entry_class_unpublished ON mt_entry (entry_class,entry_unpublished_on) index|mt_entry_comment_count|mt_entry|13424|CREATE INDEX mt_entry_comment_count ON mt_entry (entry_comment_count) index|mt_entry_created_on|mt_entry|12947|CREATE INDEX mt_entry_created_on ON mt_entry (entry_created_on) index|mt_entry_blog_unpublished|mt_entry|12995|CREATE INDEX mt_entry_blog_unpublished ON mt_entry (entry_blog_id,entry_class,entry_unpublished_on) index|mt_entry_dd_entry_tag_count|mt_entry|13023|CREATE INDEX mt_entry_dd_entry_tag_count ON mt_entry (entry_blog_id,entry_status,entry_class,entry_id) index|mt_entry_auth_stat_class|mt_entry|13058|CREATE INDEX mt_entry_auth_stat_class ON mt_entry (entry_author_id,entry_status,entry_class) index|mt_entry_blog_authored|mt_entry|13088|CREATE INDEX mt_entry_blog_authored ON mt_entry (entry_blog_id,entry_class,entry_authored_on) index|mt_entry_blog_week|mt_entry|13149|CREATE INDEX mt_entry_blog_week ON mt_entry (entry_blog_id,entry_class,entry_status,entry_week_number) index|mt_entry_modified_on|mt_entry|13185|CREATE INDEX mt_entry_modified_on ON mt_entry (entry_modified_on) index|mt_entry_class|mt_entry|12741|CREATE INDEX mt_entry_class ON mt_entry (entry_class) index|mt_entry_title|mt_entry|12764|CREATE INDEX mt_entry_title ON mt_entry (entry_title) index|mt_entry_class_authored|mt_entry|12872|CREATE INDEX mt_entry_class_authored ON mt_entry (entry_class,entry_authored_on)
追加されたものがかなりありますが、entry_id や entry_text,entry_text_more など、直接コマンドラインで操作するときにいじる部分、基本構造はほぼ同じようです。
インストール時に参考にしたWebサイト
・ Movable Type 5 マニュアル
・ Movable Type 3 および Movable Type 4 から Movable Type 5 へのアップグレード
... sqliteのデータベースファイル mt.db をコピーしてくるだけで、3.33 から 5, 6 に問題なく段階的にアップデートできた
・ テンプレートタグ一覧
... 3.33で利用していたテンプレートタグは、すべて5, 6でも利用できた