Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Foto do Autor]
Jose M. Fernández
Sobre o autor: [escreva um ou dois parágrafos aqui sobre a biografia]

Conteúdo:
Introdução
Principais Características
Instalação
Primeiros Passos, Administração (Segurança)
Conclusões

MySQL
Servidor de Banco de Dados

[Ilustration]

Abstrato: [MySQL é um servidor de banco de dados SQL (Structured Query Language) para várias plataformas entre as quais encontramos Linux. O desenho da versão Linux foi feito para obter um rápido funcionamento...]




Introdução

MySQL é um gerenciador d banco de dados SQL (Structured Query Language). É uma implementação Cliente-Servidor que consta de um servidor e diferentes clientes (programas/librerías).

Falar de um banco de dados SQL é muito complicado já que teríamos que voltar a origem dos mesmos bancos de dados relacionais e o objetivo deste artigo não é tão ambicioso, simplesmente tentará descrever e mostrar uma implementação específica de um gerenciador de banco de dados SQL.

Relembrando dados históricos, quando a IBM começou a comercializar em 1.981 o SQL e desde então este produto tem tido um papel importante no desenvolvimento dos bancos de dados relacionais. A IBM propôs e foi aceita, uma versão do SQL ao American National Standard Institute (ANSI) e desde então é utilizado de forma generalizada em banco de dados relacionais. Em 1983 nasceu DB2, a mais popular (pelo menos nos grandes computadores) dos bancos de dados deste tipo até aqueles momentos.

No mundo GNU, um dos bancos de dados que se sobressai em qualquer referencia em aplicações deste tipo sob LINUX, é MySQL, ainda que não está incluida em nenhuma distribuição, já que não tem licença GNU, para comercializá-la ou a qualquer software que a utilize ou se sirva dela, terá que adquirir uma licença.

Este banco de dados é considerado (em sua própria documentação) como a mais rápida e robusta tanto para grandes volumes de dados como pequenos (sempre, claro está, comparada com as de sua categoria), ainda que como veremos mais adiante esta rapidez é o custo de não implementar certos aspectos do SQL.

MySQL está disponível(Fontes e binário) para: Linux 2.0+, SCO, Solaris 2.5, 2.6 SUNOS 4.x, BSDI 2.x, 3.0, SGI IRIX 6.x, AIX 4.x, DEC UNIX 4.x, HPUX 10.20, Windows 95 (perdão), entre os sistemas operacionais mais populares.

A versão livre foi escrita por Michael Windenis, a versão comercial é distribuida por TCX Datakonsulter AB.

Principais Caracteristicas

  • O principal objetivo de MySQL é velocidade e robustez.
  • escrito em C e C++, testado com GCC 2.7.2.1. Usa GNU autoconf para portabilidade.
  • Clientes C, C++, JAVA, Perl, TCL.
  • Multiprocessamento, quer dizer poder usar várias CPU, sem que estas estejam disponíveis.
  • Pode trabalhar em distintas plataformas e S.O. distintos.
  • Sistema de senhas e previlégios muito flexíveis e segura.
  • Todas as palavras viajam criptografadas na rede.
  • Registros de comprimento fixo e variável.
  • 16 índices por tabela, cada índice pode ser composto de 1 a 15 colunas ou parte delas com um comprimento máximo de 127 bytes.
  • Todas as colunas podem ter valores defaults.
  • Utilitário (Isamchk)para checar, otimizar e reparar tabelas.
  • Todos os dados estão gravados no formato ISO8859_1-
  • Os clientes usam TCP ou UNIX Socket para conectar-se ao servidor.
  • O servidor suporta mensagens de erro em diversos idiomas.
  • Todos os comandos tem -help ou -? para as ajudas.
  • Diversos tipos de colunas com inteiros de 1, 2, 3, 4, e 8 bytes, ponto flutuante, precisão dupla, caracteres, datas, numeros, etc.
  • ODBC para Windows 95 (com fontes), podemos utilizar ACCESS para conectar-se com o servidor.

Instalação

Naturalmente, antes da instalação de banco de dados, devemos conseguí-la, e para isso, usar a WEB:

http://www.tcx.se


ou FTP :
ftp://ftp.sunet.se/pub/unix/databases/relational/mysql

Teremos que decidir também se queremos baixar uma distribuição em código fonte ou binário. Esta última é mais fácil de instalar, mas deve existir a versão binária para nossa plataforma (ainda que exista para as mais populares).

Instalação Binario

Uma vez baixado o arquivo compactado como:

mysql-Version.tar.gz

poderemos descompactá-lo. Podemos fazer de várias formas, mas eu prefiro fazê-lo passo a passo:

  1. descompactar :
    gunzip -dfv mysql-Versão.tar.gz
  2. depois realizamos o comando tar
    tar -xvf mysql-Version.tar

    Este comando tar no meu computador (instalação) o fiz no diretório /usr/local com o que neste criamos o diretório:
    /usr/local/mysql-3.20.32a-pc-linux-gnu-i586

    como vemos não é muito prático sua utilização, como recomenda (no próprio guia de instalação do MySQL) devemos realizar um acesso direto com o comando ln (criar links entre arquivos)

    > ln -s mysql-3.20.32a-pc-linux-gnu-i586/bin mysql

    resultará o seguinte aspecto no diretório :

    drwxr-xr-x 8192 Nov 24 1993 bin
    drwxr-xr-x 8192 Nov 24 1993 etc
    drwxr-xr-x 8192 Aug 17 1997 i18n
    drwxr-xrx 8192 Mar 16 1994 include
    drwxr-xr-x 8192 Mar 19 02:03 jdk1.1.3
    drwxr-xr-x 8192 Aug 17 1997 jre
    drwxr-xr-x 8192 Mar 16 1994 lib
    lrwxrwxrwx 36 Jan 18 19:40 mysql
    drwxr-xr-x 8192 Feb 5 00:07 mysql-3.20.32a-pc-linux-gnu-i586
    drwxr-xr-x 8192 Nov 24 1993 sbin
    drwxr-xr-x 8192 Nov 24 1993 src

    e digitando cd mysql, estaremos naturalmente no diretório bin de MySQL, e nele e se tudo funcionou perfeitamente, estaremos em condições de poder executar o servidor de banco de dados.

Instalando as Fuentes

Descompactar o arquivo da mesma forma do anterior.


cd mysql-Versão
./configure
make install

Existe uma quantidade muito grande de documentação para realizar o processo de instalação, onde podemos encontrar desde os Erros(Bugs), passando pela documentação específica para distintos sistemas operacionais, parâmetros para distintas configurações e até uma coleção de FAQs deste assunto. Se o processo de instalação foi realizado sem problemas (seria a primeira vez), teremos como resultado algo similar ao obtido na instalação do software em binário.

Esta opção é recomendável sómente para aqueles usuários com bastante experiencia em compilar e instalar código fonte e dispor de bastante tempo e paciencia para ir resolvendo cada um dos problemas que inevitávelmente surjam

Primeiros Passos, Administração (Segurança)

Uma vez instalado em nosso sistema o gerenciador de banco de dados com qualquer uma das formas descritas o ítem anterior, e dentro do diretório :

/usr/local/mysql-3.20.32a-pc-linux-gnu-i586

teremos os seguintes arquivos e/ou diretórios :

-rw-r--r-- 1 root root 4133 Oct 1 1997 INSTALL-BINARY
-rw-r--r-- 1 root root 16666 Oct 7 21:10 INSTALL-SOURCE
-rw-r--r-- 1 root root 24088 Oct 27 23:06 NEWS
-rw-r--r-- 1 root root 3562 Apr 11 1997 PORTING
-rw-r--r-- 1 root root 8512 May 21 1997 PUBLIC
-rw-r--r-- 1 root root 1963 Jul 31 1997 README
-rw-r--r-- 1 root root 3416 Jun 4 1997 TODO
drwxr-xr-x 6 root root 8192 Oct 28 00:44 bench
drwxr-xr-x 2 cuenta1 users 8192 Mar 27 00:42 bin
drwxr-xr-x 5 root root 8192 Mar 31 00:26 data
drwxr-xr-x 2 root root 8192 Oct 28 00:44 include
drwxr-xr-x 2 root root 8192 Oct 28 00:44 lib
-rw-r--r-- 1 root root 132883 Jun 8 1997 mysql-faq.html
-rw-r--r-- 1 root root 117622 Jun 10 1997 mysql-faq.txt
-rw-r--r-- 1 root root 9301 Jun 8 1997 mysql-faq_toc.html
drwxr-xr-x 4 root root 8192 Oct 28 00:44 mysqlperl
drwxr-xr-x 2 root root 8192 Oct 28 00:44 scripts
drwxr-xr-x 3 root root 8192 Oct 28 00:44 share
drwxr-xr-x 2 root root 8192 Oct 28 00:44 tests

Nos arquivos README, TODO, INSTALL, mysql-faq, etc., temos informações sobre a instalação do servidor de banco de dados, FAG, manual de funcionamento, etc. que é bastante completo e efetivo (parte deste artigo está baseado neles).

Dentro do diretório /data, encontraremos como sub-diretórios deste, cada um dos bancos de dados que vamos criando. No momento da instalação definimos por default os arquivos em que se apoia o sistema de segurança, este banco de dados é “mysql”.

No diretório /bench encontraremos exemplos de SQL. Note que na instalação em código fonte os exemplos são maiores que na instalação em binário.

O diretório /share contem as mensagens de erro do servidor em cada um dos idiomas que está disponível.

Nos diretórios /include e /lib encontramos os arquivos *.h e as bibliotecas necessárias.

No diretório /bin estão todos os arquivos executáveis, dentre os mais importantes destacaremos :


`mysql'

Um Shell de SQL (na realidade de GNU). Pode ser usado tanto interativamente como não.


`mysqladmin'

Utilitários de administração. Criar/Apagar banco de dados. Informação sobre processos e versões.


`mysqld'

O SQL “deamon” .Deve estar sempre sendo executado.


`mysqlshow'

Visualiza informações sobre banco de dados, tabelas e campos.


`safe_mysqld'

Executa “mysqld”.


`mysqlaccess'

Script para checar os previlégios de uma combinação : Host, Usuário e banco de dados.


`mysqlbug'

Utilizado para enviar os possíveis erros(bug) que encontramos no gerenciador.


`mysql_install_db'

Criar grandes tabelas com previlégios por default, é executado quando instalamos um novo sistema pela primeira vez.


`isamchk'

Checa, otimiza e repara tabelas.

Segurança

O sistema de segurança de MySQL garante que cada usuário possa fazer as coisas que lhe são permitidas (nada mais e nada menos).

O sistema decide os diferentes previlégios dependendo de “QUE USUARIO” conectado a “QUE BANCO DE DADOS” a partir de “QUE HOST”. O sistema de previlégios está baseado, como não, no conteúdo de 3 tabelas, “USER”, “HOST” y “DB” do banco de dados “mysql”.


As colunas destas 3 tabelas são :

Database: mysql
Tables
db
host
user


Table: db
Field Type Null Key Default Extra
Host char(60)   PRI    
Db char(32)   PRI    
User char(16)   PRI    
Select_priv char(1)     N  
Insert_priv char(1)     N  
Update_priv char(1)     N  
Delete_priv char(1)     N  
Create_priv char(1)     N  
Drop_priv char(1)     N  

Table: host
Field Type Null Key Default Extra
Host char(60)   PRI    
Db char(32)   PRI    
Select_priv char(1)     N  
Insert_priv char(1)     N  
Update_priv char(1)     N  
Delete_priv char(1)     N  
Create_priv char(1)     N  
Drop_priv char(1)     N  

Table: user
Field Type Null Key Default Extra
Host char(60)   PRI    
User char(16)   PRI    
Password char(16)        
Select_priv char(1)     N  
Insert_priv char(1)     N  
Update_priv char(1)     N  
Delete_priv char(1)     N  
Create_priv char(1)     N  
Drop_priv char(1)     N  
Reload_priv char(1)     N  
Shutdown_priv char(1)     N  
Process_priv char(1)     N  
File_priv char(1)     N  

Podemos decidir se autorizamos ou não selecionar (SELECT) , inserir (INSERT), atualizar (UPDATE), e apagar (DELETE) linhas de uma tabela.

Podemos permitir ou não, criar o inibir (CREATE, DROP) tabelas ou banco de dados.

Podemos permitir, ou não, usar os comandos de administração do gerenciador de banco de dados como “shutdown”, “reload”, “process”, etc.

Podemos sempre comprovar nossos previlégios com o script “mysqlaccess”.

Um HOST deve ser um “host local”, um número IP, ou uma expressão SQL . Se na tabela “db” a coluna hosta está vazia, significa “cualquier host” na tabela de “host”. Se na tabela “host” ou “user” a coluna host está vazia, significa que qualquer HOST pode criar uma conexão TCP com vosso servidor.

Db é o nome de um banco de dados.

Uma coluna “USER” vazia, significa qualquer nome de usuário.

Primeiros Passos

A forma mais rápida de iniciar o servidor é executando :

mysql.server start

e para parar-lo :

mysql.server stop

Podemos realizar o mesmo executando o script safe_mysql como indicado no guia de instalação, ainda que no final, de uma forma ou de outra, será executado o arquivo “mysqld”.

É necessária, como podemos supor, iniciar o servidor para realizar qualquer operação com o banco de dados, e uma vez realizado, podemos executar vários comandos para comprovar que a partida do servidor esteje correto como, por exemplo, “mysqladmin” cujo formato completo será :

mysqladmin [OPÇÕES] comando comando …

onde OPÇÕES puede ser :

-f, --force Não realiza a pergunta para confirmar ao apagar uma tabela.
-?, --help Visualiza esta ajuda .
-h, --host=# Conexão com o host.
-p, --password[=...] Palavra de senha para a conexão ao servidor.
-P --port=... Numero da porta usada na conexão.
-S --socket=... Arquivo Socket usado na conexão.
-u, --user=# Usuario de conexão, se não é o usuário atual.
-V, --version Informação sobre a versão atual .

onde Comando pode ser um ou mais de :

  • create nome do banco de dados
    Cria um novo banco de dados
  • drop nome do banco de dados
    Apaga um banco de dados e todas suas tabelas.
  • kill identificador de processos
    “mata “ um processo mysql
  • processlist
    Mostra uma lista dos processos que estão sendo executados no servidor.
  • shutdown
    Para o servidor
  • status
    Obtém uma mensagem do estado do servidor
  • version
    Obtem a versão do servidor.

    assim que, executando :

    mysqladmin create novobancodedados

    criaremos um novo banco de dados cujo nome será “nuevabasededatos”

    poderemos ver os processos que estão sendo executado no servidor com :

    mysqladmin processlist

    Outro comando importante é mysqlshow que nos permite ver os bancos de dados que
    existem, por exemplo, se executamos o comando :

    mysqlshow

    nos mostrará o resulrtado :


    	+-----------+
    	| Databases |
    	+-----------+
    	| mysql     |
    	| personas  |
    	| test      |
    	+-----------+
    

    Linguagem SQL no MySQL

    Como indicamos na introdução, este servidor de banco de dados é considerado como o mais rápido entre os de sua categoria tanto para grandes volumes de dados como pequenos, mas como também indicamos o princípio é o banco de dados de não implementar certos aspectos das especificações SQL estes aspectos, que a meu entender, são importantes por um lado os Triggers e por outro lado a Lógica Transacional.

    Os triggers não são nada mais que uma porção de código armazenado que se "dispara" ou se executa quando realizamos uma operação (atualização, deleção, etc.) com o banco de dados. Naturalmente comprovar a própria existencia de disparador e executá-lo, se existe, consome recursos e tempo e é como seu próprio manual informa, a única razão porque os triggers não estão suportados.

    Um aspecto muito importante em qualquer banco de dados relacional é a consistencia das diferentes tabelas que o compõem, para conseguir isto de uma forma menos fácil é utilizando a "Lógica Transacional", será o próprio gerenciador de banco de dados que proporcionará mecanismos de bloqueio de arquivos e consolidação ou retrocesso nas operações com as tabelas. Pois bem MySQL não suporta as transações em função da velocidade (ou pelo menos assim indicam em seus comentários), só podem nos ajudar com os comandos LOCK tables /UNLOCK tables que permite bloquear tabelas impidindo que outros usuários possam acessá-las, mas sem a possibilidade de desfazer as operações realizadas com os dados.

    Tendo em conta estas restrições na utilização do servidor, veremos como implementamos alguns comandos SQL, não com o objetivo de analisar os comandos, e sim ver como estes comandos são implementadosneste Gerenciador de banco de dados.

    Uma vez que tenhamos o servidor já iniciado, nada nos falta do que enviar-lhe instruções para realizar as operações que desejarmos. Como exemplo veremos a criação de um banco de dados "pessoas", que é constituido por tres tabelas, "clientes", "estados" e "municípios". É um exemplo muito simples e sem nenhuma utilidade, mas nos ajudará em um exemplo real de como podemos manipular banco de dados. Em primeiro lugar, diremos que estas operações poderão serem realizadas de várias maneiras: uma delas será através de uma API em C, C++, Java ou por meio de um ODBC sem estarmos trabalhando no Windows95 (com perdão), ou também poderíamos realizá-los com o shell da própria instalação. Esta última maneira nos parece mais apropriada para nosso artigo já que não temos que descrever as particularidades das distintas linguagens de programação.

    O Shell do MySQL podemos iniciar, executando:

    mysql nomebancodedados

    e aparecerá o prompt do shell, que poderemos enviar comandos ao servidor.

    Assim mesmo podemos executar o shell no modo “batch” o retardado executando :

    mysql -e (“comando SQL …… “) nomebancodedados

    com o que conseguiremos enviar o comando SQL ao servidor.

    Para nosso exemplo criamos um banco de dados llamado "pessoas"com o comando.

    mysqladmin create pessoas

    Executaremos o shell com o comando.

    mysql pessoas

    ja podemos enviar desde o shell comandos ao próprio servidor, como por exemplo, que nos ensine as tabelas do banco de dados com o que temos iniciado no shell:


    > show tables /g

    e o sistema responderá com:


    Database: pessoas
    	+-------------+
    	|   Tables    |
    	+-------------+
    	| clientes    |
    	| municipios  |
    	| provincias  |
    	+-------------+
    

    Todos os comandos que enviamos ao servidor a partir do shell, sempre acabam em /g, que é a forma de indicar o fim de um comando e o envio dele ao servidor para que o execute.

    Naturalmente, antes que o sistema nos devolva esta informação, temos que ter criado as tabelas com os correspondentes comandos CREATE, os quais teríam o seguinte aspecto:

    	CREATE TABLE clientes
    (NIF CHAR(9) NOT NULL PRIMARY KEY, Nombre CHAR(15) NOT NULL, Apellidos CHAR(35) NOT NULL, Direccion CHAR(50) NOT NULL, Poblacion INT(5) NOT NULL, Provincia INT(2) NOT NULL, Telefono INT(9), Fecha_Alta DATE NOT NULL) /g

        CREATE TABLE provincias
    (Cod_provincia INT(2) NOT NULL PRIMARY KEY, Descripcion_p CHAR(30) NOT NULL) /g

        CREATE TABLE municipios
    	      (Cod_provincia       INT(2)    NOT NULL,
    	       Cod_municipio       INT(3)    NOT NULL,
    	       Descripcion_m       CHAR(30)  NOT NULL,
    	          PRIMARY KEY(Cod_provincia,Cod_municipio))  /g
    

    Continuando, podemos executar:

    > show colums from clientes from pessoas /g
    > show columns from provincias from pessoas /g
    > show columns from municipios from pessoas /g

    obteremos respectivamente :

    Database: pessoas 	Table: clientes  Rows: 4
    +--------------+----------+------+-----+---------+-------+
    | Field        | Type     | Null | Key | Default | Extra |
    +--------------+----------+------+-----+---------+-------+
    | NIF          | char(9)  |      |PRI  |         |       |
    | Nombre       | char(15) | YES  |     |         |       |
    | Apellidos    | char(35) |      |     |         |       |
    | Direccion    | char(50) |      |     |         |       |
    | Poblacion    | int(5)   |      |     |   0     |       |
    | Provincia    | int(2)   |      |     |   0     |       |
    | Telefono     | int(9)   | YES  |     |         |       |
    | Fecha_Alta   | date     | YES  |     |         |       |
    +--------------+----------+------+-----+---------+-------+
    
    Database: personas 	Table: provincias  Rows: 3
    +-----------------+----------+------+-----+---------+-------+
    | Field           | Type     | Null | Key| Default  | Extra |
    +-----------------+----------+------+-----+---------+-------+
    | Cod_provincia   | int(2)   |      | PRI |    0    |       |
    | Descripcion_p   | char(30) |      |     |         |       |
    +-----------------+----------+------+-----+---------+-------+
    
    Database: personas 	Table: municipios  Rows: 9
    +------------------+----------+------+-----+---------+-------+
    | Field            | Type     | Null | Key| Default  | Extra |
    +------------------+----------+------+-----+---------+-------+
    | Cod_provincia    | int(2)   |      | PRI |   0     |       |
    | Cod_municipio    |  int(3)  |      | PRI |   0     |       |
    | Descripcion_m    | char(30) |      |     |         |       |
    +------------------+----------+------+-----+---------+-------+
    

    O próximo passo, será introduzir dados em cada uma das tabelas, vamos utilizar o comando INSERT puro do SQL, sem que haja nenhuma intervenção de qualquer linguagem de programação ou rotinas da API :

    Para inserir um registro na tabela clientes, municipios e estados, realizaremos respectivamente:

    INSERT INTO clientes VALUES
    ("5316828K","PEDRO","ROMERO DIAZ","C/ HOLA 9 ",29003,29,911111111,19980203)
    /g

    INSERT INTO municipios VALUES
    (28,001,"Fuenlabrada") /g

    INSERT INTO provincias VALUES
    (08,"Barcelona") /g

    E finalmente, terminaremos nosso intinerário pelos comandos SQL, realizando seleções nas fileiras que introduzimos nas tabelas criadas anteriormente dentro do banco de dados que criamos para o exemplo deste artigo. Selecionaremos os registros da tabela "cliente" variando a condição de seleção e uma primeira seleção da tabela municípios :

    > SELECT ALL Cod_provincia, Cod_municipio, Descripcion_m from municipios where Cod_provincia = 28 /g
    Cod_provincia	Cod_municipio	Descripcion_m
    28              1               Fuenlabrada
    28              2               Pozuelo
    28              3               Madrid
    
    > SELECT ALL NIF,Nombre,Apellidos,Direccion from clientes where Poblacion = 28001
    NIF Nombre Apellidos direccion
    2416728U JOSE FERNANDEZ ROMERO C/ FELIZ 1 3G


    > SELECT ALL NIF,Nombre,Apellidos,Direccion from clientes
    where Provincia = 29

    NIF        Nombre         Apellidos            	direccion
    23198623N  JUAN ANDRES    RUIZ MORALES             C/ CATEDRAL 12 2B
    5316828K   PEDRO          ROMERO DIAZ              C/ HOLA 9
    52312844J  LUIS ALBERTO   LISTO JIMENEZ            C/ ROSA DE LOS VIENTOS 129  3I  
    

    Conclusões

    Como comentava no início do artigo, o objetivo que seguia era simplemente mostrar o funcionamento e ver as características fundamentais de uma implementação concreta de um servidor de banco de dados SQL, mas não somente queria indicar uma série de receitas e comandos para poder utilizá-lo, sem que pretendessemos realizar um estudo das possibilidades e carencias que poderiam ter este software, sobretudo porque conhecendo a fundo um produto, podemos obter o máximo rendimento dele, utilizando-o naqueles aspectos em que estão mais potenciados. este é o caso deste gerenciador de banco de dados, já que considero que a não implementação dos triggers e a lógica transacional deixa muito complicado o manuseio dos dados (Inserção, modificações e deleção de registros) a partir de aplicações multiusuários e utilizando grandes movimentos em tabelas relacionadas entre sí. Ainda penso que, para aplicações onde pretendemos realizar consultas muito rápidas a banco de dados muito grandes, seria recomendável este servidor (tendo sempre como referencia a versão semi-free deste servidor).

    Informo que para concluir, que a base desre artigo foi obtido na própria documentação MySQL, que a considero bastante completa, de alguns artigos de revistas especializadas, assim como de um amarelado manual "auto didata" da IBM sobre SQL.

    [email protected]

    Referencias


Esta website é mantida por Miguel Angel Sepulveda
© Jose M. Fernández 1998
LinuxFocus 1998