07 February 2021

Movable Type 3.33から6.7.5に段階的にアップデート。データベースの縮小化、画面配色の変更など

レンタル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

mt-config.cgi
PreviewInNewWindow 0

Movable Typeの編集画面の配色を、少し目に優しく...

編集画面は白基調で、現在のトレンドの目に優しい配色やダークテーマからはかけ離れた輝度。これを少しだけ明るさを抑えたものにしてみる。

20210207-mt6-colorstyle.jpg

$ 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 の間でデータベース構造の違いがあるのか

Movable Type 3.33のmt_entryのスキーマ
$ 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)
Movable Type 6.7.5のmt_entryのスキーマ
$ 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でも利用できた