Em se tratando de soluções em banco de dados para o Linux, um dos pré-requisitos é a flexibilidade na aquisição da licença do produto. Este fator é também verdade para a maioria dos softwares para este sistema operacional. o MySQL traz, além de uma política de licenciamento bastante flexível, salvo algumas exceções, recursos que fazem do produto uma solução ideal para ser utilizado em ambiente Linux.
O MySQL é conhecido por ser um servidor de banco de dados extremamente rápido e robusto, configurando-se numa das soluções de menor custo para redes mistas onde, por exemplo, temos estações clientes com Windows e servidores com Linux. É um Banco de dados utilizado principalmente em servidores web para persistência de dados em sites, foi desenvolvido pela T.c.X. DataKonsultAB (http://www.tcx.se) e está disponível para download em http://www.mysql.com.
Ao contrário do que se pensa, O MySQL não é totalmente “free”. Com relação a sua política de licenciamento podemos destacar que ele é grátis para ser utilizado tanto em uso privado como comercial, existindo algumas restrições para aplicações a serem utilizadas em ambiente Windows ou quando for distribuído como parte integrante de uma solução.
Além das vantagens citadas anteriormente, podemos destacar:
- Possui versões disponíveis para vários sistemas operacionais, entre eles FreeBSD, Unix, Mac OS X, OS/2 Warp 3 e 4, Solaris, SunOS, Windows 9x, Me, NT, 2000 e XP.
- Facilidade de instalação e administração do Banco de Dados.
- Capacidade de gerenciamento de um número ilimitado de usuários simultâneos.
- Alta capacidade de manipulação de registros (mais de 50.000.000 de registros por tabela).
- Execução de comandos super otimizada;
- Simples e e! ciente sistema de privilégio de usuários.
Como desvantagens, podemos destacar:
- Não suporta transações (Commit, rollback, níveis de isolamento )
- Não faz lock de linhas na atualização
- Não suporta constraints (Chave primária e chave estrangeira, com capacidade de habilitar/desabilitar ou dropar/adicionar. )
- Não tem recursos contra falhas no desligamento do banco durante atualizações de dados.
- Não executa backup consistente com a base de dados no ar e se atualizações estiverem sendo efetuadas.
A versão utilizada aqui do MySQL é a 3.23. O MySQL também está disponível na versão MySQL/Max, que disponibiliza através de configurações adicionais o suporte a transações e foreign keys para determinados tipos de tabelas. A versão 4.0, em desenvolvimento, inclui o suporte completo a transações, além de suportar locks de linhas. Para versões futuras estão previstas as implementações de backup on-line e recursos de recuperação segura contra falhas no desligamento. Mais informações estão disponíveis em http://www.mysql.com/products/mysql-4.0/index.html;
InstalaçãoNo Linux
Os arquivos de instalação do MySQL Servidor e Cliente estão disponíveis para download em http://www.mysql.com.
- Instale o servidor com o comando: Shell do Linux
rpm –ivh MySQL-3.23.53a-1.i386.rpm
- Instale o cliente com o comando: Shell do Linux
rpm –ivh MySQL-client-3.23.53a-1.i386.rpm
- Depois da instalação teremos que definir uma senha para o usuário root com o comando: Shell do Linux
mysqladmin –u root –p password ‘senha’
Ele pedirá para confirmar a senha, pois no primeiro acesso após a instalação a mesma não estará ainda definida.
O tempo total de instalação foi de aproximadamente 2 minutos sem a necessidade de configurações adicionais, disponibilizando de imediato o banco para uso.
Durante a instalação do MySQL é criado um banco de dados, chamado mysql, contendo cinco tabelas: db, host, user, tables_priv e columns_priv, que implementam o controle de acesso aos dados no MySQL.
Conectando ao Banco
Para entrar no banco digite:
Shell do Linux> mysql –u root –p
‘-p’ Pedirá a senha do usuário.
Welcome to the MySQL monitor. Commands end with ; or \g.
Type 'help' for help.
mysql>
A partir da entrada no MySQL Monitor, é possível criar uma base, usar uma já existente, consultar informações etc. Alguns comandos administrativos podem ser visualizados digitando help, \h ou ? na linha de comando. Para consultar as bases existentes digite:
mysql> show databases;
Nota-se que o comando foi seguido por um ponto-e-vírgula (;). Quase todos os comandos no MySQL são seguidos por um ponto-e-vírgula. Caso este não seja digitado, o cursor passará para a próxima linha do prompt aguardando o complemento do comando.
Criando um Banco de dados
No MySQL os bancos de dados são implementados como diretórios contendo arquivos que correspondem a tabelas do mesmo.
Para criar uma base digite:
mysql> create database sqlmagazine;
Após a execução deste comando, será criado no diretório de dados do MySQL um subdiretório vazio com o nome sqlmagazine. Ocorrerá um erro se o banco de dados sqlmagazine já existir ou se o usuário logado não possuir o privilégio apropriado para criação de uma base de dados.
Uma vez criada a base de dados deve-se “usá-la”, ou seja, torná-la ativa para que sejam manipulados os objetos e dados contidos nesta base. Digite:
mysql> use sqlmagazine;
Criando Tabelas
Antes de criar uma tabela, é interessante destacarmos os Tipos de Dados mais utilizados no MSQL:
- CHAR(M) – É usado para representar strings de tamanho fixo, onde M pode ter de 1 à 255 caracteres.
- VARCHAR(M) – Também é usada para representar strings, sendo mais flexível do que o tipo CHAR, por armazenar o dado de forma variável, onde M pode ter de 0 à 255 caracteres. É aconselhável usar este tipo de dados no lugar do CHAR, uma vez que só é armazenado a quantidade de caracteres que o dado contém. Para o tipo CHAR, todo o “tamanho” referente ao campo é alocado, mesmo que ele não preencha todos os caracteres.
- INT [(M)] [Unsigned] – Este tipo armazena inteiros que variam de -2147483648 a 2147483647 com sinal. Se for usado Unsigned, o intervalo será 0 a 4294967295.
- FLOAT [(M,D)] – Representa números decimais de precisão simples.
- DOUBLE [(M,D)] – Representa números decimais de precisão dupla.
- DATE – Armazena datas. O formato default é ‘AAAA-MM-DD’ Intervalo de ‘1000-01-01’ a ‘9999-12-31’.
- DATETIME – Armazena data e hora no formato ‘AAAA-MM-DD HH:MM:SS’. Intervalo de ‘1000-01-01 00:00:00’ a ‘9999-12-31 23:59:59’.
- TEXT / BLOB – Este tipo de dado é utilizado para strings de 0 ate 65535 caracteres de armazenamento.
- SET (“valor1”,”valor2”,...) [NOT NULL] – Permite especificar uma lista com até 64 valores dos quais um ou mais podem ser atribuídos a coluna.
Exemplo:
sexo SET(“M”,”F”) NOT NULL;
transporte set (“caminhao”,”furgao”);
Uma vez conhecidos os tipos de dados mais utilizados, é possível criar as tabelas do banco de dados. Para tal digite:
mysql> create table cliente (
> codigocliente INT NOT NULL,
> nome VARCHAR(30),
> endereco VARCHAR (30),
> cidade VARCHAR (30),
> uf CHAR (2),
> PRIMARY KEY(codigocliente));
Para consultar as tabelas existentes, digite na base em uso:
mysql> show tables;
Para consultar as colunas da tabela cliente criada anteriormente, digite:
mysql> show columns from cliente;
Atribuindo Privilégios
Como citado anteriormente, o MySQL possui um sistema simples e eficiente para atribuição de privilégios de acesso a usuários. No nosso exemplo, estamos conectados com o usuário local root e com o banco sqlmagazine em uso. Poderíamos atribuir direitos de acesso a tabela cliente criada em nosso exemplo a outro usuário através do comando
mysql> grant select on cliente to nomedousuario;
A opção de grant é bem mais abrangente que o simples acesso a uma tabela por determinado usuário. Vejamos a sintaxe geral do comando:
grant privilégio [ (colunas) ][, privilégio [ (colunas)... ]
on {*.* | * | bd.* | bd.tabela | tabela }
to usuário@host [ identified by ‘senha’] [, ...] [ with grant option ]
Onde os termos entre colchetes são opcionais, os termos entre parênteses representam um ou mais elementos e os termos entre chaves são obrigatórios com os possíveis valores indicados. Para os termos em destaque temos:
Privilégio: Se refere ao privilégio a ser atribuído. Podemos destacar os seguintes:
- all [ privileges ] - Todos os Privilégios.
- alter -Alterar tabelas e índices.
- create - Criar bancos de dados e tabelas.
- delete - Eliminar linhas de tabelas.
- drop - Eliminar bancos de dados e tabelas.
- index - Criar e eliminar índices.
- insert - Inserir linhas em tabelas.
- select - ler dados de tabelas.
- update - alterar linhas em tabelas.
- usage - sem privilégios.
Colunas: Nomes das colunas às quais os privilégios devem ser aplicados
- On: Especifica o nível do privilégio
- *.* - Atribui os privilégios a todas as tabelas em todos os bancos de dados do servidor.
- * - Atribui os privilégios a todas as tabelas do banco de dados corrente.
- bd.* - Atribui os privilégios a todas as tabelas do banco de dados especificado.
- bd.tabela - Atribui os privilégios a todas colunas da tabelas especificada.
- tabela - Atribui os privilégios a todas colunas da tabelas especificada no banco de dados default.
To: Especifica o(s) nome(s) do(s) usuário(s) a ter(em) privilégios atribuídos. Formato usuário@host.
- usuário - Nome do usuário ou string vazio para especificar um usuário anônimo.
- host - Nome do host, ou endereço IP.
- Identified By - Atribui uma senha ao usuário, ou altera a senha de um usuário existente.
with Grant option: Permite ao usuário atribuir a outros usuários qualquer um dos seus privilégios no nível de privilégio especificado.
Manipulando o Banco de dados
A manipulação dos dados armazenados num banco se dá de quatro formas: inserção, alteração, deleção e seleção de um ou mais registros. Com base na tabela de cliente criada anteriormente seguem alguns exemplos:
Para inserir um registro numa tabela já existente digite:
mysql> INSERT INTO cliente (codigocliente, nome, endereço, cidade, uf)
VALUES (1,”JOSE DA SILVA”,”RUA ALTA, 30”, “RIO DE JANEIRO”,”RJ”);
mysql> INSERT INTO cliente (codigocliente, nome, endereço, cidade, uf)
VALUES (2,”MARIA DA SILVA”,”RUA BAIXA, 25”, “NITEROI”,”RJ”);
mysql> INSERT INTO cliente (codigocliente, nome, endereço, cidade, uf)
VALUES (3,”JOAO SOUZA”,”RUA ESTREITA, 50”, “SAO PAULO”,”SP”);
Para selecionar registro(s) de uma tabela já existente, digite:
mysql> SELECT * FROM cliente;
Mostrará todos os registros da tabela.
mysql> SELECT * FROM cliente WHERE uf = “SP”;
Mostrará todos os registros com a uf = “SP”.
mysql> SELECT * FROM cliente WHERE uf = “RJ” ORDER BY nome;
O “Order By” trará os registros ordenados por nome.
mysql> SELECT * FROM cliente WHERE nome LIKE “J%”;
O “LIKE” substitui o “=” para fazer uma procura estimada e não exata. O “%” funciona como um coringa que substitui qualquer caractere.
Para alterar registro(s) numa tabela já existente, digite:
mysql> UPDATE cliente SET endereco = “RUA ESTRELA, 65” WHERE codigocliente = 3;
Para apagar registro(s) numa tabela já existente, digite:
mysql> DELETE FROM cliente WHERE codigocliente = 3;
Operadores Lógicos
AND (&&)
mysql> SELECT * FROM cliente WHERE uf = “RJ” AND cidade = “NITEROI”;
mysql> SELECT * FROM cliente WHERE uf = “RJ” && cidade = “NITEROI”;
Mostrará os registros que tenha uf = “RJ” e ao mesmo tempo a cidade = “NITEROI”
OR ( || )
mysql> SELECT * FROM cliente WHERE uf = “RJ” OR cidade = “SAO PAULO”;
mysql> SELECT * FROM cliente WHERE uf = “RJ” || cidade = “SAO PAULO”;
Mostrará os registros que tenha uf = “RJ” ou cidade = “SAO PAULO”
NOT (!)
mysql> SELECT * FROM cliente WHERE uf != “RJ” ;
Mostrará os registros que tenha uf diferente “RJ”.
Modificando uma Tabela
Para Renomear uma tabela já existente, digite:
mysql> ALTER TABLE cliente RENAME clientenovo;
Para adicionar uma coluna a uma tabela já existente, digite:
mysql> ALTER TABLE clientenovo ADD datanasc DATE;
Para alterar uma coluna de uma tabela já existente digite:
mysql> ALTER TABLE clientenovo CHANGE nome nomecliente VARCHAR(30);
Para remover uma coluna de uma tabela já existente, digite:
mysql> ALTER TABLE clientenovo DROP complemento;
Um pequeno exemplo
Segue um pequeno exemplo escrito em Java mostrando o acesso ao banco e as tabelas criadas neste artigo. A aplicação não disponibiliza uma interface gráfica, ela simplesmente efetua a conexão com o banco e lista num console os dados da tabela CLIENTENOVO criada anteriormente.
O Driver JDBC MySQL utilizado para o exemplo pode ser baixado no endereço http://www.mysql.com/downloads/api-jdbc-stable.html.
import java.sql.*;
public class Principal
{ public static void main (String[] args)
{ Connection conn = null;
try{
//registra o driver do mysq no jdbc
DriverManager.registerDriver
( new com.mysql.jdbc.Driver() );
//veri! ca se o driver está registrado e abre uma
conexão com o banco de acordo
//com os parâmetros do método getConnection
conn =DriverManager.getConnection
(“jdbc:mysql://localhost/sqlmagazine?user=root”);
}
catch (SQLException e){
System.out.println (‘\n’ + “Erro na conexão com o banco.”);
e.printStackTrace();
System.exit(1);
}
try{
//envia o comando para o banco de dados para que /
//ele seja “compilado” pelo banco
//otimizando dessa forma a resposta do banco
//quando o mesmo for executado
PreparedStatement pstmt = conn.
prepareStatement(“SELECT * FROM CLIENTENOVO”);
//executa o comando preparado e retorna um
//ResultSet para ser manipulado pela aplicação
ResultSet rs = pstmt.executeQuery();
while ( rs.next() ){
System.out.println(rs.getInt(“CODCLIENTE”) + “ - “ +
rs.getString(“NOMECLIENTE”));
}
pstmt.close();
conn.close();
}
catch (SQLException e){
System.out.println (‘\n’ +
“Erro ao recuperar dados no banco.”);
e.printStackTrace();
System.exit(1);
}
}
}
Conclusão
Até então a ausência de transações vinha se mostrado um ponto negativo para a utilização do MySQL de forma mais abrangente, embora existam muitas aplicações, como por exemplo as de armazenamento de conteúdo dinâmico para websites, que não exijam transações e se beneficiem sobremaneira do ganho de performance obtido com a sua ausência, uma vez que desfazer programaticamente uma operação com múltiplas tabelas é trabalhoso e não muito utilizado.
Hoje, esta questão já não pesa tanto para utilização do MySQL devido ao suporte parcial a transações, constraints e foreign keys. No futuro o próximo o suporte completo a transações, locks de linhas durante a atualização, backup on-line e recuperação segura agregarão valores a benefícios já existentes como alta performance, simplicidade de instalação, manutenção reduzida e versões para vários sistemas operacionais, fazendo com que o MySQL seja utilizado de forma mais abrangente.