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.

  1. Instale o servidor com o comando: Shell do Linux
    rpm –ivh MySQL-3.23.53a-1.i386.rpm
  2. Instale o cliente com o comando: Shell do Linux
    rpm –ivh MySQL-client-3.23.53a-1.i386.rpm
  3. 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.