Drupal6から7へのアップグレード

前々からウェブコンテンツを少しずつ VPS に移行したいなとは思っていたのですが、先の震災に伴う原子力発電所のトラブルで節電ムードが高まりさくさく移行することに。
節電はサーバの電力というより自室の空調の電力ですね。
何もしなくても恐ろしく暑いので……。

せっかく移行するならこれを機に新しいバージョンに移行したいなーと思いましたが、Drupal は基本的には互換を捨てて新しい物を作るという方針らしくいまいちうまくいきません。
併せて元々 MySQL 用だったという経緯のせいか現状の PostgreSQL 上にできているテーブルのスキーマが変で、同バージョンでの移行もできず途方に暮れることに。
というか PostgreSQL のテーブルに int_unsigned 型のカラムがあったりするんですけどそんなの知りません……。
実際のところスキーマの問題で頭がいっぱいになっていただけで、バージョンアップについては基本に忠実になればそのままいけたようですが……。

そんな感じでメモ。


まずはデータベースを移行します。
現行サーバで以下のようにして、
データベース drupaldb のプリフィックス p_ のテーブルを取り出します。

pg_dump drupaldb -t 'p_*' > drupal-p.sql

新しいサーバに読み込む用に以下のように unsigned を取り除きます。
恐らくこの作業はほとんどの方は不要だと思いますが……。

cat drupal-p.sql | sed -e 's/ bigint_unsigned / bigint /; s/ int_unsigned / bigint /; s/ smallint_unsigned / int /;' > drupal-p2.sql

そして新しいデータベースに突っ込みます。

psql newdrupaldb < drupal-p2.sql

次に Drupal ディレクトリ以下を新サーバにコピーします。
このときは新しい Drupal ディレクトリとは別にしておきます。

管理者(ユーザ ID が1のユーザ)で Drupal にログインし、以降の作業を行います。

  • オフラインモードに設定
  • 拡張モジュール(core ではないもの)をすべて無効
    どのモジュールが有効だったか先にメモ
    別モジュールに必須のモジュールはチェックが外せませんので、チェックが外れるモジュールを先に外して何度か試してください
  • テーマをデフォルトの garland に
    どのテーマを使っていたかメモ

以上が終わったらいよいよ新しいバージョンへ移行です。
新サーバに新しい Drupal ディレクトリを展開し(profiles, scripts, sites は不要)、先ほどコピーした現行バージョンの Drupal ディレクトリのうち、files, sites ともし手を加えていたら .htaccess, robots.txt や css ファイルなどを新しい Drupal ディレクトリにコピーします。
files 以下パーミッションを確認しておいてください。
また、データベース名などの変更があれば settings.php の変更もお忘れなく。
ここまできたら自分のサイトの /update.php にアクセスしてアップデートすれば完了です。

当たり前のような気もしますが、Drupal のアップデート・アップグレードではスキーマの変更等の SQL 文をモジュールが持っていてそれを順番に発行します。
なのでモジュールがアップグレードを意識していなかったり、今回のようにスキーマがちょっとおかしくなっていたりすると失敗してしまい、その状態でアクセスすると設定ページがエラーで開かないという事になるようです。
調べているときに update.php を実行する前にモジュールを戻すという記述も見られましたが、アップグレードに対応していないモジュールが一つでもいると失敗すると思います。

また、今回の移行後に同じモジュールの Drupal7 対応版を入れようとすると、インストール時にすでにテーブルが存在するので不具合が出ると思います。
管理画面上でモジュールを無効にして、アンインストールページに表示されていたらアンインストールして、データベース上の当該テーブル(モジュール名が含まれていると思います)を DROP TABLE してから、もう一度モジュールをインストールする事で解決しました。
基本的なコンテンツは移行して、モジュールの設定はやりなおしという感じです。

ちょっと表示が一部おかしいところがありますが、とりあえずこれで様子見かなー。

technical

Posted by yokky