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
```

# 対処策
１．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

```

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

２．再びブラウザで "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 <Tim.Bunce@pobox.com>)        →   TIMBと判明！
  (省略)

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

```

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


３．余計なものを削除しましょう。

```
# 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 パッケージ
```

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

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

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

```

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

５．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

```

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

![module02.png](https://qiita-image-store.s3.amazonaws.com/0/109620/1245cda9-7f18-02b3-c0c6-175ed07133d3.png)



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

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はエラーとなっており、最初黄色に色付けされていましたが、今回の対応を行うことでクリアとなりました。

![module01.png](https://qiita-image-store.s3.amazonaws.com/0/109620/235b7d60-242e-64a3-05b8-9f7b844aa436.png)