メインコンテンツに移動

データベースのバックアップとリストア

Drupal 7へのアップグレードに失敗した際にDrupal 6へ戻す必要があり、そのときにようやく文字化けすることなくデータベースのリストアをすることができました。
忘れないうちに備忘録として記事にしておきます。

以降の作業は、Puttyjpによりレンタルサーバにリモート接続して操作しています。
なお、PuttyjpではUTF-8で表示するよう設定してあり、なおかつシェル環境変数はUTF-8に設定してありますので、日本語はそのまま表示可能な状態です。

1.ユーザ設定

ユーザの設定は「$HOME/.my.cnf」ファイルに個別の設定を記述してあります。
中身は以下の通りです。
※hogehogeは実際のデータベースのパスワードで、ここに記述することでmysqlやmysqldumpコマンドを実行時にパスワード入力を省略することができます。
※mysqlやmysqldumpコマンドなどにパスワードを記述して実行が可能ですが、その方法では権限を持ったユーザがpsコマンド(プロセス一覧の表示)を実行することでパスワードが知られてしまう可能性がありますので注意が必要です。
※.my.cnfのファイルパーミッションは"0400"にしてあります。

%cat ~/.my.cnf
[mysql]
default-character-set=utf8
password="hogehoge"
[mysqldump]
default-character-set=utf8
password="hogehoge"
[mysqlimport]
default-character-set=utf8
[mysqlshow]
default-character-set=utf8

2.MySQLサーバの状態

サーバの文字コード設定は以下の通りです。

データベースサーバへ接続します
%mysql -h サーバ名
サーバ変数の一部(character_set~)を表示
mysql> show variables like 'character_set%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | ujis                             |
| character_set_connection | ujis                             |
| character_set_database   | ujis                             |
| character_set_filesystem | binary                           |
| character_set_results    | ujis                             |
| character_set_server     | ujis                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec)

character_set_system以外は、さくらのレンタルサーバの標準設定のままになっています。
Drupalを使う場合はcharacter_set_filesystem以外すべてをUTF-8に設定しておくほうが理想的ですが、データベース作成時にujis(EUC:デフォルト)で作成してしまい、このデータベースはMovableTypeのサイトとも共用していたので、運用開始後に変更することによる影響を懸念してそのままにしてありました。

3.バックアップ手順

バックアップは以下のコマンドをcrontabから毎朝実行するようにしてあります。(主となる箇所のみ抜粋)

mysqldump -Q --host=${DB_SERVER} --all-databases  > ${DBDUMP_FILE}

※DrupalとMovableTypeのすべてのデータベースのバックアップを取得しています。

4.リストア手順

mysqldumpで取得したデータベースを次の手順でリストアします。
※drupalのデータベースのリストアのみの場合

(1)drupalのテーブルのみのバックアップファイルを作成

mysqldumpで取得したバックアップにはDrupalとMovableTypeのテーブルがありますので、Drupalの部分だけにします。
※Drupalのインストール時に$db_prefix名を付与して作成するように設定してありますので、Drupal部分だけを簡単に切り出せます。(MovableTypeはmtで始まるため)
※mysqladminなどで事前にデータベースからdrupalのテーブルのみ削除してますが、すでにテーブルが存在している場合はリストア時に一旦DROPされるので問題はないと思います。
※viエディタ(実際はjvim3です)などのテキストエディタを使って操作をしますが、このときにバックアップファイル内の日本語がすでに文字化けしているケースは、端末の文字コードやシェル環境変数の設定が間違っているために表示上で発生しているだけとも考えられます。また、使用するエディタが表示や保存時に使用する文字コードがutf8であることも確認しておくべきです。

(2)mysqlコマンドでリストア
以下のようにmysqlコマンドを使用してリストアを実行します。
データベースに接続
mysql -h サーバ名
コネクション時の文字コードを確認
mysql> status;

Server characterset:    ujis
Db     characterset:    ujis
Client characterset:    ujis
Conn.  characterset:    ujis
TCP port:               3306
文字コードをutf8に変更
mysql> set names utf8;
文字コードが変更されたことを確認
※Server charactersetやDb charactersetもutf8であることが理想ですが、テーブル作成時にそれぞれutf8で作成されるので問題はありません。
mysql> status;

Server characterset:    ujis
Db     characterset:    ujis
Client characterset:    utf8
Conn.  characterset:    utf8
drupal.mysql.sqlファイルでリストアを実行
mysql> source drupal.mysql.sql

5.確認方法

リストア後に文字化けが発生しているかどうかは、mysqladminなどmysqlとは別のクライアントからテーブルを表示して確認すれば確実だと思います。
drupalのコアバージョンが6.xの場合は、「node_revisions」テーブル内に記事の本文が格納されているのでそのテーブルを表示して確認しています。

補足

以前は、「mysql -h サーバ名 < drupal.mysql.sql」でリストアをすると文字化けが発生していたため、事前にdrupal.mysql.sqlをEUC⇒UTF8変換してからリストアを実行していました。
しかし、この場合では環境依存文字とそのあとの1文字が文字化けをしていたため、部分的な修正で対応していました。そもそもなぜ、文字変換が必要だったのかも疑問でしたが、今回のこの方法ではバックアップファイルを文字コード変換することなくリストアできることが確認できました。

Drupalバージョン
カテゴリ