Em resumo, no MariaDB
UPDATE mysql.user SET plugin = 'mysql_native_password',
Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
onde você substitui NEWPASSWORD pela senha desejada e tudo mais literalmente.
O problema aqui é que, quando o MariaDB ou o MySQL são instalados / atualizados (especialmente se em algum momento a raiz estiver definida sem uma senha), na tabela Usuários, a senha estará realmente vazia (ou ignorada) e o login dependerá do usuário do sistema correspondente. para um usuário MySQL. Você pode testar isso da seguinte maneira alternando para a raiz do sistema e digite:
mysql -uroot -p
Em seguida, insira nenhuma senha ou a senha errada . Você provavelmente será autorizado a entrar. (Você pode até conseguir fazer login na raiz do unix simplesmente # mysql
porque a senha é irrelevante e o usuário está definido).
Então oque está acontecendo? Bem, se você fizer login como root e faça o seguinte:
select User,host,plugin from mysql.user;
+----------------+-----------+-----------------------+
| User | host | plugin |
+----------------+-----------+-----------------------+
| root | localhost | auth_socket |
+----------------+-----------+-----------------------+
você notará auth_socket
(que pode ler unix_socket
no MariaDB). Esses soquetes ignoram senhas e permitem ao usuário Unix correspondente sem uma verificação de senha. É por isso que você pode efetuar login com root, mas não com um usuário diferente.
Portanto, a solução é atualizar os Usuários para não usar auth_socket/unix_socket
e definir corretamente uma senha.
No MariaDB (<10.2, veja os comentários abaixo), que está na versão 16 do Ubuntu a partir de 2017, isso deve ser suficiente. NEWPASSWORD é sua senha. mysql_native_password
você digita literalmente.
UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
(É possível que definir o plug-in como vazio funcione. YMMV. Eu não tentei isso. Portanto, essa é uma alternativa.)
UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
De outra forma:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';
Então
FLUSH PRIVILEGES;
Para o registro, a solução que envolve excluir o usuário e recriá-lo com '%' me deixou totalmente bloqueado do banco de dados e pode causar outros problemas, a menos que você obtenha a grant
declaração exatamente correta - mais fácil simplesmente atualizar a raiz que você já possui.
Na minha experiência, o problema ocorre apenas com o usuário root, pois outros usuários serão adicionados manualmente e não fazem parte de uma instalação / atualização inicial.