Tenho um script para instalar o MySQL 5.7 e rodar testes no Travis CI (rodando Ubuntu 12).
O script contém essas linhas, para instalar o MySQL em modo não interativo, sem senha:
add-apt-repository 'deb http://repo.mysql.com/apt/ubuntu/ precise mysql-5.7-dmr'
apt-get update
echo mysql-community-server mysql-community-server/root-pass password "" | debconf-set-selections
echo mysql-community-server mysql-community-server/re-root-pass password "" | debconf-set-selections
DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold -q -y install mysql-server libmysqlclient-dev
A instalação é executada sem problemas e, usando o mysql
utilitário de linha de comando, posso me conectar ao servidor sem senha:
mysql --user=root -e "SELECT VERSION();"
+-----------+
| VERSION() |
+-----------+
| 5.7.8-rc |
+-----------+
Agora, se eu tentar conectar usando PHP PDO :
new PDO('mysql:host=localhost', 'root', '');
Estou tendo o erro a seguir:
SQLSTATE[HY000] [1045] Acesso negado para o usuário 'root'@'localhost' (usando a senha: NO)
Eu tentei permitir root
a conexão de qualquer host:
GRANT ALL ON *.* to root@'%' IDENTIFIED BY '';
FLUSH PRIVILEGES;
Sem sucesso.
Qual pode ser o problema?
Encontrei a resposta no manual do MySQL, Pluggable Authentication :
O pacote MySQL cria um
root
usuário usando oauth_socket
plug-in de autenticação, portanto, apenas conexões por meio de um soquete são permitidas e o nome de usuário da conta do Linux também é verificado.O
mysql
comando usa um soquete por padrão e é executado comoroot
no meu script, portanto, foi permitido conectar.De acordo com o manual do PHP , uma conexão PDO MySQL
localhost
também usa um soquete; mas o PHP é executado como um usuário sem privilégios, então a conexão é recusada peloauth_socket
plugin.Corrigi meu script adicionando esta linha:
E agora funciona bem.
Você precisa desativar o SELinux executando o comando abaixo: