2006/10/13

phpMyAdmin 登入時出現 MySQL #1251 錯誤探究

安裝 phpMyAdmin 之後,如果登入 MySQL 4.1 以上的 Server 時,有時候會出現錯誤訊息如下:
#1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client
參考 MySQL 官方網站上的說明: http://dev.mysql.com/doc/refman/4.1/en/old-client.html
照著指示去調整登入帳號的密碼就可以解決此一問題。

可是為什麼會出現這種錯誤呢?
是 phpMyAdmin 沒設定好?還是伺服器上的 PHP 沒裝好?還是有其他原因?

先說明一下系統環境:
Server AA: FreeBSD 4.9, MySQL 4.0.18, PHP 4.4.4
Server BB: FreeBSD 5.2.1, MySQL 4.1.11, PHP 4.3.11
phpMyAdmin 裝在 Server AA 上,版本是 2.9.0

情境說明:
從 Server AA 上的 phpMyAdmin 存取 Server BB 上的 MySQL,會出現 #1251 錯誤(參考官方說明即可解決)。
可是我在 Server BB 上也有跑 php 程式,用同樣的帳號、密碼去存取 Server BB 上的 MySQL Server,卻沒有出現 #1251 錯誤。
為什麼 Server AA 上的 phpMyAdmin 就會有問題?phpMyAdmin 也是用 php 寫的,有什麼不同嗎?

問題探究:
1. 我首先確認 phpMyAdmin 的資料庫連線是不是有什麼特別之處?難道不是用 mysql_connect() 或 mysql_pconnect() 這兩個函數嗎?
可是看 mysql.dbi.lib.php 和 mysqli.dbi.lib.php 這兩個檔案,並沒有特別之處,是套用標準 PHP 裡的 mysql 函式,因此應該與 phpMyAdmin 無關。
2. 接著在 Server AA 跟 Server BB 上寫個 php 程式,直接用 mysql_connect() 去存取 Server BB 上的 MySQL,
結果發現 Server BB 上的 PHP 可以存取,Server AA 上的 PHP 無法存取,會出現 #1251 錯誤。
=> 所以 #1251 錯誤與 phpMyAdmin 無關,而是 PHP 本身就有問題。
3. 接著在 Server 上直接下 command,利用 mysql -h Server AA(or Server BB) -u user -p 直接存取看看
結果發現在 Server BB 上可以正常登入,但是 Server AA 上卻無法登入,一樣出現 #1251 錯誤。
=> 如此看來應該與 PHP 無關,問題應該是出在 mysql 上。
4. 最後確認 Server 上的 mysql-client(用 pkg_info | grep mysql 來看)
Server AA: mysql-client-4.0.18_1
Server BB: mysql-client-4.1.11_1
=> 原來問題是出在這: Server AA 上的 mysql-client 版本過舊,因此從 Server AA 連到 Server BB 會有 #1251 錯誤。
5. 再確認一次:
我從另一台 Server CC (mysql-client-4.1.16_1) 用 mysql 連線到 Server BB,可正常登入,沒有出現 #1251 錯誤。
從 Server DD (mysql-client-4.0.24) 連,一樣出現 #1251 錯誤。

結論:
#1251 錯誤與 Server 上的 mysql-client 套件有關,如果無法升級 Server 上的 mysql-client 套件,就只有照著官方說明的方式去調整 MySQL 帳號的密碼。

沒有留言:

張貼留言