resolvendo mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication

Problema do dia:

Servidor mysql usado a quase 10 anos, que mesmo tendo sido atualizado a versão, os usuários legados continuam com a hash antigamente utilizada (hoje chamada de old_password)

Para estes casos, basta trocar o tipo de autenticação na session, reescrever a senha e um flush nos privilegios.

 

Imagem docker lemp/lnmp de fácil uso

Eu uso docker para ambiente de desenvolvimento, logo não preciso de tamanha complexidade com várias imagens dependentes montagem de diretórios cruzados etc.

Para esta finalidade basicamente preciso de um servidor lemp (ou lnmp), que é sigla para “Linux, (e)nginx, mysql e php” e um php myadmin.

Assim sendo criei uma imagem disponível publicamente no docker hub para quem precisa desta finalidade.

Para subir a aplicação com esta imagem, basta criar um docker-composer.yml na raiz de seu projeto com o conteúdo abaixo:

E depois rodar o comando:

A aplicação estará acessível em http://localhost/ e o PHPMyAdmin em http://localhost/pma/ simples assim.

Já está pré-configurado e com todos os grants necessários uma base de dados com o nome de “app” (sem as aspas) para uso na aplicação.

Como uso essa imagem nos meus projetos venho sempre aprimorando ela, então o changelog vai ficar sempre disponível em https://hub.docker.com/r/fbraz3/lnmp/

 

Mysql ERROR 1452 – Cannot add or update a child row

Estava exportando um dump de um cliente e me reparei com esse erro no mysql:

Este erro é muito comum quando o dump é editado manualmente e é inserido/editado algum dado que não está em conformidade com a chave estrangeira.
Para forçar um import, basta desabilitar a checagem de integridade das chaves estrangeiras inserindo a liha abaixo no início do arquivo de import:

Só não se esquecendo que isso resolve a questão do import, mas não dos dados, então é sempre importante revisar os dados após o procedimento pra localizar a raiz do problema.

Ordenando valores no mysql usando casting

Disponho de uma tabela de controle de IP’s dos servidores, de modo que possa saber rapidamente qual IP possui cada servidor, qual ip será usado ao efetuar deploy de uma nova vm, serviços, etc.

Estava tendo um problema ao editar essa tabela, pois ao efetuar uma consulta pelo range (no caso trabvalho com vários /24), os valores vinham desordenados, abaixo a query e resulta para melhor compreensão:

Resultado:

XXX.XX.XXX.0
XXX.XX.XXX.1
XXX.XX.XXX.10
XXX.XX.XXX.100
XXX.XX.XXX.101
XXX.XX.XXX.102
XXX.XX.XXX.103
XXX.XX.XXX.104
XXX.XX.XXX.105
XXX.XX.XXX.106
XXX.XX.XXX.107
XXX.XX.XXX.108
XXX.XX.XXX.109
XXX.XX.XXX.11
XXX.XX.XXX.110
XXX.XX.XXX.111

No caso eu precisava que viessem na ordem certa, ou seja, final .1, final .2, final .3, etc

Para resolver isso, primeiramente “quebrei” a string do IP pelo ponto, buscando o último octeto, só que isso por sí só não bastava, pois mesmo tendo só o IP, o campo continuava a ser do tipo string, e para organização deste tipo no mysql, era necessário decimal, então resolví usando CASTING no mysql, eis a consulta:

E finalmente o resultado desejado:

XXX.XX.XXX.0
XXX.XX.XXX.1
XXX.XX.XXX.2
XXX.XX.XXX.3
XXX.XX.XXX.4
XXX.XX.XXX.5
XXX.XX.XXX.6
XXX.XX.XXX.7
XXX.XX.XXX.8
XXX.XX.XXX.9
XXX.XX.XXX.10
XXX.XX.XXX.11
XXX.XX.XXX.12
XXX.XX.XXX.13
…..

Manipulação de usuários MySQL

Dica básica, mas tem gente que se embanana com isso.

Cenário: Criar uma base de dados chamada mydb, criar um usuário chamado myuser com permissão de acesso total a esta base de dados e acesso somente a localhost.

Primeiramente conectamos ao mysql como root e criamos a base de dados mydb

Agora uma dica legal, da pra criar usuários mysql apenas adicionando permissões. basicamente quando tu manda um grant e o usuário não existe, o mysql cria ele automaticamente… sabendo usar isso é muito bom 😉

Agora criamos então o usuário e adicionamos permissão as interfaces loopback 127.0.0.1, localhost e ::1 (loopback ipv6)

Agora testamos o acesso, deve ser exibido somente a base mydb e information_schema (no meu caso aparece também uma base do capeta chamada test que o ubuntu criou automaticamente, mas nada qe um “drop database test;” não resolva)

Agora sim, tudo criado e funcionando! 😉

Grant mysql

Pra efetuar um grant de select restringindo range de IP e senha

Se necessitar outros grants, pode ser no mesmo comando separado por virgula.

Ex: Grant de SELECT, INSERT e UPDATE

Benchark Oracle vs MySQL

Estou estudando a tecnologia oracle, as soluções são realmente interessantes principalmente com “oracle rac”.

Algumas coisas impressionam, como por exemplo,  você está fazendo uma query usando um dos nós do cluster, se o servidor reboota, ou da algum problema, ele roteia automaticamente para o próximo nó e continua a query do ponto que parou, fizemos testes e de fato isso e real, a query para por alguns poucos segundos e depoi segue a execução normalmente.

Fiz um for simples em php para inserção de 10000 registros (sim tem maneiras melhor de inserir, mas era um teste simples) numa tabela chamada “teste” possuindo dois fields:
-> id int key  –> sem auto-increment
-> reg varchar(50)

Trecho do código que usei para o for (em oracle)

Trecho do código em php

utilizei a função time() do php para medir o timestamp inicial e final, a diferença deles é o tempo da operação em segundos.

Resultados:

–> inicio e fim são timestamp, tempo total em segundos
Oracle:
INICIO: 1316194690
FIM: 1316194729
Tempo Total: 39
Espaço ocupado: 500kb

MySQL INNODB:
INICIO: 1316194769
FIM: 1316194772
Tempo Total: 3
Espaço ocupado: 416Kb

MySQL MyISAM:
INICIO: 1316194854
FIM: 1316194857
Tempo Total: 3
Espaço ocupado: 336.99Kb

Conclusão:
Foi um teste muito simples para afirmar qual é o melhor, mas podemos ver que para operações simples, o mysql é quase 10 vezes mais rápido e ocupa menos espaço em disco.
Porém é fato sabido que o mysql perde performance na medida em que a quantidade de dados vai crescendo, já no oracle, quando isto acontece ele se mantem estável (com perda mínima, ou sem de performance).

Trabalhando com triggers (insert, update delete)

Eu utilizava um rotina em php para sincronizar duas tabelas, ela rodava via cron uma vez por hora, porém isso me gerava um certo incômodo, pois as mesmas mensuravam espaço em disco em disco de alguns servidores e as vezes precisava dos dados na hora.

Até que uma hora resolví deixar a preguiça de lado e fazer de uma forma decente, via trigger.

Deixo aqui compartilhado as trigger que criei, aonde podem ser utilizadas como exemplo para after insert, after update e after delete:

After Insert:

Aqui o parametro NEW, recebe os dados da row afetada pelo insert executado

Para after update:

Mais uma vez o parametro NEW recebe os dados da tabela de origem (as rows afetadas pelo update)

Esse é um pouco diferente, o after delete

Nesse caso o valor que as rows deletas continham vão pro OLD

Agora o bonus stage:
Para deletar uma trigger

———————————————-
Posted Listening: “Schools Out – Alice Cooper”

Deletar registros com mais de 30 dias

Essa é básica, mas vejo muita gente se quebrando e fazendo códigos mirbolantes via script pra isso.

Para deletar qualquer registro com mais de 30 dias somente usando SQL (não esqueça de substituir o campo date pelo nome do campo que irá utilizar e minha_tabela pelo nome da tabela.

———————————————-
Posted Listening: “The Evil That Men Do – Iron Maiden”