1. 程式人生 > >MaxScale2.2如何自動加載MySQL用戶

MaxScale2.2如何自動加載MySQL用戶

MySQL maxscale 中間件

之前在[《MySQL性能管理及架構設計》請添加鏈接描述](https://coding.imooc.com/class/49.html)課程中為大家講解了如何使用Maxscale來實現數據庫的讀寫分離的方案。近期在課程交流群中有同學提出在使用Maxscale2.2版本時,無法自動加載MySQL5.7中的用戶信息。 所以我就研究了一下新版本的Maxscale,發現確實如此,這是什麽原因呢?由如何解決這個問題呢?

我們先來說一說原因,我們來看一下下面的SQL
SELECT u.user, u.host, d.db, u.select_priv, u.authentication_string
FROM mysql.user AS u LEFT JOIN

mysql.db AS d ON (u.user = d.user AND u.host =
d.host)
WHERE u.plugin = ‘‘ AND u.user NOT IN (‘root‘)
UNION
SELECT u.user, u.host, t.db, u.select_priv, u.authentication_string
FROM mysql.user AS u LEFT JOIN
mysql.tables_priv AS t ON (u.user = t.user AND u.host = t.host)
WHERE u.plugin = ‘‘ AND u.user NOT IN (‘root‘)
這個是MaxScale為了加載MySQL的用戶,所執行的SQL,大家註意一下u.plugin=‘‘這個過濾條件,這個plugin列來自於mysql.user用戶,用於表示MySQL認證用戶的方式,在Mysql5.6之前的版本中默認為‘‘,而在MySQL5.6之後的版本默認值為mysql_native_password.所以在新版本的MySQL中執行這個SQL是查詢不出任何數據,這也就是為什麽MaxScale不能加載MySQL用戶的原因了。不過有意思的是,在mariadb中plugin這一列目前還是一直保持默認為‘‘的狀態,所以如果maxscale的端連接的是Mariadb則不會出現問題。
原因找到了,那麽我們怎麽解決呢?
當然是修改maxscale中的這條SQL了,好在我們可以方便的獲得maxscale的源代碼。我們可以通過下面的方式獲得maxscale的源代碼
git clone https://github.com/mariadb-corporation/MaxScale.git
然後對
server/modules/authenticator/MySQLAuth/dbusers.c文件進行修改,把從第45行到51行的SQL,修改為:

define NEW_LOAD_DBUSERS_QUERY "
SELECT u.user, u.host, d.db, u.select_priv, u.%s \
FROM mysql.user AS u LEFT JOIN mysql.db AS d \
ON (u.user = d.user AND u.host = d.host) WHERE u.plugin = ‘mysql_native_password‘ %s \
UNION \
SELECT u.user, u.host, t.db, u.select_priv, u.%s \
FROM mysql.user AS u LEFT JOIN mysql.tables_priv AS t \
ON (u.user = t.user AND u.host = t.host) WHERE u.plugin = ‘mysql_native_password‘ %s"
然後再對修改後的源碼進行編譯安裝就可以了。最後如果大家對MySQL感興趣的話可以關註一下我之前所發布的MySQL兩門實戰課程。
《MySQL性能管理及架構設計》
《高性能可擴展MySQL數據庫設計及架構優化 電商項目》

MaxScale2.2如何自動加載MySQL用戶