Tagmysql

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  

Como configurar um servidor WEB com Ubuntu 14.04

Depois de criar uma VM com Ubuntu 14.04 no Azure, é hora de iniciar a instalação e configuração do mesmo, como esse será um servidor web vamos começar configurando o ssh, fail2ban e fazendo a instalação padrão do LAMP.

Antes de tudo

Antes de fazer qualquer outra coisa, é bom adquirir o hábito de atualizar os programas e também o sistema operacional:

$ sudo apt-get update
$ sudo apt-get upgrade -y

Configurando a Localidade (locale)

Se você não tem UTF-8 como sua localidade padrão, algumas coisas podem dar errado enquanto você configura seu sistema. Portanto, verifique a localidade em primeiro lugar:

# exibe o locale
locale -a  
# criaremos a localidade UTF-8 Inglês
sudo locale-gen en_US.UTF-8  
export LANG=en_US.UTF-8  
# caso existam outras localidades UTF-8 disponíveis, você pode simplesmente optar por utilizá-la.
# Por exemplo, 
export LANG=C.UTF-8  

Fazendo isso, você estará corrigindo e evitando problemas como:

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0x* in position *: ordinal not in range(128)

Para finalizar, você deve criar o arquivo /etc/default/locale e inserir os valores:

$ sudo -s
touch /etc/default/locale  
echo LANG="en_US.UTF-8" > /etc/default/locale  
echo LANGUAGE="en_US:en" >> /etc/default/locale  

Configurando SSH

A primeira alteração que devemos fazer, é trocar porta padrão do ssh.

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old  
sed 's/Port 22/Port 6543/' < /etc/ssh/sshd_config    >/etc/ssh/sshd_config.new  
mv /etc/ssh/sshd_config.new /etc/ssh/sshd_config  
service ssh restart  

Também é necessário verificar as configurações de PermitRootLogin e PermitEmptyPasswords.

grep "PermitRootLogin" /etc/ssh/sshd_config  

Deve retornar

PermitRootLogin no

grep "PermitEmptyPasswords" /etc/ssh/sshd_config  

Deve retornar

PermitEmptyPasswords no

Caso PermitRootLogin ou PermitEmptyPasswords retornem yes, basta entrar no seu editor de texto preferido e trocar para no. Após fazer essas alterações é necessário reiniciar o ssh.

sudo service ssh restart  

Liberando Endpoint no Azure

Após fazer essa alteração, não se esqueça de adicionar a porta 6543 no endpoint do azure, caso contrário, não será mais possível se conectar à sua VM.

Instalando e Configurando o Fail2Ban

Primeiro vamos instalar o Fail2Ban utilizando o comando abaixo

sudo apt-get -y install fail2ban  

Como você pode ver, a instalação é trivial. Agora podemos iniciar a configuração para nosso próprio uso.

Vamos editar o arquivo /etc/fail2ban/jail.local

e vamos deixá-lo da seguinte forma:

[DEFAULT]
ignoreip = 127.0.0.0/8  
bantime  = 1800  
findtime  = 1800  
maxretry = 5  
backend = gamin

[ssh]
enabled  = true  
port     = 6543  
filter   = sshd  
logpath  = /var/log/auth.log  
maxretry = 5

[vsftpd-notification]
enabled  = false  
filter   = vsftpd  
action   = sendmail-whois[name=VSFTPD, dest=adlersd@gmail.com]  
logpath  = /var/log/vsftpd.log  
maxretry = 5  
bantime  = 1800

[vsftpd-iptables]
enabled  = true  
filter   = vsftpd  
action   = iptables[name=VSFTPD, port=ftp, protocol=tcp]  
           sendmail-whois[name=VSFTPD, dest=adlersd@gmail.com]
logpath  = /var/log/vsftpd.log  
maxretry = 5  
bantime  = 1800  
failregex = vsftpd(?:\(pam_unix\))?(?:\[\d+\])?:.* authentication failure; .* rhost=<HOST>(?:\s+user=\S*)?\s*$  
\[.+\] FAIL LOGIN: Client "<HOST>"\s*$

Dessa maneira estaremos protegendo tanto nosso ssh na porta customizada(6543) como o servidor ftp, VSFTPD.

Finalmente, devemos reiniciar o fail2ban.

sudo service fail2ban restart  

Instalando e Configurando o LAMP

Vamos instalar o LAMP utilizando o tasksel, para instalá-lo basta utilizarmos o comando:

Feito isso, podemos prosseguir e instalar o LAMP, isso pode ser feito de duas maneiras utilizando o tasksel – podemos executar o comando sudo tasksel – e da maneira como vamos fazer nesse guia utilizando a sintaxe alternativa do tasksel.

Você pode instalar o LAMP em um único comando, usando o apt-get modo tasksel (não se esqueça do acento ^ no final):

sudo apt-get install lamp-server^  

Pronto, agora temos tudo o que vamos precisar para essa primeira parte.

Configurando o MySql

Primeiro, vamos reiniciar o serviço:

sudo service mysql restart  

Vamos iniciar as configurações:

sudo /usr/bin/mysql_secure_installation  

O prompt irá pedir a sua senha de root atual, porém, como acabamos de fazer a instalação, basta deixá-lo em branco pressionando enter.

Enter current password for root (enter for none):  
OK, successfully used password, moving on...  

Em seguida, a mensagem irá perguntar se você deseja definir uma senha de root. Vá em frente e escolha Y e siga as instruções.

By default, a MySQL installation has an anonymous user, allowing anyone  
to log into MySQL without having to have a user account created for  
them.  This is intended only for testing, and to make the installation  
go a bit smoother.  You should remove them before moving into a  
production environment.

Remove anonymous users? [Y/n] y  
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This  
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y  
... Success!

By default, MySQL comes with a database named 'test' that anyone can  
access.  This is also intended only for testing, and should be removed  
before moving into a production environment.

Remove test database and access to it? [Y/n] y  
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far  
will take effect immediately.

Reload privilege tables now? [Y/n] y  
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MySQL  
installation should now be secure.

Thanks for using MySQL!  

Agora, vamos criar um usuário:

Será necessário que você digite a senha que você definiu como senha de root para a sua instalação do MySql.

mysql -u root -p  
CREATE DATABASE novoBancoDeDados;  
CREATE USER novoUsuario@% IDENTIFIED BY 'novaSenha';  
GRANT ALL PRIVILEGES ON novoBancoDeDados.* TO novoUsuario@%;  
FLUSH PRIVILEGES;  
exit  

Configurando o Php

Nós precisamos fazer uma pequena mudança na configuração do php. Abra /etc/php.ini:

Encontre a linha, cgi.fix_pathinfo = 1, e mudar de 1 para 0.

cgi.fix_pathinfo=0  

Também pode ser necessário alterar os valores de algumas variáveis de ambiente.

date.timezone = America/Sao_Paulo  
short_open_tag = Off  
expose_php = off  
max_execution_time = 60  
memory_limit = 256M  
post_max_size = 128M  
upload_max_filesize = 128M  

Agora basta reiniciar o apache, para que as alterações entrem em vigor.

sudo service apache2 restart  

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


		
	

Como procurar uma coluna em todo banco de dados

Algumas vezes é preciso buscar em todo o banco de dados, por uma – ou várias – coluna(s). Quando você precisar procurar por um nome de uma coluna que poderia estar em qualquer tabela em um banco de dados saiba que existe uma maneira rápida e fácil de encontrar essa informação, e a sintaxe é:

Como procurar por uma coluna

SELECT DISTINCT TABLE_NAME  
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME = 'colunaNomeA'
        AND TABLE_SCHEMA='SeuBancoDeDados';

Como procurar por uma coluna por parte do nome

SELECT DISTINCT TABLE_NAME  
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME LIKE 'coluna%'
        AND TABLE_SCHEMA='SeuBancoDeDados';

Como procurar por várias colunas

SELECT DISTINCT TABLE_NAME  
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('colunaNomeA','ColunaNomeB')
        AND TABLE_SCHEMA='SeuBancoDeDados';

Como remover as categorias sem posts

Nesse post você irá aprender como remover as categorias sem posts, ou seja, as categorias não utilizadas do seu banco de dados do wordpress.
Claro que você pode utilizar plugins como WP-Optimize or Optimize DB. Mas não é a minha intenção, então, vamos fazer utilizando SQL mesmo.

Por categorias você deve entender: Categorias dos Posts, Tags dos Posts ( marcações ) e categorias dos links. Todas elas serão removidas, desde que, estejam vazias.

Uma vez que esse procedimento não tem volta, por favor, faça um backup da sua base de dados antes de qualquer coisa.

Como listar as categorias vazias?

Antes de remover as categorias, para que você possa vê-las vamos utilizar um SELECT para exibirmos apenas as categorias que não possuem nenhum post, tag, ou link vinculados.

SELECT  
    taxonomy.count AS quantidade,
    term.name AS categoria
FROM  
    wp_terms AS term,
    wp_term_taxonomy AS taxonomy
WHERE  
    term.term_id = taxonomy.term_id AND
    taxonomy.count = 0
ORDER BY  
    taxonomy.count

Como remover as categorias vazias?

Seria bom se você conferisse o resultado da query acima, para garantir, caso você não queira conferir, basta executar a query abaixo. Dessa forma todas as categorias vazias serão removidas do seu banco de dados.

DELETE term, taxonomy  
FROM  
    wp_terms AS term,
    wp_term_taxonomy AS taxonomy
WHERE  
    term.term_id = taxonomy.term_id AND
    taxonomy.count = 0

O que eu faço agora?

Agora que você já deletou as categorias, é bom otimizar as tabelas que nós utilizamos em nossa query, tanto para liberar espaço livre quanto para melhorar o desempenho. Com a query abaixo podemos otimizar nossas duas tabelas.

OPTIMIZE TABLE `wp_terms` , `wp_term_taxonomy`  

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é…

© 2017 Adler Dias

Theme by Anders NorénUp ↑