Saturday, September 7, 2013

secure_authによってブロックされたMySQLアクセスおよびレプリケーション

Original post: http://anothermysqldba.blogspot.com/2013/09/mysql-access-and-replication-blocked-by.html

ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)

MySQLデータベースに接続しようとしていて、このエラーが表示された場合、あなたは有効な41byteハッシュパスワードを持っている必要があります。 あなたがわからない場合は、下記のSQLを実行してきた。 あなたは、16文字のパスワードを持っている場合、それらは古いパスワードです。

select Password from mysql.user;

以下は、私はMySQL 5.0からMySQLの5.6への移行の一環として、これを解決する方法です。

MySQL 5.0のサーバは古いプリ4.1パスワードや有効な41byteパスワードの混合物を持っていた。 MySQL 5.0のサーバーは、私は、レプリケーションのセットアップの一部としてMySQLのテーブルをダンプしないことにしました古いパスワードを使っていくつかの口座を持っていたので。 私は、mysqlデータベースを除いて、すべてのデータベースをダンプしました。 これは私が有効なのMySQL 5.6のテーブルの拡張を維持することを保証できます。

MySQLは5.6サーバは、簡単にインストールし、最大だったと私はダンプデータをロードしました。 移行の一部は、彼らが新しいデータベースを評価しながら、レプリケーションを使用することでした。 のMySQL 5.6サーバ上で私は、レプリケーションユーザーアカウントをテストしている間。 私が得た応答は、このページの上部にエラーが発生しました。 レプリケーションが有効なユーザーアカウントなしで、もちろん実行されません。 エラーログは私に、このエラーを与えていた理由はここにあります:
[ERROR] Slave I/O: error connecting to master '<user>@<hostname>:3306' - retry-time: 10 retries: 68, Error_code: 2049

MySQL 5.0のサーバ上のアカウントの簡単なレビューでは、新しいアカウントがあらかじめ4.1パスワードを使用して確立されたことを示した。 だから私は、有効な41バイトのパスワードにアカウントをアップグレードする必要がありました。

次のクエリでは、彼らは確かに古いパスワードが有効になっていなかったことを示した。 だから私はそれを無効にして、有効な41バイトのハッシュとしてパスワードを設定するには、再度ユーザーアカウントを更新する必要があります。

>SELECT @@session.old_passwords, @@global.old_passwords;
+-------------------------+------------------------+
| @@session.old_passwords | @@global.old_passwords |
+-------------------------+------------------------+
| 1 | 1 |
+-------------------------+------------------------+
1 row in set (0.00 sec)


>SET @@session.old_passwords = 0;
Query OK, 0 rows affected (0.00 sec)

>GRANT REPLICATION SLAVE ON *.* TO '<user>'@'<ip_address>' IDENTIFIED BY '<Password>';
Query OK, 0 rows affected (0.00 sec)

パスワードのチェックは今41byteパスワードとしてパスワードを示した。 私は、このセカンダリサーバからプライマリサーバに接続し、secure_authエラーを回避することができました。 複製が容易に接続し、問題が解決した。

今後私は、MySQL 5.6サーバにMySQL 5.0のユーザーアカウントを取得する必要がありました。 (私はセカンダリサーバ構築の一部としてそれらを飛ばさ以来)。

クライアントに関係なく、有効なパスワードのかどうか、ユーザーごとに再び金を​​設定する必要がありました。
だから私は、次のSQLを実行するためにそれらを指示した。 私はこれを行っている可能性が、私は自分のパスワードのすべてを知っている必要がありますし、そのは必要ありませんでした。

彼らのシステム内の各ユーザの。 すでに5.6システム上で有効なrootアカウントを持っているため、rootユーザーを行う必要はありません。

>SET @@session.old_passwords = 0;
>show grants for '<User>'@'<Host>';
各ユーザーが次のコマンドを実行するために必要なSQLを収集するには、次のように
SELECT CONCAT("SHOW GRANTS FOR '",User,"'@'",Host,"';") as sql_command from mysql.user;

それぞれの結果は、 "ショーの助成金"文を実行してから、与えられた文を実行与え。
文は次のようになります。

GRANT USAGE ON *.* TO 'bob'@'%.example.org' IDENTIFIED BY 'cleartext password';

レプリケーションは、その後作成とMySQL 5.6サーバ上のMySQLテーブルを移入。

もっとここで見つけることができます:
http://dev.mysql.com/doc/refman/5.6/en/password-hashing.html