如果你是在CentOS上,用普通用户、通过下载mysql.tar.gz(而非yum)安装的mysql,并在后续安装mysqlclient时遇到一些问题,那么这篇笔记可能对你有用。
背景
我在CentOS7上,用普通用户1(记为user1)安装了mysql,安装方式是下载官方8.0版本的mysql.tar.gz包、解压后执行mysqld(安装过程的其他细节与本文要解决的报错无关)。
而后在使用普通用户2(记为user2)进行python建站、pip安装mysqlclient时,先后出现了一些报错。搜索了一些解决方案,大多数人是因yum(或apt)安装mysql时少装了一些组件导致的报错,与我的情况不同。因此做了这篇记录,以供有相同情况的开发者参考。
我之所以没有用root用户yum安装mysql是出于安全考虑。
如果你就是用yum或apt安装的mysql,并且只装了mysql_server,那么你遇到下面的报错时,应该看这篇(apt安装),或者这篇(yum安装)。
报错
报错1.mysql_config not found
报错2._mysql.c:1894:3: error: unknown type name ‘my_bool’
原因&解决方案
报错1.mysql_config not found
对于报错1,很多人是只安装了mysql_server、缺失组件导致的。但我用完整mysql.tar.gz包安装,并不缺少组件(可以在安装目录找到mysql_config命令文件)。对于我的情况,发生这一报错的原因有两个,1)因为我安装mysqlclient与安装mysql是用的不同用户(如前文所说,分别记为user2和user1),mysql相关命令在user1家目录下,因此user2没有权限使用mysql_config命令;2)我安装mysqlclient的用户user2的环境中没有配置mysql命令的路径。
首先解决原因1),很简单,让user2有user1家目录的读+写+执行的权限即可。具体做法是,把user1家目录下的文件权限改为同组用户可读写:
chmod 774 /home/user1 -R
然后把user2加入user1的组:
usermod -G user1 user2
这样user2就有执行use1家目录里的mysql_config命令的权限了。
然后解决原因2),更简单,把mysql相关命令加入user2环境就行了。
打开user2环境配置文件:
vi /home/user2/.bash_profile
文件末尾添加mysql相关命令的路径:
MP=#等号后的内容替换为mysql安装包的路径
export PATH=$PATH:$MP/bin
保存后,记得让你的配置生效:
source /home/user2/.bash_profile
至此,报错1.mysql_config not found就不会再出现了
报错2._mysql.c:1894:3: error: unknown type name ‘my_bool’
这个报错的含义是gcc执行_mysql.c时,找不到my_bool的定义。(名词解释:1.gcc是c语言编译器;2._mysql.c是mysqlclient安装包的一个文件;3.my_bool这个变量原本应该被mysql包中的文件定义。)
在mysql8.0的官方Reference中提到:
The my_bool type was used before MySQL 8.0. As of MySQL 8.0, use the bool or int C type instead.
于是可知,以往的mysql包中确实有my_bool的定义,但在mysql8.0以后,这个my_bool就不存在了。
进而可知,在安装mysqlclient时,出现my_bool的问题,原因很可能是mysqlclient版本太旧,不支持mysql8.0+。我安装失败的版本是mysqlclient1.3.12。
解决办法自然是安装最新的mysqlclient(截止我写这个记录时,最新为1.4.6),目前所有mysqlclient的版本在这里查看。
正常情况下,第2个报错到这里就解决了。
如果最新版mysqlclient也安装失败,有可能是gcc没找到mysql安装包里的c语言头文件(*.h)、库文件(*.so)。你可以考虑手动把它们添加到gcc和g++搜索路径中。对于mysql8.0,可以参考下面的命令。
打开系统环境配置或者user2的环境配置:
vi /etc/profile
#或者用vi home/user2/.bash_profile
前者对所有用户生效,后者只对安装mysqlclient的用户user2生效。
文件末尾添加下列内容:
MP=# 等号后的内容替换为 mysql安装包的路径
#gcc找到头文件的路径
C_INCLUDE_PATH=$C_INCLUDE_PATH:$MP/include:$MP/include/mysql
export C_INCLUDE_PATH
#g++找到头文件的路径
CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$MP/include:$MP/include/mysql
export CPLUS_INCLUDE_PATH
#找到动态链接库的路径
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MP/lib:$MP/lib/pkgconfig:$MP/lib/plugin:$MP/lib/plugin/debug:$MP/lib/private:
$MP/lib/mecab:$MP/lib/mecab/etc:$MP/lib/mecab/dic:$MP/lib/mecab/dic/ipadic_euc-jp:$MP/lib/mecab/dic/ipadic_utf-8:
$MP/lib/mecab/dic/ipadic_sjis
export LD_LIBRARY_PATH
#找到静态库的路径
LIBRARY_PATH=$LIBRARY_PATH:$MP/lib:$MP/lib/pkgconfig:$MP/lib/plugin:$MP/lib/plugin/debug:$MP/lib/private:
$MP/lib/mecab:$MP/lib/mecab/etc:$MP/lib/mecab/dic:$MP/lib/mecab/dic/ipadic_euc-jp:$MP/lib/mecab/dic/ipadic_utf-8:
$MP/lib/mecab/dic/ipadic_sjis
export LIBRARY_PATH
保存完记得source一下这个的配置文件。
最后重复一下。如果你是在CentOS上,用普通用户、通过下载mysql.tar.gz(而非yum)安装的mysql,并在后续安装mysqlclient时遇到一些问题,那么这篇笔记可能对你有用。如果情况不同,请优先考虑其他解决方案。