为错误的mysql客户端库版本编译的Ruby mysql2 gem

Posted

技术标签:

【中文标题】为错误的mysql客户端库版本编译的Ruby mysql2 gem【英文标题】:Ruby mysql2 gem compiled for wrong mysql client library version 【发布时间】:2011-12-29 19:55:31 【问题描述】:

使用 apt-get 将 mysql 更新到 5.5 后,mysql2 gem 停止工作。

这是错误:

Incorrect MySQL client library version!
This gem was compiled for 5.5.17 but the client library is 5.1.58. (RuntimeError)

我尝试使用 mysql_config 重新安装,但似乎没有什么不同..

gem install mysql2 -- --with-mysql-config=/usr/bin/mysql_config

相应地,我尝试告诉 bundle 用 mysql-config 编译 mysql2,但错误仍然存​​在..

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

当我尝试使用旧版本的 gem (v0.2.6) 时,rails 控制台会打开,但一旦我运行任何类型的查询就会崩溃。


这是尝试最新版本的 mysql2 gem 时的完整错误堆栈:

[marco@linode:/www] 07:29:00 AM: rails c
/users/marco/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/mysql2-0.3.10/lib/mysql2.rb:9:in `require': Incorrect MySQL client library version! This gem was compiled for 5.5.17 but the client library is 5.1.58. (RuntimeError)
  from /users/marco/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/mysql2-0.3.10/lib/mysql2.rb:9:in `<top (required)>'
  from /users/marco/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:68:in `require'
  from /users/marco/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
  from /users/marco/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:66:in `each'
  from /users/marco/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:66:in `block in require'
  from /users/marco/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:55:in `each'
  from /users/marco/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:55:in `require'
  from /users/marco/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler.rb:122:in `require'
  from /www/config/application.rb:7:in `<top (required)>'
  from /users/marco/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/commands.rb:38:in `require'
  from /users/marco/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/commands.rb:38:in `<top (required)>'
  from script/rails:6:in `require'
  from script/rails:6:in `<main>'

编辑:我从缓存中删除了所有 mysql2 gemspecs,通过 apt-get 卸载了所有与 mysql 相关的软件包并重新安装了所有内容,然后再次尝试使用 mysql-config 标志安装 gem。但这一切都被证明是徒劳的。错误仍然存​​在。

编辑 2:按照 John Bachir 的建议,我确认 mysql_config 包含 MySQL 5.5 版。

【问题讨论】:

你的database.yml和mysql的配置文件my.cnf的内容是什么 【参考方案1】:

在 Mac 上使用 Brew 验证您机器上安装的版本:

ls /usr/local/Cellar/mysql*

他们删除了错误的版本,例如:

brew uninstall mysql-client

移除宝石:

gem uninstall mysql2

再次运行包:

bundle install

【讨论】:

【参考方案2】:

重新安装 libmysqlclient-dev 并为我修复 apt remove libmysqlclient-dev &amp;&amp; apt install libmysqlclient-dev

【讨论】:

【参考方案3】:

如果你知道 c 程序,你可以删除这个消息。省略它。

    打开这个mysql.gem mysql-2.9.1.gem\data.tar.gz\data.tar\ext\mysql_api\mysql.c

    找到“This gem was compiled for”,删除这个 if 语句。

    if (lib[i] != MYSQL_SERVER_VERSION[i])  Line 1897: rb_raise(rb_eRuntimeError, "Incorrect MySQL client library version! This gem was compiled for %s but the client library is %s.", MYSQL_SERVER_VERSION, lib); 
    

您需要为 Windows 系统上的本地 gemfile 安装设置 sys-variable 。 SET HOMEDRIVE=c: 错误:执行 gem 时 ... (Errno::EINVAL) 无效参数 @ rb_file_s_stat - U:/

安装本地 gem 文件。 C:\Rails>gem install --local mysql-2.9.1.gem --install-dir=c:/tmp --platform= ruby​​ -- --with-mysql-dir=C:/Rails/mysql-connector -C mysql-connector-c 访问 mysql http://dev.mysql.com/downloads/connector/c/ 。你不在乎版本。

再试一次。 需要'mysql'

【讨论】:

【参考方案4】:

在我的机器上,我必须卸载 gem,然后将符号链接 /usr/local/mysql 重定向到正确的 Homebrew 版本:

ln -s /usr/local/bin/mysql /usr/local/mysql

然后运行bundle install

【讨论】:

【参考方案5】:

我尝试了上面所有的答案,我的最终方法相当简单——删除整个捆绑的 gem 堆栈并重新安装所有东西。终于解决了mysql客户端问题。即

rm -rf /Users/sjohnson/.rvm/gems/ruby-1.9.3-p484@adp_rails3 捆绑安装

【讨论】:

【参考方案6】:

派对迟到了,但我刚来

gem uninstall mysql2
gem install mysql2

宝石路径是

$ bundle show mysql2
/var/lib/gems/1.9.1/gems/mysql2-0.3.16

【讨论】:

***.com/questions/22518764/… 谢谢,它在 ruby​​ 2.0.0 和 rails 4 应用程序上运行良好。错误可能是由于更新了 mysql 服务器的版本。 没有工作,因为 Gem 没有再次编译。 MySQL 客户端升级后,需要针对新库编译 gem。【参考方案7】:

就我而言,我在 /usr/lib 中保留了来自 libmysqlclient15(日期为 2009 年)和 libmysqlclient16(日期为 20012 年)的各种文件,可能来自一个拙劣的 Ubuntu 升级。

删除 libmysqlclient15 文件(链接到 libmysqlclient15.so)解决了我的问题。

【讨论】:

【参考方案8】:

我遇到了这个问题,只需要重新编译 gem。我不知道捆绑器是否有更程序化的方式,但我只是删除了已编译的 gem,然后重新运行捆绑器:

$ bundle show mysql2
/usr/local/rvm/gems/ruby-1.9.3-p385/bundler/gems/mysql2-32dd7e5bbeba
$ rm -rf /usr/local/rvm/gems/ruby-1.9.3-p385/bundler/gems/mysql2-32dd7e5bbeba
$ bundle

【讨论】:

【参考方案9】:

除了确保只安装了 libmysqlclient18 库(而不是 16 个)之外,它对我有用的是安装 libmysqlclient18-dev(开发头文件)。

这是在 Ubuntu Precise 上使用 Percona Server 5.5。

【讨论】:

【参考方案10】:

我又遇到了这个问题,我以前的方法(使用旧版本的 mysql2 gem)无法解决。所以我尝试了另一种方法作为这些步骤:

1.找到你的gem库依赖的mysql_config。

mysql_config在不同人的机器上情况不同,一个人的机器可以有多个mysql_config,所以没有一个标准的mysql_config路径供大家参考。 以本题为例,mysql_config版本为“5.1.58”,所以可以在root下搜索“mysql”文件,找到与“5.1.58”相关的:

cd /

sudo find -name "mysql" ./

2. 再次安装 mysql2 gem 库,在步骤 1 中找到特定的 mysql_config 路径

gem install mysql2 -- --with-mysql-config=<%your_specific_mysql_config_path%>

【讨论】:

使用正确的配置文件安装对我有用。在 OSX 上,它位于 /usr/local/mysql-version 中。完整路径和命令是 sudo gem install mysql2 -- --with-mysql-config=/usr/local/mysql-5.5.27-osx10.6-x86_64/bin/mysql_config。正如这里所讨论的:ruby-forum.com/topic/1440086【参考方案11】:

我遇到了类似的问题:

不正确的 MySQL 客户端库版本!此 gem 是为 5.6.12 编译的,但客户端库是 5.5.28。

还有我在 Mac 上的 MySQL 版本:

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.12, for osx10.8 (x86_64) using  EditLine wrapper

bundle install安装的mysql2 gem是mysql2-0.3.13

我通过在 Gemfile 中将 mysql2 gem 设置为旧版本解决了这个问题:

gem 'mysql2', '0.2.6'

如果'0.2.6' 不适合您,您可以尝试另一个旧版本号。

【讨论】:

【参考方案12】:

除了移动库文件之外,您还可以查看系统的软件包列表——如果您使用 apt-get 升级到 5.5,那么您可能仍然有 5.1 库,而您根本不需要这些库.例如,在我们遇到类似问题的系统上,我们仍然有 5.1 库:

$ sudo dpkg -l | grep mysql
ii  libmysqlclient-dev               5.5.13-rel20.4-136.lucid                 Percona Server database development files
ii  libmysqlclient16                 5.1.61-rel13.2-431.lucid                 Percona Server database client library
ii  libmysqlclient18                 5.5.13-rel20.4-136.lucid                 Percona Server database client library

而不是在 5.1 库上复制 5.5 库,您应该能够将其删除:

$ sudo apt-get remove libmysqlclient16

对我们来说,这比之前提出的库重命名解决方案更可靠。

【讨论】:

但是“apt-get remove libmysqlclient16”也会删除 MySQL 服务器! Debian/Ubuntu 在这里有愚蠢的依赖。我安装了 mariadb 5.5 服务器和客户端。 Ubuntu 11.10 服务器安装了 libmysqlclient16(用于 MySQL 5.1)和 libmysqlclient18(用于 MySQL 5.5)。那是因为 mariadb-client-5.5 依赖于 libdbd-mysql-perl。而 libdbd-mysql-perl 依赖于 libmysqlclient16。所以最后:mysql 客户端 5.5 依赖于... mysql 客户端 5.1,这很疯狂且令人困惑,它不允许安装 Ruby mysql2 gem。【参考方案13】:

我在使用 Ubuntu Server 11.04 和 Percona Server 时遇到了同样的错误,我做了什么:

/usr/lib/libmysqlclient.so.16.0.0 替换为/usr/lib/libmysqlclient.so.18.0.0

【讨论】:

您有一个名为libmysqlclient_r.so.18 的文件吗?我用“18”版本替换了所有libmysqlclient.so.16 文件,但我没有/usr/lib/libmysqlclient_r.so.16 对应的“18”文件,所以这可能是罪魁祸首。 @Marco 在我的系统中,libmysqlclient_r 是 libmysqlclient 的符号链接 @Marco 实际文件为libmysqlclient.so.16.0.0,其他文件如libmysqlclient.so.16libmysqlclient.so都是符号链接。 虽然这将解决这个特殊问题,但我会非常厌倦以这种方式解决它。这可能会破坏实际针对版本 16 编译的其他软件。如果它不会删除您不需要的任何内容,我建议apt-cache purge libmysqlclient16 @johnf 不能那样做,mysql 包依赖于它.. 见馅饼:pastie.org/2921551【参考方案14】:

确保 /usr/bin/mysql_config 确实是 5.5 附带的那个。

【讨论】:

好建议。不幸的是,我检查了它确实有正确的版本号。 我有,以及缓存的 gemspec 文件和供应商/缓存以及我能找到的与 gem 远程相关的任何其他内容。在重新安装所有东西之前,我什至卸载了 libmysqlclient 文件以及 gem,但无济于事。 切换到 Postgres。 (开个玩笑)

以上是关于为错误的mysql客户端库版本编译的Ruby mysql2 gem的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3 - MySQL 客户端库版本不正确!为错误的客户端库版本编译的 Gem

Sass 中文注释导致编译错误

如何在 OS X 上使用 ruby​​ 2.3 解决 mysql2 gem 的“不兼容的库版本”?

centos7编译安装mysql5.7.20版本

mysql_connect():标头和客户端库次要版本不匹配库:100005

生产库MySQL配置文件my.cnf详解