MySQL5.6をスレーブに、old_passwords = 1なMySQL5.0をマスターにしてレプリケーションを組もうとすると、
エラる。
あれ、perrorが2049レポートしてくれない(´・ω・`)
マニュアルには記載ある。
http://dev.mysql.com/doc/refman/5.6/en/error-messages-client.html#error_cr_secure_auth
クライアントオプションのsecure_authが有効だから、
サーバーに格納されてるユーザーのパスワードが古い16桁形式だと接続できない。
というか、クライアントが接続を拒否する。
取り敢えずマスター側のサーバーで
これで接続できる。
いきなり上書きがアレなら、
5.6接続用に新しくREPLICATION SLAVE権限持ちのユーザーを作る。
ちなみに、↑のSELECT見ると判る感じで、古いパスワードは16桁、
新しい(といっても随分昔からだけど)パスワードは41桁で先頭が*です。
gdbでちょこちょこ調べてみたけど、
I/Oスレッドはサーバーのsecure-authもmy.cnfのsecure-authも見てくれなくて、
暗黙のデフォルト値(secure-auth=1)を使っているぽいので、
あとで暗黙のデフォルト値書き換えて試してみますかね。
ネタ提供のけんじおじさん++
今日もごちそうさまです(*-人-)
【2013/05/01 14:48】
今更になって気付いたんですが、タイトルに反してMySQL5.1だろうと5.5だろうと5.6だろうと
レプリケーション用のユーザーが16桁パスワードで設定されている場合は同じエラーになります。
名が体を現さないエントリになってしまった。。
あと、mysql_initがデフォルトでsecure_auth = TRUEを押し込んでいたので、
ここを直したら16桁パスワードでもスレーブになれるようになりました。ビバ。
【2013/05/21 12:04】
そっか、perrorはサーバー側のエラーコードを解釈してくれるやつで、
エラーコード2000番台はクライアント側のエラーコードだからperrorがInvalidって言うんだ。。
mysql56> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: localhost
Master_User: replicator
Master_Port: 64050
Connect_Retry: 60
Master_Log_File: bin.000019
Read_Master_Log_Pos: 820
Relay_Log_File: relay.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: bin.000019
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 820
Relay_Log_Space: 120
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 2049
Last_IO_Error: error connecting to master 'replicator@localhost:64050' - retry-time: 60 retries: 1
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1050
Master_UUID:
Master_Info_File: /usr/mysql/5.6.11/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp: 130501 13:24:13
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.00 sec)
エラる。
$ perror 2049
Illegal error code: 2049
あれ、perrorが2049レポートしてくれない(´・ω・`)
マニュアルには記載ある。
http://dev.mysql.com/doc/refman/5.6/en/error-messages-client.html#error_cr_secure_auth
クライアントオプションのsecure_authが有効だから、
サーバーに格納されてるユーザーのパスワードが古い16桁形式だと接続できない。
というか、クライアントが接続を拒否する。
取り敢えずマスター側のサーバーで
mysql50> SET SESSION old_passwords = 0;
Query OK, 0 rows affected (0.00 sec)
mysql50> SET PASSWORD FOR replicator = PASSWORD('replicator');
Query OK, 0 rows affected (0.00 sec)
mysql50> SELECT user, host, password FROM mysql.user;
+--------------+-----------------+-------------------------------------------+
| user | host | password |
+--------------+-----------------+-------------------------------------------+
| root | localhost | |
| root | dev-personal-04 | |
| root | 127.0.0.1 | |
| mysqld_multi | localhost | *25538D365EF36670224773C86161F9D7EEAC49F9 |
| replicator | % | *E6FA4B5E283079702D46597DFCD2766E7BF96B0E |
+--------------+-----------------+-------------------------------------------+
5 rows in set (0.00 sec)
これで接続できる。
いきなり上書きがアレなら、
mysql50> set session old_passwords = 0;
Query OK, 0 rows affected (0.00 sec)
mysql50> GRANT REPLICATION SLAVE ON *.* TO replicator56 IDENTIFIED BY 'replicator';
Query OK, 0 rows affected (0.00 sec)
mysql50> SELECT user, host, password FROM mysql.user;
+--------------+-----------------+-------------------------------------------+
| user | host | password |
+--------------+-----------------+-------------------------------------------+
| root | localhost | |
| root | dev-personal-04 | |
| root | 127.0.0.1 | |
| replicator56 | % | *E6FA4B5E283079702D46597DFCD2766E7BF96B0E |
| mysqld_multi | localhost | *25538D365EF36670224773C86161F9D7EEAC49F9 |
| replicator | % | 755c4ac71c32381e |
+--------------+-----------------+-------------------------------------------+
6 rows in set (0.00 sec)
5.6接続用に新しくREPLICATION SLAVE権限持ちのユーザーを作る。
ちなみに、↑のSELECT見ると判る感じで、古いパスワードは16桁、
新しい(といっても随分昔からだけど)パスワードは41桁で先頭が*です。
gdbでちょこちょこ調べてみたけど、
I/Oスレッドはサーバーのsecure-authもmy.cnfのsecure-authも見てくれなくて、
暗黙のデフォルト値(secure-auth=1)を使っているぽいので、
あとで暗黙のデフォルト値書き換えて試してみますかね。
ネタ提供のけんじおじさん++
今日もごちそうさまです(*-人-)
【2013/05/01 14:48】
今更になって気付いたんですが、タイトルに反してMySQL5.1だろうと5.5だろうと5.6だろうと
レプリケーション用のユーザーが16桁パスワードで設定されている場合は同じエラーになります。
名が体を現さないエントリになってしまった。。
あと、mysql_initがデフォルトでsecure_auth = TRUEを押し込んでいたので、
ここを直したら16桁パスワードでもスレーブになれるようになりました。ビバ。
$ diff -c sql-common/client.c sql-common/client.c.org
*** sql-common/client.c 2013-05-01 14:08:10.810764039 +0900
--- sql-common/client.c.org 2013-04-05 21:27:18.000000000 +0900
***************
*** 1687,1694 ****
*/
mysql->reconnect= 0;
! // mysql->options.secure_auth= TRUE;
! mysql->options.secure_auth= FALSE;
return mysql;
}
--- 1687,1693 ----
*/
mysql->reconnect= 0;
! mysql->options.secure_auth= TRUE;
return mysql;
}
mysql50> select user, host, password from user;
+--------------+-----------------+-------------------------------------------+
| user | host | password |
+--------------+-----------------+-------------------------------------------+
| root | localhost | |
| root | dev-personal-04 | |
| root | 127.0.0.1 | |
| mysqld_multi | localhost | *25538D365EF36670224773C86161F9D7EEAC49F9 |
| replicator | % | 755c4ac71c32381e |
+--------------+-----------------+-------------------------------------------+
5 rows in set (0.00 sec)
mysql> change master to master_host='localhost', master_port = 64050, master_user='replicator', master_password='replicator', master_log_file='bin.000022', master_log_pos = 591;
Query OK, 0 rows affected, 2 warnings (0.05 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: localhost
Master_User: replicator
Master_Port: 64050
Connect_Retry: 60
Master_Log_File: bin.000022
Read_Master_Log_Pos: 591
Relay_Log_File: relay.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: bin.000022
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 591
Relay_Log_Space: 410
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1050
Master_UUID:
Master_Info_File: /usr/mysql/nosecure_5.6.11/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.00 sec)
【2013/05/21 12:04】
そっか、perrorはサーバー側のエラーコードを解釈してくれるやつで、
エラーコード2000番台はクライアント側のエラーコードだからperrorがInvalidって言うんだ。。