Browse Month: December 2013

MySQL 5.6 をクライアントとして使うときに注意するポイント

MySQL Casual Advent Calendar 2013 の 21 日目です。

早いもので、MySQL 5.6 が GA としてリリースされて、早いもので約十ヶ月くらい経っていますし、AWS RDS でも 5.6 がサポートされていますし、本番環境の MySQL サーバで 5.6 が稼働しているところが多いのではないでしょうか?

さて、とあるプロジェクトで CentOS 6.4 x86_64 上 Redmine を構築したとき、MySQL 5.6 をクライアントして使ったときにはまりました。

まず、dev.mysql.com から、公式の 5.6.15 の RPM を MySQL-devel パッケージをインストールして、redmine を展開して、bundle しました。


$ wget http://www.redmine.org/releases/redmine-2.4.1.tar.gz; tar zxf redmine-2.4.1.tar.gz
$ cd redmine-2.4.1
redmine-2.4.1$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/........
...
Installing mysql2 (0.3.14)
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

/usr/bin/ruby extconf.rb
checking for ruby/thread.h... no
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... no
checking for rb_hash_dup()... no
checking for rb_intern3()... no
-----
Using mysql_config at /usr/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
...
/usr/bin/ld: cannot find -lmysqlclient
collect2: ld returned 1 exit status
make: *** [mysql2.so] Error 1
...

mysql2 がインストールできないようです。エラーの内容をよくみていると、mysqlclient のライブラリが見つからないようです。mysqlclient のライブラリは、MySQL-devel パッケージ場合、/usr/lib64/mysql にインストールされちえるため、mysql_config –libs した結果の「L/usr/lib64 -lmysqlclient -lpthread -lm -lrt -ldl
」では mysqlclient のライブラリが見つからないことが原因のようです。

これを直すには、直接 mysql_config を修正した方がよさそうです。MySQL Bugs #67851 として報告されていましたので、いつか直るといいですね。
/usr/bin/mysql_config を次のように修正しました。

--- /usr/bin/mysql_config-org 2013-12-20 12:11:54.708005529 +0900
+++ /usr/bin/mysql_config 2013-12-20 13:22:43.885004462 +0900
@@ -83,7 +83,7 @@
bindir='/usr/bin'

# If installed, search for the compiled in directory first (might be "lib64")
-pkglibdir='/usr/lib64'
+pkglibdir='/usr/lib64/mysql'
pkglibdir_rel=`echo $pkglibdir | sed -e "s;^$basedir/;;"`
fix_path pkglibdir $pkglibdir_rel lib/mysql lib

さて、この状態で bundle し直すと、ちゃんと gem はインストールできたようです。config/database.yml に MySQL サーバの設定をして、スキーマを投入してみました。

redmine-2.4.1$ rake db:migrate
'_rake' is correct? [n,y,a,e] n
rake aborted!
redmine-2.4.1/vendor/bundle/ruby/1.8/gems/mysql2-0.3.14/lib/mysql2/mysql2.so: undefined symbol: __cxa_pure_virtual - redmine-2.4.1/vendor/bundle/ruby/1.8/gems/mysql2-0.3.14/lib/mysql2/mysql2.so
redmine-2.4.1/vendor/bundle/ruby/1.8/gems/mysql2-0.3.14/lib/mysql2/mysql2.so
redmine-2.4.1/vendor/bundle/ruby/1.8/gems/mysql2-0.3.14/lib/mysql2.rb:8
redmine-2.4.1/config/application.rb:7
redmine-2.4.1/Rakefile:5
(See full trace by running task with --trace)

おや、mysql2 gem は正しくインストールされているはずなので、mysql2.so で undefined symbol エラーが発生しているようです。

Perl、Python、PHP、で簡単な MySQL サーバに接続するコードを書いてみましたが、いずれも問題なく動作しました。試しに C で書いたコンパイルところ(サンプルコードはこちら)、次のようなエラーがでましたので、とうも mysqlclient 側に問題があるようです。

$ gcc $(mysql_config --cflags) test.c $(mysql_config --libs)
/usr/lib64/mysql/libmysqlclient.a(client_authentication.cc.o):(.data.DW.ref.__gxx_personality_v0[DW.ref.__gxx_personality_v0]+0x0): undefined reference to `__gxx_personality_v0'
/usr/lib64/mysql/libmysqlclient.a(my_aes.cc.o): In function `~Mode_BASE':
/pb2/build/sb_0-10831761-1384711694.67/rpm/BUILD/mysql-5.6.15/mysql-5.6.15/extra/yassl/taocrypt/include/modes.hpp:64: undefined reference to `operator delete(void*)'
/usr/lib64/mysql/libmysqlclient.a(my_aes.cc.o):(.data.rel.ro._ZTVN8TaoCrypt9Mode_BASEE[vtable for TaoCrypt::Mode_BASE]+0x28): undefined reference to `__cxa_pure_virtual'

MySQL-devel パッケージを 5.5.35 にダウングレードして、mysql2 gem をインストールし直したあと、MySQL 5.6 にアップグレードすると、大丈夫なようです。。

redmine-2.4.1$ sudo yum downgrade /tmp/MySQL-devel-5.5.35-1.el6.x86_64.rpm
redmine-2.4.1$ rm -fr vendor/bundle
redmine-2.4.1$ bundle
redmine-2.4.1$ sudo yum install /tmp/MySQL-devel-5.6.15-1.el6.x86_64.rpm
redmine-2.4.1$ rake db:migrate
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
== Setup: migrating ==========================================================
-- create_table("attachments", {:force=>true})
-> 0.8633s
...

このことから、どうも MySQL 5.6 の libmysqlclient に原因があるようです。

試しに Percona-Server-devel-56-5.6.15-rel63 で試したところ、別の Symbol エラーがでました。

redmine-2.4.1$ rake db:migrate
rake aborted!
redmine-2.4.1/vendor/bundle/ruby/1.8/gems/mysql2-0.3.14/lib/mysql2/mysql2.so: undefined symbol: __gxx_personality_v0 - redmine-2.4.1/vendor/bundle/ruby/1.8/gems/mysql2-0.3.14/lib/mysql2/mysql2.so
redmine-2.4.1/vendor/bundle/ruby/1.8/gems/mysql2-0.3.14/lib/mysql2/mysql2.so
redmine-2.4.1/vendor/bundle/ruby/1.8/gems/mysql2-0.3.14/lib/mysql2.rb:8
redmine-2.4.1/config/application.rb:7
redmine-2.4.1/Rakefile:5
(See full trace by running task with --trace)

しばらくの間は、Ruby などで使う可能性がある場合、クライアント側は、MySQL 5.5 の方がいいかもしれませんね。。。

追記1:
@yoshi_ken さんから、後方互換ライブラリ MySQL-shared-compat をインストールすることで /usr/lib64 以下に libmysqlclinet がインストールされるため解消するという情報があったのですが、僕が試した環境では、最初は 5.1 版の MySQL-shared-compat がインストールされている状態で試した結果は、上のような結果なのですが、MySQL-devel パッケージなどをすべて削除してから 5.5 版の MySQL-shared-compat をインストールして、MySQL-devel パッケージをインストールしても、mysql2 gem はインストールできない状況に変わりはありませんでした。

追記2:
さらに検証を進めたところ、MySQL-shared パッケージをインストールすることで、この問題は解消するようです。
まとめると、MySQL-shared と MySQL-shared-compat パッケージの2つが必要なようですね!
次のようなパッケージがインストールされていれば問題ありません。mysql コマンドが必要な場合は、MySQL-client パッケージをインストールすれば大丈夫です。

$ rpm -qa | grep MySQL
MySQL-shared-compat-5.6.15-1.el6.x86_64
MySQL-shared-5.6.15-1.el6.x86_64
MySQL-devel-5.6.15-1.el6.x86_64

明日 22 日目は、@akira1908jp さんです。

EC2 c3.large が人気らしいというお話

今年の AWS re:Invent 2013 で発表された EC2 C3 ファミリーですが、かなり c1.medium / m1.medium からの移行などで人気があるようです。

EC2_Management_Console

僕も同じく、すこし遅めの対応でインスタンスの切り替えをしようとしたところ、次のようなメッセージが表示されていまいました。確認したので、東京リージョン ap-northeast-1a で非 default VPC 環境です。AWS の中の人に聞いたところ、c3.xlarge がまだ余裕があるみたいです。ap-northeast-1c ですと多少の余裕があって c3.large は起動するようです。ap-northeast-1a 側を使っている人がけっこう多そうな感じですね!

AWS といっても、当然ながら物理的なリソースの制限があるわけなので、AWS データセンターの中の人には頑張っていただきたい所存です。

早く、c1.medium や m1.medium から切り替えたいところですね。

参考:
Amazon EC2 で M1,C1 インスタンスを使ってる人は今すぐ C3 を使い始めよう – yoshidashingo

2013/12/20 追記
もう完全に東京では、枯渇してしまった様子ですね。来年あたり復活してから、c1/m1 からの切り替え祭りを実施したいと思います。