摘要
> flask開發相關功能,在本地測試沒有問題,但是放到線上環境卻報錯 `ImportError: libmysqlclient.so.16: cannot open shared object file: No such file or directory`
> 檢查了下發現在 `/usr/lib64/mysql` 下面存在`libmysqlclient.so.18`文件(uanme -a 確認是64位系統)
---
## 解決過程
發現問題,不是自己遇到的也沒有解決辦法,那就網上查唄,發現大家的思路:
+ copy `/usr/lib64/mysql/libmysqlcient.so.18 `到`/usr/lib64/libmysqlclient.so.16`
+ 在`/usr/lib64/`下面建立libmysqlclient.so.16的軟連接
+ 在`/etc/ld.so.conf.d/mysql-x86_64.conf`里面添加 /usr/lib64/mysql
等等思路都嘗試之后發現還是還是沒有解決。
繼續思考:
環境中明明有`libmysqlclient.so.18` 為何要去找`libmysqlclient.so.16`,
那就先考慮`libmysqlclient.so.18`是從和而來。 在報錯中提到了`_mysql.so` , locate 找到`_mysql.so` 發現是在`/root/.pyenv/versions/flask2/lib/python2.7/site-packages/_mysql.so`,好項目有什么問題,找`mysql.so` 發現如下:
```bash
root@pts/1 # locate mysql.so
/root/.pyenv/versions/2.7.12/envs/flask2/lib/python2.7/site-packages/_mysql.so
/usr/lib64/php/modules/mysql.so
/usr/lib64/php/modules/pdo_mysql.so
/usr/lib64/php-zts/modules/mysql.so
/usr/lib64/php-zts/modules/pdo_mysql.so
/var/lib/mysql/mysql.sock
```
猜想應該和和PHP有關系,想起來本地環境和線上環境安裝的PHP不一致
本地的PHP是通過 `webtatic` 安裝的,而服務器上面的是通過 `remi`安裝的, 在本地執行`yum list |grep libmysql`:
```bash
[root@i-bskmtj6q ~]# yum list |grep libmysql
libmysqlclient16.x86_64 5.1.69-1.w6 webtatic
libmysqlclient16-devel.x86_64 5.1.69-1.w6 webtatic
```
發現libmysqlclient16 是來自于 `webstatic`, 故卸載之前通過remi安裝的PHP,采用webstatic方式安裝
```bash
## remove remi
yum remove php php-fpm php-mysqlnd php-common
## install from webstatic
yum install php56w php56w-mysql php56w-fpm php56w-common
```
最后驗證導入 MySQLdb 沒有報錯,一切正常
---
## 附加:
上文中提到了 `webtatic` 和 `remi` 兩個不同的安裝源,具體的區別可以參考鏈接
Centos下YUM安裝PHP的兩種方式 [http://www.jianshu.com/p/2ff15676f902](http://www.jianshu.com/p/2ff15676f902)
---
----------------------------------------------***更多精彩請關注***-------------------------------------
