MTのDBIエラー("Got an error:DBI object version 1.628 does not match $DBI::VERSION 1.609)


環境

OS : CentOS 6
MovableType : 6.0.3

現象

脆弱性対応のためにyum update をした後、管理画面にログインしようと
"http://<ドメイン>/XXX/mt.cgi" にアクセスしたところ、こんなエラーが出力されました。

Got an error:DBI object Version 1.628 does not match $DBI::VERSION 1.609)

推測

yum update によってyumで管理されているperlたちが全体的にupdate されたにも関わらず、
モジュールたちが取り残されて必要とされているバージョンに差分が発生したのだろうと推測しました。

エラー内容からも1.628 じゃないといけないのに、1.609だぞと怒られている模様。

調査

エラー内容をいろいろな形でGoogle検索しても、いまいちよく分からない。
とりあえず推測に基づいて、現在のDBIバージョンを確認。
確かに古い。

# perl -MDBI -e'print $DBI::VERSION'
1.609

対処策

1.DBIもバージョンアップしましょう。
yum update perl-DBI をしても、最新版が適用されているとのことで1.609 以上にはならなかったので、個別に入れるしかありません。CPANの力を借りて、DBI、およびDBD::MySQLモジュールをインストールします。
いでよCPAN!

# perl -MCPAN -e shell
cpan> install DBI
cpan> install DBD::MySQL
cpan> quit

なんかさっくりインストールできます。

2.再びブラウザで "http://<ドメイン>/XXX/mt.cgi" にアクセスしますが、現象変わらず。
出力される文字も変わらず。おかしい・・・・バージョンを確認しよう。

# perl -MDBI -e'print $DBI::VERSION'
1.631

うーん。1.631 じゃなく、1.628 を入れたい!


# cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v2.00)
Enter 'h' for help.

cpan[1]> m DBI
  (省略)
Module id = DBI
    CPAN_USERID  TIMB (Tim Bunce <[email protected]>)        →   TIMBと判明!
  (省略)

cpan[2]> ls TIMB/DBI                   → モジュールを確認
cpan[3]> install TIMB/DBI-1.628.tar.gz

これでインストールは完了しますが、現象が変わらないということちゃんとリンクが張れてないっぽい。

3.余計なものを削除しましょう。

# rpm -qa | grep perl-DBI
perl-DBI-1.609-4.el6.x86_64

消しちゃえ!

# yum remove perl-DBI
================================
 パッケージ          アーキテクチャ    バージョン    リポジトリー    容量
============================================================================
削除:
 perl-DBI               x86_64     1.609-4.el6        @base     1.7 M
依存性関連での削除をします。:
 perl-CPANPLUS          x86_64     0.88-144.el6       @base     767 k
 perl-DBD-SQLite        x86_64     1.27-3.el6         @base     221 k
 perl-DBIx-Simple       noarch     1.32-3.el6         @base     62 k
 perl-core              x86_64     5.10.1-144.el6     @base      0.0

トランザクションの要約
===================================================
削除                 5 パッケージ

関連するパッケージたちとともに抹殺しました。

4.どうだ?! 再びブラウザで "http://<ドメイン>/XXX/mt.cgi" にアクセスしますが、あ!文字が変わった!

Can't locate DBI.pm in @INC (@INC contains: ・・・・・

認識してないっぽい。どうも @INC contains:の後ろに記載されるパスの中にDBI.pm がないと言ってるように見えます。

5.DBI.pm を検索しましょ。

# find / -name DBI.pm
/root/.cpan/build/DBI-1.628-51Whd2/blib/lib/DBI.pm
/root/.cpan/build/DBI-1.628-51Whd2/blib/lib/Bundle/DBI.pm
/root/.cpan/build/DBI-1.628-51Whd2/DBI.pm
/root/.cpan/build/DBI-1.628-51Whd2/lib/Bundle/DBI.pm

なんと先ほど削除したperl-DBI パッケージがまだ健在だったころ、上記find コマンドを叩いており、
/usr/lib64/perl5/DBI.pm にパスが張られていたのを確認しておりました。(正確にはログを見て発見)
リンクを張ってやりましょう。

# ln -fs /root/.cpan/build/DBI-1.628-51Whd2/DBI.pm /usr/lib64/perl5/DBI.pm

6.三度確認すると、OK!!! MTのログイン画面が表示されました。
懐かしのログイン画面。。。。

補足 - 足りないモジュールの確認方法 -

mt-config.cgi を一時的にRenameします。

# cd /var/www/cgi-bin/src      → パスは環境によって異なります。 find / -name mt-config.cgi で探してください。
# cp -p mt-config.cgi mt-config.cgi.bak
# rm -f mt-config.cgi

ブラウザから "http://<ドメイン>/XXX/mt-check.cgi" にアクセスして、どのモジュールが足りていないのか確認しましょう。
今回、DBI、DBDはエラーとなっており、最初黄色に色付けされていましたが、今回の対応を行うことでクリアとなりました。