Friday, September 6, 2013

Acesso MySQL e replicação bloqueada por secure_auth

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)

Se você já tentou se conectar a um banco de dados MySQL e você verá este erro, então você precisa ter uma senha de hash 41byte válido. Se você não tem certeza que você tem executar o SQL abaixo. Se você tem 16 senhas com caracteres que são senhas mais velhos.

select Password from mysql.user;

O seguinte é como eu resolvi isso como parte de uma migração do MySQL 5.0 para o MySQL 5.6.

O servidor MySQL 5.0 tinha uma mistura dos mais velhos pré 4.1 e senhas 41byte válidos. Como o servidor MySQL 5.0 tinha algumas contas com as senhas mais velhos que eu decidi não descarregar a tabela MySQL como parte da configuração de replicação. Eu fiz despejar todos os bancos de dados, exceto o banco de dados mysql. Isso permitirá que garantiu que eu iria manter os MySQL 5.6 melhorias tabela válidos.

O servidor MySQL 5.6 instalado facilmente e foi para cima e eu carreguei os dados de despejo. Parte da migração era usar replicação, enquanto eles avaliaram o novo banco de dados. Enquanto no servidor MySQL 5.6 Eu testei a conta de usuário de replicação. A resposta que recebi foi o erro no topo desta página. Replicação não irá correr naturalmente sem uma conta de usuário válida. É por isso que os logs de erro foi me dando esse erro:
[ERROR] Slave I/O: error connecting to master '<user>@<hostname>:3306' - retry-time: 10 retries: 68, Error_code: 2049

Uma rápida revisão da conta no servidor MySQL 5.0 mostrou que a nova conta foi criada com a senha pré 4.1. Então, eu precisava atualizar a conta para uma senha de 41 byte válido.

A consulta a seguir mostrou que eles realmente têm senhas antigas habilitado. Então eu tenho que desativar isso e atualizar a conta de usuário novamente para definir a senha como um 41 byte de hash válido.

>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)

A verificação da senha mostrou a senha como a senha 41byte agora. Eu estava presente capaz de se conectar ao servidor primário do servidor secundário e evitar o erro secure_auth. replicação conectado com facilidade e problema foi resolvido.

Daqui para frente eu precisava para obter o MySQL 5.0 contas de usuários no servidor MySQL 5.6. (Já que eu saltei-los como parte da construção do servidor secundário.)

O cliente precisava definir as bolsas novamente para cada usuário, independentemente de senha válida ou não.
Então, eu instruí-los para executar o seguinte sql. Eu poderia ter feito isso, mas eu preciso saber todas as suas senhas e que não era necessário.

Para cada usuário em seu sistema. Você não tem que fazer o root porque você já tem uma conta root válido no sistema 5.6.

>SET @@session.old_passwords = 0;
>show grants for '<User>'@'<Host>';
Para reunir o sql necessários para cada usuário execute o seguinte:
SELECT CONCAT("SHOW GRANTS FOR '",User,"'@'",Host,"';") as sql_command from mysql.user;

Para cada resultado deu executar a instrução "mostra doações" e, em seguida, executar a instrução dada.
As declarações devem ser semelhante ao seguinte:

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

Replicação então criado e preenchido a tabela MySQL no servidor MySQL 5.6.

Mais pode ser encontrado aqui:
http://dev.mysql.com/doc/refman/5.6/en/password-hashing.html