MySQL5.5から5.6にアップデートした後、mysqlcheckをしようとするとerror: 2049が発生した。

# mysqlcheck --check-upgrade --all-databases --auto-repair  --verbose -p
mysqlcheck: Got error: 2049: Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled) when trying to connect

mysqlコマンドでも同じくerror: 2049が発生する。
どうやら、rootのパスワードの格納が古いハッシュで、secure_authが有効コンパイルされたクライアントからはアクセスできないようだ。

mysqlコマンドでも接続できないので、どうしよう。
ということで、 mysqlのrootのパスワードを再設定することにした。

# /etc/init.d/mysqld stop
# mysqld_safe --skip-grant-tables 

CTRL+zでサスペンドしてbgでバックグラウンドへ。
# bg

# mysql -u root mysql

無事mysqlに接続できた!

今度はパスワードをリセットする。set password for...の構文は--skip-grant-tablesの場合は利用できないので、update文でmysql.userテーブルを更新する。

エラーになる。
set password for root@localhost=password('NewPassword');
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

こちらは成功する。
update user set password=PASSWORD('NewPassword') where user='root' and host='localhost';

これで、mysqld_safeを終了する。終了方法がわからないので...killしてみる...

 killall -9 mysqld_safe

mysqldをスタートさせて、もう一度mysql、mysqlcheckをやってみるとうまく動いた。

/etc/init.d/mysqld start
#  mysqlcheck --check-upgrade --all-databases --auto-repair  --verbose -p
Enter password:
# Connecting to localhost...
db01.ms_commentmeta                                OK
db01.ms_comments                                   OK
db01.ms_en_commentmeta                             OK
・
・
・
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
# Disconnecting from localhost...