【问题标题】:Ruby mysql2 gem compiled for wrong mysql client library version为错误的mysql客户端库版本编译的Ruby mysql2 gem
【发布时间】: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的内容是什么

标签: mysql ruby gem mysql2


【解决方案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 程序,你可以删除这个消息。省略它。

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

      2. 找到“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
            

            【讨论】:

            • 谢谢,它在 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。 (开个玩笑)
                    猜你喜欢
                    • 2012-02-03
                    • 2012-05-28
                    • 1970-01-01
                    • 2015-10-20
                    • 1970-01-01
                    • 2011-04-09
                    • 1970-01-01
                    • 2013-09-15
                    相关资源
                    最近更新 更多