Browse Tag: mysql

Ganglia で MySQL をモニタリングする

このエントリは、MySQL Casual Advent Calendar 22日目のエントリです。

多数の MySQL サーバをもモニタリングするとき Ganglia を使うと便利です。

現在の Ganglia は、バージョン 3.6.0 なのですが、MySQL をモニタリングしたい場合には、前に hirose31 さんが作ったプラグインがありますが、現在は本体に取り込まれているプラグインを使うといいです。

まず、インストール方法は、CentOS を例にとって説明しますが、Ganglia の RPM パッケージを作成しています。本体に SPEC ファイルのもとがあるので、手元で ./configure したあと ganglia.spec を使うと、次の RPM パッケージが出来上がります。

  • ganglia-web: Ganglia の Web GUI
  • gangala-gmetad: Ganglia サーバの収集デーモン
  • ganglia-gmond: Ganglia クライアント
  • ganglia-gmond-modules-python: Ganglia クライアントの Python プラグイン
  • ganglia-devel: Ganglia 開発用のライブラリ

Ganglia のクライアントに必要なのは、ganglia-gmond, ganglia-gmond-modules-python パッケージをインストールする必要があります。ただし、依存関係で libganglia というパッケージもあわせてインストール必要があります。あと、Python の MySQL クライアント MySQL-python が必要ですが、これは使っている MySQL のバージョンによって動作しないことがあるため、別途あわせて作成してインストールしておくとよいでしょう。

Ganglia で MySQL をモニタリングしているのは、mysql.pyDBUtil.py で、内部的には show innodb status の出力結果を頑張って解析して値を取得しています。

しかし、最新版では、次の問題ありました。

      DBUtil.py で、UNIX Domain Socket がサポートされていない(mysql.py 側ではサポートされているが、3.6.0 には取り込まれていない…)
      MySQL 5.1 以降の show innodb status の出力に対応していない(こちらのパッチで直ります)

それぞれのパッチは、次のようなっています。


そして、本家にもその他の変更も含めて、すこし大きい pull-request を送っておいたのですが、無視され続けていました…。まさにすこし大きい pull-request は無視されてしまう法則にあたってしまったようです…。

内部的な変更は、これで動作するので、あとは設定するだけですが、MySQL サーバのユーザにユーザ権限 SUPER, PROCESS をもったユーザが必要になります。
これを作成した状態で、/etc/ganglia/conf.d/mysql.pyconf をこのような感じで設定します(この設定ではスレーブでの設定例です)

あとは、gmond を起動して、/var/log/messages にエラーが出ていなければ、次のようなグラフが出力されてるはずです。

ganglia-mysql-slave

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 さんです。

OSX で mysql5.6 環境下で mysql/mysql2 gem のインストールエラーがでた

OSX で mysql5.6 環境下で mysql/mysql2 gem のインストールエラーがでた。


Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

/Users/.../bin/ruby extconf.rb --with-mysql-config=/usr/lo
cal/mysql/bin/mysql_config
checking for mysql_ssl_set()... no
checking for rb_str_set_len()... no
checking for rb_thread_start_timer()... no
checking for mysql.h... no
checking for mysql/mysql.h... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/Users/.../bin/ruby
--with-mysql-config

Gem files will remain installed in /Users/.../gems/mysql-2.9.1 for i
nspection.
Results logged to /Users/.../gems/mysql-2.9.1/ext/mysql_api/gem_make
.out

もちろん、事前に mysql_config はちゃんと設定している。

$ bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config
$ bundle config build.mysql2 --with-mysql-config=/usr/local/mysql/bin/mysql_config

結論とすると、/usr/local/mysql/bin/mysql_config を次のように直せば良い。

--- /usr/local/mysql/bin/mysql_config-org 2013-08-13 11:52:25.000000000 +0900
+++ /usr/local/mysql/bin/mysql_config 2013-08-13 11:52:57.000000000 +0900
@@ -116,8 +116,8 @@
embedded_libs=" $ldflags -L$pkglibdir -lmysqld "
embedded_libs="$embedded_libs "

-cflags="-I$pkgincludedir -Wall -Wno-null-conversion -Wno-unused-private-field -Os -g -fno-strict-aliasing -DDBUG_OFF -arch x86_64 " #note: end space!
-cxxflags="-I$pkgincludedir -Wall -Wno-null-conversion -Wno-unused-private-field -Os -g -fno-strict-aliasing -DDBUG_OFF -arch x86_64 " #note: end space!
+cflags="-I$pkgincludedir -Wall -Os -g -fno-strict-aliasing -DDBUG_OFF -arch x86_64 " #note: end space!
+cxxflags="-I$pkgincludedir -Wall -Os -g -fno-strict-aliasing -DDBUG_OFF -arch x86_64 " #note: end space!
include="-I$pkgincludedir"

-Wno-null-conversion -Wno-unused-private-field というフラグを削除する必要があるみたい。

これは、mysql をアップデートしたときには、しばらく忘れずにやらにといけない。

これで mysql/mysql2 gem は無事インストールすることができるが、実際にアプリを実行してみると次のようエラーが出る。。。

dlopen(/Users/.../gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/mysql-5.5.28-osx10.6-x86_64/lib/libmysqlclient.18.dylib Referenced from: /Users/.../gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle Reason: image not found - /Users/.../gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle

備忘録としてのメモ。

libmysqlclient.18.dylib が見つからないらしい。

解決方法は、環境変数 DYLD_LIBRARY_PATH を定義するといいみたいだが、定義すると次のようなの警告が表示されてしまった。

dyld: DYLD_ environment variables being ignored because main executable (/usr/bin/sudo) is setuid or setgid

ということで、次を実行して、アプリケーションサーバを再起動したら無事解決した。

$ sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

MySQL 5.6 の mysql プロンプトの使い勝手を改善した

MySQL 5.6 にしてからというもの、mysql プロンプトで、Ctrl + w を押したとき、それまで入力していた行すべてが削除されてしまうようになった。
どうにも不便で、前のワード単位で削除したい方法を調べてみたら、さくっとこの情報が見つかった。

さっそく $HOME/.editrc を作成して、次の行を追加してみた。

bind "^U" vi-kill-line-prev
bind "^W" ed-delete-prev-word

mysql プロンプトの接続を切って、再接続すると、Ctrl + w で前のワード単位で削除できるようになった!!!
これで、MySQL 5.5 以前と同じ使い心地になった。

公式情報は、MySQL :: MySQL 5.6 Reference Manual :: 4.5.1.6 mysql Tips にあります。

MySQL でオンラインで binlog_format を変更する方法

MySQL でオンラインで binlog_format を変更したかったので、その方法を紹介します。

  1. すべてのスレーブに対して STOP SLAVE する
  2. マスターに対して、FLUSH TABLES WITH READ LOCK; して更新系のクエリを止める
  3. マスターに対して、FLUSH LOG する
  4. マスターに対して、SET GLOBAL binlog_format = ‘ROW’; する、または MIXED
  5. マスターに対して、FLUSH LOG する
  6. マスターに対して、UNLOCK TABLES; する
  7. すべてのスレーブに対して START SLAVE する

あとは、my.cnf を忘れずに変更しておいしまい。

MySQL 5.5 + mysql2 gems でエラーが発生する件について

CentOS 6.3 x86_64 の MySQL 5.5 の環境(MySQL 5.5 は、公式の RPM を使用)で、gem install mysql2 すると、次のエラーが発生します。

$ sudo gem install mysql2
Building native extensions. This could take a while...
ERROR: Error installing mysql2:
ERROR: Failed to build gem native extension.
/usr/bin/ruby extconf.rb
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... no
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
creating Makefile
make
gcc -I. -I. -I/usr/lib64/ruby/1.8/x86_64-linux -I. -DHAVE_MYSQL_H -DHAVE_ERRMSG_H -DHAVE_MYSQLD_ERROR_H -I/usr/include/mysql -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -fPIC -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -DMY_PTHREAD_FASTMUTEX=1 -fPIC -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fno-strict-aliasing -fPIC -Wall -funroll-loops -c mysql2_ext.c
./client.h:16: warning: ‘rb_thread_blocking_region’ defined but not used
gcc -I. -I. -I/usr/lib64/ruby/1.8/x86_64-linux -I. -DHAVE_MYSQL_H -DHAVE_ERRMSG_H -DHAVE_MYSQLD_ERROR_H -I/usr/include/mysql -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -fPIC -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -DMY_PTHREAD_FASTMUTEX=1 -fPIC -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fno-strict-aliasing -fPIC -Wall -funroll-loops -c result.c
gcc -I. -I. -I/usr/lib64/ruby/1.8/x86_64-linux -I. -DHAVE_MYSQL_H -DHAVE_ERRMSG_H -DHAVE_MYSQLD_ERROR_H -I/usr/include/mysql -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -fPIC -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -DMY_PTHREAD_FASTMUTEX=1 -fPIC -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fno-strict-aliasing -fPIC -Wall -funroll-loops -c client.c
gcc -shared -o mysql2.so mysql2_ext.o result.o client.o -L. -L/usr/lib64 -L. -rdynamic -Wl,-export-dynamic -Wl,-rpath,/usr/lib64 -lruby -L/usr/lib64 -lmysqlclient_r -lpthread -lm -lrt -ldl -lpthread -lrt -ldl -lcrypt -lm -lc
/usr/bin/ld: cannot find -lmysqlclient_r
collect2: ld returned 1 exit status
make: *** [mysql2.so] Error 1

どうやら、mysqlclient_r が見つからないようです。export LD_LIBRARY_PATH=/usr/lib64/mysql/:/usr/lib64 したり、/etc/ld.so.conf.d/ に mysql.conf を作成して /usr/lib64/mysql を作成してみたのですが、同じエラーのままでした。

MySQL 5.5 から、mysqliclient_r ではなく、mysqlclient になったようで、ちょうど先月に mysql2 gem のコミットが入っていました。
このバージョンは、まだ正式リリースされておらず、現在のバージョンは 0.3.12b4 となっています。そろそろ、リリースされそうな雰囲気なのですが、正式リースでないと不安のため、/usr/bin/mysql_config を書き換えることにしました。

差分は、次のとおりです。

--- mysql_config-org 2012-09-18 17:10:53.083571150 +0900
+++ mysql_config 2012-09-18 17:13:36.359551034 +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

@@ -112,7 +112,7 @@
# We intentionally add a space to the beginning and end of lib strings, simplifies replace later
libs=" $ldflags -L$pkglibdir -lmysqlclient -lpthread -lm -lrt -ldl "
libs="$libs "
-libs_r=" $ldflags -L$pkglibdir -lmysqlclient_r -lpthread -lm -lrt -ldl "
+libs_r=""
embedded_libs=" $ldflags -L$pkglibdir -lmysqld -lpthread -lm -lrt -lcrypt -ldl -laio "

if [ -r "$pkglibdir/libmygcc.a" ]; then
@@ -121,7 +121,7 @@
# automatically. We package the libmygcc.a from the build host, to provide
# definitions for those. Bugs 4921, 19561, 19817, 21158, etc.
libs="$libs -lmygcc "
- libs_r="$libs_r -lmygcc "
+ libs_r=""
embedded_libs="$embedded_libs -lmygcc "
fi

この状態にして、次のコマンドを実行すれば、取り急ぎmysql2 gem をインストールすることができます。

$ sudo gem install mysql2 -- --with-mysql-config=/usr/bin/mysql_config
Building native extensions. This could take a while...
Successfully installed mysql2-0.3.11
1 gem installed
Installing ri documentation for mysql2-0.3.11...
Installing RDoc documentation for mysql2-0.3.11...

なお、かなり無理矢理の対応のため、くれぐれも /usr/bin/mysql_config の書き換えには、他に何らかの悪影響があるかもしれないので、ぐれぐれもご注意下さい・・・。

PHP 5.4 + MySQL 5.5 の RPM を作成する方法

CentOS 5.8 x86_64 の環境で、大人の事情で PHP 5.4.4 + MySQL 5.5.24 の RPM を作成してみました。

まず、MySQL 5.5 の公式 RPM をさくっとインストールします。インストール後は、こんな感じになるはずです。

$ rpm -qa | grep MySQL
MySQL-client-5.5.24-1.rhel5
MySQL-server-5.5.24-1.rhel5
MySQL-devel-5.5.24-1.rhel5

次に PHP 5.4.4 の方ですが、ここにちゃんとメンテナンスされている SPEC ファイルやパッチファイルがありますので、これを使います。
php54 : Code : IUS Community Project

$ bzr branch lp:~ius-coredev/ius/php5

さっそく、このファイルを使って PHP 5.4 系の RPM を作成しますが、php54-mysql パッケージの名前を MySQL 5.5 系でビルドしたことが分かるように php54-mysql55 としておくと便利だと思います。

SPEC ファイルの差分は、次のようになります。

16c16
< %{!?runselftest: %{expand: %%global runselftest 1}} --- > %{!?runselftest: %{expand: %%global runselftest 0}}
20c20
< %global mysql_config %{_libdir}/mysql/mysql_config --- > %global mysql_config %{_bindir}/mysql_config
341c341
< %package mysql --- > %package mysql55
356c356
< BuildRequires: mysql-devel >= 4.1.0
---
> BuildRequires: MySQL-devel >= 5.5.50
359c359
< %description mysql --- > %description mysql55
1406c1406
< %files mysql -f files.mysql --- > %files mysql55 -f files.mysql

あとは、ビルドするだけですが MySQL のライブラリが見つからないというエラーが発生するため、次のコマンドを実行してから RPM をビルドしましょう。

$ export LDFLAGS=-L/usr/lib64/mysql
$ rpmbuild -ba ~/rpmbuild/SPECS/php54.spec

ビルドが終わると、次のような RPM ができあがります。

$ ls ~/rpmbuild/RPMS/x86_64/php54*
php54-5.4.4-1.ius.el5.x86_64.rpm
php54-mcrypt-5.4.4-1.ius.el5.x86_64.rpm
php54-bcmath-5.4.4-1.ius.el5.x86_64.rpm
php54-mssql-5.4.4-1.ius.el5.x86_64.rpm
php54-cli-5.4.4-1.ius.el5.x86_64.rpm
php54-mysql55-5.4.4-1.ius.el5.x86_64.rpm
php54-common-5.4.4-1.ius.el5.x86_64.rpm
php54-mysqlnd-5.4.4-1.ius.el5.x86_64.rpm
php54-dba-5.4.4-1.ius.el5.x86_64.rpm
php54-odbc-5.4.4-1.ius.el5.x86_64.rpm
php54-devel-5.4.4-1.ius.el5.x86_64.rpm
php54-pdo-5.4.4-1.ius.el5.x86_64.rpm
php54-embedded-5.4.4-1.ius.el5.x86_64.rpm
php54-pgsql-5.4.4-1.ius.el5.x86_64.rpm
php54-enchant-5.4.4-1.ius.el5.x86_64.rpm
php54-process-5.4.4-1.ius.el5.x86_64.rpm
php54-fpm-5.4.4-1.ius.el5.x86_64.rpm
php54-pspell-5.4.4-1.ius.el5.x86_64.rpm
php54-gd-5.4.4-1.ius.el5.x86_64.rpm
php54-recode-5.4.4-1.ius.el5.x86_64.rpm
php54-imap-5.4.4-1.ius.el5.x86_64.rpm
php54-snmp-5.4.4-1.ius.el5.x86_64.rpm
php54-interbase-5.4.4-1.ius.el5.x86_64.rpm
php54-soap-5.4.4-1.ius.el5.x86_64.rpm
php54-intl-5.4.4-1.ius.el5.x86_64.rpm
php54-tidy-5.4.4-1.ius.el5.x86_64.rpm
php54-ldap-5.4.4-1.ius.el5.x86_64.rpm
php54-xml-5.4.4-1.ius.el5.x86_64.rpm
php54-litespeed-5.4.4-1.ius.el5.x86_64.rpm
php54-xmlrpc-5.4.4-1.ius.el5.x86_64.rpm
php54-mbstring-5.4.4-1.ius.el5.x86_64.rpm

あと、PEAR ですが、別途 RPM を作成しないといけません。
php54-pear の SPEC ファイルは、ここにありますので、これを使ってさくっとビルドしちゃいます。

$ git clone https://github.com/iuscommunity/php54-pear.git
$ cd php54-pear
$ rpmbuild -ba SPECS/php54-pear.spec

そうすると、$HOME/rpmbuild/RPMS/noarch/php54-pear-1.9.4-1.ius.el5.noarch.rpm が作成されます。

Rails + MySQL Sandbox

Rails と MySQL Sandbox 5.5.24 の環境で、次のようなエラーが表示されてしまった。


dlopen($HOME/.rvm/gems/ree-1.8.7-2012.02/gems/mysql-2.8.2/lib/mysql.bundle, 9): Library not loaded: libmysqlclient.18.dylib Referenced from: $HOME/.rvm/gems/ree-1.8.7-2012.02/gems/mysql-2.8.2/lib/mysql.bundle Reason: image not found - $HOME/.rvm/gems/ree-1.8.7-2012.02/gems/mysql-2.8.2/lib/mysql.bundle

libmysqlclient.18.dylib が別の場所にあって見つけられないエラーだということだと思います。
次のコマンドを実行したところ治すことができました。

$ install_name_tool -change libmysqlclient.18.dylib $MYSQL_SANDBOX_HOME/5.5.24/lib/libmysqlclient.18.dylib $HOME/.rvm/gems/ree-1.8.7-2012.02/gems/mysql-2.8.2/lib/mysql.bundle

mysql – Library not loaded: libmysqlclient.16.dylib error when trying to run ‘rails server’ on OS X 10.6 with mysql2 gem – Stack Overflow を参考にしました。

MySQL の SHOW TABLE STATUS を見やすくする方法

A better SHOW TABLE STATUS » Fatal Exception で紹介されていた方法が便利なので紹介します。

これは、MySQL の SHOW TABLE STATUS をストアプロシージャーを使って、見やすく方法です。

  1. tools というデータベースを作成します
  2. ここにある SQL を実行して、ストアプロシージャーを作成します
  3. あとは、call tools.sp_status(database()); のような形でデータベース名を指定して実行するだけです

たとば、mysql データベースの場合だと、こんな感じです。

通常の show table status。

root@localhost[mysql]> show table status;
+---------------------------+--------+---------+------------+------+----------------+-------------+-
-------------------+--------------+-----------+----------------+---------------------+--------------
-------+---------------------+-------------------+----------+----------------+----------------------
-----------------------------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length |
Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time
| Check_time | Collation | Checksum | Create_options | Comment
|
+---------------------------+--------+---------+------------+------+----------------+-------------+-
-------------------+--------------+-----------+----------------+---------------------+--------------
-------+---------------------+-------------------+----------+----------------+----------------------
-----------------------------+
| columns_priv | MyISAM | 10 | Fixed | 0 | 0 | 0 |
227994731135631359 | 4096 | 0 | NULL | 2011-08-11 01:09:56 | 2011-08-11 01
:09:56 | NULL | utf8_bin | NULL | | Column privileges
|
| db | MyISAM | 10 | Fixed | 4 | 440 | 1760 |
123848989752688639 | 5120 | 0 | NULL | 2011-08-11 01:09:56 | 2011-08-28 22
:51:20 | 2011-08-11 01:09:56 | utf8_bin | NULL | | Database privileges
|

sp_status を使った場合。

root@localhost[mysql]> call tools.sp_status(database());
+---------------------------+--------+------+---------+-------------------+
| Table Name | Engine | Rows | Size | Collation |
+---------------------------+--------+------+---------+-------------------+
| columns_priv | MyISAM | 0 | 0.00 Mb | utf8_bin |
| db | MyISAM | 4 | 0.01 Mb | utf8_bin |
| event | MyISAM | 0 | 0.00 Mb | utf8_general_ci |
| func | MyISAM | 0 | 0.00 Mb | utf8_bin |
| general_log | CSV | 2 | 0.00 Mb | utf8_general_ci |
| help_category | MyISAM | 38 | 0.02 Mb | utf8_general_ci |
| help_keyword | MyISAM | 452 | 0.10 Mb | utf8_general_ci |
| help_relation | MyISAM | 993 | 0.03 Mb | utf8_general_ci |
| help_topic | MyISAM | 508 | 0.43 Mb | utf8_general_ci |
| host | MyISAM | 0 | 0.00 Mb | utf8_bin |
| ndb_binlog_index | MyISAM | 0 | 0.00 Mb | latin1_swedish_ci |
| plugin | MyISAM | 0 | 0.00 Mb | utf8_bin |
| proc | MyISAM | 1 | 0.01 Mb | utf8_general_ci |
| procs_priv | MyISAM | 0 | 0.00 Mb | utf8_bin |
| servers | MyISAM | 0 | 0.00 Mb | utf8_general_ci |
| slow_log | CSV | 2 | 0.00 Mb | utf8_general_ci |
| tables_priv | MyISAM | 0 | 0.00 Mb | utf8_bin |
| time_zone | MyISAM | 0 | 0.00 Mb | utf8_general_ci |
| time_zone_leap_second | MyISAM | 0 | 0.00 Mb | utf8_general_ci |
| time_zone_name | MyISAM | 0 | 0.00 Mb | utf8_general_ci |
| time_zone_transition | MyISAM | 0 | 0.00 Mb | utf8_general_ci |
| time_zone_transition_type | MyISAM | 0 | 0.00 Mb | utf8_general_ci |
| user | MyISAM | 7 | 0.00 Mb | utf8_bin |
+---------------------------+--------+------+---------+-------------------+
23 rows in set (0.06 sec)

かなりターミナル画面で見やすくなりましたね!

mysql_secure_installation 小技

一般的に MySQL サーバを構築するとき、mysql_secure_installation を使うのが一般的だと思いますが、mysqld_multi などを使っている環境下の場合、mysql_secure_installation は UNIX ドメインソケットを設定できないため、個別の MySQL に対して mysql_secure_installation を実行することができません。

mysql_secure_installation は、my.cnf の設定にも左右されますが、通常 /var/lib/mysql/mysql.sock をデフォルトで使うため、次のようにすると簡単にできますよね。

例えば、/var/lib/mysql/mysql_db1.sock と /var/lib/mysql/mysql_db2.sock がある場合、前者の MySQL に対して mysql_secure_installation を実行するには、次のようにします。


# ln -s /var/lib/mysql/mysql-db1.sock /var/lib/mysql.sock
# /usr/bin/mysql_secure_installation
# rm -f /var/lib/mysql/mysql.sock

おそらく、my.cnf の設定変更でもいけるはずですが、mysql_secure_installation を実行するのは、最初の一回だけなので、上記の方法の方がシンプルでよいです。

mysql_secure_installation については、次の「エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド」の 6.1 項に詳しく書かれていますので参考にしてください。
とても便利です。

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド
奥野 幹也
技術評論社
売り上げランキング: 60563
  • 1
  • 2