MT5を1つのDBへ複数インストールする

レンタルサーバーの都合により、複数(今回は二つ)のMovabletypeを1つのDBへインストールする必要があったので、その作業メモ。

通常のインストール(一つ目)であれば、DBへ登録されるテーブルの名前は接頭辞「mt_」を付けたものとなる(例えばmt_tablename)。そこへ二つ目のMTをインストールしようとするとテーブル名が重複するためにインストールエラーとなる。従って、二つ目以降のインストールを成功させるためには接頭辞の変更がポイントとなる。

しかしながらMTの場合、インストールウィザード上で接頭辞を変更することができないため、ソースファイルに手を加える必要がある。具体的には下記の三つのファイルを編集する。いずれも、「mt_」の部分を「mt2_」へと変更している。

環境は次の通り。

  • MySQL5

  • MovableType5.01

変更するファイル

  • /lib/MT/ObjectDriver/DDL/mysql.pm
  • /lib/MT/ObjectDriver/Driver/DBD/Legacy.pm
  • /lib/MT/ObjectDriver/Driver/DBI.pm

変更点:/lib/MT/ObjectDriver/DDL/mysql.pm

[php]
while (my $row = $sth->fetchrow_hashref) {
my $key = $row->{‘Key_name’};
next unless $key =~ m/^(mt2_)?\Q$field_prefix\E_/;
$key = ‘mt2_’ . $key unless $key =~ m/^mt2_/;
my $type = $row->{‘Index_type’};
# ignore fulltext or other unrecognized indexes for now
next unless $type eq ‘BTREE’;
my $seq = $row->{‘Seq_in_index’};
my $col = $row->{‘Column_name’};
my $non_unique = $row->{‘Non_unique’};
my $null = $row->{‘Null’};
my $size = $row->{‘Sub_part’};
$key =~ s/^mt2_\Q$field_prefix\E_//;
$col =~ s/^\Q$field_prefix\E_//;
$unique->{$key} = 1 unless $non_unique;
$sizes->{$key}->{$col} = $size if defined $size;
my $idx_bag = $bags->{$key} ||= [];
$idx_bag->[$seq – 1] = $col;
}
[/php]

変更点:/lib/MT/ObjectDriver/Driver/DBD/Legacy.pm

[php]
sub db_column_name {
my $dbd = shift;
my ($table, $col) = @_;
$table =~ s{ \A mt2_ }{}xms;
return join(‘_’, $table, $col);
}
[/php]

変更点:/lib/MT/ObjectDriver/Driver/DBI.pm

[php]
sub init {
my $driver = shift;
my (%param) = @_;
$param{prefix} ||= ‘mt2_’;
$driver->SUPER::init(%param);
my $opts = $driver->connect_options || {};
require MT;
my $mt = MT->instance;
my $cfg = $mt->config;
$opts->{RaiseError} = $cfg->DBIRaiseError;
$driver->connect_options($opts);
$driver;
}
[/php]

※/lib/MT/ObjectDriver/DDL/mysql.pmについては必要かどうかは疑わしいが、とりあえず。。。

参考