LoginSignup
1
1

More than 5 years have passed since last update.

MySQLを使用するWebアプリをCentOSに移行したら色々つまずいた話

Posted at

概要

はじめ環境1で動いていたWebアプリを環境4に段階的に移行した。

  1. OS:Windows、DB:Microsoft Access
  2. OS:Windows、DB:MySQL
  3. OS:Ubuntu、DB:MySQL
  4. 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

現象

  1. Webアプリを起動し、問題なくログインできることを確認したが、日本語の検索処理が機能しなくなった。
  2. ASCII文字は検索できる。
  3. 画面には日本語を文字化けせずに表示できる。
  4. MySQLクライアント上では、日本語を条件に正常に検索できる。

原因推測

現象3と現象4からDBに格納されているデータ正常であると考えた。
また、現象1と現象2からWebアプリ、MySQL間での文字エンコーディングの失敗が考えられる。

対処

JDBCで接続する際に文字エンコーディングを指定できることを知った([Java] JDBCでMySQLにデータを追加すると文字化けする場合の対処法)。
接続文字列に"?useUnicode=true&characterEncoding=utf8"を追加して、Webアプリをデプロイし直した。

結果

Webアプリでも日本語で検索できることを確認した。
環境4だけで上記現象が発生した原因は不明のままである。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1