Docstoc

manual_pt

Document Sample
manual_pt Powered By Docstoc
					s-ti-cas vi-zu-a-li-za-dos




                      e
       Manual de Referˆncia do MySQL




                             Copyright c 1997-2001 MySQL AB
                    i



Table of Contents
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                               1



         c˜
1 Informa¸oes gerais sobre o MySQL
     e                  e                            a
Este ´ o manual de referˆncia do MySQL para a vers˜o 3.23.52. Como o desenvolvimento do
           a                               e
MySQL est´ em andamento, este manual ´ atualizado constantemente. Existe uma grande
                 a a                                       e                             a
chance desta vers˜o n˜o estar atualizada, a menos que vocˆ a esteja lendo online. A vers˜o
                              a       ´ em http://www.mysql.com/documentation/ em
mais recente deste manual est´ disponivel
 a                                e a                                               co
v´rios formatos diferentes. Se vocˆ est´ tendo dificuldades para encontrar as informa¸˜es no
                     a
manual, tente a vers˜o online em http://www.mysql.com/documentation/manual.php.
        e
MySQL ´ um servidor robusto de bancos de dados SQL (Structured Query Language -
                                             a                              a
Linguagem Estruturada para Pesquisas) muito r´pido, multi-tarefa e multi-usu´rio.
        e
MySQL ´ um software livre. Licenciado sob a GNU GENERAL PUBLIC LICENSE
http://www.gnu.org/. See undefined [Licensing and Support], page undefined .
                                ´              co
A home page do MySQL fornece as ultimas informa¸˜es sobre o MySQL.
                                    co ´
A seguinte lista descreve algumas se¸˜es uteis do manual:
 • Para informa¸˜es sobre a empresa por tr´s do MySQL, veja undefined [What is
                  co                           a
   MySQL AB], page undefined .
 • Para discuss˜es das capacidades do MySQL, veja undefined [Features], page unde-
                o
   fined .
 • Para instru¸˜es de instala¸˜o, veja undefined [Installing], page undefined .
               co             ca
 • Para dicas sobre a portabilidade do MySQL para novas arquiteturas ou sistemas op-
   eracionais, veja undefined [Porting], page undefined .
 • Para informa¸˜es sobre a atualizacao da vers˜o 3.22, veja undefined [Upgrading-from-
                 co                             a
   3.22], page undefined .
 • Para um tutorial de introdu¸˜o ao MySQL, veja undefined [Tutorial], page unde-
                                 ca
   fined .
 • Para exemplos de SQL e informa¸˜es sobre avalia¸˜es de desempenho, veja o diret´rio
                                     co               co                            o
                                             ca
   de benchmarks (‘sql-bench’ na distribui¸˜o).
 • Para o hist´rico de novos recursos e corre¸˜es de erros, veja undefined [News],
                o                                 co
   page undefined .
 • Para uma lista de erros atualmente conhecidos ou mal-funcionamento, veja undefined
   [Bugs], page undefined .
 • Para projetos futuros, veja undefined [TODO], page undefined .
 • Para ver a lista de todos os colaboradores para este projeto, veja undefined [Credits],
   page undefined .
IMPORTANTE:
      o                    e                                 o           a
Relat´rios de erros (tamb´m chamados bugs), bem como quest˜es e coment´rios, devem
                                    a
ser enviados para a lista de discuss˜o em mysql@lists.mysql.com. See undefined [Bug
reports], page undefined . O script mysqlbug deve ser usado para gerar comunicados de
erros.
             co                                                         o
Em distribui¸˜es fonte, o script mysqlbug pode ser encontrado no diret´rio ‘scripts’. Para
         co      a                                             o                 e
distribui¸˜es bin´rias, o mysqlbug pode ser encontrado no diret´rio ‘bin’. Se vocˆ encontrou
                    c                 e
um erro de seguran¸a no MySQL, vocˆ deve enviar um email para security@mysql.com.
2                                             e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



      e                   a                  e               co
Se vocˆ tem alguma sugest˜o relacionada a acr´scimos ou corre¸˜es neste manual, por favor,
envie-a para a equiope do manual em docs@mysql.com.
     e                  e            a               co
Este ´ o manual de referˆncia; ele n˜o fornece instru¸˜es gerais sobre SQL ou conceitos de
                                    e               co
bancos de dados relacionais. Se vocˆ deseja informa¸˜es gerais sobre SQL, veja undefined
[General-SQL], page undefined . Para livros que focam mais especificamente em MySQL,
veja undefined [MySQL-Books], page undefined .

1.1 MySQL, MySQL AB e Open Source

            e
1.1.1 O que ´ MySQL
                                                      e
MySQL, o mais popular banco de dados SQL Open Source, ´ fornecido pela MySQL AB.
            e                             o     e               c
MySQL AB ´ uma empresa comercial cujo neg´cios ´ fornecer servi¸os relacionados ao
banco de dados MySQL. See undefined [What is MySQL AB], page undefined .
        e
O MySQL ´ um sistema gerenciador de bancos de dados.
                               e        ca
         Um banco de dados ´ uma cole¸˜o de dados estruturados. Ele pode ser qual-
         quer coisa desde uma simples lista de compras a uma galeria de imagens ou
                                         ca
         a grande quantidade de informa¸˜o da sua rede coorporativa. Para adicionar,
                                                                                 e
         acessar, e processar dados armazenados em um banco de dados digital, vocˆ ne-
         cessita de um sistema gerenciador de bancos de dados semelhante ao MySQL.
                                   a
         Como os computadores s˜o muito bons em lidar com grandes quantidades de
         dados, o gerenciamento de bancos de dados funciona como a engrenagem cen-
                          ca             a
         tral na computa¸˜o, como utilit´rios independentes, ou como partes de outras
               co
         aplica¸˜es.
        e
O MySQL ´ um sistema gerenciador de bancos de dados relacional.
         Um banco de dados relacional armazena dados em tabelas separadas embora
                                                    o
         todos os dados estjam armazendos em um s´ local. Isso proporciona velocidade
         e flexibilidade. As tabelas s˜o unidas por rela¸˜es definidas tornando poss´
                                     a                 co                         ivel
                                                         co
         combinar dados de diferentes tabelas nas requisi¸˜es. A parte SQL do MySQL
                                                                              a
         atende pela "Linguagem estruturada de pesquisas" - a linguagem padr˜o mais
         comum usada para acessar bancos de dados.
  e
O ´ MySQL um software Open Source.
                                                                      ca
         Open Source garante para qualquer pessoa o uso ou modifica¸˜o do software.
                                                                             a
         Qualquer pessoa pode fazer download do MySQL pela Internet e us´-lo sem
         o                                                 o                 a
         ˆnus. Qualquer pessoa dedicada pode estudar o c´digo fonte e alter´-lo para
               a a                                                    c    u
         adequ´-lo `s suas necessidades. O MySQL usa a GPL (Licen¸a P´blica Geral
                                                             e           a
         GNU) http://www.gnu.org, para definir o que vocˆ pode e n˜o pode fazer
                                            co
         com o software em diferentes situa¸˜es. Se sentir desconforto com a GPL ou
                                                 ca                 e
         precisair embutir o MySQL numa aplica¸˜o comercial vocˆ pode adquirir a
             a
         vers˜o comercial licenciada conosco.
Por que usar o MySQL?
                      e                a           a        a                   e
           O MySQL ´ extremamente r´pido, confi´vel, e f´cil de usar. Se isto ´ o que
               e   a                e                     a                 e
           vocˆ est´ procurando, vocˆ deveria experiment´-lo. MySQL tamb´m tem um
                                        a                                 ca
           conjunto de recursos muito pr´ticos desenvolvidos com a coopera¸˜o de nossos
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                             3



               a          e
            usu´rios. Vocˆ pode encontrar comparativos de performance do MySQL com
                                                              a
            outros gerenciadores de bancos de dados na nossa p´gina de benchmark See
             undefined [MySQL Benchmarks], page undefined .
            MySQL foi desenvolvido originalmente para lidar com bancos de dados muito
                                              a                co
            grandes de maneira muito mais r´pida que as solu¸˜es existentes e tem sido
                                          ca
            usado em ambientes de produ¸˜o de alta demanda por diversos anos de maneira
            bem sucedida. Apesar de estar em constante desenvolvimento, o MySQL hoje
                                                        co
            oferece um rico e proveitoso conjunto de fun¸˜es. A conectividade, velocidade,
                     c                                                   a
            e seguran¸a fazem com que o MySQL seja altamente adapt´vel para acessar
            bancos de dados na Internet.
As caracter´        e
           isticas t´cnicas do MySQL
                           co   e           c
            Para informa¸˜es t´cnicas avan¸adas, veja undefined [Reference], page un-
                               e
            defined . MySQL ´ um sistema cliente/servidor que consiste de um servidor
            SQL multi-tarefa que suporta acessos diferentes, diversos programas clientes e
                                                                                      ca
            bibliotecas, ferramentas administrativas e diversas interfaces de programa¸˜o.
                  e                                                           e
            Tamb´m concedemos o MySQL como uma biblioteca multi-tarefa que vocˆ pode
                  a           ca                                 a
            ligar ` sua aplica¸˜o para chegar a um produto mais r´pido, menor e mais
             a                a
            f´cilmente gerenci´vel.
MySQL tem muitos softwares de colaboradores dispon´
                                                  ivel.
         ´           a                 ca                        a
         E bem prov´vel que sua aplica¸˜o ou linguagem favorita j´ suporte o MySQL.

       u                        e                   a
A pron´ncia oficial do MySQL ´ “Mai Ess Que Ell” (e n˜o MAI-SEQUEL). Mas tentamos
 a
n˜o corrigir as pessoas que dizem MAI-SEQUEL.

            e
1.1.2 O que ´ a MySQL AB
             e                                  e
MySQL AB ´ uma empresa sueca que pertence e ´ administrada pelos fundadores do MySQL
e principais desenvolvedores. Nos dedicamos a desenvolver e disseminar nosso banco de
                       a                     e
dados para novos usu´rios. MySQL AB ´ dona do direito autoral referente ao c´digo  o
fonte do servidor MySQL e a marca comercial MySQL. Uma quantidade significativa dos
rendimentos de nossos servi¸os ´ destinada ao desenvolvimento do MySQL. See undefined
                            c e
[What-is], page undefined .
A MySQL AB tem obtido lucros a partir do MySQL desde o in´             o a
                                                                icio. N´s n˜o recebemos
                                                       o
capital externo, e todo o dinheiro foi arrecadado por n´s.
Estamos procurando parceiros que gostariam de apoiar o desenvolvimento do MySQL para
                                                           e   a
que possamos acelerar o ritmo de desenvolvimento. Se vocˆ est´ interessado, envie um
e-mail para partner@mysql.com.
                                               a
Atualmente, a MySQL AB tem mais de 20 funcion´rios (http://www.mysql.com/development/team.html)
                               a
na sua folha de pagamento e est´ crescendo rapidamente.
                                      a
Nossas principais fontes de recursos s˜o:
 • Suporte comercial de alta qualidade para o MySQL fornecido pelos pr´prios desen-
                                                                        o
                               e
   volvedores do MySQL. Se vocˆ tem interesse em adquirir um contrato de suporte, por
                                                    co
   favor visite https://order.mysql.com/ para ver op¸˜es de suporte ou para solicitar
   suporte.
4                                               e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



    • Servi¸os de Consultoria. N´s temos desenvolvedores e consultores em 12 paises e par-
           c                    o
                                ´ que podem ajuda-lo com quase qualquer assunto rela-
      ceiros em muitos outros paises
                                   c
      cionado ao MySQL. Para servi¸os de consultoria, por favor envie um email descrevendo
                                                               a
      detalhadamente suas necessidades: info@mysql.com! Se n˜o conseguirmos resolver seu
                                                                           a
      problema, encontraremos um parceiro ou desenvolvedor que possa ajud´-lo.
    • Vendemos licen¸as para usar o MySQL como um Banco de Dados embutido. See unde-
                     c
                                           e
      fined [Cost], page undefined . Se vocˆ possui um produto comercial e deseja um banco
                a                                a
      de dados r´pido e de alta qualidade, mas n˜o pode tornar seu produto Open Source,
            a                                                           c
      poder´ comprar o direito de uso do servidor MySQL sobre uma licen¸a comercial nor-
                   c
      mal. As licen¸as de uso do MySQL sao vendidas em https://order.mysql.com/ ou
      pelo licensing@mysql.com.
    • Propaganda. O http://www.mysql.com/ ´ um site de internet muito popular com mais
                                                 e
                                       e                                           e
      de 10.000.000 page views por mˆs (Janeiro 2001). Colocando um banner, vocˆ estar´  a
                 a
      atingindo v´rios clientes potenciais na comunidade Open Source, Linux e de Bancos de
      Dados. Se tiver interesse, envie email para advertising@mysql.com.
    • Estamos criando um programa de parcerias que fornecer´ servi¸os MySQL em todos
                                                               a     c
      os pa´ises. Se estiver interessado em se tornar um parceiro da MySQL AB, por favor
      visite http://www.mysql.com/information/partners.html ou envie um email para
      partner@mysql.com.
    • Fornecemos treinamento atrav´s de nossos parceiros. Para maiores informa¸˜es, por
                                   e                                          co
      favor envie um email para info@mysql.com.
    • A marca MySQL tem, desde 1995, sido associada com velocidade e estabilidade e ´e
                            a
      conhecida por ser confi´vel. Caso tenha interesse em usar a marca do MySQL no seu
         o
      neg´cio, envie um email para info@mysql.com.

                                        ca
A ideologia do MySQL mostra nossa dedica¸˜o ao MySQL e ao Open Source.
 o
N´s desejamos que o MySQL seja:
    • O melhor e o mais usado banco de dados no mundo.
    • Acess´ e dispon´ para todos.
           ivel        ivel
    • F´cil de usar.
       a
    • Melhorado continuamente, permanecendo r´pido e seguro.
                                             a
    • Divertido para usar e aprimorar.
    • Livre de erros (bugs).

A MySQL AB e sua equipe:
    • Promovem a filosofia Open Source e suporte ` comunidade Open Source.
                                               a
    • Tem como objetivo serem bons cidad˜os.
                                        a
    • Tem preferˆncia por parceiros que compartilhem nossos valores e id´ias.
                e                                                       e
    • Respondem e-mails e d˜o suporte.
                           a
    • S˜o uma empresa virtual, conectada com outras.
       a
    • Trabalha contra patentes de sistemas.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                               5



1.1.3 Sobre este manual
Este manual ´ dispon´
             e                             o
                    ivel atualmente em vers˜es Texinfo, texto, Info, HTML, PostScript
                                 a                              a        e
e PDF. O documento original est´ no formato Texinfo. A vers˜o HTML ´ produzida
                                a                                    a
automaticamente usando uma vers˜o modificada do texi2html. A vers˜o texto e Info s˜oa
                                a            e
produzidas com makeinfo. A vers˜o PostScript ´ produzida usando texi2dvi e dvips. A
    a       e
vers˜o PDF ´ produzida com pdftex.
                              e
O manual original (em ingles) ´ escrito e mantido por David Axmark, Michael (Monty)
Widenius, Jeremy Cole e Paul DuBois. Para outros colaboradores, veja undefined [Cred-
its], page undefined .

            co
1.1.4 Conven¸˜es usadas neste manual.
                              co         a
Este manual usa algumas conven¸˜es tipogr´ficas:
constant                          e                                       co
             Fonte de largura fixa ´ usada para nomes de comandos e op¸˜es; express˜es   o
                                                                o                     a
             SQL; bancos de dados, nomes de tabelas e colunas; c´digo C e Perl; e vari´veis
             de ambiente. Exemplo: “Para ver como o mysqladmin funciona, execute-o com
                 ca
             a op¸˜o --help.”
‘filename’
                                              e
             Fonte de largura fixa com aspas ´ usada para nomes de arquivos e caminhos.
                                 ca e                         o
             Exemplo: “ distribui¸˜o ´ instalada sobre o diret´rio ‘/usr/local’.”
‘c’                                               e     e                         e
             Fonte de largura constante com aspas ´ tamb´m usada para indicar sequˆncias
                                                            a
             de caracteres. Exemplo: “Para especificar uma m´scara, use o caractere ‘%’.”
italic               a     e                e
             Fonte It´lica ´ usada para dar ˆnfase, como aqui.
boldface                        e
             Fonte em Negrito ´ usada para destacar nomes privilegiados (por exemplo,
               a                  e                                                   e
             “n˜o permita o privil´gio a process levemente”) e ocasionalmente indicar ˆnfase
             especial.
                                                             e
Quando um comando deve ser executado por um programa, ele ´ indicado por um prompt
                                      e
antes do comando. Por exemplo, shell> ´ um prompt de comando para indicar o seu shell
atual e mysql> indica um prompt de comando do cliente mysql;
      shell> digite um comando shell aqui
      mysql> digite um comando mysql aqui
                  a                                                    e
Comandos Shell s˜o mostrados usando a sintaxe do Shell Bourne. Se vocˆ usa um shell do
                           a                                                       e
estilo csh, pode ser necess´rio alterar algum de seus comandos. Por exemplo, a sequˆncia
                         a
para configurar uma vari´vel de ambiente e rodar um comando que se parece como abaixo
na sintaxe Bourne Shell:
       shell> NOMEVAR=valor algum_comando
                        e
Para csh, execute a sequˆncia desta forma:
     shell> setenv NOMEVAR valor
     shell> algum_comando
Frequentemente, bancos de dados, tabelas, e nomes de colunas devem ser substitu´
                                                                               idos nos
                                        co    a        a
comandos. Para indicar que as substitui¸˜es s˜o necess´rias, este manual usa nome_db,
                                      e                      a
nome_tbl e nome_col. Por exemplo, vocˆ pode ver uma express˜o assim:
6                                               e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



        mysql> SELECT nome_col FROM nome_bd.nome_tbl;
                        e                                  a                a
Isso significa que se vocˆ estiver trabalhando numa express˜o similar, poder´ fornecer seu
  o                                                                            a
pr´prio banco de dados, tabela e nomes de colunas, que possivelmente se parecer´ com isto:
       mysql> SELECT nome_autor FROM biblio_bd.lista_autor;
        o                                      u               u
Express˜es SQL podem ser escritas em mai´sculas ou min´sculas. Quando este manual
                     a           ´       a                                          a
mostra uma express˜o SQL, maisculas s˜o usadas para as palavras-chave em quest˜o (para
       a           u        a                                a                            a
enfatiz´-las) e min´sculas s˜o usadas para o resto da express˜o. Veja o exemplo na express˜o
SELECT a seguir :
      mysql> SELECT count(*) FROM nome_tbl;
                              a             ca                          a
Por outro lado, em uma discuss˜o sobre a fun¸˜o COUNT(), a mesma express˜o pode ser
escrita assim:
       mysql> select COUNT(*) from nome_tbl;
 a                                                               a
N˜o exisitindo o interesse em destacar, todas as palavras-chave s˜o escritas uniformemente
       u
em mai´sculas.
           co                                    a                                    a
Em descri¸˜es de sintaxe, colchetes (‘[’ e ‘]’) s˜o usados para indicar palavras ou cl´usulas
opcionais:
      DROP TABLE [IF EXISTS] nome_tbl
                                                                    a
Quando elementos da sintaxe possuem mais de uma alternativa, elas s˜o separados por
                                                              co
barras verticais (‘|’). Quando um menbro de um conjuntop de op¸˜es pode ser escolhido,
                 a
as alternativas s˜o listadas em colchetes (‘[’ e ‘]’):
       TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
                                      co                                         a
Quando um membro de um conjunto de op¸˜es deve ser selecionado, as alternativas s˜o
listadas em colchetes (‘{’ e ‘}’):
      {DESCRIBE | DESC} nome_tabela {nome_campo | wild}

          o
1.1.5 Hist´ria do MySQL
Quando come¸amos, t´
              c                         ca                             a
                       inhamos a inten¸˜o de usar o mSQL para conectar `s nossas tabelas
utilizando nossas r´pidas rotinas de baixo n´ (ISAM). Entretanto, depois de alguns testes,
                   a                        ivel
                     a                a        a
chegamos a conclus˜o que o mSQL n˜o era r´pido e nem flexivel o suficiente para nossas
necessidades. Isto resultou em uma nova interface SQL para nosso banco de dados, mas
com praticamente a mesma Interface API do mSQL. Esta API foi escolhida para facilitar a
                     o
portabilidade para c´digos de terceiros.
        ca                     a e                          o                     u
A deriva¸˜o do nome MySQL n˜o ´ bem definida. Nosso diret´rio base e um grande n´mero
de nossas bibliotecas e ferramentas sempre tiveram o prefixo “my” por pelo menos 10 anos.
                                                             e
A filha de Monty, alguns anos mais nova que o MySQL, tamb´m ganhou o nome My. Qual
                                                              e
das duas originou o nome do MySQL continua sendo um mist´rio, mesmo para n´s. o

1.1.6 As principais caracter´
                            isticas do MySQL
A seguinte lista descreve algumas das caracter´
                                              isticas mais importantes do MySQL:
    • Suporte total a multi-threads usando threads diretamente no kernel. Isto significa que
      se pode facilmente usar m´ltiplas CPUs, se dispon´
                                u                       ivel.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                               7



 • C, C++, Eiffel, Java, Perl, PHP, Python e Tcl APIs. See undefined [Clients], page un-
   defined .
 • Funciona em diversas plataformas. See undefined [Which OS], page undefined .
 • Aceita diversos tipos de campos: inteiros de 1, 2, 3, 4 e 8 bytes com e sem sinal, FLOAT,
   DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET,
   and ENUM types. See undefined [Column types], page undefined .
 • Joins muito r´pidas usando uma multi-join de leitura unica otimizada.
                a                                       ´
 • Completo suporte a operadores e fun¸˜es nas partes SELECT e WHERE das consultas. Por
                                      co
   exemplo:
        mysql> SELECT CONCAT(first_name, " ", last_name) FROM nome_tabela
                     WHERE income/dependents > 10000 AND age > 30;
 • Fun¸˜es SQL s˜o implementadas atrav´s de uma biblioteca de classes altamente
       co         a                        e
                       a                                a a                ca
   otimizada e com o m´ximo de performance. Geralmente n˜o h´ nenhuma aloca¸˜o de
        o                      ca
   mem´ria depois da inicializa¸˜o da pesquisa.
 • Suporte pleno `s cl´usulas SQL GROUP BY e ORDER BY. Suporte para fun¸˜es de agru-
                 a a                                                   co
   pamento (COUNT(), COUNT(DISTINCT ...), AVG(), STD(), SUM(), MAX() e MIN()).
 • Suporte para LEFT OUTER JOIN e RIGHT OUTER JOIN e sintaxes ANSI, SQL e ODBC.
 • Vocˆ pode misturar tabelas de bancos de dados diferentes na mesma pesquisa (como
       e
          a
   na vers˜o 3.22).
 • Um sistema de privil´gios e senhas que ´ muito flex´
                       e                  e                                            ca
                                                     ivel, seguro e que permite verifica¸˜o
                    co    a                  a                            a
   baseada em esta¸˜es/m´quinas. Senhas s˜o seguras porque todo o tr´fico de senhas ´      e
                             e
   criptografado quando vocˆ se conecta ao servidor.
 • Suporte ao ODBC (Open-DataBase-Connectivity) para Win32 (com fonte aberto). To-
          co                                             e
   das fun¸˜es ODBC 2.5 e muitas outras. Por exemplo, vocˆ pode usar o MS Access para
   conectar ao seu servidor MySQL. See undefined [ODBC], page undefined
 • Tabelas de disco baseadas em ´rvores-B extremamente r´pidas com compress˜o de
                                   a                          a                     a
   ´
   indices.
 • S˜o permitidos at´ 32 ´
     a               e    indices por tabela. Cada ´indice pode ser composto de 1 a 16
   colunas ou partes de colunas. O tamanho m´ximo do ´
                                              a                 e
                                                         indice ´ de 500 bytes (isto pode
   ser alterado na compila¸˜o do MySQL). Um ´
                          ca                   indice pode usar o prefixo de campo com
   um tipo CHAR ou VARCHAR.
 • Registros de tamanhos fixos ou vari´veis.
                                     a
 • Tabelas hash em mem´ria que s˜o usadas como tabelas tempor´rias.
                      o         a                            a
 • Lida com bancos de dados enormes. N´s estamos usando MySQL com alguns bancos
                                         o
                    e                          o                a
   de dados que cont´m 50.000.000 registros e n´s sabemos de usu´rios que usam MySQL
   com 60.000 tabelas e aproximadamente 5.000.000.000 de linhas.
 • Todas as colunas tˆm valores padr˜o. Vocˆ pode usar INSERT para inserir um sub-
                     e                a       e
                                                        a
   conjunto de colunas de tabelas; aquelas colunas que n˜o possuem valores fornecidos
                                           o
   explicitamente usam os seus valores padr˜es.
 • Utiliza o GNU Automake, Autoconf, e Libtool para portabilidade.
 • Escrito em C e C++. Testado com um amplo faixa de compiladores diferentes.
 • Um sistema de aloca¸˜o de mem´ria muito r´pido e baseado em processo(thread).
                      ca        o           a
8                                               e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



    • N˜o existem furos ou problemas de mem´ria. O MySQL foi testado com o Purify, um
        a                                        o
                                        o
      detector de problemas de mem´ria comercial.
    • Inclui o myisamchk, um utilit´rio muito r´pido para checagem, otimiza¸˜o e reparo de
                                      a          a                            ca
      tabelas. Toda a funcionalidade do myisamchk est´, tamb´m, dispon´ pela interface
                                                           a    e          ivel
      SQL. See undefined [MySQL Database Administration], page undefined .
    • Suporte total para v´rios conjuntos de caracteres, que incluem ISO-8859-1 (Latin1),
                             a
                                                                   a’, a    o a
      big5, ujis e mais. Por exemplo, os caracteres Escandinavos ‘˚ ‘¨’ e ‘¨’ s˜o permitidos
      em nomes de tabelas e colunas.
    • Todos os dados s˜o armazenados no conjunto de caracteres escolhido. Todas as com-
                        a
           co
      para¸˜es em colunas de sequenciascaso-insensitivo.
    • A ordena¸˜o ´ feita de acordo com o conjunto de caracteres escolhido (o modo sueco
                ca e
                     ´
      por padr˜o). E poss´ alterar isso quando o servidor MySQL ´ iniciado. Para ver um
               a            ivel                                      e
                     a             co        c                   o               ca
      exemplo de v´rias ordena¸˜es avan¸adas, procure pelo c´digo de ordena¸˜o Tcheca.
      O MySQL suporta diversos conjuntos de caracteres que podem ser especificados em
                         ca
      tempo de compila¸˜o e execu¸˜o. ca
    • Apelidos em tabelas e colunas s˜o dispon´
                                         a                                   a
                                                 iveis como definidos no padr˜o SQL92.
    • DELETE, INSERT, REPLACE, e UPDATE retornam o n´mero de linhas que foram alteradas
                                                           u
                   ´
      (afetadas). E poss´                    u                       a
                          ivel retornar o n´mero de linhas com padr˜o coincidentes configu-
                     a
      rando um parˆmetro quando estiver conectando ao servidor.
    • Nomes de fun¸˜es n˜o comflitam com nomes de tabelas ou colunas. Por exemplo, ABS
                     co    a
      e                          a         ´         ca e
      ´ um nome de campo v´lido. A unica restri¸˜o ´ que para uma chamada de fun¸˜o,     ca
      espa¸os n˜o s˜o permitidos entre o nome da fun¸˜o e o ‘(’ que o segue. See undefined
           c    a a                                     ca
      [Reserved words], page undefined .
    • Todos os programas MySQL podem ser chamados com as op¸˜es --help ou -? para
                                                                     co
      obter ajuda online.
    • O servidor pode apresentar mensagem de erros aos clientes em v´rias l´
                                                                          a      inguas. See
       undefined [Languages], page undefined .
    • Os clientes podem se conectar ao servidor MySQL usando sockets(tomadas) TCP/IP,
      sockets Unix, ou Named Pipes (NT).
    • O comando espec´                                                             co
                        ifico do MySQL SHOW pode ser usado para devolver informa¸˜es sobre
      bancos de dados, tabelas e ´ indices. O comando EXPLAIN pode ser usado para determinar
      como o otimizador resolve a consulta.

              e    a
1.1.7 O MySQL ´ est´vel?
       ca                  o              a    e
Esta se¸˜o discute as quest˜es “Quanto est´vel ´ o MySQL?” e “Posso depender do MySQL
neste projeto?” Tentaremos deixar claro alguns assuntos e responder algumas das quest˜eso
                                                               ca
mais importantes que parecem interessar muitas pessoas. Esta se¸˜o foi colocada juntamente
               ca                           a       e
com a informa¸˜o colhida da lista de discuss˜o (que ´ muito ativa em relatar erros).
Na TcX, o MySQL vem trabalhando sem problema em nossos projetos desde o meio de 1996.
                                                  u               o
Quando o MySQL foi disponibilizado para um p´blico maior, n´s fomos notificados que
                       c        o
existiam algumas peda¸os de “c´digo sem testes” que foram sendo rapidamente encontrados
pelos novos usu´rios que criavam pesquisas de uma maneira diferente das que n´s faz´
                a                                                              o     iamos.
Cada nova release teve menos problemas de portabilidade que o anterior (mesmo com os
                                                       o
novos recursos implementados em cada uma destas vers˜es)
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                              9



Cada release do MySQL foi sendo usado, e ocorrem problemas somente quando usu´rios    a
      c               a                                    a               a
come¸am a usar as “´reas cinzentas.” Naturalmente, usu´rios externos n˜o sabem o que
 a      a                      ca                             a
s˜o as ´reas cinzentas; esta se¸˜o tenta indicar aquelas que s˜o conhecidas atualmente. As
       co                    a
descri¸˜es lidam com a Vers˜o 3.23 do MySQL. Todos os erros conhecidos e relatados s˜o   a
               ´          a             ca                         ca                    a
reparados na ultima vers˜o, com a exce¸˜o dos bugs listados na se¸˜o de erros, os quais s˜o
relacionados ao desenho. See undefined [Bugs], page undefined
             e               u                                o
O MySQL ´ escrito em m´ltiplas camadas e diferentes m´dulos independentes. Estes
  o          a                             co        a
m´dulos est˜o listados abaixo com indica¸˜es de qu˜o bem-testado foi cada um deles.
                                  a
O handler de tabelas ISAM — Est´vel
                                               ca
           Gerencia armazenamento e restaura¸˜o de todos os dados no MySQL Vers˜o    a
                                           o                                      o
           3.22 e anteriores. Em todas vers˜es do MySQL, nunca foi relatado um s´ erro
                  o          ´                                               e
           neste c´digo. A unica forma conhecida de corromper uma tabela ´ matar o
                                            ca              a e
           servidor no meio de uma atualiza¸˜o. Mesmo isto n˜o ´ suficiente para destruir
                                 a
           qualquer dados que n˜o possam ser recuperados, porque todos os dados s˜o  a
                                                       a
           atualizados para o disco entre cada query. N˜o existe nenhum relato de erros
           sobre perda de dados causados por bugs no MySQL.
                                    a
O handler de tabelas MyISAM — Est´vel
                e             a                  ´                        o
           Este ´ novo na vers˜o do MySQL 3.23. E amplamente baseado nos c´digos de
           tabelas ISAM mas possui diversos recursos novos e uteis.
                         e          a
O parser e o analisador l´xico — Est´vel
             a                                          a
            N˜o existem relatos de erros neste sistema h` muito tempo.
   o                    a
O c´digo C cliente — Est´vel
             a                                        o
           N˜o existem problemas conhecidos. Em vers˜es mais antigas que a 3.20, ex-
                                co
           istiam algumas limita¸˜es no tamanho do buffer de envio/recebimento. Como
                   a                                e    a
           na vers˜o 3.21, o tamanho do buffer agora ´ dinˆmico podendo chegar a um
                a
           padr˜o de 16M.
                       o        a
Programas clientes padr˜es — Est´vel
          Inclui mysql, mysqladmin, mysqlshow, mysqldump, e mysqlimport.
     a          a
SQL B´sico — Est´vel
                                           co
           O manipulador do sistema de fun¸˜es, da classe string e da memoria dinamica
                           a
           do SQL basico. N˜o existem relatos de erros neste sistema.
                               a
Otimizador de pesquisas — Est´vel
                            a
Otimizador do Range — Est´vel
                          a
Otimizador de Join — Est´vel
Locking — Gamma
                  o     e
           Esse m´dulo ´ muito dependente do sistema. Em alguns sistemas existem certos
                                                a
           problemas por utilizar o locking padr˜o do SO (fcntl(). Em alguns casos, vocˆe
                                                           a
           pode executar o daemon do MySQL com o parˆmetro --skip-locking. S˜o        a
           conhecidos alguns problemas ocorridos em alguns sistemas Linux e no SunOS
           quando utiliza-se sistemas de arquivos montados em NFS.
                     a
Threads Linux — Est´vel
                                               o
           O maior problema encontrado neste m´dulo foi com a chamada fcntl(), que
           e                      ca
           ´ corrigida usando a op¸˜o --skip-locking com o mysqld. Algumas pessoas
10                                            e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                                              a              e
           relataram travamentos com a vers˜o 0.5. Se vocˆ planeja usar mais de 1000
                  o        a                             a
           conex˜es simultˆneas, o LinuxThreads dever´ ser recompilado. Embora seja
           poss´ rodar todas essas conex˜es com o LinuxThreads padr˜o (de qualquer
                ivel                       o                             a
                      e             a                       o         c               a
           forma, vocˆ nunca poder´ ir acima de 1021 conex˜es), o espa¸o de pilha padr˜o
                                 ca     a
           de 2MB deixa a aplica¸˜o inst´vel, e iremos reproduzir um coredump depois de
                           o
           criar 1021 conex˜es. See undefined [Linux], page undefined
                             a
Solaris 2.5+ pthreads — Est´vel
                                                              ca
             Utilizamos isto para todo nosso trabalho de produ¸˜o.
                                       a
MIT-pthreads (Outros Sistemas) — Est´vel
            a a                                       a
          N˜o h´ nenhum erro relatado desde da vers˜o 3.20.15 e nenhum erro conhecido
                      a                                 a
          desde a cers˜o 3.20.16. Em alguns sistemas, h´ um "mal funcionamento" onde
                               a
          algumas operacoes s˜o muito lentas (uma parada de 1/20 segudos e feita entre
                           ´
          cada consulta). E claro que MIT-pthreads pode deixar tudo um pouco lento,
                        co                                        a
          mas as instru¸˜es SELECT baseada em indice geralmente s˜o feitas uma de cada
                  a        a        a
          vez, ent˜o elas n˜o precis˜o ser travadas com “mutex locking” nas threads.
                  co
Outras implementa¸˜es de threads — Beta -
                                                      e
           A portabilidade para outros sistemas ainda ´ muito nova e podem existir erros,
                                                        o               ca
           possivelmente no MySQL, mas a maioria na pr´pria implementa¸˜o das threads.
                                         a
LOAD DATA ..., INSERT ... SELECT — Est´vel
           Algumas pessoas achavam que haviam encontrado bugs aqui, mas geralmente
            a                          ca                          o
           s˜o mal-entendidos com rela¸˜o ao funcionamento desses m´dulos. Por favor
           confira o manual antes de relatar problemas!
                 a
ALTER TABLE — Est´vel
                         co          a
          Pequenas altera¸˜es na vers˜o 3.22.12.
         a
DBD — Est´vel
         Atualmente mantido por Jochen Wiedmann (wiedmann@neckar-alb.de).
         Obrigado!
                  a
mysqlaccess — Est´vel
          Escrito e mantido por Yves Carlier (Yves.Carlier@rug.ac.be). Obrigado!
           a
GRANT — Est´vel
                        co                       a
          Grandes altera¸˜es feitas no MySQL Vers˜o 3.22.12.
MyODBC (Usa ODBC SDK 2.5) — Gamma
        Parece funcionar bem com muitos programas.
       ca
Replica¸˜o – Beta / Gamma
                                               ca              a                   a
           Ainda estamos trabalhando na replica¸˜o, portanto n˜o espere que isso ir´ ser
            o                                                     a             a
           s´lido como uma rocha ainda. Por outro lado, alguns usu´rios MySQL j´ est˜oa
                           o
           usando isto com ´timos resultados.
Tabelas BDB – Beta
             o                                 e           a          o
          O c´digo de Bancos de dados Berkeley ´ muito est´vel, mas n´s ainda estamos
                                                                                a
          melhorando a interface entre o MySQL e as tabelas BDB, portando ele ir´ levar
                         e
          algum tempo at´ ser testado como os outros tipos de tabelas foram.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                          11



Tabelas InnoDB – Beta
                e        ca
           Esta ´ uma adi¸˜o recente ao MySQL. Ela parece funcionar bem e pode ser usada
           depois de alguns testes iniciais.
        ca         a
Recupera¸˜o autom´tica de tabelas MyISAM - Beta
                                       o                              ca
           Isso afeta somente o novo c´digo que confere, na inicializa¸˜o do banco, se a
                                                                e                  a
           tabela foi fechada corretamente e executa uma conferˆncia/reparo autom´tico
           da tabela em caso negativo.
MERGE de Tabelas – Beta / Gamma
                                                    a
        O uso das chaves em MERGE de tabelas ainda n˜o foi bem testado. A outra parte
            o
        do c´digo MERGE foi muito bem testada.
FULLTEXT – Beta
                                                          a e
        A pesquisa textual aparenta funcionar, mas ainda n˜o ´ amplamente usada.
                                                                               a
MySQL AB fornece suporte por e-mail para clientes pagos, mas a lista de discuss˜o MySQL
                                        o                    a
normalmente fornece respostas para quest˜es comuns. Erros s˜o normalmente corrigidos
                          e                  e    c
com um patch; para erros s´rios, normalmente ´ lan¸ada uma nova release.

1.1.8 Qual o tamanho das tabelas que o MySQL pode suportar
       a                                                                e
A Vers˜o 3.22 do MySQL tem suporte para tabelas com limite de tamanho at´ 4G. Com
                           a                    a                   e       o
o novo MyISAM no MySQL vers˜o 3.23 o tamanho m´ximo foi extendido at´ 8 milh˜es de
terabytes (2 ^ 63 bytes).
                                                        o
Lembre, entretando, que sistemas operacionais tem seu pr´prio limite de tamanho para
arquivos. Seguem alguns exemplos:
Sistema Operacional                           Limite do tamanho do arquivo
Linux-Intel 32 bit                                                            a
                                              2G, 4G ou mais, depende da vers˜o do
                                              Linux
Linux-Alpha                                   8T (?)
Solaris 2.5.1                                 2G (possivelmente 4G com patch)
Solaris 2.6                                   4G
Solaris 2.7 Intel                             4G
Solaris 2.7 ULTRA-SPARC                       8T (?)
                 e
No Linux 2.2 vocˆ pode ter tabelas maiores que 2G usando o patch LFS para o sistema de
                             a
arquivos ext2. No Linux 2.4 j´ existem patches para o sistema de arquivos ReiserFS para
ter suporte a arquivos maiores.
                                                   e
Isto significa que o tamanho da tabela para o MySQL ´ normalmente limitado pelos sistemas
operacionais.
         a                    e                a                        e
Por padr˜o, tabelas do MySQL tˆm um tamanho m´ximo em torno de 4G. Vocˆ pode veri-
                 a
ficar o tamanho m´ximo da tabela com o comando SHOW TABLE STATUS ou com o myisamchk
-dv nome_tabela See undefined [SHOW], page undefined .
       e                                                                               e
Se vocˆ precisa de tabelas maiores que 4G (e seu sistema operacional suporta isto), vocˆ
                                         a                            e
pode configurar o AVG_ROW_LENGHT e o parˆmetro MAX_ROWS quando vocˆ criar sua tabela.
                                                        e           e
See undefined [CREATE TABLE], page undefined . Vocˆ pode tamb´m alterar isso mais
tarde com ALTER TABLE. See undefined [ALTER TABLE], page undefined
12                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                          a                     e       a
Se sua tabela grande ser´ somente leitura, vocˆ poder´ usar o myisampack para unir e
             a
comprimir v´rias tabelas em uma. mysisampack normalmente comprime uma tabela em
                              e
pelo menos 50%, portanto vocˆ pode obter, com isso, tabelas muito maiores. See undefined
[myisampack], page undefined
        ca e
Uma op¸˜o ´ ignorar o limite de tamanho de arquivos do sistema operacional para arquivos
                               ca
de dados MyISAM usando a op¸˜o RAID. See undefined [CREATE TABLE], page unde-
fined .
Outra solu¸˜o pode ser a biblioteca MERGE inclu´
           ca                                                                          ca
                                                  ida, que lhe permite acessar uma cole¸˜o
             e
de tabelas idˆnticas como se fosse apenas uma. See undefined [MERGE], page undefined

1.1.9 Compatibilidade com o ano 2000 (Y2K)
O MySQL n˜o apresenta nenhum problema com o ano 2000 (Y2K compat´
           a                                                            ivel)
 • O MySQL usa fun¸˜es de tempo Unix e n˜o tem problemas com datas at´ o ano 2069;
                     co                      a                             e
   todos os anos de 2 d´        a                             e
                        igitos s˜o estimados na escala 1970 at´ 2069; o que significa que
         e                                                      a
   se vocˆ armazenar 01 numa coluna year, O MySQL o tratar´ como 2001.
 • Todas as fun¸˜es de data do MySQL est˜o no arquivo ‘sql/time.cc’ e codificadas com
                co                         a
   muito cuidado para ser compat´ com o ano 2000.
                                   ivel
 • No MySQL vers˜o 3.22 e posterior, o novo tipo de campo YEAR pode armazenar anos
                   a
   0 e 1901 at´ 2155 em 1 byte e mostr´-lo usando 2 ou 4 d´
              e                         a                   igitos.
    e                                 co
Vocˆ pode ter problemas com aplica¸˜es que usem o MySQL de uma maneira que n˜o            a
            a                                  co
seja segura ` Y2K. Por exemplo, muitas aplica¸˜es antigas armazenam ou manipulam anos
usando valores de 2 digitos (que ´ amb´
                                   e     iguo) em vez de usar valores de 4 digitos. Este
                                         co
problema pode ser composto por aplica¸˜es que usam valores como em 00 ou 99 como
indicadores de valores “perdidos”.
Infelizmente, estes problemas podem ser dif´                                            co
                                             iceis de resolver, porque diferentes aplica¸˜es
podem ser escritas por diferentes programadores, e cada um deles pode usar um diferentes
                    co       co
conjunto de conven¸˜es e fun¸˜es manipuladoras de data.
         a                ca                                      a
Aqui est´ uma demonstra¸˜o simples ilustrando que o MySQL n˜o tem nenhum problema
              e
com datas at´ o ano 2030:
       mysql> DROP TABLE IF EXISTS y2k;
       Query OK, 0 rows affected (0.01 sec)

      mysql> CREATE TABLE y2k (date date, date_time datetime, time_stamp timestamp);
      Query OK, 0 rows affected (0.00 sec)

      mysql>   INSERT INTO y2k VALUES
          ->   ("1998-12-31","1998-12-31      23:59:59",19981231235959),
          ->   ("1999-01-01","1999-01-01      00:00:00",19990101000000),
          ->   ("1999-09-09","1999-09-09      23:59:59",19990909235959),
          ->   ("2000-01-01","2000-01-01      00:00:00",20000101000000),
          ->   ("2000-02-28","2000-02-28      00:00:00",20000228000000),
          ->   ("2000-02-29","2000-02-29      00:00:00",20000229000000),
          ->   ("2000-03-01","2000-03-01      00:00:00",20000301000000),
          ->   ("2000-12-31","2000-12-31      23:59:59",20001231235959),
          ->   ("2001-01-01","2001-01-01      00:00:00",20010101000000),
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                             13



          -> ("2004-12-31","2004-12-31 23:59:59",20041231235959),
          -> ("2005-01-01","2005-01-01 00:00:00",20050101000000),
          -> ("2030-01-01","2030-01-01 00:00:00",20300101000000),
          -> ("2050-01-01","2050-01-01 00:00:00",20500101000000);
      Query OK, 13 rows affected (0.01 sec)
      Records: 13 Duplicates: 0 Warnings: 0

      mysql> SELECT * FROM y2k;
      +------------+---------------------+----------------+
      | date       | date_time           | time_stamp     |
      +------------+---------------------+----------------+
      | 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 |
      | 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 |
      | 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 |
      | 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 |
      | 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 |
      | 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 |
      | 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 |
      | 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 |
      | 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 |
      | 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 |
      | 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 |
      | 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 |
      | 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 |
      +------------+---------------------+----------------+
      13 rows in set (0.00 sec)

                                              a           a
Isto mostra que os tipos DATE e DATETIME n˜o apresentar˜o problemas com datas futuras
        a                                   e
(eles ir˜o conseguir trabalhar com datas at´ o ano 9999).
                         e
O tipo TIMESTAMP, que ´ usado para armazenar a hora atual, tem um alcance somente at´    e
                                                    e           a
2030-01-01. TIMESTAMP tem um alcance de 1970 at´ 2030 em m´quinas 32-bits (valor com
                a                                               e
sinal). Em m´quinas de 64-bits ele pode trabalhar com datas at´ 2106 (valor sem sinal).
Mesmo apesar do MySQL ser compat´ com o ano 2000, ´ de sua responsabilidade forb-
                                       ivel                 e
necer datas que n˜o sejam amb´
                  a             iguas. Veja undefined [Y2K issues], page undefined para
regras do MySQL para lidar com entrada de datas amb´  iguas (datas contendo valores de ano
com 2 d´  igitos)

                     c˜
1.2 Fontes de Informa¸oes Sobre MySQL

1.2.1 Livros sobre o MySQL
              co                                        a            a
Para informa¸˜es mais recentes sobre livros, com coment´rios dos usu´rios, por favor visite
http://www.mysql.com/portal/books/html/index.html.
                                                            co     e
Enquanto este manual ainda for o lugar certo para informa¸˜es t´cnicas atualizadas, seu
                      a                  e
objetivo principal ser´ conter tudo que ´ conhecido sobre o MySQL. Ao mesmo tempo ´       e
                                                          e
interessante ter um livro para ler na cama ou enquanto vocˆ viaja. Segue aqui uma lista de
                                                    e
livros sobre MySQL e assuntos relacionados (em Inglˆs).
14                                            e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                        e                                    e      a
Comprando um livro atrav´s dos hyperlinks fornecidos aqui vocˆ estar´ contribuindo para
o desenvolvimento do MySQL.
MySQL
Dispon´ em
       ivel                  Barnes and Noble
Editor                       New Riders
Autor                        Paul DuBois
               ca
Data de Publica¸˜o           1st Edition December 1999
ISBN                         0735709211
  a
P´ginas                      800
    c
Pre¸o                        $49.99 US
Exemplos para Download       samp_db distribution
Errata                       are available here
Revisado por Michael “Monty” Widenius, Moderador do MySQL.

                                        e
Em MySQL, Paul DuBois introduz a vocˆ um guia completo para um dos mais populares
bancos de dados relacionais. Paul tem contribu´ para a documenta¸˜o online para o
                                                ido                   ca
          e
MySQL e ´ um membro ativo da comunidade MySQL. O principal desenvolvedor do MySQL,
Monty Widenius, e uma rede de seus companheiros desenvolvedores revisaram o manuscrito,
                                                     e
e forneceram a Paul o tipo de discernimento que ningu´m poderia fornecer.

       e                             a
Ao inv´s de simplesmente dar uma vi˜o geral do MySQL, Paul o ensina grande parte de
                            e
seus conhecimentos. Atrav´s de duas tabelas exemplos utilizadas por todo o livro, ele
            co                         e               a
mostra solu¸˜es para problemas que vocˆ certamente ir´ encontrar. Ele o ajuda a integrar
MySQL, eficientemente, com ferramentas de terceiros, como PHP e Perl, habilitando-o a
                                 e
gerar paginas Web dinamicas atrav´s de consultas a banco de dados. Ele o ensina a escrever
                                                         e
programas que acessam banco de dados MySQL, e tamb´m fornece um conjunto completo
        e                                            co
de referˆncias para tipos de campos, operadores, fun¸˜es, sintaxe SQL, programando em
                                                                  a         co
MySQL, API C, Perl DBI, e API PHP. MySQL simplesmente lhe dar´ informa¸˜es que vocˆ      e
 a             a
n˜o encontrar´ em nenhum outro lugar.

      e
Se vocˆ usa o MySQL, este livro lhe oferece:
 • Uma introdu¸˜o ao MySQL e SQL.
              ca
 • Cobertura dos tipos de dados do MySQL e como us´-los.
                                                  a
 • Perfeito tratamento de como escrever programas clientes em C.
 • Um guia para usar o Perl DBI e APIs PHP para desenvolver aplica¸˜es baseadas em
                                                                  co
   linha de comando e Web.
 • Dicas em asssuntos administrativos como contas de usu´rios, backup, recupera¸˜o em
                                                        a                      ca
                           c
   caso de quedas e seguran¸a.
 • Ajuda para escolher um Provedor de Servi¸os de Internet para acesso MySQL.
                                           c
 • Uma referˆncia completa para tipos de dados MySQL, operadores, fun¸˜es, instru¸˜es
            e                                                        co          co
               a
   SQL e utilit´rios.
 • Guias de referˆncia completos para a API C do MySQL, a API do Perl DBI e fun¸˜es
                 e                                                             co
   PHP relacionadas ao MySQL.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                            15




MySQL & mSQL
Dispon´ em
       ivel                  Barnes and Noble
Editor                       O’Reilly
Autores                      Randy Jay Yarger, George Reese & Tim King
               ca
Data de Publica¸˜o           1st Edition July 1999
ISBN                         1-56592-434-7, Order Number: 4347
  a
P´ginas                      506
    c
Pre¸o                        $34.95
                     e
Este livro ensina vocˆ como usar o MySQL e mSQL, dois populares e robustos produtos de
banco de dados que suportam subsistemas de chave de SQL em ambos os sistemas Linux e
                             c     a
Unix. Qualquer um que conhe¸a C b´sico, Java, Perl ou Python pode escrever um programa
                                                             ca                  e
para interagir com um banco de dados, podendo ser uma aplica¸˜o isolada ou atrav´s de uma
 a                              e      e                               ca
p´gina Web. Este livro leva vocˆ atrav´s de todo o processo, da instala¸˜o e configura¸˜oca
  e             ca                          ca a
at´ a programa¸˜o de interfaces e administra¸˜o b´sica. Inclui farto material de tutorial.

Sams’ Teach Yourself MySQL in 21 Days
Dispon´ em
       ivel               Barnes and Noble
Editor                    Sams
Autores                   Mark Maslakowski and Tony Butcher
               ca
Data de Publica¸˜o        Junho 2000
ISBN                      0672319144
  a
P´ginas                   650
    c
Pre¸o                     $39.99
                                           e                  a                   a
O Teach Yourself MySQL in 21 Days da Sams ´ indicado para usu´rios Linux intermedi´rios
                      a                                                      e
que desejam entrar na ´rea de bancos de dados. Boa parte do publico alvo ´ formada
por desenvolvedores Web que necessitam de um banco de dados para armazenar grande
                     co
quantidade de informa¸˜es para que possam ser recuperadas pela Web.
                                  e       a                                     a
Teach Yourself MySQL in 21 Days ´ um pr´tico tutorial passo-a-passo. O leitor ir´ aprender
desenvolver e trabalhar essa tecnologia de bancos de dados open source em seu Web site
                   a
usando exemplos pr´ticos para seguir.

E-Commerce Solutions with   MySQL
Dispon´ em
       ivel                  Barnes and Noble
Editor                       Prima Communications, Inc.
Autores                      N˜o dispon´
                               a        ivel
               ca
Data de Publica¸˜o           Janeiro 2000
ISBN                         0761524452
  a
P´ginas                      500
    c
Pre¸o                        $39.99
Sem descri¸˜o dispon´
            ca      ivel.

MySQL and PHP from Scratch
16                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



Dispon´ em
        ivel                  Barnes and Noble
Editor                        Que
Autores                       N/A
                ca
Data de Publica¸˜o            September 2000
ISBN                          0789724405
  a
P´ginas                       550
    c
Pre¸o                         $34.99
                                                   co                 ca             ca
Este livro disponibiliza de forma conjunta informa¸˜es sobre instala¸˜o, configura¸˜o e
      ca
corre¸˜o de problemas no Apache, MySQL, PHP3 e IMP em um volume completo. Vocˆ            e
              e                 c e
aprende tamb´m como cada pe¸a ´ parte de um conjunto de aprendizagem passo-a-passo,
para criar um sistema de e-mail baseado em Web. Aprenda a executar o equivalente ao
Active Server Pages (ASP) usando PHP3, configurar um site de e-commerce usando um
banco de dados e um servidor Web Apache, e criar um sistema de entrada de dados (como
                                          ca        e
em vendas, controle de qualidade de produ¸˜o, preferˆncias dos clientes, etc) para instalar
no seu PC.

Professional MySQL Programming
Dispon´ em
       ivel               Barnes and Noble
Editor                    Wrox Press, Inc.
Autores                   N/A
               ca
Data de Publica¸˜o        Late 2001
ISBN                      1861005164
  a
P´ginas                   1000
    c
Pre¸o                     $49.99
Sem descri¸˜o dispon´
            ca      ivel.

Professional Linux Programming
Dispon´ em
       ivel                  Barnes and Noble
Editor                       Wrox Press, Inc.
Autores                      N/A
                ca
Data de Publica¸˜o           September 2000
ISBN                         1861003013
  a
P´ginas                      1155
    c
Pre¸o                        $47.99
                                                      e         a              e
Neste Best-Selling Beginning Linux Programming vocˆ aprender´ com o vivˆncia e ex-
    e                                                                 e a
periˆncia dos autores em desenvolvimento de software para Linux; Vocˆ ir´ acompanhar o
desenvolvimento da aplica¸˜o exemplo de uma Loja de DVD, com cap´
                          ca                                           itulos que o levam
                                         ca                                     o
a diferentes aspectos de sua implementa¸˜o. Capitulos individuais cobrem t´picos im-
                a    e                                 e
portantes que v˜o al´m do tema central. Todo o foco ´ feito sobre aspectos praticos da
          ca                      a
programa¸˜o, mostrando a importˆncia de se escolher a ferramenta certa para o trabalho,
usando-a da forma correta e fazendo da forma correta na primeira vez.

PHP and MySQL Web Development
Dispon´ em
       ivel            Barnes and Noble
Editor                 Sams
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                            17



Autores                       Luke Welling, Laura Thomson
                 ca
Data de Publica¸˜o            March 2001
ISBN                          0672317842
  a
P´ginas                       700
    c
Pre¸o                         $49.99
                                          a   e
PHP and MySQL Web Development traz ` vocˆ as vantagens de se implementar o MySQL
e PHP. As vantagens s˜o detalhadas atrav´s das condi¸˜es estatist´ e de v´rios estudos de
                      a                  e          co           icas     a
                  ca        a     e                                               e
caso. Uma aplica¸˜o web pr´tica ´ desenvolvida ao longo do livro, fornecendo a vocˆ quais
 a                        a
s˜o as ferramentas necess´rias para implementar um banco de dados online e funcional.
         ca e
Cada fun¸˜o ´ desenvolvida separadamente, o que lhe permite escolher incorporar somente
               e                                              ca
partes que vocˆ deseja implementar. Conceitos de programa¸˜o da linguagem PHP s˜o      a
                         co
destacados, incluindo fun¸˜es das quais amarram o suporte MySQL em um script PHP e
 o          c                        ca
t´picos avan¸ados cobrindo manipula¸˜o de tabelas.

Livros recomendados pelos desenvolvedores do MySQL
SQL-99 Complete, Really
Dispon´ em
        ivel                 Barnes and Noble
Editor                       CMP Books
Autores                      Peter Gulutzan, Trudy Pelzer
                 ca
Data de Publica¸˜o           April 1999
ISBN                         0879305681
  a
P´ginas                      1104
    c
Pre¸o                        $55.96
               e        co                             o
Este livro cont´m descri¸˜es completas dos novos padr˜es de sintaxe, estrutura de dados,
                       ca             ca
e processos de recupera¸˜o de informa¸˜o de bancos de dados SQL. Como um manual de
      e                                                  co              co
referˆncia baseado em exemplos, ele include todas as fun¸˜es CLI, informa¸˜es, tabelas de
             o
esquemas e c´digos de status, bem como um banco de dados funcional fornecido no disco
que acompanha o livro.

C, A reference manual
Dispon´ em
       ivel                   Barnes and Noble
Editor                        Prentice Hall
Autores                       Samuel P. Harbison, Guy L. Steele
                 ca
Data de Publica¸˜o            September 1994
ISBN                          0133262243
  a
P´ginas                       480
    c
Pre¸o                         $35.99
                               a          e    a
Uma nova e aprimorada revis˜o de referˆncia ` linguagem C. Este manual lhe introduz
   co                                o
no¸˜es de "C Limpo", escrevendo c´digo C que pode ser compilado como um programa
                         ca
C++, estilo de programa¸˜o C que enfatiza comportamento apropriado, portabilidade, sus-
tentabilidade, e incorpora a emenda 1 do ISO C (1994) que especifica novas facilidades para
                               a
escrever programas em C port´veis e internacionais.

C++ for Real Programmers
Dispon´ em
      ivel                   Barnes and Noble
18                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



Editor                         Academic Press, Incorporated
Autores                        Jeff Alger, Jim Keogh
                ca
Data de Publica¸˜o             February 1998
ISBN                           0120499428
  a
P´ginas                        388
Pre¸oc                         $39.95
C++ For Real Programmers preenche a lacuna entre C++ como foi descrito nos livros in-
dicados para programadores de n´                             a
                                   ivel iniciante e intermedi´rio e o C++ utilizado por pro-
                           a      e                   a                             e
gramadores experientes. V´rias t´cnicas preciosas s˜o descritas, organizadas em trˆs temas
               ca                                                    o             e
simples: indire¸˜o, hierarquia de classes e gerenciamento de mem´ria. Ele tamb´m cobre
                      ca                                e               ca
detalhadamente a cria¸˜o de templates, ponteiros, e t´cnicas de otimiza¸˜o. O foco do livro
e
´ em C++ ANSI independente de compilador.
                             e            a
C++ For Real Programmers ´ uma revis˜o do Secrets of the C++ Masters e inclui um novo
   e
apˆndice comparando C++ com Java. O livro vem com um disquete de 3.5" com c´digo       o
fonte para windows.

Algorithms in C
Dispon´ em
       ivel                   Barnes and Noble
Editor                        Addison Wesley Longman, Inc.
Autores                       Robert Sedgewick
                 ca
Data de Publica¸˜o            April 1990
ISBN                          0201514257
  a
P´ginas                       648
    c
Pre¸o                         $45.75
                                                                     a
Algorithms in C descreve uma variedade de algoritmos em algumas ´reas de interesse, in-
cluindo: ordena¸˜o, pesquisa, processamento de strings e algor´
                ca                                                        e
                                                              itmos geom´tricos, graficos e
       a                       e
matem´ticos. O livro enfatiza t´cnicas fundamentais, fornecendo aos leitores as ferramentas
para executar, implementar e debugar uteis algor´
                                       ´        itmos com confian¸a.c

Multithreaded Programming with Pthreads
Available                   Barnes and Noble
Publisher                   Prentice Hall
Authors                     Bil Lewis, Daniel J. Berg
Pub Date                    October 1997
ISBN                        0136807291
Pages                       432
Price                       $34.95
Baseado no best-selling Threads Primer, Multithreaded Programming with Pthreads da a
    e                                                 a
vocˆ um solido conhecimento de threads Posix: o que s˜o, como funcionam, quando us´-a
                  a              e
las e como otimiz´-las. Ele mant´m a clareze e o humor de Threads Primer, mas inclui
        co                      co
compara¸˜es com as implementa¸˜es em Win32 e OS/2. Codigos exemplos testados na
                               a                             co
maioria das plataformas UNIX s˜o disponibilizados com explica¸˜es detalhadas de como e
porque eles usam threads.

Programming the PERL DBI: Database Programming with PERL
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                           19



Available                    Barnes and Noble
Publisher                    O’Reilly & Associates, Incorporated
Authors                      Alligator Descartes, Tim Bunce
Pub Date                     February 2000
ISBN                         1565926994
Pages                        400
Price                        $27.96
                            e
Programming the Perl DBI ´ escrito em conjunto com Alligator Descartes, um dos membros
mais ativos da comunidade DBI, e como Tim Bunce, o inventor do DBI. Para os iniciantes
o livro explica a arquitetura do DBI e mostra como ecrever programas baseados em DBI.
Para os mais experientes o livro explica nuances do DBI e peculiaridades de cada DBD
individual.
Este livro inclui:
  •               ca
      Uma introdu¸˜o ao DBI e seu desemvolvimento.
  •                                      a
      Como criar consultas e casar os parˆmentros.
  •                                                               co
      Trabalhando com banco de dados, drivers e manipulando instru¸˜es.
  •   Tecnicas para debugar.
  •   Cobertura de cada DBD existente.
  •             e
      Uma referˆncia completa do DBI.




             co
1.2.2 Informa¸˜es gerais e tutoriais
                                      a                                a
O seguinte livro foi recomendado por v´rias pessoas na lista de discuss˜o do MySQL:
     Judith S. Bowman, Sandra L. Emerson and Marcy Darnovsky
     The Practical SQL Handbook: Using Structured Query Language
     Second Edition
     Addison-Wesley
     ISBN 0-201-62623-3
     http://www.awl.com
                                          co          a
O seguinte livro recebeu algumas recomenda¸˜es por usu´rios do MySQL:
     Martin Gruber
     Understanding SQL
     ISBN 0-89588-644-8
     Publisher Sybex 510 523 8233
     Alameda, CA USA
Um tutorial sobre SQL est´ dispon´ na rede em http://w3.one.net/~jhoffman/sqltut.htm
                          a       ivel

            ´
1.2.3 Links uteis relacionados ao MySQL
  e                         e                                     a
Al´m dos links a seguir, vocˆ pode encontrar e fazer download de v´rios programas, ferra-
mentas e APIs para MySQL do Diretorio de Colaboradores.
MySQL
20                                          e      e                       a
                                       Referˆncia t´cnica para o MySQL vers˜o 3.23.52



Tutoriais e Manuais
MySQL Myths Debunked
        MySQL usado no "mundo real".
http://www.4t2.com/mysql
                 co                           a      a
          Informa¸˜es sobre a lista de discuss˜o alem˜ do MySQL.
http://www2.rent-a-database.de/mysql/
                                 a
          MySQL handbook em alem˜o.
http://www.bitmover.com:8888//home/bk/mysql
                                o
          Accesso web ao reposit´rio BitKeeper do MySQL.
http://www.analysisandsolutions.com/code/mybasic.htm
          Tutorial para iniciantes no MySQL em como instalar e configurar o MySQL
                  a
          numa m´quina Windows.
http://www.devshed.com/Server_Side/MySQL/
           a
          V´rios tutorias sobre MySQL.
http://mysql.hitstar.com/
                                 e
          Manual do MySQL em chinˆs.
http://www.linuxplanet.com/linuxplanet/tutorials/1046/1/
          Configurando um site web baseado em MySQL.
http://www.hotwired.com/webmonkey/backend/tutorials/tutorial1.html
          Tutorial Perl-MySQL.
http://www.iserver.com/support/contrib/perl5/modules.html
                            o                              o
          Instalando novos m´dulos Perl que necessitam de m´dulos localmente instala-
          dos.
http://www.hotwired.com/webmonkey/databases/tutorials/tutorial4.html
          Tutorial PHP/MySQL.
http://www.useractive.com/
          Tutorial para MySQL.

Portando MySQL/Usando MySQL em diferentes sistemas
http://www.entropy.ch/software/macosx/mysql/
              a                                          co
          Bin´rios do MySQL para MAC OS X. Inclui informa¸˜es sobre como construir
          e usar MySQL no MAC OS X.
http://xclave.macnn.com/MySQL/
          O Mac OS Xclave. Executando MySQL no Mac OS X.
http://www.prnet.de/RegEx/mysql.html
          MySQL para Servidor Mac OS X .
http://www.latencyzero.com/macosx/mysql.html
          Compilando o MySQL para o Mac OS X.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                           21



http://www.essencesw.com/Software/mysqllib.html
          Novas bibliotecas cliente para o MAC OS Classic (Macintosh).
http://www.lilback.com/macsql/
          Bibliotecas cliente para o MAC OS Classic (Macintosh).
http://sixk.maniasys.com/index_en.html
          MySQL para a plataforma Amiga.

Links relacionados a Perl
http://dbimysql.photoflux.com/
          FAQ MySQL com DBI Perl.

 o              a
F´rum de Discuss˜o MySQL
http://www.weberdev.com/
          Exemplos de usos do MySQL; (Veja os Top 20)
http://futurerealm.com/forum/futureforum.htm
          FutureForum Web Discussion Software.

      co
Aplica¸˜es comerciais que suportam o MySQL
http://www.supportwizard.com/
                                                                           o
          SupportWizard; Ajuda interativa na Web (Este produto inclui uma c´pia licen-
          ciada do MySQL.)
http://www.sonork.com/
                                         a e                    a               e
          Sonork, instant messenger que n˜o ´ orientado somente ` Internet. Ele ´ focado
                                               e                          e
          em redes privadas e em pequenas e m´dias empresas. O Cliente ´ gratuito e o
                        e e                  e      a
          servidor tamb´m ´ gratuito para at´ 5 usu´rios.
http://www.stweb.org/
                                             co              a
          StWeb - Servidor Web e de aplica¸˜es Stratos - F´cil de usar, plataforma
                                                                 co
          cruzada, sistema de desenvolvimento e entrega de aplica¸˜es Web para Inter-
                              a      a
          net/Intranet. A vers˜o padr˜o do StWeb tem uma interface nativa para o banco
          de dados MySQL.
http://www.rightnowtech.com/
                               ca                c a
          Right Now Web; Automa¸˜o Web para servi¸os ` clientes.
http://www.icaap.org/Bazaar/
                   o               a
          Bazaar; F´runs de discuss˜o interativas com interface Web.
http://www.phonesweep.com/
                         e
          PhoneSweepT ´ o primeiro sistema de busca de telefone comercial do mundo.
                       o                                a a                e
          Muitas invas˜es ocorridas nos ultimos anos, n˜o s˜o feitas atrav´s da internet,
                    e             a                    e
          mas atrav´s chamadas n˜o autorizadas atrav´s de modems. PhoneSweep per-
                      e                              e
          mite que vocˆ encontre estes modems atrav´s de repetidas chamadas locais para
          todos os numeros de telefones que sua empresa controla. PhoneSweep tem um
          sistema que pode reconhecer mais de 250 tipos diferentes de programas de acesso
22                                           e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



           remoto, incluindo Carbon Copy(TM), pcAnywhere(TM), e Windows NT RAS.
                            co   a                                           ´
           Todas as informa¸˜es s˜o armazenadas em um banco de dados SQL. E gerado
              a           o                                  c
           ent˜o um relat´rio completo detalhando quais servi¸os forma descobertos em
           cada numero de telefone em sua empresa.

                                 o
Clientes SQL e Geradores de Relat´rios
urSQL                         a
           Editor SQL e Utilit´rio de Consultas. Marcador de sintaxe personalizado, grade
                                           ca                    co    a
           de resultados editaveis, exporta¸˜o de resultados, fun¸˜es b´sicas de adminis-
              ca
           tra¸˜o de NySQL, Etc.. Para Windows.
MySQL Data Manager
                                 e
         MySQL Data Manager * ´ cliente web independente de plataforma (escrita em
         perl) para servidor MySQL sobre TCP/IP.
http://ksql.sourceforge.net/
          cliente MySQL para KDE.
http://www.ecker-software.de
          Um cliene GUI para Windows por David Ecker.
http://www.icaap.org/software/kiosk/
          Kiosk; um cliente MySQL para gerenciamento de banco de dados. Escrito em
                   a
          Perl. Ser´ uma parte do Bazaar.
http://www.casestudio.com/
          Ferramenta de desenvolvimento que suporta MySQL 3.23.
http://home.skif.net/~voland/zeos/eng/index.html
          Zeos - Um cliente que suporta MySQL, Interbase e PostgreSQL.
http://www.geocities.com/SiliconValley/Ridge/4280/GenericReportWriter/grwhome.html
          Um gerador de relatorios gratuito escrito em Java
http://www.javaframework.de
                                 ca      co           ca
          MySQLExport - Exporta¸˜o instru¸˜es de cria¸˜o do MySQL e dados em di-
          versos formatos (SQL, HTML, CVS, text, ZIP, GZIP...)
http://dlabs.4t2.com
          M2D, Um cliente administrativo do MySQL para windows. M2D suporta ad-
                   ca                               ca
          ministra¸˜o de Bancos de Dados MySQL, cria¸˜o de novos bancos de dados e
                      ca
          tabelas, edi¸˜o e muito mais.
http://dlabs.4t2.com
          Dexter, um pequeno servidor escrito em Perl pode ser usado como servidor
          proxy para o MySQL ou como um extensor do banco de dados.
http://www.scibit.com/Products/Software/Utils/Mascon.asp
                 e
          Mascon ´ um poderoso GUI Win32 para administrar MySQL bancos de dados.
http://www.rtlabs.com/
          MacSQL Monitor. Gui para Bancos de dados MySQL, ODBC e JDBC para o
          MAC OS.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                        23



         co
Distribui¸˜es que incluem o MySQL
http://www.suse.com/
          SuSE Linux (6.1 e superior)
http://www.redhat.com/
          RedHat Linux (7.0 e superior)
http://distro.conectiva.com.br
          Conectiva Linux (4.0 e superior)

Ferramentas de Desenvolvimento Web que suportam MySQL
http://www.php.net/
          PHP: Uma linguagem script do lado do servidor embutida em HTML.
http://www.midgard-project.org
          The Midgard Application Server; um ambiente de desenvolvimento Web
          poderoso baseado em MySQL e PHP.
http://www.smartworker.org
                      e                                              co
          SmartWorker ´ uma plataforma para desenvolvimento de aplica¸˜es Web.
http://xsp.lentus.se/
                                               e
          XSP: e(X)tendible (S)erver (P)ages e ´ uma linguagem embutida em tags
          HTML escrito em Java (anteriormente conhecido como XTAGS.)
http://www.dbServ.de/
                  e           a
          dbServ ´ uma extens˜o para um servidor web para integrar a saida do banco de
                                                                   ca
          dados em seu codigo HTML. Voce pode usar qualquer func¸˜o HTML em sua
          sa´                           a
            ida. Somente o cliente poder´ te interromper. Funciona como um servidor
          isolado ou como servlet Java.
http://www.chilisoft.com/
          Platforma ASP independente por Chili!Soft
http://www.voicenet.com/~zellert/tjFM
          Driver JDBC para MySQL.
http://www.wernhart.priv.at/php/
                   co
          Demonstra¸˜es de MySQL e PHP.
http://www.dbwww.com/
          ForwardSQL: Interface HTML para manipular bancos de dados MySQL.
http://www.daa.com.au/~james/www-sql/
                                  co
          WWW-SQL: Mostra informa¸˜es de bancos de dados.
http://www.minivend.com/minivend/
          Minivend: Um carrinho de compras em Web.
http://www.heitml.com/
                            a
          HeiTML: uma extens˜o HTML do lado do servidor e uma linguagem 4GL ao
          mesmo tempo.
24                                            e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



http://www.metahtml.com/
                                                     ca             co
          Metahtml: Um Linguagem Dinaimca de Programa¸˜o para Aplica¸˜es WWW.
http://www.binevolve.com/
          VelocityGen para Perl e Tcl.
http://hawkeye.net/
          Hawkeye Internet Server Suite.
http://www.fastflow.com/
          Network Database Connection para Linux
http://www.wdbi.net/
          WDBI: Navegador web como um front end universal para banco de dados que
          suportam MySQL.
http://www.webgroove.com/
          WebGroove Script: compilador HTML e linguagem script do lado do servidor.
http://www.ihtml.com/
          Uma linguagem script do lado do servidor.
ftp://ftp.igc.apc.org/pub/myodbc/README
          Como usar o MySQL com ColdFusion no Solaris.
http://calistra.com/MySQL/
          Administrador ODBC MySQL Calistra.
http://www.webmerger.com
          Webmerger - Esta ferramenta CGI le arquivos e gera uma saida dinamica
          baseada em um conjunto de tags simple. Drivers prontos para MySQL e Post-
                      e
          greSQL atrav´s do ODBC.
http://phpclub.net/
          PHPclub - Dicas e truques para o PHP.
http://www.penguinservices.com/scripts
          Scripts MySQL e Perl.
http://www.widgetchuck.com
          The Widgetchuck; Web site com ferramentas.
http://www.adcycle.com/
          AdCycle - Software gerenciador de anuncios.
http://sourceforge.net/projects/pwpage/
                                                           a                        ca
          pwPage - fornece uma ferramenta extremamente r´pida e simples para a cria¸˜o
                                                  e
          de formulario de banco de dados. Isto ´, se existe uma tabela de banco de
          dados e uma pagina HTML foi construida usando poucas linhas pwPage pode
                                            ca        ca          ca       ca
          ser imediatamente usado para sele¸˜o, inser¸˜o, atualiza¸˜o, dele¸˜o de dados
                           a          u
          da tabela e revis˜o do conte´do da tabela selecionada.
http://www.omnis-software.com/products/studio/studio.html
                        e                                   a              co
          OMNIS Studio ´ uma ferramenta de desenvolvimento r´pido de aplica¸˜es
          (RAD).
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                            25



http://www.webplus.com
          talentsoft Web+ 4.6 - uma completa e poderosa linguagem de desenvolvmento
                           ca           co
          para usar na cria¸˜o de aplica¸˜es cliente/servidor com base na web sem escrever
          programas CGI complicados, baixo-nivel e que consomem tempo.

                   ca
Ferramentas de cria¸˜o de bancos de dados com Suporte MySQL
http://www.mysql.com/documentation/dezign/
                                  e
          "DeZign for databases" ´ uma ferramenta de desenvolvimento de banco de
          dados que usa diagramas de relacionamento de entidades (ERD).

Servidores Web com Ferramentas MySQL
ftp://ftp.kcilink.com/pub/
                                             ca
          mod auth mysql, Modulo de autentica¸˜o para o Apache.
http://www.roxen.com/
          O Servidor Web Roxen Challenger.

      o
Extens˜es para outros programas.
http://www.seawood.org/msql_bind/
          Suporte MySQL para o BIND (O servidor de nomes da Internet).
http://www.inet-interactive.com/sendmail/
          Suporte MySQL para o Sendmail e Procmail.

Utilizando o MySQL com outros programas
http://www.iserver.com/support/addonhelp/database/mysql/msaccess.html
          Utilizando o MySQL com o MS Access.
http://www.iserver.com/support/contrib/perl5/modules.html
                            o                       o
          Instalando novos m´dulos Perl que exigem m´dulos instalados localmente.

Links relacionados ao ODBC
http://www.iodbc.org/
          Gerenciados do driver iODBC popular (libiodbc) agora dispon´ como Open
                                                                     ivel
          Source.
http://users.ids.net/~bjepson/freeODBC/
              a
          As p´ginas do FreeODBC.
http://genix.net/unixODBC/
                                             a
          Os objetivos do projeto unixODBC s˜o desenvolver e promover o unixODBC
                         a
          para ser o padr˜o definitivo para ODBC na plataforma Linux. Isso inclui su-
          portar suporte GUI para o KDE.
http://www.sw-soft.com/products/BtrieveODBC/
          Um driver ODBC baseado em MySQL para o Btrieve.
26                                           e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                   a
Links relacionados ` API
http://www.jppp.com/
          Componentes para MySQL compativeis com TDataset parcialmente implemen-
          tados.
http://www.riverstyx.net/qpopmysql/
                                                      co
          qpopmysql - Um patch que permite autentica¸˜es POP3 para um banco de
                                     e
          dados MySQL. Existe tamb´m um link para um patch de Paul Khavkine para
          o Procmail para permitir a qualquer MTA a fazer a entrega a usuarios em um
          banco de dados MySQL.
http://www.pbc.ottawa.on.ca
          Gerador de classes Visual Basic para o Active X.
http://www.essencesw.com/Software/mysqllib.html
          Novas bibliotecas clientes para o Mac OS Classic (Macintosh).
http://www.lilback.com/macsql/
          Bibliotecas-cliente para o Macintosh.
http://www.essencesw.com/Plugins/mysqlplug.html
          Plugin para o REALbasic (para Macintosh)
http://www.iis.ee.ethz.ch/~neeri/macintosh/gusi-qa.html
          Uma biblioteca que emula sockets BSD e pthreads no Macintosh. Ela pode ser
                      e
          usada se vocˆ quiser compilar a biblioteca do cliente MySQL para Mac. Ela
          provavelmente pode ser usada para portar o MySQL para o Macintosh, mas
           a                    e
          n˜o conhecemos ningu´m que tenha tentado isto.
http://www.dedecker.net/jessie/scmdb/
          SCMDB - Um add-on para SCM que porta a biblioteca C do MySQL para
          scheme (SCM). Com esta biblioteca desenvolvedores do scheme podem fazer
               co
          conec¸˜es para um banco de dados MySQL e usar SQL embutido em seus
          programas.

Outros Links Relacionados ao MySQL
SAT                                           e          ca         a               ca
           A Small Application Toolkit (SAT) ´ uma cole¸˜o de utilit´rios com inten¸˜o
                                                    co
           de simplificar o desenvolvimento de aplica¸˜es pequenas, multiusuarios e com
           base em GUI em um ambiente (Microsoft -ou- X) Cliente Windows / Servidor
           Unix.
http://www.wix.com/mysql-hosting/
          Registro de provedores Web que suportam o MySQL.
http://www.softagency.co.jp/mysql/index.en.html
                                         a ´
          Links sobre usar o MySQL no Jap˜o/Asia.
http://abattoir.cc.ndsu.nodak.edu/~nem/mysql/udf/
          Registro UDF MySQL.
http://www.open.com.au/products.html
          Sitema Web Comercial de rastreamento de defeitos
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                        27



http://www.stonekeep.com/pts/
          PTS: Projeto de Sistema de Rastreamento.
http://tomato.nvgc.vt.edu/~hroberts/mot
               c
          Servi¸o e software de sistema de rastreamento.
http://www.cynergi.net/exportsql/
          ExportSQL: Um script para exportar dados do Access95+.
http://SAL.KachinaTech.COM/H/1/MYSQL.html
                                    co     e
          Entrada MySQL SAL - Aplica¸˜es Ciˆntificas no Linux (Scientific Applications
          on Linux).
http://www.infotech-nj.com/itech/index.shtml
          Uma empresa de consultoria que menciona o MySQL nos direitos da companhia.
http://www.pmpcs.com/
          PMP Computer Solutions. Desenvolvedores de banco de dados usando MySQL
          and mSQL.
http://www.aewa.org/
          Airborne Early Warning Association.
http://www.dedserius.com/y2kmatrix/
          Testador Y2K.

Interfaces SQL e de Banco de Dados
http://java.sun.com/products/jdbc/
          A API do JDBC para acesso a banco de dados.
http://www.gagme.com/mysql
          Patch para mSQL Tcl.
http://www.amsoft.ru/easysql/
          EasySQL: Um driver de gerenciamento como o ODBC.
http://www.lightlink.com/hessling/rexxsql.html
          Um interface REXX para banco de dados SQL.
http://www.mytcl.cx/
          Interface Tlc baseada em tcl-sql com muitos erros corrigidos.
http://www.binevolve.com/~tdarugar/tcl-sql/
          Interface Tcl.
http://www.contrib.andrew.cmu.edu/~shadow/sql.html
                         e              a
          Pagina de Referˆncia SQL com v´rios links interressantes.

                   co
Exemplos de utiliza¸˜es do MySQL
http://www.little6.com/about/linux/
          Little6 Inc., Um <<<...online contract and job finding site...>>> que utiliza
          MySQL, PHP3, e Linux.
28                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



http://www.delec.com/is/products/prep/examples/BookShelf/index.html
                                                       a       ca              ca
          DELECis - Uma Ferramenta que torna muito f´cil a cria¸˜o de documenta¸˜o
                                                   e
          de tabelas gerada automaticamente. Eles tˆm usado o MySQL como exemplo.
http://www.worldrecords.com
                                                               co          u
          World Records - Um mecanismo de pesquisa para informa¸˜es sobre m´sica que
          utiliza o MySQL e PHP.
http://www.webtechniques.com/archives/1998/01/note/
          Um banco de dados de contatos usando MySQL e PHP.
http://modems.rosenet.net/mysql/
                a           a
          Calend´rio comunit´rio em PHP com interface Web.
http://www.odbsoft.com/cook/sources.htm
                                  a
          Pacote Perl para gerar p´ginas html de uma estrutura de tabelas SQL e in-
              co                    a
          stru¸˜es SQL de um formul´rio HTML.
http://www.gusnet.cx/proj/telsql/
                          a
          Banco de dados b´sico de telefones usando DBI/DBD.
http://tecfa.unige.ch/guides/java/staf2x/ex/jdbc/coffee-break
          Exemplos JDBC por Daniel K. Schneider.
http://www.spade.com/linux/howto/PostgreSQL-HOWTO-41.html
          SQL BNF
http://www.ooc.com/
                                              co
          Object Oriented Concepts Inc; Aplica¸˜es CORBA com exemplos em fontes.
http://www.pbc.ottawa.on.ca/
          DBWiz: Fornece um exemplo de como gerenciar cursores em VB.
http://keilor.cs.umass.edu/pluribus/
                   e
          Pluribus ´ um mecanismo de busca gratuito que melhora a qualidade de seus
                                                                e           ca
          resultados com o tempo. Pluribus funciona atrav´s da grava¸˜o de qual das
          paginas um usuario selecionou entre aquelas retornadas pela consulta. Um
                           a                a                         a
          usuario vota na p´gina ao selecion´-la; Pluribus utiliza ent˜o o seu conhecimento
          para melhorar a qualidade dos resultados quando outra pessoa envia a mesma
          consulta (ou similar). Usa PHO e MySQL.
http://www.stopbit.com/
          Stopbit -Um site de not´
                                 icias sobre tecnologia usando MySQL e PHP.
http://www.linuxsupportline.com/~kalendar/
          Gerenciador de datas para KDE - O gerenciador possui suporte monousuario
          (baseado e arquivo) e multiusuario (banco de dados MySQL).
http://tim.desert.net/~tim/imger/
                                           ca
          Exemplo de armazenamento/recupera¸˜o de imagens com MySQL e CGI.
http://www.penguinservices.com/scripts
          Sistema de Carrinho de Compras Online.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                              29



http://www.city-gallery.com/album/
                                        e
          Old Photo Album - O album ´ um projeto de historico de fotografia com co-
                 cca                                       e
          labora¸¸˜o popular que gera todas a paginas atrav´s de dados armazendos em
                                      a       a                               e
          banco de dados MySQL. As p´ginas s˜o geradas dinamicamente atrav´s de uma
                                    u                                              co
          interface php3 com o conte´do do banco de dados. Utiliza imagens e descri¸˜es.
                       a
          As imagens s˜o armazenadas em um servidor web para evitar armazena-los em
                                                                  co a
          um banco de dados como BLOBs. Todas as outras informa¸˜es s˜o armazenadas
          no no servidor MySQL compartilhado.

Links Gerais de Banco de Dados
http://www.pcslink.com/~ej/dbweb.html
          Database Jump Site
http://black.hole-in-the.net/guy/webdb/
                                      a
          Homepage da lista de discuss˜o webdb-l (Web Databases).
http://www.symbolstone.org/technology/perl/DBI/index.html
           a          o
          P´gina dos m´dulos DBI/DBD do Perl.
http://www.student.uni-koeln.de/cygwin/
          Ferramentas Cygwin. Unix em cima do Windows.
http://dbasecentral.com/
                                                       ca
          dbasecentral.com; Desenvolvimento e distribui¸˜o de sistemas e aplicativos de
                                      a
          banco de dados poderosos e f´ceis de usar.
http://www.tek-tips.com/
                             a                                   a
          Tek-Tips Forums s˜o mais de 800 foruns de suporte p2p n˜o comerciais e inden-
                            a                         ca
          depentes voltado ` profissionais da Computa¸˜o. Recursos incluem notifica¸˜oca
                a                                                     ca
          autom´tica para respostas, uma biblioteca de links, e prote¸˜o confidenciais
          para foruns particulares.
http://www.public.asu.edu/~peterjn/btree/
                                           a
          Arvores B: Estrutura de Dados em ´rvore balanceada.
http://www.fit.qut.edu.au/~maire/baobab/lecture/sld001.htm
                e
          Conferˆncia sobre Arvores B.

               e
Existem tamb´m outros diversos sites Web que utilizam o MySQL. See undefined [Users],
                                o
page undefined . Envie sugest˜es para esta lista no email webmaster@mysql.com. Estamos
                  e
pedindo que vocˆ disponibilize uma logomarca do MySQL em algum lugar de seu site se
   e                  a                           e e a                     a
vocˆ desejar ter sua p´gina citada aqui. Isto tamb´m ´ v´lido para ter sua p´gina adicionada
na pagina “ferramentas utilizadas” ou algo parecido.

                       a
1.2.4 Listas de Discuss˜o MySQL
       ca            e                     a                                            a
Esta se¸˜o traz a vocˆ as listas de discuss˜o do MySQL e da algumas dicas de como utiliz´-
las
30                                           e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                            a
1.2.4.1 As Listas de Discuss˜o MySQL
                                                 a
Para se inscrever na principal lista de discuss˜o sobre MySQL, envie uma mensagem para
          c                 o
o endere¸o de correio eletrˆnico mysql-subscribe@lists.mysql.com.
                           ca                                a
Para cancelar a sua inscri¸˜o na principal lista de discuss˜o sobre MySQL envie uma men-
                      c                  o
sagem para o endere¸o de correio eletrˆnico mysql-unsubscribe@lists.mysql.com.
                    c                  e                    e
Somente o endere¸o para o qual vocˆ envia a mensagem ´ significante. O assunto e o corpo
                a
da mensagem s˜o ignorados.
                  c                  a      a           e
Se o seu endere¸o de resposta n˜o for v´lido, vocˆ pode especificar o seu endere¸o ex-   c
plicitamente, adicionando um h´                                ca
                                   ifen ao comando de inscri¸˜o ou cancelamento, seguido
                c                                      c
pelo seu ender¸o com o caracter ‘@’ do seu endere¸o substituido por um ‘=’. Por exem-
plo, para inscrever seu_nome.dominio envie uma mensagem para mysql-subscribe-seu_
nome=host.dominio@lists.mysql.com
Mensagens para mysql-subscribe@lists.mysql.com ou mysql-unsubscribe@lists.mysql.com
 a                                                                             a
s˜o processadas automaticamente pelo processador de listas de discuss˜o exmlm. In-
       co                   a          ´
forma¸˜es sobre ezmlm est˜o disponiveis no Website do ezmlm.
Para enviar uma mensagem para a lista, envie para mysql@lists.mysql.com. No entanto,
  a                               ca
n˜o enviem mensagens de inscri¸˜o e cancelamento no mysql@lists.mysql.com por favor,
                                                     c    a
porque qualquer mensagem enviada para o endere¸o ser´ distribuida automaticamente para
milhares de outros usuarios.
                                      co
Seu site local pode ter muitas inscri¸˜es para mysql@lists.mysql.com. Neste caso, ele pode
                         a
ter uma lista de discuss˜o local, assim as mensagens enviadas para lists.mysql.com para
          a
seu site s˜o propagadas para a lista local. Nestes casos, por favor, contate seu administrador
de sistema para adicionado ou excluido da lista local do MySQL.
        e                                              a
Se vocˆ quiser que as mensagens da lista de discuss˜o sejam enceminhadas para uma caixa
de correio separada no seu programa de emails, configure um filtro com base nos cabe¸alhosc
                      e            e               c
das mensagens. Vocˆ pode tamb´m usar os cabe¸alhos List-ID: ou Entregar-Para: para
identificar suas mensagens.
             e                                 a
Existe tamb´m as seguintes listas de discuss˜o sobre MySQL atualmente:
announce-subscribe@lists.mysql.com (anuncio)
                e                           o
          Esta ´ para anuncio de novas vers˜es do MySQL e programas relacionados.
                e
          Esta ´ uma lista com baixo volume na qual todos usuarios do MySQL deveriam
          se inscrever.
mysql-subscribe@lists.mysql.com (mysql)
                                        o                                    o        a
          A principal lista para discuss˜es MySQL em geral. Note que alguns t´picos s˜o
                                                                   e
          mais bem discutidos em listas mais especializadas. Se vocˆ enviar para a lista
                    e         a
          errada vocˆ pode n˜o obter resposta.
mysql-digest-subscribe@lists.mysql.com (mysql-digest)
                                                                  e a
          A lista mysql na forma resumida. Isto significa que vocˆ ir´ receber todas
                                                                              ´
          mensagens individuais, enviadas na forma de uma grande mensagem uma unica
          vez ao dia.
bugs-subscribe@lists.mysql.com (bugs)
                         e
          Nesta lista vocˆ somente deve postar um relato de bug completo que acontece
                                                                  e
          de maneira repetitiva usando o script mysqlbug (se vocˆ estiver executando
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                              31



                              e      a                     ca
           no Windows, vocˆ dever´ incluir uma descri¸˜o do sistema operacional e a
               a                                       e
           vers˜o do MySQL). Preferencialmente, vocˆ deve testar o problema usando a
           ´           a    a
           ultima vers˜o est´vel ou de desenvolvimento do MySQL antes de postar um erro!
           Qualquer um pode repetir o erro apenas usando mysql test < script no caso
           do teste inclu´                                                 a
                         ido. Todos os erros enviados para esta lista dever˜o ser corrigidos
                                   o                                    ca
           ou documentados na pr´xima release do MySQL! Se a solu¸˜o envolve apenas
                   ca                          o         a
           a altera¸˜o de pequena parte do c´digo, ser´ enviado um patch corrigindo o
           problema.
bugs-digest-subscribe@lists.mysql.com (bugs-digest)
                  a
          Uma vers˜o resumida da lista bugs.
internals-subscribe@lists.mysql.com (internals)
                                                   o
          Uma lista para pessoas que trabalham no c´digo do MySQL. Nesta lista pode-se
          discutir desenvolvimento do MySQL e pos-patches.
internals-digest-subscribe@lists.mysql.com (internals-digest)
                  a
          Uma vers˜o resumida da lista internals.
java-subscribe@lists.mysql.com (java)
                 a
          Discuss˜o sobre MySQL e Java. Maioria sobre o driver JDBC..
java-digest-subscribe@lists.mysql.com java-digest
                  a
          Uma vers˜o resumida da lista java.
win32-subscribe@lists.mysql.com (win32)
                        o
          Todas as quest˜es relacionada ao MySQL em sistemas operacionais Microsoft,
          como o Win95, Win98, NT e Win2000.
win32-digest-subscribe@lists.mysql.com (win32-digest)
                  a
          Uma vers˜o resumida da lista win32.
myodbc-subscribe@lists.mysql.com (myodbc)
          Tudo sobre conectividade do MySQL com ODBC.
myodbc-digest-subscribe@lists.mysql.com (myodbc-digest)
                  a
          Uma vers˜o resumida da lista myodbc.
plusplus-subscribe@lists.mysql.com (plusplus)
                           a         ca
          Tudo relacionado ` programa¸˜o da API C++ para o MySQL.
plusplus-digest-subscribe@lists.mysql.com (plusplus-digest)
                  a
          Uma vers˜o resumida da lista plusplus.
msql-mysql-modules-subscribe@lists.mysql.com (msql-mysql-modules)
          Lista sobre o Suporte MySQL no Perl. msql-mysql-modules
msql-mysql-modules-digest-subscribe@lists.mysql.com
(msql-mysql-modules-digest)
                                     a
          Lista resumida sobre a vers˜o do msql-mysql-modules.
    e
Vocˆ se inscreve ou cancela a assinatura para todas listas do mesmo jeito que foi
descrito acima. Na sua mensagem de assinatura ou cancelamento, coloque apenas o
nome da lista apropriada. Por exemplo, para assinar ou cancelar sua assinatura da
32                                            e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



lista myodbc, envie uma mensagem para myodbc-subscribe@lists.mysql.com ou
myodbc-unsubscribe@lists.mysql.com.
      e a                                       o                                ca e
Se vocˆ n˜o obtiver uma resposta para suas quest˜es na lista de mensagens, uma op¸˜o ´ pa-
                                     a            e
gar pelo suporte da MySQL AB, que ir´ colocar vocˆ em contato direto com desenvolvedores
MySQL. See undefined [Support], page undefined .
A seguinte tabela mostra algumas listas de mensagens sobre o MySQL que utilizam linguas
                  e                      a a
diferentes do Inglˆs. Perceba que elas n˜o s˜o operadas pela MySQL AB, portanto, n˜o a
podemos garantir a qualidade destas.
mysql-france-subscribe@yahoogroups.com Lista de mensagens na
          l´
           ingua francesa.
list@tinc.net Lista de mensagens coreana.
          Envie subscribe mysql your@email.address para esta lista.
                                                      a
mysql-de-request@lists.4t2.com Lista de mensagens alem~.
          Envie   subscribe mysql-de your@email.address   para  esta   lista.
             e                        co
          Vocˆ pode encontrar informa¸˜es sobre esta lista de mensagens em
          http://www.4t2.com/mysql.
mysql-br-request@listas.linkway.com.br Lista de mensagens
                    e
          em portuguˆs Envie subscribe mysql-br your@email.address para esta lista.
mysql-alta@elistas.net Lista de mensagens espanhola.
          Envie subscribe mysql your@email.address para esta lista.

1.2.4.2 Fazendo perguntas ou relatando erros
                                              a               c
Antes de enviar um relato de erro ou uma quest˜o, por favor fa¸a o seguinte:
 • Comece pesquisando o manual MySQL online em:
   http://www.mysql.com/documentation/manual.php
     o
   N´s tentaremos manter o manual atualizado, frequentemente atualizando-o com
       co
   solu¸˜es para novos problemas encontrados!
 • Pesquise os arquivos das listas de mensagens MySQL:
   http://www.mysql.com/documentation/

 • Vocˆ pode tamb´m usar a p´gina http://www.mysql.com/search.html para
      e             e            a
                       a                                      a
   pesquisar todas as p´ginas Web (incluindo o manual) que est˜o localizados em
   http://www.mysql.com/.
      e a
Se vocˆ n˜o puder encontrar uma resposta no manual ou nos arquivos, confira com seu
                                e           a                                       a
expert em MySQL local. Se vocˆ continua n˜o encontrando uma resposta para sua quest˜o,
 a                      o       ca
v´ em frente e leia a pr´xima se¸˜o sobre como enviar email para mysql@lists.mysql.com.

1.2.4.3 Como relatar erros ou problemas
                       o                      e         e
Escrever um bom relat´rio de erro exige paciˆncia, e fazˆ-lo de forma apropriada economiza
              o           e                  o
tempo para n´s e para vocˆ. Um bom relat´rio de erros contendo um teste de caso para o
bug ir´ torn´-lo muito mais f´cil para corrig´ no pr´ximo release. Esta se¸˜o ir´ ajud´-lo
      a     a                a               i-lo     o                     ca a       a
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                                        33



                       o                                e a
a escrever seu relat´rio corretamente para que vocˆ n˜o perca seu tempo fazendo coisas que
  a    a
n˜o ir˜o ajudar-nos muito ou nada.
  o
N´s encorajamos todo mundo a usar o script mysqlbug para gerar um relato de erros
(ou um relato sobre qualquer problema), se poss´         ivel. mysqlbug pode ser encontrado no
     o                                ca                                  ca       a
diret´rio ‘scripts’ na distribui¸˜o fonte, ou, para uma distribui¸˜o bin´ria, no diret´rio       o
                 o               ca                        e a
‘bin’ no diret´rio de instala¸˜o do MySQL. Se vocˆ n˜o puder utilizar o mysqlbug, vocˆ               e
                                                co            a
pode continuar incluindo todas as informa¸˜es necess´rias listadas nesta se¸˜o.      ca
                                    a                   o
O script mysqlbug lhe ajudar´ a gerar um relat´rio determinando muitas das seguintes
          co
informa¸˜es automaticamente, mas se alguma coisa importante estiver faltando, por favor
      c                                                            ca
forne¸a-o junto de sua mensagem! Por favor leita esta se¸˜o com cuidado e tenha certeza
que todas as informa¸˜es descritas aquie est˜o inclu´
                         co                       a                           o
                                                            idas no seu relat´rio.
                                                           e
O lugar comum para relatar erros e problemas ´ mysql@lists.mysql.com. Se vocˆ                        e
fizer um caso com testes que demonstre o bug claramente, pode post´-lo na lista          a
                                                        e         a
bugs@lists.mysql.com. Note que nesta lista vocˆ dever´ postar somente um um relat´rio            o
                                                     e
completo, usando o script mysqlbug. Se vocˆ estiver trabalhando com o MySQL para
                 e                           ca
Windows, vocˆ deve incluir uma descri¸˜o do sistema operacional e a vers˜o do MySQL.  a
                           e                                          ´
Preferencialmente vocˆ deve testar o problema usando a ultima vers˜o est´vel ou de a       a
desenvolvimento do MySQL antes de postar ! Qualquer um deve conseguir repetir o
erro usando apenas “mysql test < script” no teste do caso incluso, ou executandoo do
shell ou utilizando scripts perl inclusos no relatorio de erro. Todos os erros postados na
                 a                                           o
lista bugs ser˜o corrigidos ou documentados na pr´xima release do MySQL! Se foram
        a                                 co       o
necess´rias apenas pequenas altera¸˜es no c´digo para resolver este problema, n´s iremos     o
publicar um patch que corrige o problema.
Lembre-se que ´ poss´ responder a uma mensagem contendo muita informa¸˜o, mas n˜o
                   e     ivel                                                            ca        a
a uma contendo muito pouca. Frequentemente pessoas omitem fatos porque acreditam que
                                                                           a
conhecem a causa do problema e assumem que alguns detalhes n˜o importam. Um bom
            e          e    a      u                                                    ´
principio ´: Se vocˆ est´ em d´vida sobre declarar alguma coisa, declare-a ! E milhares de
              a                          a
vezes mais r´pido e menos problem´tico escrever um pouco de linhas a mais no seu relat´rio       o
                 c                                                                    e a
do que ser for¸ado a perguntar de novo e esperar pela resposta porque vocˆ n˜o forneceu
          ca
informa¸˜o sufiente da primeira vez.
                                                                a               u
Os erros mais comuns acontecem porque as pessoas n˜o indicam o n´mero da vers˜o da             a
           ca                         a                a
distribui¸˜o do MySQL que est˜o usando, ou n˜o indicam em qual plataforma elas tem
                                           u              a
o MySQL instalado (Incluindo o n´mero da vers˜o da plataforma). Essa informa¸˜o ´              ca e
                                                              e u
muito relevante, e em 99% dos casos o relato de erro ´ in´til sem ela! Frequentemente n´s          o
                     o                           a
recebemos quest˜es como, “Por que isto n˜o funciona para mim?” ent˜o n´s vemos quea o
                                a                                         a
aquele recurso requisitado n˜o estava implementado naquela vers˜o do MySQL, ou que o
                            o                                  a
erro descrito num relat´rio foi resolvido em uma vers˜o do MySQL mais nova. Algumas
vezes o erro ´ dependente da plataforma; nesses casos, ´ quase imposs´ corrigir alguma
               e                                                 e              ivel
                                                             u              a
coisa sem conhecimento do sistema operacional e o n´mero da vers˜o da plataforma.
                     e                       co
Lembre-se tamb´m de fornecer informa¸˜es sobre seu compilador, se isto for relacionado
ao problema. Frequentemente pessoas encontram erros em compiladores e acreditam que o
            e                                                             a
problema ´ relacionado ao MySQL. A maioria dos compiladores est˜o sobre desenvolvimento
                                                        a
todo o tempo e tornam-se melhores a cada vers˜o. Para determinar se o seu problema
                a                       o
depende ou n˜o do compilador, n´s precisamos saber qual compilador foi usado. Note que
                              ca
todo problema de compila¸˜o deve ser estimado como relato de erros e, consequentemente
publicado.
34                                               e      e                       a
                                            Referˆncia t´cnica para o MySQL vers˜o 3.23.52



´
E de grande ajuda quando uma boa descri¸˜o do problema ´ inclu´ no relato do erro. Isto
                                             ca                e        ida
e
´, um bom exemplo de todas as coisas que o levou ao problema e a correta descri¸˜o do      ca
                             o      a
problema. Os melhores relat´rios s˜o aqueles que incluem um exemplo completo mostrando
como reproduzir o erro ou o problema See undefined [Reproduceable test case], page un-
defined .
                                                      e
Se um programa produz uma mensagem de erro, ´ muito importante incluir essas mensagens
              o          o
no seu relat´rio! Se n´s tentarmos procurar por algo dos arquivos usando programas, ´           e
melhor que as mensagens de erro relatadas sejam exatamente iguais a que o programa
                e                                         e
produziu. (At´ o caso deve ser observado!) Vocˆ nunca deve tentar lembrar qual foi a
mensagem de erro; e sim, copiar e colar a mensagem inteira no seu relat´rio!    o
       e                                                e
Se vocˆ tem um problema com o MyODBC, vocˆ deve tentar gerar um arquivo para ras-
tremento de erros (trace) do MyODBC. See undefined [MyODBC bug report], page un-
defined .
Por favor lembre-se que muitas das pessoas que ler˜o seu relat´rio podem usar um v´
                                                          a         o                     ideo de
                                              o
80 colunas. Quando estiver gerando relat´rios ou exemplos usando a ferramenta de linha
                         a       a            ca                              ca
de comando mysql, ent˜o dever´ usar a op¸˜o --vertical (ou a instru¸˜o terminadora \G)
para sa´ que ir´ exceder a largura dispon´ para este tipo de v´
        ida       a                             ivel                      ideo (por exemplo, com
         ca
a instru¸˜o EXPLAIN SELECT; veja exemplo abaixo).
                                     ca
Por favor inclua a seguinte informa¸˜o no seu relat´rio:   o
  • O n´mero da vers˜o da distribui¸˜o do MySQL que est´ em uso (por exemplo, MySQL
         u              a              ca                       a
                            e        a                       a   e       a
     Version 3.22.22). Vocˆ poder´ saber qual vers˜o vocˆs est´ executando, usando o
     comando mysqladmin version. mysqladmin pode ser encontrado no diret´rio ‘bin’      o
                     ca
     sob sua instala¸˜o do MySQL.
  • O fabricante e o modelo da m´quina na qual vocˆ est´ trabalhando.
                                    a                        e a
  • O nome do sistema operacional e a vers˜o. Para a maioria dos sistemas operacionais,
                                                 a
         e                         ca
     vocˆ pode obter esta informa¸˜o executando o comando Unix uname -a.
  • Algumas vezes a quantidade de mem´ria (real e virtual) ´ relevante. Se estiver em
                                               o                      e
      u
     d´vida, inclua esses valores.
  • Se vocˆ estiver usando uma distribui¸˜o fonte do MySQL, ´ necess´rio o nome e n´mero
            e                               ca                      e        a             u
              a                                   e                                  ca
     da vers˜o do compilador usado. Se vocˆ estiver usando uma distribui¸˜o bin´ria, ´     a    e
            a                        ca
     necess´rio o nome da distribui¸˜o.
  • Se o problema ocorre durante a compila¸˜o, inclua a(s) exata(s) mensagem(s) de erro(s)
                                                ca
             e                                                    o
     e tamb´m algumas linhas do contexto envolvendo o c´digo no arquivo onde o erro
     ocorreu.
  • Se o mysqld finalizou, vocˆ dever´ relatar tamb´m a consulta que travou o mysqld.
                                 e        a                  e
                        e
     Normalmente vocˆ pode encontrar isto executando mysqld com o log habilitado. See
      undefined [Using log files], page undefined
  • Se alguma tabela do banco de dados estiver relacionado ao problema, inclua a sa´ de     ida
                                                                            e
     mysqldump --nodata nome_db nome_tbl1 nome_tbl2.... Isto ´ muito f´cil de fazer   a
       e                                           co
     e ´ um modo poderoso de obter informa¸˜es sobre qualquer tabela em um banco de
                  a                                  ca
     dados que ir´ ajudar-nos a criar uma situa¸˜o parecida da que vocˆ tem.   e
  • Para problemas relacionados ` velocidade ou problemas com instru¸˜es SELECT, vocˆ
                                    a                                            co             e
     sempre deve incluir a sa´ de EXPLAIN SELECT ... e ao menos o n´mero de linhas
                               ida                                                 u
                  ca                                              ca       e
     que a instru¸˜o SELECT produz. Quanto mais informa¸˜o vocˆ fornecer sobre a sua
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                            35



          ca         a       a          e                                            o
     situa¸˜o, mais f´cil ser´ para algu´m ajudar-lo! A seguir um exemplo de um relat´rio
     de erros muito bom (ele deve ser postado com o script mysqlbug):
                      ca
     Exemplo de execu¸˜o usando a ferramenta de linha de comando mysql (perceba o uso
     do instru¸˜o terminadora \G para instru¸˜es cuja largura de sa´ deva ultrapassar 80
               ca                           co                     ida
     colunas):
           mysql> SHOW VARIABLES;
           mysql> SHOW COLUMNS FROM ...\G
                   <saida para SHOW COLUMNS>
           mysql> EXPLAIN SELECT ...\G
                   <saida para EXPLAIN>
           mysql> FLUSH STATUS;
           mysql> SELECT ...;
                   <Uma pequena vers~o da sa´da do SELECT,
                                       a        i
                   incluindo a hora em que a consulta foi executada>
           mysql> SHOW STATUS;
                   <saida do SHOW STATUS>
 • Se um erro ou problema ocorrer quando estiver executando o mysqld, tente fornecer um
                           a
   script de entrada que ir´ reproduzir a anomalia. Este script deve incluir qualquer ar-
                        a                   o                                        ca
   quivo de fonte necess´rio. Quanto mais pr´ximo o script puder reproduzir sua situa¸˜o,
                  e                  e                           e      a     a
   melhor. Se vocˆ puder fazer uma s´rie de testes repetidos, vocˆ poder´ post´-lo para o
   bugs@lists.mysql.com para um tratamento de alta prioridade!
   Se n˜o puder fornecer o script, vocˆ ao menos deve incluir a sa´ de mysqladmin
        a                               e                            ida
   variables extended-status processlist na sua mensagem para fornecer alguma
           ca
   informa¸˜o da performance do seus sistema.
 •
            e a
     Se vocˆ n˜o puder produzir um caso de teste em algumas linhas, ou se a tabela de
     testes for muito grande para ser enviada por email para a lista de mensagens (mais de
                    e      a
     10 linhas), vocˆ dever´ dar um dump de suas tabelas usando o mysqldump e criar um
     arquivo ‘README’ que descreve seu problema.
     Crie um arquivo comprimido de seus arquivos usando tar e gzip ou zip, e use o
     ftp para transferir o arquivo para ftp://support.mysql.com/pub/mysql/secret/.
                                ca
     E envie uma pequena descri¸˜o do problema para bugs@lists.mysql.com.
 • Se vocˆ achar que o MySQL produziu um resultado estranho para uma consulta, n˜o
          e                                                                       a
                                       e           a
   inclua somente o resultado, mas tamb´m sua opini˜o de como o resultado deve ser, e
                                            a
   uma conta descrevendo o base de sua opini˜o.
 • Quando fornecer um exemplo do problema, ´ melhor usar os nomes de vari´veis, nomes
                                               e                            a
                                           ca
   de tabelas, etc. utilizados na sua situa¸˜o atual do que enviar com novos nomes. O
                                                   a                            a
   problema pode ser relacionado ao nome da vari´vel ou tabela! Esses casos s˜o raros,
        e                                     e           a       a            e
   mas ´ melhor prevenir do que remediar. Al´m disso, ser´ mais f´cil para vocˆ fornecer
                                  ca             e                           o
   um exemplo que use sua situa¸˜o atual, que ´ o que mais importa para n´s. No caso
                      a                                 e
   de ter dados que n˜o deseja mostrar para outros, vocˆ pode usar o ftp para transferi-
                                                                           a
   lo para ftp://support.mysql.com/pub/mysql/secret/. Se os dados s˜o realmente
                      e a                a                      o      a a
   confidenciais, e vocˆ n˜o deseja mostr´-los nem mesmo para n´s, ent˜o v´ em frente e
   providencie um exemplo usando outros nome, mas, por favor considere isso como uma
   ´
   unica chance.
36                                                e      e                       a
                                             Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • Inclua, se poss´                    co
                     ivel, todas as op¸˜es fornecidas aos programas relevantes. Por exemplo,
                   co             e
   indique as op¸˜es que vocˆ utiliza quando inicializa o daemon mysqld e aquelas que s˜o       a
                                                                            co
   utilizadas para executar qualquer programa cliente MySQL. As op¸˜es para programas
                                                                a
   como o mysqld e mysql, e para o script configure, s˜o frequentemente chaves para
   respostas e s˜o muito relevantes! Nunca ´ uma m´ id´ia inclu´
                   a                              e       a e          i-las de qualquer forma!
           e                  o                                          c       u
   Se vocˆ usa algum m´dulo, como Perl ou PHP por favor forne¸a o n´mero da vers˜o              a
   deles tamb´m. e
 • Se sua quest˜o ´ relacionada ao sistema de privil´gios, por favor forne¸a a sa´
                    a e                                      e                         c       ida
   de mysqlaccess, a sa´ de mysqladmin reload, e todas as mensagens de erro que
                               ida
       e                                                   e                     e
   vocˆ obteve quando tentava conectar! Quando vocˆ testar seus privil´gios, vocˆ deve      e
   primeiramente executar mysqlaccess. Depois, execute mysqladmin reload version e
   tente conectar com o programa que gerou o problema. mysqlaccess pode ser encon-
                     o                       o             ca
   trado no diret´rio ‘bin’ sob seu diret´rio de instala¸˜o do MySQL.
 • Se vocˆ tiver um patch para um erro, isso ´ bom, mas n˜o assuma que o patch ´
           e                                          e              a                            e
                                                a         e a
   tudo que precisamos, ou que iremos us´-lo, se vocˆ n˜o fornecer algumas informa¸˜es        co
          a
   necess´rias, como os casos de testes mostrando o erro que seu patch corrige. N´s             o
                                                          o               a
   podemos encontrar problemas com seu patch ou n´s podemos n˜o entendˆ-lo ao todo; e
                     a
   se for assim, n˜o podemos us´-lo. a
        o a                                                              o a
   Se n´s n˜o verificarmos exatamente o que o patch quer dizer, n´s n˜o poderemos us´-            a
                              a                                             a
   lo. Casos de testes ir˜o ajudar-nos aqui. Mostre que o patch ir´ cuidar de todas as
         co                                o
   situa¸˜es que possam ocorrer. Se n´s encontrarmos um caso (mesmo que raro) onde o
             a
   patch n˜o funcionaria, ele pode ser in´til.u
 • Palpites sobre o que o erro pode ser, porque ocorre, ou do que ele depende, geralmente
      a                                         a
   est˜o errados. Mesmo o time MySQL n˜o pode adivinhar antecipadamente tais coisas
   sem usar um debugger para determinar a causa real do erro.
 • Indique na sua mensagem de e-mail que vocˆ conferiu o manual de referˆncia e o arquivo
                                                    e                            e
                                                       e
   de mensagens para que outros saibam que vocˆ tentou solucionar o problema.
 • Se vocˆ obter um parse error, por favor confira sua sintaxe com aten¸˜o! Se
           e                                                                             ca
       e a                                                          e
   vocˆ n˜o conseguiu encontrar nada errado com ela, ´ extremamente prov´vel                  a
                            a                            a
   que que sua vers˜o corrente do MySQL n˜o suporte a consulta que vocˆ                           e
      a
   est´ utilizando.                 e                           a
                             Se vocˆ estiver usando a vers˜o recente e o manual em
                                                                  a
   http://www.mysql.com/documentation/manual.php n˜o cobrir a sintaxe que
       e                                  a
   vocˆ estiver usando, o MySQL n˜o suporta sua consulta. Neste caso, suas unicas
      co       a                      e
   op¸˜es s˜o implementar vocˆ mesmo a sintaxe ou enviar uma mensagem para
   mysql-licensing@mysql.com e perguntar por uma oferta para implement´-lo!           a
                                             e                         e
   Se o manual cobrir a sintaxe que vocˆ estiver usando, mas vocˆ tiver uma vers˜o mais   a
                                e     a                o              co
   antiga do MySQL, vocˆ dever´ conferir o hist´rico de altera¸˜es do MySQL para ver
                                                              e            ca
   quando a sintaxe foi implementada. Neste caso, vocˆ tem a op¸˜o de atualizar para
                     a
   uma nova vers˜o do MySQL. See undefined [News], page undefined .
 • Se vocˆ tiver um problema do tipo que seus dados aparecem corrompidos ou vocˆ
           e                                                                                      e
                                  e                                            e
   obtem erros quando vocˆ acessa alguma tabela em particular, vocˆ dever´ primeiro    a
   checar depois tentar reparar suas tabelas com myisamchk ou CHECK TABLE e REPAIR
   TABLE. See undefined [MySQL Database Administration], page undefined .
 • Se vocˆ frequentemente obt´m tabelas corrompidas,
               e                          e                                       e
                                                                              vocˆ deve ten-
   tar encontrar quando e porque isto acontece!                      Neste caso, o arquivo
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                             37



   ‘mysql-data-directory/’hostname’.err’ deve conter algumas informa¸˜es           co
   sobre o que aconteceu. See undefined [Error log], page undefined . Por favor forne¸ac
                       ca                                     o
   qualquer informa¸˜o relevante deste arquivo no seu relat´rio de erro! Normalmente
                              a
   o mysqld NUNCA dever´ danificar uma tabela se nada o finalizou no meio de uma
            ca            e
   atualiza¸˜o! Se vocˆ puder encontrar a causa do fim do mysqld, se torna muito mais
    a           o                  e          ca
   f´cil para n´s fornecemos a vocˆ uma solu¸˜o para o problema! See undefined [What
   is crashing], page undefined .
 • Se poss´        c                             a
           ivel, fa¸a o download e instale a vers˜o mais recente do MySQL para saber se
                     a                             o               a
   ela resolve ou n˜o o seu problema. Todas vers˜es do MySQL s˜o muito bem testadas
   e devem funcionar sem problemas! Acreditamos em deixar tudo, o mais comp´tivela
   poss´                    o                 e          a              o
        ivel com as vers˜es anteriores, e vocˆ conseguir´ mudar de vers˜es MySQL em
   minutos! See undefined [Which version], page undefined .

      e e                                                            o
Se vocˆ ´ um cliente de nosso suporte, por favor envio o seu relat´rio de erros em
                                                         a
mysql-support@mysql.com para tratamento de alta priorit´rio, bem como para a lista de
                                          e             e
mensagens apropriada para ver se mais algu´m teve experiˆncias com (e talvez resolveu) o
problema.
            co
Para informa¸˜es sobre relatar erros no MyODBC, veja undefined [ODBC Problems],
page undefined .
         co
Para solu¸˜es a alguns problemas comuns, veja See undefined [Problems], page unde-
fined .
                   a                   e                    a                            e
Quando respostas s˜o enviadas para vocˆ individualmente e n˜o para a lista de mensagens, ´
considerado boa etiqueta resumir as respostas e enviar o resumo para a lista de mensagens
para que outras possam ter o benef´                            e
                                    icio das respostas que vocˆ recebeu que ajudaram a
resolver seu problema!

                                 o                      a
1.2.4.4 Guia para responder quest˜es na lista de discuss˜o
       e                                                            e                 a
Se vocˆ considerar que sua respota possa ter um amplo interesse, vocˆ pode querer post´-la
para a lista de mensagens em vez de responder diretamente para a pessoa que perquntou.
Tente deixar sua resposta da forma mais gen´rica poss´
                                              e                                        e
                                                       ivel para que outras pessoas al´m
                                                                  e
da que postou a pergunda possam se beneficiar dela. Quando vocˆ postar para a lista, por
                                      a e        e
favor tenha certeza que sua resposta n˜o ´ uma r´plica de uma resposta anterior.
                                        a                    a
Tente resumir a parte essencial da quest˜o na sua resposta, n˜o se sinta obrigado a citar a
mensagem original inteira.
           a
Por favor n˜o poste mensagens a partir de seu browser com o modo HTML ligado! Muitos
   a      a
usu´rios n˜o leem e-mail com browser!

1.3 Licenciamento e Suporte do MySQL
       ca
Esta se¸˜o descreve o suporte MySQL e termos de licenciamento:
 • Os direitos autorais em que o MySQL ´ distribu´ (see undefined [Copyright],
                                           e          ido
    page undefined )
 • Exemplos de situa¸˜es ilustrando onde uma licen¸a ´ necess´ria (see undefined [Li-
                     co                           c e        a
   censing examples], page undefined )
38                                              e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • Custos de Suporte (see undefined [Cost], page undefined ) e seus benef´
                                                                       icios (see
    undefined [Support], page undefined )
 • Custos do licenciamento comercial

1.3.1 Pol´
         itica de licenciamento MySQL
                             c
Os termos formais da licen¸a GPL podem ser encontradas em undefined [GPL license],
page undefined . Basicamente, nossa pol´                   c               ca         e
                                            itica de licen¸as e interpreta¸˜o da GPL ´ desta
forma:
                    o                                                        c
Perceba que vers˜es mais antigas do MySQL ainda utilizam uma licen¸a mais rsstrita.
                    ca                  a                         c          e
Veja a documenta¸˜o para aquela vers˜o para maiores informa¸es. Se vocˆ precisa de uma
     c                                          ca a                            c
licen¸a MySQL comercial, porque sua aplica¸˜o n˜o se encaixa com a licen¸a GPL, vocˆ        e
pode comprar uma em https://order.mysql.com
                                        a                    e a
Para uso interno normal, o MySQL n˜o custa nada. Vocˆ n˜o tem que nos pagar se n˜o        a
           e
quiser fazˆ-lo.
            c e         a
Uma licen¸a ´ necess´ria se:
  − Se vocˆ unir um programa, que n˜o ´ software livre, com c´digo do MySQL server ou
             e                          a e                        o
     clientes que tem o direito autoral baseado na GPL. Isto acontece por exemplo quando
         e                                                               co
     vocˆ usa o MySQL como um servidor embutido nas suas aplica¸˜es ou quando vocˆ          e
                      o   a                                                       ca o
     adiciona extens˜es n˜o livres para o servidor MySQL. Neste caso, sua aplica¸˜o/c´digo
       a        e                      e
     ir´ tamb´m se tornar GPL atrav´s do esquema GPL que age como um virus. Licen-
                                                                  c               e a
     ciando o servidor MySQL da MySQL AB sobre uma licen¸a comercial vocˆ ir´ evitar
     este problema. Veja http://www.gnu.org/copyleft/gpl-faq.html.
  − Vocˆ tem uma aplica¸˜o comercial que trabalha SOMENTE com o MySQL e distribui
         e                 ca
               ca
     a aplica¸˜o com o servidor MySQL. Isto acontece porque vemos isto como uma uni˜o     a
                  e         e
     mesmo se ´ feito atrav´s da rede.
  − Vocˆ tem uma distribui¸˜o do MySQL e vocˆ n˜o fornece o c´digo fonte para sua c´pia
         e                    ca                   e a              o                   o
                                 e                  c
     do servidor MySQL, como ´ definido na licen¸a GPL.
 ˜               a            c
NAO seria necess´ria uma licen¸a se:
 − N˜o ´ necess´rio uma licen¸a para incluir o c´digo cliente em programas comerciais.
     a e         a            c                 o
                                e
   A parte cliente do MySQL ´ licenciada com a LGPL GNU Library General Public
                                                                      o
   License. O programa cliente de comandos de linha mysql inclue c´digo da biblioteca
                     a
   readline que est´ na GPL.
 − Se a forma que vocˆ usa o MySQL n˜o necessitar a licen¸a, mas vocˆ gosta do MySQL
                       e               a                  c           e
                                                     e                  a
   e quer promover e encorajar o desenvolvimento, vocˆ certamente ser´ bem vindo para
                       c
   comprar uma licen¸a ou suporte do MySQL.
 − Se vocˆ usa o MySQL num contexto comercial no qual obtem lucro com seu uso, n´s
          e                                                                         o
   pedimos que vocˆ ajude o desenvolvimento do MySQL, comprando algum n´
                     e                                                         ivel de
               o                                           o     e      a       a
   suporte. N´s sentimos que se o MySQL ajuda seu neg´cio, ´ razo´vel pedir ` vocˆ   e
                                               e                    o
   que ajude o MySQL. (De outra forma, se vocˆ nos pergutar questˆes de suporte, vocˆe
    a       a                        c
   n˜o estar´ somente usando de gra¸a uma coisa em que colocamos muito trabalho, mas,
   tamb´m estar´ pedindo para n´s fornecermos suporte gratu´
        e         a               o                           ito.)
             a                      c         e       a        e                    c
Para circunstˆncias em que uma licen¸a MySQL ´ necess´ria, vocˆ precisa de uma licen¸a
            a                                                       a             a
para cada m´quina que executar o servidor mysqld. Entretanto, uma m´quina com v´rios
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                            39



                               a      ´        a                co            u
processadores conta como uma m´quina unica, e n˜o existem restri¸˜es sobre o n´mero de
                                          a              u
servidores MySQL que executam em uma m´quina ou no n´mero de clientes conectados
      a                                          a
simultˆneamente a um servidor executado naquela m´quina!
      e                                 c e        a        a
Se vocˆ tiver alguma duvida se uma licen¸a ´ necess´ria ou n˜o para seu uso particular do
MySQL, por favor leia isto de novo e contate-nos. See undefined [Contact information],
page undefined .
      e                       c                      a                       e
Se vocˆ necessita de uma licen¸a MySQL, o modo mais f´cil para pagar por ele ´ usar o for-
    a           c
mul´rio de licen¸a no servidor securo da MySQL em https://order.mysql.com/. Outras
                        a
formas de pagamento s˜o discutidas em undefined [Payment information], page unde-
fined .

1.3.2 Direitos autorais usados no MySQL
           a                                            ca
Existem v´rios direitos autorais diferentes na distribui¸˜o do MySQL:
 1. O c´digo fonte espec´
        o                             a                                           e
                          ifico necess´rio para construir a biblioteca mysqlclient ´ licen-
                                               o             e
    ciada sobre a LGPL e programas no diret´rio ‘client’ ´ GPL. Cada arquivo tem um
         c                                       e
    cabe¸alho que mostra qual direito autoral ´ usado para aquele arquivo.
                                          a
 2. A biblioteca cliente e a (GNU getopt s˜o cobertas pela “GNU LIBRARY GENERAL
    PUBLIC LICENSE.” See undefined [LGPL license], page undefined .
                                                  a
 3. Algumas partes da fonte (a biblioteca regexp s˜o cobertas pelos direitos autorais no
    estilo de Berkeley.
                                                             e
 4. Todas as fontes no servidor e a biblioteca (GNU readline ´ coberta pela “GNU GEN-
    ERAL PUBLIC LICENSE.” See undefined [GPL license], page undefined . Isto
                                                             c˜
    tamb´m est´ dispon´ no arquivo ‘COPYING’ nas distribui¸Oes.
        e      a        ivel
Um objetivo ´ que a biblioteca cliente SQL deve ser livre o bastante que seja poss´
             e                                                                    ivel
                                                              c               a
adicionar suporte MySQL em produtos comerciais sem uma licen¸a. Para esta raz˜o, n´so
                  c               o
escolhemos a licen¸a LGPL para o c´digo cliente.
                     e
Isto significa que vocˆ pode usar o MySQL gratuitamente com qualquer programa que use
                       c                  e     e     a               ca
qualquer tipo de licen¸a livre. O MySQL ´ tamb´m gr´tis para a utiliza¸˜o por qualquer
    a                        o
usu´rio final para seu uso pr´prio ou dentro da empresa.
                  e                                                  a
Entretanto, se vocˆ usa o MySQL para alguma coisa importante, poder˜ querer ajudar a
                                           c
segurar seu desenvolvimento comprando licen¸as ou contrato de suporte. See undefined
[Support], page undefined .

1.3.2.1 Poss´           co
            iveis altera¸˜es futuras dos direitos autorais
      a                                         c                                 ca
A vers˜o 3.22 do MySQL continua usando uma licen¸a mais restrita. Veja a documenta¸˜o
                a                      co
para aquela vers˜o para maiores informa¸˜es.

                       co
1.3.3 Exemplos de situa¸˜es de licenciamento
        ca                       co                    e          a
Esta se¸˜o descreve algumas situa¸˜es ilustrando se vocˆ deve ou n˜o licenciar o servidor
MySQL. Geralmente estes exemplos envolvem o fornecimento do MySQL como uma parte
integral do produto.
40                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                     c ´                                 u
Perceba que uma licen¸a unica do MySQL cobre qualquer n´mero de CPUs e servidores
                  a        a                           u
mysqld em uma m´quina! N˜o existe limite artificial no n´mero de clientes que conectam
ao servidor em nenhum caso.

1.3.3.1 Vendendo produtos que usam o MySQL
                      e             a              c                                ca
Para determinar se vocˆ precisa ou n˜o de uma licen¸a MySQL quando vender sua aplica¸˜o,
   e                                  ca e                                      e
vocˆ deve se perguntar se a sua aplica¸˜o ´ dependente no uso do MySQL e se vocˆ inclui
     a
ou n˜o o servidor MySQL com seu produto. Existem diversos casos a considerar:
 • Sua aplica¸˜o necessita do MySQL para funcionar corretamente ?
             ca
 • Se seu produto necessita do MySQL, vocˆ precisa de uma licen¸a para qualquer m´quina
                                         e                     c                 a
                                                      e                      ca
   que executa o servidor mysqld. Por exemplo, se vocˆ desenvolveu sua aplica¸˜o sobre o
               a     e
   MySQL, ent˜o vocˆ realmente criou um produto comercial que necessita do mecanismo,
      a                       c
   ent˜o precisa de uma licen¸a.
 • Se a sua aplica¸˜o n˜o necessita do MySQL, vocˆ n˜o precisa obter uma licen¸a. Por
                  ca a                              e a                         c
   exemplo, se o uso do MySQL apenas adiciona alguns novos recursos opcionais para seu
   produto (como gerar log para um banco de dados em vez de simplesmente usar um
                                                           c a e          a
   arquivo texto), ela deve cair no uso normal, e uma licen¸a n˜o ´ necess´ria.
 • Em outras palavras, vocˆ precisa de uma licen¸a se vocˆ vender um produto desen-
                           e                     c        e
   volvido para ser usado especificamente com o MySQL ou que necessita do servidor
                                               e                  e            a
   MySQL para funcionar completamente. Isto ´ verdadeiro se vocˆ fornecer ou n˜o o
                                                  ca
   MySQL para seu cliente como parte da distribui¸˜o de seu produto.
 • Ela tamb´m depende do que vocˆ ir´ fazer pelo cliente. Vocˆ planeja fornecer a seu
              e                      e a                       e
                 co
   cliente instru¸˜es detalhadas sobre como instalar o MySQL com seu software? Ent˜oa
                                                                   a       a
   seu produto pode ser contingente no uso do MySQL; se sim, ser´ necess´ria a com-
                      c         e    a
   pra de uma licen¸a. Se vocˆ est´ simplesmente amarrando em um banco de dados
            e         a                  e                                          a
   que vocˆ espera j´ estar instalado na ´poca em que seu software foi comprado, ent˜o
                    a                     c
   possivelmente n˜o precisa de uma licen¸a.

             c
1.3.3.2 Servi¸os ISP MySQL
                   c
Provedores de servi¸o de Internet (ISPs) geralmente hospedam servidores MySQL para seus
                     c              a                      c
clientes. Com a licen¸a GPL isto n˜o necessita de uma licen¸a.
                 o
Por outro lado, n´s encorajamos as pessoas a usar ISPs que possuem suporte MySQL, isto
   a                 c                                                         ca
dar´ a eles a confian¸a de que se eles tiverem algum problema com a sua instala¸˜o do
                       a
MySQL, seu ISP poder´ resolver o problema para eles (em alguns casos com a ajuda da
equipe de desenvolvimento MySQL).
Todos ISPs que desejam se manter atualizados devem se inscrever na nossa lista de men-
sagens announce para que eles possam ser notificados sobre assuntos que possam ser rele-
                        co
vantes para suas instala¸˜es MySQL.
                       a                c
Perceba que se o ISP n˜o tem uma licen¸a para o MySQL, ele deve fornecer ao menos acesso
                                   ca
de leitura para a fontes da instala¸˜o MySQL para que seus clientes posssam verificar se foi
corretamente corrigido.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                              41



1.3.3.3 Executando um servidor web usando o MySQL.
      e                                                       a
Se vocˆ usa o MySQL em conjunto com um servidor Web no Unix, n˜o existe necessidade
                       c
de pagar para uma licen¸a.
     e                     e
Isto ´ verdade mesmo se vocˆ executa um servidor Web Comercial que usa MySQL, porque
    e a        a                   a
vocˆ n˜o estar´ vendendo uma vers˜o do MySQL embutida. Entretanto, neste caso n´s o
                   e                                                  a
gostariamos que vocˆ comprasse suporte MySQL. Porque a MySQL estar´ ajudando a sua
empresa.

1.3.4 Custos de licenciamento e suporte do MySQL
                        c             c e
Nossa lista atual de pre¸os para licen¸as ´ acessada abaixo. Para fazer uma compra, por
favor visitehttps://order.mysql.com/.
      e               a       e              e                               a
Se vocˆ pagar com cart˜o de cr´dito, a moeda ´ EURO (European Union Euro) ent˜o os
   c
pre¸os podem ser um pouco diferentes.
  u            c
N´mero de Licen¸as                 o
                              Por c´pia
1-9                           230 EURO
10-24                         138 EURO
25-49                         117 EURO
50-99                         102 EURO
100-249                       91 EURO
250-499                       76 EURO
500-999                       66 EURO
Para um alto volume de compras (OEM), por favor, contate: sales@mysql.com.
                          e                              a
Para compras OEM, vocˆ deve agir como o intermedi´rio para eventuais problemas ou
       co              a        o      e
requisi¸˜es de seus usu´rios. N´s tamb´m solicitamos que os clientes OEM tenham pelo
                                                            c               a
menos uma contrato extendido de suporte. Note que as licen¸as OEM somente s˜o aplicadas
                         a    a
para produtos onde o usu´rio n˜o tem acesso direto ao servidor MySQL (Sistema embutido).
                                                                    ca
Em outras palavras, o servidor MySQL deve ser usado com a aplica¸˜o que foi fornecida
        e
por vocˆ.
       e                                                                       e
Se vocˆ possui um produto de grande vendagem e baixa margem de lucro, vocˆ pode sempre
                                                                           c
discutir conosco sobre outros termos (por exemplo, um percentual do pre¸o de venda). Se
e                                             c                                ca
´ seu caso, por favor informe seu produto, pre¸o, mercado e qualquer informa¸˜o que possa
ser relevante.
Uma licen¸a paga n˜o ´ um acordo de suporte e inclui suporte m´
           c        a e                                                                   o
                                                                inimo. Isto significa que n´s
                                    a                                                ca
tentamos responder qualquer quest˜o relevante. Se a resposta existe na documenta¸˜o, n´s  o
                a            ca                     e a                        c
iremos direcion´-lo para a se¸˜o apropriada. Se vocˆ n˜o comprou uma licen¸a ou suporte,
                  a                e
provavelmente n˜o iremos respondˆ-lo.
Se vocˆ descobrir o que consideramos de um bug real, iremos corrig´ de qualquer maneira.
       e                                                           i-lo
            e                               a                           ca
Mas se vocˆ paga pelo suporte iremos notific´-lo sobre o estado da corre¸˜o em vez de apenas
        a
consert´-lo em um release posterior.
Suporte mais completo ´ vendido separadamente. Descri¸˜es do que cada n´ de suporte
                         e                                co                  ivel
         e                                                                         a
oferece ´ fornecido em undefined [Support], page undefined . Custos para os v´rios tipos
de suporte comercial s˜o vistos abaixo. Os pre¸os dos n´
                        a                       c                              a
                                                          iveis de suporte est˜o em EURO
(European Union Euro). Um EURO equivale algo em torno de 1.06 USD.
42                                            e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



Tipo de suporte                                 Custo por ano
          a
Suporte b´sico por e-mail. See undefined EURO 200
[Basic email support], page undefined .
Suporte extendido por e-mail See undefined EURO 1000
[Extended email support], page undefined .
Suporte com Login See undefined [Login EURO 2000
support], page undefined .
Suporte extendido com Login See undefined EURO 5000
[Extended login support], page undefined .
             o
Suporte telefˆnico See undefined [Telephone EURO 12000
support], page undefined .
Vocˆ pode atualizar de qualquer n´
    e                                ivel baixo de suporte para um n´  ivel mais alto pela
       c        c                 ´
diferen¸a de pre¸o entre os dois niveis.
  o       e                            o
N´s tamb´m fornecemos suporte telefˆnico (na maioria suporte emergencial mas tamb´m    e
                        ca                            a              c        e
suporte 24/7). Esta op¸˜o de suporte, entretanto, n˜o tem um pre¸o fixo e ´ negociado
                        e                       ca
para caso a caso. Se vocˆ tem interesse nesta op¸˜o envie um email para sales@mysql.com
e diga-nos sobre suas necessidades.
                                            e
Entenda que como nossa equipe de vendas ´ muito ocupada, ela pode tomar algum tempo
  e                ca
at´ que sua requisi¸˜o seja atentida. Nosso pessoal de suporte entretanto sempre atender´a
              a       o
prontamente `s quest˜es de suporte!

               co
1.3.4.1 Informa¸˜es de pagamento
                                                              o        e
Atualmente podemos receber pagamento em conta, cheques ou cart˜es de cr´dito.
                            a
Pagamentos podem ser feitos `:
     Postgirot Bank AB
     105 06 STOCKHOLM, SWEDEN

     MySQL AB
     BOX 6434
     11382 STOCKHOLM, SWEDEN

              c
       Endere¸o SWIFT : PGSI SESS
        u
       N´mero da conta: 96 77 06 - 3
                  c                                 c
Especifique: licen¸a e/ou suporte, seu nome e endere¸o de e-mail.
                 a
Na Europa e Jap˜o podem ser usados o EuroGiro (que deve ser mais barato) para a mesma
conta.
       e                            c           a
Se vocˆ deseja pagar com cheque, fa¸a-o nominal ` “MySQL Finland AB” e envie-o para o
       c
endere¸o abaixo:
       MySQL AB
       BOX 6434, Torsgatan 21
       11382 STOCKHOLM, SWEDEN
       e                     a        e                                   a
Se vocˆ deseja pagar com cart˜o de cr´dito pela Internet, pode usar Formul´rio seguro de
     c
licen¸as da MySQL AB.
    e            e                  o             a            c          e         a
Vocˆ pode tamb´m imprimir uma c´pia do formul´rio de licen¸as, preenchˆ-lo e envi´-lo
por fax para:
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                             43



+46-8-729 69 05
       e             o                                  a            c
Se vocˆ desejar que n´s lhe cobremos, pode usar o formul´rio de licen¸as e escrever “bill
                        a              e
us” no campo de coment´rio. Pode tamb´m enviar uma mensagem para sales@mysql.com
  a                                           co
(n˜o mysql@lists.mysql.com!) com as informa¸˜es de sua empresa e pedir para que n´s   o
              c
envie a cobran¸a.

               co
1.3.4.2 Informa¸˜es para Contato
Para licenciamento comercial, por favor contate a equiope de licenciamento do MySQL.
    e                   e
O m´todo mais preferido ´ enviar um e-mail para licensing@mysql.com. Envios de Fax
tamb´m ´ poss´ mas pode demorar mais (Fax +46-8-729 69 05).
     e e      ivel
       e                              a
Se vocˆ representa uma empresa que est´ interessada em ter parcerias com a MySQL, por
favor envie um e-mail para partner@mysql.com.
                                                o    e                          e
Por enquanto, para respostas precisas para quest˜es t´cnicas sobre o MySQL vocˆ deve
                                                                e
comprar um de nossos contratos de suporte. O Suporte ao MySQL ´ fornecido pelos desen-
                                                          e
volvedores do MySQL portanto a qualidade de atendimento ´ extremamente alta.
       e   a                                       u
Se vocˆ est´ interessado em colocar um banner de an´ncio em nosso site Web, envie um
e-mail para advertising@mysql.com.
                                                                 ca
Se estiver interessado em algum dos empregos listados em nossa se¸˜o empregos, por favor
envie um e-mail para jobs@mysql.com.
            o                          a                     ca
Para discuss˜es gerais entre nossos usu´rios, dirija sua aten¸˜o para a lista de mensagens
apropriada.
             co             co
Para solicita¸˜es de informa¸˜es gerais, envie e-mail para info@mysql.com.
          o            a                                u
Para quest˜es ou coment´rios sobre os trabalhos ou conte´do de nosso site Web, envie e-mail
para webmaster@mysql.com.

1.3.5 Tipos de suporte comercial
                                                  co
Todos os detalhes a seguir fazem parte de todas op¸˜es de suporte:
 • O suporte ´ por ano.
             e
 • Corrigiremos, ou fornecemos uma forma razo´vel de contornar a situa¸˜o para qualquer
                                             a                        ca
   bug persistente.
 • Iremos concentrar um esfor¸o razo´vel para encontrar e corrigir qualquer outro erro
                              c     a
   relacionado ao MySQL.
 • Quanto maior o n´ do contrato de suporte, maior ser´ o esfor¸o para encontrar uma
                     ivel                              a        c
       ca
   solu¸˜o para seus problemas.
 • Os seguintes itens fazem parte de todos contratos de suporte exceto do suporte b´sico
                                                                                   a
   por email:
                     a
    Qualquer coisa n˜o relacionadas a erros, como ajudar a otimizar suas queries ou seus
    sitema, extendendo o MySQL com novas funcionalidades, etc., cobramos 200 EU-
                    e
    ROs/hora. que ´ deduzido de seu contrato de suporte. Em outras palavras, se vocˆ   e
    tem suporte de login (2000 EURO) pode esperar que trabalharemos por volta de 10
                           e
    horas para ajudar a vocˆ com coisas deste tipo.
44                                              e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                 a
1.3.5.1 Suporte b´sico por E-mail
           a               e       ca
Suporte b´sico por e-mail ´ uma op¸˜o de suporte muito barata e deve ser entendida mais
                                                                             ca
como um meio de apoiar o desenvolvimento do MySQL do que como uma op¸˜o real de
            o                         a               u
suporte. N´s da MySQL fornecemos v´rios suportes grat´itos em todas as listas diferentes
                                                   a                e
do MySQL, e o dinheiro que obtemos com o suporte b´sico por e-mail ´ amplamente usado
                     ´
para tornar isto possivel.
Neste n´                                                     a     e
        ivel de suporte, as listas de mensagens do MySQL s˜o m´todos preferidos de
          ca           o
comunica¸˜o. Quest˜es normalmente devem ser enviadas para a lista de mensagens
principal (mysql@lists.mysql.com) ou uma de nossas listas regulares (por exemplo,
                                    o
win32@lists.mysql.com para quest˜es relacionadas ao MySQL no windows), como outra
                                                                              e
pessoa pode ter experimentado o mesmo e resolvido o mesmo problema que vocˆ tem. See
 undefined [Asking questions], page undefined .
                                 a                  e      e
Entretando, comprando suporte b´sico por e-mail, vocˆ tamb´m tem acesso ao endere¸o c
de suporte mysql-support@mysql.com, que n˜o ´ dispon´
                                             a e         ivel como parte do suporte
m´              e    e                        c
  inimo que vocˆ obtˆm comprando uma licen¸a do MySQL. Isto significa que para
quest˜es especialmente cr´
     o                              e      e
                         iticas, vocˆ tamb´m pode enviar a sua mensagem para
mysql-support@mysql.com. (Se a mensagem conter dados sens´               e
                                                               iveis, vocˆ deve postar
somente para mysql-support@mysql.com.)
                                      u                                    ca
LEMBRE-SE! de sempre incluir seu n´mero de registro e data de expira¸˜o quando vocˆ       e
enviar uma mensagem para mysql-support@mysql.com.
Perceba que se vocˆ encontrou um bug cr´
                  e                                                                  ca
                                          itico e repetitivo e seguiu as regras da se¸˜o do
                                   a
manual de como relatar erros e envi´-los para bugs@lists.mysql.com, prometemos tentar
corrig´ assim que poss´
      i-lo             ivel, sem levar em considera¸˜o seu n´
                                                      ca        ivel de suporte! See unde-
fined [Bug reports], page undefined .
         a                                                  c
Suporte b´sico por e-mail inclui os seguintes tipos de servi¸o:
 • Se sua d´vida j´ est´ solucionada no manual, iremos inform´-lo da se¸˜o correta em
            u     a     a                                      a         ca
          e                                       a     a             o
   que vocˆ pode achar a resposta. Se a resposta n˜o est´ no manual, n´s iremos apontar
      e        ca
   vocˆ na dire¸˜o certa para resolver seu problema.
 • N´s garantimos uma resposta para suas mensagens de e-mail. O que n˜o garantimos
     o                                                                 a
   e                                                       e        a
   ´ que podemos resolver qualquer problema, pelo menos vocˆ receber´ uma resposta se
   pudermos lhe contactar em seu e-mail.
 • Iremos ajudar com problemas inesperados quando vocˆ instalar o MySQL de uma
                                                        e
   distribui¸˜o bin´ria em plataformas suportadas. Este n´
            ca     a                                                       a
                                                          ivel de suporte n˜o cobre a
          ca                             ca                                  a
   instala¸˜o do MySQL de uma distribui¸˜o fonte. Plataformas suportadas s˜o aque-
             a a
   las que j´ s˜o conhecidas em que o MySQL funciona. See undefined [Which OS],
   page undefined .
 • N´s iremos ajud´-lo com bugs e recursos em falta. Qualquer bugs encontrados s˜o
     o              a                                                                  a
   corrigidos no pr´ximo release do MySQL. Se o bug ´ cr´
                   o                                                    e
                                                       e itico para vocˆ, enviaremos um
   e-mail com um patch logo que o bug for corrigido. Bugs Cr´iticos sempre tem prioridade
   alta para n´s e garantimos que ele ser´ corrigido logo que poss´
               o                         a                        ivel.
 • Suas sugest˜es para favorecer o desenvolvimento do MySQL ser˜o levadas em con-
              o                                                   a
         ca                                   e a     a
   didera¸˜o. Obtendo o suporte por email vocˆ j´ est´ ajudando o desenvolvimento do
   MySQL. Se vocˆ desejar mais integra¸˜o, atualize para um n´ mais alto do suporte.
                  e                   ca                     ivel
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                             45



 • Se vocˆ deseja que n´s ajudemos a otimizar seu sistema, deve atualizar para um n´
         e             o                                                           ivel
   mais alto de suporte.

1.3.5.2 Suporte extendido por E-mail
O suporte extendido por e-mail inclui todos os ´                 a
                                               itens do suporte b´sico por e-mail com estas
vantagens:
 • Seu e-mail ser´ atendido antes dos emails dos usu´rios do suporte b´sico e usu´rios n˜o
                 a                                  a                 a          a      a
   registrados.
 • Suas sugest˜es para o favorecimento do desenvolvimento do MySQL receber˜o forte
               o                                                              a
            ca          o                                          a               a
   considera¸˜o. Extens˜es simples que fazem parte dos objetivos b´sicos do MySQL s˜o
                                                                              e
   implementados em poucos dias. Obtendo o suporte extendido por e-mail vocˆ estar´  a
   ajudando e contribuindo ao desenvolvimento do MySQL.
 • Situa¸˜es t´
        co                a
              ipicas que s˜o cobertas pelo suporte extendido por e-mail:
     − Iremos responder e (com raz˜o) resolver quest˜es relativas a poss´
                                  a                 o                   iveis bugs no
                                                            e        a        ca
       MySQL. Logo que um bug for encontrado e corrido, vocˆ receber´ a corre¸˜o.
     − Ajudaremos com problemas inesperados quando vocˆ instalar o MySQL de uma
                                                            e
                ca              a
       distribui¸˜o fonte ou bin´ria em plataformas suportadas.
     − Respoderemos quest˜es sobre recursos n˜o dispon´
                            o                    a        iveis e ofereceremos dicas de
                                 co
       como contornar tais situa¸˜es.
    − Forneceremos dicas de como otimizar o mysqld para sua situa¸˜o. ca
 • Ser´ permitido que vocˆ influencie a prioridade de ´
      a                   e                                                   a
                                                     itens na lista de coisas ` fazer. See
                                                  a
    undefined [TODO], page undefined . Isto ir´ assegurar que os recursos que vocˆ         e
   realmente necessita ser˜o implementados logo que poss´
                          a                              ivel.

1.3.5.3 Suporte por Login
O Suporte por Login inclui todos os detalhes citados no suporte extendido por e-mail com
         e
estes acr´scimos:
 • Suas mensagens ser˜o tratadas antes dos emails do usuarios do suporte extendido por
                     a
   email.
 • Suas sugest˜es para o favorecimento do desenvolvimento do MySQL receber˜o forte
                o                                                            a
             ca         o
   considera¸˜o. Extens˜es realistas que podem ser implementadas em poucas horas e
                                    a                    a
   que ifazem parte dos objetivos b´sicos do MySQL ser˜o implementadas assim que
       ´
   possivel.
 • Se vocˆ possuir um problema muito espec´
         e                                  ifico, podemos acessar remotamente seu sis-
   tema para resolver seu problema “no local.”
 • Como qualquer outro fornecedor de bancos de dados, n˜o podemos garantir que pode-
                                                         a
   mos recuperar dados de tabelas danificadas, mas se o pior acontecer, podemos ajudar
   a recuperar o que for poss´                                a
                             ivel. O MySQL prova ser muito est´vel, mas qualquer coisa
   ´ poss´ devidas as circustancias que v˜o al´m de nosso controle (por exemplo, se seu
   e     ivel                             a    e
                         e
   sistema travar ou algu´m finalizar o servidor executando um comando kill -9).
 • Forneceremos ajuda nas otimiza¸˜es de seu sistema e queries.
                                 co
46                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • Vocˆ estar´ apto a contactar um desenvolvedor MySQL (moderadamente) e discutir
       e     a
                                                   ca
   seus problemas relacionados ao MySQL. Esta op¸˜oi, entretanto, deve somente ser us-
                ´                                 e
   ada como um ultimo recurso durante uma emergˆncia caso falharmos para compreender
   o problema por email. Para deixar mais eficiente o uso de nosso tempo precisamos an-
   tecipadamente saber de todos os fatos sobre o problema, antes de falarmos no telefone,
   para trabalhar da maneira mais eficiente poss´ na solu¸˜o do problema.
                                                ivel       ca

1.3.5.4 Suporte extendido por Login
Suporte extendido por login inclui todos os ´
                                            itens do suporte de Login com as seguintes
vantagens:
  • Seu e-mail tem a mais alta prioridade poss´
                                              ivel.
 • Examinaremos ativamente seu sistema e vamos ajudar a otimiz´r-lo e suas queries.
                                                              a
                 e
   Podemos tamb´m otimizar e/ou extender o MySQL para melhor encaixar em suas
   necessidades.
 • Vocˆ pode tamb´m requisitar extens˜es especiais especiais para vocˆ. Por exemplo:
      e          e                   o                               e
        mysql> select MINHA_FUNCAO(col1,col2) from tabela;
 • Forneceremos uma distribui¸˜o bin´ria de todos releases importantes do MySQL para
                               ca      a
   seu sistema, assim que tivermos uma conta em um sistema similar. No pior caso,
                                                                  ca     a
   podemos solicitar acesso ao seu sistem para criar uma distribui¸˜o bin´ria.
 • Se vocˆ puder fornecer acomoda¸˜es e pagar por transporte, podemos at´ mesmo enviar
         e                         co                                    e
                                        a
   um desenvolvedor MySQL para visit´-lo e oferecer ajudar com seus problemas. Suporte
   extendido por Login lhe d´ o direito de um encontro por ano. mas somos muito flex´
                            a                                                      iveis
   para com nossos clientes! Se a visita demorar 16 horas ou mais, as primeiras 8 horas
    a     a                                           e   a
   n˜o ser˜o cobradas. Para as 8 horas seguintes, vocˆ ser´ cobrado com uma taxa que ´ e
                                                 o
   pelo menos 20% menor do que os valores padr˜es.

                     o
1.3.5.5 Suporte Telefˆnico
             o
Suporte telefˆnico fornece todos os detalhes listados no suporte extendido por login com os
seguintes complementos:
 • Forneceremos a vocˆ uma p´gina web dinˆmica exibindo a lista atual de desenvolvedores
                      e       a            a
   MySQL que pode ajud´-lo por telefone quando vocˆ passar por um problema cr´
                        a                           e                            itico.
                          ´
 • Para problemas n˜o criticos, vocˆ pode solicitar um desenvolvedor MySQL para re-
                     a              e
                ca       e                             o
   tornar a liga¸˜o em at´ 48 horas para discutir quest˜es relacionados ao MySQL.

1.3.5.6 Suporte para outros manipuladores de tabela
                                                         e
Para obter suporte para tabelas BDB ou tabelas InnoDB vocˆ deve pagar uma taxa adicional
               c      a
de 30% no pre¸o padr˜o do suporte para cada um dos manipuladores de tabelas que vocˆ   e
desejar acrescentar no suporte.
  o                          a                  o
N´s na MySQL AB iremos ajud´-lo a crir um relat´rio correto de bugs para o manipulador
de tabelas e submetˆ-lo aos desenvolvedores da tabela espec´
                   e                                                  e
                                                           ifica. Tamb´m iremos fazer o
  a                            e a                             ca
m´ximo para garantir que vocˆ ir´ obter uma resposta ou solu¸˜o em tempo dos desen-
volvedores do manipulador de tabelas.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                            47



Mesmo se estivermos muito convencidos que podemos resolver a maioria dos problemas de
                      a                             ca a
uma maneira precisa, n˜o podemos garantir uma solu¸˜o r´pida para quaisquer problemas
       e
que vocˆ possa ter com os diferentes manipuladores de tabelas. Iremos entretanto fazer o
melhor poss´ para ajud´-lo a ter seu problemas resolvidos.
           ivel         a

                                 o
1.4 Qual compatibilidade aos padr˜es o MySQL oferece ?
       ca                                          o
Esta se¸˜o descreve como o MySQL relacina aos padr˜es ANSI SQL. MySQL tem muitas
      o           o                       e           a        a                a
extens˜es aos padr˜es ANSI SQL, e aqui vocˆ descobrir´ quais s˜o elas, e como us´-las.
    e a       e                   ca
Vocˆ ir´ tamb´m encontrar informa¸˜o sobre falta de funcionalidade do MySQL, e como
                             c
trabalhar com algumas diferen¸as.

            o
1.4.1 Extens˜es MySQL para o ANSI SQL92
                                  o         e                 a    a
O MySQL fornece algumas extens˜es que vocˆ provavelmente n˜o ir´ encontrar em alguns
                                                e a             o             a
bancos de dados SQL. Fique avisado que se vocˆ us´-las, seu c´digo pode n˜o ser mais
    a                                                    e                o
port´vel para outros servidores SQL. Em alguns casos, vocˆ pode escrever c´digo que inclui
      o                              a                   a
extens˜es MySQL, mas continua port´vel, usando coment´rios da forma /*! ...*/. Neste
                  a                        o                    a            a
caso, o MySQL ir´ analisar e executar o c´digo com o coment´rio como ir´ fazer com
                      ca                                         a
qualquer outra instru¸˜o MySQL, mas outros servidores SQL ir˜o ignorar as extens˜es.  o
Por exemplo:
      SELECT /*! STRAIGHT_JOIN */ nome_campo FROM table1,table2 WHERE ...
      e               u            a                            o    a
Se vocˆ adicionar um n´mero de vers˜o depois do ’!’, a sintaxe s´ ser´ executada se a
    a             e                     u            a
vers˜o do MySQL ´ igual ou maior que o n´mero de vers˜o usado:
      CREATE /*!32302 TEMPORARY */ TABLE (a int);
                                   e               a
O exemplo acima significa que se vocˆ tiver uma vers˜o do MySQL 3.23.02 ou mais nova,
   a            a
ent˜o o MySQL ir´ usar a palavra-chave TEMPORARY
      o          a
Extens˜es MySQL s˜o listadas abaixo:
 • Os tipos de campo MEDIUMINT, SET, ENUM e os diferentes tipos BLOB e TEXT.
 • Os atributos de campos AUTO_INCREMENT, BINARY, NULL, UNSIGNED e ZEROFILL.
 • Todas compara¸˜es de strings por padr˜o s˜o caso insensitivo, com classifica¸˜o orde-
                   co                    a a                                   ca
                                                                                    a
   nada determinada pelo conjunto de caracteres corrente (ISO-8859-1 Latin1 por padr˜o).
          e a                   e     a
   Se vocˆ n˜o gosta disso vocˆ dever´ declarar suas colunas com o atributo BINARY ou
                                                             co
   usar o operador BINARY, que fazendo com que as compara¸˜es sejam feitas de acordo
                                   a
   com a ordem ASCII usada na m´quina servidora do MySQL.
 • O MySQL mapeia cada banco de dados em um diret´rio sob o diret´rio de dados do
                                                        o               o
   MySQL, e tabelas internamente num banco de dados para arquivos no diret´rio doo
   banco de dados.
                             co
   Isto tem algumas implica¸˜es:
    − Nomes de bancos de dados e tabelas s˜o caso sensitivoo no MySQL em sistemas
                                              a
        operacionais que possuem o sistema de arquivos caso sensitivoo (como na maioria
        dos sistemas Unix). See undefined [Name case sensitivity], page undefined .
    − Nomes de Bancos de dados, tabelas, ´   indices, campos ou apelidos pode come¸arc
                  ´        e     a
        com um digito (por´m n˜o podem consistir somente de digitos).
48                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



       − Vocˆ pode usar comandos padr˜o do sistemas para fazer backups, renomear, apagar
                e                          a
          e copiar tabelas. Por exemplo, para renomear uma tabela, renomeie os arquivos
          ‘.MYD’, ‘.MYI’ e ‘.frm’. para o nome da tabela correspondente.
 •                       co              e
     Em algumas instru¸˜es SQL, vocˆ pode acessar tabelas de diferentes bancos de dados
     com a sintaxe nome_bd.nome_tbl. Alguns servidores SQL fornecem a mesma fun-
                                                                 a
     cionalidade mas chamam isto de User space. O MySQL n˜o suporta tablespaces como
     em: create table ralph.my_table...IN minha_tablespace.
 •          e
     LIKE ´ permitido em campos num´ricos.e
 •                                                               ca
     O uso de INTO OUTFILE e STRAIGHT_JOIN em uma instru¸˜o SELECT. See undefined
     [SELECT], page undefined .
 •         ca                                       ca
     A op¸˜o SQL_SMALL_RESULT em uma instru¸˜o SELECT.
 •                                              ca                      a
     EXPLAIN SELECT para obter uma descri¸˜o de como as tabelas s˜o ligadas.
 •              ca              ´        ´
     A utiliza¸˜o de nomes de indices, indices em um prefixo de um campo, e uso de INDEX
                             ca
     ou KEY em uma instru¸˜o CREATE TABLE. See undefined [CREATE TABLE], page unde-
     fined .
 •   O uso de TEMPORARY ou IF NOT EXISTS com CREATE TABLE.
 •                                                      e
     O uso de COUNT(DISTINCT lista) onde ’lista’ ´ maior que um elemento.
 •   O uso de CHANGE nome_campo, DROP nome_campo, ou DROP INDEX, IGNORE ou RENAME
                     ca
     em uma instru¸˜o ALTER TABLE. See undefined [ALTER TABLE], page undefined .
 •   O uso de RENAME TABLE. See undefined [RENAME TABLE], page undefined .
 •            ca      u         a                                                  ca
     Utiliza¸˜o de m´ltiplas cl´usulas ADD, ALTER, DROP, ou CHANGE em uma instru¸˜o ALTER
     TABLE.
 •   O uso de DROP TABLE com as palavras-chave IF EXISTS.
 •       e                          u                                ca ´
     Vocˆ pode remover (drop) m´ltiplas tabelas com uma instru¸˜o unica DROP TABLE.
 •       a                        ca
     A cl´usula LIMIT da instru¸˜o DELETE.
 •       a                            co
     A cl´usula DELAYED das instru¸˜es INSERT e REPLACE.
 •       a                                   co
     A cl´usula LOW_PRIORITY das instru¸˜es INSERT, REPLACE, DELETE e UPDATE.
 •   O uso de LOAD DATA INFILE. Em alguns casos essa sintaxe ´ compat´ com o Oracle
                                                                   e       ivel
     LOAD DATA INFILE. See undefined [LOAD DATA], page undefined .
 •              co
     As intru¸˜es ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE, e REPAIR TABLE.
 •              ca
     A instru¸˜o SHOW. See undefined [SHOW], page undefined .
 •                                                    a
     Strings podem ser fechadas pelo ‘"’ ou ‘’’, n˜o apenas pelo ‘’’.
 •   O uso do meta-caractere de escape ‘\’.
 •              ca
     A instru¸˜o SET OPTION. See undefined [SET OPTION], page undefined .
 •       e a
     Vocˆ n˜o precisa nomear todos os campos selecionados na parte GROUP BY. Isto fornece
     melhor performance para algumas consultas espec´     ificas, mas muito comuns. See un-
     defined [Group by functions], page undefined .
 •   Pode ser especificado ASC e DESC com o GROUP BY.
 •                       a             a
     Para tornar mais f´cil para usu´rios que venham de outros ambientes SQL, o MySQL
                                         a         co                           co
     suporta apelidos (aliases) para v´rias fun¸˜es. Por exemplo, todas fun¸˜es de string
     suportam as sintaxes ANSI SQL e ODBC.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                           49



 • O MySQL entende os operadores || e && como ou(OR) e e(AND) logicos, como na
                           ca                              a    o
   linguagem de programa¸˜o C. No MySQL, || e OR s˜o sinˆnimos, assim como && e
                       o                           a
   AND. Devido a esta ´tima sintaxe, o MySQL n˜o suporta o operador ANSI SQL para
               ca
   concatena¸˜o de strings ||; em vez disso, use o CONCAT(). Como CONCAT() aceita
     a                 e a
   v´rios argumentos, ´ f´cil converter o uso do operador || para MySQL.
 • CREATE DATABASE or DROP DATABASE. See undefined [CREATE DATABASE], page unde-
   fined .
 • O operador % ´ um sinˆnimo para MOD(). Isto ´, N % M ´ equivalente a MOD(N,M). % ´
                  e       o                         e        e                          e
   suportado para programadores C e para compatibilidade com o PostgreSQL.
 • Os operadores =, <>, <= ,<, >=,>, <<, >>, <=>, AND, OR ou LIKE podem ser utilizados em
             co                                            co
   compara¸˜es de campos a esquerda do FROM nas instru¸˜es SELECT. Por exemplo:
          mysql> SELECT col1=1 AND col2=2 FROM nome_tabela;
 • A fun¸˜o LAST_INSERT_ID(). See undefined [mysql_insert_id()], page undefined .
         ca
 • Os operadores extendidos REGEXP e NOT REGEXP utilizados em express˜es regulares.
                                                                        o
 • CONCAT() ou CHAR() com um ou mais de dois argumentos. (No MySQL, estas fun¸˜es    co
                     u
   receber qualquer n´mero de argumentos.)
 • As fun¸˜es BIT_COUNT(), CASE, ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(),
           co
   ENCRYPT(), md5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS()
   ou WEEKDAY().
 • Uso de TRIM() para cortar substrings. o ANSI SQL s´ suporta remo¸˜o de caracteres
                                                          o            ca
   ´
   unicos.
 • As fun¸˜es do GROUP BY: STD(), BIT_OR() e BIT_AND().
          co
 • Uso de REPLACE no lugar de DELETE + INSERT. See undefined [REPLACE], page unde-
   fined .
 • As instru¸˜es FLUSH, RESET e DO.
              co
 • A possibilidade de configurar vari´veis em uma instru¸˜o com :=:
                                      a                   ca
          SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS media FROM tabela_teste;
          SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;

             c
1.4.2 Diferen¸as do MySQL comparadas com o ANSI SQL92
 o                                                   o
N´s tentamos fazer com que o MySQL siguisse os padr˜es ANSI SQL e o ODBC SQL, mas
em alguns casos, o MySQL faz algumas coisas de forma diferente:
 • -- ´ somente um coment´rio, se seguido de um espa¸o em branco. See undefined
       e                     a                           c
    [Missing comments], page undefined .
 • Para campos VARCHAR, expa¸os extras s˜o removidos quando o valor ´ armazenado.
                                c          a                               e
    See undefined [Bugs], page undefined .
 • Em alguns casos, campos CHAR s˜o alterados sem perguntas para o tipo de campo
                                     a
    VARCHAR. See undefined [Silent column changes], page undefined .
 • Privil´gios para uma tabela n˜o s˜o negadas automaticamente quando vocˆ apaga uma
          e                     a a                                           e
                e                                                        e
    tabela. Vocˆ deve usar explicitamente um REVOKE para negar privil´gios para uma
    tabela. See undefined [GRANT], page undefined .
 • NULL AND FALSE ser˜o interpretados como NULL e n˜o como FALSE. Isto ´ porque n˜o
                       a                               a                     e      a
                     e                           a          co
    acreditamos que ´ uma boa coisa interpretar v´rias condi¸˜es extras neste caso.
50                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



1.4.3 Executando o MySQL no modo ANSI
      e                             ca                                   e
Se vocˆ inicializa o mysqld com a op¸˜o --ansi, o seguinte comportamento ´ alterado no
MySQL:
  • || funciona para concatena¸˜o de strings em vez de OR.
                                ca
  • Vocˆ pode ter qualquer n´mero de espa¸os entre um nome de fun¸˜o e o ‘(’. Isto faz
        e                     u            c                        ca
                                 co
    com que todos nomes de fun¸˜es sejam tratadas como palavras reservadas.
  • ‘"’ ser´ um caracter identificador (como o caracter aspas ‘‘’ do MySQL) e n˜o um
           a                                                                    a
    caracter de string.
  • REAL ser´ um sinˆnimo para FLOAT no lugar de um sinˆnimo de DOUBLE.
             a        o                                  o
  • O n´ de isolamento padr˜o de um transa¸˜o ´ SERIALIZABLE. See undefined [SET
        ivel                   a              ca e
    TRANSACTION], page undefined .
     e
Isto ´ o mesmo que usar --sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT, ANSI_
QUOTES,IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY.

1.4.4 Funcionalidades perdidas no MySQL
                                 a    a                  a
As seguintes funcionalidades n˜o est˜o presntes na vers˜o atual do MySQL. Para uma
                                              o      a                              e
lista priorizada indicando quando novas extens˜es ser˜o adicionadas ao MySQL vocˆ deve
                      a                               e ´            a              a
consultar A lista do ` fazer online(TODO List) . Esta ´ a ultima vers˜o da lista do ` fazer
neste manual. See undefined [TODO], page undefined .

1.4.4.1 Sub-selects
Atualmente o MySQL suporta somente sub selects da forma INSERT ... SELECT ... e
                                          e                ca
REPLACE ... SELECT .... Entretanto, vocˆ pode usar a fun¸˜o IN() em outros contextos.
                      e
Em alguns casos vocˆ pode reescrever a query sem uma sub selects:
      SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
Isto pode ser reescrito como:
      SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
As consultas:
      SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
      SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 where table1.id=table2.
Podem ser reescritas como:
      SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id
                                             e                                        a
Para consulta aninhadas mais complexas vocˆ pode, geralmente, criar tabelas tempor´rias
                                                                                ca a
para armazenar as consultas aninhadas. Em alguns casos, entretanto, essa op¸˜o n˜o ir´    a
                                                                              co
funcionar. O mais frequentemente encontrado nestes casos surgem em instru¸˜es DELETE,
                 a         a                                                      ca
para o qual padr˜o SQL n˜o suporta joins (exceto nas sub-selects). Para esta situa¸˜o exis-
tem duas op¸˜es dispon´ enquanto consultas aninhadas forem suportadas pelo MySQL.
            co           ivel
               ca e                                  ca
A primeira op¸˜o ´ usar uma linguagem de programa¸˜o procedural (como Perl ou PHP)
                                                         a
para enviar uma query SELECT para obter as chaves prim´rias dos registros a serem dele-
                                                            ca
tados, e depois usar estes valores para construir uma instru¸˜o DELETE DELETE FROM ...
WHERE ... IN (key1,key2, ...)).
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                            51



              ca e                                            e            co
A segunda op¸˜o ´ usar o interactive SQL para construir uma s´rie de instru¸˜es DELETE
                                 a                                               a
automaticamente, usando a extens˜o MySQL CONCAT() (em lugar do operador padr˜o ||.
For example:
      SELECT CONCAT(’DELETE FROM tab1 WHERE pkid = ’, tab1.pkid, ’;’)
         FROM tab1, tab2
       WHERE tab1.col1 = tab2.col2;
Vocˆ pode colocar esta consulta em um arquivo script e redirecionar sua sa´ para o
    e                                                                       ida
                                                            ´ de volta a uma segunda
interpretador de linha de comandos mysql, canalizando sua saida
    a
instˆncia do interpretador:
      prompt> mysql --skip-column-names mydb < myscript.sql | mysql mydb
                          ca
O MySQL 4.0 suporta dele¸˜o de multi-tabelas que pode ser usado para apagar registros
                                     co                              a
de forma eficiente com base em informa¸˜es de uma tabela ou mesmo de v´rias tabelas ao
mesmo tempo.

1.4.4.2 SELECT INTO TABLE
                 a                a
O MySQL ainda n˜o suporta a extens˜o SQL Oracle: SELECT ... INTO TABLE .... MySQL
                                                             e
suporta a sintaxe ANSI SQL INSERT INTO ... SELECT ..., que ´ basicamente a mesma
coisa. See undefined [INSERT SELECT], page undefined .
       INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE
       tblTemp1.fldOrder_ID > 100;
                            e
De maneira alternativa, vocˆ pode usar SELECT INTO OUTFILE... ou CREATE TABLE ...
SELECT para resolver seu problema.

              co
1.4.4.3 Transa¸˜es
                                               co                     a oe a
Como o MySQL, hoje em dia, suporta transa¸˜es, a seguinte discuss˜o s´ ´ v´lida se vocˆe
                                    a
estiver usando os tipos de tabelas n˜o transacionais. See undefined [COMMIT], page un-
defined
Essa quest˜o ´ normalmenta feita, pelos curiosos e cr´
           a e                                                                   a e
                                                       iticos, “Por que o MySQL n˜o ´ um
                                                           a               co
banco de dados transacional ?” ou “Por que o MySQL n˜o suporta transa¸˜es?”.
                                a
O MySQL tem feito uma descis˜o consciente para suportar outro paradigma para integri-
                      co    o         ´                              e               co
dade de dados, “opera¸˜es atˆmicas.” E de nosso conhecimento e experiˆncia que opera¸˜es
  o
atˆmicas oferecem integridade igual ou melhor com performance muito mais eficiente. N´s,o
apesar de tudo, apreciamos e entendemos o paradigma de bancos de dados transacionais e
                   o          o                                  c
planejamos, nas pr´ximas vers˜es, introduzir tabelas com seguran¸a transacional nos fun-
                         o                       a
damentos de tabelas. N´s iremos dar a nossos usu´rios a possibilidade de decididir se eles
                                  co    o
precisam da velocidade das opera¸˜es atˆmicas ou se eles precisam usar recursos transa-
                      co
cionais na suas aplica¸˜es.
       a
Como s˜o utilizados recursos do MySQL para manter de forma rigorosa a integridade e
como estes recursos se comparam com o paradigma transacional?
                                                      co    a
Primeiro, no paradigma transacional, se as suas aplica¸˜es s˜o escritas de uma forma que
´ dependente na chamada de “rollback” em vez de “commit” em situa¸˜es cr´
e                                                                      co               a
                                                                             iticas, ent˜o
      co    a                       e                co                           co
transa¸˜es s˜o mais convenientes. Al´m disso, transa¸˜es asseguram que atualiza¸˜es in-
                                     a
acabadas ou atividades corrompidas n˜o sejam executadas no banco de dados; o servidor
52                                              e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                                                     a                          e
oferece uma oportunidade para fazer um rollback autom´tico e seu banco de dados ´ man-
tido.
                                                  e
O MySQL, na maioria dos casos, permite a vocˆ resolver potenciais problemas incluindo
               e                       co
simples conferˆncias antes das atualiza¸˜es e executando scripts simples que conferem incon-
    e
sistˆncias no banco de dados e, automaticamente, repara ou avisa caso isto ocorra. Perceba
que apenas usando o log do MySQL ou mesmo adicionando um log extra, pode-se corrigir
tabelas perfeitamente sem nenhuma perda de integridade.
   e                co                                                          o
Al´m disso, atualiza¸˜es transacionais fatais podem ser reescritas para serem atˆmicas. De
                                                                      co
fato podemos dizer que todos problemas de integridade que transa¸˜es resolvem podem
                                        co      o                           e         a
ser feitas com LOCK TABLES ou atualiza¸˜es atˆmicas, assegurando que vocˆ nunca ir´ ter
             c˜        a                       e
uma finaliza¸ao autom´tica da tabela, o que ´ um problema comum em bancos de dados
transacionais.
                    co
Nem mesmo transa¸˜es podem prevenir todas as falhas se o servidor cair. Nestes casos
                                                                c
mesmo um sistema transacional pode perder dados. A diferen¸a entre sistemas diferentes
e               a           e
´ apenas em qu˜o pequeno ´ o lapso de tempo em que eles podem perder dados. Nenhum
         e                                                                          ca
sistema ´ 100% seguro, somente “seguro o suficiente.” Mesmo o Oracle, com reputa¸˜o de
ser o mais seguro bancos de dados transacionais, tem relatos de algumas vezes perder dados
            co
nestas situa¸˜es.
                                     e                                                co
Para estar seguro com o MySQL, vocˆ apenas deve fazer backups e ter o log de atualiza¸˜es
                     e                                    ca     ´ com bancos de dados
ligado. Com isto vocˆ pode se recuperar de qualquer situa¸˜o possivel
               ´                                                                   e
transacionais. E sempre bom ter backups, independente de qual banco de dados vocˆ usa.
O paradigma transacional tem seus benef´                                          a
                                           icios e suas desvantagens. Muitos usu´rios e
                          co
desenvolvedores de aplica¸˜es dependem da facilidade com a qual eles podem codificar
                                                      e      a
contornando problemas onde abortar parece ser, ou ´ necess´rio, e podem ter um pouco
mais de trabalho com o MySQL por terem que pensar diferente ou escrever mais. Se
    e e                              co     o
vocˆ ´ novo no paradigma de opera¸˜es atˆmicas ou tem mais familiaridade ou conforto
           co      a                                     a
com transa¸˜es, n˜o acabe por concluir que o MySQL n˜o tenha se preocupado com estes
                   c                   a
assuntos. Confian¸a e integridade est˜o em nossas mentes. Estimativas recentes indicam
que existem mais de 1.000.000 de servidores mysqld operando atualmente, muitos dos quais
   a                         ca    a                                                 a
est˜o em ambientes de produ¸˜o. S˜o muito, muito raros os casos nos quais nossos usu´rios
                                                               a      a
perderam seus dados, e em quase todos os casos, erros dos usu´rios est˜o envolvidos. Isto
e                a                                           c
´, na nossa opini˜o, a melhor prova da estabilidade e seguran¸a do MySQL.
                         co                        e                  a
Ultimamente, em situa¸˜es onde integridade ´ de grande importˆncia, as atuais cara-
     ´                               ´                                      c
cteristicas do MySQL permitem niveis transacionais ou melhor confian¸a e integridade.
         e                                                     co    a                 e
Se vocˆ bloquear tabelas com LOCK TABLES todos as atualiza¸˜es ir˜o ser adiadas at´ qual-
             c˜                                   e o
quer verifica¸ao de integridade ser feita. Se vocˆ s´ obter um bloqueio de leitura (oposto ao
                         a                  co        a
bloqueio de escrita), ent˜o leituras e inser¸˜es poder˜o ocorrer. Os novos registros inseridos
  a        a
n˜o poder˜o ser visualizados por nenhum dos clientes que tiverem um bloqueio de LEITURA
   e                                                            e                     co
at´ eles liberarem estes bloqueios. Com INSERT DELAYED vocˆ pode enfileirar inser¸˜es em
                   e
uma fila local, at´ os bloqueios serem liberados, sem que o cliente prceise esperar pela
       ca
inser¸˜o completar. See undefined [INSERT DELAYED], page undefined
                                o                 a e a
“Atomico”, no sentido em que n´s mencionamos, n˜o ´ m´gico. Significa apenas que vocˆ  e
pode estar certo que enquanto cada atualiza¸˜o espec´
                                             ca               a
                                                      ifica est´ sendo executada, nenhum
          a                                         a                    a
outro usu´rio pode interferir com ela, e nunca haver´ um rollback autom´tico (que pode
                                          co       e a
acontecer em sistemas baseados em transa¸˜es se vocˆ n˜o tiver muito cuidado). O MySQL
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                               53



    e                              a                      e
tamb´m assegura que nunca ocorrer´ uma leitura suja. Vocˆ pode encontrar alguns ex-
                                co     o           ca
emplos de como escrever atualiza¸˜es atˆmicas na se¸˜o commit-rollbak. See undefined
[Commit-rollback], page undefined .
                                                                 o
Estamos pensando muito sobre integridade e performance, e n´s acreditamos que nosso
                     co     o                               c
paradigma de opera¸˜es atˆmicas permitem tanto confian¸a quanto uma performance ex-
                                                                          a
tremamente alta, na ordem de tres a cinco vezes a velocidade do mais r´pido e mais op-
                                                  o a                      co
timizado dos bancos de dados transacionais. N´s n˜o deixamos as transa¸˜es porque s˜o   a
muito dif´                                       a                            co    o
         iceis para serem feitas. A principal raz˜o de trabalharmos com opera¸˜es atˆmicas
      e            co e                     o                                co
ao inv´s de transa¸˜es ´ que fazendo isto n´s podemos aplicar muitas otimiza¸˜es de veloci-
dade que de outra forma n˜o seria poss´
                            a            ivel.
                    a                                        a    a
Muitos de nossos usu´rios que tem a velocidade em mentee, n˜o est˜o muito preocupados
           co                   co    a a                                 a            a
com transa¸˜es. Para eles transa¸˜es n˜o s˜o importantes. Para aqueles usu´rios que est˜o
                                                   co
preocupados com ou tem curiosidade sobre transa¸˜es no MySQL, existe um “MySQL
              o                                  a              a               c
Way” como n´s citamos acima. Para aqueles que d˜o mais importˆncia a seguran¸a do que
velocidade, recomendamos o uso das tabelas BDB ou InnoDB para todos seus dados cr´ iticos.
See undefined [Table types], page undefined .
                         o
Nota final: Atualmente n´s estamos trabalhando em um esquema seguro de replica¸˜o o ca
                                                           ca
qual acreditamos ser melhor que qualquer sistema de replica¸˜o comercial que conhecemos.
               a                      c                               co     o
Este sistema ir´ trabalhar com confian¸a sobre o paradigma de opera¸˜es atˆmicas n˜o-  a
transacional. Mantenha-se informado.

1.4.4.4 Stored Procedures e Triggers
                         e
Uma Stored Procedure ´ um conjunto de comandos SQL que podem ser compilados e
                                                           a
armazenados no servidor. Uma fez feito isso, os clientes n˜o necessitam reescrever toda a
                                e     a
consulta mas podem fazer referˆncia ` stored procedure. Isto fornece melhor performance
porque a query necessita ser analisada pelo servidor somente uma vez, e necessita menos
informa¸˜o para ser enviada entre o servidor e o cliente. Vocˆ tamb´m pode elevar o n´
        ca                                                   e     e                  ivel
                                   co
conceitual tendo bibliotecas de fun¸˜es no servidor.
            e                         e
Um trigger ´ uma stored procedure que ´ chamado quando um evento em particular ocorre.
                 e                                         e
Por exemplo, vocˆ pode instalar uma stored procedure que ´ disparada toda vez que um
                                             co
registro for apagado de uma tabela de transa¸˜es que automaticamente apaga o cliente
                                                               co
correspondente de uma tabela de clientes quando todas as transa¸˜es forem removidas.
                                    a
A linguagem planejada atualizada ser´ apta a armazenar stored procedures mas sem trig-
                                                                            a
gers. Trigger normalmente deixa tudo muito mais lento, mesmo consultas que n˜o as uti-
lizam.
                             a
Para saber quando o MySQL ter´ stored procedures, consulte             undefined    [TODO],
page undefined .

1.4.4.5 Chaves Estrangeiras (Foreign Keys)
                                           a a
Note que as chaves estrangeiras no SQL n˜o s˜o usadas para ligar tabelas, mas na maioria
           a                                                        e
das vezes s˜o usadas para verificar a integridade referencial. Se vocˆ deseja obter resultados
     u                             ca               e
de m´ltiplas tabelas de uma instru¸˜o SELECT, vocˆ pode fazer isto ligando tabelas:
      SELECT * from table1,table2 where table1.id = table2.id;
54                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



See undefined [JOIN], page undefined . See undefined [example-Foreign keys], page un-
defined .
A sintaxe FOREIGN KEY existe no MySQL somente para compatibilidade com os comandos
                                            a
CREATE TABLE de outros fabricantes, ela n˜o faz nada. A sintaxe FOREIGN KEY sem ON
            e                                              ca                  co
DELETE ... ´ usada na maioria dos casos para documenta¸˜o. Algumas aplica¸˜es ODBC
                                  a                   a          e
podem usar isto para produzir cl´usulas WHERE autom´ticas, mas ´ normalmente ignorada.
              e                                  ca     e              ca e            a
FOREIGN KEY ´ algumas vezes usado para verifica¸˜o, por´m, esta verifica¸˜o ´ desnecess´ria
     a                      a
na pr´tica se os registros s˜o inseridos nas tabelas na ordem correta. O MySQL suporta
                a                             co                                a
somente estas cl´usulas porque algumas aplica¸˜es dependem delas para existir (n˜o levando
             ca                          a
em considera¸˜o se elas funcionam ou n˜o).
                e
No MySQL, vocˆ pode trabalhar contornando o problema do ON DELETE... ainda n˜o im-  a
                                  co                              ca              e
plementado, adicionando as instru¸˜es DELETE apropriadas a aplica¸˜o quando vocˆ apagar
                                                               a          e a a
registros de uma tabela que possui uma chave estrangeira. Na pr´tica isto ´ t˜o r´pido (em
                    a                       a
alguns casos, mais r´pido) e muito mais port´vel do que o uso de chaves estrangeiras.
             o                                     ca
No futuro pr´ximo, iremos extender a implementa¸˜o de CHAVES ESTRANGEIRAS para que
ao menos a informa¸ao seja armazenada no arquivo de especif´ c˜es da tabela e possa ser
                    c˜                                        ica¸o
                                                  a                 o
recuperada com mysqldump e ODBC. Em um est´gio posterior, n´s implementaremos as
                               co        a                                            a
chaves estrangeiras para aplica¸˜es que n˜o podem ser facilmente codificadas para ignor´-la.

           o         a
1.4.4.6 Raz˜es para n˜o usar chaves estrangeiras
                                                     ´ e
Existem v´rios problemas com as chaves estrangeiras. E at´ dif´ sabermos por onde
         a                                                    icil
     c
come¸ar:
 • Chaves estrangeiras tornam a vida muito complicada porque suas defini¸˜es devem ser
                                                                        co
                                                       a                         c
   armazenadas em um banco de dados e, implement´-las pode acabar com a “gra¸a” de
   usar arquivos que podem ser movidos, copiados e removidos.
 • O impacto de velocidade ´ terr´
                             e                    c
                                   ivel em senten¸as INSERT e UPDATE, neste caso, quase
                    co                               a          a
   todas as verifica¸˜es de CHAVES ESTRANGEIRAS s˜o desnecess´rios, pois normalmente
   inserimos registros nas tabelas corretas e na ordem correta.
 • Existe tamb´m uma necessidade de travar registros em v´rias tabelas quando estiver
               e                                            a
                                                                                      ´
   atualizando apenas uma tabela, devido ao efeito cascata em todo no banco de dados. E
                a                                                                  a
   muito mais r´pido primeiro apagar registros de uma tabela e posteriormente apag´-los
   das outras tabelas.
 • Vocˆ n˜o pode restaurar uma tabela apagando-a totalmente e depois restaurar os reg-
       e a
   istros (de uma nova fonte ou de um backup).
 • Se vocˆ usa chaves estrangeiras, n˜o poder´ remover e restaurar tabelas a n˜o ser que
          e                           a       a                                 a
   fa¸a isto com muito cuidado em uma ordem muito espec´
     c                                                      ifica.
   ´
 • E muito f´cil fazer defini¸˜es circulares “permitidas” que impossibilitam as tabelas de
             a               co
                                              ca        ca                   ca
   recriar cada tabela com uma simples instru¸˜o de cria¸˜o mesmo se a defini¸˜o funciona
        a
   e est´ em uso.
   ´ muito f´cil de travar regras FOREIGN KEY ... ON DELETE quando estamos codificando
 • E         a
               ca     a e                                         co
   uma aplica¸˜o. N˜o ´ raro ocorrer perda de muitas informa¸˜es importantes devido
   apenas a uma regra ON DELETE errada ou mal utilizada.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                             55



   ´                                                     e             a
O unico aspecto interessante das CHAVES ESTRANGEIRAS ´ que ela d´ ao ODBC e alguns
                                                              e                   a
outros programas clientes a habilidade de ver como a tabela ´ conectada e utiliz´-la para
                            a                  ca          co
mostrar diagramas de conex˜o e ajudar na cria¸˜o de aplica¸˜es.
                a                  co
MySQL logo ir´ armazenar defini¸˜es de CHAVES ESTRANGEIRAS para que o cliente possa
                                                  a
pedi-la e receber uma resposta sobre como a conex˜o original foi feita. O formato atual dos
                  a                                 a                o
arquivos ‘.frm’ n˜o tem lugar para elas. Em um est´gio posterior n´s iremos implementar
                                  co        a                                  a
as chaves estrangeiras para aplica¸˜es que n˜o podem ser codificadas para evit´-las.

1.4.4.7 Views
               a                                            a                      a
MySQL ainda n˜o suporta views, mas planejamos implement´-las em torno da vers˜o 4.1.
                   a         ´                        a                   e          co
Views geralmente s˜o muito uteis para permitir aos usu´rios acessar uma s´rie de rela¸˜es
                                       a                           a
como uma tabela (em modo leitura). V´rios bancos de dados SQL n˜o permitem atualizar
                                      e                        co
nenhum registro em uma view, mas vocˆ tem que fazer as atualiza¸˜es em tabelas separadas.
                  e                               co
Como o MySQL ´ normalmente usado em aplica¸˜es e sistemas web onde o autor da
      ca                                                                        a      a
aplica¸˜o tem total controle no uso de bancos de dados, a maioria de nossos usu´rios n˜o
consideram view muito importante. (pelo menos nenhum teve interesse suficiente para
                      ca
financiar a implementa¸˜o de views).
  a e        a                                                                    a
N˜o ´ necess´rio o uso de views em MySQL para restringir acesso aos campos j´ que o
                                 e
MySQL tem um sistema de privil´gios bem sofisticado. See undefined [Privilege system],
page undefined .

1.4.4.8 ‘--’ como o ´                  a
                    inicio de um coment´rio
                                                             a
Outros bancos de dados SQL usam ‘--’ para iniciar coment´rios. O MySQL usa ‘#’ como
                     ´ de coment´rio, mesmo se a ferramenta de linha de comando mysql
o caractere para inicio           a
                                c                  e       e
remover todas linhas que come¸am com ‘--’. Vocˆ tamb´m pode usar o coment´rio no a
estilo C /*isto ´ um coment´rio*/ com o MySQL. See undefined [Comments], page un-
                  e          a
defined .
                 a                                              a
O MySQL vers˜o 3.23.3 e superior suporta o estilo de coment´rio ‘--’ somente se o co-
      a                                         c
ment´rio for seguido por um caractere de espa¸o. Isto ocorre porque este estilo de co-
      a
ment´rio causou muitos problemas com queries SQL geradas automaticamente que usavam
               o                                      a
algo como o c´digo seguinte, onde automaticamente er´ inserido o valor do pagamento para
!pagamento!:
       UPDATE nome_tabela SET credito=credito-!pagamento!
           e            a
O que vocˆ acha que ir´ acontecer quando o valor de pagamento for negativo?
Como 1--1 ´ legal no SQL, n´s achamos terr´ que ‘--’ signifique in´ de coment´rio.
             e                o             ivel                     icio          a
                  a         e
No MySQL Vers˜o 3.23 vocˆ pode, entretanto, usar: 1-- Isto ´ um coment´rio
                                                               e           a
                    a                        e                              a
A seguinte discuss˜o somente interessa se vocˆ estiver executando uma vers˜o do MySQL
               a
inferior a vers˜o 3.23:
        e                                                        e         a
Se vocˆ tem um programa SQL em um arquivo texto que contˆm coment´rios ‘--’ vocˆ       e
      a
dever´ usar:
                                                                   a
       shell> replace " --" " #" < arquivo-texto-com-coment´rio.sql \
                   | mysql banco-de-dados
No lugar de:
56                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



       shell> mysql banco-de-dados < arquivo-texto-com-comentario.sql
   e      e                 o                                            a
Vocˆ tamb´m pode editar o pr´prio arquivo de comandos alterando os coment´rios ‘--’
para ‘#’:
      shell> replace " --" " #" -- arquivo-texto-com-comentario.sql
     c
Desfa¸a utilizando este comando:
      shell> replace " #" " --" -- arquivo-texto-com-comentario.sql

             a         o
1.4.5 Quais s˜o os padr˜es que o MySQL segue ?
Padr˜o SQL92. N´
    a          iveis ODBC 0-2.

1.4.6 Como lidar sem o COMMIT-ROLLBACK
                                                                                         e
A maioria dos textos a seguir aplicam-se somente para tabelas ISAM, MyISAM e HEAP. Se vocˆ
                                                                         ca      e
utilizar as tabelas transacionais (tabelas BDB ou InnoDB) em uma atualiza¸˜o, vocˆ poder´a
utilizar COMMIT e ROLLBACK no MySQL. See undefined [COMMIT], page undefined .
                             ca
O problema com a manipula¸˜o de COMMIT-ROLLBACK eficientemente com os tipos de tabelas
                e                 a
citadas acima ´ que seria necess´rio um layout de tabelas completamente diferente que o
                                                                 e
MySQL usa hoje em dia. O tipo de tabela iria necessitar tamb´m de processos extras que
                          a
fizessem a limpeza autom´tica nas tabelas, e o uso de disco seria muito maior. Isto poderia
                                                        a
deixar esses tipos de tabelas 2-4 vezes mais lento que s˜o hoje.
No momento, preferimos implementar a linguagem de servidor SQL (algo parecido com
                                 e
stored procedures). Com isto, vocˆ raramente precisaria usar o COMMIT-ROLLBACK. Isto
     e
tamb´m traria uma performance muito melhor.
                               co
Loops que necessitam de transa¸˜es normalmente podem ser codificados com a ajuda de
                     e                                           a a a
LOCK TABLES.Se vocˆ atualiza registros previamente determinados n˜o h´ver´ necessidade
de se usar cursores.
  o                                                                         a
N´s na TcX temos uma maior necessidade de um banco de dados realmente r´pido do que
                              e
um banco de dados 100% gen´rico. Assim que encontrarmos uma forma de implementar
esses recursos sem perda de performance, provavelmente o faremos. No momento, existem
 a
v´rias coisas mais importantes a serem feitas. Verifique o TODO para saber quais as nossas
prioridades at´ o momento. (Clientes com alto n´ de suporte podem alterar isto, ent˜o
               e                                  ivel                                 a
as prioridades podem ser alteradas.)
                    e
O problema atual ´ o ROLLBACK. Sem o ROLLBACK, pode-se fazer qualquer tipo de a¸˜o     ca
COMMIT com LOCK TABLES. Para suportar ROLLBAK com os tipos de tabelas acima, o MySQL
teria que ser alterado para armazenar todos registros antigos que foram atualizados e re-
verter tudo para o ponto de partida se o ROLLBACK fosse utilizado. Para casos simples, isto
 a e                                                                           o
n˜o ´ dificil para implementar (o isamlog atual pode ser usado para este prop´sito), mas
seria muito mais dif´ de implementar ROLLBACK para ALTER/DROP/CREATE TABLE
                     icil
                                  e                            e
Para evitar o uso do ROLLBACK, vocˆ pode usar a seguinte estrat´gia:
 1.                                                            e
      Usar LOCK TABLES ... para travar todas as tabelas que vocˆ pretende acessar.
 2.                co
      Testar condi¸˜es.
 3.   Atualizar se tudo estiver bem.
 4.   Usar UNLOCK TABLES para liberar suas travas.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                            57



Este m´todo ´, normalmente, muito mais r´pido do que usar transa¸˜es com poss´
       e     e                               a                          co        iveis
                               ´           ca                  ca a           e
ROLLBACKs, mas nem sempre. A unica situa¸˜o em que esta solu¸˜o n˜o se aplica ´ quando
     e                                            ca
algu´m mata as threads no meio de uma atualiza¸˜o. Neste caso, todos bloqueios ser˜oa
                              co            a
liberados mas algumas atualiza¸˜es podem n˜o ter sido executadas.
    e      e                  co                                    ´        ca
Vocˆ tamb´m pode utilizar fun¸˜es para atualizar registros em uma unica opera¸˜o. Vocˆe
                   ca                                          e
pode ter uma aplica¸˜o muito eficiente utilizando as seguintes t´cnicas:
  • Modificar campos relativos aos seus valores atuais.
  • Atualizar somentes aqueles campos que foram realmente alterados.
                                                  co                      ca
Por exemplo, quando estivermos fazendo atualiza¸˜es em alguma informa¸˜o de clientes,
atualizamos somente os dados do cliente que foram alterados e testamos somente aqueles
      a
que n˜o tiveram dados alterados ou dados que dependam dos dados alterados e que tenham
                                                                             e
sido alterados comparados ao registro original. O teste para dados alterados ´ feito com a
  a                       ca                         a
cl´usula WHERE na instru¸˜o UPDATE. Se o registro n˜o for atualizado, daremos ao cliente
                                           e                                 a
uma mensagem: "Alguns dos dados que vocˆ alterou foi alterado por outro usu´rio". Ent˜o a
  o
n´s mostramos o registro antigo e o novo registro na tela para que o usuario possa decidir
          a
qual vers˜o ele pode usar.
                        e
Isto fornece algo que ´ parecido com bloqueio de colunas mas bem melhor, porque s´       o
                                                        a
atualizamos algumas das colunas, usando valores que s˜o relativos ao seus valores atuais.
                        co                    a
Isto significa que instru¸˜es UPDATE se parecer˜o com isto:
                                                             c
       UPDATE nometabela SET pay_back=pay_back+’mudan¸a relativa’;

      UPDATE customer
        SET
           data_corrente=’data_corrente’,
           endereco=’novo endereco’,
           telefone=’novo telefone’,
           dinheiro_ele_nos_deve=dinheiro_ele_nos_deve+’novo_dinheiro’
        WHERE
           id_cliente=id AND endereco=’endereco antigo’ AND telefone=’telefone antigo’;
                                 e
Como podemos ver, esta forma ´ muito eficiente e funciona mesmo se outro cliente tiver
alterado os valores nas colunas pay_back ou dinheiro_ele_nos_deve.
                      a
Em alguns casos, usu´rios tem necessitado de ROLLBACK e/ou LOCK TABLES com o prop´sito  o
                             ´
de gerenciar identificadores unicos para algumas tabelas. Isto pode ser tratado de forma
                                                                  e          ca
muito mais eficiente usando um campo AUTO_INCREMENT e tamb´m a fun¸˜o SQL LAST_
                       ca
INSERT_ID() ou a fun¸˜o da API C mysql_insert_id(). See undefined [mysql_insert_
id()], page undefined .
Na MySQL AB, n´s nunca tivemos necessidade de bloqueio no n´
                   o                                                ivel de registros porque
 o
n´s sempre fomos capaz de programar evitando-os. Alguns casos realmente precisam de
                            a                 e                                  e
bloqueio de registros, mas s˜o poucos. Se vocˆ deseja bloqueio de registros, vocˆ pode usar
                       ca
um campo de sinaliza¸˜o na tabela e fazer como se segue:
      UPDATE nome_tabela SET row_flag=1 WHERE id=ID;
                               u
O MySQL retorna 1 para o n´mero de registros atingidos se o registro for encontrado e
           a a
row_flag j´ n˜o tinha 1 no registro original.
    e
Vocˆ pode pensar como se o MySQL tivesse alterado a consulta acima para:
      UPDATE nome_tabela SET row_flag=1 WHERE id=ID and row_flag <> 1;
58                                            e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                              e
1.4.7 Erros conhecidos e deficiˆncias de design no MySQL
                          a
Os seguintes problemas s˜o conhecidos e tem prioridade muito alta para serem corrigidos:
 • ANALYZE TABLE em uma tabela BDB pode, em alguns, casos inutilizar a tabela at´ que
                                                                                    e
                                                              e a
    se reinicie o servidor mysqld. Quando isto acontecer vocˆ ir´ ver o seguinte tipo de
    erro no arquivo de erros do MySQL.
           001207 22:07:56 bdb: log_flush: LSN past current end-of-log
 • N˜o execute ALTER TABLE em uma tabela BDB em que vocˆ estiver executando
      a                                                             e
           co                 co      a
    transa¸˜es multi-instru¸˜es n˜o completadas.                 ca
                                                       (A transa¸˜o provavelmente ser´   a
    ignorada).
 • ANALYZE TABLE, OPTIMIZE TABLE e REPAIR TABLE podem causar problemas em tabelas
                      e
    para as quais vocˆ estiver usando INSERT DELAYED.
 • Fazendo um LOCK TABLE .. e FLUSH TABLES .. n˜o garante que n˜o existem transa¸˜es
                                                    a               a                 co
      a
    n˜o terminadas em progresso na tabela.
 • Tabelas BDB s˜o um pouco lentas para abrir. Se vocˆ tiver v´rias tabelas BDB em um
                    a                                   e       a
                             a
    banco de dados, gastar´ muito tempo para usar o cliente mysql no banco de dados se
        e a                        ca           e                             e
    vocˆ n˜o estiver usando a op¸˜o -A ou se vocˆ estiver usando rehash. Isto ´ percebido
                                 e
    principalmente quando vocˆ tiver um cache de tabelas grandes.
 • O protocolo de replica¸˜o atual n˜o pode lidar com LOAD DATA INFILE e caracteres de
                            ca          a
            ca
    termina¸˜o de linha maiores que 1 caractere.
                         a                  a
Os seguintes problemas s˜o conhecidos e ser˜o corrigidos na hora certa:
 • No momento MATCH funciona somente com instru¸˜es SELECT.
                                                      co
 • Quando estiver usando SET CHARACTER SET, n˜o ´ permitido usar caracteres especias
                                                   a e
    no nome do banco de dados, tabelas ou campos.
 • DELETE FROM merge_table usado sem WHERE ir´ apenas apagar o mapeamento para a
                                                    a
             a
    tabela, n˜o apagando tudo nas tabelas mapeadas.
 • Vocˆ n˜o pode construir em outro diret´rio quando estiver utilizando MIT-pthreads.
        e a                                  o
    Como isto necessitaria de altera¸˜es na MIT-pthreads, n´s n˜o estamos aptos a corrig´
                                    co                      o a                         i-
    la.
 • BLOB valores n˜o podem ser usados com confian¸a em GROUP BY, ORDER BY ou
                    a                                    c
                                                  a                            a
    DISTINCT. Somente os primeiros bytes (padr˜o 1024) max_sort_length s˜o usados
    quando estiver comparando BLOBs nestes casos. Isto pode ser alterado com a op¸˜o  ca
    -0 max_sort_lenght para mysqld. Uma forma de contornar este problema para
                           e
    a maioria dos casos ´ usar a substring: SELECT DISTINCT LEFT(blob,2048) FROM
    nome_tabela.
 • C´lculos s˜o feitos com BIGINT ou DOUBLE (normalmente, ambos tem o tamanho de 64
      a        a
                             a                  ca                 e        co      a
    bits). Depende da precis˜o utilizada na fun¸˜o. A regra geral ´ que fun¸˜es bin´rias
     a                   a                                 a
    s˜o feitas com precis˜o BIGINT, IF e ELT() com precis˜o BIGINT ou DOUBLE e o resto
                a
    com precis˜o DOUBLE. Devemos evitar o uso de valores sem sinal maiores que 63 bits
                                                         e               a
    (9223372036854775807) para qualquer outra coisa al´m de campos bin´rios!
 • Todas os campos string, exceto campos do tipo BLOB e TEXTO tem, automaticamente,
                  c                                                               a
    todos os espa¸os extras removidos quando recuperados. Para tipos CHAR, isto n˜o tem
    problema, e pode ser considerado como um recurso de acordo com o ANSI SQL92. O
               e                                   a
    problema ´ que no MySQL, campos VARCHAR s˜o tratados desta mesma forma.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                        59



 • Vocˆ s´ pode ter at´ 255 colunas ENUM e SET em uma tabela.
       e o               e
 • safe_mysqld redireciona todas as mensagens de mysqld para o log mysqld. Um prob-
                   e             e
   lema com isto ´ que se vocˆ executar o mysqladmin refresh para fechar e reabrir o
                                                                                  e
   log, a stdout e a stderr continuam redirecionadas para o log antigo. Se vocˆ utiliza
                                   a
   --log extensivamente, dever´ editar o safe_mysqld para logar em ‘’hostname’.err’
                                            e                              c
   em vez de ‘’hostname’.log’; assim vocˆ pode facilmente utilizar o espa¸o do log antigo
   apagando-o e executando mysqladmin refresh.
 • Em instru¸˜es UPDATE, colunas s˜o atualizadas da esquerda para a direita. Se vocˆ
              co                      a                                                  e
                                              e a
   referenciar a uma coluna atualizada, vocˆ ir´ obter o valor atualizado em vez do valor
   original, por exemplo:
          mysql> UPDATE nome_tabela SET KEY=KEY+1,KEY=KEY+1;
   Isto atualiza KEY com 2 no lugar de 1.
 • Vocˆ n˜o pode usar tabelas tempor´rias mais que uma vez na mesma query. Por
       e a                                a
                               ca a
   exemplo, a seguinte instru¸˜o n˜o funciona.
          select * from tabela_temporaria, tabela_temporaria as t2;
 • RENAME n˜o funciona com tabelas tempor´rias (TEMPORARY).
             a                                 a
 • O otimizador pode lidar com o DISTINCT de forma diferente se vocˆ estiver usando col-
                                                                       e
                                        a                                     a
   unas ’escondidas’ em uma join ou n˜o. Em uma join, colunas escondidas s˜o contadas
                                                a a
   como parte do resultado (mesmo se elas n˜o s˜o mostradas) enquanto que em queries
                                    a                       ca                o
   normais colunas escondidas n˜o participam na compara¸˜o DISTINCT. N´s provavel-
   mente iremos alterar isto no futuro para nunca comparar as colunas escondidas quando
   executando DISTINCT.
   um exemplo disto ´: e
          SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id
          DESC;
   e
          SELECT DISTINCT band_downloads.mp3id, FROM band_downloads,band_mp3
          WHERE band_downloads.userid = 9 AND band_mp3.id = band_downloads.mp3id
          ORDER BY band_downloads.id DESC;
                           e                         e                              e
   No segundo caso, vocˆ pode obter duas linhas idˆnticas no MySQL 3.23.x na s´rie do
   resultado (porque o campo escondido ’id’ pode variar).
                                                              e a
   Perceba que isto somente acontece em consultas onde vocˆ n˜o tem colunas ORDER
                             a
   BY no resultado, algo n˜o permitido no ANSI SQL.
 • Como o MySQL permite trabalhar com tipos de tabelas que n˜o suportam transa¸˜es
                                                                  a                   co
               a
   (e assim n˜o pode fazer rollback em dados) algumas coisas funcionam um pouco
   diferentes de outros servidores SQL em MySQL (Isto serve para garantir que o MySQL
                     a                                               e
   nunca necessitar´ de um rollback para um comando SQL). Por´m isto pode ser um
                                                                                      ca
   pouco estranho em casos que os valores dos campos devem ser verificados na aplica¸˜o,
                               o
   mas isto ira fornacer um ´timo ganho de velocidade assim como permite ao MySQL
   fazer algumas otimiza¸˜es que de outro modo seriam muito dif´
                           co                                     iceis para serem feitas.
          e
   Se vocˆ informar um valor incorreto em uma coluna, o MySQL, em vez de fazer um
   rollback, aramzenar´ o melhor valor poss´vel no campo.
                         a                       i
     − Se tentar armazenar um valor fora da faixa em uma coluna num´rico, o MySQL
                                                                          e
          a                                         ´ no campo.
        ir´ armazenar o menor ou maior valor possivel
60                                               e      e                       a
                                            Referˆncia t´cnica para o MySQL vers˜o 3.23.52



       − Se tentar armazenar uma string que n˜o comece com um n´mero em uma coluna
                                                   a                   u
                e                a
          num´rica, o MySQL ir´ armazenar 0 na coluna.
       − Se vocˆ tentar armazenar NULL em uma coluna que n˜o aceita valores
                    e                                                      a
                             a
          nulos, MySQL ir´ armazenar 0 ou ’’ (string vazia) na coluna.                   (Este
                                                                          ca
          comportamento pode, entretanto, ser alterado com a op¸˜o de compila¸˜o            ca
          -DDONT USE DEFAULT FIELDS).
       − O MySQL permite o armazenamento de alguns valores errados de data em campos
          do tipo DATE e DATETIME. (Como 2000-02-31 ou 2000-02-00). Se a data estiver
                                           a
          totalmente errada, o MySQL ir´ armazenar a data 0000-00-00 no campo.
       − Se vocˆ especificar um valor n˜o suportado para um campo do tipo enum, ele ser´
                  e                      a                                                     a
                                                                        e
          alterado para o valor de erro ’empty string’, com valor num´rico 0.
 •           e                                                                  e
     Se vocˆ executar uma PROCEDURE em uma pesquisa que retorna uma s´rie vazia, em
                          ca                  a   a
     alguns casos a instru¸˜o PROCEDURE n˜o ir´ transformar as colunas.
 •        ca                                a                                      a
     Cria¸˜o da tabela do tipo MERGE n˜o verifiva se as tabelas envolvidas s˜o de tipos
     compat´  iveis.
 •                      a
     O MySQL ainda n˜o pode lidar com valores NaN, -Inf e Inf em tipos double. Us´-los    a
            a                        ca              ca                      ca
     causar´ problemas na exporta¸˜o e importa¸˜o de dados. Uma solu¸˜o intermedi´ria      a
     ´ alterar NaN para NULL (se for poss´
     e                                     ivel) e -Inf e Inf para o valor double m´ inimo ou
     m´ximo respectivo poss´
       a                     ivel.
 •                 u                 a                    u
     LIMIT em n´meros negativos s˜o tratados como n´meros grandes positivos.
 •   Se vocˆ usar ALTER TABLE para primeiro adicionar um ´
            e                                               indice UNIQUE a uma tabela usada
     em uma tabela MERGE e ent˜o usar ALTER TABLE para adicionar um ´
                                   a                                         indice normal na
                                              a
     tabela MERGE, a ordem das chaves ser´ diferente para as tabelas se existir uma chave
               a ´                      e
     antiga n˜o unica na tabela. Isto ´ porque o ALTER TABLE coloca chaves UNIQUE antes
                                      ´ detectar chaves duplicadas o mais cedo o poss´
     de chaves normais para ser possivel                                                  ivel.
                    a                    o
Os seguintes erros s˜o conhecidos em vers˜es mais antigas do MySQL:
 • Vocˆ pode pendurar um processo se vocˆ fizer um DROP TABLE em uma tabela entre
       e                                    e
   outras que esteja travada com LOCK TABLES.
 • No caso seguinte vocˆ pode obter um descarrego de mem´ria para o arquivo core:
                        e                                   o
    − Tratamento de inser¸˜es com atraso tem deixado inser¸˜es pendentes na tabela.
                            co                                co
    − LOCK table com WRITE
    − FLUSH TABLES
 • Antes da vers˜o 3.23.2 do MySQL um UPDATE que atualizava uma chave com um WHERE
                a
   na mesma chave podia falhar porque a chave era usada para procurar por registros e a
                                         a
   mesma linha poderia ter encontrado v´rios itens:
         UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY > 100;
                                    e
   Um modo de contornar este erro ´ utilizar:
         mysql> UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY+0 > 100;
                 a                    a        a                   o            a
   Isto funcionar´ porque MySQL n˜o utilizar´ indices em express˜es com a cl´usula
   WHERE.
 • Antes da vers˜o 3.23 do MySQL, todos os tipos num´ricos tratados como campos
                 a                                        e
                                        e
   de pontos fixos. Isto significa que vocˆ tem que especificar quantas casas decimais um
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                            61



    campo de ponto flutuante deve ter. Todos os resultados eram retornados com o numero
    correto de casas decimais.
Para erros espec´                               co                ca
                ificos na plataforma, vejas as se¸˜es sobre compila¸˜o e portabilidade.

1.5 Como comparar o MySQL com outros Bancos de dados
       ca
Esta se¸˜o compara o MySQL com outros bancos de dados populares.
       ca                                                a
Esta se¸˜o foi escrita pelos desenvolvedores MySQL, ent˜o deve ser lida com isto em mente.
  a e                                 e                               ca        e
N˜o ´ de nosso conhecimento a existˆncia de erros factuais nesta se¸˜o. Se vocˆ encontrar
algo em que acredita ser um erro, por favor nos contate em docs@mysql.com
                                                  co                   a
Para uma lista de todos os limites suportados, fun¸˜es e tipos veja a p´ginas Web crash-me
em http://www.mysql.com/information/crash-me.php.

1.5.1 Como comparar o MySQL com o mSQL
Performance
                                        ca
          Para uma verdadeira compara¸˜o de velocidade, consulte a suite de benchmark
          do MySQL See undefined [MySQL Benchmarks], page undefined .
                a                             ca
          Por n˜o existir sobrecarga de cria¸˜o de threads, um pequeno parser, poucos
                             c                                a
          recursos e seguran¸a simples, mSQL deve ser mais r´pido em:
            • Testes que conectam e desconectam repetidas vezes, executando queries
                                                 a
               muito simples durante cada conex˜o.
            • Opera¸˜es INSERT em tabelas muito simples com poucas colunas e chaves.
                     co
            • CREATE TABLE e DROP TABLE.
            • SELECT em campos que n˜o sejam ´
                                          a        indice. (Uma varredura de tabela ´e
                      a
               muito f´cil.)
          Como estas opera¸˜es s˜o muito simples, ´ dif´ ser melhor que eles quando
                             co    a                 e   icil
             e                                                    a
          vocˆ tem uma alta sobrecarga inicial. Depois da conex˜o ser estabelecida, a
          performance do MySQL deve ser bem melhor.
                                      e              a
          Por outro lado, o MySQL ´ muito mais r´pido que o mSQL (e a maioria das
                              co
          outras implementa¸˜es SQL) no seguinte:
            • Opera¸˜es SELECT complexas.
                     co
            • Recupera¸˜o de grandes resultados (MySQL tem um protocolo melhor,
                        ca
                     a
               mais r´pido e mais seguro)
            • Tabelas com strings de tamanho variavel, porque o MySQL tem um handler
               mais eficiente e pode ter ´
                                        indices em campos VARCHAR
            • Manipula¸˜o de tabelas com v´rias colunas.
                        ca                     a
            • Manipula¸˜o de tabelas com grande quantidade de registros.
                        ca
            • SELECT com v´rias express˜es.
                              a           o
            • SELECT em grande tabelas.
            • Tratamento de v´rias conex˜es ao mesmo tempo. O MySQL ´ totalmente
                                 a          o                             e
                                            a           o
               multi-threaded. Cada conex˜o tem sua pr´pria thread, o que significa que
               nenhuma thread tem que esperar por outra (a menos que uma thread esteja
62                                           e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



               modificando uma tabela que uma outra thread deseja acessar). No mSQL,
                                      a
               uma vez que uma conex˜o for estabelecida, todos outros devem esperar at´ e
                                                                   ca            a
               que a primeira tenha acabado, sem levar em considera¸˜o se a conex˜o est´a
                                          e
               executando uma query que ´ curta ou longa. Quando a primeira conex˜o   a
                            o
               termina, a pr´xima pode ser atendida, enquanto todas as outras esperam
               novamente e etc.
             • Joins. O mSQL pode ficar patologicamente lento se vocˆ alterar a ordem
                                                                        e
               das tabelas em uma SELECT. Na suite de benchmark, o mSQL se mostrou
                                                           e
               15000 vezes mais lento que o MySQL. Isto ´ devido a falta de um otimizador
               join para ordenar tabelas na ordem otimizada no mSQL. Entretanto, se
                   e
               vocˆ colocar as tabelas na ordem exata no mSQL2 e o WHERE for simples e
               usar ´                                      a
                     indice, o join vai ser relativamente r´pido! See undefined [MySQL
               Benchmarks], page undefined .
             • ORDER BY e GROUP BY.
             • DISTINCT.
             • Usando tipos TEXT ou BLOB em campos.
Recursos SQL
            • GROUP BY e HAVING. O mSQL n˜o suporta completamente o GROUP BY. O
                                            a
              MySQL suporta completamente o GROUP BY com HAVING e as seguintes
                 co
              fun¸˜es: COUNT(), AVG(), MIN(), MAX(), SUM() e STD(). COUNT(*) ´      e
              otimizado para retornar rapidamente se o SELECT retornar de uma tabela,
                                   e              a a          a
              nenhum outro campo ´ devolvido e n˜o h´ uma cl´usula WHERE. MIN() e
              MAX() podem exigir argumentos.
             • INSERT e UPDATE com c´lculos. O MySQL pode fazer c´lculos em uma
                                      a                          a
                     ca
               instru¸˜o INSERT ou UPDATE. Por exemplo:
                     mysql> UPDATE SET x=x*10+y WHERE x<20;
             • Apelidos ou alias. MySQL tem suporte a apelidos para os campos.
             • Qualificando nomes de colunas. No MySQL, se um nome de coluna ´ unica
                                                                                  e´
                                                        e a
               entre as tabelas usadas em uma query, vocˆ n˜o tem que usar o qualifidador
               completo.
             • SELECT com fun¸˜es. O MySQL tem v´rias fun¸˜es (muitas para serem
                                co                   a        co
               listadas aqui; veja undefined [Functions], page undefined ).
    e
Eficiˆncia no Armazenamento em Disco
                      a
           Ou seja, qu˜o pequena pode ser suas tabelas ?
                                                                          ca
           Existem tipos muito precisos no MySQL, que possibilitam a cria¸˜o de tabelas
                                            c
           que consumem muito pouco espa¸o em disco. Um exemplo de um tipo de
                           e                                       e
           dados MySQL ´ o MEDIUMINT que ocupa 3 bytes. Se vocˆ tiver 100.000.000 de
           registros, economizar um byte por registro pode ser m uito importante.
           O mSQL2 possui uma variedade mais limitada para tipos de campos, portanto,
           e
           ´ mais complicado para obter pequenas tabelas.
Estabilidade
            ´
            E dif´ julgar objetivamente. Para uma discuss˜o sobre estabilidade do
                 icil                                      a
            MySQL, veja em undefined [Stability], page undefined .
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                           63



             o a                  e                                          a
           N´s n˜o tempos experiˆncia com a estabilidade do mSQL, portanto, n˜o podemos
           dizer nada sobre isto.
   c
Pre¸o                                 e        c
           Outro assunto importante ´ a licen¸a. O MySQL possui uma licen¸a maisc
               ´                      e e
           flexivel que o mSQL, e tamb´m ´ mais barato que o mSQL. Qualquer produto
                   e
           que vocˆ escolha usar, lembre-se de considerar ao menos o pagamento de uma
                 c                            ee                            c
           licen¸a ou suporte por e-mail. (Vocˆ ´ obrigado a obter uma licen¸a se incluir
           o MySQL com um produto que vende.)
Interfaces Perl
            O MySQL tem basicamente a mesma interface para o Perl que o mSQL com
            alguns recursos adicionais.
JDBC (Java)
                                      a
          Atualmente, o MySQL tem v´rios drivers JDBC diferentes:
            • O driver mm:       Um driver JDBC tipo 4 por Mark Matthews
                                               e
              mmatthew@ecn.purdue.edu. Este ´ distribuido sobre a LGPL.
            • O driver Resin.           e
                                  Este ´ um driver JDBC comercial open source.
              http://www.caucho.com/projects/jdbc-mysql/index.xtp
            • O driver gwe: Uma interface JAVA fabricada pela GWE technologies (n˜o
                                                                                 a
              e
              ´ mais suportado).
            • O driver jms: Um driver gwe melhorado por xiaokun Kelvin ZHU
                                   a e
              X.Zhu@brad.ac.uk (n˜o ´ mais suportado).
            • O driver twz: Um driver JDBC tipo 4 por Terrence W. Zellers
                                        ´               e
              zellert@voicenet.com. E comercial, por´m livre para uso privado e
                            a e
              educacional (n˜o ´ mais suportado).
                                   e                                e
           O driver recomendado ´ o driver mm. O driver Resin tamb´m pode ser bom
                                                        o a                     co
           (pelo menos nos benchmarks parece bom), mas n´s n˜o recebemos informa¸˜es
           suficientes sobre ele ainda.
             o                                                 o
           N´s sabemos que o mSQL tem um driver JDBC, mas n´s temos muito pouca
                 e
           experiˆncia com ele para comparar.
Desenvolvimento
           MySQL tem uma equipe de desenvolvedores muito pequena, mas somos bem
            a                                                  co
           r´pidos codificando em C e C++. Como threads, fun¸˜es, GROUP BY e outras
                            a    a                               e
           recursos ainda n˜o est˜o implementada em mSQL, eles tˆm muitas coisas para
                                                                co      e
           fazer. Para ter uma perspectiva para estas implementa¸˜es vocˆ pode ar uma
           olhada no arquivo de HIST´RICO do mSQL do ultimo ano e compar´-lo com a
                                      O                                     a
           se¸˜o Novidades do Manual de Referˆncia do MySQL. (see undefined [News],
             ca                               e
                              ´      o
           page undefined ). E bem ´bvio quem tem desenvolvido mais rapidamente.
                a
Programas utilit´rios
                                        a
          Ambos mSQL e MySQL tem v´rias ferramentas interessantes de terceiros. Como
          e          a                                                    co
          ´ muito f´cil portar (do mSQL para MySQL), quase todas as aplica¸˜es interes-
          santes que s˜o dispon´
                       a        iveis para mSQL tamb´m est´ dispon´ para MySQL.
                                                    e     a       ivel
          O MySQL vem com um programa simples, msql2mysql que corrige diferen¸as    c
                                                             co
          nas sintaxes entre o mSQL e o MySQL para as fun¸˜es C API mais usadas.
          Por exemplo, ele altera instancias de msqlConnect() para mysql_connect().
64                                            e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



           Converter um programa cliente de mSQL para MySQL levam alguns poucos
           minutos.

1.5.1.1 Como converter ferramentas mSQL para o MySQL
          e       o      e       a
Por experiˆncia pr´pria, ´ necess´rio apenas algumas horas para converter ferramentas como
a msql-tcl e msqljava que usam a API em C do mSQL para que eles trabalhem com API
C do MySQL.
                            a e
O procedimento de convers˜o ´:
 1. Execute o script shell msql2mysql na fonte. Isto necessita o programa replace, que ´ e
    distribu´ com o MySQL.
            ido
 2. Compile.
                                    ca
 3. Corrija todos erros de compila¸˜o
           c
As diferen¸as entre a API C do mSQL e a API C do MySQL s˜o: a
 • O MySQL usa uma estrutura MYSQL como um tipo de conex˜o, (mSQL usa um int).
                                                                 a
 • o mysql_connect() recebe um ponteiro para uma estrutura MYSQL como um parˆmetro.
                                                                                 a
    ´ a
    E f´cil definir um globalmente ou usar malloc() para obter um. mysql_connect()
          e                a                           a                e              a
    tamb´m recebe dois parˆmetros para especificar o usu´rio e senha. Vocˆ pode configur´-
                                      a
    los para NULL, NULL para uso padr˜o.
 • mysql_error() recebe uma estrutura MYSQL como um parˆmetro. Apenas adicione o
                                                               a
        a             o                                e                    o
    parˆmetro para c´digo antigo mysql_error() se vocˆ estiver portanto o c´digo antigo.
 • O MySQL retorna um n´mero de erro e uma mensagem texto de erro para todos erros.
                            u
    O mSQL retorna somente a mensagem de erro.
 • Algumas incompatibilidades existem como o resultado do MySQL suportar mult´      iplas
           o
    conex˜es para o servidor do mesmo processo.

               c                                ca
1.5.1.2 Diferen¸as entre os protocolos de comuni¸˜o do mSQL e do
        MySQL Cliente/servidor
Existem bastantes diferen¸as que ´ imposs´ (ou pelo menos, n˜o ´ f´cil) suportar ambos.
                          c        e      ivel                 a e a
                                     c
O que mais caracteriza as diferen¸as entre o protocolo do MySQL e o protocol do mSQL
   a
est˜o listadas abaixo:
  •
                        o                a
     Um buffer de mem´ria pode conter v´rias linhas de resultado.
  • Os buffers de mensagens crescem dinamicamente se a sua query ou o resultado for
                                       e          ca
     maior que o buffer atual, chega at´ a configura¸˜o do servidor e o limite do cliente.
  • Todos pacotes s˜o numerados para capturar pacotes perdidos ou duplicados.
                     a
  • Todos valores das colunas s˜o enviados em ASCII. Os tamanhos de colunas e linhas
                                  a
      a                                        ca     a
     s˜o enviados empacotados em uma codifica¸˜o bin´ria (1, 2 ou 3 bytes).
  • O MySQL pode ler no resultado que n˜o est´ registrado (sem necessidade de armazenar
                                          a    a
     o conjunto inteiro no cliente).
  • Se uma simples leitura/escrita demorar mais que 30 segundos, o servidor encerra a
           a
     conex˜o.
  • Se uma conex˜o estiver ociosa por 8 horas, o servidor encerra a conex˜o.
                   a                                                     a
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                           65



1.5.1.3 Diferencas entre as sintaxes SQL do mSQL 2.0 e do MySQL
Tipos de Campos
O MySQL    Tem os seguintes tipos adicionais (entre outros; see undefined [CREATE TABLE],
           page undefined ):
             • Tipo ENUM para um de um conjunto de strings.
             • Tipo SET para v´rios de um conjunto de strings.
                                a
             • Tipo BIGINT para inteiros com 64bits.
                       e
           MySQL tamb´m suporta os seguintes atributos de tipos adicionais:
            • Op¸˜o UNSIGNED para colunas com n´meros inteiros.
                 ca                               u
            • Op¸˜o ZEROFILL para colunas com n´meros inteiros.
                 ca                               u
            • Op¸˜o AUTO_INCREMENT para colunas com n´meros inteiros que s˜o CHAVE
                 ca                                     u                   a
              PRIM´RIA. See undefined [mysql_insert_id()], page undefined .
                   A
            • Valor DEFAULT para todos os tipos de colunas.
mSQL2      tipos de campo   mSQL correspondem aos tipo MySQL mostrados abaixo:
           Tipo mSQL        Tipo MySQL correspondenete
           CHAR(tam)        CHAR(tam)
           TEXT(tam)                       e              a
                            TEXT(tam). tam ´ o tamanho m´ximo. E LIKE funciona.
           INT                                      co
                            INT. Com muito mais op¸˜es!
           REAL             REAL. Ou FLOAT. Est˜o dispon´
                                                a                    o
                                                        iveis as vers˜es 4 e 8 bits.
           UINT             INT UNSIGNED
           DATE                                                                         a
                            DATE. Usa o tanto formato ANSI SQL quanto o formato propriet´rio do
                            mSQL.
           TIME             TIME
           MONEY                                  u
                            DECIMAL(12,2). Um n´mero de ponto fixo com dois decimais.
Cria¸˜o de ´
    ca     Indices
MySQL      ´                                             ca                           ca
           Indices podem ser especificados na hora da cria¸˜o da tabela juntos a instru¸˜o
           CREATE TABLE.
mSQL       ´                                       ca                       co
           Indices podem ser criados depois da cria¸˜o da tabela, com instru¸˜es CREATE
           INDEX separadas.
                             ´
Para inserir um identificador unico na tabela
MySQL      Usa o AUTO_INCREMENT como um especificador de tipo de coluna.
           See undefined [mysql_insert_id()], page undefined .
mSQL
           Cria um SEQUENCE em uma tabela e seleciona a coluna _seq.
                           ´
Para obter um identificador unico para uma linha
MySQL      Adicione uma chave primaria (PRIMARY) ou uma chave UNIQUE para a tabela e a
                                   a
           use. Novidades na Vers˜o 3.23.11: Se as chaves primaria (PRIMARY) ou UNIQUE
                                                                             e
           consistirem de somente uma coluna e esta for do tipo inteiro, tanb´m podemos
           nos referenciar a ela como _rowid.
66                                            e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



mSQL       Use a coluna _rowid. Observe que _rowid pode ser alterado varias vezes,
           dependendo de alguns fatores.
Obtendo a hora em que uma coluna foi alterada
MySQL                                                                  e
           Adicionando uma coluna TIMESTAMP na tabela. Este campo ´ configurado auto-
                                                                           e a
           maticamente para receber os valores de data e hora atuais se vocˆ n˜o informar
           algum valor ou fornecer um valor NULL.
mSQL       Usa o coluna _timestamp.
       co
Compara¸˜es de Valores NULL
MySQL                                                         ca           e
           O MySQL segue o ANSI SQL, portanto qualquer compara¸˜o com NULL ´ sem-
           pre NULL.
mSQL                            e                e
           No mSQL, NULL = NULL ´ verdadeiro. Vocˆ deve alterar =NULL para IS NULL
                                                     o
           e <>NULL para IS NOT NULL quando portar c´digos antigos do mSQL para o
           MySQL.
       co
Compara¸˜es de Strings
MySQL                              co                             a
           Normalmente, compara¸˜es de conjuntos de caracteres s˜o feitas no estilo in-
                                                         ca
           dependente do caso com a forma de classifica¸˜o determinada pelo conjunto
                                                               ca    a           e a
           de caracteres atuais (ISO-8859-1 Latin1 por defini¸˜o padr˜o). Se vocˆ n˜o
           gosta disto, declare seus campos com o atributo BINARY, que deixa as com-
               co                                           ca                 a
           para¸˜es serem realizadas de acordo com a ordena¸˜o ASCII usada na m´quina
           que hospeda o servidor MySQL.
mSQL                       co                               a
           Todas as compara¸˜es de conjuntos de caracteres s˜o caso sensitivo com or-
               ca
           dena¸˜o na ordem ASCII.
Pesquisas Caso Insensitivo
MySQL           e
           LIKE ´ um operador caso-sensitivo ou caso-insensitivo, dependendo dos campos
                              ivel, o MySQL usa ´
           envolvidos. Se poss´                                                a
                                                 indices se o argumento LIKE n˜o iniciar
           com um meta caracter.
mSQL       Usar CLIKE.
                c
Manipulando Espa¸os Excessivos
MySQL                           c
           Remove todos os espa¸os no final de colunas CHAR e VARCHAR. Utilize uma
                                                  a e
           coluna TEXT se o comportamento citado n˜o ´ desejado.
mSQL           e         c
           Mant´m os espa¸os excessivos.
  a
Cl´usulas WHERE
MySQL                                 e
           O MySQL prioriza tudo (AND ´ avaliado antes de OR). Para obter o comparta-
           mento do mSQL no MySQL, use parenteses (como visto no exemplo abaixo).
mSQL                                                                                  o
           Avalia tudo da esquerda para a direita. Isto significa que alguns calculos l´gicos
                                           a                               e
           com mais de tres argumentos n˜o pode ser expressados. Tamb´m significa que
              e                                            e
           vocˆ deve alterar algumas queries quando vocˆ atualizar para o MySQL. Vocˆ      e
                                                       e                          e
           pode fazer isto facilmente adicionando parˆnteses. Suponha que vocˆ tenha a
           seguinte consulta mSQL:
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                             67



                  mysql> SELECT * FROM tabela WHERE a=1 AND b=2 OR a=3 AND b=4;
                                                      c
            Para fazer com que o MySQL avalie a senten¸a da maneira que o mSQL faria,
               e                   e
            vocˆ deve adicionar parˆnteses:
                  mysql> SELECT * FROM tabela WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));
Controle de Acesso
MySQL                                     co           e             o           a
            Tem tabelas para armazenar op¸˜es de privil´gios (permiss˜es) por usu´rio,
             a
            m´quina e banco de dados. See undefined [Privileges], page undefined .
mSQL                                            e                     e
            Tem um arquivo ‘mSQL.acl’ em que vocˆ pode conceder privil´gios de leitura/
                            a
            escrita para usu´rios.



1.5.2 Como comparar o MySQL ao PostgreSQL
                      ca                                               a
Quando ler esta se¸˜o, por favor perceba que ambos produtos est˜o continuamente em
      ca     o
evolu¸˜o. N´s na MySQL AB e os desenvolvedores do PostgreSQL estamos ambos trabal-
hando para fazer os nossos bancos de dados os melhores poss´  iveis, portanto, somos ambos,
       e
uma s´ria escolha sobre qualquer banco de dados comercial.
                      ca e           o                     o
A seguinte compara¸˜o ´ feita por n´s na MySQL AB. N´s tentamos ser o mais preciso e
claro poss´                  a
           ivel, mas como n˜o temos pleno conhecimento de todos os recursos do PostgreSQL
como temos do MySQL, podemos ter deixado alguns itens errados. Entretanto, iremos
                                     ca
corrigi-los que chamarem nossa aten¸˜o.
                                                                     a
Inicialmente gostariamos de notar que o PostgreSQL e o MySQL s˜o ambos, produtos in-
tensamente usados, mas com diferentes objetivos, mesmo se ambos empenhassem na com-
          ca                                                           co
patibiliza¸˜o com o ANSI SQL. Isto significa que para algumas aplica¸˜es o MySQL ´ maise
indicado, enquando para outras, o PostgreSQL possa ser mais. Quando for escolher qual
                           e
banco de dados usar, vocˆ deve inicialemnte conferir se o conjunto de recursos do banco de
                           ca       e                                    e
dados satisfaz sua aplica¸˜o. Se vocˆ precisa de velocidade, o MySQL ´ provavelmente sua
                         e
melhor escolha. Se vocˆ necessita e alguns recursos extras que somente o PostgreSQL pode
              e
oferecer, vocˆ deve usar PostgreSQL.

              e
1.5.2.1 Estrat´gias de desenvolvimento da MySQL e PostgreSQL
                                                                         ca
Quando adicionamos recursos ao MySQL, orgulhamos de criar uma solu¸˜o otimizada e
               o              a             o a                              a
definitiva. O c´digo deve ser t˜o bom que n´s n˜o teremos necessidade de alter´-lo em um
          o        o       e    a
futuro pr´ximo. N´s tamb´m n˜o gostamos de sacrificar velocidade em prol dos recursos,
    e              a                             ca         a           a
por´m faremos o m´ximo para encontrar uma solu¸˜o que ir´ fornecer o m´ximo de resulta-
                                          a
dos. Isto implica que o desenvolvimento ir´ ser um pouco demorado, mas o resultado final
ir´ ter uma importˆncia maior. Este tipo de desenvolvimento s´ ´ poss´ porque todo o
  a                a                                           oe     ivel
c´digo do servidor ´ conferido por poucas (atualmente duas) pessoas antes de ser inclu´
 o                 e                                                                  ido
no servidor MySQL.
  o                     c                            co
N´s na MySQL AB lan¸amos frequentemente atualiza¸˜es para que possamos implementar
                                           a                                    c
rapidamente novos recursos para nossos usu´rios. Por isto fazemos um pequeno lan¸amento
                                                         ca
a aproximadamente cada 3 semanas, e uma distribui¸˜o maior a cada ano. Todos
    c          a
lan¸amentos s˜o extensamente testados com nossas ferramentas de testes em v´rias    a
plataformas diferentes.
68                                              e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



              e                                a
PostgreSQL ´ baseado em um kernel com v´rios colaboradores. Nesta configura¸˜o faz  ca
                       ca       a                                          a
sentido priorizar a adi¸˜o de v´rios recursos novos, em vez de implement´- los de forma
otimizada, porque sempre se pode otimizar itens depois se houver necessidade para isto.
                      c                                     e
Outra grande diferen¸a entre o MySQL e o PostgreSQL ´ que quase todo o c´digo no o
                  e                                 a
servidor MySQL ´ feito por desenvolvedores que s˜o contratados pela MySQL AB e con-
                         o                           co  a                          co
tinuam trabalhando no c´digo do servidor. As exce¸˜es s˜o os mecanismos de transa¸˜es e
a biblioteca regexp.
      e                     o                                         o     e
Este ´ o contraste com o c´digo do PostgreSQL onde a maioria do c´digo ´ feita por um
                                              co         co     o
grande grupo de pessoas em diferentes situa¸˜es e condi¸˜es. S´ agora os desenvolvedores
do PostgreSQL anunciaram que o grupo de desenvolvimento atual finalmente teria tempo
                     o             a
para revisar todo o c´digo na vers˜o atual.
Ambos os m´todos de desenvolvimento citados acima tem seus pr´prios m´ritos e benef´
             e                                                  o       e             icios.
´              o                                          e
E claro que n´s na MySQL pensamos que nosso modelo ´ melhor pois ele fornece melhor
        e        o            o           a                               a
consistˆncia no c´digo, um c´digo reutiliz´vel e otimizado e na nossa opni˜o, menos erros.
                                   o                          o
Pelo fato de sermos os autores do c´digo do servidor MySQL, n´s estamos melhor adaptados
                                     c
para coordenar novos recursos e lan¸amentos.

               co
1.5.2.2 Compara¸˜es de recursos entre o MySQL e PostgreSQL
Na p´gina crash-me vocˆ pode encontrar uma lista das constru¸˜es e limites dos bancos de
     a                   e                                    co
                                       a
dados que podem ser detectados autom´ticamente com um programa. Perceba entretanto
      a                      e                                 co                 ca
que v´rias dos limites num´ricos podem ser alterados com op¸˜es de inicializa¸˜o para
                                  a                e                ´
respectivos bancos de dados. O p´gina web acima ´ extremamente util quando vocˆ quer e
                         ca               a
assegurar que sua aplica¸˜o funcione com v´rios bancos de dados diferentes ou quando vocˆ   e
                            ca
desejar converter sua aplica¸˜o de um banco de dados para outro.
O MySQL oferece as seguintes vantagens sobre o PostgreSQL:
  • O MySQL ´ normalmente muito mais r´pido que o PostgreSQL. See undefined [MySQL-
              e                         a
    PostgreSQL benchmarks], page undefined .
  • O MySQL tem uma base de usu´rios muito maior que o PostgreSQL, portanto o c´digo
                                    a                                                 o
    e                  e                             a
    ´ mais testado e tˆm sido historicamente mais est´vel que o PostgreSQL. O MySQL ´       e
                                              ca
    muito mais usado nos ambientes de produ¸˜o do que o PostgreSQL, na maioria gra¸as    c
    a
    ` MySQL AB, formalmente TCX DataKonsult AB, que tem fornecido excelencia na
                                                                            c
    qualidade do do suporte comercial para o MySQL desde o dia de seu lan¸amento, onde
           e                              a
    que at´ recentemente o PostgreSQL n˜o era suportado.
  • O MySQL trabalha melhor no Windows do que o PostgreSQL. O MySQL executa como
                ca                             c
    uma aplica¸˜o Windows nativa (um servi¸o no NT/Win2000/WinXP), enquanto o
                 e                        ca            o
    PostgreSQL ´ executado sobre a emula¸˜o cygwin. N´s temos ouvido que o PostgreSQL
      a e           a                     a
    n˜o ´ ainda est´vel no windows mas n˜o temos capacidades para afirmar.
  • O MySQL tem mais APIs que outras linguagems e ´ suportado por mais programas
                                                         e
    existentes que o PostgreSQL. See undefined [Contrib], page undefined .
  • O MySQL trabalha em sistemas pesados 24/7. Na maioria das circunstˆncias vocˆ
                                                                               a            e
                   a                                                     a
    nunca precisar´ fazer qualquer limpeza no MySQL. O PostgreSQL n˜o suporta ainda
    sistemas 24/7 porque em determinado momento deve ser executado o VACUUM() para
    recuperar espa¸o dos comandos UPDATE e DELETE e executar analizes estat´
                   c                                                                      a
                                                                            isticas que s˜o
       ´                                                              e      e
    criticas para obter boa performance com o PostgreSQL. VACCUM() ´ tamb´m necess´rio  a
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                           69



                           a
    depois de adicionar v´rios registros em uma tabela. Em um sistema ocupado com
     a           co
    v´rias altera¸˜es, VACUUM() deve ser executado muito frequentemente, nos piores casos
                                                ca
    mesmo muitas vezes ao dia. Durante a execu¸˜o do VACUUM(), que pode durar horas se
    o banco de dados for grande, o banco de dados num ponto de vista de produtividade
    fica praticamente morto. A equipe PostgreSQL tem corrigido isto no seu TODO, mas
     o                       a e              a
    n´s assumimos que isto n˜o ´ uma coisa f´cil de ser corrigida permanentemente.
 • O recurso de replica¸˜o funciona e ´ usado por sites como:
                       ca             e
     − Yahoo Finance (http://finance.yahoo.com)
     − Mobile.de (http://www.mobile.de/)
    − Slashdot (http://www.slashdot.org)
   ´ inclu´ nas distribui¸˜es MySQL dois tipos diferentes de testes: ‘mysql-test-run’
 • E      ido             co
   e crash-me, bem como o de medida de velocidade. O sistema de testes ´ ativamente
                                                                           e
                   o
   atualizado com c´digo para testar cada novo recurso e com quase todos erros repetidos
                             ca    o                                  a
   que chamaram nossa aten¸˜o. N´s testamos o MySQL com isto em v´rias plataformas
                     c                        a
   antes de todos lan¸amentos. Estes testes s˜o mais sofisticados que qualquer um que
                                                          e
   vimos para o PostgreSQL, e ele assegura que o MySQL ´ mantido em um alto padr˜o.  a
 • Existem muito mais livros impressos sobre MySQL do que sobre PostgreSQL. O’Reilly,
                           a
   Sams, Que e New Rider s˜o todas grandes editores com livros sobre MySQL. Todos re-
                    a     e
   cursos MySQL s˜o tamb´m documentados no manual on-line, porque, quando um novo
           e               e
   recurso ´ implementado ´ exigido ique os desenvolvedores do MySQL o documentem
   antes de ser inclu´ na fonte.
                      ido
 • O MySQL suporta mais fun¸˜es b´sicas do ODBC que o PostgreSQL.
                           co    a
 • O MySQL tem um ALTER TABLE muito mais sofisticado.
 • O MySQL tem suporte para tabelas n˜o transacionais para aplica¸˜es que necessitam
                                       a                         co
                                                                        o
   toda velocidade que podem ter. As tabelas podem ser baseadas em mem´ria, tabelas
   HEAP ou baseadas em disco MyISAM. See undefined [Table types], page undefined
 • O MySQL tem suporte para dois manipuladores de tabelas diferentes que suportam
         co
   transa¸˜es, BerkeleyDB e InnoDB. Porque todo mecanismo transacional executa difer-
                        co                                                  co
   entemente sobre condi¸˜es diferentes, isto fornece ao programador mais op¸˜es para
                     ca                               ca
   encontrar uma solu¸˜o otimizada para sua configura¸˜o. See undefined [Table types],
   page undefined
 • Tabelas consolidadas com MERGE lhe fornece uma maneira unica para criar uma vista
                                                              ´
          a                                                                    e
   instantˆnea sobre um conjunto de tabelas identicas e usa-las como uma. Isto ´ perfeito
                         e                          e                             e
   para sistemas onde vocˆ tem arquivos log que vocˆ ordena, por exemplo por mˆs. See
    undefined [MERGE], page undefined .
 • A op¸˜o para comprimir tabelas somente leitura, mas ainda ter acesso direto aos reg-
         ca
   istros na tabela, fornece melhor performance minimizando leituras em disco. Isto
   e        ´               e
   ´ muito util quando vocˆ estiver arquivando coisas. See undefined [myisampack],
   page undefined .
 • O MySQL tem suporte interno para pesquisas textuais. See undefined [Fulltext
   Search], page undefined .
 • Vocˆ pode acessar v´rios bancos de dados da mesma conex˜o (dependeno ´ claro de
       e              a                                   a             e
              e
   seus privil´gios).
70                                            e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • O MySQL ´ codificado desde o ´
              e                  inicio para ser multi-thread enquando o PostgreSQL usa
                                           a                               e
   processos. Troca de contexto e acesso a ´reas comuns de armazenamento ´ muito mais
    a
   r´pido entre threads do que entre processos separados, isto fornece ao MySQL uma
                                              co             a           e
   grande vantagem em velocidade em aplica¸˜es multi-usu´rias e tamb´m torna muito
         a
   mais f´cil para o MySQL obter vantagem total de sistemas de multiprocessamento
      e
   sim´trico (SMP).
 • O MySQL tem um sistema de privil´gios muito mais sofisticado do que o PostgreSQL.
                                       e
                                              o
   Enquanto o PostgreSQL suporta permiss˜es somente para INSERT, SELECT e
                          a
   UPDATE/DELETE por usu´rio em um banco de dados ou uma tabela, o MySQL permite
           e                                               e
   que vocˆ defina um conjunto completo de diferentes privil´gios nos bancos de dados,
                                         e
   tabelas e campos. O MySQL tamb´m lhe permite especificar as combina¸˜es de  co
         e          a           a
   privil´gios por m´quina e usu´rios. See undefined [GRANT], page undefined .
 • O MySQL suporta um protocol cliente/servidor comprimido que aumenta a perfor-
                 o
   mance em conex˜es lentas.
 • O MySQL trabalha com um conceito de “table handler”, e ´ o unico banco de dados
                                                            e ´
   relacional que conhecemos constru´ neste conceito. Isto permite diferentes tipos de
                                      ido
   tabela em baixo n´ivel serem trocadas no mecanismo SQL e cada tipo de tabela ser
   otimizado para diferentes caracter´
                                     isticas de performace.
 • Todos os tipos de tabelas MySQL (exceto InnoDB) s˜o implementados como arquivos
                                                        a
                                                                  c        ca
   (uma tabela por arquivo), que facilita muito o backup, mudan¸a e dele¸˜o e mesmo
         o       o
   conex˜es simb´licas entre bancos de dados e tabelas, mesmo se o servidor estiver desli-
   gado.
 • Ferramentas para corrigir e otimizar tabelas MyISAM (o tipo de tabelas MySQL mais
                                         oe       a
   comum). Um ferramenta de reparos s´ ´ necess´ria quando uma corrompimento fisico
   do arquivo de dados acontece, normalmente por uma falha no equipamento. Elas
   permitem que a maioria dos dados sejam recuperados.
 • Atualizar o MySQL ´ indolor. Quando vocˆ estiver atualizando o MySQL, n˜o precisar´
                      e                    e                              a          a
                                              e                                   co
   de apagar/restaurar os seus dados, como vocˆ deve fazer na maioria das atualiza¸˜es
   do PostgreSQL.
                                ca
Desvantagens do MySQL em compara¸˜o ao PostgreSQL:
 • O suporte a transa¸˜o no MySQL n˜o ´ t˜o bem testado como no sistema PostgreSQL.
                     ca            a e a
 • Como o MySQL utiliza threads, os quais ainda n˜o est˜o comple-
                                                            a       a
              a                                         e
   tos em v´rios Sistemas Operacionais, deve-se tamb´m usar bin´rios de a
                                                                          co
   http://www.mysql.com/downloads, ou cuidadosamente seguir nossas instru¸˜es em
   http://www.mysql.com/doc/I/n/Installing_source.html para obter um bin´rio a
   otimizado que funcione em todos os casos.
 • Bloqueios de tabelas, usados pelas tabelas n˜o transacionais MyISAM ´, em muitos
                                                  a                         e
                 a                        a
   casos, mais r´pidos que bloqueios de p´ginas, bloqueios de registros ou versionamento.
                               e            e    a                     ca
   A desvantagem entretanto ´ que se algu´m n˜o levar em considera¸˜o como funciona
                                               ´
   o bloqueio de tabelas, simplesmente, uma unica query que demora muito tempo para
                                                       co
   executar, pode bloquear uma tabela para atualiza¸˜es por um grande tempo. Isto
                                                   ca         a
   pode ser evitado quando for desenhar a aplica¸˜o. Se n˜o, pode-se sempre trocar a
   tabela e utilizar uma das tabelas do tipo transacional. See undefined [Table locking],
   page undefined .
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                             71



 • Com o UDF (Fun¸˜es definidas pelo usu´rio) pode-se extender o MySQL com fun¸˜es
                     co                    a                                          co
                                             a e a a            ´ como no PostgreSQL.
   SQL normais e agregadas, mas isto ainda n˜o ´ t˜o f´cil e flexivel
   See undefined [Adding functions], page undefined .
 • Atualiza¸˜es e remo¸˜es que executam sobre mult´
           co           co                            iplas tabelas s˜o mais dif´
                                                                     a          iceis para
                                 a
   serem feitas no MySQL. Isto ir´, entretanto, ser corrigido no MySQL 4.0 com DELETE
   multi tabelas e UPDATE multi tabelas e no MySQL 4.1 com subselects.
O PostgreSQL atualmente oferece as seguintes vantagens sobre o MySQL:
Note que como conhecemos o mapa do MySQL, n´s inclu´
                                                o                                    a
                                                       imos na seguinte tabela a vers˜o
                                                       o a
na qual o MySQL deve suportar o recurso. Infelizmente n´s n˜o podemos fazer isto em na
          ca                  o a
compara¸˜o anterior, porque n´s n˜o conhecemos o mapa do PostgreSQL.
Recurso                                                            a
                                                               vers˜o MySQL
Subselects                                                     4.1
Foreign keys (Chaves Estrangeiras)                             4.0 e 4.1
Views                                                          4.2
Stored procedures                                              4.1
Sistemas de tipos extensivos                                   Sem planejamento
Unions                                                         4.0
Full join                                                      4.0 or 4.1
Triggers                                                       4.1
Constrainst                                                    4.1
Cursores                                                       4.1 or 4.2
Tipos de indices extensivos como R-trees                       R-trees estao planejados
                                                               para 4.2
Tabelas com heran¸ac                                           Sem planejamento
             o
Outras raz˜es para usar o PostgreSQL:
  • O uso comum do PostgreSQL ´ mais pr´ximo ao ANSI SQL em alguns casos.
                                  e       o
  • O PostgreSQL pode ficar mais r´pido codificando coisas como stored procedures.
                                    a
  • PostgreSQL tem uma equipe de desenvolvedores maior que contribuem com o servidor.
Desvantagens do PostgreSQL comparado ao MySQL:
 • A cl´usula VACUUM() dificulta o uso do PostgreSQL em um ambiente 24/7.
        a
 • Somente tabelas transacionais.
 • INSERT, DELETE UPDATE muito mais lentos.
                                            e          e
Para uma lista completa de desvantagens, vocˆ deve tamb´m examinar a primeira tabela
        ca
nesta se¸˜o.

                co
1.5.2.3 Compara¸˜es de velocidade entre o MySQL e o
        PostgreSQL
   ´                                   o
O unico benchmark open source que n´s conhecemos que pode ser usados para testar a
                                                             e           o
velocidade do MySQL e do PostgreSQL (e outros bancos) ´ o nosso pr´prio. Ele pode ser
encontrado em http://www.mysql.com/information/benchmarks.html.
  a                                                               a
V´rias vezes solicitamos ajuda aos desenvolvedores e alguns usu´rios do PostgreSQL para
extender esse software de benchmark para fazer dele o teste definitivo para Bancos de Dados,
                    o a
mas infelizmente n´s n˜o estamos tendo retorno sobre isto.
72                                               e      e                       a
                                            Referˆncia t´cnica para o MySQL vers˜o 3.23.52



             o                                              a
Por isto, n´s, os desenvolvedores do MySQL gastamos v´rias horas para obter performance
   a                                                           a
m´xima do PostgreSQL para os benchmarks, mas como n˜o conhecemos PostgreSQL inti-
mamente, temos certeza que existem detalhes que podem ter sido esquecidos. N´s temos      o
     a                                             ca
na p´gina de testes em nosso site a documenta¸˜o de como fizemos os testes para que seja
 a
f´cil para qualquer um repetir e verificar nossos resultados.
                           a                                                 ca
Os testes comparativos s˜o normalmente executados com e sem a op¸˜o --fast. Quando
                            o
executado com --fast n´s estamos tentando usar todos os truques que o servidor pode
fazer para que o c´digo execute o mais r´pido poss´
                    o                       a                       e e                ca
                                                        ivel. A id´ia ´ que a execu¸˜o normal
                                                                   ca         a
deve mostrar como o servidor deve trabalhar numa configura¸˜o padr˜o e a execu¸˜o com       ca
                                                                                ca
--fast mostra como o servidor comportaria se o desenvolvedor da aplica¸˜o usar extens˜es       o
                                   ca                    a
no servidor para fazer sua aplica¸˜o executar mais r´pida.
                                                        o
Quando executando com o PostgreSQL e --fast n´s fazemos um VACUUM depois de quase
todos maiores UPDATE e DROP TABLE para deixar o banco de dados em forma perfeita para
                                                    e
as SELECTs seguintes. O tempo para VACUUM() ´ medido separadamente.
                                                    a
Quando executando com o PostgreSQL 7.1.1 n˜o podemos, entretando, executar com --
fast porque durante o teste de INSERT, o postmaster (daemon do PostgreSQL) finalizou
e o banco de dados ficou t˜o corrompido que se tornou imposs´ reiniciar o postmaster.
                              a                                       ivel
                                                                                       e
Depois disto ter acontecido duas vezes, decidimos adiar o teste com o --fast at´ a pr´xima   o
     a                                            a
vers˜o do PostgreSQL. Os detalhes sobre a m´quina na qual executamos o teste pode ser
                  a
encontrado na p´gina de testes comparativos em nosso site.
Antes de irmos para os outros testes comparativos que conhecemos, gostariamos de fornecer
                  co
algumas informa¸˜es sobre os testes:
´ muito f´cil escrever um teste demonstrando que ALGUM banco de dados ´ o melhor do
E           a                                                                        e
mundo, restringindo o teste apenas a alguma parte em que o banco de dados seja muito
          a                                      a                e
bom e n˜o testar outras partes que podem n˜o ser. Se algu´m publica os resultados com
                     ca                               a
uma simples figura¸˜o as coisas se tornam mais f´ceis ainda.
Seria como n´s med´
               o       issemos a velocidade do MySQL comparada ao PostgreSQL olhando
                                                                 a
para o resumo de tempo dos testes do MySQL na nossa p´gina. Desta forma o MySQL
                               a                                                     a e
poderia ser 40 vezes mais r´pido que o PostgreSQL, algo que com certeza n˜o ´ verdade.
       ´                                       a
Poderiamos deixar a coisa ainda pior se peg´ssemos o teste onde o PostgreSQL atuou pior
                         e                            a
e falar que o MySQL ´ mais de 2000 vezes mais r´pido que o PostgreSQL.
         e                       a           co                            a       ´
O caso ´ que o MySQL faz v´rias otimiza¸˜es que o PostgreSQL n˜o faz. E claro que isto
       e e                                                   e
tamb´m ´ verdade do outro ladoa. Um otimizador SQL ´ uma coisa muito complexa e uma
empresa pode gastar anos apenas para deixar o otimizador cada vez mais r´pido.     a
        e
Se vocˆ estiver consultando os resultados dos testes procure por coisas que sua aplica¸˜o      ca
                                                                                 a
utilize e use estes resultados apenas para decidir qual banco de dados ser´ o melhor para a
            ca                                                  e
sua aplica¸˜o. Os resultados dos testes comparativos tamb´m mostram onde um banco de
                         a e                                     ca
dados em particular n˜o ´ bom e deve lhe fornecer uma no¸˜o sobre coisas que devem ser
                      e
evitadas e o que vocˆ deve fazer de outras maneiras.
Conhecemos dois testes comparativos que mostram o PostgreSQL com mais velocidade que
                       a                  a                        o
o MySQL. Os dois s˜o testes multi-usu´rios, um teste que n´s da MySQL AB ainda n˜o              a
tivemos tempo para desenvolver e incluir no conjunto de testes comparativos principalmente
         e
porque ´ uma enorme tarefa fazer isto de uma maneira justa para todos os bancos de dados.
      e                                                                e
Um ´ o teste comparativo pago da Great Bridge, o qual vocˆ pode ler a respeito em:
http://www.greatbridge.com/about/press.php?content_id=4.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                                  73



      e                                                a
Este ´ provavelmente o pior software de testes que j´ vimos alguem conduzir. Ele n˜o s´  a o
foi preparado para testar exatamente o que o PostgreSQL tem de melhor, mas al´m dissoe
          e
foi tamb´m injusto contra todos os outros bancos de dados envolvidos no teste.
NOTA: Sabemos que nem mesmo alguns dos principais desenvolvedores do PostgreSQL
gostam da maneira que a Great Bridge conduziu os testes comparativos, ent˜o n˜o os a     a
culpamos pela maneira que os testes foram realizados.
                                            a
Este comparativo tem sido condenado em v´rias mensagens postadas em listas de discuss˜es     o
portanto falaremos aqui apenas das coisas que estavam erradas com ele.
  • Os testes foram executados com uma cara ferramenta comercial, que torna imposs´         ivel
                                             o
     para uma empresa open source como n´s confirmar os resultados , ou mesmo conferir
                                                                            e
     como os testes realmente foram feitos. A ferramenta nem mesmo ´ uma ferramenta
                                                                                  co
     de testes comparativos de verdade, mas uma ferramenta de testes de aplica¸˜es e con-
            ca                e                        a                           e
     figura¸˜o. Dizer que ela ´ uma ferramenta “padr˜o” de testes comparativos ´ esconder
     a verdade.
  • A pr´pria Great Bridge admitiu que eles otimizaram os testes para o banco de dados
           o
                                                                                   a
     PostgreSQL (com VACUMM() antes dos testes) e preparou os testes, coisa que n˜o foi feita
     para nenhum dos outros bancos de dados envolvidos. Para dizer “Este processo otimiza
     indices e libera um pouco de espa¸o em disco. Os ´
     ´                                  c                  indices otimizados aumentaram a
     velocidade em alguns casos.” Nossos testes claramente indicam que a diferen¸a em   c
                 a
     executar v´rias selects em um banco de dados com e sem VACUUM() pode facilmente
     diferenciar de um fator de dez.
  • Os resultados dos testes tamb´m foram estranhos. A documen¸˜o do teste AS3AP
                                     e                                   ca
                                   co                        co                        co
     menciona que o teste faz “sele¸˜es, joins simples, proje¸˜es, agregados, atualiza¸˜es de
                           co
     uma tupla e atualiza¸˜es em massa (bulk updates)”.
                     e
     O PostgreSQL ´ bom fazendo SELECTs e JOINs (especialmente depois de um VACUUM(),
             a       a
     mas n˜o atua t˜o bem em INSERTs ou UPDATEs. Os comparativos parecem indicar que
                                                                 co
     somente SELECTs foram feitos (ou muito poucas atualiza¸˜es). Isto pode facilmente
                                           a
     explicar porque os resultados foram t˜o bons para o PostgreSQL neste teste. Os maus
     resultados para o MySQL obviamente rebaixa este documento.
  • Eles executaram o t˜o chamado benchmark de uma m´quina Windows acessando uma
                          a                                  a
        a                                         ca                   a
     m´quina Linux sobre ODBC, uma configura¸˜o que nenhum usu´rio de banco de dados
                                                   ca                    a
     comum faria se estive executando uma aplica¸˜o pesada multi-usu´ria. Isto testou mais
                                                                                 o
     o driver ODBC e o protocolo Windows usado entre os clientes do que o pr´prio banco
     de dados.
  • Executando o banco de dados contra o Oracle e o MS-SQL (A Great Bridge indicou
     indiretamente os bancos de dados que eles usaram no teste), eles usaram o ODBC
                                                          a
     no lugar do protocolo nativo. Qualquer um que j´ tenha usado o Oracle sabe que
            co                                          a
     aplica¸˜es reais devem usar a interface nativa e n˜o ODBC. Fazer um teste atrav´s de e
                                              a               ca                       co
     ODBC e reinvidicar que os resultados n˜o teinham rela¸˜o alguma com as situa¸˜es de
                        a
     uso na vida real n˜o deve ser tomado como justo. Eles deveriam ter feito dois testes
     com e sem ODBC para fornecer o fatos reais (depois de contratar expecialistas para
     preparar os bancos de dados involvidos).
  • A Great Bridge faz referencias aos testes TPC-C, mas n˜o mencionam em lugar algum
                                                               a
                               a
     que o teste que fizeram n˜o foi realmente um teste TPC-C e eles nem mesmo estavam
                                                                       o
     permitidos a chamare-no de teste TPC-C. Um teste TPC-C s´ pode ser conduzido
74                                            e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



   pelas regras aprovadas pelo conselho TPC (http://www.tpc.org). A Great Bridge
    a                                                                            o
   n˜o fez isto. Com isto, violaram a marca registrada TPC e descreditado seus pr´prios
                                                         a
   comparativos. As regras criadas pelo conselho TPC s˜o muito estritas para garantir
              e                                            a
   que ningu´m produza falsos resultados ou relatos improv´veis. Aparentemente Great
            a     a
   Bridge n˜o est´ interessada em fazer isto.
 • Depois do primeiro teste, n´s entramos em contato com a Great Bridge e mencionamos
                               o
                      o
   algumas das falhas ´bvias que cometeram com o MySQL:
    − Utilizaram uma vers˜o de depura¸˜o do nosso driver ODBC
                            a            ca
    − Executaram em um sistema Linux que n˜o era otimizado para threads
                                                a
    − Utilizaram uma vers˜o antiga do MySQL quando existia uma nova vers˜o mais
                             a                                                 a
                                  a       ´
       recomendada para o uso, j´ disponivel
    − N˜o inicializaram o MySQL com as op¸˜es corretas para uso em sistemas multi-
         a                                    co
       usu´rios pesados (a instala¸˜o padr˜o do MySQL ´ preparada para uso m´
           a                      ca       a            e                     inimo de
       recursos).
   A Great Bridge executou um novo teste, com nosso driver ODBC otimizado e com
                co              ca
   melhores op¸˜es de inicializa¸˜o para o MySQL, mas recusaram usar a nossa biblioteca
                                a        a                              a
   glibc atualizada ou nosso bin´rio padr˜o (usado por 80% de nossos usu´rios), que utiliza
   com uma biblioteca glibc corrigida.
                                             a
   Segundo o que sabemos, a Great Bridge n˜o fizeram nada para assegurar que os outros
   bancos de dados foram configurados corretamente para executar bem em seu ambiente
                 o                                       a
   de testes. N´s temos certeza, entretanto, que eles n˜o entraram em contato com a
                                                             a
   Oracle ou a Microsoft para pedir seu conselho nesta quest˜o ;)
 • Os testes comparativos foram pagos pela Great Bridge e eles decidiram publicar so-
   mente resultados parciais selecionados (em vez de publicar todo o resultado).
Tim Perdue, um f˜ ass´
                a                                      a
                     iduo do PostgreSQL e relutante usu´rio MySQL publicou uma com-
    ca
para¸˜o em phpbuilder.
                                       ca
Quando ficamos sabendo da compara¸˜o, ligamos para Tim Perdue pois existiam muitas
coisas estranhas nos seus resultados. Por exemplo, ele alega que o MySQL tem um problema
               a                                                      a
com cinco usu´rios nos seus testes, enquanto sabemos que existem usu´rios com equipamen-
                                                             o        a
tos similares que usam o MySQL com cerca de 2000 conex˜es simultˆneas executando 400
                                                                    a
consultas por segundo. (Neste caso o limite foi a banda de rede, n˜o o banco de dados.)
                                                                                    a
Nos pareceu que ele estivesse usando um Kernel Linux que tinha algum problema com v´rias
                                          a
threads, como nos kernels antes da vers˜o 2.4, que possuia um problema com threads em
  a                              o
m´quinas multi-processadas. N´s documentamos neste manual a forma para corrigir isto e
Tim deve estar ciente deste problema.
Outro poss´                                                                     a
            ivel problema pode ter sido uma biblioteca glibc antiga e que Tim n˜o tenha
                 a                              e
usando um bin´rio MySQL de nosso site, que ´ utiliza com uma biblioteca glibc correta,
    e                      a    o
por´m compilou uma vers˜o pr´pria. Em qualquer dos casos acima, o sintoma poderia ter
sido exatamente o que Tim mediu.
Perguntamos ao Tim se poder´                                            e
                                iamos ter acesso aos dados para que pud´ssemos repetir a
      ca                                  a             a
avalia¸˜o e se ele poderia conferir a vers˜o MySQL na m´quina para descobrir o que estava
                                                       a
errado e ele prometeu nos dar um retorno. Isto ainda n˜o foi feito.
                 a                                c
Por causa disto n˜o podemos depositar nossa confian¸a nestes testes :(
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                                75



                                                      a a
As coisas mudaram com o tempo e os testes acima n˜o s˜o mais relevantes. O MySQL
agora tem alguns diferentes manipuladores de tabela com diferente custo-benef´ de ve-
                                                                               icio
locidade/concorrencia. See undefined [Table types], page undefined . Seria interessante
ver como os testes anteriores poderiam executar com os diferentes tipos de tabelas transa-
                    ´                               e
cionais no MySQL. E claro que o PostgreSQL tamb´m ganhou novos recursos desde que o
teste foi feito. Como o teste acima n˜o foi publicamente dispon´ n˜o existe forma para
                                     a                         ivel a
  o                                         a
n´s sabermos como o banco de dados poder´ atuar nos mesmos testes hoje.
       a
Conclus˜o:
    ´
Os unicos benchmarks que existem hoje que qualquer um pode baixar e executar contra o
                        a                     o
MySQL e o PostgreSQL s˜o os testes MySQL. N´s, na MySQL, acreditamos que bancos de
             o                                                  o                   e
dados com c´digo aberto devem ser testados com ferramentas de c´digo aberto! Este ´ o
´                                  e     c             a
unico modo para assegurar que ningu´m fa¸a testes que n˜o possam ser reproduzidos e os
                                      e
use para alegar que um banco de dados ´ melhor que o outro. Sem conhecer todos os fatos
´ imposs´ responder `s alega¸˜es do testador.
e       ivel          a      co
                           e
O que achamos estranho ´ que todos os testes que temos visto sobre o PostgreSQL, que
´ imposs´
e                                                         e
         ivel de ser reproduzido, alega que o PostgreSQL ´ melhor na maioria dos casos
                                                                                     a
enquanto em nossos testes, que qualquer um pode reproduzir, mostra claramente o contr´rio.
            o a                                       a e              a
Com isto n´s n˜o queremos dizer que o PostgreSQL n˜o ´ bom em v´rias coisas (ele ´!)   e
              a e        a                                     co        o o
ou que ele n˜o ´ mais r´pido que o MySQL sobre certas condi¸˜es. N´s s´ gostariamos
                                                                  a
de ver um teste justo que seja realmente muito bom, para que ent˜o pudessemos ter uma
        ca       a
competi¸˜o amig´vel!
Para maiores informa¸˜es sobre nosso pacote de testes See undefined [MySQL Bench-
                    co
marks], page undefined .
                                                                                   a
Estamos trabalhando em um pacote de testes ainda melhor, incluindo testes multi usu´rios,
                       ca
e uma melhor documenta¸˜o do que os testes individuais realmente fazem e como adicionar
mais testes ao pacote.

1.6 MySQL e o futuro (o TO-DO)
Este apendice lista os recursos que planejamos implementar no MySQL.
                    a                                         a               e
Tudo nesta lista est´, aproximadamente, na ordem em que ser˜o feitas. Se vocˆ desejar
                                                            c
alterar a ordem de prioridades, por favor registre uma licen¸a ou suporte e nos diga o
        e
que vocˆ quer que seja feito mais rapidamente. See undefined [Licensing and Support],
page undefined .
         e                 o                                      a
O plano ´ que, no futuro, n´s suportaremos completamente o padr˜o ANSI SQL99, mas com
 a           o ´                  e
v´rias extens˜es uteis. O desafio ´ fazer isto sem sacrificar a velocidade ou comprometer o
 o
c´digo.

                                      a
1.6.1 Coisas que devem constar na Vers˜o 4.0
  o                            a                  ca    a                o
N´s planejamos fazer da vers˜o 4.0 uma distribui¸˜o “r´pida” na qual s´ adicionamos coisas
novas para que outras pessoas possam nos ajudar no desenvolvimento de novos recursos para
      a                        a                                        e
a vers˜o 4.1. O MySQL vers˜o 4.0 deve levar aproximadamente um mˆs para que possamos
    a       a                                       a             a
torn´-la est´vel e iniciar o desenvolvimento da vers˜o 4.1. A vers˜o 4.0 deve ter os seguintes
recursos:
76                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



    ca                                                               o a
A se¸˜o de novidades para a 4.0 inclui uma lista dos recursos que n´s j´ implementamos na
a
´rvore 4.0. See undefined [News-4.0.x], page undefined .
  • Novo formato do arquivo de defini¸˜o de tabela (arquivos .frm). Isto nos permitir´
                                            ca                                             a
           a                                                              co
    que n˜o tenhamos problemas de bits quando adicionarmos mais op¸˜es de tabelas. O
                                        a
    formato antigo .frm ainda poder´ ser usado com o 4.0. Todas novas tabelas, entretanto,
         a
    usar˜o o novo formato.
                                              a
    O novo formato de arquivo permitir´ adicionar novos tipos de colunas, mais op¸˜es   co
    para chaves e suporte a Chave Estrangeira.
  • mysqld como uma biblioteca. Isto ter´ a mesma interface como o cliente padr˜o MySQL
                                              a                                    a
                    ca                                     a                   ca
    (com uma fun¸˜o extra para configurar apenas parˆmetros de inicializa¸˜o) mas ser´      a
            a                                                                  a
    mais r´pido (sem sobrecarga do TCP/IP ou do socket), menor e mais f´cil para usar
    para produtos embutidos.
                                             ca
    Poderemos definir em tempo de liga¸˜o se queremos usar o modelo cliente/servidor ou
                ca
    uma aplica¸˜o isolada apenas definindo com qual biblioteca deve ser ligada.
                 a                                a                          a
    O mysqld ir´ suportar todos recursos padr˜o do MySQL e podemos us´-lo num cliente
    que suporte threads para executar diferentes consultas em cada thread.
  • A replica¸˜o deve trabalhar com RAND() e vari´veis de usu´rio @var.
              ca                                      a          a
                                          ´
  • Backup Online com penalidade minima de performance. O backup online ir´ facilitar
                                                                                    a
                                                  ca
    para adicionar um novo escravo de replica¸˜o sem ter que desligar o mestre.
  • DELETE FROM nome_tabela ir´ retornar o n´mero de linhas apagadas. Para execu¸˜o
                                    a               u                                    ca
            a
    mais r´pida use TRUNCATE nome_tabela.
  • Permite que DELETE em tabelas MyISAM use o cache de registros. Para fazer isto,
    precisaremos atualizar os threads de cache de registros quando atualizarmos o arquivo
    .MYD
  • Melhor replica¸˜o.
                    ca
  • Mais fun¸˜es para pesquisas textuais. See undefined [Fulltext Features to Appear in
              co
    MySQL 4.0], page undefined .
  • Elenco de conjuntos de caracteres e sintaxe para manipular multiplos conjunto.
  • Permite usu´rios para alterar op¸˜es de inicializa¸˜o sem parar o servidor.
                 a                       co             ca
  • Ajuda para todos comandos no cliente.
  • Conex˜es seguras (com SSL).
            o
  • Extender o otimizador para otimizar algumas consultas ORDER BY key_name DESC
  • SHOW COLUMNS FROM nome_tabela (usado pelo cliente mysql para permitir expans˜es      o
                              a                                                      ca
    de nomes de colunas) n˜o deve abrir a tabela, mas somente o arquivo de defini¸˜o. Isto
      a                     o         a
    ir´ exigir menos mem´ria e ser´ mais r´pido.a
  • Nova chave de cache
  • Quando usar SET CHARACTER SET devemos traduzir a toda consulta e n˜o somente  a
                    a                  a
    strings. Isto ir´ habilitar os usu´rios para usarem os caracteres traduzidos no banco de
    dados, nome de colunas e tabelas.
  • Adicionar uma interface port´vel sobre gethostbyaddr_r() para que possamos alterar
                                    a
                                 a
    ip_to_hostname() para n˜o bloquear outras threads enquanto faz consultas DNS.
  • Adicionar o m´todo record_in_range() para tabelas MERGE para ser poss´ escolher
                    e                                                            ivel
      ´                                   a
    o indice correto quando existir v´rios que possam ser escolhidas. Devemos tamb´m     e
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                            77



                                    co                         ca
   extender a interface de informa¸˜es para obter a distribui¸˜o de chaves para cada
   ´
   indice, se analyze estiver executando em todas sub-tabelas.
 • SET SQL_DEFAULT_TABLE_TYPE=[MyISAM | INNODB | BDB | HEAP].

                                                     o
1.6.2 Coisas que devem ser feitas em um futuro bem pr´ximo
 • Replica¸˜o livre de falhas.
          ca
 • Subqueries. select id from t where grp in (select grp from g where u > 100)
 • Tabelas derivadas.
        select a.col1, b.col2 from (select max(col1) as col1 from root_table ) a,
        other_table b where a.col1=b.col1
                                                               a
    Isto podia ser feito automaticamente criando tabelas tempor´rias para as tabelas
                     ca
    derivadas na dura¸˜o da consulta.
 • Adicionar PREPARE de instru¸˜es e envio de parˆmetros para mysqld.
                              co                 a
 • Extender o protocolo cliente/servidor para suportar avisos.
 • Adicionar op¸˜es ao protocolo cliente/servidor para obter notas de progresso para co-
               co
                                    ca
   mandos de longo tempo de execu¸˜o.
 • Adicionar bancos de dados e nomes reais de tabelas (no caso de apelidos (alias)) `
                                                                                    a
   estrutura MYSQL FIELD.
 • N˜o permitir mais que um n´mero definido de threads para executar a recupera¸˜o
    a                        u                                                ca
   MyISAM ao mesmo tempo.
 • Alterar INSERT ... SELECT para opcionalmente usar inser¸˜es concorrentes.
                                                          co
 • Implementar RENAME DATABASE. Para tornar isto seguro para todos handlers de tabelas,
                a
   ele funcionar´ assim:
     • Cria o novo banco de dados.
     • Muda o nome de todas as tabelas para o outro banco de dados, como n´s fazemos
                                                                          o
       com o comando RENAME.
     • Remove o banco de dados antigo.
 • Retornar o tipo do campo original quando fizer SELECT MIN(column) ... GROUP BY.
 • M´ltiplos conjuntos de resultados.
    u
 • Alterar o protocol para permitir transferˆncia bin´ria de valores. Para faze-lo eficien-
                                            e        a
                                                                        a
   temente, precisamos adicionar uma API para podermos casar as vari´veis.
 • Torna poss´ especificar long_query_time com precis˜o em microsegundos.
              ivel                                         a
 • Adicionar um prompt configur´vel para o cliente de linha de comando mysql com
                                 a
     co
   op¸˜es do tipo banco de dados em uso, hora e data...
 • Adicionar conferˆncia do alcance para tabelas MERGE.
                   e
 • Ligar o c´digo myisampack no servidor.
            o
 • Portar o MySQL para o BeOS.
 • Portar os clientes MySQL para LynxOS.
 • Adicionar um cache de buffer para chave tempor´ria durante INSERT/DELETE/ UPDATE
                                                  a
   para que possamos fazer uma recupera¸`o f´cil se o arquivo de ´
                                       ca a                      indice encher.
78                                          e      e                       a
                                       Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • Se vocˆ executar um ALTER TABLE em uma tabela que ´ ligada simbolicamente a outro
          e                                                e
                               a
   disco, criar tabelas tempor´rias neste disco.
 • Implementar um tipo DATE/DATETIME para manipular fusos hor´rios corretamente para
                                                                   a
                                                                a
   lidarmos mais facilmente com datas em diferentes fusos hor´rios.
 • FreeBSD e MIT-pthreads; Deixar threads “dormindo” exigem processamento?
 • Conferir se threads travadas exige processamento
 • Corrigir o configure para que ele possa compilar todas as bibliotecas (como a MyISAM)
   sem threads.
 • Adicionar uma op¸˜o para periodicamente descarregar p´ginas chave para tabelas com
                       ca                                    a
                              a                                  c
   chaves atrasadas se elas n˜o forem usadas em um certo espa¸o de tempo.
 • Permitir “join” em partes de chaves (quest˜o de otimiza¸˜o).
                                                a            ca
 • INSERT SQL_CONCURRENT e mysqld --concurrent-insert para fazer inser¸˜es concor-
                                                                              co
   rentes no final do arquivo se o arquivo for travado para leitura.
 • Armazenar defini¸˜es de chaves ESTRANGEIRAS no arquivo ‘.frm’.
                      co
 • Cascatear o DELETE
 • Cursores do lado do servidor.
 • Conferir se o lockd trabalha com kernels Linux mais modernos; Se n˜o n´s teremos
                                                                           a o
   que corrigir o lockd! Para testar isto, inicie mysqld com --enable-locking e execute
                                                    a
   os diferentes pacotes de testes fork*. Se eles n˜o retornarem erros, lockd funciona.
 • Permite vari´veis SQL no LIMIT, como em LIMIT @a,@b.
                 a
 • Permite atualiza¸˜o de vari´veis nas instru¸˜es UPDATE. Por exemplo: UPDATE TABLE
                     ca         a                co
   foo SET @a=a+b,a=@a, b=@a+c
 • Alterar quando vari´veis de usu´rios s˜o atualizadas para ique possam ser usadas com
                         a          a      a
   GROUP BY, como no exemplo seguinte : SELECT id, @a:=count(*), sum(sum_col)/@a
   FROM nome_tabela GROUP BY id.
 • N˜o adicionar valores DEFAULT para as colunas. Isto retorna um erro quando se usa
     a
                      a                          a
   um INSERT que n˜o contenha uma coluna n˜o tenham um DEFAULT.
 • Cache de pesquisas e resultados. Isto deve ser feito como um m´dulo separado que
                                                                       o
   examina cada pesquisa e se a mesma estiver no cache o resultado memorizado deve
                                 e
   ser retornado. Quando algu´m atualiza uma tabela deve se remover algumas queries
                          a                                                   a
   do cache. Isto dever´ fornecer um grande incremento de velocidade em m´quinas com
                   o                    a                               co
   bastante mem´ria onde pesquisas s˜o muito repetidas (como aplica¸˜es WWW). Uma
     e
   id´ia seria armazenar no cache somente pesquisas do tipo: SELECT CACHED ...
 • Corrigir ‘libmysql.c’ para permitir dois comandos mysql_query() em uma linha sem
                                                                     e
   ler os resultados ou fornecer uma mensagem de erro quando algu´m o fizer.
 • Otimizar o tipo BIT para ocupar 1 bit (hoje BIT ocupa 1 char).
 • Checar porque MIT-pthreads ctime() n˜o funciona em alguns sistemas FreeBSD.
                                             a
 • Adicionar uma op¸˜o IMAGE para LOAD DATA INFILE para n˜o atualizar campos
                         ca                                          a
   TIMESTAMP e AUTO_INCREMENT.
 • Adicionar sintaxe LOAD DATE INFILE... UPDATE.
     • Para tabelas com chaves prim´rias, se os dados contˆm a chave prim´ria, entradas
                                       a                     e              a
                                          a     a
        que combinem com a chave prim´ria s˜o atualizadas do resto das colunas. Entre-
                                                            a a
        tanto, colunas FALTANDO na entrada de dados n˜o s˜o mudadas.
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                          79



     • Para tabelas com chaves prim´rias que falta alguma parte da chave na entrada de
                                   a
                      a                   a              e
       dados, ou que n˜o tenha chave prim´ria, a entrada ´ tratada como em LOAD DATA
       INFILE ... REPLACE INTO.
 • Fazer o LOAD DATA INFILE entender sintaxes do tipo:
         LOAD DATA INFILE ’file_name.txt’ INTO TABLE nome_tabela
         TEXT_FIELDS (text_field1, text_field2, text_field3)
         SET table_field1=concatenate(text_field1, text_field2), table_field3=23
         IGNORE text_field3

         Isto pode ser usado para saltar colunas extras no arquivo texto, ou
                                              o
         atualizar colunas baseadas em express~es dos dados lidos...
 • LOAD DATA INFILE ’file_name’ INTO TABLE ’nome_tabela’ ERRORS TO err_nome_
   tabela Esta forma permite que quaisquer erros e avisos sejam logados na tabela
   err nome tabela. Essa tabela deve ter uma estrutura como:
         line_number          u
                          - N´mero da linha no arquivo de dados
         error_message - A mensagem de erro/aviso
         e talvez
         data_line        - A linha do arquivo de dados
 • Adicionar real suporte a VARCHAR (J´ existe suporte para isto no MyISAM).
                                      a
 • Sa´ autom´tica do mysql para o netscape.
     ida       a
 • LOCK DATABASES. (com v´rias op¸˜es)
                         a       co
 • Alterar ordena¸˜o para alocar mem´ria em “grandes partes” para conseguir melhor
                  ca                o
          ca         o
   utiliza¸˜o de mem´ria.
 • Tipos DECIMAL e NUMERIC n˜o podem ler n´meros exponenciais; Field_
                                a               u
   decimal::store(const char *from,uint len) deve ser reescrito para corrigir
   isto.
 • Fun¸˜es: ADD TO SET(valor,conjunto) e REMOVE FROM SET(valor,conjunto)
      co
 • Adicionar uso de t1 JOIN t2 ON... e t1 JOIN t2 USING ... Atualmente, vocˆ s´ pode
                                                                           e o
   usar esta sintaxe com LEFT JOIN.
 • Adicionar suporte pleno para o tipo unsigned long long.
 • V´rias vari´veis a mais para show status.
     a        a                                      Contadores para:            co
                                                                          Instru¸˜es
   INSERT/DELETE/UPDATE. Registros lidos e atualizados. Selects em 1 tabela e selects
               u                                      u
   com joins. N´mero real de tabelas em uma select. N´mero de consultas ORDER BY e
   GROUP BY.
 • Se vocˆ abortar o mysql no meio de uma pesquisa, vocˆ deve abrir outra conex˜o e
          e                                                 e                       a
   matar a pesquisa antiga. Alternativamente, deve ser feita uma tentativa para detectar
   isto no servidor.
 • Adicionar uma interface de manioula¸˜o para as informa¸˜es de tabelas para que se
                                        ca                 co
            a
   possa us´-la como uma tabela de sistema. Pode se tornar um pouco lento se forem
   requisitadas informa¸˜es sobre todas as tabelas, mas muito flex´
                       co                                        ivel. SHOW INFO FROM
                             co    a                           e
   nome_tabela para informa¸˜es b´sicas de tabelas devem tamb´m ser implementadas.
 • Adicionar suporte para UNICODE.
 • NATURAL JOIN e UNION JOIN
80                                            e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • Permitir select A from crash_me left join crash_me2 using (A); Neste caso A ´
                                                                               e
   assumido para vir da tabela crash me.
 • Corrigir o ON e USING para funcionar com o tipo de uni˜o JOIN.
                                                         a
 • CONNECT BY PRIOR ..., como Oracle, para psquisas em estruturas hier´rquicas.
                                                                      a
 • mysqladmin copy database new-database. – Nececssita do comando COPY para ser
   adicionado ao mysqld
 • Lista de processos deve exibir n´mero de consultas/thread.
                                   u
 • SHOW HOSTS exibir´ informa¸˜es sobre o cache de nomes de m´quinas.
                    a        co                              a
 • Op¸˜es DELETE e REPLACE para a instru¸˜o UPDATE (esta op¸˜o apagar´ registros quando
     co                                 ca                 ca        a
                                                           ca
   um erro de chave duplicada for obtido durante a atualiza¸˜o.
 • Alterar o formato de DATETIME para armazenar fra¸˜es de segundos.
                                                   co
 • Adicionar todos os tipos ANSI92 e ODBC 3.0 que ainda faltam.
 • Alterar nomes de tabelas de strings vazias para NULL para colunas calculadas.
 • N˜o usar ’Item copy string’ em valors num´ricos para evitar convers˜o de n´mero-
     a                                        e                       a       u
             u
   >string->n´mero no caso de: SELECT COUNT(*)*(id+0) FROM nome_tabela GROUP BY
   id
 • Tornar poss´ivel o uso da nova biblioteca GNU regexp em vez da atual (A biblioteca
                                a
   GNU deve ficar muito mais r´pida do que a atual).
 • Alterar o ALTER TABLE para que n˜o aborte clientes que executam INSERT DELAYED.
                                   a
 • Corrigir quando as colunas referenciadas em uma cl´usula UPDATE cont´m os valores
                                                     a                 e
                            ca
   antigos antes da atualiza¸˜o iniciar.
 • myisamchk, REPAIR e OPTIMIZE TABLE devem conseguir tratar casos onde os arquivos
   de dados e/ou ´        a            o
                 indices s˜o links simb´licos.
 • Adicionar simula¸˜o de pread()/pwrite() no Windows para habilitar inser¸˜es si-
                   ca                                                     co
       a
   multˆneas.
 • Um analisador de arquivos log que podem analisar informa¸˜es sobre quais tabelas
                                                                  co
    a                                                 e
   s˜o acessadas mais frequentemente, qual a frequˆncia que joins de multi-tabelas s˜o   a
                             a              a                  a
   executadas, etc. Ele dever´ ajudar os usu´rios a identificar ´reas ou projetos de tabelas
             a
   que poder˜o ser otimizadas para executar consultas muito mais eficientes.
 • Adicionar SUM(DISTINCT)
 • Adicionar fun¸˜es de grupo ANY(),EVERY() e SOME(). Em ANSI SQL isto s´ fun-
                co                                                            o
                                    o               e
   ciona em colunas boleanas, mas n´s podemos extendˆ-las para trabalhar em qualquer
                 a
   coluna/express˜o aplicando: valor == 0 -> FALSO e valor <> 0 -> TRUE.
 • Corrigir o tipo para MAX(coluna) ser o mesmo que o tipo da coluna.
         create table t1 (a DATE);
         insert into t1 values (now());
         create table t2 select max(a) from t1;
         show columns from t2;
 • Vir com uma nova sintaxe para uma express˜o que ir´ fazer um UPDATE no registro se
                                             a         a
                                                                 a
   ele existir e fazer um INSERT de um novo registro se o mesmo n˜o existir. (Como o
   REPLACE trabalha com INSERT / DELETE)
                  co
Chapter 1: Informa¸˜es gerais sobre o MySQL                                         81



1.6.3 Coisas que em algum dia devem ser feitas
 • Implementar fun¸˜o: get_changed_tables(timeout,table1,table2,...)
                     ca
 • Atualiza¸˜es
             co         o
                     atˆmicas       multi-tabelas,     ex:     update items,month set
   items.price=month.price where items.id=month.id;;
 • Alterar leitura atrav´s de tabelas para usar mapeamento de mem´ria quando poss´
                          e                                        o              ivel.
   Atualmente somente tabelas compactadas usam mapeamento de mem´ria.    o
 • Adicionar um novo privil´gio ’Show priv’ para comandos SHOW.
                                e
 • Tornar o c´digo de timestamp autom´tico melhor. Adicionar timestamps para o log
                o                           a
                co
   de atualiza¸˜es com SET TIMESTAMP=#;
 • Usar mutex de leitura/escrita em alguns lugares para obter maior velocidade.
 • Suporte pleno a chave estrangeira. Provavelmente implementairemos uma linguagem
   procedural primeiro.
 • Views simples (inicialmente em uma tabela, depois em qualquer express˜o).a
 • Fechar algumas tabelas automaticamente se uma tabela, tabela tempor´ria ou arquivos
                                                                          a
           a                             a
   tempor´rios obtiverem o erro 23 (n˜o pode abrir arquivos suficientes).
 • Quando algu´m encontra um campo=#, mude todas as ocorrˆncias do campo para #.
                  e                                             e
                e
   Agora isto ´ feito somente para alguns casos simples.
 • Alterar todas express˜es const com express˜es calculadas se poss´
                           o                     o                 ivel.
 • Chave otimizadora = express˜o. No momento somente a chave = campo ou a chave =
                                   a
                a
   constante s˜o otimizadas.
 • Melhorar o c´digo de algumas das fun¸˜es de c´pia
                  o                         co       o
 • Alterar ‘sql_yacc.yy’ para um analizador em linha para reduzir seu tamanho e obter
   melhores mensagems de erro (5 dias).
 • Alterar o analisador para usar somente uma regra para diferentes n´meros de argu-
                                                                         u
   mentos em uma fun¸˜o. ca
 • Utilizar nomes de c´lculo completos na parte de ordena¸˜o. (For ACCESS97)
                        a                                  ca
 • UNION, MINUS, INTERSECT e FULL OUTER JOIN. (Atualmente somente o LEFT OUTER
         e
   JOIN ´ suportado)
 • Permitir UNIQUE em campos que podem ser NULL.
 • SQL_OPTION MAX_SELECT_TIME=# para colocar um limite de tempo em uma pesquisa.
 • Fazer o log de atualiza¸˜es gravar em um banco de dados.
                             co
 • LIMIT negativo para recuperar dados do fim.
 • Alarmes em fun¸˜es clientes de conex˜o, leitura e escrita.
                    co                     a
 • Por favor, perceba as altera¸˜es ao safe_mysqld: de acordo com o FSSTND (que o
                                  co
   Debian tenta seguir) arquivos PID dever ir em ‘/var/run/<progname>.pid’ e arquivos
                                     o             e                   o
   de log em ‘/var/log’. Seria ´timo se vocˆ puder colocar o diret´rio de dados na
                     ca                                       ca
   primeira declara¸˜o de "pidfile" e "log", para que a coloca¸˜o destes arquivos possa
   ser alterada com uma simples instru¸˜o.ca
 • Permitir um cliente requisitar log.
 • Adicionar uso de zlib() para arquivos gzip para funcionar com LOAD DATA INFILE
 • Corrigir ordena¸˜o e agrupamento de colunas BLOB (parcialmente resolvida agora).
                    ca
82                                           e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • Stored procedures. Atualmente isto n˜o ´ tratado com muito importante j´ que as
                                           a e                                  a
                        a     a
   stored procedures n˜o est˜o muito bem padronizadas ainda. Outro problema ´ que e
                                                                        a
   verdadeiras stored procedures dificultam muito o otimizador e em v´rios casos o resul-
        e                          o
   tado ´ mais lento que antes. N´s iremos, por outro lado, adicionar uma linguagem de
           ca     o
   atualiza¸˜o (atˆmica) simples que pode ser usada para escrever loops e semelhantes no
   servidor MySQL.
 • Alterar para o uso de sem´foros quando contar threads. Devemos primeiro implementar
                            a
                          a
   uma biblioteca de sem´foros para a MIT-pthreads.
 • N0˜o atribuir novos valores AUTO_INCREMENT quando algu´m configurar uma coluna
      a                                                        e
   para 0. No lugar disto usar NULL.
 • Adicionar suporte pleno para JOIN com parˆnteses.
                                               e
 • Como uma alternativa para uma thread / conex˜o gerencie uma fila de threads para
                                                     a
   manipular as pesquisas.
 • Permitir obter mais de um bloqueio com GET_LOCK. Quando isto for feito, ser˜o,    a
   tamb´m, tratados os poss´
        e                                                   ca    a
                             iveis deadlocks que essa altera¸˜o ir´ acarretar.
      e                                                      a
Tempo ´ fornecido de acordo com a quantidade de trabalho, e n˜o tempo real.

                          a
1.6.4 Algumas coisas que n˜o temos planos para fazer
 • Nada; Planejamos ser totalmente compat´
                                         iveis com o ANSI 92 / ANSI 99.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                           83



         ca
2 Instala¸˜o do MySQL
Este cap´
        itulo descreve como obter e instalar o MySQL:
 • Para uma lista de sites no quais vocˆ pode obter o MySQL, veja undefined [Getting
                                       e
   MySQL], page undefined .
 • Para saber quais s˜o as plataformas suportadas, veja em undefined [Which OS],
                      a
   page undefined . Por favor perceba que nem todas as plataformas suportadas s˜o      a
                                                       a
   igualmente boas para executar o MySQL. Algumas s˜o mais robustas e eficientes que
   outras - ver undefined [Which OS], page undefined para detalhes.
 • V´rias vers˜es do MySQL est˜o dispon´
     a         o                 a                           co      a                o
                                           iveis em distribui¸˜es bin´rias e fonte. N´s
        e                     u      a       a
   tamb´m fornecemos acesso p´blico ` nossa ´rvore fonte atual para aqueles que desejam
                                                                           o
   ver nossos desenvolvimentos mais recentes e nos ajudar a testar novos c´digos. Para
                       a                    ca     e
   determinar que vers˜o e tipo da distribui¸˜o vocˆ deve usar, veja undefined [Which
                                               u                     ca     a
   version], page undefined . Se ainda restar d´vidas, use a distribui¸˜o bin´ria.
 • Instru¸˜es de instala¸˜o para distribui¸˜es bin´ria e fonte s˜o descritos em undefined
          co             ca               co      a             a
   [Installing binary], page undefined e undefined [Installing source], page undefined .
   Cada conjunto de instru¸˜es inclui uma se¸˜o sobre problemas espec´
                             co                ca                          ificos de sistemas
            e
   que vocˆ pode precisar.
 • Para procedimentos p´s-instala¸˜o, veja undefined [Post-installation], page unde-
                        o        ca
                                                          e                  ca     a
   fined . Estes procedimentos podem ser aplicados caso vocˆ use uma distribui¸˜o bin´ria
   ou fonte do MySQL.


           ca a           a
2.1 Instala¸˜o r´pida padr˜o do MySQL

2.1.1 Instalando o MySQL no Linux
                                                        e
O caminho recomendado para instalar o MySQL no Linux ´ usando um arquivo RPM. Os
                               a        ´           a
RPMs do MySQL atualmente s˜o construidos na vers˜o 6.2 do sistema RedHat Linux mas
                             o
deve funcionar em outras vers˜es de Linux que suportam rpm e usam glibc.
      e                                                        e
Se vocˆ tiver problemas com um arquivo RPM, por exemplo, se vocˆ receber o erro “Sorry,
the host ’xxxx’ could not be looked up”, veja undefined [Binary notes-Linux],
page undefined .
                       e                   a a
Os arquivos RPM que vocˆ provavelmente usar´ s˜o:
 • MySQL-VERSION.i386.rpm
                         e                       a             e o
    O servidor MySQL. Vocˆ ira precisar disto a n˜o ser que vocˆ s´ deseje somente conectar
                                                   a
    a um servidor MySQL executando em outra m´quina.
 • MySQL-client-VERSION.i386.rpm
                              o                              e                a
    Os programas clientes padr˜es do MySQL. Provavelmente vocˆ sempre instalar´ este
    pacote.
 • MySQL-bench-VERSION.i386.rpm
    Testes e comparativos de performances (benchmarks). Necessita Perl e RPMs msql-
    mysql-modules.
84                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • MySQL-devel-VERSION.i386.rpm
                                        a            e
   Bibliotecas e arquivos include necess´rios se vocˆ desejar compilar outros clientes
                         o
   MySQL, como nos m´dulos Perl.
 • MySQL-VERSION.src.rpm
            e      o                                                 e
   Este cont´m o c´digo fonte para todos os pacotes acima. Ele tamb´m pode ser usado
   para tentar construir RPMs para outras arquiteturas (por exemplo, Alpha ou SPARC).
Para ver todos os arquivo em um pacote RPM, execute:
      shell> rpm -qpl MySQL-VERSION.i386.rpm
Para realizar uma instala¸˜o m´
                           ca               a
                                 inima padr˜o, execute:
      shell> rpm -i MySQL-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm
Para instalar somente o pacote cliente, execute:
      shell> rpm -i MySQL-client-VERSION.i386.rpm
                                                             e
O RPM coloca dados em ‘/var/lib/mysql’. O RPM tamb´m cria as entradas apropriadas
em ‘/etc/rc.d/’ para iniciar o servidor automaticamente na hora do boot. (Isto significa
           e                        ca                     e                    o
que se vocˆ realizou uma instala¸˜o anterior, talvez vocˆ deseje criar uma c´pia do seu
                        ca                                e                  ca
arquivo de inicialializa¸˜o instalado anteriormente se vocˆ fez alguma altera¸˜o no mesmo,
             e a                       co
para que vocˆ n˜o perca suas altera¸˜es.)
Depois de instalar o(s) arquivo(s) RPM, o daemon mysqld deve estar rodando e vocˆ j´    e a
deve poder iniciar o uso do MySQL. See undefined [Post-installation], page undefined .
Se alguma coisa der errado, vocˆ encontrar maiores informa¸˜es no cap´
                                  e                            co                       ca
                                                                        itulo de instala¸˜o.
See undefined [Installing binary], page undefined .

2.1.2 Instalando o MySQL no Windows
                     co                       co      a        e                  e
As seguintes instru¸˜es aplicam para distribui¸˜es bin´rias pr´-compiladas Se vocˆ fizer o
                          ca            e             a           a               o
download de uma distribui¸˜o fonte, vocˆ deve compil´-lo e instal´-lo por conta pr´pria.
       e a                o                      ca
Se vocˆ n˜o possui uma c´pia de uma distribui¸˜o MySQL, a primeira coisa a fazer ´ o   e
download em http://www.mysql.com/downloads/mysql-3.23.html.
        e                                                            e
Se vocˆ deseja conectar ao MySQL de algum outro programa, vocˆ provavelmente pre-
     a                                                      a
cisar´ do driver MyODBC, que pode ser encontrado na p´gina de download MyODBC
(http://www.mysql.com/downloads/api-myodbc.html).
                                  co                                   o
Para instalar alguma das distribui¸˜es, descompacte-a em algum diret´rio vazio e execute
o programa Setup.exe.
           ca                     e
Por defini¸˜o, o MySQL-Windows ´ configurado para ser instalado em ‘c:\mysql’. Se vocˆ      e
deseja instalar o MySQL em outro lugar, instale-o primeiramente em ‘c:\mysql’, ent˜o    a
                ca               e                  e
mova a instala¸˜o para onde vocˆ preferir. Se vocˆ mover o MySQL, deve indicar onde
   a                       ca
est´ localizado usando a op¸˜o --basedir quando iniciar o servidor. Por exemplo, se vocˆ  e
                  ca                                         e
mover a distribui¸˜o MySQL para ‘d:\programs\mysql’, vocˆ deve iniciar o mysqld assim:
       C:\> D:\programs\mysql\bin\mysqld --basedir D:\programs\mysql
                                             co
Use mysqld --help para mostrar todas as op¸˜es que o mysqld aceita!
                        o                 e             e
Em todas novas vers˜es do MySQL, vocˆ pode tamb´m criar um arquivo ‘c:\my.cnf’
                            co        o
que guarda todas as op¸˜es padr˜es para o servidor MySQL. Copie o arquivo
‘\mysql\my-xxxx.cnf’ para ‘c:\my.cnf’ e edite-o para atender suas necessidades. Perceba
                  ca
Chapter 2: Instala¸˜o do MySQL                                                           85



        e                                                                   e
que vocˆ deve especificar todos caminhos com ‘/’ em vez de ‘\’. Se vocˆ usar ‘\’, vocˆ      e
                a                          e
precisa especific´-lo dobrado, porque ‘\’ ´ o caractere escape no MySQL. See undefined
[Option files], page undefined .
                                             ca                            a
Iniciado com o MySQL 3.23.38, a distribui¸˜o Windows inclui ambos bin´rios, normal e o
MySQL-Max. O principal benef´ de usar o bin´rio normal mysqld.exe ´ que ele ´ um
                                   icio             a                        e          e
             a
pouco mais r´pido e usa menos menos recursos.
         a                                                    e
Aqui est´ uma lista dos diferentes servidores MySQL que vocˆ pode usar:
mysqld                                                                 e            a
                          Compilado com debugger integral e conferˆncia autom´tica de
                                ca          o              o
                          aloca¸˜o de mem´ria, links simb´licos, BDB e tabelas InnoDB.
mysqld-opt                    a
                          Bin´rio otimizado sem suporte para tabelas transacionais.
mysqld-nt                     a
                          Bin´rio otimizado para Nt com suporte para named pipes. vocˆ     e
                                                  a                               a a
                          pode executar esta vers˜o no Win98, mas neste caso n˜o s˜o cri-
                                                  e
                          ados named pipes e vocˆ deve ter TCP/IP instalado.
mysqld-max                    a                                          o
                          Bin´rio otimizado com suporte para links simb´licos, tabelas BDB
                          e InnoDB.
mysqld-max-nt                                       e
                          Como o mysqld-max, por´m compilado com suporte para named
                          pipes.
                          a                             a
Incluido a partir da vers˜o 3.23.50, named pipes estar´ habilitado somente se o mysqld ´   e
                  ca
iniciado com a op¸˜o --enable-named-pipe
            a             a
Todos os bin´rios acima s˜o otimizados para o processador Pentium Pro mas deve funcionar
em qualquer processador Intel >=i386.
             e                                                      co               ca
Nota: Se vocˆ deseja utilizar as tabelas InnoDB, existem algumas op¸˜es de inicializa¸˜o que
devem ser especificadas no seu arquivo ‘my.ini’ See undefined [InnoDB start], page un-
defined

                              ca
2.2 Detalhes Gerais de Instala¸˜o

2.2.1 Como obter o MySQL
                                              co              a                   co
Confira a home page do MySQL para informa¸˜es sobre a vers˜o atual e para instru¸˜es de
download.
                                       a
Nosso principal espelho de download est´ localizado em: http://download.sourceforge.net/mirrors/mys
       e    a                                                          e
Se vocˆ est´ interessado em se tornar um site espelho do MySQL, vocˆ deve fazer sin-
             o
cronismo anˆnimo com: rsync://download.sourceforge.net/mysql/. Envie e-mail para
webmaster@mysql.com nos notificando sobre seu espelho para ser adicionado na lista abaixo.
       e
Se vocˆ tiver problemas com o download de nosso site principal, tente usar algum dos
espelhos listados abaixo.
Por favor relate espelhos ruins ou desatualizados ao webmaster@mysql.com.
Europa:
  • Austria [Univ. of Technology/Vienna] WWW FTP
  • Bulgaria [online.bg/Sofia] WWW FTP
  • Republica Tcheca [Masaryk University in Brno] WWW FTP
  • Republica Tcheca [www.sopik.cz] WWW
  • Republica Tcheca [www.gin.cz] WWW FTP
86                                        e      e                       a
                                     Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 •   Dinarca [Borsen] WWW
 •   Dinamarca [SunSITE] WWW FTP
 •   Estonia [OKinteractive] WWW
 •         c
     Fran¸a [mtesa.net] WWW
 •         c
     Fran¸a [fastorama.com, Chatenois] WWW FTP
 •   Finlandia [tonnikala.net] WWW
 •   Alemanha [Kernelnotes.de, Bonn] WWW FTP
 •   Alemanha [Wolfenbuettel] WWW FTP
 •   Grecia [NTUA, Athens] WWW FTP
 •   Hungria [Xenia] WWW FTP
 •   Hungria [TiszaneT] WWW FTP
 •   Hungria [stop.hu] WWW
 •   Islandia [GM] WWW FTP
 •   Italia [feelinglinux.com] WWW
 •   Italia [Teta Srl] WWW
 •   Italia [tzone.it] WWW
 •   Irlanda [Esat Net] WWW FTP
 •   Latvia [linux.lv] FTP
 •   Holanda [Silverpoint] WWW
 •   Holanda [Widexs BV] WWW FTP
 •   Holanda [ProServe] WWW
 •   Polonia [Sunsite] WWW FTP
 •   Polonia [ncservice.com/Gdansk] WWW
 •   Portugal [Netc] WWW FTP
 •   Romenia [roedu.net/Bucharest] FTP
 •   Russia [DirectNet] WWW FTP
 •   Russia [Scientific Center/Chernogolovka] FTP
 •   Suecia [Sunet] WWW FTP
 •       c
     Sui¸a [Sunsite] WWW FTP
 •   Reino Unido [PLiG/UK] WWW FTP
 •   Ucrania [PACO] WWW FTP
 •   Ucrania [ISP Alkar Teleport/Dnepropetrovsk] WWW
 •   Yugoslavia [bolex.co.yu] WWW FTP
America do Norte:
 •   Canada [Tryc] WWW
 •   USA [Hurricane Electric/San Jose] WWW
 •   USA [ValueClick, Los Angeles CA] WWW FTP
 •   EUA [Wisconsin University/Wisconsin] WWW FTP
                  ca
Chapter 2: Instala¸˜o do MySQL                                                        87



 • EUA [LinuxWired/Scottsdale, AZ] WWW FTP
 • EUA [adgrafix.com/Boston, MA] WWW
 • EUA [netNumina/Cambridge, MA] WWW
 • EUA [Ahaza Systems/Seattle, WA] WWW FTP
  e
Am´rica do Sul:
 • Argentina [bannerlandia.com] WWW FTP
 • Chile [Vision] WWW
 • Chile [PSINet] WWW FTP
 • Chile [Tecnoera] WWW
Asia:
 • China [linuxforum.net] WWW
 • China [HKLPG/Hong Kong] WWW
 • China [Gremlins/Hong Kong] WWW FTP
 • China [shellhung.org/Hong Kong] WWW FTP
 • Indonesia [incaf.net] WWW
 • Indonesia [web.id] WWW FTP
 • Jap˜o [Soft Agency] WWW
      a
 • Jap˜o [u-aizu.ac.jp/Aizu] FTP
      a
 • Coreia do Sul [Webiiz] WWW
 • Coreia do Sul [PanworldNet] WWW
 • Singapura [HJC] WWW FTP
 • Taiwan [TTN] WWW
 • Taiwan [nctu.edu/HsinChu] WWW
Africa:
 • Africa do Sul[Mweb] WWW
 • Africa do Sul [The Internet Solution/Johannesburg] FTP

2.2.2 Sistemas Operacionais suportados pelo MySQL
N´s ulitizamos o GNU Autoconf, para que seja poss´
  o                                                ivel portar o MySQL para todos sis-
temas operacionais modernos com threads Posix funcionando e um compilador C++. (Para
                    o                                e       a                 a     o
compilar somente o c´digo cliente, um compilador C++ ´ necess´rio mas threads n˜o.) N´s
                                                                               o
mesmos usamos e desenvolvemos o software primariamente em Sun Solaris (Vers˜es 2.5 -
                      a
2.7) e SuSE Linux Vers˜o 7.x.
Perceba que para alguns sistemas operacionais, o suporte nativo a thread funciona somente
    ´           o                                                          co
nas ultimas vers˜es. O MySQL compila com sucesso nas seguintes combina¸˜es de sistema
operacional/pacote de thread:
 • AIX 4.x com threads nativas. See undefined [IBM-AIX], page undefined .
 • Amiga.
88                                               e      e                       a
                                            Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • BSDI 2.x com o pacote inclu´ MIT-pthreads. See undefined [BSDI], page unde-
                                ido
   fined .
 • BSDI 3.0, 3.1 e 4.x com threads nativas. See undefined [BSDI], page undefined .
 • DEC Unix 4.x com threads nativas. See undefined [Alpha-DEC-UNIX], page unde-
   fined .
 • FreeBSD 2.x com o pacote inclu´      ido MIT-pthreads. See undefined [FreeBSD],
   page undefined .
 • FreeBSD 3.x e 4.x com threads nativas. See undefined [FreeBSD], page undefined .
 • HP-UX 10.20 com o pacote inclu´ MIT-pthreads. See undefined [HP-UX 10.20],
                                      ido
   page undefined .
 • HP-UX 11.x com as threads nativas. See undefined [HP-UX 11.x], page undefined .
 • Linux 2.0+ com LinuxThreads 0.7.1+ ou glibc 2.0.7+. See undefined [Linux],
   page undefined .
 • Mac OS X Server. See undefined [Mac OS X], page undefined .
 • NetBSD 1.3/1.4 Intel e NetBSD 1.3 Alpha (Necessita GNU make). See undefined
   [NetBSD], page undefined .
 • OpenBSD > 2.5 com threads nativas. OpenBSD < 2.5 com o pacote inclu´ MIT-ido
   pthreads . See undefined [OpenBSD], page undefined .
 • OS/2 Warp 3, FixPack 29 e OS/2 Warp 4, FixPack 4. See undefined [OS/2], page un-
   defined .
 • SGI Irix 6.x com threads nativas. See undefined [SGI-Irix], page undefined .
 • Solaris 2.5 e superior com threads nativas nas plataformas SPARC e x86. See unde-
   fined [Solaris], page undefined .
 • SunOS 4.x com o pacote inclu´ MIT-pthreads. See undefined [Solaris], page un-
                                  ido
   defined .
 • SCO OpenServer com o port recente do pacote FSU Pthreads. See undefined [SCO],
   page undefined .
 • SCO UnixWare 7.0.1. See undefined [SCO Unixware], page undefined .
 • Tru64 Unix
 • Win95, Win98, NT e Win2000. See undefined [Windows], page undefined .
                                         a
Perceba que nem todas as plataformas s˜o apropriadas para executar o MySQL. Os seguintes
fatores determinam se uma certa plataforma ´ apropriada para uma miss˜o cr´
                                                 e                           a    itica pesada:
  • Estabilidade geral da biblioteca thread. Uma plataforma pode ter excelente reputa¸˜o,  ca
                                        e     a        o         e
     entretanto, se a biblioteca thread ´ inst´vel no c´digo que ´ usado pelo MySQL, mesmo
                                                a     a     a
     se todo o resto for perfeito, o MySQL ir´ ser t˜o est´vel quanto a biblioteca thread.
  • A habilidade do kernel e/ou a biblioteca thread tirar vantagem do SMP em sistemas
     multi-processados. Em outras palavras, quando um proceesso cria uma thread, deve
     ser poss´ para aquela thread executar em uma CPU diferente que o processo original.
             ivel
  • A habilidade do kernel e/ou a biblioteca thread executar v´rias threads que
                                                                           a
     adiquire/libera um bloqueio mutex sobre uma pequena regi˜o cr´ a    itica frequentemente
     sem trocas de contexto excessivos. Em outras palavras, se a implementa¸˜o de       ca
                                                                            a
     pthread_mutex_lock() requisitar a CPU muito rapidamente, isto ir´ afetar o MySQL
                  ca
Chapter 2: Instala¸˜o do MySQL                                                           89



                                        a
     tremendamente. Se esse detalhe n˜o estiver sendo cuidado, adicionar CPUs extras
     podem deixar o MySQL mais lento.
 •   Estabilidade e performance geral do sistema de arquivos.
 •   Habilidade do sistema de arquivos em lidar com arquivos grandes de forma eficiente,
     se suas tabelas forem grandes.
 •   Nosso n´ de experiˆncia aqui na MySQL AB com a plataforma. Se n´s conhecemos
             ivel         e                                                  o
     bem uma plataforma, introduzimos otimiza¸˜es/corre¸oes espec´
                                                co          c        ificas para ela habili-
                                ca    o       e
     tadas na hora da compila¸˜o. N´s tamb´m podemos fornecer conselhos sobre como
     configurar seu sistema otimizadamente para o MySQL.
 •                                                       co
     O volume de testes feitos internamente de configura¸˜es similares.
 •       u            a
     O n´mero de usu´rios que tem executado o MySQL com sucesso naquela plataforma em
               co                     u
     configura¸˜es similares. Se esse n´mero for alto, as chances de se ter alguma surpresa
           ´
     especifica da plataforma fica muito menor.
                  e                                                 ca
Baseado nos crit´rios acima, as melhores plataformas para a execu¸˜o do MySQL at´ estee
        a                                                                         ca
ponto s˜o o x86 com SuSe Linux 7.1, kernel 2.4 e ReiserFS (ou qualquer distribui¸˜o Linux
similar) e Sparc com Solaris 2.7 ou 2.8. FreeBSD vem em terceiro, mas realmente temos
        c              a
esperan¸as que ele ir´ se unir ao clube dos tops uma vez que a biblioteca thread est´      a
                o        e
melhorando. N´s tamb´m acreditamos que em certo ponto iremos estar aptos para incluir
                                                                          a a
todas as outras plataformas em que o MySQL compila e executa, mas n˜o t˜o bem e com
o mesmo n´                                                                              a
            ivel de estabilidade e performance, na categoria superior. Isto necessitar´ de
             c                             ca
algum esfor¸o da nossa parte em coopera¸˜o com os desenvolvedores dos componentes do
                                                               e
Sistema Operacional/Biblioteca que o MySQL depende. Se vocˆ tiver interesse em melhorar
                                    a             ca
algum de nossos componentes, est´ em uma posi¸˜o para influenciar seu desenvolvimento,
                    co
e precisa de instru¸˜es mais detalhadas sobre o que o MySQL necessita para uma melhor
      ca
execu¸˜o, envie um e-mail para internals@lists.mysql.com.
                                   ca          a e                         e
Por favor, perceba que a compara¸˜o acima n˜o ´ para dizer que um SO ´ melhor ou pior
                           o
que o outro em geral. N´s estamos falando sobre a escolha de um SO para um prop´sito   o
dedicado: executar o MySQL, e comparamos as plataformas levando isto em considera¸˜o.   ca
Desta forma, o resultado desta compara¸˜o seria diferente se n´s inclu´
                                        ca                    o       issemos mais detalhes.
                             a
E em alguns casos, a raz˜o de um SO ser melhor que o outro pode ser simplesmente
                               c                  ca
porque colocamos mais esfor¸o nos testes e otimiza¸˜o para aquela plataforma em particular.
                                           co            a            a
Estamos apenas colocando nossas observa¸˜es para ajud´-lo na decis˜o de qual plataforma
usar o MySQL na sua configura¸˜o. ca

               a
2.2.3 Qual vers˜o do MySQL deve ser usada
                 a             e       e             ´          a
A primeira decis˜o a ser feita ´ se vocˆ deve usar a ultima vers˜o de desenvolvimento ou a
´           a     a
ultima vers˜o est´vel:
  • Normalmente, se vocˆ estiver usando o MySQL pela primeira vez ou tentando port´-
                           e                                                             a
                                       a                  ca     a
     lo para algum sistema em que n˜o exista distribui¸˜o bin´ria, recomendamos o uso
             a     a                      a                                     c
     da vers˜o est´vel (atualmente Vers˜o 3.23.52). Repare que todos os lan¸amentos do
               a
     MySQL s˜o conferidos com os testes comparativos de performance e um conjunto ex-
                                      c
     tenso de testes antes de cada lan¸amento.
  • Sen˜o, caso vocˆ esteja trabalhando com um antigo sistema e quiser atualiz´-lo, mas n˜o
         a           e                                                         a         a
                                         ca           co      e
     que correr o risco com uma atualiza¸˜o sem corre¸˜es, vocˆ deve faze-lo do mesmo ramo
90                                            e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



             e   a                       ´      u              a e
     que vocˆ est´ usando (onde aenas o ultimo n´mero da vers˜o ´ mais novo que o seu).
       o                                                   a                        co
     N´s temos tentado corrigir somente erros fatais e torn´-los menores, com altera¸˜es
                                           a
     relativamente seguras para aquela vers˜o.
                a             e        e                         ca              a
A segunda decis˜o a ser feita ´ se vocˆ deseja usar uma distribui¸˜o fonte ou bin´ria. Na
                                     e      a               ca      a
maioria dos casos provavelmente vocˆ dever´ usar a distribui¸˜o bin´ria, se alguma existir
                        a                           a                                  ca
para sua plataforma, ser´ normalmente muito mais f´cil para instalar do que a distribui¸˜o
    o
em c´digo fonte.
                      e                  a                                 ca
Nos seguites casos vocˆ provavelmente ser´ mais bem servido com uma instala¸˜o baseada
    o
em c´digo fonte:
 • Se vocˆ desejar instalar o MySQL em algum lugar expec´
           e                                                                a
                                                              ifico. (O padr˜o das dis-
          co      a     e
    tribui¸˜es bin´rias ´ estar“pronto para rodar” em qualquer lugar, mas talvez vocˆe
    deseje ainda mais flexibilidade).
 • Para estar apto e satisfazer diferentes requisi¸˜es dos usu´rios, estaremos fornecendo
                                                  co          a
             o      a
   duas vers˜es bin´rias diferentes; Uma compilada com os manipuladores de tabelas n˜o a
                         a     a
   transacionais (um bin´rio r´pido e pequeno) e um configurado com as mais importantes
      co                                                     o a
   op¸˜es extendidas como tabelas transacionais. Ambas vers˜es s˜o compiladas da mesma
            ca                                                                     o
   distribui¸˜o fonte. Todos clientes MySQL nativos pode conectar com ambas vers˜es do
   MySQL.
                ca     a              e                            e
     A distribui¸˜o bin´ria extendida ´ marcada com o sufixo -max e ´ configurada com as
     mesmas op¸˜es de mysqld-max. mysqld-max. See undefined [mysqld-max], page un-
                co
     defined .
          e                                                   e
   Se vocˆ deseja usar o RPM MySQL-Max, primeiramente vocˆ deve instalar o RPM MySQL
        a
   padr˜o.
                                                                       ˜
 • Se vocˆ deseja configurar mysqld com alguns recursos extras que NAO est˜o nas dis-
          e                                                                   a
         co      a                                 co                             e
   tribui¸˜es bin´rias. Segue abaixo a lista das op¸˜es extras mais comuns que vocˆ pode
   querer usar:
      • --with-berkeley-db
      • --with-innodb
      • --with-raid
      • --with-libwrap
      • --with-named-z-lib (Isto ´ feito para alguns dos bin´rios)
                                 e                          a
      • --with-debug[=full]
 • A distribui¸˜o bin´ria padr˜o ´ normalmente compilada com suporte para todos con-
              ca      a         a e
   juntos de caracteres e deve funcionar em uma variedade de processadores para a mesma
   fam´ do processador.
       ilia
           e                                     a        e                     a
     Se vocˆ precisar de um servidor MySQL mais r´pido vocˆ pode querer recompil´-lo com
                                                          e
     suporte para somente o conjunto de caracteres que vocˆ precisa, usar um compilador
                                     co                                    co
     melhor (como pgcc) ou usar op¸˜es de compiladores para usar otimiza¸˜es para seu
     processador.
 • Se vocˆ encontrar um erro e relat´-lo para o time de desenvolvimento do MySQL vocˆ
         e                          a                                                    e
                         a                  a      a        a                    ca
   provavelmente receber´ um patch que ser´ necess´rio aplic´-lo para a distribui¸˜o fonte
   para ter o bug corrigido.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                         91



 • Se vocˆ deseja ler (e/ou modificar) o c´digo C e C++ que ´ o MySQL, vocˆ pode obter
          e                              o                 e             e
                ca             o           e                               co
   uma distribui¸˜o fonte. O c´digo fonte ´ sempre o manual final. Distribui¸˜es fontes
        e                                                co     a
   tamb´m contem mais testes e exemplos que as distribui¸˜es bin´rias.

                                 u             o                          u
O esquema de nomes do MySQL usa n´meros de vers˜es que consistem de tres n´meros e um
                                  c                                     e
sufixo. Por exemplo, um nome de lan¸amento como mysql-3.21.17-beta ´ interpretado
da seguinte maneira:
 • O primeiro n´mero (3) descreve o formato dos arquivos. Todas releases da Vers˜o 3
                 u                                                                    a
   tem o mesmo formato de arquivo.
 • O segundo n´mero (21) ´ o n´ da distribui¸˜o. Normalmente existem dois para serem
               u          e    ivel            ca
                   e          a                              e
   escolhidos. Um ´ o ramo est´vel (atualmente 23) e o outro ´ o ramo de desenvolvimento
                                            a     a                a
   (atualmente 4.0). Normalmente ambos s˜o est´veis, mas a vers˜o de desenvolvimento
                                                      ca
   pode acontecer coisas estranhas, faltar documenta¸˜o em novos recursos, ou mesmo
    a
   n˜o compilar em alguns sistemas.
 • O terceiro n´mero (17 ´ o n´mero da vers˜o do n´ de distribui¸˜o. Este ´ incremen-
               u         e     u             a      ivel            ca         e
                                 ca                      e       a ´             a
   tado para cada nova distribui¸˜o. Normalmente vocˆ desejar´ a ultima vers˜o para o
   n´ de publica¸˜o que tiver escolhido.
    ivel           ca
 • O sufixo (beta) indica o n´ de estabilidade da vers˜o. Os poss´
                             ivel                         a                       a
                                                                     iveis sufixo s˜o:
     − alpha indica que a vers˜o cont´m grandes se¸˜es de novos c´digos que n˜o foram
                               a      e            co              o           a
                                                         a
       100% testados. Bugs conhecidos (normalmente n˜o tem nenhum) devem estar
                            ca
       documentados na se¸˜o News. See undefined [News], page undefined . Existem
             e                            o                          co
       tamb´m novos comandos e extens˜es na maioria das publica¸˜es alpha. Desen-
                                                           co        o
       volvimento ativo que podem envolver maiores altera¸˜es no c´digo pode ocorrer
                  a                     a                               ca    a
       numa vers˜o alpha, mas tudo ser´ testado antes de fazer a publica¸˜o. N˜o podem
                                                  ca
       existir erros conhecidos em nenhuma publica¸˜o do MySQL.
     − beta significa que todo o novo c´digo foi testado. N˜o ser˜o adicionados novos
                                       o                    a     a
                                                                    a
       recursos que podem causar algum tipo de corrompimento. N˜o deve existir bugs
                              ca        a                                    a
       conhecidos. Uma altera¸˜o de vers˜o de alpha para beta ocorre quando n˜o existir
                                                a                             e
       nenhum relato de erro fatal com uma vers˜o alpha por pelo menos um mˆs e n˜o a
       planejarmos adicionar nenhum recurso que pode deixar algum antigo comando
                  a
       menos confi´vel.
     − gamma ´ o beta que j´ tem sido usado a algum tempo e parece funcionar bem.
              e            a
                            co a                       e
       Apenas pequenas corre¸˜es s˜o adicionadas. Isto ´ o que muitas empresas chamam
       de release.
     − Se n˜o existir um sufixo, significa que esta vers˜o j´ est´ sendo executada h´
            a                                            a a       a                    a
                                                                   e            ´
       algum tempo em diferentes locais sem relatos de erros al´m dos especificos de
       certas plataformas. Somente corre¸˜es de erros cr´
                                        co                      a
                                                        iticos s˜o adicionados ao release.
            e                                 ca      a
       Isto ´ o que chamamos de uma distribui¸˜o est´vel.

              o                                                 o
Todas as vers˜es do MySQL funcionam sobre nossos testes padr˜es e comparativos para
                   a                                                       o    a
garantir que eles s˜o relativamente seguros para o uso. Como os testes padr˜es s˜o exten-
didos ao longo do tempo para conferir por todos os bugs antigos encontrados, o pacote de
testes continua melhorando.
                         co          o
Perceba que todas publica¸˜es de vers˜es foram testadas pelo menos com:
92                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



Um pacote de testes interna
                                          ca
          Faz parte de um sistema de produ¸˜o para um cliente. Ela tem diversas tabelas
          com centenas de megabytes de dados.
O pacote de comparativos da MySQL
                             e                         ´      e
           Este executa uma s´rie de consultas comuns. E tamb´m um teste para ver se
             ´                          co         o           a
           o ultimo conjunto de otimiza¸˜es fez o c´digo mais r´pido. See undefined
           [MySQL Benchmarks], page undefined .
O teste crash-me
                                                                                  a
           Este tenta determinar quais recursos o banco de dados suporta e quais s˜o suas
                               co
           capacidades e limita¸˜es. See undefined [MySQL Benchmarks], page unde-
           fined .
            e      o               a                                               ca
Outro teste ´ que n´s usamos a vers˜o do MySQL mais nova em nosso ambiente de produ¸˜o
                               a         o
interna, em pelo menos uma m´quina. N´s temos mais de 100 gigabytes de dados com que
trabalhar.

                        ca
2.2.4 Layouts de Instala¸˜o
       ca                        a           o                        ca               co
Esta se¸˜o descreve o layout padr˜o dos diret´rios criados pela instal¸˜o das distribui¸˜es
   a
bin´ria e fonte.
              ca    a e                                                  ca
Uma distribui¸˜o bin´ria ´ instalada descompactando-a no local de instala¸˜o de sua escolha
                                                          o
(tipicamente ‘/usr/local/mysql’) e cria os seguintes diret´rios nesses locais:
      o
Diret´rio                           u           o
                              Conte´do do diret´rio
‘bin’                         Programas clientes e o servidor mysqld
‘data’                        Arquivos Log, bancos de dados
‘include’                                     c
                              Arquivos de cabe¸alho (headers)
‘lib’                         Bibliotecas
‘scripts’                     mysql_install_db
‘share/mysql’                 Arquivos de mensagem de erro
‘sql-bench’                   Benchmarks - testes comparativos
              ca               o            e                      e         a
Uma distribui¸˜o baseada em c´digo fonte ´ instalada depois de vocˆ configur´-la e compil´-a
            a            ca                                                           o
la. Por padr˜o, a instala¸˜o copia os arquivos em ‘/usr/local’, nos seguintes subdiret´rios:
      o
Diret´rio                           u           o
                              Conte´do do diret´rio
‘bin’                         Programas clientes e scripts
‘include/mysql’                               c
                              Arquivos de cabe¸alho (headers)
‘info’                                    ca
                              Documenta¸˜o no formato Info
‘lib/mysql’                   Bibliotecas
‘libexec’                     O servidor mysqld
‘share/mysql’                 Arquivos com mensagens de erros
‘sql-bench’                   Benchmarks e o teste crash-me
‘var’                         Bancos de dados e arquivos log
                   o             ca                          ca
Dentro de um diret´rio de instala¸˜o, o layout de uma instala¸˜o baseada em fontes difer-
                     ca    a
encia de uma instala¸˜o bin´ria nas seguintes formas:
 • O servidor mysqld ´ instalado no diret´rio ‘libexec’ no lugar de ‘bin’.
                      e                   o
 • O diret´rio de dados ´ ‘var’ ao inv´s de ‘data’.
          o             e             e
                  ca
Chapter 2: Instala¸˜o do MySQL                                                          93



 • mysql_install_db ´ instalado no diret´rio ‘/usr/local/bin’ ao inv´s de
                     e                  o                           e
   ‘/usr/local/mysql/scripts’.
 • Os arquivos headers e diret´rios de bibliotecas est˜o em ‘include/mysql’ e ‘lib/mysql’
                              o                       a
   em vez de ‘include’ e ‘lib’.

    e                 o            ca     a              ca
Vocˆ pode criar sua pr´pria instala¸˜o bin´ria da compila¸˜o dos fontes executando o script
‘scripts/make_binary_distribution’.


                               co    a     c
2.2.5 Como e quando as atualiza¸˜es s˜o lan¸adas ?

              a                                               o
O MySQL est´ evoluindo muito rapidamente na MySQL AB e n´s queremos compartilhar
                   a                                             ´
isto com outros usu´rios MySQL. Sempre que temos alguns recursos uteis que outros acham
       a
necess´io, tentamos fazer um release.
     e                        a                              a      a             ca
Tamb´m tentamos ajudar usu´rios que solicitam recursos que s˜o de f´cil implementa¸˜o.
                                  a
Tomamos notas do que nossos usu´rios licenciados gostariam de ter,especialmente do que
                                                             a
nossos clientes com suporte extendido desejam e tentamos ajud´-los.
 a                                                                ca         a
N˜o existe uma real necessidade para baixar uma nova release. A se¸˜o News ir´ dizer se a
nova vers˜o tem alguma coisa que vocˆ precisa. See undefined [News], page undefined .
         a                           e
Usamos a seguinte pol´
                     itica quando estamos atualizando o MySQL:
 • Para cada pequena atualiza¸˜o, o ultimo n´mero na vers˜o ´ incrementado. Quando
                               ca   ´       u            a e
                      u                                                        o
   tiver um maior n´mero de novos recursos ou menor incompatibilidade com vers˜es
                          u          a e
   antigas, o segundo n´mero na vers˜o ´ incrementado. Quando o formato de arquivo
                        u    e
   altera, o primeiro n´mero ´ aumentado.
 • Vers˜es est´veis testadas aparecem na m´dia de uma a duas vezes por ano, mas se
       o      a                           e
                   a                      a     a    c                       co
   pequenos bugs s˜o encontrados, uma vers˜o ser´ lan¸ada apenas com as corre¸˜es dos
   erros.
 • Releases funcionais aparecem na m´dia a cada 1-8 semanas.
                                    e
 • Distribui¸˜es bin´rias para algumas plataformas ser´ feita por n´s somente para re-
            co      a                                  a            o
                                                                co      a
   leases mais importantes. Outras pessoas podem fazer distribui¸˜es bin´rias para outros
   sistemas mas provavelmente com menos frequencia.
 • N´s normalmente disponibilizamos os patches logo que localizamos e corrigimos pe-
    o
   quenos bugs.
 • Para bugs n˜o cr´
               a                                                             a
                   iticos, mas irritantes, disponibilizamos patches se eles s˜o enviados
         o                                         a
   para n´s. De qualquer forma, iremos combinar v´rios deles em um patch maior.
 • Se existitr, por algum motivo, um bug fatal numa vers˜o criaremos uma nova release
                                                          a
   o mais cedo poss´ ivel. Gostar´                                          e
                                 iamos que outras empresas fizessem isto tamb´m.

        a    a         e          o a
A vers˜o est´vel atual ´ a 3.23; n´s j´ mudamos o desenvolvimento em atividade para a
     a                    a                          a    a      a
vers˜o 4.0. Bugs contiuar˜o a ser corrigidos na vers˜o est´vel. N˜o acreditamos em um
                                                   co
congelamento completo, pois isto abandona a corre¸˜es de bugs e coisas que “devem ser
feitas.” “Alguma coisa congelada” significa que talvez possamos adicionar pequenas coisas
                   a        a           a
que “com certeza n˜o afetar´ nada que j´ esteja funcionando.”
94                                           e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



         a
2.2.6 Bin´rios MySQL compilados pela MySQL AB
                c   o                                                    co      a
Como um servi¸o, n´s na MySQL AB fornecemos um conjunto de distribui¸˜es bin´rias do
              a                                                                       a
MySQL que s˜o compiladas no nosso site ou em sites onde os clientes cordialmente nos d˜o
                  a
acesso as suas m´quinas.
                co   a                                                       a
Estas distribui¸˜es s˜o geradas com scripts/make_binary_distribution e s˜o configu-
                                        co
radas com os seguintes compiladores e op¸˜es:
SunOS 4.1.4 2 sun4c com gcc 2.7.2.1
           CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" ./configure
           --prefix=/usr/local/mysql --disable-shared --with-extra-
           charsets=complex --enable-assembler
SunOS 5.5.1 (e superior) sun4u com egcs 1.0.3a or 2.90.27 or gcc 2.95.2 and newer
           CC=gcc CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors
           -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql
           --with-low-memory --with-extra-charsets=complex --enable-assembler
SunOS 5.6 i86pc com gcc 2.8.1
           CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
           --with-low-memory --with-extra-charsets=complex
Linux 2.0.33 i386 com pgcc 2.90.29 (egcs 1.0.3a)
            CFLAGS="-O3 -mpentium -mstack-align-double" CXX=gcc CXXFLAGS="-O3
            -mpentium -mstack-align-double -felide-constructors -fno-
            exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql
            --enable-assembler --with-mysqld-ldflags=-all-static --with-extra-
            charsets=complex
Linux 2.2.x com x686 com gcc 2.95.2
            CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro
            -felide-constructors -fno-exceptions -fno-rtti" ./configure
            --prefix=/usr/local/mysql --enable-assembler --with-mysqld-
            ldflags=-all-static --disable-shared --with-extra-charset=complex
SCO 3.2v5.0.4 i386 com gcc 2.7-95q4
           CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
           --with-extra-charsets=complex
AIX 2 4 com gcc 2.7.2.2
           CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
           --with-extra-charsets=complex
OSF1 V4.0 564 alpha com gcc 2.8.1
          CC=gcc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
          --with-low-memory --with-extra-charsets=complex
Irix 6.3 IP32 com gcc 2.8.0
            CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
            --with-extra-charsets=complex
BSDI BSD/OS 3.1 i386 com gcc 2.7.2.1
         CC=gcc CXX=gcc CXXFLAGS=-O ./configure --prefix=/usr/local/mysql
         --with-extra-charsets=complex
                  ca
Chapter 2: Instala¸˜o do MySQL                                                          95



BSDI BSD/OS 2.1 i386 com gcc 2.7.2
         CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
         --with-extra-charsets=complex
                              co                                           co
Qualquer que tenha mais op¸˜es otimizadas para qualquer das configura¸˜es listadas
                          a
acima pode sempre envi´-los para a lista de mensagens dos desenvolvedores em
internals@lists.mysql.com.
         co                                    a       a          co           a
Distribui¸˜es RPM que anteceda o MySQL vers˜o 3.22 s˜o contribui¸˜es dos usu´rios. Os
                     o                   o      c
RPMs gerados por n´s da MySQL AB s´ come¸aram a ser fornecidos a partir da vers˜o    a
3.22 do MySQL.
      e                         a             ca               e
Se vocˆ deseja compilar uma vers˜o para depura¸˜o do MySQL, vocˆ deve adicionar --with-
                                                         ca
debug ou --with-debug=full para as linhas de configura¸˜o acima e remover qualquer
   ca
op¸˜o -fomit-frame-pointer.

                            ca
2.3 Instalando uma distribui¸˜o com fontes do MySQL
              e                         co                                        a
Antes de vocˆ continuar com as instala¸˜es dos fontes, confira antes se nosso bin´rio est´ a
dispon´ para sua plataforma e se ela funcionar´ para vocˆ. N´s colocamos muito esfor¸o
       ivel                                      a          e o                         c
                                               idos com as melhores op¸˜es poss´
para ter certeza que nossos bin´rios s˜o contru´
                                a     a                                co       iveis.
    e                                                                                 o
Vocˆ precisa das seguintes ferramentas para contruir e instalar o MySQL a partir do c´digo
fonte:
  • GNU gunzip para descompactar a distribui¸˜o. ca
  • Algum tar razo´vel que desempacote a distribui¸˜o. Sabe-se que o GNU tar funciona.
                      a                              ca
         e
     Vocˆ pode ter alguns problemas com o tar da Sun.
  • Um compilador ANSI C++ funcional. gcc >= 2.95.2, egcs >= 1.0.2 ou egcs 2.91.66,
                                 a
     SGI C++, e SunPro C++ s˜o alguns dos compiladores que sabemos que funcionam.
                  a e         a
     A libg++ n˜o ´ necess´ria quando o gcc for usado. gcc 2.7.x tem um bug que
     torna imposs´ ivel compilar alguns arquivos C++ perfeitamente corretos, como o
                                  e                                 e
     ‘sql/sql_base.cc’. Se vocˆ possui somente o gcc 2.7.x vocˆ deve atualiza-lo para
                                               e      e
     conseguir compilar o MySQL. gcc 2.8.1 ´ tamb´m conhecido por ter problemas em
     algumas plataformas portanto ele deve ser evitado se existir um novo compilador para
     a plataforma.
                    e                                              a
     gcc >= 2.95.2 ´ recomendado quando compilar o MySQL Vers˜o 3.23.x.
  • Um bom programa make. GNU make ´ sempre recomendado e ´ algumas vezes
                                               e                          e
            a           e
     necess´rio. Se vocˆ tiver problemas, recomendamos tentar o GNU make 3.75 ou mais
     novo.
       e                       a                                                        ca
Se vocˆ estiver usando uma vers˜o recente de gcc, recente o bastante para entender a op¸˜o
                    e                                  e
-fno-exceptions, ´ MUITO IMPORTANTE que vocˆ a use. De outra forma, vocˆ pode       e
                 a                                  o       e
compilar um bin´rio que quebra randomicamente. N´s tamb´m recomendamos que vocˆ use   e
-felide-constructors e -fno-rtti juntas com -fno-exception. Se estiver com d´vidas,u
  c
fa¸a o seguinte:

      CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" .

                           e a               a     a          a                co
Na maioria dos sistemas vocˆ ir´ obter um bin´rio r´pido e est´vel com essas op¸˜es.
96                                             e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



       e
Se vocˆ tiver problemas, SEMPRE USE mysqlbug quando postar quest˜es para     o
                                                      a
mysql@lists.mysql.com. Mesmo se o problema n˜o for um bug, mysqlbug recolhe
       co                           a                                          a
informa¸˜es do sistema que facilitar´ aos outros resolverem seu problema. Por n˜o suar
               e                                                        e a
mysqlbug, vocˆ perde a vantagem de ter seu problema resolvido! Vocˆ ir´ encontrar
                  o                                                ca
mysqlbug no diret´rio ‘scripts’ depois de desempacotar a distribui¸˜o. See undefined
[Bug reports], page undefined .

         a                  ca a
2.3.1 Vis˜o geral da instala¸˜o r´pida
             a             e                                                          ca
Os comandos b´sicos que vocˆ deve executar para instalar o MysQL a partir da distribui¸˜o
       a
fonte s˜o:
      shell>   groupadd mysql
      shell>   useradd -g mysql mysql
      shell>   gunzip < mysql-VERSION.tar.gz | tar -xvf -
      shell>   cd mysql-VERSION
      shell>   ./configure --prefix=/usr/local/mysql
      shell>   make
      shell>   make install
      shell>   scripts/mysql_install_db
      shell>   chown -R root /usr/local/mysql
      shell>   chown -R mysql /usr/local/mysql/var
      shell>   chgrp -R mysql /usr/local/mysql
      shell>   cp support-files/my-medium.cnf /etc/my.cnf
      shell>   /usr/local/mysql/bin/safe_mysqld --user=mysql &
      e                                            e
Se vocˆ deseja ter suporte para tabelas InnoDB, vocˆ deve editar o arquivo /etc/my.cnf e
                                    a
remover o caractere # antes dos parˆmetros que iniciam com innodb_.... See undefined
[Option files], page undefined . See undefined [InnoDB start], page undefined .
      e                             a    c
Se vocˆ iniciar de um RPM fonte, ent˜o fa¸a o seguinte:
      shell> rpm --rebuild MySQL-VERSION.src.rpm
       a                 a           e
Isto ir´ criar um RPM bin´rio que vocˆ pode instalar.
    e                         a                                                      e
Vocˆ pode adicionar novos usu´rios utilizando o script bin/mysql_setpermission se vocˆ
                  o
instalar o DBI e m´dulos Perl Msql-Mysql-modules.
                ca
Segue uma descri¸˜o mais detalhada.
                           ca                                     a
Para instalar uma distribui¸˜o fonte, siga os passos a seguir, ent˜o prossiga para undefined
                                                     ca        o        ca
[Post-installation], page undefined , para inicializa¸˜o do p´s-instala¸˜o e testes:
                   o                    e                                ca     a
 1. Escolha o diret´rio sobre o qual vocˆ deseja descompactar a distribui¸˜o e v´ para ele.
                                   ca
 2. Obtenha um arquivo de distribui¸˜o de algum dos sites listados em undefined [Getting
    MySQL], page undefined .
          e                                                              e         a
 3. Se vocˆ esta interessado em usar tabelas Berkeley DB com MySQL, vocˆ precisar´ obter
    uma vers˜o com o patch do c´digo fonte do Berkeley DB. Por favor leia o cap´
             a                   o                                             itulo sobre
    tabelas Berkeley DB antes de continuar. See undefined [BDB], page undefined .
              co                    a
     Distribui¸˜es fontes do MySQL s˜o fornecidas como arquivos tar compactados e tem
                                                        e      u
     nomes como ‘mysql-VERSION.tar.gz’, onde VERSION ´ um n´mero como 3.23.52.
                   a
 4. Adicione um usu´rio e grupo para o mysql executar assim:
                  ca
Chapter 2: Instala¸˜o do MySQL                                                         97



          shell> groupadd mysql
          shell> useradd -g mysql mysql
                                                  a
    Estes comandos adicionam o grupo mysql e o usu´rio mysql. A sintaxe para useradd e
                                                      o
    groupadd podem mudar um pouco em diferentes vers˜es de Unix. Elas podem tamb´m e
                                         e                                       a
    ser chamadas adduser e addgroup. Vocˆ pode escolher outros nomes para o usu´rio e
    grupo em vez de mysql.
                           ca              o
 5. Descompacte a distribui¸˜o para o diret´rio corrente:
         shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf -
                              o
    Este comando cria um diret´rio com o nome ‘mysql-VERSION’.
                     o                ca
 6. Mude para o diret´rio da distribui¸˜o descompactada:
         shell> cd mysql-VERSION
                       e                                                       o
    Note que agora vocˆ deve configurar e construir o MySQL a partir deste diret´rio raiz
    da distribui¸˜o. Vocˆ n˜o pode constru´ em um diret´rio diferente.
                ca      e a               i-lo          o
 7. Configure o release e compile tudo:
         shell> ./configure --prefix=/usr/local/mysql
         shell> make
               e                        e                                  co
    Quando vocˆ executar configure, vocˆ pode desejar especificar algumas op¸˜es. Exe-
    cute ./configure --help para uma lista das op¸˜es. undefined [configure options],
                                                 co
                                           co
    page undefined , discute algumas das op¸˜es mais usadas.
                                e
    Se o configure falhar, e vocˆ for enviar uma mensagem para mysql@lists.mysq.com
                                                                               e
    para pedir ajuda, por favor, inclua qualquer linhas de ‘config.log’ que vocˆ acha
    que pode ajudar a resolver o problema. Tamb´m inclua as ultimas linhas da sa´
                                                   e            ´                 ida
                                                          o
    de configure se o configure abortar. Envie o relat´rio de erros usando o script
    mysqlbug. See undefined [Bug reports], page undefined .
                ca
    Se a compila¸˜o falhar, veja undefined [Compilation problems], page undefined ,
    para uma ajuda com um varios problemas comuns.
 8. Instalar tudo:
          shell> make install
       e
    Vocˆ deve executar este comando como root.
                              o                   a      o       e a
 9. Crie as tabelas de permiss˜es do MySQL (necess´rias s´ se vocˆ n˜o tiver instalado o
    MySQL anteriormente):
          shell> scripts/mysql_install_db
                    o                       a     a
    Note que as vers˜es do MySQL anteriores ` vers˜o 3.22.10 iniciam o servidor MySQL
               e                                 a
    quando vocˆ executa mysql_install_db. Isto n˜o acontece mais!
                         a                         o                    a          a
10. Altere o dono dos bin´rios para root e do diret´rio dados para o usu´rio que ir´
    executar o mysqld:
          shell> chown -R root /usr/local/mysql
          shell> chown -R mysql /usr/local/mysql/var
          shell> chgrp -R mysql /usr/local/mysql
                                                                                 a
    O primeiro comando altera o atributo de proriedade dos arquivos para o usu´rio root,
                                                       o                       a
    o segundo altera o atributo de propriedade do diret´rio de dados para o usu´rio mysql,
    e o terceiro altera o atributo de grupo para o grupo mysql.
98                                           e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



          e
11. Se vocˆ deseja instalar suporte para a interface Perl DBI/DBD, veja undefined [Perl
    support], page undefined .
          e                                                         e          a
12. Se vocˆ deseja que o MySQL inicie automaticamente quando vocˆ ligar sua m´quina,
       e
    vocˆ pode copiar support-files/mysql.server para o local onde seu sistema tem seus
                         ca                co                               o
    arquivos de incializa¸˜o. Mais informa¸˜es podem ser encontradas no pr´prio script
    support-files/mysql.server e em undefined [Automatic start], page undefined .
                                      e                                    ca
Depois de tudo ter sido instalado, vocˆ deve iniciar e testar sua distribui¸˜o:
       shell> /usr/local/mysql/bin/safe_mysqld --user=mysql &
                                                                      a     e
Se o comando falhar imediatamente com mysqld daemon ended ent˜o vocˆ pode achar al-
                ca
guma informa¸˜o no arquivo ‘diret´rio-dados-mysql/’nome_maquina’.err’. A raz˜o
                                     o                                            a
                   e a
pode ser que vocˆ j´ possua outro servidor mysqld sendo executado. See undefined [Mul-
tiple servers], page undefined .
See undefined [Post-installation], page undefined .

2.3.2 Aplicando patches
                                                           a              ´
Algumas vezes patches aparecem na lista de mensagens ou s˜o colocados na Area de patches
do site web do MySQL.
Para aplicar um patch da lista de mensagens, salve a mensagem em que o patch aparece em
                               o                       ca
um arquivo, mude para o diret´rio raiz da sua distribui¸˜o fonte de seu MySQL e execute
estes comandos:
       shell> patch -p1 < patch-file-name
       shell> rm config.cache
       shell> make clean
Patches do site FTP s˜o distribu´
                       a          idos como arquivos texto ou como arquivos compactados
com gzip. Aplique um patch no formato texto como mostrado acima para patches da lista
                                                                       o           a
de mensagens. Para aplicar um patch compactado, mude para o diret´rio raiz da ´rvore
fonte do MySQL e execute estes comandos:
       shell> gunzip < patch-file-name.gz | patch -p1
       shell> rm config.cache
       shell> make clean
                                           co                     ca
Depois de aplicar um patch siga as instru¸˜es para uma instala¸˜o normal a partir dos
             c
fontes come¸ando com o passo ./configure. Depois de executar o passo make install,
reinicie seu servidor MySQL.
    e                                                           ca
Vocˆ pode precisar derrubar algum servidor atualmente em execu¸˜o antes de executar make
                                                                         a
install. (Use mysqladmin shutdown para fazer isto.) Alguns sistemas n˜o lhe permitem
                       a                                                        ca
instalar uma nova vers˜o do programa se ele substitui agum que estiver em execu¸˜o.

2.3.3 Op¸˜es t´
        co    ipicas do configure
                                                                     e
O script configure fornece uma grande gama de controle sobre como vocˆ configura sua
         ca                            e                co
distribui¸˜o MySQL. Normalmente vocˆ faz isto usando op¸˜es na linha de comando do
                e     e                                           a
configure. Vocˆ tamb´m pode alterar configure usando algumas vari´veis de ambiente.
                                                                            co
See undefined [Environment variables], page undefined . Para uma lista de op¸˜es su-
portadas pelo configure, execute este comando:
                  ca
Chapter 2: Instala¸˜o do MySQL                                                            99



     shell> ./configure --help
              co                                              a
Algumas das op¸˜es mais usadas normalmente com o configure est˜o descritas a seguir:
 • Para compilar apenas as bibliotecas clientes do MySQL e programas clientes e n˜o o
                                                                                 a
                     ca
   servidor, use a op¸˜o --without-server:
         shell> ./configure --without-server
           e a                                        a    a              e
    Se vocˆ n˜o possui um compilador C++, mysql n˜o ir´ compilar (ele ´ o programa
                                            e                  o
    cliente que exige C++). Neste caso, vocˆ pode remover o c´digo no configure que
                                                                 ca
    testa pelo compilador C++ e executar ./configure com a op¸˜o --without-server.
                        ca         a                                   e
    O passo da compia¸˜o continuar´ tentaindo construir mysql, mas vocˆ pode ignorar as
           e
    advertˆncias sobre ‘mysql.cc’. (Se o make parar, tente make -k para continuar com o
                     ca
    resto da compila¸˜o mesmo se erros ocorrerem.)
 • Se vocˆ n˜o deseja que seus arquivos de logs e diret´rios de bancos de dados fiquem
          e a                                          o
   localizados sobre ‘/usr/local/var’, use o comando configure; algo parecido com um
   destes:
          shell> ./configure --prefix=/usr/local/mysql
          shell> ./configure --prefix=/usr/local \
                       --localstatedir=/usr/local/mysql/data
                                        o            ca
    O primeiro comando altera o diret´rio instala¸˜o para que tudo seja instalado sobre
                                          a
    ‘/usr/local/mysql’ em vez do padr˜o ‘/usr/local’. O segundo comando preserva o
         o              ca      a                        ca      a            o
    diret´rio da instala¸˜o padr˜o, mas altera a localiza¸˜o padr˜o para diret´rios de bancos
    de dados (normalmente ‘/usr/local/var’) e altera para /usr/local/mysql/data.
 • Se vocˆ estiver usando Unix e deseja que o arquivo socket do MySQL fique em um
          e
        o                     a                       o
   diret´rio diferente do padr˜o (normalmente no diret´rio ‘/tmp’ ou ‘/var/run’) use o
   comando configure da seguinte forma:
          shell> ./configure --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock
                                                                      e      e
    Perceba que o arquivo fornecido deve ter um caminho absoluto ! Vocˆ tamb´m pode,
                                  ca                                           co
    mais tarde, alterar a localiza¸˜o de ‘mysql.sock’ usando os arquivos de op¸˜es do
    MySQL. See undefined [Problems with mysql.sock], page undefined
 • Se vocˆ deseja compilar programas linkeditados estaticamente (por exemplo, para criar
          e
                 ca     a
   uma distribui¸˜o bin´ria, obter mais velocidade, ou evitar problemas com algumas
            co
   distribui¸˜es Red Hat Linux), execute configure desta forma:
          shell> ./configure --with-client-ldflags=-all-static \
                      --with-mysqld-ldflags=-all-static
 • Se vocˆ estiver usando gcc e n˜o tem libg++ ou libstdc++ instalados vocˆ pode dizer
         e                       a                                        e
   ao configure para usar o gcc como seu compilador C++:
         shell> CC=gcc CXX=gcc ./configure
               e                                   a    a
    Quando vocˆ usar como seu compilador C++, ele n˜o ir´ ligar com o libg++ ou
    libstdc++.
                             co       a
    Segue algumas configura¸˜es de vari´veis de ambiente comuns, dependendo do compi-
                 e
    lador que vocˆ estiver usando:
    gcc 2.7.2.1          CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors"
    egcs 1.0.3a          CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-
                         exceptions -fno-rtti"
100                                              e      e                       a
                                            Referˆncia t´cnica para o MySQL vers˜o 3.23.52



      gcc 2.95.2          CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -
                          mpentiumpro -felide-constructors -fno-exceptions -fno-rtti"
      pgcc 2.90.29 ou CFLAGS="-O3 -mpentiumpro -mstack-align-double" CXX=gcc
      mais novo           CXXFLAGS="-O3 -mpentiumpro -mstack-align-double -felide-
                          constructors -fno-exceptions -fno-rtti"
                               e                     a
      Na maioria dos casos vocˆ pode obter um bin´rio MySQL razoavelmente otimizado
                  co                                     co                           ca
      usando as op¸˜es acima e adicionar as seguintes op¸˜es para a linha de configura¸˜o:
            --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static
                                    ca       a
      A linha completa de configura¸˜o dever´ ser, em outras palavras, algo como o seguinte
                        o
      para todas as vers˜es recentes do gcc:
            CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felide-constructor
            a
      Os bin´rios que fornecemos no site Web MySQL em http://www.mysql.com s˜o todosa
                               ca                                                 a
      compilados com otimiza¸˜o plena e deve ser perfeito para a maioria dos usu´rios. See
       undefined [MySQL binaries], page undefined . Existem algumas coisas que vocˆ          e
                                    a                a               e                 a
      pode alterar para criar um bin´rio ainda mais r´pido, mas isto ´ somente para usu´rios
          c
      avan¸ados. See undefined [Compile and link options], page undefined .
                    ca                                                             a
      Se a constru¸˜o falhar e produzir erros sobre seu compilador ou linkeditor n˜o
      estarem aptos para criarem a biblioteca compartilhada ‘libmysqlclient.so.r#’
            e      u            a      e                                          ca
      (‘r#’ ´ um n´mero de vers˜o), vocˆ pode evitar este problema fornecendo a op¸˜o
                                                                    a          a
      --disable-share para o configure. Neste caso, configure n˜o construir´ uma
      biblioteca libmysqlclient.so.* compartilhada.
 • Vocˆ pode configurar o MySQL para n˜o usar valores de campos DEFAULT para campos
      e                                 a
    a             e              a                                   c
   n˜o-NULL (isto ´, campos que n˜o podem ser NULL). Com isto, senten¸as INSERT geram
                             e
   um erro a menos que vocˆ especifique explicitamente valores para todos os campos
                             a
   que necessitem um valor n˜o- NULL. Para suprimir o uso de valores default, execute o
   configure desta forma:
        shell> CXXFLAGS=-DDONT_USE_DEFAULT_FIELDS ./configure
 • Por padr˜o, o MySQL usa o conjunto de caracteres ISO-8859-1 (Latin1). Para alterar
           a
                  a           ca
   o conjunto padr˜o, use a op¸˜o --with-charset:
         shell> ./configure --with-charset=CHARSET
      CHARSET pode ser um de big5, cp1251, cp1257, czech, danish, dec8, dos, euc_kr,
      gb2312, gbk, german1, hebrew, hp8, hungarian, koi8_ru, koi8_ukr, latin1, latin2,
      sjis, swe7, tis620, ujis, usa7, ou win1251ukr. See undefined [Character sets],
      page undefined .
            e                                                                e
      Se vocˆ desja converter os caracteres entre o servidor e o cliente, vocˆ deve dar uma ol-
      hada no comando SET OPTION CHARACTER SET. See undefined [SET OPTION], page un-
      defined .
                      e
      Cuidado: Se vocˆ alterar o conjunto de caracteres depois de ter criado qualquer tabela,
      vocˆ deve executar myisamchk -r -q em cada tabela. Seus ´
           e                                                    indices podem ser ordenados
                                                 e
      incorretamente. (Isto pode acontecer se vocˆ instalar o MySQL, criar algumas tabelas,
      depois reconfigurar o MySQL para usar um conjunto diferente de caracteres e reinstal´-a
      lo).
                ca                                      e
      Com a op¸˜o --with-extra-charset=LISTA vocˆ pode definir qual conjunto de car-
      acteres adicionais deve ser compilado no servidor.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                         101



                  e                                                        c
   Aqui LISTA ´ uma lista de conjuntos de caracteres separados por espa¸os, complex
                                          a
   para incluir todos caracteres que n˜o podem ser carregados dinamicamente ou all
                                            a
   para incluir todos os conjuntos nos bin´rios.
 • Para configurar o MySQL com c´digo para depura¸˜o, use a op¸˜o --with-debug:
                                       o               ca          ca
          shell> ./configure --with-debug
                           ca                o
   Isto inclui uma aloca¸˜o segura de mem´ria que pode encontrar alguns erros e fornecer
     ´ sobre o que est´ acontecendo. See undefined [Debugging server], page unde-
   saida                    a
   fined .
 • Se seus programas clientes usam threads, vocˆ precisar´ tamb´m compilar uma vers˜o
                                                  e       a      e                    a
                                                            co
   thread-safe da biblioteca cliente do MySQL com as op¸˜es do configure --enable-
                                     a
   thread-safe-client. Isto ir´ criar uma biblioteca libmysqlclient_r com o qual
       e       a                  co
   vocˆ dever´ ligar suas aplica¸˜es que fazem uso de threads. See undefined [Threaded
   clients], page undefined .
 • Op¸˜es que perten¸am a sistemas particulares podem ser encontrados na se¸˜o com de-
       co               c                                                    ca
   talhes espec´ ificos de sistemas neste manual. See undefined [Operating System Specific
   Notes], page undefined .

                      e     ´
2.3.4 Instalando Atrav´s da Arvore Fonte de Desenvolvimento
                   e                ca                 e
CUIDADO: Vocˆ deve ler esta se¸˜o somente se vocˆ estiver interessado em nos ajudar a
                       o            e o
testar nossos novos c´digos. Se vocˆ s´ deseja deixar o MySQL funcionando em seus sistema,
    e                           ca      a                         ca     a
vocˆ deve usar uma distribui¸˜o padr˜o (pode ser uma distribui¸˜o bin´ria ou fonte).
                              a                                         co
Para obter noss mais nova ´rvore de desenvolvimento, use estas instru¸˜es:
         c
 1. Fa¸a download do BitKeeper em http://www.bitmover.com/cgi-bin/download.cgi.
           e         a                                                       o
      Vocˆ precisar´ do Bitkeeper 2.0 ou posterior para acessar nosso reposit´rio.
                     co             a
 2. Siga as instru¸˜es para instal´-lo.
                                                                           e
 3. Depois que o BitKeeper estiver instalado, use este comando se vocˆ deseja clonar o
      ramo MySQL 3.23:
             shell> bk clone bk://work.mysql.com:7000 mysql
      Para clonar o ramo 4.0, use este comando:
             shell> bk clone bk://work.mysql.com:7001 mysql-4.0
                              a
      O download inicial da ´rvore fonte pode demorar um pouco, dependendo da velocidade
                    a
      de sua conex˜o; seja paciente.
           e         a
 4. Vocˆ precisar´ do GNU autoconf, automake, libtool e m4 para executar o pr´ximo   o
                                           c
      conjunto de comandos. Caso apare¸am alguns erros estranhos durantes este est´gio,a
                     e
      confira se vocˆ realmente tem a libtool instalada!
             shell> cd mysql
             shell> bk -r edit
             shell> aclocal; autoheader; autoconf; automake;
                                                          co
             shell> ./configure # Adicione suas op¸~es favoritas aqui
             shell> make
                ca                                ca      o     a                       o
      Uma cole¸˜o de nossos scripts de configura¸˜o padr˜es est´ localizada no subdiret´rio
                                 e
      ‘BUILD/’. Se preferir, vocˆ pode usar ‘BUILD/compile-pentium-debug’. Para compilar
      em uma arquitetura diferente, modifique o script removendo op¸˜es que s˜o espec´
                                                                     co        a      ificas
      da arquitetura Pentium.
102                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                      ca
 5. Quando a constru¸˜o estiver pronta, execute make install. Seja cuidadoso com isto
               a               ca                                        a
    em uma m´quina de produ¸˜o; o comando pode sobrescrever sua vers˜o atual insta-
                 e                  ca                o                       e
    lada. Se vocˆ tem outra instala¸˜o do MySQL, n´s recomendamos que vocˆ execute
                                                 co
    ./configure com valores diferentes para as op¸˜es prefix, tcp-port e unix-socket-
                                                  ca
    path que as usadas pelo seu servidor em produ¸˜o.
          ´                          ca
 6. Seja rigido com sua nova instala¸˜o e tente fazer com que os novos recursos falhem.
    Inicie executando make test. See undefined [MySQL test suite], page undefined .
           e               a                    ca a
 7. Se vocˆ chegar ao est´gio make e a distribui¸˜o n˜o compilar, por favor relate-o para
                                     e             ´          o
    bugs@lists.mysql.com. Se vocˆ instalou as ultimas vers˜es das ferramentas GNU
                                                                             ca
    exigidas, e elas falharam tentando processar nossos arquivos de configura¸˜o, por fa-
                           e                     e                        e
    vor informe isto tamb´m. Entretanto, se vocˆ executar aclocal e obtˆm um erro de
                           a                                                         a
    command not found n˜o o reporte.Tenha certeza que todas as ferramentas necess´rias
                                     a
    estejam instaladas e que sua vari´vel PATH esteja corretamente configurada para que
                             a
    sua shell possa encontr´-la.
                   ca                                a                e
 8. Depois da opera¸˜o inicial bk clone para obter a ´rvore fonte, vocˆ deve executar bk
                                              co
    pull periodicamente para obter as atualiza¸˜es.
         e                     o             co          a
 9. Vocˆ pode examinar o hist´rico de altera¸˜es para a ´rvore com todos os diffs usando
                          e                                o                     e
    bk sccstool. Se vocˆ ver alguns diffs estranhos ou c´digo sobre o qual vocˆ tenha
              u       a
    alguma d´vida, n˜o hesite em enviar um e-mail para internals@lists.mysql.com.
       e               e                        e
    Al´m disso, se vocˆ pensar que tem uma id´ia melhor em como fazer algo, envie um
                                 c                             a
    email para o mesmo endere¸o com um patch. bk diffs ir´ produzir um patch para
        e o                  co       o                  e a
    vocˆ ap´s fazer as altera¸˜es no c´digo fonte. Se vocˆ n˜o tiver tempo para codificar
           e                          ca
    sua id´ia, apenas envie uma descri¸˜o.
                     o           a                     e
10. BitKeeper tem um ´timo utilit´rio de ajudar que vocˆ pode acessar via bk helptool.

                             ca
2.3.5 Problemas com a compila¸˜o
Todos programas MySQL compilam de forma limpa sem alertas no solaris usando gcc. Em
                                                       c
outros sistemas, alertas podem ocorrer devido a diferen¸as em arquivos include dos sistemas.
Veja undefined [MIT-pthreads], page undefined para avisos que podem ocorrer usando
MIT-pthreads. Para outros problemas, confira a lista abaixo.
      ca         a                                ca         e                        c
A solu¸˜o para v´rios problemas envolve reconfigura¸˜o. Se vocˆ precisa reconfigurar, fa¸a
notas do seguinte:
 • Se configure ´ executado depois dele j´ ter sido chamado, ele pode usar informa¸˜o
                   e                       a                                         ca
                                                               ca e
   que foi colhida durante a chamada anterior. Esta informa¸˜o ´ armazenada no ar-
                                                                                   e
   quivo ‘config.cache’. Quando configure inicia, ele procura por este arquivo, lˆ seu
        u                                                ca
   conte´do, se ele existir, assumindo que aquela informa¸˜o continua correta. Essa con-
          e    a                 e
   jetura ´ inv´lida quando vocˆ reconfigurar.
 • Cada vez que vocˆ executa configure, vocˆ deve executar make de novo para re-
                      e                         e
                             e
   compilar. Entretanto, vocˆ pode desejar remover primeiro antigos arquivos objeto de
           co                                                               co
   constru¸˜es anteriores, porque eles foram compilados usando diferentes op¸˜es de con-
         ca
   figura¸˜o.
                             co               co
Para prevenir antigas informa¸˜es de configura¸˜es ou arquivos objetos de serem usados,
execute estes comandos antes de re-executar configure:
                  ca
Chapter 2: Instala¸˜o do MySQL                                                      103



       shell> rm config.cache
       shell> make clean
Uma alternativa, seria executar make distclean
A lista abaixo descreve alguns dos problemas compilando o MySQL que tem sido encontra-
dos com mais frequencia:
  • Se vocˆ obtˆm erros quando ‘sql_yacc.cc’ como os mostrados abaixo, vocˆ provavel-
              e     e                                                           e
                                       o       c
     mente tem de falta de mem´ria ou espa¸o de swap:
             Internal compiler error: program cc1plus got fatal signal 11
                ou
             Out of virtual memory
                ou
             Virtual memory exhausted
                       e                                                o
     O problema ´ que gcc necessita de grande quantidade de mem´ria para compilar
                                   co                                         ca
     ‘sql_yacc.cc’ com fun¸˜es inline. Tente executando configure com a op¸˜o --with-
     low-memory:
             shell> ./configure --with-low-memory
                ca                                                ca      e
     Esta op¸˜o adiciona -fno-inline na a linha de compila¸˜o se vocˆ estiver usando
                           e                                 e                ca
     gcc e -O0 se vocˆ estiver usando outro programa. Vocˆ deve tentar a op¸˜o --with-
                                      e             o          c                 e
     low-memory mesmo se vocˆ tiver muita mem´ria e espa¸o de swap que vocˆ ache ser
                             a
     suficieente para n˜o ocorrer erros. Este problema tem ocorrido mesmo em sistemas
                               co                ca
     com boas configura¸˜es de hardware e a op¸˜o --with-low-memory geralmente corrige
     isto.
  • Por padr˜o, configure escolhe c++ como o nome do compilador e GNU c++ liga com -
                 a
                      e
     lg++. Se vocˆ estiver usando gcc, este comportamento pode causar problemas durante
                  ca
     a compila¸˜o, como o seguinte:
             configure: error: installation or configuration problem:
             C++ compiler cannot create executables.
         e                   e                               ca             a
     Vocˆ podem tamb´m ter problemas durante a compila¸˜o relacionados ` g++, libg++
     ou libstdc++.
                                         e   e       a               e                a
     Uma causa destes problemas ´ que vocˆ pode n˜o ter g++ ou vocˆ pode ter g++ mas n˜o
     ter o libg++ ou o libstdc++. De uma olhada no arquivo ‘config.log’. Ele deve conter
            a                                          a
     a raz˜o exata do porque seu compilador c++ n˜o funciona! Para trabalhar evitando
                                 e
     estes problemas, vocˆ pode usar gcc como seu compilador C++. Tente configurar a
         a
     vari´vel de ambiente CXX para "gcc -O3". Por exemplo:
             shell> CXX="gcc -O3" ./configure
                                           o               a
     Isto funciona porque gcc compila c´digo fonte C++ t˜o bem quanto g++ faz, mas n˜oa
                  ca
     ifaz a liga¸˜o em libg++ ou libstdc++ por padr˜o.   a
                                                                 e
     Outra forma de corrigir estes problemas, com certeza, ´ instalando g++, libg++ e
     libstdc++.
  • Se sua compila¸˜o falhar com erros, como um dos seguintes, vocˆ deve atualizar sua
                         ca                                            e
          a
     vers˜o de make para GNU make:
             making all in mit-pthreads
             make: Fatal error in reader: Makefile, line 18:
             Badly formed macro assignment
104                                              e      e                       a
                                            Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                 or
             make: file ‘Makefile’ line 18: Must be a separator (:
                 or
             pthread.h: No such file or directory
                                a
      O Solaris e o FreeBSD s˜o conhecidos por terem alguns problemas com o make.
                          a          a
      O GNU make vers˜o 3.75 ir´ funcionar.
 •            e                            co
      Se vocˆ deseja definir algumas op¸˜es que devem ser usadas pelo seu compilador C ou
                            co                a                                       e
      C++, adicione as op¸˜es para as vari´veis de ambiente CFLAGS e CXXFLAGS. Vocˆ pode
            e
      tamb´m especificar os nomes do compilador a ser usado da mesma forma utilizando CC
      e CXX. Exemplo:
             shell> CC=gcc
             shell> CFLAGS=-O3
             shell> CXX=gcc
             shell> CXXFLAGS=-O3
             shell> export CC CFLAGS CXX CXXFLAGS
      Olhe em undefined [MySQL binaries], page undefined para uma lista de defini¸˜o          ca
            co                        ´         a
      de op¸˜es que tenham sido uteis em v´rios sistemas.
 •            e                                           e       a
      Se vocˆ recebeu uma mensagem de erro como esta, ´ necess´rio atualizar o compilador
      gcc:
             client/libmysql.c:273: parse error before ‘__attribute__’
      O gcc 2.8.1 funciona, mas recomendamos o uso do gcc 2.95.2 ou egcs 1.0.3a em seu
      lugar.
 •            e
      Se vocˆ obtem erros como estes vistos abaixo enquanto estiver compilando o mysqld,
                       a                                   ´
      o configure n˜o detectou corretamente o tipo do ultimo argumento para accept(),
      getsockname() ou getpeername():
             cxx: Error: mysqld.cc, line 645: In this statement, the referenced
                    type of the pointer value "&length" is "unsigned long", which
                    is not compatible with "int".
             new_sock = accept(sock, (struct sockaddr *)&cAddr, &length);
                                                          e
      Para corrigir isto, edite o arquivo ‘config.h’ (que ´ gerado pelo configure). Procure
      por estas linhas:
             /* Define as the base type of the last arg to accept */
             #define SOCKET_SIZE_TYPE XXX
      Altere XXX para size_t ou int, dependendo de seu sistema operacional. (Perceba
                e      a                           e
      que vocˆ dever´ fazer isto cada vez que vocˆ executar configure, porque configure
      regenera ‘config.h’.)
 •                                  e
      O arquivo ‘sql_yacc.cc’ ´ gerado pelo ‘sql_yacc.yy’. Normalmente o processo de
                ca a                                                    a
      constru¸˜o n˜o necessita criar ‘sql_yacc.cc’, porque o MySQL j´ vem com uma c´pia   o
        e                               e             a      e
      pr´-gerada. Entretanto, se vocˆ necessita recri´-lo vocˆ pode encontrar este erro:
             "sql_yacc.yy", line xxx fatal: default action causes potential...
      Isto ´ um ind´ de que sua vers˜o do yacc ´ deficiente. Provavelmente vocˆ precisar´
           e         icio                 a        e                              e          a
                                a                     a
      instalar o bison (a vers˜o GNU de yacc) e us´-lo no lugar do yacc.
 •            e
      Se vocˆ necessita depurar mysqld ou um cliente MySQL, execute configure com a
         ca                       a
      op¸˜o --with-debug, ent˜o recompile e ligue seus clientes com a nova biblioteca cliente.
      See undefined [Debugging client], page undefined .
                  ca
Chapter 2: Instala¸˜o do MySQL                                                          105



2.3.6 Notas MIT-pthreads
        ca
Esta se¸˜o descreve alguns dos detalhes envolvidos no uso de MIT-pthreads.
                          e ˜
Note que no Linux vocˆ NAO deve usar MIT-pthreads mas instalar LinuxThreads! See
 undefined [Linux], page undefined .
                    a                                        e        a
Se seu sistema n˜o fornece suporte nativo a thread, vocˆ precisar´ construir o MySQL
usando o pacote MIT-pthreads. Isto inclui antigos sistemas FreeBSD, SunOS 4.X, Solaris
2.4 e anteriores entre outros. See undefined [Which OS], page undefined .
  • Na maioria dos sitemas, vocˆ pode for¸ar o uso de MIT-pthreads executando o
                                       e         c
                            ca
     configure com a op¸˜o --with-mit-threads:
            shell> ./configure --with-mit-threads
              ca                o      a        a e
     Constru¸˜o em um diret´rio n˜o fonte n˜o ´ suportado com o uso de MIT-pthreads,
               o                                    co              o
     porque n´s queremos minimizar nossas altera¸˜es para este c´digo.
  • As verifica¸˜es que determinam se MIT-pthreads ser´ usado ou n˜o, ocorrer´ somente
                 co                                        a            a          a
                                              ca                   o
     durante a parte do processo de configura¸˜o que trata com o c´digo do servidor. Se vocˆe
                             ca
     configurou a distribui¸˜o usando --without-server para construir somente o c´digo  o
                         a a                               a                  a          o
     cliente, clientes n˜o ir˜o saber se o MIT-pthreads est´ sendo usado e ir´ usar conex˜es
                            a                          a
     socket Unix por padr˜o. Como os sockets Unix n˜o funcionam sob MIT-pthreads, isto
                        e         a
     significa que vocˆ precisar´ usar -h ou --host quando executar programas clientes.
  • Quando o MySQL ´ compilado usando MIT-pthreads, travas de sistema s˜o desabil-
                          e                                                       a
                       a          o                      e
     itadas por padr˜o por raz˜es de performance. Vocˆ pode dizer ao servidor para usar
                                    ca
     travas de sistema com a op¸˜o --use-locking.
  • Algumas vezes o comando pthread bind() falha ao ligar a um socket sem nenhuma
                                                              e                o
     mensagem de erro (pelo menos no Solaris). O resultado ´ que todas conex˜es ao servidor
     falham. Por exemplo:
            shell> mysqladmin version
            mysqladmin: connect to server at ’’ failed;
            error: ’Can’t connect to mysql server on localhost (146)’
            ca             e                                   a         o
     A solu¸˜o para isto ´ matar o servidor mysqld e reinici´-lo. Isto s´ aconteceu conosco
                  c                                                       ca
     quando for¸amos uma queda do servidor e fizemos uma reinicializa¸˜o imediata.
  • Com MIT-pthreads, a chamada de sistema sleep() n˜o ´ interromp´ com SIGINT
                                                              a e            ivel
                      oe                      e                                     e
     (break). Isto s´ ´ percebido quando vocˆ executa mysqladmin --sleep. Vocˆ deve es-
                                                                  ca
     perar pela chamada sleep() para terminar, antes da interru¸˜o ser servida e o processo
     parar.
  • Na liga¸˜o, vocˆ pode receber mensagens de alerta como estes (pelo menos no Solaris);
             ca       e
     elas podem ser ignoradas:
            ld: warning: symbol ‘_iob’ has differing sizes:
                  (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
            file /usr/lib/libc.so value=0x140);
                  /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
            ld: warning: symbol ‘__iob’ has differing sizes:
                  (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
            file /usr/lib/libc.so value=0x140);
                  /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
  • Alguns outros alertas tamb´m podem ser ignorados:
                                    e
106                                             e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



        implicit declaration of function ‘int strtoll(...)’
 • N˜o colocamos readline para funcionar com MIT-pthreads. (Isto n˜o ´ necess´rio,
    a                                                             a e        a
   mas pode ser interessante para alguns.)

            c˜             o         ca
2.4 Configura¸oes e Testes P´s-instala¸˜o
                                                ca      a                 e
Uma vez instalado o MySQL (de uma distribui¸˜o bin´ria ou fonte), vocˆ deve inicializar
                       o                                                     a
as tabelas de concess˜es, iniciar o servidor e ter certeza que o servidor est´ funcionando
          e             e
bem. Vocˆ pode tamb´m desejar que o servidor inicie e pare automaticamente quando seu
sistema iniciar e desligar.
               e                              o                                         co
Normalmente vocˆ instala as tabelas de concess˜es e inicia o servidor assim para instala¸˜es
                         ca
baseadas em uma distribui¸˜o fonte:
     shell> ./scripts/mysql_install_db
                                     ca
     shell> cd diretorio_instala¸~o_mysql
     shell> ./bin/safe_mysqld --user=mysql &
                  ca     a                                    c
Para uma distribui¸˜o bin´ria (sem ser pacotes RPM ou PKG), fa¸a isto:
                                     ca
     shell> cd diretorio_instala¸~o_mysql
     shell> ./bin/mysql_install_db
     shell> ./bin/safe_mysqld --user=mysql &
                                         a                     e
Isto cria o banco de dados mysql que ir´ armazenar todos privil´gios do banco de dados,
                                e      a                                 e
o banco de dados test que vocˆ poder´ usar para testar o MySQL e tamb´m entradas de
      e              a                                      a
privil´gio para o usu´rio que usa o mysql_install_db e o usu´rio root (sem senhas). Isto
      e
tamb´m inicia o servidor mysqld.
                      a   a                                       e                a
mysql_install_db n˜o ir´ sobrescrever nenhuma tabela de privil´gios antiga, ent˜o deve
                 a                         a             e a
ser seguro execut´-lo em quaisquer circunstˆncias. Se vocˆ n˜o deseja ter o banco de dados
         e             e
test vocˆ pode removˆ-lo com mysqladmin -u root drop test.
         a                                             o                    ca
Testes s˜o geralmente facilmente feitos de um diret´rio raiz da distribui¸˜o MySQL.
                  ca     a          e          o               ca
Para uma distribui¸˜o bin´ria, este ´ seu diret´rio de instala¸˜o (normalmente algo como
                                            ca               e       o
‘/usr/local/mysql’). Para uma distrubui¸˜o fonte, este ´ o diret´rio principal da sua
´rvore fonte do MySQL.
a
                                          ca                      co             e
Nos comandos mostrados abaixo nesta se¸˜o e nas seguintes subse¸˜es, BINDIR ´ o caminho
               ca                                                              a
para a localiza¸˜o na qual os programas como mysqladmin e safe_mysqld est˜o instalados.
                   ca      a        e        o                             ca
Para uma distribui¸˜o bin´ria este ´ o diret´rio ‘bin’. Para uma distribui¸˜o fonte, BINDIR
e                                                     e                     o
´ provavelmente ‘/usr/local/bin’, a menos que vocˆ especifique um diret´rio de instala¸˜oca
                                      e                                e          ca
diferente de ‘/usr/local’ quando vocˆ executa configure. EXECDIR ´ a localiza¸˜o na qual
                      a                              ca     a         e
o servidor mysqld est´ instalado. Para uma distribui¸˜o bin´ria, isto ´ o mesmo que BINDIR.
                    ca                  e
Para uma distribui¸˜o fonte, EXECDIR ´ provavelmente ‘/usr/local/libexec’.
        a
Testes s˜o descritos em detalhes abaixo:
              a                                                               o
 1. Se necess´rio, inicie o servidor mysqld e configure as tabelas de concess˜es iniciais
                       e                                 a      a
    contendo os privil´gios que determinam como os usu´rios est˜o permitidos a conectar
                      e
    ao servidor. Isto ´ feito normalmente com o script mysql_install_db:
          shell> scripts/mysql_install_db
    Normalmente, mysql_install_db precisa ser executado somente na primeira vez que
       e                                    e                              ca
    vocˆ instala o MySQL. Portanto, se vocˆ estiver atualizando uma instala¸˜o existente,
                  ca
Chapter 2: Instala¸˜o do MySQL                                                           107



       e                                                         e
    vocˆ pode pular este passo. (entretanto, mysql_install_db ´ realmente seguro de usar
       a a                                   a           a         e a
    e n˜o ir´ atualizar nenhuma tabela que j´ exista, ent˜o se vocˆ n˜o tem certeza do que
              e
    fazer, vocˆ pode sempre executar mysql_install_db.)
    mysql_install_db cria seis tabelas (user, db, host, tables_priv, columns_priv e
                                                   ca            e          e
    func) no banco de dados mysql. Uma descri¸˜o dos privil´gios iniciais ´ fornecido
    em undefined [Default privileges], page undefined . De forma resumidao, estes
          e                       a           c
    privil´gios permitem que o usu´rio root fa¸a qualquer coisa no MySQL, e permitem a
    qualquer um a criar ou usar bancos de dados com o nome de ’test’ ou iniciando com
    ’test_’ .
          e a                                  o                      a
    Se vocˆ n˜o configurar as tabelas de concess˜es, o seguinte erro ir´ aparecer no arquivo
                   e a
    log quando vocˆ n˜o iniciar o servidor:
          mysqld: Can’t find file: ’host.frm’
                          e                           ca     a                   e a
    O erro acima pode tamb´m ocorrer com uma distribui¸˜o bin´ria do MySQL se vocˆ n˜o
    iniciar o MySQL executando o ./bin/safe_mysqld! See undefined [safe_mysqld],
    page undefined .
        e
    Vocˆ deve precisar executar mysql_install_db como root. Entretanto, se vocˆ        e
                                                                   a
    preferir, pode executar o servidor MySQL como um usu´rio (n˜o-root) sema
          e                     a                                          o
    privil´gios, desde que o usu´rio possa ler e escrever arquivos no diret´rio de banco
                       co                                          a
    de dados. Instru¸˜es para executar o MySQL como um usu´rio sem privil´gios ´  e    e
                                             a
    detalhado em undefined [Alterando usu´rios MySQL], page undefined
           e
    Se vocˆ tiver problemas com o mysql_install_db, veja undefined [mysql_install_
    db], page undefined .
                                                                                  e
    Existem algumas alternativas para executar o script mysql_install_db como ele ´
                          ca
    fornecido na distribui¸˜o MySQL:
     • Vocˆ pode querer editar o mysql_install_db antes de execut´-lo, para alterar os
           e                                                           a
             e                   a                                   o         e´           e
       privil´gios iniciais que s˜o instalados nas tabelas de concess˜es. Isto ´ util se vocˆ
                                         a      a                              e
       deseja instalar o MySQL em v´rias m´quinas com os mesmos privil´gios. Neste
              e      a             e o                                  co
       caso, ´ prov´vel que vocˆ s´ precise adicionar algumas instru¸˜es INSERT extras
       para as tabelas mysql.user e mysql.db.
     • Se vocˆ deseja alterar algo na tabelas de concess˜es depois de instal´-las, vocˆ pode
              e                                         o                   a          e
                                           a
       executar mysql_install_db, ent˜o usar mysql -u root mysql para conectar `s          a
                           o              a                    co
       tabelas de concess˜es como o usu´rio root e usar instru¸˜es SQL para modific´-las  a
       diretamente.
       ´
     • E poss´                                   o                                   a
               ivel recriar as tabelas de permiss˜es completamente depois delas j´ terem
                          e                             e a
       sido criadas. Vocˆ pode querer fazer isto se vocˆ j´ instalou as tabelas mas deseja
            a                    co
       recri´-las depois das edi¸˜es mysql_install_db.
                        co
    Para maiores informa¸˜es sobre estas alternativas, veja undefined [Default privileges],
    page undefined .
 2. Inicie o servidor MySQL assim:
           shell> cd diretorio_instalacao_mysql
           shell> bin/safe_mysqld &
          e
    Se vocˆ tiver problemas iniciando o servidor, veja        undefined    [Starting server],
    page undefined .
108                                         e      e                       a
                                       Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                                                  a          ca
 3. Use mysqladmin para verificar se o servidor est´ em execu¸˜o. Os seguintes coman-
                                                                 a
    dos fornecem um teste simples para conferir se o servidor est´ em funcionamento e
                a       o
    respondendo `s conex˜es:
          shell> BINDIR/mysqladmin version
          shell> BINDIR/mysqladmin variables
        ´ de mysqladmin version varia muito pouco dependendo de sua plataforma e
    A saida
        a
    vers˜o do MySQL, mas deve ser similar a esta mostrada abaixo:
          shell> BINDIR/mysqladmin version
          mysqladmin Ver 8.14 Distrib 3.23.32, for linux on i586
          Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
          This software comes with ABSOLUTELY NO WARRANTY. This is free software,
          and you are welcome to modify and redistribute it under the GPL license

         Server version              3.23.32-debug
         Protocol version            10
         Connection                  Localhost via Unix socket
         TCP port                    3306
         UNIX socket                 /tmp/mysql.sock
         Uptime:                     16 sec

          Threads: 1 Questions: 9 Slow queries: 0 Opens: 7 Flush tables: 2                 Open table
                     e             e
    Para ter uma id´ia do que vocˆ pode fazer com BINDIR/mysqladmin, invoque-o com a
      ca
    op¸˜o --help.
                    e
 4. Verifique se vocˆ pode desligar o servidor:
          shell> BINDIR/mysqladmin -u root shutdown
                       e                                c
 5. Verifique que vocˆ possa reiniciar o servidor. Fa¸a isto usando safe_mysqld ou
    chamado o mysqld diretamente. Por exemplo:
          shell> BINDIR/safe_mysqld --log &
                                            a           o             ca
    Se o safe_mysqld falhar, tente execut´-lo do diret´rio de instala¸˜o do MySQL (se
       e a a             a       a
    vocˆ j´ n˜o estiver l´). Se n˜o funcionar, veja undefined [Starting server], page un-
    defined .
 6. Execute alguns testes b´sicos para verificar se o servidor est´ funcionando. A sa´
                             a                                   a                   ida
    deve ser similar ao mostrado abaixo:
          shell> BINDIR/mysqlshow
          +-----------+
          | Databases |
          +-----------+
          | mysql        |
          +-----------+

         shell> BINDIR/mysqlshow mysql
         Database: mysql
         +--------------+
         |    Tables    |
         +--------------+
         | columns_priv |
                  ca
Chapter 2: Instala¸˜o do MySQL                                                          109



          | db           |
          | func         |
          | host         |
          | tables_priv |
          | user         |
          +--------------+

           shell> BINDIR/mysql -e "select host,db,user from db" mysql
           +------+--------+------+
           | host | db       | user |
           +------+--------+------+
           | %      | test   |        |
           | %      | test_% |        |
           +------+--------+------+
          e                                          o                           o
    Tamb´m existe uma suite de benchmark no diret´rio ‘sql-bench’ (sob o diret´rio de
           ca                      e
    instala¸˜o do MySQL) que vocˆ pode usar para comparar como o MySQL se comporta
                                        o                            e
    em diferentes plataformas. O diret´rio ‘sql-bench/Results’ cont´m os resultados de
      a          co
    v´rias execu¸˜es em diferentes bancos de dados e plataformas. Para executar todos
    testes, execute estes comandos:
           shell> cd sql-bench
           shell> run-all-tests
           e a                 o                   e                   a
    Se vocˆ n˜o possui o diret´rio ‘sql-bench’, vocˆ provavelmente est´ usando uma dis-
          ca      a                   co                              o
    tribui¸˜o bin´ria RPM. (Distribui¸˜es fontes RPMs incluem o diret´rio com os bench-
                              e
    marks.) Neste caso, vocˆ deve primeiramente instalar a suite de benchmark antes
                 a                      a                      c
    de poder us´-lo. A partir da vers˜o 3.22 do MySQL, come¸aram a existir arquivos
                                                                              e
    RPMs de benchmark chamados ‘mysql-bench-VERSION-i386.rpm’ que cont´m c´digo    o
    ie dados de benchmark.
           e                    ca           e     e
    Se vocˆ tem uma distribui¸˜o fonte, vocˆ tamb´m pode executar os testes no subdi-
        o                                                                c
    ret´rio ‘tests’. Por exemplo, para executar ‘auto_increment.tst’, fa¸a isto:
           shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst
                              a
    Os resultados esperados s˜o mostrados no arquivo ‘./tests/auto_imcrement.res’.

2.4.1 Problemas Executando o mysql_install_db
        o                                  e                               e          a
O prop´sito do script mysql_install_db ´ gerar novas tabelas de privil´gios. Ele n˜o ir´   a
                                     e    a     a             e a
afeter nenhum outro dado! Ele tamb´m n˜o far´ nada se vocˆ j´ tem a tabela de privil´gioe
do MySQL instalada.
       e                                     e         e
Se vocˆ deseja refazer suas tabelas de privil´gios, vocˆ deve desligar o servidor mysqld, se
     a    a                a    c
ele j´ est´ executando, ent˜o fa¸a assim:
       mv diretorio-dados-mysql/mysql diretorio-dados-mysql/mysql-old
       mysql_install_db
         ca
Esta se¸˜o relaciona alguns problemas que podem ser encontrados ao executar mysql_
install_db:
                   a                              o
mysql_install_db n˜o instala as tabelas de permiss˜es
             e
          Vocˆ pode descobrir que o mysql_install_db falha ao instalar as tabelas de
                 o
          permiss˜es e termina depois de mostrar as seguintes mensagens:
110                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                 starting mysqld daemon with databases from XXXXXX
                 mysql daemon ended
                          e
           Neste caso, vocˆ deve examinar o arquivo de log com muito cuidado! O log deve
                                 o
           se encontrar no diret´rio ‘XXXXXX’ nomeado pela mensagem de erro, e deve
                                     a                   e a
           indicar porque mysqld n˜o inicializa. Se vocˆ n˜o entende o que aconteceu,
                                   e
           inclua o log quando vocˆ postar um relato de erro usando mysqlbug! See un-
           defined [Bug reports], page undefined .
 a
J´ existe um daemon mysqld sendo executado
                                       a     a       a
            Neste caso, provavelmente n˜o ser´ necess´rio executar o mysql_install_db.
                e                                                              e
            Vocˆ deve executar o mysql_install_db somente uma vez, quando vocˆ insta-
            lar o MySQL da primeira vez.
                                    a
Instalair um segundo daemon mysqld n˜o funciona quando um daemon
                            ca
            estiver em execu¸˜o.
                                          e a                  ca
           Isto pode acontecer quando vocˆ j´ tiver uma instala¸˜o do MySQL existente,
                                               ca
           mas deseja colocar uma nova instala¸˜o em um diferente lugar (por exemplo,
                                     e                                          co
           para testes, ou talvez vocˆ simplesmente deseja executar duas instala¸˜es ao
                                                                       e
           mesmo tempo). Geralmente o problema que ocorre quando vocˆ tenta executar
                               e
           o segundo servidor ´ que ele tenta usar o mesmo socket e porta que o outro.
                          e a
           Neste caso vocˆ ir´ obter a mensagem de erro: Can’t start server: Bind
           on TCP/IP port: Address already in use ou Can’t start server : Bind on
           unix socket.... See undefined [Installing many servers], page undefined .
   e a                                  o
Vocˆ n˜o tem direito de escrita no diret´rio ‘/tmp’
                 e a                                                                    a
           Se vocˆ n˜o tem direito de escrita para criar um arquivo socket no local padr˜o
                                   a                             a
           (em ‘/tmp’) ou permiss˜o para criar arquivos tempor´ris em ‘/tmp,’ vocˆ ir´e a
           obter um erro quando executar mysql_install_db ou quando iniciar ou usar
           mysqld.
              e                               o          a
           Vocˆ pode especificar socket e diret´rio tempor´rio diferentes, como segue:
                shell> TMPDIR=/algum_dir_tmp/
                shell> MYSQL_UNIX_PORT=/algum_dir_tmp/mysqld.sock
                shell> export TMPDIR MYSQL_UNIX_PORT
           See undefined [Problems with mysql.sock], page undefined .
                                                                o               e
           ‘algum_dir_tmp’ deve ser o caminho para o mesmo diret´rio no qual vocˆ tem
                  a
           permiss˜o de escrita. See undefined [Environment variables], page unde-
           fined .
                           e
           Depois disto vocˆ deve estar apto para executar mysql_install_db e iniciar o
           servidor com estes comandos:
                 shell> scripts/mysql_install_db
                 shell> BINDIR/safe_mysqld &
mysqld falha imediatamente
                  e                                 a                    a
           Se vocˆ estiver executando RedHat Vers˜o 5.0 com uma vers˜o de glibc an-
                               e                         e
           terior a 2.0.7-5 vocˆ deve ter certeza que vocˆ instalou todos os patches para
                                            ca
           a glibc! Existe muita informa¸˜o sobre isto nos arquivos das listas de men-
           sagens do MySQL. Links para os arquivos de correio est˜o dispon´
                                                                  a        iveis online em
                  ca
Chapter 2: Instala¸˜o do MySQL                                                      111



                                                                 e
           http://www.mysql.com/documentation/. Veja tamb´m undefined [Linux],
           page undefined .
              e            e                                               ca
           Vocˆ pode tamb´m iniciar o mysqld manualmente usando a op¸˜o --skip-
                                               ca          e
           grant-tables e adicionar a informa¸˜o de privil´gios usando o mysql:
                shell> BINDIR/safe_mysqld --skip-grant-tables &
                shell> BINDIR/mysql -u root mysql
           Do mysql, execute manualmente os comandos SQL em mysql_install_db.
           Tenha certeza de executar mysqladmin flush_privileges ou mysqladmin
                    o                                                         o
           reload ap´s dizer ao servidor para recarregar as tabelas de permiss˜es.

2.4.2 Problemas inicializndo o Servidor MySQL
       e                                      co
Se vocˆ for usar tabelas que suportem transa¸˜es (BDB, InnoDB), primeiro deve-se criar
                                     co              ca
um arquivo my.cnf e configurar op¸˜es de inicializa¸˜o para os tipos de tabelas que vocˆ   e
planeja usar. See undefined [Table types], page undefined .
                  e                                        e
Geralmente, vocˆ inicia o servidor mysqld de uma das trˆs maneiras:
  • Invocando mysql.server. Este script ´ usado primariamente na inicializa¸˜o e final-
                                           e                                   ca
        ca                  e
     iza¸˜o do sistema, e ´ descrito de forma mais completa em undefined [Automatic
     start], page undefined .
  • Invocando safe_mysqld, que tenta determinar as op¸˜es apropriadas para mysqld e
                                                             co
         a         a               co
     ent˜o execut´-lo com estas op¸˜es. See undefined [safe_mysqld], page undefined .
  • No Windows NT vocˆ deve instalar o mysqld como um servi¸o, como abaixo:
                           e                                      c
             bin\mysqld-nt --install                      # Instala o MySQL como um servi¸o c
          e
     Vocˆ pode iniciar/parar o mysqld como abaixo:
             NET START mysql
             NET STOP mysql
                                 e a                        co
     Perceba que neste caso vocˆ n˜o pode usar outras op¸˜es para o mysqld!
          e                     c
     Vocˆ pode remover o servi¸o da seguinte maneira:
             bin\mysqld-nt --remove                       # remove MySQL as a service
  • Invocando o mysqld diretamente.
                                                   o                 o             ´
Quando o daemon mysqld inicia, ele altera o diret´rio para o diret´rio de dados. E neste
     o
diret´rio que ele espera gravar arquivos de log e o arquivo pid (com o ID do processo) e
onde ele espera encontrar os bancos de dados.
            ca          o             e                                ca e
A localiza¸˜o do diret´rio de dados ´ especificada quando a distribui¸˜o ´ compilada. En-
                                              o
tretanto, se o mysqld espera encontrar o diret´rio de dados em lugar diferente de onde ele
               a                      a          a                        e
realmente est´ no seu sistema, ele n˜o funcionar´ corretamente. Se vocˆ tiver problemas
                              e                          co
com caminhos incorretos vocˆ pode encontrar quais op¸˜es o mysqld permite e quais s˜o   a
              co                   a                                ca
as configura¸˜es do caminho padr˜o chamando o mysqld com a op¸˜o --help. Vocˆ pode   e
                      o
sobrescrever os padr˜es especificando os caminhos corretos como argumentos de linha de
                                co       e
comando ao mysqld. (Estas op¸˜es tamb´m podem ser usadas com o safe_mysqld).
                    e                                               o
Normalmente vocˆ precisaria indicar ao mysqld somente o diret´rio base sob o qual o
          e               e                             ca                  e
MySQL ´ instalado. Vocˆ pode fazer isso usando a op¸˜o --basedir. Vocˆ pode tamb´m     e
                                            co
usar --help para conferir o efeito das ope¸˜es para se alterar o caminho (perceba que
                      ca
--help deve ser a op¸˜o final do comando mysqld. Por exemplo:
112                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



      shell> EXECDIR/mysqld --basedir=/usr/local --help
               e                      co                     e
Uma vez que vocˆ determina as configura¸˜es de caminho que vocˆ deseja, inicie o servidor
        ca
sem a op¸˜o --help.
                                 e
Qualquer que tenha sido o m´todo utilizado para iniciar o servidor, se houver falha
             ca                                              e
na inicializa¸˜o, confira o arquivo de log para ver se vocˆ pode entender o porquˆ.   e
                a                      o
Arquivos log est˜o localizados no diret´rio dados (normalmente ‘/usr/local/mysql/data’
                      ca       a
para uma distribui¸˜o bin´ria, ‘/usr/local/var’ para uma distribui¸˜o fonte,ca
                                                          o
‘\mysql\data\mysql.err’ no Windows.) Procure no diret´rio de dados por arquivos com
nomes no formato ‘nome_maquina.err’ e ‘nome_maquina.log’ onde nome_maquina ´ o     e
                       a            ´
nome do servidor. Ent˜o confira as ultimas linhas destes arquivos:
      shell> tail nome_maquina.err
      shell> tail nome_maquina.log
      e
Se vocˆ encontrar algo como o seguinte no arquivo log:
      000729 14:50:10     bdb: Recovery function for LSN 1 27595 failed
      000729 14:50:10     bdb: warning: ./test/t1.db: No such file or directory
      000729 14:50:10     Can’t init databases
                e a
Significa que vocˆ n˜o inicializou o mysqld com --bdb-no-recover e o Berkeley DB encon-
trou algo errado com seus arquivos log quando ele tentou recuperar seus bancos de dados.
                           e                                                     o
Para poder continuar, vocˆ deve mover o antigo arquivo log Berkeley DB do diret´rio do
                                             a      a
banco de dados para outro lugar, onde poder´ examin´-los posteriormente. Os arquivos log
 a                                         u      a
s˜o nomeados ‘log.0000000001’, onde o n´mero ir´ incrementar com o tempo.
        e
Se vocˆ estiver executando o mysqld com suporte a tabelas BDB e o mysqld falhar no
in´                                                                      ca
  icio, pode ser devido a alguns problemas com o arquivo de recupera¸˜o BDB. Neste caso
    e                                                                           a     e
vocˆ pode tentar iniciar o mysqld com --bdb-no-recover. Se isto ajudar, ent˜o vocˆ pode
                                          o
remover todos os arquivos ‘log.*’ do diret´rio de dados e tentar iniciar o mysqld novamente.
       e
Se vocˆ obter o seguinte erro, significa que algum outro programa (ou outro servidor mysqld)
 a    a                                                a
j´ est´ usando a porta TCP/IP ou socket mysqld est´ tentando usar:
      Can’t start server: Bind on TCP/IP port: Address already in use
        ou
      Can’t start server : Bind on unix socket...
                                e a                                       ca
Use ps para ter certeza que vocˆ n˜o tem outro servidor mysqld em execu¸˜o. Se vocˆ  e
 a                                        e
n˜o consegue encontrar outro servidor, vocˆ pode tentar executar o comando telnet sua_
                                                   a                   e a
maquina numero_porta_tcp-ip e apertar ENTER v´rias vezes. Se vocˆ n˜o obter uma
mensagem como telnet: Unable to connect to remote host: Connection refused, algo
   a                                                  a
est´ usando a mesma porta TCP/IP que o mysqld est´ tentando usar. Veja undefined
[mysql install db], page undefined e undefined [Multiple servers], page undefined .
               a                    ca      e                          co              a
Se o mysqld est´ atualmente em execu¸˜o, vocˆ pode verificar as configura¸˜es que ele est´
usando executando este comando:
      shell> mysqladmin variables
ou
      shell> mysqladmin -h ’your-host-name’ variables
                                          e a
Se o safe_mysqld inicia o servidor mas vocˆ n˜o consegue se conectar a ele, tenha certeza
       e
que vocˆ tem uma entrada no arquivo ‘/etc/hosts’ que parece com isto:
                  ca
Chapter 2: Instala¸˜o do MySQL                                                         113



      127.0.0.1          localhost
               o                         a
Este problema s´ ocorre em sistemas que n˜o possuem uma biblioteca thread funcional e
para o qual o MySQL deve estar configurado para usar MIT-pthreads.
      e a                                e
Se vocˆ n˜o consegue iniciar o mysqld vocˆ pode tentar criar um arquivo para rastreamento
de erros (trace) para encontrar o problema. See undefined [Making trace files], page un-
defined .
      e                                                    co                           ca
Se vocˆ estiver utilizando tabelas InnoDB, procure pelas op¸˜es especificas de inicializa¸˜o
do InnoDB. See undefined [InnoDB start], page undefined .
       e                                              e
Se vocˆ estiver usando tabelas BDB (Berkeley DB), vocˆ deve se familiarizar com as difer-
         co                          ca
entes op¸˜es especificas de inicializa¸˜o do BDB. undefined [BDB start], page undefined .

2.4.3 Inicializando e parando o MySQL automaticamente.
Os scripts mysql.server e safe_mysqld podem ser usados para iniciar o servidor automati-
                     ca                               e
camente na inicializa¸˜o do sistema. mysql.server tamb´m pode ser usado para parar o
servidor.
O script mysql.server pode ser usado para inicializar ou parar o servidor utilizando-o com
os argumentos start ou stop:
      shell> mysql.server start
      shell> mysql.server stop
                                         o                             o              ca
mysql.server pode ser encontrado no diret´rio ‘share/mysql’ sob o diret´rio de instala¸˜o
                    o                          a
do MySQL ou no diret´rio ‘support-files’ da ´rvore fonte do MySQL.
                                                              o              ca
Antes do mysql.server iniciar o servidor, ele vai para o diret´rio de instala¸˜o do MySQL,
     a                             e
e ent˜o chama o safe_mysqld. Vocˆ pode precisar editar o mysql.server se tiver uma dis-
      ca     a                            a       a
tribui¸˜o bin´ria instalada em um local n˜o-padr˜o. Modifique-o para chamar o diret´rio o
                                                           e
(cd) apropriado antes de executar o safe_mysql. Se vocˆ deseja que o servidor seja ex-
ecutado com um usu´rio espec´
                      a        ifico, adicione uma linha user apropriada para o arquivo
                         a                              ca
‘/etc/my.cnf’, como ser´ visto posteriormente nesta se¸˜o.
                                                                          e
mysql.server stop desliga o servidor MySQL enviando um sinal para ele. Vocˆ pode
desligar o servidor manualmente executando mysqladmin shutdown.
    e
Vocˆ pode querer adicionar esses comandos start e stop nos lugares apropriados de seus
                                  e      c                               co       ca
arquivos ‘/etc/rc.*’ quando vocˆ come¸ar a usar o MySQL para aplica¸˜es de produ¸˜o.
                   e                                                        a
Perceba que se vocˆ modifica mysql.server, e atualizar seu MySQL, sua vers˜o modificada
   a                          e                 o               a
ser´ sobrescrita, portanto vocˆ deve criar uma c´pia de sua vers˜o editada.
                                                                       e
Se o seu sistema usa ‘/etc/rc.local’ para iniciar scripts externos, vocˆ deve adicionar o
seguinte a ele:
      /bin/sh -c ’cd /usr/local/mysql ; ./bin/safe_mysqld --user=mysql &’
    e      e                       co
Vocˆ tamb´m pode adicionar op¸˜es para mysql.server em um arquivo global
‘/etc/my.cnf’. Um t´
                   ipico arquivo ‘/etc/my.cnf’ pode parecer com isto:
      [mysqld]
      datadir=/usr/local/mysql/var
      socket=/var/tmp/mysql.sock
      port=3306
      user=mysql
114                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52




      [mysql.server]
      basedir=/usr/local/mysql
                                             co
O script mysql.server entende as seguintes op¸˜es: datadir, basedir e pid-file.
                                           co                            ca e
A seguinte tabela mostra quais grupos de op¸˜es cada script de inicializa¸˜o lˆ dos arquivos
     co
de op¸˜es:
Script                          co
                    Grupos de op¸˜es
mysqld              mysqld e server
mysql.server        mysql.server, mysqld e server
safe_mysqld         mysql.server, mysqld e server
See undefined [Option files], page undefined .


2.5 Atualizando/Desatualizando o MySQL
    e
Vocˆ sempre pode mover os arquivos de formato e de dados do MySQL entre diferentes
    o                                       e        a                          a
vers˜es na mesma arquitetura enquanto vocˆ tiver vers˜o base do MySQL. A vers˜o base
        e         e
atual ´ 3. Se vocˆ alterar o conjunto de caracteres quando executar o MySQL (o que
      e                                    ca     e
tamb´m pode alterar a ordem de classifica¸˜o), vocˆ deve executar myisamchk -r -q em
todas tabelas. De outra forma seus ´              a
                                   indices podem n˜o ser corretamente ordenados.
       e                        o       e
Se vocˆ tem receio de novas vers˜es, vocˆ sempre pode renomear seu antigo mysqld para
                    u             a
algo como mysqld-’n´mero-da-vers˜o-antiga’. Se o seu novo mysqld comportar de maneira
               e
inesperada, vocˆ simplesmente pode desliga-lo e reiniciar com seu antigo mysqld!
                        ca     c
Quando fizer uma atualiza¸˜o, fa¸a backup de seus bancos de dados antigos.
                           ca     e
Se depois de uma atualiza¸˜o, vocˆ tiver problemas com programas clientes recompilados
                                                                e
como Commands out of sync ou “core dumps” inexperados, vocˆ provavelmente usou um
               c                                       ca
arquivo de cabe¸alho ou de biblioteca antigo na compila¸˜o de seus programas. Neste caso
   e
vocˆ deve conferir a data de seu arquivo ‘mysql.h’ e da biblioteca ‘libmysqlclient.a’
                        a                   ca              a
para verificar que eles s˜o da nova distribui¸˜o MySQL. Se n˜o, por favor, recompile seus
programas!
       e                                  ca                                     e a
Se vocˆ tiver problemas com a inicializa¸˜o do novo servidor mysqld ou caso vocˆ n˜o
                                                                  e
consiga conectar sem uma senha, confira se o seu arquvo ‘my.cnf’ ´ o mesmo da antiga
       ca        e
instala¸˜o! Vocˆ pode conferir com isto: nome-programa --print-defaults. Se isto n˜oa
produzir outra sa´ al´m do nome do programa, vocˆ tem um arquivo my.cnf ativo que
                   ida e                              e
   a
est´ afetando o funcionamento do programa!
´ uma boa id´ia reconstruir e reinstalar a distribui¸˜o Msql-Mysql-modules sempre que
E              e                                    ca
                       a                                   e
instalar uma nova vers˜o do MySQL, particularmente se vocˆ perceber sintomas tais como
todos os scripts DBI falharem depois de atualizar o MySQL.

                         a
2.5.1 Atualizando da vers˜o 3.22 para 3.23
      a
A Vers˜o 3.23 do MySQL suporta tabelas do novo tipo MyISAM e do antigo tipo ISAM. Vocˆ  e
 a                                                  a               a                 a
n˜o necessita converter suas antigas tabelas para us´-las com a vers˜o 3.23. Por padr˜o,
                       a                                                e
todas novas tabelas ser˜o criadas usando o tipo MyISAM (a menos que vocˆ inicie o mysqld
        ca                                       e
com a op¸˜o --default-table-type=isam). Vocˆ pode alterar uma tabela ISAM para uma
                  ca
Chapter 2: Instala¸˜o do MySQL                                                          115



tabela MyISAM com ALTER TABLE nome_tabela TYPE=MyISAM ou com o script Perl mysql_
convert_table_format.
                 o                  a
Os clientes vers˜es 3.22 e 3.21 ir˜o trabalhar sem quaisquer problemas com um servidor
    a
vers˜o 3.23.
                                      e                                          a
As seguintes listas dizem o que vocˆ deve conferir quando atualizar para a vers˜o 3.23:
  • Todas tabelas que usam o conjunto de caracteres tis620 devem ser corrigidos com
    myisamchk -r ou REPAIR TABLE.
  • Se vocˆ fizer um DROP DATABASE em um banco de dados ligado simbolicamente, a liga¸˜o
           e                                                                             ca
                                      a                 a
    e o banco de dados original ser˜o apagados. (Isto n˜o acontece na 3.22 porque ele n˜o a
    detecta a chamada de sistema readlink).
  • OPTIMIZE TABLE agora funciona somente para tabelas MyISAM. Para outros tipos de
                  e
    tabelas, vocˆ pode usar ALTER TABLE para otimizar a tabela. Durante o OPTIMIZE
                       e
    TABLE a tabela ´, agora, bloqueada para outras threads.
  • O cliente MySQL mysql ´, agora, inicializado por padr˜o com a op¸˜o --no-named-
                                e                            a             ca
                                 ca
    commands (-g). Esta op¸˜o pode ser desabilitada com --enable-named-commands
    (-G). Isto pode causar problemas de imcompatibilidade em alguns casos, por exemplo,
    em scripts SQL que usam comandos sem ponto e v´    irgula! Comandos longos continuam
    funcionando.
  • Se vocˆ estiver usando a ordem de classifica¸˜o de caracteres alem~, vocˆ deve reparar
           e                                     ca                     a      e
                                                                      co
    todas suas tabelas com isamchk -r, porque foram feitas altera¸˜es na sua ordem de
             ca
    classifica¸˜o!
  • O tipo padr˜o de retorno de IF ir´ agora depender de ambos argumentos e n˜o apenas
                 a                      a                                          a
    do primeiro argumento.
  • AUTO_INCREMENT n˜o ir´ funcionar com n´meros negativos. A raz˜o para isto ´ que
                           a  a                 u                         a            e
      u
    n´meros negativos causaram problemas quando o -1 passa para 0. AUTO_INCREMENT ´,       e
    agora, tratado em um n´ mais baixo para tabelas MyISAM e ´ muito mais r´pido
                               ivel                                     e             a
                                            u                   e    a a
    que antes. Para tabelas MyISAM n´meros antigos tamb´m n˜o s˜o mais reusados,
                    e
    mesmo se vocˆ apagar algumas linhas da tabela.
  • CASE, DELAYED, ELSE, END, FULLTEXT, INNER, RIGHT, THEN e WHEN agora s˜o palavras
                                                                                 a
    reservadas.
  • FLOAT(X) agora ´ um tipo de ponto flutuante verdadeiro e n˜o um valor com um
                         e                                            a
      u
    n´mero fixo de decimais.
  • Quando estiver declarando DECIMAL(tamanho,dec o argumento tamanho n˜o inclui    a
    mais um lugar para o s´  imbolo do ponto decimal.
  • Uma string TIME agora deve estar em um dos seguintes formatos: [[[DAYS]
    [H]H:]MM:]SS[.fraction] ou [[[[[H]H]H]H]MM]SS[.fraction]
  • LIKE agora compara strings usando as mesmas regras de compara¸˜o de caracteres de
                                                                        ca
                  e                                      e
    ’=’. Se vocˆ precisa do antigo compartamento, vocˆ pdoe compilar o MySQL com a
       ca
    op¸˜o CXXFLGAS=-DLIKE_CMP_TOUPPER.
  • REGEXP agora ´ caso insensitivo para strings normais (n˜o bin´rias).
                     e                                       a     a
  • Quando for necess´rio dar manuten¸˜o/reparar tabelas deve ser usado CHECK TABLE ou
                          a               ca
    myisamchk para tabelas MyISAM (.MYI) e isamchk para tabelas ISAM (.ISM).
  • Se desejar que os arquivos mysqldump sejam compat´                        o
                                                          iveis entre as vers˜es 3.22 e 3.23
                    a                        co
    do MySQL, n˜o deve ser usados as op¸˜es --opt ou --full com o mysqldump.
116                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • Confira todas suas chamadas ` DATE_FORMAT() para ter certeza que exista um ‘%’ antes
                                a
                                      o
   de cada caractere formatador. (Vers˜es mais antigas que o MySQL 3.22 aceitaivam esta
   sintaxe.)
 • mysql_fetch_fields_direct agora ´ uma fun¸˜o (era uma macro) e ela retorna um
                                        e         ca
   ponteiro para um MYSQL_FIELD no lugar de um MYSQL_FIELD.
 • mysql_num_fields() n˜o pode mais ser usada em um objeto MYSQL* (agora ´ uma
                          a                                                        e
       ca
   fun¸˜o que obtem MYSQL_RES* como um argumento. Agora deve ser usado mysql_
   field_count().
 • No MySQL Vers˜o 3.22, a sa´ de SELECT DISTINCT ... era na maioria das vezes
                    a            ida
   ordenada. Na Vers˜o 3.23, vocˆ deve usar GROUP BY ou ORDER BY para obter a sa´
                       a          e                                                     ida
   ordenada.
 • SUM() agora retorna NULL, em vez de 0 se n˜o existir registros coincidentes. Isto ´ de
                                               a                                      e
   acordo com o ANSI SQL.
 • Um AND ou OR com valores NULL agora retornam NULL no lugar de 0. Isto afetar´, ema
                                                           a
   grande parte, pesquisas que usam NOT em uma express˜o AND/OR como NOT NULL =
                               a
   NULL. LPAD() e RPAD reduzir˜o a string resultante se ela for maior que o tamanho do
   argumento.

                         a
2.5.2 Atualizando da vers˜o 3.21 para 3.22
                                                             a                 ´
Nada que afetaria a compatibilidade foi alterada entre a vers˜o 3.21 e 3.22. A unica difi-
        e                        a                                        a
culdade ´ que novas tabelas que s˜o criadas com colunas do tipo DATE usar˜o a nova forma
                         e a                                                 a
de armazenar a data. Vocˆ n˜o pode acessar esses novos campos com uma vers˜o antiga de
mysqld.
                               a           e
Depois de instalar o MySQL vers˜o 3.22, vocˆ deve iniciar o novo servidor e depois execu-
                                                          a                e
tar o script mysql_fix_privilege_tables. Isto adicionar´ os novos privil´gios que vocˆ  e
        a                                     e
precisar´ para usar o comando GRANT. Se vocˆ se esquecer disto, sera retornado o erro
                          e
Access denied quando vocˆ tentar usar ALTER TABLE, CREATE INDEX ou DROP INDEX. Se o
        a                                          e             e
seu usu´rio root do MySQL necessita uma senha, vocˆ deve fornecˆla como um argumento
para o mysql_fix_privilege_tables.
                                                                      e
A interface API C para mysql_real_connect() foi alterada. Se vocˆ tem um programa
                                 ca      e
cliente antigo que chama essa fun¸˜o, vocˆ deve colocar um 0 para o novo argumento db (ou
                                                          o         a          e      e
recodificar o cliente para enviar o elemento db para conex˜es mais r´pidas). Vocˆ tamb´m
deve chamar mysql_init() antes de chamar mysql_real_connect()! Esta altera¸˜o foi ca
                    a         ca                             co
feita para permitir ` nova fun¸˜o mysql_options() salvar op¸˜es na estrutura do manipu-
lador do MYSQL.
      a                                                                    e
A vari´vel key_buffer do mysqld mudou de nome para key_buffer_size, mas vocˆ ainda
                                                       ca
pode usar o antigo nome nos seus arquivos de inicializa¸˜o.

                         a
2.5.3 Atualizando da vers˜o 3.20 para 3.21
      e                               a                     a
Se vocˆ estiver executando uma vers˜o mais antiga que a Vers˜o 3.20.28 e deseja mudar
           a          e
para a vers˜o 3.21 vocˆ deve fazer o seguinte:
                              a
Inicie o servidor mysqld vers˜o 3.21 com safe_mysqld --old-protocol para us´-lo com a
                         ca         a                             ca
clientes de uma distribui¸˜o da vers˜o 3.20 Neste caso, a nova fun¸˜o cliente mysql_errno()
                  ca
Chapter 2: Instala¸˜o do MySQL                                                         117



 a a
n˜o ir´ retornar erro do servidor, somente CR_UNKNOWN_ERROR (mas isto funciona para erros
                                                   ca                         ca         e
de clientes) e o servidor usa a forma antiga da fun¸˜o password() para verifica¸˜o, ao inv´s
da nova.
       e ˜                         ca                                   e        a
Se vocˆ NAO estiver usando a op¸˜o --old-protocol para mysqld, vocˆ precisar´ fazer as
              co
seguir altera¸˜es:
  • Todo o c´digo cliente deve ser recompilado. Se vocˆ usa o ODBC, deve obter o novo
               o                                          e
     driver MyODBC 2.x.
  • O script scripts/add_long_password deve ser executado para converter o campo
     Password na tabela mysql.user para CHAR(16).
  • Todas as senhas devem ser reatribuidas na tabela mysql.user (para obter 62-bits no
     lugar de senhas 31-bits).
  • O formato das tabelas n˜o foi alterado, ent˜o n˜o ´ preciso converter nenhuma tabela.
                               a                  a a e
       a
A vers˜o do MySQL 3.20.28 e superiores podem manipular o novo formato da tabela de
                                         e             a
usu´rios sem afetar os clientes. Se vocˆ tem uma vers˜o do MySQL mais nova que 3.20.28,
    a
         a a                           e                                          c
senhas n˜o ir˜o mais funcionar se vocˆ converter a tabela de usuaios. Por seguran¸a, vocˆ e
                                   ca            a                            a
primeiro deve fazer uma atualiza¸˜o para a vers˜o 3.20.28, pelo menos, e ent˜o atualizar
            a
para a vers˜o 3.21.
          o
O novo c´digo cliente trabalha com um servidor mysqld 3.20.x, portanto se houver proble-
                     e
mas com 3.21.x vocˆ deve usar o antigo servidor 3.20.x sem a necessidade de recompilar os
clientes novamente.
       e a     a              ca                                                  a
Se vocˆ n˜o est´ usando a op¸˜o --old-protocol para o mysqld, antigos clientes ir˜o emitr
a seguinte mensagem de erro:
       ERROR: Protocol mismatch. Server Version = 10 Client Version = 9
                                         e
A nova interface PERL DBI/DBD tamb´m suporta a antiga interface mysqlperl. A unica   ´
      ca                           e                 e                                 ca
altera¸˜o que deve ser feita se vocˆ usa o mysqlperl ´ alterar os argumentos para a fun¸˜o
                                      a
connect(). Os novos argumentos s˜o: host, database, user, password (os argumentos
user e password foram alterados de lugar). See undefined [Perl DBI Class], page unde-
fined .
                    co                                            co
As seguintes altera¸˜es podem afetar consultas em antigas aplica¸˜es:
  • HAVING deve ser especificada antes de qualquer cl´usula ORDER BY.
                                                      a
  • Os parˆmetros para LOCATE() foram trocados.
            a
  • Agora existem algumas palavras reservadasi novas. As mais not´veis s˜o DATE TIME e
                                                                      a    a
     TIMESTAMP.

2.5.4 Atualizando para outra arquitetura
       e                               a           e
Se vocˆ estiver usando o MySQL Vers˜o 3.23, vocˆ pode copiar os arquivos .frm, .MYI e
.MYD entre diferentes arquiteturas que suportem o mesmo formato de ponto flutuante. (O
MySQL cuida de cada detalhe de troca de bytes.)
Os arquivos ISAM de dados e ´                                              a
                              indices (‘*.ISD’ e ‘*.ISM’ respectivamente) s˜o dependentes
                                                                                  e
da arquitetura e em alguns casos dependentees do Sistema Operacional. Se vocˆ deseja
                  co                 a
mover suas aplica¸˜es para outra m´quina que tem uma arquitetura ou SO diferentes da
      a                e a
sua m´quina atual, vocˆ n˜o deve tentar mover um banco de dados simplesmente copiando
                           a
os arquivos para a outra m´quina. Use o mysqldump.
118                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



          a                 a                                co             e        a
Por padr˜o, o mysqldump ir´ criar um arquivo cheio de declara¸˜es SQL. Vocˆ pode ent˜o
                                   a               a
transferir o arquivo para a outra m´quina e aliment´-la como uma entrada para o cliente
mysql.
Utilize mysqldump --help para ver quais op¸˜es est˜o dispon´
                                           co      a                     e    a
                                                            iveis. Se vocˆ est´ movendo
                        a                           e
os dados para uma vers˜o mais nova do MySQL, vocˆ deve usar mysqldump --opt com a
          a                           a
nova vers˜o para obter uma descarga r´pida e compacta.
        a          a           a
A mais f´cil (mas n˜o a mais r´pida) forma para mover um banco de dados entre duas
  a       e                                   a
m´quinas ´ executar os seguintes comandos na m´quina em que o banco de dados se en-
contra:
      shell> mysqladmin -h ’nome da outra maquina’ create nome_bd
      shell> mysqldump --opt nome_bd \
               | mysql -h ’nome da outra maquina’ nome_bd
      e                                        a
Se vocˆ deseja copiar um banco de dados de um m´quina remota sobre uma rede lenta,
pode ser usado:
     shell> mysqladmin create nome_bd
     shell> mysqldump -h ’nome de outra maquina’ --opt --compress nome_bd \
                | mysql nome_bd
                       e
O resultado pode tamb´m ser armazenado em um arquivo, depois transfira o arquivo para a
 a                                                                     e
m´quina destino e carregue o arquivo no banco de dados. Por exemplo vocˆ pode descarregar
                                          a
um banco de dados para um arquivo na m´quina origem desta forma:
      shell> mysqldump --quick nome_bd | gzip > nome_bd.contents.gz
                                   a                                                  u
(O arquivo criado neste exemplo est´ compactado.) Transfria o arquivo contendo o conte´do
                            a
do banco de dados para a m´quina destino e execute estes comandos:
      shell> mysqladmin create nome_bd
      shell> gunzip < nome_bd.contents.gz | mysql nome_bd
     e                                                                   e
Tamb´m pode ser usado mysqldump e mysqlimport para ajudar na transferˆncia do banco de
                                   e             a
dados. Para grandes tabelas, isto ´ muito mais r´pido do que usar simplesmente mysqldump.
                                                                       o          e
Nos comandos abaixo, DUMPDIR representa o caminho completo do diret´rio que vocˆ utiliza
                     ´ de mysqldump.
para armazenar a saida
Primeiro, crie o diret´rio para os arquivos de sa´ e descarregue o banco de dados:
                      o                          ida
      shell> mkdir DUMPDIR
      shell> mysqldump --tab=DUMPDIR nome_bd
                                   o                            o
Depois transfira os arquivo no diret´rio DUMPDIR para algum diret´rio correspondente na
 a
m´quina destino e carregue os arquivos no MySQL assim:
     shell> mysqladmin create nome_bd                  # cria o banco de dados
     shell> cat DUMPDIR/*.sql | mysql nome_bd          # cria tabelas no banco de dados
     shell> mysqlimport nome_bd DUMPDIR/*.txt          # carrega dados nas tabelas
  a          c                                         e         e
N˜o se esque¸a de copiar o banco de dados mysql tamb´m, porque ´ nele que as tabelas
          o                      a                   e
de permiss˜es (user, db e host) s˜o armazenadas. Vocˆ pode ter que executar comandos
           a                              a        e        e
como o usu´rio root do MySQL na nova m´quina at´ que vocˆ tenha o banco de dados
mysql no lugar.
                                                           a
Depois de importar o banco de dados mysql para a nova m´quina, execute mysqladmin
                                                          co                         o
flush-privileges para que o servidor recarregue as informa¸˜es das tabelas de permiss˜es.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                            119



2.6 Notas espec´
               ificas para os Sistemas Operacionais

                                o
2.6.1 Notas Linux (Todas as vers˜es)
                                                                      ca
As notas abaixo a respeito da glibc aplicam-se somente na situa¸˜o quando o MySQL ´          e
                     e                  e   a                                 a
construido por vocˆ mesmo. Se vocˆ est´ executando Linux em uma m´quina x86, na
                  e                         e               a       o                   a
maioria dos casos ´ muito melhor para vocˆ usar nosso bin´rio. N´s ligamos nossos bin´rios
                   a                                                      co
com a melhor vers˜o alterada da glibc, podemos escolher as melhores op¸˜es do compilador,
                            a
em uma tentativa de torn´-la funcional para um servidor muito exigido. Portanto se vocˆ      e
                           a       u
ler o texto abaixo, e est´ em d´vida sobre o que deve fazer, tente usar o nosso bin´rio  a
primeiro para ver se ele preenche suas necessidades, e preocupe-se com uma constru¸˜o     ca
   o                   e                        a      a e                           e
pr´pria apenas se vocˆ descobrir que nosso bin´rio n˜o ´ bom o suficiente para vocˆ. Neste
caso, ir´                                        ca
        iamos apreciar se fosse feito uma observa¸˜o sobre isto, para que possamos fazer uma
            a     a           o                       a
melhor vers˜o bin´ris da pr´xima vez. Para um usu´rio comum, mesmo para configura¸˜es     co
       a          o
com v´rias conex˜es concorrentes e/ou tabelas excedendo o limite de 2 GB, nosso bin´rio  a
e
´, na maioria das vezes, a melhor escolha.
                                              e              a               a
O MySQL usa LinuxThreads no Linux. Se vocˆ usa uma vers˜o do Linux que n˜o tenha
             e                                                                 e
a glibc2, vocˆ deve instalar LinuxThreads antes de tentar compilar o MySQL. Vocˆ pode
obter o LinuxThreads em http://www.mysql.com/Downloads/Linux.
NOTA: Temos visto alguns problemas estranhos com o Linux 2.2.14 e MySQL em sistemas
            e                                              ca
SMP; Se vocˆ tem um sistema SMP, recomendamos a atualiza¸˜o para o Linux 2.4! Seu
            a       a               a
sistema ficar´ mais r´pido e mais est´vel fazendo isto!
                   o                                 a     a
Perceba que as vers˜es da glibc iguais ou anteriores ` Vers˜o 2.1.1 tem um bug fatal
                                                 e
no tratamento do pthread_mutex_timedwait, que ´ usado quando for feito um INSERT
                         a
DELAYED. Recomendamos n˜o usar INSERT DELAYED antes de atualizar a glibc.
       e                                 o         a         a     a
Se vocˆ planeja ter mais de 1000 conex˜es simultˆneas, ser´ necess´rio fazer algumas
      co
altera¸˜es na LinuxThreads, recompile-a e religue o MySQL ao novo ‘libpthread.a’.
Aumente PTHREAD_THREADS_MAX em ‘sysdeps/unix/sysv/linux/bits/local_lim.h’
para 4096 e abaixe o STACK_SIZE no ‘linuxthreads/internals.h’ para 256KB. Os
           a           a                                    a   a    a
caminhos s˜o relativos ` raiz da glibc. Note que o MySQL n˜o ser´ est´vel com cerca de
              o                                      a
600-1000 conex˜es se o valor de STACK_SIZE for o padr˜o de 2MB.
      e                                             a                 a
Se vocˆ tiver um problema com o MySQL, no qual ele n˜o consiga abrir v´rios arquivos ou
     o                    e a                                                 u
conex˜es, pode ser que vocˆ n˜o tenha configurado o Linux para lidar com o n´mero de
arquivos suficiente.
                               e                                   ca
No Linux 2.2 e posteriores, vocˆ pode conferir o valor para a aloca¸˜o dos arquivos fazendo:
      cat /proc/sys/fs/file-max
      cat /proc/sys/fs/dquot-max
      cat /proc/sys/fs/super-max
      e                          o
Se vocˆ possui mais de 16M de mem´ria, deve ser adicionado o seguinte no seu script de
boot (‘/etc/rc/boot.local’ no SuSE):
      echo 65536 > /proc/sys/fs/file-max
      echo 8192 > /proc/sys/fs/dquot-max
      echo 1024 > /proc/sys/fs/super-max
120                                              e      e                       a
                                            Referˆncia t´cnica para o MySQL vers˜o 3.23.52



     e        e
Vocˆ tamb´m pode executar os comandos acima da linha de comando como root, mas
                                     a                          o
neste caso, os antigos limites voltar˜o a ser usados na pr´xima vez que o computador for
reiniciado.
              e
Deve tamb´m ser adicionado ao /etc/my.cnf:
        [safe_mysqld]
        open-files-limit=8192
         a                                             e               o
Os parˆmetros acima permitem o MySQL criar at´ 8192 conex˜es + arquivos.
                                                                  c
A constante STACK_SIZE na LinuxThreads controla o espa¸amento das pilhas threads no
      c            c
espa¸o de endere¸amento. Ela necessita ser grande o bastante para que tenha espa¸o o        c
suficiente para a pilha de cada thread, mas pequena o bastante para manter a pilha de al-
                                                                                   ca
guma thread executando dos dados globais mysqld. Infelizmente, a implementa¸˜o Linux de
                                        e        a                           a a
mmap(), como descobrimos em experiˆncias, ir´ desmapear uma regi˜o j´ mapeada se vocˆ           e
                                         c a
solicitar o mapeamento de um endere¸o j´ em uso, zerando os dados de toda a p´gina ao   a
    e                                                c
inv´s de retoernar. um erro. Portanto a seguran¸a do mysqld ou qualquer outra aplica¸˜o      ca
                                                                    o
baseada em threads depende do comportamento gentil do c´digo que cria as threads. O
    a                                                       u
usu´rio deve tomar medidas para certirficar-se que o n´mero de threads em funcionamento
em qualquer hora seja suficientemente baixo para que as pilhas das threads permane¸am        c
                                            e             c
longe do monte global. Com mysqld vocˆ deve refor¸ar este comportamento "gentil" con-
                         a                a
figurando um valor razo´vel para a vari´vel max_connections.
        e                                 a                   o
Se vocˆ mesmo construiu o MySQL e n˜o deseja confus˜es corrigindo LinuxThreads, vocˆ            e
                                                        a
deve configurar max_connections para um valor m´ximo de 500. Ele ainda deve ser menor
        e
se vocˆ tiver uma chave grande para o buffer, grandes tabelas heap, ou outras coisas que
                                    o                e
fazem o mysqld alocar muita mem´ria ou se vocˆ estiver executando um kernel 2.2 com o
                       e                             a                     a
patch de 2GB. Se vocˆ estiver usando nosso bin´rio ou RPM vers˜o 3.23.25 ou posterior,
    e
vocˆ pode seguramente configurar max_connections para 1500, assumindo que n˜o h´           a    a
uma grande chave de buffer ou tabelas heap com grande quantidade de dados. Quanto
            e                                                            e
mais vocˆ reduz STACK_SIZE em LinuxThreads mais threads vocˆ pode criar seguramente.
Recomendamos os valores entre 128K e 256K.
         e      a          o          a          e
Se vocˆ usa v´rias conex˜es simultˆneas, vocˆ pode sofrer com um "recurso" do kernel
2.2 que penaliza um processo por bifurcar-se ou clonar um filho na tentativa de prevenir
                       ca                                             a
um ataque de separa¸˜o. Isto faz com que o MySQL n˜o consiga fazer uma bom
                             u                            a
escalonamento, quando o n´mero de clientes simultˆneos cresce. Em sistemas com CPU
´                                                        ca
unica, temos visto isto se manifestar em uma cria¸˜o muito lenta das threads, tornando
           a                                                    u
a conex˜o ao MySQL muito lenta. Em sistemas de m´ltiplas CPUs, temos observado
                                                                      u
uma queda gradual na velocidade das consultas quando o n´mero de clientes aumenta.
                                              ca
No processo de tentar encontrar uma solu¸˜o, recebemos um patch do kernel de um de
nossos usu´rios, que alega fazer muita diferen¸a para seu site. O patch est´ dispon´
              a                                    c                               a         ivel
aqui (http://www.mysql.com/Downloads/Patches/linux-fork.patch).                     Atualmente
temos feito testes extensivos deste patch nos sistemas de desenvolvimento e produ¸˜o.       ca
A performance do MySQL obtem uma melhora significativa, sem causar problemas e
                                                    a
atualmente o recomendamos para nossos usu´rios que continuando trabalhando com
servidores muito carregados em kernels 2.2. Este detalhe foi corrigido no kernel 2.4,
                  e a      a
portanto, se vocˆ n˜o est´ satisfeito com a performance atual do seu sistema, melhor do
                                                              a
que aplicar um patch ao seu kernel 2.2, pode ser mais f´cil simplesmente atualizar para o
                 a     e                                                      ca a
2.4, que lhe dar´ tamb´m uma melhora em seu sistemas SMP em adi¸˜o ` corre¸˜o do bug ca
discutido aqui.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                        121



                                                      a
Estamos testando o MySQL no kernel 2.4 em uma m´quina com 2 processadores e desco-
                                                                a  a
brimos que o MySQL escalona muito melhor - virtualmente, n˜o h´ nenhuma perda de
                                            e
desempenho no throughput das consultas at´ cerca de 1000 clientes, e o fator da escala do
                                a                 a
MySQL (computado com a raz˜o do throughput m´ximo para o thoughput de cada cliente.)
foi de 180%. Temos observado resultados similares em sistemas com 4 processadores - vir-
            a a                                      u               e
tualmente n˜o h´ perda de desempenho quando o n´mero de clientes ´ incrementado at´     e
1000 e o fator da escala foi de 300%. Portanto para um servidor SMP muito carregado n´so
                                                o                 e
definitivamente recomendamos o kernel 2.4. N´s descobrimos que ´ essencial executar o
                                                 ´ no kernel 2.4 para obter performance
processo mysqld com a mais alta prioridade possivel
  a
m´xima. Isto pode ser feito adicionando o comando renice -20 $$ ao safe_mysqld. Nos
                         a
nossos testes em uma m´quina com 4 processadores, o aumento da prioridade nos deu 60%
de aumento no throughput com 400 clientes.
                                                   co
Atualmente estamos tentando coletar mais informa¸˜es sobre como o MySQL atua no kernel
                                               e
2.4 em sistemas com 4 e 8 processadores. Se vocˆ tem acesso a um sistema deste porte e tem
feito alguns benchmarks, por favor envie um email para docs@mysql.com com os resultados
- iremos inclu´
              i-los neste manual.
Existe outro detalhe que afeta muito a performance do MySQL, especialmente em sistemas
                                 ca                                       e
multi processados. A implementa¸˜o de mutex em LinuxThreads na glibc-2.1 ´ muito ruim
                        a
para programas com v´rias threads que travam o mutex por um tempo curto. Em um
                                   e
sistema SMP, ironicamente, se vocˆ liga o MySQL com LinuxThreads sem modifica¸˜es,  co
                               a                                e
removendo processadores da m´quina, a performance do MySQL ´ melhorada em alguns
casos. Para corrigir este comportamento, disponibilizamos um patch para glibc 2.1.3, em
linuxthreads-2.1-patch
                                         a          a
Com a glibc-2.2.2, o MySQL vers˜o 3.23.36 ir´ usar o mutex adaptativo, que
e
´ muito melhor,mesmo que o patch na glibc-2.1.3.            Avisamos, entretando, que
                       co          o
sobre algumas condi¸˜es, o c´digo mutex no glibc-2.2.2 overspins, que preju-
                                                               ca
dica a performance do MySQL. A chance desta condi¸˜o pode ser reduzida
mudando a prioridade do processo mysqld para a prioridade mais alta.                o
                                                                                   N´s
tamb´m corrigimos o comportamento overspin com um patch, dispon´
     e                                                                        ivel em
http://www.mysql.com/Downloads/Linux/linuxthreads-2.2.2.patch.here.                Ele
                 ca                  u       a                      c
combina a corre¸˜o do overspin, n´mero m´ximo de threads e espa¸amento das pilhas
        ´                 e          a     a          o
em um unico patch. Vocˆ precisar´ aplic´-lo no diret´rio linuxthreads com patch -p0
</tmp/linuxthreads-2.2.2.patch. Acreditamos que ser´ inclu´ de alguma forma nos
                                                         a      ido
            c                                                 e
futuros lan¸amentos da glibc-2.2. De qualquer forma, se vocˆ ligar com glibc-2.2.2,
          a      a                                                              c
ainda ser´ necess´rio corrigir STACK_SIZE e PTHREAD_THREADS_MAX. Temos esperan¸as que
        o     a                                    a                  co
os padr˜es ser˜o corrigidos para valores mais aceit´veis para configura¸˜es pesadasa do
                       a               ca      a
MySQL no futuro, ent˜o sua constru¸˜o poder´ ser reduzida a ./configure; make; make
install.
                        e                                              a     a
Recomendamos que vocˆ use os patches acima para construir uma vers˜o est´tica especial
                                           co       a
de libpthread.a e use-a somente para liga¸˜es est´ticas com o MySQL. Sabemos que os
         a
patches s˜o seguros para o MySQL e pode melhorar significamente sua performance, mas n˜o a
                                       co          e                   co               a
podemos dizer nada sobre outras aplica¸˜es. Se vocˆ ligar outras aplica¸˜es coma a vers˜o
                                             a                                 a
modificada da biblioteca ou construir uma vers˜o alterada compartilhada e instal´-la no seu
            e      a                                           ca                     co
sistema, vocˆ estar´ fazendo por sua conta e risco e tenha aten¸˜o com outras aplica¸˜es
que dependem de LinuxThreads.
122                                          e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



        e                                                ca
Se vocˆ passar por problemas estranhos durante a instala¸˜o do MySQL ou com travamentos
                  a             e             a             a
de alguns utilit´rios comuns, ´ muito prov´vel que eles s˜o relacionados a problemas de
                                                                 a        a      ca
bibliotecas ou compilador. Se for este o caso, o uso de nosso bin´rio ser´ a solu¸˜o.
                                          ca       a e
Um problema conhecido com a distribui¸˜o bin´ria ´ que com antigos sistemas Linux que
                                                      e       a
usam libc (como o RedHat 4.x ou Slackware), vocˆ obter´ alguns problemas n˜o fatais a
            ca
com resolu¸˜o de nomes. See undefined [Binary notes-Linux], page undefined .
Quando estiver usando LinuxThreads vocˆ ver´ um m´
                                           e     a                e                    ca
                                                       inimo de trˆs processos em execu¸˜o.
         a                           a
Estes s˜o de fato, threads. Existir´ uma thread para o gerenciador LinuxThreads, uma
                             o
thread para lidar com conex˜es e uma thread para tartar de alarmes e sinais.
                                                                          a
Perceba que o kernel Linux e a biblioteca LinuxThread pode por padr˜o ter apenas 1024
                               e             e           o
threads. Isto significa que vocˆ pode ter at´ 1021 conex˜es ao MySQL em um sistema sem
      ca        a                                                     e
corre¸˜o. A p´gina http://www.volano.com/linuxnotes.html cont´m informa¸˜es sobre co
como contornar este limite.
        e
Se vocˆ ver um processo mysqld daemon finalizado com ps, isto normalmente significa que
    e
vocˆ encontrou um bug no MySQL ou que tenha uma tabela corrompida. See undefined
[Crashing], page undefined .
Para obter um descarga do core no Linux se o mysqld finalizar com um sinal SIGSEGV, vocˆ   e
                                 ca                                               e
pode iniciar o mysqld com a op¸˜o --core-file. Perceba que provavelmente vocˆ tamb´m    e
          a
precisar´ aumentar o core file size adicionando ulimit -c 1000000 para safe_mysqld
ou iniciar safe_mysqld com --core-file-sizes=1000000, See undefined [safe_mysqld],
page undefined .
        e                      o
Se vocˆ estiver ligando seu pr´prio cliente MySQL e obter o erro:
       ld.so.1: ./my: fatal: libmysqlclient.so.4: open failed: No such file or directory
                  a                                                         e
Quando execut´-los, o problema pode ser evitado com um dos seguintes m´todos:
  • Ligue o cliente com a seguinte op¸˜o (no lugar de -Lpath): -Wl,r/path-
                                               ca
      libmysqlclient.so.
  • Copie libmysqclient.so para ‘/usr/lib’.
  • Adicione o caminho do diret´rio onde libmysqlclient.so est´ localizado para a
                                    o                                   a
          a
      vari´vel de ambiente LD_RUN_PATH antes de executar seu cliente.
      e                                                    e    a
Se vocˆ estiver usando o compilador Fujitsu (fcc / FCC) vocˆ ter´ alguns problemas com-
                                             c           a
pilando o MySQL porque os arquivos de cabe¸alho Linux s˜o muito orientados ao gcc.
A seguinte linha configure deve funcionar com fcc/FCC:
      CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE -DCONST=const -DNO_

                                  co      a
2.6.1.1 Notas Linux para distribui¸˜es bin´rias
                                             a
O MySQL necessita pelo menos do Linux vers˜o 2.0
       a     a   e                                         e              a
A vers˜o bin´ria ´ ligada com -static, que significa que vocˆ normalmente n˜o precisa se
                         a                               e          e a
preocupar com qual vers˜o das bibliotecas do sistema vocˆ tem. Vocˆ n˜o precisa insta-
                                                 ca           e
lar LinuxThreads. Um programa ligado com a op¸˜o -static ´ um pouco maior que um
                                       e                   a
programa ligado dinamicamente e tamb´m um pouco mais r´pido (3-5%). Um problema,
            e         e a                co                     a
entretanto, ´ que vocˆ n˜o pode usar fun¸˜es definidas pelo usu´rio (UDF) com um pro-
                                   e                         co             e
grama ligado estaticamente. Se vocˆ for escrever ou usar fun¸˜es UDF (isto ´ algo para
                              e                                    co
programadores C ou C++), vocˆ deve compilar o MySQL, usando liga¸˜es dinamicas.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                          123



      e
Se vocˆ estiver usando um sistema baseado em libc (em vez de um sistema glibc2), vocˆ,e
                    a                           ca                a
provavelmente, ter´ alguns problemas com resolu¸˜o de nomes de m´quinas e getpwnam()
           a      a         e
com a vers˜o bin´ria. (Isto ´ porque o glibc infelizmente depende de algumas bibliotecas
                                   a
externas para resolver nomes de m´quinas e getpwent(), mesmo quando compilado com
                            e                    a
-static). Neste caso, vocˆ provavelmente obter´ a seguinte mensagem de erro quando
executar mysql_install_db:
      Sorry, the host ’xxxx’ could not be looked up
                             e                                ca
ou o seguinte erro quando vocˆ tentar executar mysqld com a op¸˜o --user:
      getpwnam: No such file or directory
   e
Vocˆ pode resolver este problema usando de um dos modos seguintes:
 • Obtenha uma distribui¸˜o fonte do MySQL (uma distribui¸˜o RPM ou tar.gz) e a
                        ca                               ca
   instale.
 • Execute mysql_install_db --force; Isto n˜o executar´ o teste resolveip no mysql_
                                             a           a
                             e       e a         a                 a
   install_db. O lado ruim ´ que vocˆ n˜o poder´ usar nomes de m´quinas nas tabelas
              o      e            u                                                 e
   de permiss˜es; vocˆ deve usar n´meros IP no lugar (exceto para localhost). Se vocˆ
                                                       a                       e
   estiver usando uma release antiga do MySQL que n˜o suporte --force, vocˆ deve
   remover o teste resolveip no mysql_install com um editor.
 • Inicie mysqld com su no lugar de usar --user.
            co      a                                 a                      a
As distribui¸˜es bin´rias Linux-Intel e RPM do MySQL s˜o configuradas para o m´ximo
                    ´       o                                        a         a
de desempenho possivel. N´s sempre tentamos usar o compilador mais r´pido e est´vel
dispon´
      ivel.
Suporte MySQL ao Perl exige Perl Vers˜o 5.004 03 ou mais novo.
                                     a
               o                          e
Em algumas vers˜es 2.2 do kernel Linux,vocˆ pode obter o erro Resource temporarily
                        e      a                o
unavailable quando vocˆ faz v´rias novas conex˜es para um servidor mysqld sobre
TCP/IP.
            e                                                            e
O problema ´ que o Linux tem um atraso entre o momento em que vocˆ fecha um socket
          e                                                        o            c
TCP/IP at´ que ele seja realmente liberado pelo sistema. Como s´ existe espa¸o para um
 u                               e a                            e
n´mero finito de slots TCP/IP, vocˆ ir´ obter o erro acima se vocˆ tentar fazer muitas novas
     o                                                          e
conex˜es TCP/IP durante um pequeno tempo, como quando vocˆ executa o benchmark do
MySQL ‘test-connect’ sobre TCP/IP.
 o                                        a                                           a
N´s enviamos emails sobre este problema v´rias vezes para diferentes listas de discuss˜o
Linux mas nunca conseguimos resolver este problema apropriadamente.
   ´           ca                                     e            o
A unica ’corre¸˜o’ conhecida , para este problema ´ usar conex˜es persistentes nos seus
                                e
clientes ou usar sockets, se vocˆ estiver executando o servidor de banco de dados e clientes
             a         o
na mesma m´quina. N´s experamos que o kernel Linux 2.4 corrija este problema no futuro.

2.6.1.2 Notas Linux x86
                       a
O MySQL exige a vers˜o 5.4.12 ou mais nova da libc. Sabe-se que funciona com a libc
              a                                 e
5.4.46. A vers˜o 2.0.6 e posterior da glibc tamb´m deve funcionar. Existem alguns prob-
                                                      e
lemas com os RPMs glibc da RedHat, portanto se vocˆ tiver problemas, confira se existe
                ca
alguma atualiza¸˜o! Sabemos que os RPMs glibc 2.0.7-19 e 2.0.7-29 funcionam.
                    co
Em algumas distribui¸˜es Linux mais antigas, configure pode produzir um erro como este:
124                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



      Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file.
      See the Installation chapter in the Reference Manual.
  c
Fa¸a apenas o que a mensagem de erro diz e adicione um caractere sublinhado para a macro
                                                  a
_P que tem somente um caractere sublinhado e ent˜o tente novamente.
    e
Vocˆ pode obter alguns aviso quando estiver compilando; os mostrados abaixo podem ser
ignorados:
      mysqld.cc -o objs-thread/mysqld.o
      mysqld.cc: In function ‘void init_signals()’:
      mysqld.cc:315: warning: assignment of negative value ‘-1’ to ‘long unsigned int’
      mysqld.cc: In function ‘void * signal_hand(void *)’:
      mysqld.cc:346: warning: assignment of negative value ‘-1’ to ‘long unsigned int’
                                  e
No Debian GNU/Linux, se vocˆ deseja que o MySQL inicie automaticamente quando o
                   c
sistema iniciar, fa¸a o seguinte:
      shell> cp support-files/mysql.server /etc/init.d/mysql.server
      shell> /usr/sbin/update-rc.d mysql.server defaults 99
                                            o                            o
O mysql.server pode ser encontrado no diret´rio ‘share/mysql’ sob o diret´rio de in-
     ca                   o                       a
stala¸˜o MySQL ou no diret´rio ‘support-files’ da ´rvore fonte MySQL.
                                                    ca
Se o mysqld sempre descarregar um core na inicializa¸˜o, o problema pode ser que vocˆe
                                            a                                   c
tenha um antigo ‘/lib/libc.a’. Tente renome´-lo depois remova ‘sql/mysqld’ e fa¸a um
                                                                                  co
novo make install e tente novamente. Este problema foi relatado em algumas instala¸˜es
Slackware.
       e                                                                          a     a
Se vocˆ obter o seguinte erro quando ligar o mysqld, significa que seu ‘libg++.a’ n˜o est´
instalado corretamente:
      /usr/lib/libc.a(putc.o): In function ‘_IO_putc’:
      putc.o(.text+0x0): multiple definition of ‘_IO_putc’
   e
Vocˆ pode evitar o uso de ‘libg++.a’ executando configure desta forma:
     shell> CXX=gcc ./configure

2.6.1.3 Notas Linux SPARC
                       co                     a                       e
Em algumas implementa¸˜es, readdir_r() est´ quebrada. O sintoma ´ que SHOW
DATABASES sempre retorna um conjunto vazio. Isto pode ser corrigido removendo
HAVE_READDIR_R do ‘config.h’ depois de configurar e antes de compilar.
                          a       a                         ca
Para alguns problemas ser´ necess´rio corrigir a sua instala¸˜o Linux. O patch pode ser
encontrado em http://www.mysql.com/Downloads/patches/Linux-sparc-2.0.30.diff.
Este patch ´ para a distribui¸˜o Linux ‘sparclinux-2.0.30.tar.gz’ que est´ dispon´
            e                ca                                             a      ivel
                                 a
em vger.rutgers.edu (Uma vers˜o de Linux que nunca foi fundido com o 2.0.30 oficial).
   e      e                                   a
Vocˆ tamb´m deve instalar LinuxThreads Vers˜o 0.6 ou mais nova.

2.6.1.4 Notas Linux Alpha
               a        e               a                e
O MySQL Vers˜o 3.23.12 ´ a primeira vers˜o do MySQL que ´ testada no Linux-Alpha. Se
   e                                          e                                     a
vocˆ planeja usar o MySQL no Linux-Alpha, vocˆ deve ter certeza que possui esta vers˜o
ou mais nova.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                       125



Temos testado o MySQL no Alpha com nossos pacotes de benchmarks e testes, e ele parece
                                                  a                         e
funcinar muito bem. A principal coisa que ainda n˜o tivemos tempo de testar ´ como as
                               a           a
coisas funcionam com muitos usu´rios simultˆneos.
         o                 a               o     o     a
Quando n´s compilamos o bin´rios MySQL padr˜es, n´s est´vamos usando SuSE 6.4, kernel
2.2.13-SMP, Compilador C Compaq (V6.2-504) e compilador C++ Compaq (V6.3-005) em
       a
uma m´quina Compaq DS20 com um processador Alpha EV6.
   e
Vocˆ pode encontrar os compiladores acima em http://www.support.compaq.com/alpha-tools).
Usando estes compiladores, em vez do gcc, obtemos 9-14 % de melhora na performance
com MySQL.
                               ca                 a
Note que a linha de configura¸˜o otimiza o bin´rio para a CPU atual; isto significa que
   e o                         a          e                                  o      e
vocˆ s´ pode utilizar nosso bin´rio se vocˆ tiver um processador Alpha EV6. N´s tamb´m
compilamos estaticamente para evitar problemas de bibliotecas.
      CC=ccc CFLAGS="-fast" CXX=cxx CXXFLAGS="-fast -noexceptions -nortti" ./configure --p
      e                                              ca                  o
Se vocˆ deseja usar egcs a seguinte linha de configura¸˜o funcionou para n´s:
      CFLAGS="-O3 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fomit-frame-pointer -felide
Alguns problemas conhecidos quando executamos o MySQL no Linux-Alpha:
 • Debugar aplica¸˜es baseadas em threads como o MysQL n˜o ir´ funcionar com gdb
                 co                                     a    a
            e
   4.18. Vocˆ deve fazer download e usar o gdb 5.0!
 • Se vocˆ tentar ligar o mysqld estaticamente quando usar o gcc, a imagem resultante ir´
         e                                                                              a
                                     ´                          ˜ use --with-mysqld-
   descarregar um arquivo core no inicio. Em outras palavras, NAO
   ldflags=-all-static com gcc.

2.6.1.5 Notas Linux PowerPC
O MySQL deve funcionar no MkLinux com o mais novo pacote glibc (testado com glibc
2.0.7).

2.6.1.6 Notas Linux MIPS
                                                          e       a
Para ter o MySQL funcionando no Qube2. (Linux Mips), vocˆ precisar´ das bibliotecas
                                                             e      e
glibc mais novas (Sabemos que glibc-2.0.7.29C2 funciona). Vocˆ tamb´m deve usar o
compilador egcs C++ (egcs-1.0.2-9, gcc 2.95.2 ou mais nova).

2.6.1.7 Notas Linux IA64
                                                                                 ca
Para conseguir compilar o MySQL no Linux Ia64, usamos a seguinte linha de compila¸˜o:
Usando gcc-2.96:
      CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-po
                a                           a
No Ia64 os bin´rios do cliente MySQL est˜o usando bibliotecas compartilhadas. Isto
               e                         ca     a
significa se vocˆ instalar nossa distribui¸˜o bin´rias em algum outro lugar diferente de
                        e
‘/usr/local/mysql’ vocˆ precisa modificar o ‘/etc/ld.so.conf’ ou adicionar o caminho
          o            a                                         a
da o diret´rio onde est´ localizado o ‘libmysqlclient.so’ na vari´vel de ambiente LD_
LIBRARY_PATH.
See undefined [Link errors], page undefined .
126                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



2.6.2 Notas Windows
       ca                    ca                                         ca      e e
Esta se¸˜o descreve a instala¸˜o e uso do MySQL no Windows. Esta informa¸˜o tamb´m ´
                                                       ca
fornecida no arquivo ‘README’ que acompanha a distribui¸˜o MySQL para Windows.

2.6.2.1 Iniciando o MySQL no Win95 / Win98
                                                                            a
O MySQL usa TCP/IP para conectar um cliente a um servidor. (Isto permitir´ que qualquer
  a                                                                         e
m´quina na sua rede se conecte a seu servidor MySQL.) Por causa disto, vocˆ deve instalar
                       a                                  e
o TCP/IP na sua m´quina antes de iniciar o MySQL. Vocˆ pode encontrar TCP/IP no seu
CD-ROM do Windows.
Perceba que se vocˆ estiver usando uma vers˜o antiga do Win95 (por exemplo, OSR2). E
                      e                       a                                         ´
      ´ que vocˆ use um pacote antigo Winsock! Para o MySQL ´ necess´rio o Winsock
preferivel          e                                              e       a
        e
2! Vocˆ pode obter o Winsock mais novo em http://www.microsoft.com. O Win98 tem
                                                            a
a nova biblioteca Winsock 2, portanto o que foi dito acima n˜o se aplica para o Win98.
                                     e
Para iniciar o servidor mysqld, vocˆ deve iniciar uma janela do Prompt do MS-DOS e
digitar:
       C:\> C:\mysql\bin\mysqld
       a
Isto ir´ iniciar o mysqld em segundo plano, sem uma janela.
    e
Vocˆ pode finalizar o servidor MySQL executando:
       C:\> C:\mysql\bin\mysqladmin -u root shutdown
                                   a              ca
Perceba que o Win95 e o Win98 n˜o suporta cria¸˜o de named pipes. No Win95 e Win98,
    e
vocˆ pode usar somente named pipes para se conectar a um servidor MySQL remoto,
                         a                             ´
executando em uma m´quina Windows NT server. (E claro que o servidor MySQL deve
      e                                                                     a a
tamb´m suportar named pipes. Por exemplo, usando mysqld-opt sobre NT n˜o ir´ permitir
       o                   e
conex˜es named pipe. Vocˆ deve usar o mysqld-nt ou mysqld-max-nt.)
                a
Se o mysqld n˜o iniciar, por favor, confira o arquivo ‘\mysql\data\mysql.err’ para ver se
                                                                                  e
o servidor escreveu alguma mensagem que possa indicar a causa do problema. Vocˆ pode
      e                                                                       e
tamb´m tentar iniciar o servidor com mysqld --standalone; Neste caso, vocˆ pode obter
                  ca ´
alguma informa¸˜o util na tela que pode ajudar a resolver o problema.
   ´          ca e
A ultima op¸˜o ´ iniciar o mysqld com --standalone --debug. Neste caso o mysqld ir´     a
                                                                     a
escrever em um arquivo log ‘C:\mysqld.trace’ que deve conter a raz˜o pela qual o mysqld
n˜o inicia. See undefined [Making trace files], page undefined .
 a

2.6.2.2 Iniciando o MySQL no NT / Win2000
     ca                    e
A se¸˜o Win95/Win98 tamb´m se aplica para o MySQL no NT/Win2000 com as seguintes
        c
diferen¸as:
                                                         e
Para ter o MySQL funcionando com TCP/IP no NT, vocˆ deve instalar o service pack 3
(ou mais novo)!
                                                         a     e
Perceba que tudo a seguir que se aplique ao NT, funcionar´ tamb´m para o Win2000!
                                        e                             e
Para NT/Win2000, o nome do servidor ´ mysqld-nt. Normalmente vocˆ deve instalar o
                      c
MySQL como um servi¸o no NT/Win2000:
       C:\> C:\mysql\bin\mysqld-nt --install
ou
                  ca
Chapter 2: Instala¸˜o do MySQL                                                            127



        C:\> C:\mysql\bin\mysqld-max-nt --install
                         e                                  a
(No Windows NT, vocˆ pode instalar qualquer dos bin´rios do servidor como um servi¸o,       c
mas somente os que tem nomes que terminam com -nt.exe fornecem suporte para named
pipes.)
     e                             c
Vocˆ pode iniciar e parar o servi¸o MySQL com estes comandos:
        C:\> NET START mysql
        C:\> NET STOP mysql
                           e a                                 ca
Note que neste caso vocˆ n˜o pode usar qualquer outra op¸˜o para mysqld-nt!
     e           e
Vocˆ pode tamb´m executar mysqld-nt como um programa a parte no NT caso vocˆ precise  e
                                       co            e                            co
iniciar o mysqld-nt com algumas op¸˜es! Se vocˆ inicia o mysqld-nt sem op¸˜es no NT,
                                   o                    c              co       o
mysqld-nt tenta iniciar a ele pr´prio como um servi¸o com as op¸˜es padr˜es do servi¸o.     c
         e                         e         a
Se vocˆ parou o mysqld-nt, vocˆ deve inici´-lo com NET START mysql.
          c e
O servi¸o ´ instalado com o nome MySQL. Uma vez instalado, ele deve ser iniciado usando o
       a
utilit´rio Services Control Manager (SCM) encontrado no Painel de Controle, ou usando o
                                             co     a
comando NET START MySQL. Se algumas op¸˜es s˜o desejadas, elas devem ser especificadas
             a                    ca            a                                  c
como “Parˆmetros de inicializa¸˜o” no utilit´rio SCM antes de iniciar o servi¸o MySQL.
                     ca
Uma vez em execu¸˜o, mysqld-nt pode ser parado usando mysqladmin, ou do utilit´rio         a
                                                       e
SCM ou usando o comando NET STOP MySQL. Se vocˆ utiliza o SCM para parar o mysqld-
nt, existe uma estranha mensagem do SCM sobre mysqld shutdown normally. Quando
    e                         c               a                               a
vocˆ executa como um servi¸o, mysqld-nt n˜o tem acesso ao console e ent˜o as mensagens
  a
n˜o podem ser vistas.
              e
No NT vocˆ pode obter as seguintes mensagens de erro do servi¸o:    c
Permission Denied                                  a
                                Significa que ele n˜o pode encontrar mysqld-nt.exe.
Cannot Register                                           e
                                Significa que o caminho ´ incorreto.
Failed to install service.                           c a      a
                                Significa que o servi¸o j´ est´ instalado ou que o Service Con-
                                                 a
                                trol Manager est´ em mau estado.
         e                                                            c             a
Se vocˆ tiver problemas para instalar mysqld-nt como um servi¸o, tente inici´-lo com o
caminho completo:
        C:\> C:\mysql\bin\mysqld-nt --install
           a                e
Se isto n˜o funcionar, vocˆ pode ter o mysqld-nt iniciando corretamente corrigindo o cam-
inho no registro!
         e a                                            c       e          a
Se vocˆ n˜o deseja iniciar o mysqld-nt como um servi¸o, vocˆ pode inici´-lo como mostrado
abaixo:
        C:\> C:\mysql\bin\mysqld-nt --standalone
ou
        C:\> C:\mysql\bin\mysqld --standalone --debug
Este ultimo exemplo fornece um arquivo para depura¸˜o em ‘C:\mysqld.trace’. See un-
       ´                                                 ca
defined [Making trace files], page undefined .

2.6.2.3 Executando o MySQL no Windows
O MySQL suporta TCP/IP em todas plataformas Windows e named pipes no NT. O padr˜o   a
e                               co
´ usar named pipes para instala¸˜es locais no NT e TCP/IP para todos outros casos se o
                                             a                             e
cliente tiver TCP/IP instalado. O nome da m´quina especifica qual protocolo ´ usado:
128                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



         a
Nome da M´quina              Protocolo
NULL (nenhum)                                                           a
                             No NT, tente o named pipes antes; se isto n˜o funcionar, use
                                                                 e
                             TCP/IP. No Win95/Win98, TCP/IP ´ usado.
.                            Named pipes
localhost                                   a
                             TCP/IP para m´quina atual
hostname                     TCP/IP
   e         c                                                          ca
Vocˆ pode for¸ar um cliente MySQL a usar named pipes especificando a op¸˜o --pipe ou
                               a                   ca
especificando . como o nome da m´quina. Utilize a op¸˜o --socket para especificar o nome
do pipe.
                             a                         o   a
Perceba que a partir da vers˜o 3.23.50, named pipes s´ est˜o habilitados se o mysqld
                     ca                              e                   a
for iniciado com a op¸˜o --enable-named-pipe. Isto ´ porque alguns usu´rios tiveram
problemas desligando o servidor MySQL quando este utilizava named pipes.
   e                           a                 a
Vocˆ pode testar se o MySQL est´ funcionando ou n˜o executando os seguintes comandos:
     C:\> C:\mysql\bin\mysqlshow
     C:\> C:\mysql\bin\mysqlshow -u root mysql
     C:\> C:\mysql\bin\mysqladmin version status proc
     C:\> C:\mysql\bin\mysql test
                a                                  o
Se o mysqld est´ lento para responder a suas conex˜es no Win95/Win98, provavelmente
existe um problema com seu DNS. Neste caso, inicie o mysqld com --skip-name-resolve
                           u                               o                e     e
e use somente localhost e n´meros IP nas tabelas de permiss˜es do MySQL. Vocˆ tamb´m
pode evitar o DNS quando estiver conectando em um servidor MySQL mysqld-nt execu-
tando no NT, utilizando o argumento --pipe para especificar o uso de named pipes. Isto
funcinona para a maioria de clientes MySQL.
                 o
Existem duas vers˜es da ferramenta de linha de comando MySQL:
mysql                                                                               ca
                         Compilado em Windows nativo, que oferece capacidades de edi¸˜o
                         de texto muito limitadas.
mysqlc                   Compilado com o compilador Cygnus GNU, que oferece edi¸˜o  ca
                         readline.
       e
Se vocˆ desejar usar o mysqlc.exe, deve copiar o ‘C:\mysql\lib\cygwinb19.dll’ para o
     o
diret´rio system do seu Windows (‘\windows\system’ ou um lugar parecido).
         e         o               a             a                  e
Os privil´gios padr˜es no Windows d˜o a todos usu´rios locais privil´gios totais para todos
os bancos de dados sem necessidade de especificar uma senha. Para deixar o MySQL mais
            e                                            a
seguro, vocˆ deve configurar uma senha para todos os usu´rio e remover a linha na tabela
mysql.user que tem Host=’localhost’ e User=’’.
    e     e                                      a
Vocˆ tamb´m deve adicionar uma senha para o usu´rio root. O exemplo seguinte inicia
                a      o
removendo o usu´rio anˆnimo que pode ser usando por qualquer um para acessar o banco
                    a                               a
de dados test, e ent˜o configura uma senha para o usu´rio root:
      C:\> C:\mysql\bin\mysql mysql
      mysql> DELETE FROM user WHERE Host=’localhost’ AND User=’’;
      mysql> QUIT
      C:\> C:\mysql\bin\mysqladmin reload
      C:\> C:\mysql\bin\mysqladmin -u root password sua_senha
                                   e                                        e
Depois de configurar a senha, se vocˆ desejar desligar o servidor mysqld, vocˆ pode usar o
seguinte comando:
      C:\> mysqladmin --user=root --password=isua_senha shutdown
                  ca
Chapter 2: Instala¸˜o do MySQL                                                      129



        e                             a                          a
Se vocˆ estiver usando a antiga vers˜o shareware do MySQL vers˜o 3.21 no Windows, o
                   a
comando acima ir´ falhar com um erro: parse error near ’SET OPTION password’. A
corre¸˜o ´ feita atualizando a vers˜o do MySQL, que est´ dispon´ livremente.
      ca e                         a                   a       ivel
             o                          e                               a
Com as vers˜es atuais do MySQL vocˆ pode facilmente adicionar novos usu´rios e alterar
      e
privil´gios com os comandos GRANT e REVOKE. See undefined [GRANT], page undefined .

2.6.2.4 Conectando em um MySQL remoto do Windows com SSH
                                                                    e
Aqui temos notas sobre como conectar a um servidor MySQL atrav´s de uma conex˜o    a
remota e segura usando o SSH (por David Carlson dcarlson@mplcomm.com:
  • Instale um cliente SSH na sua m´quina Windows. Como um usu´rio, o melhor op¸˜o
                                     a                             a              ca
                         e                                                  ca e
    paga que encontrei ´ o SecureCRT da http://www.vandyke.com/. Outra op¸˜o ´ o f-
                                                 e     e
    secure da http://www.f-secure.com/. Vocˆ tamb´m pode encontrar algumas vers˜eso
    livres no Google em http://directory.google.com/Top/Computers/Security/Products_
    and_Tools/Cryptography/SSH/Clients/Windows/.
  • Inicie seu cliente SSH Windows. Configure Host_Name = IP_ou_Nome_servidormysql.
                                                                          a
    Configure userid=seu_userid para logar no seu servidor (provavelmente n˜o o mesmo
                 a
    que seu usu´rio/senha do MySQL.
  • Configure a porta de acesso. E tamb´m fa¸a um acesso remoto (Configure local_
                                          e     c
    port: 3306, remote_host: ip_ou_nomeservidormysql, remote_port: 3306 ) ou um
    acesso local (configure port: 3306, host: localhost, remote port: 3306).
  • Salve tudo, sen˜o vocˆ ter´ que refazer tudo da pr´xima vez.
                     a     e  a                       o
  • Logue ao seu servidor com a sess˜o SSH que acabou de ser criada.
                                     a
  • Na sua m´quina Windows, inicie algumas aplica¸˜es ODBC (como o Access).
               a                                    co
  • Crie um novo arquivo no Windows e ligue ao MySQL usando o driver ODBC da mesma
                    e
    forma que vocˆ normalmente faz, EXCETO pelo fato de digitar localhost para a
       a                            a
    m´quina servidora MySQL — n˜o nomeservidormysql.
   e                         a
Vocˆ agora deve ter uma conex˜o ODBC ao MySQL, criptografada com SSH.

2.6.2.5 Dividindo dados entre diferentes discos no Win32
                         a                                                           ca
A partir do MySQL vers˜o 3.23.16, o mysqld-max e servidores mysql-max-nt na distribui¸˜o
          a                        ca                                      e
MySQL s˜o compilados com a op¸˜o -DUSE_SYMDIR. Isto permite que vocˆ coloque um
                                                                o
banco de dados em discos diferentes adicionando um link simb´lico para ele (em forma
                      o
similar aos links simb´licos no Unix).
                    e                  o
No Windows, vocˆ cria um link simb´lico para um banco de dados criando um arquivo
                                     o                                o
que contem o caminho para o diret´rio de destino e salvando-o no diret´rio ‘mysql_data’
                                                       o      o    a
com o arquivo ‘database.sym’. Note que o link simb´lico s´ ser´ usada se o diret´rioo
                                a
‘mysql_data_dir\database’ n˜o existir.
                           o                         e
Por exemplo, se o diret´rio de dados do MySQL ´ ‘C:\mysql\data’ e vocˆ precisa e
                                                                 e
ter o banco de dados foo localizado em ‘D:\data\foo’, vocˆ deve criar o arquivo
                                     e
‘C:\mysql\data\foo.sym’ que contˆm o texto D:\data\foo\. Depois disto, todas tabelas
                                   a
criadas no banco de dados foo ser˜o criadas no ‘D:\data\foo’.
                                       e
Note que devido a penalidade que vocˆ tem na velocidade quando abre todas as tabelas,
  o a                        ca          a              e
n´s n˜o habilitamos esta op¸˜o por padr˜o, mesmo se vocˆ compilar o MySQL com suporte
130                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                                 o         e
a isto. Para habilitar links simb´licos vocˆ deve colocar no seu arquivo my.cnf ou my.ini
a seguinte entrada:
       [mysqld]
       use-symbolic-links
               o                           o            a      a     e               ca
No MySQL 4.0 n´s habilitaremos links simb´licos por padr˜o. Ent˜o vocˆ deve usar a op¸˜o
                   e                  a
skip-symlink se vocˆ desejar desabilit´-las.

2.6.2.6 Compilando clientes MySQL no Windows
                            e
Em seus arquivos fontes, vocˆ deve incluir ‘windows.h’ antes de incluir ‘mysql.h’:
     #if defined(_WIN32) || defined(_WIN64)
     #include <windows.h>
     #endif
     #include <mysql.h>
    e      e                o                        a                        e
Vocˆ tamb´m pode ligar seu c´digo coma biblioteca dinˆmica ‘libmysq.lib’, que ´ apenas
um wrapper para carregar em ‘libmysql.dll’ sobre demanda, ou ligar com a biblioteca
   a
est´tica ‘mysqlclient.lib’.
                                             a                                           e
Perceba que como as bibliotecas mysqlclient s˜o compiladas como bibliotecas threaded, vocˆ
     e                      o
tamb´m deve compilar seu c´digo para ser multi-threaded!

2.6.2.7 MySQL-windows comparado com o unix MySQL
                                             a             a
O MySQL-Windows tem provado ser muito est´vel. Esta vers˜o do MySQL tem os mesmos
                     a                                           co
recursos que sua vers˜o correspondente Unix com as seguintes exce¸˜es:
Win95 e threads
                                                             o
           O Win95 perde aproximadamente 200 bytes de mem´ria principal para cada
                                    a
           thread criada. Cada conex˜o no MySQL cria uma nova thread, portanto vocˆ  e
            a
           n˜o deve executar o mysqld por um longo tempo no Win95 se seu servidor lida
                 a         o                     a
           com v´rias conex˜es! WinNT e Win98 n˜o sofrem deste bug.
               a
Leituras simultˆneas
            O MySQL depende das chamadas pread() e pwrite() para estar apto a
                                                       o
            misturar INSERT e SELECT. Atualmente n´s usamos mutexes para emular
            pread()/pwrite(). N´s iremos, a longo prazo, trocar o n´
                                   o                                   ivel da interface
                                                                  o
            de arquivos com uma interface virtual para que n´s possamos usar a
            interface readfile()/writefile() no NT para obter mais velocidade. A
                        ca                  u
            implementa¸˜o atual limita o n´mero de arquivos abertos que o MySQL
                                                       e a            a
            pode usar para 1024, o que significa que vocˆ n˜o conseguir´ executar tantas
                           a
            threads simultˆneas no NT como no Unix.
Leitura de blocos
                                                               a
            O MySQL usa uma leitura de blocos para cada conex˜o. Isto significa que:
              • Uma conex˜o n˜o ir´ ser disconectada automaticamente depois de 8 horas,
                          a a a
                                         a
                como acontece com a vers˜o Unix do MySQL.
              • Se uma conex˜o trava, ´ imposs´ a finaliza-la sem matar o MySQL.
                            a         e        ivel
              • mysqladmin kill n˜o ir´ funcionar em uma conex˜o adormecida.
                                  a    a                         a
                  ca
Chapter 2: Instala¸˜o do MySQL                                                      131



             • mysqladmin shutdown n˜o pode abortar enquanto existirem conex˜es
                                    a                                       o
               adormecidas.
           Planejamos corrigir este problema quando nossos desenvolvedores Windows
                                          ca
           tiverem conseguido um boa solu¸˜o.
   co
Fun¸˜es UDF
            e                             a             co                    a
          At´ o momento, o MySQL-Windows n˜o suporta fun¸˜es definidas pelo usu´rio.
DROP DATABASE
              e a                                        a
          Vocˆ n˜o pode remover um banco de dados que est´ em uso por alguma thread.
Matando o MySQL do gerenciador de tarefas
             e a                                                               a
          Vocˆ n˜o pode matar o MySQL do gerenciador de tarefas ou com o utilit´rio
                                e            a
          shutdown no Win95. Vocˆ deve deslig´-lo com mysqladmin shutdown.
Nomes case-insensitivo
                               a
           Nomes de arquivos s˜o caso-insensitivo no Windows, portanto, nomes de ban-
                                      e   a
           cos de dados e tabelas tamb´m s˜o caso insensitivo no MySQL para Windows.
              ´          ca e
           A unica restri¸˜o ´ que os nomes de bancos de dados e tabelas devem usar o
           mesmo caso em uma senten¸a fornecida. See undefined [Name case sensitiv-
                                      c
           ity], page undefined .
                   o
O caracter de diret´rio ‘\’
                                                         a
            Componentes de nomes de caminho no Win95 s˜o separados pelo caracter ‘\’ o
                      e e                                         e
            qual tamb´m ´ o caractere de escape no MySQL. Se vocˆ estiver usando LOAD
                                                         e
            DATA INFILE ou SELECT ... INTO OUTFILE, vocˆ deve dobrar o caractere ‘\’:
                  mysql> LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr;
                  mysql> SELECT * INTO OUTFILE ’C:\\tmp\\skr.txt’ FROM skr;
                            e
            Uma alternativa ´ usar o estilo de nome de arquivos do Unix com caracteres
            ‘/’:
                  mysql> LOAD DATA INFILE "C:/tmp/skr.txt" INTO TABLE skr;
                  mysql> SELECT * INTO OUTFILE ’C:/tmp/skr.txt’ FROM skr;
erro: Can’t open named pipe
                  e                 a
           Se vocˆ utiliza uma vers˜o 3.22 do MySQL no NT com o os clientes MySQL
                          a
           mais novos, ser´ apresentado o seguinte erro:
                  error 2017: can’t open named pipe to host: . pipe...
                                     a
           Isto ocorre porque a vers˜o do MySQL usa named pipes no NT por padr˜o.    a
               e                                   ca
           Vocˆ pode evitar este erro usando a op¸˜o --host=localhost para os novos
                                                       co
           clientes MySQL ou criar um arquivo de op¸˜es ‘c:\my.cnf’ que contenha a
                            ca
           seguinte informa¸˜o:
                  [client]
                  host = localhost
                           a                        a                                  e
           A partir da vers˜o 3.23.50, named pipes s˜o habilitados somente se o mysqld ´
                             ca
           iniciado com a op¸˜o --enable-name-pipe.
Erro Access denied for user
                   e
           Se vocˆ obtem o erro Access denied for user: ’some-user@unknown’ to
                                                                             a
           database ’mysql’ quando acessar um servidor MySQL na mesma m´quina,
                                 a                             a
           signifca que o MySQL n˜o pode resolver seu nome de m´quina corretamente.
132                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                                   e
            Para corrigir isto, vocˆ deve criar um arquivo ‘\windows\hosts’ com a seguinte
                   ca
            informa¸˜o:
                  127.0.0.1            localhost
ALTER TABLE
                        e                           a
          Enquanto vocˆ estiver executando uma cl´usula ALTER TABLE, a tabela ser´  a
                                                          e
          bloqueada para o uso por outras threads. Isto ´ relacionado com o fato de
                               e a                                 a
          que no Windows, vocˆ n˜o pode apagar um arquivo que est´ sendo usado por
          outras threads. (No futuro, iremos encontrar alguma forma de contornar este
          problema.)
                                 a                               a    a
DROP TABLE em uma tabela que est´ em uso por uma tabela MERGE n˜o ir´ funcionar.
           O manipulador MERGE faz seu mapeamento de tabelas escondido do MySQL.
                              a                                  a             e
           Como o Windows n˜o permite apagar arquivos que est˜o abertos, vocˆ deve
           primeiramente descarregar todas tabelas MERGE (com FLUSH TABLES) ou apagar
           a tabela MERGE antes de apagar a tabela. Iremos corrigir isto quando intro-
           duzirmos as VIEWs.
        a
Aqui est˜o alguns assuntos em aberto para qualquer um que queira nos ajudar com a vers˜o a
Windows:
 • Criar um servidor MYSQL.DLL mono-usu´rio. Isto deve incluir tudo de um servidor
                                               a
                  a               ca                         a
    MySQL padr˜o, exceto cria¸˜o de threads. Isto deixar´ o MySQL muito mais f´cil      a
                               co          a
    para ser usado em aplica¸˜es que n˜o necessitam de um verdadeiro cliente/servidor e
     a                                              a
    n˜o necessitam acessar o servidor de outras m´quinas.
                       ´
 • Adicionar alguns icones agrad´veis para o start e shutdown na instala¸˜o do MySQL.
                                    a                                    ca
 • Criar uma ferramenta para gerenciar entradas de registro para as op¸˜es de inicializa¸˜o
                                                                      co                ca
                                                     a   a
    do MySQL. A leitura de entradas no registro j´ est´ codificada em ‘mysqld.cc’, mas
                                                       a                           e
    ela deve ser refeita para ser mais orientada a parˆmetros. A ferramenta tamb´m deve
                                               co                      a
    estar apta para atualizar o arquivo de op¸˜es ‘C:\my.cnf’ se o usu´rio preferir usa-lo
    no lugar do registro.
 • Quando registrar o mysqld como um servi¸o com --install (no NT) seria ´timo se
                                                 c                                o
        e     e                          co      o
    vocˆ tamb´m pudesse adicionar op¸˜es padr˜es na linha de comando. Para o momento,
           ca e              a
    a solu¸˜o ´ listar os parˆmetros no arquivo ‘C:\my.cnf’.
 • Seria muito interessante conseguir matar o mysqld do gerenciador de tarefas. Para o
    momento, deve ser usado o mysqladmin shutdown.
 • Portar o readline para Windows para uso na ferramenta de linha de comando mysql.
 • Vers˜es GUI dos clientes MySQL padr˜es (mysql, mysqlshow, mysqladmin e
         o                                       o
                       o
    mysqldump) seria ´timo.
 • Seria muito bom se as fun¸˜es de leitura e escrita no socket em ‘net.c’ fosse inter-
                                 co
          ´
    rompiveis. Isto tornaria poss´   ivel matar threads abertas com mysqladmin kill no
    Windows.
 • mysqld sempre inicia na localidade "C" e n˜o na padr˜o. Gostariamos de ter o mysqld
                                                 a         a
                      ca                                  ca
    usando a localiza¸˜o atual para a ordem de classifica¸˜o.
 • Implementar fun¸˜es UDF com .DLLs.
                      co
 • Adicionar macros para usar os m´todos mais r´pidos de incremento/decremento de
                                         e             a
    threads seguras fornecidos pelo Windows.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                       133



Outros detalhes espec´                 a
                     ificos do Windows s˜o descritos no arquivo ‘README’ que acompanha
           ca
a distribui¸˜o MySQL-Windows.

2.6.3 Notas Solaris
                e                                                          ca
No Solaris, vocˆ deve ter problemas mesmo antes de descompactar a distribui¸˜o MySQL!
                   a                                                     e
O tar do Solaris n˜o pode tratar grandes nomes de arquivos, portanto vocˆ pode ver um
erro deste tipo quando descompactar o MySQL:
      x mysql-3.22.12-beta/bench/Results/ATIS-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,my
      tar: directory checksum error
               e                                                         ca      e
Neste caso, vocˆ deve usar o GNU tar (gtar) para desempacotar a distribui¸˜o. Vocˆ pode
                 o     e
encontrar uma c´pia pr´-compilada para Solaris em http://www.mysql.com/Downloads/.
                                                                                  a
As threads nativas da Sun funcionam somente no Solaris 2.5 e superior. Para a vers˜o 2.4
                         a
e anteriores, o MySQL ir´ automaticamente usar MIT-pthreads. See undefined [MIT-
pthreads], page undefined .
      e
Se vocˆ obter o seguinte erro de configure:
      checking for restartable system calls... configure: error can not run test
      programs while cross compiling
                                  a                     ca
Isto significa que alguma coisa est´ errada com a instala¸˜o de seu compilador! Neste caso
    e                                            a                 e     e
vocˆ deve atualizar seu compilador para uma vers˜o mais nova. Vocˆ tamb´m pode resolver
este problema inserindo a seguinte linha no arquivo ‘config.cache’:
       ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls=’no’}
      e a                                                         e                  e
Se vocˆ est´ usando Solaris em um SPARC, o compilador recomendado ´ o gcc 2.95.2. Vocˆ
              a                                                                 a a
pode encontr´-lo em http://gcc.gnu.org/. Perceba que egcs 1.1.1 e gcc 2.8.1 n˜o s˜o
   a
est´veis no SPARC!
                                                          e
A linha do configure recomendado quando usando gcc 2.95.2 ´:
      CC=gcc CFLAGS="-O3" \
      CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" \
      ./configure --prefix=/usr/local/mysql --with-low-memory --enable-assembler
      e                           e
Se vocˆ possui um ultra sparc, vocˆ pode obter 4% a mais de performance adicionando
"-mcpu=v8 -Wa,-xarch=v8plusa" para a CFLAGS e CXXFLAGS.
      e                                                                  e
Se vocˆ possui o compilador Sun Workshop (Fortre) 5.3 (ou mais novo), vocˆ pode executar
configure da seguinte forma:
      CC=cc CFLAGS="-Xa -fast -xO4 -native -xstrconst -mt" \
      CXX=CC CXXFLAGS="-noex -xO4 -mt" \
      ./configure --prefix=/usr/local/mysql --enable-assembler
                            o
Nos benchmarks do MySQL, n´s obtemos um aumento de 6% em um Ultrasparc quando
                                                          co
usado o Sun Workshop 5.3 comparado ao uso do gcc com as op¸˜es -mcpu.
      e                                                    e
Se vocˆ tiver um problema com fdatasync ou sched_yield, vocˆ pode corrigir isto adicio-
                                        ca
nando LIBS=-lrt para a linha de configura¸˜o
                 a e
O seguinte paragr´fo ´ relevante somente para compiladores mais antigos que o WorkShop
5.3:
   e     e
Vocˆ tamb´m pode ter que editar o script configure para alterar esta linha:
134                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



      #if !defined(__STDC__) || __STDC__ != 1
para isto:
      #if !defined(__STDC__)
      e                        ca                         a
Se vocˆ ligar __STDC__ com a op¸˜o -Xc, o compilador Sun n˜o pode compilar com o arquivo
        c                                   e
de cabe¸alho ‘pthread.h’ do Solaris. Isto ´ um bug da Sun (compilador corrompido ou
arquivo include corrompido).
                                                                e       a        e
Se o mysqld emitir a mensagem de erro mostrada abaixo quando vocˆ execut´-lo, vocˆ deve
                                                               ca
tentar compilar o MySQL com o compilador Sun sem habilitar a op¸˜o multi-thread (-mt):
      libc internal error: _rmutex_unlock: rmutex not held
Adicione -mt a CFLAGS e CXXFLAGS e tente novamente.
      e
Se vocˆ obter o seguinte erro quando estiver compilando o MySQL com gcc, significa que
         a     a                          a
seu gcc n˜o est´ configurado para sua vers˜o de Solaris:
      shell> gcc -O3 -g -O2 -DDBUG_OFF -o thr_alarm ...
      ./thr_alarm.c: In function ‘signal_hand’:
      ./thr_alarm.c:556: too many arguments to function ‘sigwait’
                                          e             a                            a
A coisa apropriada para fazer neste caso ´ obter a vers˜o mais nova do gcc e compil´-lo
                                                                             o      a
com seu compilador gcc atual! Ao menos para o Solaris 2.5, a maioria das vers˜es bin´rias
                       u                    a
de gcc tem arquivos in´teis e antigos que ir˜o quebrar todos programas que usam threads
(e possivelmente outros programas)!
            a              o     a
O Solaris n˜o fornece vers˜es est´ticas de todas bibliotecas de sistema (libpthreads) e
                       e a                                                 e
libdl), portanto vocˆ n˜o pode compilar o MySQL com --static. Se vocˆ tentar fazer
             a
isto, receber´ o erro:
       ld: fatal: library -ldl: not found

      ou

      undefined reference to ‘dlopen’

      ou

      cannot find -lrt
     a                                                              e    a
Se v´rios processos tentar conectar muito rapidamente ao mysqld, vocˆ ver´ este erro no
log do MySQL:
       Error in accept: Protocol error
    e                                       ca
Vocˆ deve tentar iniciar o servidor com a op¸˜o --set-variable back_log=50 como uma
solu¸˜o para esta situa¸˜o. See undefined [Command-line options], page undefined .
    ca                 ca
       e   a               o                       e
Se vocˆ est´ ligando seu pr´prio cliente MySQL, vocˆ deve obter o seguinte erro quando
             a
tentar execut´-lo:
      ld.so.1: ./my: fatal: libmysqlclient.so.#: open failed: No such file or directory
                                                  e
O problema pode ser evitado por um dos seguintes m´todos:
 • Ligue o cliente com a seguinte op¸˜o (em vez de -Lpath): -Wl,r/full-path-to-
                                    ca
   libmysqlclient.so.
 • Copie o arquivo ‘libmysqclient.so’ para ‘/usr/lib’.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                         135



 • Adicione o caminho do diret´rio onde ‘libmysqlclient.so’ est´ localizado ` vari´vel
                              o                                a            a     a
   de ambiente LD_RUN_PATH antes de executar seu cliente.
                              ca                             e      e
Quando estiver usando a op¸˜o do configure --with-libwrap, vocˆ tamb´m deve incluir as
bibliotecas que o ‘libwrap.a’ necessita:
       --with-libwrap="/opt/NUtcpwrapper-7.6/lib/libwrap.a -lnsl -lsocket
       e                                                            e a
Se vocˆ tiver problemas com o configure tentando ligar com -lz e vocˆ n˜o tem a zlib
               e    a         co
instalada, vocˆ ter´ duas op¸˜es:
  • Se vocˆ deseja usar o protocol de comuni¸˜o de compactado vocˆ precisar´ obter e
            e                               ca                    e        a
     instalar a zlib from ftp.gnu.org.
  • Configure com --with-named-z-libs=no.
       e                                                     co
Se vocˆ estiver usando o gcc e tiver problemas carregando fun¸˜es UDF no MySQL, tente
                                    ca            ca
adicionar -lgcc para a linha de liga¸˜o para a fun¸˜o UDF.
         e
Se vocˆ deseja que o MySQL inicie automaticamente, vocˆ pode copiar   e
‘support-files/mysql.server’ para ‘/etc/init.d’ e criar um link simb´lico        o
para ele, chamado ‘/etc/rc.3.d/S99mysql.server’.

2.6.3.1 Notas Solaris 2.7/2.8
    e                                    a
Vocˆ pode utilizar normalmente um bin´rio Solaris 2.6 no Solaris 2.7 e 2.8. A maioria dos
                              e
detalhes do Solaris 2.6 tamb´m se aplicam ao Solaris 2.7 e 2.8.
                          a
Note que o MySQL vers˜o 3.23.4 e superiores devem estar aptos para autodetectar novas
     o                             co
vers˜es do Solaris e habilitar solu¸˜es para os problemas seguintes!
                                                            e
Solaris 2.7 / 2.8 tem alguns bugs nos arquivos include. Vocˆ pode ver o seguinte erro quando
    e
vocˆ usa o gcc:
       /usr/include/widec.h:42: warning: ‘getwc’ redefined
       /usr/include/wchar.h:326: warning: this is the location of the previous
       definition
                     e
Se isto ocorrer, vocˆ pode fazer o seguinte para corrigir o problema:
Copie /usr/include/widec.h para .../lib/gcc-lib/os/gcc-version/include e mude
a linha 41 :
       #if        !defined(lint) && !defined(__lint)

      para

      #if       !defined(lint) && !defined(__lint) && !defined(getwc)
                  e
Uma alternativa ´ editar o ‘/usr/include/widec.h’ diretamente. Desta forma, depois de
             ca      e
fazer a corre¸˜o, vocˆ deve remover o ‘config.cache’ e executar o configure novamente !
       e                                      e                   e
Se vocˆ obter erros como estes quando vocˆ executar o make, ´ porque o configure
  a
n˜o encontrou o arquivo ‘curses.h’ (provavelmente devido ao erro no arquivo
‘/usr/include/widec.h’):
      In file included from mysql.cc:50:
      /usr/include/term.h:1060: syntax error before ‘,’
      /usr/include/term.h:1081: syntax error before ‘;’
       ca            e                          co
A solu¸˜o para isto ´ fazer uma das seguintes op¸˜es:
136                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • Configure com CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H ./configure.
 • Edite o ‘/usr/include/widec.h’ como indicado acima e re-execute o configure.
 • Remova a linha #define HAVE_TERM do arquivo ‘config.h’ e execute make novamente.
Se o seu ligador tiver problemas para encontrar o -lz quando ligar ao seu programa cliente,
                            e                            a
provavelmente o problema ´ que seu arquivo ‘libz.so’ est´ instalado em ‘/usr/local/lib’.
    e                                              e
Vocˆ pode corrigir isto usando um dos seguintes m´todos:
  • Adicione ‘/usr/local/lib’ ao LD_LIBRARY_PATH.
  • Adicione um link para ‘libz.so’ a partir de ‘/lib’.
  • Se vocˆ estiver usando o Solaris 8, vocˆ pode instalar a zlib opcional do CD de dis-
            e                               e
           ca
     tribui¸˜o do Solaris 8.
  • Configure o MySQL com a op¸˜o --with-named-z-libs=no.
                                   ca

2.6.3.2 Notas Solaris x86
                                 a                          e
No Solaris 2.8 no x86, mysqld ir´ descarregar um core se vocˆ executar um ’strip’ no mesmo.
       e                                                  e
Se vocˆ estiver usando gcc ou egcs no Solaris X86 e vocˆ tiver problemas com descarregos
             e
de core, vocˆ deve utilizar o seguinte comando configure:
       CC=gcc CFLAGS="-O3 -fomit-frame-pointer -DHAVE_CURSES_H" \
       CXX=gcc \
       CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -D
       ./configure --prefix=/usr/local/mysql
       a                                                          co
Isto ir´ evitar problemas com a biblioteca libstdc++ e com exce¸˜es C++.
         a              e                       a                      a
Se isto n˜o ajudar, vocˆ pode compilar uma vers˜o com debug e execut´-lo com um arquivo
de ratreamento (trace) ou sob gdb. See undefined [Using gdb on mysqld], page undefined .

2.6.4 Notas BSD

2.6.4.1 Notas FreeBSD
              e                             ca
FreeBSD 3.x ´ recomendado para executa¸˜o do MySQL uma vez ue o pacote thread ´         e
muito mais integrado.
          a                                            a   e
A mais f´cil e portanto a forma preferida para instal´-lo ´ usar as portas mysql-server e
mysql-client dispon´iveis em http://www.freebsd.org.
               e
Usando-as vocˆ obtem:
  • Um MySQL funcional, com todas as otimiza¸˜es conhecidas para trabalhar na sua
                                                   co
         a
     vers˜o habilitada do FreeBSD.
  • Configura¸˜o e constru¸˜o autom´tica.
               ca            ca        a
  • Scripts de inicializa¸˜o instalados em /usr/local/etc/rc.d.
                          ca
  • Habilidade para ver quais arquivos est˜o instalados com pkg info -L. E para remover
                                            a
                                  e a                            a
     todos com pkg delete se vocˆ n˜o quiser mais o MySQL na m´quina.
´                        e                                                            o
E recomendado que vocˆ utilize MIT-pthreads no FreeBSD 2.x e threads nativas nas Vers˜es
                 ´
3 e superiores. E poss´ executar com threads nativas em algumas vers˜es antigas (2.2.x)
                       ivel                                            o
         e
mas vocˆ pode encontrar problemas ao finalizar o mysqld.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                        137



O ‘Makefile’ do MySQL necessita o GNU make (gmake) para funcionar. Se vocˆ deseja e
                               e        a
compilar o MySQL, antes vocˆ precisar´ instalar o GNU make.
                                 ca           ca
Tenha certeza que sua configura¸˜o de resolu¸˜o de nomes esteja correta. De outra forma
    e                         ca
vocˆ vai ter atrasos na resolu¸˜o ou falhas quando conectar ao mysqld.
Tenha certeza que a entrada localhost no arquivo ‘/etc/hosts’ esteja correta (de outra
           e a
forma vocˆ ir´ ter problemas conectando ao banco de dados). O arquivo ‘/etc/hosts’ deve
iniciar com a linha:
       127.0.0.1          localhost localhost.seu.dominio
        e                            a                        e
Se vocˆ notar que o configure ir´ usar MIT-pthreads, vocˆ deve ler as notas sobre o
MIT-pthreads. See undefined [MIT-pthreads], page undefined .
         e                                                        a
Se vocˆ obter um erro do make install dizendo que ele n˜o consegue encontrar
                                                 a
‘/usr/include/pthreads’, o configure n˜o percebeu que vocˆ necessita da   e
                      e
MIT-pthreads. Isto ´ corrigido com os seguintes comandos:
       shell> rm config.cache
       shell> ./configure --with-mit-threads
              e      e
O FreeBSD ´ tamb´m conhecido por ter um limite muito baixo para o manipulador de
arquivos. See undefined [Not enough file handles], page undefined . Descomente a se¸˜o    ca
                                                         a
ulimit -n no safe mysqld ou aumente os limites para o usu´rio mysqld no /etc/login.conf (e
                                                     e                       e
reconstrua-o com cap mkdb /etc/login.conf). Tamb´m tenha certeza que vocˆ configurou
                                    a                                           e a
a classe apropriada para este usu´rio no arquivo de senhas (password) se vocˆ n˜o es-
                     a
tiver usando o padr˜o (use: chpass nome usuario mysqld). See undefined [safe_mysqld],
page undefined
       e                                                             a
Se vocˆ tiver problemas com a data atual no MySQL, configurar a vari´vel TZ provavelmente
       a
ajudar´. See undefined [Environment variables], page undefined .
                                   a       e
Para obter um sistema seguro e est´vel vocˆ deve usar somente kernels FreeBSD que estejam
marcados com -STABLE.

2.6.4.2 Notas NetBSD
                              e
Para compilar no NetBSD vocˆ precisa do GNU make. De outra forma o compilador que-
braria quando o make tentasse executar lint em arquivos C++.

2.6.4.3 Notas OpenBSD

2.6.4.4 Notas OpenBSD 2.5
                  a        e
No OpenBSD Vers˜o 2.5, vocˆ pode compilar o MySQL com threads nativas com as
            co
seguintes op¸˜es:
      CFLAGS=-pthread CXXFLAGS=-pthread ./configure --with-mit-threads=no

2.6.4.5 Notas OpenBSD 2.8
          a
Nossos usu´rios relataram que o OpenBSD 2.8 tem um bug nas threads que causa problemas
                                                    a
com o MySQL. Os desenvolvedores do OpenBSD j´ corrigiram o problema, mas em 25 de
Janeiro de 2001 a corre¸˜o foi dispon´
                        ca            ivel apenas no ramo “-current”. Os sintomas deste
                  a
bug nas threads s˜o: resposta lenta, alta carga, alto uso de CPU e quedas do servidor.
138                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



2.6.4.6 Notas BSD/OS

                         a
2.6.4.7 Notas BSD/OS Vers˜o 2.x
       e
Se vocˆ obter o seguinte erro quando estiver compilando o MySQL, seu valor ulimit para
     o           e
mem´ria virtual ´ muito baixo:
      item_func.h: In method ‘Item_func_ge::Item_func_ge(const Item_func_ge &)’:
      item_func.h:28: virtual memory exhausted
      make[2]: *** [item_func.o] Error 1
                                                                     a                 e
Tente usar ulimit -v 80000 e executar o make novamente. Se isto n˜o funcionar e vocˆ es-
                                                            a
tiver usando o bash, tente trocar para csh ou sh; alguns usu´rios BSDI relataram problemas
com bash e ulimit.
      e                 e           e                 ca
Se vocˆ utiliza gcc, vocˆ pode tamb´m ter de usar a op¸˜o --with-low-memory para o
configure estar apto a compilar o ‘sql_yacc.cc’.
      e                                                            a
Se vocˆ tiver problemas com a data atual no MySQL, configurar a vari´vel TZ provavelmente
      a
ajudar´. See undefined [Environment variables], page undefined .

2.6.4.8 Notas BSD/OS Version 3.x

Atualize para BSD/OS Vers˜o 3.1. Se isto n˜o for poss´
                         a                a          ivel, instale BSDIpatch M300-038.
Use o seguinte comando quando configurar o MySQL:
      shell> env CXX=shlicc++ CC=shlicc2 \
             ./configure \
                 --prefix=/usr/local/mysql \
                 --localstatedir=/var/mysql \
                 --without-perl \
                 --with-unix-socket-path=/var/mysql/mysql.sock
                        e
O comeando seguinte tamb´m funciona:
      shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 \
             ./configure \
                 --prefix=/usr/local/mysql \
                 --with-unix-socket-path=/var/mysql/mysql.sock
   e                         co            o           e                                o
Vocˆ pode alterar as localiza¸˜es dos diret´rios se vocˆ desejar, ou apenas usar os padr˜es
 a                                 ca
n˜o especificando nenhuma localiza¸˜o.
      e                                                                ca
Se vocˆ tiver problemas com performance sob alta carga, tente usar a op¸˜o --skip-thread-
                               a
priority para mysqld! Isto ir´ executar todas as threads com a mesma prioridade; no BSDI
    a                                                     e
vers˜o 3.1, isto fornece melhor performance (pelo menos at´ o BSDI corrigir seu organizador
de threads).
      e
Se vocˆ obter o erro virtual memory exhausted enquanto estiver compilando, deve tentar
                                                             a                 e
usar ulimit -v 80000 e executar make novamente. Se isto n˜o funcionar e vocˆ estiver
                                                    a
usando bash, tente trocar para csh ou sh; alguns usu´rios BSDI relataram problemas com
bash e ulimit.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                       139



                         a
2.6.4.9 Notas BSD/OS Vers˜o 4.x
             a                                    a                 e
O BSDI Vers˜o 4.x tem alguns bugs relacionados `s threads. Se vocˆ deseja usar o MySQL
           a     e                             co                a
nesta vers˜o, vocˆ deve instalar todas as corre¸˜es relacionadas `s threads. Pelo menos a
M400-23 deve estar instalada.
                               a          e
Em alguns sistemas BSDI vers˜o 4.x, vocˆ pode ter problemas com bibliotecas compartil-
                   e         e a
hadas. O sintoma ´ que vocˆ n˜o pode executar nenhum programa cliente, por exemplo,
                             e                                          a
mysqladmin. Neste caso vocˆ precisa reconfigurar o MySQL, para ele n˜o usar bibliotecas
                          ca
compartilhadas, com a op¸˜o --disable-shared.
                                                              a              a
Alguns clientes tiveram problemas no BSDI 4.0.1 que o bin´rio do mysqld n˜o conseguia
                                                            e
abrir tabelas depois de um tempo em funcionamento. Isto ´ porque alguns bugs relaciona-
                                                                  o
dos a biblioteca/sistema fazem com que o mysqld altere o diret´rio atual sem nenhuma
        ca
informa¸˜o!
        ca e
A corre¸˜o ´ atualizar para a 3.23.34 ou depois de executar configure remova a linha
$define HAVE_REALPATH de config.h antes de executar o make.
                          e a                            o                o
Perceba que com isso vocˆ n˜o pode fazer um link simb´lico de um diret´rio de banco de
                       o                           o
dados para outro diret´rio ou fazer um link simb´lico a uma tabela para outro banco de
                                    o
dados no BSDI! (Criar um link simb´lico para outro disco funciona).

2.6.5 Notas Mac OS X

2.6.5.1 Mac OS X Public Beta
                                                                          e a
O MySQL deve funcionar sem problemas no Mac OS X Public Beta (Darwin). Vocˆ n˜o
precisa dos patches pthread para este SO.

2.6.5.2 Mac OS X Server
                                                                          e
Antes de tentar configurar o MySQL no MAC OS X server, primeiro vocˆ deve instalar o
pacote pthread encontrado em: http://www.prnet.de/RegEx/mysql.html.
          a                       e
Nosso bin´rio para o Mac OS X ´ compilado no Rhapsody 5.5 com a seguinte linha de
         ca
configura¸˜o:
      CC=gcc CFLAGS="-O2 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O2 -fomit-frame-pointer"
   e                             e
Vocˆ deve precisar adicionar tamb´m apelidos (alias) para seu arquivo de shell para acessar
mysql e mysqladmin da linha de comando:
      alias mysql ’/usr/local/mysql/bin/mysql’
      alias mysqladmin ’/usr/local/mysql/bin/mysqladmin’

2.6.6 Outras Notas Unix

                                  co      a
2.6.6.1 Notas HP-UX para distribui¸˜es bin´rias
                    co      a                            e
Alguma das distribui¸˜es bin´rias do MySQL para HP-UX ´ distribuida como um arquivo
                                                                e
depot da HP e como um arquivo tar. Para usar o arquivo depot vocˆ deve estar executando
                                        a
pelo menos o HP-UX 10.x para ter acesso `s ferramentas de arquivos depot da HP.
140                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



       a
A vers˜o HP do MySQL foi compilada em um servidor HP 9000/8xx sob HP-UX 10.20,
                                       ca
usando MIT-pthreads. Sob esta configura¸˜o o MySQL funciona bem. O MySQL Vers˜o      a
                         e
3.22.26 e mais novas tamb´m podem ser construidas com o pacote thread nativo da HP.
               co
Outras configura¸˜es que podem funcionar:
 • HP 9000/7xx executando HP-UX 10.20+
 • HP 9000/8xx executando HP-UX 10.30
                     co                   a           a
As seguintes configura¸˜es definitivamente n˜o funcionar˜o:
 • HP 9000/7xx ou 8xx executando HP-UX 10.x where x < 2
 • HP 9000/7xx ou 8xx executando HP-UX 9.x
                         ca                                                      e
Para instalar a distribui¸˜o, utilze um dos comandos abaixo, onde /path/to/depot ´ o
caminho completo do arquivo depot:
 • Para instalar tudo, incluindo o servidor, cliente e ferramentas de desenvolvimento:
         shell> /usr/sbin/swinstall -s /path/to/depot mysql.full
 • Para instalar somente o servidor:
         shell> /usr/sbin/swinstall -s /path/to/depot mysql.server
 • Para instalar somente o pacote cliente:
         shell> /usr/sbin/swinstall -s /path/to/depot mysql.client
 • Para instalar somente as ferramentas de desenvolvimento:
         shell> /usr/sbin/swinstall -s /path/to/depot mysql.developer
                    a
O depot copia os bin´rios e bibliotecas em ‘/opt/mysql’ e dados em ‘/var/opt/mysql’. O
            e
depot tamb´m cria as entradas apropriadas em ‘/etc/init.d’ e ‘/etc/rc2.d’ para iniciar
                                                                           a
o servidor automaticamente na hora do boot. Obviamente, para instalar o usu´rio deve ser
o root.
                         ca                   e               o
Para instalar a distribui¸˜o HP-UX tar.gz, vocˆ deve ter uma c´pia do GNU tar.

                        a
2.6.6.2 Notas HP-UX Vers˜o 10.20
Existem alguns pequenos problemas quando compilamos o MySQL no HP-UX. N´s re-o
                   e
comendamos que vocˆ use o gcc no lugar do compilador nativo do HP-UX, porque o gcc
           o
produz um c´digo melhor!
  o                                                a       co                  ca
N´s recomendamos o uso do gcc 2.95 no HP-UX. N˜o utilize op¸˜es de alta otimiza¸˜o
                             a
(como -O6) ja que isto pode n˜o ser seguro no HP-UX.
                              a
Perceba que as MIT-pthreads n˜o podem ser compiladas com o compilador HP-UX porque
     a
ele n˜o pode compilar arquivos .S (assembler).
                            ca
A seguinte linha de configura¸˜o deve funcionar:
      CFLAGS="-DHPUX -I/opt/dce/include" CXXFLAGS="-DHPUX -I/opt/dce/include -felide-const
      e            a                         e a           a
Se vocˆ mesmo est´ compilando gcc 2.95, vocˆ n˜o deve lig´-lo com as bibliotecas DCE
                               e
(libdce.a ou libcma.a) se vocˆ deseja compilar o MySQL com MIT-pthreads. Se vocˆ     e
                                           e a                               a       a
misturar os pacotes DCE e MIT-pthreads, vocˆ ir´ obter um mysqld com o qual n˜o poder´
                                                 e
conetar. Remova as bibliotecas DCE enquanto vocˆ compila gcc 2.95!
                  ca
Chapter 2: Instala¸˜o do MySQL                                            141



                        a
2.6.6.3 Notas HP-UX Vers˜o 11.x
                    a        o                                a
Para HP-UX Vers˜o 11.x n´s recomendamos o MySQL Vers˜o 3.23.15 ou posterior.
Por causa de alguns bugs cr´                             a               e
                              iticos nas bibliotecas padr˜o do HP-UX, vocˆ deve instalar as
                co
seguintes corre¸˜es antes de tentar executar o MySQL no HP-UX 11.0:
       PHKL_22840 Streams cumulative
       PHNE_22397 ARPA cumulative
       a
Isto ir´ resolver um problema que tem como retorno EWOLDBLOCK de recv() e EBADF de
                      co
accept() em aplica¸˜es threads.
       e                                                                 co       e
Se vocˆ estiver usando gcc 2.95.1 em um sistema HP-UX 11.x sem corre¸˜es, vocˆ obter´     a
o erro:
       In file included from /usr/include/unistd.h:11,
                            from ../include/global.h:125,
                            from mysql_priv.h:15,
                            from item.cc:19:
       /usr/include/sys/unistd.h:184: declaration of C function ...
       /usr/include/sys/pthread.h:440: previous declaration ...
       In file included from item.h:306,
                            from mysql_priv.h:158,
                            from item.cc:19:
                  e                          a
O problema ´ que o HP-UX n˜o define consistentemente a pthreads_
atfork().                        o
                Ela tem prot´tipos coflitantes em ‘/usr/include/sys/unistd.h’:184
e ‘/usr/include/sys/pthread.h’:440 (detalhes abaixo).
           ca e
Uma solu¸˜o ´ copiar ‘/usr/include/sys/unistd.h’ em ‘mysql/include’ e editar
                                                     ca                         a
‘unistd.h’ alterando-o para coincidir com a defini¸˜o em ‘pthread.h’. Aqui est´ o diff:
       183,184c183,184
       <       extern int pthread_atfork(void (*prepare)(), void (*parent)(),
       <                                                          void (*child)());
       ---
       >       extern int pthread_atfork(void (*prepare)(void), void (*parent)(void),
       >                                                          void (*child)(void));
Depois disto, a seguinte linha configure deve funcionar:
       CFLAGS="-fomit-frame-pointer -O3 -fpic" CXX=gcc CXXFLAGS="-felide-constructors -fno-
                         co                a                   a
Segue algumas inforama¸˜es que um usu´rio do HP-UX Vers˜o 11.x nos enviou sobre com-
    ca
pila¸˜o do MySQL com o compilador HP-UX:
        Environment:
              proper compilers.
                  setenv CC cc
                  setenv CXX aCC
              flags
                  setenv CFLAGS -D_REENTRANT
                  setenv CXXFLAGS -D_REENTRANT
                  setenv CPPFLAGS -D_REENTRANT
             % aCC -V
             aCC: HP ANSI C++ B3910B X.03.14.06
             % cc -V /tmp/empty.c
142                                          e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



           cpp.ansi: HP92453-01 A.11.02.00 HP C Preprocessor (ANSI)
           ccom: HP92453-01 A.11.01.00 HP C Compiler
           cc: "/tmp/empty.c", line 1: warning 501: Empty source file.

        configuration:
           ./configure --with-pthread         \
           --prefix=/source-control/mysql     \
           --with-named-thread-libs=-lpthread \
           --with-low-memory

          added ’#define _CTYPE_INCLUDED’ to include/m_ctype.h. This
          symbol is the one defined in HP’s /usr/include/ctype.h:

           /* Don’t include std ctype.h when this is included */
           #define _CTYPE_H
           #define __CTYPE_INCLUDED
           #define _CTYPE_INCLUDED
           #define _CTYPE_USING    /* Don’t put names in global namespace. */
 • Eu tive que usar a op¸˜o de tempo de compila¸˜o -D_REENTRANT para que o compilador
                        ca                       ca
           c       o                                                 e               o
   reconhe¸a o prot´tipo para localtime_r. Uma forma alternativa ´ fornecer o prot´tipo
                                                                               a
   para localtime_r. Mas eu queria pegar outros erros sem precisar execut´-los. N˜o    a
                                                                               co
   tinha certeza onde eu precisaria dele, portanto eu o adicionei a todas as op¸˜es.
 • As op¸˜es de otimiza¸˜o utilizadas pelo MySQL (-O3) n˜o ´ reconhecida pelos compi-
         co             ca                                  a e
                    a               co
   ladores HP. Eu n˜o alterei as op¸˜es.
      e
Se vocˆ obter o seguinte erro do configure
      checking for cc option to accept ANSI C... no
      configure: error: MySQL requires a ANSI C compiler (and a C++ compiler). Try gcc. Se
              e a
Confira se vocˆ n˜o tem o caminho para o compilador K&R antes do caminho para o
compilador C e C++ do HP-UX.

2.6.6.4 Notas IBM-AIX
      ca         a               a
Detec¸˜o autom´tica de xlC est´ faltando no Autoconf, portando um comando configure
           e       a
deste tipo ´ necess´rio quando estiver compilando o MySQL (Este exemplo usa o compilador
IBM):
      export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 "
      export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192"
      export CFLAGS="-I /usr/local/include"
      export LDFLAGS="-L /usr/local/lib"
      export CPPFLAGS=$CFLAGS
      export CXXFLAGS=$CFLAGS

      ./configure --prefix=/usr/local \
      --localstatedir=/var/mysql \
      --sysconfdir=/etc/mysql \
      --sbindir=’/usr/local/bin’ \
      --libexecdir=’/usr/local/bin’ \
                  ca
Chapter 2: Instala¸˜o do MySQL                                                       143



      --enable-thread-safe-client \
      --enable-large-files
         a       co                                   ca
Acima est˜o as op¸˜es usadas para compilar a distribui¸˜o MySQL que pode ser encontrada
em http://www-frec.bull.com/.
      e                                            ca            e     e
Se vocˆ alterar o -O3 para -O2 na linha de configura¸˜o acima, vocˆ tamb´m deve remover
    ca                  e            ca
a op¸˜o -qstrict (isto ´ uma limita¸˜o no compilador C da IBM).
       e                                                     e                 ca
Se vocˆ estiver usando gcc ou egcs para compilar o MySQL, vocˆ DEVE usar a op¸˜o -fno-
               a                          co               a e
exceptions, j´ que o manipulador de exce¸˜es no gcc/egcs n˜o ´ seguro para threads! (Isto
                                         e
foi testado com egcs 1.1). Existem tamb´m alguns problemas conhecidos com o assembler
                         o
da IBM que pode gerar c´digo errado quando usado com gcc.
 o
N´s recomendamos a seguinte linha do configure com egcs e gcc 2.95 no AIX:
      CC="gcc -pipe -mcpu=power -Wa,-many" \
      CXX="gcc -pipe -mcpu=power -Wa,-many" \
      CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \
      ./configure --prefix=/usr/local/mysql --with-low-memory
             e        a                                                     a
O -Wa,-many ´ necess´rio para o compilador ser bem sucedido. IBM est´ ciente deste
problema mas n˜o est´ com pressa de corrig´ devido ao fato do problema poder ser
               a      a                      i-lo
              o a                                      e       a
contornado. N´s n˜o sabemos se o -fno-exceptions ´ necess´rio com gcc 2.9.5, mas
                a             co        ca              o           a
como o MySQL n˜o utiliza exce¸˜es e a op¸˜o acima gera c´digo mais r´pido, recomendamos
       e                   ca
que vocˆ sempre use esta op¸˜o com o egcs/gcc.
      e                             o
Se vocˆ tiver algum problema com c´digo assembler tente alterar o -mcpu=xxx para o seu
processador. Normalmente power2, power ou powerpc podem ser usados, de uma maneira
               e                                  a
alternativa vocˆ pode precisar usar 604 ou 604e. N˜o tenho certeza mas acredito que usar
                                                              a
"power" deve satisfazer a maioria dos casos, mesmo em uma m´quina power2.
         e a              e
Se vocˆ n˜o sabe qual ´ o seu processador, utilize o comando "uname -m", isto
  a                 e
ir´ fornecer a vocˆ uma string que parece com "000514676700", com um formato
                                   a                    e       ´
de xxyyyyyymmss onde xx e ss s˜o sempre 0s, yyyyyy ´ o ID unico do sistema e
      e
mm ´ o ID da CPU Planar. Uma tabela destes valores podem ser encontrados em
http://www.rs6000.ibm.com/doc_link/en_US/a_doc_lib/cmds/aixcmds5/uname.htm.
        a                         a                       a            e
Isto ir´ lhe fornecer um tipo de m´quina e um modelo de m´quina que vocˆ pode usar
                                   e
para determinar que tipo de cpu vocˆ tem.
      e                                                      ca                     e
Se vocˆ tiver problemas com sinais (MySQL finaliza sem notifica¸˜o sob alta carga) vocˆ
                                                                     e
pode ter encontrado um bug de SO com threads e sinais. Neste caso vocˆ pode dizer ao
               a
MySQL para n˜o usar sinais configurando-o com:
      shell> CFLAGS=-DDONT_USE_THR_ALARM CXX=gcc \
              CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -DDONT_USE_THR_ALARM
              ./configure --prefix=/usr/local/mysql --with-debug --with-low-memory
      a                                                                    e a
Isto n˜o afeta a performance do MySQL, mas tem o efeito colateral que vocˆ n˜o pode
                      a                         a
matar clientes que est˜o “dormindo” em uma conex˜o com mysqladmin kill ou mysqladmin
                                      a                        o
shutdown. Neste caso, o cliente morrer´ quando ele chegar no pr´ximo comando.
                 o
Em algumas vers˜es do AIX, ligando com libbind.a faz o getservbyname descarregar core.
     e
Isto ´ erro no AIX e deve ser relatado para a IBM.
                          e                                  co
Para o AIX 4.2.1 e gcc vocˆ tem que fazer as seguintes altera¸˜es.
Depois de configurar, edite o ‘config.h’ e ‘include/my_config.h’ e altere a linha que diz
144                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



       #define HAVE_SNPRINTF 1
para
     #undef    HAVE_SNPRINTF
E finalmente,                     e                          o
               no ‘mysqld.cc’ vocˆ precisa adicionar um prot´tipo para initgroups.
     #ifdef    _AIX41
     extern    "C" int initgroups(const char *,int);
     #endif

2.6.6.5 Notas SunOS 4
             e        a
No SunOS 4, ´ necess´rio a MIT-pthreads para compilar o MySQL, o que significa que vocˆe
precisa do GNU make.
                                                             a                    e
Alguns sistemas SunOS 4 tem problemas com bibliotecas dinˆmicas e libtool. Vocˆ pode
usar a seguinte linha do configure para evitar este problema:
      shell> ./configure --disable-shared --with-mysqld-ldflags=-all-static
                                    e                                    co
Quando compilando readline, vocˆ pode obter alguns avisos sobre defini¸˜es duplicadas
que podem ser ignoradas.
                        a
Ao compilar o mysqld, v˜o existir alguns alertas sobre implicit declaration of function
          e
que tamb´m podem ser ignoradas.

2.6.6.6 Notas Alpha-DEC-UNIX (Tru64)
      e    a                                           e                            a
Se vocˆ est´ usando o egcs 1.1.2 no Digital Unix, vocˆ atualizar par o gcc 2.95.2, j´ que o
                    a
egcs no DEC tem v´rios erros graves !
                                                                           ca
Quando compilando programas com threads no Digital Unix, a documenta¸˜o recomenda
          ca                                                                    ca
usar a op¸˜o -pthread para cc e cxx e as bibliotecas -lmach -lexc (em adi¸˜o para -
                e
lpthread). Vocˆ deve executar o configure parecido com isto:
      CC="cc -pthread" CXX="cxx -pthread -O" \
      ./configure --with-named-thread-libs="-lpthread -lmach -lexc -lc"
                                   e
Quando compilando o mysqld, vocˆ deve ver alguns avisos como estes:
      mysqld.cc: In function void handle_connections()’:
      mysqld.cc:626: passing long unsigned int *’ as argument 3 of
      accept(int,sockadddr *, int *)’
    e                                         c                                      o
Vocˆ pode ignorar estes altertas com seguran¸a. Eles ocorrem porque o configure s´ pode
                  a
detectar erros e n˜o alertas.
      e                                                           e
Se vocˆ inicia o servidor diretamente da linha de comando, vocˆ pode ter problemas com
         ca                                               e
a finaliza¸˜o do servidor ao sair (log out). (Quando vocˆ sai, seu processo superior recebe
um sinal SIGHUP.) Se isto acontecer, tente iniciar o servidor desta forma:
      shell> nohup mysqld [options] &
nohup faz com que o comando que o segue ignore qualquer sinal SIGHUP enviado pelo
terminal. De forma alternativa, inicie o servidor executando safe_mysqld, o qual invoca o
                               e
mysqld usando nohup por vocˆ. See undefined [safe_mysqld], page undefined .
      e
Se vocˆ tiver problemas quando compilar mysys/get opt.c, apenas remova a linha #define
 NO PROTO do inicio do arquivo!
                  ca
Chapter 2: Instala¸˜o do MySQL                                                      145



       e                                                                            ca
Se vocˆ estiver utilizando o compilador CC da Compac, a seguinte linha de configura¸˜o
     a
dever´ funcionar:
      CC="cc -pthread"
      CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host"
      CXX="cxx -pthread"
      CXXFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host"
      export CC CFLAGS CXX CXXFLAGS
      ./configure \
      --prefix=/usr/local/mysql \
      --with-low-memory \
      --enable-large-files \
      --enable-shared=yes \
      --with-named-thread-libs="-lpthread -lmach -lexc -lc"
      gnumake
       e
Se vocˆ tiver problemas com a libtool, ao compilar com bibliotecas compartilhadas como
                                                        e
no exemplo acima, quando estiver ligando ao mysqld, vocˆ deve conseguir contornar este
problema usando:
      cd mysql
      /bin/sh ../libtool --mode=link cxx -pthread -O3 -DDBUG_OFF \
      -O4 -ansi_alias -ansi_args -fast -inline speed \
      -speculate all \ -arch host -DUNDEF_HAVE_GETHOSTBYNAME_R \
      -o mysql mysql.o readline.o sql_string.o completion_hash.o \
      ../readline/libreadline.a -lcurses \
      ../libmysql/.libs/libmysqlclient.so -lm
      cd ..
      gnumake
      gnumake install
      scripts/mysql_install_db

2.6.6.7 Notas Alpha-DEC-OSF1
       e                           ca
Se vocˆ tiver problemas com compila¸˜o e tem o DEC CC e o gcc instalados, tente executar
o configure desta forma:
      CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 \
      ./configure --prefix=/usr/local/mysql
       e                                              e
Se vocˆ tiver problemas com o arquivo ‘c_asm.h’, vocˆ pode criar e usar um arquivo
‘c_asm.h’ ’burro’ com:
      touch include/c_asm.h
      CC=gcc CFLAGS=-I./include \
      CXX=gcc CXXFLAGS=-O3 \
      ./configure --prefix=/usr/local/mysql
Perceba que os seguintes problemas com o programa ld pode ser corrigido
                              ´                       ca
fazendo o download do ultimo kit de atualiza¸˜o da DEC (Compaq) de
http://ftp.support.compaq.com/public/unix/.
Com o OSF1 V4.0D e o compilador "DEC C V5.6-071 no Digital Unix V4.0 (Rev. 878)"
o compilador tem alguns comportamentos estranhos (simbolos asm indefinidos). /bin/ld
     e
tamb´m aparece estar quebrado (problemas com erros _exit undefined ocorrendo ao ligar
146                                             e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



no mysqld). Neste sistema, temos compilado o MySQL com a seguinte linha configure,
                                          a
depois de substituir /bin/ld com a vers˜o do OSF 4.0C:
      CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
Com o compilador da Digital "C++ V6.1-029", o seguinte deve funcionar:
      CC=cc -pthread
      CFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host
      CXX=cxx -pthread
      CXXFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host -n
      export CC CFLAGS CXX CXXFLAGS
      ./configure --prefix=/usr/mysql/mysql --with-mysqld-ldflags=-all-static --disable-sh
                  o                   ca                a
Em algumas vers˜es do OSF1, a fun¸˜o alloca() est´ quebrada. Corrija isto removendo a
linha no ‘config.h’ que define ’HAVE_ALLOCA’.
      ca                        e               o
A fun¸˜o alloca() pode tamb´m ter um prot´tipo incorreto em /usr/include/alloca.h.
O alerta resultante deste erro pode ser ignorado.
              a
configure ir´ usar a seguinte biblioteca thread automaticamente: --with-named-thread-
libs="-lpthread -lmach -lexc -lc".
                         e      e
Quando usar o gcc, vocˆ tamb´m pode tentar executar configure desta forma:
      shell> CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure ....
       e
Se vocˆ tiver problemas com sinais (MySQL finalzar inesperadamente sobre alta carga),
    e                                                                             e
vocˆ pode ter encontrado um erro com threads e sinais no SO. Neste caso vocˆ pode dizer
                   a
ao MySQL para n˜o usar sinais configurando-o com:
      shell> CFLAGS=-DDONT_USE_THR_ALARM \
                CXXFLAGS=-DDONT_USE_THR_ALARM \
                ./configure ...
      a                                                                         a
Isto n˜o afeta a performance do MySQL, mas tem efeitos colaterais que n˜o permitem
                           a                                  a
finalizar clientes que est˜o “dormindo” em uma conex˜o com mysqladmin kill ou
                                                   a
mysqladmin shutdown. Neste caso o cliente ir´ morrer quando ele receber o pr´ximo      o
comando.
                      e                          a
Com gcc 2.95.2, vocˆ provavelmente encontrar´ o seguinte erro de compila¸˜o: ca
      sql_acl.cc:1456: Internal compiler error in ‘scan_region’, at except.c:2566
      Please submit a full bug report.
                       e                         o                                     ´
Para corrigir isto vocˆ deve alterar para o diret´rio sql e fazer um “corta e cola” da ultima
linha gcc, mas altere -O3 para -O0 (ou adicione -O0 imediatamente depois de gcc se vocˆ     e
  a                   ca                             ca                         e
n˜o tiver algumas op¸˜o -O na sua linha de compila¸˜o.) Depois disto feito vocˆ deve apenas
                o
voltar ao diret´rio superior e executar make novamente.

2.6.6.8 Notas SGI Irix
      e                          a                               o a
Se vocˆ estiver usando Irix Vers˜o 6.5.3 ou mais novo, o mysqld s´ ir´ conseguir criar threads
      e        a                  a             e
se vocˆ execut´-lo como um usu´rio com privil´gios de CAP_SCHED_MGT (como root) ou dar
                               e
ao servidor mysqld este privil´gio com o seguinte comando shell:
      shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld
    e
Vocˆ pode precisar indefinir algumas coisas em ‘config.h’ depois de executar configure
e antes de compilar.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                         147



                      co             ca              a
Em algumas implementa¸˜es Irix, a fun¸˜o alloca() est´ quebrada. Se o servidor mysqld
                       ca
morrer em alguma instru¸˜o SELECT, remova as linhas de ‘config.h’ que definem HAVE_
                                             a
ALLOC e HAVE_ALLOC_H. Se mysqladmin create n˜o funciona, remova a linha do ‘config.h’
                              e      e
que define HAVE_READDIR_R. Vocˆ tamb´m deve precisar remover a linha HAVE_TERM_H.
                       e                                 a
A SGI recomenda que vocˆ instale todos os patches desta p´gina: http://support.sgi.com/surfzone/patches/
      ´       e                  ´                           ´                      ´
No minimo, vocˆ deve instalar o ultimo rollup do kernel, o ultimo rollup rld, e o ultimo
rollup libc.
                  e         a                               a
Definitivamente vocˆ precisar´ de todos patches POSIX nesta p´gina, para suporte
pthreads:
http://support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html
      e
Se vocˆ obter o seguinte erro quando estiver compilando o ‘mysql.cc’:
      "/usr/include/curses.h", line 82: error(1084): invalid combination of type
                          o                a
Digite o seguinte no diret´rio topo da sua ´rvore fonte do MySQL:
      shell> extra/replace bool curses_bool < /usr/include/curses.h > include/curses.h
      shell> make
                                             ca
Existem relatos de problemas com organiza¸˜o de threads. Se somente uma thread estiver
executando, o sistema fica lento. Pode se evitar isto iniciando outro cliente. Isto pode
                                                                      ca
acarretar num crescimento de 2 para 10 vezes na velocidade de execu¸˜o para a outra
             e                a                                  e
thread. Isto ´ um problema n˜o compreendido com threads Irix; vocˆ deve improvisar para
               co    e
encontrar solu¸˜es at´ que isto seja resolvido.
      e                                e
Se vocˆ estiver compilando com gcc, vocˆ pode usar o seguinte comando configure:
      CC=gcc CXX=gcc CXXFLAGS=-O3 \
      ./configure --prefix=/usr/local/mysql --enable-thread-safe-client --with-named-threa
                                                                               a
No Irix 6.5.11 com Irix C nativo e compiladores C++ ver. 7.3.1.2, o seguinte ir´ funcionar
      CC=cc CXX=CC CFLAGS=’-O3 -n32 -TARG:platform=IP22 -I/usr/local/include \
      -L/usr/local/lib’ CXXFLAGS=’-O3 -n32 -TARG:platform=IP22 \
      -I/usr/local/include -L/usr/local/lib’ ./configure --prefix=/usr/local/mysql \
      --with-berkeley-db --with-innodb \
      --with-libwrap=/usr/local --with-named-curses-libs=/usr/local/lib/libncurses.a

2.6.6.9 Notas SCO
      a                                                                                a
A vers˜o atual foi testado somente nos sistemas “sco3.2v5.0.4” e “sco3.2v5.0.5”. A vers˜oo
                           e
para o “sco 3.2v4.2” tamb´m tem tido muito progresso.
  e                                                  e                           e
At´ o momento o compilador recomendado no OpenServer ´ o gcc 2.95.2. Com isto vocˆ
deve estar apto a compilar o MySQL apenas com:
                                        co
      CC=gcc CXX=gcc ./configure ... (op¸~es)
                                 e
 1. Para o OpenServer 5.0.X vocˆ precisa usar o GDS no SKunkware 95 (95q4c). Isto
    e       a                                               a
    ´ necess´rio porque o GNU gcc 2.7.2 no Skunkware 97 n˜o possui o GNU as. Vocˆ  e
         e                                                                 e
    tamb´m pode usar o egcs 1.1.2 ou mais novo http://www.egcs.com/. Se vocˆ estiver
                          e
    usando egcs 1.1.2 vocˆ deve executar o seguinte comando:
          shell> cp -p /usr/include/pthread/stdtypes.h /usr/local/lib/gcc-lib/i386-pc-sco3
148                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



         e                      a
 2. Vocˆ precisa do GCC vers˜o 2.5.x para este produto e do sistema de desenvolvimento.
            a        a              a                     e a
    Eles s˜o necess´rios nesta vers˜o do SCO Unix. Vocˆ n˜o pode usar apenas o sistema
    GCC Dev.
         e                                              a
 3. Vocˆ deve obter o pacote FSU Pthreads e instal´-lo primeiro. Pode ser obtido em
    http://www.cs.wustl.edu/~schmidt/ACE_wrappers/FSU-threads.tar.gz.                     e
                                                                                       Vocˆ
                 e
    pode tamb´m obter um pacote precompilado de http://www.mysql.com/Downloads/SCO/FSU-threads
 4. FSU Pthreads pode ser compilado com SCO Unix 4.2 com tcpip, ou OpenServer 3.0
    ou OpenDesktop 3.0 (OS 3.0 ODT 3.0), com o Sistema de Desenvolvimento da SCO
                                    a                                             e
    instalado usando uma boa vers˜o do GCC 2.5.x ODT ou OS 3.0, no qual vocˆ necessi-
        a                  a                          a
    tar´ de uma boa vers˜o do GCC 2.5.x. Existem v´rios problemas sem uma boa vers˜o.   a
               a
    Esta vers˜o do produto necessita do sistema de Desenvolvimento SCO Unix. Sem ele,
        e       a                                          ca       a
    vocˆ estar´ perdendo as bibliotecas e o editor de liga¸˜o necess´rio.
                                                       c
 5. Para construir a FSU Pthreads no seu sistema, fa¸a o seguinte:
                                           o
     a. Execute ./configure no diret´rio ‘threads/src’ e selecione a op¸˜o SCO   ca
          OpenServer. Este comando copia ‘Makefile.SCO5’ para ‘Makefile’.
     b. Execute make.
                               o        a                            a
      c. Para instalar no diret´rio padr˜o ‘/usr/include’, use o usu´rio root, depois mude
                       o
          para o diret´rio ‘thread/src’ e execute make install
 6. Lembre de usar o GNU make quando estiver construindo o MySQL.
             e a                                          e                o a
 7. Se vocˆ n˜o iniciou o safe_mysqld como root, vocˆ provavelmente s´ ir´ obter, por
          a                                                    a
    padr˜o, os 110 arquivos abertos por processo. O mysqld ir´ gravar uma nota sobre isto
    no arquivo log.
                                 e                               a
 8. Com o SCO 3.2V5.0.5, vocˆ deve usar o FSU Pthreads vers˜o 3.5c ou mais nova. Vocˆ     e
                e
    deve tamb´m usar o gcc 2.95.2 ou mais novo.
    O seguinte comando configure deve funcionar:
            shell> ./configure --prefix=/usr/local/mysql --disable-shared
                             e                              a
 9. Com SCO 3.2V4.2, vocˆ deve usar FSU Pthreads vers˜o 3.5c ou mais nova. O seguinte
    comando configure deve funcionar:
            shell> CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \
                    ./configure \
                         --prefix=/usr/local/mysql \
                         --with-named-thread-libs="-lgthreads -lsocket -lgen -lgthreads" \
                         --with-named-curses-libs="-lcurses"
         e
    Vocˆ pode ter alguns problemas com alguns arquivos de inclus˜o.           a       Neste
                e                                             a        ´
    caso, vocˆ pode encontrar novos arquivos de inclus˜o especificos do SCO em
    http://www.mysql.com/Downloads/SCO/SCO-3.2v4.2-includes.tar.gz. Vocˆ deve        e
                                        o                     a
    descompactar este arquivo no diret´rio ‘include’ da sua ´rvore fonte do MySQL.
Notas de desenvolvimento SCO:
 • O MySQL deve detectar automaticamente FSU Pthreads e ligar o mysqld com -
    lgthreads -lsocket -lgthreads.
 • As bibliotecas de desenvolvimento SCO s˜o re-entrantes nas FSU Pthreads. A SCO
                                               a
                                    co   a                   a
    diz que suas bibliotecas de fun¸˜es s˜o re-entrantes, ent˜o elas devem ser re-entrantes
    com as FSU-Pthreads. FSU Pthreads no OpenServer tentam usar o esquema SCO para
    criar bibliotecas re-entrantes.
                  ca
Chapter 2: Instala¸˜o do MySQL                                                     149



 • FSU Pthreads (ao menos a vers˜o em http://www.mysql.com) vem ligada com GNU
                                a
                    e                                    o
   malloc. Se vocˆ encontrar problemas com uso de mem´ria, tenha certeza que o
   ‘gmalloc.o’ esteja inclu´ em ‘libgthreads.a’ e ‘libgthreads.so’.
                           ido
 • Na FSU Pthreads, as seguintes chamadas de sistema s˜o compat´
                                                       a       iveis com pthreads:
   read(), write(), getmsg(), connect(), accept(), select() e wait().
 • O CSSA-2001-SCO.35.2 (O patch ´ listado de costume como patch de seguran¸a
                                       e                                           c
   erg711905-dscr remap ver 2.0.0) quebra FSU threads e deixa o mysqld inst´vel. Vocˆ
                                                                           a         e
                        e                                   a
   deve remove-lo se vocˆ deseja executar o mysqld em uma m´quina OpenServer 5.0.6.
      e                                  e
Se vocˆ deseja instalar o DBI no SCO, vocˆ deve editar o ‘Makefile’ em DBI-xxx e cada
        o
subdiret´rio.
Note que o exemplo abaixo considera o gcc 2.95.2   ou mais novo:
     OLD:                                           NEW:
     CC = cc                                        CC = gcc
     CCCDLFLAGS = -KPIC -W1,-Bexport                CCCDLFLAGS = -fpic
     CCDLFLAGS = -wl,-Bexport                       CCDLFLAGS =

     LD = ld                                        LD = gcc -G -fpic
     LDDLFLAGS = -G -L/usr/local/lib                LDDLFLAGS = -L/usr/local/lib
     LDFLAGS = -belf -L/usr/local/lib               LDFLAGS = -L/usr/local/lib

     LD = ld                                        LD = gcc -G -fpic
     OPTIMISE = -Od                                 OPTIMISE = -O1

     OLD:
     CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include

     NEW:
     CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include
     e                        a           a    a              o
Isto ´ porque o carregador dinˆmico Perl n˜o ir´ carregar os m´dulos DBI se elas foram
compiladas com icc ou cc.
Perl trabalha melhor quando compilado com cc.

2.6.6.10 Notas SCO Unixware Version 7.0
   e                      a                          a                       a
Vocˆ deve usar uma vers˜o de MySQL pelo menos t˜o recente quando a Vers˜o 3.22.13
                a
porque esta vers˜o corrige alguns problemas de portabilidade sob o Unixware.
  o                                                                          a
N´s temos compilado o MySQL com o seguinte comando configure no UnixWare Vers˜o
7.0.1:
       CC=cc CXX=CC ./configure --prefix=/usr/local/mysql
      e                         a
Se vocˆ deseja usar o gcc, dever´ ser usado o gcc 2.95.2 ou mais novo.

2.6.7 Notas OS/2
                                                 e
O MySQL usa poucos arquivos aberto. Por isto, vocˆ deve adicionar uma linha parecida
com a abaixo em seu arquivo ‘CONFIG.SYS’:
150                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



       SET EMXOPT=-c -n -h1024
       e a
Se vocˆ n˜o fizer isto, provavelmente vai ter o seguinte erro:
       File ’xxxx’ not found (Errcode: 24)
                                                                     e     a
Quando usar o MysQL com OS/2 Warp 3, o FixPack 29 ou superior ´ necess´rio. Com OS/2
                               e      a         e          e
Warp 4, FixPack 4 ou acima ´ necess´rio. Isto ´ uma exigˆncia da biblioteca Pthreads. O
                                           ca
MySQL deve estar instalado em uma parti¸˜o que suporta nomes longos de arquivos como
no HPFS, FAT32, etc.
                                                     o
O script ‘INSTALL.CMD’ deve ser executado pelo pr´prio ‘CMD.EXE’ do OS/2 e opde n˜o    a
funcionar com shells substitutas como o ‘4OS2.EXE’.
                                                                   e
O script ‘scripts/mysql-install-db’ foi renomeado. Agora ele ´ chamado ‘install.cmd’
  e                          a                      co        o             c
e ´ um script REXX, que ir´ atualizar as configura¸˜es padr˜es de seguran¸a do MySQL e
criar os ´
         icones na WorkPlace Shell para o MySQL.
             o          a      e                 a                        o        a
Suporte a m´dulos dinˆmicos ´ compilado mas n˜o totalmente testado. M´dulos dinˆmicos
devem ser compilados usando a biblioteca run-time Pthreads.
       gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \
            -o example udf_example.cc -L../lib -lmysqlclient udf_example.def
       mv example.dll example.udf
                       co                         o             a
Nota: Devido a limita¸˜es no OS/2, o nome do m´dulo UDF n˜o deve esceder 8 caracteres.
  o        a                        o                                               a
M´dulos s˜o armazenados no diret´rio ‘/mysql2/udf’; o script safe-mysqld.cmd ir´ colo-
              o           a                                                   o
car este diret´rio na vari´vel de ambiente BEGINLIBPATH. Quando usando m´dulos UDF,
extens˜es espec´
       o               a
                ificas s˜o ignoradas — consuidera-se que seja ‘.udf’. Por exemplo, no Unix,
    o                                                            e
o m´dulo compartilhado deve ser nomeado ‘example.so’ e vocˆ deve carregar uma fun¸˜o  ca
dele desta forma:
       mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example.so";
                o                                                    e a
No OS/2, o m´dulo deve ter o nome de ‘example.udf’, mas vocˆ n˜o deve especificar a
       a       o
extens˜o do m´dulo:
       mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example";

2.6.8 Notas BeOS
                                                                             a
Realmente temos interesse que o MySQL funcione no BeOS, mas infelizmente n˜o temos
      e
nimgu´m que saiba BeOS ou tenha tempo para fazer uma vers˜o. a
  o                                        e         c          a
N´s estamos interessados em encontrar algu´m que fa¸a uma vers˜o, e iremos ajudar com
              a e
qualquer quest˜o t´cnica que possa ter durante o desenvolvimento.
  o a
N´s j´ falamos com alguns desenvolvedores BeOS que disseram que o MySQL est´ 80%a
                            o a                        ca
portado para o BeOS, mas n´s n˜o sabemos qual a situa¸˜o no momento.

2.6.9 Notas Novell Netware
Estamos realmente interessados em deixar o MySQL funcionando no NetWARE, mas infe-
          a              e                                                       a
lizmente n˜o temos ningu´ma que saiba Netware ou tenha tempo para fazer uma vers˜o.
  o                                         e         c       a              a
N´s estamos interessados em encontrar algu´m que fa¸a a vers˜o, e iremos ajud´-lo com
              a e
qualquer quest˜o t´cnica que possa ter durante o desenvolvimento.
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                      151



         ca
3 Introdu¸˜o ao MySQL: Um Tutorial MysQL
Este cap´                                    ca
         itulo fornece um tutorial de introdu¸˜o ao MySQL demonstrando como usar o
programa cliente mysql para criar e usar um banco de dados simples. mysql (algumas vezes
                                                             e
apresentado como o “terminal monitor” ou apenas “monitor”) ´ um programa interativo que
lhe permite conectar a um servidor MySQL, executar consultas e visualizar os resultados.
                   e                                     e
mysql pode tamb´m ser executado em modo batch: vocˆ coloca suas consultas em um
                                                   u
arquivo, depois diz ao mysql para executar o conte´do do arquivo. Cobrimos aqui ambas
as formas de utilizar o mysql.
                          co                                            ca
Para ver uma lista de op¸˜es conhecidas pelo mysql, chame-o com a op¸˜o --help:
       shell> mysql --help
Este cap´                              a                   a
         itulo presume que o mysql est´ instalado na sua m´quina e que um servidor MySQL
est´ dispon´
   a                                                     a
             ivel para quem puder conectar. Se isto n˜o for verdade, contate seu admin-
                           e e                      e        a                   co
istrador MySQL. (Se vocˆ ´ o administrador, vocˆ precisar´ consultar outras se¸˜es deste
manual.)
Este cap´                                              ca
          itulo descreve todo o processo de configura¸˜o e uso de um banco de dados. Se
    e                                                              a
vocˆ estiver interessado em apenas acessar um banco de dados j´ existente, podera pular
      co
as se¸˜es que descrevem como criar o banco de dados e suas respectivas tabelas.
Como este cap´         e               a               a
                 itulo ´ um tutorial, v´rios detalhes s˜o necessariamente deixados de fora.
                co                                            co            o
Consulte as se¸˜es relevantes do manual para mais informa¸˜es sobre os t´picos cobertos
aqui.


3.1 Conectando e desconectando do servidor
                                           e        a                         a
Para conectar ao servidor, normalmente vocˆ precisar´ fornecer um nome de usu´rio quando
o mysql for chamado e, na maioria dos casos, uma senha. Se o servidor executa em
       a                             e    a     e       e          a
uma m´quina diferente de onde vocˆ est´, vocˆ tamb´m precisar´ especificar um nome
     a                                                      a                a      e
de m´quina. Contate seu administrador para saber quais parˆmetros de conex˜o vocˆ deve
                         e         a          a                                    e
usar para conectar (isto ´, qual m´quina, usu´rio e senha usar). Uma vez que vocˆ saiba
            a                    e
quais os parˆmetros corretos, vocˆ deve estar pronto para conectar da seguinte forma:
      shell> mysql -h servidor -u usuario -p
      Enter password: ********
Os asteriscos (********) representam sua senha; digite-a quando o mysql mostrar o prompt
Enter password:.
                      e                         co
Se isto funcionar, vocˆ deve ver algumas informa¸˜es iniciais seguidas de um prompt mysql>
       shell> mysql -h servidor -u usuario -p
       Enter password: ********
       Welcome to the MySQL monitor. Commands end with ; or \g.
       Your MySQL connection id is 459 to server version: 3.22.20a-log

      Type ’help’ for help.

      mysql>
                                a                    e
O prompt lhe diz que o mysql est´ pronto para que vocˆ digite os comandos.
152                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                 co                               a
Algumas instala¸˜es MySQL permitem aos usu´rios de se conectarem como usu´rios        a
   o                                   a                    e                 a
anˆnimos ao servidor executando na m´quina local. Se isto ´ o caso na sua m´quina, vocˆ   e
deve conseguir conectar ao servidor chamando o mysql sem qualquer op¸˜o:ca
        shell> mysql
              e                          e
Depois de vocˆ conectar com sucesso, vocˆ pode disconectar a qualquer hora digitando QUIT
no prompt mysql>:
        mysql> QUIT
        Bye
     e      e
Vocˆ tamb´m pode desconectar pressionando Control-D.
                             co                             e a a
A maioria dos exemplos nas se¸˜es seguintes assumem que vocˆ j´ est´ conectado ao servidor.
      e
Isto ´ indicado pelo prompt mysql>.

3.2 Fazendo Consultas
                         e    a                                           ca
Tenha certeza que vocˆ est´ conectado ao servidor, como discutido na se¸˜o anterior. Isto
         a     a                                                         a
feito, n˜o ser´ selecionado nenhum banco de dados para trabalhar, mas n˜o tem problemas.
                   e
Neste momento, ´ mais importante saber um pouco sobre como fazer consultas do que j´      a
                                                                            ca
criar tabelas, carregar dados para elas, e recuperar dados delas. Esta se¸˜o descreve os
princ´       a                                                             e
      ipios b´sicos da entrada de comandos, usando diversas consultas vocˆ pode tentar se
familiarizar com o funcionamento do mysql.
           a                                                u             a
Aqui est´ um comando simples que solicita ao servidor seu n´mero de vers˜o e a data atual.
Digite-o como visto abaixo seguindo o prompt mysql> e digite a tecla RETURN:
       mysql> SELECT VERSION(), CURRENT_DATE;
       +--------------+--------------+
       | version()         | CURRENT_DATE |
       +--------------+--------------+
       | 3.22.20a-log | 1999-03-19         |
       +--------------+--------------+
       1 row in set (0.01 sec)
       mysql>
                         a
Esta consulta ilustra v´rias coisas sobre o mysql:
  • Um comando normalmente consiste de uma instru¸˜o SQL seguida por um ponto e
                                                        ca
     v´irgula. (Exsistem algumas exce¸˜es onde um ponto e v´
                                      co                              a e        a
                                                              irgula n˜o ´ necess´rio. QUIT
                                   e
     mencionado anteriormente, ´ um deles. Saberemos de outros mais tarde.)
  • Quando vocˆ emite um comando, o mysql o envia para o servidor para execu¸˜o e
                   e                                                                   ca
                                                                              a
     mostra os resultados, depois imprime oturo mysql> para indicar que est´ pronto para
     outro comando.
  • O mysql mostra a sa´ da consulta como uma tabela (linhas e colunas). A primeira
                            ida
                 e   o                                           a
     linha cont´m r´tulos para as colunas. As linhas seguintes s˜o o resultado da consulta.
                       o                a                               e
     Normalmente, r´tulos de colunas s˜o os nomes das colunas que vocˆ busca das tabelas
                                   e  a                                      a
     do banco de dados. Se vocˆ est´ recuperando o valor de uma express˜o no lugar de
                                                a
     uma coluna de tabela (como no exemplo j´ visto), o mysql rotula a coluna usando a
        o             a
     pr´pria express˜o.
  • O mysql mostra quantas linhas foram retornadas e quanto tempo a consulta levou
                                 a            e
     para executar, o que lhe d´ uma vaga id´ia da performance do servidor. Estes valores
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                      153



     a                                                   o      a
    s˜o impreciso porque eles representam tempo de rel´gio (N˜o tempo de CPU ou de
      a                      a                                                       e
    m´quina), e porque eles s˜o afetados pelos fatores como a carga do servidor e latˆncia
                                                    a e
    de rede. (Para resumir, a linha “rows in set” n˜o ´ mostrada nos exemplos seguintes
    deste cap´
             itulo.)
                                                                                     a
Palavras Chave podem ser entradas em qualquer caso de letra. As seguintes consultas s˜o
equivalentes:
      mysql> SELECT VERSION(), CURRENT_DATE;
      mysql> select version(), current_date;
      mysql> SeLeCt vErSiOn(), current_DATE;
         a                                     e
Aqui est´ outra consulta. Ela demonstra que vocˆ pode usar o mysql como uma calculadora
simples:
      mysql> SELECT SIN(PI()/4), (4+1)*5;
      +-------------+---------+
      | SIN(PI()/4) | (4+1)*5 |
      +-------------+---------+
      |     0.707107 |         25 |
      +-------------+---------+
                         e        e            co
Os comandos mostrados at´ agora tˆm sido instru¸˜es relativamente pequenas, de uma
           e          e                u           co            ´
linha. Vocˆ pode tamb´m entrar com m´ltiplas instru¸˜es em uma unica linha. Basta
finalizar cada uma com um ponto e v´
                                  irgula:
      mysql> SELECT VERSION(); SELECT NOW();
      +--------------+
      | version()     |
      +--------------+
      | 3.22.20a-log |
      +--------------+

      +---------------------+
      | NOW()               |
      +---------------------+
      | 1999-03-19 00:15:33 |
      +---------------------+
                a                                ´               a
Um comando n˜o necessita estar todo em uma unica linha, ent˜o comandos extensos que
                a            a a
necessitam de v´rias linhas n˜o s˜o um problema. O mysql determina onde sua instru¸˜o   ca
termina atrav´s do ponto e v´
              e                                      a
                             irgula terminador, e n˜o pelo final da linha de entrada. (Em
outras palavras, o myqsl aceita entradas de livre formato: Ele coleta linhas de entrada mas
n˜o as executa at´ chegar o ponto e v´
 a                e                   irgula.)
        a           ca                  u
Aqui est´ uma instru¸˜o simples usando m´ltiplas linhas:
     mysql> SELECT
          -> USER()
          -> ,
          -> CURRENT_DATE;
     +--------------------+--------------+
     | USER()                 | CURRENT_DATE |
     +--------------------+--------------+
     | joesmith@localhost | 1999-03-18 |
154                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



       +--------------------+--------------+
                                                                               e
Neste exemplo, note como o prompt altera de mysql> para -> depois de vocˆ entrar a
                                      u                   e
primeira linha de uma consulta com m´ltiplas linhas. Isto ´ como o mysql indica que ainda
 a                    ca                 a                                   e
n˜o achou uma instru¸˜o completa e est´ esperando pelo resto. O prompt ´ seu amigo,
                                             e                      e             a
porque ele fornece um retorno valioso. Se vocˆ usa este retorno, vocˆ sempre estar´ ciente
                   a
do que o mysql est´ esperando.
       e               a                                  a
Se vocˆ decidir que n˜o deseja executar um comando que est´ no meio do processo de
entrada, cancele-o digitando \c:
      mysql> SELECT
           -> USER()
           -> \c
      mysql>
                         e                                      e
Note o prompt aqui tamb´m. Ele troca para o mysql> depois de vocˆ digitar \c, fornecendo
                                    a
retorno para indicar que o mysql est´ pronto para um novo comando.
                                                 e
A seguinte tabela mostra cada dos prompts que vocˆ pode ver e resume o que ele significa
sobre o estado em que o mysql se encontra:
Prompt     Significado
mysql>     Pronto para novo comando.
    ->                      o                               u
           Esperando pela pr´xima linha de comando com m´ltiplas linhas.
    ’>                      o
           Esperando pela pr´xima linha, coletando uma string que comece com uma aspas
           simples (‘’’).
      ">                     o
           Esperando pela pr´xima linha, colentando uma string que comece com aspas
           duplas (‘"’).
´                   co                                                e
E muito comum instru¸˜es multi-linhas ocorrem por acidente quando vocˆ pretende publicar
um comando em uma unica linha, mas esquece o ponto e v´
                     ´                                   irgula terminador. Neste caso,o
mysql espera por mais entrada:
     mysql> SELECT USER()
          ->
                       e                            ca        ´               e
Se isto ocorrer com vocˆ (acha que entrou uma instru¸˜o mas a unica resposta ´ um prompt
->), o mais prov´vel ´ que o mysql est´ esperando pelo ponto e v´
                  a    e                 a                                          e a
                                                                     irgula. Se vocˆ n˜o
                            a                e
perceber o que o prompt est´ lhe dizendo, vocˆ pode parar por um tempo antes de entender
o que precisa fazer. Entre com um ponto e v´                                ca
                                             irgula para completar a instru¸˜o, e o mysql
  a       a
ir´ execut´-la:
       mysql> SELECT USER()
           -> ;
       +--------------------+
       | USER()                 |
       +--------------------+
       | joesmith@localhost |
       +--------------------+
                                                                            e
O prompt ’> e "> ocorrem durante a coleta de strings. No MySQL, vocˆ pode escrever
strings utilizando os caracteres ‘’’ ou ‘"’ (por exemplo, ’hello’ ou "goodbye"), e o mysql
                                                 u                        e
permite a entrada de strings que consomem m´ltiplas linhas. Quando vocˆ ver um prompt
                            e                                                  c
’> ou ">, significa que vocˆ digitou uma linha contendo uma string que come¸a com um
                                           a
caracter de aspas ‘’’ ou ‘"’ mas ainda n˜o entrou com a aspas que termina a string. Isto
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                       155



e             e               a                                  u
´ bom se vocˆ realmente est´ entrando com uma string com m´ltiplas linhas, mas qual ´      e
                                    a
a probalidade disto acontecer ? N˜o muita. Geralmente, os prompts ’> e "> indicam que
    e
vocˆ, por algum descuido, esqueceu algum caracter de aspas. Por exemplo:
      mysql> SELECT * FROM minha_tabela WHERE nome = "Smith AND idade < 30;
           ">
       e                    c
Se vocˆ entrar esta senten¸a SELECT, apertar ENTER e esperar pelo resultado, nada ir´      a
                                            e
acontecer. Em vez de se perguntar o porquˆ desta query demorar tanto tempo, perceba a
pista fornecida pelo prompt ">. Ele lhe diz que o mysql espera pelo resto de uma string
  a                  e                    ca
n˜o terminada. (Vocˆ ve o erro na declara¸˜o? Falta a segunda aspas na string "Smith.)
                                                  e
O que fazer neste ponto ? A coisa mais simples ´ cancelar o comando. Entretanto, vocˆ      e
  a
n˜o pode simplesmente digitar \c neste caso, porque o mysql o intrerpreta como parte da
              a                                                        a
string que est´ coletando! Digite o caracter de aspas para fechar (ent˜o o mysql sabe que
    e                     a
vocˆ fechou a string), ent˜o digite \c:
      mysql> SELECT * FROM minha_tabela WHERE nome = "Smith AND idade < 30;
           "> "\c
      mysql>
                                                         a
O prompt volta para mysql>, indicando que o mysql est´ pronto para um novo comando.
´ importante saber o que os prompts ’> e o "> significam, porque se vocˆ entrar sem
E                                                                              e
                                       ca
querer com uma string sem termina¸˜o, quaisquer linhas seguintes que forem digitadas
    a
ser˜o ignoradas pelo mysql — incluindo uma linha contendo QUIT! Isto pode ser um pouco
                              e a              e
confuso, especialmente se vocˆ n˜o sabe que vocˆ precisa fornecer as aspas finais antes poder
cancelar o comando atual.

        ca           ca
3.3 Cria¸˜o e Utiliza¸˜o de um Banco de Dados
               e a                                    e
Agora que vocˆ j´ sabe como entrar com os comandos, ´ hora de acessar um banco de dados.
                   e                                  ca
Suponha que vocˆ tenha diversos animais de estima¸˜o em sua casa (menagerie) e vocˆ      e
                               a                     co                  e
gostaria de ter o registro de v´rios tipos de informa¸˜es sobre eles. Vocˆ pode fazer isto
                                                   a                  ca
criando tabelas para armazenar seus dados e carreg´-los com a informa¸˜o desejada. Depois
    e                                         o
vocˆ pode responder diferentes tipos de quest˜es sobre seus animais recuperando dados das
                 ca         a
tabelas. Esta se¸˜o mostrar´ como:
  • Criar um banco de dados
  • Criar uma tabela
  • Carregar dados na tabela
  • Recuperar dados de uma tabela de v´rias maneiras
                                          a
  • Usar m´ltiplas tabelas
             u
O banco de dados menagerie ser´ simples (deliberadamente), mas n˜o ´ dif´ pensar em
                                 a                                   a e    icil
      co
situa¸˜es na vida real em que um tipo similar de banco de dados pode ser usado. Por
exemplo, um banco de dados deste tipo pode ser usado por um fazendeiro para gerenciar
                                            a
seu estoque de animais, ou por um veterin´rio para gerenciar registros de seus pacientes.
               ca
Uma distribui¸˜o do menagerie contendo algumas das consultas e dados de exemplos usados
nas se¸˜es seguintes podem ser obtidas do site Web do MySQL. Est˜o dispon´
       co                                                          a        iveis tanto em
compressed formato tar como em formato Zip .
                ca
Utilize a instru¸˜o SHOW para saber quais bancos de dados existem atualmente no servidor:
156                                             e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



       mysql> SHOW DATABASES;
       +----------+
       | Database |
       +----------+
       | mysql      |
       | test       |
       | tmp        |
       +----------+
                                                a                  a
A lista de bancos de dados provavelmente ser´ diferente na sua m´quina, mas os bancos de
                                           a                                     e     a
dados mysql e test provavelmente estar˜o entre eles. O banco de dados mysql ´ necess´rio
                          e                       a                            e
porque ele descreve privil´gios de acessos de usu´rios. O banco de dados test ´ geralamente
                         c                   a
fornecido como um espa¸o para que os usu´rios possam fazer testes.
                                                a
Se o banco de dados test existir, tente acess´-lo:
       mysql> USE test
       Database changed
Perceba que o USE, como o QUIT, n˜o necessitam de um ponto e v´
                                       a                                             e
                                                                        irgula. (Vocˆ pode
                      co                       ´                     a                  ca
terminar tais declara¸˜es com uma ponto e virgula se gostar; isto n˜o importa) A instru¸˜o
     e                                   e                                ´
USE ´ especial em outra maneira, tamb´m: Ela deve ser usada em uma unica linha.
    e                                              e
Vocˆ opde usar o banco de dados test (Se vocˆ tiver acesso a ele) para os exemplos que
                                      e
seguem mas qualquer coisa que vocˆ criar neste banco de dados pode ser removido por
                                                a     e
qualquer um com acesso a ele. Por esta raz˜o, vocˆ provavelmente deve pedir permiss˜o    a
                                                                 o
ao seu administrador MySQL para usar um banco de dados pr´prio. Suponha que vocˆ o      e
chame de menagerie. O administrador precisar executar um comando como este:
                                                          a
       mysql> GRANT ALL ON menagerie.* TO seu_usu´rio_mysql;
                            e                a
onde seu_usu´rio_mysql ´ o nome do usu´rio MySQL atribuido a vocˆ.
              a                                                          e

3.3.1 Criando e Selecionando um Banco de Dados
                                                                                   o
Se o administrador criar seu banco de dados quando configurar as suas permiss˜es, vocˆ       e
           c      a        a      e                   a
pode come¸ar a us´-lo. Sen˜o, vocˆ mesmo precisa cri´-lo:
      mysql> CREATE DATABASE menagerie;
                                       a                           a
No Unix, nomes de bancos de dados s˜o caso sensitivo (ao contr´rio das palavras chave
                   e                        e
SQL), portanto vocˆ deve sempre fazer referˆncia ao seu banco de dados como menagerie
    a                                        ca              e e
e n˜o Menagerie, MENAGERIE ou outra varia¸˜o. Isto tamb´m ´ verdade para nomes de
                                   ca a                                e
tabelas. (No Windows, esta restri¸˜o n˜o se aplica, entiretanto vocˆ deve referenciar os
bancos de dados e tabelas usando o mesmo caso em toda a parte da consulta.)
Criar um bancos de dados n˜o o seleciona para o uso; vocˆ deve fazer isso de forma expl´
                           a                            e                              icita.
Para fazer o menagerie o banco de dados atual, use o comando:
      mysql> USE menagerie
      Database changed
                                                      ´                   e
Seu banco de dados necessita ser criado somente uma unica vez, mas vocˆ deve selecion´-loa
                              e               ca               e
para o uso cada vez que vocˆ iniciar uma se¸˜o mysql. Vocˆ pode fazer isso usando a
      ca                                                  e
instru¸˜o USE como visto acima. Uma forma alternativa ´ selecionar o banco de dados na
                               e
linha de comando quando vocˆ chamar o mysql. Apenas especifique seu nome depois de
             a               a          e
qualquer parˆmetro de conex˜o que vocˆ pode precisar fornecer. Por exemplo:
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                          157



      shell> mysql -h servidor -u usuario -p menagerie
      Enter password: ********
                         a e                                        e
Perceba que menagerie n˜o ´ sua senha no comando mostrado. Se vocˆ precisar passar sua
                                       ca          e         e                 c
senha na linha de comando depois da op¸˜o -p, vocˆ deve fazˆ-lo sem usar espa¸os (por
                           a
exemplo, -pminhasenha e n˜o como em -p minhasenha). Entretando, colocando sua senha
                       a e                            o
na linha de comando n˜o ´ recomendado, porque isto exp˜e sua senha permitindo que outro
    a                  a
usu´rio utilize a sua m´quina.

3.3.2 Criando uma Tabela
                              e        a                         a
Criar o banco de dados ´ a parte f´cil, mas neste ponto ele est´ vazio, como o SHOW TABLES
mostrar´:a
        mysql> SHOW TABLES;
        Empty set (0.00 sec)
A parte mais dif´ ´ decidir qual a estrutura que seu banco de dados deve ter: quais tabelas
                    icil e
    e           a                      a
vocˆ precisar´ e que colunas estar˜o em cada uma delas.
    e a
Vocˆ ir´ precisar de uma tabela para guardar um registro para cada um de seus animais
            ca
de estima¸˜o. Esta tabela pode ser chamada pet, e ela deve conter, pelo menos, o nome
                                           o a e
de cada animal. Como o nome por si s´ n˜o ´ muito interessante, a tabela dever´ conter  a
outras informa¸˜es. Por exemplo, se mais de uma pessoa na sua fam´ tamb´m tem
                   co                                                        ilia       e
               e                                        e           e
animais, vocˆ pode desejar listar cada dono. Vocˆ pode tamb´m desejargravar algumas
         co                     a           e
informa¸˜es descritivas b´sicas como esp´cie e sexo.
                                                a e
Que tal a idade? Pode ser do interesse, mas n˜o ´ uma boa coisa para se armazenar em um
                                     a
banco de dados. A idade muda ` medida em que o tempo passa, o que significa que vocˆ           e
             a                                               e
sempre ter´ de atualizar seus registros. Em vez disso, ´ melhor armazenar um valor fixo
                                    a                  e                             e
como a data de nascimento. Ent˜o, sempre que vocˆ precisar da idade, basta vocˆ calcul´-la  a
                  c                                        a                           co
como a diferen¸a entre a data atual e a data de anivers´rio. O MySQL fornece fun¸˜es para
fazer aritm´tica de datas, ent˜o isto n˜o ´ dif´
             e                    a       a e                                            a
                                                  icil. Armazenando datas de anivers´rio no
                          e
lugar da idade tamb´m oferece outras vantagens:
  • Vocˆ pode usar o banco de dados para tarefas como gerar lembretes para anivers´rios
          e                                                                                a
              a                       e                              e
      que est˜o chegando. (Se vocˆ pensa que este tipo de query ´ algo bobo, perceba que
      e                     a       e
      ´ a mesma quest˜o que vocˆ perguntar no contexto de um banco de dados comercial
                                              e          a          a             a
      para identificar clientes para quais vocˆ precisar´ enviar cart˜o de anivers´rio, para um
      toque pessoal assistido pelo computador.)
  • Vocˆ pode calcular a idade em rela¸˜o a outras datas diferente da data atual. Por
          e                                 ca
                         e                                                 e        a
      exemplo, se vocˆ armazenar a data da morte no banco de dados, vocˆ poder´ facilmente
      calcular qual a idade que o bicho tinha quando morreu.
    e                                                           co             a
Vocˆ provavelmente pode pensar em outros tipos de informa¸˜es que poder˜o ser uteis   ´
                                      e              a
na tabela pet, mas as identificadas at´ o momento s˜o suficientes por agora: nome(name),
                  e
dono(owner), esp´cie(species), sexo(sex), data de nascimento(birth) e data da morte(death).
                c
Utilize a sente¸a CREATE TABLE para especificar o layout de sua tabela:
       mysql> CREATE TABLE pet (nome VARCHAR(20), owner VARCHAR(20),
             -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
           e
VARCHAR ´ uma boa escolha para os campos name, owner, e species porque os valores da
         a                 a                                  a                  a
coluna s˜o de tamanho vari´vel. Os tamanhos destas colunas n˜o precisam necess´riamente
158                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                    a                        e
de ser os mesmos e n˜o precisam ser 20. Vocˆ pode escolher qualquer tamanho de 1 a 255,
          e                     e a
o que vocˆ achar melhor. (Se vocˆ n˜o fizer uma boa escolha e depois precisar de um campo
maior, o MySQL fornece o comando ALTER TABLE.)
                                                 a
O sexo dos animais podem ser representados em v´rias formas, por exemplo, "m" e "f" ou
                            ´
mesmo "macho" e "f^mea". E mais simples usar os caracteres "m" e "f".
                    e
                                                                a
O uso do tipo de dados DATE para as colunas birth e death s˜o obviamente a melhor
escolha.
Agora que vocˆ criou uma tabela, a instru¸˜o SHOW TABLES deve produzir alguma sa´
              e                           ca                                       ida:
      mysql> SHOW TABLES;
      +---------------------+
      | Tables in menagerie |
      +---------------------+
      | pet                     |
      +---------------------+
                                                          e
Para verificar se sua tabela foi criada da forma que vocˆ esperava, utilize a instru¸˜oca
DESCRIBE:
      mysql> DESCRIBE pet;
      +---------+-------------+------+-----+---------+-------+
      | Field     | Type          | Null | Key | Default | Extra |
      +---------+-------------+------+-----+---------+-------+
      | name      | varchar(20) | YES |          | NULL      |         |
      | owner     | varchar(20) | YES |          | NULL      |         |
      | species | varchar(20) | YES |            | NULL      |         |
      | sex       | char(1)       | YES |        | NULL      |         |
      | birth     | date          | YES |        | NULL      |         |
      | death     | date          | YES |        | NULL      |         |
      +---------+-------------+------+-----+---------+-------+
    e                                                           e
Vocˆ pode usar DESCRIBE a qualquer hora, por exemplo, se vocˆ esquecer os nomes das
                                            a
colunas na sua tabela ou de que tipos elas s˜o.

3.3.3 Carregando dados em uma tabela
                               e         a      a             co                       a
Depois de criar sua tabela, vocˆ precisar´ povo´-la. As instru¸˜es LOAD DATA e INSERT s˜o
´
uteis para isto.
                                                                 e
Suponha que seu registro de animais possa ser descrito como ´ abaixo: (Observe que o
MySQL espera datas no formato AAAA-MM-DD; isto pode ser diferente do que vocˆ est´ e     a
acostumado.)
name             owner          species       sex            birth        death
Fluffy            Harold         cat           f              1993-02-04
Claws            Gwen           cat           m              1994-03-17
Buffy             Harold         dog           f              1989-05-13
Fang             Benny          dog           m              1990-08-27
Bowser           Diane          dog           m              1998-08-31   1995-07-29
Chirpy           Gwen           bird          f              1998-09-11
Whistler         Gwen           bird                         1997-12-09
Slim             Benny          snake         m              1996-04-29
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                      159



         e    a      c                                                    a e
Como vocˆ est´ come¸ando com uma tabela vazia, uma forma simples de povo´-la ´ criar
um arquivo texto contendo uma linha para cada um de seus animais, e depois carregar o
     u                                                  ca
conte´do do arquivo para a tabela com uma simples instru¸˜o.
    e
Vocˆ pode criar um arquivo texto ‘pet.txt’ contendo um registro por linha, com valores
                    co                                                               ca
separado por tabula¸˜es e na mesma ordem em que as colunas foram listadas na instru¸˜o
CREATE TABLE. Para valores em falta (como sexo desconhecido ou data da morte para
                       a           e                                          a
animais que ainda est˜o vivos), vocˆ pode usar valores NULL. Para represent´-lo em seu
arquivo texto, use \N. Por exemplo, o registro para Whistler the bird podem parecer com
                 c                             e                                ca
isto (onde o espa¸o em branco entre os valores ´ um simples caractere de tabula¸˜o):
Whistler        Gwen         bird          \N            1997-12-09            \N
Para carregar o arquivo texto ‘pet.txt’ na tabela pet, use este comando:
      mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
   e
Vocˆ pode especificar o valor do separador de colunas e o marcador de final de linha explici-
                   ca                   e                                   a
tamente na instru¸˜o LOAD DATA se vocˆ desejar. Mas os valores omitidos s˜o suficientes
             ca
para a instru¸˜o ler o arquivo ‘pet.txt’ corretamente.
            e                                                     ca         e
Quando vocˆ desejar adicionar novos registros um a um, a instru¸˜o INSERT ´ usada. Na
                           e
sua forma mais simples, vocˆ fornece valores para cada coluna, na ordem em que as colunas
                        ca
foram listadas na instru¸˜o CREATE TABLE. Suponha que Diane tenha um novo hamster
                      e                                                  ca
chamado Puffball. Vocˆ pode adicionar um registro utilizando uma instru¸˜o INSERT desta
forma:
      mysql> INSERT INTO pet
          -> VALUES (’Puffball’,’Diane’,’hamster’,’f’,’1999-03-30’,NULL);
                                          a
Perceba que os valores de string e datas s˜o especificados aqui como strings com aspas.
                   e     e
Com o INSERT vocˆ tamb´m pode inserir NULL diretamente para representar um valor em
        a                             e
falta. N˜o pode ser usado \N como vocˆ fez com LOAD DATA.
                             e       a                        a
A partir deste exemplo, vocˆ dever´ perceber que existem v´rias outras formas envolvidas
                                                                    co
para carregar seus registros inicialmente utilizando diversas instru¸˜es INSERT do que uma
              ca
simples instru¸˜o LOAD DATA.

                         co
3.3.4 Recuperando Informa¸˜es de uma Tabela
        ca         e                             co
A instru¸˜o SELECT ´ usada para recuperar informa¸˜es de uma tabela. A forma geral da
      ca e
instru¸˜o ´:
      SELECT o_que_mostrar
      FROM de_qual_tabela
                 co
      WHERE condi¸~es_para_satisfazer
                                e
o_que_mostrar indica o que vocˆ deseja ver. Isto pode ser uma lista de colunas ou * para
                                                                        e
indicar “todas colunas.” de_qual_tabela indica a tabela de onde vocˆ deseja recuperar
              a            e
os dados. A cl´usula WHERE ´ opcional. Se estiver presente, condi¸~es_para_satisfazer
                                                                  co
                    co
especificam as condi¸˜es que os registros devem satisfazer para fazer parte do resultado.

3.3.4.1 Selecionando Todos os Dados
A forma mais simples do SELECT recuperar tudo de uma tabela:
160                                             e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



       mysql> SELECT * FROM pet;
       +----------+--------+---------+------+------------+------------+
       | name     | owner | species | sex | birth        | death      |
       +----------+--------+---------+------+------------+------------+
       | Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
       | Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
       | Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
       | Fang     | Benny | dog      | m    | 1990-08-27 | NULL       |
       | Bowser   | Diane | dog      | m    | 1998-08-31 | 1995-07-29 |
       | Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
       | Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
       | Slim     | Benny | snake    | m    | 1996-04-29 | NULL       |
       | Puffball | Diane | hamster | f     | 1999-03-30 | NULL       |
       +----------+--------+---------+------+------------+------------+
                       e´         e
Esta forma do SELECT ´ util se vocˆ deseja ver sua tabela inteira, como agora, depois de vocˆe
acabar de carreg´-la com os dados iniciais. Como podemos ver, a saida
                 a                                                    ´ mostrada revela um
erro no seu arquivo de dados: Bowser nasceu depois de morto ! Consultando seus pap´is      e
                                                                    e       a
originais de pedigree, descobriu que o ano correto do nascimento ´ 1989, n˜o 1998.
Existem pelo menos duas formas de corrigir isto:
 • Edite o arquivo ‘pet.txt’ para corrigir o erro, depois limpe a tabela e recarregue-o
   usando DELETE e LOAD DATA:
                                                                ca
         mysql> SET AUTOCOMMIT=1; # Usado para a recria¸~o da tabela
         mysql> DELETE FROM pet;
         mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
                        e               e     e
      Entretanto, se vocˆ fizer isto, vocˆ tamb´m deve refazer a entrada para Puffball.
 • Corrigir somente o registro errado com uma instru¸˜o UPDATE:
                                                    ca
         mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser";
                             e a                                                    e a
Como foi mostrado acima, ´ f´cil recuperar uma tabela inteira. Mas normalmente vocˆ n˜o
                                                                                 e      a
vai quer fazer isto, particularmente quando a tabela ficar grande. Normalmente vocˆ estar´
                                                  a                           e
mais interessado em ter a resposta de uma quest˜o em particular, no qual vocˆ especifica
                      ca                                               ca
detalhes da informa¸˜o que deseja. Vamos ver algumas consultas de sele¸˜o nos termos das
     o
quest˜es sobre seus animais.

3.3.4.2 Selecionando Registros Espec´
                                    ificos
Vocˆ pode selecionar apenas registros espec´
    e                                                                              e
                                           ificos da sua tabela. Por exemplo, se vocˆ deseja
                 ca
verificar a altera¸˜o que fez na data de nascimento do Bowser, selecione o registro desta
forma:
       mysql> SELECT * FROM pet WHERE name = "Bowser";
       +--------+-------+---------+------+------------+------------+
       | name   | owner | species | sex | birth        | death     |
       +--------+-------+---------+------+------------+------------+
       | Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
       +--------+-------+---------+------+------------+------------+
A sa´ confirma que o ano foi gravado corretamente agora como 1989 e n˜o 1998.
    ida                                                             a
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                    161



         co                              a                       a     e
Compara¸˜es de strings normalmente s˜o caso insensitivo, ent˜o vocˆ pode especificar o
                                                                    a
nome como "bowser", "BOWSER", etc. O resultado da pesquisa ser´ o mesmo.
    e                        co                          a
Vocˆ pode especificar condi¸˜es em qualquer coluna, n˜o apenas no name. Por exemplo,
      e
se vocˆ deseja saber quais foram os animais que nasceram depois de 1998, teste o campo
birth:
      mysql> SELECT * FROM pet WHERE birth >= "1998-1-1";
      +----------+-------+---------+------+------------+-------+
      | name       | owner | species | sex | birth                | death |
      +----------+-------+---------+------+------------+-------+
      | Chirpy     | Gwen | bird          | f     | 1998-09-11 | NULL |
      | Puffball | Diane | hamster | f            | 1999-03-30 | NULL |
      +----------+-------+---------+------+------------+-------+
    e                      co
Vocˆ pode combinar condi¸˜es, por exemplo, para encontrar cadelas (dog/f):
      mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";
      +-------+--------+---------+------+------------+-------+
      | name | owner | species | sex | birth                    | death |
      +-------+--------+---------+------+------------+-------+
      | Buffy | Harold | dog           | f      | 1989-05-13 | NULL |
      +-------+--------+---------+------+------------+-------+
                                        o                          e
A consulta anterior utiliza o operador l´gico AND (e). Existe tamb´m um operador OR (ou):
      mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird";
      +----------+-------+---------+------+------------+-------+
      | name       | owner | species | sex | birth                | death |
      +----------+-------+---------+------+------------+-------+
      | Chirpy     | Gwen | bird          | f     | 1998-09-11 | NULL |
      | Whistler | Gwen | bird            | NULL | 1997-12-09 | NULL |
      | Slim       | Benny | snake        | m     | 1996-04-29 | NULL |
      +----------+-------+---------+------+------------+-------+
                                        e           e      o        e        e
AND e OR podem ser misturados. Se vocˆ fizer isto, ´ uma ´tima id´ia usar parˆnteses para
                   co
indicar quais condi¸˜es devem ser agrupadas:
      mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m")
           -> OR (species = "dog" AND sex = "f");
      +-------+--------+---------+------+------------+-------+
      | name | owner | species | sex | birth                    | death |
      +-------+--------+---------+------+------------+-------+
      | Claws | Gwen       | cat       | m      | 1994-03-17 | NULL |
      | Buffy | Harold | dog           | f      | 1989-05-13 | NULL |
      +-------+--------+---------+------+------------+-------+

3.3.4.3 Selecionando Colunas Espec´
                                  ificas
       e a
Se vocˆ n˜o desejar ver todo o registro de sua tabela, especifique as colunas em que vocˆe
estiver interessado, separado por v´                           e
                                   irgulas. Por exemplo, se vocˆ deseja saber quando seus
animais nasceram, selecione as colunas name e birth:
      mysql> SELECT name, birth FROM pet;
      +----------+------------+
      | name        | birth        |
162                                          e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



       +----------+------------+
       | Fluffy      | 1993-02-04 |
       | Claws       | 1994-03-17 |
       | Buffy       | 1989-05-13 |
       | Fang        | 1990-08-27 |
       | Bowser      | 1989-08-31 |
       | Chirpy      | 1998-09-11 |
       | Whistler | 1997-12-09 |
       | Slim        | 1996-04-29 |
       | Puffball | 1999-03-30 |
       +----------+------------+
                    a
Para saber quem s˜o os donos dos animais, use esta consulta:
       mysql> SELECT owner FROM pet;
       +--------+
       | owner |
       +--------+
       | Harold |
       | Gwen     |
       | Harold |
       | Benny |
       | Diane |
       | Gwen     |
       | Gwen     |
       | Benny |
       | Diane |
       +--------+
Entretanto, perceba que a query simplesmente retornou o campo owner de cada registro, e
alguns deles apareceram mais de uma vez. Para minimizar a sa´ida, recupere cada registro
apenas uma vez, adicionando a palavra chave DISTINCT:
       mysql> SELECT DISTINCT owner FROM pet;
       +--------+
       | owner |
       +--------+
       | Benny |
       | Diane |
       | Gwen     |
       | Harold |
       +--------+
     e                   a                              ca                       ca
Vocˆ pode usar uma cl´usula WHERE para combinar sele¸˜o de registros com sele¸˜o de
colunas. Por exemplo, para obter a data de nascimento somente dos gatos e cachorros,
utilize esta query:
       mysql> SELECT name, species, birth FROM pet
            -> WHERE species = "dog" OR species = "cat";
       +--------+---------+------------+
       | name     | species | birth       |
       +--------+---------+------------+
       | Fluffy | cat        | 1993-02-04 |
       | Claws | cat         | 1994-03-17 |
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                      163



      | Buffy | dog      | 1989-05-13 |
      | Fang   | dog     | 1990-08-27 |
      | Bowser | dog     | 1989-08-31 |
      +--------+---------+------------+

3.3.4.4 Ordenando Registros
    e                                                                        a a
Vocˆ deve ter percebido nos exemplos anteriores que os registros retornados n˜o s˜o mostra-
dos de forma ordenada. Entretanto, normalmente ´ mais f´cil examinar a sa´ da consulta
                                                  e       a                 ida
                     a
quando os registros s˜o ordenados com algum sentido. Para ordenar o resultado, utilize
       a
uma cl´usula ORDER BY.
        a
Aqui est´ o dia de nascimento dos animais, ordenado por data:
     mysql> SELECT name, birth FROM pet ORDER BY birth;
     +----------+------------+
     | name        | birth        |
     +----------+------------+
     | Buffy       | 1989-05-13 |
     | Bowser      | 1989-08-31 |
     | Fang        | 1990-08-27 |
     | Fluffy      | 1993-02-04 |
     | Claws       | 1994-03-17 |
     | Slim        | 1996-04-29 |
     | Whistler | 1997-12-09 |
     | Chirpy      | 1998-09-11 |
     | Puffball | 1999-03-30 |
     +----------+------------+
           ca
Para ordena¸˜o na ordem reversa, adicione a palavra chave DESC (descendente) ao nome da
coluna que deve ser ordenada:
      mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
      +----------+------------+
      | name       | birth       |
      +----------+------------+
      | Puffball | 1999-03-30 |
      | Chirpy     | 1998-09-11 |
      | Whistler | 1997-12-09 |
      | Slim       | 1996-04-29 |
      | Claws      | 1994-03-17 |
      | Fluffy     | 1993-02-04 |
      | Fang       | 1990-08-27 |
      | Bowser     | 1989-08-31 |
      | Buffy      | 1989-05-13 |
      +----------+------------+
    e                    u
Vocˆ pode ordenar por m´ltiplas colunas. Por exemplo, para ordenar o tipo de animal,
depois por dia de nascimento dentro do tipo de animal com os mais novos primeiro, utilize
a seguinte consulta:
      mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;
      +----------+---------+------------+
164                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



      | name     | species | birth      |
      +----------+---------+------------+
      | Chirpy   | bird    | 1998-09-11 |
      | Whistler | bird    | 1997-12-09 |
      | Claws    | cat     | 1994-03-17 |
      | Fluffy   | cat     | 1993-02-04 |
      | Fang     | dog     | 1990-08-27 |
      | Bowser   | dog     | 1989-08-31 |
      | Buffy    | dog     | 1989-05-13 |
      | Puffball | hamster | 1999-03-30 |
      | Slim     | snake   | 1996-04-29 |
      +----------+---------+------------+
Perceba que a palavra chave DESC aplica somente para o nome da coluna precedente (birth);
valores na coluna species continuam ordenados na ordem ascendente.


         a
3.3.4.5 C´lculo de Datas

                    a        co           e                      a
O MySQL fornece v´rias fun¸˜es que vocˆ pode usar para realizar c´lculos em datas, por
exemplo, para calcular idades ou extrair partes de datas.
                                                                                c
Para determinar quantos anos cada um do seus animais tem, compute a diferen¸a do ano
                                                                          e
da data atual e a data de nascimento (birth), depois subtraia se a o dia/mˆs da data atual
                      e
for anterior ao dia/mˆs da data de nascimento. A consulta seguinte, mostra, para cada
animal, a data de nascimento, a data atual e a idade em anos.
      mysql> SELECT name, birth, CURRENT_DATE,
          -> (YEAR(CURRENT_DATE)-YEAR(birth))
          -> - (RIGHT(CURRENT_DATE,5)<RIGHT(birth,5))
          -> AS age
          -> FROM pet;
      +----------+------------+--------------+------+
      | name     | birth      | CURRENT_DATE | age |
      +----------+------------+--------------+------+
      | Fluffy   | 1993-02-04 | 2001-08-29    |   8 |
      | Claws    | 1994-03-17 | 2001-08-29    |   7 |
      | Buffy    | 1989-05-13 | 2001-08-29    |  12 |
      | Fang     | 1990-08-27 | 2001-08-29    |  11 |
      | Bowser   | 1989-08-31 | 2001-08-29    |  11 |
      | Chirpy   | 1998-09-11 | 2001-08-29    |   2 |
      | Whistler | 1997-12-09 | 2001-08-29    |   3 |
      | Slim     | 1996-04-29 | 2001-08-29    |   5 |
      | Puffball | 1999-03-30 | 2001-08-29    |   2 |
      +----------+------------+--------------+------+
Aqui, YEAR() separa a parte do ano de uma data e RIGHT() separa os cinco caracteres
                                                                        a
mais a direita que representam a parte da data MM-DD. A parte da express˜o que compara
                                                           c
os valores MM-DD resulta em 1 ou 0, o qual ajusta a diferen¸a do ano um ano abaixo se
                                                                a           e
CURRENT_DATE ocorrer mais cedo, no ano, que birth. A express˜o completa ´ um tanto
                a                   e                        ´ mais significativa.
deselegante, ent˜o um apelido (age) ´ usado para obter uma saida
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                    165



A consulta funciona, mas o resultado pode ser mais compreens´  ivel se os registros forem
                                                                         a
apresentados em alguma ordem. Isto pode ser feito adicionando uma cl´usula ORDER BY
name para ordenar a sa´ pelo nome:
                      ida
      mysql> SELECT name, birth, CURRENT_DATE,
          -> (YEAR(CURRENT_DATE)-YEAR(birth))
          -> - (RIGHT(CURRENT_DATE,5)<RIGHT(birth,5))
          -> AS age
          -> FROM pet ORDER BY name;
      +----------+------------+--------------+------+
      | name       | birth       | CURRENT_DATE | age |
      +----------+------------+--------------+------+
      | Bowser     | 1989-08-31 | 2001-08-29      |     11 |
      | Buffy      | 1989-05-13 | 2001-08-29      |     12 |
      | Chirpy     | 1998-09-11 | 2001-08-29      |      2 |
      | Claws      | 1994-03-17 | 2001-08-29      |      7 |
      | Fang       | 1990-08-27 | 2001-08-29      |     11 |
      | Fluffy     | 1993-02-04 | 2001-08-29      |      8 |
      | Puffball | 1999-03-30 | 2001-08-29        |      2 |
      | Slim       | 1996-04-29 | 2001-08-29      |      5 |
      | Whistler | 1997-12-09 | 2001-08-29        |      3 |
      +----------+------------+--------------+------+
Para ordenar a sa´ por age em vez de name, ´ s´ utilizar uma cl´usua ORDER BY diferente:
                 ida                       e o                 a
      mysql> SELECT name, birth, CURRENT_DATE,
          -> (YEAR(CURRENT_DATE)-YEAR(birth))
          -> - (RIGHT(CURRENT_DATE,5)<RIGHT(birth,5))
          -> AS age
          -> FROM pet ORDER BY age;
      +----------+------------+--------------+------+
      | name       | birth       | CURRENT_DATE | age |
      +----------+------------+--------------+------+
      | Chirpy     | 1998-09-11 | 2001-08-29      |      2 |
      | Puffball | 1999-03-30 | 2001-08-29        |      2 |
      | Whistler | 1997-12-09 | 2001-08-29        |      3 |
      | Slim       | 1996-04-29 | 2001-08-29      |      5 |
      | Claws      | 1994-03-17 | 2001-08-29      |      7 |
      | Fluffy     | 1993-02-04 | 2001-08-29      |      8 |
      | Fang       | 1990-08-27 | 2001-08-29      |     11 |
      | Bowser     | 1989-08-31 | 2001-08-29      |     11 |
      | Buffy      | 1989-05-13 | 2001-08-29      |     12 |
      +----------+------------+--------------+------+
Uma consulta similar pode ser usada para determinar a idade na morte para animais que
                                  a                                            a e
morreram. Para determinar quais s˜o os animais, confira se o valor de death n˜o ´ NULL.
                               a                          c
Depois para estes com valores n˜o-NULL, compute a diferen¸a entre os valores dos campos
death e birth:
      mysql> SELECT name, birth, death,
          -> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5))
          -> AS age
          -> FROM pet WHERE death IS NOT NULL ORDER BY age;
166                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



      +--------+------------+------------+------+
      | name   | birth      | death      | age |
      +--------+------------+------------+------+
      | Bowser | 1989-08-31 | 1995-07-29 |    5 |
      +--------+------------+------------+------+
                                                                   e
A query usa death IS NOT NULL em vez de death != NULL porque NULL ´ um valor especial.
Isto ser´ explicado depois. See undefined [Working with NULL], page undefined .
        a
         e                                            a        o         e
E se vocˆ desejar saber quais animais fazem anivers´rio no pr´ximo mˆs? Para este tipo
    a                  a                   e                                         e
de c´lculo, ano e dia s˜o irrelevantes; vocˆ simplesmente deseja extrair a parte do mˆs da
                                                co
coluna birth. O MySQL fornece diversas fun¸˜es para extrair partes da data, como em
                                             e     ca
YEAR(), MONTH() e DAYOFMONTH(). MONTH ´ a fun¸˜o apropriada aqui. Para ver como ela
funciona, execute uma consulta simples que mostre o valor de birth e MONTH(birth):
      mysql> SELECT name, birth, MONTH(birth) FROM pet;
      +----------+------------+--------------+
      | name        | birth          | MONTH(birth) |
      +----------+------------+--------------+
      | Fluffy      | 1993-02-04 |                 2 |
      | Claws       | 1994-03-17 |                 3 |
      | Buffy       | 1989-05-13 |                 5 |
      | Fang        | 1990-08-27 |                 8 |
      | Bowser      | 1989-08-31 |                 8 |
      | Chirpy      | 1998-09-11 |                 9 |
      | Whistler | 1997-12-09 |                   12 |
      | Slim        | 1996-04-29 |                 4 |
      | Puffball | 1999-03-30 |                    3 |
      +----------+------------+--------------+
Encontrar animais com an´        a         o       e      e e a
                            ivers´rio no pr´ximo mˆs tamb´m ´ f´cil. Suponha que o mˆse
      e           a                e e        e                                       e
atual ´ abril. Ent˜o o valor do mˆs ´ 4 e vocˆ procura por animais nascidos em Maio (mˆs
5) assim:
      mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
      +-------+------------+
      | name | birth       |
      +-------+------------+
      | Buffy | 1989-05-13 |
      +-------+------------+
                              ca        e       e           e          e a
Existe uma pequena complica¸˜o se o mˆs atual ´ Dezembro, ´ claro. Vocˆ n˜o pode apenas
                     u            e                                         e
adicionar um para o n´mero do mˆs (12) e procurar por animais nascidos no mˆs 13, porque
 a              e                                                             e
n˜o existe tal mˆs. O certo seria procurar por animais nascidos em Janeiro (mˆs 1).
    e           e                                                               e
Vocˆ pode tamb´m escrever uma consulta para que funcione sem importar qual ´ o mˆs    e
                e a e                     u          e
atual. Assim vocˆ n˜o tˆm quee usar um n´mero de mˆs em particular na consulta. DATE_
                                                                             e
ADD() permite adicionar um intervalo de tempo para uma data fornecida. Se vocˆ adicionar
      e                           a                     e                            e
um mˆs para o valor de NOW(), ent˜o extrair a parte do mˆs com MONTH(), o resultado ´ o
  e            e                            a
mˆs no qual vocˆ deseja procurar por anivers´rios:
      mysql> SELECT name, birth FROM pet
          -> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                     167



                                                   e                           e
Uma maneira diferente para realizar a mesma tarefa ´ adicionar 1 para obter o mˆs seguinte
                              ca     o                             e
ao atual (depois de usar a fun¸˜o m´dulo (MOD) para o valor do mˆs retornar 0 se ele for
12):
      mysql> SELECT name, birth FROM pet
           -> WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;
                                u
Perceba que MONTH retorna um n´mero entre 1 e 12. E MOD(alguma_coisa,12) retorna um
n´mero entre 0 e 11. Ent˜o a adi¸˜o tem que ser feita depois do MOD(), sen˜o ir´
 u                       a        ca                                         a   iamos de
Novembro (11) para Janeiro (1).

3.3.4.6 Trabalhando com Valores Nulos (NULL)
                                       e    e a
O valor NULL pode ser supreendente at´ vocˆ us´-lo. Conceitualmente, NULL significa valor
                                 e
em falta ou valor desconhecido e ´ tratado de uma forma diferente de outros valores. Para
                        e a                                      co        e
testar o valor NULL, vocˆ n˜o pode usar os operadores de compara¸˜es aritm´ticas como em
                                       e
=, <, ou !=. Para demonstrar para vocˆ mesmo, tente executar a seguinte consulta:
       mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
       +----------+-----------+----------+----------+
       | 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
       +----------+-----------+----------+----------+
       |      NULL |        NULL |       NULL |       NULL |
       +----------+-----------+----------+----------+
                 e a        a                                        co
Claramente vocˆ n˜o obter´ resultados significativos destas compara¸˜es. Utilize os oper-
adores IS NULL e IS NOT NULL no lugar:
       mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
       +-----------+---------------+
       | 1 IS NULL | 1 IS NOT NULL |
       +-----------+---------------+
       |           0 |               1 |
       +-----------+---------------+
                                              e                                         a
No MySQL, 0 ou NULL significa falso e o resto ´ verdadeiro. O valor verdadeiro por o padr˜o
               ca
em uma opera¸˜o booleana ´ 1.e
                                   e               ca                     a
Este tratamento especial de NULL ´ porque, na se¸˜o anterior, foi necess´rio determinar
                 a
quais animais n˜o estavam mais vivos usando death IS NOT NULL no lugar de death !=
NULL.

               ca         o
3.3.4.7 Combina¸˜o de padr˜es
                            ca          o
O MySQL fornece combina¸˜o de padr˜es do SQL bem como na forma de combina¸˜o        ca
         o                       o                                 a
de padr˜es baseado nas express˜es regulares extendidas similares `quelas usadas pelos
      a
utilit´rios Unix como o vi, grep e sed.
             ca        o                      e
A combina¸˜o de padr˜es SQL lhe permite vocˆ usar _ para coincidir qualquer caractere
                                 u          a
simples e % para coincidir um n´mero arbitr´rio de caracteres (incluindo zero caracter).
                   o         a                         a                       a
No MySQL, padr˜es SQL s˜o caso insensitivo por padr˜o. Alguns exemplos s˜o vistos
                         e a                             o
abaixo. Perceba que vocˆ n˜o usa = ou != quando usar padr˜es SQL; use os operadores de
          ca
compara¸˜o LIKE ou NOT LIKE neste caso.
                            c
Para encontrar nomes come¸ando com ‘b’:
168                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



      mysql> SELECT * FROM pet WHERE name LIKE "b%";
      +--------+--------+---------+------+------------+------------+
      | name   | owner | species | sex | birth        | death      |
      +--------+--------+---------+------+------------+------------+
      | Buffy | Harold | dog      | f    | 1989-05-13 | NULL       |
      | Bowser | Diane | dog      | m    | 1989-08-31 | 1995-07-29 |
      +--------+--------+---------+------+------------+------------+
Para encontrar nomes com o final ‘fy’:
      mysql> SELECT * FROM pet WHERE name LIKE "%fy";
      +--------+--------+---------+------+------------+-------+
      | name   | owner | species | sex | birth        | death |
      +--------+--------+---------+------+------------+-------+
      | Fluffy | Harold | cat     | f    | 1993-02-04 | NULL |
      | Buffy | Harold | dog      | f    | 1989-05-13 | NULL |
      +--------+--------+---------+------+------------+-------+
Para encontrar nomes contendo um ‘w’:
      mysql> SELECT * FROM pet WHERE name LIKE "%w%";
      +----------+-------+---------+------+------------+------------+
      | name     | owner | species | sex | birth       | death      |
      +----------+-------+---------+------+------------+------------+
      | Claws    | Gwen | cat      | m    | 1994-03-17 | NULL       |
      | Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
      | Whistler | Gwen | bird     | NULL | 1997-12-09 | NULL       |
      +----------+-------+---------+------+------------+------------+
Para encontrar nomes contendo exatamente cinco caracteres, use o caracter ‘_’:
      mysql> SELECT * FROM pet WHERE name LIKE "_____";
      +-------+--------+---------+------+------------+-------+
      | name | owner | species | sex | birth         | death |
      +-------+--------+---------+------+------------+-------+
      | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL |
      | Buffy | Harold | dog     | f    | 1989-05-13 | NULL |
      +-------+--------+---------+------+------------+-------+
                         ca          o                                    o
O outro tipo de combina¸˜o de padr˜es fornecido pelo MySQL usa express˜es regulares
                        e                         ca                      a
extendidas. Quando vocˆ testa por uma combina¸˜o para este tipo de padr˜o, utilize os
                                                               a o
operadores REGEXP e NOT REGEXP (ou RLIKE e NOT RLIKE, que s˜o sinˆnimos).
Algumas caracter´                  o                         a
                isticas das express˜es regulares extendidas s˜o:
 • ‘.’ combina qualquer caractere unico
                                  ´
 • Uma classe de caracteres ‘[...]’ combina qualquer caractere que consta dentro dos
   colchetes. Por exemplo, ‘[abc]’ combina com ‘a’, ‘b’, ou ‘c’. Para nomear uma
        e                                c                                         u
   sequˆncia de caracteres utilize um tra¸o. ‘[a-z]’ combina com qualquer letra min´scula
                                       ´
   e ‘[0-9]’ combina com qualquer digito.
 • ‘*’ combina nenhuma ou mais instˆncias de sua precedˆncia. Por exemplo, ‘x*’ combina
                                   a                   e
                    u                                                         u
   com qualquer n´mero de caracteres ‘x’, ‘[0-9]*’ combina com qualquer n´mero de
    ´                                   u
   digitos e ‘.*’ combina com qualquer n´mero de qualquer coisa.
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                     169



 • Express˜es regulares caso sensitivo, mas vocˆ pode usar uma classe de caracteres para
          o                                    e
               ´             u             e
   combinar maiusculas/min´sculas se vocˆ desejar. Por exemplo, ‘[aA]’ combina o ‘a’
      u             u
   min´sculo ou mai´sculo e ‘[a-zA-Z]’ combina qualquer letra em ambos casos.
 • O padr˜o combina se ele ocorre em algum lugar no valor sendo testado. (Padr˜es SQL
         a                                                                    o
   combinam somente se eles combinarem com todo o valor.)
 • Para fazer com que um padr˜o deva combinar com o come¸o ou o fim de um valor
                                  a                             c
                                     c                        a
   sendo testado, utilize ‘^’ no come¸o ou ‘$’ no final do padr˜o.
                              o
Para demonstrar como express˜es regulares extendidas funcionam, as consultas com LIKE
mostradas acima foram reescritas abaixo usando REGEXP.
                         c                                                  c
Para encontrar nomes come¸ando com ‘b’, utilize ‘^’ para combinar com o come¸o do nome:
      mysql> SELECT * FROM pet WHERE name REGEXP "^b";
      +--------+--------+---------+------+------------+------------+
      | name    | owner | species | sex | birth               | death        |
      +--------+--------+---------+------+------------+------------+
      | Buffy | Harold | dog        | f        | 1989-05-13 | NULL           |
      | Bowser | Diane | dog        | m        | 1989-08-31 | 1995-07-29 |
      +--------+--------+---------+------+------------+------------+
             a                                                                     a
Antes da vers˜o 3.23.4 do MySQL, REGEXP era caso sensitivo, e a consulta anterior n˜o iria
                                                      u              u
retornar nenhum registro. Para combinar letras ‘b’ mai´sculas e min´sculas, utilize esta
consulta:
      mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
                                  c                ca
A partir do MySQL 3.23.4, para for¸ar uma compara¸˜o REGEXP com caso sensitivo, utilize
                                                                    a
a palavra-chave BINARY para tornar uma das strings em uma string bin´rias. Esta consulta
  a                               u              c
ir´ combinar somente com ‘b’s min´sculos no come¸o de um nome:
      mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b";
Para encontrar nomes finalizados com ‘fy’, utilize ‘$’ para combinar com o final do nome:
      mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
      +--------+--------+---------+------+------------+-------+
      | name    | owner | species | sex | birth               | death |
      +--------+--------+---------+------+------------+-------+
      | Fluffy | Harold | cat        | f       | 1993-02-04 | NULL |
      | Buffy | Harold | dog         | f       | 1989-05-13 | NULL |
      +--------+--------+---------+------+------------+-------+
                                        u            u
Para encontrar nomes contendo um ‘w’ min´sculo ou mai´sculo, utilize esta consulta:
      mysql> SELECT * FROM pet WHERE name REGEXP "w";
      +----------+-------+---------+------+------------+------------+
      | name      | owner | species | sex | birth            | death          |
      +----------+-------+---------+------+------------+------------+
      | Claws     | Gwen | cat        | m     | 1994-03-17 | NULL             |
      | Bowser    | Diane | dog       | m     | 1989-08-31 | 1995-07-29 |
      | Whistler | Gwen | bird        | NULL | 1997-12-09 | NULL              |
      +----------+-------+---------+------+------------+------------+
                   a                                 o
Como uma express˜o regular extendida encontra padr˜es coincidentes se eles ocorrem em
                                    a e        a
qualquer lugar no valor comparado, n˜o ´ necess´rio utiliar, na consulta anterior, nenhum
170                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                                             a        e
metacaracter em nenhum dos lados do padr˜o para fazˆ-lo coincidir com todo o valor, como
                                     a
seria feito se fosse utilizado o padr˜o SQL.
Para encontrar nomes contendo exatamente cinco caracteres, utilize ‘^’ e ‘$’ para combinar
             c                             a
com o come¸o e fim do nome e cinco instˆncias de ‘.’ entre eles.
       mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
       +-------+--------+---------+------+------------+-------+
       | name | owner | species | sex | birth                 | death |
       +-------+--------+---------+------+------------+-------+
       | Claws | Gwen        | cat       | m   | 1994-03-17 | NULL |
       | Buffy | Harold | dog            | f   | 1989-05-13 | NULL |
       +-------+--------+---------+------+------------+-------+
    e             e
Vocˆ pode tamb´m escrever a consulta anterior utilizando o operador ‘{n}’ “repete-n-vezes”:
       mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
       +-------+--------+---------+------+------------+-------+
       | name | owner | species | sex | birth                 | death |
       +-------+--------+---------+------+------------+-------+
       | Claws | Gwen        | cat       | m   | 1994-03-17 | NULL |
       | Buffy | Harold | dog            | f   | 1989-05-13 | NULL |
       +-------+--------+---------+------+------------+-------+

3.3.4.8 Contando Registros
                                a                                                   e
Bancos de dados normalmente s˜o usados para responder a perguntas, “Qual a frequˆncia
                                                                      e
que certo tipo de dados ocorre em uma tabela?” Por exemplo, vocˆ deve querer saber
                                                                 e                  a
quantos animais tem, ou quantos animais cada dono tem, ou vocˆ pode querer fazer v´rios
outros tipos de censos com seus animais.
               u                             e     e                a
Contando o n´mero total de animais que vocˆ tem ´ a mesma quest˜o como em “Quantos
                                                                             ca
registros existem na tabela pet?” porque existe um registro por animal. A fun¸˜o COUNT()
            u                    a
conta o n´mero de resultados n˜o-NULL, portanto a pesquisa para contar seus animais
         a
parecer´ com isto:
       mysql> SELECT COUNT(*) FROM pet;
       +----------+
       | COUNT(*) |
       +----------+
       |         9 |
       +----------+
           e         a                                                e
Logo, vocˆ recuperar´ os nomes das pessoas que possuam animais. Vocˆ pode usar COUNT()
       e
se vocˆ desejar encontrar quantos animais cada dono possui:
       mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
       +--------+----------+
       | owner | COUNT(*) |
       +--------+----------+
       | Benny |            2 |
       | Diane |            2 |
       | Gwen    |          3 |
       | Harold |           2 |
       +--------+----------+
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                     171



Perceba o uso de GROUP BY para agrupar todos os registros para cada owner (dono). Sem
        e
ele, vocˆ teria uma mensagem de erro:
       mysql> SELECT owner, COUNT(owner) FROM pet;
       ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
       with no GROUP columns is illegal if there is no GROUP BY clause
                     a ´
COUNT() e GROUP BY s˜o uteis para personalizar seus dados de diversas maneiras. Os
                                                                  co
seguintes exemplos mostram diferentes maneiras para realizar opera¸˜es de censo nos ani-
mais.
 u                       e
N´mero de animais por esp´cie:
    mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
    +---------+----------+
    | species | COUNT(*) |
    +---------+----------+
    | bird     |           2 |
    | cat      |           2 |
    | dog      |           3 |
    | hamster |            1 |
    | snake    |           1 |
    +---------+----------+
 u
N´mero de animais por sexo:
      mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
      +------+----------+
      | sex | COUNT(*) |
      +------+----------+
      | NULL |           1 |
      | f      |         4 |
      | m      |         4 |
      +------+----------+
(Nesta sa´
         ida, NULL indica sexo desconhecido.)
 u                              e
N´mero de animais combinando esp´cie e sexo:
    mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
    +---------+------+----------+
    | species | sex | COUNT(*) |
    +---------+------+----------+
    | bird     | NULL |           1 |
    | bird     | f     |          1 |
    | cat      | f     |          1 |
    | cat      | m     |          1 |
    | dog      | f     |          1 |
    | dog      | m     |          2 |
    | hamster | f      |          1 |
    | snake    | m     |          1 |
    +---------+------+----------+
  a e       a
N˜o ´ necess´rio selecionar uma tabela inteira quando estiver usando COUNT(). Por exemplo,
a consulta anterior, quando realizada apenas procurando por cachorros e gatos, se parece
com isto:
172                                             e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



     mysql> SELECT species, sex, COUNT(*) FROM pet
           -> WHERE species = "dog" OR species = "cat"
           -> GROUP BY species, sex;
     +---------+------+----------+
     | species | sex | COUNT(*) |
     +---------+------+----------+
     | cat       | f    |        1 |
     | cat       | m    |        1 |
     | dog       | f    |        1 |
     | dog       | m    |        2 |
     +---------+------+----------+
           e                u
Ou se vocˆ desejar saber o n´mero de animais por sexo somente de animais com sexo
conhecido:
     mysql> SELECT species, sex, COUNT(*) FROM pet
           -> WHERE sex IS NOT NULL
           -> GROUP BY species, sex;
     +---------+------+----------+
     | species | sex | COUNT(*) |
     +---------+------+----------+
     | bird      | f    |        1 |
     | cat       | f    |        1 |
     | cat       | m    |        1 |
     | dog       | f    |        1 |
     | dog       | m    |        2 |
     | hamster | f      |        1 |
     | snake     | m    |        1 |
     +---------+------+----------+

                    u
3.3.4.9 Utilizando M´ ltiplas Tabelas
                    e           co                       e             e
A tabela pet mant´m informa¸˜es de quais animais vocˆ tem. Se vocˆ deseja gravar outras
        co                                                                      a
informa¸˜es sobre eles como eventos em suas vidas, tais como visitas ao veterin´rio ou sobre
               e           a
suas crias, vocˆ necessitar´ de outra tabela. Como esta tabela deve se parecer ? Ela precisa:
  • Conter o nome do animal para que vocˆ saiba a qual animal pertence o evento.
                                              e
  • Uma data para que vocˆ saiba quando ocorreu o evento.
                              e
  • Um campo para descrever o evento.
  • Um campo com o tipo de evento, se vocˆ desejar classific´-los por categoria.
                                                e              a
                     co            ca
Dadas estas considera¸˜es, a instru¸˜o CREATE TABLE para a tabela event deve se parecer
com isto:
      mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
          -> type VARCHAR(15), remark VARCHAR(255));
                      e        a
Como na tabela pet, ´ mais f´cil carregar os registros iniciais criando um arquivo texto
                     co                      ca
delimitado por tabula¸˜es contendo a informa¸˜o:
Fluffy           1995-05-15 litter         4 kittens, 3 female, 1 male
Buffy            1993-06-23 litter         5 puppies, 2 female, 3 male
Buffy            1994-06-19 litter         3 puppies, 3 female
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                    173



Chirpy           1999-03-21 vet              needed beak straightened
Slim             1997-08-03 vet              broken rib
Bowser           1991-10-12 kennel
Fang             1991-10-12 kennel
Fang             1998-08-28 birthday         Gave him a new chew toy
Claws            1998-03-17 birthday         Gave him a new flea collar
Whistler         1998-12-09 birthday         First birthday
Carregue os registros usando:
       mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event;
                     e a                                                        e
Baseado no que vocˆ j´ aprendeu com as consultas realizadas na tabela pet, vocˆ deve estar
apto para realizar pesquisas na tabela event; os princ´           a
                                                           ipios s˜o o mesmo. Mas quando a
                         e                             a
tabela event, sozinha, ´ insuficiente para responder `s suas quest˜es? o
                  e
Suponha que vocˆ deseje saber as idades de cada animal quando eles tiveram cria. A tabela
                                                                     a     e       a
event indica quando isto ocorre, mas para calcular a idade da m˜e, vocˆ precisar´ da data
                                      a                                  e       a
de nascimento dela. Como isto est´ armazenado na tabela pet, vocˆ precisar´ das duas
tabelas para a consulta:
       mysql> SELECT pet.name, (TO_DAYS(date) - TO_DAYS(birth))/365 AS age, remark
             -> FROM pet, event
             -> WHERE pet.name = event.name AND type = "litter";
       +--------+------+-----------------------------+
       | name     | age | remark                                 |
       +--------+------+-----------------------------+
       | Fluffy | 2.27 | 4 kittens, 3 female, 1 male |
       | Buffy | 4.12 | 5 puppies, 2 female, 3 male |
       | Buffy | 5.10 | 3 puppies, 3 female                      |
       +--------+------+-----------------------------+
            a
Existem v´rias coisas que devem ser percebidas sobre esta consulta:
  • A cl´usula FROM lista as duas tabelas porque a consulta precisa extrair informa¸˜o de
          a                                                                           ca
     ambas.
  • Quando combinar (unir) informa¸˜es de m´ltiplas tabelas, vocˆ precisa especificar como
                                       co       u                     e
                                                                                    e
     registros em uma tabela podem ser coincididas com os registros na outra. Isto ´ simples
                                                                           a
     porque ambas possuem uma coluna name. A consulta utiliza a cl´usula WHERE para
     coincidir registros nas duas tabelas baseadas nos valores de name.
  • Como a coluna name ocorre em ambas tabelas, vocˆ deve especificar qual a tabela a que
                                                         e
         e    a                   e
     vocˆ est´ se referindo. Isto ´ feito usando o nome da tabela antes do nome da coluna
     separados por um ponto (.).
    e a                                                           a                 e´
Vocˆ n˜o precisa ter duas tabelas diferentes para realizar uma uni˜o. Algumas vezes ´ util
                                    e
unir uma tabela a ela mesma, se vocˆ deseja comparar registros em uma tabela com outros
registros na mesma tabela. Por exemplo, para encontrar pares entre seus animais, vocˆ   e
                                                                         e
pode unir a tabela pet com ela mesma para formar pares de machos e fˆmeas de acordo
           e
com as esp´cies:
       mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
           -> FROM pet AS p1, pet AS p2
           -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m";
       +--------+------+--------+------+---------+
174                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



      | name   | sex | name    | sex | species |
      +--------+------+--------+------+---------+
      | Fluffy | f    | Claws | m     | cat     |
      | Buffy | f     | Fang   | m    | dog     |
      | Buffy | f     | Bowser | m    | dog     |
      +--------+------+--------+------+---------+
                  o
Nesta consulta, n´s especificamos apelidos para os nomes das tabelas para conseguir ref-
         a                                a                                   e        a
erenciar `s colunas e manter com qual instˆncia da tabela cada coluna de referˆncia est´
associdada.

                   c˜
3.4 Obtendo Informa¸oes Sobre Bancos de Dados e Tabelas
         e                                                               e
E se vocˆ esquecer o nome de um banco de dados ou tabela, ou como ´ a estrutura de
                                                    a
uma certa tabela (por exemplo, como suas colunas s˜o chamadas)? O MySQL resolve este
               e                   co                       co
problema atrav´s de diversas instru¸˜es que fornecem informa¸˜es sobre os bancos de dados
e as tabelas que ele suporta.
   e a
Vocˆ j´ viu SHOW DATABASES, que lista os bancos de dados gerenciados pelo servidor. Para
                             a                                      ca
saber qual banco de dados est´ sendo usado atualmente, utilize a fun¸˜o DATABASE():
      mysql> SELECT DATABASE();
      +------------+
      | DATABASE() |
      +------------+
      | menagerie |
      +------------+
      e        a                                                           a
Se vocˆ ainda n˜o selecionou nenhum banco de dados ainda, o resultado estar´ em branco.
                                                      e                        e a
Para saber quais tabelas o banco de dados atual contˆm (por exemplo, quando vocˆ n˜o
tem certeza sobre o nome de uma tabela), utilize este comando:
      mysql> SHOW TABLES;
      +---------------------+
      | Tables in menagerie |
      +---------------------+
      | event                  |
      | pet                    |
      +---------------------+
      e                                                                  e´
Se vocˆ deseja saber sobre a estrutura de uma tabela, o comando DESCRIBE ´ util; ele mostra
        co
informa¸˜es sobre cada uma das colunas da tabela:
      mysql> DESCRIBE pet;
      +---------+-------------+------+-----+---------+-------+
      | Field     | Type            | Null | Key | Default | Extra |
      +---------+-------------+------+-----+---------+-------+
      | name      | varchar(20) | YES |            | NULL     |        |
      | owner     | varchar(20) | YES |            | NULL     |        |
      | species | varchar(20) | YES |              | NULL     |        |
      | sex       | char(1)         | YES |        | NULL     |        |
      | birth     | date            | YES |        | NULL     |        |
      | death     | date            | YES |        | NULL     |        |
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                      175



      +---------+-------------+------+-----+---------+-------+
                                                          e
A coluna Field (campo) indica o nome da coluna, Type ´ o tipo de dados para a coluna,
                                                                                 e
Null indica se a coluna pode conter valores nulos (NULL), key indica se a coluna ´ indexada
    a                                    a
ou n˜o e Default especifica o valor padr˜o da coluna.
Se vocˆ tem ´
      e                                                                      co
            indices em uma tabela, SHOW INDEX FROM tbl_nome traz informa¸˜es sobre eles.

3.5 Exemplos de Consultas Comuns
         a
Aqui est˜o os exemplos de como resolver problemas comuns com o MySQL.
Alguns dos exemplos usam a tabela shop para armazenar o pre¸o de cada ´
                                                                c         item (article)
                                                                      c
para certas revendas (dealers). Supondo que cada revenda tenha um pre¸o fixo por artigo,
   a                       e              a
ent˜o (article, dealer) ´ uma chave prim´ria para os registros.
Inicie a ferramenta de linha de comando mysql e selecione um banco de dados:
       mysql o-nome-do-seu-banco-de-dados
                        co                 e
(Na maioria das instala¸˜es do MySQL, vocˆ pode usar o banco de dados ’test’).
    e
Vocˆ pode criar a tabela exemplo assim:
       CREATE TABLE shop (
        article INT(4) UNSIGNED ZEROFILL DEFAULT ’0000’ NOT NULL,
        dealer CHAR(20)                      DEFAULT ’’        NOT NULL,
        price    DOUBLE(16,2)                DEFAULT ’0.00’ NOT NULL,
        PRIMARY KEY(article, dealer));

      INSERT INTO shop VALUES
      (1,’A’,3.45),(1,’B’,3.99),(2,’A’,10.99),(3,’B’,1.45),(3,’C’,1.69),
      (3,’D’,1.25),(4,’D’,19.95);
                                 a
Feito isto, os dados de exemplo s˜o:
      mysql> SELECT * FROM shop;

      +---------+--------+-------+
      | article | dealer | price |
      +---------+--------+-------+
      |    0001 | A      | 3.45 |
      |    0001 | B      | 3.99 |
      |    0002 | A      | 10.99 |
      |    0003 | B      | 1.45 |
      |    0003 | C      | 1.69 |
      |    0003 | D      | 1.25 |
      |    0004 | D      | 19.95 |
      +---------+--------+-------+

               a
3.5.1 O Valor M´ximo para uma Coluna
“Qual ´ o maior n´mero dos ´
      e          u         itens?”
     SELECT MAX(article) AS article FROM shop

      +---------+
176                                          e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



      | article |
      +---------+
      |       4 |
      +---------+

                                       a
3.5.2 O Registro que Armazena o Valor M´ximo para uma Certa
      Coluna
“Encontre o n´mero, fornecedor e pre¸o do ´
             u                      c     item mais caro.”
                 e        a
No SQL ANSI isto ´ feito f´cilmente com uma sub-consulta:
      SELECT article, dealer, price
      FROM   shop
      WHERE price=(SELECT MAX(price) FROM shop)
                     a                          c
No MySQL (que ainda n˜o suporta sub-selects), fa¸a isto em dois passos:
                          c   a                             ca
 1. Obtenha o valor do pre¸o m´ximo da tabela com uma instru¸˜o SELECT.
 2. Usando este valor componha a pesquisa:
          SELECT article, dealer, price
          FROM   shop
          WHERE price=19.95

          ca e                                      c
Outra solu¸˜o ´ ordenar todos os registros por pre¸o de forma descendente e obtenha so-
mente o primeiro registro utilizando a cl´usula espec´
                                         a            ifica do MySQL LIMIT:
      SELECT article, dealer, price
      FROM    shop
      ORDER BY price DESC
      LIMIT 1
NOTA: Se existir diversos ´                                                       ca
                          itens mais caros (por exemplo, cada um por 19,95) a solu¸˜o
LIMIT mostra somente um deles !

       a
3.5.3 M´ximo da Coluna por Grupo
“Qual ´ o maior pre¸o por ´
      e            c      item?”
      SELECT article, MAX(price) AS price
      FROM   shop
      GROUP BY article

      +---------+-------+
      | article | price |
      +---------+-------+
      |    0001 | 3.99 |
      |    0002 | 10.99 |
      |    0003 | 1.69 |
      |    0004 | 19.95 |
      +---------+-------+
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                     177


                                          a
3.5.4 As Linhas Armazenando o Group-wise M´ximo de um Certo
      Campo
“Para cada ´                                                c
           item, encontre o(s) fornecedor(s) com o maior pre¸o.”
No SQL ANSI, poder´  iamos fazer uma sub-consulta, desta forma:
     SELECT article, dealer, price
     FROM     shop s1
     WHERE price=(SELECT MAX(s2.price)
                       FROM shop s2
                       WHERE s1.article = s2.article);
           e            e
No MySQL ´ melhor fazˆ-lo em diversos passos:
 1. Obtenha a lista de (article,maxprice).
 2. Para cada ´                                                                c
               item obtenha os registros correspondentes que tenham o maior pre¸o.
                                                    a
Isto pode ser feito facilmente com uma tabela tempor´ria:
      CREATE TEMPORARY TABLE tmp (
                article INT(4) UNSIGNED ZEROFILL DEFAULT ’0000’ NOT NULL,
                price     DOUBLE(16,2)                DEFAULT ’0.00’ NOT NULL);

      LOCK TABLES shop read;

      INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;

      SELECT shop.article, dealer, shop.price FROM shop, tmp
      WHERE shop.article=tmp.article AND shop.price=tmp.price;

      UNLOCK TABLES;

      DROP TABLE tmp;
Se vocˆ n˜o usar uma tabela TEMPOR´RIA, vocˆ deve bloquear tamb´m a tabela ’tmp’.
      e a                          A       e                   e
                          ´
“Posso fazer isto com uma unica query?”
Sim, mas somente com um truque ineficiente que eu chamo de “truque MAX-CONCAT”:
      SELECT article,
               SUBSTRING( MAX( CONCAT(LPAD(price,6,’0’),dealer) ), 7) AS dealer,
        0.00+LEFT(        MAX( CONCAT(LPAD(price,6,’0’),dealer) ), 6) AS price
      FROM     shop
      GROUP BY article;

      +---------+--------+-------+
      | article | dealer | price |
      +---------+--------+-------+
      |     0001 | B        | 3.99 |
      |     0002 | A        | 10.99 |
      |     0003 | C        | 1.69 |
      |     0004 | D        | 19.95 |
      +---------+--------+-------+
  ´                    e                                                               ca
O ultimo exemplo pode, ´ claro, ser feito de uma maneira mais eficiente fazendo a separa¸˜o
da coluna concatenada no cliente.
178                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                     a           a
3.5.5 Utilizando Vari´veis de Usu´rio
    e              a           a
Vocˆ pode usar vari´veis de usu´rios no MySQL para lembrar de resultados sem a necessi-
                a            a
dade de armazen´-las em vari´veis no cliente. See undefined [Variables], page undefined .
Por exemplo, para encontrar os ´                  c                              e
                                 itens com os pre¸os mais altos e mais baixos vocˆ pode
fazer:
       select @min_price:=min(price),@max_price:=max(price) from shop;
       select * from shop where price=@min_price or price=@max_price;

      +---------+--------+-------+
      | article | dealer | price |
      +---------+--------+-------+
      |    0003 | D      | 1.25 |
      |    0004 | D      | 19.95 |
      +---------+--------+-------+

3.5.6 Utilizando Chaves Estrangeiras
   e a
Vocˆ n˜o precisa de chaves estrangeiras para unir 2 tabelas.
   ´                          a      e
A unica coisa que o MySQL n˜o faz ´ CONFERIR para ter certeza que as chaves que vocˆ   e
                                                           a
usa realmente existem na(s) tabela(s) referenciadas e ele n˜o apaga automaticamente reg-
                                ca                                e
istros da tabela com uma defini¸˜o de chave estrangeira. Se vocˆ utiliza suas chaves da
                a
normalmente, ir´ funcionar bem:
       CREATE TABLE persons (
           id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
           name CHAR(60) NOT NULL,
           PRIMARY KEY (id)
       );

      CREATE TABLE shirts (
          id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
          style ENUM(’t-shirt’, ’polo’, ’dress’) NOT NULL,
          color ENUM(’red’, ’blue’, ’orange’, ’white’, ’black’) NOT NULL,
          owner SMALLINT UNSIGNED NOT NULL REFERENCES persons,
          PRIMARY KEY (id)
      );


      INSERT INTO persons VALUES (NULL, ’Antonio Paz’);

      INSERT   INTO shirts VALUES
      (NULL,   ’polo’, ’blue’, LAST_INSERT_ID()),
      (NULL,   ’dress’, ’white’, LAST_INSERT_ID()),
      (NULL,   ’t-shirt’, ’blue’, LAST_INSERT_ID());


      INSERT INTO persons VALUES (NULL, ’Lilliana Angelovska’);
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                              179



     INSERT   INTO shirts VALUES
     (NULL,   ’dress’, ’orange’, LAST_INSERT_ID()),
     (NULL,   ’polo’, ’red’, LAST_INSERT_ID()),
     (NULL,   ’dress’, ’blue’, LAST_INSERT_ID()),
     (NULL,   ’t-shirt’, ’white’, LAST_INSERT_ID());


     SELECT * FROM persons;
     +----+---------------------+
     | id | name                |
     +----+---------------------+
     | 1 | Antonio Paz          |
     | 2 | Lilliana Angelovska |
     +----+---------------------+

     SELECT * FROM shirts;
     +----+---------+--------+-------+
     | id | style   | color | owner |
     +----+---------+--------+-------+
     | 1 | polo     | blue   |     1 |
     | 2 | dress    | white |      1 |
     | 3 | t-shirt | blue    |     1 |
     | 4 | dress    | orange |     2 |
     | 5 | polo     | red    |     2 |
     | 6 | dress    | blue   |     2 |
     | 7 | t-shirt | white |       2 |
     +----+---------+--------+-------+


     SELECT   s.* FROM persons p, shirts s
      WHERE   p.name LIKE ’Lilliana%’
        AND   s.owner = p.id
        AND   s.color <> ’white’;

     +----+-------+--------+-------+
     | id | style | color | owner |
     +----+-------+--------+-------+
     | 4 | dress | orange |      2 |
     | 5 | polo | red      |     2 |
     | 6 | dress | blue    |     2 |
     +----+-------+--------+-------+


3.5.7 Pesquisando em Duas Chaves

                 a                    e
O MySQL ainda n˜o otimiza quando vocˆ pesquisa em duas chaves diferentes combinadas
                                                       e
com OR (Pesquisa em uma chave com diferentes partes OR ´ muito bem otimizadas).
     SELECT field1_index, field2_index FROM test_table WHERE field1_index = ’1’
     OR field2_index = ’1’
180                                          e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



      a e       o         a
A raz˜o ´ que n´s ainda n˜o tivemos tempos para fazer este tratamento de uma maneira
                                    ca           e              ca
eficiente no caso geral. (A manipula¸˜o do AND ´, em compara¸˜o, completamente geral e
funciona muito bem).
No momento vocˆ pode resolver isto de maneira eficiente usando uma tabela TEMPOR´RIA.
                 e                                                                   A
                     ca e       e                      e
Este tipo de otimiza¸˜o ´ tamb´m muito boa se vocˆ estiver utilizando consultas muito
                                                   co
complicadas no qual o servidor SQL faz as otimiza¸˜es na ordem errada.
      CREATE TEMPORARY TABLE tmp
      SELECT field1_index, field2_index FROM test_table WHERE field1_index = ’1’;
      INSERT INTO tmp
      SELECT field1_index, field2_index FROM test_table WHERE field2_index = ’1’;
      SELECT * from tmp;
      DROP TABLE tmp;
                                                     e        a
A maneira descrita acima para resolver esta consulta ´ uma uni˜o (UNION) de duas consultas.

                           a
3.5.8 Calculando Visitas Di´rias
                               e                    co       a
A seguir demonstramos uma id´ia de como usar as fun¸˜es bin´rias de agrupamento para
            u                   e           a                      a
calcular o n´mero de dias por mˆs que um usu´rio tem visitado uma p´gina web.
      CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL, day INT(2) UNSIGNED Z
      INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),(2000,2,23),(2000

      SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month;

                  a
      que retornar´:

      +------+-------+------+
      | year | month | days |
      +------+-------+------+
      | 2000 |     01 |     3 |
      | 2000 |     02 |     2 |
      +------+-------+------+
                                                                             ca
O exemplo acima calcula quantos dias diferentes foram usados para uma combina¸˜o
              e               ca       a
fornecida de mˆs/ano, com remo¸˜o autom´tica de entradas duplicadas.

3.6 Utilizando mysql em Modo Batch
       co                 e
Nas se¸˜es anteriores, vocˆ usou mysql interativamente para fazer consultas e ver os re-
              e           e
sultados. Vocˆ pode tamb´m executar mysql no modo batch. Para fazer isto, coloque os
                  e
comando que vocˆ deseja executar em um arquivo, e diga ao mysqld para ler sua entrada
do arquivo:
      shell> mysql < batch-file
      e                       a                a
Se vocˆ precisa especificar parˆmetros de conex˜o na linha de comando, o comando deve
parecer com isto:
      shell> mysql -h host -u user -p < batch-file
      Enter password: ********
            e                                 e     a
Quando vocˆ utilizar o mysql desta forma, vocˆ estar´ criando um arquivo script, depois
executando o script.
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                         181



                                      a
Por que usar um script? Existem v´rias raz˜es:  o
  • Se vocˆ executa uma query repetidamente (digamos, todos os dias ou todas as semanas),
           e
               a                                     e a
    transform´-lo em um script permite que vocˆ n˜o o redigite toda vez que o executa.
  • Vocˆ pode gerar novas consultas a partir das j´ existentes copiando e editando os
        e                                                 a
    arquivos de script.
  • O modo batch pode tamb´m ser util quando vocˆ estiver desenvolvendo uma consulta,
                                 e       ´               e
                                               u                      e
    particularmente para comandos de m´ltiplas linhas ou sequˆncias de comandos com
     a            co           e                      a     a      a
    v´rias instru¸˜es. Se vocˆ cometer um erro, n˜o ser´ necess´rio redigitar tudo. Apenas
                                                                               a
    edite seu arquivo script e corrija o erro, depois diga ao mysql para execut´-lo novamente.
                                                    ´
  • Se vocˆ tem uma query que produz muita saida, vocˆ pode encaminhar a sa´ atrav´s
           e                                                 e                      ida     e
             a
    de um p´ginador.
           shell> mysql < batch-file | more
  • Vocˆ pode capturar a sa´ em um arquivo para processamento posterior:
        e                      ida
           shell> mysql < batch-file > mysql.out
  • Vocˆ pode distribuir seu script para outras pessoas para que elas possam executar os
        e
    comandos tamb´m. e
  • Algumas situa¸˜es n˜o permitem uso interativo, por exemplo, quando vocˆ executa
                    co     a                                                          e
                         e                            a
    uma consulta atrav´s de um processo autom´tico (cron job). Neste caso, vocˆ deve    e
    usar o modo batch.
A formato padr˜o de sa´ ´ diferente (mais conciso) quando vocˆ executa o mysql no modo
                a       ida e                                       e
batch do que quando vocˆ o usa interativamente. Por exemplo, a sa´ de SELECT DISTINCT
                          e                                            ida
                                                      e
species FROM pet se parece com isto quando vocˆ o executa interativamente:
      +---------+
      | species |
      +---------+
      | bird       |
      | cat        |
      | dog        |
      | hamster |
      | snake      |
      +---------+
                             e
Mas fica assim quando vocˆ o executa no modo batch:
      species
      bird
      cat
      dog
      hamster
      snake
Se vocˆ desejar obter o formato de sa´ interativa no modo batch, utilize mysql -t. Para
      e                                  ida
mostrar a sa´ dos comandos que s˜o executados, utilize mysql -vvv.
             ida                       a

                           e
3.7 Consultas de Projetos Gˆmeos
                            o
Em Analytikerna e Lentus, n´s estamos fazendo os sistemas e trabalho de campo para um
                                         e             ca
grande projeto de pesquisa. Este projeto ´ uma colabora¸˜o entre o Institudo de Medicina
182                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



Ambiental em Karolinksa Institutet Stockholm e a Se¸˜o de Pesquisa Cl´
                                                     ca              inica em Envelhec-
imento e Psicologia na University of Southern California.
                                     ca                 e          e
O projeto envolve uma parte de sele¸˜o onde todos os gˆmeos na Su´cia mais velhos que 65
       a                                 e                              e
anos s˜o entrevistados por telefone. Gˆmeos que preenchem certos crit´rios passam para
    o         a                a               e                              a
o pr´ximo est´gio. Neste est´gio posterior, gˆmeos que desejam participar s˜o visitados
por uma equipe de doutores/enfermeiros. Alguns dos consultas incluem exames f´     isicos e
           o                       o                             ca                   o
neuropsicol´gico, testes de laborat´rio, imagem neural, determina¸˜o do estado psicol´gico
                 o                                        a
e coletas de hist´rico familiar. Adicionalmente, dados s˜o coletados em fatores de riscos
  e
m´dicos e ambientais.
            co                        e
Mais informa¸˜es sobre o estudos dos gˆmeos pode ser encontrados em:
      http://www.imm.ki.se/TWIN/TWINUKW.HTM
                             e
A parte posterior do projeto ´ administrada com uma interface Web escrita utilizando a
linguagem Perl e o MySQL.
                                        a
Cada noite todos dados das entrevistas s˜o movidos para um banco de dados MySQL.

3.7.1 Encontrando Todos Gˆmeos N˜o-distribu´
                         e      a          idos
                    e
A seguinte consulta ´ usada para determinar quem vai na segunda parte do projeto:
     select
               concat(p1.id, p1.tvab) + 0 as tvid,
               concat(p1.christian_name, " ", p1.surname) as Name,
               p1.postal_code as Code,
               p1.city as City,
               pg.abrev as Area,
               if(td.participation = "Aborted", "A", " ") as A,
               p1.dead as dead1,
               l.event as event1,
               td.suspect as tsuspect1,
               id.suspect as isuspect1,
               td.severe as tsevere1,
               id.severe as isevere1,
               p2.dead as dead2,
               l2.event as event2,
               h2.nurse as nurse2,
               h2.doctor as doctor2,
               td2.suspect as tsuspect2,
               id2.suspect as isuspect2,
               td2.severe as tsevere2,
               id2.severe as isevere2,
               l.finish_date
     from
               twin_project as tp
               /* For Twin 1 */
               left join twin_data as td on tp.id = td.id and tp.tvab = td.tvab
               left join informant_data as id on tp.id = id.id and tp.tvab = id.tvab
               left join harmony as h on tp.id = h.id and tp.tvab = h.tvab
               left join lentus as l on tp.id = l.id and tp.tvab = l.tvab
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                          183



                /* For Twin 2 */
                left join twin_data as td2 on p2.id = td2.id and p2.tvab = td2.tvab
                left join informant_data as id2 on p2.id = id2.id and p2.tvab = id2.tvab
                left join harmony as h2 on p2.id = h2.id and p2.tvab = h2.tvab
                left join lentus as l2 on p2.id = l2.id and p2.tvab = l2.tvab,
                person_data as p1,
                person_data as p2,
                postal_groups as pg
     where
                /* p1 gets main twin and p2 gets his/her twin. */
                /* ptvab is a field inverted from tvab */
                p1.id = tp.id and p1.tvab = tp.tvab and
                p2.id = p1.id and p2.ptvab = p1.tvab and
                /* Just the sceening survey */
                tp.survey_no = 5 and
                /* Skip if partner died before 65 but allow emigration (dead=9) */
                (p2.dead = 0 or p2.dead = 9 or
                 (p2.dead = 1 and
                  (p2.death_date = 0 or
                    (((to_days(p2.death_date) - to_days(p2.birthday)) / 365)
                     >= 65))))
                and
                (
                /* Twin is suspect */
                (td.future_contact = ’Yes’ and td.suspect = 2) or
                /* Twin is suspect - Informant is Blessed */
                (td.future_contact = ’Yes’ and td.suspect = 1 and id.suspect = 1) or
                /* No twin - Informant is Blessed */
                (ISNULL(td.suspect) and id.suspect = 1 and id.future_contact = ’Yes’) or
                /* Twin broken off - Informant is Blessed */
                (td.participation = ’Aborted’
                 and id.suspect = 1 and id.future_contact = ’Yes’) or
                /* Twin broken off - No inform - Have partner */
                (td.participation = ’Aborted’ and ISNULL(id.suspect) and p2.dead = 0))
                and
                l.event = ’Finished’
                /* Get at area code */
                and substring(p1.postal_code, 1, 2) = pg.code
                /* Not already distributed */
                and (h.nurse is NULL or h.nurse=00 or h.doctor=00)
                /* Has not refused or been aborted */
                and not (h.status = ’Refused’ or h.status = ’Aborted’
                or h.status = ’Died’ or h.status = ’Other’)
     order by
                tvid;




               co
Algumas explica¸˜es:
184                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



concat(p1.id, p1.tvab) + 0 as tvid
                                                                      e
          N queremos ordenar o id e o tvab concatenados na ordem num´rica. Adicio-
                                                                       u
          nando 0 ao resultado faz o MySQL tratar o resultado como um n´mero.
coluna id                             e          e
            Esta identifica um par de gˆmeos. Ela ´ uma chave em todas as tabelas.
column tvab
                             e
          Esta identifica um gˆmeo em um par. Ela pode ter um valor de 1 ou 2.
column ptvab
                e                                   e                e
          Esta ´ o inverso de tvab. Quando tvab ´ 1 este campo ´ 2 e vice versa. Ela
                                   ca                 a
          existe para poupar digita¸˜o e tornar mais f´cil para o MySQL otimizar a query.
Esta consulta demonstra, entre outras coisas, como fazer buscas em uma tabela a partir da
                                                          e
mesma tabela com uma uniao (p1 e p2). No exemplo, isto ´ usado para conferir se um par
        e                                                       a e
de um gˆmeo morreu antes de 65 anos. Se for verdade, a linha n˜o ´ retornada.
                                                  co                   e        o
Tudo acima existe em todas as tabelas com informa¸˜es relacionada aos gˆmeos. N´s temos
uma chave em ambos id,tvab (todas as tabelas) e id,ptvab (person_data) para tornar
                   a
as consultas mais r´pidas.
            a               ca
Na nossa m´quina de produ¸˜o (Um UltraSPARC 200MHz), esta consulta retorna entre
150-200 linhas e gasta menos que um segundo.
    u
O n´mero atual de registros nas tabelas usadas acima:
Tabela                       Registros
person_data                  71074
lentus                       5291
twin_project                 5286
twin_data                    2012
informant_data               663
harmony                      381
postal_groups                100

                                        ca             e
3.7.2 Mostrando uma Tabela sobre a Situa¸˜o dos Pares Gˆmeos
                                   o             ca
Cada entrevista termina com um c´digo da situa¸˜o chamado event. A consulta mostrada
       e                                                  e
abaixa ´ usada para mostrar uma tabela sobre todos pares gˆmeos combinados por evento.
                                     e                                      e
Ela indica em quantos pares ambos gˆmeos terminaram, em quantos pares um gˆmeo ter-
minou e o outro foi recusado e assim por diante.
      select
               t1.event,
               t2.event,
               count(*)
      from
               lentus as t1,
               lentus as t2,
               twin_project as tp
      where
               /* We are looking at one pair at a time */
               t1.id = tp.id
               and t1.tvab=tp.tvab
                  ca
Chapter 3: Introdu¸˜o ao MySQL: Um Tutorial MysQL                                   185



             and t1.id = t2.id
             /* Just the sceening survey */
             and tp.survey_no = 5
             /* This makes each pair only appear once */
             and t1.tvab=’1’ and t2.tvab=’2’
     group by
             t1.event, t2.event;


3.8 Utilizando MySQL com Apache
    ca                                                              a
A se¸˜o Contrib inclui programas que lhe permite autenticar seus usu´rios a partir de um
                              e
banco de dados MySQL e tamb´m permite logar seus arquivos em uma tabela MySQL. See
 undefined [Contrib], page undefined .
   e
Vocˆ pode alterar o formato de log do Apache para ser facilmente lido pelo MySQL colo-
                                       ca
cando o seguinte no arquivo de configura¸˜o do Apache:
      LogFormat \
               "\"%h\",%{%Y%m%d%H%M%S}t,%>s,\"%b\",\"%{Content-Type}o\", \
               \"%U\",\"%{Referer}i\",\"%{User-Agent}i\""
               e
No MySQL vocˆ pode fazer algo assim:
      LOAD DATA INFILE ’/local/access_log’ INTO TABLE nome_tabela
      FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’"’ ESCAPED BY ’\\’
186                                          e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



            ca
4 Administra¸˜o de Bancos de Dados MySQL

4.1 Configurando o MySQL

        co
4.1.1 Op¸˜es da Linha de Comando do mysqld
                               co
O mysqld aceita as seguintes op¸˜es de linha de comando:
--ansi     Utilizar a sintaxe ANSI SQL no lugar da sintaxe MySQL See undefined [ANSI
           mode], page undefined .
-b, --basedir=path
                                 o             ca                                  a
          Encaminho para o diret´rio de instala¸˜o. Todos os caminhos normalmente s˜o
                            ca
          resolvidos em rela¸˜o a este.
--big-tables
          Permite grandes conjuntos de resultados salvando todos os conjuntos tem-
              a
          por´rios em um arquivo. Ele resolve a maioria dos erros ’table full’, mas
                e
          tamb´m abaixa a velocidade das consultas nas quais as tabelas em mem´ria  o
                                         a                  e
          seriam suficientes. Desde a Vers˜o 3.23.2, o MySQL ´ capaz de resolver isto au-
                                      o                                a
          tomaticamente usando mem´ria para pequenas tabelas tempor´rias e trocando
                                                    a
          para o disco as tabelas, quando for necess´rio.
--bind-address=IP
                c
          Endere¸o IP para ligar.
--character-sets-dir=path
          Diret´rio onde est˜o os conjuntos de caracteres. See undefined [Conjunto de
               o            a
          caracteres], page undefined .
--chroot=path
                       o                                             ca
          Muda o diret´rio raiz do daemon mysqld durante a inicializa¸˜o. Medida de
                 c
          seguran¸a recomendada. Limita os comandos LOAD DATA INFILE e SELECT ...
          INTO OUTFILE.
--core-file
                                                                            e
          Grava um arquivo core se o mysqld morrer. Para alguns sistemas vocˆ deve
               e
          tamb´m especificar --core-file-size para safe_mysqld. See undefined
          [safe_mysqld], page undefined
-h, --datadir=path
                                o
          Encaminha para o diret´rio raiz dos bancos de dados.
--default-character-set=charset
                                                a
          Configura o conjunto de caracteres padr˜o. See undefined [Conjunto de car-
          acteres], page undefined .
--default-table-type=type
                                        a
          Configura o tipo de tabela padr˜o. See undefined [Tipos de tabelas], page un-
          defined .
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                     187



--debug[...]=
                          a                                    e
          Se o MySQL est´ configurado com --with-debug, vocˆ pode usar esta op¸˜o   ca
                                                                            a
          para obter um arquivo de rastreamento indicando o que o mysqld est´ fazendo.
          See undefined [Criando arquivos de rastreamento], page undefined .
--delay-key-write-for-all-tables
            a
          N˜o atualiza buffers das chaves entre escritas em nenhuma tabela MyISAM. See
                         a
           undefined [Parˆmetros do servidor], page undefined .
--enable-locking
                                                                     ca
          Habilita o bloqueio do sistema. Perceba que se usar esta op¸˜o em um sistema
                a                                                               e
          que n˜o possui um lockd() completamente funcional (como no Linux) vocˆ pode
          fazer com que o mysqld entre em deadlock.
--enable-named-pipe
          Habilita suporte para named pipes (somente no NT/Win2000/XP).
-T, --exit-info
               e       a        a             e        a
          Esta ´ uma m´scara bin´ria com diferˆntes parˆmetros que pode ser usada para
                                            ca a                           e        a
          depurar o servidor mysqld; Esta op¸˜o n˜o deve ser usada por algu´m que n˜o
                  c
          a conhe¸a muito bem!
--flush                              co
             Atualiza todas as altera¸˜es no disco depois de cada comando SQL. Normal-
                              o                               co
             mente o MySQL s´ faz a escrita de todas as altera¸˜es no disco depois de cada
                                                                                ca
             comando SQL e deixa o sistema operacional lidar com a sincroniza¸˜o com o
             disco. See undefined [Falhas], page undefined .
-?, --help
             Mostra uma pequena ajuda e sai.
--init-file=arquivo
           e                                                  ca
          Lˆ comandos SQL do arquivo especificado na inicializa¸˜o.
-L, --language=...
          Mensagens de erro do cliente na l´
                                           ingua especificada. Pode ser fornecido como
          um caminho completo. See undefined [L´    inguas], page undefined .
-l, --log[=arquivo]
                      o
          Log de conex˜es e consultas ao arquivo. See undefined [Log de consultas],
          page undefined .
--log-isam[=arquivo]
                             co
          Log de todas altera¸˜es ISAM/MyISAM no arquivo (usado somente quando
          estiver depurando bancos ISAM/MyISAM).
--log-slow-queries[=arquivo]
          Log de todas as consultas que levam mais de long_query_time segundos de
               ca
          execu¸˜o para um arquivo. See undefined [Log de consultas lentas], page un-
          defined .
--log-update[=arquivo]
                         co                      e     u     ´         a
          Log de atualiza¸˜es para file.# onde # ´ um n´mero unico se n˜o for fornecido.
                                          ca
          See undefined [Log de atualiza¸˜o], page undefined .
188                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



--log-long-format
                                  co                         co          e
          Log de algumas informa¸˜es extra ao log de atualiza¸˜es. Se vocˆ estiver usando
          --log-slow-queries ent˜o consultas que n˜o est˜o usando ´
                                    a                a     a                   a
                                                                      indices s˜o logadas
          ao log de consultas lentas.
--low-priority-updates
                 co           co                                       a
          Opera¸˜es de altera¸˜es das tabelas (INSERT/DELETE/UPDATE) ir˜o ter priori-
                                                   e
          dade menor do que as selects. Isto tamb´m pode ser feito usando {INSERT |
          REPLACE | UPDATE | DELETE} LOW_PRIORITY ... para baixar a prioridade de
          somente uma consulta, ou SET OPTION SQL_LOW_PRIORITY_UPDATES=1 para al-
                                    ´
          terar a prioridade em uma unica thread. See undefined [Bloqueio de tabelas],
          page undefined .
--memlock
                                              o
            Bloqueia o processo mysqld na mem´ria. Isto funciona somente se o seu sistema
            suportar a chamada de sistema mklockall() (como no Solaris). Isto pode
                         e
            ajudar se vocˆ tiver um problema no qual o sistema operacional faz com que o
                      c
            mysqld fa¸a a troca em disco.
                       ca      ca                 ca e
--myisam-recover [=op¸~o[,op¸~o...]]] onde op¸~o ´ qualquer combina¸~o      ca
                                                     e      e
          de DEFAULT, BACKUP, FORCE ou QUICK. Vocˆ tamb´m pode configurar isto ex-
                                      e                          ca               ca
          plicitamente para "" se vocˆ deseja desabilitar esta op¸˜o. Se esta op¸˜o for
                            a                                     a
          usada, o mysqld ir´ conferir na abertura se a tabela est´ marcada como que-
                                 a                                ´         ca
          brada ou se a tabela n˜o foi fechada corretamente. (A ultima op¸˜o funciona
                         e
          somente se vocˆ estiver executando com --skip-locking). Se este for o caso
                   a                     e
          mysqld ir´ executar uma conferˆncia na tabela. Se a tabela estiver corrompida,
                     a             a
          o mysqld ir´ tentar repar´-la.
                           co                                    ca
            As seguintes op¸˜es afetam no funcionamento da repara¸˜o.
            DEFAULT                                        a                    ca
                                         O mesmo que n˜o fornecer uma op¸˜o para --myisam-
                                         recover.
            BACKUP                                                                               ca
                                         Se os dados da tabela foram alterados durante a recupera¸˜o,
                                         salve um backup do arquivo de dados ‘nome_tabela.MYD’
                                         como ‘nome_tabela_dia_hora.BAK’.
            FORCE                                            ca
                                         Execute a recupera¸˜o mesmo se perdermos mais de uma
                                         linha do arquivo .MYD.
            QUICK                          a                                 a
                                         N˜o confira as linhas na tabela se n˜o existir nenhum bloco
                                         apagado.
                                                                         a
            Antes da tabela ser reparada automaticamente, o MySQL ir´ adicionar uma
                                            e                        ca
            nota no log de erros. Se vocˆ desejar que a recupera¸˜o da maioria das
                    a                  ca                a                           co
            coisas n˜o tenha a interven¸˜o de algum usu´rio, devem ser usadas as op¸˜es
                                   a    c
            BACKUP,FORCE. Isto ir´ for¸ar um reparo de uma tabela mesmo se alguns
                                                    a
            registros forem apagados, mas ele manter´ o arquivo de dados antigo como um
                                e
            backup para que vocˆ possa examinar posteriormente o que aconteceu.
--pid-file=path
          Encaminha para o arquivo pid usado pelo safe_mysqld.
-P, --port=...
            u                       o
          N´mero da porta para conex˜es TCP/IP.
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                     189



-o, --old-protocol
          Utilize o protocolo 3.20 para compatibilidade com alguns clientes muito antigos.
          See undefined [Upgrading-from-3.20], page undefined .
--one-thread
                                             ca
          Use somente uma thread (para depura¸˜o sobre Linux). See undefined [De-
          bugging server], page undefined .
                          ca
-O, --set-variable var=op¸~o
                                           a                        a
          Fornece um valor para uma vari´vel. --help lista as vari´veis. Vocˆ   e
                                   ca                             a          ca
          pode encontrar uma descri¸˜o completa para todas as vari´veis na se¸˜o
          SHOW VARIABLES deste manual.      See undefined [SHOW VARIABLES],
                                ca                     a
          page undefined . A se¸˜o de sintonia dos parˆmetros do servidor inclui
                 co                    a
          informa¸˜es sobre como otimiz´-los. See undefined [Server parameters],
          page undefined .
--safe-mode
                          a               ca
          Salta alguns est´gios de otimiza¸˜o. Implica --skip-delay-key-write.
--safe-show-database
           a                                           a     a              e
          N˜o mostra os bancos de dados nos quais o usu´rio n˜o tenha privil´gios.
--safe-user-create
                                       a     a                      a
          Se isto estiver ativo, um usu´rio n˜o pode criar novos usu´rios com o comando
                              a    a            e
          GRANT, se o usu´rio n˜o ter o privil´gio de INSERT na tabela mysql.user ou
          em alguma coluna desta tabela.
--skip-concurrent-insert
          Desliga a habilidade de selecionar e inserir ao mesmo tempo em tabelas MyISAM.
                 oe              e
          (Isto s´ ´ usado se vocˆ achar que encontrou um erro neste recurso).
--skip-delay-key-write
                     ca
          Ignore a op¸˜o delay_key_write para todas as tabelas.           See undefined
              a
          [Parˆmetros do servidor], page undefined .
--skip-grant-tables
                  ca                           a                        e           a
          Esta op¸˜o faz com que o servidor n˜o use o sistema de privil´gio. Isto d´ a
                                                              e
          todos acesso pleno a todos os bancos de dados! (Vocˆ pode dizer a um servidor
                   ca                                          a
          em execu¸˜o para iniciar a usar as tabelas de permiss˜o novamente executando
          mysqladmin flush-privileges ou mysqladmin reload.)
--skip-host-cache
                                              a                 co
          Nunca utiliza cache para nomes de m´quina para resolu¸˜es de nomes mais
           a                                                  o
          r´pidos, mas pesquisa o servidor DNS em todas conex˜es. See undefined
          [DNS], page undefined
--skip-locking
            a                                                                 e
          N˜o utilizar bloqueio de sistema. Para usar isamchk ou myisamchk vocˆ deve
          desligar o servidor. See undefined [Stability], page undefined . Perceba que
                  a
          na Vers˜o 3.23 do MySQL pode ser usado REPAIR e CHECK para reparar/conferir
          tabelas MyISAM.
190                                           e      e                       a
                                         Referˆncia t´cnica para o MySQL vers˜o 3.23.52



--skip-name-resolve
                       a        a a
          Nomes de m´quinas n˜o s˜o resolvidos. Todos os valores da coluna Host nas
                            o                 u
          tabelas de permiss˜es devem conter n´meros IP ou localhost. See undefined
          [DNS], page undefined .
--skip-networking
            a                 o                         ca
          N˜o escutair conex˜es TCP/IP. Toda intera¸˜o com mysqld deve ser feito
               e                             ca e
          atrav´s de sockets Unix. Esta op¸˜o ´ altamente recomendada para sistemas
                      co           a
          onde requisi¸˜es locais s˜o permitidas. See undefined [DNS], page undefined
--skip-new
             N˜o utilizar rotinas novas, poss´
              a                              ivelmente erradas. Implica --skip-delay-key-
                               e                                  a
             write. Isto tamb´m configura o tipo de tabela padr˜o como ISAM. See unde-
             fined [ISAM], page undefined .
--skip-symlink
           a                                     ca      o                 o
          N˜o apague ou renomeie arquivos de liga¸˜o simb´lica para o diret´rio de dados.
--skip-safemalloc
                        e
          Se o MySQL ´ configurado com --with-debug=full, todos os programas ir˜o     a
                          o                           ca          ca        o
          verificar a mem´ria por erros para cada aloca¸˜o e libera¸˜o de mem´ria. Como
                      e     e                 e          a                e a
          esta consistˆncia ´ muito lenta, vocˆ pode evit´-la, quando vocˆ n˜o precisar
                             o                   ca
          de verificar a mem´ria, usando esta op¸˜o.
--skip-show-database
           a                                                      a
          N˜o permite o comando ’SHOW DATABASE’, a menos que o usu´rio tenha
                e
          privil´gio process.
--skip-stack-trace
            a                                       ca e ´               e
          N˜o gravar rastreamentos de pilha. Esta op¸˜o ´ util quando vocˆ estiver exe-
          cutando o mysqld sob um depurador. See undefined [Depurando o servidor],
          page undefined .
--skip-thread-priority
          Desabilita o uso de prioridade das threads para um tempo de resposta mais
           a
          r´pido.
--socket=path
                                           o                          a
          Arquivo socket para usar em conex˜es locais no lugar do padr˜o
          /tmp/mysql.sock.
             ca       ca      ca
--sql-mode=op¸~o[,op¸~o[,op¸~o...]]
             ca                              ca
          Op¸˜o pode ser qualquer combina¸˜o de: REAL_AS_FLOAT, PIPES_AS_CONCAT,
          ANSI_QUOTES, IGNORE_SPACE, SERIALIZE, ONLY_FULL_GROUP_BY. Ela tamb´m     e
                                     e             a
          pode ficar vazia ("") se vocˆ desejar limp´-la.
                                 co         e                                    co
          Especificar todas as op¸˜es acima ´ o mesmo que usar –ansi. Com estas op¸˜es,
          pode se ligar somente os modos SQL necess´rios. See undefined [Modo ANSI],
                                                    a
          page undefined .
transaction-isolation= { READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ
| SERIALIZABLE }
          Configura o n´            ca           ca      a
                      ivel de isola¸˜o da transa¸˜o padr˜o. See undefined [SET
          TRANSACTION], page undefined .
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                       191



-t, --tmpdir=caminho
                                          a                    ´                 o
          Encaminha para arquivos tempor´rios. Ele pode ser util se o seu diret´rio
               a         a             ca
          padr˜o /tmp est´ em uma parti¸˜o muito pequena para armazenar tabelas tem-
             a
          por´rias.
                    a
-u, --user=nome_usu´rio
                                                a                        ca e
          Executar o servidor mysqld como o usu´rio nome_usu´rio. Esta op¸˜o ´ obri-
                                                             a
             o                     e                 a
          gat´ria quando o mysqld ´ iniciado como usu´rio root.
-V, --version
          Gera sa´ com a informa¸˜o da vers˜o e sai.
                 ida            ca         a
-W, --warnings
          Imprime avisos como Aborted connection... no arquivo .err. See unde-
                                 ca
          fined [Erros de comunica¸˜o], page undefined .

                   co
4.1.2 Arquivo de Op¸˜es my.cnf
                                  a               co         o            ca
O MySQL pode, desde a vers˜o 3.22, ler as op¸˜es padr˜es de inicializa¸˜o para o servidor
                                      co
e para clientes dos arquivos de op¸˜es.
                   co        o
O MySQL le op¸˜es padr˜es dos seguintes arquivos no Unix:
Nome do arquivo                        o
                                  Prop´sito
/etc/my.cnf                         co
                                  op¸˜es globais
DATADIR/my.cnf                    op¸˜es espec´
                                    co        ificas do servidor
defaults-extra-file               O arquivo especificado com –defaults-extra-file=#
~/.my.cnf                         op¸˜es espec´
                                    co                     a
                                              ificas do usu´rio
            e        o
DATADIR ´ o diret´rio de dados do MySQL (normalmente ‘/usr/local/mysql/data’ para
        co        a                                        co      o
instala¸˜es bin´rias ou ‘/usr/local/var’ para instala¸˜es de c´digo fonte). Perceba que
      e         o                                               ca   a
este ´ o diret´rio que foi especificado na hora da configura¸˜o, n˜o o especificado com --
                                                    a
datadir quando o mysqld inicia! (--datadir n˜o tem efeito sobre o local onde o servidor
                                co
procura por arquivos de op¸˜es, porque ele procura por eles antes de processar qualquer
argumento da linha de comando.)
              e       co        o
O MySQL lˆ os op¸˜es padr˜es dos seguintes arquivos no windows:
Nome do Arquivo                        o
                                  Prop´sito
windows-system-                     co
                                  op¸˜es globais
directory\my.ini
C:\my.cnf                           co
                                  op¸˜es globais
C:\mysql\data\my.cnf              op¸˜es espec´
                                    co        ificas do servidor
                                  e
Perceba que no windows, vocˆ deve especificar todos os caminhos com / no lugar de \. Se
                        a        a        a                        e
for utilizado o \, ser´ necess´rio digit´-lo duas vezes, pois o \ ´ o caractere de escape no
MySQL.
                                         co                               u
O MySQL tenta ler os arquivos de op¸˜es na ordem listada acima. Se m´ltiplos arquivos de
   co                        ca
op¸˜es existirem, uma op¸˜o especificada em um arquivo lido depois recebe a precedˆncia e
                     ca                                                     co
sobre a mesma op¸˜o especificada em um arquivo lido anteriormente. Op¸˜es especificadas
                                          e             co
na linha de comando recebem a precedˆncia sobre op¸˜es especificadas em qualquer arquivo
       co                 co                                       a
de op¸˜es. Algumas op¸˜es podem ser especificadas usando vari´veis de ambiente. Op¸˜es   co
                                                             ca
especificadas na linha de comando ou nos arquivos de op¸˜o tem precendencia sobre valores
          a                                         a
nas vari´veis de ambiente. See undefined [Vari´veis de ambiente], page undefined .
192                                              e      e                       a
                                            Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                                                     co
Os seguintes programas suportam arquivos de op¸˜es: mysql, mysqladmin, mysqld,
mysqldump, mysqlimport, mysql.server, myisamchk e myisampack
   e                         co                              ca
Vocˆ pode usar arquivos de op¸˜es para especificar qualquer op¸˜o extendida que o programa
suporte! Execute o programa com --help para obter uma lista das op¸˜es dispon´
                                                                      co          iveis.
                  co
Um arquivo de op¸˜es pode conter linhas na seguinte forma:
#comentario
                          a                                                       a
          Linhas de coment´rio iniciam com o caractere ‘#’ ou ‘;’. Linhas vazias s˜o
          ignoradas.
[grupo]             e                                             e a                  co
             grupo ´ o nome do programa ou grupo para o qual vocˆ ir´ configurar as op¸˜es.
             Depois de uma linha de grupo, qualquer linha de op¸~o ou set-variable s˜o
                                                                 ca                       a
             referentes ao grupo at´ o final do arquivo de op¸˜es ou outra linha de in´ de
                                   e                        co                       icio
             grupo.
op¸~o
  ca              e             a
             Isto ´ equivalente ` --op¸~o na linha de comando.
                                      ca
  ca
op¸~o=valor
               e             a
          Isto ´ equivalente ` --op¸~o=valor na linha de comando.
                                   ca
                    a
set-variable = vari´vel=valor
               e             a
          Isto ´ equivalente ` --set-variable vari´vel=valor na linha de comando.
                                                    a
                                                             a
          Esta sintaxe deve ser usada para configurar uma vari´vel mysqld.
                                         co
O grupo client permite especificar op¸˜es para todos clientes MySQL (n˜o o mysqld).a
      e                                                                 e
Este ´ o grupo perfeito de se usar para espeficar a senha que vocˆ usa para conectar ao
                                                   co     o
servidor. (Mas tenha certeza que o arquivo de op¸˜es s´ pode ser lido e gravado por vocˆ)      e
                    co                       c                  a
Perceba que para op¸˜es e valores, todos espa¸os em branco s˜o automaticamente apagados.
    e
Vocˆ pode usar a sequencia de escape ‘\b’, ‘\t’, ‘\n’, ‘\r’, ‘\\’ e ‘\s’ no valor da string (‘\s’
         c
== espa¸o).
Aqui est´ um t´
         a                         co
               ipico arquivo de op¸˜es globais.
       [client]
       port=3306
       socket=/tmp/mysql.sock

        [mysqld]
        port=3306
        socket=/tmp/mysql.sock
        set-variable = key_buffer_size=16M
        set-variable = max_allowed_packet=1M

     [mysqldump]
     quick
Aqui est´ um t´
        a                         co        a
              ipico arquivo de op¸˜es do usu´rio
     [client]
                                a
     # A senha seguinte ser´ enviada para todos clientes MySQL
     password=minha_senha

        [mysql]
        no-auto-rehash
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                     193



     set-variable = connect_timeout=2

     [mysqlhotcopy]
     interactive-timeout

       e                   ca             e        a                                ca
Se vocˆ tem uma distribui¸˜o fonte, vocˆ encontrar´ arquivos de exemplo de configura¸˜o
                                    o                           e
chamados ‘my-xxxx.cnf’ no diret´rio ‘support-files’. Se vocˆ tem uma distribui¸˜o   ca
   a                 o              ca                               e
bin´ria olhe no diret´rio de instala¸˜o ‘DIR/support-file’, onde DIR ´ o caminho para o
     o              ca
diret´rio de instala¸˜o (normalmente ‘/usr/local/mysql’). Atualmente existem arquivos
             ca                              e                            e
de configura¸˜o para sistemas pequenos, m´dios, grandes e enormes. Vocˆ pode copiar
                              o                      o
‘my-xxxx.cnf’ para seu diret´rio home (renomeie a c´pia para ‘.my.cnf’ para experimen-
tar.
                                                   co             co
Todos os clientes MySQL que suportam arquivos de op¸˜es aceitam op¸˜es:
–no-defaults                        a e                        co
                                  N˜o lˆ nenhum arquivo de op¸˜es.
–print-defaults                                                           co
                                  Imprima o nome do programa e todas op¸˜es.
–defaults-file=caminho-para-                                                  ca
                                  Utilize somente o arquivo de configura¸˜o es-
arquivo-padr˜o
             a                    pec´ificado.
–defaults-extra-file=caminho-para-                              ca
                                  Leia este arquivo de configura¸˜o depois do arquivo
             a
arquivo-padr˜o                                ca
                                  de configura¸˜o global mas antes do arquivo de con-
                                        ca        a
                                  figura¸˜o do usu´rio.
                 co
Perceba que as op¸˜es acima devem vir primeiro na linha de comando para funcionar!
--print-defaults pode, no entanto, ser usado logo depois dos comandos --defaults-
xxx-file.
                                                             co e
Notas para desenvolvedores: O tratamento de arquivos de op¸˜es ´ implementado simples-
                               co                    e    co
mente processando todos as op¸˜es coincidentes (isto ´, op¸˜es no grupo apropriado) antes
de qualquer argumento da linha de comando. Isto funciona bem para programas que usam
  ´          a                ca      e                                    e
a ultima instˆncia de uma op¸˜o que ´ especificada diversas vezes. Se vocˆ tem um pro-
                           co                 a                             a e
grama antigo que trata op¸˜es especificadas v´rias vezes desta forma mas n˜o lˆ arquivos
      co       e o
de op¸˜es, vocˆ s´ precisa adicionar duas linhas para lhe dar esta capacidade. Verifique o
 o                                                    a
c´digo fonte de qualquer um dos clientes MySQL padr˜o para ver como fazer isto.
                     e
Nos scripts shell vocˆ pode usar o comando ‘my_print_defaults’ para analisar os arquivos
config:

     shell> my_print_defaults client mysql
     --port=3306
     --socket=/tmp/mysql.sock
     --no-auto-rehash
A sa´ acima contem todas op¸˜es para os grupos ’client’ e ’mysql’.
    ida                    co

                  a                          a
4.1.3 Instalando V´rios Servidores na Mesma M´quina
                     e                   a
Em alguns casos vocˆ pode precisar de v´rios daemons (servidores) mysqld diferentes ex-
                       a           e
ecutando na mesma m´quina. Vocˆ pode por exemplo desejar executar uma nova vers˜o       a
                                            a                      a           ca
do MySQL para testar junto com uma vers˜o mais antiga que est´ em produ¸˜o. Outro
     e            e                                  a
caso ´ quando vocˆ quiser dar acesso a diferentes usu´rios em diferentes servidores mysqld
gerenciados por eles mesmos.
194                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                                               e
Uma maneira de ter um novo servidor executando ´ iniciando-o com um socket e porta
diferentes, como segue:
      shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
      shell> MYSQL_TCP_PORT=3307
      shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
      shell> scripts/mysql_install_db
      shell> bin/safe_mysqld &
     e             a                                                 a
O apˆndice das vari´veis de ambiente incluem uma lista de outras vari´veis de ambiente que
   e                                                        a
vocˆ pode usar e que afetam o mysqld. See undefined [Vari´veis de ambiente], page un-
defined .
                         e                 a                              e
A forma descrita acima ´ a maneira mais r´pida e suja que normalmente ´ usado para
                       e                            o          e                      a
testes. A melhor coisa ´ que com isto todas as conex˜es que vocˆ faz na shell acima ir˜o
automaticamente ser direcionadas para o novo servidor.
      e                                         e                            co
Se vocˆ precisar fazer isto permanentemente, vocˆ deve criar um arquivo de op¸˜es para cada
                                         ca
servidor. See undefined [Arquivos de op¸˜o], page undefined . No script de inicializa¸˜o  ca
    e                                                e
que ´ executado no tempo de boot (mysql.server) vocˆ deve especificar ambos os servidores:
safe_mysqld --default-file=path-to-option-file
                         co
Pelo menos as seguines op¸˜es devem ser diferentes por servidor:
port=#
socket=path
pid-file=path
               co
As seguintes op¸˜es devem ser diferentes, se elas forem usadas:
log=path
log-bin=path
log-update=path
log-isam=path
bdb-logdir=path
      e                                  e     e
Se vocˆ precisar de mais performance, vocˆ tamb´m pode diferenciar:
tmpdir=path
bdb-tmpdir=path
                co
See undefined [Op¸˜es de linha de comando], page undefined .
       e                         o      a                                   a
Se vocˆ estiver instalando vers˜es bin´rias do MySQL (arquivos .tar) e inici´-los
                             a                          ´       ca     e
com ./bin/safe_mysql ent˜o na maioria dos casos a unica op¸˜o que vocˆ precisa
                   a
adicionar/alterar s˜o os argumentos socket e port do safe_mysqld.

                  u
4.1.4 Executando M´ ltiplos Servidores MySQL na Mesma
        a
      M´quina
                  a                  e                          a
Existem circunstˆncias em que vocˆ pode desejar executar v´rios servidores na mesma
  a                         e
m´quina. Por exemplo, vocˆ pode precisar testar um novo release MySQL enquanto deixa
            ca                ca                               e
a configura¸˜o de sua produ¸˜o existente inalterada. Ou vocˆ pode ser um provedor de
     c                                          co
servi¸os de Internet que deseja fornecer instala¸˜es independentes de MySQL para clientes
diferentes.
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                        195



      e                  u                                  a e          a
Se vocˆ deseja executar m´ltiplos servidores, a forma mais f´cil ´ compil´-los com diferentes
                                                      a
portas TCP/IP e arquivos socket para que ambos n˜o escutem na mesma porta TCP/IP
ou arquivo socket. See undefined [mysqld_multi], page undefined .
                                       a                                              o
Considere que um servidor existente est´ configurado para a porta e arquivo socket padr˜es.
   a
Ent˜o configure o novo servidor com o comando configure assim:
                                           u
      shell> ./configure --with-tcp-port=n´mero_porta \
                   --with-unix-socket-path=nome_arquivo \
                   --prefix=/usr/local/mysql-3.22.9
                                                           u
Aqui n´mero_porta e nome_arquivo deve ser diferente que o n´mero da porta e o caminho
       u
                       o                                             o              ca
do arquivo socket padr˜es e o valor --prefix deve especificar um diret´rio de instala¸˜o
diferente daquele usado pelo servidor existente.
   e                                                                  ca
Vocˆ pode conferir o socket usado por qualquer servidor MySQL em execu¸˜o com este
comando:
                                            u               a
      shell> mysqladmin -h hostname --port=n´mero porta vari´veis
      e                                        a                    a         a
Se vocˆ especificar “localhost” como o nome da m´quina, mysqladmin ir´ por padr˜o usar
sockets Unix no lugar de TCP/IP.
      e                                                   e         e      a
Se vocˆ tem um servidor MySQL executando na porta que vocˆ usou, vocˆ obter´ uma lista
                   a            a
de algumas das vari´veis configur´veis mais importantes no MySQL, incluindo o nome do
socket.
  a e        a
N˜o ´ necess´rio recompilar um novo servidor MySQL apenas para iniciar com uma porta
                         e
ou socket diferentes. Vocˆ pode alterar a porta e o socket a ser usado especificando-os no
                ca          co
tempo de execu¸˜o como op¸˜es para o safe_mysqld:
                                                                u
      shell> /path/to/safe_mysqld --socket=nome_arquivo --port=n´mero_porta
                         e
mysqld_multi pode tamb´m utilizar o safe_mysqld (ou mysqld) como um argumento e
            co                            ca
passar as op¸˜es de um arquivo de configura¸˜o para o safe_mysqld e mysqld.
      e                                        o
Se vocˆ executar o novo servidor no mesmo diret´rio do banco de dados que o outro servidor
                          e      e
com o log habilitado, vocˆ tamb´m deve especificar o nome dos arquivos log para o safe_
                                                                    a
mysqld com --log, --log-update, ou --log-slow-queries. Se n˜o, ambos servidores
podem tentar escrever no mesmo arquivo de log.
                          e
AVISO: Normalmente vocˆ nunca deve ter dois servidores que atualizam dados no mesmo
                              a
banco de dados! Se seu SO n˜o suporta bloqueio de sistema a prova de falhas, isto pode
                          a
provocar surpresas indesej´veis.
      e                        o                                                  e
Se vocˆ deseja usar outro diret´rio de banco de dados para o segundo servidor, vocˆ pode
         ca
usar a op¸˜o --datadir=caminho para o safe_mysqld.
             e                 a                                                a
NOTE tamb´m, que iniciando v´rios servidores MySQL (mysqlds) em diferentes m´quinas
      a                      o                      e                      ´
e deix´-los acessar um diret´rio de dados sob NFS, ´ normalmente uma MA IDEIA! O ´
           e                   a                                           a
problema ´ que o NFS se tornar´ um gargalo, tornando o sistema lento. Ele n˜o se destina
                             e       a     a
para este tipo de uso. E vocˆ ainda n˜o ter´ como ter certeza que dois ou mais mysqlds
 a     a                                                  a
n˜o est˜o interferindos uns com os outros. No momento n˜o existe nenhuma plataforma
                               c
que faria, com 100% de seguran¸a, o bloqueio de arquivos (daemon
             e
Quando vocˆ for conectar a um servidor MySQL que esteja executando com uma porta
                                                       e                             e
diferente daquela que foi compilada no seu cliente, vocˆ pode usar um dos seguintes m´todos:
196                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • Inicie o cliente com --host ’nome_m´quina’ --port=n´mero_porta para conectar com
                                       a                  u
   TCP/IP, ou [--host localhost] --socket=nome_arquivo para conectar atrav´s de    e
   um socket Unix.
 • Em programas C ou Perl, vocˆ pode especificar os argumentos de porta ou socket
                                   e
   quando conectar a um servidor MySQL.
 • Se vocˆ estiver usando o m´dulo Perl DBD::mysql vocˆ pode ler as op¸˜es dos arquivos
          e                   o                          e               co
         co
   de op¸˜es do MySQL. See undefined [Option files], page undefined .
          $dsn = "DBI:mysql:test;mysql_read_default_group=client;mysql_read_default_
          file=/usr/local/mysql/data/my.cnf"
          $dbh = DBI->connect($dsn, $user, $password);
 • Configure as vari´veis de ambiente MYSQL_UNIX_PORT e MYSQL_TCP_PORT para apontar
                      a
                                                                            e
   para o socket Unix e porta TCP/IP antes de iniciar seus clientes. Se vocˆ normalmente
   utiliza uma porta ou socket espec´         e
                                     ifico, vocˆ deve colocar os comandos para configurar
          a
   as vari´veis de ambiente no arquivo ‘.login’. See undefined [Environment variables],
   page undefined .
 • Especifique o socket e porta TCP/IP padr˜es no arquivo ‘.my.cnf’ no seu diret´rio
                                                o                                    o
   home. See undefined [Option files], page undefined .

                              c
4.2 Detalhes Gerais de Seguran¸a e o Sistema de Acesso
                                  c       e         c         a      a       o
O MySQL tem um sistema de seguran¸a/privil´gios avan¸ado mas n˜o padr˜o. A pr´xima
  ca
se¸˜o descreve como ele funciona.

             c
4.2.1 Seguran¸a Geral
                                                              a
Qualquer um usando o MySQL em um computador conectado ` internet deve ler esta se¸˜o    ca
                                c
para evitar os erros de seguran¸a mais comuns.
                    c    o
Discutindo seguran¸a, n´s enfatizamos a a necessidade de proteger completamente o servi-
        a
dor (n˜o simplesmente o servidor MySQL) contra todos os tipos de ataques aplic´veis: a
                                                         a
eavesdropping, altering, playback e denial of service. N˜o cobriremos todos os aspectos de
                       a
disponibilidade e tolerˆncia a falhas aqui.
                             c
O MySQL utiliza a seguran¸a baseado em Listas de Controle de Acesso (ACL) para todas
       o                           co              a                                    e
conex˜es, consultas e outras opera¸˜es que um usu´rio pode tentar realizar. Existe tamb´m
                           o                                                          a
algum suporte para conex˜es criptografadas SSL entre clientes MySQL e servidores. V´rios
dos conceitos discutidos aqui n˜o s˜o espec´
                                 a a                                        e
                                            ificos do MySQL; as mesmas id´ias podem ser
                                    co
aplicadas para a maioria das aplica¸˜es.
Quando executando o MySQL, siga estes procedimentos sempre que poss´     ivel:
  • NUNCA CONCEDA A ALGUEM                                     ´
                                      ´ (EXCETO AO USUARIO ROOT DO MySQL)
     ACESSO TABELA user NO BANCO DE DADOS mysql! A senha criptografada
     e                                   e
     ´ a senha real no MySQL. Se vocˆ conhece a senha listada na tabela user para um
                      a        e                                     a
     determinado usu´rio, vocˆ pode facilmente logar como este usu´rio se tiver acesso `   a
        a
     m´quina relacionada para aquela conta.
  • Aprenda o sistema de controle de acessos do MySQL. Os comandos GRANT e REVOKE
      a                                                a                     e
     s˜o usados para controlar o acesso ao MySQL. N˜o conceda mais privil´gios do que o
           a                           e                   a
     necess´rio. Nunca conceda privil´gios para todas as m´quinas.
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                                  197



     Checklist:
      − Tente mysql -u root. Se vocˆ conseguir conectar com sucesso ao servidor sem
                                                  e
                       ca                            e
           a solicita¸˜o de uma senha, vocˆ tem problemas. Qualquer um pode conectar
                                                         a                     e
           ao seu servidor MySQL como o usu´rio root com privil´gios plenos! Revise as
                 co                  ca                                  ca
           instru¸˜es de instala¸˜o do MySQL, prestando aten¸˜o particularmente ao item
                             ca
           sobre configura¸˜o da senha do usu´rio root. a
      − Utilize o comando SHOW GRANTS e confira para ver quem tem acesso a o que. Re-
                                   e              a a           a
           mova aqueles privil´gios que n˜o s˜o necess´rios utilizando o comando REVOKE.
 •     a
     N˜o mantenha nenhuma senha de texto puro no seu banco de dados. Quando seu
     computador fica comprometido, o intruso pode obter a lista completa de senhas e
            a                                  ca                           ca
     utiliz´-las. No lugar utilize a fun¸˜o MD5() ou qualquer fun¸˜o de embaralhamento de
          ´
     via unica.
 •     a                                    a
     N˜o escolha senhas de dicion´rios. Existem programas especiais para quebr´-las.             a
                                              a
     Mesmo senhas como “xfish98” n˜o sao boas. Muito melhor seria “duag98” que cont´m                e
     a mesma palavra ’fish mas digitada uma letra a esquerda em um teclado QWERTY
                                  e                                 e
     convencional. Outro m´todo seria usar “Mhall” que ´ obtido dos primeiros caracteres
                                                                      e a
     de cada palavra na frase “Mary has a litle lamb”. Isto ´ f´cil de lembrar e digitar, mas
                           e           a            c
     dificulta que algu´m que n˜o a conhe¸a a advinhe.
 •                                                       e
     Invista em um firewall. Ele protege vocˆ de pelo menos 50% de todos os tipos de
                                                                      a
     exploits em qualquer software. Coloque o MySQL atr´s do firewall ou em uma zona
     desmilitarizada (DMZ).
     Checklist:
      − Tente examinar suas portas da Internet utilizando alguma ferramenta como o nmap.
           O MySQL utiliza a porta 3306 por padr˜o. Esta porta n˜o deve ser acess´
                                                              a                   a                ivel
                    a           a         a
           para m´quinas n˜o confi´veis. Outra maneira simples para conferir se sua porta
                             a                  a e
           do MySQL est´ aberta ou n˜o ´ tentar o seguinte comando de alguma m´quina           a
                                               e               a                   c
           remota, onde nome_m´quina ´ o nome da m´quina ou o endere¸o IP de seu servidor
                                     a
           MySQL:
                  shell> telnet nome_m´quina 3306 a
                   e                       a                                        a
           Se vocˆ obter uma conex˜o e alguns caracteres, a porta est´ aberta e deve ser
                                                                          e
           fechada no seu firewall ou roteador, a menos que vocˆ realmente tenha uma boa
               a               e                                                        a
           raz˜o para mantˆ-la aberta. Se o telnet apenas parar ou a conex˜o for recusada,
                     a                      a
           tudo est´ bem; a porta est´ bloqueada.
 •   N˜o confie em nenhum dado inclu´
       a                                                            a
                                                 idos pelos seus usu´rios. Eles podem tentar enganar
            o
     seu c´digo entrando com caracteres especiais ou sequencias de escape nos formul´rios        a
                                            ca            e
     Web, URLS ou qualquer aplica¸˜o que vocˆ construa. Tenha certeza que sua aplica¸˜o            ca
                                        a
     continua segura se um usu´rio entrar com algo do tipo “; DROP DATABASE mysql;”.
            e                                                             c
     Este ´ um exemplo extremo, mas grandes falhas de seguran¸a ou perda de dados podem
                                                                 e
     ocorrer como o resultado de hackers utilizando t´cnicas similares, se vocˆ n˜o estivere a
     preparado para eles.
             e                                         e                         e
     Tamb´m lembre de conferir dados num´ricos. Um erro comum ´ proteger somente as
     strings. Em alguns casos as pessoas pensam que se um banco de dados cont´m somente     e
     dados dispon´                                   a                                 a e
                      iveis publicamente, ele n˜o precisa ser protegido. Isto n˜o ´ verdade. No
     m´inimo ataques do tipo denial-of-service podem ser feitos nestes bancos de dados. A
                                                                           e          o
     maneira mais simples para proteger deste tipo de ataque ´ usar ap´strofos em torno
198                                             e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                       e
   das contantes num´ricas: SELECT * FROM tabela WHERE ID=’234’ em vez de SELECT *
   FROM table WHERE ID=234. O MySQL automaticamente converte esta string para um
   n´mero e corta todos os s´
    u                                    a        e
                                imbolos n˜o-num´ricos dela.
   Checklist:
    − Todas aplica¸˜es Web:
                      co
          • Tente inserir ‘’’ e ‘"’ em todos seus formul´rios Web. Se vocˆ obter qualquer
                                                           a                  e
             tipo de erro do MySQL, investigue o problema imediatamente.
          • Tente modificar qualquer URL dinˆmica adicionando %22 (‘"’), %23 (‘#’) e %27
                                                  a
             (‘’’) na URL.
          • Tente modificar os tipos de dados nas URLs dinˆmicas de num´rico para
                                                                   a                e
                                                                                  ca
             caractere contendo caracteres dos exemplos anteriores. Sua aplica¸˜o deve ser
             segura contra estes ataques e similares.
          • Tente inserir caracteres, espa¸os e s´
                                            c                                       u
                                                    imbolos especiais no lugar de n´mero nos
                           e                  ca                e                 a
             campos num´ricos. Sua aplica¸˜o deve removˆ-los antes de pass´-los para o
                                    ca                                          a
             MySQL ou sua aplica¸˜o deve gerar um erro. Passar valores n˜o verificados
                         e
             ao MySQL ´ extramente perigoso!
          • Confira o tamanho dos dados antes de pass´-los ao MySQL.
                                                            a
          • Considere ter sua aplica¸˜o conectando ao banco de dados utilizando um
                                        ca
                 a                              e                      o
             usu´rio diferente doq ue o que ´ utilizado com prop´sitos administrativos.
               a        c a              co               e
             N˜o forne¸a `s suas aplica¸˜es mais privil´gios de acesso do que elas necessi-
             tam.
    − Usu´rios do PHP:
            a
          • Confira a fun¸˜o addslashes. No PHP 4.0.3, uma fun¸˜o mysql_escape_
                             ca                                           ca
             string() est´ dispon´ e ´ baseada na fun¸˜o com o mesmo nome da API
                            a       ivel e                    ca
             C do MySQL.
    − Usu´rios do API C do MySQL:
            a
          • Confira a chamada API mysql_escape_string().
    − Usu´rios do MySQL:
            a
          • Confira os modificadores escape e quote para consultas streams.
    − Usu´rios do Perl DBI:
            a
          • Confira o m´todo quote() ou utilize aspas simples ou duplas.
                          e
    − Usu´rios do Java JDBC:
            a
          • Utilize um objeto PreparedStatement e aspas simples ou duplas.
 • N˜o transmita dados sem criptografia na Internet. Estes dados s˜o acess´
     a                                                                      a       iveis para
                                                               a       a
   todos que tenham o tempo e habilidade para intercept´-lo e us´-lo para seu prop´sito   o
     o
   pr´prio. No lugar, utilize um protocolo de criptografia como o SSL ou SSH. O MySQL
                   o                             a
   suporta conex˜es SSL interno desde a vers˜o 3.23.9. O repasse de portas do SSH pode
                                                                    a
   ser usado para criar um tunel criptografado (e com compress˜o) para a comunica¸˜o.     ca
 • Aprenda a usar os utilit´rios tcpdump e strings. Para a maioria dos casos vocˆ
                                a                                                            e
                                                       a       a
   pode conferir se o fluxo de dados do MySQL est´ ou n˜o criptografado utilizando um
   comando parecido com este:
         shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                      199



                                                                           co
    (Isto funciona sobre Linux e deve funcionar com pequenas modifica¸˜es sob outros
                              e a              a
    sistemas.) Alerta: Se vocˆ n˜o ver dados n˜o significa sempre que esteja criptografado.
           e                         c      e                                          c
    Se vocˆ necessita de alta seguran¸a, vocˆ deve consultar um especialista em seguran¸a.

4.2.2 Como Tornar o MySQL Seguro contra Crackers
            e                                      e
Quando vocˆ conectar a um servidor MySQL, vocˆ normalmente deve usar uma senha. A
senha n˜o ´ transmitida em texto puro sobre a conex˜o, por´m o algor´
       a e                                           a      e        itimo de criptografica
 a e                                c
n˜o ´ muito forte e com algum esfor¸o um atacante engenhoso pode quebrar a senha se ele
                       a                                             a
conseguir capturar o tr´fego entre o cliente e o servidor. Se a conex˜o entre o cliente e o
                              a       a        e
servidor passar por uma rede n˜o confi´vel, vocˆ deve usar um tunnel SSH para criptografar
           ca
a comunica¸˜o.
                     co    a
Todas outras informa¸˜es s˜o transferidas como texto que podem ser lido por qualquer um
                        a          e                           e
que consiga ver a conex˜o. Se vocˆ se preocupa com isto, vocˆ pode usar o protocol de
         a                   a
compress˜o (No MySQL vers˜o 3.22 e superiores) para dificultar um pouco as coisas. Para
                                 e                   e
deixar tudo ainda mais seguro vocˆ deve usar ssh. Vocˆ pode encontrar um cliente ssh open
source em http://www.openssh.org, e um cliente ssh comercial em http://www.ssh.com.
              e                      a
Com isto, vocˆ pode obter uma conex˜o TCP/IP critografada entre um servidor MySQL e
um cliente MySQL.
                                        e                                    o
Para deixar um sistema MySQL seguro, vocˆ deve considerar as seguintes sugest˜es:
 • Utilize senhas para todos os usu´rios MySQL. Lembre-se que qualquer um pode logar
                                    a
   como qualquer outra pessoa simplesmente com mysql -u outro_usu´rio nome_bd se
                                                                      a
                     a                      e
   outro_usu´rio n˜o tiver senha. Isto ´ um procedimento comum com aplica¸˜es
              a                                                                   co
                                                                      a        e
   cliente/servidor que o cliente pode especificar qualquer nome de usu´rio. Vocˆ pode
                                      a
   alterar a senha de todos seus usu´rios editando o script mysql_install_db antes de
          a                                  a
   execut´-lo ou somente a senha para o usu´rio root do MySQL desta forma:
          shell> mysql -u root mysql
          mysql> UPDATE user SET Password=PASSWORD(’nova_senha’)
                      WHERE user=’root’;
          mysql> FLUSH PRIVILEGES;
 • N˜o execute o daemon do MySQL como o usu´rio root do Unix. Isto ´ muito perigoso,
     a                                         a                        e
                      a              e               a
   porque qualquer usu´rio com privil´gios FILE estar´ apto a criar arquivos como o root
                                                              ca              a
   (por exemplo, ~root/.bashrc). Para prevenir esta situa¸˜o, mysqld ir´ recusar a
        ca
   execu¸˜o como root a menos que ele seja especificado diretamente usando a op¸˜o    ca
   --user=root.
                                               a                       e
    O mysqld pode ser executado como um usu´rio normal sem privil´gios. Vocˆ pode e
         e                      a
    tamb´m criar um novo usu´rio Unix mysql para tornar tudo mais seguro. Se vocˆ       e
                                       a          e a            a             a
    executar o mysqld como outro usu´rio Unix, vocˆ n˜o precisar´ alterar o usu´rio root
                                          a               a
    na tabela user, porque nomes de usu´rio do MySQL n˜o tem nada a ver com nomes
           a                                               a
    de usu´rios Unix. Para iniciar o mysqld como outro usu´rio Unix, adicione uma linha
                                        a
    user que especifica o nome de usu´rio para o grupo [mysqld] do arquivo de op¸˜es  co
                                      co                  o
    ‘/etc/my.cnf’ ou o arquivo de op¸˜es ‘my.cnf’ no diret´rio de dados do servidor. Por
    exemplo:
          [mysqld]
          user=mysql
200                                             e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



              co                                               a                        e
      Estas op¸˜es configuram o servidor para iniciar como o usu´rio designado quando vocˆ o
      inicia manualmente ou usando safe_mysqld ou mysql.server. Para maiores detalhes,
      veja undefined [Changing MySQL user], page undefined .
 • N˜o suportar links simb´licos para tabelas (Isto pode ser desabilitado com a op¸˜o --
    a                     o                                                       ca
                        e                           e
   skip-symlink. Isto ´ muito importante caso vocˆ execute o mysqld como root, assim
                                 a                          o
   qualquer um que tenha acesso ` escrita aos dados do diret´rio do mysqld podem apagar
   qualquer arquivo no sistema! See undefined [Symbolic links to tables], page unde-
   fined .
 • Verfique se o usu´rio Unix que executa o mysqld ´ o unico usu´rio com privil´gios de
                     a                                e ´         a              e
                            o
   leitura/escrita nos diret´rios de bancos de dados.
 • N˜o forne¸a o privil´gio process para todos os usu´rios. A sa´ de mysqladmin
     a        c          e                              a            ida
                                                          ca
   processlits mostra as consultas atualmente em execu¸˜o, portanto qualquer usu´rioa
                                                                      a
   que consiga executar este comando deve ser apto a ver se outro usu´rio entra com uma
   consulta do tipo UPDATE user SET password=PASSWORD(’n~o_seguro’).
                                                             a
                                   a              a                       e
      O mysqld reserva uma conex˜o extra para usu´rios que tenham o privil´gio process,
                    a
      portanto o usu´rio root do MySQL pode logar e verificar alguns detalhes mesmo se
                    o
      todas as conex˜es normais estiverem em uso.
 • N˜o conceda o privil´gio file a todos os usu´rios. Qualquer usu´rio que possua este
    a                   e                      a                 a
         e
   privil´gio pode gravar um arquivo em qualquer lugar no sistema de arquivos com os
         e
   privil´gios do daemon mysqld! Para tornar isto um pouco mais seguro, todos os ar-
                                                  a                     a
   quivos gerados com SELECT ... INTO OUTFILE s˜o lidos por todos, e n˜o se pode so-
   brescrever arquivos existentes.
   O privil´gio file pode tamb´m ser usado para ler qualquer arquivo acess´
            e                  e                                           ivel para o
       a                                 a
   usu´rio Unix com o qual o servidor est´ sendo executado. Pode ocorrer abusos como,
   por exemplo, usar LOAD DATA para carregar o arquivo ‘/etc/passwd’ em uma tabela,
                 a
   que pode ent˜o ser lido com SELECT.
 • Se vocˆ n˜o confia em seu DNS, vocˆ deve utilizar n´meros IP no lugar de nomes de
          e a                            e                u
     a                               a                           e
   m´quinas nas tabelas de permiss˜o. De qualquer forma, vocˆ deve ter muito cuidado
                               a                                   a
   ao criar entradas de concess˜o utilizando valores de nomes de m´quinas que contenham
   metacaractes!
 • Se vocˆ deseja restrigir o n´mero de conex˜es para um unico usu´rio, vocˆ pode faze-lo
         e                     u             o           ´        a        e
                       a
   configurando a vari´vel max_user_connections no mysqld.

         co               ca                       ca
4.2.3 Op¸˜es de Inicializa¸˜o para o mysqld em Rela¸˜o a
             c
      Seguran¸a.
               co                             c
As seguintes op¸˜es do mysqld afetam a seguran¸a:
--safe-show-database
                      ca
          Com esta op¸˜o, SHOW DATABASES retorna somente os bancos de dados nos quais
               a                            e
          o usu´rio tem algum tipo de privil´gio.
--safe-user-create
                                   a     a                          a
          Se for habilitado, um usu´rio n˜o consegue criar novos usu´rios com o comando
                           a    a             e
          GRANT, se o usu´rio n˜o tiver privil´gio de INSERT na tabela mysql.user. Se
              e                            a                 o                 a
          vocˆ desejar fornecer a um usu´rio acesso para s´ criar novos usu´rios com
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                    201



                 e              a                                 e                a
           privil´gios que o usu´rio tenha direito a conceder, vocˆ deve dar ao usu´rio o
                          e
           seguinte privil´gio:
                  GRANT INSERT(user) on mysql.user to ’usuarior’´ostname’;
                                                                        h
                   a                      a      a        a
           Isto ir´ assegurar que o usu´rio n˜o poder´ alterar nenhuma coluna de
                 e
           privil´gios diretamente, mas tem que usar o comando GRANT para conceder
                                   a
           direitos para outros usu´rios.
--skip-grant-tables
                  ca                                                   e            a
          Esta op¸˜o desabilita no servidor o uso do sistema de privil´gios. Isto d´ a
                      a                                                   e
          todos os usu´rios acesso total a todos os bancos de dados! (Vocˆ pode dizer a
                                ca                                       o
          um servidor em execu¸˜o para para uar as tabelas de permiss˜es executando
          mysqladmin flush-privileges ou mysqladmin reload.)
--skip-name-resolve
                      a         a a
          Nomes de m´quinas n˜o s˜o resolvidos. Todos os valores da coluna Host nas
                            o              u
          tabelas de permiss˜es devem ser n´meros IP ou localhost.
--skip-networking
           a                  o                                        o
          N˜o permitir conex˜es TCP/IP sobre a rede. Todas as conex˜es para mysqld
          devem ser feitas via Sockets Unix. Esta op¸˜o n˜o ´ poss´ em sistemas que
                                                    ca a e        ivel
                                                              a
          usam MIT-pthreads, porque o pacote MIT-pthreads n˜o suporta sockets Unix.
--skip-show-database
                     ca          ca                  a
          Com esta op¸˜o a instru¸˜o SHOW DATABASES n˜o retorna nada.

                               e
4.2.4 O Que o Sistema de Privil´gios Faz
      ca       a                      e              e                  a
A fun¸˜o prim´ria do sistema de privil´gios do MySQL ´ autenticar um usu´rio a partir de
                     a                        a            e
uma determinada m´quina e associar este usu´rio com privil´gios a banco de dados como
como select, insert, update e delete.
                                                               a     o
Funcionalidades adicionais incluem a habilidade de ter um usu´rio anˆnimo e conceder
privil´gio para fun¸˜es espec´
      e            co                                                           co
                             ificas do MySQL como em LOAD DATA INFILE e opera¸˜es ad-
ministrativas.

                              e
4.2.5 Como o Sistema de Privil´gios Funciona
                    e                                       a
O Sistema de privil´gios do MySQL garante que todos usu´rios possam fazer exatamente
           e                          e
aquilo que ´ permitido. Quando vocˆ conecta a um servidor MySQL, sua identidade ´       e
                                      e                          a            e
determinada pela maquina de onde vocˆ conectou e o nome de usu´rio que vocˆ especificou.
                        e                                                   e
O sistema concede privil´gios de acordo com sua identidade e com o que vocˆ deseja fazer.
                                        a                             a
O MySQL considera tanto os nomes de m´quinas como os nomes de usu´rios porque existem
          o                                                   a
poucas raz˜es para assumir que um determinado nome de usu´rio pertence a mesma pessoa
                                             a                                        a
em todo lugar na Internet. Por exemplo, o usu´rio bill que conecta de whitehouse.gov n˜o
                                                   a
deve necessariamente ser a mesma pessoa que o usu´rio bill que conecta da microsoft.com
                                              ca          a                    a
O MySQL lida com isto, permitindo a distin¸˜o de usu´rios em diferentes m´quinas que
                                 e
podem ter o mesmo nome: Vocˆ pode conceder a bill um conjunto de privil´gios parae
      o                                                            e
conex˜es de whitehouse.gov e um conjunto diferente de privil´gios para conex˜es de o
microsoft.com.
                                 e                      a
O controle de acesso do MySQL ´ composto de dois est´gios:
202                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



  • 1o Est´gio: O servidor confere se vocˆ pode ter acesso ou n˜o.
          a                              e                     a
  • 2o. Est´gio: Assumindo que vocˆ pode conectar, o servidor verifica cada requisi¸˜o
            a                          e                                              ca
                            e            a      e                                    ca
    feita para saber se vocˆ tem ou n˜o privil´gios suficientes para realizar a opera¸˜o.
                        e
    Por exemplo, se vocˆ tentar selecionar linha de uma tabela em um banco de dados ou
                                                                       e             e
    apagar uma tabela do banco de dados, o servidor se certifica que vocˆ tem o privil´gio
                                    e
    select para a tabela ou o privil´gio drop para o banco de dados.

                                                                                    a
O servidor utiliza as tabelas user, db e host no banco de dados mysql em ambos est´gios
                                                           a a
do controle de acesso. Os campos nestas tabelas de permiss˜o s˜o detalhados abaixo:
Nome da Tabela       User                  db                     host
Campos de escopo     Host                  Host                   Host
                     User                  Db                     Db
                     Password              User
Cmapos          de   Select_priv           Select_priv            Select_priv
      e
privil´gio
                     Insert_priv           Insert_priv            Insert_priv
                     Update_priv           Update_priv            Update_priv
                     Delete_priv           Delete_priv            Delete_priv
                     Index_priv            Index_priv             Index_priv
                     Alter_priv            Alter_priv             Alter_priv
                     Create_priv           Create_priv            Create_priv
                     Drop_priv             Drop_priv              Drop_priv
                     Grant_priv            Grant_priv             Grant_priv
                     References_priv
                     Reload_priv
                     Shutdown_priv
                     Process_priv
                     File_priv
                a                                  ca            ca
No segundo est´gio do controle de acesso (verifica¸˜o da solicita¸˜o), o servidor pode, se a
        ca
solicita¸˜o involver tabelas, consultar adicionalmente as tabelas tables_priv e columns_
                                   a
priv. Os campos nestas tabelas s˜o mostrados abaixo:
Nome da tabela       tables_priv           columns_priv
Campos          de   Host                  Host
escopop
                     Db                    Db
                     User                  User
                     Table_name            Table_name
                                           Column_name
Campos          de   Table_priv            Column_priv
      e
privil´gio
                     Column_priv
Outros campos        Timestamp             Timestamp
                     Grantor
                      o       e                                     e
Cada tabela de permiss˜es contˆm campos de escopo e campos de privil´gios.
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                      203



                                                                            e
Campos de escopo determinam o escopo de cada entrada nas tabelas, isto ´, o contexto
no qual a entrada se aplica. Por exemplo, uma entrada na tabela user com valores Host
                                                                              o
e User de ’thomas.loc.gov’ e ’bob’ devem ser usados para autenticar conex˜es feitas
                          a
ao servidor por bob da m´quina thomas.loc.gov. De maneira similar, uma entrada na
tabela db com campos Host, User e Db de ’thomas.loc.gov’, ’bob’ e ’reports’ devem
                                   a
ser usados quando bob conecta da m´quina thomas.loc.gov para acessar o banco de dados
reports. As tabelas tables_priv e columns_priv contem campos de escopo indicando as
        co
combina¸˜es de tabelas ou tabela/coluna para o qual cada entrada se aplica.
           o              ca                     co                    a
Para prop´sitos de verifica¸˜o de acessos, compara¸˜es de valores Host s˜o caso insensitivo,
                                           a                                       a
valores User, Password, Db e Table_name s˜o caso sensitivo. Valores Column_name s˜o caso
                           a
insensitivo no MySQL vers˜o 3.22.12 ou posterior.
                 e                       e                                              e
Campos de privil´gios indicam os privil´gios concedidos por uma entrada na tabela, isto ´,
           co                                                       co      a
quais opera¸˜es podem ser realizadas. O servidor combina as informa¸˜es de v´rias tabelas
          a                           ca                   e              a
de concess˜o para formar uma descri¸˜o completa dos privil´gios de um usu´rio. As regras
                        a
usadas para fazer isto s˜o descritas em undefined [Request access], page undefined .
                     a                                                        a
Campos de escopo s˜o strings, declaradas como mostrado abaixo; os valores padr˜o para
     e
cada ´ a string vazia:
Nome     do     Tipo
Campo
Host            CHAR(60)
User            CHAR(16)
Password        CHAR(16)
Db              CHAR(64)     (CHAR(60) para as tabelas tables_priv e columns_priv)
Table_name      CHAR(60)
Column_name     CHAR(60)
                                                         e       a
Nas tabelas user, db e host, todos campos de privil´gios s˜o declarados como
                                                                        a e
ENUM(’N’,’Y’) --- cada um pode ter um valor de ’N’ ou ’Y’ e o valor padr˜o ´ ’N’.
                                                       e      a
Nas tabelas tables_ e columns_priv, os campos de privil´gios s˜o declarados como campos
SET:
Nome da Tabela     Nome Campo       Poss´iveis elementos do conjunto
tables_priv        Table_priv       ’Select’, ’Insert’, ’Update’, ’Delete’,
                                    ’Create’, ’Drop’, ’Grant’, ’References’,
                                    ’Index’, ’Alter’
tables_priv        Column_priv      ’Select’, ’Insert’, ’Update’, ’References’
columns_priv       Column_priv      ’Select’, ’Insert’, ’Update’, ’References’
                                                             o
De maneira resumida, o servidor utiliza as tabelas de permiss˜es desta forma:
 • Os campos de escopo da tabela user determinam quando permitir ou aceitar conex˜es.o
               o                              e
   Para conex˜es permitidas, qualquer privil´gio concedido em uma tabela user indica
           e                    a           a                 e
   o privil´gio global (superusu´rio) do usu´rio. Estes privil´gios se aplicam a todos os
   bancos de dados no servidor.
 • As tabelas db e host s˜o usadas juntas:
                         a
     − Os campos de escopo da tabela db determinam quais usu´rios podem acessar de-
                                                            a
                                      a                                        e
       terminados bancos de dados de m´quinas determinadas. Os campos de privil´gios
                              co   a
       determinam quais opera¸˜es s˜o permitidas.
204                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



    − A tabela host ´ usada como uma extens˜o da tabela db quando vocˆ quer que
                       e                        a                          e
                                                                a
       uma certa entrada na tabela db seja aplicada a diversas m´quinas. Por exemplo,
             e                   a
       se vocˆ deseja que um usu´rio esteja apto a usar um banco de dados a partir de
                 a
       diversas m´quinas em sua rede, deixe o campo Host vazio no registro da tabela
              a                                                               a
       db, ent˜o popule a tabela Host com uma entrada para cada uma das m´quinas.
                         e
       Este mecanismo ´ descrito com mais detalhes em undefined [Request access],
       page undefined .
 • As tabelas tables_priv e columns_priv s˜o similares ` tabela db, por´m s˜o mais
                                             a            a              e    a
                             ´                                     ´
   finas: Elas se aplicam ao nivel de tabelas e colunas em vez do nivel dos bancos de
   dados.
                       e                                                 a
Perceba que os privil´gios administrativos (reload, shutdown e etc) s˜o especificados so-
                                                      co                     a
mente na tabela user. Isto ocorre porque opera¸˜es administrativas s˜o opera¸˜es no co
pr´prio servidor e n˜o s˜o espec´
   o                 a a          ificas e n˜o espec´
                                            a                                            a
                                                    ificas dos bancos de dados, portanto n˜o
           a                        e                                  a
existe raz˜o para listar tais privil´gios nas outras tabelas de permiss˜o. De fato, somente
                                                                 e            a
a tabela user necessita ser consultada para determinar se vocˆ pode ou n˜o realizar uma
      ca
opera¸˜o administrativa.
         e             e   oe                                      a e          e
O privil´gio file tamb´m s´ ´ especificado na tabela user. Ele n˜o ´ um privil´gio admin-
                                                                         e
istrativo, mas sua habilidade para ler ou escrever arquivo no servidor ´ independtende do
                         e    a
banco de dados que vocˆ est´ acessando.
                                u                           o                     e
O servidor mysqld le o conte´do das tabelas de permiss˜es uma vez, quando ´ iniciado.
Altera¸˜es nas tabelas de permiss˜es tem efeito como indicado em undefined [Privilege
       co                            o
changes], page undefined .
              e                u                           o e             e
Quando vocˆ modifica o conte´do das tabelas de permiss˜es, ´ uma boa id´ia ter certeza que
             co                         e
suas altera¸˜es configuraram os privil´gios da forma desejada. Para ajuda no diagnostico
de problemas, veja undefined [Access denied], page undefined . Para conselhos sobre
                      c
asssuntos de seguran¸a, See undefined [Security], page undefined .
                           o       ´ e
Uma ferramenta de diagn´stico util ´ o script mysqlaccess, que Yves Carlier fornece na
          ca                                             ca
distribui¸˜o MySQL. Chame mysqlaccess com a op¸˜o --help para descobrir como ele
funciona. Perceba que o mysqlaccess confere o acesso usando somente as tabelas user, db
e host. Ele n˜o confere privil´gios no n´ de tabelas ou colunas.
                a               e         ivel

            e
4.2.6 Privil´gios Fornecidos pelo MySQL
         co              e           a       a
Informa¸˜es sobre privil´gios de usu´rios s˜o armazenados nas tabelas user, db, host,
tables_priv e columns_priv no banco de dados chamado mysql. O servidor MySQL lˆ o    e
      u                                                    a
conte´do destas tabelas quando ele inicia e sob as circunstˆncias indicadas em undefined
[Privilege changes], page undefined .
                                                          e                           a
Os nomes usados neste manual que se referem-se aos privil´gios fornecidos pelo MySQL s˜o
                                                                        e
vistos abaixo juntos com o nome da coluna associada com cada privil´gio nas tabelas de
         a                             e
permiss˜o e o contexto em que o privil´gio aplica-se:
       e
Privil´gio      Coluna                 Contexto
select          Select_priv            tabelas
insert          Insert_priv            tabelas
update          Update_priv            tabelas
delete          Delete_priv            tabelas
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                        205



index           Index_priv             tabelas
alter           Alter_priv             tabelas
create          Create_priv            bancos de dados, tabelas, ou ´indices
drop            Drop_priv              bancos de dados ou tabelas
grant           Grant_priv             bancos de dados ou tabelas
references      References_priv        bancos de dados ou tabelas
reload          Reload_priv                       ca
                                       administra¸˜o do servidor
shutdown        Shutdown_priv                     ca
                                       administra¸˜o do servidor
process         Process_priv                      ca
                                       administra¸˜o do servidor
file             File_priv                     a
                                       acesso ` arquivos no servidor
         e                                                            co
Os privil´gios select, insert, update e delete permitem realizar opera¸˜es em registros nas
tabelas existentes em um banco de dados.
      co                              e
Instru¸˜es SELECT necessitam do privil´gio select somente se ele precisar recuperar registros
                    e                              co
de uma tabela. Vocˆ pode executar certas instru¸˜es SELECT mesmo sem permiss˜o para  a
                                                                      e
acessar algum dos bancos de dados no servidor. Por exemplo, vocˆ pode usar o cliente
mysql como uma simples calculadora:
      mysql> SELECT 1+1;
      mysql> SELECT PI()*2;
O privil´gio index permite a cria¸˜o ou remo¸˜o de ´
        e                        ca          ca       indices.
        e
O privil´gio alter permite utilizar ALTER TABLE.
         e                                  ca
Os privil´gios create e drop permitem a cria¸˜o de novos bancos de dados e tabelas, ou a
    ca
remo¸˜o de bancos de dados e tabelas existentes.
                                     e                                               a
Perceba que se for concedido o privil´gio drop no banco de dados mysql para algum usu´rio,
        a                                                       e
este usu´rio pode remover o banco de dados no qual os privil´gios de acesso do MySQL
   a
est˜o armazenados!
        e                       e                      a              e            e
O privil´gio grant permite a vocˆ fornecer a outros usu´rios os privil´gios que vocˆ mesmo
possui.
        e                       a                                                        co
O privil´gio file fornece permiss˜o para ler e escrever arquivos no servidor usando instru¸˜es
                                                                a
LOAD DATA INFILE e SELECT ... INTO OUTFILE. Qualquer usu´rio que tenha este privil´gio   e
pode ler ou gravar qualquer arquivo que o servidor MySQL possa ler ou escrever.
         e                a                   co                         a
Os privil´gios restantes s˜o usados para opera¸˜es administrativas, que s˜o realizadas uti-
lizando o programa mysqladmin. A tabela abaixo mostra quais comandos do mysqladmin
           e                                   ca
cada privil´gio administrativos permite a execu¸˜o:
      e
Privil´gio      Comandos permitidos
reload          reload, refresh, flush-privileges, flush-hosts, flush-logs e flush-
                tables
shutdown        shutdown
process         processlist, kill
                                                                         o
O comando reload diz ao servidor para recarregar as tabelas de permiss˜es. O comando
refresh descarrega todas as tabelas e abre e fecha os arquivos de log. flush-privileges
e        o                                                               co
´ um sinˆnimo para reload. Os outros comandos flush-* realizam fun¸˜es similares ao
refresh mas s˜o mais limitados no escopo e podem ser prefer´
               a                                               iveis em alguns casos. Por
                 e                                                          e
exemplo, se vocˆ deseja descarregar apenas os arquivos log, flush-logs ´ uma melhor
escolha do que refresh.
206                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



O comando shutdown desliga o servidor.
                                            co                              ca
O comando processlist mostra informa¸˜es sobre as threads em execu¸˜o no servidor.
                                                   e                a
O comando kill mata threads no servidor. Vocˆ sempre poder´ mostrar ou matar suas
  o                          e                 e
pr´prias threads, mas vocˆ precisa do privil´gio process para mostrar ou matar threads
                         a
iniciadas por outros usu´rios. See undefined [KILL], page undefined
´ uma boa id´ia em geral conceder privil´gios somente para aqueles usu´rios que necessitem
E              e                          e                             a
                 e                                                e
deles, mas vocˆ deve ter muito cuidado ao conceder certos privil´gios:
  • O privil´gio grant permite aos usu´rios repassarem seus privil´gios a outros usu´rios.
              e                          a                            e                a
               a                         e                  e
     Dois usu´rios com diferentes privil´gios e com o privil´gio grant conseguem combinar
                 e
     seus privil´gios.
  • O privil´gio alter pode ser usado para subverter o sistema de privil´gios renomeando
              e                                                           e
     as tabelas.
  • O privil´gio file pode ser usado com abuso para ler qualquer arquivo de leitura no
              e
                                                         u
     servidor em uma tabela de banco de dados, o conte´do pode ser acessando utilizando
                                u
     SELECT. Isto inclui o conte´do de todos os bancos de dados hospedados pelo servidor!
  • O privil´gio shutdown pode ser utilizado para negar inteiramente servi¸os para oturos
              e                                                              c
         a
     usu´rios, terminando o servidor.
  • O privil´gio process pode ser usado para ver o texto das consultas atualmente em
              e
           ca
     execu¸˜o, incluindo as consultas que configuram ou alteram senhas.
  • Privil´gios no banco de dados mysql pode ser utilizado para alterar senhas e outras
           e
              co           e                       a
     informa¸˜es de privil´gio de acesso. (Senhas s˜o armazenadas criptografadas, portanto
             a               a                     e
     um usu´rio malicioso n˜o pode simplesmente lˆ-las para saber as senhas em texto puro).
     Se fosse poss´ acessar a coluna password do banco mysql.user, seria poss´ logar
                   ivel                                                           ivel
                                          a              e
     ao servidor MySQL como outro usu´rio. (Com privil´gios suficientes, o mesmo usu´rio  a
     pode trocar a senha por outra diferente.)
                               e a                                    e
Existema algumas coisas que vocˆ n˜o pode fazer com o sistem de privil´gios do MySQL:
 • Vocˆ n˜o pode especificar explicitamente que um determinado usu´rio deve ter acesso
       e a                                                          a
                e a                                          a
    negado. Vocˆ n˜o pode explicitamente comparar um usu´rio e depois recusar sua
          a
    conex˜o.
 • Vocˆ n˜o pode especificar que um usu´rio tenha privil´gios para criar ou remover
       e a                                a                e
                                        a
    tabelas em um banco de dados, mas n˜o possa criar ou remover o banco de dados.

4.2.7 Conectando ao Servidor MySQL
                                                           a                  a
Programas clientes do MySQL geralmente necessitam de parˆmetros de conex˜o quando
    e                                         a                e
vocˆ precisar acessar um servidor MySQL: a m´quina na qual vocˆ deseja se conectar, seu
             a
nome de usu´rio e sua senha. Por exemplo, o cliente mysql pode ser iniciado desta forma
                        a
(argumentos opcionais s˜o colocandos entre ‘[’ e ‘]’):
                                 a                      a
      shell> mysql [-h nome_m´quina] [-u nome_usu´rio] [-psua_senha]
                            co                 a
Formas alternativas das op¸˜es -h, -u e -p s˜o --host=nome_m´quina, --user=nome_
                                                                a
                                                  a         c
usu´rio e --password=sua_senha. Perceba que n˜o existe espa¸o entre -p ou --password=
    a
e a senha que deve vir a seguir.
                                                    a e                     a
NOTA: Especificar a senha na linha de comando n˜o ´ seguro! Qualquer usu´rio no seus
sistema pode saber sua senha digitando um comando do tipo: ps auxww. See undefined
[Option files], page undefined .
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                     207



                            a          a               a       a a
O mysql utiliza valores padr˜o para parˆmetros de conex˜o que n˜o s˜o passados pela linha
de comando:
  • O nome padr˜o da m´quina (hostname) ´ localhost.
                  a       a                 e
  • O nome de usu´rio padr˜o ´ o mesmo nome do seu usu´rio no Unix.
                    a        a e                          a
  • Nenhuma senha ´ fornecida se faltar o parˆmetro -p.
                      e                       a
   a               a                                       a
Ent˜o, para um usu´rio Unix joe, os seguintes comandos s˜o equivalentes:
      shell> mysql -h localhost -u joe
      shell> mysql -h localhost
      shell> mysql -u joe
      shell> mysql
Outros clientes MySQL comportam-se de forma similar.
                       e                                o
Em sistemas Unix, vocˆ pode especificar valores padr˜es diferentes para serem usados
            e             a            e a               a
quendo vocˆ faz uma conex˜o, assim vocˆ n˜o precisa digit´-los na linha de comando sempre
                                                       a
que chamar o programa cliente. Isto pode ser feito de v´rias maneiras:
  • Podem ser especificados parˆmetros de conex˜o na se¸˜o [client] do arquivo de con-
                               a                 a        ca
           ca                      o               ca
    figura¸˜o ‘.my.cnf’ no seu diret´rio home. A se¸˜o relevante do arquivo deve se parecer
    com isto:
           [client]
                       a
           host=nome_m´quina
                         a
           user=nome_usu´rio
                               a
           password=senha_usu´rio
    See undefined [Option files], page undefined .
  • Vocˆ pode especificar parˆmetros de conex˜o utilizando vari´veis de ambiente. O nome
        e                   a                a                  a
          a                                                           a
    de m´quina pode ser especificado para o mysql utilizando a vari´vel MYSQL_HOST. O
                 a                                                          e
    nome do usu´rio MySQL pode ser especificado utilizando USER (isto ´ somente para
                                                                               a e
    Windows). A senha pode ser especificada utilizando MYSQL_PWD (mas isto n˜o ´ seguro;
              o      ca
    veja a pr´xima se¸˜o). See undefined [Environment variables], page undefined .

                             a              ca          a
4.2.8 Controle de Acesso, Est´gio 1: Verifica¸˜o da Conex˜o
            e                                                                          a
Quando vocˆ tenta se conectar a um servidor MySQL, o servidor aceita ou rejeita a conex˜o
                                            a
baseado na sua identidade e se pode ou n˜o verificar sua identidade fornecendo a senha
            a                                 e
correta. Sen˜o, o servidor nega o acesso a vocˆ completamente. De outra forma, o servidor
              a               a                          co
aceita a conex˜o, entra no est´gio 2 e espera por requisi¸i˜es.
                e                                    ca
Sua identidade ´ baseada em duas partes de informa¸˜o:
  • A m´quina de onde est´ conectando
         a                  a
  • Seu nome de usu´rio no MySQL
                      a
         e                   e
A conferˆncia da identidade ´ feita utilizando os tres campos de escopo da tabela user
                                                    a
(Host, User e Password). O servidor aceita a conex˜o somente se uma entrada na tabela
                      a                     a
user coincidir com a m´quina, nome de usu´rio e a senha fornecidos.
Valores dos campos escopo na tabela user podem ser especificados como segue:
  • Um valor Host deve ser um nome de m´quina ou um n´mero IP ou ’localhost’ para
                                           a              u
                a
    indicar a m´quina local.
208                                             e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • Vocˆ pode utilizar os metacaracteres ‘%’ e ‘_’ no campo Host.
      e
 • Um valor Host de ’%’ coincide com qualquer nome de m´quina.
                                                       a
 • Um valor Host em branco significa que o privil´gio deve ser adicionado com a entrada
                                                 e
                                                 a                    e
   na tabela host que coincide com o nome de m´quina fornecido. Vocˆ pode encontrar
   mais informa¸˜es sobre isto no pr´ximo cap´
               co                   o        itulo.
 • Como no MySQL Vers˜o 3.23, para valores Host especificados como n´meros IP, vocˆ
                        a                                             u              e
                         a                                             c     a
   pode especificar uma m´scara de rede indicando quantos bits de endere¸o ser˜o usados
           u
   para o n´mero da rede. Por exemplo:
         GRANT ALL PRIVILEGES on db.* to david@’192.58.197.0/255.255.255.0’;
                   a                                                                ca
      Isto permitir´ que todos a se conectarem a partir de determinado IP cuja condi¸˜o
      seguinte seja verdadeira:
                    a        a
            IP_usu´rio & m´scara_rede = ip_maquina.
      No exemplo acima todos IPs no Intervalo 192.58.197.0 - 192.58.197.255 podem se conec-
      tar ao servidor MySQL.
 • Metacaracteres n˜o s˜o permitidos no campo User, mas vocˆ pode especificar um valor
                     a a                                     e
   em branco, que combina com qualquer nome. Se a entrada na tabela user que casa com
                    a                     a                    a  e
   uma nova conex˜o tem o nome do usu´rio em branco, o usu´rio ´ considerado como
           a      o           a
   um usu´rio anˆnimo (o usu´rio sem nome), em vez do nome que o cliente especificou.
                                     a               e                         co
   Isto significa que um nome de usu´rio em branco ´ usado para todos as verifica¸˜es de
                          a         e               a
   acessos durante a conex˜o. (Isto ´, durante o est´gio 2).
 • O campo Password pode ficar em branco. O que n˜o significa que qualquer senha possa
                                                     a
                                a
   ser usada, significa que o usu´rio deve conectar sem especificar uma senha.

                          a     a               a
Valores de Password que n˜o est˜o em branco s˜o apresentados como senhas criptografadas.
            a
O MySQL n˜o armazena senhas na forma de texto puro para qualquer um ver. Em vez disso,
                             a           a                     e
a senha fornecida por um usu´rio que est´ tentando se conectar ´ criptografada (utilizando a
    ca                                       e    a
fun¸˜o PASSWORD()). A senha criptografada ´ ent˜o usada quando o cliente/servidor estiver
                       e              e
conferindo se a senha ´ correta (Isto ´ feito sem a senha criptografada sempre trafegando
              a
sobre a conex˜o.) Perceba que do ponto de vista do MySQL a senha criptografada ´ a       e
                          e a              a             e                      a
senha REAL, portanto vocˆ n˜o deve pass´-la para ningu´m! Em particular, n˜o forne¸a a  c
    a
usu´rios normais acesso de leitura para as tabelas no banco de dados mysql!
                              a            co
Os exemplos abaixo mostram v´rias combina¸˜es de valores de Host e User nos registros
                                      o
da tabela user aplicando a novas conex˜es:
Valor em host             Valor em user           o
                                            Conex˜es casadas com o registro
’thomas.loc.gov’          ’fred’            fred, conectando de thomas.loc.gov
’thomas.loc.gov’          ’’                Qualquer          a
                                                          usu´rio,      conectando     de
                                            thomas.loc.gov
’%’                       ’fred’                                                   a
                                            fred, conectando a partir de qualquer m´quina
’%’                       ’’                             a
                                            Qualquer usu´rio, conectando a partir de qual-
                                                   a
                                            quer m´quina
’%.loc.gov’               ’fred’                                               a
                                            fred, conectando de qualquer m´quina do
                                                ´
                                            dominio loc.gov
’x.y.%’                   ’fred’            fred,       conectando       de      x.y.net,
                                            x.y.com,x.y.edu, etc.         (Isto provavel-
                                                    a e´
                                            mente n˜o ´ util)
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                        209



’144.155.166.177’        ’fred’                                     a
                                             fred, conectando da m´quina com endere¸o IP c
                                             144.155.166.177
’144.155.166.%’           ’fred’                                              a
                                             fred, conectando de qualquer m´quina na sub-
                                             rede de classe C 144.155.166
’144.155.166.0/255.255.255.0’
                          ’fred’             o mesmo que no exemplo anterior
            e
Como vocˆ pode usar valores coringas de IP no campo Host (por exemplo, ’144.155.166.%’
                        a
combina com todas m´quinas em uma subrede), existe a possibilidade que algu´m possa e
                                               a
tentar explorar esta capacidade nomeando a m´quina como 144.155.166.algumlugar.com.
                                                                ca
Para evitar tais tentativas, O MySQL desabilita a combina¸˜o com nomes de m´quina      a
                    ´                                      e                a
que iniciam com digitos e um ponto. Portanto se vocˆ possui uma m´quina nomeada
                                          a
como 1.2.foo.com, este nome nunca ir´ combinar com uma coluna Host das tabelas de
         o                 u
permiss˜es. Somente um n´mero IP pode combinar com um valor coringa de IP.
              a
Uma conex˜o de entrada pode coincidir com mais de uma entrada na tabela user. Por
                      a                                        a
exemplo, uma conex˜o a partir de thomas.loc.gov pelo usu´rio fred pode combinar com
diversas das entradas vistas acima. Como o servidor escolhe qual entrada usar se mais
                                                  a
de uma coincide? O servidor resolve esta quest˜o ordenando a tabela user no tempo de
           ca                                                        ca
inicializa¸˜o, depois procura pelas entradas na ordem da classifica¸˜o quando um usu´rio    a
                                                       e         a
tenta se conectar. A primeira entrada que coincidir ´ a que ser´ usada.
            ca
A ordena¸˜o da tabela user funciona da forma mostrada a seguir. Suponha que a tabela
                c
user se pare¸a com isto:
       +-----------+----------+-
       | Host         | User       | ...
       +-----------+----------+-
       | %            | root       | ...
       | %            | jeffrey | ...
       | localhost | root          | ...
       | localhost |               | ...
       +-----------+----------+-
Quando o servidor lˆ a tabela, ele ordena as entradas com os valores mais espec´
                    e                                                           ificos de Host
                                                     a         e             ´
primeiro (’%’ na coluna Host significa “qualquer m´quina” e ´ menos especifico). Entradas
com o mesmo valor Host s˜o ordenadas com os valores mais espec´
                            a                                         ificos de User primeiro
(um valor em branco na coluna User significa “qualquer usu´rio” e ´ menos espec´
                                                              a        e             ifico). O
resultado da tabela user ordenada ficaria assim:
       +-----------+----------+-
       | Host         | User       | ...
       +-----------+----------+-
       | localhost | root          | ...
       | localhost |               | ...
       | %            | jeffrey | ...
       | %            | root       | ...
       +-----------+----------+-
                    a e
Quando uma conex˜o ´ iniciada, o servidor procura entre as entradas ordenadas e utiliza a
                                                a
primeira entrada coincidente. Para uma conex˜o a partir de localhost feito por jeffrey,
as entradas com ’localhost’ na coluna Host coincide primeiro. Destas, a entrada com o
                a                                          a
nome do usu´rio em branco combina com o nome da m´quina e o nome do usu´rio. (A      a
                               e                      a e
entrada ’%’/’jeffrey’ tamb´m casaria, mas ela n˜o ´ a primeira entrada coincidente na
tabela.
210                                             e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



          a
Aqui est´ outro exemplo. Suponha que a tabela user fosse assim:
       +----------------+----------+-
       | Host              | User      | ...
       +----------------+----------+-
       | %                 | jeffrey | ...
       | thomas.loc.gov |              | ...
       +----------------+----------+-
A tabela ordenada pareceria com isto:
       +----------------+----------+-
       | Host              | User      | ...
       +----------------+----------+-
       | thomas.loc.gov |              | ...
       | %                 | jeffrey | ...
       +----------------+----------+-
             a
Uma conex˜o a partir de thomas.loc.gov feita por jeffrey coincide com a primeira en-
                              a
trada, no entanto, uma conex˜o de whitehouse.gov fetia por jeffrey coincidiria com a
segunda entrada na tabela.
                 e                                     a
Um erro comum ´ pensar que para um determinado usu´rio, todas as entradas que citam
                       a       a                              a
explicitamente este usu´rio ser˜o usadas primeiro quando o usu´rio tentar encontrar uma
          ca             a                       a e
combina¸˜o para a conex˜o. Simplesmente isto n˜o ´ verdade. O exemplo anterior ilustra
                     a                                                           a
isto, onde uma conex˜o de thomas.loc.gov feita por jeffrey combina primeiro n˜o com
a entrada contendo ’jeffrey’ no valor do campo user, mas sim pela entrada sem o nome
       a
de usu´rio!
        e
Se vocˆ tiver problemas conectando ao servidor, imprima a tabela user e ordene-a na
                                                     e
manualmente para ver onde se deu o primeiro coincidˆncia de valores.

                             a              ca            ca
4.2.9 Controle de Acesso, Est´gio 2: Verifica¸˜o da Requisi¸˜o
                                   a                               a
Uma vez estabelecida uma conex˜o, o servidor entra no 2o est´gio. Para cada requisi¸˜o     ca
                  a                                e           e                         a
que vem na conex˜o, o servidor verifica se vocˆ tem privil´gios suficientes para realiz´-la,
                   co            e                   ´
baseado nas opera¸˜es que vocˆ deseja fazer. E aqui que os campos de concess˜es nas   o
                   o                   ca                e
tabelas de permiss˜es entram em a¸˜o. Estes privil´gios pode vir de qualquer uma das
tabelas user, db, host, tables_priv ou columns_priv. As tabelas de permiss˜es s˜o     o     a
manipuladas com os comandos GRANT e REVOKE. See undefined [GRANT], page undefined .
      e           ´
(Vocˆ pode achar util fazer referencia a undefined [Privileges], page undefined , que lista
os campos presentes em cada uma das tabelas de permiss˜es.)  o
                             e             a                       e
A tabela user concede privil´gios que s˜o especificados por vocˆ em uma base global e que
                                e
se aplicam sem importar qual ´ o banco de dados atual. Por exemplo, se a tabela user
              e            e                       a
concede a algu´m o privil´gio delete, este usu´rio pode apagar linhas de qualquer banco
                                                       e                     a       e
de dados no servidor! Em outras palavras, privil´gios na tabela user s˜o privil´gios de
         a                e                  e
superusu´rio. O correto ´ conceder privil´gios na tabela user apenas para superusu´rios  a
tais como os administradores de servidor ou de bancos de dados. Para outros usu´rios,   a
    e                     e                                                             e
vocˆ deve deixar os privil´gios na tabela user configurados para ’N’ e conceder privil´gios
somente em bancos de dados espec´    ificos, utilizando as tabelas db e host.
As tabelas db e host concedem privil´gios para bancos de dados espec´
                                         e                                 ificos. Valores nos
campos de escopo podem ser especificados como a seguir:
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                         211



  • Os metacaracteres ‘%’ e ‘_’ podem ser usados nos campos Host e Db de ambas tabelas.
  • O valor ’%’ em Host na tabela db significa “qualquer m´quina.” Um valor em branco
                                                          a
                                                                      ca
    em Host na tabela db significa “consulte a tabela host para informa¸˜o adicional.”
  • O valor ’%’ ou em branco no campo Host na tabela host significa “qualquer m´quina.”
                                                                               a
  • O valor ’%’ ou em branco no campo Db de ambas as tabelas significa “qualquer banco
    de dados.”
  • O valor em branco no campo User em ambas tabelas coincide com o usu´rio anˆnimo.
                                                                          a      o

                       a
As tabelas db e host s˜o lidas e ordenadas quando o servidor inicia (ao mesmo tempo que
     e                              e
ele lˆ a tabela user). A tabela db ´ ordenada nos campos de escopo Host, Db e User e a
             e
tabela host ´ ordenada nos campos de escopo Host e Db. Assim como na tabela user, a
ordena¸˜o coloca os valores mais espec´
        ca                             ificos no in´ e os menos espec´
                                                   icio                           ´
                                                                        ificos por ultimo, e
                                                                                    ca
quando o servidor procura por entradas coincidentes, ele usa a primeira combina¸˜o que
encontrar.
As tabelas tables_priv e columns_priv concedem privil´gios espec´
                                                          e           ificos para tabelas e
campos. Valores nos campos escopo podem ser especificados como a seguir:
  • Os meta caracteres ‘%’ e ‘_’ podem ser usados no campo Host de ambas tabelas.
  • O valor ’%’ ou em branco no campo Host em ambas tabelas significam “qualquer
       a
     m´quina”
  • Os campos Db, Table_name e Column_name n˜o podem conter meta caracteres ou serem
                                                 a
     brancos em ambas tabelas.
                                             a
As tabelas tables_priv e columns_priv s˜o ordenadas nos campos Host, DB e User. Isto
e                            ca                                    ca e
´ parecido com a ordena¸˜o da tabela db, no entanto, a ordena¸˜o ´ mais simples porque
somente o campo Host pode conter meta caracteres.
                          ca            ca e                            e a     a
O processo de verifica¸˜o da requisi¸˜o ´ descrito abaixo. (Se vocˆ j´ est´ familiarizado
         o                  ca               e a                         ca        e
com o c´digo de verifica¸˜o de acesso, vocˆ ir´ perceber que a descri¸˜o aqui ´ um pouco
diferente do algor´                 o              ca e                        o
                    itimo usado no c´digo. A descri¸˜o ´ equivalente ao que o c´digo realmente
          oe                                 ca
faz; ele s´ ´ diferente para tornar a explica¸˜o mais simples.)
              co
Para requisi¸˜es administrativas (shutdown, reload, etc.), o servidor confere somente a
                                        e ´                                  e
entrada da tabela user, porque ela ´ a unica tabela que especifica privil´gios administra-
                   e                                          ca
tivos. O acesso ´ concedido se o registro permitir a opera¸˜o requisitada ou negado caso
        a                            e
o contr´rio. Por exemplo, se vocˆ deseja executar mysqladmin shutdown mas a entrada
                         a                     e                         e
em sua tabela user n˜o lhe concede o privil´gio shutdown, o acesso ´ negado mesmo sem
                                           a      e
consultar as tabelas db ou host. (elas n˜o cont´m o campo Shutdown_priv, portanto n˜o       a
existe esta necessidade.)
             co
Para requisi¸˜es relacionadas aos bancos de dados (insert, udpdate, etc.), o servidor primeiro
                   e                     a
confere os privil´gios globais do usu´rio consultando as entradas da tabela user. Se a
                             ca                      e                         e
entrada permitir a opera¸˜o requisitada, o acesso ´ concedido. Se os privil´gios globais na
tabela user s˜o insuficientes, o servidor determina os privil´gios espec´
               a                                                 e          ificos de banco de
                    a
dados para o usu´rio consultando as tabelas db e host:
                                                         ca
  1. O servidor consulta a tabela db por uma combina¸˜o nos campos Host, Db e User. Os
                              a                               a
     campos Host e User s˜o comparados com o nome da m´quina e o nome do usu´rio que   a
                   ca                 e                                              a
     faz a requisi¸˜o. O campo Db ´ comparado com o banco de dados que o usu´rio deseja
                     a                                                             e
     acessar. Se n˜o existir entradas coincidentes para o Host e User, o acesso ´ negado.
212                                             e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                             ca                                                  a
 2. Se existir uma combinca¸˜o com a entrada da tabela db e seu campo Host n˜o estiver
                                              e
    em branco, aquela entrada define os privil´gios especificos do banco de dados do usuario.
 3. Se o registro coincidente da tabela db tiver o campo Host em branco, significa que a
                                  a         a
    tabela host enumera quais m´quinas s˜o permitidas acessar o banco de dados. Neste
                                 e
    caso, uma consulta adicional ´ feita na tabela host para encontrar uma valores coinci-
    dentes nos campos Host e Db. Se nenhuma entrada na tabela host coincide, o acesso
    ´ negado. Se existir uma coincidˆncia, os privil´gios espec´
    e                                  e               e          ificos de bancos de dados
                a    a                              ca     a        a             e
    para o usu´rio s˜o computados como a interse¸˜o (n˜o a uni˜o!) dos privil´gios nas
                                          e          e          a
    entradas das tabelas db e host, isto ´, os privil´gios que s˜o ’Y’ em ambas entradas.
                      e                      e
    (Desta forma vocˆ pode conceder privil´gios gerais em entradas na tabela db e ent˜o a
                                     a            a
    restringi-los em uma base de m´quina a m´quina utilizando as entradas da tabela
    host.)
Depois de determinar os privil´gios espec´
                               e           ificos do banco de dados concedido pelas entradas
                                                         e
nas tabelas db e host, o servidor os adiciona aos privil´gios globais concedidos pela tabela
                                         ca                          a
user. Se o resultado permitir a opera¸˜o requisitada, o acesso ser´ concedido. De outra
                                    e
forma, o servidor consulta os privil´gios de tabelas e campos do usuario nas tabelas tables_
                                                e           a                 a
priv e columns_priv e os adiciona aos privil´gios do usu´rio. O acesso ser´ permitido ou
negado baseado no resultado.
                                      ca                              e              a
Expresso em termos booleanos, a descri¸˜o precedente de como os privil´gios de um usu´rio
 a
s˜o calculados podem ser resumido assim:
      global privileges
      OR (database privileges AND host privileges)
      OR table privileges
      OR column privileges
           a                                  e                                a
Ele pode n˜o ser aparente porque, se os privil´gios da entrada global de user s˜o inicialmente
                          ca                                              e
insuficientes para a opera¸˜o requisitada, o servidor adiciona estes privil´gios mais tarde aos
privil´gios espec´
      e                                                               a e
                 ificos de banco de dados, tabelas e colunas. A raz˜o ´ que uma requisi¸˜o  ca
                                        e                           e
pode exigir mais que um tipo de privil´gio. Por exemplo, se vocˆ executar uma instru¸˜o    ca
                          e                   e                                  e
INSERT ... SELECT, vocˆ precisa dos privil´gios insert e select. Seu privil´gio pode ser
                                                       e
tal que a entrada da tabela user concede um privil´gio e a entrada da tabela db concede
                          e              e            a                            ca
o outro. Neste caso, vocˆ tem os privil´gios necess´rios para realizar a requisi¸˜o, mas o
           a            e                                    o               e
servidor n˜o pode obtˆ-los de ambas as tabelas por si pr´prio; os privil´gios concedidos
pelas entradas em ambas as tabelas de ser combinados.
A tabela host pode ser usada para manter uma lista dos servidores seguros.
                             e                      a                             a
Na Tcx, a tabela host cont´m uma lista de todas as m´quina na rede local. A elas s˜o
                          e
concedidos todos os privil´gios.
    e           e                                 a            a a
Vocˆ pode tamb´m usar a tabela host para indicar m´quinas que n˜o s˜o seguras. Suponha
       e              a                                 a                  a     u
que vocˆ tenha uma m´quina public.your.domain que est´ localizada em uma ´rea p´blica
        e a                        e                                     a
que vocˆ n˜o considera segura. Vocˆ pode permitir o acesso a todas as m´quinas de sua
                    a
rede exceto a esta m´quina usando entradas na tabela host desta forma:
      +--------------------+----+-
      | Host                  | Db | ...
      +--------------------+----+-
                                                             e
      | public.your.domain | % | ... (todos os privil´gios configurados para ’N’)
      | %.your.domain                                        e
                              | % | ... (todos os privil´gios configurados para ’Y’)
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                       213



     +--------------------+----+-
                  e                                                          o
Naturalmente, vocˆ deve sempre testar suas entradas nas tabelas de permiss˜es (por ex-
                                                        e                  a
emplo, usar o mysqlaccess para ter certeza que os privil´gios de acesso est˜o atualmente
                            e
configurados da forma que vocˆ imagina.

4.2.10 Causas dos Erros de Accesso Negado
       e
Se vocˆ encontrar erros de Accesso Negado (Access denied) quando tentar conectar-se ao
                                                                    e
servidor MySQL, a lista abaixo indica alguns caminhos que vocˆ pode seguir para corrigir
o problema:
  • Depois de instalar o MySQL, vocˆ executou o script mysql_install_db para configurar
                                       e
             u                                  o       a     c
     o conte´do inicial das tabelas de permiss˜es ? Se n˜o, fa¸a isto. See undefined [Default
                                                    e
     privileges], page undefined . Testes os privil´gios iniciais executando este comando:
            shell> mysql -u root test
                                  e                             e      e
     O servidor deve deixar vocˆ conectar sem erros. Vocˆ tamb´m deve assegurar que
                                            o
     exista o arquivo ‘user.MYD’ no diret´rio do banco de dados do MySQL. Normalmente
                                                                    e
     ele fica em ‘CAMINHO/var/mysql/user.MYD’. onde CAMINHO ´ o caminho para a raiz da
             ca
     instala¸˜o do MySQL.
  • Depois de terminar uma instala¸˜o, vocˆ deve conectar ao servidor e configurar seus
                                       ca        e
         a                    o
     usu´rios e suas permiss˜es de acesso.
            shell> mysql -u root mysql
                                          a             a
     O servidor deve permitir a conex˜o pois o usu´rio root MySQL vem inicialmente
                                           e e                         c
     configurado sem senha. Isto tamb´m ´ um risco de seguran¸a, portanto configurar
                     a          e                                        e
     a senha do usu´rio root ´ algo que deve ser feito enquanto vocˆ configura os outros
         a
     usu´rios do MySQL.
            e
     Se vocˆ tentar se conectar como root e obter este erro:
            Access denied for user: ’@unknown’ to database mysql
                           e a
     isto significa que vocˆ n˜o possui um registro na tabela user com o valor ’root’ no
                                    a                             a
     campo User e que o mysqld n˜o pode rsolver o nome de m´quina do cliente. Neste caso,
         e                                     ca
     vocˆ deve reiniciar o servidor com a op¸˜o --skip-grant-tables e editar seu arquivo
     ‘/etc/hosts’ ou o ‘\windows\hosts’ para adicionar uma entrada para sua m´quina.a
  • Se vocˆ obter um erro como o seguinte:
            e
            shell> mysqladmin -u root -pxxxx ver
            Access denied for user: ’root@localhost’ (Using password: YES)
                        e     a
     Significa que vocˆ est´ usando uma senha errada. See undefined [Passwords],
     page undefined .
            e                                 e                                 ca
     Se vocˆ esqueceu a senha de root, vocˆ pode reiniciar o mysqld com a op¸˜o --skip-
                                                  e                            ca
     grant-tables para alterar a senha. Vocˆ pode saber mais sobre esta op¸˜o posterior-
                             ca
     mente nesta mesma se¸˜o do manual.
             e                                   a
     Se vocˆ obter o erro acima mesmo se n˜o tiver configurado uma senha, significa que
         e
     vocˆ tem algum arquivo my.ini configurado para passar alguma senha incorreta. See
                                                         e
      undefined [Option files], page undefined . Vocˆ pode evitar o uso de arquivos de
        co            ca
     op¸˜es com a op¸˜o --no-defaults, como a seguir:
            shell> mysqladmin --no-defaults -u root ver
214                                             e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • Se vocˆ atualizou uma instala¸˜o existente do MySQL de um vers˜o anterior
             e                       ca                                            a
   a        a                        a                                   e
   ` vers˜o 3.22.11 para a Vers˜o 3.22.11 ou posterior, vocˆ executou o script
                                               a       c
   mysql_fix_privilege_tabels ? Se n˜o fa¸a isto. A estrutura das tabelas de
             o                        a
   permiss˜es alteraram com a Vers˜o 3.22.11 do MySQL quando a instru¸˜o GRANT se ca
   tornou funcional.
 • Se os seus privil´gios parecerem alterados no meio de uma sess˜o, pode ser que o
                      e                                                    a
               a                                                      o
   superusu´rio os alterou. A recarga das tabelas de permiss˜es afeta novas conex˜es        o
                              e                o
   dos clientes, mas ela tamb´m afeta conex˜es existentes como indicado em undefined
   [Privilege changes], page undefined .
 • Se vocˆ n˜o consegue fazer a sua senha funcionar, lembre-se que vocˆ deve usar a
            e a                                                                 e
       ca                     e                                    co
   fun¸˜o PASSWORD() se vocˆ configurar a senha com instru¸˜es INSERT, UPDATE ou SET
                      ca               e             a          e
   PASSWORD. A fun¸˜o PASSWORD() ´ desnecess´ria se vocˆ especificar a senha usando a
          ca
   instru¸˜o GRANT ... IDENTIFIED BY ou o comando mysqladmin password. See unde-
   fined [Passwords], page undefined .
 • localhost ´ um sinˆnimo para seu nome de m´quina local, e ´ tamb´m a m´quina
                  e       o                               a              e      e      a
        a                                                   e a
   padr˜o em que clientes tentam se conectar se vocˆ n˜o especificar explicitamente o
                 a                         o                          a
   nome da m´quina. Entretanto, conex˜es para localhost n˜o funcionam se vocˆ es-         e
                                                                            o
   tiver executando em um sistema que utilize MIT-pthreads (conex˜es localhost s˜o           a
                                          a a
   feitas utilizando sockets Unix, que n˜o s˜o suportadas pelas MIT-pthreads). Para
                                                e                     ca
   evitar este problema nestes sistemas, vocˆ deve utilizar a op¸˜o --host para nomear
                                       a               a
   explicitamente o servidor. Isto far´ uma conex˜o TCP/IP ao servidor myssqld. Neste
               e                       a
   caso, vocˆ deve ter seu nome de m´quina real nos registros da tabela user no servidor.
          e                          e
   (Isto ´ verdadeiro mesmo se vocˆ estiver executando um programa cliente na mesma
     a
   m´quina que o servidor.)
 • Se vocˆ obter o erro Access denied quando tentando conectar ao banco de dados com
           e
                                             e
   mysql -u nome_usu´rio _nome_bd, vocˆ pode ter um problema com a tabela user.
                         a
   Verifique isto executando mysql -u root mysql e usando esta senten¸a SQL:   c
          mysql> SELECT * FROM user;
   O resultado deve incluir uma entrada com as colunas Host e User combinando com o
                                                    a
   nome de seu computador e seu nome de usu´rio no MySQL.
 • A mensagem de erro Access denied ir´ dizer a vocˆ com qual usu´rio vocˆ est´ ten-
                                            a                e              a        e  a
                         a              a                                e    a
   tando se logar, a m´quina que est´ tentando conectar e se vocˆ est´ utilizando uma
                 a                     e
   senha ou n˜o. Normalmente, vocˆ deve ter um registro na tabela user que combine
                                   a                             a
   exatamente com o nome de m´quina e o nome de usu´rio que forem fornecidos na
                                              e
   mensagem de erro. Por exemplo, se vocˆ obter uma mensagem de erro que contenha
                                                  e     a
   Using password: NO, isto significa que vocˆ est´ tentando se conectar sem uma senha.
 • Se vocˆ obter o seguinte erro quando estiver tentando conectar de uma m´quina difer-
           e                                                                      a
                                                               a a
   ente da que o servidor MySQL estiver executando, ent˜o n˜o deve existir um registro
                                              a
   na tabela user que combine com esta m´quina:
          Host ... is not allowed to connect to this MySQL server
       e
   Vocˆ pode corrigir isto utilizando a ferramenta de linha de comando mysql (no servi-
                                    a
   dor!) para adicionar um registro ` tabela user, db ou host para coincidir com o usu´rio a
                    a                e    a
   e nome de m´quina de onde vocˆ est´ tentando conectar, depois execute o comando
                                             e a
   mysqladmin flush-privileges. Se vocˆ n˜o estiver executando o MySQL Vers˜o 3.22     a
         e a             u                            a
   e vocˆ n˜o sabe o n´mero IP ou o nome da m´quina da qual estiver conectando, vocˆ           e
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                    215



     deve colocar uma entrada com o valor ’%’ na coluna Host da tabela user e reiniciar
                           ca                a             e
     o mysqld com a op¸˜o --log na m´quina onde ´ executado o servidor. Depois tente
                              a                          ca                  a
     conectar a partir da m´quina cliente, a informa¸˜o no log do MySQL ir´ indicar como
          e     a                               a
     vocˆ est´ realmente conectando. (Ent˜o troque o ’%’ na tabela user com o nome da
        a                                                 e
     m´quina mostrado pelo log. De outra forma vocˆ teria um sistema que seria inseguro.)
                  a                                               e   a                a
     Outra raz˜o para este erro no Linux pode ser porque vocˆ est´ utilizando uma vers˜o
          a                      e                            a
     bin´ria do MySQL que ´ compilada com uma vers˜o diferente da glibc que vocˆ est´e  a
                                e
     usando. Neste caso vocˆ deve atualizar seu SO/Glibc ou fazer o download da vers˜o a
                                   a                        e            a
     fonte do MySQL e compil´-la. Um RPM fonte ´, normalmente, f´cil de compilar e
                            a e
     instalar, logo, isto n˜o ´ um grande problema.
 •            e                                                   a     a e
     Se vocˆ obter uma mensagem de erro onde o nome da m´quina n˜o ´ exibido ou, no
                           a                                    e          a
     lugar do nome da m´quina existir um IP, mesmo se vocˆ tenta a conex˜o com um nome
            a
     de m´quina:
             shell> mysqladmin -u root -pxxxx -h some-hostname ver
             Access denied for user: ’root´ (Using password: YES)
     Isto significa que o MySQL obteve algum erro quando tentava resolver o IP para um
                                           e
     nome de maquina. Neste caso vocˆ pode executar mysqladmin flush-hosts para zerar
     o cache DNS interno. See undefined [DNS], page undefined .
                    co
     Algumas solu¸˜es permanentes s˜o:    a
       − Tente descobrir o que est´ errado com seu servidor DNS e corrija os erros.
                                      a
       − Especifique n´meros IPs no lugar de nomes nas tabelas de privil´gios do MySQL.
                         u                                                 e
       − Inicie o mysqld com --skip-name-resolve.
       − Inicie o mysqld com --skip-host-cache.
       − Conecte ` localhost se vocˆ estiver executando o servidor e o cliente na mesma
                    a                     e
              a
            m´quina.
       − Coloque os nomes das m´quinas clientes em /etc/hosts.
                                      a
 •   Se mysql -u root test funciona mas mysql -h nome_servidor -u root test resultar
                                a      e          a                               a
     em Access denied, ent˜o vocˆ pode n˜o ter o nome correto para a sua m´quina na
                                               e
     tabela user. Um problema comum ´ quando o valor de Host na entrada da tabela
                                        a         a                                 ca
     user especifica um nome de m´quina n˜o qualificado, mas as rotinas de resolu¸˜o de
                                                                              ´
     nomes de seu sistema retornam um nome qualificado completo do dominio (ou vice-
                                    e
     versa). Por exemplo, se vocˆ tem uma entrada com o nome ’tcx’ na tabela user, mas
                                                    a        e
     seu DNS diz ao MySQL que o nome da m´quina ´ ’tcx.subnet.se’, a entrada n˜o       a
       a                                              a                           u
     ir´ funcionar. Tente adicionar um registro ` tabela user que contenha o n´mero IP
                  a
     de sua m´quina como o valor da coluna Host. (Uma alternativa, seria adicionar um
                a
     registro ` tabela user com o valor de Host contendo um metacaracter, por exemplo,
                                                       a                        e
     ’tcx.%’. Entretanto, o uso de nomes de m´quinas terminando com ‘%’ ´ inseguro e
       a e
     n˜o ´ recomendado!)
 •   Se mysql -u nome_usu´rio test funciona mas mysql -u nome_usu´rio outro_bd n˜o
                              a                                         a              a
                    e a
     funconar, vocˆ n˜o possui uma entrada para outro_bd listado na tabela db.
 •                                                                           o
     Se mysql -u nome_usu´rio nome_bd funciona quando executado no pr´prio servidor,
                               a
                                                                    a
     mas mysql -u nome_m´quina -u nome_usu´rio nome_bd n˜o funciona quando execu-
                              a                     a
                        a                    e a                      a
     tado em outra m´quina cliente, vocˆ n˜o possui o nome da m´quina cliente listado na
     tabela user ou na tabela db.
216                                              e      e                       a
                                            Referˆncia t´cnica para o MySQL vers˜o 3.23.52



 • Se vocˆ n˜o estiver entendendo porque obtem Access denied, remova da tabela user
          e a
   todas as entradas da coluna Host que contenham meta caracteres (entradas que con-
                                           e
   tenham ‘$’ ou ‘_’). Um erro muito comum ´ inserir uma nova entrada com Host=’%’ e
                                               a                e
   User=’algum usu´rio’, pensando que isto ir´ permitir a vocˆ especificar localhost
                      a
                               a            a          a            e
   para conectar da mesma m´quina. A raz˜o disto n˜o funcionar ´ que os privil´giose
        o
   padr˜es incluem uma entrada com Host=’localhost’ e User=’’. Como esta entrada
   tem o valor ’localhost’ em Host que ´ mais espec´
                                         e                              e
                                                      ifica que ’%’, ela ´ usada no lugar
                                                                                e
   da nova entrada quando se conectar de localhost! O procedimento correto ´ inserir
   uma segunda entrada com Host=’localhost’ e User=’algum_usu´rio’, ou remover
                                                                      a
   a entrada com Host=’localhost’ e User= ’’.
 • Se vocˆ obter o seguinte erro, vocˆ pode ter um problema com a tabela db ou a tabela
         e                           e
   host:
         Access to database denied
      Se a entrada selecionada da tabela db tiver um valor vazio na coluna Host, tenha certeza
      que exista uma ou mais entradas correspondentes na tabela host especificando quais
        a                   a
      m´quinas aplicam-se ` tabela db.
              e
      Se vocˆ obter o erro quando estiver utilizando comandos SQL SELECT ... INTO
                                                                           a
      OUTFILE ou LOAD DATA INFILE, a entrada na tabela user provavelmente n˜o tem o
            e
      privil´gio file habilitado.
 • Lembre-se que programas clientes ir˜o usar parˆmetros de conex˜es especificados em
                                        a            a               o
                          ca         a
   arquivos de configura¸˜o ou vari´veis ambientais. See undefined [Environment vari-
                                                            a            a
   ables], page undefined . Se parecer que algum cliente est´ enviando parˆmetros errados
                a        e a
   para a conex˜o e vocˆ n˜o os especificou na linha de comando, verifique seu ambiente e
                                    o               e          e
   o arquivo ‘.my.cnf’ no seu diret´rio home. Vocˆ pode tamb´m conferir os arquivos de
             co                                    a                                co
   configura¸˜es do servidor MySQL, apesar de n˜o ser interessante gravar configura¸˜es
   de cliente nestes arquivos. See undefined [Option files], page undefined . Se vocˆ     e
   obter a mensagem de acesso negado (Access denied) quando estiver executando um
                  co                        e a
   cliente sem op¸˜es, tenha certeza que vocˆ n˜o especificou uma senha antiga em nenhum
                           co
   de seus arquivos de op¸˜es! See undefined [Option files], page undefined .
 • Se vocˆ fizer altera¸˜es para as tabelas de permiss˜es diretamente (utilizando uma in-
          e           co                               o
       ca                                    co
   stru¸˜o INSERT ou UPDATE) e suas altera¸˜es parecem ser ignoradas, lembre que vocˆ      e
                          ca
   deve usar uma instru¸˜o FLUSH PRIVILEGES ou executar um comando mysqladmin
   flush-privileges para o servidor ler novamente as tabelas com os privil´gios. Dee
                           co    a     a           e
   outra forma, suas altera¸˜es n˜o far˜o efeito at´ que o servidor seja reiniciado. Lembre-
   se que depois de configurar a senha de root com um comando UPDATE, n˜o ser´         a    a
          a                        e         e                   e
   necess´rio especificar a senha at´ que vocˆ atualize os privil´gios, pois o servidor ainda
    a        a        e
   n˜o saber´ que vocˆ alterou a senha!
 • Se vocˆ tiver problemas de acesso com Perl, PHP, Python ou um programa ODBC,
          e
   tente conectar ao servidor com mysql -u nome_usu´rio nome_bd ou mysql -u nome_
                                                      a
                                          e
   usu´rio -psua_senha nome_bd. Se vocˆ consegue conectar com o cliente mysql, existe
       a
                                         a                   e               a       c
   algum problema com seu programa e n˜o o acesso aos privil´gios (Note que n˜o espa¸o
                          e     e
   entre -p e a senha; vocˆ tamb´m pode utilizar a sintaxe --password=sua_senha para
                              e             ca                         a
   especificar a senha. Se vocˆ utilizar a op¸˜o -p sozinha, o MySQL ir´ lhe solicitar a
   senha.)
 • Para testar, iniciae o daemon mysqld com a op¸˜o --skip-grant-tables. Ent˜o vocˆ
                                                ca                          a     e
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                      217



                                       o
   pode alterar as tabelas de permiss˜es do MySQL e utilizar o script mysqlaccess para
                              co                a
   conferir se suas modifica¸˜es fizeram o n˜o o efeito desejado. Quando vocˆ estiver e
                              co
   satisfeito com suas altera¸˜es, execute mysqladmin flush-privileges para dizer ao
                                                                                e
   servidor mysqld para iniciar utilizando as novas tabelas com os privil´gios. Nota:
                                      o                    ca
   Recarregar as tabelas de permiss˜es sobrescreve a op¸˜o --skip-grant-tables. Isto
                                           c                                   o
   lhe permite dizer ao servidor para come¸ar a utilizar as tabelas de permiss˜es novamente
               a
   sem reinici´-lo.
 • Se tudo mais falhar, inicie o servidor mysqld com uma op¸˜o de depura¸˜o (por exem-
                                                               ca            ca
                                             a                   co       a
   plo, --debug=d,general,query). Isto ir´ imprimir informa¸˜es de m´quinas e usu´rios a
                              o           e            co
   sobre tentativas de conex˜es, e tamb´m informa¸˜es sobre cada comando disparado.
   See undefined [Making trace files], page undefined .
 • Se vocˆ tiver outros problemas com as tabelas de permiss˜es do MySQL e sente que
           e                                                     o
                                                      a                 c
   deve enviar o problema para a lista de discuss˜o, sempre forne¸a um descarga das
                      o                        e
   tabelas de permiss˜es do seu MySQL. Vocˆ pode descarregar as tabelas com o comando
   mysqldump mysql. Como sempre, envie seus problemas utilizando o script mysqlbug.
                                                                             e
   See undefined [Bug reports], page undefined . Em alguns casos vocˆ pode precisar
                                 ca
   reiniciar o mysqld com a op¸˜o --skip-grant-tables para executar o mysqldump.

                                    a
4.3 Gerenciamento das Contas dos Usu´rios no MySQL

4.3.1 A Sintaxe de GRANT e REVOKE
      GRANT tipo_priv [(column_list)] [, tipo_priv [(column_list)] ...]
          ON {nome_tabela | * | *.* | nome_bd.*}
          TO nome_usuario [IDENTIFIED BY ’password’]
              [, nome_usuario [IDENTIFIED BY ’password’] ...]
          [WITH GRANT OPTION]

       REVOKE tipo_priv [(column_list)] [, tipo_priv [(column_list)] ...]
           ON {nome_tabela | * | *.* | nome_bd.*}
           FROM nome_usuario [, nome_usuario ...]
                    e                                 a
O comando GRANT ´ implementado no MySQL vers˜o 3.22.11 ou posterior. Para vers˜es      o
                                ca          a
anteriores do MySQL, a instru¸˜o GRANT n˜o faz nada.
Os comandos GRANT e REVOKE permitem aos administradores do sistema criar usu´rios e a
                                     a                            ´           e
conceder e revogar direitos aos usu´rios do MySQL em quatro niveis de privil´gios:
N´ Global
  ivel
                  e
            Privil´gios globais aplicam para todos os bancos de dados em um determinado
                                   e     a
            servidor. Estes privil´gios s˜o armazenados na tabela mysql.user.
N´ dos bancos de dados
  ivel
                  e
            Privil´gios de bancos de dados aplicam-se a todas as tabelas em um determinado
                                            e      a
            banco de dados. Estes privil´gios s˜o armazenados nas tabelas mysql.db e
            mysql.host.
N´ das tabelas
  ivel
                  e
            Privil´gios de tabelas aplicam-se a todas as colunas em uma determinada tabela.
                        e      a
            Estes privil´gios s˜o armazenados na tabela mysql.tables_priv.
218                                               e      e                       a
                                             Referˆncia t´cnica para o MySQL vers˜o 3.23.52



N´ das colunas
 ivel
               e                                   ´
         Privil´gios de colunas aplicam-se a uma unica coluna em uma determinada
                             e      a
         tabela. Estes privil´gios s˜o armazenados na tabela mysql.columns_priv.
         e                        a           a         a                      a e
Se vocˆ fornecer uma permiss˜o para usu´rios que n˜o existem, este usu´rio ´ criado. Para
exemplos de como GRANT funciona, veja undefined [Adding users], page undefined .
                  co
Para as instru¸˜es GRANT e REVOKE, tipo_priv pode ser especificado como um dos seguintes:
        ALL PRIVILEGES             FILE                    RELOAD
        ALTER                      INDEX                   SELECT
        CREATE                     INSERT                  SHUTDOWN
        DELETE                     PROCESS                 UPDATE
        DROP                       REFERENCES              USAGE
      e          o                                                   a
ALL ´ um sinˆnimo para ALL PRIVILEGES. REFERENCES ainda n˜o foi implementado. USAGE
e                        o                      e                                    e
´ atualmente um sinˆnimo para “sem privil´gios”. Pode ser usado quando vocˆ desejar criar
          a           a
um usu´rio que n˜o tenha privil´gios. e
                         e                    a
Para anular o privil´gio grant de um usu´rio, utilize o valor tipo_priv de GRANT OPTION:
        REVOKE GRANT OPTION ON ... FROM ...;
     ´                                         e
Os unicos valores de tipo_priv que vocˆ pode especificar para uma tabela s˜o SELECT,     a
INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX e ALTER.
    ´                                       e
Os unicos valores de tipo_priv que vocˆ pode especificar para uma coluna (isto ´, quando   e
    e                a                      a
vocˆ usar uma cl´usula column_list) s˜o SELECT, INSERT e UPDATE.
     e                          e                                               e
Vocˆ pode configurar privil´gios globais utilizando a sintaxe ON *.*. Vocˆ pode configurar
       e                                                                           e
privil´gios de bancos de dados utilizando a sintaxe ON nome_bd.*. Se vocˆ especificar ON
                                                     a                        e
* e estiver com algum banco de dados aberto, ser´ configurado os privil´gios somente para
                                          e                        e a
este banco de dados. (AVISO: Se vocˆ especificar ON * e vocˆ n˜o tem possui um banco de
                    a                 e
dados aberto, ir´ afetar os privil´gios globais!).
                            o                     a           a               a
Para acomodar concess˜es de direitos para usu´rios de m´quinas arbitr´rias, o MySQL su-
                      ca
porta a especifica¸˜o do valor user_name no formato usu´rio@m´quina. Se vocˆ desejar
                                                                 a       a                 e
especificar uma string user contendo caracteres especiais (como o ‘-’), ou uma string con-
                                                                     e
tendo caracteres especiais ou meta caracteres (como o ‘%’), vocˆ pode colocar o usu´rio ou   a
                 a
o nome de m´quina entre aspas (por exemplo, ’usu´rio-teste’@’m´quina-teste’).
                                                        a                  a
     e
Vocˆ pode especificar meta caracteres no nome da m´quina.              a             Por exemplo,
user@"%.loc.gov" se aplica a user para qualquer m´quina no dom´a                 inio loc.gov, e
                                                                 a
user@"144.155.166.%" se aplica a user em qualquer m´quina na subrede de classe C
144.155.166.
                              e     o                                      e
O formato simples user ´ sinˆnimo de user@"%". NOTA: Se vocˆ permite o acesso de
    a          o                                    e         a         e
usu´rios anˆnimos ao seu servidor MySQL (que ´ o padr˜o), vocˆ deve tamb´m adicionar  e
             a
todos usu´rios locais como user@localhost porque, de outra forma, a entrada de usu´rio         a
   o                   a                                    a
anˆnimo para a m´quina local na tabela mysql.user ir´ ser usada quando o usu´rio tentar a
           a                            a                a         o        a
a conex˜o ao servidor MySQL da m´quina local! Usu´rios anˆnimos s˜o definidos inserindo
                                                       e
entradas com User=’’ na tabela mysql.user. Vocˆ pode verificar se isto se aplica a vocˆ           e
executando esta instru¸˜o: ca
        mysql> SELECT Host,User FROM mysql.user WHERE User=’’;
                                                    a
No momento, GRANT suporta somente nomes de m´quinas, tabelas bancos de dados e colunas
  e                                     a              e
at´ 60 caracteres. Um nome de usu´rio pode ter at´ 16 caracteres.
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                        219



         e                                 a                 e          o            e
Os privil´gios para uma tabela ou coluna s˜o formados atrav´s do OU l´gico dos privil´gios
                        ´             e
em cada um dos quatro niveis de privil´gios. Por exemplo, se a tabela mysql.user especifica
            a                 e                       a
que um usu´rio tem um privil´gio global select, isto n˜o pode ser negado por uma entrada
no n´ de banco de dados, tabela ou coluna.
    ivel
         e
Os privil´gios para uma coluna podem ser calculados da seguinte forma:
              e
       privil´gios globais
                   e                                       e
       OR (privil´gios de banco de dados AND privil´gios de m´quina) a
                  e
       OR privil´gios de tabela
                  e
       OR privil´gios de coluna
                                                         idos em apenas um dos n´
Na maioria dos casos, os direitos a um usu´rio s˜o atribu´
                                          a     a                               iveis de
      e                                   a e a
privil´gios, portanto a vida normalmente n˜o ´ t˜o complicada como mostrado acima. Os
detalhes do procedimento de verifica¸˜o dos privil´gios s˜o apresentados em undefined
                                     ca            e      a
[Privilege system], page undefined .
      e               e                       ca       a        a             a
Se vocˆ concede privil´gios para uma combina¸˜o de usu´rio e m´quina que n˜o existem
                                   e                         a e
na tabela mysql.user, um registro ´ adicionado e permanece l´ at´ ser removido com um
comando DELETE. Em outras palavras, GRANT pode criar registros na tabela user, mas
REVOKE n˜o as remover´; para removˆ-las vocˆ deve usar a instru¸˜o expl´
         a             a            e       e                  ca      icita DELETE.
         a                                                   a   e                 e
Na Vers˜o 3.22.12 ou posterior do MySQL, se um novo usu´rio ´ criado ou se vocˆ possui
      e               a                         a       a                            a
privil´gios de concess˜o globais, a senha do usu´rio ser´ especificada utilizando a cl´usula
                                           a   a                       e
IDENTIFIED BY, se uma for dada. Se o usu´rio j´ possui uma senha, ela ´ trocada pela nova.
                   e                  a          a              a
CUIDADO: Se vocˆ criar um novo usu´rio mas n˜o especificar uma cl´usula IDENTIFIED
         a     a         a                  a e
BY, o usu´rio n˜o possuir´ uma senha. Isto n˜o ´ seguro.
                   e
Senhas podem tamb´m ser configuradas com o comando SET PASSWORD. See undefined
[SET OPTION], page undefined .
      e                e
Se vocˆ conceder privil´gios para um banco de dados, uma entrada na tabela mysql.db ´ e
                a                           e
criada se necess´rio. Quando todos os privil´gios para o banco de dados forem removidos
                          e
com REVOKE, este registro ´ removido.
           a     a            e                            a e                       a
Se um usu´rio n˜o tem privil´gios em uma tabela, a tabela n˜o ´ mostrada quando o usu´rio
                                           ca
solicita uma lista de tabelas (com a instru¸˜o SHOW TABLES por exemplo).
    a                             a        a                          a          a
A cl´usula WITH GRANT OPTION d´ ao usu´rio habilidade de fornecer ` outros usu´rios quais-
quer privil´gios que ele tenha em um n´ espec´
           e                              ivel                   e        e
                                                   ifico de privil´gio. Vocˆ deve ter cuidado
                    e                          a                                 e
ao fornecer o privil´gio grant, pois dois usu´rios podem se unir para unir privil´gios!
    e a                                a             e          a                  e
Vocˆ n˜o pode conceder a outro usu´rio um privil´gio que n˜o possua; o privil´gio grant
                                      e
possibilita fornecer somente os privil´gios que possuir.
Esteja ciente que quando conceder a um usu´rio o privil´gio grant em um n´ particular de
                                              a          e                  ivel
      e                     e             a      a
privil´gios, qualquer privil´gio que o usu´rio j´ possua (ou seja fornecido no futuro!) nesse
n´ tamb´m pode ser concedido por este usu´rio. Suponha que vocˆ conceda a um usu´rio
 ivel       e                                   a                     e                  a
        e                                          e                  e
o privil´gio insert em um banco de dados. Se vocˆ conceder o privil´gio select no banco de
                                                a    e                             e
dados e especificar WITH GRANT OPTION, o usu´rio al´m de poder repassar o privil´gio select
      a       e                             e                 e
poder´ tamb´m repassar o insert. Se vocˆ concede o privil´gio update para o usu´rio noa
                       a          a                   e
banco de dados, o usu´rio poder´ conceder os privil´gios insert, select e update.
   e a                       e                   a                 e                 a
Vocˆ n˜o deve conceder privil´gios alter a um usu´rio comum. Se vocˆ fizer isto, o usu´rio
                                       e
pode tentar enganar o sistema de privil´gios renomeando tabelas!
220                                              e      e                       a
                                            Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                       e                        e
Perceba que se vocˆ estiver utilizando privil´gios de tabelas ou colunas, mesmo que para
                  a                                  e
apenas um usu´rio, o servidor examina os privil´gios de tabelas e colunas para todos os
    a               a
usu´rios e isto ir´ deixar o MySQL um pouco mais lento.
                                            e    a                 o        e
Quando o mysqld inicia, todos os privil´gios s˜o lidos na mem´ria. Privil´gios de bancos de
dados, tabelas e colunas s˜o iniciados um vez, e privil´gios ao n´ de usu´rio fazem efeito na
                              a                         e          ivel    a
  o                       a                     co                         o           e
pr´xima vez que o usu´rio conectar. Modifica¸˜es nas tabelas de permiss˜es que vocˆ realiza
                                 a                                                   e
utilizando GRANT ou REVOKE s˜o percebidas pelo servidor imediatamente. Se vocˆ modificar
                         o                                                       e
as tabelas de permiss˜es manualmente (utilizando INSERT, UPDATE, etc), vocˆ deve executar
             ca
uma instru¸˜o FLUSH PRIVILEGES ou executar mysqladmin flush-privileges para dizer
                                                     o
ao servidor para recarregar as tabelas de permiss˜es. See undefined [Privilege changes],
page undefined .
                      c                            o
As maiores diferen¸as entre o ANSI SQL e vers˜es MySQL de GRANT s˜o:      a
  • No MySQL privil´gios s˜o fornecidos para uma combina¸˜o de usu´rio e m´quina e
                           e     a                                  ca       a         a
       a
     n˜o somente para um usu´rio.  a
  • O ANSI SQL n˜o possui privil´gios no n´
                         a               e         ivel global ou de bancos de dados, e n˜o  a
                                       e                                           a
     suporta todos os tipos de privil´gios que o MySQL suporta. O MySQL n˜o suporta os
           e
     privil´gios TRIGGER, EXECUTE ou UNDER do ANSI SQL.
  • Os privil´gios do ANSI SQL s˜o estruturadados em uma maneira hier´rquica. Se vocˆ
               e                     a                                         a               e
                         a                    e           a      a
     remover um usu´rio, todos os privil´gios do usu´rio s˜o removidos. No MySQL os
           e                    a a                                          e
     privil´gios concedidos n˜o s˜o removidos automaticamente, mas vocˆ deve removˆ-los    e
                a
     se necess´rio.
  • Se no MySQL vocˆ possuir o privil´gio INSERT em somente parte das colunas em uma
                           e                e
                  e                        co
     tabela, vocˆ pode executar instru¸˜es INSERT na tabela; As colunas em que vocˆ n˜o   e a
                   e               a                           o
     tem o privil´gio INSERT ir˜o receber seus valores padr˜es. O SQL ANSI necessita que
         e                  e
     vocˆ tenha o privil´gio INSERT em todas as colunas.
  • Quando vocˆ remove uma tabela no ANSI SQL, todos os privil´gios para a tabela s˜o
                    e                                                   e                    a
                           e                  e                                 e
     removidos. Se vocˆ remover um privil´gio no SQL ANSI, todos os privil´gios que foram
                                       e      a      e
     concedidos baseado neste privil´gio s˜o tamb´m removidos. No MySQL, privil´gios s´ e     o
     podem ser removidos com comandos REVOKE expl´        icitos ou manipulando as tabelas de
              o
     permiss˜es do MySQL.

                  a
4.3.2 Nomes de Usu´rios e Senhas do MySQL
           a          c                                   a               a
Existem v´rias diferen¸as entre a forma que nomes de usu´rios e senhas s˜o usados pelo
                        a
MySQL e a forma que s˜o usados pelo Unix ou Windows:
 • Nomes de usu´rios, como usado pelo MySQL para prop´sitos de autentica¸˜o, n˜o tem
                   a                                      o                 ca    a
                   ca                       a
    nenhuma rela¸˜o com os nomes de usu´rios do Unix (nomes de login) ou nomes de
        a                                                        a
    usu´rios Windows. A maioria dos clientes MySQL, por padr˜o, tentam se conectar
                              a                                     a
    utilizando o nome de usu´rio atual do Unix como o nome de usu´rio no MySQL, mas
                                   e
    isto existe somente por conveniˆncia. Programas clientes permite especificar um nome
                         co                                       e a
    diferente com as op¸˜es -u ou --user. Isto significa que vocˆ n˜o pode tornar um
                                                       a
    banco de dados seguro a menos que todos os usu´rios do MySQL possuam senhas.
    Qualquer um pode tentar se conectar ao servidor utilizando qualquer nome, e eles se
             a                           a
    conectar˜o com qualquer nome que n˜o possua uma senha.
 • Nomes de usu´rios MySQL podem ter o tamanho de at´ 16 caracteres; Nomes de
                    a                                         e
        a                       a              e
    usu´rio Unix normalmente s˜o limitados at´ 8 caracteres.
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                       221



 • Senhas MySQL n˜o tem nenhuma rela¸˜o com senhas Unix. N˜o existe nenhuma
                      a                    ca                         a
          ca                            e                                a
   associa¸˜o entre a senha em que vocˆ utiliza para logar-se a uma m´quina Unix e a
             e                                                         a
   senha que ´ utilizada para acessar um banco de dados na mesma m´quina.
 • O MySQL criptografa senhas utilizando um algor´   itimo diferente que o utilizado pelo
                                              co          co
   processo de login do Unix. Veja as descri¸˜es das fun¸˜es PASSWORD() e ENCRYPT()
   em undefined [Miscellaneous functions], page undefined . Perceba que mesmo que
           e
   a senha ´ armazenada ’embaralhada’, o conhecimento da sua senha ’embaralhada’ ´ o  e
   suficiente para conseguir se conectar ao servidor MySQL!
    a                         e      a
Usu´rios MySQL e seus privil´gios s˜o criados normalmente com o comando GRANT, See
 undefined [GRANT], page undefined .
            e
Quando vocˆ se conecta a um servidor MySQL com um cliente de linha de comando
   e
vocˆ pode especificar a senha com --password=sua-senha. See undefined [Connecting],
page undefined .
      mysql --user=monty --password=guess nome_do_banco
       e                                                                      a
Se vocˆ deseja que o cliente lhe solicite a senha, deve ser especificado o parˆmetro --
password sem nenhum argumento
      mysql --user=monty --password nome_do_banco
ou no formato curto:
      mysql -u monty -p nome_do_banco
                ´                        a e
Perceba que no ultimo exemplo a senha n˜o ´ ’nome do banco’.
       e                ca                                  e
Se vocˆ deseja usar a op¸˜o -p para fornecer uma senha vocˆ deve fazer assim:
      mysql -u monty -pguess nome_do_banco
                                                e
Em alguns sistemas, a chamada da biblioteca que ´ utilizada pelo MySQL para solicitar por
uma senha corta automaticamente a senha para 8 caracteres. Internamente o MySQL n˜o    a
limita o tamanho limite da senha.

                      co             e
4.3.3 Quando as Altera¸˜es nos Privil´gios tem Efeito
                                        u                         o   a
Quando o mysqld inicia, todas o conte´do das tabelas de permiss˜es s˜o lidos em mem´riao
e tem efeito neste momento.
             co                           o         e
As modifica¸˜es das tabelas de permiss˜es que vocˆ realiza utilizando GRANT, REVOKE ou
                 a
SET PASSWORD s˜o imediatamente reconhecidas pelo servidor.
       e                             o
Se vocˆ alterar as tabelas de permiss˜es manualmente (utilizando INSERT, UPDATE, etc), vocˆe
                        ca
deve executar a instru¸˜o FLUSH PRIVILEGES ou executar mysqladmin flush-privileges
                                                                                   o
ou mysqladmin reload para dizer ao servidor para recarregar as tabelas de permiss˜es. De
                          co     a    a          e
outra forma suas altera¸˜es n˜o ter˜o efeito at´ que o servidor seja reiniciado. Se vocˆ   e
                               o                                                     e
alterar as tabelas de permiss˜es manualmente mas se esquecer de recarregar os privil´gios,
            ca a              a                          c
suas altera¸˜o v˜o parecer n˜o ter feito nenhuma diferen¸a!
                                                        o                         o
Quando o servidor reconhecer que as tabelas de permiss˜es foram alteradas, conex˜es exis-
         a
tentes s˜o afetadas da seguinte forma:
  • Altera¸˜es nos privil´gios de tabelas e colunas fazem efeito com a pr´xima requisi¸˜o
            co             e                                              o             ca
     do cliente.
  • Altera¸˜es nos privil´gios de bancos de dados fazem efeito no pr´ximo comando USE
            co             e                                          o
     nome_bd.
222                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



       co            e                     co                               o
Altera¸˜es nos privil´gios globais e altera¸˜es de senhas fazem efeito na pr´xima vez que o
cliente conectar.

                           e
4.3.4 Configurando os Privil´gios Iniciais do MySQL
                                   e                    e
Depois de instalar o MySQL, vocˆ configura os privil´gios iniciais dos acessos executando
scripts/mysql_install_db. See undefined [Quick install], page undefined . O script
                                                                                  o
mysql_install_db inicia o servidor mysqld, depois inicializa as tabelas de permiss˜es com
                       ca         e
a seguinte configura¸˜o dos privil´gios:
  • O usu´rio root do MySQL ´ criado como um superusu´rio que pode fazer qualquer
            a                     e                          a
                   o                        e       a
     coisa. Conex˜es devem ser feitas atrav´s da m´quina local.
                                     e
     NOTA: A senha inicial de root ´ vazia, portanto qualquer um que conectar como root
                     a                       e
     sem senha ter´ direito a todos os privil´gios.
  • Um usu´rio anˆnimo ´ criado e pode fazer o que desejar com bancos de dados com
              a        o      e
                                                      o                      a
     nome ’test’ ou iniciando com ’test_’. Conex˜es devem ser feitas da m´quina local.
                            a
     Isto significa que usu´rios locais podem se conectar sem senha e serem tratados como
         a       o
     usu´rios anˆnimos.
  • Outros privil´gios s˜o negados. Por exemplo, usu´rios normais n˜o podem executar
                   e      a                               a            a
     mysqladmin ou mysqladmin processlist.
                  e          o    a
NOTA: Os privil´gios padr˜es s˜o diferentes no Windows. See undefined [Windows run-
ning], page undefined .
                ca                 e
Como sua insta¸˜o inicialmente ´ parcialmente aberta, uma das primeiras coisas que vocˆ   e
           e                                   a                           e
deve fazer ´ especificar uma senha para o usu´rio root do MySQL. Vocˆ pode fazer isto
                                                                     ca
como a seguir (perceba que a senha foi especificada utilizando a fun¸˜o PASSWORD()):
       shell> mysql -u root mysql
       mysql> UPDATE user SET Password=PASSWORD(’nova_senha’)
                    WHERE user=’root’;
       mysql> FLUSH PRIVILEGES;
    e                o                                                ca
Vocˆ pode, nas vers˜es 3.22 e superiores do MySQL, utilizar a instru¸˜o SET PASSWORD:
       shell> mysql -u root mysql
       mysql> SET PASSWORD FOR root=PASSWORD(’nova_senha’);
                                     e
Outra forma de configurar a senha ´ utilizando o comando mysqladmin:
       shell> mysqladmin -u root password nova_senha
              a                                    ca
Somente usu´rios com acesso de escrita/atualiza¸˜o ao banco de dados mysql podem
                                   a                    a                 a
alterar a senha de outros usu´rios. Todos os usu´rios comuns (n˜o os anˆnimos)     o
                                o
podem alterar somente a pr´pria senha com um dos comandos acima ou com SET
PASSWORD=PASSWORD(’nova_senha’).
                    e
Perceba que se vocˆ atualizar a senha na tabela user diretamente utilizando o primeiro
  e           e                                                            o
m´todo, vocˆ deve dizer ao servidor para reler as tabelas de permiss˜es (com FLUSH
                                       ca a
PRIVILEGES), de outra forma a altera¸˜o n˜o seria notificada.
                                                 e
Uma vez que a senha de root foi configurada, vocˆ deve informar a senha quando se conectar
ao servidor MySQL como root.
    e                                                             e a                  a
Vocˆ pode desejar deixar a senha de root em branco para que vocˆ n˜o precise especific´-la
                          co                                                           a
quando realizar configura¸˜es adicionais ou testes. Entretanto, tenha certeza de configur´-la
                             ca                                   ca
antes de utilizar sua instala¸˜o para qualquer ambiente de produ¸˜o.
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                      223



                                                            a
Veja o script scripts/mysql_install_db para ver como s˜o configurados os privil´giose
    o        e                                                                  a
padr˜es. Vocˆ pode usar isto como uma base para ver como adicionar outros usu´rios.
Se vocˆ deseja que os privil´gios iniciais sejam diferentes do descrito acima, ´ poss´
      e                     e                                                  e     ivel
                                                     a
modificar o script mysql_install_db antes de execut´-lo.
                                  o
Para recriar as tabelas de permiss˜es completamente, remova todos os arquivos ‘.frm’ ‘.MYI’
                 o                                           e        o
e ‘.MYD’ no diret´rio contendo o banco de dados mysql. (Este ´ o diret´rio chamado ‘mysql’
            o                             e                    e
sob o diret´rio do banco de dados, que ´ listado quando vocˆ executa mysqld --help.)
                                                                          a
Depois execute o script mysql_install_db, possivelmente depois de edit´-lo para criar os
      e          a
privil´gios desej´veis.
                 o                                      a              e a
NOTA: Para vers˜es do MySQL mais antigas que a vers˜o 3.22.10, vocˆ n˜o deve apagar
                          e                               e         a
os arquivos ‘.frm’. Se vocˆ fizer isso acidentalmente, vocˆ deve volt´-los a partir de sua
         ca
distribui¸˜o MySQL antes de executar mysql_install_db.

                           a
4.3.5 Adicionando Novos Usu´rios ao MySQL
                                        a                      co
Existem duas maneiras de adicionar usu´rios: utilizando instru¸˜es GRANT ou manipulando
                      o                               e               e             co
as tabelas de permiss˜es do MySQL diretamente. O m´todo preferido ´ utilizar instru¸˜es
GRANT, porque elas s˜o mais concisas e menos propensas a erros. See undefined [GRANT],
                    a
page undefined .
          a
Existem v´rios programas de colaboradores como o phpmyadmin que pode ser utilizado para
                       a
criar e administrar usu´rios. See undefined [Contrib], page undefined .
Os exemplos abaixo mostram como usar o cliente mysql para configurar novos usu´rios.   a
                                    e    a                                      o
Estes exemplos assumem que privil´gios s˜o configurados de acordo com os padr˜es descritos
     ca                                               co       e
na se¸˜o anterior. Isto significa que para fazer altera¸˜es, vocˆ deve se conectar na mesma
  a                            a                  e                             a
m´quina em que o mysqld est´ executando, vocˆ deve se conectar com o usu´rio root, e
     a                            e
o usu´rio root deve ter os privil´gios inster ao banco de dados mysql e o administrativo
             e           e                        a              e              a
reload. Tamb´m, se vocˆ alterou a senha do usu´rio root, vocˆ deve especific´-la para os
comandos mysql abaixo.
   e                         a                      co
Vocˆ pode adicionar novos usu´rios utilizando instru¸˜es GRANT:
        shell> mysql --user=root mysql
        mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
                   IDENTIFIED BY ’alguma_senha’ WITH GRANT OPTION;
        mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
                   IDENTIFIED BY ’alguma_senha’ WITH GRANT OPTION;
        mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
        mysql> GRANT USAGE ON *.* TO dummy@localhost;
            co                     e           a
Estas instru¸˜es GRANT configuram trˆs novos usu´rios:
monty                     a
             Um superusu´rio completo que pode conectar ao servidor de qualquer lugar,
             mas deve utilizar uma senha ’alguma_senha’ para fazer isto. Perceba que
                                    co
             devemos utilizar instru¸˜es GRANT para monty@localhost e monty@"%". Se n´s o
              a                                                              a      o
             n˜o adicionarmos a entrada com localhost, a entrada para o usu´rio anˆnimo
                                   e                                 a
             para localhost que ´ criada por mysql_install_db ir´ tomar precedˆncia  e
                                            a
             quando nos conectarmos da m´quina local, porque ele contem um campo Host
             com um valor mais espec´            e                     ca
                                      ifico e tamb´m vem antes na ordena¸˜o da tabela user.
224                                          e      e                       a
                                        Referˆncia t´cnica para o MySQL vers˜o 3.23.52



admin               a
           Um usu´rio que possa conectar de localhost sem uma senha e que ´         e
                               e
           concedido os privil´gios administrativos reload e process. Isto permite ao
               a            ca
           usu´rio a execu¸˜o dos comandos mysqladmin reload, mysqladmin refresh
           e mysqladmin flush-*, bem como o mysqladmin processlist. Nenhum
                 e                                     e
           privil´gio relacionado aos bancos de dados ´ concedido. (Depois eles podem
                                            co
           ser adicionados utilizando instru¸˜es GRANT adicionais.)
dummy              a                                                         a
           Um usu´rio que pode conectar sem uma senha, mas somente na m´quina local.
                    e               a                                                e
           Os privil´gios globais s˜o todos configurados para ’N’ --- o tipo de privil´gio
                                 ca             a            e
           USAGE permite a cria¸˜o de um usu´rio sem privil´gios. Considera-se que vocˆ e
             a                e          ´
           ir´ conceder privil´gios especificos de bancos de dados mais tarde.

Tamb´m ´ poss´
       e e                                         ca                 a
                 ivel adicionar a mesma informa¸˜o de acesso do usu´rio diretamente, uti-
               co
lizando instru¸˜es INSERT e depois dizendo ao servidor para recarregar as tabelas de per-
     o
miss˜es:
       shell> mysql --user=root mysql
       mysql> INSERT INTO user VALUES(’localhost’,’monty’,PASSWORD(’alguma_senha’),
                            ’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’);
       mysql> INSERT INTO user VALUES(’%’,’monty’,PASSWORD(’alguma_senha’),
                            ’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’);
       mysql> INSERT INTO user SET Host=’localhost’,User=’admin’,
                             Reload_priv=’Y’, Process_priv=’Y’;
       mysql> INSERT INTO user (Host,User,Password)
                                    VALUES(’localhost’,’dummy’,’’);
       mysql> FLUSH PRIVILEGES;
                          a                   e                           u
Dependendo da sua vers˜o do MySQL, vocˆ pode precisar utilizar um n´mero diferente de
                          o             a       a                                     e
valores ’Y’ acima (vers˜es anteriores ` vers˜o 3.22.11 tem menos campos de privil´gios).
Para o usu´rio admin, a maior sintaxe leg´
            a                                 ivel de INSERT que est´ dispon´
                                                                    a       ivel a partir da
    a           e
vers˜o 3.22.11 ´ a utilizada.
                                         a          e o
Note que para configurar um superusu´rio, vocˆ s´ precisar criar uma entrada na tabela
                                e                             a e         a
user com os campos de privil´gios configurados para ’Y’. N˜o ´ necess´rio gerar entradas
nas tabelas db ou host.
                      e                       a                                   ´
Os campos de privil´gios na tabela user n˜o foram exibidas explicitamente na ultima in-
    ca                        a                                 a        ´
stru¸˜o INSERT (para o usu´rio dummy), logo a estes campos s˜o atribuidos o valor padr˜o  a
          e
’N’. Isto ´ a mesma coisa que o GRANT USAGE faz.
                                           a
O seguinte exemplo adiciona um usu´rio custom que pode conectar das m´quinas        a
localhost, server.domain e whitehouse.gov, Ele deseja acessar o banco de
dados bankaccout somente de localhost, o banco de dados expenses somente de
                                                                  e   a
whitehouse.gov e o banco de dados customer de todas as trˆs m´quinas. Ele tamb´m         e
                                      e     a
deseja utilizar a senha stupid das trˆs m´quinas.
                           e              a                    co
Para configurar os privil´gios deste usu´rio utilizando instru¸˜es GRANT, execute estes co-
mandos:
       shell> mysql --user=root mysql
       mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
                     ON bankaccount.*
                     TO custom@localhost
                     IDENTIFIED BY ’stupid’;
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                     225



     mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
                ON expenses.*
                TO custom@whitehouse.gov
                IDENTIFIED BY ’stupid’;
     mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
                ON customer.*
                TO custom@’%’
                IDENTIFIED BY ’stupid’;
      a            o a                    e               a             e
A raz˜o para que n´s n˜o concedamos privil´gios para o usu´rio ’custom’ ´ que desejamos
               a                                   a
fornecer ao usu´rio acesso ao MySQL a partir da m´quina local com sockets Unix e da
  a
m´quina remota ’whitehouse.gov’ com TCP/IP.
                        e           a                                     o
Para configurar os privil´gios do usu´rio modificiando as tabelas de permiss˜es diretamente,
utilize estes comandos (perceba o FLUSH PRIVILEGES no final):
       shell> mysql --user=root mysql
       mysql> INSERT INTO user (Host,User,Password)
                VALUES(’localhost’,’custom’,PASSWORD(’stupid’));
       mysql> INSERT INTO user (Host,User,Password)
                VALUES(’server.domain’,’custom’,PASSWORD(’stupid’));
       mysql> INSERT INTO user (Host,User,Password)
                VALUES(’whitehouse.gov’,’custom’,PASSWORD(’stupid’));
       mysql> INSERT INTO db
                (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
                 Create_priv,Drop_priv)
                VALUES
                (’localhost’,’bankaccount’,’custom’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’);
       mysql> INSERT INTO db
                (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
                 Create_priv,Drop_priv)
                VALUES
                (’whitehouse.gov’,’expenses’,’custom’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’);
       mysql> INSERT INTO db
                (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
                 Create_priv,Drop_priv)
                VALUES(’%’,’customer’,’custom’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’);
       mysql> FLUSH PRIVILEGES;
                e        co
As primeiras trˆs instru¸˜es INSERT adicionam entradas na tabela user que permite ao
    a                                 a       a
usu´rio custom conectar a partir de v´rias m´quinas com a senha determinada, mas n˜o a
                 o                           e     a                              a
concede permiss˜es ao mesmo (todos os privil´gios s˜o configurados com o valor padr˜o de
             o        e       co
’N’). As pr´ximas trˆs instru¸˜es INSERT adicionam entradas na tabela db que concedem
      e     a
privil´gios ` custom para os bancos de dados bankaccount, expenses e customer, mas s´ o
                   a             a
quando acessados ` partir das m´quinas apropriadas. Normalmente, quando as tabelas de
          o   a                                                                    a
permiss˜es s˜o modificadas diretamente, o servidor deve ser informado para recarreg´-las
                                            co           e
(com FLUSH PRIVILEGES) para que as altera¸˜es nos privil´gios tenham efeito.
Se vocˆ deseja fornecer a um usu´rio espec´
        e                        a                                 a
                                          ifico acesso de qualquer m´quina em um deter-
              ´      e                         ca
minado dominio, vocˆ pode utilizar uma instru¸˜o GRANT como a seguir:
       mysql> GRANT ...
                    ON *.*
226                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                   TO meunomedeusuario@"%.meudominio.com"
                   IDENTIFIED BY ’minhasenha’;
                                                                        o      c
Para realizar a mesma coisa modificando diretamente as tabelas de permiss˜es, fa¸a isto:
      mysql> INSERT INTO user VALUES (’%.meudominio, ’meunomedeusuario’
                   PASSWORD(’minhasenha’),...);
      mysql> FLUSH PRIVILEGES;
    e            e
Vocˆ pode tamb´m utilizar xmysqladmin, mysql_webadmin e mesmo xmysql para inserir,
                                                  o       e                            a
alterar e atualizar valores nas tabelas de permiss˜es. Vocˆ pode encontrar estes utilit´rios
          o
em Diret´rio de Colaboradores do Website do MySQL.

4.3.6 Configurando Senhas
                          e                                             a
Na maioria dos casos vocˆ deve utilizar GRANT para configurar seus usu´rios e senhas, por-
                 co                      a                             a         c
tanto, as informa¸˜es exibidas a seguir s˜o aplicadas somentes para usu´rios avan¸ados. See
 undefined [GRANT], page undefined .
Os exemplos nas se¸˜es precedentes ilustram um princ´
                    co                                                                e
                                                         ipio importante: quando vocˆ ar-
                      a                                            e
mazena uma senha n˜o-vazia utilizando INSERT ou UPDATE vocˆ deve utilizar a fun¸˜o      ca
                            a           e
PASSWORD() para criptograf´-la. Isto ´ porque a tabela user armazena senhas na forma
                  a                              e                     e      a
criptografada, e n˜o como texto puro. Se vocˆ esquecer deste fato, ´ prov´vel que vocˆ     e
possa tentar configurar senhas desta forma:
      shell> mysql -u root mysql
      mysql> INSERT INTO user (Host,User,Password)
               VALUES(’%’,’jeffrey’,’biscuit’);
      mysql> FLUSH PRIVILEGES;
             e                       e
O resultado ´ que o valor ’biscuit’ ´ armazenado como a senha na tabela user. Quando
      a
o usu´rio jeffrey tentar se conectar ao servidor utilizando esta senha, o cliente mysql a
                            ca                                            ca
criptografa utilizando a fun¸˜o PASSWORD(), gerando um vetor de autentica¸˜o baseado em
                                 u          o
uma senha criptografada e um n´mero randˆmico, obtido do servidor, e envia o resultado
                                                                                 e
ao servidor. O servidor usa o valor do campo password na tabela user (que ´ o valor
             a                                           a
’biscuit’ n˜o criptografado ) para realizar os mesmos c´lculos e comparar os resultados.
           ca                                  a
A compara¸˜o falha e o servidor rejeita a conex˜o:
       shell> mysql -u jeffrey -pbiscuit test
       Access denied
                                                 a
As senhas devem ser criptografadas quando elas s˜o inseridas na tabela user, portanto a
      ca
instru¸˜o INSERT deveria ter sido informada no seguinte formato:
      mysql> INSERT INTO user (Host,User,Password)
              VALUES(’%’,’jeffrey’,PASSWORD(’biscuit’));
   e          e                ca                                   co
Vocˆ deve tamb´m utilizar a fun¸˜o PASSWORD() quando utilizar instru¸˜es SET PASSWORD:
     mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD(’biscuit’);
       e                                     ca
Se vocˆ configurar senhas utilizando a instru¸˜o GRANT ... IDENTIFIED BY ou o comando
                             ca               e          a
mysqladmin password, a fun¸˜o PASSWORD() ´ desnecess´ria. Ambos tomam o cuidado de
                             e     a     e
criptografar a senha para vocˆ, ent˜o vocˆ deve especificar a senha ’biscuit’ desta forma:
      mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY ’biscuit’;
ou
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                        227



     shell> mysqladmin -u jeffrey password biscuit
                     a
NOTA: PASSWORD() n˜o realiza criptografia de senhas da mesma forma em que as senhas do
      a                     e a                                                    a
Unix s˜o criptografadas. Vocˆ n˜o deve assumir que se sua senha Unix e a do MySQL s˜o
                                        a
as mesmas, o resultado de PASSWORD() ir´ resultar no mesmo valor criptografado como o
armazenado no arquivo de senhas do Unix. See undefined [User names], page undefined .

4.3.7 Mantendo Sua Senha Segura
  a e          a
N˜o ´ aconselh´vel especificar uma senha de uma forma que a exponha e possa ser descoberta
               a            e                e
por outros usu´rios. Os m´todos que vocˆ pode usar para especificar sua senha quando
                              a                                                 co
executar programas clientes s˜o listados abaixo, juntamente com as determina¸˜es de riscos
          e
de cada m´todo:
  • Nunca forne¸a a um usu´rio normal acesso ` tabela mysql.user. O conhecimento de
                  c           a                    a
                                                   a                 a               o
    uma senha criptografada possibilita a conex˜o como este usu´rio. As senhas s´ est˜o   a
    embaralhadas para que n˜o seja poss´ chegar ` senha real que foi usada (acontece
                               a            ivel          a
                    ca                                         co
    muito a utiliza¸˜o de senhas similares em outras aplica¸˜es).
  • Uso da op¸˜o -psua_senha ou --password=sua_senha na linha de comando. Isto ´
               ca                                                                           e
    conveniente mas inseguro, porque sua senha se torna vis´      ivel para programas de in-
          ca
    forma¸˜o do sistema (como no ps) que pode ser chamado por outros usu´rios para a
    exibir linhas de comando. (clientes MySQL normalmente gravam zeros em cima do ar-
                                                       e                 ca
    gumento da linha de comando durante sua sequˆncia de inicializa¸˜o, mas ainda existe
    um breve intervalo no qual o valor est´ vis´
                                             a   ivel.)
  • Uso das op¸˜es -p ou --pasword (sem especificar o valor sua_senha). Neste caso, o
                 co
    programa cliente solicita a senha do terminal:
           shell> mysql -u user_name -p
           Enter password: ********
    Os caracteres ‘*’ representam sua senha.
     ´                                                              a
    E mais seguro digitar sua senha desta forma do que especific´-la na linha de comando
                  a        ´ a outros usu´rios. Entretanto este m´todo de digitar uma
    porque ela n˜o fica visivel                 a                        e
           e a                                          e
    senha ´ v´lido somente para programas que vocˆ executa de forma interativa. Se vocˆ     e
                                                     a                             a
    deseja chamar um cliente de um script que n˜o execute interativamente, n˜o existir´     a
                                                                             e
    oportunidade de digitar a senha do terminal. Em alguns sistemas, vocˆ pode descobrir
                                          e
    que a primeira linha do seu script ´ lida e interpretada (incorretamente) como sua
    senha!
  • Armazenar a sua senha em um arquivo de configura¸˜o. Por exemplo, vocˆ pode listar
                                                            ca                   e
                     ca                                                o
    sua senha na se¸˜o [client] do arquivo ‘.my.cnf’ no seu diret´rio home:
           [client]
           password=sua_senha
           e                                                               a
    Se vocˆ armazenar sua senha em um arquivo ‘.my.cnf’, o arquivo n˜o pode ser lido por
                                   a
    seu grupo ou pelos outros usu´rios. Tenha certeza que o modo de acesso do arquivo ´     e
    400 ou 600 See undefined [Option files], page undefined .
  • Vocˆ pode armazenar sua senha na vari´vel de ambiente MYSQL_PWD, mas este m´todo
        e                                      a                                       e
                                                          a
    deve ser considerado extremamente inseguro e n˜o deve ser usado. Algumas vers˜es     o
                           ca                                                  ca
    de ps incluem uma op¸˜o para exibir o ambiente de processos em execu¸˜o; sua senha
                                                               a
    estaria em texto puro para a leitura para todos os usu´rios. Mesmo em sistemas sem
228                                             e      e                       a
                                           Referˆncia t´cnica para o MySQL vers˜o 3.23.52



               a                     e                  a                e
      esta vers˜o do ps, seria imprudˆncia assumir que n˜o existe outro m´todo para observar
      o ambiente de processos. See undefined [Environment variables], page undefined .
                 e
Em resumo, os m´todos mais seguros seriam que o programa cliente solicitasse a senha ou
especificar a senha em um arquivo ‘.my.cnf’ corretamente protegido.

          ca                         ca
4.4 Preven¸˜o de Disastres e Recupera¸˜o

4.4.1 Backups dos Bancos de Dados
                                   a                                 e         a
Como as tabelas do MySQL s˜o armazenadas como arquivos, ´ mais f´cil realizar um
                                                   c
backup. Para obter um backup consistente, fa¸a um LOCK TABLES nas tabelas relevantes
seguido por FLUSH TABLES para as tabelas. See undefined [LOCK TABLES], page unde-
                                                             e o
fined . See undefined [FLUSH], page undefined . Vocˆ s´ precisa de um bloqueio de
leitura; isto possibilita outras threads a continuarem a pesquisar nas tabelas enquanto vocˆ e
                            o                                        e       a
copia os arquivos no diret´rio do banco de dados. O FLUSH TABLE ´ necess´rio para garantir
que todas as p´ginas ativas de ´
                a                            a
                                  indices ser˜o escritas em disco antes de iniciar o backup.
       e                                     ´
Se vocˆ desejar realizar um backup ao nivel da linguagem SQL de um tabela, vocˆ pode    e
utilizar SELECT INTO OUTFILE ou BACKUP TABLE. See undefined [SELECT], page unde-
fined .See undefined [BACKUP TABLE], page undefined .
                                                               e
Outra maneira de efetuar um backup de um banco de dados ´ utilizar o programa mysqldump
ou o script mysqlhotcopy. See undefined [mysqldump], page undefined . See unde-
fined [mysqlhotcopy], page undefined .
  1. Fazer um backup completo dos bancos de dados:
            shell> mysqldump --tab=/caminho/para/algum/dir --opt --full

            ou

          shell> mysqlhotcopy database /caminho/para/algum/dir
        e      e
    Vocˆ tamb´m pode simplesmente copiar os arquivos das tabelas (‘*.frm’, ‘*.MYD’)
                                                a
    e os arquivos ‘*.MYI’) quando o servidor n˜o estiver atualizando nada. O script
                                e
    mysqlhotcopy utiliza este m´todo.
                                                ca                             ca
 2. Interrompa o mysqld caso ele esteja em execu¸˜o, depois inicie-o com a op¸˜o --log-
    update[=nome_arquivo]. See undefined [Update log], page undefined . Os arquivos
                                         ca        a                        co
    de log atualizados fornecem a informa¸˜o necess´ria para replicar altera¸˜es ao banco
                                                         e
    de dados que forem feitas depois do ponto em que vocˆ executou mysqldump.
      e
Se vocˆ necessita restaurar alguma coisa, tente primeiro recuperar suas tabelas utilizando
REPAIR TABLE ou myisamchk -r. Isto deve funcionar em 99.9% de todos os caso, Se o
                                                           o a                 e
myisamchk falhar, tente o seguinte procedimento: (Isto s´ ir´ funcionar se vocˆ iniciou o
MySQL com --log-update, See undefined [Update log], page undefined ,):
 1. Restaure o backup original feito com o mysqldump.
                                                                co
 2. Execute o seguinte comando para re-executar as atualiza¸˜es armazenadas no log
        a
    bin´rio:
          shell> mysqlbinlog hostname-bin.[0-9]* | mysql
          e
    Se vocˆ estiver utilizando o log atualizado, pode utilizar:
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                229



         shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
                e
O comando ls ´ usado para obter todos os arquivos de log na ordem correta.
    e             e
Vocˆ pode tamb´m fazer backups seletivos com SELECT * INTO OUTFILE ’nome_arquivo’
FROM nome_tabela e restaurar com LOAD DATA INFILE ’nome_arquivo’ REPLACE.... Para
                                e          a
evitar registros duplicados, vocˆ precisar´ de um chave PRIMARY KEY ou uma UNIQUE na
tabela. A palavra chave REPLACE substitui os antigos registros com os novos quando um
                                                                  ´
novo registro duplica um antigo registro em uma chave de valores unicos.
       e                                                                        e
Se vocˆ tiver problemas de performance realizando backups no seu sistema, vocˆ pode
                                        ca                              a
resolver isto configurando uma replica¸˜o e fazendo os backups na m´quina escrava no
lugar da master. See undefined [Replication Intro], page undefined .
       e                                                      e
Se vocˆ estiver utilizando um sistema de arquivos Veritas, vocˆ pode fazer:
 1. Executar em um cliente (perl ?) FLUSH TABLES WITH READ LOCK
 2. Bifurcar uma shell ou executar em outro cliente mount vfxs snapshot.
 3. Executar no primeiro cliente UNLOCK TABLES
 4. Copiar arquivos do snapshot
 5. Desmontar snapshot

4.4.2 Sintaxe de BACKUP TABLE
      BACKUP TABLE nome_tabela[,nome_tabela...] TO ’/caminho/para/diret´rio/backup’   o
Faz uma c´pia de todos os arquivos de tabela para o diret´rio de backup que ´ o m´
            o                                               o                   e      inimo
      a                 a                  o
necess´rio para restaur´-lo. Atualmente s´ funciona para tabelas MyISAM. Para tabela
MyISAM, copia os arquivos .frm (defini¸˜es) e .MYD (dados). O arquivo de ´
                                       co                                   indice pode ser
reconstru´ a partir destes dois.
          ido
Antes de utilizar este comando, por favor veja See undefined [Backup], page undefined .
                                                        a
Durante o backup, o bloqueio de leitura (read lock) ser´ usado para cada tabela, uma de
           a                    e                  e
cada vez, ` medida que o backup ´ realizado. Se vocˆ deseja fazer backup de diversas tabelas
                         e
como um snapshot, vocˆ deve primeiro usar LOCK TABLES obtendo um bloqueio de leitura
para cada tabela no grupo.
O comando retorna uma tabela com as seguintes colunas:
Coluna                            Valor
Table                             Nome da Tabela
Op                                Sempre “backup”
Msg type                          Um dos seguintes: status, error, info ou warning.
Msg text                          A mensagem.
Note que o comando BACKUP TABLE est´ dispon´
                                        a                                      a
                                                 ivel somente no MySQL vers˜o 3.23.25 e
posterior.

4.4.3 Sintaxe de RESTORE TABLE
      RESTORE TABLE nome_tabela[,nome_tabela...] FROM ’/caminho/para/diret´rio/backup’ o
Restaura as tabelas utilizando o backup feito com BACKUP TABLE. Tabelas existentes n˜o  a
   a                     e                                                   a
ser˜o reescritas - se vocˆ tentar restaurar sobre uma tabela existente, obter´ um erro. A
restaura¸˜o demora mais tempo do que o backup pois ´ necess´rio reconstruir o ´
        ca                                               e       a                 indice.
230                                            e      e                       a
                                          Referˆncia t´cnica para o MySQL vers˜o 3.23.52



                                           a
Quanto mais chaves tiver, mais demorado ser´. Como no comando BACKUP TABLE, atual-
       o
mente s´ funciona com tabelas MyISAM.
O comando retorna uma tabela com as seguintes colunas:
Coluna                            Valor
Table                             Nome da Tabela
Op                                Sempre “restore”
Msg type                          Um dos seguintes: status, error, info ou warning.
Msg text                          A mensagem.

4.4.4 Sintaxe de CHECK TABLE
                                                  ca     ca
      CHECK TABLE nome_tabela[,nome_tabela...] [op¸~o [op¸~o...]]

        ca
      op¸~o = QUICK | FAST | MEDIUM | EXTENDED | CHANGED
                                                                  e
CHECK TABLE funciona somente em tabelas MyISAM. Em tabelas MyISAM ´ a mesma coisa
que executar myisamchk -m nome_tabela na tabela.
      e a                        ca          e
Se vocˆ n˜o especificar nenhuma op¸˜o, MEDIUM ´ usado.
Verifica se existem erros na(s) tabela(s). Para as tabelas MyISAM as estat´
                                                                         isticas das chaves
 a
s˜o atualizadas. O comando retorna uma tabela com as seguintes colunas:
Coluna                            Valor
Table                             Nome da Tabela.
Op                                Sempre “check”.
Msg type                          Um dos seguintes: status, error, info, or warning.
Msg text                          A mensagem.
              e             a                    co                                 ´
Note que vocˆ pode obter v´rias linhas de informa¸˜es para cada tabela conferida. A ultima
        a                                                                  e a
linha ir´ ser do tipo Msg_type status e normalmente deve estar OK. Se vocˆ n˜o obteve OK
ou Not checked, deve ser executado, normalmente, um reparo da tabela. See undefined
[Table maintenance], page undefined . Not checked significa que a tabela de um dado
                              a
TIPO disse ao MySQL que n˜o havia nenhuma necessidade de verific´-la.a
                              e
Os diferentes tipos de consistˆncias continuam para os seguintes:
Tipo                Significado
QUICK                 a                                    co
                    N˜o busca os registros verificando liga¸˜es incorretas.
FAST                  o                      a
                    S´ confere tabelas que n˜o foram fechadas corretamente.
CHANGED               o                                                 ´           e
                    S´ verifica as tabelas que foram alteradas desde a ultima conferˆncia
                             a
                    ou que n˜o foram fechadas corretamente.
MEDIUM                                                           co                a
                    Busca os registros para verificanado que liga¸˜es removidas est˜o ok.
                              e                               e
                    Isto tamb´m calcula uma chave de conferˆncia para os registros e ver-
                    ifica isto com um checksum calculado para as chaves.
EXTENDED            Faz uma busca completa nas chaves para todas as chaves em cada
                                                            a
                    registro. Isto assegura que a tabela est´ 100% consistente, mas pode
                    demorar muito tempo para executar!
                                     a                  ca                    a
Para tabelas MyISAM de tamanho dinˆmico, uma verifica¸˜o iniciada sempre far´ uma veri-
   ca                                          a     o
fica¸˜o MEDIUM. Para registros de tamanho est´tico n´s saltamos a busca de registros para
              a                     a
QUICK e FAST j´ que os registros est˜o raramente corrompidos.
   e                 co             e
Vocˆ pode combinar op¸˜es de consistˆncia como em:
                     ca
Chapter 4: Administra¸˜o de Bancos de Dados MySQL                                             231



        CHECK TABLE test_table FAST QUICK;
          o    a              ca a                             a
O qual s´ far´ uma verifica¸˜o r´pida na tabela se ela n˜o for fechada corretamente.
                                            a
NOTA: em alguns casos CHECK TABLE ir´ alterar a tabela! Isto acontece se a tabela estiver
                                                                         a
marcada como ’corrupted’ (corrompida) ou ’not closed properly’ (n˜o foi fechada correta-
                                a              a
mente) mas o CHECK TABLE n˜o encontrar n˜o encontrar nenhum problema na tabela. Neste
                       a
caso, CHECK TABLE ir´ marcar a tabela como ok.
Se uma tabela estiver corrompida, ´ prefer´ que seja um problema nos ´
                                       e       ivel                                         a
                                                                                 indices e n˜o na
parte de dados. Todos os tipos de consistˆncia acima sempre confere os ´
                                             e                                                  a
                                                                             indices e deve ent˜o
encontrar a maioria dos erros.
        e o                                                          e a
Se vocˆ s´ quiser conferir uma tabela que acredita estar ok, vocˆ n˜o deve utilizar nenhuma
   ca                                            ca              ´
op¸˜o para o comando check ou utilizar a op¸˜o QUICK. O ultimo deve ser utilizado quando
vocˆ estiver com pressa e o r´
    e                                             a
                                isco do QUICK n˜o encontrar um erro no arquivo de dados for
  ´                                                                        ca
minimo (Na maioria dos casos o MySQL pode encontrar, sob utiliza¸˜o normal, qualquer
                                                    a              a
erro no arquivo de dados. Se isto ocorrer, ent˜o a tabela ser´ marcada como ’corrupted’,
                       a          a                 e
neste caso a tabela n˜o poder´ ser utilizada at´ ser reparada).
                    a
FAST e CHANGED s˜o normalmente chamados a partir de um script (um exemplo ´ ser exe-    e
                                    e
cutado a partir do cron) Se vocˆ desejar conferir suas tabelas de tempos em tempos. Na
                           e          ca                              ´
maioria dos casos o FAT ´ uma op¸˜o melhor que CHANGED. (O unico caso em que isto n˜o           a
           e                                   o
acontece ´ se houver suspeitas de bug no c´digo do MyISAM.).
EXTENDED deve ser utilizado somente depois de ter executado um check normalmente, mas
continuar obtendo erros de uma tabela quando o MySQL tenta atualizar um registro ou
encontrar um registro pela chave (isto seria muito dif´ ocorrer caso uma conferˆncia normal
                                                        icil                         e
tenha executado com sucesso!).
                                         ca                  a
Algumas coisas relatadas pela verifica¸˜o de tabelas, n˜o podem ser corrigidas automatica-
mente:
  • Found row where the auto_increment column has the value 0.
      Isto significa que vocˆ possui na tabela um registro onde o campo ´
                            e                                                 indice que utiliza o
                                                      ´
      recurso auto_increment contem o valor 0. (E poss´ criar um registro onde a coluna
                                                              ivel
                                                                               ca
      de auto incremento seja 0 definindo explicitamente 0 em uma instru¸˜o UPDATE)
             a e                                                            e
      Isto n˜o ´ exatamente um erro, mas pode causar problemas se vocˆ decidir descarregar
                         a
      a tabela e restaur´-la ou executar um ALTER TABLE na tabela. Neste caso a coluna
                             a
      de auto incremento ir´ alterar seu valor, de acordo com as regras das colunas de auto
      incremento, que pode causar problemas como um erro de chave duplicada.
                                                             ca
      Para se livrar do alerta, basta executar uma instru¸˜o UPDATE para configurar a coluna
      para algum outro valor diferente de 0.

4.4.5 Sintaxe de REPAIR TABLE
      REPAIR TABLE nome_tabela[,nome_tabela...] [QUICK] [E