Categorymysql

Acesso remoto ao MySQL – Access denied for user ‘root’@’localhost’

Estava testando o laravel homestead, e surgiu a necessidade de acessar o MySql a partir da minha máquina local. Quando tentei acessar utilizando o usuário e senha do banco apareceu o erro: ERRO 1045: ACCESS DENIED FOR USER: 'ROOT@LOCALHOST', mas, como vocês poderão ver, solucioná-lo é tão fácil quanto parece.

Como habilitar o acesso remoto MySQL

Acesso remoto ao MySQL do laravel homestead é desabilitado por padrão por razões de segurança. No entanto, pode haver momentos em que é necessário para habilitá-lo para fornecer acesso a partir de um local remoto ou simplesmente da sua máquina de desenvolvimento. Este artigo irá descrever o processo em detalhe, e é destinado a usuários familiarizados com SSH e MySQL.

Conecte-se ao servidor MySQL

O laravel homestead MySQL é acessado através de SSH. Uma vez que a conexão com o servidor foi realizado, um segundo comando fornece acesso ao servidor MySQL. O procedimento para estabelecer a ligação é como se segue:

Conecte-se ao servidor via SSH. Em seguida, conecte com o MySQL. Isso envolve a inserção do nome de usuário e senha dada especificamente para uso MySQL. O comando para iniciar a conexão é:

mysql -u root -p  

Digite a senha do MySQL quando solicitado. No caso do laravel homestead a senha é secret.

Habilitar acesso remoto ao MySQL de um IP externo

O comando a seguir irá permitir o acesso ao banco de dados MySQL a partir de um endereço IP remoto:

mysql> GRANT ALL PRIVILEGES ON *.* TO usuario@HOST IDENTIFIED BY 'senha';  

Substitua o usuario, o HOST e a senha nesse comando com os dados relevantes.
O HOST é um endereço de ip válido, por exemplo: 192.168.1.10
O usuário no laravel homestead é root e senha é secret

Habilitar acesso remoto ao MySQL de qualquer IP

Se um usuário está em um endereço IP dinâmico não será possível utilizar o método acima. Para fazer isso, use '%' no lugar do ip. Isso não é recomendado em ambientes de produção, porque é menos seguro, uma vez que permite que a conexão seja estabelecida de qualquer lugar.

mysql> GRANT ALL PRIVILEGES ON *.* TO usuario@'%' IDENTIFIED BY 'senha';  

Novamente, substitua o usuario e senha nesse comando com os dados relevantes.
O usuário no laravel homestead é root e senha é secret

Recarregar os Privilégios

Para que as novas permissões funcionem, após utilizar o grant para atribuir as permissões de acesso, é necessário recarregar os privilégios.

mysql> flush privileges;  

Agora você já pode conectar-se à seu mysql sem se deparar com o ERRO 1045: ACCESS DENIED FOR USER.

Até.

Como utilizar o gzip com mysql para importar/exportar backups

Se você está armazenando qualquer coisa em bancos de dados MySQL que você não quer perder, é muito importante fazer backups regulares de seus dados afim de evitar perda de dados. Este tutorial tem como objetivo mostrar como você pode fazer o backup e compactá-lo – bem como restaurá-lo – assim fica mais fácil movê-lo para um outro servidor.

Como fazer o backup do MySql

Como fazer backup de um único banco de dados:

Este exemplo tem um backup do banco de dados teste e gera a saída para o arquivo teste.sql

# mysqldump -u root -pSENHA teste > teste.sql

# mysqldump -u root -p[senha_de_root] [nome_do_banco] > nome_do_arquivo.sql

Como fazer backup de vários bancos de dados:

Por exemplo, se você quiser ter backup dos banco de dados producao e teste, executar o mysqldump como mostrado abaixo:

# mysqldump -u root -pSENHA --databases producao teste > producao_teste.sql

Você pode verificar se o arquivo gerado contém os dois bancos de dados utilizando o comando a seguir

# grep -i "Current database:" /tmp/producao_teste.sql
-- Current Database: `producao`
-- Current Database: `teste`

Como fazer backup de todos bancos de dados:

O exemplo a seguir faz uma cópia de segurança de todos os banco de dados da instância do MySQL.

# mysqldump -u root -pSENHA --all-databases > /tmp/todos_bancos.sql

Como fazer backup de uma tabela específica do banco de dados:

Neste exemplo, será feito o backup apenas da tabela clientes da base de dados teste.

# mysqldump -u root -pSENHA teste clientes > /tmp/teste_clientes.sql

Como exportar um banco de dados e compactar com Gzip

No exemplo a seguir, vamos fazer o backup do banco teste e em seguida redirecionar a saída para o gzip que vai compactá-lo para o arquivo teste.sql.gz

# mysqldump -u root -pSENHA teste | gzip > teste.sql.gz

Como restaurar o backup do MySql

Restaurar o banco de dados

Neste exemplo, para restaurar o banco teste, é necessário executar mysql com < como mostrado abaixo. Quando você estiver restaurando o backup em uma outra instância do banco de dados, certifique-se de criar o banco de dados teste – em nosso exemplo – antes de poder executar a restauração.

Para criar o banco você deve executar os seguintes comandos:

# mysql -u root -pSENHA

mysql> create database teste;  
Query OK, 1 row affected (0.06 sec)  

E, para efetuar a restauração

# mysql -u root -pSENHA teste < /tmp/teste.sql

# mysql -u root -p[root_password] [database_name] < arquivodebackup.sql

Como importar um banco de dados e compactado com Gzip

No exemplo a seguir, vamos descompactar o arquivo teste.sql.gz. e, redirecionar a saída para o mysql, definindo que a restauração do arquivo deve ser feita no banco teste.

gunzip < teste.sql.gz | mysql -u user -pSenha teste  

SQLSTATE[HY000]: General error: 29 File ‘file.csv’ not found (Errcode: 13)

O que é o AppArmor

O AppArmor permite que o administrador do sistema para associar a cada programa um perfil de segurança que restringe os recursos do programa.

Verificando se o AppArmor realmente é o problema

Atualemnte o Ubuntu vem com o AppArmor ativado e o perfil do MySQL pode estar sendo executado em modo forçado por padrão. Você pode verificar isso executando o comando sudo aa-status da seguinte forma:

$ sudo aa-status
apparmor module is loaded.  
5 profiles are loaded.  
5 profiles are in enforce mode.  
   /sbin/dhclient
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/lib/connman/scripts/dhclient-script
   /usr/sbin/mysqld
   /usr/sbin/tcpdump
0 profiles are in complain mode.  
2 processes have profiles defined.  
2 processes are in enforce mode.  
   /sbin/dhclient (1088) 
   /usr/sbin/mysqld (26214) 
0 processes are in complain mode.  
0 processes are unconfined but have a profile defined.  

Se o mysqld está incluído no modo forçado, então provavelemente você acabou de encontrar o culpado por negar a acesso e/ou gravação. As entradas também seriam escritas em seu log quando o AppArmor bloqueia as gravações e/ou acessos.

Como alterar o perfil do MySql para aceitar o acesso/gravação

O que você pode fazer é editar /etc/apparmor.d/usr.sbin.mysqld e adicionar o path de onde o arquivo se encontra ou onde deverá ser exportado, por exemplo: /data/ e /data/* perto da parte inferior da seguinte forma:

sudo vi /etc/apparmor.d/usr.sbin.mysqld  
/usr/sbin/mysqld {
...
/var/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock w,
/data/ r,
/data/* rw,
}

Agora só resta reiniciar o AppArmor

$ sudo /etc/init.d/apparmor reload

ERROR 2006 (HY000) at line 27652: MySQL server has gone away

Enquanto estava usando um script para substituir o meu banco de dados local com o banco de dados de produção, eu me deparei com o seguinte erro:

ERROR 2006 (HY000) at line 27652: MySQL server has gone away

O primeiro passo é verificar o tamanho da variável max_allowed_packet

  
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 16777216 |
+--------------------+----------+

O valor da variável max_allowed_packet está definido como 16777216, isso quer dizer que em nosso /etc/mysql/my.cnf ela está definica com 16M (16777216÷1024÷1024).

Como resolver ERROR 2006 (HY000) at line 27652: MySQL server has gone away

Para resolvermos esse problema, vamos alterar o valor da variável max_allowed_packet, no arquivo /etc/mysql/my.cnf

  
$ sudo vim /etc/mysql/my.cnf

Vamos alterar para 128M

  
...
[mysqld]
...
max\_allowed\_packet    = 128M  
...
[mysqldump]
max\_allowed\_packet    = 128M  
...

Caso você também queira aumentar o tempo de timeout, adicione abaixo do [mysqld]

  
...
[mysqld]
...
wait_timeout = 6000  
...

Agora é só reiniciar o serviço do mysql

$ sudo service mysql restart


		
	

Mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.

mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD(‘your_existing_password’). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file

Você pode verificar se a senha do seu usuário foi criada no padrão antigo utilizando o comando a seguir (com uma conta que tenha acesso a essa tabela).

  
SELECT `User`, `Host`, Length(`Password`) FROM mysql.user  

Esse comando vai te mostrar o comprimento das senhas e irá retornar 16 para contas com senhas no padrão antigo e 41 para as contas com senhas novas (e, 0 para contas com nenhuma senha).

Se você tiver permissão, para recriar a senha no padrão “novo”, você pode utilizar as queries a seguir:

  
SET PASSWORD FOR 'User'@'Host'=PASSWORD('sua_senha');  
FLUSH Privileges  

Caso você não possa fazer isso, você pode tentar utilizar as queries abaixo e alterar o seu php para:

  
SET SESSION old_passwords=FALSE;  
SET PASSWORD = PASSWORD('[your password]');  
  
define('CLIENT_LONG_PASSWORD', 1);  
mysql_connect('[endereco_servidor]', '[nome_de_usuario]', '[sua_senha]', false, CLIENT_LONG_PASSWORD);  

abraço,
até…

© 2018 Adler Dias

Theme by Anders NorénUp ↑