概要
はじめ環境1で動いていたWebアプリを環境4に段階的に移行した。
- OS:Windows、DB:Microsoft Access
- OS:Windows、DB:MySQL
- OS:Ubuntu、DB:MySQL
- OS:CentOS、DB:MySQL
WebアプリはJavaで作られていたため、コピーするだけで移行はできた。
AccessからMySQLへのデータの移行方法は忘れてしまった。
多分、MySQLのインポート用のツールを使ったような気がする。
MySQL間のデータ移行はmysqldumpを使用した。
1~3までは順調に進んだ。つまり、WindowsからUbuntuへは簡単に移行できたが、CentOS上でのMySQLの振る舞いがUbuntu上と異なっていたので、WindowsからUbuntuの移行以上、作業を費やした。
以下は環境3から環境4へ移行したときの作業メモ。
バージョン
環境3
Ubuntu 14.04.2 LTS
MySQL 5.5
Tomcat 6
環境4
CentOS 6.6
MySQL 5.6
Tomcat 6
インストール
Tomcatに関して、以下のパッケージを追加する。
- apache-tomcat-apis.noarch
- tomcat6.i686
- tomcat6-admin-webapps.i686
- tomcat6-el-2.1-api.i686
- tomcat6-jsp-2.1-api.i686
- tomcat6-lib.i686
- tomcat6-servlet-2.5-api.i686
- tomcat6-webapps.i686
MySQLはリポジトリを追加して、インストールする。(参照:2.5.1. MySQL Yum リポジトリを使用して MySQL を Linux にインストールする)
問題その1
以下、失敗手順
DB、ユーザの作成
$ mysql -uroot -p
mysql> CREATE DATABASE DBNAME;
mysql> CREATE USER username IDENTIFIED BY 'password';
mysql> GRANT ALL ON DBNAME.* TO username@'localhost';
データ移行
エクスポート(mysqldump)
UbuntuのMySQLからmysqldumpを使用してデータをエクスポートする。
$ mysqldump -uusername -p DBNAME > mysqldump_filename.dmp
インポート
CentOSのMySQLにダンプファイをインポートさせる。
$ mysql -uusername -p DBNAME < mysqldump_filename.dmp
失敗
環境2から環境3へ移行したときは、上記手順で問題はなかった。また、環境3から同じく環境3へリカバリするときも問題はなかった。
では、CentOSでまず最初に起きた問題とは、何か。
DBに接続できなかったことである。
原因は、データベース名およびテーブル名の大文字と小文字を区別する環境になってしまったが、WebアプリのSQLは大文字と小文字を意識せずに実装されていたためだ。
MySQLのこの動作の違いはファイルシステムの違いが原因で起こる(識別子の大文字と小文字の区別)。
修正手順
上記問題を解決するために、システム変数lower_case_table_namesの値を1に設定した。
もちろん、大文字と小文字を区別しなくても問題ないことを確認すること。
lower_case_table_namesを1に設定した場合、ディスク上に小文字で格納するので、DBおよびテーブルを再作成する必要がある。
DB削除
$ mysql -uroot -p
mysql> DROP DATABASE DBNAME;
mysql> quit
BYE
$ sudo service mysqld stop
mysqldのオプションを設定
$ sudo vi /etc/my.cnf
以下の行を追加する。
[mysqld]
lower_case_table_names=1
DB作成とデータインポート(失敗手順と同様)
$ sudo service mysqld start
$ mysql -uroot -p
mysql> CREAT DATABASE DBNAME;
mysql> GRANT ALL ON DBNAME.* TO username@'localhost';
mysql> quit
BYE
$ mysql -uusername -p DBNAME < mysqldump_filename.dmp
問題その2
現象
- Webアプリを起動し、問題なくログインできることを確認したが、日本語の検索処理が機能しなくなった。
- ASCII文字は検索できる。
- 画面には日本語を文字化けせずに表示できる。
- MySQLクライアント上では、日本語を条件に正常に検索できる。
原因推測
現象3と現象4からDBに格納されているデータ正常であると考えた。
また、現象1と現象2からWebアプリ、MySQL間での文字エンコーディングの失敗が考えられる。
対処
JDBCで接続する際に文字エンコーディングを指定できることを知った([Java] JDBCでMySQLにデータを追加すると文字化けする場合の対処法)。
接続文字列に"?useUnicode=true&characterEncoding=utf8"
を追加して、Webアプリをデプロイし直した。
結果
Webアプリでも日本語で検索できることを確認した。
環境4だけで上記現象が発生した原因は不明のままである。