Schema Sync: Sincronização de esquemas entre Banco de Dados MySQL

Schema Sync é uma interessante ferramenta que pode te ajudar muito, por exemplo, considere o seguinte caso:

  • Estamos trabalhando em dois ambientes distintos, um de desenvolvimento e outro de produção. No ambiente de desenvolvimento realizamos várias modificações no esquema de Banco de Dados, até chegar o momento de precisarmos aplicar tais modificações no Banco de produção. Se não tivermos feito uma lista de cada alteração (não considerando ferramentas que armazenam logs das transações) ai teremos um grande problema.

Justamente ai que entra o Schema Sync, que basicamente faz a comparação das Bases de Dados (desenvolvimento e produção) e gera um script.sql com as mudanças para que você possa aplicar no ambiente de produção, além disso também gera um script para reverter as mudanças caso tenha feito algo errado.

Muito útil…

Resetando a senha de Root do Mysql

Como sempre esqueço com fazer isso, vou deixar aqui, pra quando eu precisar novamente:

Como resetar a senha de Root do Mysql
===================================

[root@servidor ~]# lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
mysqld 31792 mysql 3u IPv4 434089 TCP *:mysql (LISTEN)
[root@servidor ~]# kill -9 31792
[root@servidor ~]# /etc/init.d/mysql start
Mysql Started

[root@servidor ~]# mysql
Access denied for user ‘root’@'localhost’ (using password: NO)

[root@servidor ~]# /etc/init.d/mysql stop

[root@servidor ~]# mysqld_safe –skip-grant-tables &

[root@servidor ~]#
[root@servidor ~]# mysql -u root
mysql>
mysql> use mysql;
mysql> update user set password=PASSWORD(“NEW-ROOT-PASSWORD”) where
User=’root’;
mysql> flush privileges;
mysql> quit

NEW-ROOT-PASSWORD above is whatever password you want to set.

[root@servidor ~]# # /etc/init.d/mysql stop
[root@servidor ~]# lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
mysqld 31792 mysql 3u IPv4 434089 TCP *:mysql (LISTEN)
[root@servidor ~]# kill -9 31792
[root@servidor ~]# fuser -k /usr/bin/mysqld_safe ( in
case you see mysql process is still running )

[root@servidor ~]# vi /root/.my.cnf
[root@servidor ~]# cat /root/.my.cnf
[client]
user=”root”
pass=”NEW-ROOT-PASSWORD”
[root@servidor ~]#

[root@servidor ~]# service mysql restart

[root@servidor ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.1.21-standard-log

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql> quit
Bye
[root@servidor ~]#

WordPress: Backup automatico da base de dados

A grande maioria das pessoas são muito relaxadas quando se trata de fazer backups regulares do Banco de Dados, alegando que dá muito trabalho, ou com aquele pensamento: “quais são as chances que vai acontecer comigo uma perda geral de dados?”

Mas e se o backup acontecesse automaticamente todos os dias, armazenando a cópia do Banco em outro servidor de forma segura? Seria ótimo! Vejamos então como fazer isso:

1 – Registar uma nova conta do Gmail

O Gmail oferece 7 GB de armazenamento e até 20MB de arquivos anexados por mensagem (O maior tamanho de anexo que encontrei para uma conta de e-mail gratuito). É grátis e é completamente fora do seu servidor de hospedagem, por isso, se o seu provedor perder tudo, você não terá perdido os seus backups.

Vá até http://mail.google.com/ e “Inscreva-se no Google Mail”. O cadastro leva apenas um minuto para preencher e agora você terá 7GB de espaço de armazenamento gratuito.

2 – Instalar o Plugin

Existem vários plugins de backup diferente, mas vamos utilizar aqui o WP-DB Manager, porque é o único que eu sei que vai funcionar, e porque você pode contar que ele será atualizado a cada nova versão do WordPress.

Baixe o plugin, faça o upload para a pasta plugins e ative-o como qualquer outro plugin.

Você então tem que procurar a pasta wp-content/backup-db, e fazer o upload do arquivo .htaccess da pasta do plugin.

Se a pasta db-backup não existir, você deve criá-la e dar previlégios total (CHMOD 777) (Na maioria dos clientes FTP, você pode dar um “CHMOD” com um clique direito e escolhendo “chmod” ou “atributos de arquivo” etc).

3 – Definir as configurações

Um link chamado “Database” será adicionado ao seu painel principal do WP-Admin. Clique nele, depois clique na aba “Opções do DB”.

Na seção de agendamento automático, escolha todos os dias, Gzip Sim e digite o seu endereço do Gmail. Agora clique em “Update Options” e está feito.


4 – Lycos Mail, para quando o seu banco de dados for muito grande

A desvantagem do método acima é que você está limitado a um tamanho máximo de 20MB de seu banco de dados.

O Banco do wordPress tende a ser pequeno, e gzippiando o arquivo irá lhe ajudar imensamente, mas se seu site crescer acima do limite de 20MB, você terá que encontrar uma conta de e-mail melhor.

Nesse caso, tente Lycos Mail. Eles oferecem 3 GB de armazenamento gratuito, mas ilimitado tamanho de anexo de email.

No entanto, com a versão gratuita, você deve entrar a cada 30 dias, ou eles vão excluir permanentemente todos os seus e-mails. Você pode evitar as exclusões da Lycos comprando uma conta Profissional, que custa U$5,95 dólares por ano (ainda assim muito barato).

É isso…

Como retornar um update feito sem querer em um banco Oracle?

Você conhece o Rollback em Bancos transacionais? É uma mão na roda, quando se precisa recuperar algo que você fez e se arrependeu, como alteração dem vários campos com valores errados, ou até mesmo excluiu um ou mais registros e deu COMMIT. Sim, você pode recuperar os dados…

É uma tarefa muito simples, basta fazer um select normalmente na  tabela,  com os campos e condições que você quer e, no FROM, após o nome da tabela, colocar “as of timestamp systimestamp – interval ‘X’ minute“, onde esse “X” é o tempo que passou desde a a besteira que  fez até agora.

Veja a seguinte situação hipotética:

Imagine que se tenha uma tabela CLIENTE e você atualiza os clientes que não fazem compras há mais de 1 mês para Inativos. Você faz isso com um update,  atualizando o campo STATUS_CLIENTE para “I”, de inativo,  depois de fazer um select que retorna os  clientes que não compraram no último mês.

Após a execução do update (COMMIT), alguns clientes estavam com o STATUS “A” de Ativo, “D” de Devedor, “V” de VIP. Passa 30 minutos seu chefe entra na sala, e lhe fala que esse update não pode ser feito em clientes VIP, e agora? Faz assim:

select ID_CLIENTE
from CLIENTE
as of timestamp systimestamp - interval '30' minute
where STATUS_CLIENTE = 'V';

PRONTO! Peguei todo mundo que tava com o campo STATUS_CLIENTE = ‘V’ 30 minutos atrás. Com os IDs, é possível fazer um novo  update, passando esse pessoal que  está com o STATUS = ‘I’, pra ‘V’.

Via: Estação ZEN

Entendendo JOIN

Entendendo os JOIN

Este é um problema bastante comum entre desenvolvedores que lidam com banco de dados:
Realiza-se uma busca (SELECT) e como resultado tem-se uma lista de ID´s. Agora como trazer os dados desses ID´s?

Algumas pessoas utilizam a seguinte lógica para solucionar este problema:

 SELECT * FROM países
foreach($países as $país) {
SELECT * FROM ciudades WHERE país = $país
foreach ($ciudades as $ciudad) {

Read More

PostgreSQL Prático

Uma das melhores apostilas de Postgresql, um pouco antiga, porém extremamente útil. Você verá em detalhes:

  • Instalação
  • DDL (Data Definition Language)
  • DML (Data Manipulation Language)
  • Funções Internas
  • Funções Definidas pelo Usuário e Triggers
  • DCL (Data Control Language) – Administração
  • Transações
  • Administração
  • Replicação
  • Configurações
  • Metadados (Catálogo)
  • Conectividade
  • Ferramentas
  • Apêndices
  • Exercícios

Tudo em Português.

Download:  http://www.fop.unicamp.br/

Intervalo de Datas no Mysql

Dúvida:

Como fazer uma busca retornando os registros com data de hoje a daqui a 15 dias? Parece confuso?  Então veja um exemplo prático:

Tendo uma tabela de “eventos” com dois campos. Nome do evento, e data de realização (date), e você quer exibir os eventos que acontecerão nos próximos 30 dias. Moleza:

SELECT * FROM tabela WHERE data BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 30 DAY)

Simples assim… e caso deseja-se um outro período, é so alterar o INTERVAL.

Fontes:

HowTo: MySQL – Como resetar um campo Auto Increament

Tenho uma tabela com uma coluna de auto-incremento para a chave primária. Ao adicionar e/ou excluir registros o valor de auto incremento irá continuar a aumentar.

problema 1:
Se eu tiver 10 registros inseridos e depois deletar 9 dos 10 registros, o próximo valor a ser inserido será 11, não 9.

Solução:
Pode-se executar a seguinte query:

ALTER TABLE tablename AUTO_INCREMENT = 1

Isso irá redefinir o valor do auto-incremento para o maior valor definido +1, assim, o valor de auto-incremento do próximo registro a ser inserido terá início a partir 9, no exemplo dado.

Pode-se utilizar também essa técnica, quando se deseja de fato limpar todos os registros da tabela e recomeçar o auto-incremento.

DELETE FROM tablename
ALTER TABLE tablename AUTO_INCREMENT = 1

Problema 2:
Se eu tivesse entrado com 10 registros, e excluido alguns como o  4 e 5 e quero inserir próximo registro como 4 não 11.

Solução:
Execute a seguinte query:

SET insert_id = 4;
INSERT INTO tablename VALUES ('blah', '...');

Isto irá adicionar o próximo registro na posição 4.

SET insert_id = # (onde # é o valor do auto-incremento que você quer usar).

PS.: Só é eficaz para a inserções imediatas imediatas, uma por vez.

WP-DownloadManager – Reordenando os Registros na “Unha”

wpmanager

Quem trabalha com WordPress de forma profissional com certeza deve conhecer um plugin chamado WP-DownloadManager, do Lester Chan, um dos mais atuantes desenvolvedores de plugins para WordPress, veja alguns.

Pois bem, o Wp-DownloadManager é uma mão na roda para disponibilizar arquivos para download, permite criar categorias, ordenar a disponibilização dos arquivos e ainda faz estatísticas de download.

Tenho usado ele na intranet de um dos meus empregadores, com sucesso. Mas vamos aos problemas que precisei solucionar.

1.  Temos diversas categorias de downloads, e acertamos que a ordem que mostraríamos os arquivos aos usuários era os mais novos primeiros, ordenados pelo file_id dos arquivos, veja abaixo a tabela do plugin.


CREATE TABLE  `wp_downloads` (
`file_id` int(10) NOT NULL auto_increment,
`file` tinytext NOT NULL,
`file_name` text NOT NULL,
`file_des` text NOT NULL,
`file_size` varchar(20) NOT NULL default '',
`file_category` int(2) NOT NULL default '0',
`file_date` varchar(20) NOT NULL default '',
`file_updated_date` varchar(20) NOT NULL default '',
`file_last_downloaded_date` varchar(20) NOT NULL default '',
`file_hits` int(10) NOT NULL default '0',
`file_permission` tinyint(2) NOT NULL default '0',
PRIMARY KEY  (`file_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

Tudo estava funcionando maravilhas,  os usuários fazem o upload dos arquivos, levando em consideração que os mais antigos devem ser inseridos primeiro, e ai será exibido como planejamos, ficando assim:

277/2009 – Designa Comissão Especial …..
» 42.5 KiB – 5 downloads – 02 de novembro de 2009

276/2009 – Designa Comissão Especial encarregada de elaborar …..
» 41.0 KiB – 3 downloads – 05 de novembro de 2009

275/2009 – Designa o servidor ….l
» 43.0 KiB – 2 downloads – 10 de novembro de 2009

O problema é que como a intranet atual foi migrada de uma versão anterior, onde não existia um CMS, vários arquivos foram inseridos a esmo, e que ao serem exibidos não correspondem a lista descrescente por nome, como no exemplo acima.

Embora que sistema permita mudar isso facilmente, isso não era possível de se fazer, pois iria afetar todas as outras categorias, pois as mudanças de ordenação são globais.

Vejamos a solução:

Primeiro foi dado um Select na tabela WP_DOWNLOADS para retonar o último FILE_ID.


SELECT max(file_id) FROM  wp_downloads

retornou: 969

Com o uso de um contador, é possível simular uma contagem sequencial, veja:


set @contador:=970;
SELECT (@contador:=@contador+1), wp_downloads.* FROM `wp_downloads` WHERE `file_category`= 10 order by `file_name` asc

Ou seja, a idéia é fazer com que os valores desse SELECT sequencial possa ser aplicado na coluna file_id da tabela wp_downloads.

Com a ajuda de meu amigo Edcley Firmino – o papa do SQL -,  chegamos a decisão de fazer uma Procedure utilizando RowID. Veja como ficou:


BEGIN

DECLARE vcontador INT;
declare b,vfile_id int;
DECLARE cursor_1 CURSOR FOR SELECT file_id
FROM wp_downloads WHERE file_category= 10
order by file_name ASC;

DECLARE EXIT HANDLER FOR NOT FOUND SET b=1;
OPEN cursor_1;
set vcontador := 970;
REPEAT
FETCH cursor_1 INTO
vfile_id;
update wp_downloads
set file_id = vcontador
where file_id = vfile_id;
set vcontador := vcontador + 1;

UNTIL b=1 END REPEAT;
CLOSE cursor_1;

END

Pronto, ao executar-mos essa procedure, todos os registros da coluna File_ID foram atualizados, e então foi possível voltar a exibir corretamente os arquivos em ordem decrescente.

Funciona maravilhosamente bem… é isso.