PythonMySQLdb匯入libmysqlclient報錯

老鷹506發表於2017-07-11

摘要

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 發現如下:

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

[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方式安裝

## remove remi
yum remove php php-fpm php-mysqlnd php-common
## install from webstatic
yum install php56w php56w-mysql php56w-fpm php56w-common

最後驗證匯入 MySQLdb 沒有報錯,一切正常


附加:

上文中提到了 webtaticremi 兩個不同的安裝源,具體的區別可以參考連結

Centos下YUM安裝PHP的兩種方式 http://www.jianshu.com/p/2ff15676f902


公眾號: DailyJobOps

    公眾號: DailyJobOps    


相關文章