MySQL Gem Error
Last Modified on 2008/06/30 01:33 by 크레이지DK
Rails Log
Rails의 Log 파일을 보면 다음과 같은 메시지가 있는 경우를 볼 수 있다.
WARNING: You're using the Ruby-based MySQL library that ships with Rails. This library is not suited for production. Please install the C-based MySQL library instead (gem install mysql).
또는 Edge Rails를 사용한다면 다음과 같은 메시지가 나올 것이다.
!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql.
위 메시지들은 Rails에서 MySQL 라이브러리를 로드하지 못 할 경우 출력되는 메시지이다. 이럴 경우 Rails에 포함된 Ruby 기반의 MySQL 라이브러리를 사용하게 된다. development 환경에서는 크게 문제가 되지 않지만, production 환경에서는 서비스의 성능에 영향을 미치게 된다. 결국 이 문제를 해결하기 위해서는 MySQL gem이 정상적으로 설치되었고, 로드되는가를 확인해봐야 한다.
Windows의 경우
Windows 환경에서 MySQL이 설치되었고, MySQL gem도 정상적으로 설치되었다고 가정하자. 그럼에도 불구하고, 위의 메시지가 출력된다면 native MySQL driver (libmySQL.dll) 파일을 의심해 볼 수 있다.
우선 (환경변수의 path로 잡혔음에도 불구하고) mysql/bin 디렉토리의 libmySQL.dll 파일을 접근할 수 없는 경우가 있다. 이 경우에는 해당 파일을 ruby/bin 디렉로리에 복사한 후, 정상적으로 로드되는가를 확인해보아야 한다.
위의 방법으로 해결이 되지 않은 경우, 특정 버전의 libmySQL.dll의 버그인 경우를 의심해볼 수 있다. libmySQL.dll 2.7.3과 특정 버전의 MySQL이 정상적으로 작동하지 않는 경우가 있다고 한다. 따라서 이 경우에는 MySQL을 최신 버전으로 재설치함으로써 문제를 해결할 수 있다.
Linux의 경우
mysql gem 설치 시에 Shared Object 파일을 컴파일하게 되는데, 이 때 에러로 설치가 되지 않은 경우가 있다. 설치 시 아래와 같은 메시지가 출력된다면 MySQL의 위치를 파악하지 못 해서, Makefile의 생성이 실패한 것이다.
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... yes
checking for mysql_query() in -lmysqlclient... no
따라서 적절하게 자신의 mysql 설정을 옵션으로 추가해서 Gem을 설치한다. gem 설치시 Native extension을 빌드하는 경우, -- --build-flags 형식의 옵션을 통해서 build 옵션을 전달할 수 있다.
- $ gem install mysql -- \
> --with-mysql-config=/usr/local/mysql/bin/mysql_config
테스트
위의 과정을 통해서 MySQL Gem이 정상적으로 설치되었다면, 테스트를 통해서 확인한다.
- $ irb
irb(main):001:0> require 'mysql'
=> true
irb(main):002:0> Mysql::VERSION
=> 20700