SlideShare uma empresa Scribd logo
MySQL Reference Manual




   Copyright c 1997-2003 MySQL AB
Super Manual MySQL
i



Sum´rio
   a

1   Informa¸˜es Gerais . . . . . . . . . . . . . . . . . . . . . . . . 1
           co
      1.1 Sobre Este Manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
            1.1.1 Conven¸˜es Usadas Neste Manual . . . . . . . . . . . . . . . . 2
                                  co
      1.2 Vis˜o Geral do Sistema de Gerenciamento de Banco de Dados
             a
          MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
            1.2.1 Hist´ria do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
                            o
            1.2.2 As Principais Caracter´                     isticas do MySQL . . . . . . . . . . 5
            1.2.3 Estabilidade do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 8
            1.2.4 Qual o Tamanho Que as Tabelas do MySQL Podem
                 Ter? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
            1.2.5 Compatibilidade Com o Ano 2000 (Y2K) . . . . . . . . 11
      1.3 Vis˜o Geral da MySQL AB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
             a
            1.3.1 O Modelo de Neg´cio e Servi¸os da MySQL AB . . 13
                                                     o                    c
                     1.3.1.1 Suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
                     1.3.1.2 Treinamento e Certifica¸˜o. . . . . . . . . . . . . 13
                                                                                 ca
                     1.3.1.3 Consultoria . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
                     1.3.1.4 Licen¸as Comerciais . . . . . . . . . . . . . . . . . . . 14
                                               c
                     1.3.1.5 Parcerias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
            1.3.2 Informa¸˜es para Contato . . . . . . . . . . . . . . . . . . . . . . 15
                                   co
      1.4 Suporte e Licenciamento do MySQL . . . . . . . . . . . . . . . . . . . . . 16
            1.4.1 Suporte Oferecido pela MySQL AB . . . . . . . . . . . . . 16
            1.4.2 Copyrights e Licen¸as Usadas pelo MySQL . . . . . . 17
                                                       c
            1.4.3 Licen¸as do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
                              c
                     1.4.3.1 Usando o Programa MySQL Sob uma
                              Licen¸a Comercial . . . . . . . . . . . . . . . . . . . . . . . . 18
                                        c
                     1.4.3.2 Usando o Programa MySQL Sem Custo
                              Sob GPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
            1.4.4 Logomarcas e Marcas Registradas da MySQL AB
                 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
                     1.4.4.1 O Logo Original do MySQL. . . . . . . . . . . . 20
                     1.4.4.2 Logomarcas da MySQL que Podem Ser
                              Usadas Sem Permiss˜o de Altera¸˜o . . . . . . . . 20
                                                                    a                      ca
                     1.4.4.3 Quando Vocˆ Precisa de Permiss˜o de
                                                            e                                     a
                              Altera¸˜o para Usar as Logomarcas do MySQL?
                                         ca
                               . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
                     1.4.4.4 Logomarcas dos Parceiros da MySQL AB
                               . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
                     1.4.4.5 Usando a Palavra MySQL em Texto Impresso
                              ou Apresenta¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . 21
                                                      ca
                     1.4.4.6 Usando a Palavra MySQL em Nomes de
                              Companhias e Produtos . . . . . . . . . . . . . . . . . . . 21
      1.5 Mapa de Desenvolvimento do MySQL. . . . . . . . . . . . . . . . . . . . 21
            1.5.1 MySQL 4.0 in a Nutshell . . . . . . . . . . . . . . . . . . . . . . . 22
ii

              1.5.1.1 Recursos Dispon´                   iveis no MySQL 4.0 . . . . 22
              1.5.1.2 Servidor Embutido MySQL . . . . . . . . . . . . 23
      1.5.2 MySQL 4.1 in a Nutshell . . . . . . . . . . . . . . . . . . . . . . . 24
              1.5.2.1 Recursos Dispon´                   iveis no MySQL 4.1 . . . . 24
              1.5.2.2 Stepwise Rollout . . . . . . . . . . . . . . . . . . . . . . 26
              1.5.2.3 Pronto para Uso em Desenvolvimento
                   Imediato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
      1.5.3 MySQL 5.0, A Pr´xima Distribui¸˜o de
                                          o                            ca
           Desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.6 MySQL e o Futuro (o TODO). . . . . . . . . . . . . . . . . . . . . . . . . . . 26
      1.6.1 Novos Recursos Planejados Para a Vers˜o 4.1 . . . . 26                a
      1.6.2 Novos Recursos Planejados Para a Vers˜o 5.0 . . . . 27                a
      1.6.3 Novos Recursos Planejados Para a Vers˜o 5.1 . . . . 28                a
      1.6.4 Novos Recursos Planejados Para a Vers˜o em um                         a
           Futuro Pr´ximo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
                       o
      1.6.5 Novos Recursos Planejados Para a Vers˜o em um                         a
           Futuro a M´dio Prazo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
                          e
      1.6.6 Novos Recursos que N˜o Planejamos Fazer . . . . . . 32
                                                  a
1.7 Fontes de Informa¸˜es do MySQL . . . . . . . . . . . . . . . . . . . . . . . 33
                          co
      1.7.1 Listas de Discuss˜o MySQL . . . . . . . . . . . . . . . . . . . . 33
                                         a
              1.7.1.1 As Listas de Discuss˜o do MySQL . . . . . . 33
                                                                a
              1.7.1.2 Fazendo perguntas ou relatando erros . . . 35
              1.7.1.3 Como relatar erros ou problemas . . . . . . . 36
              1.7.1.4 Guia para responder quest˜es na lista de              o
                   discuss˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
                               a
      1.7.2 Suporte a Comunidade MySQL Atrv´s do IRC                          e
           (Internet Relay Chat) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
1.8 Qual compatibilidade aos padr˜es o MySQL oferece ? . . . . . 41
                                                 o
      1.8.1 Qual Padr˜o o MySQL Segue? . . . . . . . . . . . . . . . . . . 42
                            a
      1.8.2 Executando o MySQL no modo ANSI . . . . . . . . . . . 42
      1.8.3 Extens˜es do MySQL para o Padr˜o SQL-92. . . . . 43
                      o                                                  a
      1.8.4 Diferen¸as do MySQL em Compara¸˜o com o
                       c                                                   ca
           SQL-92 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
              1.8.4.1 Subqueries . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
              1.8.4.2 SELECT INTO TABLE . . . . . . . . . . . . . . . . . . . 46
              1.8.4.3 Transa¸˜es e Opera¸˜es Atˆmicas . . . . . . 46
                                       co                      co           o
              1.8.4.4 Stored Procedures e Triggers . . . . . . . . . . . 49
              1.8.4.5 Chaves Estrangeiras . . . . . . . . . . . . . . . . . . . 49
              1.8.4.6 Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
              1.8.4.7 ‘--’ como In´ de Coment´rio . . . . . . . . 51
                                                 icio                        a
      1.8.5 Como o MySQL Lida com Restri¸˜es . . . . . . . . . . . . 52
                                                                      co
              1.8.5.1 Restri¸˜es de PRIMARY KEY / UNIQUE
                                      co
                    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
              1.8.5.2 Restri¸˜es de NOT NULL . . . . . . . . . . . . . . . . 53
                                      co
              1.8.5.3 Restri¸˜es de ENUM e SET. . . . . . . . . . . . . . . 53
                                      co
      1.8.6 Erros Conhecidos e Deficiˆncias de Projetos noe
           MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
iii

                              1.8.6.1 Erros da Vers˜o 3.23 Corrigidos em Vers˜es
                                                          a                                                 o
                                   Posteriores do MySQL . . . . . . . . . . . . . . . . . . . . 53
                              1.8.6.2 Open Bugs / Deficiˆncias de Projeto no
                                                                     e
                                   MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

2   Instala¸˜o do MySQL . . . . . . . . . . . . . . . . . . . . . 60
           ca
      2.1 Instala¸˜o r´pida padr˜o do MySQL . . . . . . . . . . . . . . . . . . . . . 60
                 ca a                         a
            2.1.1 Instalando o MySQL no Windows . . . . . . . . . . . . . . . 60
                      2.1.1.1 Exigˆncias do Sistema Windows . . . . . . . . 61
                                               e
                      2.1.1.2 Instalando uma Distribui¸˜o Bin´ria do                 ca            a
                               Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
                      2.1.1.3 Preparando o Ambiente MySQL do
                               Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
                      2.1.1.4 Selecionando um Servidor Windows . . . . 63
                      2.1.1.5 Iniciando o Servidor pela Primeira Vez . . 64
                      2.1.1.6 Iniciando o MySQL no Windows 95, 98, ou
                               Me . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
                      2.1.1.7 Iniciando o MySQL no Windows NT, 2000,
                               ou XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
                      2.1.1.8 Executando o MySQL no Windows . . . . . 68
            2.1.2 Instalando o MySQL no Linux . . . . . . . . . . . . . . . . . . 69
            2.1.3 Instalando o MySQL no Mac OS X . . . . . . . . . . . . . 71
            2.1.4 Instalando o MySQL no NetWare . . . . . . . . . . . . . . . 73
                      2.1.4.1 Instalando o MySQL para Bin´rios do                              a
                               NetWare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
      2.2 Detalhes Gerais de Instala¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
                                                     ca
            2.2.1 Como obter o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 75
            2.2.2 Verificando a Integridade do Pacote Usando MD5
                 Checksums ou GnuPG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
            2.2.3 Sistemas Operacionais suportados pelo MySQL . . 78
            2.2.4 Qual vers˜o do MySQL deve ser usada . . . . . . . . . . 80
                                       a
            2.2.5 Layouts de Instala¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . 83
                                                       ca
            2.2.6 Como e quando as atualiza¸˜es s˜o lan¸adas? . . . . 84
                                                                       co         a          c
            2.2.7 Filosofia das Distribui¸˜es - Nenhum Bug     co
                 Conhecidos nas Distribui¸˜es . . . . . . . . . . . . . . . . . . . . . 84
                                                               co
            2.2.8 Bin´rios MySQL compilados pela MySQL AB . . . 86
                            a
            2.2.9 Instalando uma Distribui¸˜o Bin´ria do MySQL . . 91
                                                                    ca            a
      2.3 Instalando uma distribui¸˜o com fontes do MySQL . . . . . . . 93
                                                  ca
            2.3.1 Vis˜o geral da instala¸˜o r´pida . . . . . . . . . . . . . . . . 94
                           a                                 ca a
            2.3.2 Aplicando patches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
            2.3.3 Op¸˜es t´co        ipicas do configure . . . . . . . . . . . . . . . . . . . 97
            2.3.4 Instalando pela ´rvore de fontes do desenvolvimento
                                                   a
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
            2.3.5 Lidando com Problemas de Compila¸˜o . . . . . . . . 103                ca
            2.3.6 Notas MIT-pthreads . . . . . . . . . . . . . . . . . . . . . . . . . . 106
            2.3.7 Instalando o MySQL a partir do Fonte no Windows
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
                      2.3.7.1 Construindo o MySQL Usando VC++ . . 108
iv

               2.3.7.2 Criando um Pacote Fonte do Windows a
                                          ´
                        partir da Ultima Fonte de Desenvolvimento
                         . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
2.4 Configura¸˜es e Testes P´s-instala¸˜o . . . . . . . . . . . . . . . . . . . 111
               co                          o                 ca
      2.4.1 Problemas Executando o mysql_install_db. . . . 115
      2.4.2 Problemas Inicializando o Servidor MySQL . . . . . 116
      2.4.3 Inicializando e parando o MySQL automaticamente.
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
2.5 Atualizando/Desatualizando o MySQL . . . . . . . . . . . . . . . . . . 120
      2.5.1 Atualizando da Vers˜o 4.0 para 4.1 . . . . . . . . . . . . 120
                                                    a
      2.5.2 Atualizando da Vers˜o 3.23 para 4.0 . . . . . . . . . . . 123
                                                    a
      2.5.3 Atualizando da vers˜o 3.22 para 3.23 . . . . . . . . . . . 126
                                                   a
      2.5.4 Atualizando da vers˜o 3.21 para 3.22 . . . . . . . . . . . 128
                                                   a
      2.5.5 Atualizando da vers˜o 3.20 para 3.21 . . . . . . . . . . . 129
                                                   a
      2.5.6 Atualizando a Tabela de Permiss˜es . . . . . . . . . . . . 130 o
      2.5.7 Atualizando para outra arquitetura . . . . . . . . . . . . 130
      2.5.8 Atualizando o MySQL no Windows . . . . . . . . . . . . 132
2.6 Notas espec´   ificas para os Sistemas Operacionais . . . . . . . . . 132
      2.6.1 Notas Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
               2.6.1.1 Conectando em um MySQL Rematamente
                        a Windows Utilizando SSH . . . . . . . . . . . . . . . 133
               2.6.1.2 Distribuindo Dados Entre Diferentes Discos
                        no Win32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
               2.6.1.3 Compilando clientes MySQL no Windows
                         . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
               2.6.1.4 MySQL para Windows Comparado com o
                        MySQL para Unix . . . . . . . . . . . . . . . . . . . . . . . 134
      2.6.2 Notas Linux (Todas as vers˜es) . . . . . . . . . . . . . . . . 137
                                                                 o
               2.6.2.1 Notas Linux para distribui¸˜es bin´rias                   co             a
                         . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
               2.6.2.2 Notas Linux x86 . . . . . . . . . . . . . . . . . . . . . 142
               2.6.2.3 Notas Linux SPARC . . . . . . . . . . . . . . . . . 143
               2.6.2.4 Notas Linux Alpha . . . . . . . . . . . . . . . . . . . 143
               2.6.2.5 Notas Linux PowerPC . . . . . . . . . . . . . . . . 144
               2.6.2.6 Notas Linux MIPS . . . . . . . . . . . . . . . . . . . 144
               2.6.2.7 Notas Linux IA-64 . . . . . . . . . . . . . . . . . . . 144
      2.6.3 Notas Solaris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
               2.6.3.1 Notas Solaris 2.7/2.8 . . . . . . . . . . . . . . . . . 147
               2.6.3.2 Notas Solaris x86 . . . . . . . . . . . . . . . . . . . . 148
      2.6.4 Notas BSD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
               2.6.4.1 Notas FreeBSD . . . . . . . . . . . . . . . . . . . . . . 149
               2.6.4.2 Notas NetBSD . . . . . . . . . . . . . . . . . . . . . . . 150
               2.6.4.3 Notas OpenBSD . . . . . . . . . . . . . . . . . . . . . 150
               2.6.4.4 Notas OpenBSD 2.8 . . . . . . . . . . . . . . . . . . 151
               2.6.4.5 Notas BSDI Vers˜o 2.x . . . . . . . . . . . . . . . 151
                                                               a
               2.6.4.6 Notas BSD/OS Vers˜o 3.x . . . . . . . . . . . . 151
                                                                     a
               2.6.4.7 Notas BSD/OS Vers˜o 4.x . . . . . . . . . . . . 152
                                                                     a
      2.6.5 Notas Mac OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
v

                  2.6.5.1 Mac OS X 10.x . . . . . . . . . . . . . . . . . . . . . . 152
                  2.6.5.2 Mac OS X Server 1.2 (Rhapsody) . . . . . 153
           2.6.6 Notas de Outros Unix . . . . . . . . . . . . . . . . . . . . . . . . . 153
                  2.6.6.1 Notas HP-UX para distribui¸˜es bin´rias                  co             a
                        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
                  2.6.6.2 Notas HP-UX Vers˜o 10.20 . . . . . . . . . . . 154
                                                                  a
                  2.6.6.3 Notas HP-UX Vers˜o 11.x . . . . . . . . . . . . 154
                                                                  a
                  2.6.6.4 Notas IBM-AIX. . . . . . . . . . . . . . . . . . . . . . 155
                  2.6.6.5 Notas SunOS 4 . . . . . . . . . . . . . . . . . . . . . . 157
                  2.6.6.6 Notas Alpha-DEC-UNIX (Tru64) . . . . . 157
                  2.6.6.7 Notas Alpha-DEC-OSF1. . . . . . . . . . . . . . 159
                  2.6.6.8 Notas SGI Irix . . . . . . . . . . . . . . . . . . . . . . . 160
                  2.6.6.9 Notas SCO . . . . . . . . . . . . . . . . . . . . . . . . . . 161
                  2.6.6.10 Notas SCO Unixware Version 7.0. . . . . 163
           2.6.7 Notas OS/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
           2.6.8 Notas Novell NetWare . . . . . . . . . . . . . . . . . . . . . . . . 164
           2.6.9 Notas BeOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
     2.7 Coment´rios de Instala¸˜o do Perl . . . . . . . . . . . . . . . . . . . . . . 165
                a                      ca
           2.7.1 Instalando Perl no Unix . . . . . . . . . . . . . . . . . . . . . . . 165
           2.7.2 Instalaando ActiveState Perl no Windows . . . . . . 166
           2.7.3 Problemas Usando a Interface Perl DBI/DBD . . . . 166

3   Tutorial de Introdu¸˜o Do MySQL . . . . . . . 169
                       ca
     3.1 Conectando e Desconectando do Servidor . . . . . . . . . . . . . . . 169
     3.2 Fazendo Consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
     3.3 Cria¸˜o e Utiliza¸˜o de um Banco de Dados . . . . . . . . . . . . . 173
              ca            ca
           3.3.1 Criando e Selecionando um Banco de Dados . . . . 174
           3.3.2 Criando uma Tabela . . . . . . . . . . . . . . . . . . . . . . . . . . 175
           3.3.3 Carregando dados em uma tabela . . . . . . . . . . . . . . 176
           3.3.4 Recuperando Informa¸˜es de uma Tabela . . . . . . . 178
                                                      co
                   3.3.4.1 Selecionando Todos os Dados . . . . . . . . . 178
                   3.3.4.2 Selecionando Registros Espec´                              ificos . . . . . 179
                   3.3.4.3 Selecionando Colunas Especificas . . . . . . 180         ´
                   3.3.4.4 Ordenando Registros . . . . . . . . . . . . . . . . . 181
                   3.3.4.5 C´lculo de Datas. . . . . . . . . . . . . . . . . . . . . 183
                                   a
                   3.3.4.6 Trabalhando com Valores Nulos (NULL)
                         . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
                   3.3.4.7 Combina¸˜o de padr˜es. . . . . . . . . . . . . . . 186
                                                ca                    o
                   3.3.4.8 Contando Registros . . . . . . . . . . . . . . . . . . 189
                   3.3.4.9 Utilizando M´ltiplas Tabelas . . . . . . . . . . 191
                                                        u
     3.4 Obtendo Informa¸˜es Sobre Bancos de Dados e Tabelas . . 193
                             co
     3.5 Utilizando mysql em Modo Batch . . . . . . . . . . . . . . . . . . . . . . 194
     3.6 Exemplos de Consultas Comuns . . . . . . . . . . . . . . . . . . . . . . . . 196
           3.6.1 O Valor M´ximo para uma Coluna . . . . . . . . . . . . . 196
                                  a
           3.6.2 O Registro que Armazena o Valor M´ximo para uma                  a
                 Coluna Determinada . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
           3.6.3 M´ximo da Coluna por Grupo . . . . . . . . . . . . . . . . . 197
                     a
vi

            3.6.4 As Linhas Armazenando o Group-wise M´ximo de                            a
                 um Certo Campo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
            3.6.5 Utilizando Vari´veis de Usu´rio . . . . . . . . . . . . . . . . 199
                                         a                       a
            3.6.6 Utilizando Chaves Estrangeiras . . . . . . . . . . . . . . . . 199
            3.6.7 Pesquisando em Duas Chaves . . . . . . . . . . . . . . . . . . 201
            3.6.8 Calculando Visitas Di´rias . . . . . . . . . . . . . . . . . . . . 201
                                                      a
            3.6.9 Usando AUTO_INCREMENT . . . . . . . . . . . . . . . . . . . . . . 202
      3.7 Consultas de Projetos Gˆmeos . . . . . . . . . . . . . . . . . . . . . . . . . 203
                                         e
            3.7.1 Encontrando Todos Gˆmeos N˜o-distribu´
                                                      e               a                  idos . . . 204
            3.7.2 Mostrando uma Tabela sobre a Situa¸˜o dos Pares                 ca
                 Gˆmeos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
                   e
      3.8 Utilizando MySQL com Apache . . . . . . . . . . . . . . . . . . . . . . . . 207

4   Administra¸˜o do Bancos de Dados MySQL
                       ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
      4.1 Configurando o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
              4.1.1 Op¸˜es de Linha de Comando do mysqld . . . . . . . 208
                                 co
              4.1.2 Arquivo de Op¸˜es ‘my.cnf’ . . . . . . . . . . . . . . . . . . . 217
                                                       co
      4.2 Executando M´ltiplos MySQL Servers na Mesma M´quina
                                     u                                                                     a
          . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
              4.2.1 Executando M´ltiplos Servidores no Windows . . 221
                                                      u
                            4.2.1.1 Iniciando M´ltiplos Servidores na Linha de
                                                                   u
                                     Comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
                            4.2.1.2 Iniciando M´ltiplos Servidores Como
                                                                   u
                                     Servi¸os . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
                                              c
              4.2.2 Executando M´ltiplos Servidores no Unix . . . . . . 225
                                                      u
              4.2.3 Usando Programas Clientes em um Ambiente
                       Multi-Servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
      4.3 Detalhes Gerais de Seguran¸a e o Sistema de Privil´gio de
                                                             c                                           e
          Acesso do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
              4.3.1 Seguran¸a Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
                                          c
              4.3.2 Como Tornar o MySQL Seguro contra Crackers
                        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
              4.3.3 Op¸˜es de Inicializa¸˜o para o mysqld em Rela¸˜o a
                                 co                             ca                                                ca
                       Seguran¸a. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
                                      c
              4.3.4 Detalhes de Seguran¸a com LOAD DATA LOCAL . . . 232
                                                                 c
              4.3.5 O Que o Sistema de Privil´gios Faz . . . . . . . . . . . . 233
                                                                            e
              4.3.6 Como o Sistema de Privil´gios Funciona . . . . . . . . 233
                                                                           e
              4.3.7 Privil´gios Fornecidos pelo MySQL . . . . . . . . . . . . 237
                                      e
              4.3.8 Conectando ao Servidor MySQL . . . . . . . . . . . . . . . 239
              4.3.9 Controle de Acesso, Est´gio 1: Verifica¸˜o da       a                           ca
                       Conex˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
                                  a
              4.3.10 Controle de Acesso, Est´gio 2: Verifica¸˜o da        a                           ca
                       Requisi¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
                                    ca
              4.3.11 Hashing de Senhas no MySQL 4.1 . . . . . . . . . . . . 246
              4.3.12 Causas dos Erros de Accesso Negado . . . . . . . . . 250
      4.4 Gerenciamento das Contas dos Usu´rios no MySQL . . . . . . 255    a
              4.4.1 A Sintaxe de GRANT e REVOKE . . . . . . . . . . . . . . . . . . 255
vii

        4.4.2 Nomes de Usu´rios e Senhas do MySQL . . . . . . . . 260
                                                a
        4.4.3 Quando as Altera¸˜es nos Privil´gios tem Efeito
                                                      co                         e
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
        4.4.4 Configurando os Privil´gios Iniciais do MySQL . . 261
                                                               e
        4.4.5 Adicionando Novos Usu´rios ao MySQL . . . . . . . . 262
                                                                 a
        4.4.6 Deletando Usu´rios do MySQL . . . . . . . . . . . . . . . . 265
                                                 a
        4.4.7 Limitando os Recursos dos Usu´rios. . . . . . . . . . . . 266    a
        4.4.8 Configurando Senhas . . . . . . . . . . . . . . . . . . . . . . . . . 267
        4.4.9 Mantendo Sua Senha Segura . . . . . . . . . . . . . . . . . . 268
        4.4.10 Usando Conex˜es Seguras . . . . . . . . . . . . . . . . . . . . 269
                                                  o
                      4.4.10.1 Conceitos Basicos . . . . . . . . . . . . . . . . . . . 269
                      4.4.10.2 Exigˆncias . . . . . . . . . . . . . . . . . . . . . . . . . . 269
                                                 e
                      4.4.10.3 Configurando Certificados SSL para o
                               MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
                      4.4.10.4 Op¸˜es SSL do GRANT . . . . . . . . . . . . . . . 274
                                              co
                      4.4.10.5 Op¸˜es SSL de Linha de Comando . . . 275
                                              co
4.5 Preven¸˜o de Disastres e Recupera¸˜o . . . . . . . . . . . . . . . . . . 276
                 ca                                                  ca
        4.5.1 Backups dos Bancos de Dados . . . . . . . . . . . . . . . . . 276
        4.5.2 Sintaxe de BACKUP TABLE . . . . . . . . . . . . . . . . . . . . . . 278
        4.5.3 Sintaxe de RESTORE TABLE . . . . . . . . . . . . . . . . . . . . . 278
        4.5.4 Sintaxe de CHECK TABLE . . . . . . . . . . . . . . . . . . . . . . . 279
        4.5.5 Sintaxe do REPAIR TABLE . . . . . . . . . . . . . . . . . . . . . . 280
        4.5.6 Utilizando myisamchk para Manuten¸˜o de Tabelas e                          ca
                 Recupera¸˜o em Caso de Falhas. . . . . . . . . . . . . . . . . . 281
                                  ca
                      4.5.6.1 Sintaxe do myisamchk . . . . . . . . . . . . . . . . 282
                      4.5.6.2 Op¸˜es Gerais do myisamchk . . . . . . . . . . 283
                                            co
                      4.5.6.3 Op¸˜es de Verifica¸˜o do myisamchk . . . 284
                                            co                          ca
                      4.5.6.4 Op¸˜es de Reparos do myisamchk . . . . . 285
                                            co
                      4.5.6.5 Outras Op¸˜es do myisamchk . . . . . . . . . 287
                                                          co
                      4.5.6.6 Uso de Mem´ria do myisamchk . . . . . . . . 287
                                                              o
                      4.5.6.7 Uso do myisamchk para Recupera¸˜o em                                   ca
                               Caso de Falhas . . . . . . . . . . . . . . . . . . . . . . . . . . 288
                      4.5.6.8 Como Verificar Erros em Tabelas . . . . . . 289
                      4.5.6.9 Como Reparar Tabelas . . . . . . . . . . . . . . . 290
                      4.5.6.10 Otimiza¸˜o de Tabelas . . . . . . . . . . . . . . 292
                                                       ca
        4.5.7 Configurando um Regime de Manuten¸˜o das                                       ca
                 Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
        4.5.8 Obtendo Informa¸˜es sobre as Tabelas . . . . . . . . . 293
                                                     co
4.6 Adiministra¸˜o do Banco de Dados e Referˆncia de Linguagem
                          ca                                                       e
    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
        4.6.1 Sintaxe de OPTIMIZE TABLE. . . . . . . . . . . . . . . . . . . . 299
        4.6.2 Sintaxe de ANALYZE TABLE . . . . . . . . . . . . . . . . . . . . . 299
        4.6.3 Sintaxe de CHECKSUM TABLE. . . . . . . . . . . . . . . . . . . . 300
        4.6.4 Sintaxe de FLUSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
        4.6.5 Sintaxe de RESET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
        4.6.6 Sintaxe de PURGE MASTER LOGS . . . . . . . . . . . . . . . . . 302
        4.6.7 Sintaxe de KILL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
        4.6.8 Sintaxe de SHOW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
viii

                 4.6.8.1 Recuperando Informa¸˜es sobre Bancos de          co
                          Dados, Tabelas, Colunas e ´                       Indices . . . . . . . . . 304
                 4.6.8.2 SHOW TABLE STATUS . . . . . . . . . . . . . . . . . . 305
                 4.6.8.3 SHOW STATUS . . . . . . . . . . . . . . . . . . . . . . . . . 306
                 4.6.8.4 SHOW VARIABLES . . . . . . . . . . . . . . . . . . . . . 309
                 4.6.8.5 SHOW [BDB] LOGS . . . . . . . . . . . . . . . . . . . . . 321
                 4.6.8.6 SHOW PROCESSLIST . . . . . . . . . . . . . . . . . . . 321
                 4.6.8.7 SHOW GRANTS . . . . . . . . . . . . . . . . . . . . . . . . . 323
                 4.6.8.8 SHOW CREATE TABLE . . . . . . . . . . . . . . . . . . 323
                 4.6.8.9 SHOW WARNINGS | ERRORS . . . . . . . . . . . . . 323
                 4.6.8.10 SHOW TABLE TYPES . . . . . . . . . . . . . . . . . . 325
                 4.6.8.11 SHOW PRIVILEGES . . . . . . . . . . . . . . . . . . . 326
4.7 Localiza¸˜o do MySQL e Utiliza¸˜o Internacional . . . . . . . . 326
              ca                                           ca
      4.7.1 O Conjunto de Caracteres Utilizado para Dados e
            Ordena¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
                         ca
                 4.7.1.1 German character set . . . . . . . . . . . . . . . . 327
      4.7.2 Mensagens de Erros em Outras L´                                   inguas . . . . . . . . 328
      4.7.3 Adicionando um Novo Conjunto de Caracteres . . 328
      4.7.4 Os Vetores de Defini¸˜es de Caracteres . . . . . . . . . 330
                                                      co
      4.7.5 Suporte ` Ordena¸˜o de Strings . . . . . . . . . . . . . . . 330
                                a                ca
      4.7.6 Suporte ` Caracteres Multi-byte . . . . . . . . . . . . . . . 331
                                a
      4.7.7 Problemas com Conjuntos de Caracteres . . . . . . . 331
4.8 Utilit´rios e Scripts do Lado do Servidor MySQL . . . . . . . . 331
          a
      4.8.1 Vis˜o Geral dos Scripts e Utilit´rios do Lado
                      a                                                   a
            Servidor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
      4.8.2 mysqld-safe, o wrapper do mysqld . . . . . . . . . . . . 332
      4.8.3 mysqld_multi, programa para gerenciar m´ltiplos                                     u
            servidores MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
      4.8.4 myisampack, O Gerador de Tabelas Compactadas de
            Somente Leitura do MySQL . . . . . . . . . . . . . . . . . . . . . 337
      4.8.5 mysqld-max, om servidor mysqld extendido . . . . . 344
4.9 Utilit´rios e Scripts do Lado do Cliente MySQL . . . . . . . . . 346
          a
      4.9.1 Vis˜o Geral dos Utilit´rios e Scripts do Lado do
                      a                                  a
            Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
      4.9.2 mysql, A Ferramenta de Linha de Comando . . . . 347
      4.9.3 mysqlcc, The MySQL Control Center . . . . . . . . . . 355
      4.9.4 mysqladmin, Administrando um Servidor MySQL
             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
      4.9.5 mysqlbinlog, Executando as Consultas a Partir de
            um Log Bin´rio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
                                  a
      4.9.6 Usando mysqlcheck para Manuten¸˜o de Tabelas e                       ca
            Recupera¸˜o em Caso de Falhas. . . . . . . . . . . . . . . . . . 360
                             ca
      4.9.7 mysqldump, Descarregando a Estrutura de Tabelas e
            Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
      4.9.8 mysqlhotcopy, Copiando Bancos de Dados e Tabelas
            do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
      4.9.9 mysqlimport, Importando Dados de Arquivos Texto
             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
ix

      4.9.10 mysqlshow, Exibindo Bancos de Dados, Tabelas e
           Colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
      4.9.11 mysql_config, Op¸˜es para compila¸˜o do cliente
                                                   co                               ca
           MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
      4.9.12 perror, Explicando C´digos de Erros . . . . . . . . . 372
                                                         o
      4.9.13 Como Executar Comandos SQL a Partir de um
           Arquivo Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
4.10 Os Arquivos de Log do MySQL . . . . . . . . . . . . . . . . . . . . . . . 372
      4.10.1 O Log de Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
      4.10.2 O Log de Consultas. . . . . . . . . . . . . . . . . . . . . . . . . . 373
      4.10.3 O Log de Atualiza¸˜es . . . . . . . . . . . . . . . . . . . . . . . 374
                                                   co
      4.10.4 O Log Bin´rio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
                                    a
      4.10.5 O Log para Consultas Lentas . . . . . . . . . . . . . . . . . 378
      4.10.6 Manuten¸˜o do Log de Arquivo . . . . . . . . . . . . . . . 378
                                 ca
4.11 Replica¸˜o no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
             ca
      4.11.1 Introdu¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
                              ca
      4.11.2 Vis˜o Geral da Implementa¸˜o da Replica¸˜o . . 380
                      a                                            ca                         ca
      4.11.3 Detalhes de Implementa¸˜o da Replica¸˜o . . . . . 381
                                                             ca                         ca
      4.11.4 Como Configurar a Replica¸˜o . . . . . . . . . . . . . . . . 386
                                                                   ca
      4.11.5 Recursos de Replica¸˜o e Problemas Conhecidos
                                                     ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
      4.11.6 Op¸˜es de Inicializa¸˜o da Replica¸˜o . . . . . . . . . 392
                      co                             ca                         ca
      4.11.7 Instru¸˜es SQL para Controle do Servidor Master
                            co
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
               4.11.7.1 PURGE MASTER LOGS . . . . . . . . . . . . . . . . . 401
               4.11.7.2 RESET MASTER . . . . . . . . . . . . . . . . . . . . . . 401
               4.11.7.3 SET SQL_LOG_BIN . . . . . . . . . . . . . . . . . . . 401
               4.11.7.4 SHOW BINLOG EVENTS . . . . . . . . . . . . . . . . 401
               4.11.7.5 SHOW MASTER STATUS . . . . . . . . . . . . . . . . 402
               4.11.7.6 SHOW MASTER LOGS . . . . . . . . . . . . . . . . . . 402
               4.11.7.7 SHOW SLAVE HOSTS . . . . . . . . . . . . . . . . . . 402
      4.11.8 Instru¸˜es SQL para Controle do Servidor Slave
                            co
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
               4.11.8.1 CHANGE MASTER TO . . . . . . . . . . . . . . . . . . 402
               4.11.8.2 LOAD DATA FROM MASTER . . . . . . . . . . . . . 405
               4.11.8.3 LOAD TABLE tbl_name FROM MASTER. . . 405
               4.11.8.4 MASTER_POS_WAIT() . . . . . . . . . . . . . . . . 405
               4.11.8.5 RESET SLAVE. . . . . . . . . . . . . . . . . . . . . . . . 406
               4.11.8.6 SET GLOBAL SQL_SLAVE_SKIP_COUNTER
                         . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
               4.11.8.7 SHOW SLAVE STATUS . . . . . . . . . . . . . . . . . 406
               4.11.8.8 START SLAVE. . . . . . . . . . . . . . . . . . . . . . . . 409
               4.11.8.9 STOP SLAVE . . . . . . . . . . . . . . . . . . . . . . . . . 410
      4.11.9 FAQ da Replica¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . 411
                                              ca
      4.11.10 Problemas com Replica¸˜o . . . . . . . . . . . . . . . . . . 416
                                                              ca
      4.11.11 Relatando Problemas de Replica¸˜o . . . . . . . . . . 417        ca
x

5   Otimiza¸˜o do MySQL . . . . . . . . . . . . . . . . . . . 419
           ca
      5.1 Vis˜o Geral da Otimiza¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
             a                                 ca
            5.1.1 Limita¸˜es do Projeto MySQL/Trocas . . . . . . . . . 419
                                 co
            5.1.2 Portabilidade. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
            5.1.3 Para que Utilizamos o MySQL?. . . . . . . . . . . . . . . . 421
            5.1.4 O Pacote de Benchmark do MySQL . . . . . . . . . . . . 422
            5.1.5 Utilizando seus Pr´prios Benchmarks . . . . . . . . . . 423
                                                      o
      5.2 Otimizando SELECTs e Outras Consultas . . . . . . . . . . . . . . . . 424
            5.2.1 Sintaxe de EXPLAIN (Obter informa¸˜es sobre uma                     co
                 SELECT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
            5.2.2 Estimando o Desempenho de uma Consulta. . . . . 432
            5.2.3 Velocidade das Consultas que Utilizam SELECT . . 432
            5.2.4 Como o MySQL Otimiza Cl´usulas WHERE . . . . . . 433  a
            5.2.5 Como o MySQL Otimiza IS NULL . . . . . . . . . . . . . . 434
            5.2.6 Como o MySQL Otimiza Cl´usulas DISTINCT . . . 435     a
            5.2.7 Como o MySQL Otimiza LEFT JOIN e RIGHT JOIN
                 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
            5.2.8 Como o MySQL Otimiza Cl´usulas ORDER BY . . . 437     a
            5.2.9 Como o MySQL Otimiza Cl´usulas LIMIT . . . . . . 438  a
            5.2.10 Performance das Consultas que Utilizam INSERT
                 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
            5.2.11 Performance das Consultas que Utilizam UPDATE
                 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
            5.2.12 Performance das Consultas que Utilizam DELETE
                 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
            5.2.13 Mais Dicas sobre Otimiza¸˜es . . . . . . . . . . . . . . . . 441
                                                                      co
      5.3 Detalhes sobre Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
            5.3.1 Como o MySQL Trava as Tabelas . . . . . . . . . . . . . . 444
            5.3.2 Detalhes sobre Lock de Tabelas . . . . . . . . . . . . . . . . 445
      5.4 Otimizando a Estrutura de Banco de Dados . . . . . . . . . . . . . 447
            5.4.1 Op¸˜es do Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
                          co
            5.4.2 Deixando os Dados com o Menor Tamanho Poss´                                                 ivel
                 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
            5.4.3 Como o MySQL Utiliza ´                         Indices . . . . . . . . . . . . . . . . 448
                    ´
            5.4.4 Indices de Colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
            5.4.5 ´ Indices de M´ltiplas Colunas . . . . . . . . . . . . . . . . . . 451
                                            u
            5.4.6 Como o MySQL Conta as Tabelas Abertas . . . . . 452
            5.4.7 Como o MySQL Abre e Fecha as Tabelas . . . . . . . 452
            5.4.8 Desvantagem em Criar um N´mero Grande de                u
                 Tabelas no Mesmo Banco de Dados . . . . . . . . . . . . . . 453
      5.5 Otimizando o Servidor MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 454
            5.5.1 Sintonia dos Parˆmetros em Tempo de
                                                   a
                 Sistema/Compila¸˜o e na Inicializa¸˜o. . . . . . . . . . . . 454
                                                ca                               ca
            5.5.2 Parˆmetros de Sintonia do Servidor . . . . . . . . . . . . 454
                           a
            5.5.3 Como a Compila¸˜o e a Liga¸˜o Afetam a
                                                   ca                     ca
                 Velocidade do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . 457
            5.5.4 Como o MySQL Utiliza a Mem´ria . . . . . . . . . . . . 458  o
            5.5.5 Como o MySQL Utiliza o DNS . . . . . . . . . . . . . . . . 460
xi

           5.5.6 Sintaxe de SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
     5.6 Detalhes de Disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
           5.6.1 Utilizando Links Simb´licos . . . . . . . . . . . . . . . . . . . 466
                                                       o
                  5.6.1.1 Utilizando Links Simb´licos para Bancos de    o
                       Dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
                  5.6.1.2 Utilizando Links Simb´licos para Tabelas      o
                        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467

6   Referˆncia de Linguagem do MySQL . . . . . . 469
         e
     6.1 Estrutura da Linguagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
           6.1.1 Literais: Como Gravar Strings e Numerais . . . . . . 469
                    6.1.1.1 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
                    6.1.1.2 N´meros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
                                        u
                    6.1.1.3 Valores Hexadecimais . . . . . . . . . . . . . . . . 471
                    6.1.1.4 Valores NULL. . . . . . . . . . . . . . . . . . . . . . . . . 471
           6.1.2 Nomes de Banco de dados, Tabela, ´                                  Indice, Coluna e
                Alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
           6.1.3 Caso Sensitivo nos Nomes . . . . . . . . . . . . . . . . . . . . . 473
           6.1.4 Vari´veis de Usu´rio . . . . . . . . . . . . . . . . . . . . . . . . . . 474
                           a                      a
           6.1.5 Vari´veis de Sistema . . . . . . . . . . . . . . . . . . . . . . . . . . 475
                           a
           6.1.6 Sintaxe de Coment´rios . . . . . . . . . . . . . . . . . . . . . . . 478
                                                      a
           6.1.7 Tratamento de Palavras Reservadas no MySQL
                . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
     6.2 Tipos de Campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
           6.2.1 Tipos Num´ricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
                                        e
           6.2.2 Tipos de Data e Hora . . . . . . . . . . . . . . . . . . . . . . . . . 489
                    6.2.2.1 Assuntos referentes ao ano 2000 (Y2K) e
                             Tipos de Data . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
                    6.2.2.2 Os Tipos DATETIME, DATE e TIMESTAMP
                              . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
                    6.2.2.3 O Tipo TIME. . . . . . . . . . . . . . . . . . . . . . . . . 495
                    6.2.2.4 O Tipo YEAR. . . . . . . . . . . . . . . . . . . . . . . . . 496
           6.2.3 Tipos String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
                    6.2.3.1 Os Tipos CHAR e VARCHAR . . . . . . . . . . . . . 497
                    6.2.3.2 Os Tipos BLOB e TEXT . . . . . . . . . . . . . . . . 497
                    6.2.3.3 O Tipo ENUM. . . . . . . . . . . . . . . . . . . . . . . . . 499
                    6.2.3.4 O Tipo SET . . . . . . . . . . . . . . . . . . . . . . . . . . 500
           6.2.4 Escolhendo o Tipo Correto para uma Coluna . . . 501
           6.2.5 Usando Tipos de Colunas de Outros Mecanismos de
                Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
           6.2.6 Exigˆncias de Armazenamento dos Tipos de Coluna
                            e
                . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
     6.3 Fun¸˜es para Uso em Cl´usulas SELECT e WHERE . . . . . . . . . 503
             co                                a
           6.3.1 Operadores e Fun¸˜es de Tipos n˜o Especificados
                                                    co                           a
                . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
                    6.3.1.1 Parenteses . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
                    6.3.1.2 Operadores de Compara¸˜o . . . . . . . . . . . 504   ca
                    6.3.1.3 Operadores Logicos . . . . . . . . . . . . . . . . . . 508
xii

                      6.3.1.4 Fun¸˜es de Fluxo de Controle . . . . . . . . . 510
                                              co
        6.3.2 Fun¸˜es String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
                            co
                      6.3.2.1 Fun¸˜es de Compara¸˜o de Strings . . . . 519
                                              co                             ca
                      6.3.2.2 Caso Sensitivo . . . . . . . . . . . . . . . . . . . . . . . 522
        6.3.3 Fun¸˜es Num´ricas . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
                            co                e
                      6.3.3.1 Opera¸˜es Aritim´ticas . . . . . . . . . . . . . . . 522
                                                  co                   e
                      6.3.3.2 Fun¸˜es Matematicas. . . . . . . . . . . . . . . . . 523
                                              co
        6.3.4 Fun¸˜es de Data e Hora . . . . . . . . . . . . . . . . . . . . . . . 529
                            co
        6.3.5 Fun¸˜es de Convers˜o . . . . . . . . . . . . . . . . . . . . . . . . . 543
                            co                            a
        6.3.6 Outras Fun¸˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
                                           co
                      6.3.6.1 Fun¸˜es Bin´rias . . . . . . . . . . . . . . . . . . . . . 545
                                              co             a
                      6.3.6.2 Fun¸˜es Diversas . . . . . . . . . . . . . . . . . . . . . 546
                                              co
        6.3.7 Fun¸˜es e Modificadores para Usar com Cl´usulas
                            co                                                                      a
                 GROUP BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
                      6.3.7.1 Fun¸˜es GROUP BY . . . . . . . . . . . . . . . . . . . . 555
                                              co
                      6.3.7.2 Modificadores GROUP BY . . . . . . . . . . . . . . 558
                      6.3.7.3 GROUP BY com Campos Escondidos . . . . 561
6.4 Manipula¸˜o de Dados: SELECT, INSERT, UPDATE e DELETE
                     ca
    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
        6.4.1 Sintaxe SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
                      6.4.1.1 Sintaxe JOIN . . . . . . . . . . . . . . . . . . . . . . . . 567
                      6.4.1.2 Sintaxe UNION . . . . . . . . . . . . . . . . . . . . . . . 569
        6.4.2 Sintaxe de Subquery . . . . . . . . . . . . . . . . . . . . . . . . . . 569
                      6.4.2.1 A Subquery como um Operandop Escalar
                                . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
                      6.4.2.2 Compara¸˜es Usando Subquery . . . . . . . 571
                                                       co
                      6.4.2.3 Subqueries with ANY, IN, and SOME . . . . 571
                      6.4.2.4 Subqueries with ALL. . . . . . . . . . . . . . . . . . 572
                      6.4.2.5 Correlated Subqueries . . . . . . . . . . . . . . . . 572
                      6.4.2.6 EXISTS and NOT EXISTS . . . . . . . . . . . . . . 573
                      6.4.2.7 Row Subqueries . . . . . . . . . . . . . . . . . . . . . . 573
                      6.4.2.8 Subqueries in the FROM clause . . . . . . . . . 574
                      6.4.2.9 Subquery Errors . . . . . . . . . . . . . . . . . . . . . 575
                      6.4.2.10 Optimizing Subqueries . . . . . . . . . . . . . . 576
                      6.4.2.11 Rewriting Subqueries for Earlier MySQL
                               Versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
        6.4.3 Sintaxe INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
                      6.4.3.1 Sintaxe INSERT ... SELECT . . . . . . . . . . . 581
                      6.4.3.2 Sintaxe INSERT DELAYED . . . . . . . . . . . . . . 581
        6.4.4 Sintaxe UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
        6.4.5 Sintaxe DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
        6.4.6 Sintaxe TRUNCATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
        6.4.7 Sintaxe REPLACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
        6.4.8 Sintaxe LOAD DATA INFILE. . . . . . . . . . . . . . . . . . . . . 587
        6.4.9 Sintaxe HANDLER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
        6.4.10 Sintaxe DO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
6.5 Defini¸˜o de Dados: CREATE, DROP e ALTER . . . . . . . . . . . . . . 596
               ca
        6.5.1 Sintaxe CREATE DATABASE . . . . . . . . . . . . . . . . . . . . . 596
xiii

              6.5.2 Sintaxe DROP DATABASE . . . . . . . . . . . . . . . . . . . . . . . 596
              6.5.3 Sintaxe CREATE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . 597
                       6.5.3.1 Altera¸˜o de Especifica¸˜es de Colunas
                                                   ca                              co
                                 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
              6.5.4 Sintaxe ALTER TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . 607
              6.5.5 Sintaxe RENAME TABLE . . . . . . . . . . . . . . . . . . . . . . . . . 611
              6.5.6 Sintaxe DROP TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
              6.5.7 Sintaxe CREATE INDEX . . . . . . . . . . . . . . . . . . . . . . . . . 612
              6.5.8 Sintaxe DROP INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
     6.6    Comandos Utilit´rios B´sicos do Usu´rio MySQL . . . . . . . . 613
                                    a            a                        a
              6.6.1 Sintaxe USE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
              6.6.2 Sintaxe DESCRIBE (Obtem Informa¸˜es Sobre                          co
                   Colunas) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
     6.7    Comandos Transacionais e de Lock do MySQL . . . . . . . . . . 614
              6.7.1 Sintaxe de START TRANSACTION, COMMIT e ROLLBACK
                   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
              6.7.2 Instru¸˜es que N˜o Podem Ser Desfeitas . . . . . . . . 615
                                 co                  a
              6.7.3 Instru¸˜es que Fazem um Commit Implicito . . . . 615
                                 co
              6.7.4 Sintaxe de SAVEPOINT e ROLLBACK TO SAVEPOINT
                   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
              6.7.5 Sintaxe LOCK TABLES e UNLOCK TABLES . . . . . . . . . 616
              6.7.6 Sintaxe SET TRANSACTION . . . . . . . . . . . . . . . . . . . . . 618
     6.8    Pesquisa Full-text no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . 618
              6.8.1 Restri¸˜es Full-text . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
                                 co
              6.8.2 Ajuste Fino de Pesquisas Full-text no MySQL . . 623
              6.8.3 TODO de Pesquisas Full-text . . . . . . . . . . . . . . . . . . 624
     6.9    Cache de Consultas do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 624
              6.9.1 Como a Cache de Consultas Opera. . . . . . . . . . . . . 625
              6.9.2 Configura¸˜o da Cache de Consultas . . . . . . . . . . . 626
                                        ca
              6.9.3 Op¸˜es da Cache de Consultas na SELECT . . . . . . 627
                            co
              6.9.4 Estado e Manuten¸˜o da Cache de Consultas . . . 627
                                                        ca

7   Tipos de Tabela do MySQL . . . . . . . . . . . . . . 629
     7.1 Tabelas MyISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
           7.1.1 Espa¸o Necess´rio para Chaves . . . . . . . . . . . . . . . . 632
                       c                a
           7.1.2 Formatos de Tabelas MyISAM . . . . . . . . . . . . . . . . . . 633
                  7.1.2.1 Caracter´            isticas de Tabelas Est´ticas            a
                       (Tamanho Fixo) . . . . . . . . . . . . . . . . . . . . . . . . . 633
                  7.1.2.2 Caracter´            isticas de Tabelas Dinˆmicas . . 633    a
                                              ´
                  7.1.2.3 Caracteristicas de Tabelas Compactadas
                        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634
           7.1.3 Problemas com Tabelas MyISAM . . . . . . . . . . . . . . . . 635
                  7.1.3.1 Tabelas MyISAM Corrompidas . . . . . . . . . 635
                  7.1.3.2 O Cliente est´ usando a tabela ou n˜o a
                                                       a                                         a
                       fechou de forma apropriada . . . . . . . . . . . . . . . 636
     7.2 Tabelas MERGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
           7.2.1 Problemas com Tabelas MERGE . . . . . . . . . . . . . . . . . 639
     7.3 Tabelas ISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
xiv

7.4 Tabelas HEAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
7.5 Tabelas InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
      7.5.1 Vis˜o Geral de Tabelas InnoDB. . . . . . . . . . . . . . . . 642
                 a
      7.5.2 InnoDB no MySQL Vers˜o 3.23 . . . . . . . . . . . . . . . . 642
                                                        a
      7.5.3 Op¸˜es de Inicializa¸˜o do InnoDB . . . . . . . . . . . . . 643
                 co                            ca
      7.5.4 Criando Tablespaces no InnoDB . . . . . . . . . . . . . . . 650
              7.5.4.1 Se Alguma Coisa Der Errado Na Cria¸˜o                                      ca
                    Do Banco de Dados . . . . . . . . . . . . . . . . . . . . . . 651
      7.5.5 Criando Tabelas InnoDB . . . . . . . . . . . . . . . . . . . . . . 651
              7.5.5.1 Convertendo Tabelas MyISAM para
                    InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
              7.5.5.2 Restri¸˜es FOREIGN KEY . . . . . . . . . . . . . . . 652
                                       co
      7.5.6 Adicionando e Removendo Arquivos de Dados e Log
           do InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
      7.5.7 Fazendo Backup e Recuperando um Banco de Dados
           InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
              7.5.7.1 For¸ando a recupera¸˜o . . . . . . . . . . . . . . 657
                                  c                              ca
              7.5.7.2 Ponto de Verifica¸˜o . . . . . . . . . . . . . . . . . 658
                                                           ca
      7.5.8 Movendo um Banco de Dados InnoDB para Outra
           M´quina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658
             a
      7.5.9 Modelo Transacional do InnoDB . . . . . . . . . . . . . . . 659
              7.5.9.1 InnoDB e SET ... TRANSACTION ISOLATION
                    LEVEL ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659
              7.5.9.2 Leitura Consistente sem Lock . . . . . . . . . 661
              7.5.9.3 Lock de Leitura SELECT ... FOR UPDATE e
                    SELECT ... LOCK IN SHARE MODE . . . . . . . . . . 661
              7.5.9.4 Lock da Chave Seguinte: Evitando
                    Problemas com Fantasmas . . . . . . . . . . . . . . . . 662
              7.5.9.5 Locks Definidos por Diferentes Instru¸˜es                                   co
                    SQL no InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . 662
              7.5.9.6 Detec¸˜o de Deadlock e Rollback . . . . . . 663
                                      ca
              7.5.9.7 Um Exemplo de Como a Leitura
                    Consistente Funciona no InnoDB . . . . . . . . . . 664
              7.5.9.8 Como lidar com deadlocks? . . . . . . . . . . . 665
      7.5.10 Dicas de Ajuste de Desempenho . . . . . . . . . . . . . . 666
              7.5.10.1 SHOW INNODB STATUS e o Monitor InnoDB
                     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
      7.5.11 Implementa¸˜o de Multi-versioning . . . . . . . . . . . 669
                                  ca
      7.5.12 Estrutura de Tabelas e ´                   Indices . . . . . . . . . . . . . . . . 670
              7.5.12.1 Estrutura F´                 isica do ´     Indice . . . . . . . . . . . 671
              7.5.12.2 Buffer de Inser¸˜o. . . . . . . . . . . . . . . . . . . 671
                                                         ca
              7.5.12.3 ´      Indices Hash Adaptativos . . . . . . . . . . . . 672
              7.5.12.4 Estrutura dos Registros F´                             isicos . . . . . . 672
              7.5.12.5 Como Funciona uma Coluna
                    AUTO_INCREMENT no InnoDB . . . . . . . . . . . . . . 672
      7.5.13 Gerenciamento do Espa¸o de Arquivos e E/S de
                                                        c
           Disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
              7.5.13.1 E/S de Disco . . . . . . . . . . . . . . . . . . . . . . . 673
xv

       7.5.13.2 Gerenciamento do Espa¸o de Arquivo               c
             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674
       7.5.13.3 Desfragmentando uma Tabela . . . . . . . . 675
7.5.14 Tratando Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
7.5.15 Restri¸˜es em Tabelas InnoDB . . . . . . . . . . . . . . . 675
                co
7.5.16 Hist´rico de Altera¸˜es do InnoDB . . . . . . . . . . . . 677
            o                           co
       7.5.16.1 MySQL/InnoDB-4.1.1, December 4, 2003
             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
       7.5.16.2 MySQL/InnoDB-4.0.16, October 22, 2003
             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
       7.5.16.3 MySQL/InnoDB-3.23.58, September 15,
            2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
       7.5.16.4 MySQL/InnoDB-4.0.15, September 10,
            2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
       7.5.16.5 MySQL/InnoDB-4.0.14, Junho de 2003
             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
       7.5.16.6 MySQL/InnoDB-3.23.57, June 20, 2003
             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679
       7.5.16.7 MySQL/InnoDB-4.0.13, 20 de Maio de
            2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679
       7.5.16.8 MySQL/InnoDB-4.1.0, 03 de Abril de
            2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
       7.5.16.9 MySQL/InnoDB-3.23.56, 17 de Mar¸o de                                    c
            2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
       7.5.16.10 MySQL/InnoDB-4.0.12, 18 Mar¸o de                                  c
            2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
       7.5.16.11 MySQL/InnoDB-4.0.11, 25 de Fevereiro
            de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
       7.5.16.12 MySQL/InnoDB-4.0.10, 04 de Fevereiro
            de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
       7.5.16.13 MySQL/InnoDB-3.23.55, 24 de Janeiro
            de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
       7.5.16.14 MySQL/InnoDB-4.0.9, 14 de Janeiro de
            2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
       7.5.16.15 MySQL/InnoDB-4.0.8, 07 de Janeiro de
            2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
       7.5.16.16 MySQL/InnoDB-4.0.7, 26 de Dezembro
            de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
       7.5.16.17 MySQL/InnoDB-4.0.6, 19 de Dezembro
            de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
       7.5.16.18 MySQL/InnoDB-3.23.54, 12 de
            Dezembro de 2002 . . . . . . . . . . . . . . . . . . . . . . . 684
       7.5.16.19 MySQL/InnoDB-4.0.5, 18 de Novembro
            de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
       7.5.16.20 MySQL/InnoDB-3.23.53, 09 de Outubro
            de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
       7.5.16.21 MySQL/InnoDB-4.0.4, 02 de Outubro de
            2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
xvi

               7.5.16.22 MySQL/InnoDB-4.0.3, 28 de Agosto de
                        2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
               7.5.16.23 MySQL/InnoDB-3.23.52, 16 de Agosto
                        de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
               7.5.16.24 MySQL/InnoDB-4.0.2, 10 de Julho de
                        2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
               7.5.16.25 MySQL/InnoDB-3.23.51, 12 de Junho de
                        2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
               7.5.16.26 MySQL/InnoDB-3.23.50, 23 de Abril de
                        2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
               7.5.16.27 MySQL/InnoDB-3.23.49, 17 de Fevereiro
                        de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
               7.5.16.28 MySQL/InnoDB-3.23.48, 09 de Fevereiro
                        de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
               7.5.16.29 MySQL/InnoDB-3.23.47, 28 de
                        Dezembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . 691
               7.5.16.30 MySQL/InnoDB-4.0.1, 23 de Dezembro
                        de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692
               7.5.16.31 MySQL/InnoDB-3.23.46, 30 de
                        Novembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . 692
               7.5.16.32 MySQL/InnoDB-3.23.45, 23 de
                        Novembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . 692
               7.5.16.33 MySQL/InnoDB-3.23.44, 02 de
                        Novembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . 693
               7.5.16.34 MySQL/InnoDB-3.23.43, 04 de Outubro
                        de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
               7.5.16.35 MySQL/InnoDB-3.23.42, 09 de Setembro
                        de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
               7.5.16.36 MySQL/InnoDB-3.23.41, 13 de Agosto
                        de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
               7.5.16.37 MySQL/InnoDB-3.23.40, 16 de Julho de
                        2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
               7.5.16.38 MySQL/InnoDB-3.23.39, 13 de Junho de
                        2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
               7.5.16.39 MySQL/InnoDB-3.23.38, 12 de Maio de
                        2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
      7.5.17 Informa¸˜es de Contato do InnoDB . . . . . . . . . . . . 694
                               co
7.6 Tabelas BDB ou BerkeleyDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
      7.6.1 Vis˜o Geral de Tabelas BDB. . . . . . . . . . . . . . . . . . . . 695
                    a
      7.6.2 Instalando BDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
      7.6.3 Op¸˜es de Inicializa¸˜o do BDB . . . . . . . . . . . . . . . . . 696
                    co                             ca
      7.6.4 Caracter´         isticas de Tabelas BDB: . . . . . . . . . . . . . . . . 697
      7.6.5 Itens a serem corrigidos no BDB num futuro pr´ximo:                                     o
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
      7.6.6 Sistemas operacionais suportados pelo BDB . . . . . . 698
      7.6.7 Restri¸˜es em Tabelas BDB . . . . . . . . . . . . . . . . . . . . 699
                         co
      7.6.8 Erros Que Podem Ocorrer Usando Tabelas BDB . . 699
xvii

8   Introdu¸˜o ao MaxDB . . . . . . . . . . . . . . . . . . . 701
           ca
      8.1     Historia do MaxDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .               701
      8.2     Licenciamento e Suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                 701
      8.3     Conceitos B´sicos do MaxDB . . . . . . . . . . . . . . . . . . . . . . . . . .
                            a                                                                                       701
      8.4     Diferen¸as de Recursos entre o MaxDB e o MySQL . . . . . .
                     c                                                                                              701
      8.5     Interoperability Features between MaxDB and MySQL . . .                                               702
      8.6     MaxDB-related Links. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                702
      8.7     Reserved Words in MaxDB . . . . . . . . . . . . . . . . . . . . . . . . . . . .                       703
      8.8     Fun¸˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
                  co                                                                                                705
      8.9     Tipos de Colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .            705

9   Conjunto de Caracteres Nacionais e Unicode
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
      9.1 Conjuntos de Caracteres e Collations em Geral . . . . . . . . . . 707
      9.2 Conjunto de Caracteres e Collations no MySQL . . . . . . . . . 708
      9.3 Determinando o Conjunto de Caracteres e Collation Padr˜es                                                  o
          . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
              9.3.1 Conjunto de Caracteres e Collations do Servidor
                        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
              9.3.2 Conjunto de Caracteres e Collation de Banco de
                       Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709
              9.3.3 O Conjunto de Caracteres e Collations de Tabela
                        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
              9.3.4 Conjunto de Caracteres e Collation de Colunas . . 710
              9.3.5 Exemplos de Atribui¸˜es de Conjuntos de Caracteres
                                                                 co
                       e Collation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
              9.3.6 Conjunto de Caracteres e Collation de Conex˜o                                              a
                        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712
              9.3.7 Conjunto de Caracteres e Collation de Caracter de
                       String Literal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
              9.3.8 Cl´usula COLLATE em V´rias Partes de uma Consulta
                               a                                       a
                       SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714
              9.3.9 Precedˆncia da Cl´usula COLLATE . . . . . . . . . . . . . . 714
                                        e                    a
              9.3.10 Operador BINARY . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715
              9.3.11 Alguns Casos Especiais Onde a Determina¸˜o da                                          ca
                       Collation e Trabalhosa . . . . . . . . . . . . . . . . . . . . . . . . . . 715
              9.3.12 Collations Devem Ser para o Conjunto de
                       Caracteres Certo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
              9.3.13 Um exemplo do Efeito da Collation . . . . . . . . . . . 716
      9.4 Opera¸˜es Afetadas pelo Suporte a Conjunto de Caracteres
                     co
          . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
              9.4.1 Strings de Resultados . . . . . . . . . . . . . . . . . . . . . . . . . 717
              9.4.2 CONVERT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717
              9.4.3 CAST() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717
              9.4.4 SHOW CHARACTER SET . . . . . . . . . . . . . . . . . . . . . . . . . . 718
              9.4.5 SHOW COLLATION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
              9.4.6 SHOW CREATE DATABASE . . . . . . . . . . . . . . . . . . . . . . . . 719
              9.4.7 SHOW FULL COLUMNS . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
xviii

     9.5  Suporte Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
     9.6  UTF8 para Metdados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720
     9.7  Compatibilidade com Outros SGBDs . . . . . . . . . . . . . . . . . . . 721
     9.8  Novo Formato do Arquivo de Configura¸˜o do Conjunto de              ca
         Caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
     9.9 Conjunto de Caracteres Nacional . . . . . . . . . . . . . . . . . . . . . . . 721
     9.10 Atualizando para o MySQL 4.0. . . . . . . . . . . . . . . . . . . . . . . . 722
            9.10.1 Conjunto de Caracteres do MySQL e o
                 Par/Conjunto de Caracter/Collation Correspondente
                 do MySQL 4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
     9.11 Os conjuntos de Caracteres e Collations que o MySQL
         Suporta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
            9.11.1 O Conjunto de Caracteres Unicode. . . . . . . . . . . . 725
            9.11.2 Conjunto de Caracteres para Plataformas
                 Espec´    ificas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
            9.11.3 Conjunto de Caracteres do Sul da Europa e Oriente
                 M´dio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
                    e
            9.11.4 Os Conjuntos de Caracteres Asi´ticos . . . . . . . . . 725     a
            9.11.5 Os Conjuntos de Caracteres B´lticos . . . . . . . . . . 726a
            9.11.6 Os Conjuntos de Caracteres Cir´                               ilicos . . . . . . . . . . 726
            9.11.7 O Conjunto de Caracteres da Europa Central . . 727
            9.11.8 Os Conjuntos de Caracteres da Europa Ocidental
                 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728

10   Extens˜es Espacias em MySQL . . . . . . . . . . 730
           o
     10.1 Introdu¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
                  ca                                                                                        730
     10.2 O Modelo Geom´trico OpenGIS . . . . . . . . . . . . . . . . . . . . . . .
                              a                                                                             730
           10.2.1 A Hierarquia da Classe Geometry . . . . . . . . . . . . .                                 731
           10.2.2 Classe Geometry . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                 732
           10.2.3 Classe Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .              733
           10.2.4 Classe Curve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .              733
           10.2.5 Classe LineString . . . . . . . . . . . . . . . . . . . . . . . . . .                     734
           10.2.6 Classe Surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                734
           10.2.7 Classe Polygon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                734
           10.2.8 Classe GeometryCollection . . . . . . . . . . . . . . . . .                               735
           10.2.9 Classe MultiPoint . . . . . . . . . . . . . . . . . . . . . . . . . .                     735
           10.2.10 Classe MultiCurve . . . . . . . . . . . . . . . . . . . . . . . . .                      735
           10.2.11 Classe MultiLineString (Multi Linhas) . . . . .                                          736
           10.2.12 Classe MultiSurface (Multi Superf´                                icies) . . . . .       736
           10.2.13 Classe MultiPolygon (Multi Poligonos) . . . . . .           ´                            736
     10.3 Formatos de Dados Espaciais Suportados . . . . . . . . . . . . . .                                737
           10.3.1 Formato Well-Known Text (WKT). . . . . . . . . . . .                                      737
           10.3.2 Formato Well-Known Binary (WKB). . . . . . . . . .                                        738
     10.4 Criando um Banco de Dados MySQL Habilitado
         Espacialmente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    738
           10.4.1 Tipos de Dados Espaciais do MySQL . . . . . . . . .                                       739
           10.4.2 Criando Valores Espaciais . . . . . . . . . . . . . . . . . . . .                         739
xix

               10.4.2.1 Criando Valores Geometry Usando
                        Fun¸˜es WKT . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
                               co
               10.4.2.2 Criando Valores Geometry Usando
                        Fun¸˜es WKB . . . . . . . . . . . . . . . . . . . . . . . . . . . 740
                               co
               10.4.2.3 Criando uma Valor de Geometira Usando
                        Fun¸˜es Espec´
                               co                 ificas do MySQL . . . . . . . . . . . 741
      10.4.3 Criando Colunas Espaciais . . . . . . . . . . . . . . . . . . . 742
      10.4.4 Entrando com Dados em Colunas Espaciais . . . . 743
      10.4.5 Buscando Dados Espaciais . . . . . . . . . . . . . . . . . . . 744
               10.4.5.1 Buscando Dados Espaciais em um
                        Formato Interno . . . . . . . . . . . . . . . . . . . . . . . . . 744
               10.4.5.2 Buscando Dados Espaciais no Formato
                        WKT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744
               10.4.5.3 Buscando Dados Espaciais no Formato
                        WKB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744
10.5 Analisando Informa¸˜o Espacial . . . . . . . . . . . . . . . . . . . . . . . 744
                                    ca
      10.5.1 Fun¸˜es Para Converter Geometrias Entre Formatos
                       co
           Diferentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
      10.5.2 Fun¸˜es de An´lise das Propriedades de Geometry
                       co                   a
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
               10.5.2.1 Fun¸˜es de An´lise das Propriedades de
                                         co                  a
                        Geometry em Geral . . . . . . . . . . . . . . . . . . . . . . 746
               10.5.2.2 Fun¸˜es de An´lise das Propriedades de
                                         co                  a
                        Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747
               10.5.2.3 Fun¸˜es de An´lise das Propriedades de
                                         co                  a
                        LineString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748
               10.5.2.4 Fun¸˜es de An´lise das Propriedades de
                                         co                  a
                        MultiLineString . . . . . . . . . . . . . . . . . . . . . . . . 749
               10.5.2.5 Fun¸˜es de An´lise das Propriedades de
                                         co                  a
                        Polygon. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
               10.5.2.6 Fun¸˜es de An´lise das Propriedades de
                                         co                  a
                        MultiPolygon . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
               10.5.2.7 Fun¸˜es de An´lise das Propriedades de
                                         co                  a
                        GeometryCollection . . . . . . . . . . . . . . . . . . . . 751
      10.5.3 Fun¸˜es Que Criam Novas Geometrias de Outras
                       co
           Existentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752
               10.5.3.1 Fun¸˜es de Geometria Que Produzem
                                         co
                        Novas Geometrias . . . . . . . . . . . . . . . . . . . . . . . . 752
               10.5.3.2 Operadores Espaciais . . . . . . . . . . . . . . . . 752
      10.5.4 Fun¸˜es Para Testar Rela¸˜es Espaciais Entre
                       co                                       co
           Objetos Geom´tricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
                                    e
      10.5.5 Rela¸˜es de Retˆngulo de Limite M´
                         co                   a                                   inimo (Minimal
           Bounding Rectangles - MBR) em Geometrias . . . . . 753
      10.5.6 Fun¸˜es que Testam Relacionamentos Espaciais
                       co
           Entre Geometrias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754
10.6 Otimizando An´lises Espaciais . . . . . . . . . . . . . . . . . . . . . . . . 755
                            a
      10.6.1 Criando ´           Indices Espaciais . . . . . . . . . . . . . . . . . . . . 755
                               ´
      10.6.2 Usando Indice Espacial . . . . . . . . . . . . . . . . . . . . . . 756
xx

     10.7 Compatibilidade e Conformidade com o MySQL . . . . . . . . 758
           10.7.1 Recursos GIS Que Ainda N˜o Est˜o Implementados        a           a
                . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758

11   Stored Procedures e Fun¸˜es . . . . . . . . . . . . 760
                            co
     11.1 Sintaxe de Stored Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . 760
           11.1.1 Maintaining Stored Procedures . . . . . . . . . . . . . . . 761
                  11.1.1.1 CREATE PROCEDURE and CREATE FUNCTION
                        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
                  11.1.1.2 ALTER PROCEDURE and ALTER FUNCTION
                        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763
                  11.1.1.3 DROP PROCEDURE and DROP FUNCTION . . 763
                  11.1.1.4 SHOW CREATE PROCEDURE and SHOW CREATE
                       FUNCTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763
           11.1.2 SHOW PROCEDURE STATUS and SHOW FUNCTION
                STATUS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764
           11.1.3 CALL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764
           11.1.4 BEGIN ... END Compound Statement . . . . . . . . . 764
           11.1.5 DECLARE Statement . . . . . . . . . . . . . . . . . . . . . . . . . . 764
           11.1.6 Variables in Stored Procedures . . . . . . . . . . . . . . . 764
                  11.1.6.1 DECLARE Local Variables . . . . . . . . . . . . . 765
                  11.1.6.2 Variable SET Statement. . . . . . . . . . . . . . 765
                  11.1.6.3 SELECT ... INTO Statement . . . . . . . . . 765
           11.1.7 Conditions and Handlers . . . . . . . . . . . . . . . . . . . . . 765
                  11.1.7.1 DECLARE Conditions . . . . . . . . . . . . . . . . . 765
                  11.1.7.2 DECLARE Handlers . . . . . . . . . . . . . . . . . . . 765
           11.1.8 Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
                  11.1.8.1 Declaring Cursors . . . . . . . . . . . . . . . . . . . 768
                  11.1.8.2 Cursor OPEN Statement . . . . . . . . . . . . . . 768
                  11.1.8.3 Cursor FETCH Statement . . . . . . . . . . . . . 768
                  11.1.8.4 Cursor CLOSE Statement . . . . . . . . . . . . . 768
           11.1.9 Flow Control Constructs . . . . . . . . . . . . . . . . . . . . . 768
                  11.1.9.1 IF Statement . . . . . . . . . . . . . . . . . . . . . . . 768
                  11.1.9.2 CASE Statement . . . . . . . . . . . . . . . . . . . . . 768
                  11.1.9.3 LOOP Statement . . . . . . . . . . . . . . . . . . . . . 769
                  11.1.9.4 LEAVE Statement . . . . . . . . . . . . . . . . . . . . 769
                  11.1.9.5 ITERATE Statement . . . . . . . . . . . . . . . . . 769
                  11.1.9.6 REPEAT Statement. . . . . . . . . . . . . . . . . . . 770
                  11.1.9.7 WHILE Statement . . . . . . . . . . . . . . . . . . . . 770
xxi

12   Ferramentas de Clientes e APIs do MySQL
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772
     12.1 API C do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   772
           12.1.1 Tipos de Dados da API C . . . . . . . . . . . . . . . . . . . .                  772
           12.1.2 Vis˜o Geral das Fun¸˜o da API C . . . . . . . . . . . .
                      a                       ca                                                   775
           12.1.3 Descri¸˜o das Fun¸˜es da API C . . . . . . . . . . . . . .
                         ca              co                                                        779
                  12.1.3.1 mysql_affected_rows() . . . . . . . . . . . .                           780
                  12.1.3.2 mysql_change_user() . . . . . . . . . . . . . .                         781
                  12.1.3.3 mysql_character_set_name(). . . . . . .                                 782
                  12.1.3.4 mysql_close() . . . . . . . . . . . . . . . . . . . . .                 782
                  12.1.3.5 mysql_connect() . . . . . . . . . . . . . . . . . . .                   783
                  12.1.3.6 mysql_create_db() . . . . . . . . . . . . . . . .                       783
                  12.1.3.7 mysql_data_seek() . . . . . . . . . . . . . . . .                       784
                  12.1.3.8 mysql_debug() . . . . . . . . . . . . . . . . . . . . .                 785
                  12.1.3.9 mysql_drop_db() . . . . . . . . . . . . . . . . . . .                   785
                  12.1.3.10 mysql_dump_debug_info() . . . . . . . . .                              786
                  12.1.3.11 mysql_eof() . . . . . . . . . . . . . . . . . . . . . .                786
                  12.1.3.12 mysql_errno() . . . . . . . . . . . . . . . . . . . .                  788
                  12.1.3.13 mysql_error() . . . . . . . . . . . . . . . . . . . .                  788
                  12.1.3.14 mysql_escape_string() . . . . . . . . . . .                            789
                  12.1.3.15 mysql_fetch_field() . . . . . . . . . . . . .                          789
                  12.1.3.16 mysql_fetch_fields() . . . . . . . . . . . .                           790
                  12.1.3.17 mysql_fetch_field_direct() . . . . .                                   791
                  12.1.3.18 mysql_fetch_lengths() . . . . . . . . . . .                            792
                  12.1.3.19 mysql_fetch_row() . . . . . . . . . . . . . . .                        792
                  12.1.3.20 mysql_field_count() . . . . . . . . . . . . .                          794
                  12.1.3.21 mysql_field_seek() . . . . . . . . . . . . . .                         795
                  12.1.3.22 mysql_field_tell() . . . . . . . . . . . . . .                         795
                  12.1.3.23 mysql_free_result() . . . . . . . . . . . . .                          796
                  12.1.3.24 mysql_get_client_info() . . . . . . . . .                              796
                  12.1.3.25 mysql_get_host_info() . . . . . . . . . . .                            796
                  12.1.3.26 mysql_get_proto_info() . . . . . . . . . .                             797
                  12.1.3.27 mysql_get_server_info() . . . . . . . . .                              797
                  12.1.3.28 mysql_get_server_version() . . . . .                                   798
                  12.1.3.29 mysql_info() . . . . . . . . . . . . . . . . . . . . .                 798
                  12.1.3.30 mysql_init() . . . . . . . . . . . . . . . . . . . . .                 799
                  12.1.3.31 mysql_insert_id() . . . . . . . . . . . . . . .                        799
                  12.1.3.32 mysql_kill() . . . . . . . . . . . . . . . . . . . . .                 800
                  12.1.3.33 mysql_list_dbs(). . . . . . . . . . . . . . . . .                      801
                  12.1.3.34 mysql_list_fields() . . . . . . . . . . . . .                          801
                  12.1.3.35 mysql_list_processes() . . . . . . . . . .                             802
                  12.1.3.36 mysql_list_tables() . . . . . . . . . . . . .                          802
                  12.1.3.37 mysql_num_fields() . . . . . . . . . . . . . .                         803
                  12.1.3.38 mysql_num_rows(). . . . . . . . . . . . . . . . .                      805
                  12.1.3.39 mysql_options() . . . . . . . . . . . . . . . . . .                    805
                  12.1.3.40 mysql_ping() . . . . . . . . . . . . . . . . . . . . .                 807
                  12.1.3.41 mysql_query() . . . . . . . . . . . . . . . . . . . .                  808
                  12.1.3.42 mysql_real_connect() . . . . . . . . . . . .                           809
xxii

         12.1.3.43 mysql_real_escape_string() . . . . . 811
         12.1.3.44 mysql_real_query() . . . . . . . . . . . . . . 813
         12.1.3.45 mysql_reload() . . . . . . . . . . . . . . . . . . . 813
         12.1.3.46 mysql_row_seek(). . . . . . . . . . . . . . . . . 814
         12.1.3.47 mysql_row_tell(). . . . . . . . . . . . . . . . . 814
         12.1.3.48 mysql_select_db() . . . . . . . . . . . . . . . 815
         12.1.3.49 mysql_set_server_option(). . . . . . . 815
         12.1.3.50 mysql_shutdown(). . . . . . . . . . . . . . . . . 816
         12.1.3.51 mysql_sqlstate(). . . . . . . . . . . . . . . . . 817
         12.1.3.52 mysql_ssl_set() . . . . . . . . . . . . . . . . . . 817
         12.1.3.53 mysql_stat() . . . . . . . . . . . . . . . . . . . . . 818
         12.1.3.54 mysql_store_result() . . . . . . . . . . . . 818
         12.1.3.55 mysql_thread_id() . . . . . . . . . . . . . . . 820
         12.1.3.56 mysql_use_result() . . . . . . . . . . . . . . 820
         12.1.3.57 mysql_commit() . . . . . . . . . . . . . . . . . . . 821
         12.1.3.58 mysql_rollback(). . . . . . . . . . . . . . . . . 822
         12.1.3.59 mysql_autocommit() . . . . . . . . . . . . . . 822
         12.1.3.60 mysql_more_results() . . . . . . . . . . . . 822
         12.1.3.61 mysql_next_result() . . . . . . . . . . . . . 823
12.1.4 Instru¸˜es Preparadas da API C . . . . . . . . . . . . . . 824
                      co
12.1.5 Tipos de Dados de Instru¸oes Preparadas da API C   c˜
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 824
12.1.6 Vis˜o Geral das Fun¸˜es de Instru¸˜es Preparadas
                a                               co                        co
     da API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
12.1.7 Descri¸˜o das Fun¸˜es de Instru¸˜o Preparada da
                      ca                    co                        ca
     API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
         12.1.7.1 mysql_prepare() . . . . . . . . . . . . . . . . . . . 829
         12.1.7.2 mysql_param_count() . . . . . . . . . . . . . . 831
         12.1.7.3 mysql_get_metadata() . . . . . . . . . . . . . 831
         12.1.7.4 mysql_bind_param() . . . . . . . . . . . . . . . 832
         12.1.7.5 mysql_execute() . . . . . . . . . . . . . . . . . . . 833
         12.1.7.6 mysql_stmt_affected_rows(). . . . . . . 837
         12.1.7.7 mysql_bind_result() . . . . . . . . . . . . . . 838
         12.1.7.8 mysql_stmt_store_result() . . . . . . . . 839
         12.1.7.9 mysql_stmt_data_seek() . . . . . . . . . . . 840
         12.1.7.10 mysql_stmt_row_seek() . . . . . . . . . . . 840
         12.1.7.11 mysql_stmt_row_tell() . . . . . . . . . . . 841
         12.1.7.12 mysql_stmt_num_rows() . . . . . . . . . . . 841
         12.1.7.13 mysql_fetch() . . . . . . . . . . . . . . . . . . . . 842
         12.1.7.14 mysql_send_long_data() . . . . . . . . . . 847
         12.1.7.15 mysql_stmt_close() . . . . . . . . . . . . . . 849
         12.1.7.16 mysql_stmt_errno() . . . . . . . . . . . . . . 850
         12.1.7.17 mysql_stmt_error() . . . . . . . . . . . . . . 850
         12.1.7.18 mysql_stmt_sqlstate() . . . . . . . . . . . 851
12.1.8 Tratando a Execu¸˜o de M´ltiplas Consultas na
                                            ca               u
     API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 851
12.1.9 Manipulando Valores de Data e Hora na API C
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
xxiii

      12.1.10 Descri¸˜o das Fun¸˜es de Threads da API C . . 854
                              ca                    co
               12.1.10.1 my_init() . . . . . . . . . . . . . . . . . . . . . . . . 854
               12.1.10.2 mysql_thread_init() . . . . . . . . . . . . . 854
               12.1.10.3 mysql_thread_end() . . . . . . . . . . . . . . 854
               12.1.10.4 mysql_thread_safe() . . . . . . . . . . . . . 855
      12.1.11 Descri¸˜o das Fun¸˜es do Servidor Embutido da
                              ca                    co
           API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
               12.1.11.1 mysql_server_init() . . . . . . . . . . . . . 855
               12.1.11.2 mysql_server_end() . . . . . . . . . . . . . . 856
      12.1.12 D´vidas e problemas comuns ao utilzar a API C
                      u
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
               12.1.12.1 Porque Algumas Vezes
                        mysql_store_result() Retorna NULL Ap´s                                        o
                        mysql_query() Returnar com Sucesso? . . . . 857
               12.1.12.2 Que Resultados Posso Onbetr de uma
                        Consulta? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
               12.1.12.3 Como Posso Obter a ID Unica para a                       ´
                        ´
                        Ultima Linha Inserida? . . . . . . . . . . . . . . . . . . . 857
               12.1.12.4 Problemas com Liga¸˜o na API C . . . 858        ca
      12.1.13 Construindo Programas Clientes . . . . . . . . . . . . . 858
      12.1.14 Como Fazer um Cliente em Threads . . . . . . . . . 859
      12.1.15 libmysqld, a Biblioteca do Servidor Embutido
           MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860
               12.1.15.1 Vis˜o Geral da Biblioteca do Servidor
                                          a
                        MySQL Embutido . . . . . . . . . . . . . . . . . . . . . . . 860
               12.1.15.2 Compilando Programas com libmysqld
                         . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 861
               12.1.15.3 Restri¸˜es no Uso de um Servidor
                                               co
                        MySQL Embutido . . . . . . . . . . . . . . . . . . . . . . . 861
               12.1.15.4 Usando Arquivo de Op¸˜es com o                       co
                        Servidor Embutido . . . . . . . . . . . . . . . . . . . . . . . 861
               12.1.15.5 Itens a Fazer no Servidor Embutido
                        (TODO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862
               12.1.15.6 Um Exemplo Simples de Servidor
                        Embutido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862
               12.1.15.7 Licensiando o Servidor Embutido . . . 866
12.2 Suporte ODBC ao MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866
      12.2.1 Como Instalar o MyODBC . . . . . . . . . . . . . . . . . . . 866
      12.2.2 Como Preencher os V´rios Campos no Programa de
                                                         a
           Administra¸˜o do ODBC . . . . . . . . . . . . . . . . . . . . . . . . 867
                               ca
      12.2.3 Parˆmetros de Conex˜o do MyODBC . . . . . . . . . 868
                       a                                a
      12.2.4 Como Relatar Problemas com o MyODBC . . . . 869
      12.2.5 Programas que Funcionam com MyODBC . . . . . 870
      12.2.6 Como Obter o Valor de uma Coluna
           AUTO_INCREMENT no ODBC . . . . . . . . . . . . . . . . . . . . . . 874
      12.2.7 Relatando Problemas com MyODBC . . . . . . . . . . 875
12.3 Conectividade Java (JDBC) ao MySQL . . . . . . . . . . . . . . . . 876
12.4 API PHP do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
xxiv

           12.4.1 Problemas Comuns com MySQL e PHP . . . . . . .                                           876
     12.5 API Perl do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .              876
           12.5.1 DBI com DBD::mysql . . . . . . . . . . . . . . . . . . . . . . . .                       877
           12.5.2 A interface DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .              877
           12.5.3 Mais Informa¸˜es DBI/DBD . . . . . . . . . . . . . . . . . . .
                               co                                                                          883
     12.6 API C++ do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .               883
           12.6.1 Borland C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .              883
     12.7 API Python do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                  884
     12.8 API Tcl do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .             884
     12.9 Eiffel Wrapper do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . .                   884

13   Tratamento de Erros no MySQL . . . . . . . . . 885
     13.1 Erros Retornados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885

14   Estendendo o MySQL . . . . . . . . . . . . . . . . . . . 892
     14.1 MySQL Internals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 892
           14.1.1 Threads MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 892
           14.1.2 Pacotes de Teste do MySQL . . . . . . . . . . . . . . . . . . 892
                    14.1.2.1 Executando o Pacote de Testes do MySQL
                              . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
                    14.1.2.2 Extendendo o Pacote de Teste do MySQL
                              . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
                    14.1.2.3 Relatando Bugs no Pacote de Teste do
                             MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 894
     14.2 Adicionando Novas Fun¸˜es ao MySQL . . . . . . . . . . . . . . . . 895
                                                co
           14.2.1 Sintaxe CREATE FUNCTION/DROP FUNCTION . . . . . 896
           14.2.2 Adicionando Novas Fun¸˜es Definidas Por Usu´rio co                                         a
                . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896
                    14.2.2.1 Sequˆncia de Chamadas UDF para
                                               e
                             Fun¸˜es Simples . . . . . . . . . . . . . . . . . . . . . . . . . 898
                                    co
                    14.2.2.2 Sequˆncia de Chamadas UDF para
                                               e
                             Fun¸˜es Agregadas . . . . . . . . . . . . . . . . . . . . . . . 899
                                    co
                    14.2.2.3 Processando Argumentos . . . . . . . . . . . . 900
                    14.2.2.4 Valor de Retorno e Tartamento de Erros
                              . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
                    14.2.2.5 Compilando e Instalando Fun¸˜es                                 co
                             Definidas Por Usu´rio . . . . . . . . . . . . . . . . . . . . 902
                                                              a
           14.2.3 Adicionando uma Nova Fun¸˜o Nativa . . . . . . . . 904 ca
     14.3 Adicionado Novos Procedimentos ao MySQL . . . . . . . . . . . 905
           14.3.1 An´lise de Procedimento . . . . . . . . . . . . . . . . . . . . . 905
                           a
           14.3.2 Escrevendo um Procedimento. . . . . . . . . . . . . . . . . 906
xxv

Apˆndice A Problemas e Erros Comuns . . . . . 907
  e
    A.1 Como Determinar o Que Est´ Causando Problemas . . . . . 907
                                                       a
    A.2 Erros Comuns Usando o MySQL . . . . . . . . . . . . . . . . . . . . . . . 908
         A.2.1 Erro: Access Denied . . . . . . . . . . . . . . . . . . . . . . . . . 908
         A.2.2 Erro: MySQL server has gone away. . . . . . . . . . . . 908
         A.2.3 Erro: Can’t connect to [local] MySQL server
               . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 909
         A.2.4 Erro: Client does not support authentication
              protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 911
         A.2.5 Erro: Host ’...’ is blocked . . . . . . . . . . . . . . . . . 912
         A.2.6 Erro: Too many connections . . . . . . . . . . . . . . . . . 912
         A.2.7 Erro: Some non-transactional changed tables
              couldn’t be rolled back . . . . . . . . . . . . . . . . . . . . . . . 912
         A.2.8 Erro: Out of memory . . . . . . . . . . . . . . . . . . . . . . . . . 913
         A.2.9 Erro: Packet too large . . . . . . . . . . . . . . . . . . . . . . 913
         A.2.10 Erros de Comunica¸˜o / Comunica¸˜o Abortada
                                                         ca                           ca
               . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914
         A.2.11 Erro: The table is full . . . . . . . . . . . . . . . . . . . . 915
         A.2.12 Erro: Can’t create/write to file . . . . . . . . . . 915
         A.2.13 Erro no Cliente: Commands out of sync . . . . . . . 916
         A.2.14 Erro: Ignoring user . . . . . . . . . . . . . . . . . . . . . . . . 916
         A.2.15 Erro: Table ’xxx’ doesn’t exist . . . . . . . . . . . 916
         A.2.16 Erro: Can’t initialize character set xxx . . 917
         A.2.17 Arquivo N˜o Encontrado . . . . . . . . . . . . . . . . . . . . 917
                                         a
    A.3 Assuntos Relacionados a Instala¸˜o . . . . . . . . . . . . . . . . . . . . 918
                                                              ca
         A.3.1 Problemas de Liga¸˜o com a Biblioteca do Cliente
                                                      ca
              MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918
         A.3.2 Como Executar o MySQL Como Um Usu´rio                                            a
              Normal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 919
         A.3.3 Problemas com Permiss˜es de Arquivos . . . . . . . . 920
                                                               o
    A.4 Assuntos Relacionados a Administra¸˜o . . . . . . . . . . . . . . . . 920
                                                                      ca
         A.4.1 O Que Fazer Se o MySQL Continua Falhando . . 921
         A.4.2 Como Recuperar uma Senha de Root Esquecida
               . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 923
         A.4.3 Como o MySQL Trata de Discos Sem Espa¸o . . 924                                     c
         A.4.4 Onde o MySQL Armazena Arquivos Tempor´rios                                             a
               . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 924
         A.4.5 Como Proteger ou AlterarHow to Protect or Change
              the MySQL Socket File ‘/tmp/mysql.sock’ . . . . . . . 925
         A.4.6 Problemas Com Fuso Hor´rio . . . . . . . . . . . . . . . . . 926
                                                                   a
    A.5 Assuntos Relacionados a Consultas. . . . . . . . . . . . . . . . . . . . . 926
         A.5.1 Caso-Sensitivito em Pesquisas . . . . . . . . . . . . . . . . . 926
         A.5.2 Problemas Usando Colunas DATE . . . . . . . . . . . . . . 926
         A.5.3 Problemas com Valores NULL . . . . . . . . . . . . . . . . . . 928
         A.5.4 Problemas com alias . . . . . . . . . . . . . . . . . . . . . . . . 929
         A.5.5 Deletando Linhas de Tabelas Relacionadas . . . . . 929
         A.5.6 Resolvendo Problemas Com Registros N˜o                                         a
              Encontrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
xxvi

             A.5.7 Problemas com Compara¸˜o de Ponto Flutuante       ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
        A.6 Assuntos Relacionados ao Otimizador . . . . . . . . . . . . . . . . . . 932
             A.6.1 Camo evitar o varredura da tabela,,,. . . . . . . . . . . 933
        A.7 Assuntos Relacionados a Defini¸˜es de Tabelas . . . . . . . . . . 933
                                                               co
             A.7.1 Problemas com ALTER TABLE. . . . . . . . . . . . . . . . . . 933
             A.7.2 Como Alterar a Ordem das Colunas em Uma Tabela
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934
             A.7.3 Problemas com TEMPORARY TABLE . . . . . . . . 934

Apˆndice B Colaboradores do MySQL . . . . . . 936
  e
        B.1      Desenvolvedores do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . .               936
        B.2      Coolaboradores do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . .              939
        B.3      Respons´veis pela Documenta¸˜o e Tradu¸˜o . . . . . . . . . . .
                         a                      ca                 ca                                         943
        B.4      Bibliotecas usadas e incluidas com o MySQL . . . . . . . . . . . .                           944
        B.5      Pacotes que suportam o MySQL . . . . . . . . . . . . . . . . . . . . . . .                   945
        B.6      Ferramentas que s˜o usadas para criar o MySQL . . . . . . . .
                                   a                                                                          946
        B.7      Respons´veis pelo Suporte do MySQL . . . . . . . . . . . . . . . . . .
                         a                                                                                    946

Apˆndice C Hist´rico de Altera¸oes do MySQL
  e                        o                            c˜
    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948
        C.1 Altera¸˜es na distribui¸˜o 5.0.0 (Development) . . . . . . . . . . 948
                  co                            ca
        C.2 Altera¸˜es na distribui¸˜o 4.1.x (Alpha) . . . . . . . . . . . . . . . . 948
                  co                            ca
             C.2.1 Altera¸˜es na distribui¸˜o 4.1.2 (not released yet)
                                   co                            ca
                   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 949
             C.2.2 Altera¸˜es na distribui¸˜o 4.1.1 (01 de Dez de 2003)
                                   co                            ca
                   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 950
             C.2.3 Altera¸˜es na distribui¸˜o 4.1.0 (03 Apr 2003:
                                   co                            ca
                  Alpha) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954
        C.3 Altera¸˜es na distribui¸˜o 4.0.x (Production) . . . . . . . . . . . 956
                  co                            ca
             C.3.1 Altera¸˜es na distribui¸˜o 4.0.17 (not released yet)
                                   co                            ca
                   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957
             C.3.2 Altera¸˜es na distribui¸˜o 4.0.16 (17 Out 2003)
                                   co                            ca
                   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 959
             C.3.3 Altera¸˜es na distribui¸˜o 4.0.15 (03 Sep 2003)
                                   co                            ca
                   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 961
             C.3.4 Altera¸˜es na distribui¸˜o 4.0.14 (18 Jul 2003) . . 965
                                   co                            ca
             C.3.5 Altera¸˜es na distribui¸˜o 4.0.13 (16 May 2003)
                                   co                            ca
                   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 969
             C.3.6 Altera¸˜es na distribui¸˜o 4.0.12 (15 Mar 2003:
                                   co                            ca
                  Production) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 972
             C.3.7 Altera¸˜es na distribui¸˜o 4.0.11 (20 Feb 2003)
                                   co                            ca
                   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 974
             C.3.8 Altera¸˜es na distribui¸˜o 4.0.10 (29 Jan 2003)
                                   co                            ca
                   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
             C.3.9 Altera¸˜es na distribui¸˜o 4.0.9 (09 Jan 2003) . . 976
                                   co                            ca
xxvii

        C.3.10 Altera¸˜es na distribui¸˜o 4.0.8 (07 Jan 2003)
                                    co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977
        C.3.11 Altera¸˜es na distribui¸˜o 4.0.7 (20 Dec 2002)
                                    co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977
        C.3.12 Altera¸˜es na distribui¸˜o 4.0.6 (14 Dec 2002:
                                    co                            ca
                 Gamma) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 978
        C.3.13 Altera¸˜es na distribui¸˜o 4.0.5 (13 Nov 2002)
                                    co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 979
        C.3.14 Altera¸˜es na distribui¸˜o 4.0.4 (29 Sep 2002)
                                    co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 981
        C.3.15 Altera¸˜es na distribui¸˜o 4.0.3 (26 Aug 2002:
                                    co                            ca
                 Beta) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 983
        C.3.16 Altera¸˜es na distribui¸˜o 4.0.2 (01 Jul 2002) . . 985
                                    co                            ca
        C.3.17 Altera¸˜es na distribui¸˜o 4.0.1 (23 Dec 2001)
                                    co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 988
        C.3.18 Altera¸˜es na distribui¸˜o 4.0.0 (Oct 2001: Alpha)
                                    co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 989
C.4 Altera¸˜es na distribui¸˜o 3.23.x (Recent; still supported)
                 co                            ca
    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
        C.4.1 Altera¸˜es na distribui¸˜o 3.23.59 (not released yet)
                                  co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
        C.4.2 Altera¸˜es na distribui¸˜o 3.23.58 (11 Sep 2003)
                                  co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 992
        C.4.3 Altera¸˜es na distribui¸˜o 3.23.57 (06 Jun 2003)
                                  co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 992
        C.4.4 Altera¸˜es na distribui¸˜o 3.23.56 (13 Mar 2003)
                                  co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 993
        C.4.5 Altera¸˜es na distribui¸˜o 3.23.55 (23 Jan 2003)
                                  co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 994
        C.4.6 Altera¸˜es na distribui¸˜o 3.23.54 (05 Dec 2002)
                                  co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 995
        C.4.7 Altera¸˜es na distribui¸˜o 3.23.53 (09 Oct 2002)
                                  co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 996
        C.4.8 Altera¸˜es na distribui¸˜o 3.23.52 (14 Aug 2002)
                                  co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
        C.4.9 Altera¸˜es na distribui¸˜o 3.23.51 (31 May 2002)
                                  co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
        C.4.10 Altera¸˜es na distribui¸˜o 3.23.50 (21 Apr 2002)
                                    co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 998
        C.4.11 Altera¸˜es na distribui¸˜o 3.23.49 . . . . . . . . . . . . 999
                                    co                            ca
        C.4.12 Altera¸˜es na distribui¸˜o 3.23.48 (07 Feb 2002)
                                    co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 999
        C.4.13 Altera¸˜es na distribui¸˜o 3.23.47 (27 Dec 2001)
                                    co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
        C.4.14 Altera¸˜es na distribui¸˜o 3.23.46 (29 Nov 2001)
                                    co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
        C.4.15 Altera¸˜es na distribui¸˜o 3.23.45 (22 Nov 2001)
                                    co                            ca
                  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
xxviii

C.4.16 Altera¸˜es na distribui¸˜o 3.23.44 (31 Oct 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
C.4.17 Altera¸˜es na distribui¸˜o 3.23.43 (04 Oct 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002
C.4.18 Altera¸˜es na distribui¸˜o 3.23.42 (08 Sep 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1003
C.4.19 Altera¸˜es na distribui¸˜o 3.23.41 (11 Aug 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1004
C.4.20 Altera¸˜es na distribui¸˜o 3.23.40 . . . . . . . . . . . 1004
                       co                            ca
C.4.21 Altera¸˜es na distribui¸˜o 3.23.39 (12 Jun 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1005
C.4.22 Altera¸˜es na distribui¸˜o 3.23.38 (09 May 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1005
C.4.23 Altera¸˜es na distribui¸˜o 3.23.37 (17 Apr 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006
C.4.24 Altera¸˜es na distribui¸˜o 3.23.36 (27 Mar 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1007
C.4.25 Altera¸˜es na distribui¸˜o 3.23.35 (15 Mar 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1007
C.4.26 Altera¸˜es na distribui¸˜o 3.23.34a . . . . . . . . . . 1008
                       co                            ca
C.4.27 Altera¸˜es na distribui¸˜o 3.23.34 (10 Mar 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1008
C.4.28 Altera¸˜es na distribui¸˜o 3.23.33 (09 Feb 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
C.4.29 Altera¸˜es na distribui¸˜o 3.23.32 (22 Jan 2001:
                       co                            ca
    Production) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010
C.4.30 Altera¸˜es na distribui¸˜o 3.23.31 (17 Jan 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010
C.4.31 Altera¸˜es na distribui¸˜o 3.23.30 (04 Jan 2001)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
C.4.32 Altera¸˜es na distribui¸˜o 3.23.29 (16 Dec 2000)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012
C.4.33 Altera¸˜es na distribui¸˜o 3.23.28 (22 Nov 2000:
                       co                            ca
    Gamma) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1013
C.4.34 Altera¸˜es na distribui¸˜o 3.23.27 (24 Oct 2000)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015
C.4.35 Altera¸˜es na distribui¸˜o 3.23.26 (18 Oct 2000)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015
C.4.36 Altera¸˜es na distribui¸˜o 3.23.25 (29 Sep 2000)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016
C.4.37 Altera¸˜es na distribui¸˜o 3.23.24 (08 Sep 2000)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017
C.4.38 Altera¸˜es na distribui¸˜o 3.23.23 (01 Sep 2000)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1018
C.4.39 Altera¸˜es na distribui¸˜o 3.23.22 (31 Jul 2000)
                       co                            ca
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1019
C.4.40 Altera¸˜es na distribui¸˜o 3.23.21 . . . . . . . . . . . 1019
                       co                            ca
C.4.41 Altera¸˜es na distribui¸˜o 3.23.20 . . . . . . . . . . . 1020
                       co                            ca
xxix

     C.4.42 Altera¸˜es na distribui¸˜o 3.23.19 . . . . . . . . . . . 1020
                             co                            ca
     C.4.43 Altera¸˜es na distribui¸˜o 3.23.18 . . . . . . . . . . . 1021
                             co                            ca
     C.4.44 Altera¸˜es na distribui¸˜o 3.23.17 . . . . . . . . . . . 1021
                             co                            ca
     C.4.45 Altera¸˜es na distribui¸˜o 3.23.16 . . . . . . . . . . . 1022
                             co                            ca
     C.4.46 Altera¸˜es na distribui¸˜o 3.23.15 (May 2000:
                             co                            ca
          Beta) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1022
     C.4.47 Altera¸˜es na distribui¸˜o 3.23.14 . . . . . . . . . . . 1023
                             co                            ca
     C.4.48 Altera¸˜es na distribui¸˜o 3.23.13 . . . . . . . . . . . 1024
                             co                            ca
     C.4.49 Altera¸˜es na distribui¸˜o 3.23.12 (07 Mar 2000)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024
     C.4.50 Altera¸˜es na distribui¸˜o 3.23.11 . . . . . . . . . . . 1025
                             co                            ca
     C.4.51 Altera¸˜es na distribui¸˜o 3.23.10 . . . . . . . . . . . 1025
                             co                            ca
     C.4.52 Altera¸˜es na distribui¸˜o 3.23.9 . . . . . . . . . . . . 1025
                             co                            ca
     C.4.53 Altera¸˜es na distribui¸˜o 3.23.8 (02 Jan 2000)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026
     C.4.54 Altera¸˜es na distribui¸˜o 3.23.7 (10 Dec 1999)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1027
     C.4.55 Altera¸˜es na distribui¸˜o 3.23.6 . . . . . . . . . . . . 1027
                             co                            ca
     C.4.56 Altera¸˜es na distribui¸˜o 3.23.5 (20 Oct 1999)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1028
     C.4.57 Altera¸˜es na distribui¸˜o 3.23.4 (28 Sep 1999)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
     C.4.58 Altera¸˜es na distribui¸˜o 3.23.3 . . . . . . . . . . . . 1029
                             co                            ca
     C.4.59 Altera¸˜es na distribui¸˜o 3.23.2 (09 Aug 1999)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1030
     C.4.60 Altera¸˜es na distribui¸˜o 3.23.1 . . . . . . . . . . . . 1031
                             co                            ca
     C.4.61 Altera¸˜es na distribui¸˜o 3.23.0 (05 Aug 1999:
                             co                            ca
          Alpha) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1031
C.5 Altera¸˜es na distribui¸˜o 3.22.x (Old; discontinued) . . . 1033
          co                            ca
     C.5.1 Altera¸˜es na distribui¸˜o 3.22.35 . . . . . . . . . . . . 1033
                           co                            ca
     C.5.2 Altera¸˜es na distribui¸˜o 3.22.34 . . . . . . . . . . . . 1033
                           co                            ca
     C.5.3 Altera¸˜es na distribui¸˜o 3.22.33 . . . . . . . . . . . . 1033
                           co                            ca
     C.5.4 Altera¸˜es na distribui¸˜o 3.22.32 (14 Feb 2000)
                           co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1033
     C.5.5 Altera¸˜es na distribui¸˜o 3.22.31 . . . . . . . . . . . . 1034
                           co                            ca
     C.5.6 Altera¸˜es na distribui¸˜o 3.22.30 . . . . . . . . . . . . 1034
                           co                            ca
     C.5.7 Altera¸˜es na distribui¸˜o 3.22.29 (02 Jan 2000)
                           co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1034
     C.5.8 Altera¸˜es na distribui¸˜o 3.22.28 (20 Oct 1999)
                           co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1034
     C.5.9 Altera¸˜es na distribui¸˜o 3.22.27 . . . . . . . . . . . . 1034
                           co                            ca
     C.5.10 Altera¸˜es na distribui¸˜o 3.22.26 (16 Sep 1999)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035
     C.5.11 Altera¸˜es na distribui¸˜o 3.22.25 . . . . . . . . . . . 1035
                             co                            ca
     C.5.12 Altera¸˜es na distribui¸˜o 3.22.24 (05 Jul 1999)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035
     C.5.13 Altera¸˜es na distribui¸˜o 3.22.23 (08 Jun 1999)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035
xxx

     C.5.14 Altera¸˜es na distribui¸˜o 3.22.22 (30 Apr 1999)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036
     C.5.15 Altera¸˜es na distribui¸˜o 3.22.21 . . . . . . . . . . . 1036
                             co                            ca
     C.5.16 Altera¸˜es na distribui¸˜o 3.22.20 (18 Mar 1999)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036
     C.5.17 Altera¸˜es na distribui¸˜o 3.22.19 (Mar 1999:
                             co                            ca
          Production) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036
     C.5.18 Altera¸˜es na distribui¸˜o 3.22.18 . . . . . . . . . . . 1036
                             co                            ca
     C.5.19 Altera¸˜es na distribui¸˜o 3.22.17 . . . . . . . . . . . 1037
                             co                            ca
     C.5.20 Altera¸˜es na distribui¸˜o 3.22.16 (Feb 1999:
                             co                            ca
          Gamma) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1037
     C.5.21 Altera¸˜es na distribui¸˜o 3.22.15 . . . . . . . . . . . 1037
                             co                            ca
     C.5.22 Altera¸˜es na distribui¸˜o 3.22.14 . . . . . . . . . . . 1038
                             co                            ca
     C.5.23 Altera¸˜es na distribui¸˜o 3.22.13 . . . . . . . . . . . 1038
                             co                            ca
     C.5.24 Altera¸˜es na distribui¸˜o 3.22.12 . . . . . . . . . . . 1038
                             co                            ca
     C.5.25 Altera¸˜es na distribui¸˜o 3.22.11 . . . . . . . . . . . 1039
                             co                            ca
     C.5.26 Altera¸˜es na distribui¸˜o 3.22.10 . . . . . . . . . . . 1039
                             co                            ca
     C.5.27 Altera¸˜es na distribui¸˜o 3.22.9 . . . . . . . . . . . . 1040
                             co                            ca
     C.5.28 Altera¸˜es na distribui¸˜o 3.22.8 . . . . . . . . . . . . 1040
                             co                            ca
     C.5.29 Altera¸˜es na distribui¸˜o 3.22.7 (Sep 1998: Beta)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041
     C.5.30 Altera¸˜es na distribui¸˜o 3.22.6 . . . . . . . . . . . . 1041
                             co                            ca
     C.5.31 Altera¸˜es na distribui¸˜o 3.22.5 . . . . . . . . . . . . 1042
                             co                            ca
     C.5.32 Altera¸˜es na distribui¸˜o 3.22.4 . . . . . . . . . . . . 1043
                             co                            ca
     C.5.33 Altera¸˜es na distribui¸˜o 3.22.3 . . . . . . . . . . . . 1044
                             co                            ca
     C.5.34 Altera¸˜es na distribui¸˜o 3.22.2 . . . . . . . . . . . . 1044
                             co                            ca
     C.5.35 Altera¸˜es na distribui¸˜o 3.22.1 (Jun 1998: Alpha)
                             co                            ca
           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1045
     C.5.36 Altera¸˜es na distribui¸˜o 3.22.0 . . . . . . . . . . . . 1045
                             co                            ca
C.6 Altera¸˜es na distribui¸˜o 3.21.x . . . . . . . . . . . . . . . . . . . . . . 1047
          co                            ca
     C.6.1 Altera¸˜es na distribui¸˜o 3.21.33 . . . . . . . . . . . . 1047
                           co                            ca
     C.6.2 Altera¸˜es na distribui¸˜o 3.21.32 . . . . . . . . . . . . 1047
                           co                            ca
     C.6.3 Altera¸˜es na distribui¸˜o 3.21.31 . . . . . . . . . . . . 1047
                           co                            ca
     C.6.4 Altera¸˜es na distribui¸˜o 3.21.30 . . . . . . . . . . . . 1048
                           co                            ca
     C.6.5 Altera¸˜es na distribui¸˜o 3.21.29 . . . . . . . . . . . . 1048
                           co                            ca
     C.6.6 Altera¸˜es na distribui¸˜o 3.21.28 . . . . . . . . . . . . 1048
                           co                            ca
     C.6.7 Altera¸˜es na distribui¸˜o 3.21.27 . . . . . . . . . . . . 1049
                           co                            ca
     C.6.8 Altera¸˜es na distribui¸˜o 3.21.26 . . . . . . . . . . . . 1049
                           co                            ca
     C.6.9 Altera¸˜es na distribui¸˜o 3.21.25 . . . . . . . . . . . . 1049
                           co                            ca
     C.6.10 Altera¸˜es na distribui¸˜o 3.21.24 . . . . . . . . . . . 1050
                             co                            ca
     C.6.11 Altera¸˜es na distribui¸˜o 3.21.23 . . . . . . . . . . . 1050
                             co                            ca
     C.6.12 Altera¸˜es na distribui¸˜o 3.21.22 . . . . . . . . . . . 1050
                             co                            ca
     C.6.13 Altera¸˜es na distribui¸˜o 3.21.21a . . . . . . . . . . 1051
                             co                            ca
     C.6.14 Altera¸˜es na distribui¸˜o 3.21.21 . . . . . . . . . . . 1051
                             co                            ca
     C.6.15 Altera¸˜es na distribui¸˜o 3.21.20 . . . . . . . . . . . 1051
                             co                            ca
     C.6.16 Altera¸˜es na distribui¸˜o 3.21.19 . . . . . . . . . . . 1052
                             co                            ca
     C.6.17 Altera¸˜es na distribui¸˜o 3.21.18 . . . . . . . . . . . 1052
                             co                            ca
     C.6.18 Altera¸˜es na distribui¸˜o 3.21.17 . . . . . . . . . . . 1052
                             co                            ca
xxxi

     C.6.19 Altera¸˜es na distribui¸˜o 3.21.16 . . . . . . . . . . .
                     co               ca                                            1053
     C.6.20 Altera¸˜es na distribui¸˜o 3.21.15 . . . . . . . . . . .
                     co               ca                                            1053
     C.6.21 Altera¸˜es na distribui¸˜o 3.21.14b . . . . . . . . . .
                     co               ca                                            1054
     C.6.22 Altera¸˜es na distribui¸˜o 3.21.14a . . . . . . . . . .
                     co               ca                                            1054
     C.6.23 Altera¸˜es na distribui¸˜o 3.21.13 . . . . . . . . . . .
                     co               ca                                            1054
     C.6.24 Altera¸˜es na distribui¸˜o 3.21.12 . . . . . . . . . . .
                     co               ca                                            1055
     C.6.25 Altera¸˜es na distribui¸˜o 3.21.11 . . . . . . . . . . .
                     co               ca                                            1055
     C.6.26 Altera¸˜es na distribui¸˜o 3.21.10 . . . . . . . . . . .
                     co               ca                                            1056
     C.6.27 Altera¸˜es na distribui¸˜o 3.21.9 . . . . . . . . . . . .
                     co               ca                                            1056
     C.6.28 Altera¸˜es na distribui¸˜o 3.21.8 . . . . . . . . . . . .
                     co               ca                                            1056
     C.6.29 Altera¸˜es na distribui¸˜o 3.21.7 . . . . . . . . . . . .
                     co               ca                                            1057
     C.6.30 Altera¸˜es na distribui¸˜o 3.21.6 . . . . . . . . . . . .
                     co               ca                                            1057
     C.6.31 Altera¸˜es na distribui¸˜o 3.21.5 . . . . . . . . . . . .
                     co               ca                                            1057
     C.6.32 Altera¸˜es na distribui¸˜o 3.21.4 . . . . . . . . . . . .
                     co               ca                                            1058
     C.6.33 Altera¸˜es na distribui¸˜o 3.21.3 . . . . . . . . . . . .
                     co               ca                                            1058
     C.6.34 Altera¸˜es na distribui¸˜o 3.21.2 . . . . . . . . . . . .
                     co               ca                                            1059
     C.6.35 Altera¸˜es na distribui¸˜o 3.21.0 . . . . . . . . . . . .
                     co               ca                                            1059
C.7 Altera¸˜es na distribui¸˜o 3.20.x . . . . . . . . . . . . . . . . . . . . . .
          co               ca                                                       1060
     C.7.1 Altera¸˜es na distribui¸˜o 3.20.18 . . . . . . . . . . . .
                   co               ca                                              1060
     C.7.2 Altera¸˜es na distribui¸˜o 3.20.17 . . . . . . . . . . . .
                   co               ca                                              1061
     C.7.3 Altera¸˜es na distribui¸˜o 3.20.16 . . . . . . . . . . . .
                   co               ca                                              1062
     C.7.4 Altera¸˜es na distribui¸˜o 3.20.15 . . . . . . . . . . . .
                   co               ca                                              1062
     C.7.5 Altera¸˜es na distribui¸˜o 3.20.14 . . . . . . . . . . . .
                   co               ca                                              1062
     C.7.6 Altera¸˜es na distribui¸˜o 3.20.13 . . . . . . . . . . . .
                   co               ca                                              1063
     C.7.7 Altera¸˜es na distribui¸˜o 3.20.11 . . . . . . . . . . . .
                   co               ca                                              1063
     C.7.8 Altera¸˜es na distribui¸˜o 3.20.10 . . . . . . . . . . . .
                   co               ca                                              1064
     C.7.9 Altera¸˜es na distribui¸˜o 3.20.9 . . . . . . . . . . . . .
                   co               ca                                              1064
     C.7.10 Altera¸˜es na distribui¸˜o 3.20.8 . . . . . . . . . . . .
                     co               ca                                            1064
     C.7.11 Altera¸˜es na distribui¸˜o 3.20.7 . . . . . . . . . . . .
                     co               ca                                            1064
     C.7.12 Altera¸˜es na distribui¸˜o 3.20.6 . . . . . . . . . . . .
                     co               ca                                            1065
     C.7.13 Altera¸˜es na distribui¸˜o 3.20.3 . . . . . . . . . . . .
                     co               ca                                            1066
     C.7.14 Altera¸˜es na distribui¸˜o 3.20.0 . . . . . . . . . . . .
                     co               ca                                            1067
C.8 Altera¸˜es na distribui¸˜o 3.19.x . . . . . . . . . . . . . . . . . . . . . .
          co               ca                                                       1067
     C.8.1 Altera¸˜es na distribui¸˜o 3.19.5 . . . . . . . . . . . . .
                   co               ca                                              1067
     C.8.2 Altera¸˜es na distribui¸˜o 3.19.4 . . . . . . . . . . . . .
                   co               ca                                              1068
     C.8.3 Altera¸˜es na distribui¸˜o 3.19.3 . . . . . . . . . . . . .
                   co               ca                                              1068
xxxii

Apˆndice D Portando para Outros Sistemas
  e
    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1069
        D.1 Depurando um Servidor MySQL . . . . . . . . . . . . . . . . . . . . . . 1070
             D.1.1 Compilando o MYSQL para Depura¸˜o . . . . . . . 1070         ca
             D.1.2 Criando Arquivos Trace (Rastreamento) . . . . . . 1071
             D.1.3 Depurando o mysqld no gdb . . . . . . . . . . . . . . . . . 1072
             D.1.4 Usando Stack Trace . . . . . . . . . . . . . . . . . . . . . . . . . 1073
             D.1.5 Usando Arquivos de Log para Encontrar a Causa
                  dos Erros no mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . 1074
             D.1.6 Fazendo um Caso de Teste Se Ocorre um
                  Corrompimento de Tabela . . . . . . . . . . . . . . . . . . . . . . 1075
        D.2 Depurando um cliente MySQL. . . . . . . . . . . . . . . . . . . . . . . . 1076
        D.3 O Pacote DBUG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1076
        D.4 M´todos de Lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1078
              e
        D.5 Coment´rios Sobre Threads RTS. . . . . . . . . . . . . . . . . . . . . . 1079
                    a
        D.6 Diferen¸a en Entre Alguns Pacotes de Threads . . . . . . . . . 1081
                   c

Apˆndice E Vari´veis de Ambientes do MySQL
  e                        a
    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1083

Apˆndice F Sintaxe de Express˜es Regulares do
  e                                            o
    MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1084

Apˆndice G GPL - Licen¸a P´ blica Geral do
  e                                  c       u
    GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1087

´
Indices dos Comandos, Tipos e Fun¸oes SQL                     c˜
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1093

Concept Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1102
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                     1



1 Informa¸˜es Gerais
         co
O programa MySQL R ´ um servidor robusto de bancos de dados SQL (Structured Query
                      e
Language - Linguagem Estruturada para Pesquisas) muito r´pido, multi-tarefa e multi-
                                                          a
usu´rio. O Servidor MySQL pode ser usado em sistemas de produ¸˜o com alta carga e
   a                                                           ca
    a    ´
miss˜o critica bem como pode ser embutido em programa de uso em massa. MySQL ´ uma
                                                                              e
marca registrada da MySQL AB.
O programa MySQL ´ de Licen¸a Dupla. Os usu´rios podem escolher entre usar o pro-
                    e          c                  a
grama MySQL como um produto Open Source/Free Software sob os termos da GNU General
Public License (http://www.fsf.org/licenses/) ou podem comprar uma licen¸a com-
                                                                              c
ercial padr˜o da MySQL AB. Veja Se¸˜o 1.4 [Licensing and Support], P´gina 16.
           a                      ca                                a
O site web do MySQL (http://www.mysql.com/) disp˜e das ultimas informa¸˜es sobre o
                                                o      ´              co
programa MySQL.
A seguinte lista descreve algumas se¸˜es de particular interesse neste manual:
                                    co
 • Para informa¸˜es sobre a empresa por tr´s do Servidor do Banco de Dados MySQL,
                 co                          a
   veja Se¸˜o 1.3 [What is MySQL AB], P´gina 12.
          ca                              a
 • Para discuss˜es das capacidades do Servidor do Banco de Dados MySQL, veja
                 o
   Se¸˜o 1.2.2 [Features], P´gina 6.
     ca                     a
 • Para instru¸˜es de instala¸˜o, veja Cap´
              co              ca          “ptexi tulo 2 [Installing], P´gina 60.
                                                                       a
 • Para dicas sobre a portabilidade do Servidor do Banco de Dados MySQL para novas
   arquiteturas ou sistemas operacionais, veja Apˆndice D [Porting], P´gina 1069.
                                                  e                     a
 • Para informa¸˜es sobre a atualiza¸˜o da vers˜o 4.0, veja Se¸˜o 2.5.1 [Upgrading-from-
                  co                  ca        a              ca
   4.0], P´gina 120.
          a
 • Para informa¸˜es sobre a atualiza¸˜o da vers˜o 3.23, veja Se¸˜o 2.5.2 [Upgrading-from-
                 co                   ca       a               ca
   3.23], P´gina 123.
            a
 • Para informa¸˜es sobre a atualiza¸˜o da vers˜o 3.22, veja Se¸˜o 2.5.3 [Upgrading-from-
                 co                   ca       a               ca
   3.22], P´gina 127.
            a
                                                                                    ´
 • Para um tutorial de introdu¸˜o ao Servidor do Banco de Dados MySQL, veja Cap“ptexi
                               ca
   tulo 3 [Tutorial], P´gina 169.
                       a
 • Para exemplos de SQL e informa¸˜es sobre benchmarks, veja o diret´rio de benchmarks
                                    co                                 o
   (‘sql-bench’ na distribui¸˜o).
                             ca
 • Para o hist´rico de novos recursos e corre¸˜es de erros, veja Apˆndice C [News],
                o                               co                       e
   P´gina 948.
     a
 • Para uma lista de erros atualmente conhecidos e mal-funcionamento, veja Se¸˜o 1.8.6
                                                                                 ca
   [Bugs], P´gina 53.
              a
 • Para projetos futuros, veja Se¸˜o 1.6 [TODO], P´gina 26.
                                  ca                a
 • Para ver a lista de todos os colaboradores deste projeto, veja Apˆndice B [Credits],
                                                                       e
   P´gina 936.
     a
Importante:
Relat´rios de erros (tamb´m chamados bugs), bem como d´vidas e coment´rios, devem ser
     o                    e                              u                a
enviados para a lista de email geral do MySQL. Veja Se¸˜o 1.7.1.1 [Mailing-list], P´gina 33.
                                                      ca                           a
Veja Se¸˜o 1.7.1.3 [Bug reports], P´gina 36.
       ca                           a
2                                     MySQL Technical Reference for Version 5.0.0-alpha



O script mysqlbug deve ser usado para gerar comunicados de erros no Unix. (A distribui¸˜o
                                                                                      ca
do Windows cont´m um arquivo ‘mysqlbug.txt’ no diret´rio base que pode ser usado como
                e                                     o
um template para um relat´rio de erro.
                           o
Em distribui¸˜es fonte, o script mysqlbug pode ser encontrado no diret´rio ‘scripts’. Para
             co                                                       o
distribui¸˜es bin´rias, o mysqlbug pode ser encontrado no diret´rio ‘bin’ (‘/usr/bin’ para
         co      a                                             o
o pacote RMP do servidor MySQL.
Se vocˆ encontrou um erro de seguran¸a no Servidor MySQL, vocˆ deve enviar um email
      e                             c                        e
para security@mysql.com.

1.1 Sobre Este Manual

Este ´ o manual de referˆncia MySQL; ele documenta o MySQL at´ a vers˜o 5.0.0-alpha.
     e                    e                                      e       a
Mudan¸as funcionais s˜o sempre indicadas com referˆncia a vers˜o, assim este manual
       c              a                             e            a
tamb´m pode ser utiliado caso vocˆ esteja utilizando uma vers˜o mais antiga do MySQL
     e                           e                            a
(como 3.23 ou 4.0-produ¸˜o). Tamb´m a referˆncias a vers˜o 5.0 (desenvolvimento).
                        ca       e         e            a
Sendo um manual de referˆncia, ele n˜o fornece instru¸˜es gerais sobre SQL ou conceitos de
                          e         a                co
banco de dados relacionais.
Como o Programa da Banco de Dados MySQL est´ sob constante desenvolvimento, o manual
                                            a
tamb´m ´ atualizado freq¨entemente. A vers˜o mais recente deste manual est´ dispon´
    e e                 u                 a                               a       ivel
em http://www.mysql.com/documentation/ em diferentes formatos, incluindo HTML,
PDF, e vers˜es HLP do Windows.
           o
O documento original ´ uma arquivo Texinfo. A vers˜o HTML ´ produzida automatica-
                     e                             a         e
mente usando uma vers˜o modificada do texi2html. A vers˜o texto e Info s˜o produzidas
                      a                                 a              a
com makeinfo. A vers˜o PostScript ´ produzida usando texi2dvi e dvips. A vers˜o PDF
                    a             e                                          a
´ produzida com pdftex.
e
Se vocˆ tiver dificuldades de encontrar informa¸˜es no manual, vocˆ pode tentar nossa
       e                                      co                 e
vers˜o com busca em http://www.mysql.com/doc/.
    a
Se vocˆ tiver qualquer sugest˜o a respeito de adi¸˜es e corre¸˜es neste manual, por favor
       e                     a                   co          co
envie-os para a equipe de documenta¸˜o em docs@mysql.com.
                                    ca
Este manual foi inicialmente escrito por David Axmark e Michael (Monty) Widenius.
Atualmente ´ mantido pela Equipe de Documenta¸˜o da MySQL, que conta com Arjen
            e                                    ca
Lentz, Paul DuBois e Stefan Hinz. Para outros colaboradores, veja Apˆndice B [Credits],
                                                                    e
P´gina 936.
 a
Os direitos autorais (2003) deste manual pertence a compania Sueca MySQL AB.         Veja
Se¸˜o 1.4.2 [Direitos Autorais], P´gina 17.
  ca                              a

1.1.1 Conven¸˜es Usadas Neste Manual
            co

Este manual utiliza algumas conven¸˜es tipogr´ficas:
                                  co         a
constant    Fonte de largura fixa ´ usada para nomes de comandos e op¸˜es; instru¸˜es
                                 e                                       co           co
            SQL; nomes de bancos de dados, tabelas e colunas; c´digo C e Perl; e vari´veis
                                                               o                     a
            de ambiente. Exemplo: “Para ver como o mysqladmin funciona, execute-o com
            a op¸˜o --help.”
                ca
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                      3



‘filename’
             Fonte de largura fixa com aspas ´ usada para nomes e caminhos de arquivos.
                                             e
             Exemplo: “A distribui¸˜o ´ instalada sobre o diret´rio ‘/usr/local’.”
                                  ca e                         o
‘c’          Fonte de largura constante com aspas ´ tamb´m usada para indicar sequˆncias
                                                  e     e                         e
             de caracteres. Exemplo: “Para especificar um meta caracter, use o caractere
             ‘%’.”
italic       Fonte It´lica ´ usada para dar ˆnfase, como aqui.
                     a     e                e
boldface     Fonte em negrito ´ usada em cabe¸alhos de tabela e indicar ˆnfase especial.
                              e              c                          e
Quando um comando deve ser executado por um programa, ele ´ indicado por um prompt
                                                                  e
antes do comando. Por exemplo, shell> indica um comando que ´ executado do seu shell
                                                                     e
atual e mysql> indica um comando que ´ executado no programa cliente mysql;
                                          e
       shell> digite um comando shell aqui
       mysql> digite um comando mysql aqui
A “shell” ´ seu interpretador de comando. No Unix, ele ´ normalmente um programa
            e                                                  e
como sh ou csh. No Windows, o equivalente ´ o command.com ou cmd.exe, normalmente
                                                 e
executado como um console do Windows.
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                                                          e
para configurar uma vari´vel de ambiente e executar um comando se parece com o listado
                           a
abaixo na sintaxe Bourne Shell:
       shell> NOMEVAR=valor algum_comando
Para csh ou tcsh, execute a sequˆncia desta forma:
                                    e
       shell> setenv NOMEVAR valor
       shell> algum_comando
Frequentemente, nomes de bancos de dados, tabelas e colunas devem ser substitu´      idos nos
comandos. Para indicar que as substitui¸˜es s˜o necess´rias, este manual usa nome_db,
                                            co      a       a
nome_tbl e nome_col. Por exemplo, vocˆ pode encontrar uma express˜o assim:
                                          e                              a
       mysql> SELECT nome_col FROM nome_bd.nome_tbl;
Isso significa que se vocˆ estiver trabalhando numa express˜o similar, forneceria seu pr´prio
                         e                                  a                           o
nome de banco de dados, tabela e colunas, talvez assim:
       mysql> SELECT nome_autor FROM biblio_bd.lista_autor;
SQL keywords n˜o caso sensitivas e podem ser escritas em mai´scula ou min´scula. Este
                  a                                               u             u
manual utiliza letras mai´sculas.
                           u
Em descri¸˜es de sintaxe, colchetes (‘[’ e ‘]’) s˜o usados para indicar palavras ou cl´usulas
           co                                    a                                    a
opcionais. Por exemplo, na seguinte instru¸˜o, IF EXISTS ´ opcional:
                                             ca              e
       DROP TABLE [IF EXISTS] nome_tbl
Quando elementos da sintaxe possuem mais de uma alternativa, elas s˜o separados por
                                                                            a
barras verticais (‘|’). Quando um menbro de um conjunto de op¸˜es pode ser escolhido, as
                                                                  co
alternativas s˜o listadas em colchetes (‘[’ e ‘]’):
              a
       TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
Quando um membro de um conjunto de op¸˜es deve ser selecionado, as alternativas s˜o
                                               co                                          a
listadas dentro de chaves (‘{’ e ‘}’):
       {DESCRIBE | DESC} nome_tbl {nome_col | metacar}
4                                    MySQL Technical Reference for Version 5.0.0-alpha


1.2 Vis˜o Geral do Sistema de Gerenciamento de Banco de
       a
    Dados MySQL

MySQL, o mais popular sistema de gerenciamento de banco de dados SQL Open Source, ´   e
desenvolvido, distribu´ e tem suporte da MySQL AB. A MySQL AB ´ uma empresa comercial,
                      ido                                     e
fundada pelos desenvolvedores do MySQL, cujos neg´cios ´ fornecer servi¸os relacionados
                                                   o    e              c
ao sistema de gerenciamento de banco de dados MySQL. Veja Se¸˜o 1.3 [What is MySQL
                                                              ca
AB], P´gina 12.
       a
O web site do MySQL (http://www.mysql.com/) fornece informa¸˜es mais recentes sobre e
                                                             co
programa MySQL e a MySQL AB.
O MySQL ´ um sistema de gerenciamento de bancos de dados.
        e
         Um banco de dados ´ uma cole¸˜o de dados estruturados. Ele pode ser qual-
                              e         ca
         quer coisa desde uma simples lista de compras a uma galeria de imagens ou
         a grande quantidade de informa¸˜o da sua rede coorporativa. Para adicionar,
                                        ca
         acessar, e processar dados armazenados em um banco de dados de um com-
         putador, vocˆ necessita de um sistema de gerenciamento de bancos de dados
                      e
         como o Servidor MySQL. Como os computadores s˜o muito bons em lidar com
                                                         a
         grandes quantidades de dados, o gerenciamento de bancos de dados funciona
         como a engrenagem central na computa¸˜o, seja como utilit´rios independentes
                                               ca                 a
         ou como partes de outras aplica¸˜es.
                                        co
O MySQL ´ um sistema de gerenciamento de bancos de dados relacional.
        e
         Um banco de dados relacional armazena dados em tabelas separadas em vez
         de colocar todos os dados um s´ local. Isso proporciona velocidade e flexibil-
                                        o
         idade. A parte SQL do “MySQL” atenda pela “Structured Query Language -
         Linguagem Estrutural de Consultas”. SQL ´ linguagem padr˜o mais comum
                                                      e                 a
         usada para acessar banco de dados e ´ definida pelo Padr˜o ANSI/ISO SQL. (O
                                             e                   a
         padr˜o SQL est´ vem evoluindo desde 1986 e existem diversas vers˜es. Neste
              a          a                                                   o
         manual, ”SQL-92” se refere ao padr˜o liberado em 1992, ”SQL-99” se refere ao
                                            a
         padr˜o liberado em 1999, e ”SQL:2003” se refere a vers˜o do que esperamos que
              a                                                a
         seja liberado no meio de 2003. N´s usamos o termo ”o padr~o SQL” indicando
                                         o                           a
         a vers˜o atual do Padr˜o SQL em qualquer momento).
                a               a
O ´ MySQL um software Open Source.
  e
         Open Source significa que ´ poss´ para qualquer um usar e modificar o pro-
                                    e    ivel
         grama. Qualquer pessoa pode fazer download do MySQL pela Internet e us´-lo
                                                                                 a
         sem pagar nada. Se vocˆ quiser, vocˆ pode estudar o c´digo fonte e alter´-lo
                                  e           e                o                 a
         para adequ´-lo `s suas necessidades. O MySQL usa a GPL (GNU General Public
                    a a
         License - Licen¸a P´blica Geral GNU)
                           c u                       http://www.fsf.org/licenses,
         para definir o que vocˆ pode e n˜o pode fazer com o software em diferentes
                               e           a
         situa¸˜es. Se vocˆ sentir desconforto com a GPL ou precisar embutir o MySQL
              co           e
         em uma aplica¸˜o comercial vocˆ pode adquirir a vers˜o comercial licenciada
                        ca               e                    a
         conosco. Veja Se¸˜o 1.4.3 [Licen¸as MySQL], P´gina 18.
                          ca             c             a
Por que usar o Banco de Dados MySQL?
           O servidor de banco de dados MySQL ´ extremamente r´pido, confi´vel, e f´cil
                                                  e               a           a      a
           de usar. Se isto ´ o que vocˆ est´ procurando, vocˆ deveria experiment´-lo. O
                            e          e    a                e                   a
           Servidor MySQL tamb´m tem um conjunto de recursos muito pr´ticos desen-
                                  e                                         a
           volvidos com a coopera¸˜o de nossos usu´rios. Vocˆ pode encontrar compara-
                                    ca              a         e
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                    5



            tivos de performance do Servidor MySQL com outros gerenciadores de bancos
            de dados na nossa p´gina de benchmark Veja Se¸˜o 5.1.4 [MySQL Benchmarks],
                               a                         ca
            P´gina 422.
              a
            O Servidor MySQL foi desenvolvido originalmente para lidar com bancos de
            dados muito grandes de maneira muito mais r´pida que as solu¸˜es existentes
                                                          a              co
            e tem sido usado em ambientes de produ¸˜o de alta demanda por diversos
                                                       ca
            anos de maneira bem sucedida. Apesar de estar em constante desenvolvimento,
            o Servidor MySQL oferece hoje um rico e proveitoso conjunto de fun¸˜es. A
                                                                                co
            conectividade, velocidade, e seguran¸a fazem com que o MySQL seja altamente
                                                c
            adapt´vel para acessar bancos de dados na Internet.
                 a
As caracter´
           isticas t´cnicas do MySQL
                    e
            Para informa¸˜es t´cnicas avan¸adas, veja Cap´
                           co    e             c               “ptexi tulo 6 [Reference],
            P´gina 469.
              a                 O Programa de Banco de Dados MySQL ´ um sistema
                                                                          e
            cliente/servidor que consiste de um servidor SQL multi-tarefa que suporta
            acessos diferentes, diversos programas clientes e bibliotecas, ferramentas
            administrativas e diversas interfaces de programa¸˜o (API’s).
                                                             ca
            Tamb´m concedemos o Servidor MySQL como uma biblioteca multi-tarefa que
                 e
            vocˆ pode ligar ` sua aplica¸˜o para chegar a um produto mais r´pido, menor
               e            a           ca                                 a
            e mais f´cilmente gerenci´vel.
                    a                a
MySQL tem muitos softwares de colaboradores dispon´
                                                  ivel.
         ´
         E bem prov´vel que sua aplica¸˜o ou linguagem favorita j´ suporte o Servidor
                    a                 ca                         a
         de Banco de Dados MySQL.
A pron´ncia oficial do MySQL ´ “Mai Ess Que Ell” (e n˜o MAI-SEQUEL). Mas n´s n˜o
       u                     e                      a                    o a
ligamos se vocˆ pronunciar MAI-SEQUEL ou de outra forma qualquer.
              e

1.2.1 Hist´ria do MySQL
          o

Quando come¸amos, t´
              c        inhamos a inten¸˜o de usar o mSQL para conectar `s nossas tabelas
                                        ca                                a
                                            ´ (ISAM). Entretanto, depois de alguns testes,
utilizando nossas r´pidas rotinas de baixo nivel
                   a
chegamos a conclus˜o que o mSQL n˜o era r´pido e nem flex´
                     a                a        a               ivel 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
portabilidade para c´digos de terceiros que era escrito para uso com mSQL para ser portado
                     o
facilmente para uso com o MySQL.
A deriva¸˜o do nome MySQL n˜o ´ bem definida. Nosso diret´rio base e um grande n´mero
        ca                     a e                          o                     u
de nossas bibliotecas e ferramentas sempre tiveram o prefixo “my” por pelo menos 10 anos.
A filha de Monty tamb´m ganhou o nome My. Qual das duas originou o nome do MySQL
                        e
continua sendo um mist´rio, mesmo para n´s.
                         e                 o
O nome do golfinho do MySQL (nosso logo) ´ Sakila. Sakila foi escolhido pelos fun-
                                             e
dadores da MySQL AB de uma enorme lista de nomes sugeridos pelos usu´rios em nosso
                                                                         a
concurso "Name the Dolphin". O nome vencedor foi enviado por Ambrose Twebaze, um
desenvolvedor de programas open source de Swaziland, Africa. De acordo com Ambrose, o
nome Sakila tem as suas ra´ em SiSwati, a l´
                          izes              ingua local de Swaziland. Sakila ´ tamb´m o
                                                                             e     e
nome de uma cidade em Arusha, Tanzania, pr´xima ao pais
                                           o           ´ de or´
                                                              igem de Ambrose, Uganda.
6                                      MySQL Technical Reference for Version 5.0.0-alpha



1.2.2 As Principais Caracter´
                            isticas do MySQL

A seguinte lista descreve algumas das caracter´
                                              isticas mais importantes do Progrma de Banco
de Dados MySQL. Veja Se¸˜o 1.5.1 [MySQL 4.0 Nutshell], P´gina 22.
                           ca                                a
Portabilidade e
              •   Escrito em C e C++.
              •   Testado com um amplo faixa de compiladores diferentes.
              •   Funciona em diversas plataformas. Veja Se¸˜o 2.2.3 [Quais SO], P´gina 78.
                                                               ca                  a
              •   Utiliza o GNU Automake, Autoconf, e Libtool para portabilidade.
              •   APIs para C, C++, Eiffel, Java, Perl, PHP, Python, Ruby e Tcl est˜o     a
                  dispon´iveis. Veja Cap´ “ptexi tulo 12 [Clients], P´gina 772.
                                                                     a
             •    Suporte total a multi-threads usando threads diretamente no kernel. Isto
                  significa que se pode facilmente usar m´ltiplas CPUs, se dispon´
                                                            u                    ivel.
             •    Fornece mecanismos de armazenamento transacional e n˜o transacional.
                                                                             a
             •    Tabelas em disco (MyISAM) baseadas em ´rvores-B extremamente r´pidas
                                                              a                       a
                  com compress˜o de ´
                                 a      indices.
             •    ´
                  E relativamente f´cil se adicionar outro mecanismo de armazenamento.
                                      a
                  Isto ´ util se vocˆ quiser adicionar uma interface SQL a um banco de
                       e ´            e
                  dados caseiro.
             •    Um sistema de aloca¸˜o de mem´ria muito r´pido e baseado em pro-
                                          ca           o             a
                  cesso(thread).
             •    Joins muito r´pidas usando uma multi-join de leitura unica otimizada.
                                 a                                         ´
             •    Tabelas hash em mem´ria que s˜o usadas como tabelas tempor´rias.
                                          o          a                           a
             •    Fun¸˜es SQL s˜o implementadas por meio de uma biblioteca de classes
                      co           a
                  altamente otimizada e com o m´ximo de performance. Geralmente n˜o h´
                                                    a                                  a a
                  nenhuma aloca¸˜o de mem´ria depois da inicializa¸˜o da pesquisa.
                                   ca          o                        ca
             •    O c´digo do MySQL foi testado com Purify (um detector comercial de
                      o
                  falhas de mem´ria) e tamb´m com o Valgrind, uma ferramenta GPL
                                    o             e
                  (http://developer.kde.org/~sewardj/).
             •    Dispon´ como vers˜o cliente/servidor ou embutida(ligada).
                          ivel           a
Tipos de Coluna
             • Aceita diversos tipos de campos: tipos 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 e ENUM. Veja Se¸˜o 6.2 [Tipos de Coluna],
                                                              ca
                P´gina 482.
                 a
             • Registros de tamanhos fixos ou vari´veis.
                                                  a
Comandos e Fun¸˜es
              co
            • Completo suporte a operadores e fun¸˜es nas partes SELECT e WHERE das
                                                 co
              consultas. Por exemplo:
                    mysql> SELECT CONCAT(first_name, " ", last_name)
                         -> FROM nome_tbl
                         -> WHERE income/dependents > 10000 AND age > 30;
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                     7



              • Suporte pleno `s cl´usulas SQL GROUP BY e ORDER BY. Suporte para fun¸˜es
                               a a                                                     co
                de agrupamento (COUNT(), COUNT(DISTINCT ...), AVG(), STD(), SUM(),
                MAX() e MIN()).
              • Suporte para LEFT OUTER JOIN e RIGHT OUTER JOIN com as sintaxes SQL
                e ODBC.
              • Alias em tabelas e colunas s˜o dispon´
                                             a        iveis como definidos no padr˜o SQL92.
                                                                                 a
              • DELETE, INSERT, REPLACE, e UPDATE retornam o n´mero de linhas que
                                                                        u
                                               ´
                foram alteradas (afetadas). E poss´  ivel retornar o n´mero de linhas com
                                                                        u
                padr˜o coincidentes configurando um parˆmetro quando estiver conectando
                     a                                     a
                ao servidor.
              • O comando espec´    ifico do MySQL SHOW pode ser usado para devolver in-
                forma¸˜es sobre bancos de dados, tabelas e ´
                       co                                      indices. O comando EXPLAIN
                pode ser usado para determinar como o otimizador resolve a consulta.
              • Nomes de fun¸˜es n˜o conflitam com nomes de tabelas ou colunas. Por
                               co     a
                exemplo, ABS ´ um nome de campo v´lido. A unica restri¸˜o ´ que para uma
                              e                      a         ´          ca e
                chamada de fun¸˜o, espa¸os n˜o s˜o permitidos entre o nome da fun¸˜o e
                                 ca        c    a a                                   ca
                o ‘(’ que o segue. Veja Se¸˜o 6.1.7 [Palavras reservadas], P´gina 479.
                                            ca                               a
              • Vocˆ pode misturar tabelas de bancos de dados diferentes na mesma
                    e
                pesquisa (como na vers˜o 3.22).
                                         a
Seguran¸a
       c
              • Um sistema de privil´gios e senhas que ´ muito flex´
                                     e                   e          ivel, seguro e que per-
                mite verifica¸˜o baseada em esta¸˜es/m´quinas. Senhas s˜o seguras porque
                            ca                   co     a                 a
                todo o tr´fico de senhas ´ criptografado quando vocˆ se conecta ao servidor.
                         a              e                         e
Escalabilidade e limites
              • Lida com bancos de dados enormes. Usamos o Servidor MySQL com bancos
                 de dados que cont´m 50.000.000 registros e sabemos de usu´rios que usam
                                    e                                       a
                 o Servidor MySQL com 60.000 tabelas e aproximadamente 5.000.000.000
                 de linhas.
              • 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         indice ´
                                                                                           e
                                                                                      ´
                 de 500 bytes (isto pode ser alterado na compila¸˜o do MySQL). Um indice
                                                                ca
                 pode usar o prefixo de campo com um tipo CHAR ou VARCHAR.
Conectividade
             • Os clientes podem se conectar ao servidor MySQL usando sockets TCP/IP,
               em qualquer plataforma. No sistema Windows na fam´ NT (NT, 2000
                                                                     ilia
               ou XP), os clientes podem se conectar usando named pipes. No sistema
               Unix, os clientes podem se conectar usando arquivos sockets.
             • A interface Connector/ODBC fornece ao MySQL suporte a progras clientes
               que usam conex˜o ODBC (Open-DataBase-Connectivity). Por exemplo,
                                a
               vocˆ pode usar o MS Access para conectar ao seu servidor MySQL. Os
                   e
               clientes podem ser executados no Windows ou Unix. O fonte do Connec-
               tor/ODBC est´ dispon´
                              a       ivel. Todas as fun¸˜es ODBC s˜o suportadas, assim
                                                        co         a
               como muitas outras.
               Veja Se¸˜o 12.2 [ODBC], P´gina 866.
                       ca                   a
8                                     MySQL Technical Reference for Version 5.0.0-alpha



Localiza¸˜o
        ca
              • O servidor pode apresentar mensagem de erros aos clientes em v´rias  a
                l´
                 inguas. Veja Se¸˜o 4.7.2 [Languages], P´gina 328.
                                  ca                    a
              • Suporte total para v´rios conjuntos de caracteres, que incluem ISO-8859-1
                                      a
                (Latin1), big5, ujis e mais. Por exemplo, os caracteres Escandinavos ‘^’,
                                                                                        a
                ‘¨’, ‘¨’ s˜o permitidos em nomes de tabelas e colunas.
                 a o a
              • Todos os dados s˜o armazenados no conjunto de caracteres escolhido. To-
                                   a
                das as compara¸˜es em colunas de seq¨ˆncias caso-insensitivo.
                                 co                   ue
              • A ordena¸˜o ´ feita de acordo com o conjunto de caracteres escolhido (o
                           ca e
                                       a   ´
                modo sueco por padr˜o). E poss´ alterar isso quando o servidor MySQL
                                                 ivel
                ´ iniciado. Para ver um exemplo de v´rias ordena¸˜es avan¸adas, procure
                e                                     a            co       c
                pelo c´digo de ordena¸˜o Tcheca. O Servidor MySQL suporta diversos con-
                       o               ca
                juntos de caracteres que podem ser especificados em tempo de compila¸˜o ca
                e execu¸˜o.
                         ca
Clientes e Ferramentas
              • O servidor MySQL foi constru´ com suporte para instru¸˜es SQL que
                                              ido                         co
                verificam, otimizam e reparam tabelas. Estas instru¸˜es est˜o dispon´
                                                                    co    a         iveis
                a partir da linha de comando por meio do cliente myisamcheck, O MySQL
                inclui tamb´m o myisamchk, um utilit´rio muito r´pido para realizar estas
                            e                        a           a
                                                        ´
                opera¸˜es em tabelas MyISAM. Veja Cap“ptexi tulo 4 [MySQL Database
                      co
                Administration], P´gina 208.
                                    a
              • Todos os programas MySQL podem ser chamados com as op¸˜es --help ou
                                                                         co
                -? para obter ajuda online.

1.2.3 Estabilidade do MySQL

Esta se¸˜o discute as quest˜es “Qu˜o est´vel ´ o MySQL?” e “Posso depender do MySQL
       ca                  o       a     a   e
neste projeto?”. Tentaremos deixar claro estes assuntos e responder algumas das quest˜es
                                                                                      o
mais importantes que dizem respeito a muito de nossos usu´rios. A informa¸˜o nesta se¸˜o
                                                           a              ca          ca
´ baseada em dados colhidos da lista de discuss˜o, que ´ muito ativa na identifica¸˜o de
e                                               a        e                         ca
problemas e assim como nos relatos de tipos de uso.
Originalmente, o c´digo vem do in´ dos anos 80, fornecendo um c´digo est´vel e o formato
                  o              icio                            o        a
de tabelas ISAM permanece compativel´ com vers˜es anteriores. Na TcX, a predecessora da
                                                o
MySQLAB, o MySQL vem trabalhando sem problemas em nossos projetos desde o meio de 1996.
Quando o Programa de Banco de Dados MySQL foi disponibilizado para um p´blico maior,
                                                                            u
nossos novos usu´rios rapidamente encontraram algumas partes de “c´digo sem testes”.
                 a                                                     o
Desde ent˜o, cada distribui¸˜o nova teve menos problemas de portabilidade (mesmo com
          a                ca
os novos recursos implementados em cada uma destas vers˜es)o
Cada distribui¸˜o do Servidor MySQL foi sendo usado, e os problemas tem ocorrido somente
              ca
quando os usu´rios come¸am a usar o c´digo das “´reas cinzentas.” Naturalmente, novos
              a          c             o           a
usu´rios n˜o sabem o que s˜o as ´reas cinzentas; esta se¸˜o tenta indicar aquelas que s˜o
    a     a                 a    a                      ca                             a
conhecidas atualmente. As descri¸˜es lidam com a Vers˜o 3.23 e 4.0 do Servidor MySQL.
                                 co                     a
Todos os erros conhecidos e relatados s˜o corrigidos na ultima vers˜o, com a exce¸˜o dos
                                       a                ´          a              ca
bugs listados na se¸˜o de erros, os quais s˜o relacionados ao desenho. Veja Se¸˜o 1.8.6
                    ca                     a                                    ca
[Bugs], P´gina 53.
         a
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                  9



O Servidor MySQL ´ escrito em m´ltiplas camadas com m´dulos independentes. Alguns
                  e               u                       o
dos novos m´dulos est˜o listados abaixo com indica¸˜es de qu˜o bem-testado foi cada um
           o         a                            co        a
deles.
Replica¸˜o — Gamma
       ca
           Grandes grupos de servidores usando replica¸˜o est˜o em uso, com bom resul-
                                                      ca     a
           tados. O trabalho no aprimoramento dos recursos de replica¸˜o continua no
                                                                       ca
           MySQL 4.x.
Tabelas InnoDB — Est´vel (na 3.23, 3.23.49)
                     a
           O mecanismo de armazenamento transacional InnoDB foi declarado est´vel na
                                                                               a
           a
           ´rvore do MySQL 3.23, a partir da vers˜o 3.23.49. InnoDB tem sido usado em
                                                 a
           sistema de produ¸˜o grandes e com carga pesada.
                           ca
Tabelas BDB — Gamma
           O c´digo do Berkeley DB ´ muito est´vel, mas ainda estamos melhorando a
               o                     e          a
           interface do mecanismo de armazenamento transacional do BDB no Servidor
           MySQL, assim levar´ algum tempo at´ que ele esteja t˜o bem testado quanto os
                             a               e                 a
           outro tipos de tabela.
Pesquisas Full-text — Beta
           Pesquisa full-text funcionam mas ainda n˜o s˜o largamente usadas. Melhora-
                                                   a a
           mentos importantes forma implementados no MySQL 4.0.
MyODBC 3.51 (usa ODBC SDK 3.51) — Est´vela
          Em grande uso na produ¸˜o. Alguns problemas apresentados parecem ser rela-
                                   ca
          cionados a aplica¸˜o e independente do driver ODBC ou do servidor de banco
                           ca
          de dados.
Recupera¸˜o autom´tica de tabelas MyISAM — Gamma
        ca         a
           Este status se aplica apenas ao novo c´digo que confere no mecanismo de ar-
                                                 o
           mazenamento MyISAM que verifica, na inicializa¸˜o, se a tabela foi fechada cor-
                                                         ca
           retamente e executa uma conferˆncia/reparo autom´tico da tabela em caso
                                            e                  a
           negativo.
Bulk-insert — Alpha
            Novo recurso nas tabelas MyISAM no MySQL 4.0 para inser¸˜es mais r´pidas de
                                                                   co         a
            v´rios registros.
             a
Locking — Gamma
          Esse m´dulo ´ muito dependente do sistema. Em alguns sistemas existem certos
                o      e
          problemas por utilizar o locking padr˜o do SO (fcntl(). Nestes casos, vocˆ
                                                a                                     e
          deve executar o mysqld com o parˆmetro --skip-external-locking. S˜o
                                              a                                     a
          conhecidos alguns problemas ocorridos em alguns sistemas Linux e no SunOS
          quando utiliza-se sistemas de arquivos montados em NFS.
Clientes que pagam recebem suporte direto e de alta qualidade da MySQL AB. A MySQL
AB tamb´m fornece uma lista de discuss˜o como um recurso da comunidade onde qualquer
         e                            a
pessoa pode tirar suas d´vidas.
                        u
Erros s˜o normalmente corrigidos com um patch; para erros s´rios, normalmente ´ lan¸ada
       a                                                   e                  e    c
uma nova distribui¸˜o.
                  ca
10                                     MySQL Technical Reference for Version 5.0.0-alpha



1.2.4 Qual o Tamanho Que as Tabelas do MySQL Podem Ter?

A Vers˜o 3.22 do MySQL tem suporte para tabelas com limite de tamanho at´ 4G. Com
         a                                                                      e
o novo MyISAM no MySQL vers˜o 3.23 o tamanho m´ximo foi expandido at´ 8 milh˜es de
                                 a                    a                     e        o
terabytes (2 ^ 63 bytes). Com este tamanho de tabela maior permitido, o tamanho m´ximo
                                                                                     a
efetivo das tabelas para o banco de dados MySQL ´ normalmente limitado pelas restri¸˜es
                                                   e                                    co
do sistema operacional quanto ao tamanho dos arquivos, n˜o mais por limites internos do
                                                             a
MySQL.
A seguinte tabela lista alguns exemplos do limite do tamanho de arquivos do sistema op-
eracional:
Sistema Operacional                             Limite do tamanho do arquivo
Linux-Intel 32 bit                              2G, muito mais usando LFS
Linux-Alpha                                     8T (?)
Solaris 2.5.1                                         ´
                                                2G (E poss´ 4GB com patch)
                                                             ivel
Solaris 2.6                                     4G (pode ser alterado com parˆmetro)
                                                                               a
Solaris 2.7 Intel                               4G
Solaris 2.7 ULTRA-SPARC                         8T (?)
No Linux 2.2 vocˆ pode ter tabelas maiores que 2 GB usando o patch LFS para o sistema
                    e
de arquivos ext2. No Linux 2.4 j´ existem patches para o sistema de arquivos ReiserFS para
                                   a
ter suporte a arquivos maiores. A maioria das distribui¸˜es atuais s˜o baseadas no kernel
                                                          co          a
2.4 e j´ incluem todos os patches Suporte a Arquivos Grandes (Large File Support - LFS)
        a
exigidos. No entanto, o tamanho m´ximo dispon´
                                      a             ivel ainda depende de diversos fatores,
sendo um deles o sistema de arquivos usado para armazenar as tabelas MySQL.
Para um vis˜o mais detalhada sobre LFS no Linux, dˆ uma olha na p´gina Andreas Jaeger’s
               a                                      e              a
"Large File Support in Linux" em http://www.suse.de/~aj/linux_lfs.html.
Por padr˜o, o MySQL cria tabelas MyISAM com uma estrutura interna que permite um
            a
tamanho m´ximo em torno de 4G. Vocˆ pode verificar o tamanho m´ximo da tabela com
               a                          e                            a
o comando SHOW TABLE STATUS ou com o myisamchk -dv nome_tabela Veja Se¸˜o 4.6.8   ca
[SHOW], P´gina 303.
            a
Se vocˆ precisa de tabelas maiores que 4G (e seu sistema operacional suporta arquivos
         e
grandes), a instru¸˜o CREATE TABLE permite as op¸˜es AVG_ROW_LENGHT e MAX_ROWS. Use
                     ca                            co
estas op¸˜es para criar uma tabela que possa ter mais de 4GB. Veja Se¸˜o 6.5.3 [CREATE
           co                                                            ca
TABLE], P´gina 597. Vocˆ pode tamb´m alterar isso mais tarde com ALTER TABLE. Veja
             a             e            e
Se¸˜o 6.5.4 [ALTER TABLE], P´gina 607.
   ca                          a
Outros modos se contornar o limite do tamanho do arquivo das tabelas MyISAM s˜o os    a
seguintes:
  • Se sua tabela grande ser´ somente leitura, vocˆ poder´ usar o myisampack para unir
                               a                     e       a
      e comprimir v´rias tabelas em uma. mysisampack normalmente comprime uma tabela
                      a
      em pelo menos 50%, portanto vocˆ pode obter, com isso, tabelas muito maiores. Veja
                                        e
      Se¸˜o 4.8.4 [myisampack], P´gina 337.
         ca                         a
  • Outra op¸˜o para contornar o limite de tamanho de arquivos do sistema operacional
                 ca
      para arquivos de dados MyISAM usando a op¸˜o RAID. Veja Se¸˜o 6.5.3 [CREATE TABLE],
                                                ca                ca
      P´gina 597.
        a
  • O MySQL inclu´ uma biblioteca MERGE que permite acessar uma cole¸˜o de tabelas
                       i                                                    ca
      idˆnticas como se fosse apenas uma. Veja Se¸˜o 7.2 [MERGE], P´gina 637.
        e                                        ca                    a
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                   11



1.2.5 Compatibilidade Com o Ano 2000 (Y2K)

O Servidor MySQL n˜o apresenta nenhum problema com o ano 2000 (Y2K compat´
                  a                                                      ivel)
 • O Servidor MySQL usa fun¸˜es de tempo Unix que tratam datas at´ o ano 2037 para
                             co                                      e
   valores TIMESTAMP; para valores DATE e DATETIME, datas at´ o ano 9999 s˜o aceitas.
                                                            e             a
 • 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 0 e
                 a
   1901 at´ 2155 em 1 byte e mostr´-lo usando 2 ou 4 d´
          e                         a                    igitos. Todos os anos de 2 d´
                                                                                     igitos
   s˜o considerados estar na faixa de 1970 at´ 2069; o que significa que se vocˆ armazenar
    a                                        e                                e
   01 em uma coluna YEAR, O Servidor MySQL o tratar´ como 2001.
                                                        a
O seguinte demonstra¸˜o simples ilustra que o MySQL Server n˜o tem nenhum problema
                     ca                                     a
com datas at´ depois do ano 2030:
            e
     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),
         -> ("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 |
12                                     MySQL Technical Reference for Version 5.0.0-alpha



      | 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)

O valor da coluna TIMESTAMP final ´ zero porque o ano final (2050) excede o TIMESTAMP
                                      e
maximo. O tipo de dados TIMESTAMP, que ´ usado para armazenar a hora atual, suporta
                                               e
valores na faixa de 19700101000000 a 20300101000000 em m´quinas 32 bits (valor com
                                                                 a
sinal). Em m´quinas de 64 bits, TIMESTAMP trata valores at´ 2106 (valores sem sinal).
               a                                            e
O exemplo mostra que os tipos DATE e DATETIME n˜o tem problemas com as datas usadas.
                                                   a
Eles ir˜o conseguir trabalhar com datas at´ o ano 9999.
        a                                    e
Embora o MySQL Server seja seguro em rela¸˜o ao ano 2000, vocˆ pode ter problemas se vocˆ
                                              ca                e                         e
us´-lo com aplica¸˜es que n˜o s˜o seguras com o ano 2000. Por exemplo, muitas aplica¸˜es
   a               co        a a                                                       co
antigas armazenam ou manipulam anos usando valores de 2 digitos (que s˜o amb´
                                                                          a      iguos) em
           ´
vez de 4 digitos. Este problema pode ser aumentado por aplica¸˜es que usam valores como
                                                                co
00 ou 99 como indicadores de valores “perdidos”. Infelizmente, estes problemas pode ser
dif´
   iceis de corrigir, cada um deles pode usar um conjunto diferente de conven¸˜es e fun¸˜es
                                                                             co        co
de tratamento de datas.
Assim, apesar do Servidor MySQL n˜o ter problemas com o ano 2000, ´ de responsabilidade
                                     a                                e
de sua aplica¸˜o fornecer datas que n˜o sejam amb´
              ca                        a           iguas. Veja Se¸˜o 6.2.2.1 [Y2K issues],
                                                                   ca
P´gina 490 para as regras do Servidor MySQL para lidar com entrada de datas amb´
  a                                                                                   iguas
que contenham valores de ano com 2 d´    igitos.

1.3 Vis˜o Geral da MySQL AB
       a

MySQL AB ´ a companhia dos fundadores e principais desenvolvedores do MySQL. A MySQL
          e
AB foi estabelecida originalmente na Su´cia por David Axmark, Allan Larsson e Michael
                                       e
“Monty” Widenius.
Os desenvolvedores do servidor MySQL s˜o todos empregados pela companhia. ny N´s somo
                                      a                                         o
uma organiza¸˜o virtual com pessoas em uma d´zia de pa´
              ca                                u         ises. Nos comunicamos exten-
sivamente na internet todos os dias uns com os outros e com nossos usu´rios, agentes de
                                                                        a
suporte e parceiros.
N´s nos dedicamos a desenvolver o programa MySQL e propagar nosso banco de dados a
  o
novos usu´rios.A MySQL AB det´m os direitos autorais do c´digo fonte do MySQL, do logo e
          a                    e                         o
da marca MySQL e deste manual. Veja Se¸˜o 1.2 [What-is], P´gina 4.
                                        ca                 a
A ideologia do MySQL mostra nossa dedica¸˜o ao MySQL e ao Open Source.
                                         ca
N´s desejamos que o Programa de Banco de Dados MySQL seja:
  o
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                 13



     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 de se 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.
O site do MySQL (http://www.mysql.com/) fornece as ultimas informa¸˜es sobre o MySQL
                                                    ´             co
e a MySQL AB.
A prop´sito, a parte “AB” do nome da companhia ´ o acrˆnimo para a palavra su´ca
        o                                         e      o                       e
“aktiebolag”, ou “sociedade anˆnima.” Ela ´ traduzida para “MySQL, Inc.” De fato,
                              o            e
MySQL Inc. e MySQL GmbH s˜o exemplos de subsidi´rias da MySQL AB. Elas est˜o
                                a                     a                           a
localizadas nos EUA e Alemanha, respectivamente.

1.3.1 O Modelo de Neg´cio e Servi¸os da MySQL AB
                     o           c

Uma das d´vidas mais comuns que encontramos ´: “Como vocˆ pode viver de algo que vocˆ
            u                                   e           e                          e
                           ´
disponibiliza sem custo? ” E assim que fazemos.
A MySQL AB ganha dinheiro com suporte, servi¸os, licen¸as comerciais e royalties. Us-
                                                c       c
amos estes rendimentos para patrocinar o desenvolvimento de produtos e para expandir os
neg´cios da MySQL.
    o
A compania tem sido luccrativa desde de sua cria¸˜o. Em Outubro de 2001, aceitamos um
                                                 ca
financiamento de risco de investidores Escandinavos e um pounhado de pessoas de neg´cio.
                                                                                    o
Este investimento ´ usado para solidificarmos nosso modelo de neg´cio e construir um base
                   e                                            o
para o crescimento sustent´vel.
                           a

1.3.1.1 Suporte

A MySQL AB ´ gerenciada pelos fundadores e principais desenvolvedores do banco de dados
            e
MySQL. Os desenvolvedores tem o compromisso de dar suporte aos clientes e outros usu´rios
                                                                                    a
com objetivo de manterem contato com as suas necessiades e problemas. Todo o nosso
suporte ´ dado por desenvolvedores qualificado. D´vidas mais complicadas s˜o respondidas
        e                                       u                         a
por Michael Monty Widenius, principal autor do MySQL Server. Veja Se¸˜o 1.4.1 [Suporte],
                                                                     ca
P´gina 17.
  a
Para maiores informa¸˜es e pedido de suporte de diversos n´
                         co                                                 iveis, veja
http://www.mysql.com/support/ ou contate nossos vendedores em sales@mysql.com.
14                                     MySQL Technical Reference for Version 5.0.0-alpha



1.3.1.2 Treinamento e Certifica¸˜o
                              ca

A MySQL AB distribui o MySQL e treinamentos relacionados mundialmente. Oferecemos tanto
cursos abertos quanto fechados voltado para a necessidade espec´ifica da sua empresa. O
Treinamento do MySQL tamb´m est´ dispon´ por meio de seus parceiros, os Centros de
                            e       a      ivel
Treinamento Autorizados do MySQL.
Nosso material de treinamento usa os mesmos bancos de dados exemplos usados em nossa
documenta¸˜o e nossos exemplos de aplicativos. Ele est´ sempre atualizado de acordo com
           ca                                         a
a ultima vers˜o do MySQL. Nossos instrutores s˜o apoiados por nossa equipe de desenvolvi-
  ´          a                                a
mento para garantir a qualidade do treinamento e o desenvolvimento cont´inuo do material
de nossos cursos. Isto tamb´m assegura que nenhuma quest˜o surgida durante o curso fique
                           e                              a
sem resposta.
Fazendo nossos cursos de treinamento permitir´ que vocˆ alcance os objetivos de seu aplica-
                                             a        e
tivo MySQL. vocˆ tamb´m ir´:
               e      e     a
 •   Economizar tempo.
 •   Melhorar o desempenho de seus aplicativos.
 •   Reduzir ou eliminar a necessidade de hardware adicional, baixando o custo.
 •   Melhorar a seguran¸a.
                        c
 •   Aumentar a satisfa¸˜o dos clientes e colabloradores.
                       ca
 •   Preparar-se para Certifica¸~o MySQL.
                                 ca
Se vocˆ estiber interessado em nosso treinamento como um participante em por-
       e
tencial ou como um parceiro de treinamento, viste a se¸˜o de treinamento em
                                                         ca
http://www.mysql.com/training/ ou contate nos em: training@mysql.com.
Para detalhes sobre o Programa de Certifica¸~o MySQL, veja http://www.mysql.com/certification/.
                                           ca

1.3.1.3 Consultoria

A MySQL AB e seus Parceiros Autorizados oferecem servi¸os de consultoria para usu´rios
                                                        c                         a
do Servidor MySQL e `queles que utilizam o Servisdor MySQL embutido em seus programas,
                    a
em qualquer parte do mundo.
Nossos consultores podem ajud´-lo projetando e ajustando o seu banco de dados, criar
                                  a
consultas eficientes, ajustar sua plataforma para uma melhor performance, resolver quest˜es
                                                                                        o
de migra¸˜o, configurar replica¸˜o, criar aplica¸˜es transacionais robustas, e mais. Tamb´m
        ca                      ca             co                                       e
ajudamos os nossos clientes com o Servidor MySQL embutido em seus produtos e aplica¸˜esco
para desenvolvimento em larga-escala.
Nossos consultores trabalham em colabora¸˜o com a nossa equipe de desenvolvimento, o
                                             ca
que assegura a qualidade t´cnica de nossos servi¸os profissionais. Os servi¸os de consultoria
                            e                    c                        c
varia de sess˜es de 2 dias a projetos que gastam semanas e meses. Nosso peritos n˜o apenas
             o                                                                     a
cobrem o Servidor MySQLeles tamb´m conhecem sobre linguagens de programa¸˜o e scripts
                                     e                                          ca
tais como PHP, Perl e mais.
Se estiver interessado em nossos servi¸os de consultoria ou quiser se tornar nosso parceiro,
                                       c
visite a se¸˜o sobre consultaria em nosso web site em http://www.mysql.com/consulting/
           ca
ou contate nossa equipe de consultoria em consulting@mysql.com.
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                   15



1.3.1.4 Licen¸as Comerciais
             c

O banco de dados MySQL ´ liberado sob a licen¸a GNU General Public License (GPL). Isto
                          e                     c
significa que o programa MySQL pode ser usado sem custos sob a GPL. Se vocˆ n˜o deseja estar
                                                                           e a
limitado pelos termos da GPL (tais como a exigˆncia de que a sua aplica¸˜o tamb´m deva ser
                                               e                       ca      e
GPL), vocˆ pode comprar uma licen¸a comercial para o mesmo produto da MySQL AB; veja
          e                          c
http://www.mysql.com/products/pricing.html. Desde de que a MySQL AB ´ dona dos  e
direitos do c´digo fonte do MySQL, estamos aptos a empregar o Licenciamento Dual, que
             o
significa que o mesmo produto est´ dispon´ sob a GPL e sob uma licen¸a comercial. Isto
                                   a       ivel                           c
n˜o afeta o nosso comprometimento com o Open Source de forma alguma. Para detalhes
  a
sobre quando uma licen¸a comercial ´ exigida, veja Se¸˜o 1.4.3 [MySQL licenses], P´gina 18.
                        c            e               ca                           a

1.3.1.5 Parcerias

A MySQL AB tem um programa de parceria mundial que cobre cursos de treinamento,
consultaria e suporte, publica¸˜es, mais a revenda e distribiui¸˜o do MySQL e produtos
                              co                               ca
relacionados.    Os Parceiros da MySQL AB ganham visibilidade no nosso web site
(http://www.mysql.com/) e o direito de usarem vers˜es especiais da marca MySQL para
                                                     o
identificar seus produtos e promoverem os seus neg´cios.
                                                 o
Se vocˆ est´ interessado em se tornar um Parceiro da MySQL AB, envie-nos um email para
      e    a
partner@mysql.com.
A palavra MySQL e o logomarca do golfinho da MySQL s˜o marcas registradas da MySQL AB.
                                                   a
Veja Se¸˜o 1.4.4 [MySQL AB Logos and Trademarks], P´gina 20. Estas marcas registradas
       ca                                           a
representam um valor significante que os fundadores do MySQL construiram ao longo dos
anos.
O web site do MySQL (http://www.mysql.com/) ´ popular entre desenvolvedores e usu´rios.
                                               e                                   a
Em Outubro de 2001, obtivemos mais de 10 milh˜es e views. Nossos visitantes representam
                                               o
um grupo que tomam decis˜es de compra e fazem recomend¸˜es de software e hardware.
                           o                                co
Vinte por cento de nossos vistantes autorizam decis˜es de compra e apenas nove por cento
                                                   o
n˜o est˜o envolvidos com a ´rea de compras. Mais de 65% fizeram uma ou mais compras
 a     a                    a
online no ultimo semaster e 70% planejam fazer uma compra nos pr´ximos meses.
          ´                                                        o

1.3.2 Informa¸oes para Contato
             c˜

O web site do MySQL (http://www.mysql.com/) fornece as ultimas informa¸˜es sobre MySQL
                                                       ´              co
e MySQL AB.
Para servi¸os de imprensa e quest˜es n˜o cobertas por nossas releases de nott´
           c                      o    a                                          icias
(http://www.mysql.com/news/), envie-nos um email para press@mysql.com.
Se vocˆ tiver um contrato de suporte v´lido com a MySQL AB, vocˆ receber´ em tempo,
       e                              a                        e        a
respostas precisas para as suas quest˜es t´cnicas sobre o programa MySQL.
                                      o     e                                  Para
mais informa¸˜es, veja Se¸˜o 1.4.1 [Support], P´gina 17. Em nosso site na web, veja
             co          ca                    a
http://www.mysql.com/support/, ou envie um e-mail para sales@mysql.com.
Para informa¸˜es sobre treinamento MySQL, visite a se¸˜o de treinamento em
            co                                         ca
http://www.mysql.com/training/. Se vocˆ tiver acesso restrito ` Internet, conte a
                                      e                       a
16                                     MySQL Technical Reference for Version 5.0.0-alpha



equipe de treinamento da MySQL AB via e-mail em training@mysql.com. Veja Se¸˜o 1.3.1.2
                                                                           ca
[Business Services Training], P´gina 14.
                               a
Para informa¸˜es sobre o Progrma de Certifica¸o MySQL, veja http://www.mysql.com/certification/.
            co                                   c
Veja Se¸˜o 1.3.1.2 [Business Services Training], P´gina 14.
       ca                                          a
Se vocˆ estiver interessado em consultoria, visite a se¸˜o de consultorias de nosso web
       e                                                 ca
site em http://www.mysql.com/consulting/. Se vocˆ tiver restri¸˜es acesso a internet,
                                                       e          co
contate a equipe de consultores da MySQL AB via e-mail em consulting@mysql.com. Veja
Se¸˜o 1.3.1.3 [Business Services Consulting], P´gina 14.
   ca                                          a
Licen¸as comerciais podem ser compradas online em https://order.mysql.com/.
      c
L´ vocˆ tamb´m encontrar´ informa¸˜es de como enviar um fax da sua ordem de
  a      e    e             a        co
compra para a MySQL AB. Mais informa¸˜es sobre licen¸as podem ser encontradas em
                                         co             c
http://www.mysql.com/products/pricing.html. Se vocˆ tiver duvidas em rela¸˜o a
                                                          e                      ca
licenciamento ou quiser cota para negocia¸˜o de um alto volume de licen¸as, preencha o
                                         ca                             c
formul´rio de contato em nosso site web (http://www.mysql.com/) ou envie um email
        a
para licensing@mysql.com (para quest˜es sobre licenciamento) ou para sales@mysql.com
                                      o
(para pedidos de compra). Veja Se¸˜o 1.4.3 [Licen¸as MySQL], P´gina 18.
                                  ca             c            a
Se vocˆ est´ interessado em fazer parceira com a MySQL AB, envie um e-mail para
       e    a
partner@mysql.com. Veja Se¸˜o 1.3.1.5 [Business Services Partnering], P´gina 15.
                              ca                                         a
                              ´
Para mais detalhes sobre a politica da marca MySQL, visite http://www.mysql.com/company/trademark.ht
ou envie um e-mail para trademark@mysql.com. Veja Se¸˜o 1.4.4 [MySQL AB Logos and
                                                           ca
Trademarks], P´gina 20.
               a
Se vocˆ est´ interessado em qualquer um dos trabalhos da MySQL AB lista na se¸˜o de tra-
      e    a                                                                 ca
balhos (http://www.mysql.com/company/jobs/), envie um e-mail para jobs@mysql.com.
N˜o nos envie o seu CV em anexo, mas como texto no final de sua mensagem de email.
 a
Para discuss˜es gerais entre nosso muitos usu´rios, direcione a sua aten¸˜o para a lista de
            o                                a                          ca
discuss˜o apropriada. Veja Se¸˜o 1.7.1 [D´vidas], P´gina 33.
       a                      ca         u          a
Relat´rios de erros (geralmente chamados bugs), assim como quest˜es e coment´rios, de-
     o                                                            o           a
vem ser enviados para a lista de email geral do MySQL. Veja Se¸˜o 1.7.1.1 [Mailing-list],
                                                               ca
P´gina 33. Caso vocˆ encontre um bug de seguran¸a importante no MySQL Server, envie-nos
 a                  e                            c
um e-mail para security@mysql.com. Veja Se¸˜o 1.7.1.3 [Bug reports], P´gina 36.
                                              ca                       a
Se vocˆ tiver resultados de benchmarks que podemos publicar, contate-nos via e-mail em
      e
benchmarks@mysql.com.
Se vocˆ tiver sugest˜es a respeito de adi¸˜es ou conex˜es para este manual, envie-os para a
      e             o                    co           o
equipe do manual via e-mail em docs@mysql.com.
Para quest˜es ou coment´rios sobre o funcionamento ou cote´do do web site da MySQL
          o               a                                      u
(http://www.mysql.com/), envie um e-mail para webmaster@mysql.com.
A MySQL AB tem uma pol´ itica de privacidade que pode ser lida em http://www.mysql.com/company/privac
Para qualquer quest˜es a respeito desta pol´
                   o                       itica, envie um e-mail para privacy@mysql.com.
Para todos os outros assunto, envie um e-mail para info@mysql.com.

1.4 Suporte e Licenciamento do MySQL

Esta se¸˜o descreve os contratos de licenciamento e suporte do MySQL.
       ca
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                    17



1.4.1 Suporte Oferecido pela MySQL AB

O suporte t´cnico do MySQL AB significa respostas individualizadas as seus problemas par-
              e
ticulares diretamente dos engenheiros de software que codificaram o MySQL.
Tentamos ter uma vis˜o ampla e inclusiva de suporte t´cnico. Qualquer problema envol-
                       a                                  e
vendo o MySQL ´ importante par n´s se for importante para vocˆ. Normalmente os clientes
                e                  o                              e
procuram ajuda em como comandos e utilit´rios diferentes funcionam, remover gargalos de
                                             a
desempenhos, restaurar sistemas com falhas, entender impactos do sistema operacional e
rede no MySQL, configurar melhor pr´ticas de backup e restaura¸˜o, utiluizaar APIs, e assim
                                     a                          ca
por diante. Nosso suporte cobre apenar o servidor MySQL e nossos pr´prios utilit´rios, e
                                                                        o           a
n˜o produtos de terceirosque acessam o servidor MySQL, embora tentamos ajudar com eles
  a
quando podemos.
Informa¸˜es detalhadas sobre nossas v´rias op¸˜es de suporte ´ dado em
        co                             a        co              e
Suporte t´cnico ´ como seguro de vida. Vocˆ pode viver felizsem ele durante anos, mas
          e       e                            e
quando sua hora chegar ele ´ de grande importˆncia, mas j´ ´ muito tarde para adquir´
                              e                   a            ae                         i-
lo. Se vocˆ utiliza o MySQL Server para aplica¸˜es importantes e encontrar dificuldades
            e                                     co
repentinas, vocˆ pode gastar horas tentando resolver os problemas sozinho. Vocˆ pode
                e                                                                   e
precisar de acesso imediato aos respons´veis pela solu¸˜o de problemas do MySQL dsipon´
                                       a              ca                              iveis,
contratados pela MySQL AB.

1.4.2 Copyrights e Licen¸as Usadas pelo MySQL
                        c

MySQL AB possui os direitos sobre o c´digo fonte do MySQL, as logomarcas e marcas reg-
                                        o
istradas do MySQL e este manual. Veja Se¸˜o 1.3 [What is MySQL AB], P´gina 12. Diversas
                                           ca                            a
licen¸as s˜o relevantes a distribui¸˜o do MySQL:
     c     a                        ca
  1. Todo o c´digo espec´
               o          ifico do MySQL no servidor, a biblioteca mysqlclient e o cliente,
     assim como a biblioteca GNU readline ´ coberta pela GNU General Public License.
                                                e
     Veja Apˆndice G [GPL license], P´gina 1087. O texto desta licen¸a podee ser encon-
              e                          a                             c
     trado no arquivo ‘COPYING’ na distribui¸˜o.
                                               ca
  2. A biblioteca GNU getopt ´ coberta pela GNU Lesser General Public License. Veja
                                e
     http://www.fsf.org/licenses/.
  3. Algumas partes da fonte (a biblioteca regexp) ´ coberta por um copyright no estilo
                                                     e
     Berkeley.
  4. Vers˜es mais antiga do MySQL (3.22 e anteriror) est˜o sujeitos a uma licen¸a estrita
          o                                               a                     c
     (http://www.mysql.com/products/mypl.html). Veja a documenta¸˜o da vers˜o es-
                                                                          ca       a
     pec´ifica para mais informa¸˜o.
                                 ca
  5. O manual de referˆncia do MySQL atualmente n˜o ´ distribu´ sob uma licecn¸a no
                        e                            a e           ido              c
     estilo da GPL. O uso deste manual est´ sujeito aos seguintes termos:
                                             a
       • A convers˜o para outros formatos ´ permitido, mas o conte´do atual n˜o pode ser
                    a                         e                      u        a
          alterado ou editado de modo algum.
       • Vocˆ pode criar uma c´pia impressa para seu pr´prio uso pessoal.
              e                   o                       o
       • Para todos os outros usos, como venda de c´pias impressas ou uso (de partes) do
                                                     o
          manual em outra publica¸˜o, ´ necess´rios um acordo com a MySQL AB previamente
                                    ca e          a
          escrito.
18                                     MySQL Technical Reference for Version 5.0.0-alpha



     Envie-nos email para docs@mysql.com para maiores informa¸˜es ou se vocˆ estiver
                                                             co            e
     interessado em fazer a tradu¸˜o.
                                 ca
Para informa¸˜es sobre como as licen¸as do MySQL funcionam na pr´tica, de uma olhada
             co                     c                            a
em Se¸˜o 1.4.3 [MySQL licenses], P´gina 18. Veja tamb´m Se¸˜o 1.4.4 [MySQL AB Logos
      ca                          a                  e    ca
and Trademarks], P´gina 20.
                   a

1.4.3 Licen¸as do MySQL
           c

O programa MySQL ´ distribu´
                       e          ido sob a GNU General Public License (GPL), que
´ provavelmente a melhor licen¸a Open Source conhecida.
e                                  c                               Os termos formais da
licen¸a GPL pode ser encontrado em http://www.fsf.org/licenses/. Veja tamb´m
      c                                                                                 e
http://www.fsf.org/licenses/gpl-faq.html e http://www.gnu.org/philosophy/enforcing-gpl.htm
Como o programa MySQL ´ distribu´ sob a GPL, ele pode ser usa geralmente de gra¸a, mas
                         e         ido                                             c
para certos usos vocˆ pode querer ou precisar comprar lincen¸as comerciais da MySQL AB em
                    e                                       c
https://order.mysql.com/. Veja http://www.mysql.com/products/licensing.html
para mais informa¸˜es.
                   co
Vers˜es mais antigas do MySQL (3.22 e anteriores) est˜o sujeitos a uma licen¸a mais estrita
     o                                                a                     c
(http://www.mysql.com/products/mypl.html). Veja a documenta¸˜o da vers˜o espec´
                                                                    ca        a        ifica
para mais informa¸˜o.
                   ca
Note que o uso do programa MySQL sob uma licen¸a comercial, GPL ou a antiga licen¸a do
                                                  c                                  c
MySQL n˜o d´ automaticamente o direito de usar as marcas registradas da MySQL AB. Veja
        a a
Se¸˜o 1.4.4 [MySQL AB Logos and Trademarks], P´gina 20.
   ca                                               a

1.4.3.1 Usando o Programa MySQL Sob uma Licen¸a Comercial
                                             c

A licen¸a GPL ´ contagiosa no sentido de que quando um programa ´ ligado a um programa
        c       e                                                   e
GPL, todo o c´digo fonte para todas as partes do produto resultante tamb´m devem ser
                o                                                            e
distribu´idas sob a GPL. Se vocˆ n˜o seguir esta exigˆncia do GPL, vocˆ quebra os termos da
                                e a                  e                 e
licen¸a e perde o seu direito de usar o programa GPL inclu´
     c                                                      ido. Vocˆ tamb´m corre riscos.
                                                                    e      e
Vocˆ precisar´ de uma licen¸a comercial:
    e          a             c
   • Quando vocˆ liga um programa com qualquer c´digo GPL do programa MySQL e n˜o que
                   e                                 o                                a
     que o produto resultante seja licenciado sob a GPL, talvez porque vocˆ queira criar um
                                                                           e
     produto comercial ou manter fechado o c´digo n˜o GPL adicionado por outras raz˜es.
                                                o       a                               o
     Ao comprar a lincen¸a comercial, vocˆ n˜o est´ usando o programa MySQL sob GPL
                           c                 e a       a
     embora o c´digo seja o mesmo.
                  o
   • Quando vocˆ distribui uma aplica¸˜o n˜o GPL que s´ funciona com o programa MySQL
                   e                    ca a              o
     e a entrega com o programa MySQL. Este tipo de solu¸˜o ´ considerada mesmo se feita
                                                            ca e
     em uma rede.
   • Quando vocˆ distribui c´pias do programa MySQL sem fornecer o c´digo fonte como
                    e          o                                           o
     exigido sob a licen¸a GPL.
                        c
   • Quando vocˆ quiser dar suporte adional ao desenvolvimento do banco de dados do
                    e
     MySQL mesmo se vocˆ n˜o precisar formalmente de uma licen¸a comercial. Comprar
                           e a                                       c
     o suporte diretamente da MySQL AB ´ outro bom modo de contribuir com o desen-
                                           e
     volvimento do programa MySQL, com vantagens imediatas para vocˆ. Veja Se¸˜o 1.4.1
                                                                         e         ca
     [Support], P´gina 17.
                    a
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                       19



Se vocˆ requisita uma licecn¸a, vocˆ precisar´ de uma para cada instala¸˜o do programa
       e                       c      e          a                       ca
MySQL. Ela cobre qualquer n´mero de CPUs na m´quina, e n˜p h´ nenhum limite artificial
                              u                      a        a a
no n´mero de clientes que conectam aom servidor de qualquer modo.
    u
Para licen¸as comercias, ,visite o nosso site web em http://www.mysql.com/products/licensing.html.
          c
Para contrato de suporte, veja http://www.mysql.com/support/. Se vocˆ tiver necessi-
                                                                           e
dades especiais ou tiver acesso restrito a Internet, contate a nossa quipe de vendas via
email em sales@mysql.com.

1.4.3.2 Usando o Programa MySQL Sem Custo Sob GPL

Vocˆ pode utilizar o programa MySQL sem custo sob a GPL se vocˆ concordar as condi¸˜es do
   e                                                             e                    co
GPL. Para detalhes adicionais, incluindo respostas a duvidas comuns sobre a GPL, veja o FAQ
gencio da Free Software Foundation em http://www.fsf.org/licenses/gpl-faq.html.
Usos comuns da GPL incluem:
  • Quando vocˆ distribui sua pr´pria aplica¸˜o e o c´digo fonte da MySQL com o seu
                 e                  o           ca        o
    produto.
  • Quando vocˆ distribui o c´digo fonte do MySQL junto com outros programas que n˜o
                 e              o                                                           a
    s˜o ligados ou dependentes do sistema do MySQL para suas funcionalidades mesmo se
     a
    vocˆ vender a distribui¸˜o comercialmente. Isto ´ chamado agrega¸˜o na licen¸a GPL.
         e                   ca                        e                 ca          c
  • Quando vocˆ n˜o est´ distribuindo qualquer parte do sistema do MySQL, vocˆ pode
                 e a       a                                                           e
    us´-lo de gra¸a.
       a          c
  • Quando vocˆ for um Provedos de Servi¸os de Internet (Internet Service Provider - ISP),
                 e                          c
    oferecendo hospedagem web com serviodres MySQL para seus clientes. Encorajamos as
    pessoas a usarem provedroes que possuem suporte ao MySQL, j´ que isto lhes dar´ a
                                                                       a                   a
    confian¸a qie seus provedores ter˜o, de fato, os recursos para resolver qualquer problema
            c                         a
    que eles possam experimentar com a instala¸ao do MySQL. Mesmo se um provedor n˜o
                                                  c˜                                        a
    tiver uma licen¸a comercial ara o MySQL Server, seus clientes devem ter acesso de
                     c
    leitura ao fonte da instala¸˜o do MySQL para que seus clientes verifiquem que ela est´
                                ca                                                            a
    correta.
  • Quando vocˆ usa o banco de dados MySQL em conjunto com um servidor web, vocˆ n˜o
                 e                                                                       e a
    precisa de uma licen¸a comercial (uma vez que este n˜o ´ um produto distribuido
                         c                                  a e                       ´ por
    vocˆ). Isto ´ verdade mesmo se vocˆ executar um servidor web comercial que utilize
         e       e                        e
    MySQL Server, pois vocˆ n˜o est´ distribuindo qualquer parte do sistema MySQL. No
                              e a      a
    entanto, neste caso n´s gostariamos que vocˆ adquirisse o suporte ao MySQL pois o
                           o                        e
    MySQL est´ ajudandoa sua empresa.
              a
Se o seu uso do banco de dados MySQL n˜o exige uma licen¸a comercial, lhe encorajamos
                                       a                  c
a adquirir um suporte da MySQL AB de qualquer forma. Deste modo vocˆ contribui com o
                                                                       e
desenvolvimento do MySQL e tamb´m ganha vantegens imediatas. Veja Se¸˜o 1.4.1 [Support],
                                e                                    ca
P´gina 17.
  a
Se vocˆ utiliza o bancdo de dados MySQL em um contexto comercial e obtem lucro com
       e
o seu uso, pedimos que vocˆ ajude no desenvolvimento do MySQL adquirindo algum n´
                           e                                                         ivel
de suporte. Sentimos que se banco de dados MySQL ajudou os seus neg´cios, ´ razo´vel
                                                                         o    e     a
pedirmos que vocˆ ajude a MySQL AB. (De outra forma, se vocˆ nos pedir suporte, vocˆ n˜o
                 e                                          e                      e a
s´ estar´ usando de gra¸a algo em que colocamos muito trabalhom mas tamb´m pedindo
 o       a             c                                                    e
que lhe forne¸amos suporte de gra¸a tamb´m).
             c                    c     e
20                                    MySQL Technical Reference for Version 5.0.0-alpha



1.4.4 Logomarcas e Marcas Registradas da MySQL AB

Muitos usu´rios do banco de dados MySQL deseja mostar o logo do golfinho da MySQL AB
           a
em seus web sites,livros ou produtos fechados. Isto ´ bem vindo, mas deve haver anota¸˜es
                                                    e                                  co
indicando que a palavra MySQL e o logo do golfinho da MySQL s˜o marcas registradas da
                                                                  a
MySQL AB e s´ podem ser usadas como indicado na nossa pol´
             o                                              itica de marcas registradas em
http://www.mysql.com/company/trademark.html.


1.4.4.1 O Logo Original do MySQL

O logo do golfinho do MySQL foi desenhado pela Finnish advertising agency Priority em
2001. O golfinho foi escolhido como um s´   imbolo para o baco de dados MySQL j´ que ele
                                                                               a
´ esperto, r´pido e um animal ´gil, se esfor´ndo em navegar pelos oceanos de dados. N´s
e           a                 a             a                                        o
tamb´m gostamos de golfinos.
     e
O logo original MySQL s´ podem ser usados pr representates da MySQL AB e aqueles que
                       o
possuem um acordo escrito permitndo-os de fazˆ-lo.
                                             e


1.4.4.2 Logomarcas da MySQL que Podem Ser Usadas Sem
        Permiss˜o de Altera¸˜o
               a           ca

Projetamos um conjunto de logos especiais de Uso Condicionale que podem se encontra-
dos em nosso site web em http://www.mysql.com/press/logos.html e usado em sites
web de terceiros sem permiss˜es de escrita da MySQL AB. O uso destas logomarcas n˜o
                                o                                                       a
                                                                           ´
s˜o totalmente irrestritas mas, como o nome indica, sujeitos a nossa politica de marcas
 a
registradasque tamb´m est´ dispon´
                     e      a       ivel em nosso site. Vocˆ deve ler a pol´
                                                           e               itica de marcas
registradas se plabeja us´-las. As exigˆncias s˜o basicamente as apresentadas aqui:
                         a             e       a
 • Use a logomarca que vocˆ preciisa como mostrado no site http://www.mysql.com/.
                             e
   Vocˆ pode mudar sua escala para servir as suas necessidades, mas n˜o pode alterar
       e                                                             a
   cores ou o desenho, ou alterar os graficos de forma alguma.
 • Deixe evidente que vocˆ, e n˜o a MySQL AB, ´ o criado e propriet´rio do site que mostra
                         e     a              e                    a
   a logomarca do MySQL.
 • N˜o use a logomarca em detrimento ` MySQL AB ou ao valor das marcas registradas da
    a                                  a
   MySQL AB. Nos reservamos o direito de revogar o diretiro de uso da marcas registradas
   da MySQL AB.
 • Se vocˆ utilizar as maracas em um site da web, fa¸a com que ele contenha um link para
         e                                          c
   http://www.mysql.com/.
 • Se vocˆ utilizar o banco de dados MySQL sob GPL em uma aplica¸˜o, sua aplica¸˜o deve
         e                                                      ca             ca
   ser Open Source deve estar apta a conectar a um servidor MySQL.

Contate-nos via e-mail em trademark@mysql.com para saber sobre os nosso acordos espe-
ciais que sirvam as suas necessidades.
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                21


1.4.4.3 Quando Vocˆ Precisa de Permiss˜o de Altera¸˜o para Usar
                   e                  a           ca
        as Logomarcas do MySQL?

Vocˆ precisa de permiss˜o escrita da MySQL AB antes de usar as logomarcas do MySQL nos
    e                  a
seguintes casos:
 • Quando exibir qualquer logomarca da MySQL AB em qualquer lugar diferente so seu site.
 • Quando exibir qualquer logomarca da MySQL AB exceta as de Uso Condicional men-
   cionadas anteiormente em sites ou outro lugar.
Devido a raz˜es comerciais e legais monitoramos o so das marcas registradas do MySQL
            o
em proutos, livros e outros itens. Normalmente exigimos um valor para a exibi¸˜o das
                                                                               ca
logomarcas da MySQL AB em produtos comerciais, j´ que achamos razo´vel que parte dos
                                                  a                 a
rendimentos seja retornado para financiar o desenvolvimento do banco de dados MySQL.

1.4.4.4 Logomarcas dos Parceiros da MySQL AB

As logomarcas de parceria do MySQL podem ser usados apenas por companhias e pessoas que
possuem um acordo de parceria por escrito com a MySQL AB. Parceiras incluem certifica¸˜o
                                                                                    ca
com treinador ou consultor do MySQL. Para mais informa¸˜es, Se¸˜o 1.3.1.5 [Partnering],
                                                        co      ca
P´gina 15.
 a

1.4.4.5 Usando a Palavra MySQL em Texto Impresso ou
        Apresenta¸˜o
                 ca

A MySQL AB considera bem vindas as referˆncias ao banco de dados MySQL mas deve ser
                                         e
indicado que a palavra MySQL ´ uma marca registrada da MySQL AB. Por isto, vocˆ deve
                             e                                                    e
adicionar o simbolo de marca registrada (TM) ao primeiro ou mais proeminente uso da
palavra MySQL em um texto e, onde apropriadom indicar que MySQL ´ uma marca reg-
                                                                      e
istrada da MySQL AB. Para mais informa¸˜es, veja nossa pol´
                                      co                  itica de marcas registradas em
http://www.mysql.com/company/trademark.html.

1.4.4.6 Usando a Palavra MySQL em Nomes de Companhias e
        Produtos

O uso da palavra MySQL em nomes de produtos ou companias ou em dominios de Internet
n˜o ´ permitida sem permiss˜o escrita da MySQL AB.
 a e                       a

1.5 Mapa de Desenvolvimento do MySQL

Esta se¸˜o fornece uma amostra do mapa de desenvolvimento do MySQL, incluindo prin-
        ca
cipais recursos imlementados ou planejados para o MySQL 4.0, 4.1, 5.0 e 5.1. A seguinte
se¸˜o fornece informa¸˜o para cada distribui¸˜o. O planejamento para alguns dos recursos
  ca                  ca                     ca
mais requisitados est˜o listada na tabela a seguir.
                     a
Feature                     MySQL version
Unions                      4.0
Subqueries                  4.1
22                                       MySQL Technical Reference for Version 5.0.0-alpha



R-trees                        4.1     (para    tabelas
                               MyISAM)
Stored procedures              5.0
Views                          5.0 ou 5.1
Cursors                        5.0
Foreign keys                   5.1 (3.23 com InnoDB)
Triggers                       5.1
Full outer join                5.1
Constraints                    5.1

1.5.1 MySQL 4.0 in a Nutshell

Muito aguardado por nossos usu´rios, o MySQL Server 4.0 agora est´ dispon´
                                   a                                        a        ivel em sua
vers˜o de produ¸˜o.
    a            ca
O MySQL 4.0 est´ dispon´
                    a       ivel para download em http://www.mysql.com/ e nossos sites
mirrors. O MySQL tem sido testado por um grande n´mero de usu´rios e est´ em uso em
                                                           u              a         a
mutios sites.
Os principais novos recursos do MySQL Server 4.0 s˜o trabalhados em conjunto com os
                                                          a
usu´rios corporativos e da comunidade, melhorando o programa de banco de dados MySQL
    a
como uma solu¸˜o para miss˜es cr´
               ca             o     iticas e sistemas de bancos de dados de alta carga. Outros
novos recursos visam os usu´rios de bancos de dados embutidos.
                             a
O MySQL 4.0 foi declarado est´vel para uso em produ¸˜o a partir da vers˜o 4.0.12 em
                                  a                           ca                   a
Mar¸o de 2003. Isto significa que, no futuro, apenas corre¸˜o de erros ser˜o feitas para a
     c                                                          ca               a
distribui¸˜o da s´rie 4.0 e apenas corre¸˜o de erros cr´
         ca       e                        ca             iticos ser˜o feitas para a antiga s´rie
                                                                    a                        e
3.23. Veja Se¸˜o 2.5.2 [Upgrading-from-3.23], P´gina 123.
              ca                                   a
Novos recursos para o MySQL est´ sendo adicionado ao MySQL 4.1 que tamb´m est´
                                     a                                                   e      a
       ´ (vers˜o alfa). Veja Se¸˜o 1.5.2 [MySQL 4.1 Nutshell], P´gina 24.
disponivel       a                ca                                    a

1.5.1.1 Recursos Dispon´
                       iveis no MySQL 4.0

Aumento da velocidade
            • O MySQL 4.0 tem uma cache de consultas que pode dar uma grande au-
               mento na velocidade de aplica¸˜es com consutas repetitivas. Veja Se¸˜o 6.9
                                            co                                     ca
               [Query Cache], P´gina 624.
                                a
            • A vers˜o 4.0 aumenta a velocidade do MySQL Server em um n´mero e
                      a                                                          u
               a                                           ´
               ´reas tais como INSERTs em bloco, buscas em indices empacotados, cria¸˜o
                                                                                      ca
               de ´
                  indices FULLTEXT, e COUNT(DISTINCT).
Introdu¸˜o ao Servidor MySQL Embutido
       ca
             • A nova biblioteca do Servidor Ebutido pode ser facilmente usada em
                aplica¸˜es standalone e embarcadas. O servidor embutido fornce uma
                      co
                alternativa para o uso do MySQL em um ambiente cliente/servidor. Veja
                Se¸˜o 1.5.1.2 [Nutshell Embedded MySQL], P´gina 24.
                   ca                                     a
Mecanismo de armazenamento InnoDB como padr˜o    a
            • O mecanismo de armazenamento InnoDB ´ oferecido como um recurso
                                                           e
               padr˜o do servidor MySQL. Isto significa suporte a transa¸˜es ACID, chaves
                   a                                                   co
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                 23



                estrangeiras com UPDATE/DELETE em cacata e lock de registro agora
                s˜o recursos padr˜es. Veja Se¸˜o 7.5 [InnoDB], P´gina 642.
                 a               o           ca                 a

Novas fncionalidades
             • A melhora das propriedades de busca FULLTEXT do MySQL Server 4.0
                habilita indexa¸˜o FULLTEXT de grandes partes de texto com linguagem
                               ca
                natural e bin´ria de l´gica de busca. Vocˆ pode personalizar o tamanho
                             a        o                   e
                m´inimo de palavras e definir a sua pr´pria lista de palavras de parasa em
                                                     o
                qualquer linguagem humana, habilitando um novo conjunto de aplica¸˜es co
                                ´
                a serem construidas no MySQL Server. Veja Se¸˜o 6.8 [Fulltext Search],
                                                                 ca
                P´gina 618.
                 a

Compatibilidade com os padr˜es, portabilidade e migra¸˜o
                           o                         ca
             • Recursos para simplificar a migra¸˜o de outros sistemas de banco de dados
                                                ca
               para o MySQL Server incluem TRUNCATE TABLE (como no Oracle)
             • Muitos usu´rios tamb´m ficar˜o satisfeitos ao perceber que o MySQL
                          a         e        a
               Server agora suporta a instru¸˜o UNION, um recurso padr˜o SQL muito
                                            ca                        a
               esperado.
             • O MySQL agora pode ser executado nativamente na plataforma Novell
               NetWare 6.0. Veja Se¸˜o 2.6.8 [Novell NetWare], P´gina 164.
                                   ca                           a

Internacionaliza¸˜o
                ca
              • Nossos usu´rios alem˜es, austr´
                           a          a          iacos e sui¸os notar˜o que o MySQL agora
                                                            c        a
                 suporta um novo conjunto de caracteres, latin1_de, que assegura que a
                 Ordena¸~o em alem~o classificar´ palavras com umlauts na mesma ordem
                        ca          a             a
                 das agendas telefˆnicas alem˜s.
                                  o          a

Aprimoramento da Usabilidade
          No porcesso de constru¸˜o de recursos para novos usu´rios, n˜o esquecemos os
                                 ca                           a       a
          pedidos de nossa leal comunidade de usu´rios.
                                                  a
             • A maioria dos parˆmetros mysqld (op¸˜es de inicializa¸˜o) agora podem
                                 a                   co              ca
               ser definidas se finalizar o servidor. Isto ´ um recurso conveniente para
                                                         e
               Administradores de Bancos de Dados (DBAs). Veja Se¸˜o 5.5.6 [SET OP-
                                                                    ca
               TION], P´gina 461.
                        a
             • Instru¸˜es DELETE e UPDATE multi-tabelas foram adicionadas.
                     co
             • Foi adicionado suporte ao mecanismo de armazenamento MyISAM para link
               simb´lico no n´ de tabela (e n˜o apenas a n´ de banco de dados como
                    o        ivel              a            ivel
               antes) e para habilitar o tratamento de links simb´licos no Windows por
                                                                 o
               padr˜o.
                    a
             • SQL_CALC_FOUND_ROWS e FOUND_ROWS() s˜o novas fun¸˜es que tornaram
                                                        a            co
               poss´ encontrar o n´meros de linhas que uma consulta SELECT que inclui
                   ivel            u
               uma cl´usula LIMIT teria retornado se a cl´usula n˜o fosse utilizada.
                      a                                  a       a

A se¸˜o de novidades deste manual inclui uma lista mais aprofundada dos recursos. Veja
     ca
Se¸˜o C.3 [News-4.0.x], P´gina 957.
  ca                     a
24                                     MySQL Technical Reference for Version 5.0.0-alpha



1.5.1.2 Servidor Embutido MySQL

libmysqld faz o MySQL Server adequado para uma grande ´rea de aplica¸˜es. Usando a
                                                             a            co
biblioteca do servidor MySQL embutido, pode embarcar o MySQL Server em v´rios aplica-
                                                                             a
tivos e dispositivos eletrˆnicos, onde o usu´rio final n˜o tˆm conhecimento de possuir um
                          o                 a          a e
banco de dados b´sico. O servidor MySQL embutido ´ ideal para uso nos bastidores em
                   a                                    e
aplica¸˜es de Internet, quiosques p´blicos, respons´vel por unidades de combina¸˜o hard-
      co                             u              a                          ca
ware/software, servidores Internet de alta performance, banco de dados de auto-conten¸˜o
                                                                                      ca
distribu´
        idos em CDROM, e assim por diante
Muitos usu´rios da libmysqld se benficiar˜o da iLicen¸a Dual do MySQL. Para aqueles
            a                               a            c
que n˜o desejam ser limitar pela GPL, o software ´ tambem est´ dispon´ sob uma licen¸a
      a                                          e             a       ivel             c
comercial. A biblioteca embutida do MySQL tamb´m usa a mesma interface que a biblioteca
                                                   e
do cliente normal, sendo ent˜o conveniente e f´cil de usar. Veja Se¸˜o 12.1.15 [libmysqld],
                            a                 a                    ca
P´gina 860.
 a

1.5.2 MySQL 4.1 in a Nutshell

MySQL Server 4.0 prepara a cria¸˜o de novos recursos como subqueries e Unicode (imple-
                                  ca
mentado na vers˜o 4.1) e o funcionamento de stored procedures do SQL-99 est´ sendo feito
                  a                                                            a
para a vers˜o 5.0. Estes recursos est˜o no topo da lista de recursos desejados de muitos de
            a                        a
nossos clientes.
Com estas adi¸˜es, os cr´
               co       iticos do MySQL Database Server devem ser mais imaginativos que
nunca para apontar as deficiˆncias do MySQL Database Management System. J´ conhecido
                             e                                                  a
por sua estabilidadem velocidade e facilidade de uso, o MySQL Server estar´ apto a atender
                                                                            a
as necessidades de v´rios compradores exigentes.
                    a

1.5.2.1 Recursos Dispon´
                       iveis no MySQL 4.1

Os recursos listados nesta se¸˜o est˜o implementados no MySQL 4.1. Outros poucos recur-
                             ca     a
sos est˜o planejados para o MySQL 4.1. Veja Se¸˜o 1.6.1 [TODO MySQL 4.1], P´gina 27.
       a                                        ca                            a
A maioria dos novos recursos em codifica¸˜o, como stored procedures, estar˜o dispon´
                                          ca                             a         iveis
no MySQL 5.0. Veja Se¸˜o 1.6.2 [TODO MySQL 5.0], P´gina 27.
                        ca                              a

Suporte a subqueries e tabelas derivadas
             •
                Uma subquery ´ uma instru¸˜o SELECT aninhada dentro de outras in-
                                e            ca
                stru¸˜es. Uma tabela dericada (unnamed view) ´ uma subquery na cl´usula
                    co                                         e                   a
                FROM de outras instru¸˜es. Veja Se¸˜o 6.4.2 [Subqueries], P´gina 569.
                                     co           ca                       a
Aumento na velocidade
            • Protocols bin´rios mais r´pidos com instru¸˜es preparadas e parˆmetros
                            a           a                co                    a
               de liga¸˜o. Veja Se¸˜o 12.1.4 [C API Prepared statements], P´gina 824.
                      ca          ca                                       a
              • Indexa¸˜o BTREE agora ´ suportado por tabelas HEAP, aumentando de forma
                       ca             e
                significante o tempo de resposta para busca que n˜o s˜o exatas.
                                                                 a a
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                 25



Nova funcionalidade
             • CREATE TABLE tabela1 LIKE tabela2 lhe permite criar uma nova tabela
                com a estrutura exatamente igual a de uma tabela existente, usando um
                unico comando.
                ´
             • Suporte aos tipos espaciais OpenGIS (dados geogr´ficos). Veja Cap´
                                                                 a              “ptexi
                tulo 10 [Spatial extensions in MySQL], P´gina 730.
                                                        a
             • A replica¸˜o pode ser feita sobre conex˜o SSL.
                        ca                            a
Compatibilidade aos padr˜es, portabilidade e migra¸˜o
                        o                          ca
             • O novo protocolo cliente/servidor adiciona a possibilidade de se passar
               m´ltiplos avisos ao cliente, no lugar se um unico resultado. Isto faz com
                 u                                         ´
               que o trabalho como uma grande carga de dados seja muito mais f´cil    a
               de rastrear. SHOW WARNINGS exibe avisos para o ultimo comando. Veja
                                                                 ´
               Se¸˜o 4.6.8.9 [SHOW WARNINGS], P´gina 323.
                 ca                              a
Internacionaliza¸˜o
                ca
              • Para suportar nossa base de usu´rio sempre em expans˜o usando linguagens
                                                a                    a
                 locais nas aplica¸˜es, o programa MySQL agora oferece suporte Unicode
                                  co
                 extensivo por meio dos conjunto de caracteres utf8 e ucs2.
             • Os conjuntos de caracteres agora podem ser definidos por colunas, tabelas
               e banco de dados. Isto permite um alto grau de flexibilidade no desenho
               das aplica¸˜es, particularmente para sites-web multi-linguagens.
                         co
             • Para documenta¸˜o sobre este suporte a conjunto de caracters aprimorados,
                              ca
               veja Cap´
                       “ptexi tulo 9 [Charset], P´gina 707.
                                                 a
Aprimoramento da usabilidade
           • Em resposta a demanda popular, adicionamos um comando HELP com
              base no servidor que pode ser usado para conseguir ajuda para coman-
              dos MySQL. A vantagem de se ter esta informa¸˜o no lado do servidor ´
                                                              ca                        e
              que a informa¸˜o ´ sempre aplic´vel para aquela vers˜o do servidor em par-
                            ca e             a                    a
              ticular. Como esta informa¸˜o est´ dispon´ executando uma instru¸˜o
                                         ca     a        ivel                        ca
              SQL, outros clientes tamb´m poder˜o ser escritos para acess´-la. Por ex-
                                       e          a                        a
              emplo, o cliente mysql de linha de comando foi modificado para ter esta
              capacidade.
             • No novo protocolo cliente/servidor, v´rias instru¸˜es podem ser feitas
                                                    a           co
               com uma unica chamada. Veja Se¸˜o 12.1.8 [C API multiple queries],
                         ´                       ca
               P´gina 851.
                a
             • O novo protocolo cliente/servidor tamb´m suporta retorno de v´rios resul-
                                                     e                      a
               tados. Isto pode ocorrer como resultado de enviar v´rias instru¸˜es, por
                                                                   a          co
               exemplo (Veja o item anterior).
             • Uma nova sintaxe INSERT ... ON DUPLICATE KEY UPDATE ... tem sido im-
               plementada. Isto lhe permite executar um UPDATE em um registro existente
               se o um INSERT criasse uma chave (´  indice) prim´ria (PRIMARY) ou unica
                                                                a                 ´
               (UNIQUE) (index) duplicada. Veja Se¸˜o 6.4.3 [INSERT], P´gina 578.
                                                   ca                    a
             • Projetamos uma nova fun¸˜o de agrupamento GROUP_CONCAT(), adicio-
                                        ca
               nando a capacidade de concatenar colunas de registros agrupados em uma
26                                     MySQL Technical Reference for Version 5.0.0-alpha



                 unica string de resultado, o que ´ extremamente util. Veja Se¸˜o 6.3.7
                 ´                                e              ´            ca
                 [Group by functions and modifiers], P´gina 555.
                                                      a
A se¸˜o de novidades neste manual incluem uma lista mais completa de recursos. Veja
     ca
Se¸˜o C.2 [Novidades na vers˜o 4.1.x], P´gina 948.
  ca                        a           a

1.5.2.2 Stepwise Rollout

Novos recursos est˜o sendo adicionados ao MySQL 4.1. A vers˜o Alfa j´ st´ dispon´ para
                  a                                        a        a a         ivel
download. Veja Se¸˜o 1.5.2.3 [Nutshell Ready for Immediate Use], P´gina 26.
                  ca                                              a
O conjunto de recursos que est˜o sendo adicionados a vers˜o 4.1 est˜o, na maioria, cor-
                               a                         a          a
rigidos. Desenvolvimento adicional j´ est´ em andamento na vers˜o 5.0. O MySQL 4.1
                                    a    a                       a
passam pelos passos de Alfa (tempo no qual os novos recursos ainda podem ser adiona-
dos/alterados), Beta (quando j´ implementamos todos os recursos e apenas corre¸˜es de
                              a                                                 co
erros s˜o realizados0) e Gamma (indicando que ima distribui¸˜o de produ¸˜o est´ quase
       a                                                   ca            ca     a
pronta). No fim deste processo, o MySQL 4.1 se tornar´ o nova distribui¸˜o de produ¸˜o).
                                                    a                 ca           ca

1.5.2.3 Pronto para Uso em Desenvolvimento Imediato

O MySQL 4.1 est´ atualmente no est´gio alfa e os bin´rios est˜o dispon´
                 a                 a                a        a        iveis para download
em http://www.mysql.com/downloads/mysql-4.1.html. Todas as distribui¸˜es bin´rias
                                                                             co      a
passaram por nossos extensivos teste sem nenhum erro na plataforma em que testamos.
Veja Se¸˜o C.2 [Novidades na vers˜o 4.1], P´gina 948.
       ca                        a         a
Para aqueles que desejam usar o fonte mais recente do desenvolvimento do MySQL 4.1, deix-
amos nosso reposit´rio do BitKeeper publicamente dispon´
                   o                                       ivel. Veja Se¸˜o 2.3.4 [Installing
                                                                        ca
source tree], P´gina 100.
               a

1.5.3 MySQL 5.0, A Pr´xima Distribui¸˜o de Desenvolvimento
                     o              ca

O novo desenvolvimento para o MySQL est´ focado na distribui¸˜o 5.0, comrecursos como
                                          a                 ca
Stored Procedures entre outros. Veja Se¸˜o 1.6.2 [TODO MySQL 5.0], P´gina 27.
                                       ca                             a
Para aqueles que desejam dar uma olhada no desenvolvimento do MySQL, deixamos o
nosso reposit´rioo do BitKeeper para o MySQL vers˜o 5.0 dispon´ publicamente. Veja
              o                                      a        ivel
Se¸˜o 2.3.4 [Instalando a ´rvore fonte], P´gina 100.
  ca                      a               a


1.6 MySQL e o Futuro (o TODO)

Esta se¸˜o lista os recursos que planejamos impementar no MySQL Server. As listas s˜o
       ca                                                                            a
apresentadas por vers˜o, e os itens est˜o aproximadamente na ordem em que ser˜o feitos.
                      a                a                                     a
Nota: Se vocˆ ´ um usu´rio corporativo com uma necessidade urgente de um recurso par-
               ee         a
ticular, por favor, contate sales@mysql.com para conversarmos sobre patroc´
                                                                          inio. Financia-
mento feito por uma ou mais companhias nos permite alocar recursos adicionais para aquele
prop´sito espec´
     o           ifico. Um exemplo de um recurso patrocinado no passado ´ a replica¸˜o.
                                                                        e          ca
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                 27



1.6.1 Novos Recursos Planejados Para a Vers˜o 4.1
                                           a

Os recursos abaixo ainda n˜o est˜o implementados no MySQL 4.1, mass est˜o planejados
                          a     a                                             a
para implementa¸˜o antes que o MySQL 4.1 v´ para a fase beta. Para uma lista do que j´
                ca                            a                                      a
est´ feito no MySQL 4.1, veja Se¸˜o 1.5.2.1 [Nutshell 4.1 features], P´gina 24.
   a                            ca                                    a
 • Suporte OpenSSL est´vel (o MySQL 4.0 tem suporte rudimentar ao OpenSSL, n˜o
                      a                                                     a
   testado 100%).
 • Mais teste de instru¸˜es preparadas
                       co
 • Mais testes de m´ltiplos conjunto de caracteres para uma tabela.
                   u

1.6.2 Novos Recursos Planejados Para a Vers˜o 5.0
                                           a

Os seguintes recursos est˜o planejados para inclus˜o no MySQL 5.0. Note que como pos-
                          a                          a
suimos diversos desenvolvedores que est˜o trabalhando em diferentes projetos, haver˜o
                                           a                                        a
tamb´m muitos recursos adicionais. H´ tamb´m um pequena chance qie alguns destes
      e                                   a       e
recursos sejam adicionados ao MySQL 4.1. Para uma lista do que j´ est´ feito no MySQL
                                                                a    a
4.1, veja Se¸˜o 1.5.2.1 [Nutshell 4.1 features], P´gina 24.
            ca                                    a
Para aqueles que desejam dar uma olhada nas novidades do desenvolvimento do MySQL,
deixamos nosso reposit´rio BitKeeper para o MySQL vers˜o 5.0 publicamente dispon´
                        o                                 a                     ivel.
Veja Se¸˜o 2.3.4 [Instalando a ´rvore fonte], P´gina 100.
       ca                      a               a
Stored Procedures
             • Stored procedures est˜o sendo implementadas atualmente. Este esfor¸o ´
                                    a                                                c e
               baseado no SQL-99, o que tem m sintaxe b´sica similar (mas n˜o idˆntica) a
                                                       a                   a    e
               do Oracle PL/SQL. N´s tamb´m implementaremos o framework do SQL-99
                                    o      e
               para enganchar em linguagens externas e (onde poss´ ivel) compatibilidade
               com p.ex. PL/SQL e T-SQL.
Nova funcionalidade
             • Suporte a cursores elementares.
             • A habilidade de especificar explicitamente para tabelas MyISAM que um
               ´
               indice deve ser criado como um ´
                                              indice RTREE. Na vers˜o 4.1, ´
                                                                   a       indices RTREE
               s˜o usados internamente para dados geom´tricos (tipos de dados GIS), mas
                 a                                      e
               n˜o podem ser criados no pedido.
                 a
             • Registros de tamanhos dinˆmicas para tabelas HEAP.
                                        a
Compatibilidade com o padr˜o, portabilidade e migra¸˜o
                          a                        ca
             • Adiciona suporte real a VARCHAR (tamanho de colunas maiores que 255, e
               sem corte de espa¸os em branco extras). (J´ existe suporte para isto nos
                                c                        a
               mecanismos de armazenamento do MyISAM, mas ainda n˜o est´ dispon´
                                                                     a     a        ivel
                  ´ de usu´rio).
               a nivel      a
Aumento na velocidade
            • SHOW COLUMNS FROM nome_tabela (usado pelo cliente mysql para permitir
               expans˜es de nomes de colunas) n˜o deve abrir a tabela, apenas o arquivo
                     o                          a
               de defini¸˜o. ISto exigir´ menos mem´ria e ser´ muito mais r´pido.
                       ca              a           o        a              a
28                                    MySQL Technical Reference for Version 5.0.0-alpha



             • Permite que o DELETE em tabelas MyISAM usem a cache de registros. Para
               fazer isto, precisamos atualizar a thread da cache de registro quando atu-
               alizarmos os arquivos ‘.MYD’.
             • Melhores tabes em mem´ria (HEAP):
                                    o
                  • Registro de tamanhos dinˆmoicos.
                                            a
                  • Tratamento de registro mais r´pido (menos c´pia).
                                                 a             o
Internacionaliza¸˜o
                ca
              • Ap usar SET CHARACTER SET devemos traduzir toda a consulta de uma vez
                 e n˜o apenas as strings. Isto permitir´ que os usu´rios usem caracteres
                    a                                  a            a
                 traduzidos nos nomes de banco de dados, tabelas e colunas.
Aprimoramento da usabilidade
           • Resolver a quest˜o de RENAME TABLE em uma tabela usada em uma tabela
                              a
              MERGE ativa, o que possivelmente corrompe a tabela.

1.6.3 Novos Recursos Planejados Para a Vers˜o 5.1
                                           a

Novas funcionalidades
             • Suporte FOREIGN KEY para todos os tipos de tabelas.
             • Restri¸˜es a n´ de colunas.
                      co     ivel
             • Replica¸˜o seguro a falhas.
                      ca
             • Backup online com baixa queda de desempenho. O backup online tornar´    a
               mais f´cil adicionar um novo slave de replica¸˜o sem desligar o master.
                     a                                      ca
Aumento de velocidade
            • Novo formato dos arquivos de defini¸˜o e tabelas baseados em texto (ar-
                                                   ca
               quivos ‘.frm’) e uma cache de tabelas para a defini¸˜o de tabelas. Isto nos
                                                                 ca
               permitir´ fazer consultas mais r´pidas da estruturas de tabela e dar um
                       a                       a
               suporte a chaves estrangeiras mais eficiente.
             • Otimizar o tipo BIT para gastar 1 bit (agora BIT gasta 1 byte; e ´ tratado
                                                                                e
               como um sinˆnimo para TINYINT.)
                           o
Aprimoramento da usabilidade
           • Adicionar op¸˜es ao protocolo cliente/servidor para obter notas de pro-
                           co
              gresso para longos comandos em execu¸˜o.
                                                  ca
             • Implementar RENAME DATABASE. Para tornar isto seguro para todos os
               mecanismos de armazenamento, ele deve funcionar como a seguir:
                  • Cria um novo banco de dados.
                  • Para cada tabelas, renomeie-a para outro banco de dados, o qual faze-
                    mos com o comando RENAME.
                  • Apagar o banco de dados antigo.
             • Nova altera¸˜o da interface de arquivo interno. Isto far´ todos os manip-
                          ca                                           a
               uladores de arquivos mais gerais e tornar´ mais f´cil adicionar extens˜es
                                                        a        a                   o
               tipo RAID.
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                     29


1.6.4 Novos Recursos Planejados Para a Vers˜o em um Futuro
                                           a
      Pr´ximo
        o

Novas funcionalidade
             • Comando como do Oracle CONNECT BY PRIOR ... para estruturas de busca
                tipo ´rvore (hier´rquica)
                     a            a
             • Adicionar todos os tipos que faltam do SQL-92 e ODBC 3.0.
             • Adicionar SUM(DISTINCT).
             • INSERT SQL_CONCURRENT e mysqld --concurrent-insert para fazer uma
                inser¸˜o concorrente no fim do arquivo se o arquivo tiver lock de leitura.
                     ca
             • Permitir a atualiza¸˜o de vari´veis nas instru¸˜es UPDATE. Por exemplo:
                                     ca         a               co
                UPDATE TABLE foo SET @a=a+b,a=@a, b=@a+c.
             • Alterar quando as vari´veis de usu´rios s˜o atualizadas e assim pode se us´-
                                        a          a     a                                 a
                las com GROUP BY, como no exemplo a seguir: SELECT id, @a:=COUNT(*),
                SUM(sum_col)/@a FROM nome_tabela GROUP BY id.
             • Adicionar a op¸˜o IMAGE a LOAD DATA INFILE para n˜o atualizar campos
                                ca                                      a
                TIMESTAMP e AUTO_INCREMENT.
             • Adicionar a sintaxe LOAD DATA INFILE ... UPDATE que funciona assim:
                  • Para tabelas com chaves prim´rias, se o registro de entrada cont´m um
                                                   a                                  e
                     valor de chave prim´ria, linhas existentes correspondendo `s chaves
                                            a                                      a
                     prim´rias s˜o atualizadas para o restante das colunas de entrada. No
                          a      a
                     entanto, colunas faltosas na inser¸˜o dos registros de entradas n˜o
                                                          ca                               a
                     s˜o alteradas.
                      a
                  • Para tabelas com chaves prim´rias, se um registro de entrada n˜o
                                                     a                                     a
                     cont´m um valor de chave prim´ria ou estr´ faltando alguma parte da
                          e                          a           a
                     chave, o registro ´ tratado como um LOAD DATA INFILE ... REPLACE
                                        e
                     INTO.
             • Fazer com que LOAD DATA INFILE entenda a sintaxe do tipo:
                       LOAD DATA INFILE ’file_name.txt’ INTO TABLE tbl_name
                              TEXT_FIELDS (text_field1, text_field2, text_field3)
                              SET table_field1=CONCAT(text_field1, text_field2),
                                   table_field3=23
                              IGNORE text_field3
                Isto pode ser usado para saltar colunas extras no arquivo texto, ou atualizar
                colunas baseadas nas express˜es dos dados lidos.
                                              o
             • Novas fun¸˜es para tyrabalhar com tipos de colunas SET:
                            co
                  • ADD_TO_SET(valor,conjunto)
                  • REMOVE_FROM_SET(valor,conjunto)
             • Se vocˆ abortar o mysql no meio de uma consulta, vocˆ deve abrir outra
                        e                                                 e
                conex˜o e matar a consulta antiga em execu¸˜o. Alternativamente, deve
                       a                                       ca
                ser feita um tentativa de detec¸˜o deste problema no servidor.
                                                ca
             • Adicione um interface do mecanismo de armazenamento para informa¸˜es     co
                da tabela assim que vocˆ puder us´-la como uma tabela de sistema. Isto se-
                                          e        a
                ria um pouco mais lento se vocˆ pedisse informa¸˜es sobre todas as tabelas,
                                               e                 co
30                                   MySQL Technical Reference for Version 5.0.0-alpha



                mas muito flex´ ivel. SHOW INFO FROM tbl_name para informa¸˜es b´sicas
                                                                         co    a
                das tabelas deve ser implementado.
             • Permite SELECT a FROM crash_me LEFT JOIN crash_me2 USING (a); neste
               caso ´ considerado que a vem da tabela crash_me.
                    e
             • Op¸˜es DELETE e REPLACE para a instru¸˜o UPDATE (isto deletar´ registros
                  co                                  ca                     a
               quando se tiver um erro de chave duplicada durante a atualiza¸˜o).
                                                                            ca
             • Altera o formato de DATETIME para armazenar fra¸˜es de segundo.
                                                              co
             • Possibilitar o uso da nova biblioteca regexp GNU em vez da atual (a bib-
               lioteca GNU deve ser muito mais r´pida que a antiga).
                                                   a
Compatibilidade com os padr˜es, portabilidade e migra¸˜o
                           o                          ca
             • N˜o adicionar valores DEFAULT autom´ticos as colunas. Enviar um erro ao
                 a                                  a
               usar um INSERT que n˜o contenha uma coluna que n˜o tenha um DEFAULT.
                                     a                           a
             • Adicionar as fun¸˜es de agrupamento ANY(), EVERY() e SOME(). No padr˜o
                                co                                                  a
               SQL isto s´ funciona em colunas booleanas, mas podemos extendˆ-las para
                          o                                                 e
               funcionar em qualquer coluna/express˜o tratando valores 0 como FALSE
                                                    a
               e valores diferentes de 0 como TRUE.
             • Corrigir para que o tipo de MAX(coluna) seja o mesmo do tipo da coluna:
                      mysql>   CREATE TABLE t1 (a DATE);
                      mysql>   INSERT INTO t1 VALUES (NOW());
                      mysql>   CREATE TABLE t2 SELECT MAX(a) FROM t1;
                      mysql>   SHOW COLUMNS FROM t2;
Aumento de velocidade
            • N˜o permitir mais que um n´mero definido de threads fa¸am a recupera¸˜o
                 a                      u                          c             ca
               do MyISAM ao mesmo tempo.
             • Alterar  INSERT ... SELECT       para    usar      inser¸˜es
                                                                       co     concorrentes
               opcionalmente.
             • Adicionar uma op¸˜o para descarregar paginas de chaves para tabelas com
                                 ca
               delayed keys se elas n˜o forem usados por um tempo.
                                     a
             • Permitir joins em partes de chaves (otimiza¸˜o).
                                                          ca
             • Adicionar simula¸˜o de pread()/pwrite() no Windows para permitir
                                ca
               inser¸˜es concorrentes.
                    co
             • Um analizador de arquivos de log que possam analizar informa¸˜es sobre
                                                                              co
               quais tabelas s˜o usadas com mais frequˆncia, a frequˆncia com que joins
                              a                         e            e
               multi-tables s˜o executados, etc. Isto deve ajudar os usu´rios a identi-
                             a                                            a
               ficar ´reas ou projetos de tabelas que podiam ser otimizados para executar
                    a
               consultas muito mais eficientes.
Internacionaliza¸˜o
                ca
Aprimoramentos de usabilidade
           • Retorna os tipos dos campos originais ao se fazer SELECT MIN(coluna) ...
              GROUP BY.
             • Possibilita especificar long_query_time com uma granularidade em mi-
               crosegundos.
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                   31



             • Ligue o c´digo myisampack no servidor assim ele poder´ realizar opera¸˜es
                        o                                           a               co
               PACK e COMPRESS.
             • Adicionar uma cache de chaves tempor´ria durante INSERT/DELETE/UPDATE
                                                   a
               para podermos fazer um recupera¸˜o se o ´
                                                ca      indice ficar cheio.
             • Se vocˆ realizar um ALTER TABLE em uma tabela que ´ ligada simbolica-
                     e                                                 e
               mente a outro disco, crie tabelas tenpor´rias neste disco.
                                                       a
             • Implementar um tipo DATE/DATETIME que trate as informa¸˜es de fusos
                                                                         co
               hor´rios de forma apropriada e assim lidar com datas em diferentes fusos
                  a
               hor´rios ser´ mais f´cil.
                  a        a       a
             • Corrigir o configure para se poder compilar todas as bibliotecas (como no
               MyISAM) sem threads.
             • Permitir vari´veis SQL em LIMIT, como em LIMIT @a,@b.
                            a
                 ´ autom´tica do mysql para um navegador web.
             • Saida        a
             • LOCK DATABASES (com diversas op¸˜es).
                                              co
             • Muito mais vari´veis para SHOW STATUS. Leitura e atualiza¸˜o de reg-
                                 a                                            ca
               istros. Selects em 1 tabela e select com joins. N´mero de tabelas na select.
                                                                u
               N´mero de consultas ORDER BY e GROUP BY.
                 u
             • mysqladmin copy database novo-banco_dados; exige que o comando
               COPY seja adicionado ao mysqld.
             • Lista de processos deve mostar o n´mero de consultas/threads.
                                                 u
             • SHOW HOSTS para xibir informa¸˜es sobre a cache de nome de m´quina.
                                            co                             a
             • Alterar o nome de tabelas de string vazias para NULL para colunas calcu-
               ladas.
             • N˜o usar Item_copy_string em valores num´ricos para evitar a convers˜o
                a                                      e                           a
               number->string->number no casos de: SELECT COUNT(*)*(id+0) FROM
               nome_tabela GROUP BY id
             • Alterar aqueles ALTER TABLE que n˜o abortam clientes que executam
                                                a
               INSERT DELAYED.
             • Colunas referˆnciadas em uma cl´usula UPDATE ir˜o conter os valores anti-
                            e                    a            a
               gos antes da atualiza¸˜o iniciar.
                                    ca
Novos sistemas operacioais.
             • Portar os clientes MySQL para LynxOS.

1.6.5 Novos Recursos Planejados Para a Vers˜o em um Futuro a
                                           a
      M´dio Prazo
       e

 • Implementar fun¸˜o: get_changed_tables(timeout,table1,table2,...)
                  ca
 • 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
 • Tornar o c´digo de timestamp autom´tico melhor. Adicionar timestamps para o log
              o                       a
   de atualiza¸˜es com SET TIMESTAMP=#;
              co
 • Usar mutex de leitura/escrita em alguns lugares para obter maior velocidade.
32                                       MySQL Technical Reference for Version 5.0.0-alpha



 • Views simples (inicialmente em uma tabela, depois em qualquer express˜o). Veja
                                                                        a
   Se¸˜o 1.8.4.6 [ANSI diff Views], P´gina 51.
     ca                             a
 • Fechar algumas tabelas automaticamente se uma tabela, tabela tempor´ria ou arquivos
                                                                         a
   tempor´rios obtiverem o erro 23 (n˜o pode abrir arquivos suficientes).
          a                          a
 • Melhor propaga¸˜o de constantes. Quando uma ocorrˆncia de nome_col=n ´ encontrada
                  ca                                   e                   e
   em uma express˜o, para algumas constantes n, substitua outras ocorrˆncias de nome_
                   a                                                     e
   col dentro da express˜o por n. Atualmente, isto ´ feito somente para alguns casos
                          a                           e
   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
   constante s˜o otimizadas.
              a
 • 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
 • MINUS, INTERSECT e FULL OUTER JOIN. (Atualmente UNION [na 4.0] e LEFT OUTER JOIN
   s˜o suportados).
    a
 • 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 mysqld_safe: de acordo com o FSSTND (que o
                               co
   Debian tenta seguir) arquivos PID dever ir em ‘/var/run/<progname>.pid’ e arquivos
   de log em ‘/var/log’. Seria ´timo se vocˆ puder colocar o diret´rio de dados na
                                  o            e                     o
   primeira declara¸˜o de "pidfile" e "log", para que a coloca¸˜o destes arquivos possa
                   ca                                        ca
   ser alterada com uma simples instru¸˜o.
                                       ca
 • Permitir um cliente requisitar log.
 • Adicionar uso de zlib() a LOAD DATA INFILE, para permitir que as instru¸˜es leiam
                                                                          co
   arquivos compactados com gzip.
 • Corrigir ordena¸˜o e agrupamento de colunas BLOB (parcialmente resolvida agora).
                  ca
 • Alterar para o uso de sem´foros quando contar threads. Devemos primeiro implementar
                            a
   uma biblioteca de sem´foros para a MIT-pthreads.
                          a
 • 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                   iveis deadlocks que essa altera¸˜o ir´ acarretar.
                                                          ca    a

O tempo ´ fornecido de acordo com a quantidade de trabalho, e n˜o tempo real.
        e                                                      a
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                      33



1.6.6 Novos Recursos que N˜o Planejamos Fazer
                          a

 • Nada; Planejamos ser totalmente compat´
                                         iveis com o ANSI 92 / ANSI 99.

1.7 Fontes de Informa¸˜es do MySQL
                     co

1.7.1 Listas de Discuss˜o MySQL
                       a

Esta se¸˜o introduz a lista de deiscuss˜o do MySQL e d´ algumas explica¸˜es sobre como a
        ca                             a                 a                 co
lista deve ser utilizada. Quando vocˆ se inscreve na lista de discuss˜o, vocˆ receber´, como
                                     e                               a      e        a
mensagens de email, tudo o que ´ enviado para a lista. Vocˆ tamb´m poder´ enviar suas
                                   e                           e      e         a
pr´prias d´vidas e respostas para a lista.
   o       u

1.7.1.1 As Listas de Discuss˜o do MySQL
                            a

Para se inscrever ou cancelar a inscri¸˜o de qualquer uma das listas de email descritas nesta
                                      ca
se¸˜o, visite http://lists.mysql.com/. Por favor, n˜o envie mensagem sobre inscri¸˜o
  ca                                                    a                                 ca
                                                                                         ´
ou cancelamento para qualquer das listas de emasil, porque tais mensagens s˜o distribuidas
                                                                              a
automaticamente para milhares de outros usu´rios.
                                               a
Seu site local pode ter muitas inscri¸˜es para uma lista de email do MySQL. Se sim, o site
                                      co
pode ter uma lista de email local, assim as mensagens enviadas para lists.mysql.com do
seu site s˜o propagadas para a lista local. Nestes casos, por favor, contate seu administrador
          a
de sistema para adicionado ou excluido da lista local do MySQL.
Se vocˆ quiser que as mensagens da lista de discuss˜o sejam enceminhadas para uma caixa
       e                                           a
de correio separada no seu programa de emails, configure um filtro com base nos cabe¸alhos
                                                                                  c
das mensagens. Vocˆ pode tamb´m usar os cabe¸alhos List-ID: ou Entregar-Para: para
                    e           e               c
identificar suas mensagens.
Existe tamb´m as seguintes listas de discuss˜o sobre MySQL atualmente:
           e                                a
announce    Esta ´ para anuncio de novas vers˜es do MySQL e programas relacionados.
                  e                           o
            Esta ´ uma lista com baixo volume na qual todos usuarios do MySQL deveriam
                  e
            se inscrever.
mysql       A principal lista para discuss˜es MySQL em geral. Note que alguns t´picos s˜o
                                          o                                    o        a
            mais bem discutidos em listas mais especializadas. Se vocˆ enviar para a lista
                                                                     e
            errada vocˆ pode n˜o obter resposta.
                      e         a
mysql-digest
          A lista mysql na forma resumida. Isto significa que vocˆ ir´ receber todas
                                                                  e a
          mensagens individuais, enviadas na forma de uma grande mensagem uma unica
                                                                              ´
          vez ao dia.
bugs        Esta lista s´ ser´ do seu interesse se vocˆ quiser ficar informado sobre assuntos
                        o    a                        e
            relatados desde a ultima distribui¸˜o do MySQL ou se vocˆ quiser estar ativa-
                                ´               ca                       e
            mente envolvido no processo de busca e corre¸˜o de erros. Veja Se¸˜o 1.7.1.3
                                                            ca                   ca
            [Relat´rio de erros], P´gina 36.
                  o                a
34                                     MySQL Technical Reference for Version 5.0.0-alpha



bugs-digest
          Uma vers˜o resumida da lista bugs.
                  a
internals
             Uma lista para pessoas que trabalham no c´digo do MySQL. Nesta lista pode-se
                                                      o
             discutir desenvolvimento do MySQL e pos-patches.
internals
             Uma vers˜o resumida da lista internals.
                     a
mysqldoc     Esta lista ´ para pessoas que trabalham na documenta¸˜o do MySQL: pessoas
                        e                                        ca
             da MySQL AB, tradutores e outros membros da comunidade.
mysqldoc-digest
          Esta ´ uma vers˜o resumida da lista mysqldoc.
               e         a
benchmarks
             Esta lista ´ para qualquer um interessado em assuntos de desempenho. Dis-
                        e
             cuss˜es concentradas em desempenho de banco de dados (n˜o limitado ao
                 o                                                       a
             MySQL) mas tamb´m inclue categorias ,com desempenho do kernel, sistema
                                 e
             de arquivos, sistema de disco e outros.
benchmarks
             Esta ´ uma vers˜o resumida da lista benchmarks.
                  e         a
packagers
             Esta lista ´ para discuss˜es sobre empacotamento e distribui¸˜o do MySQL.
                        e             o                                  ca
             Este ´ o f´rum usado pela pessoas que mant´m a distribui¸˜o para troca de
                   e   o                                 e             ca
             id´ias de pacotes do MySQL e para assegurar que o MySQL esteja o mais
               e
             parecido poss´ em todas as plataformas e sistemas operacionais suportados.
                           ivel
packagers-digest
          Esta ´ uma vers˜o resumida da lista packagers.
               e          a
java                                               ´
          Discuss˜o sobre o servidor MySQL e Java. E mais usada para discuss˜es sobre
                  a                                                         o
          o driver JDBC, incluindo MySQL Connector/J.
java-digest
          Uma vers˜o resumida da lista java.
                  a
win32        Esta ´ a lista para todos os t´picos relacionados ao MySQL em sistemas opera-
                  e                        o
             cionais Microsoft, como o Win95, Win98, NT e Win2000.
win32-digest
          Uma vers˜o resumida da lista win32.
                  a
myodbc       Lista para todos os t´picos relacionados a conectividade do MySQL com ODBC.
                                  o
myodbc-digest
          Uma vers˜o resumida da lista myodbc.
                  a
mysqlcc      Esta lista ´ sobre todos os t´picos relativos ao cliente gr´fico MySQL Control
                        e                 o                             a
             Center.
mysqlcc-digest
          Esta lista ´ uma vers˜o resumida da lista mysqlcc.
                     e         a
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                               35



plusplus   Lista sobre todos os t´picos relacionados ` programa¸˜o da API C++ para o
                                 o                   a         ca
           MySQL.
plusplus-digest
          Uma vers˜o resumida da lista plusplus.
                  a
msql-mysql-modules
          Lista sobre o Suporte MySQL no Perl com o msql-mysql-modules que ´
                                                                           e
          chamado DBD-mysql.
msql-mysql-modules-digest
          Lista resumida sobre a vers˜o do msql-mysql-modules.
                                     a
Se vocˆ n˜o obtiver uma resposta para suas quest˜es na lista de mensagens do MySQL, uma
       e a                                      o
op¸˜o ´ pagar pelo suporte da MySQL AB, que ir´ colocar vocˆ em contato direto com
   ca e                                           a              e
desenvolvedores MySQL. Veja Se¸˜o 1.4.1 [Suporte], P´gina 17.
                                ca                   a
A seguinte tabela mostra algumas listas de mensagens sobre o MySQL que utilizam linguas
diferentes do Inglˆs. Perceba que elas n˜o s˜o operadas pela MySQL AB, portanto, n˜o
                  e                      a a                                         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.
mysql-de-request@lists.4t2.com Lista de mensagens alem~.
                                                      a
          Envie   subscribe mysql-de your@email.address   para  esta   lista.
          Vocˆ pode encontrar informa¸˜es sobre esta lista de mensagens em
             e                        co
          http://www.4t2.com/mysql.
mysql-br-request@listas.linkway.com.br Lista de mensagens
          em portuguˆs Envie subscribe mysql-br your@email.address para esta lista.
                    e
mysql-alta@elistas.net Lista de mensagens espanhola.
          Envie subscribe mysql your@email.address para esta lista.

1.7.1.2 Fazendo perguntas ou relatando erros

Antes de enviar um relato de erro ou uma quest˜o, por favor fa¸a o seguinte:
                                              a               c
 • Comece pesquisando o manual MySQL online em:
    http://www.mysql.com/doc/
    N´s tentaremos manter o manual atualizado, frequentemente atualizando-o com
      o
    solu¸˜es para novos problemas encontrados! O apˆndice de hist´rico de mudan¸as
         co                                            e              o         c
                                                           ´    a     e      ´ que
    (http://www.mysql.com/doc/en/News.html) pode ser util j´ que ´ bem possivel
    uma vers˜o mais nova ja tenha a solu¸˜o para o seu problema.
               a                        ca
 • Procure no banco de dados de bugs em http://bugs.mysql.com/ para ver se o erro
    j´ foi relatado/resolvido.
     a
 • Pesquise os arquivos das listas de mensagens MySQL:
    http://lists.mysql.com/
36                                     MySQL Technical Reference for Version 5.0.0-alpha



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

1.7.1.3 Como relatar erros ou problemas

Nosso banco de dados de bugs ´ publico e pode ser pesquisado por qualquer um em
                             e
http://bugs.mysql.com/. Se vocˆ logar no sistema, vocˆ poder´ entrar novos relat´rios.
                              e                      e      a                   o
Escrever um bom relat´rio de erro exige paciˆncia, e fazˆ-lo de forma apropriada economiza
                        o                     e         e
tempo para n´s e para vocˆ. Um bom relat´rio de erros contendo um teste de caso para o
               o            e                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
a escrever seu relat´rio corretamente para que vocˆ n˜o perca seu tempo fazendo coisas que
                    o                             e a
n˜o ir˜o ajudar-nos muito ou nada.
 a    a
N´s encorajamos todo mundo a usar o script mysqlbug para gerar um relato de erros (ou um
  o
relato sobre qualquer problema), se poss´ivel. mysqlbug pode ser encontrado no diret´rio
                                                                                     o
‘scripts’ na distribui¸˜o fonte, ou, para uma distribui¸˜o bin´ria, no diret´rio ‘bin’ no
                       ca                               ca     a            o
diret´rio de instala¸˜o do MySQL. Se vocˆ n˜o puder utilizar o mysqlbug (por exemplo,
     o              ca                     e a
se vocˆ o estiver executando no Windows), ´ ainda de vital importˆncia que vocˆ incluia
       e                                     e                     a             e
todas as informa¸˜es necess´rias listadas nesta se¸˜o (o mais importante ´ uma descri¸˜o
                 co         a                     ca                     e            ca
do sistema operacional e a vers˜o do MySQL).
                               a
O script mysqlbug lhe ajudar´ a gerar um relat´rio determinando muitas das seguintes
                              a                   o
informa¸˜es automaticamente, mas se alguma coisa importante estiver faltando, por favor
        co
forne¸a-o junto de sua mensagem! Por favor leita esta se¸˜o com cuidado e tenha certeza
     c                                                    ca
que todas as informa¸˜es descritas aquie est˜o inclu´
                     co                     a       idas no seu relat´rio.
                                                                     o
De preferˆncia, vocˆ deve testar o problema usando a ultima vers˜o de produ¸˜o ou desen-
         e          e                                ´          a          ca
volvimento do Servidro MySQL antes do envio. Qualquer um deve estar apto a repetir o
erro apenas usando ’mysql test < script’ no caso de teste incluido ou executando o script
sheel ou Perl que ´ inclu´ no relat´rio de erros.
                  e      ido        o
Todos os erros enviados para o banco de dados dem bugs em http://bugs.mysql.com/
ser˜o corrigidos ou documentados na pr´xma distribui¸˜o do MySQL. Se apenas pequenas
   a                                  o             ca
mudan¸as de c´digo forem necess´rias enviaremos um patch para corrigir o problema.
       c       o                a
O lugar comum para relatar erros e problemas ´ http://bugs.mysql.com.
                                             e
Se vocˆ encontrar um erro de seguran¸a no MySQL, envie um email para
       e                            c
security@mysql.com.
Se vocˆ tiver um relat´rio de erro que possa ser repetido, relate-o no banco de dados de bugs
      e               o
em http://bugs.mysql.com. Note que mesmo neste caso ´ bom executar o script mysqlbug
                                                            e
primeiro para ter informa¸˜es sobre o sistema. Qualquer erro que pudermos repetir tem
                           co
uma grande chance de ser corrigido na pr´xima distribui¸˜o do MySQL.
                                           o               ca
Para relatar outros problemas, vocˆ pode usar a lista de email do MySQL.
                                  e
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                  37



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
conhecem a causa do problema e assumem que alguns detalhes n˜o importam. Um bom
                                                                  a
                   e    a     u                                              ´
principio ´: Se vocˆ est´ em d´vida sobre declarar alguma coisa, declare-a ! E milhares de
          e
vezes mais r´pido e menos problem´tico escrever um pouco de linhas a mais no seu relat´rio
             a                    a                                                   o
do que ser for¸ado a perguntar de novo e esperar pela resposta porque vocˆ n˜o forneceu
               c                                                            e a
informa¸˜o sufiente da primeira vez.
        ca
Os erros mais comuns acontecem porque as pessoas n˜o indicam o n´mero da vers˜o da
                                                       a               u           a
distribui¸˜o do MySQL que est˜o usando, ou n˜o indicam em qual plataforma elas tem
         ca                      a              a
o MySQL instalado (Incluindo o n´mero da vers˜o da plataforma). Essa informa¸˜o ´
                                     u            a                                 ca e
muito relevante, e em 99% dos casos o relato de erro ´ in´til sem ela! Frequentemente n´s
                                                     e u                               o
recebemos quest˜es como, “Por que isto n˜o funciona para mim?” ent˜o n´s vemos que
                 o                         a                             a o
aquele recurso requisitado n˜o estava implementado naquela vers˜o do MySQL, ou que o
                            a                                     a
erro descrito num relat´rio foi resolvido em uma vers˜o do MySQL mais nova. Algumas
                        o                             a
vezes o erro ´ dependente da plataforma; nesses casos, ´ quase imposs´ corrigir alguma
             e                                          e              ivel
coisa sem conhecimento do sistema operacional e o n´mero da vers˜o da plataforma.
                                                    u              a
Lembre-se tamb´m de fornecer informa¸˜es sobre seu compilador, se isto for relacionado
                e                      co
ao problema. Frequentemente pessoas encontram erros em compiladores e acreditam que o
problema ´ relacionado ao MySQL. A maioria dos compiladores est˜o sobre desenvolvimento
         e                                                      a
todo o tempo e tornam-se melhores a cada vers˜o. Para determinar se o seu problema
                                                 a
depende ou n˜o do compilador, n´s precisamos saber qual compilador foi usado. Note que
             a                   o
todo problema de compila¸˜o deve ser estimado como relato de erros e, consequentemente
                          ca
publicado.
´
E de grande ajuda quando uma boa descri¸˜o do problema ´ inclu´ no relato do erro. Isto
                                         ca               e    ida
´, um bom exemplo de todas as coisas que o levou ao problema e a correta descri¸˜o do
e                                                                                ca
problema. Os melhores relat´rios s˜o aqueles que incluem um exemplo completo mostrando
                            o     a
como reproduzir o erro ou o problema Veja Se¸˜o D.1.6 [Casos de teste reproduz´
                                                ca                                iveis],
P´gina 1075.
  a
Se um programa produz uma mensagem de erro, ´ muito importante incluir essas mensagens
                                               e
no seu relat´rio! Se n´s tentarmos procurar por algo dos arquivos usando programas, ´
            o         o                                                              e
melhor que as mensagens de erro relatadas sejam exatamente iguais a que o programa
produziu. (At´ o caso deve ser observado!) Vocˆ nunca deve tentar lembrar qual foi a
               e                                 e
mensagem de erro; e sim, copiar e colar a mensagem inteira no seu relat´rio!
                                                                       o
Se vocˆ tem um problema com o MyODBC, vocˆ deve tentar gerar um arquivo para
       e                                            e
rastremento de erros (trace) do MyODBC. Veja Se¸˜o 12.2.7 [MyODBC bug report],
                                                      ca
P´gina 875.
  a
Por favor lembre-se que muitas das pessoas que ler˜o seu relat´rio podem usar um v´
                                                  a           o                    ideo de
80 colunas. Quando estiver gerando relat´rios ou exemplos usando a ferramenta de linha
                                         o
de comando mysql, ent˜o dever´ usar a op¸˜o --vertical (ou a instru¸˜o terminadora G)
                       a       a         ca                             ca
para sa´ que ir´ exceder a largura dispon´ para este tipo de v´
        ida      a                         ivel                     ideo (por exemplo, com
a instru¸˜o EXPLAIN SELECT; veja exemplo abaixo).
         ca
Por favor inclua a seguinte informa¸˜o no seu relat´rio:
                                   ca              o
 • O n´mero da vers˜o da distribui¸˜o do MySQL que est´ em uso (por exemplo, MySQL
      u             a             ca                  a
   Version 3.22.22). Vocˆ poder´ saber qual vers˜o vocˆs est´ executando, usando o
                        e       a               a      e    a
38                                      MySQL Technical Reference for Version 5.0.0-alpha



     comando mysqladmin version. mysqladmin pode ser encontrado no diret´rio ‘bin’     o
     sob sua instala¸˜o do MySQL.
                       ca
 •   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
     vocˆ pode obter esta informa¸˜o executando o comando Unix uname -a. Se vocˆ tra-
         e                            ca                                                   e
     balho no Windows, vocˆ pode normalmente conseguir o nome e o n´mero da vers˜o com
                              e                                            u             a
     um duplo clique sobre o ´  icone ”Meu Computador” e em seguida no menu ”Ajuda/Sobre
     o Windows”.
 •   Algumas vezes a quantidade de mem´ria (real e virtual) ´ relevante. Se estiver em
                                                 o                  e
     d´vida, inclua esses valores.
      u
 •   Se vocˆ estiver usando uma distribui¸˜o fonte do MySQL, ´ necess´rio o nome e n´mero
             e                                ca                  e       a               u
     da vers˜o do compilador usado. Se vocˆ estiver usando uma distribui¸˜o bin´ria, ´
               a                                     e                              ca   a    e
     necess´rio o nome da distribui¸˜o.
             a                         ca
 •   Se o problema ocorre durante a compila¸˜o, inclua a(s) exata(s) mensagem(s) de erro(s)
                                                  ca
     e tamb´m algumas linhas do contexto envolvendo o c´digo no arquivo onde o erro
              e                                                 o
     ocorreu.
 •   Se o mysqld finalizou, vocˆ dever´ relatar tamb´m a consulta que travou o mysqld.
                                   e        a               e
     Normalmente vocˆ pode encontrar isto executando mysqld com o log habilitado. Veja
                          e
     Se¸˜o D.1.5 [Using log files], P´gina 1074.
        ca                              a
 •   Se alguma tabela do banco de dados estiver relacionado ao problema, inclua a sa´ de  ida
     mysqldump --nodata nome_db nome_tbl1 nome_tbl2.... Isto ´ muito f´cil de fazer
                                                                         e           a
     e ´ um modo poderoso de obter informa¸˜es sobre qualquer tabela em um banco de
       e                                              co
     dados que ir´ ajudar-nos a criar uma situa¸˜o parecida da que vocˆ tem.
                     a                                  ca                   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 que
                               ida                                          u
     a instru¸˜o SELECT produz. Vocˆ tamb´m deve incluir a sa´ de SHOW CREATE TABLE
               ca                         e        e                ida
     nome_tabela para cada tabela envolvida. Quanto mais informa¸˜o vocˆ fornecer sobre
                                                                        ca        e
     a sua situa¸˜o, mais f´cil ser´ para algu´m ajudar-lo! A seguir um exemplo de um
                    ca        a       a               e
     relat´rio de erros muito bom (ele deve ser postado com o script mysqlbug):
           o
     Exemplo de execu¸˜o usando a ferramenta de linha de comando mysql (perceba o uso
                          ca
     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
     script de entrada que ir´ reproduzir a anomalia. Este script deve incluir qualquer ar-
                                a
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                       39



     quivo de fonte necess´rio. Quanto mais pr´ximo o script puder reproduzir sua situa¸˜o,
                          a                   o                                        ca
     melhor. Se vocˆ puder fazer uma s´rie de testes repetidos, vocˆ poder´ post´-lo para o
                    e                  e                           e      a     a
     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
     informa¸˜o da performance do seus sistema.
            ca
 •
     Se vocˆ n˜o puder produzir um caso de teste em algumas linhas, ou se a tabela de
             e a
     testes for muito grande para ser enviada por email para a lista de mensagens (mais de
     10 linhas), vocˆ dever´ dar um dump de suas tabelas usando o mysqldump e criar um
                      e      a
     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/.
     E envie uma pequena descri¸˜o do problema para bugs@lists.mysql.com.
                                    ca
 •   Se vocˆ achar que o MySQL produziu um resultado estranho para uma consulta, n˜o
             e                                                                              a
     inclua somente o resultado, mas tamb´m sua opini˜o de como o resultado deve ser, e
                                               e           a
     uma conta descrevendo o base de sua opini˜o.   a
 •   Quando fornecer um exemplo do problema, ´ melhor usar os nomes de vari´veis, nomes
                                                    e                            a
     de tabelas, etc. utilizados na sua situa¸˜o atual do que enviar com novos nomes. O
                                                 ca
     problema pode ser relacionado ao nome da vari´vel ou tabela! Esses casos s˜o raros,
                                                        a                             a
     mas ´ melhor prevenir do que remediar. Al´m disso, ser´ mais f´cil para vocˆ fornecer
           e                                        e            a     a             e
     um exemplo que use sua situa¸˜o atual, que ´ o que mais importa para n´s. No caso
                                       ca             e                           o
     de ter dados que n˜o deseja mostrar para outros, vocˆ pode usar o ftp para transferi-
                          a                                   e
     lo para ftp://support.mysql.com/pub/mysql/secret/. Se os dados s˜o realmente
                                                                                a
     confidenciais, e vocˆ n˜o deseja mostr´-los nem mesmo para n´s, ent˜o v´ em frente e
                           e a                a                      o       a a
     providencie um exemplo usando outros nome, mas, por favor considere isso como uma
     unica chance.
     ´
 •   Inclua, se poss´ivel, todas as op¸˜es fornecidas aos programas relevantes. Por exemplo,
                                       co
     indique as op¸˜es que vocˆ utiliza quando inicializa o daemon mysqld e aquelas que s˜o
                   co            e                                                          a
     utilizadas para executar qualquer programa cliente MySQL. As op¸˜es para programas
                                                                          co
     como o mysqld e mysql, e para o script configure, s˜o frequentemente chaves para
                                                                a
     respostas e s˜o muito relevantes! Nunca ´ uma m´ id´ia inclu´
                   a                              e       a e        i-las de qualquer forma!
     Se vocˆ usa algum m´dulo, como Perl ou PHP por favor forne¸a o n´mero da vers˜o
             e               o                                         c      u             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
     vocˆ obteve quando tentava conectar! Quando vocˆ testar seus privil´gios, vocˆ deve
         e                                                 e                  e         e
     primeiramente executar mysqlaccess. Depois, execute mysqladmin reload version e
     tente conectar com o programa que gerou o problema. mysqlaccess pode ser encon-
     trado no diret´rio ‘bin’ sob seu diret´rio de instala¸˜o do MySQL.
                     o                       o             ca
 •   Se vocˆ tiver um patch para um erro, isso ´ bom, mas n˜o assuma que o patch ´
              e                                       e            a                          e
     tudo que precisamos, ou que iremos us´-lo, se vocˆ n˜o fornecer algumas informa¸˜es
                                                a         e a                             co
     necess´rias, como os casos de testes mostrando o erro que seu patch corrige. N´s
             a                                                                              o
     podemos encontrar problemas com seu patch ou n´s podemos n˜o entendˆ-lo ao todo;
                                                          o             a        e
     se for assim, n˜o podemos us´-lo.
                     a               a
40                                         MySQL Technical Reference for Version 5.0.0-alpha



     Se n´s n˜o verificarmos exatamente o que o patch quer dizer, n´s n˜o poderemos us´-
           o a                                                             o a                     a
     lo. Casos de testes ir˜o ajudar-nos aqui. Mostre que o patch ir´ cuidar de todas as
                                 a                                            a
     situa¸˜es que possam ocorrer. Se n´s encontrarmos um caso (mesmo que raro) onde o
            co                                 o
     patch n˜o funcionaria, ele pode ser in´til.
               a                                  u
 •   Palpites sobre qual ´ o erro, porque ocorre, ou do que ele depende, geralmente est˜o
                               e                                                                  a
     errados. Mesmo o time MySQL n˜o pode adivinhar antecipadamente tais coisas sem
                                              a
     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
     de mensagens para que outros saibam que vocˆ tentou solucionar o problema.
                                                           e
 •   Se vocˆ obter um parse error, por favor confira sua sintaxe com aten¸˜o! Se
              e                                                                            ca
     vocˆ n˜o conseguiu encontrar nada errado com ela, ´ extremamente prov´vel
         e a                                                          e                         a
     que que sua vers˜o corrente do MySQL n˜o suporte a consulta que vocˆ
                              a                              a                                      e
     est´ utilizando.
         a                      Se vocˆ estiver usando a vers˜o recente e o manual em
                                      e                          a
     http://www.mysql.com/documentation/manual.php n˜o cobrir a sintaxe que
                                                                    a
     vocˆ estiver usando, o MySQL n˜o suporta sua consulta. Neste caso, suas unicas
         e                                    a
     op¸˜es s˜o implementar vocˆ mesmo a sintaxe ou enviar uma mensagem para
        co       a                       e
     mysql-licensing@mysql.com e perguntar por uma oferta para implement´-lo!           a
     Se o manual cobrir a sintaxe que vocˆ estiver usando, mas vocˆ tiver uma vers˜o mais
                                                 e                       e                  a
     antiga do MySQL, vocˆ dever´ conferir o hist´rico de altera¸˜es do MySQL para ver
                                  e      a                 o            co
     quando a sintaxe foi implementada. Neste caso, vocˆ tem a op¸˜o de atualizar para
                                                               e             ca
     uma nova vers˜o do MySQL. Veja Apˆndice C [News], P´gina 948.
                       a                           e               a
 •   Se vocˆ tiver um problema do tipo que seus dados aparecem corrompidos ou vocˆ
              e                                                                                     e
     obtem erros quando vocˆ acessa alguma tabela em particular, vocˆ dever´ primeiro
                                    e                                            e       a
     checar depois tentar reparar suas tabelas com myisamchk ou CHECK TABLE e REPAIR
     TABLE. Veja Cap´      “ptexi tulo 4 [MySQL Database Administration], P´gina 208.
                                                                                 a
 •   Se vocˆ frequentemente obt´m tabelas corrompidas,
                 e                            e                                 vocˆ deve ten-
                                                                                    e
     tar encontrar quando e porque isto acontece!                      Neste caso, o arquivo
     ‘mysql-data-directory/’hostname’.err’ deve conter algumas informa¸˜es                      co
     sobre o que aconteceu. Veja Se¸˜o 4.10.1 [Error log], P´gina 373. Por favor forne¸a
                                           ca                      a                              c
     qualquer informa¸˜o relevante deste arquivo no seu relat´rio de erro! Normalmente
                           ca                                        o
     o mysqld NUNCA dever´ danificar uma tabela se nada o finalizou no meio de uma
                                    a
     atualiza¸˜o! Se vocˆ puder encontrar a causa do fim do mysqld, se torna muito mais
                ca            e
     f´cil para n´s fornecemos a vocˆ uma solu¸˜o para o problema! Veja Se¸˜o A.1 [What
      a             o                     e          ca                              ca
     is crashing], P´gina 907.
                       a
 •   Se poss´  ivel, fa¸a o download e instale a vers˜o mais recente do MySQL para saber se
                       c                                a
     ela resolve ou n˜o o seu problema. Todas vers˜es do MySQL s˜o muito bem testadas
                         a                                 o               a
     e devem funcionar sem problemas! Acreditamos em deixar tudo, o mais comp´tivel           a
           ´
     possivel com as vers˜es anteriores, e vocˆ conseguir´ mudar de vers˜es MySQL em
                                o                    e         a                   o
     minutos! Veja Se¸˜o 2.2.4 [Which version], P´gina 80.
                           ca                            a
Se vocˆ ´ um cliente de nosso suporte, por favor envio o seu relat´rio de erros em
       e e                                                            o
mysql-support@mysql.com para tratamento de alta priorit´rio, bem como para a lista de
                                                         a
mensagens apropriada para ver se mais algu´m teve experiˆncias com (e talvez resolveu) o
                                          e             e
problema.
Para informa¸˜es sobre relatar erros no MyODBC, veja Se¸˜o 12.2.4 [ODBC Problems],
            co                                            ca
P´gina 869.
 a
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                   41



Para solu¸˜es a alguns problemas comuns, veja Veja Apˆndice A [Problems], P´gina 907.
          co                                            e                      a
Quando respostas s˜o enviadas para vocˆ individualmente e n˜o para a lista de mensagens, ´
                   a                   e                    a                            e
considerado boa etiqueta resumir as respostas e enviar o resumo para a lista de mensagens
para que outras possam ter o benef´ icio das respostas que vocˆ recebeu que ajudaram a
                                                               e
resolver seu problema!

1.7.1.4 Guia para responder quest˜es na lista de discuss˜o
                                 o                      a

Se vocˆ considerar que sua respota possa ter um amplo interesse, vocˆ pode querer post´-la
       e                                                            e                  a
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        ivel para que outras pessoas al´me
da que postou a pergunda possam se beneficiar dela. Quando vocˆ postar para a lista, por
                                                                  e
favor tenha certeza que sua resposta n˜o ´ uma r´plica de uma resposta anterior.
                                      a e        e
Tente resumir a parte essencial da quest˜o na sua resposta, n˜o se sinta obrigado a citar a
                                        a                    a
mensagem original inteira.
Por favor n˜o poste mensagens a partir de seu browser com o modo HTML ligado! Muitos
            a
usu´rios n˜o leem e-mail com browser!
   a       a

1.7.2 Suporte a Comunidade MySQL Atrv´s do IRC (Internet
                                     e
      Relay Chat)

Em adi¸˜o as diversas listas de email, vocˆ pode pessoas experientes da comunidade no IRC
       ca                                 e
(Internet Relay Chat). Estes s˜o os melhores canais atualmente conhecidos por n´s:
                                 a                                                o
  • freenode (veja http://www.freenode.net/ para servidores)
      • #mysql A princ´ s˜o quest˜es sobre o MySQL, mas d´vidas sobre outros bancos
                         ipio a        o                        u
         de dados e SQL s˜o bemvindas.
                           a
      • #mysqlphp Quest˜es sobre MySQL+PHP, uma combina¸˜o popular.
                           o                                     ca
      • #mysqlperl Quest˜es sobre MySQL+Perl, outra combina¸˜o popular.
                             o                                     ca
  • EFnet (veja http://www.efnet.org/ para servidores)
      • #mysql Quest˜es sobre MySQL.
                       o
Se vocˆ est´ procurando por programas clientes de IRC para conectar a uma rede IRC, dˆ
      e    a                                                                         e
uma olhada no X-Chat (http://www.xchat.org/). X-Chat (licen¸a GPL) est´ dispon´
                                                               c           a      ivel
para as plataformas Unix e Windows.

1.8 Qual compatibilidade aos padr˜es o MySQL oferece ?
                                 o

Esta se¸˜o descreve como o MySQL se relaciona aos padr˜es ANSI/ISO SQL. O Servidor
        ca                                               o
MySQL tem muitas extens˜es aos padr˜es SQL, e aqui vocˆ descobrir´ quais s˜o elas, e como
                          o           o                e          a       a
us´-las. Vocˆ ir´ tamb´m encontrar informa¸˜o sobre falta de funcionalidade do Servidor
  a         e a        e                   ca
MySQL, e como trabalhar com algumas diferen¸as.
                                              c
Nosso objetivo ´ n˜o restringir, sem um boa raz˜o, a usabilidade do MySQL Server para
                e a                             a
qualquer uso. Mesmo se n˜o tivermos os recursos para fazer o desenvolvimento para todos
                          a
os usos poss´
            iveis, estamos sempre querendo ajudar e oferecer sugest˜es para pessoas que
                                                                    o
est˜o tentando usar o MySQL Server em novos territ´rios.
   a                                               o
42                                    MySQL Technical Reference for Version 5.0.0-alpha



Um dos nossos principais objetivos com o produto ´ continuar a trabalhar em acordo com
                                                   e
o padr˜o SQL-99, mas sem sacrificar velocidade e confian¸a. N˜o estamos receosos em
       a                                                    c      a
adicionar extens˜es ao SQL ou suporte para recursos n˜o SQL se ele aumentar extremamente
                o                                    a
a usabilidade do MySQL Server para uma grande parte de nossos usu´rios. (A nova interface
                                                                     a
HANDLER no MySQL Server 4.0 ´ um exeemplo desta estrat´gia. Veja Se¸˜o 6.4.9 [HANDLER],
                               e                          e            ca
P´gina 595.)
  a
Continuaremos a suportar bancos de dados transacionais e n˜o transacionais para satisfazer
                                                          a
                                                   ´
tanto o uso pesado na web quanto o uso de miss˜o critica 24/7.
                                              a
O MySQL Server foi projetado inicialmente para trabalhar com bancos de dados de tamanho
m´dio (10-100 milh˜es de registros ou cerca de 100 MB por tabela) em sistemas computa-
  e                o
cionais pequenos. Continuaremos a extender o MySQL Server para funcionar ainda melhor
com banco de dados na ordem de terabytes, assim como tornar poss´ compilar uma vers˜o
                                                                ivel                 a
reduzida do MySQL mais apropriadas para handhels e uso embutido. O design compacto
do servidor MySQL tornam ambas as dire¸˜es poss´
                                           co      iveis sem qualquer conflito na ´rvore
                                                                                  a
fonte.
Atualmente n˜o estamos buscando suporte em tempo real ou banco de dados em cluster
            a
(mesmo se vocˆ j´ puder fazer muitas coisas com nossos servi¸os de replica¸˜o).
             e a                                            c             ca
Estamos buscando melhoras no fornecimento de suporte a XML no servidor de banco de
dados.

1.8.1 Qual Padr˜o o MySQL Segue?
               a

Entry-level SQL-92. ODBC levels 0-3.51.
We are aiming toward supporting the full SQL-99 standard, but without concessions to
speed and quality of the code.

1.8.2 Executando o MySQL no modo ANSI

Se vocˆ inicializa o mysqld com a op¸˜o --ansi ou --sql-mode=ANSI, o seguinte compor-
      e                             ca
tamento ´ alterado no MySQL:
         e
 • || ´ um oprador de concatena¸˜o de strings em vez de um sinˆnimo para OR.
      e                        ca                             o
 • ‘"’ ´ tratado como um caracter identificados (com o caracter de aspasr ‘‘’ do MySQL
       e
   Server)e n˜o um caracter de string. Vocˆ ainda pode usar ‘‘’ para citar identificadores
              a                              e
   no modo ANSI. Uma implica¸˜o disto ´ que vocˆ n˜o pode usar aspas duplas para citar
                                 ca        e       e a
   um string literal, porque ela ser´ intepretada como um identificador.
                                    a
 • Vocˆ pode ter qualquer n´mero de espa¸os entre um nome de fun¸˜o e o ‘(’. Isto
       e                       u              c                          ca
   faz com que todos nomes de fun¸˜es sejam tratadas como palavras reservadas. Como
                                     co
   resultado, se vocˆ quiser acessar qualquer banco de dados, tabelas ou coluna que ´ uma
                    e                                                               e
   palavra reservada, vocˆ deve coloc´-lo entre aspas. Por exemplo, por haver a fun¸˜o
                          e             a                                              ca
   USER(), o nome da tabela user no banco de dados mysql e a coluna User nesta tabela
   se torna reservada, assim vocˆ deve coloc´-la entre aspas:
                                  e          a
          SELECT "User" FROM mysql."user";
 • REAL ´ um sinˆnimo para FLOAT no lugar de um sinˆnimo de DOUBLE.
        e       o                                  o
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                  43



 • O n´ de isolamento padr˜o de um transa¸˜o ´ SERIALIZABLE. Veja Se¸˜o 6.7.6 [SET
      ivel                  a            ca e                       ca
   TRANSACTION], P´gina 618.
                  a
 • Vocˆ pode usar um campo/express˜o em GROUP BY que n˜o est´ na lista de campos.
      e                           a                   a     a
Executando o servidor em modo ANSI ´ o mesmo que inici´-lo com estas op¸˜es:
                                   e                  a                co
     --sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,
     IGNORE_SPACE,ONLY_FULL_GROUP_BY --transaction-isolation=serializable
No MySQL 4.1, vocˆ pode conseguir o mesmo efeito com estas duas instru¸˜es:
                 e                                                    co
     SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
     SET GLOBAL sql_mode=
       "REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY";
No MySQL 4.1.1 a ultima op¸˜o sql_mode tamb´m pode ser dada com:
                 ´        ca               e
     SET GLOBAL sql_mode="ansi";
No caso acima o sql_mode estar´ configurado com todas as op¸˜es que s˜o relevantes para
                              a                           co        a
o modo ANSI. Vocˆ pode verificar o resultado fazendo:
                  e
     mysql> SET GLOBAL sql_mode="ansi";
     mysql> SELECT @@GLOBAL.sql_mode;
              -> "REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_

1.8.3 Extens˜es do MySQL para o Padr˜o SQL-92
            o                       a

O MySQL fornece algumas extens˜es que vocˆ provavelmente n˜o ir´ encontrar em alguns
                                  o         e                 a    a
bancos de dados SQL. Fique avisado que se vocˆ us´-las, seu c´digo pode n˜o ser mais
                                                e a             o             a
port´vel para outros servidores SQL. Em alguns casos, vocˆ pode escrever c´digo que inclui
    a                                                    e                o
extens˜es MySQL, mas continua port´vel, usando coment´rios da forma /*! ...*/. Neste
      o                              a                   a
caso, o MySQL ir´ analisar e executar o c´digo com o coment´rio como ir´ fazer com
                  a                        o                    a            a
qualquer outra instru¸˜o MySQL, mas outros servidores SQL ir˜o ignorar as extens˜es.
                      ca                                         a                    o
Por exemplo:
     SELECT /*! STRAIGHT_JOIN */ nome_campo FROM table1,table2 WHERE ...
Se vocˆ adicionar um n´mero de vers˜o depois do ’!’, a sintaxe s´ ser´ executada se a
      e               u            a                            o    a
vers˜o do MySQL ´ igual ou maior que o n´mero de vers˜o usado:
    a             e                     u            a
     CREATE /*!32302 TEMPORARY */ TABLE t (a INT);
O exemplo acima significa que se vocˆ tiver uma vers˜o do MySQL 3.23.02 ou mais nova,
                                   e               a
ent˜o o MySQL ir´ usar a palavra-chave TEMPORARY
   a            a
Extens˜es MySQL s˜o listadas abaixo:
      o          a
 • 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
   nada determinada pelo conjunto de caracteres corrente (ISO-8859-1 Latin1 por padr˜o).
                                                                                    a
   Se vocˆ n˜o gosta disso vocˆ dever´ declarar suas colunas com o atributo BINARY ou
         e a                  e      a
   usar o operador BINARY, que fazendo com que as compara¸˜es sejam feitas de acordo
                                                             co
   com a ordem ASCII usada na m´quina servidora do MySQL.
                                  a
44                                    MySQL Technical Reference for Version 5.0.0-alpha



 • 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 do    o
   banco de dados.
   Isto tem algumas implica¸˜es:co
     − 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). Veja Se¸˜o 6.1.3 [Name case sensitivity], P´gina 473.
                                        ca                                  a
                                                    ´
     − Nomes de Bancos de dados, tabelas, indices, campos ou apelidos pode come¸ar     c
        com um d´  igito (por´m n˜o podem consistir somente de digitos).
                              e     a
     − 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.
 • Em algumas instru¸˜es SQL, vocˆ pode acessar tabelas de diferentes bancos de dados
                        co               e
   com a sintaxe nome_bd.nome_tbl. Alguns servidores SQL fornecem a mesma fun-
   cionalidade mas chamam isto de User space. O MySQL n˜o suporta tablespaces como
                                                                    a
   em: create table ralph.my_table...IN minha_tablespace.
 • LIKE ´ permitido em campos num´ricos.
          e                               e
 • O uso de INTO OUTFILE e STRAIGHT_JOIN em uma instru¸˜o SELECT. Veja Se¸˜o 6.4.1
                                                                   ca               ca
   [SELECT], P´gina 562.
                 a
 • A op¸˜o SQL_SMALL_RESULT em uma instru¸˜o SELECT.
         ca                                          ca
 • EXPLAIN SELECT para obter uma descri¸˜o de como as tabelas s˜o ligadas.
                                                ca                       a
 • A utiliza¸˜o de nomes de ´
              ca                indices, ´indices em um prefixo de um campo, e uso de INDEX
   ou KEY em uma instru¸˜o CREATE TABLE. Veja Se¸˜o 6.5.3 [CREATE TABLE], P´gina 597.
                           ca                              ca                     a
 • O uso de TEMPORARY ou IF NOT EXISTS com CREATE TABLE.
 • O uso de COUNT(DISTINCT lista) onde ’lista’ ´ maior que um elemento.
                                                         e
 • O uso de CHANGE nome_campo, DROP nome_campo, ou DROP INDEX, IGNORE ou RENAME
   em uma instru¸˜o ALTER TABLE. Veja Se¸˜o 6.5.4 [ALTER TABLE], P´gina 607.
                   ca                            ca                        a
 • O uso de RENAME TABLE. Veja Se¸˜o 6.5.5 [RENAME TABLE], P´gina 611.
                                         ca                            a
 • Utiliza¸˜o de m´ltiplas cl´usulas ADD, ALTER, DROP, ou CHANGE em uma instru¸˜o ALTER
            ca      u          a                                                  ca
   TABLE.
 • O uso de DROP TABLE com as palavras-chave IF EXISTS.
 • Vocˆ pode remover m´ltiplas tabelas com uma instru¸˜o unica DROP TABLE.
       e                   u                                    ca ´
 • As cl´usulas ORDER BY e LIMIT das instru¸˜es UPDATE e DELETE.
         a                                         co
 • Sintaxe INSERT INTO ... SET col_name = ....
 • 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.
       a                                     co
 • O uso de LOAD DATA INFILE. Em alguns casos essa sintaxe ´ compat´ com o Oracle
                                                                      e      ivel
   LOAD DATA INFILE. Veja Se¸˜o 6.4.8 [LOAD DATA], P´gina 587.
                                   ca                         a
 • As intru¸˜es ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE, e REPAIR TABLE.
              co
 • A instru¸˜o SHOW. Veja Se¸˜o 4.6.8 [SHOW], P´gina 303.
              ca                 ca                    a
 • Strings podem ser fechadas pelo ‘"’ ou ‘’’, n˜o apenas pelo ‘’’.
                                                       a
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                 45



 • O uso do meta-caractere de escape ‘’.
 • A instru¸˜o SET OPTION. Veja Se¸˜o 5.5.6 [SET OPTION], P´gina 461.
            ca                       ca                         a
 • Vocˆ n˜o precisa nomear todos os campos selecionados na parte GROUP BY. Isto fornece
       e a
   melhor performance para algumas consultas espec´      ificas, mas muito comuns. Veja
   Se¸˜o 6.3.7 [Group by functions and modifiers], P´gina 555.
      ca                                               a
 • Pode ser especificado ASC e DESC com o GROUP BY.
 • Para tornar mais f´cil para usu´rios que venham de outros ambientes SQL, o MySQL
                      a            a
   suporta apelidos (aliases) para v´rias fun¸˜es. Por exemplo, todas fun¸˜es de string
                                     a        co                           co
   suportam as sintaxes ANSI SQL e ODBC.
 • O MySQL entende os operadores || e && como ou(OR) e e(AND) logicos, como na
   linguagem de programa¸˜o C. No MySQL, || e OR s˜o sinˆnimos, assim como && e
                           ca                               a     o
   AND. Devido a esta ´tima sintaxe, o MySQL n˜o suporta o operador ANSI SQL para
                        o                           a
   concatena¸˜o de strings ||; em vez disso, use o CONCAT(). Como CONCAT() aceita
              ca
   v´rios argumentos, ´ f´cil converter o uso do operador || para MySQL.
     a                 e a
 • CREATE DATABASE or DROP DATABASE. Veja Se¸˜o 6.5.1 [CREATE DATABASE], P´gina 596.
                                                  ca                           a
 • 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
   compara¸˜es de campos a esquerda do FROM nas instru¸˜es SELECT. Por exemplo:
            co                                               co
         mysql> SELECT col1=1 AND col2=2 FROM nome_tabela;
 • A fun¸˜o LAST_INSERT_ID(). Veja Se¸˜o 12.1.3.31 [mysql_insert_id()], P´gina 799.
         ca                               ca                                   a
 • 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
   receber qualquer n´mero de argumentos.)
                      u
 • 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 SQL-99 s´ suporta remo¸˜o de caracteres
                                                          o             ca
   unicos.
   ´
 • As fun¸˜es do GROUP BY: STD(), BIT_OR(), BIT_AND() e BIT_XOR() e GROUP_CONCAT().
          co
   Veja Se¸˜o 6.3.7 [Group by functions and modifiers], P´gina 555.
           ca                                                a
 • Uso de REPLACE no lugar de DELETE + INSERT. Veja Se¸˜o 6.4.7 [REPLACE], P´gina 587.
                                                            ca                 a
 • 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;

1.8.4 Diferen¸as do MySQL em Compara¸˜o com o SQL-92
             c                      ca

N´s tentamos fazer com que o MySQL siguisse os padr˜es ANSI SQL (SQL-92/SQL-99) e
  o                                                o
o ODBC SQL, mas em alguns casos, o MySQL realiza opera¸˜es de forma diferente:
                                                        co
  • Para campos VARCHAR, expa¸os extras s˜o removidos quando o valor ´ armazenado.
                                 c       a                           e
    Veja Se¸˜o 1.8.6 [Bugs], P´gina 53.
           ca                 a
46                                    MySQL Technical Reference for Version 5.0.0-alpha



 • Em alguns casos, campos CHAR s˜o alterados sem perguntas para o tipo de campo
                                     a
   VARCHAR. Veja Se¸˜o 6.5.3.1 [Silent column changes], P´gina 606.
                      ca                                 a
 • Privil´gios para uma tabela n˜o s˜o negadas automaticamente quando vocˆ apaga uma
         e                      a a                                      e
   tabela. Vocˆ deve usar explicitamente um REVOKE para negar privil´gios para uma
                e                                                     e
   tabela. Veja Se¸˜o 4.4.1 [GRANT], P´gina 255.
                   ca                 a
Para uma lista priorizada indicando quando novas extens˜es ser˜o adi-
                                                                 o       a
cionadas ao MySQL vocˆ deve consultar lista TODO online do MySQL em
                          e
http://www.mysql.com/doc/en/TODO.html. Esta ´ a ultima vers˜o da lista TODO neste
                                            e ´            a
manual. Veja Se¸˜o 1.6 [TODO], P´gina 26.
               ca               a

1.8.4.1 Subqueries

MySQL Version 4.1 supports subqueries and derived tables (unnamed views). Veja
Se¸˜o 6.4.2 [Subqueries], P´gina 569.
  ca                       a
For MySQL versions prior to 4.1, most subqueries can be successfully rewritten using joins
and and other methods. Veja Se¸˜o 6.4.2.11 [Rewriting subqueries], P´gina 577.
                                ca                                   a

1.8.4.2 SELECT INTO TABLE

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

1.8.4.3 Transa¸oes e Opera¸˜es Atˆmicas
              c˜          co     o

O MySQL Server (vers˜o 3.23-max e todas as vers˜es 4.0 e acima) suportam transa¸˜es com
                       a                           o                              co
os mecanismos de armazenamento transacionais InnoDB e BDB. InnoDB fornece compat-
ibilidade total com ACID. Veja Cap´ “ptexi tulo 7 [Tipos de tabelas], P´gina 629.
                                                                        a
Os outros tipos de tabelas n˜o transacionais (tais como MyISAM) no MySQL Server seguem
                            a
um paradigma diferente para integridade de dados chamado “Oper¸~es At^micas.” Em
                                                                       co     o
termos de transa¸˜o, tabelas MyISAM efetivamente sempre operam em modo AUTOCOMMIT=1.
                  ca
Opera¸˜es atˆmicas geralmente oferecem integridade compar´vel com a mais alta perfor-
       co     o                                                a
mance.
Com o MySQL Server suportando ambos os paradigmas, o usu´rio pode decidir se precisa
                                                                 a
da velocidade das opera¸˜es atˆmicas ou se precisa usar recursos transacionais em seu
                         co     o
aplicativo. Esta escolha pode ser feita em uma base por tabela.
Como notado, a compara¸˜o para tabelas transacionais vs. n˜o transacionais As noted,
                          ca                                     a
the trade off for transactional vs. non-transactional table se encontra em grande parte
no desempenho. Tabelas transacionais tem uma exigˆncia de mem´ria e espa¸o em disco
                                                       e              o         c
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                   47



significantemente maior e maior sobrecarga da CPU. Tipos de tabelas transacionais como
InnoDB oferecem muitos recursos unicos. O projeto modular do MySQL Server permite
                                  ´
o uso concorrente de todas estes mecanismos de armazenamento para servir a diferentes
exigˆncias e oferecer um ´timo desempenho em todas as situa¸˜es.
    e                    o                                 co
Mas como fazer uso dos recursos do MySQL Server para manter uma integridade rigorosa
mesmo com tabelas MyISAM n˜o transacionais e como este recurso se compara com os tipos
                           a
de tabelas transacionais?
 1. No paradigma transacional, se as suas aplica¸˜es s˜o escritas de uma forma que ´
                                                 co    a                                e
    dependente na chamada de ROLLBACK em vez de COMMIT em situa¸˜es cr´
                                                                      co   iticas, ent˜o
                                                                                      a
    transa¸˜es s˜o mais convenientes. Al´m disso, transa¸˜es asseguram que atualiza¸˜es
          co    a                       e               co                          co
    inacabadas ou atividades corrompidas n˜o sejam executadas no banco de dados; o
                                            a
    servidor oferece uma oportunidade para fazer um rollback autom´tico e seu banco de
                                                                    a
    dados ´ mantido.
          e
    O MySQL Server, na maioria dos casos, permite a vocˆ resolver potenciais problemas
                                                           e
    incluindo simples conferˆncias antes das atualiza¸˜es e executando scripts simples que
                             e                        co
    conferem inconsistˆncias no banco de dados e, automaticamente, repara ou avisa caso
                       e
    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.
 2. Mais do que nunco, atualiza¸˜es transacionais fatais podem ser reescritas para serem
                                co
    atˆmicas. De fato podemos dizer que todos problemas de integridade que transa¸˜es
      o                                                                              co
    resolvem podem ser feitas com LOCK TABLES ou atualiza¸˜es atˆmicas, assegurando que
                                                          co    o
    vocˆ nunca ir´ ter uma finaliza¸˜o autom´tica da tabela, o que ´ um problema comum
        e        a                 ca       a                     e
    em bancos de dados transacionais.
 3. Nem mesmo transa¸˜es podem prevenir todas as falhas se o servidor cair. Nestes
                        co
    casos mesmo um sistema transacional pode perder dados. A diferen¸a entre sistemas
                                                                       c
    diferentes ´ apenas em qu˜o pequeno ´ o lapso de tempo em que eles podem perder
               e             a            e
    dados. Nenhum sistema ´ 100% seguro, somente “seguro o suficiente.” Mesmo o
                              e
    Oracle, com reputa¸˜o de ser o mais seguro bancos de dados transacionais, tem relatos
                       ca
    de algumas vezes perder dados nestas situa¸˜es.
                                              co
    Para estar seguro com o MySQL Server, vocˆ apenas deve fazer backups e ter o log
                                                 e
    de atualiza¸˜es ligado. Com isto vocˆ pode se recuperar de qualquer situa¸˜o poss´
               co                       e                                    ca      ivel
                                        ´
    com bancos de dados transacionais. E sempre bom ter backups, independente de qual
    banco de dados vocˆ usa.
                        e

O paradigma transacional tem seus benef´      icios e suas desvantagens. Muitos usu´rios e
                                                                                      a
desenvolvedores de aplica¸˜es dependem da facilidade com a qual eles podem codificar
                            co
contornando problemas onde abortar parece ser, ou ´ necess´rio. No entanto, se vocˆ
                                                          e      a                        e
´ novo no paradigma de opera¸˜es atˆmicas ou tem mais familiaridade ou conforto com
e                                 co     o
transa¸˜es, considere o benef´
      co                        icio da velocidade que as tabelas n˜o transacionais podem
                                                                    a
oferece, na ordem de 3 a 5 vezes da velocidade que as tabelas transacionais mais r´pidas e
                                                                                    a
otimizadas.
Em situa¸˜es onde integridade ´ de grande importˆncia, as atuais caracter´
          co                     e                   a                    isticas do MySQL
permitem n´  iveis transacionais ou melhor confian¸a e integridade. Se vocˆ bloquear tabelas
                                                    c                    e
com LOCK TABLES todos as atualiza¸˜es ir˜o ser adiadas at´ qualquer verifica¸˜o de inte-
                                      co     a                e                 ca
gridade ser feita. Se vocˆ s´ obter um bloqueio de leitura (oposto ao bloqueio de escrita),
                           e o
48                                      MySQL Technical Reference for Version 5.0.0-alpha



ent˜o leituras e inser¸˜es poder˜o ocorrer. Os novos registros inseridos n˜o poder˜o ser vi-
   a                  co         a                                        a       a
sualizados por nenhum dos clientes que tiverem um bloqueio de LEITURA at´ eles liberarem
                                                                            e
estes bloqueios. Com INSERT DELAYED vocˆ pode enfileirar inser¸˜es em uma fila local, at´
                                            e                     co                       e
os bloqueios serem liberados, sem que o cliente precise esperar at´ a inser¸˜o completar.
                                                                     a       ca
Veja Se¸˜o 6.4.3.2 [INSERT DELAYED], P´gina 581.
         ca                                   a
“Atˆmico”, no sentido em que n´s mencionamos, n˜o ´ m´gico. Significa apenas que vocˆ
    o                              o               a e a                                   e
pode estar certo que enquanto cada atualiza¸˜o espec´
                                                ca      ifica est´ sendo executada, nenhum
                                                                a
outro usu´rio pode interferir com ela, e nunca haver´ um rollback autom´tico (que pode
            a                                         a                     a
acontecer em sistemas baseados em transa¸˜es se vocˆ n˜o tiver muito cuidado). O MySQL
                                           co        e a
tamb´m assegura que nunca ocorrer´ uma leitura suja.
      e                               a
A seguir est˜o algumas t´cnicas para trabalhar com tabelas n˜o transacionais:
              a           e                                    a
  • Loops que precisam de transa¸˜es normalmente pode ser codificados com a ajuda de
                                     co
     LOCK TABLES, e vocˆ n˜o precisa de cursores para atualizar regitros imeditamente.
                         e a
  • Para evitar o uso do ROLLBACK, vocˆ pode usar as seguintes estrat´gias:
                                         e                              e
       1. Use LOCK TABLES ... para fazer um lock todas as tabelas que vocˆ quer acessar.
                                                                            e
       2. Condi¸˜es de teste.
                co
       3. Atualize se estiver tudo OK.
       4. Use UNLOCK TABLES para liberar seus locks.
   Isto ´ normalmente um m´todo muito mais r´pido que usar transa¸˜es com poss´
        e                   e                  a                    co            iveis
   ROLLBACKs, mas nem sempre. A unica situa¸˜o que esta solu¸˜o n˜o pode tratar ´
                                    ´          ca               ca a                  e
   quando algu´m mata a threads no meio de uma atualiza¸˜o. Neste caso, todas os locks
                e                                        ca
   ser˜o liberados mas algumas das atualiza¸˜o podem n˜o ter sido execuadas.
      a                                    ca          a
 • Vocˆ tamb´m pode usar fun¸˜es para atualizar registros em uma unica opera¸˜o. Vocˆ
       e      e               co                                 ´           ca       e
   pode conseguir uma aplica¸˜o muito eficiente usando as seguintes t´cnicas:
                            ca                                      e
     • Modifique campos em rela¸˜o ao seus valores atuais.
                                 ca
     • Atualize apenas aqueles campos que realmente tiveram altera¸˜es.
                                                                   co
     Por exemplo, quando fazemos atualiza¸˜es em alguma informa¸˜o de cliente, atual-
                                              co                        ca
     izamoa apenas os dados do clientes que alteraram e testamos apenas aqueles com dados
     alterados ou dados que dependem dos dados alterados, mudaram em compara¸˜o com o
                                                                                   ca
     registro original. O teste dos dados alterados ´ feito com a cl´usula WHERE na instru¸˜o
                                                    e               a                     ca
     UPDATE. Se o registro n˜o foi atualizado, mandamos ao cliente uma mensagem: ”Some
                              a
     of the data you have changed has been changed by another user.” Ent˜o mostramos o
                                                                              a
     registro antigo versus o novo em uma janela, assim o usu´rio pode decidir qual vers˜o
                                                                a                          a
     do registro de cliente de ser usado.
     Isto nos d´ algo similar a lock de colunas mas que, na verdade, ´ melhor porque apenas
               a                                                      e
     atualizamos algumas das colunas, usando valores relativos ao seu valor atual. Isto
     significa que instru¸˜es UPDATE comuns se parecem com estas:
                         co
            UPDATE nometabela SET pay_back=pay_back+125;

           UPDATE customer
             SET
               customer_date=’current_date’,
               address=’new address’,
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                  49



              phone=’new phone’,
              money_he_owes_us=money_he_owes_us-125
            WHERE
              customer_id=id AND address=’old address’ AND phone=’old phone’;
    Como vocˆ pode ver, isto ´ muito eficiente e funciona mesmo se outro cliente alterar
               e              e
    os valores nas colunas pay_back ou money_he_owes_us.
 • Em muitos casos, usu´rios querem fazer ROLLBACK e/ou LOCK TABLES com o prop´sito
                         a                                                           o
   de gerenciarem identificadores unicos para algumas tabelas. Isto pode ser tratado muito
                                 ´
   mais eficientemente usando uma coluna AUTO_INCREMENT e tamb´m uma fun¸˜o SQL
                                                                    e            ca
   LAST_INSERT_ID() ou a fun¸˜o da API C mysql_insert_id(). Veja Se¸˜o 12.1.3.31
                               ca                                            ca
   [mysql_insert_id()], P´gina 799.
                           a
    Geralmente vocˆ pode codificar evitando lock de registro. Algumas situa¸˜es realmente
                   e                                                      co
    precisam disto, e tabelas InnoDB suportam lock de regitstro. Comoo MyISAM, vocˆ    e
    pode usar uma coluna de flag na tabela e fazer algo como a seguir:
          UPDATE nome_tbl SET row_flag=1 WHERE id=ID;
    O MySQL retorna 1 para o n´mero de linhas afetadas se as linhas foram encontradas
                                 u
    e row_flag j´ n˜o era 1 na linha original.
                a a
    Vocˆ pode pensar nisto como se o MySQL Server tivesse alterado a consulta anterior
       e
    para:
          UPDATE nome_tbl SET row_flag=1 WHERE id=ID AND row_flag <> 1;


1.8.4.4 Stored Procedures e Triggers

Steored procedures est˜o sendo implementadas em nossa vers˜o 5.0 na ´rvore de desenvolvi-
                      a                                     a         a
mento. Veja Se¸˜o 2.3.4 [Instalando da ´rvore de fontes], P´gina 100.
              ca                       a                   a
Este esfor¸o ´ baseado no SQL-99, que tˆm uma sintaxe b´sica similar (mas n˜o idˆntica) ao
          c e                          e               a                   a    e
Oracle PL/SQL. Em adi¸˜o a isto, estamoas implementando o framework SQL-99 enganchar
                        ca
em linguagens externas.
Uma Stored Procedure ´ um conjunto de comandos SQL que podem ser compilados e
                        e
armazenados no servidor. Uma fez feito isso, os clientes n˜o necessitam reescrever toda a
                                                           a
consulta mas podem fazer referˆncia ` stored procedure. Isto fornece melhor performance
                                e    a
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
        ca                                                      e      e
 ´
nivel conceitual tendo bibliotecas de fun¸˜es no servidor. No entanto, stored procedures
                                         co
aumentam a carga no servidor de banco de dados, j´ que grande parte do trabalho ´ feito
                                                    a                              e
do lado do servidor e menos do lado do cliente (aplica¸˜o).
                                                      ca
Triggers est˜o programados para serem implementados no MySQL vers˜o 5.1. Um trigger
            a                                                         a
´ um tipo de stored procedure que ´ chamado quando um evento em particular ocorre.
e                                   e
Por exemplo, vocˆ poderia configurar uma stored procedure que ´ disparada toda vez que
                 e                                             e
um registro for apagado de uma tabela transacional que automaticamente apaga o cliente
correspondente de uma tabela de clientes quando todas as transa¸˜es forem removidas.
                                                               co
50                                     MySQL Technical Reference for Version 5.0.0-alpha



1.8.4.5 Chaves Estrangeiras

No MySQL Server 3.23.44 e posterior, tabelas InnoDB suportam verifica¸˜o de restri¸˜o
                                                                             ca           ca
de chaves estrangeiras, incluindo CASCADE, ON DELETE, e ON UPDATE. Veja Se¸˜o 7.5.5.2
                                                                                  ca
[Restri¸˜es de chaves estrangeiras do InnoDB], P´gina 652.
       co                                              a
Para outros tipos de tabela, o MySQL Server atualmente apenas analisa a sintaxe de
FOREIGN KEY no comando CREATE TABLE, mas n˜o usa/armazena esta informa¸˜o. Em
                                                        a                          ca
um futuro pr´ximo esta implementa¸˜o ser´ estendida para que assim a informa¸˜o seja
              o                          ca      a                                   ca
armazenada num arquivo de especifica¸˜o de tabela e possa ser recuperado por mysqldump
                                          ca
e ODBC. Em um est´gio posterior, restri¸˜es de chaves estrangeiras ser˜o implementadas
                      a                       co                           a
para tabelas MyISAM.
Note que as chaves estrangeiras no SQL n˜o s˜o usadas para ligar tabelas, mas s˜o usadas
                                               a a                                 a
para verificar a integridade referencial. Se vocˆ deseja obter resultados de m´ltiplas tabelas
                                                   e                           u
de uma instru¸˜o SELECT, vocˆ pode fazer isto ligando tabelas:
               ca               e
      SELECT * FROM table1,table2 WHERE table1.id = table2.id;
Veja Se¸˜o 6.4.1.1 [JOIN], P´gina 567. Veja Se¸˜o 3.6.6 [Exemplos de chaves estrangeiras],
        ca                    a                     ca
P´gina 199.
  a
Quando usada como uma restri¸˜o, FOREIGN KEYs n˜o precisa ser usado se a aplica¸˜o insere
                                 ca                      a                         ca
duas linhas em tabelas MyISAM na ordem apropriada.
Para tabelas MyISAM, vocˆ pode contornar a falta de ON DELETE adicionando a instru¸˜o
                            e                                                             ca
DELETE apropriada a uma aplica¸˜o quando vocˆ deletar registros de uma tabela que tem
                                    ca                e
uma chave estrangeira. Na pr´tica isto ´ mais r´pido e muito mais port´vel que utilizar
                                 a           e         a                     a
chaves estrangeiras.
No MySQL Server 4.0 vocˆ pode utilizar dele¸˜es multi-tabela para apagar linha de muitas
                            e                     co
tabelas com um comando. Veja Se¸˜o 6.4.5 [DELETE], P´gina 584.
                                      ca                    a
A sintaxe FOREIGN KEY sem ON DELETE ... ´ usada geralmente por aplicac˜es ODBC para
                                                e                            o
produzir cl´usulas WHERE autom´ticas.
            a                      a
Note que chaves estrangeiras s˜o mal usadas com frequˆncia, o que pode causar graves
                                  a                        e
problemas. Mesmo quando usado apropriadamente, o suporte a chaves estrangeiras n˜o ´     a e
uma solu¸˜o m´gica para o problema de integridade referˆncial, embora possa ajudar.
          ca    a                                          e
Algumas vantagens das chaves estrangeiras:
  • Assumindo o projeto apropriado das rela¸˜es, as restri¸˜es de chaves estrangeiras
                                                     co          co
    tornar˜o mais dif´ para um programador introduzir uma inconsistˆncia no banco
            a          icil                                                   e
    de dados.
  • Usar atualiza¸˜es e dele¸˜es em cascata pode simplificar o c´digo do cliente.
                  co          co                                    o
  • Regras de chaves estrangeiras projetados apropriadamente ajudam ao documentar a
    rela¸˜o entre as tabelas.
         ca
Desvantagens:
 • Erros, que s˜o fac´is de se ter ao projetar a rela¸˜o das chaves, podem causar graves
                a      e                             ca
    problemaspor exemplo, regras circulares ou a combina¸˜o errada de uma dele¸˜o em
                                                           ca                    ca
    cascata.
 • Verifica¸˜o adicional no banco de dados afeta o desempenho, por esta raz˜o algumas
           ca                                                                a
                         co                             o        ´ da aplica¸˜o.
    das principais aplica¸˜es comerciais codificam sua l´gica no nivel        ca
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                     51



 • N˜o ´ incomum para um DBA fazer uma topologia complexa de rela¸˜es que torna
    a e                                                                   co
   muito dif´ e em alguns casos imposs´
            icl,                      ivel, fazer backup ou restaurar tabelas individuais.

1.8.4.6 Views

Views est˜o senda implementadas atualmente e aparecer˜o na vers˜o 5.0 e 5.1 do MySQL
          a                                               a         a
Server.
Historicamente o MySQL Server tem sido mais usado em aplica¸˜es e sistemas web onde o
                                                                co
                                                                              ´
desenvolvedor da aplica¸˜o tem total controle sobre o uso do banco de dados. E claro que o
                         ca
uso aumentou em v´rias vezes e ent˜o descobrimos que um crescente n´meros de usu´rios
                     a               a                                   u               a
consideram views como um importante aspecto.
Unnamed views (derived tables, uma seubquery na cl´usula FROM de uma SELECT) j´ est˜o
                                                      a                               a     a
implementadas na vers˜o 4.1.
                        a
Views geralmente s˜o muito uteis para permitir aos usu´rios acessar uma s´rie de rela¸˜es
                    a        ´                           a                  e             co
(tabelas) como uma tabela, e limitar o acesso a apenas estas rela¸˜es. Views tamb´m
                                                                      co                   e
podem ser usadas para restringir o acesso aos registros (um subconjunto de uma tabela
em particular). Mas views n˜o s˜o necess´rias para restringir o acesso a registros j´ que
                              a a          a                                            a
o MySQL Server tem um sofisticado sistema de privil´gios. Veja Se¸˜o 4.3 [Sistema de
                                                        e               ca
privil´gios], P´gina 227.
      e        a
Muitos SGBD n˜o permitem atualizar nenhum registro em uma view, mas vocˆ tem que
                  a                                                               e
fazer as atualiza¸˜es em tabelas separadas.
                 co
Em nosso projeto de implemta¸˜o de views, n´s buscamos (tanto quanto for poss´ dentro
                               ca            o                                   ivel
do SQL) compatibilidade com “Codd’s Rule #6” para sistemas de banco de dados rela-
cionais: todos os views que s˜o teoricamente atualiz´veis, devem se atualizados tamb´m na
                             a                      a                                  e
pr´tica.
  a

1.8.4.7 ‘--’ como In´
                    icio de Coment´rio
                                  a

Outros bancos de dados SQL usam ‘--’ para iniciar coment´rios. O MySQL usa ‘#’ como
                                                             a
o caractere para in´ de coment´rio, mesmo se a ferramenta de linha de comando mysql
                     icio          a
remover todas linhas que come¸am com ‘--’. Vocˆ tamb´m pode usar o coment´rio no
                                c                   e      e                      a
estilo C /*isto ´ um coment´rio*/ com o MySQL Server. Veja Se¸˜o 6.1.6 [Coment´rios],
                 e           a                                   ca                 a
P´gina 479.
  a
O MySQL Server vers˜o 3.23.3 e superior suporta o estilo de coment´rio ‘--’ somente se o
                         a                                         a
coment´rio for seguido por um caractere de espa¸o (ou por um caracter de controle como
        a                                         c
uma nova linha). Isto ocorre porque este estilo de coment´rio causou muitos problemas
                                                             a
com queries SQL geradas automaticamente que usavam algo como o c´digo seguinte, onde
                                                                     o
automaticamente er´ inserido o valor do pagamento para !pagamento!:
                      a
       UPDATE nome_tabela SET credito=credito-!pagamento!
O que vocˆ acha que ir´ acontecer quando o valor de pagamento for negativo? Como 1--1
           e              a
´ legal no SQL, n´s achamos terr´ que ‘--’ signifique in´ de coment´rio.
e                  o              ivel                    icio         a
Usando a nossa implementa¸˜o deste m´todo de coment´rio no MySQL Server Version
                             ca            e               a
3.23.3 e posterior, 1-- Isto ´ um coment´rio ´ atualmente seguro.
                             e            a    e
Outro recurso seguro ´ que o cliente de linha de comando mysql remove todas as linhas que
                        e
iniciam com ‘--’.
52                                    MySQL Technical Reference for Version 5.0.0-alpha



A seguinte discuss˜o somente interessa se vocˆ estiver executando uma vers˜o do MySQL
                    a                        e                            a
inferior a vers˜o 3.23:
               a
Se vocˆ tem um programa SQL em um arquivo texto que contˆm coment´rios ‘--’ vocˆ
        e                                                       e        a          e
dever´ usar:
      a
       shell> replace " --" " #" < arquivo-texto-com-coment´rio.sql 
                                                                   a
                  | mysql banco-de-dados
No lugar de:
       shell> mysql banco-de-dados < arquivo-texto-com-comentario.sql
Vocˆ tamb´m pode editar o pr´prio arquivo de comandos alterando os coment´rios ‘--’
    e       e                  o                                              a
para ‘#’:
       shell> replace " --" " #" -- arquivo-texto-com-comentario.sql
Desfa¸a utilizando este comando:
      c
       shell> replace " #" " --" -- arquivo-texto-com-comentario.sql

1.8.5 Como o MySQL Lida com Restri¸˜es
                                  co

Como o MySQL lhe permite trabalhar com tabelas transacionais e n˜o transacionais (que
                                                                     a
n˜o permitem rollback), o tratamento de restri¸˜es ´ um pouco diferente no MySQL que
 a                                              co e
em outros bancos de dados.
Temos que tratar o caso quando vocˆ atualiza diversos registros com uma tabela n˜o transa-
                                   e                                            a
cional que n˜o pode fazer rollback em erros.
             a
A filosofia b´sica ´ tentar obter um erro para qualquer coisa que possamos detectar em temp
             a   e
de compila¸˜o mas tentar recuperar de qualquer erro que abtemos em tempo de execu¸˜o.
            ca                                                                        ca
Fazemos isto na maiorioa dos casos, mas n˜o para todos ainda. Veja Se¸˜o 1.6.4 [TODO
                                            a                            ca
future], P´gina 29.
          a
A op¸˜o b´sica que o MySQL tem ´ parar a instru¸˜o no meio ou fazer o melhor para se
     ca a                           e              ca
recuperar do problema e continuar.
A seguir mostramos o que acontece com diferentes tipos de restri¸˜es.
                                                                  co

1.8.5.1 Restri¸oes de PRIMARY KEY / UNIQUE
              c˜

Normalmente vocˆ receber´ um erro quando tentar fazer um INSERT / UPDATE de um registro
                  e         a
que cause uma viola¸˜o de uma chave prim´ria, chave unica ou chave estrangeira. Se vocˆ
                     ca                   a           ´                                e
estiver usando um mecanismo de armazenamento transacional, como InnoDB, o MySQL
automaticamente far´ um rollback da transa¸˜o. Se vocˆ estiver usando mecanismos de
                      a                      ca          e
armazenemento n˜o transacionais o MySQL ir´ para no registro errado e deiar o resto dos
                   a                          a
registros se processamento.
Para tornar a vida mais f´cil o MySQL adicionou suporte a diretiva IGNORE para a maioria
                           a
dos comandos que podem causar uma viola¸˜o de chave (como INSERT IGNORE ...). Neste
                                          ca
caso o MySQL ir´ ignorar qualquer viola¸˜o de chave e continuar´ com o processamento do
                 a                     ca                      a
pr´ximo registro. Vocˆ pode obter informa¸˜o sobre o que o MySQL fez com a fun¸˜o da
  o                     e                 ca                                      ca
API mysql_info() API function e em vers˜es posteriores do MySQL 4.1 com o comando
                                           o
SHOW WARNINGS. Veja Se¸˜o 12.1.3.29 [mysql info], P´gina 798. Veja Se¸˜o 4.6.8.9 [SHOW
                          ca                       a                  ca
WARNINGS], P´gina 323.
                 a
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                  53



Note que no momento apenas as tabelas InnoDB suportam chaves estrangeiras.           Veja
Se¸˜o 7.5.5.2 [Restri¸˜es de chaves estrangeiras no InnoDB], P´gina 652.
  ca                 co                                       a
O suporte a chaves estrangeiras nas tabelas MyISAM est´ programado para ser inclu´ na
                                                      a                          ida
arvor´ de fonte do MySQL 5.0.
     e

1.8.5.2 Restri¸oes de NOT NULL
              c˜

Para poder suportar um f´cil tratamento de tabelas n˜o transacionais todos os campos no
                        a                           a
MySQL tˆm valores padr˜o.
        e              a
Se vocˆ inserir um valor ’errado’ em uma coluna como um NULL em uma coluna NOT NULL
      e
ou um valor num´rico muito grande em um campo num´rico, o MySQL ir´ atribuir a coluna
                 e                                  e               a
                    ´
o ’melhor valor possivel’ em vez de dar uma mensagem de erro. Para strings este valor ´
                                                                                      e
uma string vazia ou a maior string poss´ que possa estar na coluna.
                                       ivel
Isto significa que se vocˆ tentar armazenar NULL em uma coluna que n˜o aceita valores NULL,
                        e                                          a
o MySQL Server armazenar´ 0 ou ’’ (strig vazia) nela. Este ultimo comportamento pode,
                             a                              ´
para uma simples inser¸˜o de registro, ser alterado com a op¸˜o de compila¸˜o -DDONT_
                         ca                                  ca              ca
USE_DEFAULT_FIELDS.) Veja Se¸˜o 2.3.3 [Op¸˜es de configura¸˜o], P´gina 97. Isto faz com
                                 ca          co             ca     a
que as instru¸˜es INSERT gerem um erro a menos que vocˆ explicite valores espec´
              co                                        e                       ificos para
todas as colunas que exigem um valor diferente de NULL.
A raz˜o para as regras acima ´ que n˜o podemos verificar estas condi¸˜es antes da consulta
      a                        e     a                                co
come¸ar a executar. Se encontrarmos um problema depois de atualizar algumas linahs, n˜o
     c                                                                                  a
podemos fazer um rollback j´ que o tipo de tabela n˜o suporta isto. A op¸˜o de parar n˜o
                             a                       a                     ca           a
´ t˜o boa como no caso em que a atualiza¸˜o esteja feita pela metade que ´ provavelmente
e a                                       ca                                e
o pior cen´rio poss´
          a         ivel. Neste caso ´ melhor ’fazer o poss´
                                     e                     ivel’ e ent˜o continuar como se
                                                                      a
nada tivesse acontecido. No MySQL 5.0 plenejamos melhorar into forncendo avisos para
convers˜es autom´ticas de campo, mais uma op¸˜o para deixar vocˆ fazer um rollback
        o         a                               ca                    e
das instru¸˜es que usam apenas tabelas transacionais no caso de tal instru¸˜o fizer uma
          co                                                                  ca
defini¸˜o de campo n˜o permitida.
      ca              a
O mostrado acima significa que n˜o se deve usar o MySQL para verificar o conte´do dos
                                 a                                          u
campos, mas deve se fazˆ-lo por meio da aplica¸˜o.
                       e                      ca

1.8.5.3 Restri¸˜es de ENUM e SET
              co

No MySQL 4.x ENUM n˜o ´ uma restri¸˜o real, mas um modo mauis eficiente de armazenar
                      a e            ca
campos que possam apenas conter um conjunto de valores dados. Isto ´ devido as mesmas
                                                                      e
raz˜es pelas quais NOT NULL n˜o ´ respeitado. Veja Se¸˜o 1.8.5.2 [restri¸˜es NOT NULL],
    o                        a e                     ca                 co
P´gina 53.
  a
Se vocˆ inserir um valor errado em um campo ENUM, ele ser´ configurado com uma string
       e                                                 a
vazia em um contexto string. Veja Se¸˜o 6.2.3.3 [ENUM], P´gina 499.
                                    ca                   a
Se vocˆ inserir uma op¸˜o errada em um campo SET, o valor errado ser´ ignorado. Veja
      e                ca                                           a
Se¸˜o 6.2.3.4 [SET], P´gina 500.
  ca                  a

1.8.6 Erros Conhecidos e Deficiˆncias de Projetos no MySQL
                              e
54                                     MySQL Technical Reference for Version 5.0.0-alpha


1.8.6.1 Erros da Vers˜o 3.23 Corrigidos em Vers˜es Posteriores do
                     a                         o
        MySQL

Os seguintes erros/bugs conhecidos n˜o est˜o corrigidos no MySQL 3.23 porque corrig´
                                    a     a                                           i-los
involveria a mudan¸a de muito c´digo, o que poderia introduzir outros erros, talvez piores.
                   c           o
Os erros s˜o tamb´m classificados como ’n˜o fatal’ ou ’toler´vel’.
          a       e                      a                 a
 • Pode se obter um deadlock ao fazer LOCK TABLE em multiplas tabelas e ent˜o na mesma
                                                                           a
   conex˜o fizer um DROP TABLE em uma delas enquanto outra thread est´ tentando blo-
        a                                                                a
   quear a tabela. Pode-se no entanto fazer um KILL em qualquer uma das threads
   envolvidas para resolver isto. Corrigido na vers˜o 4.0.12
                                                   a
 • SELECT MAX(campo_chave) FROM t1,t2,t3... onde uma das trˆs tabelas est´ vazia
                                                                 e             a
   n˜o retorna NULL, mas sim o valor m´ximo da coluna. Corrigido na vers˜o 4.0.11.
    a                                 a                                 a
 • DELETE FROM heap_table sem um WHERE n˜o funcionam em tabelas HEAP com lock.
                                        a

1.8.6.2 Open Bugs / Deficiˆncias de Projeto no MySQL
                         e

Os seguintes problemas s˜o conhecidos e tem prioridade muito alta para serem corrigidos:
                        a
 • FLUSH TABLES WITH READ LOCK n˜o bloqueia CREATE TABLE ou COMMIT, que pode criar
                                 a
   um problema com a posi¸˜o do log bin´rio ao se fazer um backup completo de tabelas
                         ca            a
   e do log bin´rio.
               a
 • ANALYZE TABLE em uma tabela BDB pode, em alguns, casos inutilizar a tabela at´ que
                                                                                  e
   se reinicie o servidor mysqld. Quando isto acontecer vocˆ ir´ ver o seguinte tipo de
                                                           e a
   erro no arquivo de erros do MySQL.
          001207 22:07:56      bdb:   log_flush: LSN past current end-of-log
 • O MySQL aceita parenteses na parte FROM, mas os ignora sem aviso. A raz˜o pela qual
                                                                           a
   n˜o s˜o retornados erros ´ que muitos clientes que geram consultas automaticamente
    a a                     e
   adicionam parentesis na parte FROM mesmo onde eles n˜o s˜o necess´rios.
                                                         a a         a
 • Concatenar muitos RIGHT JOINS ou combinar joins LEFT e RIGHT na mesma consulta
   podem dar uma resposta incorreta ja que o MySQL s´ gera registros NULL para tabelas
                                                       o
   que precedem um join LEFT ou antes de um join RIGHT. Isto ser´ corrigido na vers˜o
                                                                 a                  a
   5.0 junto com o suporte a parentesis na parte FROM.
 • N˜o execute ALTER TABLE em uma tabela BDB em que vocˆ estiver executando
     a                                                      e
   transa¸˜es multi-instru¸˜es n˜o completadas.
         co               co    a               (A transa¸˜o provavelmente ser´
                                                         ca                   a
   ignorada).
 • ANALYZE TABLE, OPTIMIZE TABLE e REPAIR TABLE podem causar problemas em tabelas
   para as quais vocˆ estiver usando INSERT DELAYED.
                    e
 • Fazendo um LOCK TABLE .. e FLUSH TABLES .. n˜o garante que n˜o existem transa¸˜es
                                               a               a                co
   n˜o terminadas em progresso na tabela.
    a
 • Tabelas BDB s˜o um pouco lentas para abrir. Se vocˆ tiver v´rias tabelas BDB em um
                  a                                    e       a
   banco de dados, gastar´ muito tempo para usar o cliente mysql no banco de dados se
                         a
   vocˆ n˜o estiver usando a op¸˜o -A ou se vocˆ estiver usando rehash. Isto ´ percebido
      e a                       ca             e                             e
   principalmente quando vocˆ tiver um cache de tabelas grandes.
                              e
 • A replica¸˜o utiliza o log a nivel de consulta: o master grava a consulta no log bin´rio.
            ca                                                                         a
   Isto ´ um r´pido, compacto e eficiente m´todo de registro o que funciona perfeitamente
        e     a                              e
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                   55



     na maioria dos casos. Embora nunca tenhamos ouvido sobre um caso ocorrido, h´ uma
                                                                                     a
     chance te´rica que o dado no master e slave sejam diferente se uma consulta ´ feita
               o                                                                     e
     de tal modo que a modifica¸˜o do dado ´ n˜o determin´
                                ca           e a           istica, isto ´, deixar ao desejo
                                                                        e
     do otimizador de consultas (o que geralmente n˜o ´ uma boa pr´tica, mesmo fora da
                                                   a e                a
     replica¸˜o!). Por exemplo:
            ca
      − CREATE ... SELECT ou INSERT ... SELECT que preenchem com zeros ou NULL uma
        coluna auto_increment.
      − DELETE se vocˆ estiver apagando registros de uma tabela que tem chaves es-
                      e
        trangeiras com a propriedade ON DELETE CASCADE.
      − REPLACE ... SELECT, INSERT IGNORE ... SELECT se vocˆ tiver valores de chaves
                                                           e
        duplicados nos dados inseridos.
                                            ˜
     Se e somente se todos estas consultas NAO tiverem cl´usulas ORDER BY garantindo uma
                                                         a
     ordem determin´ istica.
     Na verdade, por exemplo para INSERT ... SELECT sem ORDER BY, o SELECT pode re-
     tornar registros em uma ordem diferente (no qual resultar´ em um registro tendo
                                                                 a
     diferentes posi¸˜es, obtendo um n´mero diferente na coluna auto_increment), depen-
                    co                 u
     dendo da escolhe feita pelo otimizador no master e slave. Uma consulta ser´ otimizada
                                                                               a
     deiferentemente no master e slave apenas se:
      − Os arquivos usados pelas duas consultas n˜o s˜o exatamente a mesma; por exemplo
                                                 a a
        OPTIMIZE TABLE foi executado nas tabelas master e n˜o nas nas tabelas slave (para
                                                             a
        corrigir isto, desde o MySQL 4.1.1, OPTIMIZE, ANALYZE e REPAIR s˜o escritos no
                                                                          a
        log bin´rio).
                a
      − A tabela est´ armazenada em um mecanismo de armazenamento diferente no mas-
                      a
        ter e no slave (pode se executar diferentes mecanismos de armazenamento no metre
        e no slave: por exemplo, InnoDB ne master e MyISAM no slave, se o slave possuir
        menos espa¸o disppon´ em disco).
                     c          ivel
      − The MySQL buffers’ sizes (key_buffer_size etc) are different on the master and
        slave.
      − O master e slave executam vers˜es diferentes do MySQL, e o c´digo do toimizador
                                         o                          o
        ´ diferente entre estas vers˜es.
        e                           o
     Este problema tamb´m pode afetar a restaura¸˜o de um banco de dados usando
                        e                       ca
     mysqlbinlog|mysql.
     O modo mais f´cil de evitar este problema em todos os casos ´ adicionar uma cl´usula
                   a                                              e                 a
                                 a           ´
     ORDER BY para tal consulta n˜o deterministica assegure que os registros s˜o sempre ar-
                                                                              a
     mazenados/modificados na mesma ordem. Nas vers˜es futuras do MySQL adicionare-
                                                        o
     mos automaticamente uma cl´usula ORDER BY quando necess´rio.
                                  a                              a
Os seguintes problemas s˜o conhecidos e ser˜o corrigidos na hora certa:
                        a                  a
 • LIKE n˜o ´ seguro com caracteres multi-byte. A compara¸˜o ´ feita caracter por
          a e                                            ca e
   caracter.
 •
     Ao usar fun¸˜es RPAD, ou qualquer outra fun¸˜o string que termina adicionando espa¸os
                co                              ca                                     c
     em branco a direita, em uma consulta que preisa usar tabelas tempor´rias para ser
                                                                             a
56                                      MySQL Technical Reference for Version 5.0.0-alpha



     rsolvida, todas as strings resultantes ser˜o cortadas a direita (como em RTRIM). Este
                                               a
     ´ um exemplo de uma consulta:
     e
     SELECT RPAD(t1.field1, 50, ’ ’) AS f2, RPAD(t2.field2, 50, ’ ’) AS f1
     FROM table1 as t1 LEFT JOIN table2 AS t2 ON t1.record=t2.joinID ORDER BY
     t2.record;
     O resultado final deste erro ´ que o usu´rio n˜o conseguira espa¸os em branco do lado
                                    e         a     a                    c
     direito do campo resultante.
     O comportamento anterior existe em todas as vers˜es do MySQL.
                                                         o
     A raz˜o disto ´ devido ao fato de tabelas HEAP, que s˜o usadas primeiro para tabelas
           a          e                                       a
     tempor´rias, n˜o s˜o capazes de tratar colunas VARCHAR.
              a        a a
     Este comportamento ser´ corrigido em uma das distribui¸˜es da s´rie 4.1.
                                 a                               co        e
 •   Devido ao modo como os arquvos de defini¸˜es de tabelas s˜o armazenados n˜o se
                                                    co                 a               a
     pode usar 255 caracteres (CHAR(255)) em nomes de tabelas, nomes de colunas e enum.
     Isto est´ programado para ser corrigido na vers˜o 5.1 quando temos novos arquivos de
              a                                        a
     formatos de defini¸˜o de tabelas.
                          ca
 •   Quando estiver usando SET CHARACTER SET, n˜o ´ permitido usar caracteres especias
                                                      a e
     no nome do banco de dados, tabelas ou campos.
 •   Pode-se usar _ ou % com ESCAPE em LIKE ... ESCAPE.
 •   se vocˆ tiver uma coluna DECIMAL com um n´mero armazenado em diferentes formatos
            e                                      u
     (+01.00, 1.00, 01.00), GROUP BY pode considerar cada valor como um valor diferente.
 •   DELETE FROM merge_table usado sem WHERE ir´ apenas apagar o mapeamento para a
                                                       a
     tabela, n˜o apagando tudo nas tabelas mapeadas.
                a
 •   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
     DISTINCT. Somente os primeiros bytes (padr˜o 1024) max_sort_length s˜o usados
                                                     a                            a
     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
     a maioria dos casos ´ usar a substring: SELECT DISTINCT LEFT(blob,2048) FROM
                               e
     nome_tabela.
 •   C´lculos s˜o feitos com BIGINT ou DOUBLE (normalmente, ambos tem o tamanho de 64
       a          a
     bits). Depende da precis˜o utilizada na fun¸˜o. A regra geral ´ que fun¸˜es bin´rias
                                  a                ca                    e     co       a
     s˜o feitas com precis˜o BIGINT, IF e ELT() com precis˜o BIGINT ou DOUBLE e o resto
      a                      a                                 a
     com precis˜o DOUBLE. Devemos evitar o uso de valores sem sinal maiores que 63 bits
                   a
     (9223372036854775807) para qualquer outra coisa al´m de campos bin´rios!
                                                            e                a
 •   Todas os campos string, exceto campos do tipo BLOB e TEXTO tem, automaticamente,
     todos os espa¸os extras removidos quando recuperados. Para tipos CHAR, isto n˜o tem
                     c                                                               a
     problema, e pode ser considerado como um recurso de acordo com o ANSI SQL92. O
     problema ´ que no MySQL, campos VARCHAR s˜o tratados desta mesma forma.
                  e                                   a
 •   Vocˆ s´ pode ter at´ 255 colunas ENUM e SET em uma tabela.
         e o               e
 •   Em MIN(), MAX() e outras fun¸˜es de agrupamente, o MySQL atualmente compara as
                                      co
     colunas ENUM e SET pelo valor de suas strings ao inv´s da posi¸˜o relativa da string no
                                                           e          ca
     conjunto.
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                 57



 • mysqld_safe redireciona todas as mensagens de mysqld para o log mysqld. Um prob-
   lema com isto ´ que se vocˆ executar o mysqladmin refresh para fechar e reabrir o
                  e          e
   log, a stdout e a stderr continuam redirecionadas para o log antigo. Se vocˆ utiliza
                                                                                 e
   --log extensivamente, dever´ editar o mysqld_safe para logar em ‘’hostname’.err’
                               a
   em vez de ‘’hostname’.log’; assim vocˆ pode facilmente utilizar o espa¸o do log antigo
                                         e                               c
   apagando-o e executando mysqladmin refresh.
 • Em instru¸˜es UPDATE, colunas s˜o atualizadas da esquerda para a direita. Se vocˆ
              co                    a                                                   e
   referenciar a uma coluna atualizada, vocˆ ir´ obter o valor atualizado em vez do valor
                                           e a
   original, por exemplo:
          mysql> UPDATE nome_tabela SET KEY=KEY+1,KEY=KEY+1;
    Isto atualiza KEY com 2 no lugar de 1.
 • Vocˆ pode se referir a m´ltiplas tabelas em uma mesma consulta, mas vocˆ n˜o pode se
       e                    u                                             e a
   referir a qualquer tabelas tempor´rias dada mais de uma vez. Por exemplo, a seguinte
                                     a
   instru¸˜o n˜o funciona.
          ca a
          mysql> SELECT * FROM temporary_table, temporary_table AS t2;
 • RENAME n˜o funciona com tabelas tempor´rias (TEMPORARY) ou tabelas usadas em uma
            a                            a
   tabelas MERGE.
 • O otimizador pode lidar com o DISTINCT de forma diferente se vocˆ estiver usando col-
                                                                    e
   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 a
   normais colunas escondidas n˜o participam na compara¸˜o DISTINCT. N´s provavel-
                                  a                        ca               o
   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;
    and
          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;
    No segundo caso, vocˆ pode obter duas linhas idˆnticas no MySQL 3.23.x na s´rie do
                         e                         e                           e
    resultado (porque o campo escondido ’id’ pode variar).
    Perceba que isto somente acontece em consultas onde vocˆ n˜o tem colunas ORDER
                                                           e a
    BY no resultado, algo n˜o permitido no SQL-92.
                           a
 • Como o MySQL permite trabalhar com tipos de tabelas que n˜o suportam transa¸˜es
                                                               a                    co
   (e assim n˜o pode fazer rollback em dados) algumas coisas funcionam um pouco
               a
   diferentes de outros servidores SQL em MySQL (Isto serve para garantir que o MySQL
   nunca necessitar´ de um rollback para um comando SQL). Por´m isto pode ser um
                    a                                             e
   pouco estranho em casos que os valores dos campos devem ser verificados na aplica¸˜o,
                                                                                    ca
   mas isto ira fornacer um ´timo ganho de velocidade assim como permite ao MySQL
                              o
   fazer algumas otimiza¸˜es que de outro modo seriam muito dif´
                          co                                    iceis para serem feitas.
58                                    MySQL Technical Reference for Version 5.0.0-alpha



     Se vocˆ informar um valor incorreto em uma coluna, o MySQL, em vez de fazer um
            e
     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
        ir´ armazenar o menor ou maior valor poss´ no campo.
          a                                      ivel
      − Se tentar armazenar uma string que n˜o comece com um n´mero em uma coluna
                                            a                 u
        num´rica, o MySQL ir´ armazenar 0 na coluna.
            e                a
      − Se vocˆ tentar armazenar NULL em uma coluna que n˜o aceita valores
               e                                              a
        nulos, MySQL ir´ armazenar 0 ou ’’ (string vazia) na coluna.
                        a                                                (Este
        comportamento pode, entretanto, ser alterado com a op¸˜o de compila¸˜o
                                                             ca            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). A id´ia ´ que n˜o ´
                                                                       e e       a e
        servi¸o do servidor SQL validar datas. Se o MySQL pode armazenar uma data e
             c
        recuperar extamente a mesma data, ent˜o o MySQL armazenar´ a data. Se a data
                                               a                    a
        estiver totalmente errada, o MySQL ir´ armazenar a data 0000-00-00 no campo.
                                              a
      − Se vocˆ especificar um valor n˜o suportado para um campo do tipo enum, ele ser´
               e                       a                                             a
        alterado para o valor de erro ’empty string’, com valor num´rico 0.
                                                                   e
      − Se vocˆ definir uma coluna SET com um valor n˜o suportado, o valor ser´ ignorado.
              e                                     a                        a
 • Se vocˆ executar uma PROCEDURE em uma pesquisa que retorna uma s´rie vazia, em
         e                                                            e
   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
       ca                           a                                    a
   compat´iveis.
 • O MySQL ainda n˜o pode lidar com valores NaN, -Inf e Inf em tipos double. Us´-los
                      a                                                            a
   causar´ problemas na exporta¸˜o e importa¸˜o de dados. Uma solu¸˜o intermedi´ria
          a                      ca             ca                      ca          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.
 • LIMIT em n´meros negativos s˜o tratados como n´meros grandes positivos.
               u                 a                  u
 • 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
   tabela MERGE, a ordem das chaves ser´ diferente para as tabelas se existir uma chave
                                        a
   antiga n˜o unica na tabela. Isto ´ porque o ALTER TABLE coloca chaves UNIQUE antes
           a ´                       e
   de chaves normais para ser poss´ detectar chaves duplicadas o mais cedo o poss´
                                   ivel                                            ivel.
Os seguintes erros s˜o conhecidos em vers˜es mais antigas do MySQL:
                    a                    o
 • 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
   mesma linha poderia ter encontrado v´rios itens:
                                       a
Cap´
   ıtulo 1: Informa¸˜es Gerais
                   co                                                                    59



         UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY > 100;
   Um modo de contornar este erro ´ utilizar:
                                    e
         mysql> UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY+0 > 100;
   Isto funcionar´ porque MySQL n˜o utilizar´ indices em express˜es com a cl´usula
                 a                    a        a                    o           a
   WHERE.
 • Antes da vers˜o 3.23 do MySQL, todos os tipos num´ricos tratados como campos
                 a                                        e
   de pontos fixos. Isto significa que vocˆ tem que especificar quantas casas decimais um
                                        e
   campo de ponto flutuante deve ter. Todos os resultados eram retornados com o n´mero
                                                                                u
   correto de casas decimais.
Para erros espec´ificos na plataforma, vejas as se¸˜es sobre compila¸˜o e portabilidade. Veja
                                                 co                ca
Se¸˜o 2.3 [Installing source], P´gina 94. Veja Apˆndice D [Porting], P´gina 1069.
  ca                            a                 e                    a
60                                     MySQL Technical Reference for Version 5.0.0-alpha



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

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

Este cap´ itulo cobre a instala¸˜o do MySQL em plataformas onde oferecemos pacotes usando
                               ca
oformato de empacotamento nativo da respectiva plataforma. No entanto, as distribui¸˜es  co
bin´rias do MySQL est˜o dispon´
   a                       a         iveis para muitas outras plataformas, veja Se¸˜o 2.2.9
                                                                                    ca
[Installing binary], P´gina 91 para instru¸˜es gerais de instala¸˜o para estes pacotes que se
                       a                    co                  ca
aplicam a todas as plataformas.
Veja Se¸˜o 2.2 [General Installation Issues], P´gina 75 para mais informa¸˜es sobre quais
       ca                                       a                        co
outras distribui¸˜es bin´rias est˜o dispon´
                co      a        a        iveis e como obtˆ-las.
                                                          e

2.1.1 Instalando o MySQL no Windows

O processo de instala¸˜o para o MySQL no Windows tem os seguintes passos:
                     ca
 1. Instale a distribui¸˜o.
                       ca
 2. Configure um arquivo de op¸˜o se necess´rio.
                             ca           a
 3. Selcione o servidor que vocˆ quer usar.
                               e
 4. Inicie o servidor.
O MySQL para Windows est´ dispon´ em dois formatos de distribui¸˜o:
                        a       ivel                           ca
 • A distribui¸˜o bin´ria cont´m um programa de instala¸˜o que instala que vocˆ precisa
              ca     a         e                       ca                     e
   e assim possa iniciar o servidor imediatamente.
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                  61



  • A distribui¸˜o fonte cont´m todo o c´digo e os arquivos suportados para construir o
               ca            e           o
    execut´vel usando o compilador VC++ 6.0. Veja Se¸˜o 2.3.7 [Constru¸˜o do fonte para
          a                                            ca               ca
    Windows], P´gina 107.
                 a
                                        ca     a     ´
Geralmente, a melhor op¸˜o ´ a distribui¸˜o bin´ria. E mais simples e vocˆ n˜o precisa de
                        ca e                                             e a
nenhuma ferramenta adicional para ter o MySQL em execu¸˜o.ca

2.1.1.1 Exigˆncias do Sistema Windows
            e

Para executar o MySQL no Windows, vocˆ precisar´ do seguinte:
                                           e        a
 • Um sistema operacional Windows de 32 bits como 9x, ME, NT, 2000 ou XP. A fam´   ilia
    NT (Windows NT, 2000 e XP) lhe permite executar o servidor MySQL como um
    servi¸o. Veja Se¸˜o 2.1.1.7 [NT start], P´gina 66.
         c          ca                        a
 • Suporte ao protocolo TCP/IP.
 • Um c´pia da distribui¸˜o bin´ria do MySQL para Windows, o qual pode ser feito
           o                ca     a
    download em http://www.mysql.com/downloads/.
    Nota: A distribui¸˜o de arquivos s˜o fornecidas no formato zip e recomendamos o
                       ca                a
    uso de um cliente FTP com op¸˜o de resumo para evitar corrompimento de arquivos
                                    ca
    durante o processo de download.
 • Um programa ZIP para descompactar os arquivos da distribui¸˜o.
                                                                ca
 • Espa¸o suficiente em disco para descompactar, instalar e criar o banco de dados de
         c
    acordo com suas exigˆncias.
                          e
 • Se vocˆ planeja se conectar ao servidor MySQL via ODBC, vocˆ tamb´m precisar´ do
            e                                                     e     e        a
    dirver MyODBC. Veja Se¸˜o 12.2 [ODBC], P´gina 866.
                            ca                  a
 • Se vocˆ precisa de tabelas com tamanho maior que 4GB, instale o MySQL em um
            e
    sistema de arquivos NTFS ou mais novo. N˜o se esque¸a de usar MAX_ROWS e AVG_ROW_
                                                a       c
    LENGTH quando criar tabelas. Veja Se¸˜o 6.5.3 [CREATE TABLE], P´gina 597.
                                           ca                       a

2.1.1.2 Instalando uma Distribui¸˜o Bin´ria do Windows
                                ca     a

Para instalar o MySQL no Windows usando uma distribui¸˜o bin´ria, siga este procedi-
                                                            ca      a
mento:
 1. Se vocˆ estiver trabalhando em uma m´quina Windows NT, 2000, ou XP, esteja certo
           e                               a
    de que vocˆ est´ logado com um usu´rio com privileios de administrador.
               e    a                    a
 2. Se vocˆ estiver fazendo uma atualiza¸˜o de uma instala¸˜o MySQL mais nova, ´
            e                              ca                   ca                       e
    necess´rio parar o servidor atual. Em m´quinas com Windows NT, 200 ou XP, se
          a                                    a
    vocˆ estiver executando o servidor como um servi¸o, pare-o com o comando:
       e                                              c
          C:> NET STOP MySQL
    Se vocˆ planeja usar um servidor diferente depois da atualiza¸˜o (por exemplo, se vocˆ
           e                                                     ca                      e
    quiser executar o mysqld-max em vez do mysqld), remova o servi¸o existente:
                                                                      c
          C:mysqlbin> mysqld --remove
 3.
    Vocˆ pode reinstalar o servi¸o com o servidor pr´prio depois de atualizar.
        e                       c                   o
    Se vocˆ n˜o estiver executando o servidor MySQL como um servi¸o, pare desta forma:
           e a                                                        c
62                                       MySQL Technical Reference for Version 5.0.0-alpha



          C:mysqlbin> mysqladmin -u root shutdown
 4. Finalize o programa WinMySQLAdmin se ele estiver em execu¸˜o.
                                                             ca
 5. Descompacte os arquivos de distribui¸˜o em um diret´rio tempor´rio.
                                        ca             o          a
 6. Execute o programa ‘setup.exe’ para iniciar o processo de instala¸˜o. Se vocˆ quiser
                                                                      ca          e
    instalar em um diret´rio diferente do padr˜o (‘c:mysql’), use o bot˜o Browse para
                          o                      a                        a
    especificar seu diret´rio preferido. Se vocˆ n˜o instalar o MySQL no local padr˜o, vocˆ
                        o                     e a                                 a      e
    precisar´ epecificar o local onde vocˆ inicia o servidor. O modo mais f´cil de se fazer
            a                             e                                a
    isto ´ usar um arquivo de op¸˜o, como descrito em Se¸˜o 2.1.1.3 [Windows prepare
         e                         ca                         ca
    environment], P´gina 62.
                    a
 7. Finalize o processo de instala¸˜o.
                                  ca

2.1.1.3 Preparando o Ambiente MySQL do Windows

Se vocˆ precisar especificar op¸˜es de inicializa¸˜o quando executar o servidor, vocˆ pode
       e                      co                ca                                  e
indentifica-los na linha de comando ou coloc´-los em um arquivo de op¸˜o. Par op¸˜es que
                                            a                         ca          co
s˜o usadas sempre que o servidor iniciar, vocˆ achar´ mais conveniente utilizar um arquivo
 a                                           e      a
de opc˜o para especificar a configura¸˜o do seu MySQL. Isto ´ particularmente verdade sob
      a                             ca                       e
as seguintes circunstˆncias:
                     a
 • A localiza¸˜o do diret´rio de instala¸˜o ou dados s˜o diferentes dos locais padr˜o
             ca          o              ca            a                            a
   (‘c:mysql’ e ‘c:mysqldata’).
 • Vocˆ precisa ajustar as configura¸˜es do servidor. Por exemplo, para usar as tabelas
       e                             co
   transacionais InnoDB no MySQL vers˜o 3.23, vocˆ deve criar manualmente dois novos
                                          a          e
   diret´rios para guardar os arquivos de dados e de log do InnoDB — por exemplo,
        o
   ‘c:ibdata’ e ‘c:iblogs’. Vocˆ tamb´m poder´ adicionar algumas linhas extras ao
                                    e        e       a
   arquivo de op¸˜o, como descrito em Se¸˜o 7.5.3 [Iniciando o InnoDB], P´gina 643. (A
                  ca                        ca                             a
   partir do MySQL 4.0, o InnoDB cria os seus arquivos de log e dados no diret´rio de da-
                                                                               o
   dos por padr˜o. Isto significa que vocˆ n˜o precisa configurar o InnoDB explicitamente.
                a                        e a
   Vocˆ ainda deve fazˆ-lo se desejar, e um arquivo de op¸˜o ser´ util neste caso.)
       e               e                                  ca     a´
No Windows, o instalador do MySQL coloca o diret´rio de dados diretamente sob o diret´rio
                                                   o                                    o
onde vocˆ instalou o MySQL. Se vocˆ quisesse utilizar um diret´rio de dados em um local
         e                            e                         o
diferente, vocˆ deve copiar todo o conte´do do diret´rios data para a nova localiza¸˜o. Por
              e                         u           o                              ca
exemplo, por padr˜o, o instalador coloca o MySQL em ‘C:mysql’ e o diret´rio de dados
                   a                                                         o
em ‘C:mysqldata’. Se vocˆ quiser usar um diret´rio de dados de ‘E:mydata’, vocˆ deve
                              e                    o                                  e
fazer duas coisas:
 • Mova o diret´rio de dados de ‘C:mysqldata’ para ‘E:mydata’.
               o
 • Use uma op¸˜o --datadir para especificar a nova localiza¸˜o do diret´rio de dados
               ca                                         ca          o
   cada vez que vocˆ iniciar o servidor.
                   e
Quando o servidor MySQL inicia no Windows, ele procura pelas op¸˜es em dois arquivos:
                                                                     co
O arquivo ‘my.ini’ no diret´rio Windows e o arquivo chamado ‘C:my.cnf’. O diret´rio
                             o                                                        o
do Windows ´ normalmente chamado ‘C:WINDOWS’ ou ‘C:WinNT’. Vocˆ pode determinar
              e                                                         e
a sua localiza¸˜o exata a partir do valor da vari´vel de ambiente WINDIR usando o seguinte
              ca                                 a
comando:
      C:> echo %WINDIR%
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                   63



O MySQL procura pelas op¸˜es primeiro no arquivo ‘my.ini’, e ent˜o pelo arquivo ‘my.cnf’.
                          co                                     a
No entanto, para evitar confus˜o, ´ melhor se vocˆ usar apenas um destes arquivos. Se o
                              a e                e
seu PC usa um boot loader onde o drive C: n˜o ´ o drive de boot, sua unica op¸˜o ´ usar
                                             a e                       ´       ca e
o arquivo ‘my.ini’. Independente de qual arquivo usar, ele deve ser no formato texto.
Um arquivo de op¸˜o pode ser criado e modificado com qualquer editor de texto como o
                   ca
programa Notepad. Por exemplo, se o MySQL est´ instalado em ‘D:mysql’ e o diret´rio
                                                 a                                   o
de dados est´ localizado em ‘D:mydatadata’, vocˆ pode criar o arquivo de op¸˜o e definir
            a                                    e                           ca
uma se¸˜o [mysqld] para especificar valores para os parˆmetros basedir e datadir:
      ca                                              a
      [mysqld]
      # defina basedir com o seu caminho de instala¸~o     ca
      basedir=D:/mysql
      # defina datadir com o local do diret´rio de dados,
                                                  o
      datadir=D:/mydata/data
Note que os nome de caminho do Windows s˜o espec´
                                            a       ificados em arquivos de op¸˜o usando
                                                                                ca
barras normais em ves de barra invertida. Se vocˆ usar barras invertidas, vocˆ deve us´-las
                                                e                            e        a
em dobro.
Outro modo de se gerenciar um arquivo de op¸˜o ´ usar a ferramenta WinMySQLAdmin. Vocˆ
                                            ca e                                     e
pode encontrar o WinMySQLAdmin no diret´rio ‘bin’ de sua instala¸˜o MySQL, assim como
                                          o                     ca
um arquivo de ajuda contendo instru¸˜es para us´-lo. O WinMySQLAdmin tem a capacidade
                                     co          a
de editar os seus arquivos de op¸˜o, mas note o seguinte:
                                ca
 • WinMySQLAdmin usa apenas o arquivo ‘my.ini’.
 • Se o WinMySQLAdmin encontra o arquivo ‘C:my.cnf’, ele o renomear´ para
                                                                    a
   ‘C:my_cnf.bak’ para disabilit´-lo.
                                 a
Agora vocˆ est´ pronto para testar o servidor.
         e    a

2.1.1.4 Selecionando um Servidor Windows

Iniciado com o MySQL 3.23.38, a distribui¸˜o Windows inclui ambos bin´rios, normal e o
                                         ca                          a
MySQL-Max. Aqui est´ uma lista dos diferentes servidores MySQL dos quais vocˆ pode
                    a                                                          e
escolher:
Binario             Descri¸˜o
                          ca
mysqld              Compilado com debugger integral e conferˆncia autom´tica de aloca¸˜o
                                                             e          a            ca
                    de mem´ria, links simb´licos, BDB e tabelas InnoDB.
                            o             o
mysqld-opt          Bin´rio otimizado. A partir da vers˜o 4.0 o InnoDB est´ habili-
                       a                                   a                   a
                    tado. Antes desta vers˜o, este servidor n˜o tem suporte a tabelas
                                            a                   a
                    transacionais.
mysqld-nt           Bin´rio otimizado para NT/2000/XP com suporte para named pipes.
                       a
mysqld-max          Bin´rio otimizado com suporte para links simb´licos, tabelas BDB e
                       a                                            o
                    InnoDB.
mysqld-max-nt       Como o mysqld-max, por´m compilado com suporte para named pipes.
                                            e
Todos os bin´rios acima s˜o otimizados para processadores Intel modernos mas deve fun-
            a            a
cionar em qualquer processador Intel i386 ou melhor.
Os servidores mysqld-nt e mysqld-max-nt suportam conex˜es named pipe. Se vocˆ usar
                                                            o               e
um destes servidores, o uso de named pipes est´ sujeito a estas condi¸˜es:
                                              a                      co
64                                    MySQL Technical Reference for Version 5.0.0-alpha



 • Os servidores devem ser executados em uma vers˜o do Windows que suporte named
                                                   a
   pipes (NT, 2000, XP).
 • A partir da vers˜o 3.23.50, named pipes s´ estar˜o habilitados se vocˆ iniciar estes
                     a                       o     a                    e
   servidores com a op¸˜o --enable-named-pipe.
                       ca
 • Os servidores podem ser executados no Windows 98 ou Me, mas o TCP/IP deve estar
   instalado, e as conex˜es named pipes n˜o podem ser usadas.
                        o                a
 • No Windows 95, estes servidores n˜o podem ser usados.
                                     a

2.1.1.5 Iniciando o Servidor pela Primeira Vez

No Windows 95, 98, ou Me, cliente MySQL sempre se conecta ao servidor usando TCP/IP.
Nos sistemas baseados no NT, como o Windows NT, 2000, ou XP, os clientes possuem duas
op¸˜es. Eles podem usar TCP/IP, ou eles podem usar um named pipe se o servidor suportar
  co
conex˜es named pipes.
      o
Para informa¸˜es sobre qual servidor bin´rio executar, veja Se¸˜o 2.1.1.3 [Windows prepare
            co                          a                     ca
environment], P´gina 62.
               a
Esta se¸˜o lhe d´ um vis˜o geral da inicializa¸˜o de um servidor MySQL. A seguinte se¸˜o
        ca       a      a                     ca                                     ca
fornce informa¸˜o mais espec´
               ca           ifica para vers˜es particulares do Windows.
                                            o
Os exemplos nesta se¸˜o assumem que o MySQL est´ instalado sob a localiza¸˜o padr˜o,
                     ca                           a                       ca       a
‘C:mysql’. Ajuste o caminho mostrado nos exemplos se vocˆ tiver o MySQL instalado em
                                                         e
um local diferente.
Fazer um teste a partir do prompt de comando do em uma janela de console (uma janela
“DOS”) ´ a melhor coisa a fazer porque o servidor mostra a mensagem de status que aparece
        e
na janela do DOS. Se alguma coisa estiver errado com sua configura¸˜o, estas mensagens
                                                                      ca
tornar˜o mais f´cil para vocˆ de identificar e corrigir qualquer problema.
      a        a            e
Tenha certeza que vocˆ est´ no diret´rio onde o servidor ´ localizado e ent˜o entre este
                     e    a         o                    e                 a
comando:
     shell> mysqld --console
Para servidores que incluem suporte InnoDB, vocˆ deve ver as seguintes mensagens assim
                                               e
que o servidor iniciar:
     InnoDB:   The first specified datafile c:ibdataibdata1 did not exist:
     InnoDB:   a new database to be created!
     InnoDB:   Setting file c:ibdataibdata1 size to 209715200
     InnoDB:   Database physically writes the file full: wait...
     InnoDB:   Log file c:iblogsib_logfile0 did not exist: new to be created
     InnoDB:   Setting log file c:iblogsib_logfile0 size to 31457280
     InnoDB:   Log file c:iblogsib_logfile1 did not exist: new to be created
     InnoDB:   Setting log file c:iblogsib_logfile1 size to 31457280
     InnoDB:   Log file c:iblogsib_logfile2 did not exist: new to be created
     InnoDB:   Setting log file c:iblogsib_logfile2 size to 31457280
     InnoDB:   Doublewrite buffer not found: creating new
     InnoDB:   Doublewrite buffer created
     InnoDB:   creating foreign key constraint system tables
     InnoDB:   foreign key constraint system tables created
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                     65



      011024 10:58:25      InnoDB: Started
Quando o servidor finaliza sua sequˆncia de inicializa¸˜o, vocˆ deve ver algo como abaixo,
                                    e                ca      e
que indica que o servidor est´ pronto para o conex˜o com o cliente:
                             a                    a
      mysqld: ready for connections
      Version: ’4.0.14-log’ socket: ’’          port: 3306
O servidor continuar´ a gravar no console qualquer sa´ de diagn´stico adicional que ele
                     a                                ida         o
produza. Vocˆ pode abrir uma nova janela de console na qual se executar´ os programas
              e                                                         a
clientes.
Se vocˆ omitir a op¸˜o --console, o servidor grava a sa´ do diagn´stico no log de erro
       e           ca                                    ida         o
no diret´rio de dados. O log de erro ´ o arquivo com a extens˜o ‘.err’.
         o                           e                       a

2.1.1.6 Iniciando o MySQL no Windows 95, 98, ou Me

No Windows 95, 98 ou Me, o MySQL usa TCP/IP para conectar um cliente a um servidor.
(Isto permitir´ que qualquer m´quina na sua rede se conecte a seu servidor MySQL.) Por
              a                 a
isto, vocˆ deve ter certeza de que o suporte TCP/IP est´ instalado na sua m´quina antes
          e                                            a                      a
de iniciar o MySQL. Vocˆ pode encontrar o TCP/IP no seu CD-ROM do Windows.
                          e
Note que se vocˆ estiver usando uma vers˜o antiga do Win95 (por exemplo, OSR2). E
                 e                         a                                          ´
prefer´ que vocˆ use um pacote antigo Winsock; para o MySQL ´ necess´rio o Winsock
       ivel        e                                              e        a
2! Vocˆ pode obter o Winsock mais novo em http://www.microsoft.com. O Windows 98
        e
tem a nova biblioteca Winsock 2, portanto n˜o ´ necess´rio atualizar a biblioteca.
                                             a e      a
Para iniciar o servidor mysqld, vocˆ deve iniciar uma janela do Prompt (Janela “MS-DOS”)
                                   e
e digitar:
      shell> C:mysqlbinmysqld
Isto ir´ iniciar o mysqld em segundo plano. Isto ´, depois do servidor iniciar, vocˆ deve ver
       a                                         e                                 e
outro prompt de comando. (Note que se vocˆ iniciar o servidor deste modo no Windows
                                              e
NT, 2000 ou XP, o servidor ir´ executar em segundo plano e nenhum prompt de comando
                               a
aparecer´ at´ que o servidor finalize. Por isto, vocˆ deve abrir outro prompt de comando
          a e                                       e
para executar programas clientes enquanto o servidor estriver em execu¸˜o.)
                                                                         ca
Vocˆ pode finalizar o servidor MySQL executando:
   e
      shell> C:mysqlbinmysqladmin -u root shutdown
Isto chama o utilit´rio administrativo do MySQL mysqladmin para conectar ao servidor e
                   a
manda-lo finalizar. O comando conecta como root que ´ a conta administrativa padr˜o no
                                                      e                          a
sistema de permiss˜es do MySQL. Por favor, note que o sistema de permiss˜es do MySQL
                   o                                                    o
´ totalmente independente de qualquer login de usu´rio sob o Windows.
e                                                 a
Se o mysqld n˜o iniciar, por favor, verifique o log de erro para ver se o servidor escreveu
              a
alguma mensagem que possa indicar a causa do problema. Vocˆ pode tamb´m tentar iniciar
                                                             e            e
o servidor com mysqld --console; neste caso, vocˆ pode obter alguma informa¸˜o util na
                                                  e                            ca ´
tela que pode ajudar a resolver o problema.
A ultima op¸˜o ´ iniciar o mysqld com --standalone --debug. Neste caso o mysqld ir´
   ´         ca e                                                                     a
escrever em um arquivo log ‘C:mysqld.trace’ que deve conter a raz˜o pela qual o mysqld
                                                                  a
n˜o inicia. Veja Se¸˜o D.1.2 [Making trace files], P´gina 1071.
 a                 ca                              a
Use mysqld --help para mostrar todas as op¸˜es que o mysqld entende!
                                          co
66                                     MySQL Technical Reference for Version 5.0.0-alpha



2.1.1.7 Iniciando o MySQL no Windows NT, 2000, ou XP

Na fam´ NT (Windows NT, 2000 ou XP) o modo recomendado de executar o MySQL ´
        ilia                                                                          e
instal´-lo como um servi¸o do Windows. O Windows ent˜o inicia e para o servidor MySQL
      a                  c                          a
automaticamente quando o Windows inicia e para. Um servidor instalado como um servi¸o
                                                                                    c
tamb´m pode ser controlado a partir da linha de comando usando os comandos NET, ou
     e
com o utilit´rio gr´fico Servi¸os.
             a     a         c
O utilit´rio Servi¸os (o Service Control Manager do Windows) pode ser encontrado no
        a         c
Painel de Controle do Windows (em Ferramentas Administrativas no Windows 2000).
´
E recomendado que se feche o utilit´rio Servi¸os enquanto realiza a opera¸˜es de instala¸˜o
                                   a         c                           co             ca
ou remo¸˜o do servidor a partir desta linha de comando. Isto evita alguns erros estranhos.
         ca
Para ter o MySQL funcionando com TCP/IP no Windows NT 4, vocˆ deve instalar o service
                                                            e
pack 3 (ou mais novo)!
Antes de instalar o MySQL como um servi¸o, vocˆ deve primeiro parar o servidor atual em
                                       c      e
execu¸˜o usando o seguinte commando:
     ca
      shell> C:mysqlbinmysqladmin -u root shutdown
Isto chama o utilit´rio administrativo do MySQL mysqladmin para conectar ao servidor
                   a
e mand´-lo parar. O comando conecta com root que ´ a conta administrativa padr˜o no
        a                                            e                          a
sistema de permiss˜es do MySQL. Por favor, note que o sistema de permiss˜es do MySQL
                   o                                                    o
´ totalmente independente de qualquer login de usu´rio sob o Windows.
e                                                 a
Agora instale o servidor como um servi¸o:
                                      c
      shell> mysqld --install
Se vocˆ n˜o definir um nome para o servi¸o, ele ´ instalado com o nome MySQL. Uma vez
       e a                                c      e
instalado, ele pode ser imediatamente iniciado a partir do utilit´rio Servi¸os, ou usando o
                                                                 a         c
comando NET START MySQL. (Este comando ´ caso insensitivo).
                                            e
Uma vez em execu¸˜o, o mysqld pode ser parado usando o utilit´rio de Servi¸os ou usando
                ca                                           a            c
o comando NET STOP MySQL, ou o comando mysqladmin shutdown.
Se vocˆ tiver problemas instalando o mysqld como um servico usando apenas o nome do
       e
servidor, tente instal´-lo usando seu caminho compelto:
                      a
      shell> C:mysqlbinmysqld --install
A partir do MySQL 4.0.2, vocˆ pode especificaro nome do servi¸o depois da op¸˜o --
                             e                                  c                ca
install. A partir do MySQL 4.0.3, vocˆ pode especificar uma op¸˜o --defaults-file
                                       e                          ca
depois do nome do servi¸o para indicar onde o servidor deve obter op¸˜es ao iniciar. A
                       c                                             co
regras que determinam o nome do servi¸o e os arquivos de op¸˜o que o servidor usa s˜o as
                                     c                     ca                      a
seguintes:
 • Se vocˆ n˜o especificar um nome de servi¸o, o servidor usa o nome padr˜o do MySQL e
          e a                               c                            a
   o servidor lˆ as op¸˜es do grupo [mysqld] no arquivo de op¸˜es padr˜o.
               e      co                                      co       a
 • Se vocˆ especificar um nome de servi¸o depois da op¸˜o --install, o servidor ignora
          e                             c               ca
   o grupo de op¸˜o [mysqld] em vez de ler op¸˜es do grupo que tem o mesmo nome que
                  ca                           co
   o servi¸o. O servidor le op¸˜es do arquivo de op¸˜es padr˜o.
          c                   co                   co       a
 • Se vocˆ especificar uma op¸˜o --defaults-file depois do nome de servi¸o, o servidor
          e                   ca                                          c
   ignora o arquivo de op¸˜es padr˜o e lˆ op¸˜es apenas a partir do grupo [mysqld] do
                           co       a    e co
   arquivo indicado.
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                 67



No caso normal que vocˆ instala o servidor com --install mas nenhum nome de servi¸o,
                           e                                                              c
o servidor ´ instalado com um nome de servi¸o de MySQL.
              e                                  c
Como um exemplo mais complexo, considere o seguinte comando:
        shell> C:mysqlbinmysqld --install mysql --defaults-file=C:my-opts.cnf
Aqui, um nome de servi¸o ´ dado depois de op¸˜o --install. Se nenhuma op¸˜o --
                             c e                        ca                            ca
defaults-file for dada, este comando teria o efeito de fazer o servidor ler o grupo [mysql]
a partir do arquivo de op¸˜es padr˜o. (Isto seria uma m´ id´ia, porque aquele grupoo
                              co        a                          a e
de op¸˜o ´ para ser usado pelo programa cliente mysql.) No entanto, como a op¸˜o --
        ca e                                                                          ca
defaults-file est´ presente, o servidor lˆ as op¸˜es apenas a partir do arquivo indicado,
                     a                         e       co
e apenas do grupo de op¸˜o [mysqld].
                           ca
Vocˆ tamb´m pode especificar as op¸˜es como “Par^metros de inicializa¸~o” no
     e         e                            co                  a                  ca
utilit´rio de Servi¸os do Windows antes de vocˆ iniciar o servi¸o MySQL.
       a            c                                 e                c
Uma vez que o servidor MySQL ´ instalado, o Windows ir´ iniciar o servi¸o automaticamente
                                    e                         a             c
sempre que o Windows inicia. O servi¸o tamb´m pode ser iniciado imediatamente a partir
                                          c        e
do utilit´rio Servi¸os ou usando o comando NET START MYSQL. O comando NET n˜o ´ caso
           a        c                                                              a e
sensitivo.
Note que quando executado como um servi¸o, o mysqld n˜o tˆm acesso a um console e
                                                 c                 a e
ent˜o nenhuma mensagem pode ser vista. Se o mysqld n˜o iniciar, verifique o log de erros
    a                                                          a
par ver se o servidor gravou alguma mensagem l´ indicando a causa do problema. O log de
                                                     a
          a                    o                         ´
erro est´ localizado no diret´rio ‘c:mysqldata’. E o arquivo com um sufixo ‘.err’.
Quando o mysqld est´ executando como um servi¸o, ele pode ser parado usando o utilit´rios
                       a                              c                                 a
Servi¸os, o comando NET STOP MYSQL, ou o comando mysqladmin shutdown. Se o servi¸p
        c                                                                                  c
estiver em execu¸˜o quando o Windows desliga, o Windows ir´ parar o servidor automati-
                  ca                                                 a
camente.
A partir do MySQL vers˜o 3.23.44, vocˆ pode escolher entre instalar o servidor como um
                            a               e
servi¸o Manual se vocˆ n˜o deseja que os servi¸os sejam executados automaticamente du-
      c                 e a                         c
rante o processo de inicializa¸˜o. Para fazer isto, use a op¸˜o --install-manual em vez
                                 ca                               ca
da op¸˜o --install.
        ca
        shell> C:mysqlbinmysqld --install-manual
Para remover um servi¸o que est´ instalado como um servi¸o, primeiro pare-o se ele estiver
                         c            a                          c
em execu¸˜o. Ent˜o use a op¸˜o --remove para removˆ-lo:
            ca     a             ca                         e
        shell> mysqld --remove
Um problema com a finaliza¸˜o autom´tica do servi¸o MySQL ´ que, para vers˜es do
                                  ca         a              c            e            o
MySQL anteriores a 3.23.49, o Windows esparava apenas por alguns segundos para o desliga-
mento completo, e matava os processos do servidor de banco de dados se o tempo limite
fosse excedido. Isto potencialmente causava problemas. (Por exemplo, o mecanimo de ar-
mazenamento InnoDB dever´ fazer uma recupera¸˜o de falhas na pr´xima inicializa¸˜o). A
                               a                      ca                  o          ca
partir do MySQL 3.23.49, o Windows ir´ esperar mais para que a finaliza¸˜o do MySQL
                                             a                                ca
Server esteja completa. Se vocˆ notar que ainda n˜o ´ o suficiente para a sua instala¸˜o,
                                   e                     a e                             ca
n˜o ´ seguro executar o MySQL Server como um servi¸o. Em vez disso, execute-o a partir
  a e                                                       c
do prompt de comando, e finalize-o com mysqladmin shutdown.
A altera¸˜o para avisar para o Windows para esperar mais quando parar o servidor MySQL
           ca
funciona apenas com o Windows 2000 e XP, mas n˜o para o Windows NT. No NT, o
                                                           a
Windows espera apenas 20 segundos para que o servi¸o seja finalizado, e depois desso ele
                                                           c
68                                    MySQL Technical Reference for Version 5.0.0-alpha



mata o processo do servi¸o. Vocˆ pode aumentar este padr˜o abrindo o Editor de Registro
                          c     e                          a
(‘winntsystem32regedt32.exe’) e editar o valor de WaitToKillServiceTimeout em
‘HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControl’ na ´rvore do Registro. Es-
                                                                 a
pecifique o novo valor mais largo em milisegundos (por exemplo 12000 para que o Windows
NT espere at´ 120 segundos).
             e
Se vocˆ n˜o quiser iniciar o mysqld como um servi¸o, vocˆ pode inici´-lo a partir da linha
      e a                                          c      e         a
de comando do mesmo modo que em vers˜es do Windows que n˜o s˜o baseados no NT.
                                          o                     a a
Para instru¸˜es use Se¸˜o 2.1.1.6 [Win95 start], P´gina 65.
           co          ca                         a

2.1.1.8 Executando o MySQL no Windows

O MySQL suporta TCP/IP em todas as plataformas Windows. Os servidores mysqld-nt
e mysql-max-nt suportam named pipes no NT, 2000 e XP. No entanto, o padr˜o ´ usar
                                                                         a e
TCP/IP, independente da plataforma:
  • Named pipes ´ atualmente mais lento que TCP/IP em muitas configura¸˜es do Win-
                 e                                                    co
    dows.
  • Alguns usu´rios encontraram problemas ao finalizar o servidor MySQL quando era
              a
    usado named pipes.
A partir da vers˜o 3.23.50, named pipes s´ est´ habilitado para o mysqld-nt e mysql-max-
                 a                         o   a
nt se eles forem iniciados com a op¸˜o --enable-named-pipe.
                                     ca
Vocˆ pode for¸ar que um cliente MySQL use named pipes especificando a op¸˜o --pipe ou
    e          c                                                            ca
especificando . como nome de m´quina. Use a op¸˜o --socket para especificar o nome do
                                  a                ca
pipe. No MySQL 4.1, vocˆ deve usar a op¸˜o --protocol=PIPE.
                           e                ca
Vocˆ pode testar se o MySQL est´ funcionando executando qualquer dos seguintes coman-
    e                              a
dos:
       C:> C:mysqlbinmysqlshow
       C:> C:mysqlbinmysqlshow -u root mysql
       C:> C:mysqlbinmysqladmin version status proc
       C:> C:mysqlbinmysql test
Se o mysqld est´ lento para responder a suas conex˜es no Win95/Win98, provavelmente
                  a                                    o
existe um problema com seu DNS. Neste caso, inicie o mysqld com a op¸˜o --skip-name-
                                                                        ca
resolve e use somente localhost e n´meros IP na coluna Host das tabelas de permiss˜es
                                        u                                              o
do MySQL.
Existem duas vers˜es da ferramenta de linha de comando MySQL:
                    o
Binario               Descri¸˜o
                             ca
mysql                 Compilado em Windows nativo, oferecendo capacidades de edi¸˜o de
                                                                                    ca
                      texto muito limitadas.
mysqlc                Compilado com o compilador Cygnus GNU, que oferece edi¸˜o        ca
                      readline.
Se vocˆ desejar usar o mysqlc, deve ter uma c´pia da biblioteca ‘cygwinb19.dll’ em al-
       e                                         o
gum lugar que o mysqlc possa encontr´-la. Se sua distribui¸˜o do MySQL n˜o tiver esta
                                         a                   ca               a
biblioteca instalada no mesmo diret´rio que o mysqlc (o diret´rio bin sob o diret´rio base
                                      o                       o                  o
sa dua instala¸˜o do MySQL). Se sua distribui¸˜o n˜o tem a biblioteca cygwinb19.dll no
               ca                               ca a
diret´rio ‘bin’, olhe no diret´rio lib para encontr´-lo e copi´-lo para o seu diret´rio de
     o                          o                    a         a                   o
sistema no Windows. (‘Windowssystem’ ou um lugar parecido).
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                   69



Os privil´gios padr˜es no Windows d˜o a todos usu´rios locais privil´gios totais para todos
         e         o               a             a                  e
os bancos de dados sem necessidade de especificar uma senha. Para deixar o MySQL mais
seguro, vocˆ deve configurar uma senha para todos os usu´rio e remover a linha na tabela
            e                                            a
mysql.user que tem Host=’localhost’ e User=’’.
Vocˆ tamb´m deve adicionar uma senha para o usu´rio root. O exemplo seguinte exemplo
    e      e                                   a
inicia removendo o usu´rio anˆnimo que tem todos os privil´gios, e ent˜o configura uma
                       a     o                            e           a
senha para o usu´rio root:
                a
      C:> C:mysqlbinmysql mysql
      mysql> DELETE FROM user WHERE Host=’localhost’ AND User=’’;
      mysql> FLUSH PRIVILEGES;
      mysql> QUIT
      C:> C:mysqlbinmysqladmin -u root password your_password
Depois de configurar a senha, se vocˆ desejar desligar o servidor mysqld, vocˆ pode usar o
                                   e                                        e
seguinte comando:
      C:> mysqladmin --user=root --password=sua_senha shutdown
Se vocˆ estiver usando o servidor de uma antiga vers˜o shareware do MySQL vers˜o 3.21m
      e                                             a                         a
o comando mysqladmin para configurar uma senha ir´ falhar com um erro: parse error
                                                      a
near ’SET password’. A corre¸˜o para este problema ´ atualizar para uma vers˜o mais
                                ca                      e                      a
nova do MySQL.
Com as vers˜es atuais do MySQL vocˆ pode facilmente adicionar novos usu´rios e alterar
             o                       e                                    a
privil´gios com os comandos GRANT e REVOKE. Veja Se¸˜o 4.4.1 [GRANT], P´gina 255.
      e                                            ca                  a

2.1.2 Instalando o MySQL no Linux

O modo recomendado para instalar o MySQL no Linux ´ usando um arquivo RPM. Os
                                                         e
RPMs do MySQL atualmente s˜o constru´
                               a          idos na vers˜o 7.3 do sistema Suse Linux mas
                                                      a
deve funcionar em outras vers˜es de Linux que suportam rpm e usam glibc.
                             o
Se vocˆ tiver problemas com um arquivo RPM (por exemplo, se vocˆ receber o
       e                                                             e
erro “Sorry, the host ’xxxx’ could not be looked up”), veja Se¸˜o 2.6.2.1 [Binary
                                                              ca
notes-Linux], P´gina 141.
               a
Na maioria dos casos, vocˆ s´ precisa instalar os pacotes servidor MySQL e o cliente
                            e o
MySQL para ter uma instala¸˜o funcional do MySQL. Os outros pacotes n˜o s˜o exigidos
                             ca                                        a a
para uma instala¸˜o padr˜o. Se vocˆ quiser executar um servidor MySQL Max que tenha
                ca        a        e
capacidades adicionais, vocˆ deve instalar o RPM MySQL-Max depois de instalar o RPM
                             e
MySQL-server. Veja Se¸˜o 4.8.5 [mysqld-max], P´gina 344.
                       ca                      a
Se vocˆ tiver um dependˆncia de falha ao tentar instalar os pacotes do MySQL 4.0 (ex.:
      e                e
“error: removing these packages would break dependencies: libmysqlclient.so.10
is needed by ...”), vocˆ tamb´m deve instalar o pacote MySQL-shared-compat,
                        e       e
o qual inclui ambas as bibliotecas para compatibilidade com vers˜es anteriores
                                                                        o
(libmysqlclient.so.12 para MySQL 4.0 e libmysqlclient.so.10 para MySQL 3.23).
Muitas distribui¸˜es Linux ainda vˆm com o MySQL 3.23 a elas normalmente ligam as
                 co                  e
aplica¸˜es dinamicamente para economizar espa¸o em disco. Se estas bibliotecas compar-
      co                                          c
tilhadas est˜o em pacotes separados (ex.; MySQL-shared), ´ suficiente simplesmente deixar
            a                                               e
estes pacotes instalados e apenas atualizar os pacotes do servidor e cliente MySQL (que s˜o
                                                                                         a
70                                     MySQL Technical Reference for Version 5.0.0-alpha



estaticamente ligados e n˜o dependem de bibliotecas compartilhadas). Para distribui¸˜es
                            a                                                           co
que incluem as bibliotecas compartilhadas no mesmo pacote que o servidor MySQL (ex.:
Red Hat Linux), vocˆ tamb´m pode instalar nosso RPM MySQL-shares 3.23 ou usar o
                       e       e
pacote compat´ com MySQL-shared.
                ivel
Os seguintes pacotes RPM est˜o dispon´
                                 a       iveis:
  • MySQL-server-VERSION.i386.rpm
     O servidor MySQL. Vocˆ ira precisar dele a n˜o ser que vocˆ apenas queira se conectar a
                              e                   a            e
     um servidor MySQL executando em outra m´quina. Note que este pacote era chamado
                                                  a
     MySQL-VERSION.i386.rpm antes do MySQL 4.0.10.
  • MySQL-Max-VERSION.i386.rpm
     O servidor MySQL Max. Este seridor tem capacidades adicionais que o servidor no
     ROM MySQL-server n˜o tem. Vocˆ deve instalar o RPM MySQL-server primeiro,
                              a            e
     porque o RPM MySQL-Max depende dele.
  • MySQL-client-VERSION.i386.rpm
     Os programas clientes padr˜es do MySQL. Provavelmente vocˆ sempre instalar´ este
                                   o                                e                 a
     pacote.
  • MySQL-bench-VERSION.i386.rpm
     Testes e comparativos de performances (benchmarks). Necessita do Perl e m´dulos do
                                                                                   o
     BDB-mysql.
  • MySQL-devel-VERSION.i386.rpm
     As bibliotecas e arquivos include necess´rios se vocˆ precisa para compilar outros
                                                a          e
     clientes MySQL, como nos m´dulos Perl.
                                     o
  • MySQL-shared-VERSION.i386.rpm
     Este pacote cont´m as bibliotecas compartilhadas (libmysqlclient.so*) que certas
                       e
     linguagens e aplica¸˜es nencess´rias para carregar dinˆmicamente e usar o MySQL.
                         co            a                   a
  • MySQL-shared-compat-VERSION.i386.rpm
     Este pacote inclui o biblioteca compartilhada para MySQL 3.23 e MySQL 4.0. In-
     stale este pacote em vez do MySQL-shared, se vocˆ tiver aplica¸˜es instaladas que s˜o
                                                       e            co                    a
     dinˆmicamente ligadas ao MySQL 3.23 mas vocˆ quer atualizar para o MySQL 4.0 sem
         a                                          e
     quebrar as dependˆncias da biblioteca. Este pacote esta dispon´
                         e                                             ivel desde o MySQL
     4.0.13.
  • MySQL-embedded-VERSION.i386.rpm
     A biblioteca do servidor embutido MySQL (MySQL 4.0).
  • MySQL-VERSION.src.rpm
     Este cont´m o c´digo fonte para todos os pacotes acima. Ele tamb´m pode ser usado
               e      o                                                  e
     para tentar construir RPMs para outras arquiteturas (por exemplo, Alpha ou SPARC).
Para ver todos os arquivo em um pacote RPM, (por exemplo, um RPM MySQL-server),
execute:
      shell> rpm -qpl MySQL-server-VERSION.i386.rpm
Para realizar uma instala¸˜o m´
                         ca   inima padr˜o, execute:
                                          a
      shell> rpm -i MySQL-server-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm
Para instalar somente o pacote cliente, execute:
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                      71



      shell> rpm -i MySQL-client-VERSION.i386.rpm
O RPM fornece um recurso para verificar a integridade e autenticidade dos pacotes antes
de instal´-los. Se vocˆ quiser aprender mais sobre este recurso, veja Se¸˜o 2.2.2 [Verifying
          a            e                                                ca
Package Integrity], P´gina 75.
                      a
O RPM coloca dados sob o ‘/var/lib/mysql’. O RPM tamb´m cria as entradas apropriadas
                                                              e
em ‘/etc/rc.d/’ para iniciar o servidor automaticamente na hora do boot. (Isto significa
que se vocˆ realizou uma instala¸˜o anterior e fez altera¸˜es em seu script de inicializa¸˜o,
            e                       ca                    co                             ca
vocˆ pode desejar criar uma c´pia do script para que vocˆ n˜o perca ao instalar um RPM
    e                            o                         e a
mais novo). Veja Se¸˜o 2.4.3 [Automatic start], P´gina 118 para mais informa¸˜es sobre
                      ca                            a                             co
como o MySQL pode ser iniciado automaticamente na inicializa¸˜o do sistema.
                                                                 ca
Se vocˆ quiser instalar o RPM do MySQL em uma distribui¸˜o Linux mais antiga que n˜o
       e                                                      ca                           a
suporte scripts de inicializa¸˜o no ‘/etc/init.d’ (diretamente ou via link simb´lico), vocˆ
                             ca                                                  o           e
deve criar um link simb´lico que aponte para a localiza¸˜o onde o seu script de instala¸˜o
                         o                               ca                               ca
est´ atualmente instalado. Por exemplo, se esta localiza¸˜o for ‘/etc/rc.d/init.d’, use
   a                                                       ca
estes comandos antes de intalar o RPM para criar ‘/etc/init.d’ como um link simb´lico   o
que aponte l´:a
      shell> cd /etc; ln -s rc.d/init.d .
No entanto, todas as distribui¸˜es de Linux atuais j´ devem suportar este novo layout
                                   co                   a
de diret´rio que usa ‘/etc/init.d’ j´ que ele ´ exigido para compatibilidade LBS (Linux
         o                              a       e
Standard Base).
Se o arquivo RPM que vocˆ instalar inclui o MySQL-server, o daemon mysqld deve estar
                             e
pronto e em execu¸˜o ap´s a instala¸˜o. Agora vocˆ j´ deve poder iniciar o MySQL. Veja
                   ca      o           ca            e a
Se¸˜o 2.4 [P´s Instala¸˜o], P´gina 111.
  ca          o        ca      a
Se alguma coisa der errado, vocˆ encontrar maiores informa¸˜es no cap´
                                    e                         co        itulo de instala¸˜o.
                                                                                         ca
Veja Se¸˜o 2.2.9 [Instalado o bin´rio], P´gina 91.
         ca                          a    a

2.1.3 Instalando o MySQL no Mac OS X

A partir do MySQL 4.0.11, vocˆ pode instalar o MySQL no Mac OS X 10.2 (“Jaguar”)
                               e
usando um pacote do bin´rio do Mac OS X PKG em vez da distribui¸˜o bin´rio em tarball.
                         a                                          ca     a
Note que vers˜es mais antigas do Mac OS X (ex.: 10.1.x) n˜o s˜o suportadas por este
              o                                                a a
pacote.
Este pacote est´ localizado dentro de um arquivo de imagem de disco (.dmg). que vocˆ
                a                                                                           e
primeiro precisa montar com um duplo clique em sua ´     icone no Finder. Ele deve ent˜o  a
montar a imagem e exibir o seu conte´do.
                                      u
NOTA: Antes de proceder com a instala¸˜o, tenha certeza que vocˆ finalizou todas as
                                          ca                           e
instˆncias do MySQL em execu¸˜o usando o MySQL Manager Aplication (no Mac OS X
    a                          ca
Server) ou via mysqladmin shutdown na linha de comando.
Para relamente instalar o MySQL PKG, de um duplo clique na ´    icone do pacote. Isto inicia
o Mac OS Package Installer, que ir´ guia-lo pela instala¸˜o do MySQL.
                                  a                     ca
O Mac OS X PKG do MySQL ir´ se instalar em ‘/usr/local/mysql-<version>’
                                       a
e tamb´m instalr´ um link simb´lico ‘/usr/local/mysql’, apontando para a nova
        e         a                 o
localiza¸˜o. Se um diret´rio chamado ‘/usr/local/mysql’ j´ existe, ele ser´ renomeado
        ca               o                                    a               a
para ‘/usr/local/mysql.bak’ em primeiro lugar. Adicionalmente, ele ir´ instalar a
                                                                              a
72                                     MySQL Technical Reference for Version 5.0.0-alpha



tabela de permiss˜es do banco de dados MySQL executando mysql_install_db depois da
                 o
instala¸˜o.
       ca
O layout de instala¸˜o ´ similar a aquele da distribui¸˜o bin´ria, todos os bin´rios do MySQL
                   ca e                               ca     a                  a
est˜o localizados no diret´rio ‘/usr/local/mysql/bin’. O socket MySQL ser´ colocado em
   a                      o                                                       a
‘/tmp/mysql.sock’ por padr˜o. Veja Se¸˜o 2.2.5 [Installation layouts], P´gina 83.
                              a           ca                                  a
A instala¸˜o do MySQL exige uma conta de usu´rio do Mac OS X chamada mysql (uma
         ca                                     a
conta de usu´rio com este nome existe por padr˜o no Mac OS X 10.2 e acima).
            a                                 a
Se vocˆ estiver executando o MAC OS X Server, vocˆ j´ ter´ uma vers˜o do MySQL
       e                                         e a     a         a
instalado:
 • Mac OS X Server 10.2-10.2.2 vem com o MySQL 3.23.51 instalado
 • Mac OS X Server 10.2.3-10.2.6 vem com o MySQL 3.23.53
 • Mac OS X Server 10.3 vem com o MySQL 4.0.14
Esta se¸˜o do manual cobre a instala¸˜o apenas do MySQL Mac OS X PKG oficial. Leia o
        ca                          ca
ajuda da Apple sobre a instala¸˜o do MySQL (Execute o aplicativo “Help View”, selecione
                              ca
a ajuda do “Mac OS X Server” e fa¸a uma busca por “MySQL” e leia o item entitulado
                                    c
“Installing MySQL”).
Note especialmente, que a vers˜o pr´-instalada do MySQL no Mac OS X Server ´ iniciado
                              a    e                                       e
com o comando safe_mysqld em vez de mysqld_safe.
Se anteriormente vocˆ usava pacotes do MySQL de Marc Liyanage para Mac OS X de
                     e
http://www.entropy.ch, vocˆ pode simplesmente seguir as intru¸˜es de atualiza¸˜o para
                             e                                  co            ca
pacotes usando o layout de instala¸˜o dos bin´rio como dados em suas p´ginas.
                                  ca         a                        a
Se vocˆ est´ atualizado da vers˜o 3.23.xx de Marc ou do vers˜o Mac OS X Server do
       e   a                    a                               a
MySQL para o MySQL PKG oficial, vocˆ tamb´m deve converter a tabela de privil´gios do
                                       e      e                                  e
MySQL existente para o formato atual, porque alguns novos privil´gios de seguran¸a foram
                                                                 e              c
adicionados. Veja Se¸˜o 2.5.6 [Upgrading-grant-tables], P´gina 130.
                    ca                                   a
Se vocˆ preferisse iniciar automaticamente o MySQL durante o boot do sistema, vocˆ
       e                                                                                e
tamb´n precisa instalar o MySQL Startup Item. A partir do MySQL 4.0.15, ele ´ parte do
     e                                                                        e
disco de instala¸˜o do Mac OS X como um pacote de instala¸˜o separado. Simplesmente
                ca                                         ca
de um duplo clique no ´icone MySQLStartupItem.pkg e siga as instru¸˜es para instal´-lo.
                                                                  co              a
Note que isto s´ precisa ser feito uma vez! N˜o h´ necessidade de se instalar o Startup Item
               o                             a a
toda vez que se atualizar o pacote do MySQL.
Devido a um erro no instalador de pacotes do Mac OS X, algumas vezes vocˆ pode ver a
                                                                                e
mensagem de erro You cannot install this software on this disk. (null) no di´logo       a
de sele¸˜o do disco de destino. Se este erro ocorrer, simplesmente clique no bot˜o Go
       ca                                                                              a
Back uma vez para retornar a tela anterior. Agora clique em Continue para avan¸ar para a
                                                                                   c
sele¸˜o do disco de destino novamente - agora vocˆ deve estar apto a escolher o disco destino
    ca                                           e
corretamente. N´s informamos este erro a Apple e eles est˜o investigando este problema.
                 o                                         a
O Startup Item ser´ instalado em ‘/Library/StartupItems/MySQL’. Ele adiciona uma
                    a
vari´vel MYSQLCOM=-YES- ao arquivo de configura¸˜o do sistema (‘/etc/hostconfig’). Se
    a                                               ca
vocˆ desejasse diasbilitar a inicializa¸˜o autom´tica do MySQL, simplesmente altere o valor
   e                                   ca       a
desta vari´vel para MYSQLCOM=-NO-.
          a
No Mac OS X Server, o script de instala¸˜o do Startup Item disabilitar´ automatica-
                                          ca                          a
mente a inicializa¸˜o da instala¸˜o padr˜o do MySQL alterando a vari´vel MYSQL em
                  ca            ca      a                            a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                    73



‘/etc/hostconfig’ para MYSQL=-NO-. Isto ´ para evitar conflitos na inicializa¸˜o. No
                                           e                                ca
entanto, ele n˜o desliga um servidor MySQL aj´ em execu¸˜o.
              a                              a         ca
Depois da instala¸˜o, vocˆ pode iniciar o MySQL executando os seguintes comandos em
                 ca      e
um janela de terminal. Note qye vocˆ preceisa ter privil´gios de administrador para realizar
                                   e                    e
esta tarefa.
Se vocˆ tiver instalado o Startup Item:
      e
      shell> sudo /Library/StartupItems/MySQL/MySQL start
      (Enter your password, if necessary)
      (Press Control-D or enter "exit" to exit the shell)
Se vocˆ n˜o tiver instalado o Startup Item, digite a seguinte sequˆncia de comandos:
      e a                                                         e
      shell>   cd /usr/local/mysql
      shell>   sudo ./bin/mysqld_safe
      (Enter   your password, if necessary)
      (Press   Control-Z)
      shell>   bg
      (Press   Control-D or enter "exit" to exit the shell)
Agora vocˆ deve conseguir se conectar ao servidor MySQL, ex.:
          e                                                                     executando
‘/usr/local/mysql/bin/mysql’
Se vocˆ instalar o MySQL pela primeira vez, lembre-se de consigurar uma senha para o
      e
usu´rio root do MySQL!
   a
Isto ´ feito com os seguintes comandos:
     e
      /usr/local/mysql/bin/mysqladmin -u root password <password>
      /usr/local/mysql/bin/mysqladmin -u root -h ‘hostname‘ password <password>
Por favor, tenha certeza que o comando hostname na segunda linha est´ entre crases (‘),
                                                                    a
                           ´ com a sa´ deste comando (o nome da m´quina deste
assim a shell pode substitui-la         ida                              a
sistema)!
Vocˆ tamb´m pode querer adicionar aliases ao seu arquivo de resursos do sheel para acessar
   e      e
mysql e mysqladmin da linha de comando:
      alias mysql ’/usr/local/mysql/bin/mysql’
      alias mysqladmin ’/usr/local/mysql/bin/mysqladmin’
De forma alternativa, vocˆ pode simplesmente adicionar /usr/local/mysql/bin a sua
                          e
vari´vel de ambiente PATH, ex.: adicionando o seguinte ao arquivo ‘$HOME/.tcshrc’:
    a
      setenv PATH ${PATH}:/usr/local/mysql/bin
Note que instalar um novo MySQL PKG n˜o remove o diret´rio de uma instala¸˜o mais
                                           a                 o                   ca
antiga. Infelizmente o Mac OS X Installer ainda n˜o oferece a funcionalidade exigida para
                                                 a
atualizar apropriadamente pacotes instalados anteriormente.
Depois de copiar os arquivos de banco de dados do MySQL sobre os da vers˜o       a
anterior e inicializar o nova vers˜o com sucesso, vocˆ deve remover os arquivos da
                                  a                  e
instala¸˜o antiga para economizar espa¸o em disco. Adicionalmente vocˆ tamb´m
       ca                               c                               e       e
deve remover vers˜es mais antigas do diret´rio do Package Receipt localizados em
                    o                       o
‘/Library/Receipts/mysql-<version>.pkg’.
74                                    MySQL Technical Reference for Version 5.0.0-alpha



2.1.4 Instalando o MySQL no NetWare

A partir da vers˜o 4.0.11, o MySQL est´ dispon´
                a                       a       ivel para a Novell NetWare na forma de
pacote do bin´rio. Para servir o MySQL, o servidor NetWare deve suprir estas exigˆncias:
             a                                                                    e
  • NetWare vers˜o 6.5, ou NetWare 6.0 com Support Pack 3 instalado (Vocˆ pode obtˆ-lo
                  a                                                        e        e
    em http://support.novell.com/filefinder/13659/index.html). O sistema deve
    obedecer as exigˆncias m´
                    e         inimas da Naveel para executar a respectiva vers˜o do Net-
                                                                              a
    Ware.
  • Os dados do MySQL, assim com os seus bin´rios, devem ser instalados em um volume
                                               a
    NSS; volumes tradicionais n˜o s˜o suportados.
                                 a a
O pacote bin´rio para o NetWare pode ser obtido em http://www.mysql.com/downloads/.
             a
Se vocˆ estiver executando o MySL no NetWare 6.0, sugerimos que vocˆ utilize a op¸˜o
      e                                                              e           ca
--skip-external-locking na linha de comando. Tamb´m ser´ necess´rio utilizar CHECK
                                                       e    a      a
TABLE e REPAIR TABLE em vez de myisamchk, porque myisamchk faz uso de lock externo.
Lock externo possui problemas com NetWare 6.0; o problema foi eliminado no NetWare
6.5.

2.1.4.1 Instalando o MySQL para Bin´rios do NetWare
                                   a

 1. Se vocˆ estiver atualizando de um instaa¸˜o anterior, para o servidor MySQL. Isto ´
            e                                   ca                                        e
    feito a partir do console do servidor, usando:
            SERVER: mysqladmin -u root shutdown
 2. Conecte-se no servidor alvo a partir de uma m´quina cliente com acesso ao local onde
                                                      a
    vocˆ instalar´ o MySQL.
        e         a
 3. Extraia o pacote zip bin´rio em seu servidor. Tenha certeza de permitir que os caminhos
                            a
                                    ´
    no arquivo zip sejam usados. E seguro simplesmente extrair os arquivos para ‘SYS:’.
    Se vocˆ estiver atualizando de uma instalando anterior, vocˆ pode precisar copiar os
            e                                                      e
    diret´rios de dados (ex.: ‘SYS:MYSQLDATA’) agora, assim como ‘my.cnf’ se vocˆ o tiver
          o                                                                         e
    costumizado. Vocˆ pode ent˜o deletar a c´pia antiga do MySQL.
                       e          a              o
 4. Vocˆ pode desejar renomear o diret´rio para algo mais consistente e f´cil de usar.
        e                                  o                                   a
    Recomendamos usar o ‘SYS:MYSQL’; exemplos no manual o usar˜o para se referir ao
                                                                        a
    diret´rio de instala¸˜o em geral.
          o              ca
 5. No console do servidor, adicione um caminho de busca no diret´rio contendo os NLMs
                                                                      o
    do MySQL. Por exemplo:
            SERVER: SEARCH ADD SYS:MYSQLBIN
 6. Instale o banco de dados inicial, se necess´rio, digitando mysql_install_db no console
                                                a
    do servidor.
 7. Inicie o servidor MySQL usando mysqld_safe no console do servidor.
 8. Para finalizar a instala¸˜o, vocˆ tamb´m deve adicionar os seguintes comandos ao
                             ca       e       e
    autoexec.ncf. Por exemplo, se sua instala¸˜o do MySQL est´ em ‘SYS:MYSQL’ e vocˆ
                                                   ca               a                     e
    quiser que o MySQL inicie automaticamente, vocˆ pode adicionar estas linhas:
                                                         e
            #Starts the MySQL 4.0.x database server
            SEARCH ADD SYS:MYSQLBIN
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                75



         MYSQLD_SAFE
    Se vocˆ estiver usando NetWare 6.0, vocˆ deve adicionar o parˆmetro --skip-
          e                                e                     a
    external-locking:
         #Starts the MySQL 4.0.x database server
         SEARCH ADD SYS:MYSQLBIN
         MYSQLD_SAFE --skip-external-locking
Se houver uma instala¸˜o existente do MySQL no servidor, verifique a existencia de coman-
                       ca
dos de inicializa¸˜o do MySQL em autoexec.ncf, e edite ou delete-os se necess´rio.
                 ca                                                           a

2.2 Detalhes Gerais de Instala¸˜o
                              ca

2.2.1 Como obter o MySQL

Confira a homepage da MySQL homepage (http://www.mysql.com/) para informa¸˜es      co
sobre a vers˜o atual e para instru¸˜es de download.
            a                     co
Nosso principal espelho de download est´ localizado em: http://mirrors.sunsite.dk/mysql/.
                                       a
Para uma lista atualizada completa dos mirrors de download da MySQL, veja
http://www.mysql.com/downloads/mirrors.html. Vocˆ tamb´m encontrar´ informa¸˜o
                                                          e    e          a        ca
sobre como se tornar um mirror do MySQL e como relatar um mirror ruim ou
desatualizado.

2.2.2 Verificando a Integridade do Pacote Usando MD5 Checksums
      ou GnuPG

Depois de fazer o download do pacote MySQL que serve `s suas necessidades e antes de
                                                             a
tentar instal´-lo, vocˆ deve ter certeza de que ele esta intacto e n˜o foi manipulado.
             a        e                                             a
A MySQL AB oferece dois tipos de verifica¸˜o de integridade: MD5 checksums e assinaturas
                                            ca
criptografadas usando GnuPG, o GNU Privacy Guard.

Verificando o MD5 Checksum

Depois de fazer o download do pacote, vocˆ deve verificar se o MD5 checksum corresponde
                                          e
a aquele fornecido na p´gina de download do MySQL. Cada pacote tem um checksum
                        a
individual, que vocˆ pode verificar com o seguinte comando:
                   e
       shell> md5sum <pacote>
Note que nem todos os sistemas operacionais suportam o comando md5sum - em alguns
ele ´ simplesmente chamado md5, outros n˜o o possuem. No Linux, ele ´ parte do pacote
    e                                     a                           e
                              a       ´
GNU Text Utilities, que est´ disponivel para uma grande faixa de plataformas. Vocˆ   e
pode fazer o download do c´digo fonte em http://www.gnu.org/software/textutils/.
                            o
Se vocˆ tiver o OpenSSL instalado, vocˆ tamb´m pode usar o comando openssl md5
        e                                e      e
<pacote>. Uma implementa¸˜o do comando md5 para DOS/Windows est´ dispon´ em
                             ca                                         a       ivel
http://www.fourmilab.ch/md5/.
Exemplo:
76                                     MySQL Technical Reference for Version 5.0.0-alpha



      shell> md5sum mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz
      155836a7ed8c93aee6728a827a6aa153
                      mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz
Vocˆ deve verificar se o resultado do checksum corresponde a aquele impresso no p´gina de
   e                                                                            a
download logo abaixo do respectivo pacote.
A maioria do sites mirrors tamb´m oferecem um arquivo chamado ‘MD5SUMS’, que tamb´m
                               e                                                        e
inclui o MD5 checksums para todos os arquivos inclu´idos no diret´rio ‘Downloads’. Note no
                                                                 o
entanto que ´ muito f´cil de modificar este arquivo e ele n˜o ´ um m´todo muito confi´vel.
             e       a                                    a e        e                a
Caso esteja em d´vida, vocˆ deve consultar diferentes sites mirroers e comparar os resulta-
                 u         e
dos.

Verifica¸˜o de Assinatura Usando GnuPG
       ca

Um m´todo de verifica¸˜o de integridade de um pacote mais confi´vel ´ o uso de assi-
       e               ca                                          a     e
naturas criptografadas. A MySQL AB usa o GNU Privacy Guard (GnuPG), uma alterna-
tiva Open Source para o bem conhecido Pretty Good Privacy (PGP) de Phil Zimmermann.
Veja http://www.gnupg.org/ and http://www.openpgp.org/ para mais informa¸˜es sobre
                                                                                co
OpenPGP/GnuPG e como obter e instalar o GnuPG em seus sistema. A maioria das distribui¸˜es
                                                                                      co
de Linux j´ vˆm com o GnuPG instalado por padr˜o.
          a e                                   a
A partir do MySQL 4.0.10 (Fevereiro de 2003), a MySQL AB come¸ou a assinar o seus
                                                                     c
pacotes de download com GnuPG. Assinaturas criptografadas s˜o um m´todo bem mais
                                                                a         e
confi´vel de verifica¸˜o da integridade e autenticidade de um arquivo.
     a              ca
Para verificar a assinatura de um pacote espec´
                                             ifico, vocˆ primeiro precisa obtter uma c´pia
                                                      e                               o
da chave p´blica GPG da MySQL AB (build@mysql.com). Vocˆ tamb´m pode cort´-la e
            u                                                   e      e            a
col´-la diretamente daqui ou obtˆ-la em http://www.keyserver.net/.
   a                            e
      Key ID:
      pub 1024D/5072E1F5 2003-02-03
           MySQL Package signing key (www.mysql.com) <build@mysql.com>
      Fingerprint: A4A9 4068 76FC BD3C 4567 70C8 8C71 8D3B 5072 E1F5

      Public Key (ASCII-armored):

      -----BEGIN PGP PUBLIC KEY BLOCK-----
      Version: GnuPG v1.0.6 (GNU/Linux)
      Comment: For info see http://www.gnupg.org

      mQGiBD4+owwRBAC14GIfUfCyEDSIePvEW3SAFUdJBtoQHH/nJKZyQT7h9bPlUWC3
      RODjQReyCITRrdwyrKUGku2FmeVGwn2u2WmDMNABLnpprWPkBdCk96+OmSLN9brZ
      fw2vOUgCmYv2hW0hyDHuvYlQA/BThQoADgj8AW6/0Lo7V1W9/8VuHP0gQwCgvzV3
      BqOxRznNCRCRxAuAuVztHRcEAJooQK1+iSiunZMYD1WufeXfshc57S/+yeJkegNW
      hxwR9pRWVArNYJdDRT+rf2RUe3vpquKNQU/hnEIUHJRQqYHo8gTxvxXNQc7fJYLV
      K2HtkrPbP72vwsEKMYhhr0eKCbtLGfls9krjJ6sBgACyP/Vb7hiPwxh6rDZ7ITnE
      kYpXBACmWpP8NJTkamEnPCia2ZoOHODANwpUkP43I7jsDmgtobZX9qnrAXw+uNDI
      QJEXM6FSbi0LLtZciNlYsafwAPEOMDKpMqAK6IyisNtPvaLd8lH0bPAnWqcyefep
      rv0sxxqUEMcM3o7wwgfN83POkDasDbs3pjwPhxvhz6//62zQJ7Q7TXlTUUwgUGFj
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                               77



     a2FnZSBzaWduaW5nIGtleSAod3d3Lm15c3FsLmNvbSkgPGJ1aWxkQG15c3FsLmNv
     bT6IXQQTEQIAHQUCPj6jDAUJCWYBgAULBwoDBAMVAwIDFgIBAheAAAoJEIxxjTtQ
     cuH1cY4AnilUwTXn8MatQOiG0a/bPxrvK/gCAJ4oinSNZRYTnblChwFaazt7PF3q
     zIhMBBMRAgAMBQI+PqPRBYMJZgC7AAoJEElQ4SqycpHyJOEAn1mxHijft00bKXvu
     cSo/pECUmppiAJ41M9MRVj5VcdH/KN/KjRtW6tHFPYhMBBMRAgAMBQI+QoIDBYMJ
     YiKJAAoJELb1zU3GuiQ/lpEAoIhpp6BozKI8p6eaabzF5MlJH58pAKCu/ROofK8J
     Eg2aLos+5zEYrB/LsrkCDQQ+PqMdEAgA7+GJfxbMdY4wslPnjH9rF4N2qfWsEN/l
     xaZoJYc3a6M02WCnHl6ahT2/tBK2w1QI4YFteR47gCvtgb6O1JHffOo2HfLmRDRi
     Rjd1DTCHqeyX7CHhcghj/dNRlW2Z0l5QFEcmV9U0Vhp3aFfWC4Ujfs3LU+hkAWzE
     7zaD5cH9J7yv/6xuZVw411x0h4UqsTcWMu0iM1BzELqX1DY7LwoPEb/O9Rkbf4fm
     Le11EzIaCa4PqARXQZc4dhSinMt6K3X4BrRsKTfozBu74F47D8Ilbf5vSYHbuE5p
     /1oIDznkg/p8kW+3FxuWrycciqFTcNz215yyX39LXFnlLzKUb/F5GwADBQf+Lwqq
     a8CGrRfsOAJxim63CHfty5mUc5rUSnTslGYEIOCR1BeQauyPZbPDsDD9MZ1ZaSaf
     anFvwFG6Llx9xkU7tzq+vKLoWkm4u5xf3vn55VjnSd1aQ9eQnUcXiL4cnBGoTbOW
     I39EcyzgslzBdC++MPjcQTcA7p6JUVsP6oAB3FQWg54tuUo0Ec8bsM8b3Ev42Lmu
     QT5NdKHGwHsXTPtl0klk4bQk4OajHsiy1BMahpT27jWjJlMiJc+IWJ0mghkKHt92
     6s/ymfdf5HkdQ1cyvsz5tryVI3Fx78XeSYfQvuuwqp2H139pXGEkg0n6KdUOetdZ
     Whe70YGNPw1yjWJT1IhMBBgRAgAMBQI+PqMdBQkJZgGAAAoJEIxxjTtQcuH17p4A
     n3r1QpVC9yhnW2cSAjq+kr72GX0eAJ4295kl6NxYEuFApmr1+0uUq/SlsQ==
     =YJkx
     -----END PGP PUBLIC KEY BLOCK-----
Vocˆ pode importar esta chave em seu pasta de chaves publicas GPG usando gpg --import.
   e
Veja a documenta¸˜o de GPG para mais informa¸˜es de como trabalhar com chaves p´blicas.
                ca                          co                                 u
Depois de fazer o download e importar a chave publica criada, fa¸a o download
                                                                     c
do pacote MySQL desejado e da assinatura correspondente, que tamb´m est´    e     a
dispon´
      ivel na p´gina de download. A assinatura tem a extens˜o ‘.asc’. Por exemplo,
                a                                           a
a assinatura de ‘mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz’ seria
‘mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz.asc’. Tenha certeza que ambos
os arquivos est˜o armazenados no mesmo diret´rio e ent˜o execute o seguinte comando
               a                              o       a
para verificar a assinatura para este arquivo:
     shell> gpg --verify <package>.asc

     Exemplo:

     shell> gpg --verify    mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz.asc
     gpg: Warning: using    insecure memory!
     gpg: Signature made    Mon 03 Feb 2003 08:50:39 PM MET using DSA key ID 5072E1F5
     gpg: Good signature    from
          "MySQL Package    signing key (www.mysql.com) <build@mysql.com>"
A mensagem "Good signature" indica que est´ tudo certo.
                                          a

Verificando Assinatura Usando RPM

Para pacotes RPM, n˜o h´ assinaturas separadas - pacotes RPM atualmente tˆm uma assi-
                    a a                                                   e
                ´ e MD5 checksum. Vocˆ pode verific´-los executando o seguinte comando:
natura GPG incluida                    e           a
78                                     MySQL Technical Reference for Version 5.0.0-alpha



      shell> rpm --checksig <package>.rpm

      Exemplo:

      shell> rpm --checksig MySQL-server-4.0.10-0.i386.rpm
      MySQL-server-4.0.10-0.i386.rpm: md5 gpg OK
Nota: Se vocˆ estiver usando RPM 4.1 e ele reclamar sobre (GPG) NOT OK (MISSING KEYS:
              e
GPG#5072e1f5) (mesmo se vocˆ a importou para detro de sua pasta de chaves publicas
                                 e
GPG), vocˆ precisa import´-las para dentro de sua pasta de chaves RPM primeiro. RPM
           e                a
4.1 n˜o utiliza mais ias suas pastas de chaves GPG (e o pr´prio GPG), mas mant´m sua
     a                                                       o                      e
pr´pria pasta de chaves (porque ele ´ um aplicativo do sistema e a pasta de chaves p´blicas
  o                                  e                                              u
do GPG ´ um arquivo espec´
         e                   ifico do usu´rio). Para importar a chave p´blica do MySQL em
                                        a                             u
uma pasta de chaves RPM, use os seguintes comandos:
      shell> rpm --import <pubkey>

      Exemplo:

       shell> rpm --import mysql_pubkey.asc
Caso vocˆ note que as assinaturas MD5 checksum ou GPG n˜o coincidem, tente primeiro fazer
          e                                            a
o download do pacote respectivo mais uma vez, talvez de outro site mirror. Se vocˆ n˜o
                                                                                   e a
obter sucesso na verifica¸˜o da integridade do pacote repetidas vezes, notifique-nos sobre
                         ca
tais incidentes incluindo o nome completo do pacote e o site que vocˆ tem utilizado para
                                                                    e
fazer o download pelos emails webmaster@mysql.com ou build@mysql.com.

2.2.3 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
compilar somente o c´digo cliente, um compilador C++ ´ necess´rio mas threads n˜o.) N´s
                     o                                 e       a                  a    o
mesmos usamos e desenvolvemos o software primeiramente no Linux (SuSE e red Hat),
FreeBSD e Sun Solaris (Vers˜es 8 e 9).
                            o
Perceba que para alguns sistemas operacionais, o suporte nativo a thread funciona somente
nas ultimas vers˜es. O MySQL compila com sucesso nas seguintes combina¸˜es de sistema
    ´           o                                                          co
operacional/pacote de thread:
  • AIX 4.x com threads nativas. Veja Se¸˜o 2.6.6.4 [IBM-AIX], P´gina 155.
                                          ca                        a
  • Amiga.
  • BSDI 2.x com o pacote inclu´ MIT-pthreads. Veja Se¸˜o 2.6.4.5 [BSDI], P´gina 151.
                                ido                         ca                  a
  • BSDI 3.0, 3.1 e 4.x com threads nativas. Veja Se¸˜o 2.6.4.5 [BSDI], P´gina 151.
                                                     ca                   a
  • SCO OpenServer with a recent port of the FSU Pthreads package. Veja Se¸˜o 2.6.6.9
                                                                               ca
    [SCO], P´gina 161.
             a
  • SCO UnixWare 7.0.1. Veja Se¸˜o 2.6.6.10 [SCO Unixware], P´gina 163.
                                  ca                              a
  • DEC Unix 4.x com threads nativas. Veja Se¸˜o 2.6.6.6 [Alpha-DEC-UNIX], P´gina 157.
                                               ca                               a
  • FreeBSD 2.x com o pacote inclu´ MIT-pthreads. Veja Se¸˜o 2.6.4.1 [FreeBSD],
                                      ido                           ca
    P´gina 149.
      a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                       79



 • FreeBSD 3.x e 4.x com threads nativas. Veja Se¸˜o 2.6.4.1 [FreeBSD], P´gina 149.
                                                   ca                       a
 • FreeBSD 4.x com Linuxthreads. Veja Se¸˜o 2.6.4.1 [FreeBSD], P´gina 149.
                                           ca                        a
 • HP-UX 10.20 com o pacote incluido ´ MIT-pthreads ou DCE threads. Veja Se¸˜o 2.6.6.2
                                                                               ca
   [HP-UX 10.20], P´gina 154.
                     a
 • HP-UX 11.x com as threads nativas. Veja Se¸˜o 2.6.6.3 [HP-UX 11.x], P´gina 154.
                                                ca                          a
 • Linux 2.0+ com LinuxThreads 0.7.1+ ou glibc 2.0.7+. Veja Se¸˜o 2.6.2 [Linux],
                                                                        ca
   P´gina 137.
     a
 • Mac OS X Server. Veja Se¸˜o 2.6.5 [Mac OS X], P´gina 152.
                               ca                     a
 • NetBSD 1.3/1.4 Intel e NetBSD 1.3 Alpha (Necessita GNU make). Veja Se¸˜o 2.6.4.2
                                                                               ca
   [NetBSD], P´gina 150.
                a
 • Novell NetWare 6.0. Veja Se¸˜o 2.6.8 [Novell NetWare], P´gina 164.
                                 ca                          a
 • OpenBSD > 2.5 com threads nativas. OpenBSD < 2.5 com o pacote inclu´ MIT-     ido
   pthreads . Veja Se¸˜o 2.6.4.3 [OpenBSD], P´gina 151.
                      ca                       a
 • OS/2 Warp 3, FixPack 29 e OS/2 Warp 4, FixPack 4. Veja Se¸˜o 2.6.7 [OS/2],
                                                                         ca
   P´gina 164.
     a
 • SGI Irix 6.x com threads nativas. Veja Se¸˜o 2.6.6.8 [SGI-Irix], P´gina 160.
                                            ca                        a
 • Solaris 2.5 e superior com threads nativas nas plataformas SPARC e x86. Veja
   Se¸˜o 2.6.3 [Solaris], P´gina 145.
      ca                   a
 • SunOS 4.x com o pacote inclu´ MIT-pthreads. Veja Se¸˜o 2.6.3 [Solaris], P´gina 145.
                                  ido                      ca                   a
 • Tru64 Unix
 • Windows 9x, Me, NT, 2000 e XP. Veja Se¸˜o 2.6.1 [Windows], P´gina 133.
                                            ca                       a
Perceba que nem todas as plataformas s˜o apropriadas para executar o MySQL. Os seguintes
                                         a
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
     entretanto, se a biblioteca thread ´ inst´vel no c´digo que ´ usado pelo MySQL, mesmo
                                        e     a          o       e
     se todo o resto for perfeito, o MySQL ir´ ser t˜o est´vel quanto a biblioteca thread.
                                                a       a   a
  • 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
     pthread_mutex_lock() requisitar a CPU muito rapidamente, isto ir´ afetar o MySQL
                                                                            a
     tremendamente. Se esse detalhe n˜o estiver sendo cuidado, adicionar CPUs extras
                                           a
     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-
     tadas na hora da compila¸˜o. N´s tamb´m podemos fornecer conselhos sobre como
                                 ca     o          e
     configurar seu sistema otimizadamente para o MySQL.
80                                     MySQL Technical Reference for Version 5.0.0-alpha



 • O volume de testes feitos internamente de configura¸˜es similares.
                                                     co
 • O n´mero de usu´rios que tem executado o MySQL com sucesso naquela plataforma em
      u            a
   configura¸˜es similares. Se esse n´mero for alto, as chances de se ter alguma surpresa
            co                      u
   espec´
        ifica da plataforma fica muito menor.
Baseado nos crit´rios acima, as melhores plataformas para a execu¸˜o do MySQL at´ este
                   e                                               ca                e
ponto s˜o o x86 com SuSe Linux 8.2, kernel 2.4 e ReiserFS (ou qualquer distribui¸˜o Linux
        a                                                                       ca
similar) e Sparc com Solaris (2.7-9). FreeBSD vem em terceiro, mas realmente temos
esperan¸as que ele ir´ se unir ao clube dos tops uma vez que a biblioteca thread est´
        c               a                                                                a
melhorando. N´s tamb´m acreditamos que em certo ponto iremos estar aptos para incluir
                 o        e
todas as outras plataformas em que o MySQL compila e executa, mas n˜o t˜o bem e com
                                                                        a a
o mesmo n´  ivel de estabilidade e performance, na categoria superior. Isto necessitar´ de
                                                                                       a
algum esfor¸o da nossa parte em coopera¸˜o com os desenvolvedores dos componentes do
             c                            ca
Sistema Operacional/Biblioteca que o MySQL depende. Se vocˆ tiver interesse em melhorar
                                                              e
algum de nossos componentes, est´ em uma posi¸˜o para influenciar seu desenvolvimento,
                                   a             ca
e precisa de instru¸˜es mais detalhadas sobre o que o MySQL necessita para uma melhor
                     co
execu¸˜o, envie um e-mail para lista de email “insternals” do MySQL. Veja Se¸˜o 1.7.1.1
      ca                                                                       ca
[Mailing-list], P´gina 33.
                 a
Por favor, perceba que a compara¸˜o acima n˜o ´ para dizer que um SO ´ melhor ou pior
                                  ca           a e                         e
que o outro em geral. N´s estamos falando sobre a escolha de um SO para um prop´sito
                         o                                                             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.
E em alguns casos, a raz˜o de um SO ser melhor que o outro pode ser simplesmente
                           a
porque colocamos mais esfor¸o nos testes e otimiza¸˜o para aquela plataforma em particular.
                             c                    ca
Estamos apenas colocando nossas observa¸˜es para ajud´-lo na decis˜o de qual plataforma
                                          co             a            a
usar o MySQL na sua configura¸˜o.ca

2.2.4 Qual vers˜o do MySQL deve ser usada
               a

A primeira decis˜o a ser feita ´ se vocˆ deve usar a ultima vers˜o de desenvolvimento ou a
                a              e       e             ´          a
ultima vers˜o est´vel:
´          a     a
 • Normalmente, se vocˆ estiver usando o MySQL pela primeira vez ou tentando port´-
                        e                                                          a
   lo para algum sistema em que n˜o exista distribui¸˜o bin´ria, recomendamos o uso
                                     a                ca    a
   da vers˜o est´vel (atualmente Vers˜o 5.0.0-alpha). Repare que todos os lan¸amentos
          a     a                      a                                     c
   do MySQL s˜o conferidos com os testes comparativos de performance e um conjunto
                a
   extenso de testes antes de cada lan¸amento.
                                       c
 • Sen˜o, caso vocˆ esteja trabalhando com um antigo sistema e quiser atualiz´-lo, mas n˜o
       a           e                                                         a          a
   que correr o risco com uma atualiza¸˜o sem corre¸˜es, vocˆ deve faze-lo do mesmo ramo
                                      ca           co       e
   que vocˆ est´ usando (onde aenas o ultimo n´mero da vers˜o ´ mais novo que o seu).
           e    a                       ´       u              a e
   N´s temos tentado corrigir somente erros fatais e torn´-los menores, com altera¸˜es
     o                                                     a                          co
   relativamente seguras para aquela vers˜o.
                                          a
A segunda decis˜o a ser feita ´ se vocˆ deseja usar uma distribui¸˜o fonte ou bin´ria. Na
                a             e        e                         ca              a
maioria dos casos provavelmente vocˆ dever´ usar a distribui¸˜o bin´ria, se alguma existir
                                     e      a               ca      a
para sua plataforma, ser´ normalmente muito mais f´cil para instalar do que a distribui¸˜o
                        a                           a                                  ca
em c´digo fonte.
    o
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                    81



Nos seguites casos vocˆ provavelmente ser´ mais bem servido com uma instala¸˜o baseada
                          e                a                                    ca
em c´digo fonte:
    o
 • Se vocˆ desejar instalar o MySQL em algum lugar expec´
             e                                                     ifico. (O padr˜o das dis-
                                                                                 a
    tribui¸˜es bin´rias ´ estar“pronto para rodar” em qualquer lugar, mas talvez vocˆ
           co         a     e                                                              e
    deseje ainda mais flexibilidade).
 • Para estar apto e satisfazer diferentes requisi¸˜es dos usu´rios, estaremos fornecendo
                                                   co            a
    duas vers˜es bin´rias diferentes; Uma compilada com os manipuladores de tabelas n˜o
                o       a                                                                a
    transacionais (um bin´rio r´pido e pequeno) e um configurado com as mais importantes
                              a  a
    op¸˜es extendidas como tabelas transacionais. Ambas vers˜es s˜o compiladas da mesma
       co                                                       o a
    distribui¸˜o fonte. Todos clientes MySQL nativos pode conectar com ambas vers˜es do
               ca                                                                      o
    MySQL.
    A distribui¸˜o bin´ria extendida ´ marcada com o sufixo -max e ´ configurada com as
                  ca      a            e                                 e
    mesmas op¸˜es de mysqld-max. Veja Se¸˜o 4.8.5 [mysqld-max], P´gina 344.
                  co                          ca                          a
    Se vocˆ deseja usar o RPM MySQL-Max, primeiramente vocˆ deve instalar o RPM MySQL-
            e                                                  e
    server padr˜o.  a
            e                                                               ˜
 • Se vocˆ deseja configurar mysqld com alguns recursos extras que NAO est˜o nas dis-
                                                                                 a
    tribui¸˜es bin´rias. Segue abaixo a lista das op¸˜es extras mais comuns que vocˆ pode
           co        a                              co                                 e
    querer usar:
      • --with-innodb
      • --with-berkeley-db (padr˜o para o MySQL 4.0 e seguintes)
                                      a
      • --with-raid (n˜o disponivel
                             a       ´ para todas as plataformas)
      • --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
    Se vocˆ precisar de um servidor MySQL mais r´pido vocˆ pode querer recompil´-lo com
            e                                      a         e                       a
    suporte para somente o conjunto de caracteres que vocˆ precisa, usar um compilador
                                                             e
    melhor (como pgcc) ou usar op¸˜es de compiladores para usar otimiza¸˜es para seu
                                      co                                      co
    processador.
 • Se vocˆ encontrar um erro e relat´-lo para o time de desenvolvimento do MySQL vocˆ
            e                          a                                                   e
    provavelmente receber´ um patch que ser´ necess´rio aplic´-lo para a distribui¸˜o fonte
                               a               a      a         a                   ca
    para ter o bug corrigido.
 • Se vocˆ deseja ler (e/ou modificar) o c´digo C e C++ que ´ o MySQL, vocˆ pode obter
            e                               o                   e              e
    uma distribui¸˜o fonte. O c´digo fonte ´ sempre o manual final. Distribui¸˜es fontes
                     ca            o          e                                   co
    tamb´m contem mais testes e exemplos que as distribui¸˜es bin´rias.
          e                                                  co        a
O esquema de nomes do MySQL usa n´meros de vers˜es que consistem de tres n´meros e
                                      u              o                         u
um sufixo. Por exemplo, um nome de lan¸amento como mysql-4.1.0-alpha ´ interpretado
                                        c                                 e
da seguinte maneira:
  • O primeiro n´mero (4) ´ a vers˜o principal e tamb´m descreve o formato dos arquivos.
                u          e       a                 e
    Todas releases da Vers˜o 4 tem o mesmo formato de arquivo.
                          a
  • O segundo n´mero (1) ´ o n´ da distribui¸ao.
                u          e    ivel            c˜
82                                     MySQL Technical Reference for Version 5.0.0-alpha



 • O terceiro n´mero (0 ´ o n´mero da vers˜o do n´ de distribui¸˜o. Este ´ incrementado
               u        e    u            a      ivel          ca         e
   para cada nova distribui¸˜o. Normalmente vocˆ desejar´ a ultima vers˜o para o n´
                            ca                    e       a ´             a          ivel
   de publica¸˜o que tiver escolhido.
              ca
 • O sufixo (alpha) indica o n´ de estabilidade da vers˜o. Os poss´
                               ivel                     a           iveis sufixo s˜o:
                                                                                 a
     − alpha indica que a vers˜o cont´m grandes se¸˜es de novos c´digos que n˜o foram
                              a      e              co             o          a
       100% testados. Bugs conhecidos (normalmente n˜o tem nenhum) devem estar doc-
                                                       a
       umentados na se¸˜o News. Veja Apˆndice C [News], P´gina 948. Existem tamb´m
                      ca                  e                  a                       e
       novos comandos e extens˜es na maioria das publica¸˜es alpha. Desenvolvimento
                                o                           co
       ativo que podem envolver maiores altera¸˜es no c´digo pode ocorrer numa vers˜o
                                               co        o                            a
       alpha, mas tudo ser´ testado antes de fazer a publica¸˜o. N˜o podem existir erros
                          a                                 ca    a
       conhecidos em nenhuma publica¸˜o do MySQL.
                                       ca
     − beta significa que todo o novo c´digo foi testado. N˜o ser˜o adicionados novos
                                       o                    a     a
       recursos que podem causar algum tipo de corrompimento. N˜o deve existir bugs
                                                                    a
       conhecidos. Uma altera¸˜o de vers˜o de alpha para beta ocorre quando n˜o existir
                              ca        a                                    a
       nenhum relato de erro fatal com uma vers˜o alpha por pelo menos um mˆs e n˜o
                                                a                             e     a
       planejarmos adicionar nenhum recurso que pode deixar algum antigo comando
       menos confi´vel.
                  a
     − gamma ´ o beta que j´ tem sido usado a algum tempo e parece funcionar bem.
              e            a
       Apenas pequenas corre¸˜es s˜o adicionadas. Isto ´ o que muitas empresas chamam
                            co a                       e
       de release.
     − Se n˜o existir um sufixo, significa que esta vers˜o j´ est´ sendo executada h´
            a                                            a a       a                     a
       algum tempo em diferentes locais sem relatos de erros al´m dos espec´
                                                                   e             ificos de
       certas plataformas. Somente corre¸˜es de erros cr´
                                        co              iticos s˜o adicionados ao release.
                                                                a
       Isto ´ o que chamamos de uma distribui¸˜o est´vel.
            e                                 ca      a

No processo de desenvolvimento do MySQL, v´rias vers˜es coexistem e est˜o em um est´gio
                                               a        o                  a            a
diferente. Naturalmente, corre¸˜es de erros relevantes de uma s´rie anterior s˜o propagados.
                              co                               e              a
 • Para a antiga s´rie 3.23 est´vel/de produ¸˜o, novas vers˜es s´ s˜o liberadas para erros
                  e            a            ca             o    o a
   cr´
     iticos.
 • A s´rie atual (4.0) ´ de qualidade est´vel/produ¸˜o. Nenhum novo recurso que possa
      e                e                 a          ca
   influenciar a estabilidade do c´digo ´ adicionado.
                                 o     e
 • No ramo alpha 4.1 principal, novos recursos s˜o adicionados. Fontes e bin´rios est˜o
                                                 a                          a        a
   dispon´
         iveis para uso e teste em sistemas de desenvolvimento.
 • O ramo de desenvolvimento 5.0 s´ est´ dispon´ para a ´rvore do BitKeeper.
                                     o   a        ivel      a

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

Um pacote de testes interna
          Faz parte de um sistema de produ¸˜o para um cliente. Ela tem diversas tabelas
                                          ca
          com centenas de megabytes de dados.
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                    83



O pacote de comparativos da MySQL
                             e                          ´
           Este executa uma s´rie de consultas comuns. E tamb´m um teste para ver se
                                                               e
           o ultimo conjunto de otimiza¸˜es fez o c´digo mais r´pido. Veja Se¸˜o 5.1.4
             ´                         co          o           a             ca
           [MySQL Benchmarks], P´gina 422.
                                   a
O teste crash-me
           Este tenta determinar quais recursos o banco de dados suporta e quais s˜o suas
                                                                                  a
           capacidades e limita¸˜es. Veja Se¸˜o 5.1.4 [MySQL Benchmarks], P´gina 422.
                               co           ca                                a
Outro teste ´ que n´s usamos a vers˜o do MySQL mais nova em nosso ambiente de produ¸˜o
            e      o               a                                               ca
interna, em pelo menos uma m´quina. N´s temos mais de 100 gigabytes de dados com que
                               a         o
trabalhar.

2.2.5 Layouts de Instala¸˜o
                        ca

Esta se¸˜o descreve o layout padr˜o dos diret´rios criados pela instal¸˜o das distribui¸˜es
         ca                          a            o                   ca                co
bin´ria e fonte.
    a
Uma distribui¸˜o bin´ria ´ instalada descompactando-a no local de instala¸˜o de sua escolha
                ca      a e                                              ca
(tipicamente ‘/usr/local/mysql’) e cria os seguintes diret´rios nesses locais:
                                                           o
Diret´rio
       o           Conte´do do diret´rio
                         u            o
‘bin’              Programas clientes e o servidor mysqld
‘data’             Arquivos Log, bancos de dados
‘docs’             Documenta¸˜o, Log de altera¸˜es
                               ca                co
‘include’          Arquivos de cabe¸alho (headers)
                                    c
‘lib’              Bibliotecas
‘scripts’          mysql_install_db
‘share/mysql’ Arquivos de mensagem de erro
‘sql-bench’        Benchmarks - testes comparativos
Uma distribui¸˜o baseada em c´digo fonte ´ instalada depois de vocˆ configur´-la e compil´-
                ca                o           e                    e         a             a
la. Por padr˜o, a instala¸˜o copia os arquivos em ‘/usr/local’, nos seguintes subdiret´rios:
              a            ca                                                         o
Diret´rio
       o           Conte´do do diret´rio
                         u            o
‘bin’              Programas clientes e scripts
‘include/mysql’ rquivos de cabe¸alho (headers)
                   A                c
‘info’             Documenta¸˜o no formato Info
                               ca
‘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
Dentro de um diret´rio de instala¸˜o, o layout de uma instala¸˜o baseada em fontes difer-
                      o             ca                        ca
encia de uma instala¸˜o bin´ria nas seguintes formas:
                        ca     a
  • The mysqld server is installed in the ‘libexec’ directory rather than in the ‘bin’
      directory.
  • The data directory is ‘var’ rather than ‘data’.
  • mysql_install_db is installed in the ‘/usr/local/bin’ directory rather than in
      ‘/usr/local/mysql/scripts’.
84                                     MySQL Technical Reference for Version 5.0.0-alpha



 • The header file and library directories are ‘include/mysql’ and ‘lib/mysql’ rather
   than ‘include’ and ‘lib’.
You can create your own binary installation from a compiled source distribution by executing
the script ‘scripts/make_binary_distribution’.

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

O MySQL est´ evoluindo muito rapidamente na MySQL AB e n´s queremos compartilhar
              a                                               o
isto com outros usu´rios MySQL. Sempre que temos alguns recursos uteis que outros acham
                   a                                             ´
necess´io, tentamos fazer um release.
       a
Tamb´m tentamos ajudar usu´rios que solicitam recursos que s˜o de f´cil implementa¸˜o.
     e                        a                              a      a             ca
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
N˜o existe uma real necessidade para baixar uma nova release. A se¸˜o News ir´ dizer se a
 a                                                                ca         a
nova vers˜o tem alguma coisa que vocˆ precisa. Veja Apˆndice C [News], P´gina 948.
         a                            e                e                 a
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
   tiver um maior n´mero de novos recursos ou menor incompatibilidade com vers˜es
                       u                                                              o
   antigas, o segundo n´mero na vers˜o ´ incrementado. Quando o formato de arquivo
                           u          a e
   altera, o primeiro n´mero ´ aumentado.
                         u   e
 • Vers˜es est´veis testadas aparecem na m´dia de uma a duas vezes por ano, mas se
        o       a                            e
   pequenos bugs s˜o encontrados, uma vers˜o ser´ lan¸ada apenas com as corre¸˜es dos
                    a                       a     a     c                         co
   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
   leases mais importantes. Outras pessoas podem fazer distribui¸˜es bin´rias para outros
                                                                  co     a
   sistemas mas provavelmente com menos frequencia.
 • N´s normalmente disponibilizamos os patches logo que localizamos e corrigimos
     o
   pequenos bugs. Eles normalmente s˜o imediatamente disponibilizados em nosso
                                          a
   reposit´rio publico do BitKeeper. Eles ser˜o inclu´
           o                                 a        idos na pr´xima distribui¸˜o.
                                                                o              ca
                  a   ´
 • Para bugs n˜o criticos, mas irritantes, disponibilizamos patches se eles s˜o enviados
                                                                              a
   para n´s. De qualquer forma, iremos combinar v´rios deles em um patch maior.
          o                                         a
 • Se existitr, por algum motivo, um bug fatal numa vers˜o criaremos uma nova release
                                                            a
                     ´         ´
   o mais cedo possivel. Gostariamos que outras empresas fizessem isto tamb´m. e
A vers˜o est´vel atual ´ a 3.23; n´s j´ mudamos o desenvolvimento em atividade para a
        a    a         e          o a
vers˜o 4.0. Bugs contiuar˜o a ser corrigidos na vers˜o est´vel. N˜o acreditamos em um
     a                    a                          a    a      a
congelamento completo, pois isto abandona a corre¸˜es de bugs e coisas que “devem ser
                                                   co
feitas.” “Alguma coisa congelada” significa que talvez possamos adicionar pequenas coisas
que “com certeza n˜o afetar´ nada que j´ esteja funcionando.”
                   a        a           a
O MySQL usa um esquema de nomes um pouco diferente da maioria dos outros produtos.
Em geral ´ relativamente seguro utilizar qualquer vers˜o que tenha sido lan¸ado a algumas
          e                                           a                    c
semanas e que n˜o tenham sido sustitu´ por uma nova vers˜o. Veja Se¸˜o 2.2.4 [Qual
                 a                      ida                    a           ca
vers˜o], P´gina 80.
    a     a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                      85


2.2.7 Filosofia das Distribui¸˜es - Nenhum Bug Conhecidos nas
                            co
      Distribui¸oes
               c˜

Colocamos muito tempo e esfor¸o em tornar nossas distribui¸˜es livres de erros. Pelo nosso
                             c                            co
conhecimento, n˜o liberamos uma unica vers˜o do MySSQL com qualquer erro conhecido
               a                 ´        a
’fatal’.
Um erro fatal ´ algo que faz o MySQL falhar com o uso normal, traz respostas erradas para
              e
consultas normais ou tem um problema de seguran¸a.
                                                 c
N´s temos documentados todos os problemas conhecidos, bugs e assuntos que s˜o depen-
  o                                                                             a
dentes das decis˜es de projeto. Veja Se¸˜o 1.8.6 [Bugs], P´gina 53.
                o                      ca                 a
Nosso objeto ´ corrigir tudo que ´ poss´
              e                    e      ivel, mas sem correr o risco de tornarmos uma
vers˜o menos est´vel. Em certos casos, isto significa que podemos corrigir um problema
    a             a
na(s) vers˜o(˜es) de desenvolvimento, mas n˜o o corrigirmos na vers˜o est´vel (produ¸˜o).
          a o                                a                      a    a          ca
Naturalmente, documentamos tais problemas para que o usu´rios esteja ciente.
                                                             a
Aqui est´ um descri¸˜o de como nosso processo de contru¸˜o funciona:
        a          ca                                  ca
 • Monitoramos erros de nossa lista de suporte ao cliente, a lista de email externa do
   MySQL e o banco de dados de bugs em http://bugs.mysql.com/.
 • Todos os erros relatados em vers˜es usadas s˜o inseridos nio banco de dados de bugs.
                                       o         a
 • Quando corrigimos um erro, sempre tentamos fazer um caso de teste para ele e inclu´    i-lo
   em nosso sistema de teste para assegurar que o erro nunca retornar´. (Cerca de 90%
                                                                            a
   de todos os erros corrigidos tˆm um caso de teste.)
                                  e
 • Tamb´m criamos casos de teste para todos os novos recursos adicionados ao MySQL.
          e
 • Antes de come¸armos a fazer uma nova distribui¸˜o do MySQL, asseguramos que todos
                  c                                 ca
   os erros repetit´
                   iveis relatados para a vers˜o do MySQL (3.23.x, 4.0.x, etc) est˜o cor-
                                              a                                       a
   rigidos. Se algo for imposs´ de corrigir (devido a alguma decis˜o de projeto interno
                               ivel                                     a
   no MySQL), documentaremos isto no manual. Veja Se¸˜o 1.8.6 [Bugs], P´gina 53.
                                                            ca                   a
 • N´s fazemos uma constru¸˜o para todas as plataformas para as quais suportamos
     o                         ca
   bin´rios (mais de 15 plataformas) e executamos nosso pacote de teste e benchmarks
       a
   para todas elas.
 • N˜o publicaremos um bin´rio para uma plataforma na qual os testes do pacote de
     a                         a
   benchmarks falharam. Se for um erro geral na fonte, o corrigimos e fazemos as con-
   tru¸˜es mais os teste em todos os sistemas novamente.
       co
 • Se n´s, durante a o porcesso de constru¸˜o e teste (que leva de 2 a 3 dias) recebermos um
        o                                  ca
   relat´rio sobre um erro fatal (por exemplo, um que cause um core dump), o corrigiremos
         o
   e reiniciaremos o processo de constru¸˜o).
                                          ca
 • Depois de publicarmos os bin´rios em http://www.mysql.com/, enviamos um email
                                    a
   de an´ncio nas listas de email mysql e announce. Veja Se¸˜o 1.7.1.1 [Mailing-list],
          u                                                        ca
   P´gina 33. A mensagem de an´ncio cont´m uma lista de todas as altera¸˜es da dis-
     a                                u       e                                   co
   tribui¸˜o e qualquer problema conhecido com ela. (A se¸˜o ’problemas conhecidos’ na
          ca                                                  ca
   notas das distribui¸˜es s´ tem sido necess´ria em algumas da distribui¸˜es.)
                       co    o                a                               co
 • Para darmos acesso rapidamente aos nossos usu´rios dos ultimos recursos do MySQL,
                                                     a          ´
   fazemos uma nova distribui¸˜o do MySQL a cada 4-5 semanas.
                                ca
 • Se, depois da distribui¸˜o estar pronta, recebermos qualquer relat´rio que houve (de-
                           ca                                             o
   pois de tudo) qualquer coisa criticamente errada com a constru¸˜o em uma plataforma
                                                                     ca
86                                     MySQL Technical Reference for Version 5.0.0-alpha



     espec´
          ifica, corrigiremo-na imediatamente e liberaremos um nova distribui¸˜o ’a’ para
                                                                            ca
     aquela plataforma. Gra¸as aos nosso grande base de usu´rios, problemas s˜o encontra-
                            c                              a                 a
     dos rapidamente.
 • Nosso registro para boas distribui¸˜es feitas ´ muito boa. Nas ultimas 150 distribui¸˜es,
                                     co          e                ´                    co
   tivemos que fazer uma nova contru¸˜o para menos de 10 distribui¸˜es (em 3 destes
                                        ca                               co
   casos, o erro era uma biblioteca glibc com problema em uma de nossas m´quinas que
                                                                               a
   levamos um longo tempo para encontrar.

2.2.8 Bin´rios MySQL compilados pela MySQL AB
         a

Como um servi¸o, n´s na MySQL AB fornecemos um conjunto de distribui¸˜es bin´rias do
                c     o                                                    co      a
MySQL que s˜o compiladas no nosso site ou em sites onde os clientes cordialmente nos d˜o
              a                                                                          a
acesso as suas m´quinas.
                  a
Em adi¸˜o aos bin´rios forncedios em formatos de pacotes espec´
       ca           a                                            ificos da plataforma (veja
Se¸˜o 2.1 [Quick Standard Installation], P´gina 60), oferecemos distribui¸˜es bin´rios para
  ca                                      a                              co      a
outras plataformas atrav´s de arquivos tar compactados (.tar.gz).
                        e
Estas distribui¸˜es s˜o geradas usando o script Build-tools/Do-compile que compila
               co    a
o c´digo fonte e cria o arquivo bin´rio em tar.gz usando scripts/make_binary_
    o                                  a
distribution. Estes bin´rios s˜o configurados e constru´
                         a     a                      idos com os seguintes compiladores
e op¸˜es.
    co
Bin´rios constru´
   a            idos no sistema de desenvolvimento da MySQL AB:
Linux 2.4.xx x86 com gcc 2.95.3
            CFLAGS="-O2 -mcpu=pentiumpro" CXX=gcc CXXFLAGS="-O2 -
            mcpu=pentiumpro -felide-constructors" ./configure --prefix=/usr/local/mysql
            --with-extra-charsets=complex --enable-thread-safe-client
            --enable-local-infile --enable-assembler --disable-shared --with-
            client-ldflags=-all-static --with-mysqld-ldflags=-all-static
Linux 2.4.xx Intel Itanium 2 com ecc (Intel C++ Itanium Compiler 7.0)
            CC=ecc CFLAGS="-O2 -tpp2 -ip -nolib_inline" CXX=ecc CXXFLAGS="-O2
            -tpp2 -ip -nolib_inline" ./configure --prefix=/usr/local/mysql
            --with-extra-charsets=complex --enable-thread-safe-client
            --enable-local-infile
Linux 2.4.xx Intel Itanium com ecc (Intel C++ Itanium Compiler 7.0)
            CC=ecc CFLAGS=-tpp1 CXX=ecc CXXFLAGS=-tpp1 ./configure --
            prefix=/usr/local/mysql --with-extra-charsets=complex --enable-
            thread-safe-client --enable-local-infile
Linux 2.4.xx alpha com ccc (Compaq C V6.2-505 / Compaq C++ V6.3-006)
            CC=ccc CFLAGS="-fast -arch generic" CXX=cxx CXXFLAGS="-
            fast -arch generic -noexceptions -nortti" ./configure -
            -prefix=/usr/local/mysql --with-extra-charsets=complex
            --enable-thread-safe-client --enable-local-infile --with-
            mysqld-ldflags=-non_shared --with-client-ldflags=-non_shared
            --disable-shared
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                          87



Linux 2.4.xx s390 com gcc 2.95.3
            CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors"
            ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
            --enable-thread-safe-client --enable-local-infile --disable-shared
            --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-
            static
Linux 2.4.xx x86 64 (AMD64) com gcc 3.2.1
            CXX=gcc ./configure --prefix=/usr/local/mysql --with-extra-
            charsets=complex --enable-thread-safe-client --enable-local-infile
            --disable-shared
Sun Solaris 8 x86 com gcc 3.2.3
            CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-
            O3 -fno-omit-frame-pointer -felide-constructors -fno-
            exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --
            localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin
            --with-extra-charsets=complex --enable-thread-safe-client
            --enable-local-infile --disable-shared --with-innodb
Sun Solaris 8 sparc com gcc 3.2
            CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3
            -fno-omit-frame-pointer -felide-constructors -fno-exceptions
            -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-
            charsets=complex --enable-thread-safe-client --enable-local-infile
            --enable-assembler --with-named-z-libs=no --with-named-curses-
            libs=-lcurses --disable-shared
Sun Solaris 8 sparc 64bit com gcc 3.2
            CC=gcc CFLAGS="-O3 -m64 -fno-omit-frame-pointer" CXX=gcc
            CXXFLAGS="-O3 -m64 -fno-omit-frame-pointer -felide-constructors
            -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql
            --with-extra-charsets=complex --enable-thread-safe-client
            --enable-local-infile --enable-assembler --with-named-z-libs=no
            --with-named-curses-libs=-lcurses --disable-shared
Sun Solaris 9 sparc com gcc 2.95.3
            CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3
            -fno-omit-frame-pointer -felide-constructors -fno-exceptions
            -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-
            charsets=complex --enable-thread-safe-client --enable-local-infile
            --enable-assembler --with-named-curses-libs=-lcurses --disable-
            shared
Sun Solaris 9 sparc com cc-5.0 (Sun Forte 5.0)
            CC=cc-5.0 CXX=CC ASFLAGS="-xarch=v9" CFLAGS="-Xa -xstrconst
            -mt -D_FORTEC_ -xarch=v9" CXXFLAGS="-noex -mt -D_FORTEC_
            -xarch=v9" ./configure --prefix=/usr/local/mysql --with-extra-
            charsets=complex --enable-thread-safe-client --enable-local-infile
            --enable-assembler --with-named-z-libs=no --enable-thread-safe-
            client --disable-shared
88                              MySQL Technical Reference for Version 5.0.0-alpha



IBM AIX 4.3.2 ppc com gcc 3.2.3
          CFLAGS="-O2 -mcpu=powerpc -Wa,-many " CXX=gcc CXXFLAGS="-O2
          -mcpu=powerpc -Wa,-many -felide-constructors -fno-exceptions
          -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-
          charsets=complex --enable-thread-safe-client --enable-local-infile
          --with-named-z-libs=no --disable-shared

IBM AIX 4.3.3 ppc com xlC_r (IBM Visual Age C/C++ 6.0)
          CC=xlc_r CFLAGS="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192"
          CXX=xlC_r CXXFLAGS ="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192"
          ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data
          --libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex
          --enable-thread-safe-client --enable-local-infile --with-named-z-
          libs=no --disable-shared --with-innodb

IBM AIX 5.1.0 ppc com gcc 3.3
          CFLAGS="-O2 -mcpu=powerpc -Wa,-many" CXX=gcc CXXFLAGS="-O2
          -mcpu=powerpc -Wa,-many -felide-constructors -fno-exceptions
          -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-
          charsets=complex --with-server-suffix="-pro" --enable-thread-
          safe-client --enable-local-infile --with-named-z-libs=no
          --disable-shared

HP-UX 10.20 pa-risc1.1 com gcc 3.1
          CFLAGS="-DHPUX -I/opt/dce/include -O3 -fPIC" CXX=gcc CXXFLAGS="-
          DHPUX -I/opt/dce /include -felide-constructors -fno-exceptions
          -fno-rtti -O3 -fPIC" ./configure --prefix=/usr/local/mysql
          --with-extra-charsets=complex --enable-thread-safe-client --
          enable-local-infile --with-pthread --with-named-thread-libs=-ldce
          --with-lib-ccflags=-fPIC --disable-shared

HP-UX 11.11 pa-risc2.0 64 bit com aCC (HP ANSI C++ B3910B A.03.33)
          CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure --
          prefix=/usr/local/mysql --with-extra-charsets=complex --enable-
          thread-safe-client --enable-local-infile --disable-shared

HP-UX 11.11 pa-risc2.0 32bit com aCC (HP ANSI C++ B3910B A.03.33)
          CC=cc CXX=aCC CFLAGS="+DAportable" CXXFLAGS="+DAportable"
          ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data
          --libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex
          --enable-thread-safe-client --enable-local-infile --disable-shared
          --with-innodb

Apple Mac OS X 10.2 powerpc com gcc 3.1
          CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3
          -fno-omit-frame-pointer -felide-constructors -fno-exceptions
          -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-
          charsets=complex --enable-thread-safe-client --enable-local-infile
          --disable-shared
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                89



FreeBSD 4.7 i386 com gcc 2.95.4
           CFLAGS=-DHAVE_BROKEN_REALPATH ./configure --prefix=/usr/local/mysql
           --with-extra-charsets=complex --enable-thread-safe-client
           --enable-local-infile --enable-assembler --with-named-z-libs=not-
           used --disable-shared

QNX Neutrino 6.2.1 i386 with gcc 2.95.3qnx-nto 20010315
         CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3
         -fno-omit-frame-pointer -felide-constructors -fno-exceptions
         -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-
         charsets=complex --enable-thread-safe-client --enable-local-infile
         --disable-shared

Os seguintes bin´rios s˜o contru´
                a      a        idos em sistemas de terceiros gentilmente cedidos para a
MySQL AB pou outros usu´rios. Pou favor, note que eles s´ s˜o fornecidos como cortesia.
                           a                               o a
Uma vez que a MySQL AB n˜o tem total controle sobre estes sistemas, n´s podemos fornecer
                            a                                         o
apenas suporte limitado para os bin´rios constru´
                                   a            idos nestes sistemas.

SCO Unix 3.2v5.0.6 i386 com gcc 2.95.3
          CFLAGS="-O3 -mpentium" LDFLAGS=-static CXX=gcc CXXFLAGS="-O3 -
          mpentium -felide-constructors" ./configure --prefix=/usr/local/mysql
          --with-extra-charsets=complex --enable-thread-safe-client
          --enable-local-infile --with-named-z-libs=no --enable-thread-safe-
          client --disable-shared

SCO OpenUnix 8.0.0 i386 com CC 3.2
         CC=cc CFLAGS="-O" CXX=CC ./configure --prefix=/usr/local/mysql
         --with-extra-charsets=complex --enable-thread-safe-client
         --enable-local-infile --with-named-z-libs=no --enable-thread-safe-
         client --disable-shared

Compaq Tru64 OSF/1 V5.1 732 alpha com cc/cxx (Compaq C V6.3-029i / DIGITAL C++
V6.1-027)
          CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast -
          inline speed -speculate all" CXX="cxx -pthread" CXXFLAGS="-O4
          -ansi_alias -fast -inline speed -speculate all -noexceptions
          -nortti" ./configure --prefix=/usr/local/mysql --with-extra-
          charsets=complex --enable-thread-safe-client --enable-local-infile
          --with-prefix=/usr/local/mysql --with-named-thread-libs="-
          lpthread -lmach -lexc -lc" --disable-shared --with-mysqld-ldflags=-
          all-static

SGI Irix 6.5 IP32 com gcc 3.0.1
            CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXXFLAGS="-O3
            -fno-omit-frame-pointer -felide-constructors -fno-exceptions
            -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-
            charsets=complex --enable-thread-safe-client --enable-local-infile
            --disable-shared
90                                   MySQL Technical Reference for Version 5.0.0-alpha



FreeBSD 5.0 sparc64 com gcc 3.2.1
           CFLAGS=-DHAVE_BROKEN_REALPATH ./configure --prefix=/usr/local/mysql
           --localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin
           --with-extra-charsets=complex --enable-thread-safe-client
           --enable-local-infile --disable-shared --with-innodb
As seguintes op¸˜es de compila¸˜o foram usadas nos pacotes bin´rios que a MySQL AB
               co             ca                                 a
costumava fornecer no passado. Estes bin´rios n˜o s˜o mais atualizados, mas as op¸˜es de
                                        a      a a                               co
compila¸˜o s˜o mantidas aqui com o prop´sito de referˆncia.
       ca a                             o            e
Linux 2.2.xx sparc com egcs 1.1.2
            CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3
            -fno-omit-frame-pointer -felide-constructors -fno-exceptions
            -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-
            charsets=complex --enable-thread-safe-client --enable-local-infile
            --enable-assembler --disable-shared
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-charsets=complex
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 acima) sun4u com egcs 1.0.3a ou 2.90.27 ou gcc 2.95.2 e mais novo
           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
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
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
AIX 2 4 com gcc 2.7.2.2
           CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
           --with-extra-charsets=complex
Qualquer que tenha mais op¸˜es otimizadas para qualquer das configura¸˜es listadas acima
                           co                                       co
pode sempre envi´-los para a lista de email “internals” do MySQL. Veja Se¸˜o 1.7.1.1
                   a                                                         ca
[Mailing-list], P´gina 33.
                 a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                    91



Distribui¸˜es RPM que anteceda o MySQL vers˜o 3.22 s˜o contribui¸˜es dos usu´rios. Os
         co                                    a       a          co           a
RPMs gerados por n´s da MySQL AB s´ come¸aram a ser fornecidos a partir da vers˜o
                     o                   o      c                                    a
3.22 do MySQL.
Se vocˆ deseja compilar uma vers˜o para depura¸˜o do MySQL, vocˆ deve adicionar --with-
      e                         a             ca               e
debug ou --with-debug=full para as linhas de configura¸˜o acima e remover qualquer
                                                         ca
op¸˜o -fomit-frame-pointer.
   ca
Para distribui¸˜es do Windows, por favor, veja Se¸˜o 2.1.1 [Windows installation],
               co                                     ca
P´gina 60.
  a

2.2.9 Instalando uma Distribui¸˜o Bin´ria do MySQL
                              ca     a

Este cap´itulo cobre a instala¸˜o da distribui¸˜o bin´ria do MySQL (.tar.gz Archives) para
                               ca              ca     a
v´rias plataformas (veja MySQL binaries para uma lista detalhada).
 a
Em adi¸˜o a estes pacotes gen´ricos, tamb´m oferecemos bin´rios em formatos de pacote
        ca                        e            e                a
espec´ificos da plataforma para plataformas selecionadas. Veja Se¸˜o 2.1 [Quick Standard
                                                                   ca
Installation], P´gina 60 para mais informa¸˜es sobre como intal´-los.
                a                             co                  a
As distribui¸˜es gen´ricas do MySQL est˜o empacotados com arquivos GNU tar com com-
             co      e                      a
pacta¸˜o gzip (.tar.gz). Vocˆ precisa das seguintes ferramentas para instalar um dis-
      ca                          e
tribui¸˜o bin´ria do MySQL:
      ca      a
  • GNU gunzip para descompactar a distribui¸˜o.    ca
  • Um tar razo´vel para descompactar a distribui¸˜o. Sabemos que o GNU tar funciona.
                  a                                    ca
     Algumas implementa¸˜es tar que vˆm pr´-instaladas como o sistema operacional (ex.
                            co             e      e
     Sun tar) possuem problemas (com nome de arquivos grandes, por exemplo) Neste caso,
     vocˆ deve instalar o GNU tar primeiro.
         e
Se vocˆ tiver problemas, sempre use mysqlbug ao enviar d´vidas para a lista de email do
       e                                                   u
MySQL. Mesmo se o problema n˜o for um bug, mysqlbug colhe informa¸˜es do sistema que
                                  a                                    co
ajudar˜o os outros a solucionar o seu problema. Se n˜o usar mysqlbug, vocˆ ter´ diminu´
       a                                             a                     e   a        ida
a probabilidade de conseguir a solu¸˜o do seu problema. Vocˆ encontrar´ o mysqlbug no
                                    ca                        e           a
diret´rio ‘bin’ depois de descompactar a distribui¸˜o. Veja Se¸˜o 1.7.1.3 [Relato de erros],
     o                                            ca          ca
P´gina 36.
 a
Os comando b´sicos que vocˆ deve executar para instalar e usar uma distribui¸˜o bin´ria
               a              e                                                 ca     a
do MySQL s˜o:a
       shell> groupadd mysql
       shell> useradd -g mysql mysql
       shell> cd /usr/local
       shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf -
       shell> ln -s full-path-to-mysql-VERSION-OS mysql
       shell> cd mysql
       shell> scripts/mysql_install_db
       shell> chown -R root .
       shell> chown -R mysql data
       shell> chgrp -R mysql .
       shell> bin/mysqld_safe --user=mysql &
Se a sua vers˜o do MySQL ´ mais antiga que a 4.0, substitua bin/safe_mysqld por
               a                e
bin/mysqld_safe no comando final.
92                                      MySQL Technical Reference for Version 5.0.0-alpha



Vocˆ pode adicionar novos usu´rios usando o script bin/mysql_setpermission se vocˆ
    e                              a                                                          e
instalar os m´dulos Perl DBI e DBD-mysql.
                o
Uma descri¸˜o mais detalhada ´ apresentada a seguir.
              ca                  e
Para instalar uma distribui¸˜o bin´ria, siga estes passos, ent˜o proceda com a Se¸˜o 2.4
                              ca      a                         a                        ca
[P´s Instala¸˜o], P´gina 111, para a configura¸˜o da p´s istala¸˜o e testes:
  o            ca    a                          ca      o       ca
 1. Escolha o diret´rio sob o qual vocˆ deseja descompactar a distribui¸˜o e a mova para
                      o                   e                                 ca
     dentro dele. No exemplo a seguir, descompactamos a distribui¸˜o sob ‘/usr/local’ e
                                                                      ca
     criamos um diret´rio ‘/usr/local/mysql’ dentro do qual o MySQL ´ instalado. (As
                         o                                                    e
     seguintes instru¸˜es, consequentemente, assumem que vocˆ tem permiss˜o para criar
                       co                                         e               a
     arquivos em ‘/usr/local’. Se este diret´rio ´ protegido, vocˆ precisar´ realizar a
                                                 o   e                  e           a
     instala¸˜o como root.)
             ca
 2. Obtenha um arquivo de distribui¸˜o de um dos sites listados em Se¸˜o 2.2.1 [Getting
                                         ca                                 ca
     MySQL], P´gina 75.
                  a
     As distribui¸˜es bin´rias do MySQL s˜o fornecidas como arquivos tar compactados e
                  co        a                 a
     tem nomes como ‘mysql-VERS~O-SO.tar.gz’, onde VERS~O ´ um n´mero (por exem-
                                      A                        A e          u
     plo, 3.21.15) e SO indica o tipo de sistema operacional para o qual a distribui¸˜o ´  ca e
     pretendida (por exemplo, pc-linux-gnu-i586).
 3. Se vocˆ ver uma distribui¸˜o bin´ria marcada com o sufixo -max, significa que o
              e                    ca      a
     bin´rio tem suporte para tabelas transacionais e outros recursos. Veja Se¸˜o 4.8.5
         a                                                                             ca
     [mysqld-max], P´gina 344. Note que todos os bin´rios s˜o contru´
                        a                                  a       a          idos a partir da
     mesma distribui¸˜o fonte do MySQL.
                       ca
 4. Adicione um usu´rio e grupo para o mysqld ser executado:
                         a
             shell> groupadd mysql
             shell> useradd -g mysql mysql
     Estes comandos adicionam o grupo mysql e o usu´rio mysql. A sintaxe para useradd
                                                        a
     e groupadd podem diferir um pouco nas diversas vers˜es de Unix. Eles tamb´mpodem
                                                           o                          e
     ser chamado adduser e addgroup. Vocˆ pode desejar criar o grupo e usu´rio com outro
                                              e                                 a
     nome, diferente de mysql.
 5. Chame o diret´rio no qual se pretende fazer a instala¸˜o:
                     o                                     ca
             shell> cd /usr/local
 6. Descompacte a distribui¸˜o, que criar´ o diret´rio de instala¸˜o. Ent˜o crie um link
                               ca             a      o               ca        a
     simb´lico para aquele diret´rio:
           o                      o
             shell> gunzip < /path/to/mysql-VERS~O-SO.tar.gz | tar xvf -
                                                      A
             shell> ln -s full-path-to-mysql-VERS~O-SO mysql
                                                       A
     O primeiro comando cria um diret´rio chamado ‘mysql-VERS~O-SO’. O segundo co-
                                            o                         A
     mando cria um link simb´lico para o diret´rio. Isto torna a referˆncia ao diret´rio de
                                o                o                        e              o
     instala¸˜o mais f´cil, chamado como ‘/usr/local/mysql’.
             ca         a
 7. Altere para p diret´rio de instala¸˜o:
                           o             ca
             shell> cd mysql
     Vocˆ encontrar´ diversos arquivos e subdiret´rios no diret´rio mysql. O mais impor-
          e           a                            o              o
     tante para prop´sitos de instala¸˜o s˜o os subdiret´rios ‘bin’ e ‘scripts’.
                       o                ca a             o
     ‘bin’       Este diret´rio cont´m o programa cliente e o servidor. Vocˆ deve adicionar
                           o        e                                      e
                 o caminho completo deste diret´rio a sua vari´vel de ambiente PATH e
                                                 o                a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                   93



                assim a sua shell encontrar´ o programa MySQL de forma apropriada.
                                           a
                Veja Apˆndice E [Vari´veis de ambiente], P´gina 1083.
                       e             a                    a

    ‘scripts’   Este diret´rio cont´m o script mysql_install_db usado para inicializar o
                          o        e
                banco de dados mysql contendo a tabela de permiss˜es que armazenam o
                                                                  o
                servidor de permiss˜es de acesso.
                                    o
 8. Caso vocˆ desejasse usar o mysqlaccess e a distribui¸˜o do MySQL est´ em um local
             e                                            ca              a
    diferente do padr˜o, vocˆ deve alterar a localiza¸˜o para onde o mysqlaccess espera
                      a      e                        ca
    encontrar o cliente mysql. Edite o script ‘bin/mysqlaccess’ aproximadamente na linha
    18. Procure pela linha que se parece com a apresentada abaixo:
          $MYSQL       = ’/usr/local/bin/mysql’;          # path to mysql executable
    Altere o caminho para o local onde o mysql atualmente est´ armazaenado em seu
                                                              a
    sistema. Se vocˆ n˜o fizer isto receber´ uma mensagem de erro Broken pipe quando
                   e a                    a
    executar o mysqlaccess.
 9. Crie as tabelas de permiss˜o do MySQL (necess´rio apenas se vocˆ n˜o tiver instalado
                              a                  a                 e a
    o MySQL anteriormente):
          shell> scripts/mysql_install_db
    Note que as vers˜es mais antigas que a 3.22.10 iniciam o servidor MySQL quando vocˆ
                    o                                                                 e
    executa o mysql_install_db. Isto n˜o ocorre mais.
                                        a
10. Altere o propriet´rio dos bin´rios para o root e o propriet´rio do diret´rio de dados
                     a           a                             a            o
    para o usu´rio com o quel vocˆ executar´ o mysqld:
              a                   e         a
          shell> chown -R root /usr/local/mysql/.
          shell> chown -R mysql /usr/local/mysql/data
          shell> chgrp -R mysql /usr/local/mysql/.
    O primeiro comando altera o atributo owner dos arquivos para o usu´rio root, o
                                                                             a
    segundo altera o atributo owner do diret´rio de dados para o usu´rio mysql e o terceiro
                                            o                       a
    altera o atributo group para o grupo mysql.
11. Se vocˆ quiser instalar o suporte para a interface Perl DBI/DBD, veja Se¸˜o 2.7 [Perl
          e                                                                 ca
    support], P´gina 165.
               a
12. Se vocˆ desejasse que o MySQL seja iniciado automaticamente quando vocˆ iniciar a
           e                                                                 e
    sua m´quina, vocˆ pode copiar support-files/mysql.server para o local onde o seu
          a          e
    sistema tem os arquivos de inicializa¸˜o. Mais informa¸˜es podem ser encontradas no
                                         ca               co
    script support-files/mysql.server e em Se¸˜o 2.4.3 [Automatic start], P´gina 118.
                                                  ca                         a

Depois de tudo estar descompactado e instalado, vocˆ deve inicializar e testar a sua dis-
                                                   e
tribui¸˜o.
      ca
Vocˆ pode iniciar o servidor MySQL com o seguinte comando:
   e
      shell> bin/mysqld_safe --user=mysql &
Se a sua vers˜o do MySQl for mais antiga do que a 4.0, substitua bin/safe_mysqld por
             a
bin/mysqld_safe no comando.
Agora prossiga com Se¸˜o 4.8.2 [mysqld_safe], P´gina 332 e Veja Se¸˜o 2.4 [P´s instala¸˜o],
                     ca                        a                  ca        o         ca
P´gina 111.
 a
94                                     MySQL Technical Reference for Version 5.0.0-alpha



2.3 Instalando uma distribui¸˜o com fontes do MySQL
                            ca

Antes de vocˆ continuar com as instala¸˜es dos fontes, confira antes se nosso bin´rio est´
             e                          co                                       a       a
dispon´ para sua plataforma e se ela funcionar´ para vocˆ. N´s colocamos muito esfor¸o
      ivel                                       a         e o                         c
para ter certeza que nossos bin´rios s˜o contru´
                               a      a        idos com as melhores op¸˜es poss´
                                                                      co       iveis.
Vocˆ precisa das seguintes ferramentas para contruir e instalar o MySQL a partir do c´digo
    e                                                                                o
fonte:
 • GNU gunzip para descompactar a distribui¸˜o.
                                           ca
 • Um tar razo´vel para desempacotar a distribui¸˜o. Sabe-se que o GNU tar funciona.
                a                               ca
   Algumas implementa¸˜es tar que vˆm pr´-instaladas como o sistema operacional (ex.
                        co          e     e
   Sun tar) possuem problemas (com nome de arquivos grandes, por exemplo) Neste caso,
   vocˆ deve instalar o GNU tar primeiro.
      e
 • Um compilador ANSI C++ funcional. gcc >= 2.95.2, egcs >= 1.0.2 ou egcs 2.91.66,
   SGI C++, e SunPro C++ s˜o alguns dos compiladores que sabemos que funcionam.
                              a
   A libg++ n˜o ´ necess´ria quando o gcc for usado. gcc 2.7.x tem um bug que
               a e        a
   torna imposs´ ivel compilar alguns arquivos C++ perfeitamente corretos, como o
   ‘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
                                            e      e
   algumas plataformas portanto ele deve ser evitado se existir um novo compilador para
   a plataforma.
     gcc >= 2.95.2 ´ recomendado quando compilar o MySQL Vers˜o 3.23.x.
                   e                                         a
 • Um bom programa make. GNU make ´ sempre recomendado e ´ algumas vezes
                                            e                      e
   necess´rio. Se vocˆ tiver problemas, recomendamos tentar o GNU make 3.75 ou mais
         a           e
   novo.

Se vocˆ estiver usando uma vers˜o recente de gcc, recente o bastante para entender a op¸˜o
       e                       a                                                        ca
-fno-exceptions, ´ MUITO IMPORTANTE que vocˆ a use. De outra forma, vocˆ pode
                    e                                  e                            e
compilar um bin´rio que quebra randomicamente. N´s tamb´m recomendamos que vocˆ use
                 a                                  o       e                         e
-felide-constructors e -fno-rtti juntas com -fno-exception. Se estiver com d´vidas,u
fa¸a o seguinte:
  c


      CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions 
             -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler 
             --with-mysqld-ldflags=-all-static


Na maioria dos sistemas vocˆ ir´ obter um bin´rio r´pido e est´vel com essas op¸˜es.
                           e a               a     a          a                co
Se vocˆ tiver problemas, SEMPRE USE mysqlbug quando postar quest˜es para a lista de
        e                                                               o
email do MySQL Mesmo se o problema n˜o for um bug, mysqlbug recolhe informa¸˜es
                                           a                                           co
do sistema que facilitar´ aos outros resolverem seu problema. Por n˜o suar mysqlbug,
                        a                                               a
vocˆ perde a vantagem de ter seu problema resolvido! Vocˆ ir´ encontrar mysqlbug no
    e                                                        e a
diret´rio ‘scripts’ depois de desempacotar a distribui¸˜o. Veja Se¸˜o 1.7.1.3 [Bug reports],
      o                                               ca          ca
P´gina 36.
 a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                      95



2.3.1 Vis˜o geral da instala¸˜o r´pida
         a                  ca a

Os comandos b´sicos que vocˆ deve executar para instalar o MysQL a partir da distribui¸˜o
                  a            e                                                          ca
fonte s˜o:
       a
       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/mysqld_safe --user=mysql &
Se a sua vers˜o do MySQL ´ mais antiga que a 4.0, substitua bin/safe_mysqld por
                 a               e
bin/mysqld_safe no comando final.
Se vocˆ deseja ter suporte para tabelas InnoDB, vocˆ deve editar o arquivo /etc/my.cnf e
       e                                              e
remover o caractere # antes dos parˆmetros que iniciam com innodb_.... Veja Se¸˜o 4.1.2
                                      a                                             ca
[Option files], P´gina 217. Veja Se¸˜o 7.5.3 [InnoDB start], P´gina 643.
                   a                 ca                         a
Se vocˆ iniciar de um RPM fonte, ent˜o fa¸a o seguinte:
       e                                 a    c
       shell> rpm --rebuild --clean MySQL-VERSION.src.rpm
Isto ir´ criar um RPM bin´rio que vocˆ pode instalar.
       a                    a             e
Vocˆ pode adicionar novos usu´rios utilizando o script bin/mysql_setpermission se vocˆ
    e                            a                                                           e
instalar os m´dulos Perl DBI e DBD-mysql.
               o
Segue uma descri¸˜o mais detalhada.
                     ca
Para instalar uma distribui¸˜o fonte, siga os passos a seguir, ent˜o prossiga para Se¸˜o 2.4
                             ca                                    a                  ca
[Post-installation], P´gina 111, para inicializa¸˜o do p´s-instala¸˜o e testes:
                         a                      ca       o        ca
 1. Escolha o diret´rio sobre o qual vocˆ deseja descompactar a distribui¸˜o e v´ para ele.
                        o                   e                               ca    a
 2. Obtenha um arquivo de distribui¸˜o de algum dos sites listados em Se¸˜o 2.2.1 [Getting
                                        ca                                  ca
     MySQL], P´gina 75.
                   a
 3. Se vocˆ esta interessado em usar tabelas Berkeley DB com MySQL, vocˆ precisar´ obter
            e                                                                e        a
     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. Veja Se¸˜o 7.6 [BDB], P´gina 695.
                                                        ca               a
     Distribui¸˜es fontes do MySQL s˜o fornecidas como arquivos tar compactados e tem
               co                        a
     nomes como ‘mysql-VERSION.tar.gz’, onde VERSION ´ um n´mero como 5.0.0-alpha.
                                                              e      u
 4. Adicione um usu´rio e grupo para o mysql executar assim:
                          a
            shell> groupadd mysql
            shell> useradd -g mysql mysql
     Estes comandos adicionam o grupo mysql e o usu´rio mysql. A sintaxe para useradd e
                                                        a
     groupadd podem mudar um pouco em diferentes vers˜es de Unix. Elas podem tamb´m
                                                            o                             e
96                                       MySQL Technical Reference for Version 5.0.0-alpha



      ser chamadas adduser e addgroup. Vocˆ pode escolher outros nomes para o usu´rio e
                                               e                                         a
      grupo em vez de mysql.
 5.   Descompacte a distribui¸˜o para o diret´rio corrente:
                                ca             o
            shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf -
      Este comando cria um diret´rio com o nome ‘mysql-VERSION’.
                                     o
 6.   Mude para o diret´rio da distribui¸˜o descompactada:
                          o               ca
            shell> cd mysql-VERSION
      Note que agora vocˆ deve configurar e construir o MySQL a partir deste diret´rio raiz
                           e                                                          o
      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
      Quando vocˆ executar configure, vocˆ pode desejar especificar algumas op¸˜es. Exe-
                   e                         e                                     co
      cute ./configure --help para uma lista das op¸˜es. Se¸˜o 2.3.3 [configure options],
                                                       co      ca
      P´gina 97, discute algumas das op¸˜es mais usadas.
        a                                 co
      Se o configure falhar, e vocˆ for enviar uma mensagem para lista de email do MySQL
                                     e
      para pedir ajuda, por favor, inclua qualquer linhas de ‘config.log’ que vocˆ acha e
      que pode ajudar a resolver o problema. Tamb´m inclua as ultimas linhas da sa´
                                                       e            ´                      ida
      de configure se o configure abortar. Envie o relat´rio de erros usando o script
                                                              o
      mysqlbug. Veja Se¸˜o 1.7.1.3 [Bug reports], P´gina 36.
                          ca                         a
      Se a compila¸˜o falhar, veja Se¸˜o 2.3.5 [Compilation problems], P´gina 103, para uma
                    ca                 ca                               a
      ajuda com um varios problemas comuns.
 8.   Instalar tudo:
            shell> make install
      Vocˆ deve executar este comando como root.
          e
 9.   Crie as tabelas de permiss˜es do MySQL (necess´rias s´ se vocˆ n˜o tiver instalado o
                                   o                    a     o       e a
      MySQL anteriormente):
            shell> scripts/mysql_install_db
      Note que as vers˜es do MySQL anteriores ` vers˜o 3.22.10 iniciam o servidor MySQL
                        o                          a    a
      quando vocˆ executa mysql_install_db. Isto n˜o acontece mais!
                  e                                    a
10.   Altere o dono dos bin´rios para root e do diret´rio dados para o usu´rio que ir´
                               a                          o                     a            a
      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
      O primeiro comando altera o atributo de proriedade dos arquivos para o usu´rio root,
                                                                                    a
      o segundo altera o atributo de propriedade do diret´rio de dados para o usu´rio mysql,
                                                          o                       a
      e o terceiro altera o atributo de grupo para o grupo mysql.
11.   Se vocˆ deseja instalar suporte para a interface Perl DBI/DBD, veja Se¸˜o 2.7 [Perl
             e                                                                 ca
      support], P´gina 165.
                  a
12.   Se vocˆ deseja que o MySQL inicie automaticamente quando vocˆ ligar sua m´quina,
             e                                                          e              a
      vocˆ pode copiar support-files/mysql.server para o local onde seu sistema tem seus
          e
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                  97



    arquivos de incializa¸˜o. Mais informa¸˜es podem ser encontradas no pr´prio script
                         ca               co                              o
    support-files/mysql.server e em Se¸˜o 2.4.3 [Automatic start], P´gina 118.
                                          ca                          a
Depois de tudo ter sido instalado, vocˆ deve iniciar e testar sua distribui¸˜o usando este
                                         e                                 ca
comando:
       shell> /usr/local/mysql/bin/mysqld_safe --user=mysql &
Se a sua vers˜o do MySQL for mais antiga do que 4.0, substitua safe_mysqld por mysqld_
              a
safe no comando:
Se o comando falhar imediatamente com mysqld daemon ended ent˜o vocˆ pode achar al-
                                                                   a      e
guma informa¸˜o no arquivo ‘diret´rio-dados-mysql/’nome_maquina’.err’. A raz˜o
                ca                     o                                                a
pode ser que vocˆ j´ possua outro servidor mysqld sendo executado. Veja Se¸˜o 4.2 [Mul-
                   e a                                                        ca
tiple servers], P´gina 220.
                 a
Veja Se¸˜o 2.4 [Post-installation], P´gina 111.
        ca                           a

2.3.2 Aplicando patches

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

2.3.3 Op¸oes t´
        c˜    ipicas do configure

O script configure fornece uma grande gama de controle sobre como vocˆ configura sua
                                                                          e
distribui¸˜o MySQL. Normalmente vocˆ faz isto usando op¸˜es na linha de comando do
         ca                           e                    co
configure. Vocˆ tamb´m pode alterar configure usando algumas vari´veis de ambiente.
               e      e                                                a
Veja Apˆndice E [Environment variables], P´gina 1083. Para uma lista de op¸˜es suportadas
        e                                 a                               co
pelo configure, execute este comando:
98                                 MySQL Technical Reference for Version 5.0.0-alpha



      shell> ./configure --help
Algumas das op¸˜es mais usadas normalmente com o configure est˜o descritas a seguir:
                  co                                                  a
 • Para compilar apenas as bibliotecas clientes do MySQL e programas clientes e n˜o o   a
    servidor, use a op¸˜o --without-server:
                         ca
            shell> ./configure --without-server
    Se vocˆ n˜o possui um compilador C++, mysql n˜o ir´ compilar (ele ´ o programa
             e a                                        a    a                e
    cliente que exige C++). Neste caso, vocˆ pode remover o c´digo no configure que
                                               e                   o
    testa pelo compilador C++ e executar ./configure com a op¸˜o --without-server.
                                                                    ca
    O passo da compia¸˜o continuar´ tentaindo construir mysql, mas vocˆ pode ignorar as
                           ca           a                                  e
    advertˆncias sobre ‘mysql.cc’. (Se o make parar, tente make -k para continuar com o
            e
    resto da compila¸˜o mesmo se erros ocorrerem.)
                        ca
 • Se vocˆ quiser uma biblioteca embutida do MySQL (libmysqld.a) vocˆ deve usar a
            e                                                                  e
    op¸˜o --with-embedded-server.
       ca
 • 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 primeiro comando altera o diret´rio instala¸˜o para que tudo seja instalado sobre
                                          o         ca
    ‘/usr/local/mysql’ em vez do padr˜o ‘/usr/local’. O segundo comando preserva o
                                            a
    diret´rio da instala¸˜o padr˜o, mas altera a localiza¸˜o padr˜o para diret´rios de ban-
          o                ca      a                     ca       a             o
    cos de dados (normalmente ‘/usr/local/var’) e altera para /usr/local/mysql/data.
    Depois de ter compilado o MySQL, vocˆ pode alterar estas op¸˜oes com arquivos de
                                              e                      ca
    op¸˜es. Veja Se¸˜o 4.1.2 [Option files], P´gina 217.
       co              ca                      a
 • Se vocˆ estiver usando Unix e deseja que o arquivo socket do MySQL fique em um
             e
    diret´rio diferente do padr˜o (normalmente no diret´rio ‘/tmp’ ou ‘/var/run’) use o
          o                       a                        o
    comando configure da seguinte forma:
            shell> ./configure --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock
    Perceba que o arquivo fornecido deve ter um caminho absoluto ! Vocˆ tamb´m pode,
                                                                            e      e
    mais tarde, alterar a localiza¸˜o de ‘mysql.sock’ usando os arquivos de op¸˜es do
                                     ca                                              co
    MySQL. Veja Se¸˜o A.4.5 [Problems with mysql.sock], P´gina 925.
                        ca                                    a
 • Se vocˆ deseja compilar programas linkeditados estaticamente (por exemplo, para criar
            e
    uma distribui¸˜o bin´ria, obter mais velocidade, ou evitar problemas com algumas
                     ca       a
    distribui¸˜es Red Hat Linux), execute configure desta forma:
               co
            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
    Quando vocˆ usar como seu compilador C++, ele n˜o tentar´ ligar com o libg++ ou
                   e                                     a         a
    libstdc++. Isto pode ser uma boa id´ia para se fazer se vocˆ tiver as bibliotecas acimas
                                            e                   e
    instaladas, j´ que algumas vers˜es destas bibliotecas tem causado problemas estranhos
                   a                  o
    para usu´rios do MySQL no passado.
               a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                 99



    Segue algumas configura¸˜es de vari´veis de ambiente comuns, dependendo do compi-
                             co       a
    lador que vocˆ estiver usando:
                 e
    Compiler           Recommended options
    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"
    gcc 2.95.2         CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -
                       mpentiumpro  -felide-constructors -fno-exceptions -fno-rtti"
    pgcc 2.90.29 or CFLAGS="-O3 -mpentiumpro -mstack-align-double" CXX=gcc
    newer                    CXXFLAGS="-O3            -mpentiumpro      -mstack-align-double
                       -felide-constructors  -fno-exceptions -fno-rtti"
    Na maioria dos casos vocˆ pode obter um bin´rio MySQL razoavelmente otimizado
                               e                    a
    usando as op¸˜es acima e adicionar as seguintes op¸˜es para a linha de configura¸˜o:
                co                                      co                           ca
          --prefix=/usr/local/mysql --enable-assembler 
          --with-mysqld-ldflags=-all-static
    A linha completa de configura¸˜o dever´ ser, em outras palavras, algo como o seguinte
                                  ca       a
    para todas as vers˜es recentes do gcc:
                      o
          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
    Os bin´rios que fornecemos no site Web MySQL em http://www.mysql.com s˜o to-
            a                                                                    a
    dos compilados com otimiza¸˜o plena e deve ser perfeito para a maioria dos usu´rios.
                                ca                                                a
    Veja Se¸˜o 2.2.8 [Bin´rios do MySQL], P´gina 86. Existem algumas defini¸˜es de
             ca           a                  a                                  co
    configura¸˜o que vocˆ pode alterar para criar um bin´rio ainda mais r´pido, mas
              ca         e                                 a                a
    isto ´ somente para usu´rios avan¸ados. Veja Se¸˜o 5.5.3 [Compile and link options],
         e                  a        c             ca
    P´gina 457.
      a
    Se a constru¸˜o falhar e produzir erros sobre seu compilador ou linkeditor n˜o
                  ca                                                             a
    estarem aptos para criarem a biblioteca compartilhada ‘libmysqlclient.so.r#’
    (‘r#’ ´ um n´mero de vers˜o), vocˆ pode evitar este problema fornecendo a op¸˜o
          e      u            a      e                                          ca
    --disable-share para o configure. Neste caso, configure n˜o construir´ uma
                                                                  a          a
    biblioteca libmysqlclient.so.* compartilhada.
 • Vocˆ pode configurar o MySQL para n˜o usar valores de campos DEFAULT para campos
      e                                 a
   n˜o-NULL (isto ´, campos que n˜o podem ser NULL). Veja Se¸˜o 1.8.5.2 [Restri¸˜es NOT
    a             e              a                          ca                 co
   NULL], P´gina 53.
            a
          shell> CXXFLAGS=-DDONT_USE_DEFAULT_FIELDS ./configure
 • Por padr˜o, o MySQL usa o conjunto de caracteres ISO-8859-1 (Latin1). Para alterar
           a
   o conjunto padr˜o, use a op¸˜o --with-charset:
                  a           ca
          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. Veja Se¸˜o 4.7.1 [Conjunto de car-
                                                           ca
    acteres], P´gina 326.
               a
100                                   MySQL Technical Reference for Version 5.0.0-alpha



   Se vocˆ desja converter os caracteres entre o servidor e o cliente, vocˆ deve dar uma
          e                                                               e
   olhada no comando SET OPTION CHARACTER SET. Veja Se¸˜o 5.5.6 [SET OPTION],
                                                                  ca
   P´gina 461.
     a
   Cuidado: Se vocˆ alterar o conjunto de caracteres depois de ter criado qualquer
                       e
   tabela, vocˆ deve executar myisamchk -r -q --set-character--set=charset em
                e
   cada tabela. Seus ´  indices podem ser ordenados incorretamente. (Isto pode acontecer
   se vocˆ instalar o MySQL, criar algumas tabelas, depois reconfigurar o MySQL para
          e
   usar um conjunto diferente de caracteres e reinstal´-lo).
                                                        a
   Com a op¸˜o --with-extra-charset=LISTA vocˆ pode definir qual conjunto de car-
             ca                                       e
   acteres adicionais deve ser compilado no servidor.
   Aqui LISTA ´ uma lista de conjuntos de caracteres separados por espa¸os, complex
                  e                                                          c
   para incluir todos caracteres que n˜o podem ser carregados dinamicamente ou all
                                         a
   para incluir todos os conjuntos nos bin´rios.
                                            a
 • Para configurar o MySQL com c´digo para depura¸˜o, use a op¸˜o --with-debug:
                                       o                ca          ca
          shell> ./configure --with-debug
   Isto inclui uma aloca¸˜o segura de mem´ria que pode encontrar alguns erros e
                            ca                  o
              ´ sobre o que est´ acontecendo. Veja Se¸˜o D.1 [Depurando o servidor],
   fornecer saida                    a                     ca
   P´gina 1070.
     a
 • Se seus programas clientes usam threads, vocˆ precisar´ tamb´m compilar uma vers˜o
                                                  e         a     e                      a
   thread-safe da biblioteca cliente do MySQL com as op¸˜es do configure --enable-
                                                              co
   thread-safe-client. Isto ir´ criar uma biblioteca libmysqlclient_r com o qual
                                     a
   vocˆ dever´ ligar suas aplica¸˜es que fazem uso de threads. Veja Se¸˜o 12.1.14 [Clientes
       e      a                   co                                   ca
   em threads], P´gina 859.
                    a
 • Op¸˜es que perten¸am a sistemas particulares podem ser encontrados na se¸˜o com
       co                c                                                        ca
   detalhes espec´  ificos de sistemas neste manual. Veja Se¸˜o 2.6 [Notas espec´
                                                              ca                  ificas do
   Sistema Operacional], P´gina 132.
                             a

2.3.4 Instalando pela ´rvore de fontes do desenvolvimento
                      a

CUIDADO: Vocˆ deve ler esta se¸˜o somente se vocˆ estiver interessado em nos ajudar a
                  e                 ca                 e
testar nossos novos c´digos. Se vocˆ s´ deseja deixar o MySQL funcionando em seus sistema,
                       o            e o
vocˆ deve usar uma distribui¸˜o padr˜o (pode ser uma distribui¸˜o bin´ria ou fonte).
    e                          ca      a                         ca     a
Para obter noss mais nova ´rvore de desenvolvimento, use estas instru¸˜es:
                             a                                         co
 1. Fa¸a download do BitKeeper em http://www.bitmover.com/cgi-bin/download.cgi.
         c
      Vocˆ precisar´ do Bitkeeper 3.0 ou posterior para acessar nosso reposit´rio.
           e        a                                                        o
 2. Siga as instru¸˜es para instal´-lo.
                    co              a
 3. Depois que o BitKeeper estiver instalado, primeiro v´ ao diret´rio no qual vocˆ deseja
                                                          a         o              e
      trabalhar e ent˜o use um dos seguintes comandos para clonar o ramo da vers˜o MySQL
                      a                                                          a
      de sua escolha:
      Para clonar o ramo 3.23 (antigo), use este comando:
             shell> bk clone bk://mysql.bkbits.net/mysql-3.23 mysql-3.23
      Para clonar o ramo 4.0 (est´vel/produ¸˜o), use este comando:
                                  a          ca
             shell> bk clone bk://mysql.bkbits.net/mysql-4.0 mysql-4.0
      Para clonar o ramo 4.1 alfa, use este comando:
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                               101



         shell> bk clone bk://mysql.bkbits.net/mysql-4.1 mysql-4.1
    Para clonar o ramo de desenvolvimento 5.0, use este comando:
         shell> bk clone bk://mysql.bkbits.net/mysql-5.0 mysql-5.0
    Nos exemplos anteriores a ´rvore bin´ria ser´ configurada no subdiret´rio
                                   a         a        a                            o
    ‘mysql-3.23/’, ‘mysql-4.0/’, ‘mysql-4.1/’, ou ‘mysql-5.0/’ do diret´rio atual.
                                                                       o
    Se vocˆ est´ atr´s de um firewall e s´ pode iniciar conex˜es HTTP, vocˆ tamb´m pode
          e    a    a                   o                   o             e     e
    o BitKeeper via HTTP.
          ˆ
    Se vocE precisa usar um servidor proxy, simplesmente configure a vari´vel de ambiente
                                                                        a
    http_proxy para apontar para o seu proxy:
         shell> export http_proxy="http://seu.servidor.proxy:8080/"
    Agora, simplesmente substitua o bk:// com o http:// ao fazer um clone. Exemplo:
         shell> bk clone http://mysql.bkbits.net/mysql-4.1 mysql-4.1
    O download inicial da ´rvore fonte pode demorar um pouco, dependendo da velocidade
                          a
    de sua conex˜o; seja paciente.
                a
 4. Vocˆ precisar´ do GNU make, autoconf 2.53 (ou posterior), automake 1.5,
        e        a
    libtool 1.4 e m4 para executar o pr´ximo conjunto de comandos. Embora muitos
                                        o
    sistemas operacionais j´ venham com suas pr´prias implementa¸˜es do make, as
                           a                    o                  co
    chances de que a sua compila¸˜o falhe com mensagens de erros estranhas s˜o altas.
                                ca                                          a
    Consequentemente ´ altamente recomendado usar o GNU make (algumas vezes
                       e
    tamb´m chamado gmake).
          e
    Felizmente, um grande n´mero de sistemas operacionais j´ vem com a ferramente GNU
                            u                               a
    pr´ instalada ou s˜o fornecidos pacotes de instala¸˜o da mesma. De qualquer forma,
      e               a                               ca
    elas podem ser encontradas nos seguintes locais:
     • http://www.gnu.org/software/autoconf/
     • http://www.gnu.org/software/automake/
     • http://www.gnu.org/software/libtool/
     • http://www.gnu.org/software/make/
    Se vocˆ estiver tentando configurar o MySQL 4.1 vocˆ tamb´m precisar´ do bison
           e                                              e     e           a
    1.75. Vers˜es mais antigas do bison podem exiobir este erro: sql_yacc.yy:#####:
               o
    fatal error: maximum table size (32767) exceeded. Nota: o tamanho m´ximo da
                                                                              a
    tabela n˜o ´ realmente excedido, o erro ´ causado por um bug nas vers˜es mais novas
             a e                            e                            o
    do bison.
    Vers˜es do MySQL anteriores a 4.1 podem tamb´m compilar com outras imple-
        o                                              e
    menta¸˜es yacc (e.g. BSD yacc 91.7.30). Para vers˜es posteriores, GNU bison ´ uma
          co                                         o                          e
    exigˆncia.
        e
    O comando comum para fazer em uma shell ´:
                                            e
         cd mysql-4.0
         bk -r edit
         aclocal; autoheader; autoconf; automake
         (cd innobase; aclocal; autoheader; autoconf; automake) # for InnoDB
         (cd bdb/dist; sh s_all ) # for Berkeley DB
         ./configure # Adicione suas op¸~es favoritas aqui
                                        co
102                                    MySQL Technical Reference for Version 5.0.0-alpha



           make
      Caso apare¸am alguns erros estranhos durantes este est´gio, confira se vocˆ realmente
                c                                           a                  e
      tem a libtool instalada!
      Uma cole¸˜o de nossos scripts de configura¸˜o padr˜es est´ localizada no subdiret´rio
               ca                                 ca     o    a                       o
      ‘BUILD/’. Se preferir, vocˆ pode usar ‘BUILD/compile-pentium-debug’. Para compilar
                                e
      em uma arquitetura diferente, modifique o script removendo op¸˜es que s˜o espec´
                                                                   co        a       ificas
      da arquitetura Pentium.
 5. Quando a constru¸˜o estiver pronta, execute make install. Seja cuidadoso com isto
                      ca
    em uma m´quina de produ¸˜o; o comando pode sobrescrever sua vers˜o atual insta-
                a              ca                                         a
    lada. Se vocˆ tem outra instala¸˜o do MySQL, n´s recomendamos que vocˆ execute
                  e                 ca                 o                       e
    ./configure com valores diferentes para as op¸˜es prefix, tcp-port e unix-socket-
                                                  co
    path que as usadas pelo seu servidor em produ¸˜o.
                                                   ca
 6. Seja r´igido com sua nova instala¸˜o e tente fazer com que os novos recursos falhem.
                                     ca
    Inicie executando make test. Veja Se¸˜o 14.1.2 [MySQL test suite], P´gina 892.
                                         ca                              a
 7. Se vocˆ chegar ao est´gio make e a distribui¸˜o n˜o compilar, por favor relate-o para
           e               a                    ca a
    bugs@lists.mysql.com. Se vocˆ instalou as ultimas vers˜es das ferramentas GNU
                                     e             ´          o
    exigidas, e elas falharam tentando processar nossos arquivos de configura¸˜o, por fa-
                                                                             ca
    vor informe isto tamb´m. Entretanto, se vocˆ executar aclocal e obtˆm um erro de
                           e                     e                        e
    command not found n˜o o reporte.Tenha certeza que todas as ferramentas necess´rias
                           a                                                         a
    estejam instaladas e que sua vari´vel PATH esteja corretamente configurada para que
                                     a
    sua shell possa encontr´-la.
                             a
 8. Depois da opera¸˜o inicial bk clone para obter a ´rvore fonte, vocˆ deve executar bk
                   ca                                a                e
    pull periodicamente para obter as atualiza¸˜es.
                                              co
 9. Vocˆ pode examinar o hist´rico de altera¸˜es para a ´rvore com todos os diffs usando bk
       e                       o              co        a
    sccstool. Se vocˆ ver alguns diffs estranhos ou c´digo sobre o qual vocˆ tenha alguma
                      e                              o                      e
    d´vida, n˜o hesite em enviar um e-mail para lista de email “internals” do MySQL. Veja
     u       a
    Se¸˜o 1.7.1.1 [Mailing-list], P´gina 33. Al´m disso, se vocˆ pensar que tem uma id´ia
      ca                           a            e              e                       e
    melhor em como fazer algo, envie um email para o mesmo endere¸o com um patch. bk
                                                                      c
    diffs ir´ produzir um patch para vocˆ ap´s fazer as altera¸˜es no c´digo fonte. Se
            a                                e o                  co        o
    vocˆ n˜o tiver tempo para codificar sua id´ia, apenas envie uma descri¸˜o.
       e a                                       e                          ca
10. BitKeeper tem um ´timo utilit´rio de ajudar que vocˆ pode acessar via bk helptool.
                     o           a                     e
11. Note que qualquer commit (bk ci ou bk citool) ir´ disparar o envio da mensagem com
                                                       a
    as altera¸˜es paa nossa lista de email internos, bem como a submiss˜o openlogging.org
             co                                                        a
    usual apenas com os coment´rios da altera¸˜o. Geralmente vocˆ n˜o precisar usar
                                   a              ca                  e a
    commit (j´ que o ´rvore p´blica n˜o permitir´ bk push), mas ´ prefer´ usar o m´todo
              a       a        u      a           a              e      ivel        e
    bk diffs descrito arteriormente.
Vocˆ tamb´m pode procurar altera¸˜es, coment´rios e c´digo fonte online procurando por
    e     e                     co          a        o
ex. http://mysql.bkbits.net:8080/mysql-4.1 para MySQL 4.1.
O manual est´ em uma ´rvore separad que pode ser clonada com:
            a        a
       shell> bk clone bk://mysql.bkbits.net/mysqldoc mysqldoc
Existe tamb´m um ´rvore p´blica do BitKeeper para o MySQL Control Center e Connec-
           e     a       u
tor/ODBC. Eles podem ser clonados da seguintes forma, respectivamente:
Para clonar o MySQL Control center, use o seguinte comando:
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                               103



     shell> bk clone http://mysql.bkbits.net/mysqlcc mysqlcc
Para clonar o Connector/ODBC, use o seguinte comando:
     shell> bk clone http://mysql.bkbits.net/myodbc3 myodbc3

2.3.5 Lidando com Problemas de Compila¸˜o
                                      ca

Todos programas MySQL compilam de forma limpa sem alertas no solaris usando gcc.
Em outros sistemas, alertas podem ocorrer devido a diferen¸as em arquivos include dos
                                                           c
sistemas. Veja Se¸˜o 2.3.6 [MIT-pthreads], P´gina 106 para avisos que podem ocorrer
                 ca                         a
usando MIT-pthreads. Para outros problemas, confira a lista abaixo.
A solu¸˜o para v´rios problemas envolve reconfigura¸˜o. Se vocˆ precisa reconfigurar, fa¸a
      ca         a                                ca         e                        c
notas do seguinte:
 • Se configure ´ executado depois dele j´ ter sido chamado, ele pode usar informa¸˜o
                   e                       a                                         ca
   que foi colhida durante a chamada anterior. Esta informa¸˜o ´ armazenada no ar-
                                                               ca e
   quivo ‘config.cache’. Quando configure inicia, ele procura por este arquivo, lˆ seu
                                                                                   e
   conte´do, se ele existir, assumindo que aquela informa¸˜o continua correta. Essa con-
        u                                                ca
   jetura ´ inv´lida quando vocˆ reconfigurar.
          e    a                 e
 • Cada vez que vocˆ executa configure, vocˆ deve executar make de novo para re-
                      e                         e
   compilar. Entretanto, vocˆ pode desejar remover primeiro antigos arquivos objeto de
                               e
   constru¸˜es anteriores, porque eles foram compilados usando diferentes op¸˜es de con-
           co                                                               co
   figura¸˜o.
         ca
Para prevenir antigas informa¸˜es de configura¸˜es ou arquivos objetos de serem usados,
                             co               co
execute estes comandos antes de re-executar configure:
     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
   mente tem de falta de mem´ria ou espa¸o de swap:
                               o          c
         Internal compiler error: program cc1plus got fatal signal 11
           ou
         Out of virtual memory
           ou
         Virtual memory exhausted
   O problema ´ que gcc necessita de grande quantidade de mem´ria para compilar
                e                                                 o
   ‘sql_yacc.cc’ com fun¸˜es inline. Tente executando configure com a op¸˜o --with-
                          co                                             ca
   low-memory:
         shell> ./configure --with-low-memory
   Esta op¸˜o adiciona -fno-inline na a linha de compila¸˜o se vocˆ estiver usando
           ca                                               ca       e
   gcc e -O0 se vocˆ estiver usando outro programa. Vocˆ deve tentar a op¸˜o --with-
                   e                                    e                ca
   low-memory mesmo se vocˆ tiver muita mem´ria e espa¸o de swap que vocˆ ache ser
                              e                o          c                 e
   suficieente para n˜o ocorrer erros. Este problema tem ocorrido mesmo em sistemas
                     a
104                               MySQL Technical Reference for Version 5.0.0-alpha



   com boas configura¸˜es de hardware e a op¸˜o --with-low-memory geralmente corrige
                         co                     ca
   isto.
 • Por padr˜o, configure escolhe c++ como o nome do compilador e GNU c++ liga com -
             a
   lg++. Se vocˆ estiver usando gcc, este comportamento pode causar problemas durante
                 e
   a compila¸˜o, como o seguinte:
              ca
           configure: error: installation or configuration problem:
           C++ compiler cannot create executables.
   Vocˆ podem tamb´m ter problemas durante a compila¸˜o relacionados ` g++, libg++
       e                e                                     ca          a
   ou libstdc++.
   Uma causa destes problemas ´ que vocˆ pode n˜o ter g++ ou vocˆ pode ter g++ mas n˜o
                                e         e        a                 e               a
   ter o libg++ ou o libstdc++. De uma olhada no arquivo ‘config.log’. Ele deve conter
   a raz˜o exata do porque seu compilador C++ n˜o funciona! Para trabalhar evitando
          a                                          a
   estes problemas, vocˆ pode usar gcc como seu compilador C++. Tente configurar a
                           e
   vari´vel de ambiente CXX para "gcc -O3". Por exemplo:
       a
           shell> CXX="gcc -O3" ./configure
   Isto funciona porque gcc compila c´digo fonte C++ t˜o bem quanto g++ faz, mas n˜o
                                        o                   a                        a
   ifaz a liga¸˜o em libg++ ou libstdc++ por padr˜o.
              ca                                      a
   Outra forma de corrigir estes problemas, com certeza, ´ instalando g++, libg++
                                                                   e
   e libstdc++. No entanto gostariamos de lhe recomendar a n˜o usar libg++ ou
                                                                       a
   libstdc++ com o MySQL j´ que isto ir´ aumentar o tamanho do bin´rio do mysqld
                               a             a                           a
   sem lhe trazer nenhum benef´   icio. Algumas vers˜es destas bibliotecas tamb´m tem
                                                        o                       e
   causado problemas estranhos para os usu´rios MySQL no passado.
                                              a
   Usar gcc como compilador C++ tamb´m ´ exigido, se vocˆ quiser compilar o MySQL
                                          e e                    e
   com a funcionalidade RAID (veja Se¸˜o 6.5.3 [CREATE TABLE], P´gina 597 para
                                          ca                             a
   mais informa¸˜es sobre tipos de tabela RAID) e vocˆ estiver usando o GNU gcc vers˜o
                 co                                       e                          a
   3 e acima. Se vocˆ obter erros como estes abaixo durante o est´gio de liga¸˜o quando
                       e                                             a       ca
   vocˆ configurar o MySQL para compilar com a op¸˜o --with-raid, tente usar o gcc
       e                                                 ca
   como o seu compilador C++ definindo a vari´vel de ambiente CXX mencionada acima:
                                                 a
           gcc -O3 -DDBUG_OFF -rdynamic -o isamchk isamchk.o sort.o libnisam.a
           ../mysys/libmysys.a ../dbug/libdbug.a ../strings/libmystrings.a -lpthread
           -lz -lcrypt -lnsl -lm -lpthread
           ../mysys/libmysys.a(raid.o)(.text+0x79): In function ‘my_raid_create’:
           : undefined reference to ‘operator new(unsigned)’
           ../mysys/libmysys.a(raid.o)(.text+0xdd): In function ‘my_raid_create’:
           : undefined reference to ‘operator delete(void*)’
           ../mysys/libmysys.a(raid.o)(.text+0x129): In function ‘my_raid_open’:
           : undefined reference to ‘operator new(unsigned)’
           ../mysys/libmysys.a(raid.o)(.text+0x189): In function ‘my_raid_open’:
           : undefined reference to ‘operator delete(void*)’
           ../mysys/libmysys.a(raid.o)(.text+0x64b): In function ‘my_raid_close’:
           : undefined reference to ‘operator delete(void*)’
           collect2: ld returned 1 exit status
 • Se sua compila¸˜o falhar com erros, como um dos seguintes, vocˆ deve atualizar sua
                    ca                                                 e
   vers˜o de make para GNU make:
        a
           making all in mit-pthreads
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                105



         make: Fatal error in reader: Makefile, line 18:
         Badly formed macro assignment
           or
         make: file ‘Makefile’ line 18: Must be a separator (:
           or
         pthread.h: No such file or directory
    O Solaris e o FreeBSD s˜o conhecidos por terem alguns problemas com o make.
                           a
    O GNU make vers˜o 3.75 ir´ funcionar.
                   a         a
 • Se vocˆ deseja definir algumas op¸˜es que devem ser usadas pelo seu compilador C ou
          e                         co
   C++, adicione as op¸˜es para as vari´veis de ambiente CFLAGS e CXXFLAGS. Vocˆ pode
                      co               a                                       e
   tamb´m especificar os nomes do compilador a ser usado da mesma forma utilizando CC
        e
   e CXX. Exemplo:
         shell>   CC=gcc
         shell>   CFLAGS=-O3
         shell>   CXX=gcc
         shell>   CXXFLAGS=-O3
         shell>   export CC CFLAGS CXX CXXFLAGS
    Olhe em Se¸˜o 2.2.8 [MySQL binaries], P´gina 86 para uma lista de defini¸˜o de op¸˜es
              ca                           a                               ca       co
    que tenham sido uteis em v´rios sistemas.
                    ´         a
 • Se vocˆ recebeu uma mensagem de erro como esta, ´ necess´rio atualizar o compilador
         e                                         e       a
   gcc:
    O gcc 2.8.1 funciona, mas recomendamos o uso do gcc 2.95.2 ou egcs 1.0.3a em seu
    lugar.
 • Se vocˆ obtem erros como estes vistos abaixo enquanto estiver compilando o mysqld,
         e
   o configure n˜o detectou corretamente o tipo do ultimo argumento para accept(),
                a                                   ´
   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);
    Para corrigir isto, edite o arquivo ‘config.h’ (que ´ gerado pelo configure). Procure
                                                        e
    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
    que vocˆ dever´ fazer isto cada vez que vocˆ executar configure, porque configure
           e      a                            e
    regenera ‘config.h’.)
 • O arquivo ‘sql_yacc.cc’ ´ gerado pelo ‘sql_yacc.yy’. Normalmente o processo de
                              e
   constru¸˜o n˜o necessita criar ‘sql_yacc.cc’, porque o MySQL j´ vem com uma c´pia
          ca a                                                      a                 o
   pr´-gerada. Entretanto, se vocˆ necessita recri´-lo vocˆ pode encontrar este erro:
     e                            e               a       e
           "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
    instalar o bison (a vers˜o GNU de yacc) e us´-lo no lugar do yacc.
                            a                   a
106                                    MySQL Technical Reference for Version 5.0.0-alpha



 • Se vocˆ necessita depurar mysqld ou um cliente MySQL, execute configure com a
          e
   op¸˜o --with-debug, ent˜o recompile e ligue seus clientes com a nova biblioteca cliente.
      ca                    a
   Veja Se¸˜o D.2 [Debugging client], P´gina 1076.
           ca                          a
 • Se vocˆ tem um erro de compila¸˜o no Linux (ex. SuSE Linux 8.1 ou Red Hat Linux
          e                         ca
   7.3) parecido com o seguinte:
         libmysql.c:1329: warning: passing arg 5 of ‘gethostbyname_r’ from incompatible p
         libmysql.c:1329: too few arguments to function ‘gethostbyname_r’
         libmysql.c:1329: warning: assignment makes pointer from integer without a cast
         make[2]: *** [libmysql.lo] Error 1
   Por padr˜o, o script configure tenta determinar o n´mero correto de argumentos
             a                                             u
   usando o compilador GNU C++ g++. Ele testa os resultados errados permitidos, se o
   g++ n˜o est´ instalado. Existem dois modos de contornar este problema:
         a      a
     • Certifique-se de que o GNU C++ g++ est´ instalado. Em algumas distribui¸˜es
                                                 a                                     co
        Linux, o pacote exigido ´ chamado gpp, em outro ele ´ chamado gcc-c++.
                                e                             e
     • Use o gcc como o seu compilador C++ configurando a vari´avel de ambiente CXX
                                                                   a
        para gcc:
               export CXX="gcc"
      Note que vocˆ precisa executar o configure novamente ap´s isto.
                  e                                          o

2.3.6 Notas MIT-pthreads

Esta se¸˜o descreve alguns dos detalhes envolvidos no uso de MIT-pthreads.
        ca
Note que no Linux vocˆ N~O deve usar MIT-pthreads mas instalar LinuxThreads! Veja
                          e A
Se¸˜o 2.6.2 [Linux], P´gina 137.
  ca                    a
Se seu sistema n˜o fornece suporte nativo a thread, vocˆ precisar´ construir o MySQL
                    a                                        e        a
usando o pacote MIT-pthreads. Isto inclui antigos sistemas FreeBSD, SunOS 4.X, Solaris
2.4 e anteriores entre outros. Veja Se¸˜o 2.2.3 [Qual SO], P´gina 78.
                                        ca                    a
Note que a partir do MySQL 4.0.2, MIT-pthreads n˜o fazem mais parte da distribui¸˜o
                                                        a                                ca
fonte. Se vocˆ precisar deste pacote, vocˆ precisa fazer o download dele separadamente em
               e                           e
http://www.mysql.com/Downloads/Contrib/pthreads-1_60_beta6-mysql.tar.gz
Depois do download, extraia este arquivo fonte no n´ mais alto do diret´rio de fontes do
                                                      ivel                  o
MySQL. Ele criar´ um novo subdiret´rio mit-pthreads.
                    a                   o
  • Na maioria dos sitemas, vocˆ pode for¸ar o uso de MIT-pthreads executando o
                                      e          c
     configure com a op¸˜o --with-mit-threads:
                            ca
            shell> ./configure --with-mit-threads
     Constru¸˜o em um diret´rio n˜o fonte n˜o ´ suportado com o uso de MIT-pthreads,
              ca                o     a        a e
     porque n´s queremos minimizar nossas altera¸˜es para este c´digo.
               o                                    co             o
  • As verifica¸˜es que determinam se MIT-pthreads ser´ usado ou n˜o, ocorrer´ somente
                 co                                        a            a         a
     durante a parte do processo de configura¸˜o que trata com o c´digo do servidor. Se vocˆ
                                              ca                  o                         e
     configurou a distribui¸˜o usando --without-server para construir somente o c´digo
                             ca                                                        o
     cliente, clientes n˜o ir˜o saber se o MIT-pthreads est´ sendo usado e ir´ usar conex˜es
                        a a                                a                 a           o
     socket Unix por padr˜o. Como os sockets Unix n˜o funcionam sob MIT-pthreads, isto
                            a                           a
     significa que vocˆ precisar´ usar -h ou --host quando executar programas clientes.
                       e          a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                107



 • Quando o MySQL ´ compilado usando MIT-pthreads, travas de sistema s˜o desabil-
                      e                                                    a
   itadas por padr˜o por raz˜es de performance. Vocˆ pode dizer ao servidor para usar
                  a          o                     e
   travas de sistema com a op¸˜o --external-locking. Isto s´ ´ necess´rio se vocˆ
                               ca                              o e       a          e
   quiser executar dois servidores MySQL no mesmo diret´rio de dados (no que n˜o ´
                                                        o                        a e
   recomendado)
 • Algumas vezes o comando pthread bind() falha ao ligar a um socket sem nenhuma
   mensagem de erro (pelo menos no Solaris). O resultado ´ que todas conex˜es ao servidor
                                                         e                o
   falham. Por exemplo:
          shell> mysqladmin version
          mysqladmin: connect to server at ’’ failed;
          error: ’Can’t connect to mysql server on localhost (146)’
   A solu¸˜o para isto ´ matar o servidor mysqld e reinici´-lo. Isto s´ aconteceu conosco
          ca            e                                 a           o
   quando for¸amos uma queda do servidor e fizemos uma reinicializa¸˜o imediata.
              c                                                        ca
 • Com MIT-pthreads, a chamada de sistema sleep() n˜o ´ interromp´ com SIGINT
                                                         a e              ivel
   (break). Isto s´ ´ percebido quando vocˆ executa mysqladmin --sleep. Vocˆ deve es-
                  oe                      e                                     e
   perar pela chamada sleep() para terminar, antes da interru¸˜o ser servida e o processo
                                                               ca
   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
          implicit declaration of function ‘int strtoll(...)’
          implicit declaration of function ‘int strtoul(...)’
 • N˜o colocamos readline para funcionar com MIT-pthreads. (Isto n˜o ´ necess´rio,
    a                                                             a e        a
   mas pode ser interessante para alguns.)

2.3.7 Instalando o MySQL a partir do Fonte no Windows

Estas instru¸˜es descrevem como construir o bin´rio do MySQL a partir do fonte paras
            co                                   a
vers˜es 4.1 e acima no Windows. As instru¸˜es s˜o fornecidas para construir bin´rios a
    o                                       co    a                              a
partir de uma distribui¸˜o fonte padr˜o ou a partir da ´rvore do BitKeeper que cont´m o
                       ca            a                 a                           e
fonte do desenvolvimento mais atuais.
Nota: As instru¸˜es neste documento est˜o restritas aos usu´rios que queiram testar o
                 co                    a                   a
MySQL no Windows a partir da ultima distribui¸˜o fonte ou da ´rvore do BitKeeper.
                                  ´             ca               a
Para uso em produ¸˜o, a MySQL AB n˜o aconselha que vocˆ utilize um servidor MySQL
                    ca               a                   e
constru´ por vocˆ mesmo a partir de um fonte. Normalmente ´ melhor usar uma dis-
        ido         e                                          e
      ca     a                               e        ´ especificamente para desem-
tribui¸˜o bin´ria precompilada do MySQL que ´ construida
108                                    MySQL Technical Reference for Version 5.0.0-alpha



penho otimizado no Windows pela MySQL AB. Instru¸˜es para instalar uma distribui¸˜o
                                                    co                          ca
bin´ria est´ dispon´ em Se¸˜o 2.1.1 [Windows installation], P´gina 60.
   a       a       ivel   ca                                 a
Para construir o MySQL no Windows a partir do fonte, vocˆ precisa dos seguintes compi-
                                                        e
ladores e recursos dison´
                        iveis em seu sistema Windows:
 • Compilador VC++ 6.0 (atualizado com o SP 4 ou 5 e pacote Pre-processador) O
   pacote Pre-processador ´ necess´rio para a macro assembler. Mais detalhes em:
                          e       a
   http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp5/faq.aspx.
 • Aproximadamente 45 MB de espa¸o em disco.
                                   c
 • 64 MB de RAM
Vocˆ tamb´m precisar´ de um distribui¸˜o fonte para o Windows. Existem dois modos de
   e       e         a                ca
conseguir uma distribui¸˜o fonte do MySQL vers˜o 4.1 e acima:
                       ca                      a
 1. Obtenha um pacote de uma distribui¸˜o fonte pela MySQL AB para a vers˜o do
                                           ca                                      a
    MySQL que vocˆ est´ particularmente interessado. Distribui¸˜es fontes empacotadas
                     e   a                                       co
    est˜o dispon´
       a         iveis para vers˜es distribu´
                                o             idas do MySQ e podem ser obtidas em
    http://www.mysql.com/downloads/.
 2. Vocˆ pode empacotar um distribui¸˜o fonte vocˆ mesmo a partir da ultima ´rvore fonte
        e                            ca            e                          a
    de desenvolvimento do BitKeeper. Se vocˆ planeja fazer isto, vocˆ deve criar o pacote
                                              e                     e
    em um sistema Unix e ent˜o transfr´ para seu sistema Windows. (A raz˜o para isto ´
                             a        i-lo                                  a           e
    que alguns dos passos de configura¸˜o e constru¸˜o exigem ferramentas que funcionam
                                     ca             ca
    apenas no Unix.) A abordagem do BitKeeper, exige:
      • Um sistema executando Unix ou um sistema tipo Unix, como o Linux
      • BitKeeper 3.0 instalado neste sistema. Vocˆ pode obter o BitKeeper em
                                                       e
         http://www.bitkeeper.com/.
Se vocˆ estiver usando uma distribui¸˜o fonte do Windows, vocˆ pode ir diretamente para
      e                             ca                       e
Se¸˜o 2.3.7.1 [Windows VC++ Build], P´gina 108. Para contruir a partir da ´rvore do
  ca                                     a                                    a
BitKeeper, v´ para Se¸˜o 2.3.7.2 [Windows BitKeeper Build], P´gina 110.
             a        ca                                     a
Se vocˆ encontrar alguma coisa que n˜o est´ funcionando como esperado, ou tiver sugest˜es
      e                              a    a                                           o
sobre o mode de melhorar o processo de constru¸˜o atual no Windows, envie uma mensagem
                                               ca
para a lista de email win32. Veja Se¸˜o 1.7.1.1 [Mailing-list], P´gina 33.
                                    ca                           a

2.3.7.1 Construindo o MySQL Usando VC++

Nota: O MySQL 4.1 e arquivos do espe¸o de trabalho do VC++ s˜o compat´
                                           c                         a          iveis com o
Microsoft Visual Studio 6.0 e as edi¸˜es acima (7.0/.NET) e testados pela equipe da MySQL
                                    co
AB antes de cada distribui¸˜o.
                           ca
Siga este procedimento para construir o MySQL:
 1. Crie um diret´rio de trabalho (ex.: ‘workdir’).
                 o
 2. Descompacte a distribui¸˜o fonte no diret´rio mencionado acima usando Winzip ou
                            ca                 o
    outra ferramenta que possa ler arquivos ‘.zip’.
 3. Inicie o compilador VC++ 6.0.
 4. No menu File, selecione Open Workspace.
 5. Abra o workspace ‘mysql.dsw’ que vocˆ encontrar no diret´rio de trabalho.
                                           e                o
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                   109



 6. No menu Build, selcione o menu Set Active Configuration.
 7. Clique sobre a tela selecionada mysqld - Win32 Debug e clique OK.
 8. Pressione F7 para iniciar a constru¸˜o da depura¸˜o do servidor, bibliotecas e alguns
                                          ca             ca
    aplicativos clientes.
 9. Compile as vers˜es distribu´
                      o           idas que vocˆ desejar, do mesmo modo.
                                                e
10. Vers˜es depuradas dos programas e bibliotecas s˜o colocados nos diret´rios
         o                                                     a                        o
    ‘client_debug’ e ‘lib_debug’. Vers˜es liberadas dos programas e bibliotecas s˜o
                                             o                                             a
    colocados nos diret´rios ‘client_release’ e ‘lib_release’. Note que se vocˆ quiser
                          o                                                         e
    construir tanto vers˜es liberadas quanto depuradas vocˆ pode selecionar a op¸˜o
                            o                                     e                       ca
    “build all” do menu Build.
11. Teste o servidor. O servidor constru´ usando as instru¸˜es anteriores ir´ esperar que
                                           ido                 co              a
    o diret´rio base e de dados do MySQL seja ‘C:mysql’ e ‘C:mysqldata’ por padr˜o.
             o                                                                            a
    Se vocˆ quiser testar o seu servidor usando o diret´rio raiz de uma ´rvore fonte e seu
             e                                             o               a
    diret´rio de dados como o diret´rio base e o diret´rio de dados, vocˆ precisar´ dizer ao
          o                           o                 o                e        a
    servidor os seus caminhos. Vocˆ tamb´m pode fazer into na linha de comando com as
                                      e      e
    op¸˜es --basedir e --datadir, ou colocar op¸˜es apropriadas no arquivo de op¸˜es (o
       co                                            co                               co
    arquivo ‘C:my.cnf’ ou ‘my.ini’ no diret´rio do Windows). Se vocˆ tiver um diret´rio
                                                  o                      e               o
    de dados existente em qualquer lugar que vocˆ queira usar, vocˆ pode especific´-lo no
                                                     e                e               a
    se caminho.
12. Inicie o ser servidor a partir do diret´rio ‘client_release’ ou ‘client_debug’, depen-
                                           o
    dendo de qual servidor vocˆ queira usar. O instru¸˜es gerais de inicializa˜o do servidor
                                 e                       co                   a
    est˜o em Se¸˜o 2.1.1 [Windows installation], P´gina 60. Vocˆ precisar´ adaptar as
       a          ca                                    a             e        a
    instru¸˜es de forma apropriada se vocˆ quiser usar um diret´rio base ou diret´rio de
            co                                e                     o                 o
    dados diferente.
13. Quando o servidor est´ em execu¸˜o de modo independente ou como um servi¸o daseado
                             a         ca                                        c
    em sua configura¸˜o, tente se conectar a ele pelo utilit´rio interativo mysql de linha de
                       ca                                    a
    comando que existe em seu diret´rio ‘client_release’ ou ‘client_debug’.
                                        o
Quando vocˆ estiver certo de que os programas que vocˆ construiu est˜o funcionando cor-
             e                                           e            a
retamente, pare o servidor. Ent˜o instale o MySQL da seguinte forma:
                                 a
 1. Crie o diret´rio para instalar os arquivos do MySQL. Por exemplo, para instalar dentro
                o
    de ‘C:mysql’), use estes comandos:
          C:
          mkdir mysql
          mkdir mysqlbin
          mkdir mysqldata
          mkdir mysqlshare
          mkdir mysqlscripts
    Se vocˆ quiser compilar outros clientes e lig´-los ao MySQL, vocˆ tamb´m deve criar
           e                                      a                 e       e
    diversos diret´rios adicionais:
                  o
          mkdir mysqlinclude
          mkdir mysqllib
          mkdir mysqllibdebug
          mkdir mysqllibopt
    Se vocˆ quiser fazer um benchamrk do MySQL, crie este diret´rio:
           e                                                     o
110                                    MySQL Technical Reference for Version 5.0.0-alpha



           mkdir mysqlsql-bench
      Benchmark exigem suporte Perl.
 2. Copie do diret´rio workdir para o diret´rio c:mysql os seguintes diret´rios:
                  o                        o                               o
           copy client_release*.exe C:mysqlbin
           copy client_debugmysqld.exe C:mysqlbinmysqld-debug.exe
           xcopy scripts*.* C:mysqlscripts /E
           xcopy share*.* C:mysqlshare /E
      Se vocˆ quiser compilar outros clientes e lig´-los ao MySQL, vocˆ tamb´m deve fazer
            e                                      a                  e     e
      isto:
           copy   lib_debugmysqlclient.lib C:mysqllibdebug
           copy   lib_debuglibmysql.* C:mysqllibdebug
           copy   lib_debugzlib.* C:mysqllibdebug
           copy   lib_releasemysqlclient.lib C:mysqllibopt
           copy   lib_releaselibmysql.* C:mysqllibopt
           copy   lib_releasezlib.* C:mysqllibopt
           copy   include*.h C:mysqlinclude
           copy   libmysqllibmysql.def C:mysqlinclude
      Se vocˆ quiser fazer um benchmark do MySQL, vocˆ tamb´m deve fazer isto:
            e                                        e     e
           xcopy sql-bench*.* C:mysqlbench /E
Configure e inicie o servidor da mesma forma que a distribui¸˜o bin´ria do Windows. Veja
                                                           ca     a
Se¸˜o 2.1.1.3 [Windows prepare environment], P´gina 62.
  ca                                          a

                                                       ´
2.3.7.2 Criando um Pacote Fonte do Windows a partir da Ultima
        Fonte de Desenvolvimento

Para construir o ultimo pacote fonte do Windows a partir da arvor´ fonte atual do Bit-
                 ´                                                  e
Keeper, use as seguintes instru¸˜es. Por favor, note que este procedimento deve ser real-
                               co
izado em um sistema executando um sistema opercional Unix ou similar. (Sabe-se que este
procedimento funciona bem com o Linux, por exemplo.)
 1. Clone a ´rvore fonte do BitKeeper para o MySQL (vers˜o 4.1 ou acima, como dese-
            a                                             a
    jado). Para mais informa¸˜es sobre como clonar a ´rvore fonte veja as instru¸˜es em
                               co                     a                         co
    Se¸˜o 2.3.4 [Installing source tree], P´gina 100.
      ca                                   a
 2. Configure e construa as distribui¸˜es para que vocˆ tenha um bin´rio do servidor para
                                    co               e             a
    trabalhar. Um modo de se fazer isto ´ executar o seguinte comando no diret´rio de
                                          e                                      o
    mais alto n´ de sua ´rvore fonte:
               ivel      a
           shell> ./BUILD/compile-pentium-max
 3. After making sure that the build process completed successfully, run the following
    utility script from top-level directory of your source tree:
           shell> ./scripts/make_win_src_distribution
      This script creates a Windows source package, to be used on your Windows system.
      You can supply different options to the script based on your needs. It accepts the
      following options:
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                   111



           --debug     Debug, without creating the package
           --tmp       Specify the temporary location
           --suffix Suffix name for the package
           --dirname Directory name to copy files (intermediate)
           --silent Do not list verbosely files processed
           --tar       Create tar.gz package instead of .zip
           --help      Show this help message
    By default, make_win_src_distribution creates a zipped archive with the name
    ‘mysql-VERSION-win-src.zip’, where VERSION represents the version of your MySQL
    source tree.
 4. Copy or upload to your Windows machine the Windows source package that you have
    just created. To compile it, use the instructions in Se¸˜o 2.3.7.1 [Windows VC++ Build],
                                                           ca
    P´gina 108.
      a

2.4 Configura¸˜es e Testes P´s-instala¸˜o
            co             o         ca

Uma vez instalado o MySQL (de uma distribui¸ao bin´ria ou fonte), vocˆ deve inicializar
                                                   c˜    a                 e
as tabelas de concess˜es, iniciar o servidor e ter certeza que o servidor est´ funcionando
                       o                                                      a
bem. Vocˆ pode tamb´m desejar que o servidor inicie e pare automaticamente quando seu
           e            e
sistema iniciar e desligar.
Normalmente vocˆ instala as tabelas de concess˜es e inicia o servidor assim para instala¸˜es
                  e                               o                                     co
baseadas em uma distribui¸˜o fonte:
                             ca
       shell> ./scripts/mysql_install_db
       shell> cd diretorio_instala¸~o_mysql
                                        ca
       shell> ./bin/mysqld_safe --user=mysql &
Para uma distribui¸˜o bin´ria (sem ser pacotes RPM ou PKG), fa¸a isto:
                    ca      a                                       c
       shell> cd diretorio_instala¸~o_mysql
                                        ca
       shell> ./bin/mysql_install_db
       shell> ./bin/mysqld_safe --user=mysql &
O script mysql_install_db cria o banco de dados mysql que ir´ armazenar todos privil´gios
                                                                a                      e
do banco de dados, o banco de dados test que vocˆ poder´ usar para testar o MySQL e
                                                      e       a
tamb´m entradas de privil´gio para o usu´rio que usa o mysql_install_db e o usu´rio
      e                       e              a                                          a
root. As estrandas s˜o criadas sem senhas. O script mysqld_safe inicia o servidor mysqld.
                      a
(Se sua vers˜o for anterior a 4.0, use safe_mysqld em vez de mysqld_safe.)
             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
                  a                          a             e a
test vocˆ pode removˆ-lo com mysqladmin -u root drop test depois de iniciar o servidor.
         e              e
Testes s˜o geralmente facilmente feitos de um diret´rio raiz da distribui¸˜o MySQL.
         a                                               o                      ca
Para uma distribui¸˜o bin´ria, este ´ seu diret´rio de instala¸˜o (normalmente algo como
                    ca       a        e           o             ca
‘/usr/local/mysql’). Para uma distrubui¸˜o fonte, este ´ o diret´rio principal da sua
                                               ca             e        o
´rvore fonte do MySQL.
a
Nos comandos mostrados abaixo nesta se¸˜o e nas seguintes subse¸˜es, BINDIR ´ o caminho
                                          ca                       co            e
para a localiza¸˜o na qual os programas como mysqladmin e mysqld_safe est˜o instalados.
               ca                                                              a
Para uma distribui¸˜o bin´ria este ´ o diret´rio ‘bin’. Para uma distribui¸˜o fonte, BINDIR
                    ca      a       e        o                            ca
112                                        MySQL Technical Reference for Version 5.0.0-alpha



´ provavelmente ‘/usr/local/bin’, a menos que vocˆ especifique um diret´rio de instala¸˜o
e                                                          e                         o            ca
diferente de ‘/usr/local’ quando vocˆ executa configure. EXECDIR ´ a localiza¸˜o na qual
                                            e                                  e           ca
o servidor mysqld est´ instalado. Para uma distribui¸˜o bin´ria, isto ´ o mesmo que BINDIR.
                           a                               ca      a          e
Para uma distribui¸˜o fonte, EXECDIR ´ provavelmente ‘/usr/local/libexec’.
                         ca                   e
Os testes s˜o descritos em detalhes abaixo:
             a
  1. Se necess´rio, inicie o servidor mysqld e configure as tabelas de concess˜es iniciais
                  a                                                                        o
     contendo os privil´gios que determinam como os usu´rios est˜o permitidos a conectar
                              e                                  a         a
     ao servidor. Isto ´ feito normalmente com o script mysql_install_db:
                            e
             shell> scripts/mysql_install_db
     Normalmente, mysql_install_db precisa ser executado somente na primeira vez que
     vocˆ instala o MySQL. Portanto, se vocˆ estiver atualizando uma instala¸˜o existente,
         e                                          e                                   ca
     vocˆ pode pular este passo. (entretanto, mysql_install_db ´ realmente seguro de usar
         e                                                               e
     e n˜o ir´ atualizar nenhuma tabela que j´ exista, ent˜o se vocˆ n˜o tem certeza do que
         a a                                         a          a          e a
     fazer, vocˆ pode sempre executar mysql_install_db.)
                  e
     mysql_install_db cria seis tabelas (user, db, host, tables_priv, columns_priv e
     func) no banco de dados mysql. Uma descri¸˜o dos privil´gios iniciais ´ fornecido
                                                           ca              e               e
     em Se¸˜o 4.4.4 [Default privileges], P´gina 261. De forma resumidao, estes privil´gios
             ca                                   a                                             e
     permitem que o usu´rio root fa¸a qualquer coisa no MySQL, e permitem a qualquer
                                 a         c
     um a criar ou usar bancos de dados com o nome de ’test’ ou iniciando com ’test_’
     .
     Se vocˆ n˜o configurar as tabelas de concess˜es, o seguinte erro ir´ aparecer no arquivo
              e a                                        o                      a
     log quando vocˆ n˜o iniciar o servidor:
                          e a
             mysqld: Can’t find file: ’host.frm’
     O erro acima pode tamb´m ocorrer com uma distribui¸˜o bin´ria do MySQL se vocˆ
                                     e                              ca       a                       e
     n˜o iniciar o MySQL executando o ./bin/mysqld_safe! Veja Se¸˜o 4.8.2 [mysqld_
       a                                                                           ca
     safe], P´gina 332.
                a
     Vocˆ deve precisar executar mysql_install_db como root. Entretanto, se vocˆ
          e                                                                                          e
     preferir, pode executar o servidor MySQL como um usu´rio (n˜o-root) sem   a       a
     privil´gios, desde que o usu´rio possa ler e escrever arquivos no diret´rio de banco
            e                          a                                               o
     de dados. Instru¸˜es para executar o MySQL como um usu´rio sem privil´gios ´
                              co                                               a              e      e
     detalhado em Se¸˜o A.3.2 [Alterando usu´rios MySQL], P´gina 919
                           ca                          a               a
     Se vocˆ tiver problemas com o mysql_install_db, veja Se¸˜o 2.4.1 [mysql_install_
              e                                                         ca
     db], P´gina 115.
             a
     Existem algumas alternativas para executar o script mysql_install_db como ele ´                 e
     fornecido na distribui¸˜o MySQL:
                                  ca
        • Vocˆ pode querer editar o mysql_install_db antes de execut´-lo, para alterar os
                e                                                                 a
           privil´gios iniciais que s˜o instalados nas tabelas de concess˜es. Isto ´ util se vocˆ
                  e                    a                                       o         e´          e
           deseja instalar o MySQL em v´rias m´quinas com os mesmos privil´gios. Neste
                                                a        a                               e
           caso, ´ prov´vel que vocˆ s´ precise adicionar algumas instru¸˜es INSERT extras
                   e        a            e o                                      co
           para as tabelas mysql.user e mysql.db.
        • Se vocˆ deseja alterar o conte´do da tabelas de concess˜es depois de instal´-
                     e                          u                             o                    a
           las, vocˆ pode executar mysql_install_db, ent˜o usar mysql -u root mysql para
                      e                                        a
           conectar `s tabelas de concess˜es como o usu´rio root e usar instru¸˜es SQL para
                        a                     o              a                         co
           modific´-las diretamente.
                     a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                    113



        ´
      • E poss´ recriar as tabelas de permiss˜es completamente depois delas j´ terem
                ivel                             o                                 a
        sido criadas. Vocˆ pode querer fazer isto se vocˆ j´ instalou as tabelas mas deseja
                          e                             e a
        recri´-las depois das edi¸˜es mysql_install_db.
             a                   co
    Para maiores informa¸˜es sobre estas alternativas, veja Se¸˜o 4.4.4 [Default privileges],
                        co                                    ca
    P´gina 261.
     a
 2. Inicie o servidor MySQL assim:
          shell> cd diretorio_instalacao_mysql
          shell> bin/mysqld_safe &
    Se a sua vers˜o do MySQL for mais antiga do que 4.0, substitua bin/safe_mysqld por
                 a
    bin/mysqld_safe no comando:
    Se vocˆ tiver problemas iniciando o servidor, veja Se¸˜o 2.4.2 [Starting server],
          e                                              ca
    P´gina 116.
     a
 3. Use mysqladmin para verificar se o servidor est´ em execu¸˜o. Os seguintes coman-
                                                  a          ca
    dos fornecem um teste simples para conferir se o servidor est´ em funcionamento e
                                                                 a
    respondendo `s conex˜es:
                a       o
          shell> BINDIR/mysqladmin version
          shell> BINDIR/mysqladmin variables
    A sa´ de mysqladmin version varia muito pouco dependendo de sua plataforma e
         ida
    vers˜o do MySQL, mas deve ser similar a esta mostrada abaixo:
        a
          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 tables: 0
          Queries per second avg: 0.000
          Memory in use: 132K Max memory used: 16773K
    Para ter uma id´ia do que vocˆ pode fazer com BINDIR/mysqladmin, invoque-o com a
                   e             e
    op¸˜o --help.
      ca
 4. Verifique se vocˆ pode desligar o servidor:
                   e
          shell> BINDIR/mysqladmin -u root shutdown
 5. Verifique que vocˆ possa reiniciar o servidor.
                    e                                  Fa¸a isto usando mysqld_safe ou
                                                         c
    chamado o mysqld diretamente. Por exemplo:
          shell> BINDIR/mysqld_safe --log &
114                                     MySQL Technical Reference for Version 5.0.0-alpha



    Se o mysqld_safe falhar, tente execut´-lo do diret´rio de instala¸˜o do MySQL (se
                                             a            o               ca
    vocˆ j´ n˜o estiver l´). Se n˜o funcionar, veja Se¸˜o 2.4.2 [Starting server], P´gina 116.
       e a a             a       a                    ca                            a
 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 |
           | db           |
           | func         |
           | host         |
           | tables_priv |
           | user         |
           +--------------+

           shell> BINDIR/mysql -e "SELECT host,db,user FROM db" mysql
           +------+--------+------+
           | host | db     | user |
           +------+--------+------+
           | %    | test   |      |
           | %    | test_% |      |
           +------+--------+------+
      Tamb´m existe uma suite de benchmark no diret´rio ‘sql-bench’ (sob o diret´rio de
            e                                           o                         o
      instala¸˜o do MySQL) que vocˆ pode usar para comparar como o MySQL se comporta
             ca                       e
      em diferentes plataformas. O diret´rio ‘sql-bench/Results’ cont´m os resultados de
                                          o                            e
      v´rias execu¸˜es em diferentes bancos de dados e plataformas. Os seguintes m´dulos
       a          co                                                               o
      Perl adicionais s˜o necess´rios para executar o pacote de benchamrk:
                       a        a
           DBI
           DBD-mysql
           Data-Dumper
           Data-ShowTable
      Estes m´dulos podem ser obtidos em CPAN http://www.cpan.org/. Veja Se¸˜o 2.7.1
              o                                                            ca
      [Instala¸˜o Perl], P´gina 165.
              ca          a
      O diret´rio ‘sql-bench/Results’ cont´m os resultados de v´rias execu¸˜es em difer-
             o                              e                     a          co
      entes bancos de dados e plataformas. Para executar todos testes, execute estes coman-
      dos:
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                   115



          shell> cd sql-bench
          shell> run-all-tests
    Se vocˆ n˜o possui o diret´rio ‘sql-bench’, vocˆ provavelmente est´ usando uma dis-
           e a                o                    e                  a
    tribui¸˜o bin´ria RPM. (Distribui¸˜es fontes RPMs incluem o diret´rio com os bench-
          ca      a                   co                              o
    marks.) Neste caso, vocˆ deve primeiramente instalar a suite de benchmark antes
                             e
    de poder us´-lo. A partir da vers˜o 3.22 do MySQL, come¸aram a existir arquivos
                 a                     a                       c
    RPMs de benchmark chamados ‘mysql-bench-VERSION-i386.rpm’ que cont´m c´digo
                                                                              e   o
    ie dados de benchmark.
    Se vocˆ tem uma distribui¸˜o fonte, vocˆ tamb´m pode executar os testes no subdi-
           e                   ca           e      e
    ret´rio ‘tests’. Por exemplo, para executar ‘auto_increment.tst’, fa¸a isto:
       o                                                                 c
          shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst
    Os resultados esperados s˜o mostrados no arquivo ‘./tests/auto_imcrement.res’.
                             a

2.4.1 Problemas Executando o mysql_install_db

O prop´sito do script mysql_install_db ´ gerar novas tabelas de privil´gios. Ele n˜o ir´
        o                                  e                               e          a    a
afeter nenhum outro dado! Ele tamb´m n˜o far´ nada se vocˆ j´ tem a tabela de privil´gio
                                     e    a     a             e a                       e
do MySQL instalada.
Se vocˆ deseja refazer suas tabelas de privil´gios, vocˆ deve desligar o servidor mysqld, se
       e                                     e         e
ele j´ est´ executando, ent˜o fa¸a assim:
     a    a                a    c
       mv diretorio-dados-mysql/mysql diretorio-dados-mysql/mysql-old
       mysql_install_db
Esta se¸˜o relaciona alguns problemas que podem ser encontrados ao executar mysql_
         ca
install_db:
mysql_install_db n˜o instala as tabelas de permiss˜es
                    a                             o
          Vocˆ pode descobrir que o mysql_install_db falha ao instalar as tabelas de
              e
          permiss˜es e termina depois de mostrar as seguintes mensagens:
                  o
                starting mysqld daemon with databases from XXXXXX
                mysql daemon ended
          Neste caso, vocˆ deve examinar o arquivo de log com muito cuidado! O log deve
                         e
          se encontrar no diret´rio ‘XXXXXX’ nomeado pela mensagem de erro, e deve
                                o
          indicar porque mysqld n˜o inicializa. Se vocˆ n˜o entende o que aconteceu,
                                   a                    e a
          inclua o log quando vocˆ postar um relato de erro usando mysqlbug! Veja
                                   e
          Se¸˜o 1.7.1.3 [Bug reports], P´gina 36.
            ca                          a
J´ existe um daemon mysqld sendo executado
 a
            Neste caso, provavelmente n˜o ser´ necess´rio executar o mysql_install_db.
                                       a     a       a
            Vocˆ deve executar o mysql_install_db somente uma vez, quando vocˆ insta-
                e                                                              e
            lar o MySQL da primeira vez.
Instalair um segundo daemon mysqld n˜o funciona quando um daemon
                                        a
            estiver em execu¸˜o.
                            ca
            Isto pode acontecer quando vocˆ j´ tiver uma instala¸˜o do MySQL existente,
                                           e a                  ca
            mas deseja colocar uma nova instala¸˜o em um diferente lugar (por exemplo,
                                                ca
            para testes, ou talvez vocˆ simplesmente deseja executar duas instala¸˜es ao
                                      e                                          co
116                                    MySQL Technical Reference for Version 5.0.0-alpha



            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
            Neste caso vocˆ ir´ obter a mensagem de erro: Can’t start server: Bind
                           e a
            on TCP/IP port: Address already in use ou Can’t start server: Bind on
            unix socket.... Veja Se¸˜o 4.2 [M´ltiplos servidores], P´gina 220.
                                    ca         u                    a
Vocˆ n˜o tem direito de escrita no diret´rio ‘/tmp’
   e a                                  o
           Se vocˆ n˜o tem direito de escrita para criar um arquivo socket no local padr˜o
                 e a                                                                    a
           (em ‘/tmp’) ou permiss˜o para criar arquivos tempor´ris em ‘/tmp,’ vocˆ ir´
                                   a                             a                    e a
           obter um erro quando executar mysql_install_db ou quando iniciar ou usar
           mysqld.
           Vocˆ pode especificar socket e diret´rio tempor´rio diferentes, como segue:
               e                                o          a
                 shell> TMPDIR=/algum_dir_tmp/
                 shell> MYSQL_UNIX_PORT=/algum_dir_tmp/mysqld.sock
                 shell> export TMPDIR MYSQL_UNIX_PORT
           Veja Se¸˜o A.4.5 [Problems with mysql.sock], P´gina 925.
                  ca                                       a
           ‘algum_dir_tmp’ deve ser o caminho para o mesmo diret´rio no qual vocˆ tem
                                                                    o                e
           permiss˜o de escrita. Veja Apˆndice E [Environment variables], P´gina 1083.
                   a                      e                                  a
           Depois disto vocˆ deve estar apto para executar mysql_install_db e iniciar o
                            e
           servidor com estes comandos:
                 shell> scripts/mysql_install_db
                 shell> BINDIR/mysqld_safe &
mysqld falha imediatamente
           Se vocˆ estiver executando RedHat Vers˜o 5.0 com uma vers˜o de glibc an-
                  e                                 a                    a
           terior a 2.0.7-5 vocˆ deve ter certeza que vocˆ instalou todos os patches para
                               e                         e
           a glibc! Existe muita informa¸˜o sobre isto nos arquivos das listas de men-
                                            ca
           sagens do MySQL. Links para os arquivos de correio est˜o dispon´
                                                                     a         iveis online
           em http://lists.mysql.com/. Veja tamb´m Se¸˜o 2.6.2 [Linux], P´gina 137.
                                                       e     ca                 a
           Vocˆ pode tamb´m iniciar o mysqld manualmente usando a op¸˜o --skip-
               e             e                                              ca
           grant-tables e adicionar a informa¸ao de privil´gios usando o mysql:
                                                c˜          e
                  shell> BINDIR/mysqld_safe --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
           reload ap´s dizer ao servidor para recarregar as tabelas de permiss˜es.
                      o                                                         o

2.4.2 Problemas Inicializando o Servidor MySQL

Se vocˆ for usar tabelas que suportem transa¸˜es (BDB, InnoDB), primeiro deve-se criar
      e                                        co
um arquivo my.cnf e configurar op¸˜es de inicializa¸˜o para os tipos de tabelas que vocˆ
                                    co                ca                              e
planeja usar. Veja Cap´ “ptexi tulo 7 [Table types], P´gina 629.
                                                      a
Geralmente, vocˆ inicia o servidor mysqld de uma das trˆs maneiras:
                e                                         e
  • Invocando mysql.server. Este script ´ usado primariamente na inicializa¸˜o e final-
                                             e                               ca
    iza¸˜o do sistema, e ´ descrito de forma mais completa em Se¸˜o 2.4.3 [Automatic
       ca                  e                                        ca
    start], P´gina 118.
             a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                   117



 • Invocando mysqld_safe, que tenta determinar as op¸˜es apropriadas para mysqld e
                                                         co
   ent˜o execut´-lo com estas op¸˜es. Veja Se¸˜o 4.8.2 [mysqld_safe], P´gina 332.
      a        a                co           ca                        a
 • Para o Windows NT/2000/XP, veja Se¸˜o 2.1.1.7 [NT start], P´gina 66.
                                     ca                       a
 • Invocando o mysqld diretamente.
                                                   o               o             ´
Quando o daemon mysqld inicia, ele altera o diret´rio para o diret´rio de dados. E neste
diret´rio que ele espera gravar arquivos de log e o arquivo pid (com o ID do processo) e
     o
onde ele espera encontrar os bancos de dados.
A localiza¸˜o do diret´rio de dados ´ especificada quando a distribui¸˜o ´ compilada. En-
           ca          o            e                               ca e
tretanto, se o mysqld espera encontrar o diret´rio de dados em lugar diferente de onde ele
                                              o
realmente est´ no seu sistema, ele n˜o funcionar´ corretamente. Se vocˆ tiver problemas
              a                     a            a                      e
com caminhos incorretos vocˆ pode encontrar quais op¸˜es o mysqld permite e quais s˜o
                             e                          co                             a
as configura¸˜es do caminho padr˜o chamando o mysqld com a op¸˜o --help. Vocˆ pode
             co                   a                               ca               e
sobrescrever os padr˜es especificando os caminhos corretos como argumentos de linha de
                     o
comando ao mysqld. (Estas op¸˜es tamb´m podem ser usadas com o mysqld_safe).
                               co        e
Normalmente vocˆ precisaria indicar ao mysqld somente o diret´rio base sob o qual o
                 e                                              o
MySQL ´ instalado. Vocˆ pode fazer isso usando a op¸˜o --basedir. Vocˆ pode tamb´m
        e               e                           ca                 e          e
usar --help para conferir o efeito das ope¸˜es para se alterar o caminho (perceba que
                                          co
--help deve ser a op¸˜o final do comando mysqld. Por exemplo:
                    ca
      shell> EXECDIR/mysqld --basedir=/usr/local --help
Uma vez que vocˆ determina as configura¸˜es de caminho que vocˆ deseja, inicie o servidor
               e                      co                     e
sem a op¸˜o --help.
        ca
Qualquer que tenha sido o m´todo utilizado para iniciar o servidor, se houver falha
                                 e
na inicializa¸˜o, confira o arquivo de log para ver se vocˆ pode entender o porquˆ.
             ca                                              e                       e
Arquivos log est˜o localizados no diret´rio dados (normalmente ‘/usr/local/mysql/data’
                a                      o
para uma distribui¸˜o bin´ria, ‘/usr/local/var’ para uma distribui¸˜o fonte,
                      ca       a                                            ca
‘mysqldatamysql.err’ no Windows.) Procure no diret´rio de dados por arquivos com
                                                          o
nomes no formato ‘nome_maquina.err’ e ‘nome_maquina.log’ onde nome_maquina ´ o     e
nome do servidor. Ent˜o confira as ultimas linhas destes arquivos:
                       a            ´
      shell> tail nome_maquina.err
      shell> tail nome_maquina.log
Se vocˆ encontrar algo como o seguinte no arquivo log:
      e
      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
Significa que vocˆ n˜o inicializou o mysqld com --bdb-no-recover e o Berkeley DB encon-
                e a
trou algo errado com seus arquivos log quando ele tentou recuperar seus bancos de dados.
Para poder continuar, vocˆ deve mover o antigo arquivo log Berkeley DB do diret´rio do
                           e                                                     o
banco de dados para outro lugar, onde poder´ examin´-los posteriormente. Os arquivos log
                                             a      a
s˜o nomeados ‘log.0000000001’, onde o n´mero ir´ incrementar com o tempo.
 a                                         u      a
Se vocˆ estiver executando o mysqld com suporte a tabelas BDB e o mysqld falhar no
        e
in´
  icio, pode ser devido a alguns problemas com o arquivo de recupera¸˜o BDB. Neste caso
                                                                         ca
vocˆ pode tentar iniciar o mysqld com --bdb-no-recover. Se isto ajudar, ent˜o vocˆ pode
    e                                                                           a     e
remover todos os arquivos ‘log.*’ do diret´rio de dados e tentar iniciar o mysqld novamente.
                                          o
118                                    MySQL Technical Reference for Version 5.0.0-alpha



Se vocˆ obter o seguinte erro, significa que algum outro programa (ou outro servidor mysqld)
       e
j´ est´ usando a porta TCP/IP ou socket mysqld est´ tentando usar:
 a    a                                                a
      Can’t start server: Bind on TCP/IP port: Address already in use
        ou
      Can’t start server: Bind on unix socket...
Use ps para ter certeza que vocˆ n˜o tem outro servidor mysqld em execu¸˜o. Se vocˆ
                                 e a                                          ca       e
n˜o consegue encontrar outro servidor, vocˆ pode tentar executar o comando telnet sua_
 a                                         e
maquina numero_porta_tcp-ip e apertar ENTER v´rias vezes. Se vocˆ n˜o obter uma
                                                    a                     e a
mensagem como telnet: Unable to connect to remote host: Connection refused, algo
est´ usando a mesma porta TCP/IP que o mysqld est´ tentando usar. Veja Se¸˜o 2.4.1
   a                                                    a                        ca
[mysql install db], P´gina 115 e Se¸˜o 4.2 [Multiple servers], P´gina 220.
                     a             ca                           a
Se o mysqld est´ atualmente em execu¸˜o, vocˆ pode verificar as configura¸˜es que ele est´
                a                     ca      e                            co          a
usando executando este comando:
      shell> mysqladmin variables
ou
      shell> mysqladmin -h ’your-host-name’ variables
Se vocˆ obter o Errcode 13, que significa Permission denied, ao iniciar o mysqld isto
        e
significa que vocˆ n˜o pode ter o direito de leitura/cria¸˜o de arquivos no diret´rio do
                 e a                                        ca                       o
banco de dados ou log. Neste caso vocˆ tamb´m deve iniciar o mysqld como usu´rio root
                                       e       e                                   a
ou alterar a permiss˜o para os arquivos e diret´rios envolvidos para uqe vocˆ tenha o direito
                    a                          o                            e
de us´-los.
      a
Se o mysqld_safe inicia o servidor mas vocˆ n˜o consegue se conectar a ele, tenha certeza
                                          e a
que vocˆ tem uma entrada no arquivo ‘/etc/hosts’ que parece com isto:
       e
      127.0.0.1          localhost
Este problema s´ ocorre em sistemas que n˜o possuem uma biblioteca thread funcional e
                 o                          a
para o qual o MySQL deve estar configurado para usar MIT-pthreads.
Se vocˆ n˜o consegue iniciar o mysqld vocˆ pode tentar criar um arquivo para rastrea-
      e a                                   e
mento de erros (trace) para encontrar o problema. Veja Se¸˜o D.1.2 [Making trace files],
                                                            ca
P´gina 1071.
 a
Se vocˆ estiver utilizando tabelas InnoDB, procure pelas op¸˜es especificas de inicializa¸˜o
      e                                                    co                           ca
do InnoDB. Veja Se¸˜o 7.5.3 [InnoDB start], P´gina 643.
                     ca                       a
Se vocˆ estiver usando tabelas BDB (Berkeley DB), vocˆ deve se familiarizar com as difer-
       e                                               e
entes op¸˜es especificas de inicializa¸˜o do BDB. Se¸˜o 7.6.3 [BDB start], P´gina 696.
         co                          ca            ca                      a

2.4.3 Inicializando e parando o MySQL automaticamente.

Os scripts mysql.server e mysqld_safe podem ser usados para iniciar o servidor automati-
camente na inicializa¸˜o do sistema. mysql.server tamb´m pode ser usado para parar o
                     ca                               e
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
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                  119



mysql.server pode ser encontrado no diret´rio ‘share/mysql’ sob o diret´rio de instala¸˜o
                                         o                             o              ca
do MySQL ou no diret´rio ‘support-files’ da ´rvore fonte do MySQL.
                     o                         a
Note que se vocˆ usa o pacote RPM do Linux (MySQL-server-VERS~O.rpm), o script
                e                                                     A
mysql.server j´ estar´ instalada como ‘/etc/init.d/mysql’ - vocˆ n˜o precisa instal´-
              a      a                                            e a                  a
lo manualmente. Veja Se¸˜o 2.1.2 [Linux-RPM], P´gina 69 para mais informa¸˜es sobre
                        ca                        a                           co
pacotes RPM Linux.
No Mac OS X, vocˆ pode instalar um pacote do MySQL Startup Item separado para
                      e
habilitar a inicializa¸˜o autom´tica do MySQL no boot so sistema. Veja Se¸˜o 2.1.3 [Mac
                      ca       a                                         ca
OS X installation], P´gina 71 para maiores detalhes.
                       a
Antes do mysql.server iniciar o servidor, ele vai para o diret´rio de instala¸˜o do MySQL,
                                                              o              ca
e ent˜o chama o mysqld_safe. Vocˆ pode precisar editar o mysql.server se tiver uma dis-
     a                             e
tribui¸˜o bin´ria instalada em um local n˜o-padr˜o. Modifique-o para chamar o diret´rio
      ca     a                            a       a                                    o
(cd) apropriado antes de executar o safe_mysql. Se vocˆ deseja que o servidor seja ex-
                                                           e
ecutado com um usu´rio espec´
                      a        ifico, adicione uma linha user apropriada para o arquivo
‘/etc/my.cnf’, como ser´ visto posteriormente nesta se¸˜o.
                         a                              ca
mysql.server stop desliga o servidor MySQL enviando um sinal para ele. Vocˆ pode
                                                                          e
desligar o servidor manualmente executando mysqladmin shutdown.
Vocˆ precisa adicionar estes comandos start e stop nos lugares apropriados de seus arquivos
    e
‘/etc/rc.*’ quando vocˆ quiser iniciar o MySQL automaticamente no seu servidor.
                         e
On most current Linux distributions, it is sufficient to copy the file mysql.server into the
‘/etc/init.d’ directory (or ‘/etc/rc.d/init.d’ on older Red Hat systems). Afterwards,
run the following command to enable the startup of MySQL on system bootup:
      shell> chkconfig --add mysql.server
No FreeBSD o script de inicializa¸˜o normalmente deve ir no diret´rio
                                         ca                                      o
‘/usr/local/etc/rc.d/’.     A p´gina do manual rc(8) tamb´m diz que os scripts
                                a                             e
neste diret´rio s´ s˜o executados, se o seu nome de base corresponder padr˜o global
             o    o a                                                       a
da sheel *.sh. Qualquer outro arquivo ou diret´rio presente dentro do diret´rio s˜o
                                                 o                            o    a
silenciosamente ignorados. Em outra palavras, no FreeBSD vocˆ deve instalar o arquivo
                                                            e
‘mysql.server’ como ‘/usr/local/etc/rc.d/mysql.server.sh’ para habilitar a
inicializa¸˜o autom´tica.
          ca       a
Como uma alternativa para o exposto acima, alguns sistemas operacionais tamb´m usam
                                                                               e
‘/etc/rc.local’ ou ‘/etc/init.d/boot.local’ para inicializar servi¸os adicionais durante
                                                                  c
o boot. Para iniciar o MySQL usando este m´todo, vocˆ poderia poderia adicionar algo
                                           e          e
como o seguinte a ele:
      /bin/sh -c ’cd /usr/local/mysql; ./bin/mysqld_safe --user=mysql &’
Vocˆ tamb´m pode adicionar op¸˜es para mysql.server em um arquivo global
    e     e                        co
‘/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

      [mysql.server]
120                                    MySQL Technical Reference for Version 5.0.0-alpha



       basedir=/usr/local/mysql
O script mysql.server entende as seguintes op¸˜es: datadir, basedir e pid-file.
                                                co
A seguinte tabela mostra quais grupos de op¸˜es cada script de inicializa¸˜o lˆ dos arquivos
                                            co                           ca e
de op¸˜es:
      co
Script           Grupos de op¸˜es
                              co
mysqld           [mysqld], [server] e [mysqld-major-version]
mysql.server [mysql.server], [mysqld], e [server]
mysqld_safe [mysql.server], [mysqld], e [server]
Para compatibilidade com vers˜es anteriores, o mysql.server tamb´m lˆ o grupo [mysql_
                                o                                   e e
server] e mysqld_safe tamb´m lˆ o grupo [safe_mysqld]. No entanto, vocˆ deve atu-
                               e e                                               e
alizar os seus arquivos de op¸˜es para usar os grupos [mysql.server] e [mysqld_safe].
                             co
Veja Se¸˜o 4.1.2 [Arquivos de Op¸˜es], P´gina 217.
        ca                        co     a

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

2.5.1 Atualizando da Vers˜o 4.0 para 4.1
                         a

Varias comportamentos vis´    iveis foram alteradas entre o MySQL 4.0 e o MySQL 4.1 para
corrigir erros cr´
                 iticos e tornar o MySQL mais compat´ com o padr˜o ANSI SQL. Estas
                                                         ivel         a
altera¸˜es podem afetar ` sua aplica¸˜o.
      co                   a            ca
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                  121



Alguns dos comportamentos do MySQL 4.1 no 4.0 podem ser testados antes de realizar uma
atualiza¸˜o completa para a vers˜o 4.1, adicionamos `s ultimas distribui¸˜es do MySQL 4.0
        ca                       a                   a ´                co
(a paritr da 4.0.12) a op¸˜o de inicializa¸˜o --new para o mysqld.
                         ca               ca
Esta op¸˜o lhe d´ o comportamento da vers˜o 4.1 para as altera¸˜es mais cr´
        ca        a                            a                   co          iticas. Vocˆ
                                                                                          e
tamb´m pode habilitar estes comportamentos para a conex˜o de uma determinado cliente
     e                                                      a
com o comando SET @@new=1, ou desabilit´-lo se ele for iniciado com SET @@new=0.
                                            a
Se vocˆ acredita que algumas das altera¸˜es da vers˜o 4.1 o afetar˜o, recomendamos que
       e                                   co          a             a
antes de atualizar para a vers˜o 4.1, vocˆ fa¸a o download da ultima distribui¸˜o do MySQL
                              a          e c                  ´               ca
4.0 e o execute com a op¸˜o --new adicionando o seguinte ao seu arquivo de configura¸˜o:
                          ca                                                           ca
      [mysqld-4.0]
      new
Deste modo vocˆ pode testar o novo comportamento com seus aplicativos na vers˜o 4.0 para
                 e                                                            a
certificar-se que eles funcionam. Isto o ajudar´ a ter uma transi¸˜o suave quando realizar
                                              a                 ca
uma atualiza¸˜o completa do MySQL 4.1. Fazendo isto do modo acima ir´ assegurar que
              ca                                                          a
vocˆ n˜o execute acidentalemte a vers˜o 4.1 com a op¸˜o --new mais tarde.
   e a                                a               ca
A seguinte lista descreve altera¸˜es que podem afetar aplica¸˜es e que vocˆ deve observar
                                co                          co            e
ao atualizar para a vers˜o 4.1:
                        a
 • TIMESTAMP agora ´ retornado como uma string com o formato ’YYYY-MM-DD HH:MM:SS’.
                      e
   (A op¸˜o --new pode ser usada a partir da vers˜o 4.0.12 para fazer um servidor 4.0
          ca                                             a
   se comportar como 4.1 a este respeito.) Se vocˆ quiser tˆ-lo com um n´mero (como a
                                                       e       e          u
   Vers˜o 4.0 faz) deve-se adicionar +0 a coluna TIMESTAMP a eles:
        a
          mysql> SELECT ts_col + 0 FROM tbl_name;
   Tamanhos de display para TIMESTAMP n˜o s˜o mais suportados. Por exemplo, se vocˆ
                                              a a                                         e
   declarar um coluna como TIMESTAMP(10), o (10) ´ ignorado.
                                                           e
   Esta mudan¸a era necess´ria para compatibilidade com os padr˜es SQL. Em uma vers˜o
                c             a                                   o                     a
   futura. Em uma vers˜o futura, uma altera¸˜o adicional ser´ feita (compat´
                           a                        ca            a              ivel com
   vers˜es anteriores com esta muda¸a), permitindo que o tamanho do timestamp indique
        o                              c
   o n´mero desejado de d´
      u                      igitos de fra¸˜es de um segundo.
                                          co
 • Valores bin´rios (0xFFDF) agora s˜o assumidos como strings em vez de n´meros. Isto
                a                       a                                   u
   corrige o problema com conjunto de caracteres onde ´ conveniente colocar a string como
                                                             e
   um valor bin´rio. Com esta altera¸˜o vocˆ deve usar CAST() se vocˆ quiser comparar
                  a                      ca     e                       e
   valores bin´rios numericamente como inteiros:
               a
          SELECT CAST(0XFEFF AS UNSIGNED INTEGER) < CAST(0XFF AS UNSIGNED INTEGER)
   Se vocˆ n˜o usa CAST(), uma compara¸˜o lexicogr´fica da string ser´ feita:
          e a                                ca            a            a
          mysql> SELECT 0xFEFF < 0xFF;
                    -> 1
   Usando itens bin´rios em um contexto num´rico ou comparando-os usando o operador
                     a                            e
   = deve funcionar como antes. (A op¸˜o --new pode ser usado para fazer o servidor 4.0
                                          ca
   se comportar como 4.1 a partir da vers˜o 4.0.13.)
                                             a
 • Para fun¸˜es que produzem um valor DATE, DATETIME, ou TIME, o resultado retornado
             co
   para o cliente agora est´ corrigido para ter um tipo temporal. Por exemplo, no MySQL
                           a
   4.1, vocˆ tem este resultado:
            e
          mysql> SELECT CAST("2001-1-1" as DATETIME);
122                                     MySQL Technical Reference for Version 5.0.0-alpha



                  -> ’2001-01-01 00:00:00’
      No MySQL 4.0, o resultado ´ diferente:
                                  e
            mysql> SELECT CAST("2001-1-1" as DATETIME);
            -> ’2001-01-01’
 •    Valores DEFAULT n˜o podem mais ser especificado para colunas AUTO_INCREMENT (Na
                         a
      vers˜o 4.0, um valor DEFAULT ´ ignorado sem aviso, na 4.1 ocorre um erro).
          a                          e
 •    SERIALIZE n˜o ´ mais uma op¸˜o v´lida para sql_mode.
                    a e                  ca     a                       Deve-se usar SET
      TRANSACTION ISOLATION LEVEL SERIALIZABLE. SERIALIZE tamb´m n˜o ´ mais v´lido
                                                                      e   a e        a
      para a op¸˜o --sql-mode do mysqld. Use --transaction-isolation=SERIALIZABLE
                ca
 •    Todas tabelas e colunas strings agora tˆm um conjunto de caracter. Veja Cap´
                                              e                                    “ptexi
      tulo 9 [Charset], P´gina 707. A informa¸˜o do conjunto de caracteres ´ mostrada por
                         a                    ca                           e
      SHOW CREATE TABLE e mysqldump. (O MySQL vers˜o 4.0.6 e acima pode ler o novo
                                                         a
      arquivo dump; vers˜es mais antigas n˜o podem.)
                          o                 a
 •    O formato de defini¸˜o de tabela usado nos arquivos ‘.frm’ mudaram um pouco na
                           ca
      vers˜o 4.1. O MySQL 4.0.11 e adiante leˆm o novo formato ‘.frm’ diretamente, mas
          a                                      e
      vers˜es mais antigas n˜o podem. Se vocˆ precisa mover tabelas da vers˜o 4.1. para
          o                   a                 e                            a
      uma mais nova que a 4.0.11, vocˆ de usar mysqldump. Veja Se¸˜o 4.9.7 [mysqldump],
                                       e                            ca
      P´gina 362.
        a
 •    Se vocˆ estiver executando v´rios servidores na mesma m´quina Windows, vocˆ deve
             e                     a                           a                   e
      usar uma op¸˜o --shared_memory_base_name diferentes para cada m´quina
                   ca                                                     a
 •    A interface para agrupar fun¸˜es UDF alterou um pouco. Vocˆ deve agora declarar
                                    co                               e
      uma fun¸˜o xxx_clear() para cada fun¸˜o de agrupamento.
               ca                             ca
Em geral, atualizar para o MySQL 4.1 a partir de uma vers˜o mais nova do MySQL envolve
                                                            a
os serguintes passos:
  • Verifique na se¸˜o de altera¸˜es se houve alguma mudan¸a que pode afetar a sua
                     ca           co                             c
     aplica¸˜o.
           ca
  • Leia os novos itens da vers˜o 4.1 para ver quais itens interessantes que vocˆ pode usar
                                a                                               e
     na vers˜o 4.1. Veja Se¸˜o C.2 [Novidades na vers˜o 4.1.x], P´gina 948.
            a              ca                          a           a
  • Se vocˆ estiver executando o MySQL Server no Windows, veja tamb´m Se¸˜o 2.5.8
            e                                                                e     ca
     [Windows upgrading], P´gina 132.
                              a
  • Ap´s o upgrade, atualize a tabela de permiss˜es para gerar uma nova coluna Password
        o                                        o
     maior que ´ necess´ria para tratamento seguro de senhas. O procedimento usa mysql_
                 e      a
     fix_privilege_tables e est´ descrito em Se¸˜o 2.5.6 [Upgrading-grant-tables],
                                    a                   ca
     P´gina 130. Estrat´gias alternativas para tratamento de senhas depois de uma
      a                   e
     atualiza¸˜o est˜o descritos posteriormente nesta se¸˜o.
              ca    a                                    ca
O mecanismo de hashing da senha foi alterado na vers˜o 4.1 para fornecer maior seguran¸a,
                                                        a                                  c
mas ele pode causar problemas de compatibilidade se vocˆ ainda tiver clientes que usam a
                                                             e
                                      ´
biblioteca cliente 4.0 ou anterior. (E bastante indesej´vel que vocˆ tenha clientes 4.0 em
                                                         a            e
situa¸˜es onde o cliente conecta de uma m´quina remota que ainda n˜o tenha sido atualizada
     co                                    a                          a
para a vers˜o 4.1). A seguinte lista indica algumas estrat´gias poss´
           a                                               e        iveis de atualiza¸˜o. Elas
                                                                                     ca
representam o que se deve fazer para escolher se ter compatibilidade com clientes antigos e
ter maior seguran¸a.
                   c
  • N˜o atualizar para a vers˜o 4.1. Nenhum comportamento ser´ alterado, mas ´ claro
       a                        a                                     a                 e
     que vocˆ n˜o poder´ usar qualquer um dos novos recursos fornecido pelo protocolo
             e a          a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                123



   cliente/servidor da vers˜o 4.1. (O MySQL 4.1 tem um protocolo cliente/servidor ex-
                             a
   tendido que oferece tais recursos como instru¸˜es preparadas e conjuntos de m´ltiplos
                                                co                                u
   resultados.) Veja Se¸˜o 12.1.4 [C API Prepared statements], P´gina 824.
                         ca                                        a
 • Atualizar para a vers˜o 4.1 e executar o script mysql_fix_privilege_tables para
                           a
   aumentar a coluna Password na tabela user e assim poder guardar hashes de senhas
   longos. Mas execute o servidor com a op¸˜o --old-passwords para fornecer compati-
                                            ca
   bilidade com vers˜es anteriores que premitem que clientes pre-4.1 continuem a conectar
                     o
   em suas contas de hash curto. Eventualmente, quando todos os seus clientes estiverem
   atualizados para a vers˜o 4.1, vocˆ pode parar de usar a op¸˜o do servidor --old-
                             a         e                          ca
   passwords. Vocˆ tamb´m pode alterar as senhas em sua conta MySQL para usar o
                    e        e
   novo formato que ´ mais seguro.
                      e
 • Atualizar para vers˜o 4.1 e executar o script mysql_fix_privilege_tables para au-
                        a
   mentar a coluna Password na tabela user. Se vocˆ sabe que todos os clientes tamb´m
                                                     e                                e
   foram atualizados para a vers˜o 4.1, n˜o execute o servidor com a op¸˜o --old-
                                   a        a                                 ca
   passwords. Em vez disso, altere a senha em todas as contas existentes para que elas
   tenham o novo formato. Uma instala¸˜o pura da vers˜o 4.1 ´ o mais seguro.
                                         ca              a      e
Informa¸˜es adicionais sobre hashing de senha em rela¸˜o a autentica¸˜o no cliente e
        co                                              ca              ca
opera¸˜es de altera¸˜o de senha podem ser encontrados em Se¸˜o 4.3.11 [Password hashing],
     co            ca                                      ca
P´gina 246.
  a

2.5.2 Atualizando da Vers˜o 3.23 para 4.0
                         a

Em geral, o que vocˆ deve fazer ´ atualizar para a vers˜o 4.0 um vers˜o mais nova do
                    e            e                       a              a
MySQL:
 • Ap´s o upgrade, atualize a tabela de permiss˜es para adicionar novos privil´gios e
      o                                            o                              e
   recursos. O procedimento usa o script mysql_fix_privilege_tables e est´ descrito
                                                                               a
   em Se¸˜o 2.5.6 [Upgrading-grant-tables], P´gina 130.
         ca                                   a
 • Edite qualquer script de inicializa¸˜o ou arquivo de configura¸˜o para n˜o utilizar
                                      ca                            ca        a
   nenhuma das op¸˜es obsoletas listadas posteriormente nesta se¸˜o.
                    co                                            ca
 • Converta seua arquivos ISAM antigos para arquivos MyISAM com o comando: mysql_
   convert_table_format database. (Este ´ um script Perl; ele exige que o DBI esteja
                                             e
   instalado). Paa converter a tabela em um dado banco de dados, use este comando:
          shell> mysql_convert_table_format database db_name
   Note que ele deve ser usado apenas se vocˆ usar se todas as tabelas em um dado banco
                                            e
   de dados s˜o ISAM ou MyISAM. Para evitar a convers˜o de tabelas de outros tipos para
              a                                        a
   MyISAM, vocˆ pode listar explicitamente o nome de suas tabelas ISAM depois do nome
                e
   do banco de dados na linha de comando. Vocˆ tamb´m pode executar uma instru¸˜o
                                                 e      e                             ca
   ALTER TABLE table_name TYPE=MyISAM para cada tabela ISAM para convertˆ-la para
                                                                                e
   MyISAM.
   Para descobir o tipo de uma determinada tabela, use esta instru¸˜o:
                                                                    ca
          mysql> SHOW TABLE STATUS LIKE ’tbl_name’;
 • Certifique-se de que vocˆ n˜o tem nenhum cliente MySQL que utiliza bibliotecas com-
                           e a
   partilhadas (com o Perl DBD-mysql). Se vocˆ tiver, vocˆ deve recompil´-las j´ que
                                                 e           e              a       a
   as estruturas usadas em ‘libmysqlclient.so’ foram alteradas. O mesmo se aplica a
   outras interfaces MySQL, como Python MySQLdb.
124                                      MySQL Technical Reference for Version 5.0.0-alpha



O MySQL 4.0 funcionar´ mesmo se vocˆ n˜o fizer o acima, mas vocˆ n˜o poder´ usar os
                        a              e a                         e a       a
novos privil´gios de seguran¸a pois o MySQL 4.0 e vocˆ podem encontrar problemas ao
            e               c                          e
atualizar o MySQL para a vers˜o 4.1 ou mais nova. O formato do arquivo ISAM ainda
                                a
funciona no MySQL 4.0 mas est´ obsoleto e ser´ disabilitado (n˜o compilado por padr˜o)
                                a            a                a                    a
no MySQL 4.1. Em vez disso deve se usar tabelas MyISAM.
Clientes antigos devem funcionar com um servidor vers˜o 4.0 sem nenhum problema.
                                                     a
Mesmo se vocˆ fizer o indicado acima, vocˆ ainda pode voltar para o MySQL 3.23.52 ou
               e                           e
mais novo se vocˆ encontrar problemas com o MySQL da s´rie 4.0. Neste caso vocˆ deve
                 e                                           e                      e
                                                                         ´
usar o mysqldump para fazer um dump de qualquer tabela que use um indice full-text e
recarregar o arquivo de dump no servidor 3.23 (pois o 4.0 usa um novo formato para ´
                                                                                   indices
full-text).
A seguir est´ uma lista mais completa com o que deve ser observado para atualizar para a
            a
vers˜o 4.0;
    a
 • O MySQL 4.0 tem v´rios novos privil´gios na tabela mysql.user. Veja Se¸˜o 4.4.1
                            a                  e                                       ca
   [GRANT], P´gina 255.
              a
   Para fazer estes novos privil´gios funcionarem, deve se atualizar a tabela de permiss˜es.
                                  e                                                          o
   O procedimento est´ descrito em Se¸˜o 2.5.6 [Upgrading-grant-tables], P´gina 130. At´
                         a                 ca                                    a              e
   que este script esteja executando todos os usu´rios tˆm os privil´gios SHOW DATABASES,
                                                       a    e            e
   CREATE TEMPORARY TABLES e LOCK TABLES. Os privil´gios SUPER e EXECUTE tiram o seu
                                                            e
   valor de PROCESS. REPLICATION SLAVE e REPLICATION CLIENT tiram o seu valor de
   FILE.
   Se vocˆ tiver qualquer script que crie novos usu´rios, vocˆ pode querer alter´-los para
          e                                              a         e                  a
   usar os novos privil´gios. Se vocˆ n˜o est´ usando o comando GRANT nos scripts, este
                          e              e a      a
   ´ um bom momento para alterar os seus scripts e usar GRANT em vez de modificar a
   e
   tabela de permiss˜es diretamente.
                       o
   A partir da vers˜o 4.0.2 a op¸˜o --safe-show-database est´ obsoleta (e n˜o faz mais
                     a              ca                               a              a
   nada). Veja Se¸˜o 4.3.3 [Op¸˜es de privil´gio], P´gina 231.
                   ca              co            e        a
   Se vocˆ receber um erro Access denied para novos usu´rios na vers˜o 4.0.2, vocˆ deve
          e                                                      a           a            e
   verificar se vocˆ precisa de alguma das novas concess˜es que vocˆ n˜o precisava antes.
                   e                                          o           e a
   Em particular, vocˆ precisar´ REPLICATION SLAVE (em vez de FILE) para novos slaves.
                        e          a
 • ‘safe_mysqld’ ´ renomeado para ‘mysqld_safe’. Para compatibilidade com vers˜es
                    e                                                                         o
   anteriores, as distribui¸˜es bin´rias, ir˜o, por algum tempo, incluir safe_mysqld como
                             co       a       a
   um link simb´lico para mysqld_safe.
                 o
 • Suporte para InnoDB agora est´ inclu´ na distribui¸˜o bin´ria. Se vocˆ contruir o
                                        a      ido              ca     a           e
   MySQL a partir de um fonte, o InnoDB est´ configurado por padr˜o, Se vocˆ n˜o usar
                                                    a                      a         e a
   o InnoDB e quiser economizar mem´ria ao executar o servidor que possui suorte a
                                             o
   InnoDB habilitado, use a op¸˜o de inicializa¸˜o do servidor. Para compilar o MySQL
                                    ca                ca
   sem suporte ao InnoDB, execute configure com a op¸˜o --without-innodb.
                                                               ca
 • O parˆmetro de inicializa¸˜o myisam_max_extra_sort_file_size e myisam_max_
          a                       ca
   extra_sort_file_size s˜o dados agora em bytes. (eram dados em megabytes antes
                                a
   da vers˜o 4.0.3).
           a
   O lock de sistema externo dos arquivos MyISAM/ISAM agora est´ desligado por a
   padr˜o. Pode se lig´-los fazendo --external-locking. (Para a maioria dos usu´rios
        a                 a                                                                 a
   isto nunca ´ necess´rio).
               e         a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                125



 • A seguintes vari´veis/op¸˜es de inicializa¸ao foram renomeadas:
                   a         co               c
   Nome Antigo                                       Novo Nome.
   myisam_bulk_insert_tree_size                      bulk_insert_buffer_size
   query_cache_startup_type                          query_cache_type
   record_buffer                                     read_buffer_size
   record_rnd_buffer                                 read_rnd_buffer_size
   sort_buffer                                       sort_buffer_size
   warnings                                          log-warnings
   --err-log                                         --log-error (para mysqld_safe)
   As op¸˜es de inicializa¸˜o record_buffer, sort_buffer e warnings ainda funcionar˜o
          co              ca                                                           a
   no MySQL 4.0 mas est˜p obsoletas.
                           a
 • As seguintes veri´veis SQL mudaram o nome.
                     a
   Nome Antigo                                       Novo Nome.
   SQL_BIG_TABLES                                    BIG_TABLES
   SQL_LOW_PRIORITY_UPDATES                          LOW_PRIORITY_UPDATES
   SQL_MAX_JOIN_SIZE                                 MAX_JOIN_SIZE
   SQL_QUERY_CACHE_TYPE                              QUERY_CACHE_TYPE
   Os nomes antigos ainda funcionam no MySQL 4.0 mas est˜o obsoletos.
                                                              a
 • Vocˆ deve usar SET GLOBAL SQL_SLAVE_SKIP_COUNTER=# em vez de SET SQL_SLAVE_
        e
   SKIP_COUNTER=#.
 • As op¸˜es de inicializa¸˜o --skip-locking e --enable-locking foram renomeadas
          co               ca
   para --skip-external-locking e --external-locking.
 • SHOW MASTER STATUS agora retorna um conjunto vazio se o log bin´rio n˜o estiver ha-
                                                                       a     a
   bilitado.
 • SHOW SLAVE STATUS agora retorna um conjunto vazio se o slave n˜o est´ inicializado.
                                                                     a     a
 • O mysqld agora tem a op¸˜o --temp-pool habilitada por padr˜o j´ que isto da melhor
                              ca                                  a a
   rendimento com alguns SO (Principalmente no Linux).
 • Colunas DOUBLE e FLOAT agora respeitam o parˆmetro UNSIGNED no armazenamento
                                                      a
   (antes, UNSIGNED era ignortado por estas colunas).
 • ORDER BY coluna DESC ordena valores NULL por ultimo, como no MySQL 4.0.11. Na
                                                       ´
   vers˜o 3.23 e anteriores da vers˜o 4.0, isto nem sempre era consistente.
        a                           a
 • SHOW INDEX tem duas colunas a mais (Null e Index_type) que ele tinha nas vers˜es   o
   3.23.
 • CHECK, SIGNED, LOCALTIME e LOCALTIMESTAMP s˜o agora palavras reservadas.
                                                     a
 • O resultado de todos os operadores bitwise (|, &, <<, >> e ~) agora s˜o unsigned. Isto
                                                                         a
   pode causar problemas se vocˆ estiver usando-as em um contexto onde vocˆ quer um
                                  e                                             e
   resultado com sinal. Veja Se¸˜o 6.3.5 [Fun¸˜es de Convers˜o], P´gina 543.
                                 ca             co            a     a
 • Nota: quando vocˆ usa subtra¸˜o entre valores inteiros onde um deles ´ do tipo
                       e              ca                                        e
   UNSIGNED, o resultado ser´ sem sinal. Em oyras palavras, antes de atualizar para o
                               a
   MySQL 4.0, vocˆ deve verificar sua aplica¸˜o para os casos onde vocˆ est´ subtraindo
                    e                          ca                        e    a
   um valor de uma entidade sem sinal e quer um n´mero negativo como resposta ou sub-
                                                     u
   traindo um valor sem sinal de uma coluna do tipo inteiro. Vocˆ pode disabilitar este
                                                                   e
   comportamento usando a op¸˜o --sql-mode=NO_UNSIGNED_SUBTRACTION ao iniciar o
                                 ca
   mysqld. Veja Se¸˜o 6.3.5 [Fun¸˜es de convers˜o], P´gina 543.
                    ca             co              a     a
126                                   MySQL Technical Reference for Version 5.0.0-alpha



 • Para usar MATCH ... AGAINST (... IN BOOLEAN MODE) com suas tabelas, vocˆ precisa
                                                                                e
   recontru´  i-las com REPAIR TABLE nome_tabela USE_FRM.
 • LOCATE() e INSTR() s˜o caso sensitivo se um dos argumentos ´ uma string bin´ria. De
                             a                                   e               a
   outra forma elas s˜o caso-insensitivo.
                          a
 • STRCMP() agora usa o conjunto de caracteres atual ao fazer compara¸˜es, o que significa
                                                                      co
   que o comportamento padr˜o das compara¸˜es agora ´ caso-insensitivo.
                                a              co        e
 • HEX(string) agora retorna os caracteres na string convertidos para hexadecimal. Se
   vocˆ quiser converter um n´mero para hexadecimal, vocˆ deve se assugurar que vocˆ
       e                        u                           e                            e
   chama HEX() com um argumento num´rico.   e
 • Na vers˜o 3.23, INSERT INTO ... SELECT sempre tem o IGNORE habilitado. Na vers˜o
             a                                                                         a
                          a          ´
   4.0.1, o MySQL ir´ parar (e possivelmente fazer um roll back) por padr˜o no caso de
                                                                           a
   ‘mysqld_safe’ ser renomeado para ‘mysqld_safe’. Por algum tempo incluiremos em
   nossa distribui¸˜o bin´ria o mysqld_safe como um link simb´lico para mysqld_safe.
                      ca     a                                   o
 • um erro se vocˆ n˜o especificar IGNORE.
                      e a
 • As fun¸˜es antigas da API C mysql_drop_db(), mysql_create_db() e mysql_
             co
   connect() n˜o s˜ mais suportadas a menos que vocˆ compile o MySQL com
                     a     a                                  e
   CFLAGS=-DUSE_OLD_FUNCTIONS. No entanto, ´ preferivel
                                                  e     ´ alterar o cliente para utilizar
   a nova API 4.0.
 • Na estrutura MYSQL_FIELD, length e max_length foram alterados de unsigned int
   para unsigned long. Isto n˜o deve causar problemas, exceto que eles podem gerar
                                  a
   mensagens de avisos quando quando usado como argumento em uma classe printf()
   de fun¸˜es.
           co
 • Vocˆ deve usar TRUNCATE TABLE quando quiser deletar todos os registros de uma tabela
       e
   e vocˆ n˜o precisa obter uma contagen de quantas colunas forma deletadas. (DELETE
          e a
   FROM table_name retorna a contagem de linhas na vers˜o 4.0, e TRUNCATE TABLE ´ mais
                                                         a                         e
   r´pido.)
    a
 • Vocˆ receber´ um erro se tiver um LOCK TABLES ativo ou transa¸˜es ao tentar executar
       e            a                                              co
   TRUNCATE TABLE ou DROP DATABASE.
 • Vocˆ deve usar inteiros para armazenar valores em colunas BIGINT (em vez de usar
       e
   strings, como vocˆ fez no MySQL 3.23). Usar strings ainda funicona, mas usar inteiros
                         e
   ´ mais eficiente.
   e
 • O formato de SHOW OPEN TABLE alterou.
 • Clientes multi-thread devem usar mysql_thread_init() e mysql_thread_end(). Veja
   Se¸˜o 12.1.14 [Clientes em threads], P´gina 859.
      ca                                   a
 • Se vocˆ quiser recompilar o m´dulo Perl DBD::mysql, vocˆ deve conseguir o DBD-mysql
           e                      o                         e
   vers˜o 1.2218 ou mais novo porque os m´dulos DBD mais antigos usam a chamada
        a                                     o
   obsoleta mysql_drop_db(). A vers˜o 2.1022 ou mais nova ´ recomendada.
                                        a                      e
 • Na vers˜o RAND(seed) retorna uma s´rie de n´mero randˆmicas diferente que na 3.23;
             a                            e       u         o
   isto foi feito para uma diferencia¸˜o maior de RAND(seed) e RAND(seed+1).
                                     ca
 • O tipo padr˜o retornado por IFNULL(A,B) agora est´ configurado para ser o mais ’geral’
                  a                                   a
                                                  ´ ´ string, REAL ou INTEGER).
   dos tipos de A e B. (A ordem geral-para-especifco e
Se vocˆ estiver executando o MySQL Server no Windows, veja Se¸˜o 2.5.8 [Atualizando o
      e                                                        ca
Windows], P´gina 132. Se vocˆ estiver usando replica¸˜o, veja Se¸˜o 4.11.2 [Replication
             a                e                     ca          ca
Implementation], P´gina 380.
                   a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                   127



2.5.3 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ˆ
        a                                                                                  e
n˜o necessita converter suas antigas tabelas para us´-las com a vers˜o 3.23. Por padr˜o,
 a                                                   a                a                 a
todas novas tabelas ser˜o criadas usando o tipo MyISAM (a menos que vocˆ inicie o mysqld
                         a                                                e
com a op¸˜o --default-table-type=isam). Vocˆ pode converterr uma tabela ISAM para
            ca                                    e
uma formato MyISAM com ALTER TABLE nome_tabela TYPE=MyISAM ou com o script Perl
mysql_convert_table_format.
Os clientes vers˜es 3.22 e 3.21 ir˜o trabalhar sem quaisquer problemas com um servidor
                 o                a
vers˜o 3.23.
    a
As seguintes listas dizem o que vocˆ deve conferir quando atualizar para a vers˜o 3.23:
                                    e                                          a
  • 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
              e
    liga¸˜o e o banco de dados original ser˜o apagados. (Isto n˜o acontece na 3.22 porque
          ca                               a                     a
    o configure n˜o detecta a disponibilidade da chamada de sistema readlink).
                    a
  • OPTIMIZE TABLE agora funciona somente para tabelas MyISAM. Para outros tipos de
    tabelas, vocˆ pode usar ALTER TABLE para otimizar a tabela. Durante o OPTIMIZE
                  e
    TABLE a tabela ´, agora, bloqueada para prevenir que seja usada por outras threads.
                     e
  • O cliente MySQL mysql ´, agora, inicializado por padr˜o com a op¸˜o --no-named-
                              e                              a           ca
    commands (-g). Esta op¸˜o pode ser desabilitada com --enable-named-commands
                               ca
    (-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.
  • Fun¸˜es de data que funcionam em partes de datas (como MONTH()) n˜o retornar´ 0
          co                                                                a           a
    para datas 0000-00-00. (No MySQL 3.22 estas fun¸˜es retornam NULL.)
                                                         co
  • Se vocˆ estiver usando a ordem de classifica¸ao de caracteres alem~ para tabelas ISAM,
              e                                 c˜                     a
    vocˆ deve reparar todas suas tabelas com isamchk -r, porque foram feitas altera¸˜es
          e                                                                           co
    na sua ordem de classifica¸˜o!
                               ca
  • O tipo padr˜o de retorno de IF() ir´ agora depender de ambos argumentos e n˜o
                  a                        a                                             a
    apenas do primeiro argumento.
  • Colunas AUTO_INCREMENT n˜o devem ser usadas para armazenar n´meros negativos. A
                                a                                      u
    raz˜o para isto ´ que n´meros negativos causam problemas quando o -1 passa para 0.
         a           e      u
    Vocˆ n˜o deve armazenar 0 em uma coluna AUTO_INCREMENT tamb´m; CHECK TABLE ir´
          e a                                                          e                  a
    reclamar sobre valores 0 porque eles podem alterar se vocˆ fizer um dump e restaurar a
                                                              e
    tabela. AUTO_INCREMENT ´, agora, tratado em um n´ mais baixo para tabelas MyISAM
                              e                         ivel
    e ´ muito mais r´pido que antes. Para tabelas MyISAM n´meros antigos tamb´m n˜o
       e               a                                       u                   e     a
    s˜o mais reusados, mesmo se vocˆ apagar algumas linhas da tabela.
      a                               e
  • 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
    n´mero fixo de decimais.
      u
  • Quando estiver declarando colunas usando o tipo DECIMAL(tamanho,dec, o argumento
    tamanho n˜o inclui mais um lugar para o s´
                a                               imbolo do ponto decimal.
128                                    MySQL Technical Reference for Version 5.0.0-alpha



 • 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
                                                                        ca
   que o operador ’=’. Se vocˆ precisa do antigo compartamento, vocˆ pdoe compilar o
                              e                                         e
   MySQL com a op¸˜o CXXFLGAS=-DLIKE_CMP_TOUPPER.
                     ca
 • REGEXP agora ´ caso insensitivo se nenhuma das strings forem bin´rias.
                 e                                                   a
 • Quando for necess´rio dar manuten¸˜o ou reparar tabelas MyISAM ‘.MYI’ deve ser usado
                     a                ca
   a instru¸˜o CHECK TABLE ou o comando myisamchk. Para tabelas ISAM (.ISM), use o
           ca
   comando isamchk
 • Se desejar que os arquivos mysqldump sejam compat´   iveis entre as vers˜es 3.22 e 3.23
                                                                           o
   do MySQL, n˜o deve ser usados as op¸˜es --opt ou --full com o mysqldump.
                a                        co
 • Confira todas suas chamadas ` DATE_FORMAT() para ter certeza que exista um ‘%’ antes
                                a
   de cada caractere formatador. (Vers˜es mais antigas que o MySQL 3.22 aceitaivam esta
                                       o
   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
   fun¸˜o que obtem valores MYSQL_RES* como um argumento). Com um objeto MYSQL*
       ca
   agora voce deve usar 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´, em 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
                            a
   argumento.

2.5.4 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-
                                                              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
                          e a                                                  a
mysqld.
Depois de instalar o MySQL vers˜o 3.22, vocˆ deve iniciar o novo servidor e depois executar
                                 a           e
o script mysql_fix_privilege_tables. Isto adicionar´ os novos privil´gios que vocˆ pre-
                                                        a                e           e
cisar´ para usar o comando GRANT. Se vocˆ se esquecer disto, sera retornado o erro Access
     a                                     e
denied quando vocˆ tentar usar ALTER TABLE, CREATE INDEX ou DROP INDEX. O procedi-
                     e
mento para atualizar a tabela de permiss˜es est´ descrito em Se¸˜o 2.5.6 [Upgrading-grant-
                                         o     a                ca
tables], P´gina 130.
           a
A interface API C para mysql_real_connect() foi alterada. Se vocˆ tem um programa
                                                                       e
cliente antigo que chama essa fun¸˜o, vocˆ deve colocar um 0 para o novo argumento db (ou
                                 ca      e
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                 129



recodificar o cliente para enviar o elemento db para conex˜es mais r´pidas). Vocˆ tamb´m
                                                         o         a           e     e
deve chamar mysql_init() antes de chamar mysql_real_connect()! Esta altera¸˜o foi ca
feita para permitir ` nova fun¸˜o mysql_options() salvar op¸˜es na estrutura do manipu-
                    a         ca                            co
lador do MYSQL.
A vari´vel key_buffer do mysqld foi renomeada para key_buffer_size, mas vocˆ ainda
      a                                                                    e
pode usar o antigo nome nos seus arquivos de inicializa¸˜o.
                                                       ca

2.5.5 Atualizando da vers˜o 3.20 para 3.21
                         a

Se vocˆ estiver executando uma vers˜o mais antiga que a Vers˜o 3.20.28 e deseja mudar
      e                               a                     a
para a vers˜o 3.21 vocˆ deve fazer o seguinte:
           a          e
Inicie o servidor mysqld vers˜o 3.21 com a op¸˜o --old-protocol para us´-lo com clientes
                             a               ca                         a
de uma distribui¸˜o da vers˜o 3.20 Neste caso, a nova fun¸˜o cliente mysql_errno() n˜o
                  ca         a                           ca                           a
ir´ retornar erro do servidor, somente CR_UNKNOWN_ERROR (mas isto funciona para erros de
  a
clientes) e o servidor usa a forma fun¸˜o password() anterior a 3.21 para verifica¸˜o, ao
                                       ca                                        ca
inv´s do novo m´todo.
    e            e
Se vocˆ NAO
       e   ˜ estiver usando a op¸˜o --old-protocol para mysqld, vocˆ precisar´ fazer as
                                  ca                                  e        a
seguir altera¸˜es:
              co
 • 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 vers˜o do MySQL 3.20.28 e superiores podem manipular o novo formato da tabela de
      a
usu´rios sem afetar os clientes. Se vocˆ tem uma vers˜o do MySQL mais nova que 3.20.28,
   a                                   e              a
senhas n˜o ir˜o mais funcionar se vocˆ converter a tabela de usuaios. Por seguran¸a, vocˆ
        a a                          e                                           c      e
primeiro deve fazer uma atualiza¸˜o para a vers˜o 3.20.28, pelo menos, e ent˜o atualizar
                                  ca             a                           a
para a vers˜o 3.21.
           a
O novo c´digo cliente trabalha com um servidor mysqld 3.20.x, portanto se houver proble-
          o
mas com 3.21.x vocˆ deve usar o antigo servidor 3.20.x sem a necessidade de recompilar os
                    e
clientes novamente.
Se vocˆ n˜o est´ usando a op¸˜o --old-protocol para o mysqld, antigos clientes n˜o
      e a      a               ca                                               a
poder˜o se conectar e exibir˜o a seguinte mensagem de erro:
     a                      a
      ERROR: Protocol mismatch. Server Version = 10 Client Version = 9
A nova interface PERL DBI/DBD tamb´m suporta a antiga interface mysqlperl. A unica
                                         e                                           ´
altera¸˜o que deve ser feita se vocˆ usa o mysqlperl ´ alterar os argumentos para a fun¸˜o
      ca                           e                 e                                 ca
connect(). Os novos argumentos s˜o: host, database, user, password (note que os
                                       a
argumentos user e password foram alterados de lugar). Veja Se¸˜o 12.5.2 [Perl DBI Class],
                                                                 ca
P´gina 877.
  a
As seguintes altera¸˜es podem afetar consultas em antigas aplica¸˜es:
                   co                                           co
 • HAVING deve ser especificada antes de qualquer cl´usula ORDER BY.
                                                   a
130                                     MySQL Technical Reference for Version 5.0.0-alpha



 • 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.6 Atualizando a Tabela de Permiss˜es
                                     o

Algumas distribui¸˜es introduzem altera¸˜es a estrutura da tabelas de permiss˜es (a tabela
                 co                    co                                    o
no banco de dados mysql) para adicionar novos privil´gios ou recursos. Para ter certeza
                                                      e
de que as suas tabelas de permiss˜es est˜o corretas quando vocˆ atualizar para uma nova
                                 o      a                       e
vers˜o do MySQL, vocˆ deve atualizar a sua tabela de permiss˜o tamb´m.
    a                 e                                       a       e
Em sistemas Unix ou semelhantes, atualize a tabela de permiss˜es executando o script
                                                             o
mysql_fix_privilege_tables:
      shell> mysql_fix_privilege_tables
Vocˆ deve executar este script enquanto o servidor est´ em execu¸˜o. Ele tenta se conectar
    e                                                 a         ca
ao servidor na m´quina local como root. Se sua conta root exige uma senha, indique a
                 a
senha na linha de comando. Para o MySQL 4.1 e acima, especifique a senha assim:
      shell> mysql_fix_privilege_tables --password=senha_root
Antes do MySQL 4.1, especifique a senha desta forma:
      shell> mysql_fix_privilege_tables senha_root
O script realiza mysql_fix_privilege_tables qualquer a¸˜o necess´ria para converter sua
                                                         ca        a
tabela de permiss˜es para o formato atual. Vocˆ pode ver alguns avisos Duplicate column
                  o                           e
name, durante a execu¸˜o, eles podem ser ignorados.
                      ca
Depois de executar o script, pare o servidor e o reinicie.
No Windows, n˜o existe uma modo f´cil de se atualizar a tabela de permiss˜es at´ o MySQL
               a                    a                                    o     e
4.0.15. A partir desta vers˜o, as distribui¸˜es do MySQL incluem um script SQL mysql_
                           a               co
fix_privilege_tables.sql que vocˆ pode executar usando o cliente mysql. Se sua in-
                                      e
stala¸˜o do MySQL est´ localizada em ‘C:mysql’, o comando se parecer´ com este:
     ca                a                                                a
      C:mysqlbin> mysql -u root -p mysql

      mysql> SOURCE C:mysqlscriptsmysql_fix_privilege_tables.sql
Se sua instala¸˜o est´ localizada em algum outro diret´rio, ajuste o caminha apropriada-
              ca     a                                o
mente.
O comando ir´ lhe pedir a senha do root; digite-a quando pedido.
            a
Como no procedimento com o Unix, vocˆ pode ver alguns avisos Duplicate column name
                                        e
enquanto o mysql processa as instru¸˜es no script mysql_fix_privilege_tables.sql; eles
                                   co
podem ser ignorados.
Depois de executar o script, para o servidor e reinicie-o.

2.5.7 Atualizando para outra arquitetura

Se vocˆ estiver usando o MySQL Vers˜o 3.23, vocˆ pode copiar os arquivos .frm, .MYI
      e                               a            e
e .MYD para tabelas MyISAM entre diferentes arquiteturas que suportem o mesmo formato
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                131



de ponto flutuante. (O MySQL cuida de cada detalhe de troca de bytes.) Veja Se¸˜o 7.1
                                                                                  ca
[MyISAM Tables], P´gina 630.
                   a
Os arquivos ISAM de dados e ´indices (‘*.ISD’ e ‘*.ISM’ respectivamente) s˜o dependentes
                                                                          a
da arquitetura e em alguns casos dependentees do Sistema Operacional. Se vocˆ deseja
                                                                                 e
mover suas aplica¸˜es para outra m´quina que tem uma arquitetura ou SO diferentes da
                  co                a
sua m´quina atual, vocˆ n˜o deve tentar mover um banco de dados simplesmente copiando
      a                e a
os arquivos para a outra m´quina. Use o mysqldump.
                          a
Por padr˜o, o mysqldump ir´ criar um arquivo contendo declara¸˜es SQL. Vocˆ pode ent˜o
          a                 a                                 co            e        a
transferir o arquivo para a outra m´quina e aliment´-la como uma entrada para o cliente
                                   a               a
mysql.
Utilize mysqldump --help para ver quais op¸˜es est˜o dispon´
                                           co      a        iveis. Se vocˆ est´ movendo
                                                                         e    a
os dados para uma vers˜o mais nova do MySQL, vocˆ deve usar mysqldump --opt com a
                        a                           e
nova vers˜o para obter uma descarga r´pida e compacta.
          a                           a
A mais f´cil (mas n˜o a mais r´pida) forma para mover um banco de dados entre duas
        a          a           a
m´quinas ´ executar os seguintes comandos na m´quina em que o banco de dados se en-
  a       e                                   a
contra:
     shell> mysqladmin -h ’nome da outra maquina’ create nome_bd
     shell> mysqldump --opt nome_bd 
             | mysql -h ’nome da outra maquina’ nome_bd
Se vocˆ deseja copiar um banco de dados de um m´quina remota sobre uma rede lenta,
      e                                        a
pode ser usado:
     shell> mysqladmin create nome_bd
     shell> mysqldump -h ’nome de outra maquina’ --opt --compress nome_bd 
             | mysql nome_bd
O resultado pode tamb´m ser armazenado em um arquivo, depois transfira o arquivo para a
                       e
m´quina destino e carregue o arquivo no banco de dados. Por exemplo vocˆ pode descarregar
 a                                                                     e
um banco de dados para um arquivo na m´quina origem desta forma:
                                          a
     shell> mysqldump --quick nome_bd | gzip > nome_bd.contents.gz
(O arquivo criado neste exemplo est´ compactado.) Transfria o arquivo contendo o conte´do
                                   a                                                  u
do banco de dados para a m´quina destino e execute estes comandos:
                            a
     shell> mysqladmin create nome_bd
     shell> gunzip < nome_bd.contents.gz | mysql nome_bd
Tamb´m pode ser usado mysqldump e mysqlimport para ajudar na transferˆncia do banco de
     e                                                                   e
dados. Para grandes tabelas, isto ´ muito mais r´pido do que usar simplesmente mysqldump.
                                   e             a
Nos comandos abaixo, DUMPDIR representa o caminho completo do diret´rio que vocˆ utiliza
                                                                       o          e
para armazenar a sa´ de mysqldump.
                     ida
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
Depois transfira os arquivo no diret´rio DUMPDIR para algum diret´rio correspondente na
                                   o                            o
m´quina destino e carregue os arquivos no MySQL assim:
 a
     shell> mysqladmin create nome_bd                   # cria o banco de dados
     shell> cat DUMPDIR/*.sql | mysql nome_bd           # cria tabelas no banco de dados
132                                   MySQL Technical Reference for Version 5.0.0-alpha



      shell> mysqlimport nome_bd DUMPDIR/*.txt          # carrega dados nas tabelas
N˜o se esque¸a de copiar o banco de dados mysql tamb´m, porque ´ nele que as tabelas
  a          c                                         e         e
de permiss˜es (user, db e host) s˜o armazenadas. Vocˆ pode ter que executar comandos
          o                      a                   e
como o usu´rio root do MySQL na nova m´quina at´ que vocˆ tenha o banco de dados
           a                              a        e        e
mysql no lugar.
Depois de importar o banco de dados mysql para a nova m´quina, execute mysqladmin
                                                           a
flush-privileges para que o servidor recarregue as informa¸˜es das tabelas de permiss˜es.
                                                          co                         o

2.5.8 Atualizando o MySQL no Windows

Qaundo atualizar o MySQL no Windows, siga os passo abaixo:
 1. Fa¸a o download do ultima distribui¸˜o MySQL do Windows.
      c                ´               ca
 2. Escolha uma hora do dia com pouco uso, onde a parada para manuten¸˜o ´ aceit´vel.
                                                                     ca e       a
 3. Alerte os usu´rios que ainda est˜o ativos para sua parada de manuten¸˜o.
                 a                  a                                   ca
 4. Pare o Servidor MySQL em execu¸˜o (por exemplo, com NET STOP mysql ou com o
                                      ca
    utilit´rio de Servi¸os se vocˆ estiver exeutando MySQL como um servi¸o, ou com
          a            c         e                                      c
    mysqladmin shutdown).
 5. Finalize o programa WinMySQLAdmin se ele estiver em execu¸˜o.
                                                             ca
 6. Execute o script de instala¸˜o do arquivo de distribui¸˜o do Windows, clicando no
                               ca                         ca
    bot˜o "Install" no WinZip e seguindo os passos da instala¸˜o do script.
       a                                                     ca
 7. Vocˆ pode sobrescrever a sua instala¸˜o antiga do MySQL (normalmente em
        e                                    ca
    ‘C:mysql’), ou instal´-la em um diret´rio diferente, como C:mysql4. Sobrescrever a
                           a              o
    instala¸˜o antiga ´ o recomendado.
           ca         e
 8. Reinicie o servi¸o MySQL Server (por exemplo, com NET START mysql se vocˆ executar
                    c                                                       e
    o MySQL como um servi¸o, ou chamado o mysqld diretamente).
                            c
 9. Atualize a tabela de permiss˜es. O procedimento est´ descrito em Se¸˜o 2.5.6
                                   o                   a               ca
    [Upgrading-grant-tables], P´gina 130.
                               a
Situa¸˜es de erros poss´
     co                iveis:
      A system error has occurred.
      System error 1067 has occurred.
      The process terminated unexpectedly.
Este erro significa que seu arquivo ‘my.cnf’ (por padr˜o ‘C:my.cnf’) cont´m uma op¸˜o
                                                       a                   e          ca
que n˜o pode ser reconhecido pela MySQL. Vocˆ pode verificar que este ´ o caso tentando
      a                                          e                      e
reiniciar o MySQL com o arquivo ‘my.cnf’ renomeado, por exemplo, para ‘my_cnf.old’
para prevenirt o servidor de us´-lo. Uma vez verificado isto, vocˆ precisa identificar qual
                                a                                e
parˆmetro ´ o culpado. Crie um novo arquivo ‘my.cnf’ e mova as partes do arquivo antigo
    a       e
para ele (reiniciando o servidor depois de mover cada parte) at´ que vocˆ determine qual
                                                               e         e
op¸˜o est´ fazendo a inicializa¸˜o do servidor falhar.
   ca     a                    ca


2.6 Notas espec´
               ificas para os Sistemas Operacionais
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                    133



2.6.1 Notas Windows

Esta se¸˜o descreve assuntos espec´
       ca                         ificos para usar MySQL no Windows.

2.6.1.1 Conectando em um MySQL Rematamente a Windows
        Utilizando SSH

Aqui temos notas sobre como conectar a um servidor MySQL atrav´s de uma conex˜o
                                                                    e              a
remota e segura usando o SSH (por David Carlson dcarlson@mplcomm.com:
 1. Instale um cliente SSH na sua m´quina Windows. Como um usu´rio, o melhor op¸˜o
                                     a                             a              ca
    paga que encontrei ´ o SecureCRT da http://www.vandyke.com/. Outra op¸˜o ´ o f-
                         e                                                  ca e
    secure da http://www.f-secure.com/. Vocˆ tamb´m pode encontrar algumas vers˜es
                                                 e     e                          o
    livres no Google em http://directory.google.com/Top/Computers/Security/Products_
    and_Tools/Cryptography/SSH/Clients/Windows/.
 2. Inicie seu cliente SSH Windows. Configure Host_Name = IP_ou_Nome_servidormysql.
    Configure userid=seu_userid para logar no seu servidor. Este valor userid n˜o pode
                                                                              a
    ser o mesmo do nome do usu´rio se sua conta MySQL.
                                 a
 3. 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).
 4. Salve tudo, sen˜o vocˆ ter´ que refazer tudo da pr´xima vez.
                     a     e  a                       o
 5. Logue ao seu servidor com a sess˜o SSH que acabou de ser criada.
                                     a
 6. Na sua m´quina Windows, inicie algumas aplica¸˜es ODBC (como o Access).
               a                                    co
 7. Crie um novo arquivo no Windows e ligue ao MySQL usando o driver ODBC da mesma
    forma que vocˆ normalmente faz, EXCETO pelo fato de digitar localhost para a
                    e
    m´quina servidora MySQL — n˜o nomeservidormysql.
       a                            a
Vocˆ agora deve ter uma conex˜o ODBC ao MySQL, criptografada com SSH.
   e                         a

2.6.1.2 Distribuindo Dados Entre Diferentes Discos no Win32

A partir do MySQL vers˜o 3.23.16, o mysqld-max e servidores mysql-max-nt na distribui¸˜o
                       a                                                                 ca
MySQL s˜o compilados com a op¸˜o -DUSE_SYMDIR. Isto permite que vocˆ coloque um di-
          a                       ca                                      e
ret´rio de banco de dados em discos diferentes adicionando um link simb´lico para ele. (Isto
   o                                                                   o
´ parecido com o a com que links simb´licos funcionam no Unix, embora o procedimento
e                                        o
para configurar o link seja diferente).
No Windows, vocˆ cria um link simb´lico para um banco de dados MySQL criando um
                  e                    o
arquivo que contem o caminho para o diret´rio de destino. Salve o arquivo no diret´rio
                                             o                                          o
de dados usando o nome de arquivo ‘nome_bd.sym’, onde nome_bd ´ o nome do banco de
                                                                     e
dados.
Por exemplo, se o diret´rio de dados do MySQL ´ ‘C:mysqldata’ e vocˆ precisa
                          o                            e                         e
ter o banco de dados foo localizado em ‘D:datafoo’, vocˆ deve criar o arquivo
                                                                  e
‘C:mysqldatafoo.sym’ que contˆm o caminho D:datafoo. Depois disto, todas
                                     e
tabelas criadas no banco de dados foo ser˜o criadas no ‘D:datafoo’. O diret´rio
                                               a                                        o
‘D:datafoo’ deve existir para ele funcionar. Note tamb´m que o link simb´lico n˜o ser´
                                                          e                  o      a       a
134                                   MySQL Technical Reference for Version 5.0.0-alpha



usado se um diret´rio com o nome do banco de dados existe no diret´rio de dados MySQL.
                  o                                                  o
Isto significa que se vocˆ j´ tem um diret´rio de banco de dados chamado ‘foo’ no direorio
                         e a               o
de dados, vocˆ deve movˆ-lo para ‘D:data’ antes do link simb´lico ser efetivado. (Para
               e           e                                      o
evitar problemas, o servidor n˜o deve estar executando quando vocˆ mover o diret´rio do
                                a                                    e             o
banco de dados.)
Note que devido a penalidade que vocˆ tem na velocidade quando abre todas as tabelas,
                                        e
n´s n˜o habilitamos esta op¸˜o por padr˜o, mesmo se vocˆ compilar o MySQL com suporte
 o a                         ca           a               e
a isto. Para habilitar links simb´licos vocˆ deve colocar no seu arquivo my.cnf ou my.ini
                                  o         e
a seguinte entrada:
       [mysqld]
       symbolic-links
No MySQL 4.0 --simbolic-links est´ habilitado por padr˜o. Se vocˆ n˜o precisa us´-lo
                                        a                    a          e a           a
vocˆ pode usar a op¸˜o skip-symbolic-linkd.
    e                ca

2.6.1.3 Compilando clientes MySQL no Windows

Em seus arquivos fontes, vocˆ deve incluir ‘my_global.h’ antes de ‘mysql.h’:
                            e
       #include <my_global.h>
       #include <mysql.h>
‘my_global.h’ inclui qualquer outro arquivo necess´rio para compatibilidade de Windows
                                                   a
(como o ‘windows.h’) se o arquivo ´ compilado no Windows.
                                  e
Vocˆ tamb´m pode ligar seu c´digo coma biblioteca dinˆmica ‘libmysq.lib’, que ´ apenas
    e      e                  o                       a                        e
um wrapper para carregar em ‘libmysql.dll’ sobre demanda, ou ligar com a biblioteca
est´tica ‘mysqlclient.lib’.
   a
Perceba que como as bibliotecas clientes do MySQL s˜o compiladas como bibliotecas
                                                        a
threaded, vocˆ tamb´m deve compilar seu c´digo para ser multi-threaded!
              e     e                       o

2.6.1.4 MySQL para Windows Comparado com o MySQL para
        Unix

O MySQL para Windows tem provado ser muito est´vel. Esta vers˜o do MySQL tem os
                                                  a              a
mesmos recursos que sua vers˜o correspondente Unix com as seguintes exce¸˜es:
                            a                                           co
Win95 e threads
           O Win95 perde aproximadamente 200 bytes de mem´ria principal para cada
                                                             o
           thread criada. Cada conex˜o no MySQL cria uma nova thread, portanto vocˆ
                                    a                                                e
           n˜o deve executar o mysqld por um longo tempo no Win95 se seu servidor lida
            a
           com v´rias conex˜es! WinNT e Win98 n˜o sofrem deste bug.
                 a         o                     a
Leituras simultˆneas
               a
            O MySQL depende das chamadas pread() e pwrite() para estar apto a
            misturar INSERT e SELECT. Atualmente n´s usamos mutexes para emular
                                                      o
            pread()/pwrite(). N´s iremos, a longo prazo, trocar o n´ da interface de
                                o                                  ivel
            arquivos com uma interface virtual para que n´s possamos usar a interface
                                                         o
            readfile()/writefile() no NT/2000/XP para obter mais velocidade. A
            implementa¸˜o atual limita o n´mero de arquivos abertos que o MySQL
                       ca                  u
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                              135



           pode usar para 1024, o que significa que vocˆ n˜o conseguir´ executar tantas
                                                      e a            a
           threads simultˆneas no NT/2000/XP como no Unix.
                         a
Leitura de blocos
            O MySQL usa uma leitura de blocos para cada conex˜o, que tem as seguintes
                                                               a
            implica¸˜es:
                   co
              • Uma conex˜o n˜o ir´ ser disconectada automaticamente depois de 8 horas,
                          a a a
                como acontece com a vers˜o Unix do MySQL.
                                         a
              • 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
              • mysqladmin shutdown n˜o pode abortar enquanto existirem conex˜es
                                        a                                           o
                adormecidas.
           Planejamos corrigir este problema quando nossos desenvolvedores Windows
           tiverem conseguido um boa solu¸˜o.
                                          ca
DROP DATABASE
          Vocˆ n˜o pode remover um banco de dados que est´ em uso por alguma thread.
              e a                                        a
Matando o MySQL do gerenciador de tarefas
          Vocˆ n˜o pode matar o MySQL do gerenciador de tarefas ou com o utilit´rio
             e a                                                               a
          shutdown no Win95. Vocˆ deve deslig´-lo com mysqladmin shutdown.
                                e            a
Nomes case-insensitivo
           Nomes de arquivos n˜o s˜o caso sensitivo no Windows, portanto, nomes de
                                  a a
           bancos de dados e tabelas do MySQL tamb´m n˜o s˜o caso sensitivo no Win-
                                                    e   a a
           dows. A unica restri¸˜o ´ que os nomes de bancos de dados e tabelas devem
                      ´          ca e
           usar o mesmo caso em uma senten¸a fornecida. Veja Se¸˜o 6.1.3 [Name case
                                             c                  ca
           sensitivity], P´gina 473.
                          a
O caracter de diret´rio ‘’
                   o
            Componentes de nomes de caminho no Win95 s˜o separados pelo caracter ‘’ o
                                                        a
            qual tamb´m ´ o caractere de escape no MySQL. Se vocˆ estiver usando LOAD
                      e e                                        e
            DATA INFILE ou SELECT ... INTO OUTFILE, use nomes de arquivo no estilo Unix
            com caracteres ‘/’:
                  mysql> LOAD DATA INFILE "C:/tmp/skr.txt" INTO TABLE skr;
                  mysql> SELECT * INTO OUTFILE ’C:/tmp/skr.txt’ FROM skr;
            Uma alternativa ´ dobrar o caracter ‘/’:
                             e
                  mysql> LOAD DATA INFILE "C:tmpskr.txt" INTO TABLE skr;
                  mysql> SELECT * INTO OUTFILE ’C:tmpskr.txt’ FROM skr;
Problems with pipes.
          Pipes n˜o funcionam com confian¸a na linha de comando do Windows. Se o
                   a                        c
          pipe incluir o caracter ^Z / CHAR(24), o Windows achar´ que ele encontrou o
                                                                 a
          fim de um arquivo e abortar´ o programa.
                                       a
          Isto ´ um problma principalmente quando se tenta aplicar um log bin´rio como
               e                                                             a
          a seguir:
                 mysqlbinlog binary-log-name | mysql --user=root
          Se vocˆ obter um problema aplicando o log e suspeitar que seja devido a um
                 e
          caracter ^Z/CHAR(24) vocˆ pode usar a seguinte alternativa:
                                     e
136                                    MySQL Technical Reference for Version 5.0.0-alpha



                   mysqlbinlog binary-log-file --result-file=/tmp/bin.sql
                   mysql --user=root --eexecute "source /tmp/bin.sql"
             O ultimo comando pode tamb´m ser usado para leitura em qualquer arquivo
                ´                          e
             sql que contenha dados bin´rios.
                                       a
erro: Can’t open named pipe
           Se vocˆ utiliza um servidor MySQL vers˜o 3.22 no NT com o os programas
                   e                                  a
           clientes MySQL mais novos, ser´ apresentado o seguinte erro:
                                           a
                  error 2017: can’t open named pipe to host: . pipe...
           Isto ocorre porque a vers˜o do MySQL usa named pipes no NT por padr˜o.
                                      a                                                a
           Vocˆ pode evitar este erro usando a op¸˜o --host=localhost para os novos
               e                                    ca
           clientes MySQL ou criar um arquivo de op¸˜es ‘c:my.cnf’ que contenha a
                                                        co
           seguinte informa¸˜o:
                            ca
                  [client]
                  host = localhost
           A partir da vers˜o 3.23.50, named pipes s˜o habilitados somente se o mysqld-nt
                           a                        a
           ou mysqld-nt-max for iniciado com a op¸˜o --enable-name-pipe.
                                                    ca
Erro Access denied for user
           Se vocˆ tenta executar um programa cliente MySQL para conectar a um servi-
                 e
           dor em execu¸˜o na mesma m´quina, nas obtem o erro Access denied for
                          ca                 a
           user: ’some-user@unknown’ to database ’mysql’ quando acessar um servi-
           dor MySQL na mesma m´quina, signifca que o MySQL n˜o pode resolver seu
                                      a                              a
           nome de m´quina corretamente.
                      a
           Para corrigir isto, vocˆ deve criar um arquivo ‘Windowshosts’ com a seguinte
                                  e
           informa¸˜o:
                   ca
                 127.0.0.1            localhost
ALTER TABLE
          Enquanto vocˆ est´ executando uma instru¸˜o ALTER TABLE, a tabela est´ blo-
                       e    a                       ca                             a
          queada para ser usado por outras threads. Isto ocorre devido ao fato de que no
          Windows, vocˆ n˜o pode deletar um aruivo que est´ em uso por outra threads.
                       e a                                  a
          No futuro, podemos encontrar algum modo de contornarmos este problema.
DROP TABLE
             DROP TABLE em uma tabela que est´ em uso por uma tabela MERGE n˜o fun-
                                                  a                                  a
             cionar´ no Windows porque o manipulador do MERGE faz o mapeamento da
                   a
             tabela escondido da camada superior do MySQL. Como o Windows n˜o per-   a
             mite que vocˆ delete arquivos que est˜o abertos, vocˆ primeiro deve descarregar
                          e                       a              e
             todas as tabelas MERGE (com FLUSH TABLES) ou apagar a tabela MERGE antes de
             deletar a tabela. Corrigiremos isto assim que introduzirmos views.
DATA DIRECTORY e INDEX DIRECTORY
          As op¸˜es DATA DIRECTORY e INDEX DIRECTORY para CREATE TABLE s˜o igno-
                co                                                      a
          radas no Windows, porque ele n˜o suporta links simb´licos.
                                        a                    o
Aqui est˜o alguns assuntos em aberto para qualquer um que queira melhorar o MySQL no
        a
Windows:
 • Adicionar alguns ´ icones agrad´veis para o start e shutdown na instala¸˜o do MySQL.
                                  a                                       ca
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                    137



 • 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
   mysqldump) seria ´timo.
                    o
 • 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.
 • Adicionar macros para usar os m´todos mais r´pidos de incremento/decremento de
                                     e         a
   threads seguras fornecidos pelo Windows.

2.6.2 Notas Linux (Todas as vers˜es)
                                o

As notas abaixo a respeito da glibc aplicam-se somente na situa¸˜o quando o MySQL ´
                                                                   ca                       e
construido por vocˆ mesmo. Se vocˆ est´ executando Linux em uma m´quina x86, na
                    e                 e    a                                a
maioria dos casos ´ muito melhor para vocˆ usar nosso bin´rio. N´s ligamos nossos bin´rios
                  e                       e                a     o                     a
com a melhor vers˜o alterada da glibc, podemos escolher as melhores op¸˜es do compilador,
                  a                                                     co
em uma tentativa de torn´-la funcional para um servidor muito exigido. Para um usu´rio
                           a                                                            a
comum, mesmo para configura¸˜es com v´rias conex˜es concorrentes e/ou tabelas excedendo
                              co        a           o
o limite de 2 GB, nosso bin´rio ´, na maioria das vezes, a melhor escolha. Portanto se vocˆ
                             a e                                                            e
ler o texto abaixo, e est´ em d´vida sobre o que deve fazer, tente usar o nosso bin´rio
                          a      u                                                      a
primeiro para ver se ele preenche suas necessidades, e preocupe-se com uma constru¸˜o    ca
pr´pria apenas se vocˆ descobrir que nosso bin´rio n˜o ´ bom o suficiente para vocˆ. Neste
   o                  e                        a     a e                           e
caso, ir´
        iamos apreciar se fosse feito uma observa¸˜o sobre isto, para que possamos fazer
                                                  ca
uma melhor vers˜o bin´ris da pr´xima vez.
                a       a        o
O MySQL usa LinuxThreads no Linux. Se vocˆ usa uma vers˜o do Linux que n˜o tenha
                                              e              a               a
a glibc2, vocˆ deve instalar LinuxThreads antes de tentar compilar o MySQL. Vocˆ pode
             e                                                                 e
obter o LinuxThreads em http://www.mysql.com/downloads/os-linux.html.
NOTA: Temos visto alguns problemas estranhos com o Linux 2.2.14 e MySQL em sistemas
SMP; Se vocˆ tem um sistema SMP, recomendamos a atualiza¸˜o para o Linux 2.4! Seu
            e                                              ca
sistema ficar´ mais r´pido e mais est´vel.
            a       a               a
Perceba que as vers˜es da glibc iguais ou anteriores ` Vers˜o 2.1.1 tem um bug fatal no
                   o                                 a     a
tratamento do pthread_mutex_timedwait, que ´ usado quando vocˆ executar instru¸˜es
                                               e                    e              co
INSERT DELAYED. Recomendamos n˜o usar INSERT DELAYED antes de atualizar a glibc.
                                  a
Se vocˆ planeja ter mais de 1000 conex˜es simultˆneas, ser´ necess´rio fazer algumas
       e                                 o         a         a     a
altera¸˜es na LinuxThreads, recompile-a e religue o MySQL ao novo ‘libpthread.a’.
      co
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
caminhos s˜o relativos ` raiz da glibc. Note que o MySQL n˜o ser´ est´vel com cerca de
           a           a                                    a   a    a
600-1000 conex˜es se o valor de STACK_SIZE for o padr˜o de 2MB.
              o                                      a
Se vocˆ tiver um problema com o MySQL, no qual ele n˜o consiga abrir v´rios arquivos ou
      e                                             a                 a
conex˜es, pode ser que vocˆ n˜o tenha configurado o Linux para lidar com o n´mero de
     o                    e a                                                 u
arquivos suficiente.
No Linux 2.2 e posteriores, vocˆ pode conferir o valor para a aloca¸˜o dos arquivos fazendo:
                               e                                   ca
138                                    MySQL Technical Reference for Version 5.0.0-alpha



        cat /proc/sys/fs/file-max
        cat /proc/sys/fs/dquot-max
        cat /proc/sys/fs/super-max
Se vocˆ possui mais de 16M de mem´ria, deve ser adicionado o seguinte no seu script de
        e                               o
boot (ex. ‘/etc/rc/boot.local’ no SuSE Linux):
        echo 65536 > /proc/sys/fs/file-max
        echo 8192 > /proc/sys/fs/dquot-max
        echo 1024 > /proc/sys/fs/super-max
Vocˆ tamb´m pode executar os comandos acima da linha de comando como root, mas
     e       e
neste caso, os antigos limites voltar˜o a ser usados na pr´xima vez que o computador for
                                     a                       o
reiniciado.
De forma alternativa, vocˆ pode configurar estes parˆmteros durante a inicializa¸˜o usando a
                          e                          a                         ca
ferramenta sysctl, que ´ usada por muitas distribui¸˜es Linux (No SuSE a partir da vers˜o
                         e                            co                                  a
8.0). Apenas grave os seguintes valores em um arquivo chamado ‘/etc/sysctl.conf’:
        # Aumente alguns valores para o MySQL
        fs.file-max = 65536
        fs.dquot-max = 8192
        fs.super-max = 1024
You should also add the following to ‘/etc/my.cnf’:
        [mysqld_safe]
        open-files-limit=8192
Os parˆmetros acima permitem o MySQL criar at´ 8192 conex˜es + arquivos.
         a                                          e              o
A constante STACK_SIZE na LinuxThreads controla o espa¸amento das pilhas threads no
                                                               c
espa¸o de endere¸amento. Ela necessita ser grande o bastante para que tenha espa¸o o
      c          c                                                                      c
suficiente para a pilha de cada thread, mas pequena o bastante para manter a pilha de al-
guma thread executando dos dados globais mysqld. Infelizmente, a implementa¸˜o Linux de
                                                                               ca
mmap(), como descobrimos em experiˆncias, ir´ desmapear uma regi˜o j´ mapeada se vocˆ
                                        e      a                         a a                e
solicitar o mapeamento de um endere¸o j´ em uso, zerando os dados de toda a p´gina ao
                                         c a                                       a
inv´s de retoernar. um erro. Portanto a seguran¸a do mysqld ou qualquer outra aplica¸˜o
    e                                             c                                      ca
baseada em threads depende do comportamento gentil do c´digo que cria as threads. O
                                                                 o
usu´rio deve tomar medidas para certirficar-se que o n´mero de threads em funcionamento
    a                                                    u
em qualquer hora seja suficientemente baixo para que as pilhas das threads permane¸am    c
longe do monte global. Com mysqld vocˆ deve refor¸ar este comportamento "gentil" con-
                                            e          c
figurando um valor razo´vel para a vari´vel max_connections.
                         a                a
Se vocˆ mesmo construiu o MySQL e n˜o deseja confus˜es corrigindo LinuxThreads, vocˆ
        e                                 a                o                                e
deve configurar max_connections para um valor m´ximo de 500. Ele ainda deve ser menor
                                                     a
se vocˆ tiver uma chave grande para o buffer, grandes tabelas heap, ou outras coisas que
        e
fazem o mysqld alocar muita mem´ria ou se vocˆ estiver executando um kernel 2.2 com o
                                    o             e
patch de 2GB. Se vocˆ estiver usando nosso bin´rio ou RPM vers˜o 3.23.25 ou posterior,
                       e                          a                    a
vocˆ pode seguramente configurar max_connections para 1500, assumindo que n˜o h´
    e                                                                                 a     a
uma grande chave de buffer ou tabelas heap com grande quantidade de dados. Quanto
mais vocˆ reduz STACK_SIZE em LinuxThreads mais threads vocˆ pode criar seguramente.
           e                                                         e
Recomendamos os valores entre 128K e 256K.
Se vocˆ usa v´rias conex˜es simultˆneas, vocˆ pode sofrer com um "recurso" do kernel
         e     a           o          a         e
2.2 que penaliza um processo por bifurcar-se ou clonar um filho na tentativa de prevenir
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                 139



um ataque de separa¸˜o. Isto faz com que o MySQL n˜o consiga fazer uma bom
                       ca                                     a
escalonamento, quando o n´mero de clientes simultˆneos cresce. Em sistemas com CPU
                            u                      a
unica, temos visto isto se manifestar em uma cria¸˜o muito lenta das threads, tornando
´                                                 ca
a conex˜o ao MySQL muito lenta. Em sistemas de m´ltiplas CPUs, temos observado
        a                                                u
uma queda gradual na velocidade das consultas quando o n´mero de clientes aumenta.
                                                              u
No processo de tentar encontrar uma solu¸˜o, recebemos um patch do kernel de um de
                                           ca
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
atualmente o recomendamos para nossos usu´rios que continuando trabalhando com
                                                a
servidores muito carregados em kernels 2.2. Este detalhe foi corrigido no kernel 2.4,
portanto, se vocˆ n˜o est´ satisfeito com a performance atual do seu sistema, melhor do
                 e a      a
que aplicar um patch ao seu kernel 2.2, pode ser mais f´cil simplesmente atualizar para o
                                                       a
2.4, que lhe dar´ tamb´m uma melhora em seu sistemas SMP em adi¸˜o ` corre¸˜o do bug
                a     e                                             ca a       ca
discutido aqui.
Estamos testando o MySQL no kernel 2.4 em uma m´quina com 2 processadores e desco-
                                                        a
brimos que o MySQL escalona muito melhor - virtualmente, n˜o h´ nenhuma perda de
                                                                a  a
desempenho no throughput das consultas at´ cerca de 1000 clientes, e o fator da escala do
                                            e
MySQL (computado com a raz˜o do throughput m´ximo para o thoughput de cada cliente.)
                                a                  a
foi de 180%. Temos observado resultados similares em sistemas com 4 processadores - vir-
tualmente n˜o h´ perda de desempenho quando o n´mero de clientes ´ incrementado at´
            a a                                        u             e                  e
1000 e o fator da escala foi de 300%. Portanto para um servidor SMP muito carregado n´so
definitivamente recomendamos o kernel 2.4. N´s descobrimos que ´ essencial executar o
                                                o                 e
processo mysqld com a mais alta prioridade poss´ no kernel 2.4 para obter performance
                                                  ivel
m´xima. Isto pode ser feito adicionando o comando renice -20 $$ ao mysqld_safe. Nos
  a
nossos testes em uma m´quina com 4 processadores, o aumento da prioridade nos deu 60%
                         a
de aumento no throughput com 400 clientes.
Atualmente estamos tentando coletar mais informa¸˜es sobre como o MySQL atua no kernel
                                                   co
2.4 em sistemas com 4 e 8 processadores. Se vocˆ tem acesso a um sistema deste porte e tem
                                               e
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 multi processados. A implementa¸˜o de mutex em LinuxThreads na
                                             ca
glibc-2.1 ´ muito ruim para programas com v´rias threads que travam o mutex
          e                                  a
por um tempo curto. Em um sistema SMP, ironicamente, se vocˆ liga o MySQL
                                                               e
com LinuxThreads sem modifica¸˜es, removendo processadores da m´quina, a
                                co                                    a
performance do MySQL ´ melhorada em alguns casos. Para corrigir este compor-
                         e
tamento, disponibilizamos um patch para glibc 2.1.3, em linuxthreads-2.1-patch (
http://www.mysql.com/Downloads/Linux/linuxthreads-2.1-patch)
Com a glibc-2.2.2, o MySQL vers˜o 3.23.36 ir´ usar o mutex adaptativo, que ´ muito
                                   a             a                                 e
melhor,mesmo que o patch na glibc-2.1.3. Avisamos, entretando, que sobre algumas
condi¸˜es, o c´digo mutex no glibc-2.2.2 overspins, que prejudica a performance do MySQL.
      co      o
A chance desta condi¸˜o pode ser reduzida mudando a prioridade do processo mysqld para
                     ca
a prioridade mais alta. N´s tamb´m corrigimos o comportamento overspin com um patch,
                         o       e
       ´
disponivel em http://www.mysql.com/Downloads/Linux/linuxthreads-2.2.2.patch.
140                                   MySQL Technical Reference for Version 5.0.0-alpha



Ele combina a corre¸˜o do overspin, n´mero m´ximo de threads e espa¸amento das pilhas
                    ca                 u       a                    c
em um unico patch. Vocˆ precisar´ aplic´-lo no diret´rio linuxthreads com patch -p0
        ´                 e         a     a          o
</tmp/linuxthreads-2.2.2.patch. Esperamos que seja inclu´ de alguma forma nos
                                                               ido
futuros lan¸amentos da glibc-2.2. De qualquer forma, se vocˆ ligar com glibc-2.2.2,
            c                                                 e
ainda ser´ necess´rio corrigir STACK_SIZE e PTHREAD_THREADS_MAX. Temos esperan¸as que
          a      a                                                             c
os padr˜es ser˜o corrigidos para valores mais aceit´veis para configura¸˜es pesadasa do
        o     a                                    a                  co
MySQL no futuro, ent˜o sua constru¸˜o poder´ ser reduzida a ./configure; make; make
                       a              ca      a
install.
Recomendamos que vocˆ use os patches acima para construir uma vers˜o est´tica especial
                        e                                              a     a
de libpthread.a e use-a somente para liga¸˜es est´ticas com o MySQL. Sabemos que os
                                           co       a
patches s˜o seguros para o MySQL e pode melhorar significamente sua performance, mas n˜o
         a                                                                              a
podemos dizer nada sobre outras aplica¸˜es. Se vocˆ ligar outras aplica¸˜es coma a vers˜o
                                       co          e                   co               a
modificada da biblioteca ou construir uma vers˜o alterada compartilhada e instal´-la no seu
                                             a                                 a
sistema, vocˆ estar´ fazendo por sua conta e risco e tenha aten¸˜o com outras aplica¸˜es
            e      a                                           ca                     co
que dependem de LinuxThreads.
Se vocˆ passar por problemas estranhos durante a instala¸˜o do MySQL ou com travamentos
       e                                                 ca
de alguns utilit´rios comuns, ´ muito prov´vel que eles s˜o relacionados a problemas de
                a             e             a               a
bibliotecas ou compilador. Se for este o caso, o uso de nosso bin´rio ser´ a solu¸˜o.
                                                                 a       a       ca
Um problema conhecido com a distribui¸˜o bin´ria ´ que com antigos sistemas Linux que
                                       ca      a   e
usam libc (como o RedHat 4.x ou Slackware), vocˆ obter´ alguns problemas n˜o fatais
                                                   e      a                  a
com resolu¸˜o de nomes. Veja Se¸˜o 2.6.2.1 [Binary notes-Linux], P´gina 141.
          ca                    ca                                a
                                             a       ´
Quando estiver usando LinuxThreads vocˆ ver´ um minimo de trˆs processos em execu¸˜o.
                                        e                      e                 ca
Estes s˜o de fato, threads. Existir´ uma thread para o gerenciador LinuxThreads, uma
       a                           a
thread para lidar com conex˜es e uma thread para tartar de alarmes e sinais.
                            o
Perceba que o kernel Linux e a biblioteca LinuxThread pode por padr˜o ter apenas 1024
                                                                    a
threads. Isto significa que vocˆ pode ter at´ 1021 conex˜es ao MySQL em um sistema sem
                              e            e           o
corre¸˜o. A p´gina http://www.volano.com/linuxnotes.html cont´m informa¸˜es sobre
     ca       a                                                   e         co
como contornar este limite.
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. Veja Se¸˜o A.4.1
   e                                                                        ca
[Crashing], P´gina 921.
             a
Para obter um descarga do core no Linux se o mysqld finalizar com um sinal SIGSEGV, vocˆ
                                                                                      e
pode iniciar o mysqld com a op¸˜o --core-file. Perceba que provavelmente vocˆ tamb´m
                              ca                                               e    e
precisar´ aumentar o core file size adicionando ulimit -c 1000000 para mysqld_safe
         a
ou iniciar mysqld_safe com --core-file-sizes=1000000, Veja Se¸˜o 4.8.2 [safe_mysqld],
                                                                 ca
P´gina 332.
 a
Se vocˆ estiver ligando seu pr´prio cliente MySQL e obter o erro:
      e                       o
      ld.so.1: ./my: fatal: libmysqlclient.so.4:
      open failed: No such file or directory
Quando execut´-los, o problema pode ser evitado com um dos seguintes m´todos:
             a                                                        e
 • Ligue o cliente com a seguinte op¸˜o (no lugar de -Lpath):
                                    ca                                      -Wl,r/path-
   libmysqlclient.so.
 • Copie libmysqclient.so para ‘/usr/lib’.
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                               141



 • Adicione o caminho do diret´rio onde libmysqlclient.so est´ localizado para a
                                o                                  a
   vari´vel de ambiente LD_RUN_PATH antes de executar seu cliente.
       a
Se vocˆ estiver usando o compilador Fujitsu (fcc / FCC) vocˆ ter´ alguns problemas com-
      e                                                    e    a
pilando o MySQL porque os arquivos de cabe¸alho Linux s˜o muito orientados ao gcc.
                                             c           a
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_STRTOLL_PROTO" CXX=FCC CXXFLAGS="-O -K fast -K lib 
     -K omitfp -K preex --no_exceptions --no_rtti -D_GNU_SOURCE -DCONST=const 
     -Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO 
     ’-D_EXTERN_INLINE=static __inline’" ./configure --prefix=/usr/local/mysql 
     --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared 
     --with-low-memory

2.6.2.1 Notas Linux para distribui¸˜es bin´rias
                                  co      a

O MySQL necessita pelo menos do Linux vers˜o 2.0
                                          a
Aviso: Percebemos que alguns usu´rios do MySQL tiveram serios problemas de estabilidade
                                  a
com o MySQL e o kernel 2.2.14 do Linux. Se vocˆ estiver usando este kernel vocˆ deve
                                                   e                              e
atualiz´-lo para o 2.2.19 (ou posterior) ou para o kernel 2.4. Se vocˆ tiver um gabinete
       a                                                             e
multi-cpu, ent˜o vocˆ deve considerar seriamente o uso do kernel 2.4 uma vez que ele lhe
              a      e
trar´ uma melhora significante na velocidade.
    a
A vers˜o bin´ria ´ ligada com -static, que significa que vocˆ normalmente n˜o precisa se
       a     a   e                                         e              a
preocupar com qual vers˜o das bibliotecas do sistema vocˆ tem. Vocˆ n˜o precisa insta-
                         a                               e          e a
lar LinuxThreads. Um programa ligado com a op¸˜o -static ´ um pouco maior que um
                                                 ca           e
programa ligado dinamicamente e tamb´m um pouco mais r´pido (3-5%). Um problema,
                                       e                   a
entretanto, ´ que vocˆ n˜o pode usar fun¸˜es definidas pelo usu´rio (UDF) com um pro-
            e         e a                co                     a
grama ligado estaticamente. Se vocˆ for escrever ou usar fun¸˜es UDF (isto ´ algo para
                                   e                         co             e
programadores C ou C++), vocˆ deve compilar o MySQL, usando liga¸˜es dinamicas.
                              e                                    co
Se vocˆ estiver usando um sistema baseado em libc (em vez de um sistema glibc2), vocˆ,
      e                                                                               e
provavelmente, ter´ alguns problemas com resolu¸˜o de nomes de m´quinas e getpwnam()
                    a                           ca                a
com a vers˜o bin´ria. (Isto ´ porque o glibc infelizmente depende de algumas bibliotecas
           a      a         e
externas para resolver nomes de m´quinas e getpwent(), mesmo quando compilado com
                                   a
-static). Neste caso, vocˆ provavelmente obter´ a seguinte mensagem de erro quando
                            e                    a
executar mysql_install_db:
     Sorry, the host ’xxxx’ could not be looked up
ou o seguinte erro quando vocˆ tentar executar mysqld com a op¸˜o --user:
                             e                                ca
     getpwnam: No such file or directory
Vocˆ pode resolver este problema usando de um dos modos seguintes:
   e
 • 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
   install_db. O lado ruim ´ que vocˆ n˜o poder´ usar nomes de m´quinas nas tabelas
                             e       e a         a                 a
   de permiss˜es; vocˆ deve usar n´meros IP no lugar (exceto para localhost). Se vocˆ
             o       e            u                                                 e
142                                    MySQL Technical Reference for Version 5.0.0-alpha



      estiver usando uma release antiga do MySQL que n˜o suporte --force, vocˆ deve
                                                      a                      e
      remover o teste resolveip no mysql_install com um editor.
 • Inicie mysqld com su no lugar de usar --user.
As distribui¸˜es bin´rias Linux-Intel e RPM do MySQL s˜o configuradas para o m´ximo
            co      a                                 a                      a
                    ´
de desempenho possivel. N´s sempre tentamos usar o compilador mais r´pido e est´vel
                            o                                        a         a
dispon´
      ivel.
Suporte MySQL ao Perl exige Perl Vers˜o 5.004 03 ou mais novo.
                                     a
Em algumas vers˜es 2.2 do kernel Linux,vocˆ pode obter o erro Resource temporarily
               o                          e
unavailable quando vocˆ faz v´rias novas conex˜es para um servidor mysqld sobre
                        e      a                o
TCP/IP.
O problema ´ que o Linux tem um atraso entre o momento em que vocˆ fecha um socket
            e                                                            e
TCP/IP at´ que ele seja realmente liberado pelo sistema. Como s´ existe espa¸o para um
          e                                                        o            c
n´mero finito de slots TCP/IP, vocˆ ir´ obter o erro acima se vocˆ tentar fazer muitas novas
 u                               e a                            e
conex˜es TCP/IP durante um pequeno tempo, como quando vocˆ executa o benchmark do
     o                                                          e
MySQL ‘test-connect’ sobre TCP/IP.
N´s enviamos emails sobre este problema v´rias vezes para diferentes listas de discuss˜o
 o                                        a                                           a
Linux mas nunca conseguimos resolver este problema apropriadamente.
A unica ’corre¸˜o’ conhecida , para este problema ´ usar conex˜es persistentes nos seus
   ´           ca                                     e            o
clientes ou usar sockets, se vocˆ estiver executando o servidor de banco de dados e clientes
                                e
na mesma m´quina. N´s experamos que o kernel Linux 2.4 corrija este problema no futuro.
             a         o

2.6.2.2 Notas Linux x86

O MySQL exige a vers˜o 5.4.12 ou mais nova da libc. Sabe-se que funciona com a libc
                       a
5.4.46. A vers˜o 2.0.6 e posterior da glibc tamb´m deve funcionar. Existem alguns prob-
              a                                 e
lemas com os RPMs glibc da RedHat, portanto se vocˆ tiver problemas, confira se existe
                                                      e
alguma atualiza¸˜o! Sabemos que os RPMs glibc 2.0.7-19 e 2.0.7-29 funcionam.
                ca
Se vocˆ estiver usando o Red Hat 8.0 ou uma nova biblioteca glibc 2.2.x, vocˆ deve iniciar o
       e                                                                    e
mysqld com a op¸˜o --thread-stack=192K (Use -O thread_stack=192K antes do MySQL
                  ca
4). Se vocˆ n˜o fizer isto o mysqld finlizar´ em gethostbyaddr() porque a nova biblioteca
           e a                            a
glibc exige mais de 128K de mem´ria na pilha para esta chamada. Este tamanho de pilha
                                 o
´ o padr˜o agora no MySQL 4.0.10 e acima.
e        a
Se vocˆ est´ usando o gcc 3.0 e acima para compilar o MySQL, vocˆ deve instalar a
       e    a                                                         e
biblioteca libstdc++v3 antes de compilar o MySQL; se vocˆ n˜o fizer isto, vocˆ obter´ um
                                                        e a                 e      a
erro sobre um s´
               imbolo __cxa_pure_virtual perdido durante a liga¸˜o.
                                                                ca
Em algumas distribui¸˜es Linux mais antigas, configure pode produzir um erro como este:
                    co
       Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file.
       See the Installation chapter in the Reference Manual.
Fa¸a apenas o que a mensagem de erro diz e adicione um caractere sublinhado para a macro
  c
_P que tem somente um caractere sublinhado e ent˜o tente novamente.
                                                  a
Vocˆ pode obter alguns aviso quando estiver compilando; os mostrados abaixo podem ser
    e
ignorados:
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                143



      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’
O mysql.server pode ser encontrado no diret´rio ‘share/mysql’ sob o diret´rio de in-
                                                o                             o
stala¸˜o MySQL ou no diret´rio ‘support-files’ da ´rvore fonte MySQL.
     ca                      o                       a
Se o mysqld sempre descarregar um core na inicializa¸˜o, o problema pode ser que vocˆ
                                                       ca                               e
tenha um antigo ‘/lib/libc.a’. Tente renome´-lo depois remova ‘sql/mysqld’ e fa¸a um
                                               a                                   c
novo make install e tente novamente. Este problema foi relatado em algumas instala¸˜es
                                                                                     co
Slackware.
Se vocˆ obter o seguinte erro quando ligar o mysqld, significa que seu ‘libg++.a’ n˜o est´
       e                                                                          a     a
instalado corretamente:
      /usr/lib/libc.a(putc.o): In function ‘_IO_putc’:
      putc.o(.text+0x0): multiple definition of ‘_IO_putc’
Vocˆ pode evitar o uso de ‘libg++.a’ executando configure desta forma:
    e
      shell> CXX=gcc ./configure

2.6.2.3 Notas Linux SPARC

Em algumas implementa¸˜es, readdir_r() est´ quebrada. O sintoma ´ que SHOW
                       co                     a                       e
DATABASES sempre retorna um conjunto vazio. Isto pode ser corrigido removendo
HAVE_READDIR_R do ‘config.h’ depois de configurar e antes de compilar.

2.6.2.4 Notas Linux Alpha

O MySQL Vers˜o 3.23.12 ´ a primeira vers˜o do MySQL que ´ testada no Linux-Alpha. Se
               a          e                 a                e
vocˆ planeja usar o MySQL no Linux-Alpha, vocˆ deve ter certeza que possui esta vers˜o
    e                                              e                                 a
ou mais nova.
Temos testado o MySQL no Alpha com nossos pacotes de benchmarks e testes, e ele parece
funcinar muito bem.
Quando n´s compilamos o bin´rios MySQL padr˜es, n´s est´vamos usando SuSE 6.4, kernel
         o                    a                  o    o    a
2.2.13-SMP, Compilador C Compaq (V6.2-504) e compilador C++ Compaq (V6.3-005) em
uma m´quina Compaq DS20 com um processador Alpha EV6.
       a
Vocˆ pode encontrar os compiladores acima em http://www.support.compaq.com/alpha-tools.
    e
Usando estes compiladores, em vez do gcc, obtemos 9-14 % de melhora na performance
com MySQL.
Note que a linha de configura¸˜o otimiza o bin´rio para a CPU atual; isto significa que
                               ca                 a
vocˆ s´ pode utilizar nosso bin´rio se vocˆ tiver um processador Alpha EV6. N´s tamb´m
    e o                         a         e                                  o      e
compilamos estaticamente para evitar problemas de bibliotecas.
A partir das pr´ximas distribui¸˜es adicionamos o parˆmetro -arch generic em nossas
                o                 co                    a
op¸˜es de compila¸˜o, o qual assegura que o bin´rio execute em todos os processadores
   co               ca                              a
Alpha. N´s tamb´m compilamos estaticamente para evitar problemas de bibliotecas.
         o        e
144                                   MySQL Technical Reference for Version 5.0.0-alpha



      CC=ccc CFLAGS="-fast -arch generic" CXX=cxx 
      CXXFLAGS="-fast -arch generic -noexceptions -nortti" 
      ./configure --prefix=/usr/local/mysql --disable-shared 
      --with-extra-charsets=complex --enable-thread-safe-client 
      --with-mysqld-ldflags=-non_shared --with-client-ldflags=-non_shared
Se vocˆ deseja usar egcs a seguinte linha de configura¸˜o funcionou para n´s:
      e                                              ca                  o
      CFLAGS="-O3 -fomit-frame-pointer" CXX=gcc 
      CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors 
      -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql 
      --disable-shared
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
   4.18. Vocˆ deve fazer download e usar o gdb 5.0!
            e
 • Se vocˆ tentar ligar o mysqld estaticamente quando usar o gcc, a imagem resultante ir´
         e                                                                              a
   descarregar um arquivo core no in´                            ˜
                                      icio. Em outras palavras, NAO use --with-mysqld-
   ldflags=-all-static com gcc.

2.6.2.5 Notas Linux PowerPC

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

2.6.2.6 Notas Linux MIPS

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

2.6.2.7 Notas Linux IA-64

Para conseguir compilar o MySQL no Linux Ia64, usamos a seguinte linha de compila¸˜o:
                                                                                 ca
Usando gcc-2.96:
      CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc 
      CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors 
      -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql 
      "--with-comment=Official MySQL binary" --with-extra-charsets=complex
No Ia64 os bin´rios do cliente MySQL est˜o usando bibliotecas compartilhadas. Isto
                a                           a
significa se vocˆ instalar nossa distribui¸˜o bin´rias em algum outro lugar diferente de
               e                         ca     a
‘/usr/local/mysql’ vocˆ precisa modificar o ‘/etc/ld.so.conf’ ou adicionar o caminho
                        e
da o diret´rio onde est´ localizado o ‘libmysqlclient.so’ na vari´vel de ambiente LD_
          o            a                                         a
LIBRARY_PATH.
Veja Se¸˜o A.3.1 [Erros de liga¸˜o], P´gina 918.
       ca                      ca     a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                145



2.6.3 Notas Solaris

No Solaris, vocˆ deve ter problemas mesmo antes de descompactar a distribui¸˜o MySQL!
                e                                                          ca
O tar do Solaris n˜o pode tratar grandes nomes de arquivos, portanto vocˆ pode ver um
                   a                                                     e
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
Neste caso, vocˆ deve usar o GNU tar (gtar) para desempacotar a dis-
                e
tribui¸˜o.
      ca     Vocˆ pode encontrar uma c´pia pr´-compilada para Solaris em
                e                        o      e
http://www.mysql.com/downloads/os-solaris.html.
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. Veja Se¸˜o 2.3.6 [MIT-
                        a                                               ca
pthreads], P´gina 106.
             a
Se vocˆ obter o seguinte erro de configure:
      e
     checking for restartable system calls... configure: error can not run test
     programs while cross compiling
Isto significa que alguma coisa est´ errada com a instala¸˜o de seu compilador! Neste caso
                                  a                     ca
vocˆ deve atualizar seu compilador para uma vers˜o mais nova. Vocˆ tamb´m pode resolver
    e                                            a                 e     e
este problema inserindo a seguinte linha no arquivo ‘config.cache’:
     ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls=’no’}
Se vocˆ est´ usando Solaris em um SPARC, o compilador recomendado ´ o gcc 2.95.2. Vocˆ
      e a                                                         e                  e
pode encontr´-lo em http://gcc.gnu.org/. Perceba que egcs 1.1.1 e gcc 2.8.1 n˜o s˜o
              a                                                                 a a
est´veis no SPARC!
   a
A linha do configure recomendado quando usando gcc 2.95.2 ´:
                                                          e
     CC=gcc CFLAGS="-O3" 
     CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" 
     ./configure --prefix=/usr/local/mysql --with-low-memory --enable-assembler
Se vocˆ possui um ultra sparc, vocˆ pode obter 4% a mais de performance adicionando
      e                           e
"-mcpu=v8 -Wa,-xarch=v8plusa" para a CFLAGS e CXXFLAGS.
Se vocˆ possui o compilador Sun Workshop (Fortre) 5.3 (ou mais novo), vocˆ pode executar
      e                                                                  e
configure da seguinte forma:
     CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt" 
     CXX=CC CXXFLAGS="-noex -mt" 
     ./configure --prefix=/usr/local/mysql --enable-assembler
Vocˆ pode criar um bin´rio de 64 bits usando o compilador Forte da Sun com os seguintes
   e                  a
parˆmetros de compila¸˜o:
   a                 ca
     CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v9" 
     CXX=CC CXXFLAGS="-noex -mt -xarch=v9" ASFLAGS="-xarch=v9" 
     ./configure --prefix=/usr/local/mysql --enable-assembler
Para criar um bin´rio de 64 bits do Solaris usando gcc, e -m64 para CFLAGS e CXXFLAGS.
                  a
Note que isto s´ funciona com o MySQL 4.0 e acima - o MySQL 3.23 n˜o inclui as modi-
               o                                                      a
fica¸˜es exigidas para suportar isto.
   co
146                                    MySQL Technical Reference for Version 5.0.0-alpha



No benchmark do MySQL, conseguimos um aumento de velocidade de 4% em um Ultra-
SPARC usando o Forte 5.0 no modo 32 bit em compara¸˜o com o uso do gcc 3.2 com o
                                                           ca
parametro -mcpu.
Se vocˆ criar um bin´rio de 64 bits, ele ser´ 4$ mais lento que o bin´rio de 32 bits, mas o
        e               a                   a                         a
mysqld poder´ tratar mais threads e mem´ria.
                  a                        o
Se vocˆ tiver um problema com fdatasync ou sched_yield, vocˆ pode corrigir isto adicio-
       e                                                         e
nando LIBS=-lrt para a linha de configura¸˜o  ca
O seguinte paragr´fo ´ relevante somente para compiladores mais antigos que o WorkShop
                      a e
5.3:
Vocˆ tamb´m pode ter que editar o script configure para alterar esta linha:
     e       e
       #if !defined(__STDC__) || __STDC__ != 1
para isto:
       #if !defined(__STDC__)
Se vocˆ ligar __STDC__ com a op¸˜o -Xc, o compilador Sun n˜o pode compilar com o arquivo
       e                         ca                          a
de cabe¸alho ‘pthread.h’ do Solaris. Isto ´ um bug da Sun (compilador corrompido ou
          c                                   e
arquivo include corrompido).
Se o mysqld emitir a mensagem de erro mostrada abaixo quando vocˆ execut´-lo, vocˆ deve
                                                                     e       a        e
tentar compilar o MySQL com o compilador Sun sem habilitar a op¸˜o multi-thread (-mt):
                                                                    ca
       libc internal error: _rmutex_unlock: rmutex not held
Adicione -mt a CFLAGS e CXXFLAGS e tente novamente.
Se vocˆ estiver usando a vers˜o SFW do gcc (que vem com o Solaris 8), vocˆ deve adicionar
       e                       a                                           e
‘/opt/sfw/lib’ a vari´vel de ambiente LD_LIBRARY_PATH antes de executar a configura¸˜o.
                         a                                                               ca
Se vocˆ estiver usando o gcc dispon´ em sunfreeware.com, vocˆ pode ter muitos prob-
        e                             ivel                         e
lemas. Vocˆ deve recompilar o gcc e GNU binutils na m´quina que vocˆ o executar´ para
              e                                          a              e            a
evitar qualquer problema.
Se vocˆ obter o seguinte erro quando estiver compilando o MySQL com gcc, significa que
        e
seu gcc n˜o est´ configurado para sua vers˜o de Solaris:
            a       a                       a
       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’
A coisa apropriada para fazer neste caso ´ obter a vers˜o mais nova do gcc e compil´-lo
                                           e             a                               a
com seu compilador gcc atual! Ao menos para o Solaris 2.5, a maioria das vers˜es bin´rias
                                                                                o       a
de gcc tem arquivos in´teis e antigos que ir˜o quebrar todos programas que usam threads
                           u                 a
(e possivelmente outros programas)!
O Solaris n˜o fornece vers˜es est´ticas de todas bibliotecas de sistema (libpthreads) e
               a             o      a
libdl), portanto vocˆ n˜o pode compilar o MySQL com --static. Se vocˆ tentar fazer
                        e a                                                   e
isto, receber´ o erro:
                a
       ld: fatal: library -ldl: not found

      ou

      undefined reference to ‘dlopen’
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                   147



      ou

      cannot find -lrt
Se v´rios processos tentar conectar muito rapidamente ao mysqld, vocˆ ver´ este erro no
     a                                                              e    a
log do MySQL:
      Error in accept: Protocol error
Vocˆ deve tentar iniciar o servidor com a op¸˜o --set-variable back_log=50 como uma
    e                                       ca
solu¸˜o para esta situa¸˜o. Note que --set-variable=nome=valor e -O nome=valor est´
    ca                  ca                                                        a
obsoleto desde o MySQL 4.0. Use apenas --back_log=50. Veja Se¸˜o 4.1.1 [Op¸˜es da
                                                                  ca         co
linha de comando], P´gina 208.
                      a
Se vocˆ est´ ligando seu pr´prio cliente MySQL, vocˆ deve obter o seguinte erro quando
       e   a               o                       e
tentar execut´-lo:
             a
      ld.so.1: ./my: fatal: libmysqlclient.so.#:
      open failed: No such file or directory
O problema pode ser evitado por um dos seguintes m´todos:
                                                  e
 • 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’.
 • 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.
Se vocˆ tiver problemas com o configure tentando ligar com -lz e vocˆ n˜o tem a zlib
       e                                                           e a
instalada, vocˆ ter´ duas op¸˜es:
              e    a        co
 • 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.
Se vocˆ estiver usando o gcc e tiver problemas carregando fun¸˜es UDF no MySQL, tente
       e                                                     co
adicionar -lgcc para a linha de liga¸˜o para a fun¸˜o UDF.
                                    ca            ca
Se vocˆ deseja que o MySQL inicie automaticamente,
         e                                                            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’.
Como o Solaris n˜o suporta core files para aplica¸˜es setuid(), vocˆ n˜o pode obter um
                 a                               co               e a
core file do mysqld se vocˆ estiver usando a op¸˜o --user.
                         e                    ca

2.6.3.1 Notas Solaris 2.7/2.8

Vocˆ pode utilizar normalmente um bin´rio Solaris 2.6 no Solaris 2.7 e 2.8. A maioria dos
    e                                   a
detalhes do Solaris 2.6 tamb´m se aplicam ao Solaris 2.7 e 2.8.
                            e
Note que o MySQL vers˜o 3.23.4 e superiores devem estar aptos para autodetectar novas
                         a
vers˜es do Solaris e habilitar solu¸˜es para os problemas seguintes!
    o                              co
Solaris 2.7 / 2.8 tem alguns bugs nos arquivos include. Vocˆ pode ver o seguinte erro quando
                                                           e
vocˆ usa o gcc:
   e
148                                    MySQL Technical Reference for Version 5.0.0-alpha



      /usr/include/widec.h:42: warning: ‘getwc’ redefined
      /usr/include/wchar.h:326: warning: this is the location of the previous
      definition
Se isto ocorrer, vocˆ pode fazer o seguinte para corrigir o problema:
                    e
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)
Uma alternativa ´ editar o ‘/usr/include/widec.h’ diretamente. Desta forma, depois de
                  e
fazer a corre¸˜o, vocˆ deve remover o ‘config.cache’ e executar o configure novamente !
             ca      e
Se vocˆ obter erros como estes quando vocˆ executar o make, ´ porque o configure
      e                                  e                  e
n˜o encontrou o arquivo ‘curses.h’ (provavelmente devido ao erro no arquivo
  a
‘/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 ‘;’
A solu¸˜o para isto ´ fazer uma das seguintes op¸˜es:
      ca            e                           co
 • 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,
provavelmente o problema ´ que seu arquivo ‘libz.so’ est´ instalado em ‘/usr/local/lib’.
                            e                            a
Vocˆ pode corrigir isto usando um dos seguintes m´todos:
    e                                              e
 • 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
   tribui¸˜o do Solaris 8.
         ca
 • Configure o MySQL com a op¸˜o --with-named-z-libs=no.
                                ca

2.6.3.2 Notas Solaris x86

No Solaris 8 no x86, mysqld ir´ descarregar um core se vocˆ executar um ’strip’ no mesmo.
                              a                           e
Se vocˆ estiver usando gcc ou egcs no Solaris X86 e vocˆ tiver problemas com descarregos
      e                                                e
de core, vocˆ deve utilizar o seguinte comando configure:
            e
      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
Isto ir´ evitar problemas com a biblioteca libstdc++ e com exce¸˜es C++.
       a                                                       co
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                149



Se isto n˜o ajudar, vocˆ pode compilar uma vers˜o com debug e execut´-lo com um arquivo
         a             e                       a                    a
de ratreamento (trace) ou sob gdb. Veja Se¸˜o D.1.3 [Using gdb on mysqld], P´gina 1072.
                                          ca                                a

2.6.4 Notas BSD

Esta se¸˜o fornece informa¸˜o para os v´rios tipos de BSD, assim como a vers˜o espec´
       ca                 ca           a                                    a       ifica
para eles.

2.6.4.1 Notas FreeBSD

FreeBSD 4.x ou mais novo ´ recomendado para executa¸˜o do MySQL uma vez que o pacote
                          e                        ca
thread ´ muito mais integrado.
       e
A mais f´cil e portanto a forma preferida para instal´-lo ´ usar as portas mysql-server e
         a                                           a    e
mysql-client dispon´
                   iveis em http://www.freebsd.org.
Usando-as vocˆ obtem:
             e
 • Um MySQL funcional, com todas as otimiza¸˜es conhecidas para trabalhar na sua
                                           co
   vers˜o habilitada do FreeBSD.
       a
 • 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
   todos com pkg delete se vocˆ n˜o quiser mais o MySQL na m´quina.
                              e a                              a
´
E recomendado que vocˆ utilize MIT-pthreads no FreeBSD 2.x e threads nativas nas Vers˜es
                        e                                                            o
                ´
3 e superiores. E poss´ executar com threads nativas em algumas vers˜es antigas (2.2.x)
                      ivel                                            o
mas vocˆ pode encontrar problemas ao finalizar o mysqld.
        e
Infelizmente algumas chamadas de fun¸˜es no FreeBSD ainda n˜o s˜o totalmente seguras
                                        co                    a a
com threads, principalmente a fun¸˜o gethostbyname(), que ´ usada pelo MySQL para
                                     ca                      e
converter nomes de m´quinas em endere¸os IPs. Sob certas circunstˆncias, o processo
                       a                   c                        a
mysqld ir´ criar repentinamente um carga de CPU de 100% e ficar´ sem resposta. Se vocˆ
         a                                                     a                    e
se deparar com isto, tente iniciar o MySQL usando a op¸˜o --skip-name-resolve.
                                                      ca
Alternativamente, vocˆ pode ligar o MySQL no FreeBSD 4.x com a biblioteca Linux-
                       e
Threads, que evita uns poucos problemas que a implementa¸˜o da thread nativa do FreeBSD
                                                        ca
tem. Para uma compara¸˜o muito boa do LinuxThreads vs. threads nativas dˆ uma ol-
                         ca                                                    e
hada no artigo "FreeBSD or Linux for your MySQL Server?" de Jeremy Zawodny em
http://jeremy.zawodny.com/blog/archives/000697.html
Os problemas conhecidos usando LinuxThreads na FreeBSD s˜o:
                                                        a
 • wait_timeout n˜o est´ funcionando (provavemente problema de manipula¸˜o do signal
                   a     a                                                ca
   em FreeBSD/LinuxThreads). Isto deveria ter sido corrigido no FreeBSD 5.0. O sintome
   a
   ´ que conex˜es persistentes podem se manter por um longo tempo sem serem fechadas.
              o
O ‘Makefile’ do MySQL necessita o GNU make (gmake) para funcionar. Se vocˆ deseja
                                                                         e
compilar o MySQL, antes vocˆ precisar´ instalar o GNU make.
                           e         a
Tenha certeza que sua configura¸˜o de resolu¸˜o de nomes esteja correta. De outra forma
                                 ca           ca
vocˆ vai ter atrasos na resolu¸˜o ou falhas quando conectar ao mysqld.
   e                          ca
150                                   MySQL Technical Reference for Version 5.0.0-alpha



Tenha certeza que a entrada localhost no arquivo ‘/etc/hosts’ esteja correta (de outra
forma vocˆ ir´ ter problemas conectando ao banco de dados). O arquivo ‘/etc/hosts’ deve
          e a
iniciar com a linha:
      127.0.0.1          localhost localhost.seu.dominio
O modo recomendado de compilar e instalar o MySQL no FreeBSD com gcc (2.95.2 e acima)
´:
e
      CC=gcc CFLAGS="-O2 -fno-strength-reduce" 
      CXX=gcc CXXFLAGS="-O2 -fno-rtti -fno-exceptions -felide-constructors 
      -fno-strength-reduce" 
      ./configure --prefix=/usr/local/mysql --enable-assembler
      gmake
      gmake install
      ./scripts/mysql_install_db
      cd /usr/local/mysql
      ./bin/mysqld_safe &
Se vocˆ percber que o configure usar´ MIT-pthreads, vocˆ de ler as notas sobre MIT-
      e                               a                e
pthreads. Veja Se¸˜o 2.3.6 [MIT-pthreads], P´gina 106.
                 ca                         a
Se o make install n˜o puder encontrar ‘/usr/include/pthreads’, ´ porque o configure
                    a                                               e
n˜o detectou que vocˆ precisava de MIT-pthreads. Isto ´ corrigido executando estes coman-
 a                  e                                 e
dos:
      shell> rm config.cache
      shell> ./configure --with-mit-threads
O FreeBSD ´ tamb´m conhecido por ter um limite muito baixo para o manipulador de
             e      e
arquivos. Veja Se¸˜o A.2.17 [Not enough file handles], P´gina 917. Descomente a se¸˜o
                  ca                                      a                           ca
ulimit -n no mysqld safe ou aumente os limites para o usu´rio mysqld no /etc/login.conf (e
                                                         a
reconstrua-o com cap mkdb /etc/login.conf). Tamb´m tenha certeza que vocˆ configurou
                                                    e                        e
a classe apropriada para este usu´rio no arquivo de senhas (password) se vocˆ n˜o estiver
                                 a                                           e a
usando o padr˜o (use: chpass nome usuario mysqld). Veja Se¸˜o 4.8.2 [mysqld_safe],
               a                                                 ca
P´gina 332.
  a
Se vocˆ tiver muita mem´ria vocˆ deve considerar em reconstruir o Kernel para permitir o
      e                o       e
MySQL de usar mais de 512M de RAM. Dˆ uma olhada na op¸~o MAXDSIZ na arquivo de
                                          e                  ca
configura¸˜o LINT para maiores informa¸˜es.
         ca                            co
Se vocˆ tiver problemas com a data atual no MySQL, configurar a vari´vel TZ provavelmente
      e                                                            a
ajudar´. Veja Apˆndice E [Environment variables], P´gina 1083.
      a           e                                 a
Para obter um sistema seguro e est´vel vocˆ deve usar somente kernels FreeBSD que estejam
                                  a       e
marcados com -STABLE.


2.6.4.2 Notas NetBSD

Para compilar no NetBSD vocˆ precisa do GNU make. De outra forma o compilador que-
                              e
braria quando o make tentasse executar lint em arquivos C++.
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                               151



2.6.4.3 Notas OpenBSD

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

2.6.4.4 Notas OpenBSD 2.8

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
                                                    a
Janeiro de 2001 a corre¸˜o foi dispon´
                         ca            ivel apenas no ramo “-current”. Os sintomas deste
bug nas threads s˜o: resposta lenta, alta carga, alto uso de CPU e quedas do servidor.
                  a
Se vocˆ obter um erro como Error in accept:: Bad file descriptor ou erro 9 ao ten-
      e
tar abrir tabelas ou diret´rios, o problema ´ provavelmente que vocˆ n˜o alocou mem´ria
                          o                  e                      e a                o
suficiente para os descritores de arquivo do MySQL.
Neste caso tente iniciar o mysqld_safe como root com as seguintes op¸˜es:
                                                                      co
      shell> mysqld_safe --user=mysql --open-files-limit=2048 &

2.6.4.5 Notas BSDI Vers˜o 2.x
                       a

Se vocˆ obter o seguinte erro quando estiver compilando o MySQL, seu valor ulimit para
       e
mem´ria virtual ´ muito baixo:
     o           e
       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
Tente usar ulimit -v 80000 e executar o make novamente. Se isto n˜o funcionar e vocˆ es-
                                                                     a                 e
tiver usando o bash, tente trocar para csh ou sh; alguns usu´rios BSDI relataram problemas
                                                             a
com bash e ulimit.
Se vocˆ utiliza gcc, vocˆ pode tamb´m ter de usar a op¸˜o --with-low-memory para o
        e                e             e                    ca
configure estar apto a compilar o ‘sql_yacc.cc’.
Se vocˆ tiver problemas com a data atual no MySQL, configurar a vari´vel TZ provavelmente
       e                                                              a
ajudar´. Veja Apˆndice E [Environment variables], P´gina 1083.
       a          e                                    a

2.6.4.6 Notas BSD/OS Vers˜o 3.x
                         a

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
O comeando seguinte tamb´m funciona:
                         e
152                                    MySQL Technical Reference for Version 5.0.0-alpha



      shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 
             ./configure 
                 --prefix=/usr/local/mysql 
                 --with-unix-socket-path=/var/mysql/mysql.sock
Vocˆ pode alterar as localiza¸˜es dos diret´rios se vocˆ desejar, ou apenas usar os padr˜es
   e                         co            o           e                                o
n˜o especificando nenhuma localiza¸˜o.
 a                                 ca
Se vocˆ tiver problemas com performance sob alta carga, tente usar a op¸˜o --skip-thread-
      e                                                                ca
priority para mysqld! Isto ir´ executar todas as threads com a mesma prioridade; no BSDI
                               a
vers˜o 3.1, isto fornece melhor performance (pelo menos at´ o BSDI corrigir seu organizador
    a                                                     e
de threads).
Se vocˆ obter o erro virtual memory exhausted enquanto estiver compilando, deve tentar
      e
usar ulimit -v 80000 e executar make novamente. Se isto n˜o funcionar e vocˆ estiver
                                                             a                 e
usando bash, tente trocar para csh ou sh; alguns usu´rios BSDI relataram problemas com
                                                    a
bash e ulimit.

2.6.4.7 Notas BSD/OS Vers˜o 4.x
                         a

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

2.6.5 Notas Mac OS X


2.6.5.1 Mac OS X 10.x

O MySQL deve funcionar sem problemas no Mac OS X 10.x (Darwin). Vocˆ n˜o precisa
                                                                   e a
dos patches pthread para este SO.
Isto tamb´m se aplica ao Mac OS X 10.x Server. A compila¸˜o para a plataforma Server ´ a
         e                                              ca                           e
mesma para a vers˜o cliente do Mac OS X. No entanto note que o MySQL vem preinstalado
                 a
no Servidor !
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                153



Nosso bin´rio para Mac OS X ´ compilado no Darwin 6.3 com a seguinte linha de con-
          a                     e
figura¸˜o:
     ca
      CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc 
      CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors 
      -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql 
      --with-extra-charsets=complex --enable-thread-safe-client 
      --enable-local-infile --disable-shared
Veja Se¸˜o 2.1.3 [Instala¸˜o do Mac OS X], P´gina 71.
       ca                ca                 a

2.6.5.2 Mac OS X Server 1.2 (Rhapsody)

Antes de tentar configurar o MySQL no MAC OS X server 1.2 (aka
Rhapsody), primeiro vocˆ deve instalar o pacote pthread encontrado em:
                             e
http://www.prnet.de/RegEx/mysql.html.
Veja Se¸˜o 2.1.3 [Instala¸˜o do Mac OS X], P´gina 71.
       ca                ca                 a

2.6.6 Notas de Outros Unix


2.6.6.1 Notas HP-UX para distribui¸˜es bin´rias
                                  co      a

Alguma das distribui¸˜es bin´rias do MySQL para HP-UX ´ distribuida como um arquivo
                     co     a                            e
depot da HP e como um arquivo tar. Para usar o arquivo depot vocˆ deve estar executando
                                                                e
pelo menos o HP-UX 10.x para ter acesso `s ferramentas de arquivos depot da HP.
                                        a
A vers˜o HP do MySQL foi compilada em um servidor HP 9000/8xx sob HP-UX 10.20,
       a
usando MIT-pthreads. Sob esta configura¸˜o o MySQL funciona bem. O MySQL Vers˜o
                                        ca                                           a
3.22.26 e mais novas tamb´m podem ser construidas com o pacote thread nativo da HP.
                         e
Outras configura¸˜es que podem funcionar:
                 co
  • HP 9000/7xx executando HP-UX 10.20+
  • HP 9000/8xx executando HP-UX 10.30
As seguintes configura¸˜es definitivamente n˜o funcionar˜o:
                     co                   a           a
 • HP 9000/7xx ou 8xx executando HP-UX 10.x where x < 2
 • HP 9000/7xx ou 8xx executando HP-UX 9.x
Para instalar a distribui¸˜o, utilze um dos comandos abaixo, onde /path/to/depot ´ o
                         ca                                                             e
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:
154                                   MySQL Technical Reference for Version 5.0.0-alpha



          shell> /usr/sbin/swinstall -s /path/to/depot mysql.developer
O depot copia os bin´rios e bibliotecas em ‘/opt/mysql’ e dados em ‘/var/opt/mysql’. O
                    a
depot tamb´m cria as entradas apropriadas em ‘/etc/init.d’ e ‘/etc/rc2.d’ para iniciar
            e
o servidor automaticamente na hora do boot. Obviamente, para instalar o usu´rio deve ser
                                                                           a
o root.
Para instalar a distribui¸˜o HP-UX tar.gz, vocˆ deve ter uma c´pia do GNU tar.
                         ca                   e               o

2.6.6.2 Notas HP-UX Vers˜o 10.20
                        a

Existem alguns pequenos problemas quando compilamos o MySQL no HP-UX. N´s re-o
comendamos que vocˆ use o gcc no lugar do compilador nativo do HP-UX, porque o gcc
                   e
produz um c´digo melhor!
           o
N´s recomendamos o uso do gcc 2.95 no HP-UX. N˜o utilize op¸˜es de alta otimiza¸˜o
  o                                                a       co                  ca
(como -O6) ja que isto pode n˜o ser seguro no HP-UX.
                             a
A seguine linha do configure deve funcionar com o gcc 2.95:
      CFLAGS="-I/opt/dce/include -fpic" 
      CXXFLAGS="-I/opt/dce/include -felide-constructors -fno-exceptions 
      -fno-rtti" CXX=gcc ./configure --with-pthread 
      --with-named-thread-libs=’-ldce’ --prefix=/usr/local/mysql --disable-shared
A seguinte linha do configure deve funcionar com o gcc 3.1:
      CFLAGS="-DHPUX -I/opt/dce/include -O3 -fPIC" CXX=gcc 
      CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions 
      -fno-rtti -O3 -fPIC" ./configure --prefix=/usr/local/mysql 
      --with-extra-charsets=complex --enable-thread-safe-client 
      --enable-local-infile --with-pthread 
      --with-named-thread-libs=-ldce --with-lib-ccflags=-fPIC
      --disable-shared

2.6.6.3 Notas HP-UX Vers˜o 11.x
                        a

Para HP-UX Vers˜o 11.x n´s recomendamos o MySQL Vers˜o 3.23.15 ou posterior.
                  a        o                                 a
Por causa de alguns bugs cr´ iticos nas bibliotecas padr˜o do HP-UX, vocˆ deve instalar as
                                                        a               e
seguintes corre¸˜es antes de tentar executar o MySQL no HP-UX 11.0:
               co
      PHKL_22840 Streams cumulative
      PHNE_22397 ARPA cumulative
Isto ir´ resolver um problema que tem como retorno EWOLDBLOCK de recv() e EBADF de
       a
accept() em aplica¸˜es threads.
                    co
Se vocˆ estiver usando gcc 2.95.1 em um sistema HP-UX 11.x sem corre¸˜es, vocˆ obter´
       e                                                            co       e      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:
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                               155



      /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:
O problema ´ que o HP-UX n˜o define consistentemente a pthreads_
                e                        a
atfork().      Ela tem prot´tipos coflitantes em ‘/usr/include/sys/unistd.h’:184
                             o
e ‘/usr/include/sys/pthread.h’:440 (detalhes abaixo).
Uma solu¸˜o ´ copiar ‘/usr/include/sys/unistd.h’ em ‘mysql/include’ e editar
          ca e
‘unistd.h’ alterando-o para coincidir com a defini¸˜o em ‘pthread.h’. Aqui est´ o diff:
                                                 ca                          a
      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-exceptions -fno-rtti -O3" 
      ./configure --prefix=/usr/local/mysql --disable-shared
Segue algumas inforama¸˜es que um usu´rio do HP-UX Vers˜o 11.x nos enviou sobre com-
                      co             a                 a
pila¸˜o do MySQL com o compilador HP-UX:
    ca
       CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure --with-extra-character-set=com
Vocˆ pode ignorar qualquer erro do tipo:
   e
      aCC: warning 901: unknown option: ‘-3’: use +help for online documentation
Se vocˆ obter o seguinte erro do configure
      e
      checking for cc option to accept ANSI C... no
      configure: error: MySQL requires a ANSI C compiler (and a C++ compiler).
      Try gcc. See the Installation chapter in the Reference Manual.
Confira se vocˆ n˜o tem o caminho para o compilador K&R antes do caminho para o
               e a
compilador C e C++ do HP-UX.
Outra raz˜o para n˜o estar compilando ´ vocˆ n˜o definir o parˆmetro +DD64 acima.
         a        a                   e    e a               a
Outra possibilidade para o HP-UX 11 ´ usar o bin´rio MySQL para HP-UX 10.20. Recebe-
                                     e           a
mos relatos de alguns usu´rios de que esses bin´rios funcionam bem no HP-UX 11.00. Se
                          a                    a
vocˆ encontrar problemas, verifique o n´ do pacth de seu HP-UX.
   e                                   ivel

2.6.6.4 Notas IBM-AIX

Detec¸˜o autom´tica de xlC est´ faltando no Autoconf, portando um comando configure
      ca         a               a
deste tipo ´ necess´rio quando estiver compilando o MySQL (Este exemplo usa o compilador
           e       a
IBM):
      export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 "
      export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192"
156                                    MySQL Technical Reference for Version 5.0.0-alpha



      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’ 
      --enable-thread-safe-client 
      --enable-large-files
Acima est˜o as op¸˜es usadas para compilar a distribui¸˜o MySQL que pode ser encontrada
         a       co                                   ca
em http://www-frec.bull.com/.
Se vocˆ alterar o -O3 para -O2 na linha de configura¸˜o acima, vocˆ tamb´m deve remover
      e                                            ca            e     e
a op¸˜o -qstrict (isto ´ uma limita¸˜o no compilador C da IBM).
    ca                  e            ca
Se vocˆ estiver usando gcc ou egcs para compilar o MySQL, vocˆ DEVE usar a op¸˜o -fno-
       e                                                     e                 ca
exceptions, j´ que o manipulador de exce¸˜es no gcc/egcs n˜o ´ seguro para threads! (Isto
               a                          co               a e
foi testado com egcs 1.1). Existem tamb´m alguns problemas conhecidos com o assembler
                                         e
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:
 o
      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
O -Wa,-many ´ necess´rio para o compilador ser bem sucedido. IBM est´ ciente deste
             e        a                                                     a
               a      a                      ´ devido ao fato do problema poder ser
problema mas n˜o est´ com pressa de corrigi-lo
contornado. N´s n˜o sabemos se o -fno-exceptions ´ necess´rio com gcc 2.9.5, mas
              o a                                      e       a
como o MySQL n˜o utiliza exce¸˜es e a op¸˜o acima gera c´digo mais r´pido, recomendamos
                a             co        ca              o           a
que vocˆ sempre use esta op¸˜o com o egcs/gcc.
       e                   ca
Se vocˆ tiver algum problema com c´digo assembler tente alterar o -mcpu=xxx para o seu
      e                             o
processador. Normalmente power2, power ou powerpc podem ser usados, de uma maneira
alternativa vocˆ pode precisar usar 604 ou 604e. N˜o tenho certeza mas acredito que usar
               e                                  a
"power" deve satisfazer a maioria dos casos, mesmo em uma m´quina power2.
                                                              a
Se vocˆ n˜o sabe qual ´ o seu processador, utilize o comando "uname -m", isto ir´ fornecer a
      e a             e                                                         a
vocˆ uma string que parece com "000514676700", com um formato de xxyyyyyymmss onde
    e
xx e ss s˜o sempre 0s, yyyyyy ´ o ID unico do sistema e mm ´ o ID da CPU Planar. Uma
         a                      e     ´                       e
tabela destes valores podem ser encontrados em http://publib.boulder.ibm.com/doc_
link/en_US/a_doc_lib/cmds/aixcmds5/uname.htm. Isto ir´ lhe fornecer um tipo de
                                                                a
m´quina e um modelo de m´quina que vocˆ pode usar para determinar que tipo de cpu
  a                           a              e
vocˆ tem.
    e
Se vocˆ tiver problemas com sinais (MySQL finaliza sem notifica¸˜o sob alta carga) vocˆ
      e                                                      ca                     e
pode ter encontrado um bug de SO com threads e sinais. Neste caso vocˆ pode dizer ao
                                                                     e
MySQL para n˜o usar sinais configurando-o com:
               a
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                  157



       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
Isto n˜o afeta a performance do MySQL, mas tem o efeito colateral que vocˆ n˜o pode
       a                                                                     e a
matar clientes que est˜o “dormindo” em uma conex˜o com mysqladmin kill ou mysqladmin
                      a                          a
shutdown. Neste caso, o cliente morrer´ quando ele chegar no pr´ximo comando.
                                       a                        o
Em algumas vers˜es do AIX, ligando com libbind.a faz o getservbyname descarregar core.
                 o
Isto ´ erro no AIX e deve ser relatado para a IBM.
     e
Para o AIX 4.2.1 e gcc vocˆ tem que fazer as seguintes altera¸˜es.
                           e                                 co
Depois de configurar, edite o ‘config.h’ e ‘include/my_config.h’ e altere a linha que diz
       #define HAVE_SNPRINTF 1
para
       #undef HAVE_SNPRINTF
E finalmente, no ‘mysqld.cc’ vocˆ precisa adicionar um prot´tipo para initgroups.
                                  e                          o
       #ifdef _AIX41
       extern "C" int initgroups(const char *,int);
       #endif
Se vocˆ precisar se alocar muita mem´ria para o processo mysqld, n˜o ´ suficiente apenas
       e                              o                            a e
definir ’ulimit -d unlimited’. Vocˆ tamb´m deve configurar no mysqld_safe algo do tipo:
                                 e      e
       export LDR_CNTRL=’MAXDATA=0x80000000’
Vocˆ pode encontrar mais sobre o uso de muita mem´ria em: http://publib16.boulder.ibm.com/pseries
    e                                             o
US/aixprggd/genprogc/lrg_prg_support.htm.

2.6.6.5 Notas SunOS 4

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

2.6.6.6 Notas Alpha-DEC-UNIX (Tru64)

Se vocˆ est´ usando o egcs 1.1.2 no Digital Unix, vocˆ atualizar par o gcc 2.95.2, j´ que o
      e    a                                         e                              a
egcs no DEC tem v´rios erros graves !
                   a
Quando compilando programas com threads no Digital Unix, a documenta¸˜o recomenda
                                                                           ca
usar a op¸˜o -pthread para cc e cxx e as bibliotecas -lmach -lexc (em adi¸˜o para -
          ca                                                                    ca
lpthread). Vocˆ deve executar o configure parecido com isto:
                e
158                                   MySQL Technical Reference for Version 5.0.0-alpha



      CC="cc -pthread" CXX="cxx -pthread -O" 
      ./configure --with-named-thread-libs="-lpthread -lmach -lexc -lc"
Quando compilando o mysqld, vocˆ deve ver alguns avisos como estes:
                               e
      mysqld.cc: In function void handle_connections()’:
      mysqld.cc:626: passing long unsigned int *’ as argument 3 of
      accept(int,sockadddr *, int *)’
Vocˆ pode ignorar estes altertas com seguran¸a. Eles ocorrem porque o configure s´ pode
    e                                       c                                    o
detectar erros e n˜o alertas.
                  a
Se vocˆ inicia o servidor diretamente da linha de comando, vocˆ pode ter problemas com
      e                                                           e
a finaliza¸˜o do servidor ao sair (log out). (Quando vocˆ sai, seu processo superior recebe
         ca                                               e
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 mysqld_safe, o qual invoca o
mysqld usando nohup por vocˆ. Veja Se¸˜o 4.8.2 [mysqld_safe], P´gina 332.
                             e           ca                       a
Se vocˆ tiver problemas quando compilar mysys/get opt.c, apenas remova a linha #define
      e
 NO PROTO do inicio do arquivo!
Se vocˆ estiver utilizando o compilador CC da Compac, a seguinte linha de configura¸˜o
       e                                                                          ca
dever´ funcionar:
     a
      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 
      -noexceptions -nortti"
      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
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
                                                        e
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
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                               159



     gnumake install
     scripts/mysql_install_db

2.6.6.7 Notas Alpha-DEC-OSF1

Se vocˆ tiver problemas com compila¸˜o e tem o DEC CC e o gcc instalados, tente executar
      e                            ca
o configure desta forma:
     CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 
     ./configure --prefix=/usr/local/mysql
Se vocˆ tiver problemas com o arquivo ‘c_asm.h’, vocˆ pode criar e usar um arquivo
      e                                             e
‘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
fazendo o download do ultimo kit de atualiza¸˜o da DEC (Compaq) de
                          ´                  ca
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
tamb´m aparece estar quebrado (problemas com erros _exit undefined ocorrendo ao ligar
     e
no mysqld). Neste sistema, temos compilado o MySQL com a seguinte linha configure,
depois de substituir /bin/ld com a vers˜o do OSF 4.0C:
                                       a
     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 -noexceptions -nortti
     export CC CFLAGS CXX CXXFLAGS
     ./configure --prefix=/usr/mysql/mysql --with-mysqld-ldflags=-all-static 
                 --disable-shared --with-named-thread-libs="-lmach -lexc -lc"
Em algumas vers˜es do OSF1, a fun¸˜o alloca() est´ quebrada. Corrija isto removendo a
                o                 ca             a
linha no ‘config.h’ que define ’HAVE_ALLOCA’.
A fun¸˜o alloca() pode tamb´m ter um prot´tipo incorreto em /usr/include/alloca.h.
     ca                        e              o
O alerta resultante deste erro pode ser ignorado.
configure ir´ usar a seguinte biblioteca thread automaticamente: --with-named-thread-
            a
libs="-lpthread -lmach -lexc -lc".
Quando usar o gcc, vocˆ tamb´m pode tentar executar configure desta forma:
                      e     e
     shell> CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure ....
160                                     MySQL Technical Reference for Version 5.0.0-alpha



Se vocˆ tiver problemas com sinais (MySQL finalzar inesperadamente sobre alta carga),
      e
vocˆ pode ter encontrado um erro com threads e sinais no SO. Neste caso vocˆ pode dizer
   e                                                                       e
ao MySQL para n˜o usar sinais configurando-o com:
                 a
      shell> CFLAGS=-DDONT_USE_THR_ALARM 
             CXXFLAGS=-DDONT_USE_THR_ALARM 
             ./configure ...
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                           a
mysqladmin shutdown. Neste caso o cliente ir´ morrer quando ele receber o pr´ximo
                                            a                                o
comando.
Com gcc 2.95.2, vocˆ provavelmente encontrar´ o seguinte erro de compila¸˜o:
                   e                        a                           ca
      sql_acl.cc:1456: Internal compiler error in ‘scan_region’, at except.c:2566
      Please submit a full bug report.
Para corrigir isto vocˆ deve alterar para o diret´rio sql e fazer um “corta e cola” da ultima
                       e                         o                                     ´
linha gcc, mas altere -O3 para -O0 (ou adicione -O0 imediatamente depois de gcc se vocˆ     e
n˜o tiver algumas op¸˜o -O na sua linha de compila¸˜o.) Depois disto feito vocˆ deve apenas
  a                   ca                             ca                         e
voltar ao diret´rio superior e executar make novamente.
               o

2.6.6.8 Notas SGI Irix

Se vocˆ estiver usando Irix Vers˜o 6.5.3 ou mais novo, o mysqld s´ ir´ conseguir criar threads
      e                          a                               o a
se vocˆ execut´-lo como um usu´rio com privil´gios de CAP_SCHED_MGT (como root) ou dar
      e        a                  a             e
ao servidor mysqld este privil´gio com o seguinte comando shell:
                               e
      shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld
Vocˆ pode precisar indefinir alguns simbolos em ‘config.h’ depois de executar configure
    e
e antes de compilar.
Em algumas implementa¸˜es Irix, a fun¸˜o alloca() est´ quebrada. Se o servidor mysqld
                      co             ca              a
morrer em alguma instru¸˜o SELECT, remova as linhas de ‘config.h’ que definem HAVE_
                       ca
ALLOC e HAVE_ALLOC_H. Se mysqladmin create n˜o funciona, remova a linha do ‘config.h’
                                             a
que define HAVE_READDIR_R. Vocˆ tamb´m deve precisar remover a linha HAVE_TERM_H.
                              e      e
A SGI recomenda que vocˆ instale todos os patches desta p´gina: http://support.sgi.com/surfzone/patches/
                         e                               a
No m´ inimo, vocˆ deve instalar o ultimo rollup do kernel, o ultimo rollup rld, e o ultimo
                e                 ´                          ´                      ´
rollup libc.
Definitivamente vocˆ precisar´ de todos patches POSIX nesta p´gina, para suporte
                  e         a                               a
pthreads:
http://support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html
Se vocˆ obter o seguinte erro quando estiver compilando o ‘mysql.cc’:
      e
      "/usr/include/curses.h", line 82: error(1084): invalid combination of type
Digite o seguinte no diret´rio topo da sua ´rvore fonte do MySQL:
                          o                a
      shell> extra/replace bool curses_bool < /usr/include/curses.h 
      > include/curses.h
      shell> make
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                  161



Existem relatos de problemas com organiza¸˜o de threads. Se somente uma thread estiver
                                             ca
executando, o sistema fica lento. Pode se evitar isto iniciando outro cliente. Isto pode
acarretar num crescimento de 2 para 10 vezes na velocidade de execu¸˜o para a outra
                                                                      ca
thread. Isto ´ um problema n˜o compreendido com threads Irix; vocˆ deve improvisar para
             e                a                                  e
encontrar solu¸˜es at´ que isto seja resolvido.
               co    e
Se vocˆ estiver compilando com gcc, vocˆ pode usar o seguinte comando configure:
      e                                e
      CC=gcc CXX=gcc CXXFLAGS=-O3 
      ./configure --prefix=/usr/local/mysql --enable-thread-safe-client 
      --with-named-thread-libs=-lpthread
No Irix 6.5.11 com Irix C nativo e compiladores C++ ver. 7.3.1.2, o seguinte ir´ funcionar
                                                                               a
      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-innodb --with-berkeley-db 
      --with-libwrap=/usr/local 
      --with-named-curses-libs=/usr/local/lib/libncurses.a

2.6.6.9 Notas SCO

A vers˜o atual foi testado somente nos sistemas “sco3.2v5.0.4” e “sco3.2v5.0.5”. A vers˜oo
      a                                                                                a
para o “sco 3.2v4.2” tamb´m tem tido muito progresso.
                           e
At´ o momento o compilador recomendado no OpenServer ´ o gcc 2.95.2. Com isto vocˆ
  e                                                  e                           e
deve estar apto a compilar o MySQL apenas com:
      CC=gcc CXX=gcc ./configure ... (op¸~es)
                                        co
 1. Para o OpenServer 5.0.X vocˆ precisa usar gcc-2.95.2p1 ou mais novo da Skunkware.
                               e
    http://www.SCO.com/skunkware/ e ecolher o pacote OpenServer browser ou por ftp
    em ftp to ftp2.SCO.com no diret´rio pub/skunkware/osr5/devtools/gcc.
                                   o
 2. Vocˆ precisa do GCC vers˜o 2.5.x para este produto e do sistema de desenvolvimento.
        e                     a
    Eles s˜o necess´rios nesta vers˜o do SCO Unix. Vocˆ n˜o pode usar apenas o sistema
          a        a               a                  e a
    GCC Dev.
 3. Vocˆ deve obter o pacote FSU Pthreads e instal´-lo primeiro. Pode ser obtido em
       e                                           a
    http://www.cs.wustl.edu/~schmidt/ACE_wrappers/FSU-threads.tar.gz.          Vocˆ
                                                                                  e
    pode tamb´m obter um pacote precompilado de http://www.mysql.com/Downloads/SCO/FSU-threads
             e
 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
    instalado usando uma boa vers˜o do GCC 2.5.x ODT ou OS 3.0, no qual vocˆ necessi-
                                   a                                        e
    tar´ de uma boa vers˜o do GCC 2.5.x. Existem v´rios problemas sem uma boa vers˜o.
       a                a                             a                           a
    Esta vers˜o do produto necessita do sistema de Desenvolvimento SCO Unix. Sem ele,
             a
    vocˆ estar´ perdendo as bibliotecas e o editor de liga¸˜o necess´rio.
        e     a                                           ca        a
 5. Para construir a FSU Pthreads no seu sistema, fa¸a o seguinte:
                                                    c
     1. Execute ./configure no diret´rio ‘threads/src’ e selecione a op¸˜o SCO
                                      o                                 ca
        OpenServer. Este comando copia ‘Makefile.SCO5’ para ‘Makefile’.
     2. Execute make.
162                                    MySQL Technical Reference for Version 5.0.0-alpha



       3. Para instalar no diret´rio padr˜o ‘/usr/include’, use o usu´rio root, depois mude
                                o        a                           a
          para o diret´rio ‘thread/src’ e execute make install
                      o
 6. Lembre de usar o GNU make quando estiver construindo o MySQL.
 7. Se vocˆ n˜o iniciou o mysqld_safe como root, vocˆ provavelmente s´ ir´ obter, por
          e a                                          e                o a
    padr˜o, os 110 arquivos abertos por processo. O mysqld ir´ gravar uma nota sobre isto
        a                                                    a
    no arquivo log.
 8. Com o SCO 3.2V5.0.5, vocˆ deve usar o FSU Pthreads vers˜o 3.5c ou mais nova. Vocˆ
                             e                             a                        e
    deve tamb´m usar o gcc 2.95.2 ou mais novo.
             e
      O seguinte comando configure deve funcionar:
           shell> ./configure --prefix=/usr/local/mysql --disable-shared
 9. Com SCO 3.2V4.2, vocˆ deve usar FSU Pthreads vers˜o 3.5c ou mais nova. O seguinte
                        e                            a
    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"
      Vocˆ pode ter alguns problemas com alguns arquivos de inclus˜o.
          e                                                                   a    Neste
      caso, vocˆ pode encontrar novos arquivos de inclus˜o espec´
               e                                              a        ificos do SCO em
      http://www.mysql.com/Downloads/SCO/SCO-3.2v4.2-includes.tar.gz. Vocˆ deve   e
      descompactar este arquivo no diret´rio ‘include’ da sua ´rvore fonte do MySQL.
                                        o                     a
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
   diz que suas bibliotecas de fun¸˜es s˜o re-entrantes, ent˜o elas devem ser re-entrantes
                                   co   a                   a
   com as FSU-Pthreads. FSU Pthreads no OpenServer tentam usar o esquema SCO para
   criar bibliotecas re-entrantes.
 • FSU Pthreads (ao menos a vers˜o em http://www.mysql.com) vem ligada com GNU
                                a
   malloc. Se vocˆ encontrar problemas com uso de mem´ria, tenha certeza que o
                    e                                     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
   deve remove-lo se vocˆ deseja executar o mysqld em uma m´quina OpenServer 5.0.6.
                        e                                   a
 • A SCO fornece Patches do Sistema Operacional em ftp://ftp.sco.com/pub/openserver5
   para OpenServer 5.0.x
 • A SCO fornece corre¸˜es de seguran¸a e libsocket.so.2 em ftp://ftp.sco.com/pub/security/OpenSer
                      co             c
   e ftp://ftp.sco.com/pub/security/sse para OpenServer 5.0.x
 • Corre¸˜es de seguran¸a pre-OSR506.
        co             c                  Tamb´ a corre¸˜o do telnetd em
                                              e          ca
   ftp://stage.caldera.com/pub/security/openserver/ ou ftp://stage.caldera.com/pub/securi
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                              163



    com a libsocket.so.2 e libresolv.so.1 com instru¸˜es para instalar em sistemas pre-
                                                    co
    OSR506.
    ´
    E provavelmente uma boa id´ia para instalar os patches acima tentando compilar/usar
                                e
    o MySQL.
Se vocˆ deseja instalar o DBI no SCO, vocˆ deve editar o ‘Makefile’ em DBI-xxx e cada
      e                                  e
subdiret´rio.
        o
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
Isto ´ porque o carregador dinˆmico Perl n˜o ir´ carregar os m´dulos DBI se elas foram
     e                        a           a    a              o
compiladas com icc ou cc.
Perl trabalha melhor quando compilado com cc.

2.6.6.10 Notas SCO Unixware Version 7.0

Vocˆ deve usar uma vers˜o de MySQL pelo menos t˜o recente quando a Vers˜o 3.22.13
   e                   a                          a                       a
e UnixWare 7.1.0 porque esta vers˜o corrige alguns problemas de portabilidade sob o
                                 a
Unixware.
N´s temos compilado o MySQL com o seguinte comando configure no UnixWare Vers˜o
  o                                                                          a
7.1.x:
     CC=cc CXX=CC ./configure --prefix=/usr/local/mysql
Se vocˆ deseja usar o gcc, dever´ ser usado o gcc 2.95.2 ou mais novo.
      e                         a
     CC=gcc CXX=g++ ./configure --prefix=/usr/local/mysql
 1. A SCO fornece Patches do Sistema Operacional em ftp://ftp.sco.com/pub/unixware7
     para UnixWare 7.1.1 e 7.1.3 ftp://ftp.sco.com/pub/openunix8 para OpenUNIX
    8.0.0
 2. A SCO fornece informa¸˜o sobre Security Fixes em ftp://ftp.sco.com/pub/security/OpenUNIX
                         ca
    para OpenUNIX ftp://ftp.sco.com/pub/security/UnixWare para UnixWare
164                                    MySQL Technical Reference for Version 5.0.0-alpha



2.6.7 Notas OS/2

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

2.6.8 Notas Novell NetWare

Portar o MySQL para NetWare foi um grande esfor¸o da Novell. Os clientes da Novell estar˜o
                                               c                                        a
satisfeitos ao notarem que o NetWare 6.5 vir´ com os bin´rios do MySQL, completa com
                                            a            a
uma licen¸a de uso comercial automatica para todos os servidores executando esta vers˜o
           c                                                                            a
do NetWare.
Veja Se¸˜o 2.1.4 [Instala¸˜o NetWare], P´gina 74.
       ca                ca             a
MySQL para NetWare ´ compilado usando um combina¸˜o do Metrowerks CodeWarrior
                        e                               ca
for NetWare e uma vers˜o especial de compila¸˜o cruzada do GNU autotools. Verifique
                          a                    ca
esta se¸˜o no futuro para mais informa¸˜es sobre constru¸˜o e otimiza¸˜o do MySQL para
       ca                             co                ca           ca
NetWare.
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                  165



2.6.9 Notas BeOS

N´s j´ falamos com alguns desenvolvedores BeOS que disseram que o MySQL est´ 80%
 o a                                                                       a
portado para o BeOS, mas n´s n˜o sabemos qual a situa¸˜o no momento.
                          o a                        ca

2.7 Coment´rios de Instala¸˜o do Perl
          a               ca

2.7.1 Instalando Perl no Unix

O suporte Perl para o MySQL ´ fornecido pela interface cliente DBI/DBD. Veja Se¸˜o 12.5
                                 e                                                 ca
[Perl], P´gina 877. O c´digo do cliente Perl DBD/DBI exige Perl Vers˜o 5.004 ou posterior.
         a              o                                           a
A interface n˜o funcionar´ se vocˆ tiver uma vers˜o mais do Perl.
                a          a       e                a
O suporte MySQL Perl tamb´m exige que vocˆ tenha instalado o suporte a programa¸˜o
                               e                  e                                      ca
do cliente MySQL. Se vocˆ instalou o MySQL a partir de arquivos RPM, os programas
                             e
cliente est˜o no cliente RPM, mas o suporte a programa¸˜o do cliente est´ no RPM de
            a                                             ca                a
desenvolvimento. Certifique de se instalar este RPM posteriormente.
Na Vers˜o 3.22.8, o suporte Perl ´ distribu´ separadamente do dsitribui¸˜o principal do
         a                          e         ido                         ca
MySQL. Se vocˆ quiser instalar o suporte Perl, os arquivos que vocˆ precisr´ pode ser
                  e                                                   e        a
obtidos em http://www.mysql.com/downloads/api-dbi.html.
As distribui¸˜es Perl s˜o fornecidas como arquios tar compactados e s˜o chamados
               co        a                                                   a
‘MODULE-VERSION.tar.gz’, onde MODULE ´ o nome do modulo e VERSION ´ o n´mero da
                                            e                              e     u
vers˜o. Vocˆ deve conseguir as distribui¸˜es Data-Dumper, DBI, e DBD-mysql e instal´-las
     a        e                           co                                           a
nesta ordem. O procedimento de instala¸˜o ´ mostrado aqui. O exemplo mostrado ´ para
                                          ca e                                       e
o m´dulo Data-Dumper, mas o procedimento ´ o mesmo para todas as distribui¸˜es:
     o                                          e                              co
  1. Descompacte as distribui¸˜es no diret´rio atual:
                               co           o
            shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf -
      Este comando cria um diret´rio chamado ‘Data-Dumper-VERSION’.
                                  o
  2. Entre no diret´rio principal da distribui¸˜o descompactada:
                    o                          ca
            shell> cd Data-Dumper-VERSION
  3. Contrua a dsitribui¸˜o e compile tudo:
                         ca
            shell> perl Makefile.PL
            shell> make
            shell> make test
            shell> make install
O comando make test ´ importante porque verifica que o m´dulo est´ funcionando. Note
                         e                                    o        a
que ao executar este comando durante a instala¸˜o do DBD-mysql para exercitar o c´digo
                                                  ca                                 o
da interface, o servidor MySQL deve estar em execu¸˜o ou teste ir´ falhar.
                                                       ca           a
´
E uma boa id´ia reconstruir e reinstalar a distribui¸˜o DBD-mysql mesmo se vocˆ instalar
               e                                      ca                         e
uma nova distribui¸˜o do MySQL, particularmente se vocˆ notar simntomas como se todos
                    ca                                      e
os seus scripts DBI realizarem dump core depois de vocˆ atualizar o MySQL.
                                                          e
Se vocˆ n˜o tem o direito para instalar os m´dulos Perl no diret´rio de sistema ou se vocˆ
       e a                                    o                   o                      e
quiser instalar m´dulos Perl locais, a seguinte referˆncia pode ajud´-lo:
                  o                                  e              a
166                                   MySQL Technical Reference for Version 5.0.0-alpha



     http://servers.digitaldaze.com/extensions/perl/modules.html#modules
Procure sob o t´  itulo Installing New Modules that Require Locally Installed
Modules.

2.7.2 Instalaando ActiveState Perl no Windows

Para instalar o m´dulo DBD do MySQL com ActiveState Perl no Windows, vocˆ deve fazer
                 o                                                      e
o seguinte:
 • Obter o ActiveState Perl em http://www.activestate.com/Products/ActivePerl/
   e instal´-lo.
           a
 • Abrir um prompt do DOS.
 • Se exigido, configurar a vari´vel HTTP_proxy. Por exemplo, vocˆ pode tentar:
                               a                                e
          set HTTP_proxy=my.proxy.com:3128
 • Inicie o progrma PPM:
          C:> c:perlbinppm.pl
 • Se vocˆ j´ n˜o o fez, instale o DBI:
         e a a
          ppm> install DBI
 • Se der tudo certo, execute o seguinte comando:
          install 
          ftp://ftp.de.uu.net/pub/CPAN/authors/id/JWIED/DBD-mysql-1.2212.x86.ppd
O acima deve funcionar pelo menos com o ActiveState Perl Vers˜o 5.6.
                                                             a
Se vocˆ n˜o puder fazer o mostrado acima funcionar, vocˆ deve instalar o driver MyODBC e
      e a                                              e
conectar ao servidor MySQL atrav´s do ODBC:
                                 e
      use DBI;
      $dbh= DBI->connect("DBI:ODBC:$dsn",$user,$password) ||
        die "Got error $DBI::errstr when connecting to $dsnn";

2.7.3 Problemas Usando a Interface Perl DBI/DBD

Se Perl informar que n˜o pode encontrar o m´dulo ‘../mysql/mysql.so’, ent˜o o
                       a                    o                                a
problema mais prov´vel ´ que o Perl n˜o pode localizar a biblioteca compartilhada
                  a     e            a
‘libmysqlclient.so’.
Vocˆ pode corrigir isto por qualquer um dos seguintes m´todos:
   e                                                   e
 • Compile a distribui¸˜o DBD-mysql com perl Makefile.PL -static -config em vez
                      ca
   de perl Makefile.PL.
 • Copie ‘libmysqlclient.so’ para a diret´rio onde sua bibliotecas compartilhadas est˜o
                                          o                                          a
   localizadas (provavelmente ‘/usr/lib’ ou ‘/lib’).
 • No Linux vocˆ pode adicionar o caminho do diret´rio onde ‘libmysqlclient.so’ est´
                 e                                o                                a
   localizado ao arquivo ‘/etc/ld.so.conf’.
 • Adicione o caminho do diret´rio onde ‘libmysqlclient.so’ est´ localizada ` vari´vel
                              o                                a            a     a
   de ambiente LD_RUN_PATH.
Cap´
   ıtulo 2: Instala¸˜o do MySQL
                   ca                                                                  167



Se voce receber os seguintes erros de DBD-mysql, vocˆ provavelmente est´ usando gcc (ou
                                                      e                    a
usando um bin´rio antigo compilado com gcc):
                a
      /usr/bin/perl: can’t resolve symbol ’__moddi3’
      /usr/bin/perl: can’t resolve symbol ’__divdi3’
Adicione -L/usr/lib/gcc-lib/... -lgcc ao comando de liga¸˜o quando a biblioteca
                                                                  ca
‘mysql.so’ estiver constru´ (verifique a sa´ de make para ‘mysql.so’ quando vocˆ
                            ida                  ida                                        e
compilar o cliente Perl). A op¸˜o -L deve especificar o caminho do diret´rio onde
                                   ca                                             o
‘libgcc.a’ est´ localizada no seu sistema.
                a
Outra causa deste problema pode ser que Perl e o MySQL n˜o s˜o compilados com gcc.
                                                               a a
Neste caso, vocˆ pode resolver o problema compilando ambos com gcc.
                 e
Se vocˆ receber o seguinte erro de DBD-mysql quando executar o teste:
       e
      t/00base............install_driver(mysql) failed:
      Can’t load ’../blib/arch/auto/DBD/mysql/mysql.so’ for module DBD::mysql:
      ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol:
      uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169.
significa que vocˆ precisa adicionar a biblioteca compactada, -lz, a sua linha de liga¸˜o.
                   e                                                                    ca
Isto pode ser feito com a seguinte altera¸˜o no arquivo ‘lib/DBD/mysql/Install.pm’:
                                          ca
      $sysliblist .= " -lm";
Altere esta linha para:
      $sysliblist .= " -lm -lz";
Depois disto, vocˆ deve executar ’make realclean’ e proceder com o instala¸˜o desde o in´
                   e                                                       ca           icio.
Se vocˆ quiser usar o m´dulo Perl em um sistema que n˜o suporta liga¸˜o dinˆmica (como
       e                o                                a              ca      a
SCO) vocˆ pode gerar uma vers˜o est´tica do Perl que inclui DBI e DBD-mysql. O modo
          e                      a      a
que isto funciona ´ que vocˆ gera uma vers˜o do Perl com o ¸odigo DBI ligado e instalado
                     e      e                a                c
no topo do seu Perl atual. Entao vocˆ o utiliza para construir uma vers˜o do Perl que
                                         e                                    a
adicionalmente tem o c´digo DBD ligado em si, e instale-o.
                        o
No SCO, vocˆ deve ter as seguintes vari´veis de ambiente configuradas:
              e                           a
      shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib
      ou
      shell> LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:
      /usr/progressive/lib:/usr/skunk/lib
      shell> LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:
      /usr/progressive/lib:/usr/skunk/lib
      shell> MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:
      /usr/skunk/man:
Primeiro crie um Perl que inclui um m´dulo DBI ligado estaticamente executando estes
                                           o
comandos no diret´rio onde a sua distribui¸˜o DBI est´ localiada:
                      o                      ca        a
      shell> perl Makefile.PL -static -config
      shell> make
      shell> make install
      shell> make perl
Ent˜o vocˆ deve intalar o novo Perl. A sa´ de make perl indicar´ o comando make
    a      e                                    ida                      a
exato que vocˆ precisar´ executar para realizar a instala¸˜o. No SCO, isto ´ make -f
                e         a                                 ca                    e
Makefile.aperl inst_perl MAP_TARGET=perl.
168                                  MySQL Technical Reference for Version 5.0.0-alpha



A seguir use o Perl r´cem criado para criar outro Perl que tamb´m inclui uma DBD::mysql
                     e                                         e
estaticamente ligado rodando estes comandos no diret´rio onde sua distribui¸˜o DBD-mysql
                                                      o                    ca
est´ localizada:
   a
       shell> perl Makefile.PL -static -config
       shell> make
       shell> make install
       shell> make perl
Finalmente vocˆ deve instalar este novo Perl. Novamente, a sa´ de make perl indica o
                 e                                             ida
comando a usar.
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                       169



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

3.1 Conectando e Desconectando do Servidor

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

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

      mysql>
O prompt lhe diz que o mysql est´ pronto para que vocˆ digite os comandos.
                                a                    e
170                                    MySQL Technical Reference for Version 5.0.0-alpha



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


3.2 Fazendo Consultas

Tenha certeza que vocˆ est´ conectado ao servidor, como discutido na se¸˜o anterior. Isto
                        e    a                                          ca
feito, n˜o ser´ selecionado nenhum banco de dados para trabalhar, mas n˜o tem problemas.
        a     a                                                        a
Neste momento, ´ mais importante saber um pouco sobre como fazer consultas do que j´
                   e                                                                    a
criar tabelas, carregar dados para elas, e recuperar dados delas. Esta se¸˜o descreve os
                                                                          ca
princ´ipios b´sicos da entrada de comandos, usando diversas consultas vocˆ pode tentar se
             a                                                           e
familiarizar com o funcionamento do mysql.
Aqui est´ um comando simples que solicita ao servidor seu n´mero de vers˜o e a data atual.
        a                                                  u            a
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>
Esta consulta ilustra v´rias coisas sobre o mysql:
                       a
 • Um comando normalmente consiste de uma instru¸˜o SQL seguida por um ponto e
                                                   ca
   v´
    irgula. (Existem algumas exce¸˜es onde um ponto e v´
                                  co                     irgula podem ser omitidos.
   QUIT mencionado anteriormente, ´ um deles. Saberemos de outros mais tarde.)
                                  e
 • Quando vocˆ emite um comando, o mysql o envia para o servidor para execu¸˜o e
               e                                                                   ca
   mostra os resultados, depois imprime outro prompt mysql> para indicar que est´ pronto
                                                                                 a
   para outro comando.
 • O mysql mostra a sa´ da consulta em forma tabular (linhas e colunas). A primeira
                         ida
   linha cont´m r´tulos para as colunas. As linhas seguintes s˜o o resultado da consulta.
             e    o                                           a
   Normalmente, r´tulos de colunas s˜o os nomes das colunas que vocˆ busca das tabelas
                    o                 a                               e
   do banco de dados. Se vocˆ est´ recuperando o valor de uma express˜o no lugar de
                               e    a                                     a
   uma coluna de tabela (como no exemplo j´ visto), o mysql rotula a coluna usando a
                                              a
   pr´pria express˜o.
      o            a
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                      171



 • O mysql mostra quantas linhas foram retornadas e quanto tempo a consulta levou
   para executar, o que lhe d´ uma vaga id´ia da performance do servidor. Estes valores
                             a             e
   s˜o impreciso porque eles representam tempo de rel´gio (N˜o tempo de CPU ou de
    a                                                   o      a
   m´quina), e porque eles s˜o afetados pelos fatores como a carga do servidor e latˆncia
     a                      a                                                       e
   de rede. (Para resumir, a linha “rows in set” n˜o ´ mostrada nos exemplos seguintes
                                                   a e
   deste cap´
            itulo.)
Palavras Chave podem ser entradas em qualquer caso de letra. As seguintes consultas s˜o a
equivalentes:
      mysql> SELECT VERSION(), CURRENT_DATE;
      mysql> select version(), current_date;
      mysql> SeLeCt vErSiOn(), current_DATE;
Aqui est´ outra consulta. Ela demonstra que vocˆ pode usar o mysql como uma calculadora
         a                                      e
simples:
      mysql> SELECT SIN(PI()/4), (4+1)*5;
      +-------------+---------+
      | SIN(PI()/4) | (4+1)*5 |
      +-------------+---------+
      |     0.707107 |          25 |
      +-------------+---------+
As consultas mostradas at´ agora tˆm sido instru¸˜es relativamente pequenas, de uma linha.
                          e        e            co
Vocˆ pode tamb´m entrar com m´ltiplas instru¸˜es em uma unica linha. Basta finalizar
    e            e                 u            co             ´
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 |
      +---------------------+
Um comando n˜o necessita estar todo em uma unica linha, ent˜o comandos extensos que
                a                                ´               a
necessitam de v´rias linhas n˜o s˜o um problema. O mysql determina onde sua instru¸˜o
                a            a a                                                        ca
termina atrav´s do ponto e v´
              e              irgula terminador, e n˜o pelo final da linha de entrada. (Em
                                                     a
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.)
Aqui est´ uma instru¸˜o simples usando m´ltiplas linhas:
         a           ca                     u
      mysql> SELECT
           -> USER()
           -> ,
           -> CURRENT_DATE;
      +--------------------+--------------+
172                                    MySQL Technical Reference for Version 5.0.0-alpha



       | USER()                   | CURRENT_DATE |
       +--------------------+--------------+
       | joesmith@localhost | 1999-03-18          |
       +--------------------+--------------+
Neste exemplo, note como o prompt altera de mysql> para -> depois de vocˆ entrar a e
primeira linha de uma consulta com m´ltiplas linhas. Isto ´ como o mysql indica que ainda
                                        u                  e
n˜o achou uma instru¸˜o completa e est´ esperando pelo resto. O prompt ´ seu amigo,
  a                      ca                a                                     e
porque ele fornece um retorno valioso. Se vocˆ usa este retorno, vocˆ sempre estar´ ciente
                                              e                       e              a
do que o mysql est´ esperando.
                    a
Se vocˆ decidir que n˜o deseja executar um comando que est´ no meio do processo de
        e                a                                      a
entrada, cancele-o digitando c:
       mysql> SELECT
           -> USER()
           -> c
       mysql>
Note o prompt aqui tamb´m. Ele troca para o mysql> depois de vocˆ digitar c, fornecendo
                            e                                       e
retorno para indicar que o mysql est´ pronto para um novo comando.
                                      a
A seguinte tabela mostra cada dos prompts que vocˆ pode ver e resume o que ele significa
                                                     e
sobre o estado em que o mysql se encontra:
Prompt      Significado
mysql>      Pronto para novo comando.
      ->    Esperando pela pr´xima linha de comando com m´ltiplas linhas.
                                o                             u
      ’>    Esperando pela pr´xima linha, coletando uma string que comece com
                                o
            uma aspas simples (‘’’).
      ">    Esperando pela pr´xima linha, coletando uma string que comece com
                                o
            aspas duplas (‘"’).
      ‘>    Esperando pela pr´xima linha, coletando uma string que comece com
                                o
            crase (‘‘’).
´ muito comum instru¸˜es multi-linhas ocorrerem por acidente quando vocˆ pretende pub-
E                        co                                                  e
licar 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()
           ->
Se isto ocorrer com vocˆ (acha que entrou uma instru¸˜o mas a unica resposta ´ um prompt
                         e                           ca        ´                 e
->), o mais prov´vel ´ que o mysql est´ esperando pelo ponto e v´
                  a      e                a                             irgula. Se vocˆ n˜o
                                                                                       e a
perceber o que o prompt est´ lhe dizendo, vocˆ pode parar por um tempo antes de entender
                              a               e
o que precisa fazer. Entre com um ponto e v´  irgula para completar a instru¸˜o, e o mysql
                                                                               ca
ir´ execut´-la:
  a       a
       mysql> SELECT USER()
           -> ;
       +--------------------+
       | USER()                   |
       +--------------------+
       | joesmith@localhost |
       +--------------------+
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                       173



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

3.3 Cria¸˜o e Utiliza¸˜o de um Banco de Dados
        ca           ca

Agora que vocˆ j´ sabe como entrar com os comandos, ´ hora de acessar um banco de dados.
             e a                                    e
Suponha que vocˆ tenha diversos animais de estima¸˜o em sua casa (menagerie) e vocˆ
                  e                                   ca                                 e
gostaria de ter o registro de v´rios tipos de informa¸˜es sobre eles. Vocˆ pode fazer isto
                               a                     co                  e
criando tabelas para armazenar seus dados e carreg´-los com a informa¸˜o desejada. Depois
                                                   a                  ca
vocˆ pode responder diferentes tipos de quest˜es sobre seus animais recuperando dados das
    e                                         o
tabelas. Esta se¸˜o mostrar´ como:
                ca          a
 •   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
174                                    MySQL Technical Reference for Version 5.0.0-alpha



O banco de dados menagerie ser´ simples (deliberadamente), mas n˜o ´ dif´
                                  a                                  a e     icil
pensar em situa¸˜es na vida real em que um tipo similar de banco de dados pode
                 co
ser usado. Por exemplo, um banco de dados deste tipo pode ser usado por um
fazendeiro para gerenciar seu estoque de animais, ou por um veterin´rio para
                                                                        a
gerenciar registros de seus pacientes. Uma distribui¸˜o do menagerie contendo
                                                      ca
algumas das consultas e dados de exemplos usados nas se¸˜es seguintes podem ser
                                                         co
obtidas do site Web do MySQL. Est˜o dispon´
                                    a      iveis tanto no formato tar comprimido
(http://www.mysql.com/Downloads/Contrib/Examples/menagerie.tar.gz) como no
formato Zip (http://www.mysql.com/Downloads/Contrib/Examples/menagerie.zip).
Utilize a instru¸˜o SHOW para saber quais bancos de dados existem atualmente no servidor:
                ca
      mysql> SHOW DATABASES;
      +----------+
      | Database |
      +----------+
      | mysql    |
      | test     |
      | tmp      |
      +----------+
A lista de bancos de dados provavelmente ser´ diferente na sua m´quina, mas os bancos de
                                               a                   a
dados mysql e test provavelmente estar˜o entre eles. O banco de dados mysql ´ necess´rio
                                          a                                     e      a
porque ele descreve privil´gios de acessos de usu´rios. O banco de dados test ´ geralamente
                          e                      a                            e
fornecido como um espa¸o para que os usu´rios possam fazer testes.
                         c                   a
Note que vocˆ n˜o pode ver todos os banco de dados se vocˆ n˜i tiver o privil´gio SHOW
            e a                                          e a                 e
DATABASES. Veja Se¸˜o 4.4.1 [GRANT], P´gina 255.
                  ca                  a
Se o banco de dados test existir, tente acess´-lo:
                                             a
      mysql> USE test
      Database changed
Perceba que o USE, como o QUIT, n˜o necessitam de um ponto e v´
                                    a                                  irgula. (Vocˆ pode
                                                                                   e
terminar tais declara¸˜es com uma ponto e v´
                     co                    irgula se gostar; isto n˜o importa) A instru¸˜o
                                                                   a                   ca
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                                        e
seguem mas qualquer coisa que vocˆ criar neste banco de dados pode ser removido por
                                  e
qualquer um com acesso a ele. Por esta raz˜o, vocˆ provavelmente deve pedir permiss˜o
                                          a      e                                  a
ao seu administrador MySQL para usar um banco de dados pr´prio. Suponha que vocˆ o
                                                            o                      e
chame de menagerie. O administrador precisar executar um comando como este:
      mysql> GRANT ALL ON menagerie.* TO ’your_mysql_name’@’your_client_host’;
onde seu_usu´rio_mysql ´ o nome do usu´rio MySQL atribuido a vocˆ e your_client_
            a            e                a                     e
host ´ a m´quina da qual vocˆ se conecta ao servidor.
     e    a                 e

3.3.1 Criando e Selecionando um Banco de Dados

Se o administrador criar seu banco de dados quando configurar as suas permiss˜es, vocˆ
                                                                            o       e
pode come¸ar a us´-lo. Sen˜o, vocˆ mesmo precisa cri´-lo:
         c       a         a     e                  a
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                        175



      mysql> CREATE DATABASE menagerie;
No Unix, nomes de bancos de dados s˜o caso sensitivo (ao contr´rio das palavras chave
                                       a                           a
SQL), portanto vocˆ deve sempre fazer referˆncia ao seu banco de dados como menagerie
                   e                        e
e n˜o Menagerie, MENAGERIE ou outra varia¸˜o. Isto tamb´m ´ verdade para nomes de
   a                                         ca              e e
tabelas. (No Windows, esta restri¸˜o n˜o se aplica, entiretanto vocˆ deve referenciar os
                                   ca a                                e
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
Seu banco de dados necessita ser criado somente uma unica vez, mas vocˆ deve selecion´-lo
                                                    ´                 e              a
para o uso cada vez que vocˆ iniciar uma se¸˜o mysql. Vocˆ pode fazer isso usando a
                              e              ca               e
instru¸˜o USE como visto no exemplo. Uma forma alternativa ´ selecionar o banco de dados
      ca                                                    e
na linha de comando quando vocˆ chamar o mysql. Apenas especifique seu nome depois de
                                e
qualquer parˆmetro de conex˜o que vocˆ pode precisar fornecer. Por exemplo:
             a               a          e
      shell> mysql -h servidor -u usuario -p menagerie
      Enter password: ********
Perceba que menagerie n˜o ´ sua senha no comando mostrado. Se vocˆ precisar passar sua
                         a e                                        e
senha na linha de comando depois da op¸˜o -p, vocˆ deve fazˆ-lo sem usar espa¸os (por
                                       ca          e         e                 c
exemplo, -pminhasenha e n˜o como em -p minhasenha). Entretando, colocando sua senha
                           a
na linha de comando n˜o ´ recomendado, porque isto exp˜e sua senha permitindo que outro
                       a e                            o
usu´rio utilize a sua m´quina.
    a                  a

3.3.2 Criando uma Tabela

Criar o banco de dados ´ a parte f´cil, mas neste ponto ele est´ vazio, como o SHOW TABLES
                       e          a                            a
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
vocˆ precisar´ e que colunas estar˜o em cada uma delas.
   e         a                    a
Vocˆ ir´ precisar de uma tabela para guardar um registro para cada um de seus animais
    e a
de estima¸˜o. Esta tabela pode ser chamada pet, e ela deve conter, pelo menos, o nome
          ca
de cada animal. Como o nome por si s´ n˜o ´ muito interessante, a tabela dever´ conter
                                       o a e                                  a
outras informa¸˜es. Por exemplo, se mais de uma pessoa na sua fam´ tamb´m tem
               co                                                     ilia    e
animais, vocˆ pode desejar listar cada dono. Vocˆ pode tamb´m desejargravar algumas
             e                                     e         e
informa¸˜es descritivas b´sicas como esp´cie e sexo.
        co               a              e
Que tal a idade? Pode ser do interesse, mas n˜o ´ uma boa coisa para se armazenar em um
                                              a e
banco de dados. A idade muda ` medida em que o tempo passa, o que significa que vocˆ
                                 a                                                       e
sempre ter´ de atualizar seus registros. Em vez disso, ´ melhor armazenar um valor fixo
           a                                             e
como a data de nascimento. Ent˜o, sempre que vocˆ precisar da idade, basta vocˆ calcul´-la
                                a                    e                         e      a
como a diferen¸a entre a data atual e a data de anivers´rio. O MySQL fornece fun¸˜es para
               c                                       a                         co
fazer aritm´tica de datas, ent˜o isto n˜o ´ dif´
           e                  a         a e     icil. Armazenando datas de anivers´rio no
                                                                                   a
lugar da idade tamb´m oferece outras vantagens:
                    e
176                                    MySQL Technical Reference for Version 5.0.0-alpha



 • Vocˆ pode usar o banco de dados para tarefas como gerar lembretes para anivers´rios
       e                                                                               a
   que est˜o chegando. (Se vocˆ pensa que este tipo de query ´ algo bobo, perceba que
          a                       e                               e
   ´ a mesma quest˜o que vocˆ perguntar no contexto de um banco de dados comercial
   e                 a          e
   para identificar clientes para quais vocˆ precisar´ enviar cart˜o de anivers´rio, para um
                                          e         a            a            a
   toque pessoal assistido pelo computador.)
 • Vocˆ pode calcular a idade em rela¸˜o a outras datas diferente da data atual. Por
       e                                 ca
   exemplo, se vocˆ armazenar a data da morte no banco de dados, vocˆ poder´ facilmente
                   e                                                    e       a
   calcular qual a idade que o bicho tinha quando morreu.
Vocˆ provavelmente pode pensar em outros tipos de informa¸˜es que poder˜o ser uteis
    e                                                           co             a       ´
na tabela pet, mas as identificadas at´ o momento s˜o suficientes por agora: nome(name),
                                      e              a
dono(owner), esp´cie(species), sexo(sex), data de nascimento(birth) e data da morte(death).
                  e
Utilize a sente¸a CREATE TABLE para especificar o layout de sua tabela:
                c
      mysql> CREATE TABLE pet (nome VARCHAR(20), owner VARCHAR(20),
             -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
VARCHAR ´ uma boa escolha para os campos name, owner, e species porque os valores da
           e
coluna s˜o de tamanho vari´vel. Os tamanhos destas colunas n˜o precisam necess´riamente
         a                 a                                  a                  a
de ser os mesmos e n˜o precisam ser 20. Vocˆ pode escolher qualquer tamanho de 1 a 255,
                      a                       e
o que vocˆ achar melhor. (Se vocˆ n˜o fizer uma boa escolha e depois precisar de um campo
           e                     e a
maior, o MySQL fornece o comando ALTER TABLE.)
O sexo dos animais podem ser representados em v´rias formas, por exemplo, "m" e "f" ou
                                                   a
                             ´
mesmo "macho" e "f^mea". E mais simples usar os caracteres "m" e "f".
                      e
O uso do tipo de dados DATE para as colunas birth e death s˜o obviamente a melhor
                                                                   a
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                      |
      +---------------------+
Para verificar se sua tabela foi criada da forma que vocˆ esperava, utilize a instru¸˜o
                                                            e                            ca
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      |         |
      +---------+-------------+------+-----+---------+-------+
Vocˆ pode usar DESCRIBE a qualquer hora, por exemplo, se vocˆ esquecer os nomes das
    e                                                              e
colunas na sua tabela ou de que tipos elas tˆm.
                                             e
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                      177



3.3.3 Carregando dados em uma tabela

Depois de criar sua tabela, vocˆ precisar´ povo´-la. As instru¸˜es LOAD DATA e INSERT s˜o
                               e         a     a              co                       a
uteis para isto.
´
Suponha que seu registro de animais possa ser descrito como ´ abaixo: (Observe que o
                                                            e
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     1979-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
Como vocˆ est´ come¸ando com uma tabela vazia, uma forma simples de povo´-la ´ criar
         e    a      c                                                    a e
um arquivo texto contendo uma linha para cada um de seus animais, e depois carregar o
conte´do do arquivo para a tabela com uma simples instru¸˜o.
     u                                                  ca
Vocˆ pode criar um arquivo texto ‘pet.txt’ contendo um registro por linha, com valores
    e
separado por tabula¸˜es e na mesma ordem em que as colunas foram listadas na instru¸˜o
                     co                                                                ca
CREATE TABLE. Para valores em falta (como sexo desconhecido ou data da morte para
animais que ainda est˜o vivos), vocˆ pode usar valores NULL. Para represent´-lo em seu
                        a             e                                         a
                                            ´
arquivo texto, use N (barra invertidam N maiusculo). Por exemplo, o registro para Whistler
the bird podem parecer com isto (onde o espa¸o em branco entre os valores ´ um simples
                                              c                               e
caractere de tabula¸˜o):
                    ca
name     owner      species sex birth               death
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;
Vocˆ pode especificar o valor do separador de colunas e o marcador de final de linha explici-
   e
tamente na instru¸˜o LOAD DATA se vocˆ desejar. Mas os valores omitidos s˜o suficientes
                   ca                   e                                   a
para a instru¸˜o ler o arquivo ‘pet.txt’ corretamente.
             ca
Se a instru¸˜o falhar, ´ desej´vel que a sua instala¸˜o do MySQL n˜o tenha a capacidade
           ca          e      a                     ca            a
do arquivo local habilitada por padr˜o. Veja Se¸˜o 4.3.4 [LOAD DATA LOCAL], P´gina 232
                                      a           ca                          a
para informa¸˜es sobre como alterar isto.
             co
Quando vocˆ desejar adicionar novos registros um a um, a instru¸˜o INSERT ´ usada. Na
            e                                                     ca         e
sua forma mais simples, vocˆ fornece valores para cada coluna, na ordem em que as colunas
                           e
foram listadas na instru¸˜o CREATE TABLE. Suponha que Diane tenha um novo hamster
                        ca
chamado Puffball. Vocˆ pode adicionar um registro utilizando uma instru¸˜o INSERT desta
                      e                                                  ca
forma:
      mysql> INSERT INTO pet
          -> VALUES (’Puffball’,’Diane’,’hamster’,’f’,’1999-03-30’,NULL);
178                                   MySQL Technical Reference for Version 5.0.0-alpha



Perceba que os valores de string e datas s˜o especificados aqui como strings com aspas.
                                             a
Com o INSERT vocˆ tamb´m pode inserir NULL diretamente para representar um valor em
                   e      e
falta. N˜o pode ser usado N como vocˆ fez com LOAD DATA.
        a                               e
A partir deste exemplo, vocˆ dever´ perceber que existem v´rias outras formas envolvidas
                             e       a                        a
para carregar seus registros inicialmente utilizando diversas instru¸˜es INSERT do que uma
                                                                    co
simples instru¸˜o LOAD DATA.
              ca

3.3.4 Recuperando Informa¸oes de uma Tabela
                         c˜

A instru¸˜o SELECT ´ usada para recuperar informa¸˜es de uma tabela. A forma geral da
         ca         e                              co
instru¸˜o ´:
      ca e
      SELECT o_que_mostrar
      FROM de_qual_tabela
      WHERE condi¸~es_para_satisfazer;
                   co
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
                                                                        e
os dados. A cl´usula WHERE ´ opcional. Se estiver presente, condi¸~es_para_satisfazer
              a            e                                      co
especificam as condi¸˜es que os registros devem satisfazer para fazer parte do resultado.
                    co

3.3.4.1 Selecionando Todos os Dados

A forma mais simples do SELECT recuperar tudo de uma tabela:
      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      | 1979-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          |
      +----------+--------+---------+------+------------+------------+
Esta forma do SELECT ´ util se vocˆ deseja ver sua tabela inteira como agora, depois de
                       e ´         e
vocˆ acabar de carreg´-la com os dados iniciais. Por exempo, vocˆ pode pensar que a data
   e                 a                                          e
de nascimento do Bowser n˜o est´ correta. Consultando seus pap´is originais de pedigree,
                           a     a                               e
descobriu que o ano correto do nascimento deve ser 1989, n˜o 1979.
                                                          a
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:
          mysql> DELETE FROM pet;
          mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                      179



    Entretanto, se vocˆ fizer isto, vocˆ tamb´m deve refazer a entrada para Puffball.
                      e               e     e
 • Corrigir somente o registro errado com uma instru¸˜o UPDATE:
                                                    ca
          mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser";
    O UPDATE altera apenas o registro em quest˜o e n˜o exige que vocˆ recarregue a tabela.
                                              a     a               e

3.3.4.2 Selecionando Registros Espec´
                                    ificos

Como foi mostrado na se¸˜o anterior, ´ f´cil recuperar uma tabela inteira. Apenas omita
                         ca            e a
a cl´usula WHERE da instru¸˜o SELECT. Mas normalmente vocˆ n˜o quer ver toda a tabela,
    a                     ca                                  e a
particularmente quando a tabela ficar grande. Em vez disso, vocˆ estar´ mais interessado em
                                                                e     a
ter a resposta de uma quest˜o em particular, no qual vocˆ especifica detalhes da informa¸˜o
                           a                             e                              ca
que deseja. Vamos ver algumas consultas de sele¸˜o nos termos das quest˜es sobre seus
                                                   ca                        o
animais.
Vocˆ pode selecionar apenas registros espec´
    e                                      ificos da sua tabela. Por exemplo, se vocˆ deseja
                                                                                    e
verificar a altera¸˜o que fez na data de nascimento do Bowser, selecione o registro desta
                  ca
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 1979.
    ida                                                             a
Compara¸˜es de strings normalmente s˜o caso insensitivo, ent˜o vocˆ pode especificar o
       co                           a                       a     e
nome como "bowser", "BOWSER", etc. O resultado da pesquisa ser´ o mesmo.
                                                              a
Vocˆ pode especificar condi¸˜es em qualquer coluna, n˜o apenas no name. Por exemplo,
    e                       co                        a
se vocˆ deseja saber quais foram os animais que nasceram depois de 1998, teste o campo
      e
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 |
      +----------+-------+---------+------+------------+-------+
Vocˆ pode combinar condi¸˜es, por exemplo, para encontrar cadelas (dog/f):
   e                    co
      mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";
      +-------+--------+---------+------+------------+-------+
      | name | owner | species | sex | birth         | death |
      +-------+--------+---------+------+------------+-------+
      | Buffy | Harold | dog     | f    | 1989-05-13 | NULL |
      +-------+--------+---------+------+------------+-------+
A consulta anterior utiliza o operador l´gico AND (e). Existe tamb´m um operador OR (ou):
                                        o                         e
180                                   MySQL Technical Reference for Version 5.0.0-alpha



      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 |
      +----------+-------+---------+------+------------+-------+
AND e OR podem ser misturados, embora AND tem maior precedˆncia que OR. Se vocˆ usar
                                                             e                    e
ambos os operadores, ´ uma ´tima id´ia usar parˆnteses para indicar explicitamente quais
                     e     o       e           e
condi¸˜es devem ser agrupadas:
     co
      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

Se vocˆ n˜o desejar ver todo o registro de sua tabela, especifique as colunas em que vocˆ
       e a                                                                              e
                                   ´
estiver interessado, separado por virgulas. Por exemplo, se vocˆ deseja saber quando seus
                                                               e
animais nasceram, selecione as colunas name e birth:
      mysql> SELECT name, birth FROM pet;
      +----------+------------+
      | name     | birth      |
      +----------+------------+
      | 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 |
      +----------+------------+
Para saber quem s˜o os donos dos animais, use esta consulta:
                 a
      mysql> SELECT owner FROM pet;
      +--------+
      | owner |
      +--------+
      | Harold |
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                      181



      | 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 |
      +--------+
Vocˆ pode usar uma cl´usula WHERE para combinar sele¸˜o de registros com sele¸˜o de
    e                 a                              ca                      ca
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 |
      | Buffy | dog      | 1989-05-13 |
      | Fang   | dog     | 1990-08-27 |
      | Bowser | dog     | 1989-08-31 |
      +--------+---------+------------+

3.3.4.4 Ordenando Registros

Vocˆ deve ter percebido nos exemplos anteriores que os registros retornados n˜o s˜o mostra-
    e                                                                        a a
dos de forma ordenada. Normalmente ´ mais f´cil examinar a saida
                                      e       a                  ´ da consulta quando os
registros s˜o ordenados com algum sentido. Para ordenar o resultado, utilize uma cl´usula
           a                                                                         a
ORDER BY.
Aqui est´ o dia de nascimento dos animais, ordenado por data:
        a
      mysql> SELECT name, birth FROM pet ORDER BY birth;
      +----------+------------+
182                                 MySQL Technical Reference for Version 5.0.0-alpha



       | 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 |
       +----------+------------+
Em colunas de tipo de caracter, ordenai¸˜o como qualquer outra opera¸˜o de compara¸˜o
                                       ca                            ca              ca
 ´ normalmente realizada no modo caso insensitivo. Isto significa que a ordem ser´ in-
 e                                                                                 a
definida para colunas que s˜o idˆnticas exceto quanto ao caso da letra. Vocˆ pode for¸ar
                             a  e                                         e          c
uma ordena¸˜o em caso senitivo para uma coluna usando a coer¸˜o BINARY: ORDER BY
              ca                                                 ca
BINARY(campo).
A ordena¸˜o padr˜o ´ crescente, com os valores menores em primeiro. Para ordena¸˜o na
           ca      a e                                                           ca
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 |
       +----------+------------+
Vocˆ pode ordenar por m´ltiplas colunas e vocˆ pode classificar colunas em dire¸˜es difer-
    e                      u                 e                                co
entes. Por exemplo, para ordenar o tipo de animal em ordem crescente, depois por dia de
nascimento dentro do tipo de animal em ordem decrescente (com os mais novos primeiro),
utilize a seguinte consulta:
       mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;
       +----------+---------+------------+
       | name        | species | birth       |
       +----------+---------+------------+
       | Chirpy      | bird    | 1998-09-11 |
       | Whistler | bird       | 1997-12-09 |
       | Claws       | cat     | 1994-03-17 |
       | Fluffy      | cat     | 1993-02-04 |
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                        183



      | 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);
ela n˜o afeta a ordena¸˜o da coluna species.
     a                ca

3.3.4.5 C´lculo de Datas
         a

O MySQL fornece v´rias fun¸˜es que vocˆ pode usar para realizar c´lculos em datas, por
                    a        co           e                      a
exemplo, para calcular idades ou extrair partes de datas.
Para determinar quantos anos cada um do seus animais tem, compute a diferen¸a do ano
                                                                                c
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
                      e
animal, a data de nascimento, a data atual e a idade em anos.
      mysql> SELECT name, birth, CURDATE(),
          -> (YEAR(CURDATE())-YEAR(birth))
          -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
          -> AS age
          -> FROM pet;
      +----------+------------+------------+------+
      | name     | birth      | CURDATE() | age |
      +----------+------------+------------+------+
      | Fluffy   | 1993-02-04 | 2003-08-19 |   10 |
      | Claws    | 1994-03-17 | 2003-08-19 |    9 |
      | Buffy    | 1989-05-13 | 2003-08-19 |   14 |
      | Fang     | 1990-08-27 | 2003-08-19 |   12 |
      | Bowser   | 1989-08-31 | 2003-08-19 |   13 |
      | Chirpy   | 1998-09-11 | 2003-08-19 |    4 |
      | Whistler | 1997-12-09 | 2003-08-19 |    5 |
      | Slim     | 1996-04-29 | 2003-08-19 |    7 |
      | Puffball | 1999-03-30 | 2003-08-19 |    4 |
      +----------+------------+------------+------+

Aqui, YEAR() separa a parte do ano de uma data e RIGHT() separa os cinco caracteres mais
a direita que representam a parte da data MM-DD. A parte da express˜o que compara os
                                                                          a
valores MM-DD resulta em 1 ou 0, o qual ajusta a diferen¸a do ano um ano abaixo se CURDATE
                                                        c
ocorrer mais cedo, no ano, que birth. A express˜o completa ´ um tanto deselegante, ent˜o
                                                  a            e                            a
um apelido (age) ´ usado para obter uma sa´ mais significativa.
                  e                           ida
A consulta funciona, mas o resultado pode ser mais compreens´      ivel se os registros forem
apresentados em alguma ordem. Isto pode ser feito adicionando uma cl´usula ORDER BY
                                                                             a
                       ´ pelo nome:
name para ordenar a saida
      mysql> SELECT name, birth, CURDATE(),
184                                  MySQL Technical Reference for Version 5.0.0-alpha



          -> (YEAR(CURDATE())-YEAR(birth))
          -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
          -> AS age
          -> FROM pet ORDER BY name;
      +----------+------------+------------+------+
      | name       | birth      | CURDATE() | age |
      +----------+------------+------------+------+
      | Bowser     | 1989-08-31 | 2003-08-19 |        13 |
      | Buffy      | 1989-05-13 | 2003-08-19 |        14 |
      | Chirpy     | 1998-09-11 | 2003-08-19 |         4 |
      | Claws      | 1994-03-17 | 2003-08-19 |         9 |
      | Fang       | 1990-08-27 | 2003-08-19 |        12 |
      | Fluffy     | 1993-02-04 | 2003-08-19 |        10 |
      | Puffball | 1999-03-30 | 2003-08-19 |           4 |
      | Slim       | 1996-04-29 | 2003-08-19 |         7 |
      | Whistler | 1997-12-09 | 2003-08-19 |           5 |
      +----------+------------+------------+------+
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, CURDATE(),
          -> (YEAR(CURDATE())-YEAR(birth))
          -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
          -> AS age
          -> FROM pet ORDER BY age;
      +----------+------------+------------+------+
      | name     | birth      | CURDATE() | age |
      +----------+------------+------------+------+
      | Chirpy   | 1998-09-11 | 2003-08-19 |    4 |
      | Puffball | 1999-03-30 | 2003-08-19 |    4 |
      | Whistler | 1997-12-09 | 2003-08-19 |    5 |
      | Slim     | 1996-04-29 | 2003-08-19 |    7 |
      | Claws    | 1994-03-17 | 2003-08-19 |    9 |
      | Fluffy   | 1993-02-04 | 2003-08-19 |   10 |
      | Fang     | 1990-08-27 | 2003-08-19 |   12 |
      | Bowser   | 1989-08-31 | 2003-08-19 |   13 |
      | Buffy    | 1989-05-13 | 2003-08-19 |   14 |
      +----------+------------+------------+------+
Uma consulta similar pode ser usada para determinar a idade na morte para animais que
morreram. Para determinar quais s˜o os animais, confira se o valor de death n˜o ´ NULL.
                                  a                                           a e
Depois para estes com valores n˜o-NULL, compute a diferen¸a entre os valores dos campos
                               a                         c
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;
      +--------+------------+------------+------+
      | name   | birth      | death      | age |
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                     185



     +--------+------------+------------+------+
     | Bowser | 1989-08-31 | 1995-07-29 |    5 |
     +--------+------------+------------+------+
A consulta usa death IS NOT NULL em vez de death != NULL porque NULL ´ um valor es-
                                                                      e
pecial que n˜o pode ser comparada usando operadores comuns de compara¸˜o. Isto ser´
            a                                                         ca          a
explicado depois. Veja Se¸˜o 3.3.4.6 [Working with NULL], P´gina 186.
                         ca                                a
E se vocˆ desejar saber quais animais fazem anivers´rio no pr´ximo mˆs? Para este tipo
         e                                            a        o         e
de c´lculo, ano e dia s˜o irrelevantes; vocˆ simplesmente deseja extrair a parte do mˆs da
    a                  a                   e                                         e
coluna birth. O MySQL fornece diversas fun¸˜es para extrair partes da data, como em
                                                co
YEAR(), MONTH() e DAYOFMONTH(). MONTH ´ a fun¸˜o apropriada aqui. Para ver como ela
                                             e     ca
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´   ivers´rio no pr´ximo mˆs tamb´m ´ f´cil. Suponha que o mˆs
                                 a         o       e      e e a                       e
atual ´ abril. Ent˜o o valor do mˆs ´ 4 e vocˆ procura por animais nascidos em Maio (mˆs
      e           a                e e        e                                       e
5) assim:
     mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
     +-------+------------+
     | name | birth       |
     +-------+------------+
     | Buffy | 1989-05-13 |
     +-------+------------+
Existe uma pequena complica¸˜o se o mˆs atual ´ Dezembro, ´ claro. Vocˆ n˜o pode apenas
                              ca        e       e           e          e a
adicionar um para o n´mero do mˆs (12) e procurar por animais nascidos no mˆs 13, porque
                     u            e                                         e
n˜o existe tal mˆs. O certo seria procurar por animais nascidos em Janeiro (mˆs 1).
 a              e                                                             e
Vocˆ pode tamb´m escrever uma consulta para que funcione sem importar qual ´ o mˆs
   e            e                                                               e     e
atual. Assim vocˆ n˜o tˆm quee usar um n´mero de mˆs em particular na consulta. DATE_
                e a e                     u          e
ADD() permite adicionar um intervalo de tempo para uma data fornecida. Se vocˆ adicionar
                                                                             e
um mˆs para o valor de CURDATE, ent˜o extrair a parte do mˆs com MONTH(), o resultado ´
      e                             a                     e                            e
o mˆs no qual vocˆ deseja procurar por anivers´rios:
   e              e                           a
     mysql> SELECT name, birth FROM pet
         -> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(), INTERVAL 1 MONTH));
186                                   MySQL Technical Reference for Version 5.0.0-alpha



Uma maneira diferente para realizar a mesma tarefa ´ adicionar 1 para obter o mˆs seguinte
                                                   e                           e
ao atual (depois de usar a fun¸˜o m´dulo (MOD) para o valor do mˆs retornar 0 se ele for
                              ca     o                             e
12):
      mysql> SELECT name, birth FROM pet
           -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
Perceba que MONTH retorna um n´mero entre 1 e 12. E MOD(alguma_coisa,12) retorna um
                                u
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)

O valor NULL pode ser supreendente at´ vocˆ us´-lo. Conceitualmente, NULL significa valor
                                       e    e a
em falta ou valor desconhecido e ´ tratado de uma forma diferente de outros valores. Para
                                 e
testar o valor NULL, vocˆ n˜o pode usar os operadores de compara¸˜es aritm´ticas como em
                        e a                                      co        e
=, <, ou !=. Para demonstrar para vocˆ mesmo, tente executar a seguinte consulta:
                                       e
       mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
       +----------+-----------+----------+----------+
       | 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
       +----------+-----------+----------+----------+
       |      NULL |        NULL |       NULL |       NULL |
       +----------+-----------+----------+----------+
Claramente vocˆ n˜o obter´ resultados significativos destas compara¸˜es. Utilize os oper-
                 e a        a                                        co
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 |
       +-----------+---------------+
No MySQL, 0 ou NULL significa falso e o resto ´ verdadeiro. O valor verdadeiro por o padr˜o
                                              e                                         a
em uma opera¸˜o booleana ´ 1.
               ca            e
Este tratamento especial de NULL ´ porque, na se¸˜o anterior, foi necess´rio determinar
                                   e               ca                     a
quais animais n˜o estavam mais vivos usando death IS NOT NULL no lugar de death <>
                 a
NULL.
Dois valores NULL s˜o considerados como iguais em um GROUP BY.
                    a
Ao fazer um ORDER BY, valores NULL s˜o apresentados primeiro se vocˆ fizer ORDER BY ...
                                      a                               e
ASC e por ultimo se vocˆ fizer ORDER BY ... DESC.
           ´            e
Note que o MySQL 4.0.2 a 4.0.10 sempre ordenam, incorretamente, valores NULL em primeiro
independente da ordem escolhida.

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                                        ca
de padr˜es baseado nas express˜es regulares extendidas similares `quelas usadas pelos
         o                       o                               a
utilit´rios Unix como o vi, grep e sed.
      a
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                    187



A combina¸˜o de padr˜es SQL lhe permite vocˆ usar _ para coincidir qualquer caractere
           ca         o                       e
simples e % para coincidir um n´mero arbitr´rio de caracteres (incluindo zero caracter).
                               u            a
No MySQL, padr˜es SQL s˜o caso insensitivo por padr˜o. Alguns exemplos s˜o vistos
                 o          a                          a                       a
abaixo. Perceba que vocˆ n˜o usa = ou != quando usar padr˜es SQL; use os operadores de
                        e a                              o
compara¸˜o LIKE ou NOT LIKE neste caso.
        ca
Para encontrar nomes come¸ando com ‘b’:
                         c
     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 cinco instˆncias do carac-
                                                                         a
ter ‘_’:
     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 |
     +-------+--------+---------+------+------------+-------+
O outro tipo de combina¸˜o de padr˜es fornecido pelo MySQL usa express˜es regulares
                         ca          o                                    o
extendidas. Quando vocˆ testa por uma combina¸˜o para este tipo de padr˜o, utilize os
                        e                         ca                      a
operadores REGEXP e NOT REGEXP (ou RLIKE e NOT RLIKE, que s˜o sinˆnimos).
                                                               a o
Algumas caracter´
                isticas das express˜es regulares extendidas s˜o:
                                   o                         a
 • ‘.’ combina qualquer caractere unico
                                  ´
188                                   MySQL Technical Reference for Version 5.0.0-alpha



 • Uma classe de caracteres ‘[...]’ combina qualquer caractere que consta dentro dos
   colchetes. Por exemplo, ‘[abc]’ combina com ‘a’, ‘b’, ou ‘c’. Para nomear uma
   sequˆncia de caracteres utilize um tra¸o. ‘[a-z]’ combina com qualquer letra e ‘[0-9]’
        e                                c
   combina com qualquer d´  igito.
 • ‘*’ combina com nenhuma ou mais instˆncias de sua precedˆncia. Por exemplo, ‘x*’
                                          a                  e
   combina com qualquer n´mero de caracteres ‘x’, ‘[0-9]*’ combina com qualquer
                              u
   n´mero de d´
     u         igitos e ‘.*’ combina com qualquer n´mero de qualquer coisa.
                                                   u
 • Um padr˜o REGEXP casa com sucesso se ele ocorre em algum lugar no valor sendo
            a
   testado. (Ele difere do padr˜o LIKE, que s´ obtem suceeso se eles combinarem com
                               a             o
   todo o valor.)
 • Para fazer com que um padr˜o deva combinar com o come¸o ou o fim de um valor
                                  a                             c
   sendo testado, utilize ‘^’ no come¸o ou ‘$’ no final do padr˜o.
                                     c                        a
Para demonstrar como express˜es regulares extendidas funcionam, as consultas com LIKE
                              o
mostradas acima foram reescritas abaixo usando REGEXP.
Para encontrar nomes come¸ando com ‘b’, utilize ‘^’ para combinar com o come¸o do nome:
                         c                                                  c
      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 |
      +--------+--------+---------+------+------------+------------+
Antes da vers˜o 3.23.4 do MySQL, REGEXP era caso sensitivo, e a consulta anterior n˜o iria
               a                                                                    a
retornar nenhum registro. Neste caso, para combinar letras ‘b’ mai´sculas e min´sculas,
                                                                   u              u
utilize esta consulta:
      mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
A partir do MySQL 3.23.4, se vocˆ realmente deseja for¸ar uma compara¸˜o REGEXP com
                                    e                   c                ca
caso sensitivo, utilize a palavra-chave BINARY para tornar uma das strings em uma string
bin´rias. Esta consulta ir´ combinar somente com ‘b’s min´sculos no come¸o de um nome:
   a                       a                               u              c
      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 |
      +--------+--------+---------+------+------------+-------+
Para encontrar nomes contendo um ‘w’, utilize esta consulta:
      mysql> SELECT * FROM pet WHERE name REGEXP "w";
      +----------+-------+---------+------+------------+------------+
      | name     | owner | species | sex | birth       | death      |
      +----------+-------+---------+------+------------+------------+
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                      189



      | 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       |
      +----------+-------+---------+------+------------+------------+
Como uma express˜o regular extendida encontra padr˜es coincidentes se eles ocorrem em
                     a                               o
qualquer lugar no valor comparado, n˜o ´ necess´rio utiliar, na consulta anterior, nenhum
                                        a e    a
metacaracter em nenhum dos lados do padr˜o para fazˆ-lo coincidir com todo o valor, como
                                             a      e
seria feito se fosse utilizado o padr˜o SQL.
                                     a
Para encontrar nomes contendo exatamente cinco caracteres, utilize ‘^’ e ‘$’ para combinar
com o come¸o e fim do nome e cinco instˆncias de ‘.’ entre eles.
           c                          a
      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 |
      +-------+--------+---------+------+------------+-------+
Vocˆ pode tamb´m escrever a consulta anterior utilizando o operador ‘{n}’ “repete-n-vezes”:
   e          e
      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

Bancos de dados normalmente s˜o usados para responder a perguntas, “Qual a frequˆncia
                                a                                                 e
que certo tipo de dados ocorre em uma tabela?” Por exemplo, vocˆ deve querer saber
                                                                  e
quantos animais tem, ou quantos animais cada dono tem, ou vocˆ pode querer fazer v´rios
                                                             e                    a
outros tipos de opera¸˜es de censo com seus animais.
                     co
Contando o n´mero total de animais que vocˆ tem ´ a mesma quest˜o como em “Quantos
               u                           e      e               a
registros existem na tabela pet?” porque existe um registro por animal. COUNT(*) conta
o n´mero de resultados n˜o-NULL, portanto a pesquisa para contar seus animais parecer´
   u                      a                                                          a
com isto:
      mysql> SELECT COUNT(*) FROM pet;
      +----------+
      | COUNT(*) |
      +----------+
      |        9 |
      +----------+
Logo, vocˆ recuperar´ os nomes das pessoas que possuam animais. Vocˆ pode usar COUNT()
         e           a                                             e
se vocˆ desejar encontrar quantos animais cada dono possui:
      e
190                                  MySQL Technical Reference for Version 5.0.0-alpha



       mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
       +--------+----------+
       | owner | COUNT(*) |
       +--------+----------+
       | Benny |             2 |
       | Diane |             2 |
       | Gwen     |          3 |
       | Harold |            2 |
       +--------+----------+
Perceba o uso de GROUP BY para agrupar todos os registros para cada owner (dono). Sem
ele, vocˆ teria uma mensagem de erro:
        e
       mysql> SELECT owner, COUNT(*) FROM pet;
       ERROR 1140: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
       with no GROUP columns is illegal if there is no GROUP BY clause
COUNT() e GROUP BY s˜o uteis para personalizar seus dados de diversas maneiras. Os
                        a ´
seguintes exemplos mostram diferentes maneiras para realizar opera¸˜es de censo nos ani-
                                                                  co
mais.
N´mero de animais por esp´cie:
  u                         e
       mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
       +---------+----------+
       | species | COUNT(*) |
       +---------+----------+
       | bird       |         2 |
       | cat        |         2 |
       | dog        |         3 |
       | hamster |            1 |
       | snake      |         1 |
       +---------+----------+
N´mero de animais por sexo:
  u
       mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
       +------+----------+
       | sex | COUNT(*) |
       +------+----------+
       | NULL |           1 |
       | f      |         4 |
       | m      |         4 |
       +------+----------+
(Nesta sa´ida, NULL indica que o sexo ´ desconhecido.)
                                       e
N´mero de animais combinando esp´cie e sexo:
  u                                  e
       mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
       +---------+------+----------+
       | species | sex | COUNT(*) |
       +---------+------+----------+
       | bird      | NULL |            1 |
       | bird      | f     |           1 |
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                        191



      | cat     | f    |        1 |
      | cat     | m    |        1 |
      | dog     | f    |        1 |
      | dog     | m    |        2 |
      | hamster | f    |        1 |
      | snake   | m    |        1 |
      +---------+------+----------+
N˜o ´ necess´rio selecionar uma tabela inteira quando estiver usando COUNT(). Por exemplo,
  a e       a
a consulta anterior, quando realizada apenas procurando por cachorros e gatos, se parece
com isto:
      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 |
      +---------+------+----------+
Ou se vocˆ desejar saber o n´mero de animais por sexo somente de animais com sexo
           e                u
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 |
      +---------+------+----------+

3.3.4.9 Utilizando M´ ltiplas Tabelas
                    u

A tabela pet mant´m informa¸˜es de quais animais vocˆ tem. Se vocˆ deseja gravar outras
                    e           co                       e             e
informa¸˜es sobre eles como eventos em suas vidas, tais como visitas ao veterin´rio ou sobre
        co                                                                      a
suas crias, vocˆ necessitar´ de outra tabela. Como esta tabela deve se parecer ? Ela precisa:
               e           a
 • 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
192                                        MySQL Technical Reference for Version 5.0.0-alpha



 • Um campo para descrever o evento.
 • Um campo com o tipo de evento, se vocˆ desejar classific´-los por categoria.
                                        e                 a
Dadas estas considera¸˜es, a instru¸˜o CREATE TABLE para a tabela event deve se parecer
                     co            ca
com isto:
      mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
          -> type VARCHAR(15), remark VARCHAR(255));
Como na tabela pet, ´ mais f´cil carregar os registros iniciais criando um arquivo texto
                      e       a
delimitado por tabula¸˜es contendo a informa¸˜o:
                     co                     ca
name            date            type           remark
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
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;
Baseado no que vocˆ j´ aprendeu com as consultas realizadas na tabela pet, vocˆ deve estar
                   e a                                                        e
apto para realizar pesquisas na tabela event; os princ´ipios s˜o o mesmo. Mas quando a
                                                              a
tabela event, sozinha, ´ insuficiente para responder `s suas quest˜es?
                       e                            a            o
Suppose you want to find out the ages at which each pet had its litters. We saw earlier how
to calculate ages from two dates. The litter date of the mother is in the event table, but
to calculate her age on that date you need her birth date, which is stored in the pet table.
This means the query requires both tables:
Suponha que vocˆ deseje descobrir as idades de cada animal quando eles tiveram cria. N´s
                  e                                                                     o
vemos logo que ´ poss´ calcular a idade a partir das duas datas. A idade dos filhotes est´
                e    ivel                                                                a
na tabela event, mas para calcular a idade da m˜e, vocˆ precisar´ da data de nascimento
                                                 a      e        a
dela, que est´ armazenado na tabela pet. Isto significa que vocˆ precisar´ das duas tabelas
             a                                                e         a
para a consulta:
      mysql> SELECT pet.name,
          -> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age,
          -> remark
          -> FROM pet, event
          -> WHERE pet.name = event.name AND type = "litter";
      +--------+------+-----------------------------+
      | name   | age | remark                       |
      +--------+------+-----------------------------+
      | Fluffy |    2 | 4 kittens, 3 female, 1 male |
      | Buffy |     4 | 5 puppies, 2 female, 3 male |
      | Buffy |     5 | 3 puppies, 3 female         |
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                      193



      +--------+------+-----------------------------+
Existem v´rias coisas que devem ser percebidas sobre esta consulta:
           a
 • 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
    registros em uma tabela podem ser coincididas com os registros na outra. Isto ´ simples
                                                                                  e
    porque ambas possuem uma coluna name. A consulta utiliza a cl´usula WHERE para
                                                                       a
    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
    vocˆ est´ se referindo. Isto ´ feito usando o nome da tabela antes do nome da coluna
        e    a                   e
    separados por um ponto (.).
Vocˆ n˜o precisa ter duas tabelas diferentes para realizar uma uni˜o. Algumas vezes ´ util
    e a                                                           a                 e´
unir uma tabela a ela mesma, se vocˆ deseja comparar registros em uma tabela com outros
                                    e
registros na mesma tabela. Por exemplo, para encontrar pares entre seus animais, vocˆ   e
pode unir a tabela pet com ela mesma para produzir pares candidatos de machos e fˆmeas
                                                                                   e
de acordo com as esp´cies:
                     e
       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";
       +--------+------+--------+------+---------+
       | name    | sex | name       | sex | species |
       +--------+------+--------+------+---------+
       | Fluffy | f      | Claws | m         | cat       |
       | Buffy | f       | Fang     | m      | dog       |
       | Buffy | f       | Bowser | m        | dog       |
       +--------+------+--------+------+---------+
Nesta consulta, n´s especificamos apelidos para os nomes das tabelas para conseguir ref-
                  o
erenciar `s colunas e manter com qual instˆncia da tabela cada coluna de referˆncia est´
         a                                  a                                  e        a
associdada.

3.4 Obtendo Informa¸oes Sobre Bancos de Dados e Tabelas
                   c˜

E se vocˆ esquecer o nome de um banco de dados ou tabela, ou como ´ a estrutura de
         e                                                               e
uma certa tabela (por exemplo, como suas colunas s˜o chamadas)? O MySQL resolve este
                                                    a
problema atrav´s de diversas instru¸˜es que fornecem informa¸˜es sobre os bancos de dados
               e                   co                       co
e as tabelas que ele suporta.
Vocˆ j´ viu SHOW DATABASES, que lista os bancos de dados gerenciados pelo servidor. Para
    e a
saber qual banco de dados est´ sendo usado atualmente, utilize a fun¸˜o DATABASE():
                              a                                     ca
      mysql> SELECT DATABASE();
      +------------+
      | DATABASE() |
      +------------+
      | menagerie |
      +------------+
194                                    MySQL Technical Reference for Version 5.0.0-alpha



Se vocˆ ainda n˜o selecionou nenhum banco de dados ainda, o resultado ´ NULL. (ou a
       e         a                                                    e
string vazia antes do MySQL 4.1.1).
Para saber quais tabelas o banco de dados atual contˆm (por exemplo, quando vocˆ n˜o
                                                      e                        e a
tem certeza sobre o nome de uma tabela), utilize este comando:
      mysql> SHOW TABLES;
      +---------------------+
      | Tables in menagerie |
      +---------------------+
      | event               |
      | pet                 |
      +---------------------+
Se vocˆ deseja saber sobre a estrutura de uma tabela, o comando DESCRIBE ´ util; ele mostra
      e                                                                  e´
informa¸˜es sobre cada uma das colunas da tabela:
        co
      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    |       |
      +---------+-------------+------+-----+---------+-------+
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
                                                                                 e
ou n˜o e Default especifica o valor padr˜o da coluna.
    a                                    a
      e     ´
Se vocˆ tem indices em uma tabela, SHOW INDEX FROM tbl_nome traz informa¸˜es sobre eles.
                                                                             co


3.5 Utilizando mysql em Modo Batch

Nas se¸˜es anteriores, vocˆ usou mysql interativamente para fazer consultas e ver os re-
      co                  e
sultados. Vocˆ pode tamb´m executar mysql no modo batch. Para fazer isto, coloque os
             e            e
comando que vocˆ deseja executar em um arquivo, e diga ao mysqld para ler sua entrada
                 e
do arquivo:
      shell> mysql < batch-file
Se vocˆ estiver executando o mysql no Windows e tiver algum caracter especial no arquivo
      e
que provocou o problema, vocˆ pode fazer:
                              e
      dos> mysql -e "source batch-file"
Se vocˆ precisa especificar parˆmetros de conex˜o na linha de comando, o comando deve
      e                       a               a
parecer com isto:
      shell> mysql -h host -u user -p < batch-file
      Enter password: ********
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                          195



Quando vocˆ utilizar o mysql desta forma, vocˆ estar´ criando um arquivo script, depois
              e                                     e       a
executando o script.
Se vocˆ quiser que o script continue mesmo se hopuver erros, vocˆ deve usar a op¸˜o de
       e                                                                 e               ca
linha de comando --force.
Por que usar um script? Existem v´rias raz˜es:
                                       a         o
  • Se vocˆ executa uma query repetidamente (digamos, todos os dias ou todas as semanas),
            e
     transform´-lo em um script permite que vocˆ n˜o o redigite toda vez que o executa.
                 a                                    e a
  • 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
     particularmente para comandos de m´ltiplas linhas ou sequˆncias de comandos com
                                                u                      e
     v´rias instru¸˜es. Se vocˆ cometer um erro, n˜o ser´ necess´rio redigitar tudo. Apenas
      a             co          e                      a     a      a
     edite seu arquivo script e corrija o erro, depois diga ao mysql para execut´-lo novamente.
                                                                                a
  • Se vocˆ tem uma query que produz muita saida, vocˆ pode encaminhar a sa´ atrav´s
            e                                        ´        e                      ida     e
     de um p´ginador.
               a
            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
     uma consulta atrav´s de um processo autom´tico (cron job). Neste caso, vocˆ deve
                          e                            a                                 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
species FROM pet se parece com isto quando vocˆ o executa interativamente:
                                                       e
       +---------+
       | species |
       +---------+
       | bird        |
       | cat         |
       | dog         |
       | hamster |
       | snake       |
       +---------+
Mas fica assim quando vocˆ o executa no modo batch:
                              e
       species
       bird
       cat
       dog
       hamster
       snake
Se vocˆ desejar obter o formato de sa´ interativa no modo batch, utilize mysql -t. Para
       e                                  ida
              ´ dos comandos que s˜o executados, utilize mysql -vvv.
mostrar a saida                         a
196                                   MySQL Technical Reference for Version 5.0.0-alpha



Vocˆ tamb´m pode utilizar scripts no prompt de linha de comando mysql usando o comando
   e      e
source:
      mysql> source filename;

3.6 Exemplos de Consultas Comuns

Aqui est˜o os exemplos de como resolver problemas comuns com o MySQL.
         a
Alguns dos exemplos usam a tabela shop para armazenar o pre¸o de cada ´
                                                                c         item (article)
para certas revendas (dealers). Supondo que cada revenda tenha um pre¸o fixo por artigo,
                                                                      c
ent˜o (article, dealer) ´ uma chave prim´ria para os registros.
   a                       e              a
Inicie a ferramenta de linha de comando mysql e selecione um banco de dados:
       shell> mysql o-nome-do-seu-banco-de-dados
(Na maioria das instala¸˜es do MySQL, vocˆ pode usar o banco de dados test).
                        co                 e
Vocˆ pode criar e popular a tabela exemplo assim:
    e
       mysql> 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));
       mysql> 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);

Depois de executar as instru¸˜es a tabela deve ter o seguinte conte´do:
                            co                                     u
     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 |
     +---------+--------+-------+

3.6.1 O Valor M´ximo para uma Coluna
               a

“Qual ´ o maior n´mero dos ´
      e          u         itens?”
     SELECT MAX(article) AS article FROM shop;

      +---------+
      | article |
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                  197



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

3.6.2 O Registro que Armazena o Valor M´ximo para uma Coluna
                                       a
      Determinada

“Encontre o n´mero, fornecedor e pre¸o do ´
             u                      c     item mais caro.”
No SQL ANSI isto ´ feito f´cilmente com uma sub-consulta:
                 e        a
     SELECT article, dealer, price
     FROM   shop
     WHERE price=(SELECT MAX(price) FROM shop);
No MySQL (que ainda n˜o suporta sub-selects), fa¸a isto em dois passos:
                     a                          c
 1. Obtenha o valor do pre¸o m´ximo da tabela com uma instru¸˜o SELECT.
                          c   a                             ca
          mysql> SELECT MAX(price) FROM shop;
          +------------+
          | MAX(price) |
          +------------+
          |      19.95 |
          +------------+
 2. Usando o valor 19.95 mostrado pela consulta anterior como o pre¸o m´ximo do artigo,
                                                                    c    a
    grave uma consulta para localizar e mostrar o registro correspondente:
          mysql> SELECT article, dealer, price
              -> FROM   shop
              -> WHERE price=19.95;
          +---------+--------+-------+
          | article | dealer | price |
          +---------+--------+-------+
          |    0004 | D      | 19.95 |
          +---------+--------+-------+


Outra solu¸˜o ´ ordenar todos os registros por pre¸o de forma descendente e obtenha so-
          ca e                                      c
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 ´
                          itens mais caros, cada um com um pre¸o de 19.95, a solu¸˜o
                                                              c                  ca
LIMIT mostra somente um deles !

3.6.3 M´ximo da Coluna por Grupo
       a

“Qual ´ o maior pre¸o por ´
      e            c      item?”
198                                 MySQL Technical Reference for Version 5.0.0-alpha



      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 |
      +---------+-------+
3.6.4 As Linhas Armazenando o Group-wise M´ximo de um Certo
                                          a
      Campo

“Para cada ´
           item, encontre o(s) fornecedor(s) com o maior pre¸o.”
                                                             c
No SQL-99 (e MySQL 4.1 ou superior), o problema pode ser solucionado com uma subcon-
sulta como esta:
      SELECT article, dealer, price
      FROM    shop s1
      WHERE price=(SELECT MAX(s2.price)
                      FROM shop s2
                      WHERE s1.article = s2.article);
Em vers˜es anteriores a do MySQL 4.1 ´ melhor fazˆ-lo em diversos passos:
        o                               e          e
 1. Obtenha a lista de pares (article,maxprice).
 2. Para cada ´item, obtenha os registros correspondentes que tenham o maior pre¸o.
                                                                                c
Isto pode ser feito facilmente com uma tabela tempor´ria e um join:
                                                    a
      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 chamado “truque MAX-CONCAT”:
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                      199



      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 |
      +---------+--------+-------+
O ultimo exemplo pode, ´ claro, ser feito de uma maneira mais eficiente fazendo a separa¸˜o
  ´                    e                                                               ca
da coluna concatenada no cliente.

3.6.5 Utilizando Vari´veis de Usu´rio
                     a           a

Vocˆ pode usar vari´veis de usu´rios no MySQL para lembrar de resultados sem a necessi-
    e              a            a
dade de armazen´-las em vari´veis no cliente. Veja Se¸˜o 6.1.4 [Variables], P´gina 474.
                a            a                       ca                      a
Por exemplo, para encontrar os ´
                               itens com os pre¸os mais altos e mais baixos vocˆ pode fazer
                                               c                               e
isto:
      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.6.6 Utilizando Chaves Estrangeiras

No MySQL 3.23.44 e acima, tabelas InnoDB suportam verifica¸˜o de restri¸˜es de chaves
                                                             ca         co
estrangerias. Veja Se¸˜o 7.5 [InnoDB], P´gina 642. Veja tamb´m Se¸˜o 1.8.4.5 [ANSI diff
                     ca                 a                   e    ca
Foreign Keys], P´gina 50.
                a
Vocˆ n˜o precisa de chaves estrangeiras para unir 2 tabelas. Para outros tipos de tabela
    e a
diferentes de InnoDB, As unicas coisas que o MySQL atualmente n˜o faz s˜o 1) CHECK, para
                          ´                                       a      a
ter certeza que as chaves que vocˆ usa realmente existem na tabela ou tabelas referenciadas
                                 e
e 2) apagar automaticamente registros da tabela com uma defini¸˜o de chave estrangeira.
                                                                 ca
Usando suas chaves para unir a tabela funcionar´ bem:
                                                 a
      CREATE TABLE person (
          id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
200                                  MySQL Technical Reference for Version 5.0.0-alpha



           name CHAR(60) NOT NULL,
           PRIMARY KEY (id)
      );

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


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

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


      INSERT INTO person VALUES (NULL, ’Lilliana Angelovska’);

      INSERT   INTO shirt 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 person;
      +----+---------------------+
      | id | name                |
      +----+---------------------+
      | 1 | Antonio Paz          |
      | 2 | Lilliana Angelovska |
      +----+---------------------+

      SELECT * FROM shirt;
      +----+---------+--------+-------+
      | id | style   | colour | owner |
      +----+---------+--------+-------+
      | 1 | polo     | blue   |     1 |
      | 2 | dress    | white |      1 |
      | 3 | t-shirt | blue    |     1 |
      | 4 | dress    | orange |     2 |
      | 5 | polo     | red    |     2 |
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                      201



      | 6 | dress    | blue   |     2 |
      | 7 | t-shirt | white |       2 |
      +----+---------+--------+-------+


      SELECT   s.* FROM person p, shirt s
       WHERE   p.name LIKE ’Lilliana%’
         AND   s.owner = p.id
         AND   s.colour <> ’white’;

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

3.6.7 Pesquisando em Duas Chaves

O MySQL ainda n˜o otimiza quando vocˆ pesquisa em duas chaves diferentes combinadas
                 a                    e
com OR (Pesquisa em uma chave com diferentes partes OR ´ muito bem otimizadas).
                                                       e
      SELECT field1_index, field2_index FROM test_table
      WHERE field1_index = ’1’ OR field2_index = ’1’
A raz˜o ´ que n´s ainda n˜o tivemos tempos para fazer este tratamento de uma maneira
      a e       o         a
eficiente no caso geral. (A manipula¸˜o do AND ´, em compara¸˜o, completamente geral e
                                   ca         e             ca
funciona muito bem).
No MySQL 4.0 e acimo, vocˆ pode solucionar este problema eficientemente usando um UNION
                         e
que combina a sa´ de duas instru¸˜es SELECT separadas. Veja Se¸˜o 6.4.1.2 [UNION],
                ida                co                              ca
P´gina 569. Cada SELECT busca apenas uma chave e pode ser otimizada.
 a
      SELECT field1_index, field2_index FROM test_table WHERE field1_index = ’1’
      UNION
      SELECT field1_index, field2_index FROM test_table WHERE field2_index = ’1’;
Em vers˜es do MySQL anteirores a 4.0, vocˆ pode conseguir o mesmo efeito usando uma
        o                                   e
tabela TEMPORARY e instru¸˜es SELECT separadas. Este tipo de otimiza¸˜o tamb´m ´ muito
                           co                                        ca       e e
boa se vocˆ estiver utilizando consultas muito complicadas no qual o servidor SQL faz as
          e
otimiza¸˜es na ordem errada.
       co
      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;
A maneira descrita acima para resolver esta consulta ´ uma uni˜o (UNION) de duas consultas.
                                                     e        a
202                                 MySQL Technical Reference for Version 5.0.0-alpha



3.6.8 Calculando Visitas Di´rias
                           a

O seguinte exemplo mostra como vocˆ pode usar as fun¸˜es bin´rias de agrupamento para
                                    e                   co     a
calcular o n´mero de dias por mˆs que um usu´rio tem visitado uma p´gina web.
            u                  e              a                       a
      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
A tabela exemplo cont´m valores ano-mˆs-dia representando visitas feitas pelos usu´rios a
                      e                e                                             a
p´gina. Para determinar quantos quantos dias diferentes em cada mˆs estas visitas ocorriam,
  a                                                              e
use esta consulta:
      SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month;
que retornar´:
             a
      +------+-------+------+
      | year | month | days |
      +------+-------+------+
      | 2000 |     01 |      3 |
      | 2000 |     02 |      2 |
      +------+-------+------+
O exemplo acima calcula quantos dias diferentes foram usados para uma combina¸˜o        ca
fornecida de mˆs/ano, com remo¸˜o autom´tica de entradas duplicadas.
               e               ca         a

3.6.9 Usando AUTO_INCREMENT

O atributo AUTO_INCREMENT pode ser usado para gerar uma identifica¸˜o unica para um
                                                                     ca ´
novo registro:
      CREATE TABLE animals (
                     id MEDIUMINT NOT NULL AUTO_INCREMENT,
                     name CHAR(30) NOT NULL,
                     PRIMARY KEY (id)
                     );
      INSERT INTO animals (name) VALUES ("dog"),("cat"),("penguin"),
                                            ("lax"),("whale"),("ostrich");
      SELECT * FROM animals;
Que retorna:
      +----+---------+
      | id | name       |
      +----+---------+
      | 1 | dog         |
      | 2 | cat         |
      | 3 | penguin |
      | 4 | lax         |
      | 5 | whale       |
      | 6 | ostrich |
      +----+---------+
Vocˆ pode recuperar o valor AUTO_INCREMENT mais recente com a fun¸˜o SQL LAST_INSERT_
   e                                                             ca
ID() ou a fun¸˜o da API C mysql_insert_id(). Nota: para uma inser¸˜o de v´rias
               ca                                                         ca     a
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                      203



linhas LAST_INSERT_ID()/mysql_insert_id() retornar´ atualmente a AUTO_INCREMENT
                                                           a
chave da primeira linha inserida. Isto permite que inser¸˜es multi-linhas sejam reproduzidas
                                                        co
corretamente em outros servidores em uma configra¸˜o de replica¸˜o.
                                                     ca             ca
Para tabelas MyISAM e BDB vocˆ pode especificar AUTO_INCREMENT em uma coluna secund´ria
                               e                                                        a
em um ´  indice multi-coluna. Neste caso, o valor gerado para a coluna AUTO_INCREMENT ´    e
calculado como MAX(auto_increment_column)+1) WHERE prefix=given-prefix. Isto ´             e
util quando vocˆ quer colocar dados em grupos ordenados.
´                e
       CREATE TABLE animals (
                       grp ENUM(’fish’,’mammal’,’bird’) NOT NULL,
                       id MEDIUMINT NOT NULL AUTO_INCREMENT,
                       name CHAR(30) NOT NULL,
                       PRIMARY KEY (grp,id)
                       );
       INSERT INTO animals (grp,name) VALUES("mammal","dog"),("mammal","cat"),
                             ("bird","penguin"),("fish","lax"),("mammal","whale"),
                               ("bird","ostrich");

      SELECT * FROM animals ORDER BY grp,id;
Que retorna:
      +--------+----+---------+
      | grp     | id | name       |
      +--------+----+---------+
      | fish    | 1 | lax         |
      | mammal | 1 | dog          |
      | mammal | 2 | cat          |
      | mammal | 3 | whale        |
      | bird    | 1 | penguin |
      | bird    | 2 | ostrich |
      +--------+----+---------+
Note que neste caso (quando o valor AUTO_INCREMENT ´ parte de um ´
                                                     e             indice multi-coluna), o
valor de AUTO_INCREMENT ser´ reutilizado se vocˆ deletar a linha com o maior valor AUTO_
                            a                  e
INCREMENT em qualquer grupo. Isto caontece mesmo para tabelas MyISAM, para as quais os
valores AUTO_INCREMENT normalmente n˜o s˜o reusados.)
                                       a a

3.7 Consultas de Projetos Gˆmeos
                           e

Em Analytikerna e Lentus, n´s estamos fazendo os sistemas e trabalho de campo para um
                              o
grande projeto de pesquisa. Este projeto ´ uma colabora¸˜o entre o Institudo de Medicina
                                           e              ca
Ambiental em Karolinksa Institutet Stockholm e a Se¸˜o de Pesquisa Cl´
                                                     ca                inica em Envelhec-
imento e Psicologia na University of Southern California.
O projeto envolve uma parte de sele¸˜o onde todos os gˆmeos na Su´cia mais velhos que 65
                                     ca                 e          e
anos s˜o entrevistados por telefone. Gˆmeos que preenchem certos crit´rios passam para
      a                                  e                              e
o pr´ximo est´gio. Neste est´gio posterior, gˆmeos que desejam participar s˜o visitados
    o         a                a               e                              a
por uma equipe de doutores/enfermeiros. Alguns dos consultas incluem exames f´     isicos e
neuropsicol´gico, testes de laborat´rio, imagem neural, determina¸˜o do estado psicol´gico
           o                       o                             ca                   o
204                                   MySQL Technical Reference for Version 5.0.0-alpha



e coletas de hist´rico familiar. Adicionalmente, dados s˜o coletados em fatores de riscos
                 o                                      a
m´dicos e ambientais.
  e
Mais informa¸˜es sobre o estudos dos gˆmeos pode ser encontrados em:
               co                                 e
http://www.mep.ki.se/twinreg/index_en.html
A parte posterior do projeto ´ administrada com uma interface Web escrita utilizando a
                               e
linguagem Perl e o MySQL.
Cada noite todos dados das entrevistas s˜o movidos para um banco de dados MySQL.
                                         a

3.7.1 Encontrando Todos Gˆmeos N˜o-distribu´
                         e      a          idos

A seguinte consulta ´ usada para determinar quem vai na segunda parte do projeto:
                    e
     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
               /* For Twin 2 */
               LEFT JOIN twin_data AS td2 ON p2.id = td2.id
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                        205



                        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’
206                                   MySQL Technical Reference for Version 5.0.0-alpha



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

3.7.2 Mostrando uma Tabela sobre a Situa¸˜o dos Pares Gˆmeos
                                        ca             e

Cada entrevista termina com um c´digo da situa¸˜o chamado event. A consulta mostrada
                                   o             ca
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-
                                     e                                      e
minou e o outro foi recusado e assim por diante.
      SELECT
               t1.event,
               t2.event,
               COUNT(*)
      FROM
               lentus AS t1,
Cap´
   ıtulo 3: Tutorial de Introdu¸˜o Do MySQL
                               ca                                                   207



               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
             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

Existem programas que lhe permite autenticar seus usu´rios a partir de um banco de dados
                                                     a
MySQL e tamb´m permite gravar seus arquivos de log em uma tabela MySQL.
                e
Vocˆ pode alterar o formato de log do Apache para ser facilmente lido pelo MySQL colo-
    e
cando o seguinte no arquivo de configura¸˜o do Apache:
                                       ca
      LogFormat 
                ""%h",%{%Y%m%d%H%M%S}t,%>s,"%b","%{Content-Type}o", 
                "%U","%{Referer}i","%{User-Agent}i""
Para carregar uma arquivo de log naquele formato dentro do MySQL, vocˆ pode usar uma
                                                                         e
instru¸˜o deste tipo:
      ca
      LOAD DATA INFILE ’/local/access_log’ INTO TABLE nome_tabela
      FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’"’ ESCAPED BY ’’
A tabela chamada deve ser criada para ter colunas que correpondem a aquelas que a linha
LogFormat gravam no arquivo de log.
208                                   MySQL Technical Reference for Version 5.0.0-alpha



4 Administra¸˜o do Bancos de Dados MySQL
            ca

4.1 Configurando o MySQL

4.1.1 Op¸˜es de Linha de Comando do mysqld
        co

Na maioria dos casos vocˆ deve gerenciar as op¸˜es do mysqld por meio dos arquivos de
                          e                     co
op¸˜es. Veja Se¸˜o 4.1.2 [Arquivos de op¸˜es], P´gina 217.
   co           ca                      co      a
mysqld e mysqld.server lˆem op¸˜es dos grupos mysqld e server. mysqld_safe lˆ as
                            e     co                                                  e
op¸˜es dos grupos mysqld, server, mysqld_safe e mysqld_safe. Um servidor MySQL
   co
embutido normalmente lˆ op¸˜es do grupos server, embedded e xxxxx_SERVER, onde xxxxx
                        e co
´ o nome da aplica¸˜o.
e                  ca
mysqld aceita os seguintes op¸˜es de linha de comando. Aqui est´ uma lista das mais
                              co                                     a
comuns. Para uma lista completa execute mysqld --help. As op¸˜es usadas para replica¸˜o
                                                               co                      ca
est`o listadas em uma se¸˜o separada, veja Se¸˜o 4.11.6 [Replication Options], P´gina 393.
   a                    ca                   ca                                 a
--ansi      Utilizar a sintaxe ANSI SQL no lugar da sintaxe MySQL Veja Se¸˜o 1.8.2 [ANSI
                                                                         ca
            mode], P´gina 42.
                      a
-b, --basedir=path
          Encaminho para o diret´rio de instala¸˜o. Todos os caminhos normalmente s˜o
                                 o             ca                                  a
          resolvidos em rela¸˜o a este.
                            ca
--big-tables
          Permite grandes conjuntos de resultados salvando todos os conjuntos tem-
          por´rios em um arquivo. Ele resolve a maioria dos erros ’table full’, mas
              a
          tamb´m abaixa a velocidade das consultas nas quais as tabelas em mem´ria
                e                                                                   o
          seriam suficientes. Desde a Vers˜o 3.23.2, o MySQL ´ capaz de resolver isto au-
                                         a                  e
          tomaticamente usando mem´ria para pequenas tabelas tempor´rias e trocando
                                      o                                a
          para o disco as tabelas, quando for necess´rio.
                                                    a
--bind-address=IP
          Endere¸o IP para ligar.
                c
--console
            Grava a mensagem de erro no stderr/stdout mesmo se --log-error ´ espefi-
                                                                            e
            cado. No Windows o mysqld n˜o fechar´ a tela de console se esta op¸˜o ´
                                          a        a                          ca e
            usada.
--character-sets-dir=path
          Diret´rio onde est˜o os conjuntos de caracteres. Veja Se¸˜o 4.7.1 [Conjunto de
               o            a                                     ca
          caracteres], P´gina 326.
                        a
--chroot=path
          Coloca o daemon mysqld no diretorio chroot durante a inicializa¸˜o. Medida
                                                                          ca
          de seguran¸a recomendada desde o MySQL 4.0 (MySQL 3.23 n˜o est´ apto a
                    c                                                   a    a
          fornecer um chroot 100% fechado. Limita os comandos LOAD DATA INFILE e
          SELECT ... INTO OUTFILE.
Cap´
   ıtulo 4: Administra¸˜o do Bancos de Dados MySQL
                      ca                                                            209



--core-file
          Grava um arquivo core se o mysqld morrer. Para alguns sistemas vocˆ deve
                                                                                 e
          tamb´m especificar --core-file-size para mysqld_safe. Veja Se¸˜o 4.8.2
               e                                                              ca
          [mysqld_safe], P´gina 332. Note que em alguns sistemas, como Solaris, vocˆ
                           a                                                         e
          n˜o consiguir´ um arquivo core se vocˆ tamb´m estiver usando a op¸˜o --user.
            a          a                       e     e                     ca
-h, --datadir=caminho
          Encaminha para o diret´rio raiz dos bancos de dados.
                                o
--debug[...]=
          Se o MySQL est´ configurado com --with-debug, vocˆ pode usar esta op¸˜o
                          a                                     e                  ca
          para obter um arquivo de rastreamento indicando o que o mysqld est´ fazendo.
                                                                            a
          Veja Se¸˜o D.1.2 [Criando arquivos trace], P´gina 1071.
                 ca                                   a
--default-character-set=conjunto_caracter
          Configura o conjunto de caracteres padr˜o. Veja Se¸˜o 4.7.1 [Conjunto de
                                                a          ca
          caracteres], P´gina 326.
                        a
--default-table-type=tipo
          Configura o tipo de tabela padr˜o. Veja Cap´
                                        a           “ptexi tulo 7 [Tipos de tabelas],
          P´gina 629.
           a
--delay-key-write[= OFF | ON | ALL]
          Como o DELAYED KEYS do MyISAM deve ser usado.               Veja Se¸˜o 5.5.2
                                                                             ca
          [Parˆmetros do servidor], P´gina 455.
              a                      a
--delay-key-write-for-all-tables; No MySQL 4.0.3 voc^ deve usar
                                                          e
--delay-key-write=ALL.
          N˜o descarrega buffers das chaves entre escritas em nenhuma tabela MyISAM.
           a
          Veja Se¸˜o 5.5.2 [Parˆmetros do servidor], P´gina 455.
                 ca            a                      a
--des-key-file=filename
          Read the default keys used by DES_ENCRYPT() and DES_DECRYPT() from this
          file.
--enable-external-locking (era --enable-locking)
          Habilita o bloqueio do sistema. Perceba que se usar esta op¸˜o em um sistema
                                                                     ca
          que n˜o possui um lockd() completamente funcional (como no Linux) vocˆ pode
                a                                                               e
          fazer com que o mysqld entre em deadlock.
--enable-named-pipe
          Habilita suporte para named pipes (somente no NT/Win2000/XP).
-T, --exit-info
          Esta ´ uma m´scara bin´ria com diferˆntes parˆmetros que pode ser usada para
               e       a        a             e        a
          depurar o servidor mysqld; Esta op¸˜o n˜o deve ser usada por algu´m que n˜o
                                            ca a                           e        a
          a conhe¸a muito bem!
                  c
--flush    Atualiza todas as altera¸˜es no disco depois de cada comando SQL. Normal-
                                   co
           mente o MySQL s´ faz a escrita de todas as altera¸˜es no disco depois de cada
                             o                              co
           comando SQL e deixa o sistema operacional lidar com a sincroniza¸˜o com o
                                                                              ca
           disco. Veja Se¸˜o A.4.1 [Falhas], P´gina 921.
                         ca                   a
210                                    MySQL Technical Reference for Version 5.0.0-alpha



-?, --help
             Mostra uma pequena ajuda e sai.
--init-file=arquivo
          Lˆ comandos SQL do arquivo especificado na inicializa¸˜o.
           e                                                  ca
-L, --language=...
          Mensagens de erro do cliente na l´
                                           ingua especificada. Pode ser fornecido como
          um caminho completo. Veja Se¸˜o 4.7.2 [L´
                                        ca         inguas], P´gina 328.
                                                             a
-l, --log[=arquivo]
          Log de conex˜es e consultas ao arquivo. Veja Se¸˜o 4.10.2 [Log de consultas],
                      o                                  ca
          P´gina 373.
            a
--log-bin=[arquivo]
          Registra todas as consultas que alteram dados em arquivo. Usado para backup
          e replica¸˜o. Veja Se¸˜o 4.10.4 [Binary log], P´gina 375.
                   ca          ca                        a
--log-bin-index[=arquivo]
          Arquivo de ´indice para nomes de arquivos de log binario. Veja Se¸˜o 4.10.4
                                                                           ca
          [Log bin´rio], P´gina 375.
                  a       a
--log-error[=arquivo]
          Registra mensagens de erro e inicializa¸˜o neste arquivo. Veja Se¸˜o 4.10.1 [Log
                                                 ca                        ca
          de erro], P´gina 373.
                     a
--log-isam[=arquivo]
          Log de todas altera¸˜es ISAM/MyISAM no arquivo (usado somente quando
                             co
          estiver depurando bancos ISAM/MyISAM).
--log-long-format
          Registra algumas informa¸˜es extras nos aruivos de log (log de atualiza¸˜es,
                                     co                                                 co
          log bin´rio de atualiza¸˜es e log de consultas lentas, independente de qual est´
                  a              co                                                        a
          ativado). Por exemplo, nome do usu´rio e timestamp s˜o registrados para a
                                                 a                   a
          consulta. Se vocˆ estiver usando --log-slow-queries e --log-long-format,
                           e
          ent˜o consultas que n˜o est˜o usando ´
             a                   a      a          indices s˜o registradas ao log de con-
                                                            a
          sultas lentas. Note que --log-long-format est´ obsoleto a partir do MySQL
                                                            a
          vers˜o 4.1, quando --log-short-format foi introduzido (--log-long-format
              a
          ´ a configura¸˜o padr˜o desde a vers˜o 4.1). Note tamb´m que a partir do
          e             ca       a               a                     e
          MySQL 4.1, a op¸˜o --log-queries-not-using-indexes est´ dispon´ para
                           ca                                             a        ivel
          prop´sito de registro de consultas que n˜o usam ´
               o                                   a        indices para o log de consultas
          lentas.
--log-queries-not-using-indexes
          Se vocˆ estiver usando --log-slow-queries, ent˜o consultas que n˜o est˜o
                 e                                       a                 a     a
                   ´
          usando indices est˜o registradas no log de consultas lentas. Esta op¸˜es
                             a                                                 co
          est´ dispon´
              a      ivel a partir do MySQL 4.1. Veja Se¸˜o 4.10.5 [Slow query log],
                                                        ca
          P´gina 378.
            a
--log-short-format
          Registra menos informa¸˜es extras nos aruivos de log (log de atualiza¸˜es, log
                                 co                                            co
          bin´rio de atualiza¸˜es e log de consultas lentas, independente de qual est´
             a               co                                                        a
Cap´
   ıtulo 4: Administra¸˜o do Bancos de Dados MySQL
                      ca                                                              211



            ativado). Por exemplo, nome do usu´rio e timestamp s˜o registrados para a
                                                  a             a
            consulta. Esta op¸˜o foi introduzida no MySQL 4.1.
                             ca
--log-slow-queries[=arquivo]
          Log de todas as consultas que levam mais de long_query_time segundos de
          execu¸˜o para um arquivo. Note que o padr˜o para a quantidade de informa¸˜o
                ca                                 a                              ca
          registrada alterou no MySQL 4.1. Veja as op¸˜es --log-long-format e -
                                                        co
          -log-long-format para mais detalhes. Veja Se¸˜o 4.10.5 [Slow query log],
                                                         ca
          P´gina 378.
            a
--log-update[=arquivo]
          Log de atualiza¸˜es para file.# onde # ´ um n´mero unico se n˜o for fornecido.
                         co                      e     u      ´         a
          Veja Se¸˜o 4.10.3 [Log de atualiza¸˜o], P´gina 374. O log de atualiza¸˜o
                  ca                         ca      a                               ca
          est´obsoleto e ser´ removido no MySQL 5.0; vocˆ deve usar o log bin´rio em
             a              a                             e                     a
          seu lugar (--log-bin). Veja Se¸˜o 4.10.4 [Log bin´rio], P´gina 375. A partir
                                         ca                 a       a
          da vers˜o 5.0, usar --log-update apenar ligar´ o log bin´rio.
                 a                                     a          a
--low-priority-updates
          Opera¸˜es de altera¸˜es das tabelas (INSERT/DELETE/UPDATE) ir˜o ter priori-
                 co            co                                          a
          dade menor do que as selects. Isto tamb´m pode ser feito usando {INSERT |
                                                   e
          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. Veja Se¸˜o 5.3.2 [Bloqueio de tabelas],
                                    ´                    ca
          P´gina 445.
            a
--memlock
            Bloqueia o processo mysqld na mem´ria. Isto funciona somente se o seu sistema
                                               o
            suportar a chamada de sistema mklockall() (como no Solaris). Isto pode
            ajudar se vocˆ tiver um problema no qual o sistema operacional faz com que
                           e
            o mysqld fa¸a a troca em disco. Note que o uso desta op¸˜o exige que vocˆ
                         c                                           ca                  e
            execute o servidor como root, que normalmente n˜o ´ uma boa id´ia por raz˜es
                                                            a e            e           o
            de seguran¸a.
                       c
--myisam-recover [=op¸~o[,op¸~o...]]] onde op¸~o ´ qualquer combina¸~o
                       ca       ca                  ca e                    ca
          de DEFAULT, BACKUP, FORCE ou QUICK. Vocˆ tamb´m pode configurar isto ex-
                                                      e      e
          plicitamente para "" se vocˆ deseja desabilitar esta op¸˜o. Se esta op¸˜o for
                                       e                          ca              ca
          usada, o mysqld ir´ conferir na abertura se a tabela est´ marcada como que-
                              a                                     a
          brada ou se a tabela n˜o foi fechada corretamente. (A ultima op¸˜o funciona
                                  a                                ´         ca
          somente se vocˆ estiver executando com --skip-locking). Se este for o caso
                         e
          mysqld ir´ executar uma conferˆncia na tabela. Se a tabela estiver corrompida,
                   a                      e
          o mysqld ir´ tentar repar´-la.
                     a               a
          As seguintes op¸˜es afetam no funcionamento da repara¸˜o.
                          co                                       ca
          Op¸˜o
             ca            Descri¸˜o
                                  ca
          DEFAULT          O mesmo que n˜o fornecer uma op¸˜o para --myisam-
                                             a                    ca
                           recover.
          BACKUP           Se os dados da tabela foram alterados durante a recupera¸˜o,
                                                                                   ca
                           salve um backup do arquivo de dados ‘nome_tabela.MYD’
                           como ‘nome_tabela_dia_hora.BAK’.
          FORCE            Execute a recupera¸˜o mesmo se perdermos mais de uma
                                               ca
                           linha do arquivo .MYD.
212                                   MySQL Technical Reference for Version 5.0.0-alpha



           QUICK           N˜o confira as linhas na tabela se n˜o existir nenhum bloco
                             a                                a
                           apagado.
           Antes da tabela ser reparada automaticamente, o MySQL ir´ adicionar uma
                                                                        a
           nota no log de erros. Se vocˆ desejar que a recupera¸˜o da maioria dos prob-
                                       e                       ca
           lemas n˜o tenha a interven¸˜o de algum usu´rio, devem ser usadas as op¸˜es
                    a                 ca                a                          co
           BACKUP,FORCE. Isto ir´ for¸ar um reparo de uma tabela mesmo se alguns reg-
                                  a  c
           istros forem apagados, mas ele manter´ o arquivo de dados antigo como um
                                                  a
           backup para que vocˆ possa examinar posteriormente o que aconteceu.
                                e
--new      A partir da vers˜o 4.0.12, a op¸˜o --new pode ser usada para fazer o servidor
                           a              ca
           se comportar como 4.1 em certos aspectos, facilitando a atualiza¸˜o da vers˜o
                                                                           ca         a
           4.0 para 4.1:
             • TIMESTAMP ´ retornado com uma string com o formato ’YYYY-MM-DD
                           e
                HH:MM:SSS. Veja Se¸˜o 6.2 [Tipos de colunas], P´gina 482.
                                   ca                          a
--pid-file=caminho
          Encaminha para o arquivo pid usado pelo mysqld_safe.
-P, --port=...
          N´mero da porta para conex˜es TCP/IP.
            u                       o
-o, --old-protocol
          Utilize o protocolo 3.20 para compatibilidade com alguns clientes muito antigos.
          Veja Se¸˜o 2.5.5 [Atualizando a vers˜o 3.20], P´gina 129.
                  ca                           a          a
--one-thread
          Usa somente uma thread (para depura¸˜o sobre Linux). Esta op¸˜o est´
                                                  ca                      ca      a
          dispon´
                ivel apenas se o servidor est´ constru´ com a depura¸˜o habilitada.
                                             a        ido           ca
          Veja Se¸˜o D.1 [Depurando o servidor], P´gina 1070.
                 ca                                a
--open-files-limit=
          Para alterar o n´mero de descritores de arquivos dispon´
                            u                                     iveis para o mysqld. Se
          isto n˜o estiver configurado com 0, ent˜o o mysqld usar´ este valor para reservar
                a                               a               a
          descritores de arquivos para usar com setrlimit(). Se este valor ´ 0 ent˜o o
                                                                               e      a
          mysqld reservar´ max_connections*5 ou max_connections + table_cache*2
                            a
          (que ´ sempre
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL
Super Manual MySQL

Mais conteúdo relacionado

PDF
PDF
K19 k32-desenvolvimento-web-com-aspnet-mvc
PDF
K19 k32-desenvolvimento-web-com-aspnet-mvc
PDF
K19 k52-desenvolvimento-web-com-struts
PDF
K19 k12-desenvolvimento-web-com-jsf2-e-jpa2
PDF
K19 k23-integracao-de-sistemas-com-webservices-jms-e-ejb
PDF
K19 k31-csharp-e-orientacao-a-objetos
PDF
K19 k03-sql-e-modelo-relacional
K19 k32-desenvolvimento-web-com-aspnet-mvc
K19 k32-desenvolvimento-web-com-aspnet-mvc
K19 k52-desenvolvimento-web-com-struts
K19 k12-desenvolvimento-web-com-jsf2-e-jpa2
K19 k23-integracao-de-sistemas-com-webservices-jms-e-ejb
K19 k31-csharp-e-orientacao-a-objetos
K19 k03-sql-e-modelo-relacional

Mais procurados (19)

PDF
OpenLDAP
PDF
Programando ooo b
PDF
Apostila c# iniciantes
PDF
K19 k12-desenvolvimento-web-com-jsf2-e-jpa2
PDF
Drivers de Dispositivos Linux
PDF
K19 k11-orientacao-a-objetos-em-java
PDF
K19 k41-desenvolvimento-mobile-com-android
PDF
K19 k21-persistencia-com-jpa2-e-hibernate
PDF
Caelum ruby-on-rails-rr71
PDF
PDF
K19 k22-desenvolvimento-web-avancado-com-jsf2-ejb3.1-e-cdi
PDF
K19 k02-desenvolvimento-web-com-html-css-e-javascript
PDF
K19 k51-design-patterns-em-java
PDF
Apostila JSF 2.0 - K19
PDF
My sql
PDF
K19 k23-integracao-de-sistemas-com-webservices-jms-e-ejb
PDF
K19 k02-desenvolvimento-web-com-html-css-e-javascript
PDF
Desenvolvimento-web-com-html-css-e-javascript
OpenLDAP
Programando ooo b
Apostila c# iniciantes
K19 k12-desenvolvimento-web-com-jsf2-e-jpa2
Drivers de Dispositivos Linux
K19 k11-orientacao-a-objetos-em-java
K19 k41-desenvolvimento-mobile-com-android
K19 k21-persistencia-com-jpa2-e-hibernate
Caelum ruby-on-rails-rr71
K19 k22-desenvolvimento-web-avancado-com-jsf2-ejb3.1-e-cdi
K19 k02-desenvolvimento-web-com-html-css-e-javascript
K19 k51-design-patterns-em-java
Apostila JSF 2.0 - K19
My sql
K19 k23-integracao-de-sistemas-com-webservices-jms-e-ejb
K19 k02-desenvolvimento-web-com-html-css-e-javascript
Desenvolvimento-web-com-html-css-e-javascript
Anúncio

Semelhante a Super Manual MySQL (20)

PDF
Manual - Mysql
PDF
Refman 4.1-pt.a4
PDF
Refman 4.1-(português).a4
PDF
MySQL em 10min - Alexandre Almeida HTI Tecnologia
PDF
Tutorial mysql
PDF
Apostilando mysql
PDF
Apostila Curso Php My Sql(Portugues)
PDF
Otimizando a segurança, o desempenho e a disponibilidade com o MySQL Enterpri...
PDF
MySQL Alta Performance & Alta Disponibilidade
PDF
Php curso de php com my sql
PPTX
MySQL Profiling com Enterprise Monitor
PDF
MySQL no Windows
PDF
Apostila curso php_my_sql(portugues)
PDF
Otimizando a segurança, o desempenho e a disponibilidade com o MySQL Enterpri...
PPTX
Uso estratégico do MySQL para empresas de TI: Novidades e Futuro
PDF
MySQL no Windows: implementação eficiente de novas aplicações
PDF
MySQL - o banco de dados open source mais popular do mundo
PDF
MySQL: o banco de dados open source mais popular do mundo
PDF
MySQL para Desenvolvedores de Produto
Manual - Mysql
Refman 4.1-pt.a4
Refman 4.1-(português).a4
MySQL em 10min - Alexandre Almeida HTI Tecnologia
Tutorial mysql
Apostilando mysql
Apostila Curso Php My Sql(Portugues)
Otimizando a segurança, o desempenho e a disponibilidade com o MySQL Enterpri...
MySQL Alta Performance & Alta Disponibilidade
Php curso de php com my sql
MySQL Profiling com Enterprise Monitor
MySQL no Windows
Apostila curso php_my_sql(portugues)
Otimizando a segurança, o desempenho e a disponibilidade com o MySQL Enterpri...
Uso estratégico do MySQL para empresas de TI: Novidades e Futuro
MySQL no Windows: implementação eficiente de novas aplicações
MySQL - o banco de dados open source mais popular do mundo
MySQL: o banco de dados open source mais popular do mundo
MySQL para Desenvolvedores de Produto
Anúncio

Mais de kisb1337 (20)

DOC
Historia do brasil pg188
DOC
Apostila de geografia do brasil pg56
DOC
Planejamento, organização, direção e controle pg70
DOC
Noções de administração pg80
DOC
Noções básicas de administração pública pg33
DOC
Apostilas de recursos humanos pg106
DOC
Apostila de administração pública pg8
DOC
Apostila de administração publica resumo pg55
DOC
Administração pública pg9
DOC
Administração financeira e orçamentária pg176
DOC
Questões comentadas administração financeira pg30
DOC
Resumo adjunto adnominal e adverbial pg2
DOC
Questões comuns comentadas posteriores portugues pg21
DOC
Preposição e conjunção ( conectivos ) pg35
DOC
Pontuação pg30
DOC
Lingua portuguesa pg110
DOC
Interpretação e ordenação textual pg29
DOC
Guia prático nova ortografia pg10
DOC
Exercicios de portugues verbo pg66
DOC
Apostila de portugues pg87
Historia do brasil pg188
Apostila de geografia do brasil pg56
Planejamento, organização, direção e controle pg70
Noções de administração pg80
Noções básicas de administração pública pg33
Apostilas de recursos humanos pg106
Apostila de administração pública pg8
Apostila de administração publica resumo pg55
Administração pública pg9
Administração financeira e orçamentária pg176
Questões comentadas administração financeira pg30
Resumo adjunto adnominal e adverbial pg2
Questões comuns comentadas posteriores portugues pg21
Preposição e conjunção ( conectivos ) pg35
Pontuação pg30
Lingua portuguesa pg110
Interpretação e ordenação textual pg29
Guia prático nova ortografia pg10
Exercicios de portugues verbo pg66
Apostila de portugues pg87

Último (20)

PDF
Uma Introdução às Ciências do Alcorão (Islam)
PDF
A relação entre funções executivas e desempenho acadêmico em crianças com Tra...
PDF
COMO OS CONTOS DE FADAS REFLETEM ARQUÉTIPOS_MEDOS E DESEJOS DO INCONSCIENTE H...
PPTX
Trabalho Cidades sustentáveis ou Utopia.pptx
PPTX
HISTÓRIA DO BRASIL - anos de Democracia.pptx
PDF
manual-orientacao-asb_5a8d6d8d87160aa636f63a5d0.pdf
PPTX
Biologia celular: citologia, é o estudo da célula, a unidade básica da vida.
PDF
aulademeiodetransporteemlibras-120304202807-phpapp01_removed.pdf
PPTX
Lição 8 EBD.pptxtudopossonaquelequemimfortalece
PDF
Metabolismo_energético_3ano_pre_vest_2026.pdf
PPT
HISTOLOGIA VEGETAL - tecidos vegetais.ppt
PDF
GESTÃO DA FASE PRÉ-ANALÍTICA- Recomendações da SBPC-ML (3).pdf
PPT
sistema reprodutor para turmas do oitavo ano
PDF
ESPELHOS DA ALMA A PSICOLOGIA POR TRÁS DOS CONTOS DE FADAS.pdf
PDF
O retorno a origem (islã Islamismo)
PPT
História e Evolução dos Computadores domésticos
PPTX
O Romantismo e a identidade brasileira..
PPTX
MENDEL - Aula sobre Mendel - Genética EM
PPTX
brasilcolnia2-101027184359-phpapp02.pptx
PDF
DAQUISIÇÃO E DESENVOLVIMENTO DA FALA 12 A 24 MESES
Uma Introdução às Ciências do Alcorão (Islam)
A relação entre funções executivas e desempenho acadêmico em crianças com Tra...
COMO OS CONTOS DE FADAS REFLETEM ARQUÉTIPOS_MEDOS E DESEJOS DO INCONSCIENTE H...
Trabalho Cidades sustentáveis ou Utopia.pptx
HISTÓRIA DO BRASIL - anos de Democracia.pptx
manual-orientacao-asb_5a8d6d8d87160aa636f63a5d0.pdf
Biologia celular: citologia, é o estudo da célula, a unidade básica da vida.
aulademeiodetransporteemlibras-120304202807-phpapp01_removed.pdf
Lição 8 EBD.pptxtudopossonaquelequemimfortalece
Metabolismo_energético_3ano_pre_vest_2026.pdf
HISTOLOGIA VEGETAL - tecidos vegetais.ppt
GESTÃO DA FASE PRÉ-ANALÍTICA- Recomendações da SBPC-ML (3).pdf
sistema reprodutor para turmas do oitavo ano
ESPELHOS DA ALMA A PSICOLOGIA POR TRÁS DOS CONTOS DE FADAS.pdf
O retorno a origem (islã Islamismo)
História e Evolução dos Computadores domésticos
O Romantismo e a identidade brasileira..
MENDEL - Aula sobre Mendel - Genética EM
brasilcolnia2-101027184359-phpapp02.pptx
DAQUISIÇÃO E DESENVOLVIMENTO DA FALA 12 A 24 MESES

Super Manual MySQL

  • 1. MySQL Reference Manual Copyright c 1997-2003 MySQL AB
  • 3. i Sum´rio a 1 Informa¸˜es Gerais . . . . . . . . . . . . . . . . . . . . . . . . 1 co 1.1 Sobre Este Manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.1.1 Conven¸˜es Usadas Neste Manual . . . . . . . . . . . . . . . . 2 co 1.2 Vis˜o Geral do Sistema de Gerenciamento de Banco de Dados a MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.1 Hist´ria do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 o 1.2.2 As Principais Caracter´ isticas do MySQL . . . . . . . . . . 5 1.2.3 Estabilidade do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.2.4 Qual o Tamanho Que as Tabelas do MySQL Podem Ter? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.5 Compatibilidade Com o Ano 2000 (Y2K) . . . . . . . . 11 1.3 Vis˜o Geral da MySQL AB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 a 1.3.1 O Modelo de Neg´cio e Servi¸os da MySQL AB . . 13 o c 1.3.1.1 Suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.3.1.2 Treinamento e Certifica¸˜o. . . . . . . . . . . . . 13 ca 1.3.1.3 Consultoria . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.3.1.4 Licen¸as Comerciais . . . . . . . . . . . . . . . . . . . 14 c 1.3.1.5 Parcerias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.3.2 Informa¸˜es para Contato . . . . . . . . . . . . . . . . . . . . . . 15 co 1.4 Suporte e Licenciamento do MySQL . . . . . . . . . . . . . . . . . . . . . 16 1.4.1 Suporte Oferecido pela MySQL AB . . . . . . . . . . . . . 16 1.4.2 Copyrights e Licen¸as Usadas pelo MySQL . . . . . . 17 c 1.4.3 Licen¸as do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 c 1.4.3.1 Usando o Programa MySQL Sob uma Licen¸a Comercial . . . . . . . . . . . . . . . . . . . . . . . . 18 c 1.4.3.2 Usando o Programa MySQL Sem Custo Sob GPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.4.4 Logomarcas e Marcas Registradas da MySQL AB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.4.4.1 O Logo Original do MySQL. . . . . . . . . . . . 20 1.4.4.2 Logomarcas da MySQL que Podem Ser Usadas Sem Permiss˜o de Altera¸˜o . . . . . . . . 20 a ca 1.4.4.3 Quando Vocˆ Precisa de Permiss˜o de e a Altera¸˜o para Usar as Logomarcas do MySQL? ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.4.4.4 Logomarcas dos Parceiros da MySQL AB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.4.4.5 Usando a Palavra MySQL em Texto Impresso ou Apresenta¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . 21 ca 1.4.4.6 Usando a Palavra MySQL em Nomes de Companhias e Produtos . . . . . . . . . . . . . . . . . . . 21 1.5 Mapa de Desenvolvimento do MySQL. . . . . . . . . . . . . . . . . . . . 21 1.5.1 MySQL 4.0 in a Nutshell . . . . . . . . . . . . . . . . . . . . . . . 22
  • 4. ii 1.5.1.1 Recursos Dispon´ iveis no MySQL 4.0 . . . . 22 1.5.1.2 Servidor Embutido MySQL . . . . . . . . . . . . 23 1.5.2 MySQL 4.1 in a Nutshell . . . . . . . . . . . . . . . . . . . . . . . 24 1.5.2.1 Recursos Dispon´ iveis no MySQL 4.1 . . . . 24 1.5.2.2 Stepwise Rollout . . . . . . . . . . . . . . . . . . . . . . 26 1.5.2.3 Pronto para Uso em Desenvolvimento Imediato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.5.3 MySQL 5.0, A Pr´xima Distribui¸˜o de o ca Desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.6 MySQL e o Futuro (o TODO). . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.6.1 Novos Recursos Planejados Para a Vers˜o 4.1 . . . . 26 a 1.6.2 Novos Recursos Planejados Para a Vers˜o 5.0 . . . . 27 a 1.6.3 Novos Recursos Planejados Para a Vers˜o 5.1 . . . . 28 a 1.6.4 Novos Recursos Planejados Para a Vers˜o em um a Futuro Pr´ximo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 o 1.6.5 Novos Recursos Planejados Para a Vers˜o em um a Futuro a M´dio Prazo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 e 1.6.6 Novos Recursos que N˜o Planejamos Fazer . . . . . . 32 a 1.7 Fontes de Informa¸˜es do MySQL . . . . . . . . . . . . . . . . . . . . . . . 33 co 1.7.1 Listas de Discuss˜o MySQL . . . . . . . . . . . . . . . . . . . . 33 a 1.7.1.1 As Listas de Discuss˜o do MySQL . . . . . . 33 a 1.7.1.2 Fazendo perguntas ou relatando erros . . . 35 1.7.1.3 Como relatar erros ou problemas . . . . . . . 36 1.7.1.4 Guia para responder quest˜es na lista de o discuss˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 a 1.7.2 Suporte a Comunidade MySQL Atrv´s do IRC e (Internet Relay Chat) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 1.8 Qual compatibilidade aos padr˜es o MySQL oferece ? . . . . . 41 o 1.8.1 Qual Padr˜o o MySQL Segue? . . . . . . . . . . . . . . . . . . 42 a 1.8.2 Executando o MySQL no modo ANSI . . . . . . . . . . . 42 1.8.3 Extens˜es do MySQL para o Padr˜o SQL-92. . . . . 43 o a 1.8.4 Diferen¸as do MySQL em Compara¸˜o com o c ca SQL-92 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 1.8.4.1 Subqueries . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 1.8.4.2 SELECT INTO TABLE . . . . . . . . . . . . . . . . . . . 46 1.8.4.3 Transa¸˜es e Opera¸˜es Atˆmicas . . . . . . 46 co co o 1.8.4.4 Stored Procedures e Triggers . . . . . . . . . . . 49 1.8.4.5 Chaves Estrangeiras . . . . . . . . . . . . . . . . . . . 49 1.8.4.6 Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 1.8.4.7 ‘--’ como In´ de Coment´rio . . . . . . . . 51 icio a 1.8.5 Como o MySQL Lida com Restri¸˜es . . . . . . . . . . . . 52 co 1.8.5.1 Restri¸˜es de PRIMARY KEY / UNIQUE co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 1.8.5.2 Restri¸˜es de NOT NULL . . . . . . . . . . . . . . . . 53 co 1.8.5.3 Restri¸˜es de ENUM e SET. . . . . . . . . . . . . . . 53 co 1.8.6 Erros Conhecidos e Deficiˆncias de Projetos noe MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
  • 5. iii 1.8.6.1 Erros da Vers˜o 3.23 Corrigidos em Vers˜es a o Posteriores do MySQL . . . . . . . . . . . . . . . . . . . . 53 1.8.6.2 Open Bugs / Deficiˆncias de Projeto no e MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2 Instala¸˜o do MySQL . . . . . . . . . . . . . . . . . . . . . 60 ca 2.1 Instala¸˜o r´pida padr˜o do MySQL . . . . . . . . . . . . . . . . . . . . . 60 ca a a 2.1.1 Instalando o MySQL no Windows . . . . . . . . . . . . . . . 60 2.1.1.1 Exigˆncias do Sistema Windows . . . . . . . . 61 e 2.1.1.2 Instalando uma Distribui¸˜o Bin´ria do ca a Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 2.1.1.3 Preparando o Ambiente MySQL do Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 2.1.1.4 Selecionando um Servidor Windows . . . . 63 2.1.1.5 Iniciando o Servidor pela Primeira Vez . . 64 2.1.1.6 Iniciando o MySQL no Windows 95, 98, ou Me . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 2.1.1.7 Iniciando o MySQL no Windows NT, 2000, ou XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 2.1.1.8 Executando o MySQL no Windows . . . . . 68 2.1.2 Instalando o MySQL no Linux . . . . . . . . . . . . . . . . . . 69 2.1.3 Instalando o MySQL no Mac OS X . . . . . . . . . . . . . 71 2.1.4 Instalando o MySQL no NetWare . . . . . . . . . . . . . . . 73 2.1.4.1 Instalando o MySQL para Bin´rios do a NetWare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 2.2 Detalhes Gerais de Instala¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 ca 2.2.1 Como obter o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 75 2.2.2 Verificando a Integridade do Pacote Usando MD5 Checksums ou GnuPG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 2.2.3 Sistemas Operacionais suportados pelo MySQL . . 78 2.2.4 Qual vers˜o do MySQL deve ser usada . . . . . . . . . . 80 a 2.2.5 Layouts de Instala¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . 83 ca 2.2.6 Como e quando as atualiza¸˜es s˜o lan¸adas? . . . . 84 co a c 2.2.7 Filosofia das Distribui¸˜es - Nenhum Bug co Conhecidos nas Distribui¸˜es . . . . . . . . . . . . . . . . . . . . . 84 co 2.2.8 Bin´rios MySQL compilados pela MySQL AB . . . 86 a 2.2.9 Instalando uma Distribui¸˜o Bin´ria do MySQL . . 91 ca a 2.3 Instalando uma distribui¸˜o com fontes do MySQL . . . . . . . 93 ca 2.3.1 Vis˜o geral da instala¸˜o r´pida . . . . . . . . . . . . . . . . 94 a ca a 2.3.2 Aplicando patches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 2.3.3 Op¸˜es t´co ipicas do configure . . . . . . . . . . . . . . . . . . . 97 2.3.4 Instalando pela ´rvore de fontes do desenvolvimento a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 2.3.5 Lidando com Problemas de Compila¸˜o . . . . . . . . 103 ca 2.3.6 Notas MIT-pthreads . . . . . . . . . . . . . . . . . . . . . . . . . . 106 2.3.7 Instalando o MySQL a partir do Fonte no Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 2.3.7.1 Construindo o MySQL Usando VC++ . . 108
  • 6. iv 2.3.7.2 Criando um Pacote Fonte do Windows a ´ partir da Ultima Fonte de Desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 2.4 Configura¸˜es e Testes P´s-instala¸˜o . . . . . . . . . . . . . . . . . . . 111 co o ca 2.4.1 Problemas Executando o mysql_install_db. . . . 115 2.4.2 Problemas Inicializando o Servidor MySQL . . . . . 116 2.4.3 Inicializando e parando o MySQL automaticamente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 2.5 Atualizando/Desatualizando o MySQL . . . . . . . . . . . . . . . . . . 120 2.5.1 Atualizando da Vers˜o 4.0 para 4.1 . . . . . . . . . . . . 120 a 2.5.2 Atualizando da Vers˜o 3.23 para 4.0 . . . . . . . . . . . 123 a 2.5.3 Atualizando da vers˜o 3.22 para 3.23 . . . . . . . . . . . 126 a 2.5.4 Atualizando da vers˜o 3.21 para 3.22 . . . . . . . . . . . 128 a 2.5.5 Atualizando da vers˜o 3.20 para 3.21 . . . . . . . . . . . 129 a 2.5.6 Atualizando a Tabela de Permiss˜es . . . . . . . . . . . . 130 o 2.5.7 Atualizando para outra arquitetura . . . . . . . . . . . . 130 2.5.8 Atualizando o MySQL no Windows . . . . . . . . . . . . 132 2.6 Notas espec´ ificas para os Sistemas Operacionais . . . . . . . . . 132 2.6.1 Notas Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 2.6.1.1 Conectando em um MySQL Rematamente a Windows Utilizando SSH . . . . . . . . . . . . . . . 133 2.6.1.2 Distribuindo Dados Entre Diferentes Discos no Win32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 2.6.1.3 Compilando clientes MySQL no Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 2.6.1.4 MySQL para Windows Comparado com o MySQL para Unix . . . . . . . . . . . . . . . . . . . . . . . 134 2.6.2 Notas Linux (Todas as vers˜es) . . . . . . . . . . . . . . . . 137 o 2.6.2.1 Notas Linux para distribui¸˜es bin´rias co a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 2.6.2.2 Notas Linux x86 . . . . . . . . . . . . . . . . . . . . . 142 2.6.2.3 Notas Linux SPARC . . . . . . . . . . . . . . . . . 143 2.6.2.4 Notas Linux Alpha . . . . . . . . . . . . . . . . . . . 143 2.6.2.5 Notas Linux PowerPC . . . . . . . . . . . . . . . . 144 2.6.2.6 Notas Linux MIPS . . . . . . . . . . . . . . . . . . . 144 2.6.2.7 Notas Linux IA-64 . . . . . . . . . . . . . . . . . . . 144 2.6.3 Notas Solaris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 2.6.3.1 Notas Solaris 2.7/2.8 . . . . . . . . . . . . . . . . . 147 2.6.3.2 Notas Solaris x86 . . . . . . . . . . . . . . . . . . . . 148 2.6.4 Notas BSD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 2.6.4.1 Notas FreeBSD . . . . . . . . . . . . . . . . . . . . . . 149 2.6.4.2 Notas NetBSD . . . . . . . . . . . . . . . . . . . . . . . 150 2.6.4.3 Notas OpenBSD . . . . . . . . . . . . . . . . . . . . . 150 2.6.4.4 Notas OpenBSD 2.8 . . . . . . . . . . . . . . . . . . 151 2.6.4.5 Notas BSDI Vers˜o 2.x . . . . . . . . . . . . . . . 151 a 2.6.4.6 Notas BSD/OS Vers˜o 3.x . . . . . . . . . . . . 151 a 2.6.4.7 Notas BSD/OS Vers˜o 4.x . . . . . . . . . . . . 152 a 2.6.5 Notas Mac OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
  • 7. v 2.6.5.1 Mac OS X 10.x . . . . . . . . . . . . . . . . . . . . . . 152 2.6.5.2 Mac OS X Server 1.2 (Rhapsody) . . . . . 153 2.6.6 Notas de Outros Unix . . . . . . . . . . . . . . . . . . . . . . . . . 153 2.6.6.1 Notas HP-UX para distribui¸˜es bin´rias co a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 2.6.6.2 Notas HP-UX Vers˜o 10.20 . . . . . . . . . . . 154 a 2.6.6.3 Notas HP-UX Vers˜o 11.x . . . . . . . . . . . . 154 a 2.6.6.4 Notas IBM-AIX. . . . . . . . . . . . . . . . . . . . . . 155 2.6.6.5 Notas SunOS 4 . . . . . . . . . . . . . . . . . . . . . . 157 2.6.6.6 Notas Alpha-DEC-UNIX (Tru64) . . . . . 157 2.6.6.7 Notas Alpha-DEC-OSF1. . . . . . . . . . . . . . 159 2.6.6.8 Notas SGI Irix . . . . . . . . . . . . . . . . . . . . . . . 160 2.6.6.9 Notas SCO . . . . . . . . . . . . . . . . . . . . . . . . . . 161 2.6.6.10 Notas SCO Unixware Version 7.0. . . . . 163 2.6.7 Notas OS/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 2.6.8 Notas Novell NetWare . . . . . . . . . . . . . . . . . . . . . . . . 164 2.6.9 Notas BeOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 2.7 Coment´rios de Instala¸˜o do Perl . . . . . . . . . . . . . . . . . . . . . . 165 a ca 2.7.1 Instalando Perl no Unix . . . . . . . . . . . . . . . . . . . . . . . 165 2.7.2 Instalaando ActiveState Perl no Windows . . . . . . 166 2.7.3 Problemas Usando a Interface Perl DBI/DBD . . . . 166 3 Tutorial de Introdu¸˜o Do MySQL . . . . . . . 169 ca 3.1 Conectando e Desconectando do Servidor . . . . . . . . . . . . . . . 169 3.2 Fazendo Consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 3.3 Cria¸˜o e Utiliza¸˜o de um Banco de Dados . . . . . . . . . . . . . 173 ca ca 3.3.1 Criando e Selecionando um Banco de Dados . . . . 174 3.3.2 Criando uma Tabela . . . . . . . . . . . . . . . . . . . . . . . . . . 175 3.3.3 Carregando dados em uma tabela . . . . . . . . . . . . . . 176 3.3.4 Recuperando Informa¸˜es de uma Tabela . . . . . . . 178 co 3.3.4.1 Selecionando Todos os Dados . . . . . . . . . 178 3.3.4.2 Selecionando Registros Espec´ ificos . . . . . 179 3.3.4.3 Selecionando Colunas Especificas . . . . . . 180 ´ 3.3.4.4 Ordenando Registros . . . . . . . . . . . . . . . . . 181 3.3.4.5 C´lculo de Datas. . . . . . . . . . . . . . . . . . . . . 183 a 3.3.4.6 Trabalhando com Valores Nulos (NULL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 3.3.4.7 Combina¸˜o de padr˜es. . . . . . . . . . . . . . . 186 ca o 3.3.4.8 Contando Registros . . . . . . . . . . . . . . . . . . 189 3.3.4.9 Utilizando M´ltiplas Tabelas . . . . . . . . . . 191 u 3.4 Obtendo Informa¸˜es Sobre Bancos de Dados e Tabelas . . 193 co 3.5 Utilizando mysql em Modo Batch . . . . . . . . . . . . . . . . . . . . . . 194 3.6 Exemplos de Consultas Comuns . . . . . . . . . . . . . . . . . . . . . . . . 196 3.6.1 O Valor M´ximo para uma Coluna . . . . . . . . . . . . . 196 a 3.6.2 O Registro que Armazena o Valor M´ximo para uma a Coluna Determinada . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 3.6.3 M´ximo da Coluna por Grupo . . . . . . . . . . . . . . . . . 197 a
  • 8. vi 3.6.4 As Linhas Armazenando o Group-wise M´ximo de a um Certo Campo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 3.6.5 Utilizando Vari´veis de Usu´rio . . . . . . . . . . . . . . . . 199 a a 3.6.6 Utilizando Chaves Estrangeiras . . . . . . . . . . . . . . . . 199 3.6.7 Pesquisando em Duas Chaves . . . . . . . . . . . . . . . . . . 201 3.6.8 Calculando Visitas Di´rias . . . . . . . . . . . . . . . . . . . . 201 a 3.6.9 Usando AUTO_INCREMENT . . . . . . . . . . . . . . . . . . . . . . 202 3.7 Consultas de Projetos Gˆmeos . . . . . . . . . . . . . . . . . . . . . . . . . 203 e 3.7.1 Encontrando Todos Gˆmeos N˜o-distribu´ e a idos . . . 204 3.7.2 Mostrando uma Tabela sobre a Situa¸˜o dos Pares ca Gˆmeos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 e 3.8 Utilizando MySQL com Apache . . . . . . . . . . . . . . . . . . . . . . . . 207 4 Administra¸˜o do Bancos de Dados MySQL ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 4.1 Configurando o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 4.1.1 Op¸˜es de Linha de Comando do mysqld . . . . . . . 208 co 4.1.2 Arquivo de Op¸˜es ‘my.cnf’ . . . . . . . . . . . . . . . . . . . 217 co 4.2 Executando M´ltiplos MySQL Servers na Mesma M´quina u a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 4.2.1 Executando M´ltiplos Servidores no Windows . . 221 u 4.2.1.1 Iniciando M´ltiplos Servidores na Linha de u Comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 4.2.1.2 Iniciando M´ltiplos Servidores Como u Servi¸os . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 c 4.2.2 Executando M´ltiplos Servidores no Unix . . . . . . 225 u 4.2.3 Usando Programas Clientes em um Ambiente Multi-Servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 4.3 Detalhes Gerais de Seguran¸a e o Sistema de Privil´gio de c e Acesso do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 4.3.1 Seguran¸a Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 c 4.3.2 Como Tornar o MySQL Seguro contra Crackers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 4.3.3 Op¸˜es de Inicializa¸˜o para o mysqld em Rela¸˜o a co ca ca Seguran¸a. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 c 4.3.4 Detalhes de Seguran¸a com LOAD DATA LOCAL . . . 232 c 4.3.5 O Que o Sistema de Privil´gios Faz . . . . . . . . . . . . 233 e 4.3.6 Como o Sistema de Privil´gios Funciona . . . . . . . . 233 e 4.3.7 Privil´gios Fornecidos pelo MySQL . . . . . . . . . . . . 237 e 4.3.8 Conectando ao Servidor MySQL . . . . . . . . . . . . . . . 239 4.3.9 Controle de Acesso, Est´gio 1: Verifica¸˜o da a ca Conex˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 a 4.3.10 Controle de Acesso, Est´gio 2: Verifica¸˜o da a ca Requisi¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 ca 4.3.11 Hashing de Senhas no MySQL 4.1 . . . . . . . . . . . . 246 4.3.12 Causas dos Erros de Accesso Negado . . . . . . . . . 250 4.4 Gerenciamento das Contas dos Usu´rios no MySQL . . . . . . 255 a 4.4.1 A Sintaxe de GRANT e REVOKE . . . . . . . . . . . . . . . . . . 255
  • 9. vii 4.4.2 Nomes de Usu´rios e Senhas do MySQL . . . . . . . . 260 a 4.4.3 Quando as Altera¸˜es nos Privil´gios tem Efeito co e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 4.4.4 Configurando os Privil´gios Iniciais do MySQL . . 261 e 4.4.5 Adicionando Novos Usu´rios ao MySQL . . . . . . . . 262 a 4.4.6 Deletando Usu´rios do MySQL . . . . . . . . . . . . . . . . 265 a 4.4.7 Limitando os Recursos dos Usu´rios. . . . . . . . . . . . 266 a 4.4.8 Configurando Senhas . . . . . . . . . . . . . . . . . . . . . . . . . 267 4.4.9 Mantendo Sua Senha Segura . . . . . . . . . . . . . . . . . . 268 4.4.10 Usando Conex˜es Seguras . . . . . . . . . . . . . . . . . . . . 269 o 4.4.10.1 Conceitos Basicos . . . . . . . . . . . . . . . . . . . 269 4.4.10.2 Exigˆncias . . . . . . . . . . . . . . . . . . . . . . . . . . 269 e 4.4.10.3 Configurando Certificados SSL para o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 4.4.10.4 Op¸˜es SSL do GRANT . . . . . . . . . . . . . . . 274 co 4.4.10.5 Op¸˜es SSL de Linha de Comando . . . 275 co 4.5 Preven¸˜o de Disastres e Recupera¸˜o . . . . . . . . . . . . . . . . . . 276 ca ca 4.5.1 Backups dos Bancos de Dados . . . . . . . . . . . . . . . . . 276 4.5.2 Sintaxe de BACKUP TABLE . . . . . . . . . . . . . . . . . . . . . . 278 4.5.3 Sintaxe de RESTORE TABLE . . . . . . . . . . . . . . . . . . . . . 278 4.5.4 Sintaxe de CHECK TABLE . . . . . . . . . . . . . . . . . . . . . . . 279 4.5.5 Sintaxe do REPAIR TABLE . . . . . . . . . . . . . . . . . . . . . . 280 4.5.6 Utilizando myisamchk para Manuten¸˜o de Tabelas e ca Recupera¸˜o em Caso de Falhas. . . . . . . . . . . . . . . . . . 281 ca 4.5.6.1 Sintaxe do myisamchk . . . . . . . . . . . . . . . . 282 4.5.6.2 Op¸˜es Gerais do myisamchk . . . . . . . . . . 283 co 4.5.6.3 Op¸˜es de Verifica¸˜o do myisamchk . . . 284 co ca 4.5.6.4 Op¸˜es de Reparos do myisamchk . . . . . 285 co 4.5.6.5 Outras Op¸˜es do myisamchk . . . . . . . . . 287 co 4.5.6.6 Uso de Mem´ria do myisamchk . . . . . . . . 287 o 4.5.6.7 Uso do myisamchk para Recupera¸˜o em ca Caso de Falhas . . . . . . . . . . . . . . . . . . . . . . . . . . 288 4.5.6.8 Como Verificar Erros em Tabelas . . . . . . 289 4.5.6.9 Como Reparar Tabelas . . . . . . . . . . . . . . . 290 4.5.6.10 Otimiza¸˜o de Tabelas . . . . . . . . . . . . . . 292 ca 4.5.7 Configurando um Regime de Manuten¸˜o das ca Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 4.5.8 Obtendo Informa¸˜es sobre as Tabelas . . . . . . . . . 293 co 4.6 Adiministra¸˜o do Banco de Dados e Referˆncia de Linguagem ca e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 4.6.1 Sintaxe de OPTIMIZE TABLE. . . . . . . . . . . . . . . . . . . . 299 4.6.2 Sintaxe de ANALYZE TABLE . . . . . . . . . . . . . . . . . . . . . 299 4.6.3 Sintaxe de CHECKSUM TABLE. . . . . . . . . . . . . . . . . . . . 300 4.6.4 Sintaxe de FLUSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 4.6.5 Sintaxe de RESET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 4.6.6 Sintaxe de PURGE MASTER LOGS . . . . . . . . . . . . . . . . . 302 4.6.7 Sintaxe de KILL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 4.6.8 Sintaxe de SHOW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
  • 10. viii 4.6.8.1 Recuperando Informa¸˜es sobre Bancos de co Dados, Tabelas, Colunas e ´ Indices . . . . . . . . . 304 4.6.8.2 SHOW TABLE STATUS . . . . . . . . . . . . . . . . . . 305 4.6.8.3 SHOW STATUS . . . . . . . . . . . . . . . . . . . . . . . . . 306 4.6.8.4 SHOW VARIABLES . . . . . . . . . . . . . . . . . . . . . 309 4.6.8.5 SHOW [BDB] LOGS . . . . . . . . . . . . . . . . . . . . . 321 4.6.8.6 SHOW PROCESSLIST . . . . . . . . . . . . . . . . . . . 321 4.6.8.7 SHOW GRANTS . . . . . . . . . . . . . . . . . . . . . . . . . 323 4.6.8.8 SHOW CREATE TABLE . . . . . . . . . . . . . . . . . . 323 4.6.8.9 SHOW WARNINGS | ERRORS . . . . . . . . . . . . . 323 4.6.8.10 SHOW TABLE TYPES . . . . . . . . . . . . . . . . . . 325 4.6.8.11 SHOW PRIVILEGES . . . . . . . . . . . . . . . . . . . 326 4.7 Localiza¸˜o do MySQL e Utiliza¸˜o Internacional . . . . . . . . 326 ca ca 4.7.1 O Conjunto de Caracteres Utilizado para Dados e Ordena¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 ca 4.7.1.1 German character set . . . . . . . . . . . . . . . . 327 4.7.2 Mensagens de Erros em Outras L´ inguas . . . . . . . . 328 4.7.3 Adicionando um Novo Conjunto de Caracteres . . 328 4.7.4 Os Vetores de Defini¸˜es de Caracteres . . . . . . . . . 330 co 4.7.5 Suporte ` Ordena¸˜o de Strings . . . . . . . . . . . . . . . 330 a ca 4.7.6 Suporte ` Caracteres Multi-byte . . . . . . . . . . . . . . . 331 a 4.7.7 Problemas com Conjuntos de Caracteres . . . . . . . 331 4.8 Utilit´rios e Scripts do Lado do Servidor MySQL . . . . . . . . 331 a 4.8.1 Vis˜o Geral dos Scripts e Utilit´rios do Lado a a Servidor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 4.8.2 mysqld-safe, o wrapper do mysqld . . . . . . . . . . . . 332 4.8.3 mysqld_multi, programa para gerenciar m´ltiplos u servidores MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 4.8.4 myisampack, O Gerador de Tabelas Compactadas de Somente Leitura do MySQL . . . . . . . . . . . . . . . . . . . . . 337 4.8.5 mysqld-max, om servidor mysqld extendido . . . . . 344 4.9 Utilit´rios e Scripts do Lado do Cliente MySQL . . . . . . . . . 346 a 4.9.1 Vis˜o Geral dos Utilit´rios e Scripts do Lado do a a Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 4.9.2 mysql, A Ferramenta de Linha de Comando . . . . 347 4.9.3 mysqlcc, The MySQL Control Center . . . . . . . . . . 355 4.9.4 mysqladmin, Administrando um Servidor MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 4.9.5 mysqlbinlog, Executando as Consultas a Partir de um Log Bin´rio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 a 4.9.6 Usando mysqlcheck para Manuten¸˜o de Tabelas e ca Recupera¸˜o em Caso de Falhas. . . . . . . . . . . . . . . . . . 360 ca 4.9.7 mysqldump, Descarregando a Estrutura de Tabelas e Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 4.9.8 mysqlhotcopy, Copiando Bancos de Dados e Tabelas do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 4.9.9 mysqlimport, Importando Dados de Arquivos Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
  • 11. ix 4.9.10 mysqlshow, Exibindo Bancos de Dados, Tabelas e Colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 4.9.11 mysql_config, Op¸˜es para compila¸˜o do cliente co ca MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 4.9.12 perror, Explicando C´digos de Erros . . . . . . . . . 372 o 4.9.13 Como Executar Comandos SQL a Partir de um Arquivo Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 4.10 Os Arquivos de Log do MySQL . . . . . . . . . . . . . . . . . . . . . . . 372 4.10.1 O Log de Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 4.10.2 O Log de Consultas. . . . . . . . . . . . . . . . . . . . . . . . . . 373 4.10.3 O Log de Atualiza¸˜es . . . . . . . . . . . . . . . . . . . . . . . 374 co 4.10.4 O Log Bin´rio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 a 4.10.5 O Log para Consultas Lentas . . . . . . . . . . . . . . . . . 378 4.10.6 Manuten¸˜o do Log de Arquivo . . . . . . . . . . . . . . . 378 ca 4.11 Replica¸˜o no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 ca 4.11.1 Introdu¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 ca 4.11.2 Vis˜o Geral da Implementa¸˜o da Replica¸˜o . . 380 a ca ca 4.11.3 Detalhes de Implementa¸˜o da Replica¸˜o . . . . . 381 ca ca 4.11.4 Como Configurar a Replica¸˜o . . . . . . . . . . . . . . . . 386 ca 4.11.5 Recursos de Replica¸˜o e Problemas Conhecidos ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 4.11.6 Op¸˜es de Inicializa¸˜o da Replica¸˜o . . . . . . . . . 392 co ca ca 4.11.7 Instru¸˜es SQL para Controle do Servidor Master co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 4.11.7.1 PURGE MASTER LOGS . . . . . . . . . . . . . . . . . 401 4.11.7.2 RESET MASTER . . . . . . . . . . . . . . . . . . . . . . 401 4.11.7.3 SET SQL_LOG_BIN . . . . . . . . . . . . . . . . . . . 401 4.11.7.4 SHOW BINLOG EVENTS . . . . . . . . . . . . . . . . 401 4.11.7.5 SHOW MASTER STATUS . . . . . . . . . . . . . . . . 402 4.11.7.6 SHOW MASTER LOGS . . . . . . . . . . . . . . . . . . 402 4.11.7.7 SHOW SLAVE HOSTS . . . . . . . . . . . . . . . . . . 402 4.11.8 Instru¸˜es SQL para Controle do Servidor Slave co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 4.11.8.1 CHANGE MASTER TO . . . . . . . . . . . . . . . . . . 402 4.11.8.2 LOAD DATA FROM MASTER . . . . . . . . . . . . . 405 4.11.8.3 LOAD TABLE tbl_name FROM MASTER. . . 405 4.11.8.4 MASTER_POS_WAIT() . . . . . . . . . . . . . . . . 405 4.11.8.5 RESET SLAVE. . . . . . . . . . . . . . . . . . . . . . . . 406 4.11.8.6 SET GLOBAL SQL_SLAVE_SKIP_COUNTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406 4.11.8.7 SHOW SLAVE STATUS . . . . . . . . . . . . . . . . . 406 4.11.8.8 START SLAVE. . . . . . . . . . . . . . . . . . . . . . . . 409 4.11.8.9 STOP SLAVE . . . . . . . . . . . . . . . . . . . . . . . . . 410 4.11.9 FAQ da Replica¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . 411 ca 4.11.10 Problemas com Replica¸˜o . . . . . . . . . . . . . . . . . . 416 ca 4.11.11 Relatando Problemas de Replica¸˜o . . . . . . . . . . 417 ca
  • 12. x 5 Otimiza¸˜o do MySQL . . . . . . . . . . . . . . . . . . . 419 ca 5.1 Vis˜o Geral da Otimiza¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 a ca 5.1.1 Limita¸˜es do Projeto MySQL/Trocas . . . . . . . . . 419 co 5.1.2 Portabilidade. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 5.1.3 Para que Utilizamos o MySQL?. . . . . . . . . . . . . . . . 421 5.1.4 O Pacote de Benchmark do MySQL . . . . . . . . . . . . 422 5.1.5 Utilizando seus Pr´prios Benchmarks . . . . . . . . . . 423 o 5.2 Otimizando SELECTs e Outras Consultas . . . . . . . . . . . . . . . . 424 5.2.1 Sintaxe de EXPLAIN (Obter informa¸˜es sobre uma co SELECT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425 5.2.2 Estimando o Desempenho de uma Consulta. . . . . 432 5.2.3 Velocidade das Consultas que Utilizam SELECT . . 432 5.2.4 Como o MySQL Otimiza Cl´usulas WHERE . . . . . . 433 a 5.2.5 Como o MySQL Otimiza IS NULL . . . . . . . . . . . . . . 434 5.2.6 Como o MySQL Otimiza Cl´usulas DISTINCT . . . 435 a 5.2.7 Como o MySQL Otimiza LEFT JOIN e RIGHT JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 5.2.8 Como o MySQL Otimiza Cl´usulas ORDER BY . . . 437 a 5.2.9 Como o MySQL Otimiza Cl´usulas LIMIT . . . . . . 438 a 5.2.10 Performance das Consultas que Utilizam INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439 5.2.11 Performance das Consultas que Utilizam UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 5.2.12 Performance das Consultas que Utilizam DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 5.2.13 Mais Dicas sobre Otimiza¸˜es . . . . . . . . . . . . . . . . 441 co 5.3 Detalhes sobre Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 5.3.1 Como o MySQL Trava as Tabelas . . . . . . . . . . . . . . 444 5.3.2 Detalhes sobre Lock de Tabelas . . . . . . . . . . . . . . . . 445 5.4 Otimizando a Estrutura de Banco de Dados . . . . . . . . . . . . . 447 5.4.1 Op¸˜es do Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 co 5.4.2 Deixando os Dados com o Menor Tamanho Poss´ ivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 5.4.3 Como o MySQL Utiliza ´ Indices . . . . . . . . . . . . . . . . 448 ´ 5.4.4 Indices de Colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450 5.4.5 ´ Indices de M´ltiplas Colunas . . . . . . . . . . . . . . . . . . 451 u 5.4.6 Como o MySQL Conta as Tabelas Abertas . . . . . 452 5.4.7 Como o MySQL Abre e Fecha as Tabelas . . . . . . . 452 5.4.8 Desvantagem em Criar um N´mero Grande de u Tabelas no Mesmo Banco de Dados . . . . . . . . . . . . . . 453 5.5 Otimizando o Servidor MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 454 5.5.1 Sintonia dos Parˆmetros em Tempo de a Sistema/Compila¸˜o e na Inicializa¸˜o. . . . . . . . . . . . 454 ca ca 5.5.2 Parˆmetros de Sintonia do Servidor . . . . . . . . . . . . 454 a 5.5.3 Como a Compila¸˜o e a Liga¸˜o Afetam a ca ca Velocidade do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . 457 5.5.4 Como o MySQL Utiliza a Mem´ria . . . . . . . . . . . . 458 o 5.5.5 Como o MySQL Utiliza o DNS . . . . . . . . . . . . . . . . 460
  • 13. xi 5.5.6 Sintaxe de SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460 5.6 Detalhes de Disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 5.6.1 Utilizando Links Simb´licos . . . . . . . . . . . . . . . . . . . 466 o 5.6.1.1 Utilizando Links Simb´licos para Bancos de o Dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 5.6.1.2 Utilizando Links Simb´licos para Tabelas o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467 6 Referˆncia de Linguagem do MySQL . . . . . . 469 e 6.1 Estrutura da Linguagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 6.1.1 Literais: Como Gravar Strings e Numerais . . . . . . 469 6.1.1.1 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 6.1.1.2 N´meros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 u 6.1.1.3 Valores Hexadecimais . . . . . . . . . . . . . . . . 471 6.1.1.4 Valores NULL. . . . . . . . . . . . . . . . . . . . . . . . . 471 6.1.2 Nomes de Banco de dados, Tabela, ´ Indice, Coluna e Alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 6.1.3 Caso Sensitivo nos Nomes . . . . . . . . . . . . . . . . . . . . . 473 6.1.4 Vari´veis de Usu´rio . . . . . . . . . . . . . . . . . . . . . . . . . . 474 a a 6.1.5 Vari´veis de Sistema . . . . . . . . . . . . . . . . . . . . . . . . . . 475 a 6.1.6 Sintaxe de Coment´rios . . . . . . . . . . . . . . . . . . . . . . . 478 a 6.1.7 Tratamento de Palavras Reservadas no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 6.2 Tipos de Campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481 6.2.1 Tipos Num´ricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 e 6.2.2 Tipos de Data e Hora . . . . . . . . . . . . . . . . . . . . . . . . . 489 6.2.2.1 Assuntos referentes ao ano 2000 (Y2K) e Tipos de Data . . . . . . . . . . . . . . . . . . . . . . . . . . . 490 6.2.2.2 Os Tipos DATETIME, DATE e TIMESTAMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491 6.2.2.3 O Tipo TIME. . . . . . . . . . . . . . . . . . . . . . . . . 495 6.2.2.4 O Tipo YEAR. . . . . . . . . . . . . . . . . . . . . . . . . 496 6.2.3 Tipos String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 6.2.3.1 Os Tipos CHAR e VARCHAR . . . . . . . . . . . . . 497 6.2.3.2 Os Tipos BLOB e TEXT . . . . . . . . . . . . . . . . 497 6.2.3.3 O Tipo ENUM. . . . . . . . . . . . . . . . . . . . . . . . . 499 6.2.3.4 O Tipo SET . . . . . . . . . . . . . . . . . . . . . . . . . . 500 6.2.4 Escolhendo o Tipo Correto para uma Coluna . . . 501 6.2.5 Usando Tipos de Colunas de Outros Mecanismos de Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 6.2.6 Exigˆncias de Armazenamento dos Tipos de Coluna e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 6.3 Fun¸˜es para Uso em Cl´usulas SELECT e WHERE . . . . . . . . . 503 co a 6.3.1 Operadores e Fun¸˜es de Tipos n˜o Especificados co a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 6.3.1.1 Parenteses . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 6.3.1.2 Operadores de Compara¸˜o . . . . . . . . . . . 504 ca 6.3.1.3 Operadores Logicos . . . . . . . . . . . . . . . . . . 508
  • 14. xii 6.3.1.4 Fun¸˜es de Fluxo de Controle . . . . . . . . . 510 co 6.3.2 Fun¸˜es String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511 co 6.3.2.1 Fun¸˜es de Compara¸˜o de Strings . . . . 519 co ca 6.3.2.2 Caso Sensitivo . . . . . . . . . . . . . . . . . . . . . . . 522 6.3.3 Fun¸˜es Num´ricas . . . . . . . . . . . . . . . . . . . . . . . . . . . 522 co e 6.3.3.1 Opera¸˜es Aritim´ticas . . . . . . . . . . . . . . . 522 co e 6.3.3.2 Fun¸˜es Matematicas. . . . . . . . . . . . . . . . . 523 co 6.3.4 Fun¸˜es de Data e Hora . . . . . . . . . . . . . . . . . . . . . . . 529 co 6.3.5 Fun¸˜es de Convers˜o . . . . . . . . . . . . . . . . . . . . . . . . . 543 co a 6.3.6 Outras Fun¸˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545 co 6.3.6.1 Fun¸˜es Bin´rias . . . . . . . . . . . . . . . . . . . . . 545 co a 6.3.6.2 Fun¸˜es Diversas . . . . . . . . . . . . . . . . . . . . . 546 co 6.3.7 Fun¸˜es e Modificadores para Usar com Cl´usulas co a GROUP BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 6.3.7.1 Fun¸˜es GROUP BY . . . . . . . . . . . . . . . . . . . . 555 co 6.3.7.2 Modificadores GROUP BY . . . . . . . . . . . . . . 558 6.3.7.3 GROUP BY com Campos Escondidos . . . . 561 6.4 Manipula¸˜o de Dados: SELECT, INSERT, UPDATE e DELETE ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561 6.4.1 Sintaxe SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 6.4.1.1 Sintaxe JOIN . . . . . . . . . . . . . . . . . . . . . . . . 567 6.4.1.2 Sintaxe UNION . . . . . . . . . . . . . . . . . . . . . . . 569 6.4.2 Sintaxe de Subquery . . . . . . . . . . . . . . . . . . . . . . . . . . 569 6.4.2.1 A Subquery como um Operandop Escalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570 6.4.2.2 Compara¸˜es Usando Subquery . . . . . . . 571 co 6.4.2.3 Subqueries with ANY, IN, and SOME . . . . 571 6.4.2.4 Subqueries with ALL. . . . . . . . . . . . . . . . . . 572 6.4.2.5 Correlated Subqueries . . . . . . . . . . . . . . . . 572 6.4.2.6 EXISTS and NOT EXISTS . . . . . . . . . . . . . . 573 6.4.2.7 Row Subqueries . . . . . . . . . . . . . . . . . . . . . . 573 6.4.2.8 Subqueries in the FROM clause . . . . . . . . . 574 6.4.2.9 Subquery Errors . . . . . . . . . . . . . . . . . . . . . 575 6.4.2.10 Optimizing Subqueries . . . . . . . . . . . . . . 576 6.4.2.11 Rewriting Subqueries for Earlier MySQL Versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577 6.4.3 Sintaxe INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578 6.4.3.1 Sintaxe INSERT ... SELECT . . . . . . . . . . . 581 6.4.3.2 Sintaxe INSERT DELAYED . . . . . . . . . . . . . . 581 6.4.4 Sintaxe UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583 6.4.5 Sintaxe DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584 6.4.6 Sintaxe TRUNCATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586 6.4.7 Sintaxe REPLACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586 6.4.8 Sintaxe LOAD DATA INFILE. . . . . . . . . . . . . . . . . . . . . 587 6.4.9 Sintaxe HANDLER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595 6.4.10 Sintaxe DO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596 6.5 Defini¸˜o de Dados: CREATE, DROP e ALTER . . . . . . . . . . . . . . 596 ca 6.5.1 Sintaxe CREATE DATABASE . . . . . . . . . . . . . . . . . . . . . 596
  • 15. xiii 6.5.2 Sintaxe DROP DATABASE . . . . . . . . . . . . . . . . . . . . . . . 596 6.5.3 Sintaxe CREATE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . 597 6.5.3.1 Altera¸˜o de Especifica¸˜es de Colunas ca co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606 6.5.4 Sintaxe ALTER TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . 607 6.5.5 Sintaxe RENAME TABLE . . . . . . . . . . . . . . . . . . . . . . . . . 611 6.5.6 Sintaxe DROP TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . 611 6.5.7 Sintaxe CREATE INDEX . . . . . . . . . . . . . . . . . . . . . . . . . 612 6.5.8 Sintaxe DROP INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 6.6 Comandos Utilit´rios B´sicos do Usu´rio MySQL . . . . . . . . 613 a a a 6.6.1 Sintaxe USE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 6.6.2 Sintaxe DESCRIBE (Obtem Informa¸˜es Sobre co Colunas) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 6.7 Comandos Transacionais e de Lock do MySQL . . . . . . . . . . 614 6.7.1 Sintaxe de START TRANSACTION, COMMIT e ROLLBACK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614 6.7.2 Instru¸˜es que N˜o Podem Ser Desfeitas . . . . . . . . 615 co a 6.7.3 Instru¸˜es que Fazem um Commit Implicito . . . . 615 co 6.7.4 Sintaxe de SAVEPOINT e ROLLBACK TO SAVEPOINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615 6.7.5 Sintaxe LOCK TABLES e UNLOCK TABLES . . . . . . . . . 616 6.7.6 Sintaxe SET TRANSACTION . . . . . . . . . . . . . . . . . . . . . 618 6.8 Pesquisa Full-text no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . 618 6.8.1 Restri¸˜es Full-text . . . . . . . . . . . . . . . . . . . . . . . . . . . 622 co 6.8.2 Ajuste Fino de Pesquisas Full-text no MySQL . . 623 6.8.3 TODO de Pesquisas Full-text . . . . . . . . . . . . . . . . . . 624 6.9 Cache de Consultas do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 624 6.9.1 Como a Cache de Consultas Opera. . . . . . . . . . . . . 625 6.9.2 Configura¸˜o da Cache de Consultas . . . . . . . . . . . 626 ca 6.9.3 Op¸˜es da Cache de Consultas na SELECT . . . . . . 627 co 6.9.4 Estado e Manuten¸˜o da Cache de Consultas . . . 627 ca 7 Tipos de Tabela do MySQL . . . . . . . . . . . . . . 629 7.1 Tabelas MyISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629 7.1.1 Espa¸o Necess´rio para Chaves . . . . . . . . . . . . . . . . 632 c a 7.1.2 Formatos de Tabelas MyISAM . . . . . . . . . . . . . . . . . . 633 7.1.2.1 Caracter´ isticas de Tabelas Est´ticas a (Tamanho Fixo) . . . . . . . . . . . . . . . . . . . . . . . . . 633 7.1.2.2 Caracter´ isticas de Tabelas Dinˆmicas . . 633 a ´ 7.1.2.3 Caracteristicas de Tabelas Compactadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634 7.1.3 Problemas com Tabelas MyISAM . . . . . . . . . . . . . . . . 635 7.1.3.1 Tabelas MyISAM Corrompidas . . . . . . . . . 635 7.1.3.2 O Cliente est´ usando a tabela ou n˜o a a a fechou de forma apropriada . . . . . . . . . . . . . . . 636 7.2 Tabelas MERGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636 7.2.1 Problemas com Tabelas MERGE . . . . . . . . . . . . . . . . . 639 7.3 Tabelas ISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
  • 16. xiv 7.4 Tabelas HEAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640 7.5 Tabelas InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642 7.5.1 Vis˜o Geral de Tabelas InnoDB. . . . . . . . . . . . . . . . 642 a 7.5.2 InnoDB no MySQL Vers˜o 3.23 . . . . . . . . . . . . . . . . 642 a 7.5.3 Op¸˜es de Inicializa¸˜o do InnoDB . . . . . . . . . . . . . 643 co ca 7.5.4 Criando Tablespaces no InnoDB . . . . . . . . . . . . . . . 650 7.5.4.1 Se Alguma Coisa Der Errado Na Cria¸˜o ca Do Banco de Dados . . . . . . . . . . . . . . . . . . . . . . 651 7.5.5 Criando Tabelas InnoDB . . . . . . . . . . . . . . . . . . . . . . 651 7.5.5.1 Convertendo Tabelas MyISAM para InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652 7.5.5.2 Restri¸˜es FOREIGN KEY . . . . . . . . . . . . . . . 652 co 7.5.6 Adicionando e Removendo Arquivos de Dados e Log do InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655 7.5.7 Fazendo Backup e Recuperando um Banco de Dados InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655 7.5.7.1 For¸ando a recupera¸˜o . . . . . . . . . . . . . . 657 c ca 7.5.7.2 Ponto de Verifica¸˜o . . . . . . . . . . . . . . . . . 658 ca 7.5.8 Movendo um Banco de Dados InnoDB para Outra M´quina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658 a 7.5.9 Modelo Transacional do InnoDB . . . . . . . . . . . . . . . 659 7.5.9.1 InnoDB e SET ... TRANSACTION ISOLATION LEVEL ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659 7.5.9.2 Leitura Consistente sem Lock . . . . . . . . . 661 7.5.9.3 Lock de Leitura SELECT ... FOR UPDATE e SELECT ... LOCK IN SHARE MODE . . . . . . . . . . 661 7.5.9.4 Lock da Chave Seguinte: Evitando Problemas com Fantasmas . . . . . . . . . . . . . . . . 662 7.5.9.5 Locks Definidos por Diferentes Instru¸˜es co SQL no InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . 662 7.5.9.6 Detec¸˜o de Deadlock e Rollback . . . . . . 663 ca 7.5.9.7 Um Exemplo de Como a Leitura Consistente Funciona no InnoDB . . . . . . . . . . 664 7.5.9.8 Como lidar com deadlocks? . . . . . . . . . . . 665 7.5.10 Dicas de Ajuste de Desempenho . . . . . . . . . . . . . . 666 7.5.10.1 SHOW INNODB STATUS e o Monitor InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667 7.5.11 Implementa¸˜o de Multi-versioning . . . . . . . . . . . 669 ca 7.5.12 Estrutura de Tabelas e ´ Indices . . . . . . . . . . . . . . . . 670 7.5.12.1 Estrutura F´ isica do ´ Indice . . . . . . . . . . . 671 7.5.12.2 Buffer de Inser¸˜o. . . . . . . . . . . . . . . . . . . 671 ca 7.5.12.3 ´ Indices Hash Adaptativos . . . . . . . . . . . . 672 7.5.12.4 Estrutura dos Registros F´ isicos . . . . . . 672 7.5.12.5 Como Funciona uma Coluna AUTO_INCREMENT no InnoDB . . . . . . . . . . . . . . 672 7.5.13 Gerenciamento do Espa¸o de Arquivos e E/S de c Disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673 7.5.13.1 E/S de Disco . . . . . . . . . . . . . . . . . . . . . . . 673
  • 17. xv 7.5.13.2 Gerenciamento do Espa¸o de Arquivo c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674 7.5.13.3 Desfragmentando uma Tabela . . . . . . . . 675 7.5.14 Tratando Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675 7.5.15 Restri¸˜es em Tabelas InnoDB . . . . . . . . . . . . . . . 675 co 7.5.16 Hist´rico de Altera¸˜es do InnoDB . . . . . . . . . . . . 677 o co 7.5.16.1 MySQL/InnoDB-4.1.1, December 4, 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677 7.5.16.2 MySQL/InnoDB-4.0.16, October 22, 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677 7.5.16.3 MySQL/InnoDB-3.23.58, September 15, 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677 7.5.16.4 MySQL/InnoDB-4.0.15, September 10, 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677 7.5.16.5 MySQL/InnoDB-4.0.14, Junho de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678 7.5.16.6 MySQL/InnoDB-3.23.57, June 20, 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679 7.5.16.7 MySQL/InnoDB-4.0.13, 20 de Maio de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679 7.5.16.8 MySQL/InnoDB-4.1.0, 03 de Abril de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680 7.5.16.9 MySQL/InnoDB-3.23.56, 17 de Mar¸o de c 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680 7.5.16.10 MySQL/InnoDB-4.0.12, 18 Mar¸o de c 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681 7.5.16.11 MySQL/InnoDB-4.0.11, 25 de Fevereiro de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681 7.5.16.12 MySQL/InnoDB-4.0.10, 04 de Fevereiro de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681 7.5.16.13 MySQL/InnoDB-3.23.55, 24 de Janeiro de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682 7.5.16.14 MySQL/InnoDB-4.0.9, 14 de Janeiro de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682 7.5.16.15 MySQL/InnoDB-4.0.8, 07 de Janeiro de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683 7.5.16.16 MySQL/InnoDB-4.0.7, 26 de Dezembro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683 7.5.16.17 MySQL/InnoDB-4.0.6, 19 de Dezembro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683 7.5.16.18 MySQL/InnoDB-3.23.54, 12 de Dezembro de 2002 . . . . . . . . . . . . . . . . . . . . . . . 684 7.5.16.19 MySQL/InnoDB-4.0.5, 18 de Novembro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684 7.5.16.20 MySQL/InnoDB-3.23.53, 09 de Outubro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685 7.5.16.21 MySQL/InnoDB-4.0.4, 02 de Outubro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
  • 18. xvi 7.5.16.22 MySQL/InnoDB-4.0.3, 28 de Agosto de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687 7.5.16.23 MySQL/InnoDB-3.23.52, 16 de Agosto de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687 7.5.16.24 MySQL/InnoDB-4.0.2, 10 de Julho de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689 7.5.16.25 MySQL/InnoDB-3.23.51, 12 de Junho de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689 7.5.16.26 MySQL/InnoDB-3.23.50, 23 de Abril de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689 7.5.16.27 MySQL/InnoDB-3.23.49, 17 de Fevereiro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690 7.5.16.28 MySQL/InnoDB-3.23.48, 09 de Fevereiro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690 7.5.16.29 MySQL/InnoDB-3.23.47, 28 de Dezembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . 691 7.5.16.30 MySQL/InnoDB-4.0.1, 23 de Dezembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692 7.5.16.31 MySQL/InnoDB-3.23.46, 30 de Novembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . 692 7.5.16.32 MySQL/InnoDB-3.23.45, 23 de Novembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . 692 7.5.16.33 MySQL/InnoDB-3.23.44, 02 de Novembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . 693 7.5.16.34 MySQL/InnoDB-3.23.43, 04 de Outubro de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693 7.5.16.35 MySQL/InnoDB-3.23.42, 09 de Setembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694 7.5.16.36 MySQL/InnoDB-3.23.41, 13 de Agosto de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694 7.5.16.37 MySQL/InnoDB-3.23.40, 16 de Julho de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694 7.5.16.38 MySQL/InnoDB-3.23.39, 13 de Junho de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694 7.5.16.39 MySQL/InnoDB-3.23.38, 12 de Maio de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694 7.5.17 Informa¸˜es de Contato do InnoDB . . . . . . . . . . . . 694 co 7.6 Tabelas BDB ou BerkeleyDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695 7.6.1 Vis˜o Geral de Tabelas BDB. . . . . . . . . . . . . . . . . . . . 695 a 7.6.2 Instalando BDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695 7.6.3 Op¸˜es de Inicializa¸˜o do BDB . . . . . . . . . . . . . . . . . 696 co ca 7.6.4 Caracter´ isticas de Tabelas BDB: . . . . . . . . . . . . . . . . 697 7.6.5 Itens a serem corrigidos no BDB num futuro pr´ximo: o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698 7.6.6 Sistemas operacionais suportados pelo BDB . . . . . . 698 7.6.7 Restri¸˜es em Tabelas BDB . . . . . . . . . . . . . . . . . . . . 699 co 7.6.8 Erros Que Podem Ocorrer Usando Tabelas BDB . . 699
  • 19. xvii 8 Introdu¸˜o ao MaxDB . . . . . . . . . . . . . . . . . . . 701 ca 8.1 Historia do MaxDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701 8.2 Licenciamento e Suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701 8.3 Conceitos B´sicos do MaxDB . . . . . . . . . . . . . . . . . . . . . . . . . . a 701 8.4 Diferen¸as de Recursos entre o MaxDB e o MySQL . . . . . . c 701 8.5 Interoperability Features between MaxDB and MySQL . . . 702 8.6 MaxDB-related Links. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702 8.7 Reserved Words in MaxDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703 8.8 Fun¸˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co 705 8.9 Tipos de Colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705 9 Conjunto de Caracteres Nacionais e Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707 9.1 Conjuntos de Caracteres e Collations em Geral . . . . . . . . . . 707 9.2 Conjunto de Caracteres e Collations no MySQL . . . . . . . . . 708 9.3 Determinando o Conjunto de Caracteres e Collation Padr˜es o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708 9.3.1 Conjunto de Caracteres e Collations do Servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708 9.3.2 Conjunto de Caracteres e Collation de Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709 9.3.3 O Conjunto de Caracteres e Collations de Tabela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710 9.3.4 Conjunto de Caracteres e Collation de Colunas . . 710 9.3.5 Exemplos de Atribui¸˜es de Conjuntos de Caracteres co e Collation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711 9.3.6 Conjunto de Caracteres e Collation de Conex˜o a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712 9.3.7 Conjunto de Caracteres e Collation de Caracter de String Literal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713 9.3.8 Cl´usula COLLATE em V´rias Partes de uma Consulta a a SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714 9.3.9 Precedˆncia da Cl´usula COLLATE . . . . . . . . . . . . . . 714 e a 9.3.10 Operador BINARY . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715 9.3.11 Alguns Casos Especiais Onde a Determina¸˜o da ca Collation e Trabalhosa . . . . . . . . . . . . . . . . . . . . . . . . . . 715 9.3.12 Collations Devem Ser para o Conjunto de Caracteres Certo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716 9.3.13 Um exemplo do Efeito da Collation . . . . . . . . . . . 716 9.4 Opera¸˜es Afetadas pelo Suporte a Conjunto de Caracteres co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716 9.4.1 Strings de Resultados . . . . . . . . . . . . . . . . . . . . . . . . . 717 9.4.2 CONVERT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717 9.4.3 CAST() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717 9.4.4 SHOW CHARACTER SET . . . . . . . . . . . . . . . . . . . . . . . . . . 718 9.4.5 SHOW COLLATION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718 9.4.6 SHOW CREATE DATABASE . . . . . . . . . . . . . . . . . . . . . . . . 719 9.4.7 SHOW FULL COLUMNS . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
  • 20. xviii 9.5 Suporte Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719 9.6 UTF8 para Metdados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720 9.7 Compatibilidade com Outros SGBDs . . . . . . . . . . . . . . . . . . . 721 9.8 Novo Formato do Arquivo de Configura¸˜o do Conjunto de ca Caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721 9.9 Conjunto de Caracteres Nacional . . . . . . . . . . . . . . . . . . . . . . . 721 9.10 Atualizando para o MySQL 4.0. . . . . . . . . . . . . . . . . . . . . . . . 722 9.10.1 Conjunto de Caracteres do MySQL e o Par/Conjunto de Caracter/Collation Correspondente do MySQL 4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723 9.11 Os conjuntos de Caracteres e Collations que o MySQL Suporta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723 9.11.1 O Conjunto de Caracteres Unicode. . . . . . . . . . . . 725 9.11.2 Conjunto de Caracteres para Plataformas Espec´ ificas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725 9.11.3 Conjunto de Caracteres do Sul da Europa e Oriente M´dio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725 e 9.11.4 Os Conjuntos de Caracteres Asi´ticos . . . . . . . . . 725 a 9.11.5 Os Conjuntos de Caracteres B´lticos . . . . . . . . . . 726a 9.11.6 Os Conjuntos de Caracteres Cir´ ilicos . . . . . . . . . . 726 9.11.7 O Conjunto de Caracteres da Europa Central . . 727 9.11.8 Os Conjuntos de Caracteres da Europa Ocidental . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728 10 Extens˜es Espacias em MySQL . . . . . . . . . . 730 o 10.1 Introdu¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca 730 10.2 O Modelo Geom´trico OpenGIS . . . . . . . . . . . . . . . . . . . . . . . a 730 10.2.1 A Hierarquia da Classe Geometry . . . . . . . . . . . . . 731 10.2.2 Classe Geometry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732 10.2.3 Classe Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733 10.2.4 Classe Curve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733 10.2.5 Classe LineString . . . . . . . . . . . . . . . . . . . . . . . . . . 734 10.2.6 Classe Surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734 10.2.7 Classe Polygon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734 10.2.8 Classe GeometryCollection . . . . . . . . . . . . . . . . . 735 10.2.9 Classe MultiPoint . . . . . . . . . . . . . . . . . . . . . . . . . . 735 10.2.10 Classe MultiCurve . . . . . . . . . . . . . . . . . . . . . . . . . 735 10.2.11 Classe MultiLineString (Multi Linhas) . . . . . 736 10.2.12 Classe MultiSurface (Multi Superf´ icies) . . . . . 736 10.2.13 Classe MultiPolygon (Multi Poligonos) . . . . . . ´ 736 10.3 Formatos de Dados Espaciais Suportados . . . . . . . . . . . . . . 737 10.3.1 Formato Well-Known Text (WKT). . . . . . . . . . . . 737 10.3.2 Formato Well-Known Binary (WKB). . . . . . . . . . 738 10.4 Criando um Banco de Dados MySQL Habilitado Espacialmente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738 10.4.1 Tipos de Dados Espaciais do MySQL . . . . . . . . . 739 10.4.2 Criando Valores Espaciais . . . . . . . . . . . . . . . . . . . . 739
  • 21. xix 10.4.2.1 Criando Valores Geometry Usando Fun¸˜es WKT . . . . . . . . . . . . . . . . . . . . . . . . . . . 739 co 10.4.2.2 Criando Valores Geometry Usando Fun¸˜es WKB . . . . . . . . . . . . . . . . . . . . . . . . . . . 740 co 10.4.2.3 Criando uma Valor de Geometira Usando Fun¸˜es Espec´ co ificas do MySQL . . . . . . . . . . . 741 10.4.3 Criando Colunas Espaciais . . . . . . . . . . . . . . . . . . . 742 10.4.4 Entrando com Dados em Colunas Espaciais . . . . 743 10.4.5 Buscando Dados Espaciais . . . . . . . . . . . . . . . . . . . 744 10.4.5.1 Buscando Dados Espaciais em um Formato Interno . . . . . . . . . . . . . . . . . . . . . . . . . 744 10.4.5.2 Buscando Dados Espaciais no Formato WKT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744 10.4.5.3 Buscando Dados Espaciais no Formato WKB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744 10.5 Analisando Informa¸˜o Espacial . . . . . . . . . . . . . . . . . . . . . . . 744 ca 10.5.1 Fun¸˜es Para Converter Geometrias Entre Formatos co Diferentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745 10.5.2 Fun¸˜es de An´lise das Propriedades de Geometry co a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745 10.5.2.1 Fun¸˜es de An´lise das Propriedades de co a Geometry em Geral . . . . . . . . . . . . . . . . . . . . . . 746 10.5.2.2 Fun¸˜es de An´lise das Propriedades de co a Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747 10.5.2.3 Fun¸˜es de An´lise das Propriedades de co a LineString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748 10.5.2.4 Fun¸˜es de An´lise das Propriedades de co a MultiLineString . . . . . . . . . . . . . . . . . . . . . . . . 749 10.5.2.5 Fun¸˜es de An´lise das Propriedades de co a Polygon. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750 10.5.2.6 Fun¸˜es de An´lise das Propriedades de co a MultiPolygon . . . . . . . . . . . . . . . . . . . . . . . . . . . 751 10.5.2.7 Fun¸˜es de An´lise das Propriedades de co a GeometryCollection . . . . . . . . . . . . . . . . . . . . 751 10.5.3 Fun¸˜es Que Criam Novas Geometrias de Outras co Existentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752 10.5.3.1 Fun¸˜es de Geometria Que Produzem co Novas Geometrias . . . . . . . . . . . . . . . . . . . . . . . . 752 10.5.3.2 Operadores Espaciais . . . . . . . . . . . . . . . . 752 10.5.4 Fun¸˜es Para Testar Rela¸˜es Espaciais Entre co co Objetos Geom´tricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753 e 10.5.5 Rela¸˜es de Retˆngulo de Limite M´ co a inimo (Minimal Bounding Rectangles - MBR) em Geometrias . . . . . 753 10.5.6 Fun¸˜es que Testam Relacionamentos Espaciais co Entre Geometrias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754 10.6 Otimizando An´lises Espaciais . . . . . . . . . . . . . . . . . . . . . . . . 755 a 10.6.1 Criando ´ Indices Espaciais . . . . . . . . . . . . . . . . . . . . 755 ´ 10.6.2 Usando Indice Espacial . . . . . . . . . . . . . . . . . . . . . . 756
  • 22. xx 10.7 Compatibilidade e Conformidade com o MySQL . . . . . . . . 758 10.7.1 Recursos GIS Que Ainda N˜o Est˜o Implementados a a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758 11 Stored Procedures e Fun¸˜es . . . . . . . . . . . . 760 co 11.1 Sintaxe de Stored Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . 760 11.1.1 Maintaining Stored Procedures . . . . . . . . . . . . . . . 761 11.1.1.1 CREATE PROCEDURE and CREATE FUNCTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761 11.1.1.2 ALTER PROCEDURE and ALTER FUNCTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763 11.1.1.3 DROP PROCEDURE and DROP FUNCTION . . 763 11.1.1.4 SHOW CREATE PROCEDURE and SHOW CREATE FUNCTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763 11.1.2 SHOW PROCEDURE STATUS and SHOW FUNCTION STATUS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764 11.1.3 CALL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764 11.1.4 BEGIN ... END Compound Statement . . . . . . . . . 764 11.1.5 DECLARE Statement . . . . . . . . . . . . . . . . . . . . . . . . . . 764 11.1.6 Variables in Stored Procedures . . . . . . . . . . . . . . . 764 11.1.6.1 DECLARE Local Variables . . . . . . . . . . . . . 765 11.1.6.2 Variable SET Statement. . . . . . . . . . . . . . 765 11.1.6.3 SELECT ... INTO Statement . . . . . . . . . 765 11.1.7 Conditions and Handlers . . . . . . . . . . . . . . . . . . . . . 765 11.1.7.1 DECLARE Conditions . . . . . . . . . . . . . . . . . 765 11.1.7.2 DECLARE Handlers . . . . . . . . . . . . . . . . . . . 765 11.1.8 Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 11.1.8.1 Declaring Cursors . . . . . . . . . . . . . . . . . . . 768 11.1.8.2 Cursor OPEN Statement . . . . . . . . . . . . . . 768 11.1.8.3 Cursor FETCH Statement . . . . . . . . . . . . . 768 11.1.8.4 Cursor CLOSE Statement . . . . . . . . . . . . . 768 11.1.9 Flow Control Constructs . . . . . . . . . . . . . . . . . . . . . 768 11.1.9.1 IF Statement . . . . . . . . . . . . . . . . . . . . . . . 768 11.1.9.2 CASE Statement . . . . . . . . . . . . . . . . . . . . . 768 11.1.9.3 LOOP Statement . . . . . . . . . . . . . . . . . . . . . 769 11.1.9.4 LEAVE Statement . . . . . . . . . . . . . . . . . . . . 769 11.1.9.5 ITERATE Statement . . . . . . . . . . . . . . . . . 769 11.1.9.6 REPEAT Statement. . . . . . . . . . . . . . . . . . . 770 11.1.9.7 WHILE Statement . . . . . . . . . . . . . . . . . . . . 770
  • 23. xxi 12 Ferramentas de Clientes e APIs do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772 12.1 API C do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772 12.1.1 Tipos de Dados da API C . . . . . . . . . . . . . . . . . . . . 772 12.1.2 Vis˜o Geral das Fun¸˜o da API C . . . . . . . . . . . . a ca 775 12.1.3 Descri¸˜o das Fun¸˜es da API C . . . . . . . . . . . . . . ca co 779 12.1.3.1 mysql_affected_rows() . . . . . . . . . . . . 780 12.1.3.2 mysql_change_user() . . . . . . . . . . . . . . 781 12.1.3.3 mysql_character_set_name(). . . . . . . 782 12.1.3.4 mysql_close() . . . . . . . . . . . . . . . . . . . . . 782 12.1.3.5 mysql_connect() . . . . . . . . . . . . . . . . . . . 783 12.1.3.6 mysql_create_db() . . . . . . . . . . . . . . . . 783 12.1.3.7 mysql_data_seek() . . . . . . . . . . . . . . . . 784 12.1.3.8 mysql_debug() . . . . . . . . . . . . . . . . . . . . . 785 12.1.3.9 mysql_drop_db() . . . . . . . . . . . . . . . . . . . 785 12.1.3.10 mysql_dump_debug_info() . . . . . . . . . 786 12.1.3.11 mysql_eof() . . . . . . . . . . . . . . . . . . . . . . 786 12.1.3.12 mysql_errno() . . . . . . . . . . . . . . . . . . . . 788 12.1.3.13 mysql_error() . . . . . . . . . . . . . . . . . . . . 788 12.1.3.14 mysql_escape_string() . . . . . . . . . . . 789 12.1.3.15 mysql_fetch_field() . . . . . . . . . . . . . 789 12.1.3.16 mysql_fetch_fields() . . . . . . . . . . . . 790 12.1.3.17 mysql_fetch_field_direct() . . . . . 791 12.1.3.18 mysql_fetch_lengths() . . . . . . . . . . . 792 12.1.3.19 mysql_fetch_row() . . . . . . . . . . . . . . . 792 12.1.3.20 mysql_field_count() . . . . . . . . . . . . . 794 12.1.3.21 mysql_field_seek() . . . . . . . . . . . . . . 795 12.1.3.22 mysql_field_tell() . . . . . . . . . . . . . . 795 12.1.3.23 mysql_free_result() . . . . . . . . . . . . . 796 12.1.3.24 mysql_get_client_info() . . . . . . . . . 796 12.1.3.25 mysql_get_host_info() . . . . . . . . . . . 796 12.1.3.26 mysql_get_proto_info() . . . . . . . . . . 797 12.1.3.27 mysql_get_server_info() . . . . . . . . . 797 12.1.3.28 mysql_get_server_version() . . . . . 798 12.1.3.29 mysql_info() . . . . . . . . . . . . . . . . . . . . . 798 12.1.3.30 mysql_init() . . . . . . . . . . . . . . . . . . . . . 799 12.1.3.31 mysql_insert_id() . . . . . . . . . . . . . . . 799 12.1.3.32 mysql_kill() . . . . . . . . . . . . . . . . . . . . . 800 12.1.3.33 mysql_list_dbs(). . . . . . . . . . . . . . . . . 801 12.1.3.34 mysql_list_fields() . . . . . . . . . . . . . 801 12.1.3.35 mysql_list_processes() . . . . . . . . . . 802 12.1.3.36 mysql_list_tables() . . . . . . . . . . . . . 802 12.1.3.37 mysql_num_fields() . . . . . . . . . . . . . . 803 12.1.3.38 mysql_num_rows(). . . . . . . . . . . . . . . . . 805 12.1.3.39 mysql_options() . . . . . . . . . . . . . . . . . . 805 12.1.3.40 mysql_ping() . . . . . . . . . . . . . . . . . . . . . 807 12.1.3.41 mysql_query() . . . . . . . . . . . . . . . . . . . . 808 12.1.3.42 mysql_real_connect() . . . . . . . . . . . . 809
  • 24. xxii 12.1.3.43 mysql_real_escape_string() . . . . . 811 12.1.3.44 mysql_real_query() . . . . . . . . . . . . . . 813 12.1.3.45 mysql_reload() . . . . . . . . . . . . . . . . . . . 813 12.1.3.46 mysql_row_seek(). . . . . . . . . . . . . . . . . 814 12.1.3.47 mysql_row_tell(). . . . . . . . . . . . . . . . . 814 12.1.3.48 mysql_select_db() . . . . . . . . . . . . . . . 815 12.1.3.49 mysql_set_server_option(). . . . . . . 815 12.1.3.50 mysql_shutdown(). . . . . . . . . . . . . . . . . 816 12.1.3.51 mysql_sqlstate(). . . . . . . . . . . . . . . . . 817 12.1.3.52 mysql_ssl_set() . . . . . . . . . . . . . . . . . . 817 12.1.3.53 mysql_stat() . . . . . . . . . . . . . . . . . . . . . 818 12.1.3.54 mysql_store_result() . . . . . . . . . . . . 818 12.1.3.55 mysql_thread_id() . . . . . . . . . . . . . . . 820 12.1.3.56 mysql_use_result() . . . . . . . . . . . . . . 820 12.1.3.57 mysql_commit() . . . . . . . . . . . . . . . . . . . 821 12.1.3.58 mysql_rollback(). . . . . . . . . . . . . . . . . 822 12.1.3.59 mysql_autocommit() . . . . . . . . . . . . . . 822 12.1.3.60 mysql_more_results() . . . . . . . . . . . . 822 12.1.3.61 mysql_next_result() . . . . . . . . . . . . . 823 12.1.4 Instru¸˜es Preparadas da API C . . . . . . . . . . . . . . 824 co 12.1.5 Tipos de Dados de Instru¸oes Preparadas da API C c˜ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 824 12.1.6 Vis˜o Geral das Fun¸˜es de Instru¸˜es Preparadas a co co da API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827 12.1.7 Descri¸˜o das Fun¸˜es de Instru¸˜o Preparada da ca co ca API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829 12.1.7.1 mysql_prepare() . . . . . . . . . . . . . . . . . . . 829 12.1.7.2 mysql_param_count() . . . . . . . . . . . . . . 831 12.1.7.3 mysql_get_metadata() . . . . . . . . . . . . . 831 12.1.7.4 mysql_bind_param() . . . . . . . . . . . . . . . 832 12.1.7.5 mysql_execute() . . . . . . . . . . . . . . . . . . . 833 12.1.7.6 mysql_stmt_affected_rows(). . . . . . . 837 12.1.7.7 mysql_bind_result() . . . . . . . . . . . . . . 838 12.1.7.8 mysql_stmt_store_result() . . . . . . . . 839 12.1.7.9 mysql_stmt_data_seek() . . . . . . . . . . . 840 12.1.7.10 mysql_stmt_row_seek() . . . . . . . . . . . 840 12.1.7.11 mysql_stmt_row_tell() . . . . . . . . . . . 841 12.1.7.12 mysql_stmt_num_rows() . . . . . . . . . . . 841 12.1.7.13 mysql_fetch() . . . . . . . . . . . . . . . . . . . . 842 12.1.7.14 mysql_send_long_data() . . . . . . . . . . 847 12.1.7.15 mysql_stmt_close() . . . . . . . . . . . . . . 849 12.1.7.16 mysql_stmt_errno() . . . . . . . . . . . . . . 850 12.1.7.17 mysql_stmt_error() . . . . . . . . . . . . . . 850 12.1.7.18 mysql_stmt_sqlstate() . . . . . . . . . . . 851 12.1.8 Tratando a Execu¸˜o de M´ltiplas Consultas na ca u API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 851 12.1.9 Manipulando Valores de Data e Hora na API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
  • 25. xxiii 12.1.10 Descri¸˜o das Fun¸˜es de Threads da API C . . 854 ca co 12.1.10.1 my_init() . . . . . . . . . . . . . . . . . . . . . . . . 854 12.1.10.2 mysql_thread_init() . . . . . . . . . . . . . 854 12.1.10.3 mysql_thread_end() . . . . . . . . . . . . . . 854 12.1.10.4 mysql_thread_safe() . . . . . . . . . . . . . 855 12.1.11 Descri¸˜o das Fun¸˜es do Servidor Embutido da ca co API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855 12.1.11.1 mysql_server_init() . . . . . . . . . . . . . 855 12.1.11.2 mysql_server_end() . . . . . . . . . . . . . . 856 12.1.12 D´vidas e problemas comuns ao utilzar a API C u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857 12.1.12.1 Porque Algumas Vezes mysql_store_result() Retorna NULL Ap´s o mysql_query() Returnar com Sucesso? . . . . 857 12.1.12.2 Que Resultados Posso Onbetr de uma Consulta? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857 12.1.12.3 Como Posso Obter a ID Unica para a ´ ´ Ultima Linha Inserida? . . . . . . . . . . . . . . . . . . . 857 12.1.12.4 Problemas com Liga¸˜o na API C . . . 858 ca 12.1.13 Construindo Programas Clientes . . . . . . . . . . . . . 858 12.1.14 Como Fazer um Cliente em Threads . . . . . . . . . 859 12.1.15 libmysqld, a Biblioteca do Servidor Embutido MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860 12.1.15.1 Vis˜o Geral da Biblioteca do Servidor a MySQL Embutido . . . . . . . . . . . . . . . . . . . . . . . 860 12.1.15.2 Compilando Programas com libmysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 861 12.1.15.3 Restri¸˜es no Uso de um Servidor co MySQL Embutido . . . . . . . . . . . . . . . . . . . . . . . 861 12.1.15.4 Usando Arquivo de Op¸˜es com o co Servidor Embutido . . . . . . . . . . . . . . . . . . . . . . . 861 12.1.15.5 Itens a Fazer no Servidor Embutido (TODO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862 12.1.15.6 Um Exemplo Simples de Servidor Embutido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862 12.1.15.7 Licensiando o Servidor Embutido . . . 866 12.2 Suporte ODBC ao MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866 12.2.1 Como Instalar o MyODBC . . . . . . . . . . . . . . . . . . . 866 12.2.2 Como Preencher os V´rios Campos no Programa de a Administra¸˜o do ODBC . . . . . . . . . . . . . . . . . . . . . . . . 867 ca 12.2.3 Parˆmetros de Conex˜o do MyODBC . . . . . . . . . 868 a a 12.2.4 Como Relatar Problemas com o MyODBC . . . . 869 12.2.5 Programas que Funcionam com MyODBC . . . . . 870 12.2.6 Como Obter o Valor de uma Coluna AUTO_INCREMENT no ODBC . . . . . . . . . . . . . . . . . . . . . . 874 12.2.7 Relatando Problemas com MyODBC . . . . . . . . . . 875 12.3 Conectividade Java (JDBC) ao MySQL . . . . . . . . . . . . . . . . 876 12.4 API PHP do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
  • 26. xxiv 12.4.1 Problemas Comuns com MySQL e PHP . . . . . . . 876 12.5 API Perl do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876 12.5.1 DBI com DBD::mysql . . . . . . . . . . . . . . . . . . . . . . . . 877 12.5.2 A interface DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877 12.5.3 Mais Informa¸˜es DBI/DBD . . . . . . . . . . . . . . . . . . . co 883 12.6 API C++ do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 12.6.1 Borland C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 12.7 API Python do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884 12.8 API Tcl do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884 12.9 Eiffel Wrapper do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884 13 Tratamento de Erros no MySQL . . . . . . . . . 885 13.1 Erros Retornados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885 14 Estendendo o MySQL . . . . . . . . . . . . . . . . . . . 892 14.1 MySQL Internals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 892 14.1.1 Threads MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 892 14.1.2 Pacotes de Teste do MySQL . . . . . . . . . . . . . . . . . . 892 14.1.2.1 Executando o Pacote de Testes do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893 14.1.2.2 Extendendo o Pacote de Teste do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893 14.1.2.3 Relatando Bugs no Pacote de Teste do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 894 14.2 Adicionando Novas Fun¸˜es ao MySQL . . . . . . . . . . . . . . . . 895 co 14.2.1 Sintaxe CREATE FUNCTION/DROP FUNCTION . . . . . 896 14.2.2 Adicionando Novas Fun¸˜es Definidas Por Usu´rio co a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896 14.2.2.1 Sequˆncia de Chamadas UDF para e Fun¸˜es Simples . . . . . . . . . . . . . . . . . . . . . . . . . 898 co 14.2.2.2 Sequˆncia de Chamadas UDF para e Fun¸˜es Agregadas . . . . . . . . . . . . . . . . . . . . . . . 899 co 14.2.2.3 Processando Argumentos . . . . . . . . . . . . 900 14.2.2.4 Valor de Retorno e Tartamento de Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902 14.2.2.5 Compilando e Instalando Fun¸˜es co Definidas Por Usu´rio . . . . . . . . . . . . . . . . . . . . 902 a 14.2.3 Adicionando uma Nova Fun¸˜o Nativa . . . . . . . . 904 ca 14.3 Adicionado Novos Procedimentos ao MySQL . . . . . . . . . . . 905 14.3.1 An´lise de Procedimento . . . . . . . . . . . . . . . . . . . . . 905 a 14.3.2 Escrevendo um Procedimento. . . . . . . . . . . . . . . . . 906
  • 27. xxv Apˆndice A Problemas e Erros Comuns . . . . . 907 e A.1 Como Determinar o Que Est´ Causando Problemas . . . . . 907 a A.2 Erros Comuns Usando o MySQL . . . . . . . . . . . . . . . . . . . . . . . 908 A.2.1 Erro: Access Denied . . . . . . . . . . . . . . . . . . . . . . . . . 908 A.2.2 Erro: MySQL server has gone away. . . . . . . . . . . . 908 A.2.3 Erro: Can’t connect to [local] MySQL server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 909 A.2.4 Erro: Client does not support authentication protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 911 A.2.5 Erro: Host ’...’ is blocked . . . . . . . . . . . . . . . . . 912 A.2.6 Erro: Too many connections . . . . . . . . . . . . . . . . . 912 A.2.7 Erro: Some non-transactional changed tables couldn’t be rolled back . . . . . . . . . . . . . . . . . . . . . . . 912 A.2.8 Erro: Out of memory . . . . . . . . . . . . . . . . . . . . . . . . . 913 A.2.9 Erro: Packet too large . . . . . . . . . . . . . . . . . . . . . . 913 A.2.10 Erros de Comunica¸˜o / Comunica¸˜o Abortada ca ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914 A.2.11 Erro: The table is full . . . . . . . . . . . . . . . . . . . . 915 A.2.12 Erro: Can’t create/write to file . . . . . . . . . . 915 A.2.13 Erro no Cliente: Commands out of sync . . . . . . . 916 A.2.14 Erro: Ignoring user . . . . . . . . . . . . . . . . . . . . . . . . 916 A.2.15 Erro: Table ’xxx’ doesn’t exist . . . . . . . . . . . 916 A.2.16 Erro: Can’t initialize character set xxx . . 917 A.2.17 Arquivo N˜o Encontrado . . . . . . . . . . . . . . . . . . . . 917 a A.3 Assuntos Relacionados a Instala¸˜o . . . . . . . . . . . . . . . . . . . . 918 ca A.3.1 Problemas de Liga¸˜o com a Biblioteca do Cliente ca MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918 A.3.2 Como Executar o MySQL Como Um Usu´rio a Normal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 919 A.3.3 Problemas com Permiss˜es de Arquivos . . . . . . . . 920 o A.4 Assuntos Relacionados a Administra¸˜o . . . . . . . . . . . . . . . . 920 ca A.4.1 O Que Fazer Se o MySQL Continua Falhando . . 921 A.4.2 Como Recuperar uma Senha de Root Esquecida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 923 A.4.3 Como o MySQL Trata de Discos Sem Espa¸o . . 924 c A.4.4 Onde o MySQL Armazena Arquivos Tempor´rios a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 924 A.4.5 Como Proteger ou AlterarHow to Protect or Change the MySQL Socket File ‘/tmp/mysql.sock’ . . . . . . . 925 A.4.6 Problemas Com Fuso Hor´rio . . . . . . . . . . . . . . . . . 926 a A.5 Assuntos Relacionados a Consultas. . . . . . . . . . . . . . . . . . . . . 926 A.5.1 Caso-Sensitivito em Pesquisas . . . . . . . . . . . . . . . . . 926 A.5.2 Problemas Usando Colunas DATE . . . . . . . . . . . . . . 926 A.5.3 Problemas com Valores NULL . . . . . . . . . . . . . . . . . . 928 A.5.4 Problemas com alias . . . . . . . . . . . . . . . . . . . . . . . . 929 A.5.5 Deletando Linhas de Tabelas Relacionadas . . . . . 929 A.5.6 Resolvendo Problemas Com Registros N˜o a Encontrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
  • 28. xxvi A.5.7 Problemas com Compara¸˜o de Ponto Flutuante ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930 A.6 Assuntos Relacionados ao Otimizador . . . . . . . . . . . . . . . . . . 932 A.6.1 Camo evitar o varredura da tabela,,,. . . . . . . . . . . 933 A.7 Assuntos Relacionados a Defini¸˜es de Tabelas . . . . . . . . . . 933 co A.7.1 Problemas com ALTER TABLE. . . . . . . . . . . . . . . . . . 933 A.7.2 Como Alterar a Ordem das Colunas em Uma Tabela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934 A.7.3 Problemas com TEMPORARY TABLE . . . . . . . . 934 Apˆndice B Colaboradores do MySQL . . . . . . 936 e B.1 Desenvolvedores do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 936 B.2 Coolaboradores do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939 B.3 Respons´veis pela Documenta¸˜o e Tradu¸˜o . . . . . . . . . . . a ca ca 943 B.4 Bibliotecas usadas e incluidas com o MySQL . . . . . . . . . . . . 944 B.5 Pacotes que suportam o MySQL . . . . . . . . . . . . . . . . . . . . . . . 945 B.6 Ferramentas que s˜o usadas para criar o MySQL . . . . . . . . a 946 B.7 Respons´veis pelo Suporte do MySQL . . . . . . . . . . . . . . . . . . a 946 Apˆndice C Hist´rico de Altera¸oes do MySQL e o c˜ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948 C.1 Altera¸˜es na distribui¸˜o 5.0.0 (Development) . . . . . . . . . . 948 co ca C.2 Altera¸˜es na distribui¸˜o 4.1.x (Alpha) . . . . . . . . . . . . . . . . 948 co ca C.2.1 Altera¸˜es na distribui¸˜o 4.1.2 (not released yet) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 949 C.2.2 Altera¸˜es na distribui¸˜o 4.1.1 (01 de Dez de 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 950 C.2.3 Altera¸˜es na distribui¸˜o 4.1.0 (03 Apr 2003: co ca Alpha) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954 C.3 Altera¸˜es na distribui¸˜o 4.0.x (Production) . . . . . . . . . . . 956 co ca C.3.1 Altera¸˜es na distribui¸˜o 4.0.17 (not released yet) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957 C.3.2 Altera¸˜es na distribui¸˜o 4.0.16 (17 Out 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 959 C.3.3 Altera¸˜es na distribui¸˜o 4.0.15 (03 Sep 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 961 C.3.4 Altera¸˜es na distribui¸˜o 4.0.14 (18 Jul 2003) . . 965 co ca C.3.5 Altera¸˜es na distribui¸˜o 4.0.13 (16 May 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 969 C.3.6 Altera¸˜es na distribui¸˜o 4.0.12 (15 Mar 2003: co ca Production) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 972 C.3.7 Altera¸˜es na distribui¸˜o 4.0.11 (20 Feb 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 974 C.3.8 Altera¸˜es na distribui¸˜o 4.0.10 (29 Jan 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975 C.3.9 Altera¸˜es na distribui¸˜o 4.0.9 (09 Jan 2003) . . 976 co ca
  • 29. xxvii C.3.10 Altera¸˜es na distribui¸˜o 4.0.8 (07 Jan 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977 C.3.11 Altera¸˜es na distribui¸˜o 4.0.7 (20 Dec 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977 C.3.12 Altera¸˜es na distribui¸˜o 4.0.6 (14 Dec 2002: co ca Gamma) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 978 C.3.13 Altera¸˜es na distribui¸˜o 4.0.5 (13 Nov 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 979 C.3.14 Altera¸˜es na distribui¸˜o 4.0.4 (29 Sep 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 981 C.3.15 Altera¸˜es na distribui¸˜o 4.0.3 (26 Aug 2002: co ca Beta) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 983 C.3.16 Altera¸˜es na distribui¸˜o 4.0.2 (01 Jul 2002) . . 985 co ca C.3.17 Altera¸˜es na distribui¸˜o 4.0.1 (23 Dec 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 988 C.3.18 Altera¸˜es na distribui¸˜o 4.0.0 (Oct 2001: Alpha) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 989 C.4 Altera¸˜es na distribui¸˜o 3.23.x (Recent; still supported) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991 C.4.1 Altera¸˜es na distribui¸˜o 3.23.59 (not released yet) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991 C.4.2 Altera¸˜es na distribui¸˜o 3.23.58 (11 Sep 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 992 C.4.3 Altera¸˜es na distribui¸˜o 3.23.57 (06 Jun 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 992 C.4.4 Altera¸˜es na distribui¸˜o 3.23.56 (13 Mar 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 993 C.4.5 Altera¸˜es na distribui¸˜o 3.23.55 (23 Jan 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 994 C.4.6 Altera¸˜es na distribui¸˜o 3.23.54 (05 Dec 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 995 C.4.7 Altera¸˜es na distribui¸˜o 3.23.53 (09 Oct 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 996 C.4.8 Altera¸˜es na distribui¸˜o 3.23.52 (14 Aug 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997 C.4.9 Altera¸˜es na distribui¸˜o 3.23.51 (31 May 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997 C.4.10 Altera¸˜es na distribui¸˜o 3.23.50 (21 Apr 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 998 C.4.11 Altera¸˜es na distribui¸˜o 3.23.49 . . . . . . . . . . . . 999 co ca C.4.12 Altera¸˜es na distribui¸˜o 3.23.48 (07 Feb 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 999 C.4.13 Altera¸˜es na distribui¸˜o 3.23.47 (27 Dec 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000 C.4.14 Altera¸˜es na distribui¸˜o 3.23.46 (29 Nov 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000 C.4.15 Altera¸˜es na distribui¸˜o 3.23.45 (22 Nov 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
  • 30. xxviii C.4.16 Altera¸˜es na distribui¸˜o 3.23.44 (31 Oct 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001 C.4.17 Altera¸˜es na distribui¸˜o 3.23.43 (04 Oct 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002 C.4.18 Altera¸˜es na distribui¸˜o 3.23.42 (08 Sep 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1003 C.4.19 Altera¸˜es na distribui¸˜o 3.23.41 (11 Aug 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1004 C.4.20 Altera¸˜es na distribui¸˜o 3.23.40 . . . . . . . . . . . 1004 co ca C.4.21 Altera¸˜es na distribui¸˜o 3.23.39 (12 Jun 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1005 C.4.22 Altera¸˜es na distribui¸˜o 3.23.38 (09 May 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1005 C.4.23 Altera¸˜es na distribui¸˜o 3.23.37 (17 Apr 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006 C.4.24 Altera¸˜es na distribui¸˜o 3.23.36 (27 Mar 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1007 C.4.25 Altera¸˜es na distribui¸˜o 3.23.35 (15 Mar 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1007 C.4.26 Altera¸˜es na distribui¸˜o 3.23.34a . . . . . . . . . . 1008 co ca C.4.27 Altera¸˜es na distribui¸˜o 3.23.34 (10 Mar 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1008 C.4.28 Altera¸˜es na distribui¸˜o 3.23.33 (09 Feb 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009 C.4.29 Altera¸˜es na distribui¸˜o 3.23.32 (22 Jan 2001: co ca Production) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010 C.4.30 Altera¸˜es na distribui¸˜o 3.23.31 (17 Jan 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010 C.4.31 Altera¸˜es na distribui¸˜o 3.23.30 (04 Jan 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011 C.4.32 Altera¸˜es na distribui¸˜o 3.23.29 (16 Dec 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012 C.4.33 Altera¸˜es na distribui¸˜o 3.23.28 (22 Nov 2000: co ca Gamma) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1013 C.4.34 Altera¸˜es na distribui¸˜o 3.23.27 (24 Oct 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015 C.4.35 Altera¸˜es na distribui¸˜o 3.23.26 (18 Oct 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015 C.4.36 Altera¸˜es na distribui¸˜o 3.23.25 (29 Sep 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016 C.4.37 Altera¸˜es na distribui¸˜o 3.23.24 (08 Sep 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017 C.4.38 Altera¸˜es na distribui¸˜o 3.23.23 (01 Sep 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1018 C.4.39 Altera¸˜es na distribui¸˜o 3.23.22 (31 Jul 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1019 C.4.40 Altera¸˜es na distribui¸˜o 3.23.21 . . . . . . . . . . . 1019 co ca C.4.41 Altera¸˜es na distribui¸˜o 3.23.20 . . . . . . . . . . . 1020 co ca
  • 31. xxix C.4.42 Altera¸˜es na distribui¸˜o 3.23.19 . . . . . . . . . . . 1020 co ca C.4.43 Altera¸˜es na distribui¸˜o 3.23.18 . . . . . . . . . . . 1021 co ca C.4.44 Altera¸˜es na distribui¸˜o 3.23.17 . . . . . . . . . . . 1021 co ca C.4.45 Altera¸˜es na distribui¸˜o 3.23.16 . . . . . . . . . . . 1022 co ca C.4.46 Altera¸˜es na distribui¸˜o 3.23.15 (May 2000: co ca Beta) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1022 C.4.47 Altera¸˜es na distribui¸˜o 3.23.14 . . . . . . . . . . . 1023 co ca C.4.48 Altera¸˜es na distribui¸˜o 3.23.13 . . . . . . . . . . . 1024 co ca C.4.49 Altera¸˜es na distribui¸˜o 3.23.12 (07 Mar 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024 C.4.50 Altera¸˜es na distribui¸˜o 3.23.11 . . . . . . . . . . . 1025 co ca C.4.51 Altera¸˜es na distribui¸˜o 3.23.10 . . . . . . . . . . . 1025 co ca C.4.52 Altera¸˜es na distribui¸˜o 3.23.9 . . . . . . . . . . . . 1025 co ca C.4.53 Altera¸˜es na distribui¸˜o 3.23.8 (02 Jan 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026 C.4.54 Altera¸˜es na distribui¸˜o 3.23.7 (10 Dec 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1027 C.4.55 Altera¸˜es na distribui¸˜o 3.23.6 . . . . . . . . . . . . 1027 co ca C.4.56 Altera¸˜es na distribui¸˜o 3.23.5 (20 Oct 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1028 C.4.57 Altera¸˜es na distribui¸˜o 3.23.4 (28 Sep 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029 C.4.58 Altera¸˜es na distribui¸˜o 3.23.3 . . . . . . . . . . . . 1029 co ca C.4.59 Altera¸˜es na distribui¸˜o 3.23.2 (09 Aug 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1030 C.4.60 Altera¸˜es na distribui¸˜o 3.23.1 . . . . . . . . . . . . 1031 co ca C.4.61 Altera¸˜es na distribui¸˜o 3.23.0 (05 Aug 1999: co ca Alpha) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1031 C.5 Altera¸˜es na distribui¸˜o 3.22.x (Old; discontinued) . . . 1033 co ca C.5.1 Altera¸˜es na distribui¸˜o 3.22.35 . . . . . . . . . . . . 1033 co ca C.5.2 Altera¸˜es na distribui¸˜o 3.22.34 . . . . . . . . . . . . 1033 co ca C.5.3 Altera¸˜es na distribui¸˜o 3.22.33 . . . . . . . . . . . . 1033 co ca C.5.4 Altera¸˜es na distribui¸˜o 3.22.32 (14 Feb 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1033 C.5.5 Altera¸˜es na distribui¸˜o 3.22.31 . . . . . . . . . . . . 1034 co ca C.5.6 Altera¸˜es na distribui¸˜o 3.22.30 . . . . . . . . . . . . 1034 co ca C.5.7 Altera¸˜es na distribui¸˜o 3.22.29 (02 Jan 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1034 C.5.8 Altera¸˜es na distribui¸˜o 3.22.28 (20 Oct 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1034 C.5.9 Altera¸˜es na distribui¸˜o 3.22.27 . . . . . . . . . . . . 1034 co ca C.5.10 Altera¸˜es na distribui¸˜o 3.22.26 (16 Sep 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035 C.5.11 Altera¸˜es na distribui¸˜o 3.22.25 . . . . . . . . . . . 1035 co ca C.5.12 Altera¸˜es na distribui¸˜o 3.22.24 (05 Jul 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035 C.5.13 Altera¸˜es na distribui¸˜o 3.22.23 (08 Jun 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035
  • 32. xxx C.5.14 Altera¸˜es na distribui¸˜o 3.22.22 (30 Apr 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036 C.5.15 Altera¸˜es na distribui¸˜o 3.22.21 . . . . . . . . . . . 1036 co ca C.5.16 Altera¸˜es na distribui¸˜o 3.22.20 (18 Mar 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036 C.5.17 Altera¸˜es na distribui¸˜o 3.22.19 (Mar 1999: co ca Production) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036 C.5.18 Altera¸˜es na distribui¸˜o 3.22.18 . . . . . . . . . . . 1036 co ca C.5.19 Altera¸˜es na distribui¸˜o 3.22.17 . . . . . . . . . . . 1037 co ca C.5.20 Altera¸˜es na distribui¸˜o 3.22.16 (Feb 1999: co ca Gamma) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1037 C.5.21 Altera¸˜es na distribui¸˜o 3.22.15 . . . . . . . . . . . 1037 co ca C.5.22 Altera¸˜es na distribui¸˜o 3.22.14 . . . . . . . . . . . 1038 co ca C.5.23 Altera¸˜es na distribui¸˜o 3.22.13 . . . . . . . . . . . 1038 co ca C.5.24 Altera¸˜es na distribui¸˜o 3.22.12 . . . . . . . . . . . 1038 co ca C.5.25 Altera¸˜es na distribui¸˜o 3.22.11 . . . . . . . . . . . 1039 co ca C.5.26 Altera¸˜es na distribui¸˜o 3.22.10 . . . . . . . . . . . 1039 co ca C.5.27 Altera¸˜es na distribui¸˜o 3.22.9 . . . . . . . . . . . . 1040 co ca C.5.28 Altera¸˜es na distribui¸˜o 3.22.8 . . . . . . . . . . . . 1040 co ca C.5.29 Altera¸˜es na distribui¸˜o 3.22.7 (Sep 1998: Beta) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041 C.5.30 Altera¸˜es na distribui¸˜o 3.22.6 . . . . . . . . . . . . 1041 co ca C.5.31 Altera¸˜es na distribui¸˜o 3.22.5 . . . . . . . . . . . . 1042 co ca C.5.32 Altera¸˜es na distribui¸˜o 3.22.4 . . . . . . . . . . . . 1043 co ca C.5.33 Altera¸˜es na distribui¸˜o 3.22.3 . . . . . . . . . . . . 1044 co ca C.5.34 Altera¸˜es na distribui¸˜o 3.22.2 . . . . . . . . . . . . 1044 co ca C.5.35 Altera¸˜es na distribui¸˜o 3.22.1 (Jun 1998: Alpha) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1045 C.5.36 Altera¸˜es na distribui¸˜o 3.22.0 . . . . . . . . . . . . 1045 co ca C.6 Altera¸˜es na distribui¸˜o 3.21.x . . . . . . . . . . . . . . . . . . . . . . 1047 co ca C.6.1 Altera¸˜es na distribui¸˜o 3.21.33 . . . . . . . . . . . . 1047 co ca C.6.2 Altera¸˜es na distribui¸˜o 3.21.32 . . . . . . . . . . . . 1047 co ca C.6.3 Altera¸˜es na distribui¸˜o 3.21.31 . . . . . . . . . . . . 1047 co ca C.6.4 Altera¸˜es na distribui¸˜o 3.21.30 . . . . . . . . . . . . 1048 co ca C.6.5 Altera¸˜es na distribui¸˜o 3.21.29 . . . . . . . . . . . . 1048 co ca C.6.6 Altera¸˜es na distribui¸˜o 3.21.28 . . . . . . . . . . . . 1048 co ca C.6.7 Altera¸˜es na distribui¸˜o 3.21.27 . . . . . . . . . . . . 1049 co ca C.6.8 Altera¸˜es na distribui¸˜o 3.21.26 . . . . . . . . . . . . 1049 co ca C.6.9 Altera¸˜es na distribui¸˜o 3.21.25 . . . . . . . . . . . . 1049 co ca C.6.10 Altera¸˜es na distribui¸˜o 3.21.24 . . . . . . . . . . . 1050 co ca C.6.11 Altera¸˜es na distribui¸˜o 3.21.23 . . . . . . . . . . . 1050 co ca C.6.12 Altera¸˜es na distribui¸˜o 3.21.22 . . . . . . . . . . . 1050 co ca C.6.13 Altera¸˜es na distribui¸˜o 3.21.21a . . . . . . . . . . 1051 co ca C.6.14 Altera¸˜es na distribui¸˜o 3.21.21 . . . . . . . . . . . 1051 co ca C.6.15 Altera¸˜es na distribui¸˜o 3.21.20 . . . . . . . . . . . 1051 co ca C.6.16 Altera¸˜es na distribui¸˜o 3.21.19 . . . . . . . . . . . 1052 co ca C.6.17 Altera¸˜es na distribui¸˜o 3.21.18 . . . . . . . . . . . 1052 co ca C.6.18 Altera¸˜es na distribui¸˜o 3.21.17 . . . . . . . . . . . 1052 co ca
  • 33. xxxi C.6.19 Altera¸˜es na distribui¸˜o 3.21.16 . . . . . . . . . . . co ca 1053 C.6.20 Altera¸˜es na distribui¸˜o 3.21.15 . . . . . . . . . . . co ca 1053 C.6.21 Altera¸˜es na distribui¸˜o 3.21.14b . . . . . . . . . . co ca 1054 C.6.22 Altera¸˜es na distribui¸˜o 3.21.14a . . . . . . . . . . co ca 1054 C.6.23 Altera¸˜es na distribui¸˜o 3.21.13 . . . . . . . . . . . co ca 1054 C.6.24 Altera¸˜es na distribui¸˜o 3.21.12 . . . . . . . . . . . co ca 1055 C.6.25 Altera¸˜es na distribui¸˜o 3.21.11 . . . . . . . . . . . co ca 1055 C.6.26 Altera¸˜es na distribui¸˜o 3.21.10 . . . . . . . . . . . co ca 1056 C.6.27 Altera¸˜es na distribui¸˜o 3.21.9 . . . . . . . . . . . . co ca 1056 C.6.28 Altera¸˜es na distribui¸˜o 3.21.8 . . . . . . . . . . . . co ca 1056 C.6.29 Altera¸˜es na distribui¸˜o 3.21.7 . . . . . . . . . . . . co ca 1057 C.6.30 Altera¸˜es na distribui¸˜o 3.21.6 . . . . . . . . . . . . co ca 1057 C.6.31 Altera¸˜es na distribui¸˜o 3.21.5 . . . . . . . . . . . . co ca 1057 C.6.32 Altera¸˜es na distribui¸˜o 3.21.4 . . . . . . . . . . . . co ca 1058 C.6.33 Altera¸˜es na distribui¸˜o 3.21.3 . . . . . . . . . . . . co ca 1058 C.6.34 Altera¸˜es na distribui¸˜o 3.21.2 . . . . . . . . . . . . co ca 1059 C.6.35 Altera¸˜es na distribui¸˜o 3.21.0 . . . . . . . . . . . . co ca 1059 C.7 Altera¸˜es na distribui¸˜o 3.20.x . . . . . . . . . . . . . . . . . . . . . . co ca 1060 C.7.1 Altera¸˜es na distribui¸˜o 3.20.18 . . . . . . . . . . . . co ca 1060 C.7.2 Altera¸˜es na distribui¸˜o 3.20.17 . . . . . . . . . . . . co ca 1061 C.7.3 Altera¸˜es na distribui¸˜o 3.20.16 . . . . . . . . . . . . co ca 1062 C.7.4 Altera¸˜es na distribui¸˜o 3.20.15 . . . . . . . . . . . . co ca 1062 C.7.5 Altera¸˜es na distribui¸˜o 3.20.14 . . . . . . . . . . . . co ca 1062 C.7.6 Altera¸˜es na distribui¸˜o 3.20.13 . . . . . . . . . . . . co ca 1063 C.7.7 Altera¸˜es na distribui¸˜o 3.20.11 . . . . . . . . . . . . co ca 1063 C.7.8 Altera¸˜es na distribui¸˜o 3.20.10 . . . . . . . . . . . . co ca 1064 C.7.9 Altera¸˜es na distribui¸˜o 3.20.9 . . . . . . . . . . . . . co ca 1064 C.7.10 Altera¸˜es na distribui¸˜o 3.20.8 . . . . . . . . . . . . co ca 1064 C.7.11 Altera¸˜es na distribui¸˜o 3.20.7 . . . . . . . . . . . . co ca 1064 C.7.12 Altera¸˜es na distribui¸˜o 3.20.6 . . . . . . . . . . . . co ca 1065 C.7.13 Altera¸˜es na distribui¸˜o 3.20.3 . . . . . . . . . . . . co ca 1066 C.7.14 Altera¸˜es na distribui¸˜o 3.20.0 . . . . . . . . . . . . co ca 1067 C.8 Altera¸˜es na distribui¸˜o 3.19.x . . . . . . . . . . . . . . . . . . . . . . co ca 1067 C.8.1 Altera¸˜es na distribui¸˜o 3.19.5 . . . . . . . . . . . . . co ca 1067 C.8.2 Altera¸˜es na distribui¸˜o 3.19.4 . . . . . . . . . . . . . co ca 1068 C.8.3 Altera¸˜es na distribui¸˜o 3.19.3 . . . . . . . . . . . . . co ca 1068
  • 34. xxxii Apˆndice D Portando para Outros Sistemas e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1069 D.1 Depurando um Servidor MySQL . . . . . . . . . . . . . . . . . . . . . . 1070 D.1.1 Compilando o MYSQL para Depura¸˜o . . . . . . . 1070 ca D.1.2 Criando Arquivos Trace (Rastreamento) . . . . . . 1071 D.1.3 Depurando o mysqld no gdb . . . . . . . . . . . . . . . . . 1072 D.1.4 Usando Stack Trace . . . . . . . . . . . . . . . . . . . . . . . . . 1073 D.1.5 Usando Arquivos de Log para Encontrar a Causa dos Erros no mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . 1074 D.1.6 Fazendo um Caso de Teste Se Ocorre um Corrompimento de Tabela . . . . . . . . . . . . . . . . . . . . . . 1075 D.2 Depurando um cliente MySQL. . . . . . . . . . . . . . . . . . . . . . . . 1076 D.3 O Pacote DBUG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1076 D.4 M´todos de Lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1078 e D.5 Coment´rios Sobre Threads RTS. . . . . . . . . . . . . . . . . . . . . . 1079 a D.6 Diferen¸a en Entre Alguns Pacotes de Threads . . . . . . . . . 1081 c Apˆndice E Vari´veis de Ambientes do MySQL e a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1083 Apˆndice F Sintaxe de Express˜es Regulares do e o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1084 Apˆndice G GPL - Licen¸a P´ blica Geral do e c u GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1087 ´ Indices dos Comandos, Tipos e Fun¸oes SQL c˜ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1093 Concept Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1102
  • 35. Cap´ ıtulo 1: Informa¸˜es Gerais co 1 1 Informa¸˜es Gerais co O programa MySQL R ´ um servidor robusto de bancos de dados SQL (Structured Query e Language - Linguagem Estruturada para Pesquisas) muito r´pido, multi-tarefa e multi- a usu´rio. O Servidor MySQL pode ser usado em sistemas de produ¸˜o com alta carga e a ca a ´ miss˜o critica bem como pode ser embutido em programa de uso em massa. MySQL ´ uma e marca registrada da MySQL AB. O programa MySQL ´ de Licen¸a Dupla. Os usu´rios podem escolher entre usar o pro- e c a grama MySQL como um produto Open Source/Free Software sob os termos da GNU General Public License (http://www.fsf.org/licenses/) ou podem comprar uma licen¸a com- c ercial padr˜o da MySQL AB. Veja Se¸˜o 1.4 [Licensing and Support], P´gina 16. a ca a O site web do MySQL (http://www.mysql.com/) disp˜e das ultimas informa¸˜es sobre o o ´ co programa MySQL. A seguinte lista descreve algumas se¸˜es de particular interesse neste manual: co • Para informa¸˜es sobre a empresa por tr´s do Servidor do Banco de Dados MySQL, co a veja Se¸˜o 1.3 [What is MySQL AB], P´gina 12. ca a • Para discuss˜es das capacidades do Servidor do Banco de Dados MySQL, veja o Se¸˜o 1.2.2 [Features], P´gina 6. ca a • Para instru¸˜es de instala¸˜o, veja Cap´ co ca “ptexi tulo 2 [Installing], P´gina 60. a • Para dicas sobre a portabilidade do Servidor do Banco de Dados MySQL para novas arquiteturas ou sistemas operacionais, veja Apˆndice D [Porting], P´gina 1069. e a • Para informa¸˜es sobre a atualiza¸˜o da vers˜o 4.0, veja Se¸˜o 2.5.1 [Upgrading-from- co ca a ca 4.0], P´gina 120. a • Para informa¸˜es sobre a atualiza¸˜o da vers˜o 3.23, veja Se¸˜o 2.5.2 [Upgrading-from- co ca a ca 3.23], P´gina 123. a • Para informa¸˜es sobre a atualiza¸˜o da vers˜o 3.22, veja Se¸˜o 2.5.3 [Upgrading-from- co ca a ca 3.22], P´gina 127. a ´ • Para um tutorial de introdu¸˜o ao Servidor do Banco de Dados MySQL, veja Cap“ptexi ca tulo 3 [Tutorial], P´gina 169. a • Para exemplos de SQL e informa¸˜es sobre benchmarks, veja o diret´rio de benchmarks co o (‘sql-bench’ na distribui¸˜o). ca • Para o hist´rico de novos recursos e corre¸˜es de erros, veja Apˆndice C [News], o co e P´gina 948. a • Para uma lista de erros atualmente conhecidos e mal-funcionamento, veja Se¸˜o 1.8.6 ca [Bugs], P´gina 53. a • Para projetos futuros, veja Se¸˜o 1.6 [TODO], P´gina 26. ca a • Para ver a lista de todos os colaboradores deste projeto, veja Apˆndice B [Credits], e P´gina 936. a Importante: Relat´rios de erros (tamb´m chamados bugs), bem como d´vidas e coment´rios, devem ser o e u a enviados para a lista de email geral do MySQL. Veja Se¸˜o 1.7.1.1 [Mailing-list], P´gina 33. ca a Veja Se¸˜o 1.7.1.3 [Bug reports], P´gina 36. ca a
  • 36. 2 MySQL Technical Reference for Version 5.0.0-alpha O script mysqlbug deve ser usado para gerar comunicados de erros no Unix. (A distribui¸˜o ca do Windows cont´m um arquivo ‘mysqlbug.txt’ no diret´rio base que pode ser usado como e o um template para um relat´rio de erro. o Em distribui¸˜es fonte, o script mysqlbug pode ser encontrado no diret´rio ‘scripts’. Para co o distribui¸˜es bin´rias, o mysqlbug pode ser encontrado no diret´rio ‘bin’ (‘/usr/bin’ para co a o o pacote RMP do servidor MySQL. Se vocˆ encontrou um erro de seguran¸a no Servidor MySQL, vocˆ deve enviar um email e c e para security@mysql.com. 1.1 Sobre Este Manual Este ´ o manual de referˆncia MySQL; ele documenta o MySQL at´ a vers˜o 5.0.0-alpha. e e e a Mudan¸as funcionais s˜o sempre indicadas com referˆncia a vers˜o, assim este manual c a e a tamb´m pode ser utiliado caso vocˆ esteja utilizando uma vers˜o mais antiga do MySQL e e a (como 3.23 ou 4.0-produ¸˜o). Tamb´m a referˆncias a vers˜o 5.0 (desenvolvimento). ca e e a Sendo um manual de referˆncia, ele n˜o fornece instru¸˜es gerais sobre SQL ou conceitos de e a co banco de dados relacionais. Como o Programa da Banco de Dados MySQL est´ sob constante desenvolvimento, o manual a tamb´m ´ atualizado freq¨entemente. A vers˜o mais recente deste manual est´ dispon´ e e u a a ivel em http://www.mysql.com/documentation/ em diferentes formatos, incluindo HTML, PDF, e vers˜es HLP do Windows. o O documento original ´ uma arquivo Texinfo. A vers˜o HTML ´ produzida automatica- e a e mente usando uma vers˜o modificada do texi2html. A vers˜o texto e Info s˜o produzidas a a a com makeinfo. A vers˜o PostScript ´ produzida usando texi2dvi e dvips. A vers˜o PDF a e a ´ produzida com pdftex. e Se vocˆ tiver dificuldades de encontrar informa¸˜es no manual, vocˆ pode tentar nossa e co e vers˜o com busca em http://www.mysql.com/doc/. a Se vocˆ tiver qualquer sugest˜o a respeito de adi¸˜es e corre¸˜es neste manual, por favor e a co co envie-os para a equipe de documenta¸˜o em docs@mysql.com. ca Este manual foi inicialmente escrito por David Axmark e Michael (Monty) Widenius. Atualmente ´ mantido pela Equipe de Documenta¸˜o da MySQL, que conta com Arjen e ca Lentz, Paul DuBois e Stefan Hinz. Para outros colaboradores, veja Apˆndice B [Credits], e P´gina 936. a Os direitos autorais (2003) deste manual pertence a compania Sueca MySQL AB. Veja Se¸˜o 1.4.2 [Direitos Autorais], P´gina 17. ca a 1.1.1 Conven¸˜es Usadas Neste Manual co Este manual utiliza algumas conven¸˜es tipogr´ficas: co a constant Fonte de largura fixa ´ usada para nomes de comandos e op¸˜es; instru¸˜es e co co SQL; nomes de bancos de dados, tabelas e colunas; c´digo C e Perl; e vari´veis o a de ambiente. Exemplo: “Para ver como o mysqladmin funciona, execute-o com a op¸˜o --help.” ca
  • 37. Cap´ ıtulo 1: Informa¸˜es Gerais co 3 ‘filename’ Fonte de largura fixa com aspas ´ usada para nomes e caminhos de arquivos. e Exemplo: “A distribui¸˜o ´ instalada sobre o diret´rio ‘/usr/local’.” ca e o ‘c’ Fonte de largura constante com aspas ´ tamb´m usada para indicar sequˆncias e e e de caracteres. Exemplo: “Para especificar um meta caracter, use o caractere ‘%’.” italic Fonte It´lica ´ usada para dar ˆnfase, como aqui. a e e boldface Fonte em negrito ´ usada em cabe¸alhos de tabela e indicar ˆnfase especial. e c e Quando um comando deve ser executado por um programa, ele ´ indicado por um prompt e antes do comando. Por exemplo, shell> indica um comando que ´ executado do seu shell e atual e mysql> indica um comando que ´ executado no programa cliente mysql; e shell> digite um comando shell aqui mysql> digite um comando mysql aqui A “shell” ´ seu interpretador de comando. No Unix, ele ´ normalmente um programa e e como sh ou csh. No Windows, o equivalente ´ o command.com ou cmd.exe, normalmente e executado como um console do Windows. 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 e para configurar uma vari´vel de ambiente e executar um comando se parece com o listado a abaixo na sintaxe Bourne Shell: shell> NOMEVAR=valor algum_comando Para csh ou tcsh, execute a sequˆncia desta forma: e shell> setenv NOMEVAR valor shell> algum_comando Frequentemente, nomes de bancos de dados, tabelas e colunas devem ser substitu´ idos nos comandos. Para indicar que as substitui¸˜es s˜o necess´rias, este manual usa nome_db, co a a nome_tbl e nome_col. Por exemplo, vocˆ pode encontrar uma express˜o assim: e a mysql> SELECT nome_col FROM nome_bd.nome_tbl; Isso significa que se vocˆ estiver trabalhando numa express˜o similar, forneceria seu pr´prio e a o nome de banco de dados, tabela e colunas, talvez assim: mysql> SELECT nome_autor FROM biblio_bd.lista_autor; SQL keywords n˜o caso sensitivas e podem ser escritas em mai´scula ou min´scula. Este a u u manual utiliza letras mai´sculas. u Em descri¸˜es de sintaxe, colchetes (‘[’ e ‘]’) s˜o usados para indicar palavras ou cl´usulas co a a opcionais. Por exemplo, na seguinte instru¸˜o, IF EXISTS ´ opcional: ca e DROP TABLE [IF EXISTS] nome_tbl Quando elementos da sintaxe possuem mais de uma alternativa, elas s˜o separados por a barras verticais (‘|’). Quando um menbro de um conjunto de op¸˜es pode ser escolhido, as co alternativas s˜o listadas em colchetes (‘[’ e ‘]’): a TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) Quando um membro de um conjunto de op¸˜es deve ser selecionado, as alternativas s˜o co a listadas dentro de chaves (‘{’ e ‘}’): {DESCRIBE | DESC} nome_tbl {nome_col | metacar}
  • 38. 4 MySQL Technical Reference for Version 5.0.0-alpha 1.2 Vis˜o Geral do Sistema de Gerenciamento de Banco de a Dados MySQL MySQL, o mais popular sistema de gerenciamento de banco de dados SQL Open Source, ´ e desenvolvido, distribu´ e tem suporte da MySQL AB. A MySQL AB ´ uma empresa comercial, ido e fundada pelos desenvolvedores do MySQL, cujos neg´cios ´ fornecer servi¸os relacionados o e c ao sistema de gerenciamento de banco de dados MySQL. Veja Se¸˜o 1.3 [What is MySQL ca AB], P´gina 12. a O web site do MySQL (http://www.mysql.com/) fornece informa¸˜es mais recentes sobre e co programa MySQL e a MySQL AB. O MySQL ´ um sistema de gerenciamento de bancos de dados. e Um banco de dados ´ uma cole¸˜o de dados estruturados. Ele pode ser qual- e ca quer coisa desde uma simples lista de compras a uma galeria de imagens ou a grande quantidade de informa¸˜o da sua rede coorporativa. Para adicionar, ca acessar, e processar dados armazenados em um banco de dados de um com- putador, vocˆ necessita de um sistema de gerenciamento de bancos de dados e como o Servidor MySQL. Como os computadores s˜o muito bons em lidar com a grandes quantidades de dados, o gerenciamento de bancos de dados funciona como a engrenagem central na computa¸˜o, seja como utilit´rios independentes ca a ou como partes de outras aplica¸˜es. co O MySQL ´ um sistema de gerenciamento de bancos de dados relacional. e Um banco de dados relacional armazena dados em tabelas separadas em vez de colocar todos os dados um s´ local. Isso proporciona velocidade e flexibil- o idade. A parte SQL do “MySQL” atenda pela “Structured Query Language - Linguagem Estrutural de Consultas”. SQL ´ linguagem padr˜o mais comum e a usada para acessar banco de dados e ´ definida pelo Padr˜o ANSI/ISO SQL. (O e a padr˜o SQL est´ vem evoluindo desde 1986 e existem diversas vers˜es. Neste a a o manual, ”SQL-92” se refere ao padr˜o liberado em 1992, ”SQL-99” se refere ao a padr˜o liberado em 1999, e ”SQL:2003” se refere a vers˜o do que esperamos que a a seja liberado no meio de 2003. N´s usamos o termo ”o padr~o SQL” indicando o a a vers˜o atual do Padr˜o SQL em qualquer momento). a a O ´ MySQL um software Open Source. e Open Source significa que ´ poss´ para qualquer um usar e modificar o pro- e ivel grama. Qualquer pessoa pode fazer download do MySQL pela Internet e us´-lo a sem pagar nada. Se vocˆ quiser, vocˆ pode estudar o c´digo fonte e alter´-lo e e o a para adequ´-lo `s suas necessidades. O MySQL usa a GPL (GNU General Public a a License - Licen¸a P´blica Geral GNU) c u http://www.fsf.org/licenses, para definir o que vocˆ pode e n˜o pode fazer com o software em diferentes e a situa¸˜es. Se vocˆ sentir desconforto com a GPL ou precisar embutir o MySQL co e em uma aplica¸˜o comercial vocˆ pode adquirir a vers˜o comercial licenciada ca e a conosco. Veja Se¸˜o 1.4.3 [Licen¸as MySQL], P´gina 18. ca c a Por que usar o Banco de Dados MySQL? O servidor de banco de dados MySQL ´ extremamente r´pido, confi´vel, e f´cil e a a a de usar. Se isto ´ o que vocˆ est´ procurando, vocˆ deveria experiment´-lo. O e e a e a Servidor MySQL tamb´m tem um conjunto de recursos muito pr´ticos desen- e a volvidos com a coopera¸˜o de nossos usu´rios. Vocˆ pode encontrar compara- ca a e
  • 39. Cap´ ıtulo 1: Informa¸˜es Gerais co 5 tivos de performance do Servidor MySQL com outros gerenciadores de bancos de dados na nossa p´gina de benchmark Veja Se¸˜o 5.1.4 [MySQL Benchmarks], a ca P´gina 422. a O Servidor MySQL foi desenvolvido originalmente para lidar com bancos de dados muito grandes de maneira muito mais r´pida que as solu¸˜es existentes a co e tem sido usado em ambientes de produ¸˜o de alta demanda por diversos ca anos de maneira bem sucedida. Apesar de estar em constante desenvolvimento, o Servidor MySQL oferece hoje um rico e proveitoso conjunto de fun¸˜es. A co conectividade, velocidade, e seguran¸a fazem com que o MySQL seja altamente c adapt´vel para acessar bancos de dados na Internet. a As caracter´ isticas t´cnicas do MySQL e Para informa¸˜es t´cnicas avan¸adas, veja Cap´ co e c “ptexi tulo 6 [Reference], P´gina 469. a O Programa de Banco de Dados MySQL ´ um sistema e cliente/servidor que consiste de um servidor SQL multi-tarefa que suporta acessos diferentes, diversos programas clientes e bibliotecas, ferramentas administrativas e diversas interfaces de programa¸˜o (API’s). ca Tamb´m concedemos o Servidor MySQL como uma biblioteca multi-tarefa que e vocˆ pode ligar ` sua aplica¸˜o para chegar a um produto mais r´pido, menor e a ca a e mais f´cilmente gerenci´vel. a a MySQL tem muitos softwares de colaboradores dispon´ ivel. ´ E bem prov´vel que sua aplica¸˜o ou linguagem favorita j´ suporte o Servidor a ca a de Banco de Dados MySQL. A pron´ncia oficial do MySQL ´ “Mai Ess Que Ell” (e n˜o MAI-SEQUEL). Mas n´s n˜o u e a o a ligamos se vocˆ pronunciar MAI-SEQUEL ou de outra forma qualquer. e 1.2.1 Hist´ria do MySQL o Quando come¸amos, t´ c inhamos a inten¸˜o de usar o mSQL para conectar `s nossas tabelas ca a ´ (ISAM). Entretanto, depois de alguns testes, utilizando nossas r´pidas rotinas de baixo nivel a chegamos a conclus˜o que o mSQL n˜o era r´pido e nem flex´ a a a ivel 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 portabilidade para c´digos de terceiros que era escrito para uso com mSQL para ser portado o facilmente para uso com o MySQL. A deriva¸˜o do nome MySQL n˜o ´ bem definida. Nosso diret´rio base e um grande n´mero ca a e o u de nossas bibliotecas e ferramentas sempre tiveram o prefixo “my” por pelo menos 10 anos. A filha de Monty tamb´m ganhou o nome My. Qual das duas originou o nome do MySQL e continua sendo um mist´rio, mesmo para n´s. e o O nome do golfinho do MySQL (nosso logo) ´ Sakila. Sakila foi escolhido pelos fun- e dadores da MySQL AB de uma enorme lista de nomes sugeridos pelos usu´rios em nosso a concurso "Name the Dolphin". O nome vencedor foi enviado por Ambrose Twebaze, um desenvolvedor de programas open source de Swaziland, Africa. De acordo com Ambrose, o nome Sakila tem as suas ra´ em SiSwati, a l´ izes ingua local de Swaziland. Sakila ´ tamb´m o e e nome de uma cidade em Arusha, Tanzania, pr´xima ao pais o ´ de or´ igem de Ambrose, Uganda.
  • 40. 6 MySQL Technical Reference for Version 5.0.0-alpha 1.2.2 As Principais Caracter´ isticas do MySQL A seguinte lista descreve algumas das caracter´ isticas mais importantes do Progrma de Banco de Dados MySQL. Veja Se¸˜o 1.5.1 [MySQL 4.0 Nutshell], P´gina 22. ca a Portabilidade e • Escrito em C e C++. • Testado com um amplo faixa de compiladores diferentes. • Funciona em diversas plataformas. Veja Se¸˜o 2.2.3 [Quais SO], P´gina 78. ca a • Utiliza o GNU Automake, Autoconf, e Libtool para portabilidade. • APIs para C, C++, Eiffel, Java, Perl, PHP, Python, Ruby e Tcl est˜o a dispon´iveis. Veja Cap´ “ptexi tulo 12 [Clients], P´gina 772. a • Suporte total a multi-threads usando threads diretamente no kernel. Isto significa que se pode facilmente usar m´ltiplas CPUs, se dispon´ u ivel. • Fornece mecanismos de armazenamento transacional e n˜o transacional. a • Tabelas em disco (MyISAM) baseadas em ´rvores-B extremamente r´pidas a a com compress˜o de ´ a indices. • ´ E relativamente f´cil se adicionar outro mecanismo de armazenamento. a Isto ´ util se vocˆ quiser adicionar uma interface SQL a um banco de e ´ e dados caseiro. • Um sistema de aloca¸˜o de mem´ria muito r´pido e baseado em pro- ca o a cesso(thread). • Joins muito r´pidas usando uma multi-join de leitura unica otimizada. a ´ • Tabelas hash em mem´ria que s˜o usadas como tabelas tempor´rias. o a a • Fun¸˜es SQL s˜o implementadas por meio de uma biblioteca de classes co a altamente otimizada e com o m´ximo de performance. Geralmente n˜o h´ a a a nenhuma aloca¸˜o de mem´ria depois da inicializa¸˜o da pesquisa. ca o ca • O c´digo do MySQL foi testado com Purify (um detector comercial de o falhas de mem´ria) e tamb´m com o Valgrind, uma ferramenta GPL o e (http://developer.kde.org/~sewardj/). • Dispon´ como vers˜o cliente/servidor ou embutida(ligada). ivel a Tipos de Coluna • Aceita diversos tipos de campos: tipos 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 e ENUM. Veja Se¸˜o 6.2 [Tipos de Coluna], ca P´gina 482. a • Registros de tamanhos fixos ou vari´veis. a Comandos e Fun¸˜es co • Completo suporte a operadores e fun¸˜es nas partes SELECT e WHERE das co consultas. Por exemplo: mysql> SELECT CONCAT(first_name, " ", last_name) -> FROM nome_tbl -> WHERE income/dependents > 10000 AND age > 30;
  • 41. Cap´ ıtulo 1: Informa¸˜es Gerais co 7 • Suporte pleno `s cl´usulas SQL GROUP BY e ORDER BY. Suporte para fun¸˜es a a co de agrupamento (COUNT(), COUNT(DISTINCT ...), AVG(), STD(), SUM(), MAX() e MIN()). • Suporte para LEFT OUTER JOIN e RIGHT OUTER JOIN com as sintaxes SQL e ODBC. • Alias em tabelas e colunas s˜o dispon´ a iveis como definidos no padr˜o SQL92. a • DELETE, INSERT, REPLACE, e UPDATE retornam o n´mero de linhas que u ´ foram alteradas (afetadas). E poss´ ivel retornar o n´mero de linhas com u padr˜o coincidentes configurando um parˆmetro quando estiver conectando a a ao servidor. • O comando espec´ ifico do MySQL SHOW pode ser usado para devolver in- forma¸˜es sobre bancos de dados, tabelas e ´ co indices. O comando EXPLAIN pode ser usado para determinar como o otimizador resolve a consulta. • Nomes de fun¸˜es n˜o conflitam com nomes de tabelas ou colunas. Por co a exemplo, ABS ´ um nome de campo v´lido. A unica restri¸˜o ´ que para uma e a ´ ca e chamada de fun¸˜o, espa¸os n˜o s˜o permitidos entre o nome da fun¸˜o e ca c a a ca o ‘(’ que o segue. Veja Se¸˜o 6.1.7 [Palavras reservadas], P´gina 479. ca a • Vocˆ pode misturar tabelas de bancos de dados diferentes na mesma e pesquisa (como na vers˜o 3.22). a Seguran¸a c • Um sistema de privil´gios e senhas que ´ muito flex´ e e ivel, seguro e que per- mite verifica¸˜o baseada em esta¸˜es/m´quinas. Senhas s˜o seguras porque ca co a a todo o tr´fico de senhas ´ criptografado quando vocˆ se conecta ao servidor. a e e Escalabilidade e limites • Lida com bancos de dados enormes. Usamos o Servidor MySQL com bancos de dados que cont´m 50.000.000 registros e sabemos de usu´rios que usam e a o Servidor MySQL com 60.000 tabelas e aproximadamente 5.000.000.000 de linhas. • 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 indice ´ e ´ de 500 bytes (isto pode ser alterado na compila¸˜o do MySQL). Um indice ca pode usar o prefixo de campo com um tipo CHAR ou VARCHAR. Conectividade • Os clientes podem se conectar ao servidor MySQL usando sockets TCP/IP, em qualquer plataforma. No sistema Windows na fam´ NT (NT, 2000 ilia ou XP), os clientes podem se conectar usando named pipes. No sistema Unix, os clientes podem se conectar usando arquivos sockets. • A interface Connector/ODBC fornece ao MySQL suporte a progras clientes que usam conex˜o ODBC (Open-DataBase-Connectivity). Por exemplo, a vocˆ pode usar o MS Access para conectar ao seu servidor MySQL. Os e clientes podem ser executados no Windows ou Unix. O fonte do Connec- tor/ODBC est´ dispon´ a ivel. Todas as fun¸˜es ODBC s˜o suportadas, assim co a como muitas outras. Veja Se¸˜o 12.2 [ODBC], P´gina 866. ca a
  • 42. 8 MySQL Technical Reference for Version 5.0.0-alpha Localiza¸˜o ca • O servidor pode apresentar mensagem de erros aos clientes em v´rias a l´ inguas. Veja Se¸˜o 4.7.2 [Languages], P´gina 328. ca a • Suporte total para v´rios conjuntos de caracteres, que incluem ISO-8859-1 a (Latin1), big5, ujis e mais. Por exemplo, os caracteres Escandinavos ‘^’, a ‘¨’, ‘¨’ s˜o permitidos em nomes de tabelas e colunas. a o a • Todos os dados s˜o armazenados no conjunto de caracteres escolhido. To- a das as compara¸˜es em colunas de seq¨ˆncias caso-insensitivo. co ue • A ordena¸˜o ´ feita de acordo com o conjunto de caracteres escolhido (o ca e a ´ modo sueco por padr˜o). E poss´ alterar isso quando o servidor MySQL ivel ´ iniciado. Para ver um exemplo de v´rias ordena¸˜es avan¸adas, procure e a co c pelo c´digo de ordena¸˜o Tcheca. O Servidor MySQL suporta diversos con- o ca juntos de caracteres que podem ser especificados em tempo de compila¸˜o ca e execu¸˜o. ca Clientes e Ferramentas • O servidor MySQL foi constru´ com suporte para instru¸˜es SQL que ido co verificam, otimizam e reparam tabelas. Estas instru¸˜es est˜o dispon´ co a iveis a partir da linha de comando por meio do cliente myisamcheck, O MySQL inclui tamb´m o myisamchk, um utilit´rio muito r´pido para realizar estas e a a ´ opera¸˜es em tabelas MyISAM. Veja Cap“ptexi tulo 4 [MySQL Database co Administration], P´gina 208. a • Todos os programas MySQL podem ser chamados com as op¸˜es --help ou co -? para obter ajuda online. 1.2.3 Estabilidade do MySQL Esta se¸˜o discute as quest˜es “Qu˜o est´vel ´ o MySQL?” e “Posso depender do MySQL ca o a a e neste projeto?”. Tentaremos deixar claro estes assuntos e responder algumas das quest˜es o mais importantes que dizem respeito a muito de nossos usu´rios. A informa¸˜o nesta se¸˜o a ca ca ´ baseada em dados colhidos da lista de discuss˜o, que ´ muito ativa na identifica¸˜o de e a e ca problemas e assim como nos relatos de tipos de uso. Originalmente, o c´digo vem do in´ dos anos 80, fornecendo um c´digo est´vel e o formato o icio o a de tabelas ISAM permanece compativel´ com vers˜es anteriores. Na TcX, a predecessora da o MySQLAB, o MySQL vem trabalhando sem problemas em nossos projetos desde o meio de 1996. Quando o Programa de Banco de Dados MySQL foi disponibilizado para um p´blico maior, u nossos novos usu´rios rapidamente encontraram algumas partes de “c´digo sem testes”. a o Desde ent˜o, cada distribui¸˜o nova teve menos problemas de portabilidade (mesmo com a ca os novos recursos implementados em cada uma destas vers˜es)o Cada distribui¸˜o do Servidor MySQL foi sendo usado, e os problemas tem ocorrido somente ca quando os usu´rios come¸am a usar o c´digo das “´reas cinzentas.” Naturalmente, novos a c o a usu´rios n˜o sabem o que s˜o as ´reas cinzentas; esta se¸˜o tenta indicar aquelas que s˜o a a a a ca a conhecidas atualmente. As descri¸˜es lidam com a Vers˜o 3.23 e 4.0 do Servidor MySQL. co a Todos os erros conhecidos e relatados s˜o corrigidos na ultima vers˜o, com a exce¸˜o dos a ´ a ca bugs listados na se¸˜o de erros, os quais s˜o relacionados ao desenho. Veja Se¸˜o 1.8.6 ca a ca [Bugs], P´gina 53. a
  • 43. Cap´ ıtulo 1: Informa¸˜es Gerais co 9 O Servidor MySQL ´ escrito em m´ltiplas camadas com m´dulos independentes. Alguns e u o dos novos m´dulos est˜o listados abaixo com indica¸˜es de qu˜o bem-testado foi cada um o a co a deles. Replica¸˜o — Gamma ca Grandes grupos de servidores usando replica¸˜o est˜o em uso, com bom resul- ca a tados. O trabalho no aprimoramento dos recursos de replica¸˜o continua no ca MySQL 4.x. Tabelas InnoDB — Est´vel (na 3.23, 3.23.49) a O mecanismo de armazenamento transacional InnoDB foi declarado est´vel na a a ´rvore do MySQL 3.23, a partir da vers˜o 3.23.49. InnoDB tem sido usado em a sistema de produ¸˜o grandes e com carga pesada. ca Tabelas BDB — Gamma O c´digo do Berkeley DB ´ muito est´vel, mas ainda estamos melhorando a o e a interface do mecanismo de armazenamento transacional do BDB no Servidor MySQL, assim levar´ algum tempo at´ que ele esteja t˜o bem testado quanto os a e a outro tipos de tabela. Pesquisas Full-text — Beta Pesquisa full-text funcionam mas ainda n˜o s˜o largamente usadas. Melhora- a a mentos importantes forma implementados no MySQL 4.0. MyODBC 3.51 (usa ODBC SDK 3.51) — Est´vela Em grande uso na produ¸˜o. Alguns problemas apresentados parecem ser rela- ca cionados a aplica¸˜o e independente do driver ODBC ou do servidor de banco ca de dados. Recupera¸˜o autom´tica de tabelas MyISAM — Gamma ca a Este status se aplica apenas ao novo c´digo que confere no mecanismo de ar- o mazenamento MyISAM que verifica, na inicializa¸˜o, se a tabela foi fechada cor- ca retamente e executa uma conferˆncia/reparo autom´tico da tabela em caso e a negativo. Bulk-insert — Alpha Novo recurso nas tabelas MyISAM no MySQL 4.0 para inser¸˜es mais r´pidas de co a v´rios registros. a Locking — Gamma Esse m´dulo ´ muito dependente do sistema. Em alguns sistemas existem certos o e problemas por utilizar o locking padr˜o do SO (fcntl(). Nestes casos, vocˆ a e deve executar o mysqld com o parˆmetro --skip-external-locking. S˜o a a conhecidos alguns problemas ocorridos em alguns sistemas Linux e no SunOS quando utiliza-se sistemas de arquivos montados em NFS. Clientes que pagam recebem suporte direto e de alta qualidade da MySQL AB. A MySQL AB tamb´m fornece uma lista de discuss˜o como um recurso da comunidade onde qualquer e a pessoa pode tirar suas d´vidas. u Erros s˜o normalmente corrigidos com um patch; para erros s´rios, normalmente ´ lan¸ada a e e c uma nova distribui¸˜o. ca
  • 44. 10 MySQL Technical Reference for Version 5.0.0-alpha 1.2.4 Qual o Tamanho Que as Tabelas do MySQL Podem Ter? A Vers˜o 3.22 do MySQL tem suporte para tabelas com limite de tamanho at´ 4G. Com a e o novo MyISAM no MySQL vers˜o 3.23 o tamanho m´ximo foi expandido at´ 8 milh˜es de a a e o terabytes (2 ^ 63 bytes). Com este tamanho de tabela maior permitido, o tamanho m´ximo a efetivo das tabelas para o banco de dados MySQL ´ normalmente limitado pelas restri¸˜es e co do sistema operacional quanto ao tamanho dos arquivos, n˜o mais por limites internos do a MySQL. A seguinte tabela lista alguns exemplos do limite do tamanho de arquivos do sistema op- eracional: Sistema Operacional Limite do tamanho do arquivo Linux-Intel 32 bit 2G, muito mais usando LFS Linux-Alpha 8T (?) Solaris 2.5.1 ´ 2G (E poss´ 4GB com patch) ivel Solaris 2.6 4G (pode ser alterado com parˆmetro) a Solaris 2.7 Intel 4G Solaris 2.7 ULTRA-SPARC 8T (?) No Linux 2.2 vocˆ pode ter tabelas maiores que 2 GB usando o patch LFS para o sistema e de arquivos ext2. No Linux 2.4 j´ existem patches para o sistema de arquivos ReiserFS para a ter suporte a arquivos maiores. A maioria das distribui¸˜es atuais s˜o baseadas no kernel co a 2.4 e j´ incluem todos os patches Suporte a Arquivos Grandes (Large File Support - LFS) a exigidos. No entanto, o tamanho m´ximo dispon´ a ivel ainda depende de diversos fatores, sendo um deles o sistema de arquivos usado para armazenar as tabelas MySQL. Para um vis˜o mais detalhada sobre LFS no Linux, dˆ uma olha na p´gina Andreas Jaeger’s a e a "Large File Support in Linux" em http://www.suse.de/~aj/linux_lfs.html. Por padr˜o, o MySQL cria tabelas MyISAM com uma estrutura interna que permite um a tamanho m´ximo em torno de 4G. Vocˆ pode verificar o tamanho m´ximo da tabela com a e a o comando SHOW TABLE STATUS ou com o myisamchk -dv nome_tabela Veja Se¸˜o 4.6.8 ca [SHOW], P´gina 303. a Se vocˆ precisa de tabelas maiores que 4G (e seu sistema operacional suporta arquivos e grandes), a instru¸˜o CREATE TABLE permite as op¸˜es AVG_ROW_LENGHT e MAX_ROWS. Use ca co estas op¸˜es para criar uma tabela que possa ter mais de 4GB. Veja Se¸˜o 6.5.3 [CREATE co ca TABLE], P´gina 597. Vocˆ pode tamb´m alterar isso mais tarde com ALTER TABLE. Veja a e e Se¸˜o 6.5.4 [ALTER TABLE], P´gina 607. ca a Outros modos se contornar o limite do tamanho do arquivo das tabelas MyISAM s˜o os a seguintes: • Se sua tabela grande ser´ somente leitura, vocˆ poder´ usar o myisampack para unir a e a e comprimir v´rias tabelas em uma. mysisampack normalmente comprime uma tabela a em pelo menos 50%, portanto vocˆ pode obter, com isso, tabelas muito maiores. Veja e Se¸˜o 4.8.4 [myisampack], P´gina 337. ca a • Outra op¸˜o para contornar o limite de tamanho de arquivos do sistema operacional ca para arquivos de dados MyISAM usando a op¸˜o RAID. Veja Se¸˜o 6.5.3 [CREATE TABLE], ca ca P´gina 597. a • O MySQL inclu´ uma biblioteca MERGE que permite acessar uma cole¸˜o de tabelas i ca idˆnticas como se fosse apenas uma. Veja Se¸˜o 7.2 [MERGE], P´gina 637. e ca a
  • 45. Cap´ ıtulo 1: Informa¸˜es Gerais co 11 1.2.5 Compatibilidade Com o Ano 2000 (Y2K) O Servidor MySQL n˜o apresenta nenhum problema com o ano 2000 (Y2K compat´ a ivel) • O Servidor MySQL usa fun¸˜es de tempo Unix que tratam datas at´ o ano 2037 para co e valores TIMESTAMP; para valores DATE e DATETIME, datas at´ o ano 9999 s˜o aceitas. e a • 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 0 e a 1901 at´ 2155 em 1 byte e mostr´-lo usando 2 ou 4 d´ e a igitos. Todos os anos de 2 d´ igitos s˜o considerados estar na faixa de 1970 at´ 2069; o que significa que se vocˆ armazenar a e e 01 em uma coluna YEAR, O Servidor MySQL o tratar´ como 2001. a O seguinte demonstra¸˜o simples ilustra que o MySQL Server n˜o tem nenhum problema ca a com datas at´ depois do ano 2030: e 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), -> ("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 |
  • 46. 12 MySQL Technical Reference for Version 5.0.0-alpha | 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) O valor da coluna TIMESTAMP final ´ zero porque o ano final (2050) excede o TIMESTAMP e maximo. O tipo de dados TIMESTAMP, que ´ usado para armazenar a hora atual, suporta e valores na faixa de 19700101000000 a 20300101000000 em m´quinas 32 bits (valor com a sinal). Em m´quinas de 64 bits, TIMESTAMP trata valores at´ 2106 (valores sem sinal). a e O exemplo mostra que os tipos DATE e DATETIME n˜o tem problemas com as datas usadas. a Eles ir˜o conseguir trabalhar com datas at´ o ano 9999. a e Embora o MySQL Server seja seguro em rela¸˜o ao ano 2000, vocˆ pode ter problemas se vocˆ ca e e us´-lo com aplica¸˜es que n˜o s˜o seguras com o ano 2000. Por exemplo, muitas aplica¸˜es a co a a co antigas armazenam ou manipulam anos usando valores de 2 digitos (que s˜o amb´ a iguos) em ´ vez de 4 digitos. Este problema pode ser aumentado por aplica¸˜es que usam valores como co 00 ou 99 como indicadores de valores “perdidos”. Infelizmente, estes problemas pode ser dif´ iceis de corrigir, cada um deles pode usar um conjunto diferente de conven¸˜es e fun¸˜es co co de tratamento de datas. Assim, apesar do Servidor MySQL n˜o ter problemas com o ano 2000, ´ de responsabilidade a e de sua aplica¸˜o fornecer datas que n˜o sejam amb´ ca a iguas. Veja Se¸˜o 6.2.2.1 [Y2K issues], ca P´gina 490 para as regras do Servidor MySQL para lidar com entrada de datas amb´ a iguas que contenham valores de ano com 2 d´ igitos. 1.3 Vis˜o Geral da MySQL AB a MySQL AB ´ a companhia dos fundadores e principais desenvolvedores do MySQL. A MySQL e AB foi estabelecida originalmente na Su´cia por David Axmark, Allan Larsson e Michael e “Monty” Widenius. Os desenvolvedores do servidor MySQL s˜o todos empregados pela companhia. ny N´s somo a o uma organiza¸˜o virtual com pessoas em uma d´zia de pa´ ca u ises. Nos comunicamos exten- sivamente na internet todos os dias uns com os outros e com nossos usu´rios, agentes de a suporte e parceiros. N´s nos dedicamos a desenvolver o programa MySQL e propagar nosso banco de dados a o novos usu´rios.A MySQL AB det´m os direitos autorais do c´digo fonte do MySQL, do logo e a e o da marca MySQL e deste manual. Veja Se¸˜o 1.2 [What-is], P´gina 4. ca a A ideologia do MySQL mostra nossa dedica¸˜o ao MySQL e ao Open Source. ca N´s desejamos que o Programa de Banco de Dados MySQL seja: o
  • 47. Cap´ ıtulo 1: Informa¸˜es Gerais co 13 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 de se 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. O site do MySQL (http://www.mysql.com/) fornece as ultimas informa¸˜es sobre o MySQL ´ co e a MySQL AB. A prop´sito, a parte “AB” do nome da companhia ´ o acrˆnimo para a palavra su´ca o e o e “aktiebolag”, ou “sociedade anˆnima.” Ela ´ traduzida para “MySQL, Inc.” De fato, o e MySQL Inc. e MySQL GmbH s˜o exemplos de subsidi´rias da MySQL AB. Elas est˜o a a a localizadas nos EUA e Alemanha, respectivamente. 1.3.1 O Modelo de Neg´cio e Servi¸os da MySQL AB o c Uma das d´vidas mais comuns que encontramos ´: “Como vocˆ pode viver de algo que vocˆ u e e e ´ disponibiliza sem custo? ” E assim que fazemos. A MySQL AB ganha dinheiro com suporte, servi¸os, licen¸as comerciais e royalties. Us- c c amos estes rendimentos para patrocinar o desenvolvimento de produtos e para expandir os neg´cios da MySQL. o A compania tem sido luccrativa desde de sua cria¸˜o. Em Outubro de 2001, aceitamos um ca financiamento de risco de investidores Escandinavos e um pounhado de pessoas de neg´cio. o Este investimento ´ usado para solidificarmos nosso modelo de neg´cio e construir um base e o para o crescimento sustent´vel. a 1.3.1.1 Suporte A MySQL AB ´ gerenciada pelos fundadores e principais desenvolvedores do banco de dados e MySQL. Os desenvolvedores tem o compromisso de dar suporte aos clientes e outros usu´rios a com objetivo de manterem contato com as suas necessiades e problemas. Todo o nosso suporte ´ dado por desenvolvedores qualificado. D´vidas mais complicadas s˜o respondidas e u a por Michael Monty Widenius, principal autor do MySQL Server. Veja Se¸˜o 1.4.1 [Suporte], ca P´gina 17. a Para maiores informa¸˜es e pedido de suporte de diversos n´ co iveis, veja http://www.mysql.com/support/ ou contate nossos vendedores em sales@mysql.com.
  • 48. 14 MySQL Technical Reference for Version 5.0.0-alpha 1.3.1.2 Treinamento e Certifica¸˜o ca A MySQL AB distribui o MySQL e treinamentos relacionados mundialmente. Oferecemos tanto cursos abertos quanto fechados voltado para a necessidade espec´ifica da sua empresa. O Treinamento do MySQL tamb´m est´ dispon´ por meio de seus parceiros, os Centros de e a ivel Treinamento Autorizados do MySQL. Nosso material de treinamento usa os mesmos bancos de dados exemplos usados em nossa documenta¸˜o e nossos exemplos de aplicativos. Ele est´ sempre atualizado de acordo com ca a a ultima vers˜o do MySQL. Nossos instrutores s˜o apoiados por nossa equipe de desenvolvi- ´ a a mento para garantir a qualidade do treinamento e o desenvolvimento cont´inuo do material de nossos cursos. Isto tamb´m assegura que nenhuma quest˜o surgida durante o curso fique e a sem resposta. Fazendo nossos cursos de treinamento permitir´ que vocˆ alcance os objetivos de seu aplica- a e tivo MySQL. vocˆ tamb´m ir´: e e a • Economizar tempo. • Melhorar o desempenho de seus aplicativos. • Reduzir ou eliminar a necessidade de hardware adicional, baixando o custo. • Melhorar a seguran¸a. c • Aumentar a satisfa¸˜o dos clientes e colabloradores. ca • Preparar-se para Certifica¸~o MySQL. ca Se vocˆ estiber interessado em nosso treinamento como um participante em por- e tencial ou como um parceiro de treinamento, viste a se¸˜o de treinamento em ca http://www.mysql.com/training/ ou contate nos em: training@mysql.com. Para detalhes sobre o Programa de Certifica¸~o MySQL, veja http://www.mysql.com/certification/. ca 1.3.1.3 Consultoria A MySQL AB e seus Parceiros Autorizados oferecem servi¸os de consultoria para usu´rios c a do Servidor MySQL e `queles que utilizam o Servisdor MySQL embutido em seus programas, a em qualquer parte do mundo. Nossos consultores podem ajud´-lo projetando e ajustando o seu banco de dados, criar a consultas eficientes, ajustar sua plataforma para uma melhor performance, resolver quest˜es o de migra¸˜o, configurar replica¸˜o, criar aplica¸˜es transacionais robustas, e mais. Tamb´m ca ca co e ajudamos os nossos clientes com o Servidor MySQL embutido em seus produtos e aplica¸˜esco para desenvolvimento em larga-escala. Nossos consultores trabalham em colabora¸˜o com a nossa equipe de desenvolvimento, o ca que assegura a qualidade t´cnica de nossos servi¸os profissionais. Os servi¸os de consultoria e c c varia de sess˜es de 2 dias a projetos que gastam semanas e meses. Nosso peritos n˜o apenas o a cobrem o Servidor MySQLeles tamb´m conhecem sobre linguagens de programa¸˜o e scripts e ca tais como PHP, Perl e mais. Se estiver interessado em nossos servi¸os de consultoria ou quiser se tornar nosso parceiro, c visite a se¸˜o sobre consultaria em nosso web site em http://www.mysql.com/consulting/ ca ou contate nossa equipe de consultoria em consulting@mysql.com.
  • 49. Cap´ ıtulo 1: Informa¸˜es Gerais co 15 1.3.1.4 Licen¸as Comerciais c O banco de dados MySQL ´ liberado sob a licen¸a GNU General Public License (GPL). Isto e c significa que o programa MySQL pode ser usado sem custos sob a GPL. Se vocˆ n˜o deseja estar e a limitado pelos termos da GPL (tais como a exigˆncia de que a sua aplica¸˜o tamb´m deva ser e ca e GPL), vocˆ pode comprar uma licen¸a comercial para o mesmo produto da MySQL AB; veja e c http://www.mysql.com/products/pricing.html. Desde de que a MySQL AB ´ dona dos e direitos do c´digo fonte do MySQL, estamos aptos a empregar o Licenciamento Dual, que o significa que o mesmo produto est´ dispon´ sob a GPL e sob uma licen¸a comercial. Isto a ivel c n˜o afeta o nosso comprometimento com o Open Source de forma alguma. Para detalhes a sobre quando uma licen¸a comercial ´ exigida, veja Se¸˜o 1.4.3 [MySQL licenses], P´gina 18. c e ca a 1.3.1.5 Parcerias A MySQL AB tem um programa de parceria mundial que cobre cursos de treinamento, consultaria e suporte, publica¸˜es, mais a revenda e distribiui¸˜o do MySQL e produtos co ca relacionados. Os Parceiros da MySQL AB ganham visibilidade no nosso web site (http://www.mysql.com/) e o direito de usarem vers˜es especiais da marca MySQL para o identificar seus produtos e promoverem os seus neg´cios. o Se vocˆ est´ interessado em se tornar um Parceiro da MySQL AB, envie-nos um email para e a partner@mysql.com. A palavra MySQL e o logomarca do golfinho da MySQL s˜o marcas registradas da MySQL AB. a Veja Se¸˜o 1.4.4 [MySQL AB Logos and Trademarks], P´gina 20. Estas marcas registradas ca a representam um valor significante que os fundadores do MySQL construiram ao longo dos anos. O web site do MySQL (http://www.mysql.com/) ´ popular entre desenvolvedores e usu´rios. e a Em Outubro de 2001, obtivemos mais de 10 milh˜es e views. Nossos visitantes representam o um grupo que tomam decis˜es de compra e fazem recomend¸˜es de software e hardware. o co Vinte por cento de nossos vistantes autorizam decis˜es de compra e apenas nove por cento o n˜o est˜o envolvidos com a ´rea de compras. Mais de 65% fizeram uma ou mais compras a a a online no ultimo semaster e 70% planejam fazer uma compra nos pr´ximos meses. ´ o 1.3.2 Informa¸oes para Contato c˜ O web site do MySQL (http://www.mysql.com/) fornece as ultimas informa¸˜es sobre MySQL ´ co e MySQL AB. Para servi¸os de imprensa e quest˜es n˜o cobertas por nossas releases de nott´ c o a icias (http://www.mysql.com/news/), envie-nos um email para press@mysql.com. Se vocˆ tiver um contrato de suporte v´lido com a MySQL AB, vocˆ receber´ em tempo, e a e a respostas precisas para as suas quest˜es t´cnicas sobre o programa MySQL. o e Para mais informa¸˜es, veja Se¸˜o 1.4.1 [Support], P´gina 17. Em nosso site na web, veja co ca a http://www.mysql.com/support/, ou envie um e-mail para sales@mysql.com. Para informa¸˜es sobre treinamento MySQL, visite a se¸˜o de treinamento em co ca http://www.mysql.com/training/. Se vocˆ tiver acesso restrito ` Internet, conte a e a
  • 50. 16 MySQL Technical Reference for Version 5.0.0-alpha equipe de treinamento da MySQL AB via e-mail em training@mysql.com. Veja Se¸˜o 1.3.1.2 ca [Business Services Training], P´gina 14. a Para informa¸˜es sobre o Progrma de Certifica¸o MySQL, veja http://www.mysql.com/certification/. co c Veja Se¸˜o 1.3.1.2 [Business Services Training], P´gina 14. ca a Se vocˆ estiver interessado em consultoria, visite a se¸˜o de consultorias de nosso web e ca site em http://www.mysql.com/consulting/. Se vocˆ tiver restri¸˜es acesso a internet, e co contate a equipe de consultores da MySQL AB via e-mail em consulting@mysql.com. Veja Se¸˜o 1.3.1.3 [Business Services Consulting], P´gina 14. ca a Licen¸as comerciais podem ser compradas online em https://order.mysql.com/. c L´ vocˆ tamb´m encontrar´ informa¸˜es de como enviar um fax da sua ordem de a e e a co compra para a MySQL AB. Mais informa¸˜es sobre licen¸as podem ser encontradas em co c http://www.mysql.com/products/pricing.html. Se vocˆ tiver duvidas em rela¸˜o a e ca licenciamento ou quiser cota para negocia¸˜o de um alto volume de licen¸as, preencha o ca c formul´rio de contato em nosso site web (http://www.mysql.com/) ou envie um email a para licensing@mysql.com (para quest˜es sobre licenciamento) ou para sales@mysql.com o (para pedidos de compra). Veja Se¸˜o 1.4.3 [Licen¸as MySQL], P´gina 18. ca c a Se vocˆ est´ interessado em fazer parceira com a MySQL AB, envie um e-mail para e a partner@mysql.com. Veja Se¸˜o 1.3.1.5 [Business Services Partnering], P´gina 15. ca a ´ Para mais detalhes sobre a politica da marca MySQL, visite http://www.mysql.com/company/trademark.ht ou envie um e-mail para trademark@mysql.com. Veja Se¸˜o 1.4.4 [MySQL AB Logos and ca Trademarks], P´gina 20. a Se vocˆ est´ interessado em qualquer um dos trabalhos da MySQL AB lista na se¸˜o de tra- e a ca balhos (http://www.mysql.com/company/jobs/), envie um e-mail para jobs@mysql.com. N˜o nos envie o seu CV em anexo, mas como texto no final de sua mensagem de email. a Para discuss˜es gerais entre nosso muitos usu´rios, direcione a sua aten¸˜o para a lista de o a ca discuss˜o apropriada. Veja Se¸˜o 1.7.1 [D´vidas], P´gina 33. a ca u a Relat´rios de erros (geralmente chamados bugs), assim como quest˜es e coment´rios, de- o o a vem ser enviados para a lista de email geral do MySQL. Veja Se¸˜o 1.7.1.1 [Mailing-list], ca P´gina 33. Caso vocˆ encontre um bug de seguran¸a importante no MySQL Server, envie-nos a e c um e-mail para security@mysql.com. Veja Se¸˜o 1.7.1.3 [Bug reports], P´gina 36. ca a Se vocˆ tiver resultados de benchmarks que podemos publicar, contate-nos via e-mail em e benchmarks@mysql.com. Se vocˆ tiver sugest˜es a respeito de adi¸˜es ou conex˜es para este manual, envie-os para a e o co o equipe do manual via e-mail em docs@mysql.com. Para quest˜es ou coment´rios sobre o funcionamento ou cote´do do web site da MySQL o a u (http://www.mysql.com/), envie um e-mail para webmaster@mysql.com. A MySQL AB tem uma pol´ itica de privacidade que pode ser lida em http://www.mysql.com/company/privac Para qualquer quest˜es a respeito desta pol´ o itica, envie um e-mail para privacy@mysql.com. Para todos os outros assunto, envie um e-mail para info@mysql.com. 1.4 Suporte e Licenciamento do MySQL Esta se¸˜o descreve os contratos de licenciamento e suporte do MySQL. ca
  • 51. Cap´ ıtulo 1: Informa¸˜es Gerais co 17 1.4.1 Suporte Oferecido pela MySQL AB O suporte t´cnico do MySQL AB significa respostas individualizadas as seus problemas par- e ticulares diretamente dos engenheiros de software que codificaram o MySQL. Tentamos ter uma vis˜o ampla e inclusiva de suporte t´cnico. Qualquer problema envol- a e vendo o MySQL ´ importante par n´s se for importante para vocˆ. Normalmente os clientes e o e procuram ajuda em como comandos e utilit´rios diferentes funcionam, remover gargalos de a desempenhos, restaurar sistemas com falhas, entender impactos do sistema operacional e rede no MySQL, configurar melhor pr´ticas de backup e restaura¸˜o, utiluizaar APIs, e assim a ca por diante. Nosso suporte cobre apenar o servidor MySQL e nossos pr´prios utilit´rios, e o a n˜o produtos de terceirosque acessam o servidor MySQL, embora tentamos ajudar com eles a quando podemos. Informa¸˜es detalhadas sobre nossas v´rias op¸˜es de suporte ´ dado em co a co e Suporte t´cnico ´ como seguro de vida. Vocˆ pode viver felizsem ele durante anos, mas e e e quando sua hora chegar ele ´ de grande importˆncia, mas j´ ´ muito tarde para adquir´ e a ae i- lo. Se vocˆ utiliza o MySQL Server para aplica¸˜es importantes e encontrar dificuldades e co repentinas, vocˆ pode gastar horas tentando resolver os problemas sozinho. Vocˆ pode e e precisar de acesso imediato aos respons´veis pela solu¸˜o de problemas do MySQL dsipon´ a ca iveis, contratados pela MySQL AB. 1.4.2 Copyrights e Licen¸as Usadas pelo MySQL c MySQL AB possui os direitos sobre o c´digo fonte do MySQL, as logomarcas e marcas reg- o istradas do MySQL e este manual. Veja Se¸˜o 1.3 [What is MySQL AB], P´gina 12. Diversas ca a licen¸as s˜o relevantes a distribui¸˜o do MySQL: c a ca 1. Todo o c´digo espec´ o ifico do MySQL no servidor, a biblioteca mysqlclient e o cliente, assim como a biblioteca GNU readline ´ coberta pela GNU General Public License. e Veja Apˆndice G [GPL license], P´gina 1087. O texto desta licen¸a podee ser encon- e a c trado no arquivo ‘COPYING’ na distribui¸˜o. ca 2. A biblioteca GNU getopt ´ coberta pela GNU Lesser General Public License. Veja e http://www.fsf.org/licenses/. 3. Algumas partes da fonte (a biblioteca regexp) ´ coberta por um copyright no estilo e Berkeley. 4. Vers˜es mais antiga do MySQL (3.22 e anteriror) est˜o sujeitos a uma licen¸a estrita o a c (http://www.mysql.com/products/mypl.html). Veja a documenta¸˜o da vers˜o es- ca a pec´ifica para mais informa¸˜o. ca 5. O manual de referˆncia do MySQL atualmente n˜o ´ distribu´ sob uma licecn¸a no e a e ido c estilo da GPL. O uso deste manual est´ sujeito aos seguintes termos: a • A convers˜o para outros formatos ´ permitido, mas o conte´do atual n˜o pode ser a e u a alterado ou editado de modo algum. • Vocˆ pode criar uma c´pia impressa para seu pr´prio uso pessoal. e o o • Para todos os outros usos, como venda de c´pias impressas ou uso (de partes) do o manual em outra publica¸˜o, ´ necess´rios um acordo com a MySQL AB previamente ca e a escrito.
  • 52. 18 MySQL Technical Reference for Version 5.0.0-alpha Envie-nos email para docs@mysql.com para maiores informa¸˜es ou se vocˆ estiver co e interessado em fazer a tradu¸˜o. ca Para informa¸˜es sobre como as licen¸as do MySQL funcionam na pr´tica, de uma olhada co c a em Se¸˜o 1.4.3 [MySQL licenses], P´gina 18. Veja tamb´m Se¸˜o 1.4.4 [MySQL AB Logos ca a e ca and Trademarks], P´gina 20. a 1.4.3 Licen¸as do MySQL c O programa MySQL ´ distribu´ e ido sob a GNU General Public License (GPL), que ´ provavelmente a melhor licen¸a Open Source conhecida. e c Os termos formais da licen¸a GPL pode ser encontrado em http://www.fsf.org/licenses/. Veja tamb´m c e http://www.fsf.org/licenses/gpl-faq.html e http://www.gnu.org/philosophy/enforcing-gpl.htm Como o programa MySQL ´ distribu´ sob a GPL, ele pode ser usa geralmente de gra¸a, mas e ido c para certos usos vocˆ pode querer ou precisar comprar lincen¸as comerciais da MySQL AB em e c https://order.mysql.com/. Veja http://www.mysql.com/products/licensing.html para mais informa¸˜es. co Vers˜es mais antigas do MySQL (3.22 e anteriores) est˜o sujeitos a uma licen¸a mais estrita o a c (http://www.mysql.com/products/mypl.html). Veja a documenta¸˜o da vers˜o espec´ ca a ifica para mais informa¸˜o. ca Note que o uso do programa MySQL sob uma licen¸a comercial, GPL ou a antiga licen¸a do c c MySQL n˜o d´ automaticamente o direito de usar as marcas registradas da MySQL AB. Veja a a Se¸˜o 1.4.4 [MySQL AB Logos and Trademarks], P´gina 20. ca a 1.4.3.1 Usando o Programa MySQL Sob uma Licen¸a Comercial c A licen¸a GPL ´ contagiosa no sentido de que quando um programa ´ ligado a um programa c e e GPL, todo o c´digo fonte para todas as partes do produto resultante tamb´m devem ser o e distribu´idas sob a GPL. Se vocˆ n˜o seguir esta exigˆncia do GPL, vocˆ quebra os termos da e a e e licen¸a e perde o seu direito de usar o programa GPL inclu´ c ido. Vocˆ tamb´m corre riscos. e e Vocˆ precisar´ de uma licen¸a comercial: e a c • Quando vocˆ liga um programa com qualquer c´digo GPL do programa MySQL e n˜o que e o a que o produto resultante seja licenciado sob a GPL, talvez porque vocˆ queira criar um e produto comercial ou manter fechado o c´digo n˜o GPL adicionado por outras raz˜es. o a o Ao comprar a lincen¸a comercial, vocˆ n˜o est´ usando o programa MySQL sob GPL c e a a embora o c´digo seja o mesmo. o • Quando vocˆ distribui uma aplica¸˜o n˜o GPL que s´ funciona com o programa MySQL e ca a o e a entrega com o programa MySQL. Este tipo de solu¸˜o ´ considerada mesmo se feita ca e em uma rede. • Quando vocˆ distribui c´pias do programa MySQL sem fornecer o c´digo fonte como e o o exigido sob a licen¸a GPL. c • Quando vocˆ quiser dar suporte adional ao desenvolvimento do banco de dados do e MySQL mesmo se vocˆ n˜o precisar formalmente de uma licen¸a comercial. Comprar e a c o suporte diretamente da MySQL AB ´ outro bom modo de contribuir com o desen- e volvimento do programa MySQL, com vantagens imediatas para vocˆ. Veja Se¸˜o 1.4.1 e ca [Support], P´gina 17. a
  • 53. Cap´ ıtulo 1: Informa¸˜es Gerais co 19 Se vocˆ requisita uma licecn¸a, vocˆ precisar´ de uma para cada instala¸˜o do programa e c e a ca MySQL. Ela cobre qualquer n´mero de CPUs na m´quina, e n˜p h´ nenhum limite artificial u a a a no n´mero de clientes que conectam aom servidor de qualquer modo. u Para licen¸as comercias, ,visite o nosso site web em http://www.mysql.com/products/licensing.html. c Para contrato de suporte, veja http://www.mysql.com/support/. Se vocˆ tiver necessi- e dades especiais ou tiver acesso restrito a Internet, contate a nossa quipe de vendas via email em sales@mysql.com. 1.4.3.2 Usando o Programa MySQL Sem Custo Sob GPL Vocˆ pode utilizar o programa MySQL sem custo sob a GPL se vocˆ concordar as condi¸˜es do e e co GPL. Para detalhes adicionais, incluindo respostas a duvidas comuns sobre a GPL, veja o FAQ gencio da Free Software Foundation em http://www.fsf.org/licenses/gpl-faq.html. Usos comuns da GPL incluem: • Quando vocˆ distribui sua pr´pria aplica¸˜o e o c´digo fonte da MySQL com o seu e o ca o produto. • Quando vocˆ distribui o c´digo fonte do MySQL junto com outros programas que n˜o e o a s˜o ligados ou dependentes do sistema do MySQL para suas funcionalidades mesmo se a vocˆ vender a distribui¸˜o comercialmente. Isto ´ chamado agrega¸˜o na licen¸a GPL. e ca e ca c • Quando vocˆ n˜o est´ distribuindo qualquer parte do sistema do MySQL, vocˆ pode e a a e us´-lo de gra¸a. a c • Quando vocˆ for um Provedos de Servi¸os de Internet (Internet Service Provider - ISP), e c oferecendo hospedagem web com serviodres MySQL para seus clientes. Encorajamos as pessoas a usarem provedroes que possuem suporte ao MySQL, j´ que isto lhes dar´ a a a confian¸a qie seus provedores ter˜o, de fato, os recursos para resolver qualquer problema c a que eles possam experimentar com a instala¸ao do MySQL. Mesmo se um provedor n˜o c˜ a tiver uma licen¸a comercial ara o MySQL Server, seus clientes devem ter acesso de c leitura ao fonte da instala¸˜o do MySQL para que seus clientes verifiquem que ela est´ ca a correta. • Quando vocˆ usa o banco de dados MySQL em conjunto com um servidor web, vocˆ n˜o e e a precisa de uma licen¸a comercial (uma vez que este n˜o ´ um produto distribuido c a e ´ por vocˆ). Isto ´ verdade mesmo se vocˆ executar um servidor web comercial que utilize e e e MySQL Server, pois vocˆ n˜o est´ distribuindo qualquer parte do sistema MySQL. No e a a entanto, neste caso n´s gostariamos que vocˆ adquirisse o suporte ao MySQL pois o o e MySQL est´ ajudandoa sua empresa. a Se o seu uso do banco de dados MySQL n˜o exige uma licen¸a comercial, lhe encorajamos a c a adquirir um suporte da MySQL AB de qualquer forma. Deste modo vocˆ contribui com o e desenvolvimento do MySQL e tamb´m ganha vantegens imediatas. Veja Se¸˜o 1.4.1 [Support], e ca P´gina 17. a Se vocˆ utiliza o bancdo de dados MySQL em um contexto comercial e obtem lucro com e o seu uso, pedimos que vocˆ ajude no desenvolvimento do MySQL adquirindo algum n´ e ivel de suporte. Sentimos que se banco de dados MySQL ajudou os seus neg´cios, ´ razo´vel o e a pedirmos que vocˆ ajude a MySQL AB. (De outra forma, se vocˆ nos pedir suporte, vocˆ n˜o e e e a s´ estar´ usando de gra¸a algo em que colocamos muito trabalhom mas tamb´m pedindo o a c e que lhe forne¸amos suporte de gra¸a tamb´m). c c e
  • 54. 20 MySQL Technical Reference for Version 5.0.0-alpha 1.4.4 Logomarcas e Marcas Registradas da MySQL AB Muitos usu´rios do banco de dados MySQL deseja mostar o logo do golfinho da MySQL AB a em seus web sites,livros ou produtos fechados. Isto ´ bem vindo, mas deve haver anota¸˜es e co indicando que a palavra MySQL e o logo do golfinho da MySQL s˜o marcas registradas da a MySQL AB e s´ podem ser usadas como indicado na nossa pol´ o itica de marcas registradas em http://www.mysql.com/company/trademark.html. 1.4.4.1 O Logo Original do MySQL O logo do golfinho do MySQL foi desenhado pela Finnish advertising agency Priority em 2001. O golfinho foi escolhido como um s´ imbolo para o baco de dados MySQL j´ que ele a ´ esperto, r´pido e um animal ´gil, se esfor´ndo em navegar pelos oceanos de dados. N´s e a a a o tamb´m gostamos de golfinos. e O logo original MySQL s´ podem ser usados pr representates da MySQL AB e aqueles que o possuem um acordo escrito permitndo-os de fazˆ-lo. e 1.4.4.2 Logomarcas da MySQL que Podem Ser Usadas Sem Permiss˜o de Altera¸˜o a ca Projetamos um conjunto de logos especiais de Uso Condicionale que podem se encontra- dos em nosso site web em http://www.mysql.com/press/logos.html e usado em sites web de terceiros sem permiss˜es de escrita da MySQL AB. O uso destas logomarcas n˜o o a ´ s˜o totalmente irrestritas mas, como o nome indica, sujeitos a nossa politica de marcas a registradasque tamb´m est´ dispon´ e a ivel em nosso site. Vocˆ deve ler a pol´ e itica de marcas registradas se plabeja us´-las. As exigˆncias s˜o basicamente as apresentadas aqui: a e a • Use a logomarca que vocˆ preciisa como mostrado no site http://www.mysql.com/. e Vocˆ pode mudar sua escala para servir as suas necessidades, mas n˜o pode alterar e a cores ou o desenho, ou alterar os graficos de forma alguma. • Deixe evidente que vocˆ, e n˜o a MySQL AB, ´ o criado e propriet´rio do site que mostra e a e a a logomarca do MySQL. • N˜o use a logomarca em detrimento ` MySQL AB ou ao valor das marcas registradas da a a MySQL AB. Nos reservamos o direito de revogar o diretiro de uso da marcas registradas da MySQL AB. • Se vocˆ utilizar as maracas em um site da web, fa¸a com que ele contenha um link para e c http://www.mysql.com/. • Se vocˆ utilizar o banco de dados MySQL sob GPL em uma aplica¸˜o, sua aplica¸˜o deve e ca ca ser Open Source deve estar apta a conectar a um servidor MySQL. Contate-nos via e-mail em trademark@mysql.com para saber sobre os nosso acordos espe- ciais que sirvam as suas necessidades.
  • 55. Cap´ ıtulo 1: Informa¸˜es Gerais co 21 1.4.4.3 Quando Vocˆ Precisa de Permiss˜o de Altera¸˜o para Usar e a ca as Logomarcas do MySQL? Vocˆ precisa de permiss˜o escrita da MySQL AB antes de usar as logomarcas do MySQL nos e a seguintes casos: • Quando exibir qualquer logomarca da MySQL AB em qualquer lugar diferente so seu site. • Quando exibir qualquer logomarca da MySQL AB exceta as de Uso Condicional men- cionadas anteiormente em sites ou outro lugar. Devido a raz˜es comerciais e legais monitoramos o so das marcas registradas do MySQL o em proutos, livros e outros itens. Normalmente exigimos um valor para a exibi¸˜o das ca logomarcas da MySQL AB em produtos comerciais, j´ que achamos razo´vel que parte dos a a rendimentos seja retornado para financiar o desenvolvimento do banco de dados MySQL. 1.4.4.4 Logomarcas dos Parceiros da MySQL AB As logomarcas de parceria do MySQL podem ser usados apenas por companhias e pessoas que possuem um acordo de parceria por escrito com a MySQL AB. Parceiras incluem certifica¸˜o ca com treinador ou consultor do MySQL. Para mais informa¸˜es, Se¸˜o 1.3.1.5 [Partnering], co ca P´gina 15. a 1.4.4.5 Usando a Palavra MySQL em Texto Impresso ou Apresenta¸˜o ca A MySQL AB considera bem vindas as referˆncias ao banco de dados MySQL mas deve ser e indicado que a palavra MySQL ´ uma marca registrada da MySQL AB. Por isto, vocˆ deve e e adicionar o simbolo de marca registrada (TM) ao primeiro ou mais proeminente uso da palavra MySQL em um texto e, onde apropriadom indicar que MySQL ´ uma marca reg- e istrada da MySQL AB. Para mais informa¸˜es, veja nossa pol´ co itica de marcas registradas em http://www.mysql.com/company/trademark.html. 1.4.4.6 Usando a Palavra MySQL em Nomes de Companhias e Produtos O uso da palavra MySQL em nomes de produtos ou companias ou em dominios de Internet n˜o ´ permitida sem permiss˜o escrita da MySQL AB. a e a 1.5 Mapa de Desenvolvimento do MySQL Esta se¸˜o fornece uma amostra do mapa de desenvolvimento do MySQL, incluindo prin- ca cipais recursos imlementados ou planejados para o MySQL 4.0, 4.1, 5.0 e 5.1. A seguinte se¸˜o fornece informa¸˜o para cada distribui¸˜o. O planejamento para alguns dos recursos ca ca ca mais requisitados est˜o listada na tabela a seguir. a Feature MySQL version Unions 4.0 Subqueries 4.1
  • 56. 22 MySQL Technical Reference for Version 5.0.0-alpha R-trees 4.1 (para tabelas MyISAM) Stored procedures 5.0 Views 5.0 ou 5.1 Cursors 5.0 Foreign keys 5.1 (3.23 com InnoDB) Triggers 5.1 Full outer join 5.1 Constraints 5.1 1.5.1 MySQL 4.0 in a Nutshell Muito aguardado por nossos usu´rios, o MySQL Server 4.0 agora est´ dispon´ a a ivel em sua vers˜o de produ¸˜o. a ca O MySQL 4.0 est´ dispon´ a ivel para download em http://www.mysql.com/ e nossos sites mirrors. O MySQL tem sido testado por um grande n´mero de usu´rios e est´ em uso em u a a mutios sites. Os principais novos recursos do MySQL Server 4.0 s˜o trabalhados em conjunto com os a usu´rios corporativos e da comunidade, melhorando o programa de banco de dados MySQL a como uma solu¸˜o para miss˜es cr´ ca o iticas e sistemas de bancos de dados de alta carga. Outros novos recursos visam os usu´rios de bancos de dados embutidos. a O MySQL 4.0 foi declarado est´vel para uso em produ¸˜o a partir da vers˜o 4.0.12 em a ca a Mar¸o de 2003. Isto significa que, no futuro, apenas corre¸˜o de erros ser˜o feitas para a c ca a distribui¸˜o da s´rie 4.0 e apenas corre¸˜o de erros cr´ ca e ca iticos ser˜o feitas para a antiga s´rie a e 3.23. Veja Se¸˜o 2.5.2 [Upgrading-from-3.23], P´gina 123. ca a Novos recursos para o MySQL est´ sendo adicionado ao MySQL 4.1 que tamb´m est´ a e a ´ (vers˜o alfa). Veja Se¸˜o 1.5.2 [MySQL 4.1 Nutshell], P´gina 24. disponivel a ca a 1.5.1.1 Recursos Dispon´ iveis no MySQL 4.0 Aumento da velocidade • O MySQL 4.0 tem uma cache de consultas que pode dar uma grande au- mento na velocidade de aplica¸˜es com consutas repetitivas. Veja Se¸˜o 6.9 co ca [Query Cache], P´gina 624. a • A vers˜o 4.0 aumenta a velocidade do MySQL Server em um n´mero e a u a ´ ´reas tais como INSERTs em bloco, buscas em indices empacotados, cria¸˜o ca de ´ indices FULLTEXT, e COUNT(DISTINCT). Introdu¸˜o ao Servidor MySQL Embutido ca • A nova biblioteca do Servidor Ebutido pode ser facilmente usada em aplica¸˜es standalone e embarcadas. O servidor embutido fornce uma co alternativa para o uso do MySQL em um ambiente cliente/servidor. Veja Se¸˜o 1.5.1.2 [Nutshell Embedded MySQL], P´gina 24. ca a Mecanismo de armazenamento InnoDB como padr˜o a • O mecanismo de armazenamento InnoDB ´ oferecido como um recurso e padr˜o do servidor MySQL. Isto significa suporte a transa¸˜es ACID, chaves a co
  • 57. Cap´ ıtulo 1: Informa¸˜es Gerais co 23 estrangeiras com UPDATE/DELETE em cacata e lock de registro agora s˜o recursos padr˜es. Veja Se¸˜o 7.5 [InnoDB], P´gina 642. a o ca a Novas fncionalidades • A melhora das propriedades de busca FULLTEXT do MySQL Server 4.0 habilita indexa¸˜o FULLTEXT de grandes partes de texto com linguagem ca natural e bin´ria de l´gica de busca. Vocˆ pode personalizar o tamanho a o e m´inimo de palavras e definir a sua pr´pria lista de palavras de parasa em o qualquer linguagem humana, habilitando um novo conjunto de aplica¸˜es co ´ a serem construidas no MySQL Server. Veja Se¸˜o 6.8 [Fulltext Search], ca P´gina 618. a Compatibilidade com os padr˜es, portabilidade e migra¸˜o o ca • Recursos para simplificar a migra¸˜o de outros sistemas de banco de dados ca para o MySQL Server incluem TRUNCATE TABLE (como no Oracle) • Muitos usu´rios tamb´m ficar˜o satisfeitos ao perceber que o MySQL a e a Server agora suporta a instru¸˜o UNION, um recurso padr˜o SQL muito ca a esperado. • O MySQL agora pode ser executado nativamente na plataforma Novell NetWare 6.0. Veja Se¸˜o 2.6.8 [Novell NetWare], P´gina 164. ca a Internacionaliza¸˜o ca • Nossos usu´rios alem˜es, austr´ a a iacos e sui¸os notar˜o que o MySQL agora c a suporta um novo conjunto de caracteres, latin1_de, que assegura que a Ordena¸~o em alem~o classificar´ palavras com umlauts na mesma ordem ca a a das agendas telefˆnicas alem˜s. o a Aprimoramento da Usabilidade No porcesso de constru¸˜o de recursos para novos usu´rios, n˜o esquecemos os ca a a pedidos de nossa leal comunidade de usu´rios. a • A maioria dos parˆmetros mysqld (op¸˜es de inicializa¸˜o) agora podem a co ca ser definidas se finalizar o servidor. Isto ´ um recurso conveniente para e Administradores de Bancos de Dados (DBAs). Veja Se¸˜o 5.5.6 [SET OP- ca TION], P´gina 461. a • Instru¸˜es DELETE e UPDATE multi-tabelas foram adicionadas. co • Foi adicionado suporte ao mecanismo de armazenamento MyISAM para link simb´lico no n´ de tabela (e n˜o apenas a n´ de banco de dados como o ivel a ivel antes) e para habilitar o tratamento de links simb´licos no Windows por o padr˜o. a • SQL_CALC_FOUND_ROWS e FOUND_ROWS() s˜o novas fun¸˜es que tornaram a co poss´ encontrar o n´meros de linhas que uma consulta SELECT que inclui ivel u uma cl´usula LIMIT teria retornado se a cl´usula n˜o fosse utilizada. a a a A se¸˜o de novidades deste manual inclui uma lista mais aprofundada dos recursos. Veja ca Se¸˜o C.3 [News-4.0.x], P´gina 957. ca a
  • 58. 24 MySQL Technical Reference for Version 5.0.0-alpha 1.5.1.2 Servidor Embutido MySQL libmysqld faz o MySQL Server adequado para uma grande ´rea de aplica¸˜es. Usando a a co biblioteca do servidor MySQL embutido, pode embarcar o MySQL Server em v´rios aplica- a tivos e dispositivos eletrˆnicos, onde o usu´rio final n˜o tˆm conhecimento de possuir um o a a e banco de dados b´sico. O servidor MySQL embutido ´ ideal para uso nos bastidores em a e aplica¸˜es de Internet, quiosques p´blicos, respons´vel por unidades de combina¸˜o hard- co u a ca ware/software, servidores Internet de alta performance, banco de dados de auto-conten¸˜o ca distribu´ idos em CDROM, e assim por diante Muitos usu´rios da libmysqld se benficiar˜o da iLicen¸a Dual do MySQL. Para aqueles a a c que n˜o desejam ser limitar pela GPL, o software ´ tambem est´ dispon´ sob uma licen¸a a e a ivel c comercial. A biblioteca embutida do MySQL tamb´m usa a mesma interface que a biblioteca e do cliente normal, sendo ent˜o conveniente e f´cil de usar. Veja Se¸˜o 12.1.15 [libmysqld], a a ca P´gina 860. a 1.5.2 MySQL 4.1 in a Nutshell MySQL Server 4.0 prepara a cria¸˜o de novos recursos como subqueries e Unicode (imple- ca mentado na vers˜o 4.1) e o funcionamento de stored procedures do SQL-99 est´ sendo feito a a para a vers˜o 5.0. Estes recursos est˜o no topo da lista de recursos desejados de muitos de a a nossos clientes. Com estas adi¸˜es, os cr´ co iticos do MySQL Database Server devem ser mais imaginativos que nunca para apontar as deficiˆncias do MySQL Database Management System. J´ conhecido e a por sua estabilidadem velocidade e facilidade de uso, o MySQL Server estar´ apto a atender a as necessidades de v´rios compradores exigentes. a 1.5.2.1 Recursos Dispon´ iveis no MySQL 4.1 Os recursos listados nesta se¸˜o est˜o implementados no MySQL 4.1. Outros poucos recur- ca a sos est˜o planejados para o MySQL 4.1. Veja Se¸˜o 1.6.1 [TODO MySQL 4.1], P´gina 27. a ca a A maioria dos novos recursos em codifica¸˜o, como stored procedures, estar˜o dispon´ ca a iveis no MySQL 5.0. Veja Se¸˜o 1.6.2 [TODO MySQL 5.0], P´gina 27. ca a Suporte a subqueries e tabelas derivadas • Uma subquery ´ uma instru¸˜o SELECT aninhada dentro de outras in- e ca stru¸˜es. Uma tabela dericada (unnamed view) ´ uma subquery na cl´usula co e a FROM de outras instru¸˜es. Veja Se¸˜o 6.4.2 [Subqueries], P´gina 569. co ca a Aumento na velocidade • Protocols bin´rios mais r´pidos com instru¸˜es preparadas e parˆmetros a a co a de liga¸˜o. Veja Se¸˜o 12.1.4 [C API Prepared statements], P´gina 824. ca ca a • Indexa¸˜o BTREE agora ´ suportado por tabelas HEAP, aumentando de forma ca e significante o tempo de resposta para busca que n˜o s˜o exatas. a a
  • 59. Cap´ ıtulo 1: Informa¸˜es Gerais co 25 Nova funcionalidade • CREATE TABLE tabela1 LIKE tabela2 lhe permite criar uma nova tabela com a estrutura exatamente igual a de uma tabela existente, usando um unico comando. ´ • Suporte aos tipos espaciais OpenGIS (dados geogr´ficos). Veja Cap´ a “ptexi tulo 10 [Spatial extensions in MySQL], P´gina 730. a • A replica¸˜o pode ser feita sobre conex˜o SSL. ca a Compatibilidade aos padr˜es, portabilidade e migra¸˜o o ca • O novo protocolo cliente/servidor adiciona a possibilidade de se passar m´ltiplos avisos ao cliente, no lugar se um unico resultado. Isto faz com u ´ que o trabalho como uma grande carga de dados seja muito mais f´cil a de rastrear. SHOW WARNINGS exibe avisos para o ultimo comando. Veja ´ Se¸˜o 4.6.8.9 [SHOW WARNINGS], P´gina 323. ca a Internacionaliza¸˜o ca • Para suportar nossa base de usu´rio sempre em expans˜o usando linguagens a a locais nas aplica¸˜es, o programa MySQL agora oferece suporte Unicode co extensivo por meio dos conjunto de caracteres utf8 e ucs2. • Os conjuntos de caracteres agora podem ser definidos por colunas, tabelas e banco de dados. Isto permite um alto grau de flexibilidade no desenho das aplica¸˜es, particularmente para sites-web multi-linguagens. co • Para documenta¸˜o sobre este suporte a conjunto de caracters aprimorados, ca veja Cap´ “ptexi tulo 9 [Charset], P´gina 707. a Aprimoramento da usabilidade • Em resposta a demanda popular, adicionamos um comando HELP com base no servidor que pode ser usado para conseguir ajuda para coman- dos MySQL. A vantagem de se ter esta informa¸˜o no lado do servidor ´ ca e que a informa¸˜o ´ sempre aplic´vel para aquela vers˜o do servidor em par- ca e a a ticular. Como esta informa¸˜o est´ dispon´ executando uma instru¸˜o ca a ivel ca SQL, outros clientes tamb´m poder˜o ser escritos para acess´-la. Por ex- e a a emplo, o cliente mysql de linha de comando foi modificado para ter esta capacidade. • No novo protocolo cliente/servidor, v´rias instru¸˜es podem ser feitas a co com uma unica chamada. Veja Se¸˜o 12.1.8 [C API multiple queries], ´ ca P´gina 851. a • O novo protocolo cliente/servidor tamb´m suporta retorno de v´rios resul- e a tados. Isto pode ocorrer como resultado de enviar v´rias instru¸˜es, por a co exemplo (Veja o item anterior). • Uma nova sintaxe INSERT ... ON DUPLICATE KEY UPDATE ... tem sido im- plementada. Isto lhe permite executar um UPDATE em um registro existente se o um INSERT criasse uma chave (´ indice) prim´ria (PRIMARY) ou unica a ´ (UNIQUE) (index) duplicada. Veja Se¸˜o 6.4.3 [INSERT], P´gina 578. ca a • Projetamos uma nova fun¸˜o de agrupamento GROUP_CONCAT(), adicio- ca nando a capacidade de concatenar colunas de registros agrupados em uma
  • 60. 26 MySQL Technical Reference for Version 5.0.0-alpha unica string de resultado, o que ´ extremamente util. Veja Se¸˜o 6.3.7 ´ e ´ ca [Group by functions and modifiers], P´gina 555. a A se¸˜o de novidades neste manual incluem uma lista mais completa de recursos. Veja ca Se¸˜o C.2 [Novidades na vers˜o 4.1.x], P´gina 948. ca a a 1.5.2.2 Stepwise Rollout Novos recursos est˜o sendo adicionados ao MySQL 4.1. A vers˜o Alfa j´ st´ dispon´ para a a a a ivel download. Veja Se¸˜o 1.5.2.3 [Nutshell Ready for Immediate Use], P´gina 26. ca a O conjunto de recursos que est˜o sendo adicionados a vers˜o 4.1 est˜o, na maioria, cor- a a a rigidos. Desenvolvimento adicional j´ est´ em andamento na vers˜o 5.0. O MySQL 4.1 a a a passam pelos passos de Alfa (tempo no qual os novos recursos ainda podem ser adiona- dos/alterados), Beta (quando j´ implementamos todos os recursos e apenas corre¸˜es de a co erros s˜o realizados0) e Gamma (indicando que ima distribui¸˜o de produ¸˜o est´ quase a ca ca a pronta). No fim deste processo, o MySQL 4.1 se tornar´ o nova distribui¸˜o de produ¸˜o). a ca ca 1.5.2.3 Pronto para Uso em Desenvolvimento Imediato O MySQL 4.1 est´ atualmente no est´gio alfa e os bin´rios est˜o dispon´ a a a a iveis para download em http://www.mysql.com/downloads/mysql-4.1.html. Todas as distribui¸˜es bin´rias co a passaram por nossos extensivos teste sem nenhum erro na plataforma em que testamos. Veja Se¸˜o C.2 [Novidades na vers˜o 4.1], P´gina 948. ca a a Para aqueles que desejam usar o fonte mais recente do desenvolvimento do MySQL 4.1, deix- amos nosso reposit´rio do BitKeeper publicamente dispon´ o ivel. Veja Se¸˜o 2.3.4 [Installing ca source tree], P´gina 100. a 1.5.3 MySQL 5.0, A Pr´xima Distribui¸˜o de Desenvolvimento o ca O novo desenvolvimento para o MySQL est´ focado na distribui¸˜o 5.0, comrecursos como a ca Stored Procedures entre outros. Veja Se¸˜o 1.6.2 [TODO MySQL 5.0], P´gina 27. ca a Para aqueles que desejam dar uma olhada no desenvolvimento do MySQL, deixamos o nosso reposit´rioo do BitKeeper para o MySQL vers˜o 5.0 dispon´ publicamente. Veja o a ivel Se¸˜o 2.3.4 [Instalando a ´rvore fonte], P´gina 100. ca a a 1.6 MySQL e o Futuro (o TODO) Esta se¸˜o lista os recursos que planejamos impementar no MySQL Server. As listas s˜o ca a apresentadas por vers˜o, e os itens est˜o aproximadamente na ordem em que ser˜o feitos. a a a Nota: Se vocˆ ´ um usu´rio corporativo com uma necessidade urgente de um recurso par- ee a ticular, por favor, contate sales@mysql.com para conversarmos sobre patroc´ inio. Financia- mento feito por uma ou mais companhias nos permite alocar recursos adicionais para aquele prop´sito espec´ o ifico. Um exemplo de um recurso patrocinado no passado ´ a replica¸˜o. e ca
  • 61. Cap´ ıtulo 1: Informa¸˜es Gerais co 27 1.6.1 Novos Recursos Planejados Para a Vers˜o 4.1 a Os recursos abaixo ainda n˜o est˜o implementados no MySQL 4.1, mass est˜o planejados a a a para implementa¸˜o antes que o MySQL 4.1 v´ para a fase beta. Para uma lista do que j´ ca a a est´ feito no MySQL 4.1, veja Se¸˜o 1.5.2.1 [Nutshell 4.1 features], P´gina 24. a ca a • Suporte OpenSSL est´vel (o MySQL 4.0 tem suporte rudimentar ao OpenSSL, n˜o a a testado 100%). • Mais teste de instru¸˜es preparadas co • Mais testes de m´ltiplos conjunto de caracteres para uma tabela. u 1.6.2 Novos Recursos Planejados Para a Vers˜o 5.0 a Os seguintes recursos est˜o planejados para inclus˜o no MySQL 5.0. Note que como pos- a a suimos diversos desenvolvedores que est˜o trabalhando em diferentes projetos, haver˜o a a tamb´m muitos recursos adicionais. H´ tamb´m um pequena chance qie alguns destes e a e recursos sejam adicionados ao MySQL 4.1. Para uma lista do que j´ est´ feito no MySQL a a 4.1, veja Se¸˜o 1.5.2.1 [Nutshell 4.1 features], P´gina 24. ca a Para aqueles que desejam dar uma olhada nas novidades do desenvolvimento do MySQL, deixamos nosso reposit´rio BitKeeper para o MySQL vers˜o 5.0 publicamente dispon´ o a ivel. Veja Se¸˜o 2.3.4 [Instalando a ´rvore fonte], P´gina 100. ca a a Stored Procedures • Stored procedures est˜o sendo implementadas atualmente. Este esfor¸o ´ a c e baseado no SQL-99, o que tem m sintaxe b´sica similar (mas n˜o idˆntica) a a a e do Oracle PL/SQL. N´s tamb´m implementaremos o framework do SQL-99 o e para enganchar em linguagens externas e (onde poss´ ivel) compatibilidade com p.ex. PL/SQL e T-SQL. Nova funcionalidade • Suporte a cursores elementares. • A habilidade de especificar explicitamente para tabelas MyISAM que um ´ indice deve ser criado como um ´ indice RTREE. Na vers˜o 4.1, ´ a indices RTREE s˜o usados internamente para dados geom´tricos (tipos de dados GIS), mas a e n˜o podem ser criados no pedido. a • Registros de tamanhos dinˆmicas para tabelas HEAP. a Compatibilidade com o padr˜o, portabilidade e migra¸˜o a ca • Adiciona suporte real a VARCHAR (tamanho de colunas maiores que 255, e sem corte de espa¸os em branco extras). (J´ existe suporte para isto nos c a mecanismos de armazenamento do MyISAM, mas ainda n˜o est´ dispon´ a a ivel ´ de usu´rio). a nivel a Aumento na velocidade • SHOW COLUMNS FROM nome_tabela (usado pelo cliente mysql para permitir expans˜es de nomes de colunas) n˜o deve abrir a tabela, apenas o arquivo o a de defini¸˜o. ISto exigir´ menos mem´ria e ser´ muito mais r´pido. ca a o a a
  • 62. 28 MySQL Technical Reference for Version 5.0.0-alpha • Permite que o DELETE em tabelas MyISAM usem a cache de registros. Para fazer isto, precisamos atualizar a thread da cache de registro quando atu- alizarmos os arquivos ‘.MYD’. • Melhores tabes em mem´ria (HEAP): o • Registro de tamanhos dinˆmoicos. a • Tratamento de registro mais r´pido (menos c´pia). a o Internacionaliza¸˜o ca • Ap usar SET CHARACTER SET devemos traduzir toda a consulta de uma vez e n˜o apenas as strings. Isto permitir´ que os usu´rios usem caracteres a a a traduzidos nos nomes de banco de dados, tabelas e colunas. Aprimoramento da usabilidade • Resolver a quest˜o de RENAME TABLE em uma tabela usada em uma tabela a MERGE ativa, o que possivelmente corrompe a tabela. 1.6.3 Novos Recursos Planejados Para a Vers˜o 5.1 a Novas funcionalidades • Suporte FOREIGN KEY para todos os tipos de tabelas. • Restri¸˜es a n´ de colunas. co ivel • Replica¸˜o seguro a falhas. ca • Backup online com baixa queda de desempenho. O backup online tornar´ a mais f´cil adicionar um novo slave de replica¸˜o sem desligar o master. a ca Aumento de velocidade • Novo formato dos arquivos de defini¸˜o e tabelas baseados em texto (ar- ca quivos ‘.frm’) e uma cache de tabelas para a defini¸˜o de tabelas. Isto nos ca permitir´ fazer consultas mais r´pidas da estruturas de tabela e dar um a a suporte a chaves estrangeiras mais eficiente. • Otimizar o tipo BIT para gastar 1 bit (agora BIT gasta 1 byte; e ´ tratado e como um sinˆnimo para TINYINT.) o Aprimoramento da usabilidade • Adicionar op¸˜es ao protocolo cliente/servidor para obter notas de pro- co gresso para longos comandos em execu¸˜o. ca • Implementar RENAME DATABASE. Para tornar isto seguro para todos os mecanismos de armazenamento, ele deve funcionar como a seguir: • Cria um novo banco de dados. • Para cada tabelas, renomeie-a para outro banco de dados, o qual faze- mos com o comando RENAME. • Apagar o banco de dados antigo. • Nova altera¸˜o da interface de arquivo interno. Isto far´ todos os manip- ca a uladores de arquivos mais gerais e tornar´ mais f´cil adicionar extens˜es a a o tipo RAID.
  • 63. Cap´ ıtulo 1: Informa¸˜es Gerais co 29 1.6.4 Novos Recursos Planejados Para a Vers˜o em um Futuro a Pr´ximo o Novas funcionalidade • Comando como do Oracle CONNECT BY PRIOR ... para estruturas de busca tipo ´rvore (hier´rquica) a a • Adicionar todos os tipos que faltam do SQL-92 e ODBC 3.0. • Adicionar SUM(DISTINCT). • INSERT SQL_CONCURRENT e mysqld --concurrent-insert para fazer uma inser¸˜o concorrente no fim do arquivo se o arquivo tiver lock de leitura. ca • Permitir a atualiza¸˜o de vari´veis nas instru¸˜es UPDATE. Por exemplo: ca a co UPDATE TABLE foo SET @a=a+b,a=@a, b=@a+c. • Alterar quando as vari´veis de usu´rios s˜o atualizadas e assim pode se us´- a a a a las com GROUP BY, como no exemplo a seguir: SELECT id, @a:=COUNT(*), SUM(sum_col)/@a FROM nome_tabela GROUP BY id. • Adicionar a op¸˜o IMAGE a LOAD DATA INFILE para n˜o atualizar campos ca a TIMESTAMP e AUTO_INCREMENT. • Adicionar a sintaxe LOAD DATA INFILE ... UPDATE que funciona assim: • Para tabelas com chaves prim´rias, se o registro de entrada cont´m um a e valor de chave prim´ria, linhas existentes correspondendo `s chaves a a prim´rias s˜o atualizadas para o restante das colunas de entrada. No a a entanto, colunas faltosas na inser¸˜o dos registros de entradas n˜o ca a s˜o alteradas. a • Para tabelas com chaves prim´rias, se um registro de entrada n˜o a a cont´m um valor de chave prim´ria ou estr´ faltando alguma parte da e a a chave, o registro ´ tratado como um LOAD DATA INFILE ... REPLACE e INTO. • Fazer com que LOAD DATA INFILE entenda a sintaxe do tipo: LOAD DATA INFILE ’file_name.txt’ INTO TABLE tbl_name TEXT_FIELDS (text_field1, text_field2, text_field3) SET table_field1=CONCAT(text_field1, text_field2), table_field3=23 IGNORE text_field3 Isto pode ser usado para saltar colunas extras no arquivo texto, ou atualizar colunas baseadas nas express˜es dos dados lidos. o • Novas fun¸˜es para tyrabalhar com tipos de colunas SET: co • ADD_TO_SET(valor,conjunto) • REMOVE_FROM_SET(valor,conjunto) • Se vocˆ abortar o mysql no meio de uma consulta, vocˆ deve abrir outra e e conex˜o e matar a consulta antiga em execu¸˜o. Alternativamente, deve a ca ser feita um tentativa de detec¸˜o deste problema no servidor. ca • Adicione um interface do mecanismo de armazenamento para informa¸˜es co da tabela assim que vocˆ puder us´-la como uma tabela de sistema. Isto se- e a ria um pouco mais lento se vocˆ pedisse informa¸˜es sobre todas as tabelas, e co
  • 64. 30 MySQL Technical Reference for Version 5.0.0-alpha mas muito flex´ ivel. SHOW INFO FROM tbl_name para informa¸˜es b´sicas co a das tabelas deve ser implementado. • Permite SELECT a FROM crash_me LEFT JOIN crash_me2 USING (a); neste caso ´ considerado que a vem da tabela crash_me. e • Op¸˜es DELETE e REPLACE para a instru¸˜o UPDATE (isto deletar´ registros co ca a quando se tiver um erro de chave duplicada durante a atualiza¸˜o). ca • Altera o formato de DATETIME para armazenar fra¸˜es de segundo. co • Possibilitar o uso da nova biblioteca regexp GNU em vez da atual (a bib- lioteca GNU deve ser muito mais r´pida que a antiga). a Compatibilidade com os padr˜es, portabilidade e migra¸˜o o ca • N˜o adicionar valores DEFAULT autom´ticos as colunas. Enviar um erro ao a a usar um INSERT que n˜o contenha uma coluna que n˜o tenha um DEFAULT. a a • Adicionar as fun¸˜es de agrupamento ANY(), EVERY() e SOME(). No padr˜o co a SQL isto s´ funciona em colunas booleanas, mas podemos extendˆ-las para o e funcionar em qualquer coluna/express˜o tratando valores 0 como FALSE a e valores diferentes de 0 como TRUE. • Corrigir para que o tipo de MAX(coluna) seja o mesmo do tipo da coluna: mysql> CREATE TABLE t1 (a DATE); mysql> INSERT INTO t1 VALUES (NOW()); mysql> CREATE TABLE t2 SELECT MAX(a) FROM t1; mysql> SHOW COLUMNS FROM t2; Aumento de velocidade • N˜o permitir mais que um n´mero definido de threads fa¸am a recupera¸˜o a u c ca do MyISAM ao mesmo tempo. • Alterar INSERT ... SELECT para usar inser¸˜es co concorrentes opcionalmente. • Adicionar uma op¸˜o para descarregar paginas de chaves para tabelas com ca delayed keys se elas n˜o forem usados por um tempo. a • Permitir joins em partes de chaves (otimiza¸˜o). ca • Adicionar simula¸˜o de pread()/pwrite() no Windows para permitir ca inser¸˜es concorrentes. co • Um analizador de arquivos de log que possam analizar informa¸˜es sobre co quais tabelas s˜o usadas com mais frequˆncia, a frequˆncia com que joins a e e multi-tables s˜o executados, etc. Isto deve ajudar os usu´rios a identi- a a ficar ´reas ou projetos de tabelas que podiam ser otimizados para executar a consultas muito mais eficientes. Internacionaliza¸˜o ca Aprimoramentos de usabilidade • Retorna os tipos dos campos originais ao se fazer SELECT MIN(coluna) ... GROUP BY. • Possibilita especificar long_query_time com uma granularidade em mi- crosegundos.
  • 65. Cap´ ıtulo 1: Informa¸˜es Gerais co 31 • Ligue o c´digo myisampack no servidor assim ele poder´ realizar opera¸˜es o a co PACK e COMPRESS. • Adicionar uma cache de chaves tempor´ria durante INSERT/DELETE/UPDATE a para podermos fazer um recupera¸˜o se o ´ ca indice ficar cheio. • Se vocˆ realizar um ALTER TABLE em uma tabela que ´ ligada simbolica- e e mente a outro disco, crie tabelas tenpor´rias neste disco. a • Implementar um tipo DATE/DATETIME que trate as informa¸˜es de fusos co hor´rios de forma apropriada e assim lidar com datas em diferentes fusos a hor´rios ser´ mais f´cil. a a a • Corrigir o configure para se poder compilar todas as bibliotecas (como no MyISAM) sem threads. • Permitir vari´veis SQL em LIMIT, como em LIMIT @a,@b. a ´ autom´tica do mysql para um navegador web. • Saida a • LOCK DATABASES (com diversas op¸˜es). co • Muito mais vari´veis para SHOW STATUS. Leitura e atualiza¸˜o de reg- a ca istros. Selects em 1 tabela e select com joins. N´mero de tabelas na select. u N´mero de consultas ORDER BY e GROUP BY. u • mysqladmin copy database novo-banco_dados; exige que o comando COPY seja adicionado ao mysqld. • Lista de processos deve mostar o n´mero de consultas/threads. u • SHOW HOSTS para xibir informa¸˜es sobre a cache de nome de m´quina. co a • Alterar o nome de tabelas de string vazias para NULL para colunas calcu- ladas. • N˜o usar Item_copy_string em valores num´ricos para evitar a convers˜o a e a number->string->number no casos de: SELECT COUNT(*)*(id+0) FROM nome_tabela GROUP BY id • Alterar aqueles ALTER TABLE que n˜o abortam clientes que executam a INSERT DELAYED. • Colunas referˆnciadas em uma cl´usula UPDATE ir˜o conter os valores anti- e a a gos antes da atualiza¸˜o iniciar. ca Novos sistemas operacioais. • Portar os clientes MySQL para LynxOS. 1.6.5 Novos Recursos Planejados Para a Vers˜o em um Futuro a a M´dio Prazo e • Implementar fun¸˜o: get_changed_tables(timeout,table1,table2,...) ca • 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 • Tornar o c´digo de timestamp autom´tico melhor. Adicionar timestamps para o log o a de atualiza¸˜es com SET TIMESTAMP=#; co • Usar mutex de leitura/escrita em alguns lugares para obter maior velocidade.
  • 66. 32 MySQL Technical Reference for Version 5.0.0-alpha • Views simples (inicialmente em uma tabela, depois em qualquer express˜o). Veja a Se¸˜o 1.8.4.6 [ANSI diff Views], P´gina 51. ca a • Fechar algumas tabelas automaticamente se uma tabela, tabela tempor´ria ou arquivos a tempor´rios obtiverem o erro 23 (n˜o pode abrir arquivos suficientes). a a • Melhor propaga¸˜o de constantes. Quando uma ocorrˆncia de nome_col=n ´ encontrada ca e e em uma express˜o, para algumas constantes n, substitua outras ocorrˆncias de nome_ a e col dentro da express˜o por n. Atualmente, isto ´ feito somente para alguns casos a e 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 constante s˜o otimizadas. a • 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 • MINUS, INTERSECT e FULL OUTER JOIN. (Atualmente UNION [na 4.0] e LEFT OUTER JOIN s˜o suportados). a • 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 mysqld_safe: de acordo com o FSSTND (que o co Debian tenta seguir) arquivos PID dever ir em ‘/var/run/<progname>.pid’ e arquivos de log em ‘/var/log’. Seria ´timo se vocˆ puder colocar o diret´rio de dados na o e o primeira declara¸˜o de "pidfile" e "log", para que a coloca¸˜o destes arquivos possa ca ca ser alterada com uma simples instru¸˜o. ca • Permitir um cliente requisitar log. • Adicionar uso de zlib() a LOAD DATA INFILE, para permitir que as instru¸˜es leiam co arquivos compactados com gzip. • Corrigir ordena¸˜o e agrupamento de colunas BLOB (parcialmente resolvida agora). ca • Alterar para o uso de sem´foros quando contar threads. Devemos primeiro implementar a uma biblioteca de sem´foros para a MIT-pthreads. a • 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 iveis deadlocks que essa altera¸˜o ir´ acarretar. ca a O tempo ´ fornecido de acordo com a quantidade de trabalho, e n˜o tempo real. e a
  • 67. Cap´ ıtulo 1: Informa¸˜es Gerais co 33 1.6.6 Novos Recursos que N˜o Planejamos Fazer a • Nada; Planejamos ser totalmente compat´ iveis com o ANSI 92 / ANSI 99. 1.7 Fontes de Informa¸˜es do MySQL co 1.7.1 Listas de Discuss˜o MySQL a Esta se¸˜o introduz a lista de deiscuss˜o do MySQL e d´ algumas explica¸˜es sobre como a ca a a co lista deve ser utilizada. Quando vocˆ se inscreve na lista de discuss˜o, vocˆ receber´, como e a e a mensagens de email, tudo o que ´ enviado para a lista. Vocˆ tamb´m poder´ enviar suas e e e a pr´prias d´vidas e respostas para a lista. o u 1.7.1.1 As Listas de Discuss˜o do MySQL a Para se inscrever ou cancelar a inscri¸˜o de qualquer uma das listas de email descritas nesta ca se¸˜o, visite http://lists.mysql.com/. Por favor, n˜o envie mensagem sobre inscri¸˜o ca a ca ´ ou cancelamento para qualquer das listas de emasil, porque tais mensagens s˜o distribuidas a automaticamente para milhares de outros usu´rios. a Seu site local pode ter muitas inscri¸˜es para uma lista de email do MySQL. Se sim, o site co pode ter uma lista de email local, assim as mensagens enviadas para lists.mysql.com do seu site s˜o propagadas para a lista local. Nestes casos, por favor, contate seu administrador a de sistema para adicionado ou excluido da lista local do MySQL. Se vocˆ quiser que as mensagens da lista de discuss˜o sejam enceminhadas para uma caixa e a de correio separada no seu programa de emails, configure um filtro com base nos cabe¸alhos c das mensagens. Vocˆ pode tamb´m usar os cabe¸alhos List-ID: ou Entregar-Para: para e e c identificar suas mensagens. Existe tamb´m as seguintes listas de discuss˜o sobre MySQL atualmente: e a announce Esta ´ para anuncio de novas vers˜es do MySQL e programas relacionados. e o Esta ´ uma lista com baixo volume na qual todos usuarios do MySQL deveriam e se inscrever. mysql A principal lista para discuss˜es MySQL em geral. Note que alguns t´picos s˜o o o a mais bem discutidos em listas mais especializadas. Se vocˆ enviar para a lista e errada vocˆ pode n˜o obter resposta. e a mysql-digest A lista mysql na forma resumida. Isto significa que vocˆ ir´ receber todas e a mensagens individuais, enviadas na forma de uma grande mensagem uma unica ´ vez ao dia. bugs Esta lista s´ ser´ do seu interesse se vocˆ quiser ficar informado sobre assuntos o a e relatados desde a ultima distribui¸˜o do MySQL ou se vocˆ quiser estar ativa- ´ ca e mente envolvido no processo de busca e corre¸˜o de erros. Veja Se¸˜o 1.7.1.3 ca ca [Relat´rio de erros], P´gina 36. o a
  • 68. 34 MySQL Technical Reference for Version 5.0.0-alpha bugs-digest Uma vers˜o resumida da lista bugs. a internals Uma lista para pessoas que trabalham no c´digo do MySQL. Nesta lista pode-se o discutir desenvolvimento do MySQL e pos-patches. internals Uma vers˜o resumida da lista internals. a mysqldoc Esta lista ´ para pessoas que trabalham na documenta¸˜o do MySQL: pessoas e ca da MySQL AB, tradutores e outros membros da comunidade. mysqldoc-digest Esta ´ uma vers˜o resumida da lista mysqldoc. e a benchmarks Esta lista ´ para qualquer um interessado em assuntos de desempenho. Dis- e cuss˜es concentradas em desempenho de banco de dados (n˜o limitado ao o a MySQL) mas tamb´m inclue categorias ,com desempenho do kernel, sistema e de arquivos, sistema de disco e outros. benchmarks Esta ´ uma vers˜o resumida da lista benchmarks. e a packagers Esta lista ´ para discuss˜es sobre empacotamento e distribui¸˜o do MySQL. e o ca Este ´ o f´rum usado pela pessoas que mant´m a distribui¸˜o para troca de e o e ca id´ias de pacotes do MySQL e para assegurar que o MySQL esteja o mais e parecido poss´ em todas as plataformas e sistemas operacionais suportados. ivel packagers-digest Esta ´ uma vers˜o resumida da lista packagers. e a java ´ Discuss˜o sobre o servidor MySQL e Java. E mais usada para discuss˜es sobre a o o driver JDBC, incluindo MySQL Connector/J. java-digest Uma vers˜o resumida da lista java. a win32 Esta ´ a lista para todos os t´picos relacionados ao MySQL em sistemas opera- e o cionais Microsoft, como o Win95, Win98, NT e Win2000. win32-digest Uma vers˜o resumida da lista win32. a myodbc Lista para todos os t´picos relacionados a conectividade do MySQL com ODBC. o myodbc-digest Uma vers˜o resumida da lista myodbc. a mysqlcc Esta lista ´ sobre todos os t´picos relativos ao cliente gr´fico MySQL Control e o a Center. mysqlcc-digest Esta lista ´ uma vers˜o resumida da lista mysqlcc. e a
  • 69. Cap´ ıtulo 1: Informa¸˜es Gerais co 35 plusplus Lista sobre todos os t´picos relacionados ` programa¸˜o da API C++ para o o a ca MySQL. plusplus-digest Uma vers˜o resumida da lista plusplus. a msql-mysql-modules Lista sobre o Suporte MySQL no Perl com o msql-mysql-modules que ´ e chamado DBD-mysql. msql-mysql-modules-digest Lista resumida sobre a vers˜o do msql-mysql-modules. a Se vocˆ n˜o obtiver uma resposta para suas quest˜es na lista de mensagens do MySQL, uma e a o op¸˜o ´ pagar pelo suporte da MySQL AB, que ir´ colocar vocˆ em contato direto com ca e a e desenvolvedores MySQL. Veja Se¸˜o 1.4.1 [Suporte], P´gina 17. ca a A seguinte tabela mostra algumas listas de mensagens sobre o MySQL que utilizam linguas diferentes do Inglˆs. Perceba que elas n˜o s˜o operadas pela MySQL AB, portanto, n˜o e a a 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. mysql-de-request@lists.4t2.com Lista de mensagens alem~. a Envie subscribe mysql-de your@email.address para esta lista. Vocˆ pode encontrar informa¸˜es sobre esta lista de mensagens em e co http://www.4t2.com/mysql. mysql-br-request@listas.linkway.com.br Lista de mensagens em portuguˆs Envie subscribe mysql-br your@email.address para esta lista. e mysql-alta@elistas.net Lista de mensagens espanhola. Envie subscribe mysql your@email.address para esta lista. 1.7.1.2 Fazendo perguntas ou relatando erros Antes de enviar um relato de erro ou uma quest˜o, por favor fa¸a o seguinte: a c • Comece pesquisando o manual MySQL online em: http://www.mysql.com/doc/ N´s tentaremos manter o manual atualizado, frequentemente atualizando-o com o solu¸˜es para novos problemas encontrados! O apˆndice de hist´rico de mudan¸as co e o c ´ a e ´ que (http://www.mysql.com/doc/en/News.html) pode ser util j´ que ´ bem possivel uma vers˜o mais nova ja tenha a solu¸˜o para o seu problema. a ca • Procure no banco de dados de bugs em http://bugs.mysql.com/ para ver se o erro j´ foi relatado/resolvido. a • Pesquise os arquivos das listas de mensagens MySQL: http://lists.mysql.com/
  • 70. 36 MySQL Technical Reference for Version 5.0.0-alpha • Vocˆ pode tamb´m usar a p´gina http://www.mysql.com/search.html para e e a pesquisar todas as p´ginas Web (incluindo o manual) que est˜o localizados em a a http://www.mysql.com/. Se vocˆ n˜o puder encontrar uma resposta no manual ou nos arquivos, confira com seu e a expert em MySQL local. Se vocˆ continua n˜o encontrando uma resposta para sua quest˜o, e a a v´ em frente e leia a pr´xima se¸˜o para saber como enviar email para lista de email do a o ca MySQL. 1.7.1.3 Como relatar erros ou problemas Nosso banco de dados de bugs ´ publico e pode ser pesquisado por qualquer um em e http://bugs.mysql.com/. Se vocˆ logar no sistema, vocˆ poder´ entrar novos relat´rios. e e a o Escrever um bom relat´rio de erro exige paciˆncia, e fazˆ-lo de forma apropriada economiza o e e tempo para n´s e para vocˆ. Um bom relat´rio de erros contendo um teste de caso para o o e 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 a escrever seu relat´rio corretamente para que vocˆ n˜o perca seu tempo fazendo coisas que o e a n˜o ir˜o ajudar-nos muito ou nada. a a N´s encorajamos todo mundo a usar o script mysqlbug para gerar um relato de erros (ou um o relato sobre qualquer problema), se poss´ivel. mysqlbug pode ser encontrado no diret´rio o ‘scripts’ na distribui¸˜o fonte, ou, para uma distribui¸˜o bin´ria, no diret´rio ‘bin’ no ca ca a o diret´rio de instala¸˜o do MySQL. Se vocˆ n˜o puder utilizar o mysqlbug (por exemplo, o ca e a se vocˆ o estiver executando no Windows), ´ ainda de vital importˆncia que vocˆ incluia e e a e todas as informa¸˜es necess´rias listadas nesta se¸˜o (o mais importante ´ uma descri¸˜o co a ca e ca do sistema operacional e a vers˜o do MySQL). a O script mysqlbug lhe ajudar´ a gerar um relat´rio determinando muitas das seguintes a o informa¸˜es automaticamente, mas se alguma coisa importante estiver faltando, por favor co forne¸a-o junto de sua mensagem! Por favor leita esta se¸˜o com cuidado e tenha certeza c ca que todas as informa¸˜es descritas aquie est˜o inclu´ co a idas no seu relat´rio. o De preferˆncia, vocˆ deve testar o problema usando a ultima vers˜o de produ¸˜o ou desen- e e ´ a ca volvimento do Servidro MySQL antes do envio. Qualquer um deve estar apto a repetir o erro apenas usando ’mysql test < script’ no caso de teste incluido ou executando o script sheel ou Perl que ´ inclu´ no relat´rio de erros. e ido o Todos os erros enviados para o banco de dados dem bugs em http://bugs.mysql.com/ ser˜o corrigidos ou documentados na pr´xma distribui¸˜o do MySQL. Se apenas pequenas a o ca mudan¸as de c´digo forem necess´rias enviaremos um patch para corrigir o problema. c o a O lugar comum para relatar erros e problemas ´ http://bugs.mysql.com. e Se vocˆ encontrar um erro de seguran¸a no MySQL, envie um email para e c security@mysql.com. Se vocˆ tiver um relat´rio de erro que possa ser repetido, relate-o no banco de dados de bugs e o em http://bugs.mysql.com. Note que mesmo neste caso ´ bom executar o script mysqlbug e primeiro para ter informa¸˜es sobre o sistema. Qualquer erro que pudermos repetir tem co uma grande chance de ser corrigido na pr´xima distribui¸˜o do MySQL. o ca Para relatar outros problemas, vocˆ pode usar a lista de email do MySQL. e
  • 71. Cap´ ıtulo 1: Informa¸˜es Gerais co 37 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 conhecem a causa do problema e assumem que alguns detalhes n˜o importam. Um bom a e a u ´ principio ´: Se vocˆ est´ em d´vida sobre declarar alguma coisa, declare-a ! E milhares de e vezes mais r´pido e menos problem´tico escrever um pouco de linhas a mais no seu relat´rio a a o do que ser for¸ado a perguntar de novo e esperar pela resposta porque vocˆ n˜o forneceu c e a informa¸˜o sufiente da primeira vez. ca Os erros mais comuns acontecem porque as pessoas n˜o indicam o n´mero da vers˜o da a u a distribui¸˜o do MySQL que est˜o usando, ou n˜o indicam em qual plataforma elas tem ca a a o MySQL instalado (Incluindo o n´mero da vers˜o da plataforma). Essa informa¸˜o ´ u a ca e muito relevante, e em 99% dos casos o relato de erro ´ in´til sem ela! Frequentemente n´s e u o recebemos quest˜es como, “Por que isto n˜o funciona para mim?” ent˜o n´s vemos que o a a o aquele recurso requisitado n˜o estava implementado naquela vers˜o do MySQL, ou que o a a erro descrito num relat´rio foi resolvido em uma vers˜o do MySQL mais nova. Algumas o a vezes o erro ´ dependente da plataforma; nesses casos, ´ quase imposs´ corrigir alguma e e ivel coisa sem conhecimento do sistema operacional e o n´mero da vers˜o da plataforma. u a Lembre-se tamb´m de fornecer informa¸˜es sobre seu compilador, se isto for relacionado e co ao problema. Frequentemente pessoas encontram erros em compiladores e acreditam que o problema ´ relacionado ao MySQL. A maioria dos compiladores est˜o sobre desenvolvimento e a todo o tempo e tornam-se melhores a cada vers˜o. Para determinar se o seu problema a depende ou n˜o do compilador, n´s precisamos saber qual compilador foi usado. Note que a o todo problema de compila¸˜o deve ser estimado como relato de erros e, consequentemente ca publicado. ´ E de grande ajuda quando uma boa descri¸˜o do problema ´ inclu´ no relato do erro. Isto ca e ida ´, um bom exemplo de todas as coisas que o levou ao problema e a correta descri¸˜o do e ca problema. Os melhores relat´rios s˜o aqueles que incluem um exemplo completo mostrando o a como reproduzir o erro ou o problema Veja Se¸˜o D.1.6 [Casos de teste reproduz´ ca iveis], P´gina 1075. a Se um programa produz uma mensagem de erro, ´ muito importante incluir essas mensagens e no seu relat´rio! Se n´s tentarmos procurar por algo dos arquivos usando programas, ´ o o e melhor que as mensagens de erro relatadas sejam exatamente iguais a que o programa produziu. (At´ o caso deve ser observado!) Vocˆ nunca deve tentar lembrar qual foi a e e mensagem de erro; e sim, copiar e colar a mensagem inteira no seu relat´rio! o Se vocˆ tem um problema com o MyODBC, vocˆ deve tentar gerar um arquivo para e e rastremento de erros (trace) do MyODBC. Veja Se¸˜o 12.2.7 [MyODBC bug report], ca P´gina 875. a Por favor lembre-se que muitas das pessoas que ler˜o seu relat´rio podem usar um v´ a o ideo de 80 colunas. Quando estiver gerando relat´rios ou exemplos usando a ferramenta de linha o de comando mysql, ent˜o dever´ usar a op¸˜o --vertical (ou a instru¸˜o terminadora G) a a ca ca para sa´ que ir´ exceder a largura dispon´ para este tipo de v´ ida a ivel ideo (por exemplo, com a instru¸˜o EXPLAIN SELECT; veja exemplo abaixo). ca Por favor inclua a seguinte informa¸˜o no seu relat´rio: ca o • O n´mero da vers˜o da distribui¸˜o do MySQL que est´ em uso (por exemplo, MySQL u a ca a Version 3.22.22). Vocˆ poder´ saber qual vers˜o vocˆs est´ executando, usando o e a a e a
  • 72. 38 MySQL Technical Reference for Version 5.0.0-alpha comando mysqladmin version. mysqladmin pode ser encontrado no diret´rio ‘bin’ o sob sua instala¸˜o do MySQL. ca • 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 vocˆ pode obter esta informa¸˜o executando o comando Unix uname -a. Se vocˆ tra- e ca e balho no Windows, vocˆ pode normalmente conseguir o nome e o n´mero da vers˜o com e u a um duplo clique sobre o ´ icone ”Meu Computador” e em seguida no menu ”Ajuda/Sobre o Windows”. • Algumas vezes a quantidade de mem´ria (real e virtual) ´ relevante. Se estiver em o e d´vida, inclua esses valores. u • Se vocˆ estiver usando uma distribui¸˜o fonte do MySQL, ´ necess´rio o nome e n´mero e ca e a u da vers˜o do compilador usado. Se vocˆ estiver usando uma distribui¸˜o bin´ria, ´ a e ca a e necess´rio o nome da distribui¸˜o. a ca • Se o problema ocorre durante a compila¸˜o, inclua a(s) exata(s) mensagem(s) de erro(s) ca e tamb´m algumas linhas do contexto envolvendo o c´digo no arquivo onde o erro e o ocorreu. • Se o mysqld finalizou, vocˆ dever´ relatar tamb´m a consulta que travou o mysqld. e a e Normalmente vocˆ pode encontrar isto executando mysqld com o log habilitado. Veja e Se¸˜o D.1.5 [Using log files], P´gina 1074. ca a • Se alguma tabela do banco de dados estiver relacionado ao problema, inclua a sa´ de ida mysqldump --nodata nome_db nome_tbl1 nome_tbl2.... Isto ´ muito f´cil de fazer e a e ´ um modo poderoso de obter informa¸˜es sobre qualquer tabela em um banco de e co dados que ir´ ajudar-nos a criar uma situa¸˜o parecida da que vocˆ tem. a ca 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 que ida u a instru¸˜o SELECT produz. Vocˆ tamb´m deve incluir a sa´ de SHOW CREATE TABLE ca e e ida nome_tabela para cada tabela envolvida. Quanto mais informa¸˜o vocˆ fornecer sobre ca e a sua situa¸˜o, mais f´cil ser´ para algu´m ajudar-lo! A seguir um exemplo de um ca a a e relat´rio de erros muito bom (ele deve ser postado com o script mysqlbug): o Exemplo de execu¸˜o usando a ferramenta de linha de comando mysql (perceba o uso ca 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 script de entrada que ir´ reproduzir a anomalia. Este script deve incluir qualquer ar- a
  • 73. Cap´ ıtulo 1: Informa¸˜es Gerais co 39 quivo de fonte necess´rio. Quanto mais pr´ximo o script puder reproduzir sua situa¸˜o, a o ca melhor. Se vocˆ puder fazer uma s´rie de testes repetidos, vocˆ poder´ post´-lo para o e e e a a 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 informa¸˜o da performance do seus sistema. ca • Se vocˆ n˜o puder produzir um caso de teste em algumas linhas, ou se a tabela de e a testes for muito grande para ser enviada por email para a lista de mensagens (mais de 10 linhas), vocˆ dever´ dar um dump de suas tabelas usando o mysqldump e criar um e a 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/. E envie uma pequena descri¸˜o do problema para bugs@lists.mysql.com. ca • Se vocˆ achar que o MySQL produziu um resultado estranho para uma consulta, n˜o e a inclua somente o resultado, mas tamb´m sua opini˜o de como o resultado deve ser, e e a uma conta descrevendo o base de sua opini˜o. a • Quando fornecer um exemplo do problema, ´ melhor usar os nomes de vari´veis, nomes e a de tabelas, etc. utilizados na sua situa¸˜o atual do que enviar com novos nomes. O ca problema pode ser relacionado ao nome da vari´vel ou tabela! Esses casos s˜o raros, a a mas ´ melhor prevenir do que remediar. Al´m disso, ser´ mais f´cil para vocˆ fornecer e e a a e um exemplo que use sua situa¸˜o atual, que ´ o que mais importa para n´s. No caso ca e o de ter dados que n˜o deseja mostrar para outros, vocˆ pode usar o ftp para transferi- a e lo para ftp://support.mysql.com/pub/mysql/secret/. Se os dados s˜o realmente a confidenciais, e vocˆ n˜o deseja mostr´-los nem mesmo para n´s, ent˜o v´ em frente e e a a o a a providencie um exemplo usando outros nome, mas, por favor considere isso como uma unica chance. ´ • Inclua, se poss´ivel, todas as op¸˜es fornecidas aos programas relevantes. Por exemplo, co indique as op¸˜es que vocˆ utiliza quando inicializa o daemon mysqld e aquelas que s˜o co e a utilizadas para executar qualquer programa cliente MySQL. As op¸˜es para programas co como o mysqld e mysql, e para o script configure, s˜o frequentemente chaves para a respostas e s˜o muito relevantes! Nunca ´ uma m´ id´ia inclu´ a e a e i-las de qualquer forma! Se vocˆ usa algum m´dulo, como Perl ou PHP por favor forne¸a o n´mero da vers˜o e o c u 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 vocˆ obteve quando tentava conectar! Quando vocˆ testar seus privil´gios, vocˆ deve e e e e primeiramente executar mysqlaccess. Depois, execute mysqladmin reload version e tente conectar com o programa que gerou o problema. mysqlaccess pode ser encon- trado no diret´rio ‘bin’ sob seu diret´rio de instala¸˜o do MySQL. o o ca • Se vocˆ tiver um patch para um erro, isso ´ bom, mas n˜o assuma que o patch ´ e e a e tudo que precisamos, ou que iremos us´-lo, se vocˆ n˜o fornecer algumas informa¸˜es a e a co necess´rias, como os casos de testes mostrando o erro que seu patch corrige. N´s a o podemos encontrar problemas com seu patch ou n´s podemos n˜o entendˆ-lo ao todo; o a e se for assim, n˜o podemos us´-lo. a a
  • 74. 40 MySQL Technical Reference for Version 5.0.0-alpha Se n´s n˜o verificarmos exatamente o que o patch quer dizer, n´s n˜o poderemos us´- o a o a a lo. Casos de testes ir˜o ajudar-nos aqui. Mostre que o patch ir´ cuidar de todas as a a situa¸˜es que possam ocorrer. Se n´s encontrarmos um caso (mesmo que raro) onde o co o patch n˜o funcionaria, ele pode ser in´til. a u • Palpites sobre qual ´ o erro, porque ocorre, ou do que ele depende, geralmente est˜o e a errados. Mesmo o time MySQL n˜o pode adivinhar antecipadamente tais coisas sem a 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 de mensagens para que outros saibam que vocˆ tentou solucionar o problema. e • Se vocˆ obter um parse error, por favor confira sua sintaxe com aten¸˜o! Se e ca vocˆ n˜o conseguiu encontrar nada errado com ela, ´ extremamente prov´vel e a e a que que sua vers˜o corrente do MySQL n˜o suporte a consulta que vocˆ a a e est´ utilizando. a Se vocˆ estiver usando a vers˜o recente e o manual em e a http://www.mysql.com/documentation/manual.php n˜o cobrir a sintaxe que a vocˆ estiver usando, o MySQL n˜o suporta sua consulta. Neste caso, suas unicas e a op¸˜es s˜o implementar vocˆ mesmo a sintaxe ou enviar uma mensagem para co a e mysql-licensing@mysql.com e perguntar por uma oferta para implement´-lo! a Se o manual cobrir a sintaxe que vocˆ estiver usando, mas vocˆ tiver uma vers˜o mais e e a antiga do MySQL, vocˆ dever´ conferir o hist´rico de altera¸˜es do MySQL para ver e a o co quando a sintaxe foi implementada. Neste caso, vocˆ tem a op¸˜o de atualizar para e ca uma nova vers˜o do MySQL. Veja Apˆndice C [News], P´gina 948. a e a • Se vocˆ tiver um problema do tipo que seus dados aparecem corrompidos ou vocˆ e e obtem erros quando vocˆ acessa alguma tabela em particular, vocˆ dever´ primeiro e e a checar depois tentar reparar suas tabelas com myisamchk ou CHECK TABLE e REPAIR TABLE. Veja Cap´ “ptexi tulo 4 [MySQL Database Administration], P´gina 208. a • Se vocˆ frequentemente obt´m tabelas corrompidas, e e vocˆ deve ten- e tar encontrar quando e porque isto acontece! Neste caso, o arquivo ‘mysql-data-directory/’hostname’.err’ deve conter algumas informa¸˜es co sobre o que aconteceu. Veja Se¸˜o 4.10.1 [Error log], P´gina 373. Por favor forne¸a ca a c qualquer informa¸˜o relevante deste arquivo no seu relat´rio de erro! Normalmente ca o o mysqld NUNCA dever´ danificar uma tabela se nada o finalizou no meio de uma a atualiza¸˜o! Se vocˆ puder encontrar a causa do fim do mysqld, se torna muito mais ca e f´cil para n´s fornecemos a vocˆ uma solu¸˜o para o problema! Veja Se¸˜o A.1 [What a o e ca ca is crashing], P´gina 907. a • Se poss´ ivel, fa¸a o download e instale a vers˜o mais recente do MySQL para saber se c a ela resolve ou n˜o o seu problema. Todas vers˜es do MySQL s˜o muito bem testadas a o a e devem funcionar sem problemas! Acreditamos em deixar tudo, o mais comp´tivel a ´ possivel com as vers˜es anteriores, e vocˆ conseguir´ mudar de vers˜es MySQL em o e a o minutos! Veja Se¸˜o 2.2.4 [Which version], P´gina 80. ca a Se vocˆ ´ um cliente de nosso suporte, por favor envio o seu relat´rio de erros em e e o mysql-support@mysql.com para tratamento de alta priorit´rio, bem como para a lista de a mensagens apropriada para ver se mais algu´m teve experiˆncias com (e talvez resolveu) o e e problema. Para informa¸˜es sobre relatar erros no MyODBC, veja Se¸˜o 12.2.4 [ODBC Problems], co ca P´gina 869. a
  • 75. Cap´ ıtulo 1: Informa¸˜es Gerais co 41 Para solu¸˜es a alguns problemas comuns, veja Veja Apˆndice A [Problems], P´gina 907. co e a Quando respostas s˜o enviadas para vocˆ individualmente e n˜o para a lista de mensagens, ´ a e a e considerado boa etiqueta resumir as respostas e enviar o resumo para a lista de mensagens para que outras possam ter o benef´ icio das respostas que vocˆ recebeu que ajudaram a e resolver seu problema! 1.7.1.4 Guia para responder quest˜es na lista de discuss˜o o a Se vocˆ considerar que sua respota possa ter um amplo interesse, vocˆ pode querer post´-la e e a 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 ivel para que outras pessoas al´me da que postou a pergunda possam se beneficiar dela. Quando vocˆ postar para a lista, por e favor tenha certeza que sua resposta n˜o ´ uma r´plica de uma resposta anterior. a e e Tente resumir a parte essencial da quest˜o na sua resposta, n˜o se sinta obrigado a citar a a a mensagem original inteira. Por favor n˜o poste mensagens a partir de seu browser com o modo HTML ligado! Muitos a usu´rios n˜o leem e-mail com browser! a a 1.7.2 Suporte a Comunidade MySQL Atrv´s do IRC (Internet e Relay Chat) Em adi¸˜o as diversas listas de email, vocˆ pode pessoas experientes da comunidade no IRC ca e (Internet Relay Chat). Estes s˜o os melhores canais atualmente conhecidos por n´s: a o • freenode (veja http://www.freenode.net/ para servidores) • #mysql A princ´ s˜o quest˜es sobre o MySQL, mas d´vidas sobre outros bancos ipio a o u de dados e SQL s˜o bemvindas. a • #mysqlphp Quest˜es sobre MySQL+PHP, uma combina¸˜o popular. o ca • #mysqlperl Quest˜es sobre MySQL+Perl, outra combina¸˜o popular. o ca • EFnet (veja http://www.efnet.org/ para servidores) • #mysql Quest˜es sobre MySQL. o Se vocˆ est´ procurando por programas clientes de IRC para conectar a uma rede IRC, dˆ e a e uma olhada no X-Chat (http://www.xchat.org/). X-Chat (licen¸a GPL) est´ dispon´ c a ivel para as plataformas Unix e Windows. 1.8 Qual compatibilidade aos padr˜es o MySQL oferece ? o Esta se¸˜o descreve como o MySQL se relaciona aos padr˜es ANSI/ISO SQL. O Servidor ca o MySQL tem muitas extens˜es aos padr˜es SQL, e aqui vocˆ descobrir´ quais s˜o elas, e como o o e a a us´-las. Vocˆ ir´ tamb´m encontrar informa¸˜o sobre falta de funcionalidade do Servidor a e a e ca MySQL, e como trabalhar com algumas diferen¸as. c Nosso objetivo ´ n˜o restringir, sem um boa raz˜o, a usabilidade do MySQL Server para e a a qualquer uso. Mesmo se n˜o tivermos os recursos para fazer o desenvolvimento para todos a os usos poss´ iveis, estamos sempre querendo ajudar e oferecer sugest˜es para pessoas que o est˜o tentando usar o MySQL Server em novos territ´rios. a o
  • 76. 42 MySQL Technical Reference for Version 5.0.0-alpha Um dos nossos principais objetivos com o produto ´ continuar a trabalhar em acordo com e o padr˜o SQL-99, mas sem sacrificar velocidade e confian¸a. N˜o estamos receosos em a c a adicionar extens˜es ao SQL ou suporte para recursos n˜o SQL se ele aumentar extremamente o a a usabilidade do MySQL Server para uma grande parte de nossos usu´rios. (A nova interface a HANDLER no MySQL Server 4.0 ´ um exeemplo desta estrat´gia. Veja Se¸˜o 6.4.9 [HANDLER], e e ca P´gina 595.) a Continuaremos a suportar bancos de dados transacionais e n˜o transacionais para satisfazer a ´ tanto o uso pesado na web quanto o uso de miss˜o critica 24/7. a O MySQL Server foi projetado inicialmente para trabalhar com bancos de dados de tamanho m´dio (10-100 milh˜es de registros ou cerca de 100 MB por tabela) em sistemas computa- e o cionais pequenos. Continuaremos a extender o MySQL Server para funcionar ainda melhor com banco de dados na ordem de terabytes, assim como tornar poss´ compilar uma vers˜o ivel a reduzida do MySQL mais apropriadas para handhels e uso embutido. O design compacto do servidor MySQL tornam ambas as dire¸˜es poss´ co iveis sem qualquer conflito na ´rvore a fonte. Atualmente n˜o estamos buscando suporte em tempo real ou banco de dados em cluster a (mesmo se vocˆ j´ puder fazer muitas coisas com nossos servi¸os de replica¸˜o). e a c ca Estamos buscando melhoras no fornecimento de suporte a XML no servidor de banco de dados. 1.8.1 Qual Padr˜o o MySQL Segue? a Entry-level SQL-92. ODBC levels 0-3.51. We are aiming toward supporting the full SQL-99 standard, but without concessions to speed and quality of the code. 1.8.2 Executando o MySQL no modo ANSI Se vocˆ inicializa o mysqld com a op¸˜o --ansi ou --sql-mode=ANSI, o seguinte compor- e ca tamento ´ alterado no MySQL: e • || ´ um oprador de concatena¸˜o de strings em vez de um sinˆnimo para OR. e ca o • ‘"’ ´ tratado como um caracter identificados (com o caracter de aspasr ‘‘’ do MySQL e Server)e n˜o um caracter de string. Vocˆ ainda pode usar ‘‘’ para citar identificadores a e no modo ANSI. Uma implica¸˜o disto ´ que vocˆ n˜o pode usar aspas duplas para citar ca e e a um string literal, porque ela ser´ intepretada como um identificador. a • Vocˆ pode ter qualquer n´mero de espa¸os entre um nome de fun¸˜o e o ‘(’. Isto e u c ca faz com que todos nomes de fun¸˜es sejam tratadas como palavras reservadas. Como co resultado, se vocˆ quiser acessar qualquer banco de dados, tabelas ou coluna que ´ uma e e palavra reservada, vocˆ deve coloc´-lo entre aspas. Por exemplo, por haver a fun¸˜o e a ca USER(), o nome da tabela user no banco de dados mysql e a coluna User nesta tabela se torna reservada, assim vocˆ deve coloc´-la entre aspas: e a SELECT "User" FROM mysql."user"; • REAL ´ um sinˆnimo para FLOAT no lugar de um sinˆnimo de DOUBLE. e o o
  • 77. Cap´ ıtulo 1: Informa¸˜es Gerais co 43 • O n´ de isolamento padr˜o de um transa¸˜o ´ SERIALIZABLE. Veja Se¸˜o 6.7.6 [SET ivel a ca e ca TRANSACTION], P´gina 618. a • Vocˆ pode usar um campo/express˜o em GROUP BY que n˜o est´ na lista de campos. e a a a Executando o servidor em modo ANSI ´ o mesmo que inici´-lo com estas op¸˜es: e a co --sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES, IGNORE_SPACE,ONLY_FULL_GROUP_BY --transaction-isolation=serializable No MySQL 4.1, vocˆ pode conseguir o mesmo efeito com estas duas instru¸˜es: e co SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET GLOBAL sql_mode= "REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY"; No MySQL 4.1.1 a ultima op¸˜o sql_mode tamb´m pode ser dada com: ´ ca e SET GLOBAL sql_mode="ansi"; No caso acima o sql_mode estar´ configurado com todas as op¸˜es que s˜o relevantes para a co a o modo ANSI. Vocˆ pode verificar o resultado fazendo: e mysql> SET GLOBAL sql_mode="ansi"; mysql> SELECT @@GLOBAL.sql_mode; -> "REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_ 1.8.3 Extens˜es do MySQL para o Padr˜o SQL-92 o a O MySQL fornece algumas extens˜es que vocˆ provavelmente n˜o ir´ encontrar em alguns o e a a bancos de dados SQL. Fique avisado que se vocˆ us´-las, seu c´digo pode n˜o ser mais e a o a port´vel para outros servidores SQL. Em alguns casos, vocˆ pode escrever c´digo que inclui a e o extens˜es MySQL, mas continua port´vel, usando coment´rios da forma /*! ...*/. Neste o a a caso, o MySQL ir´ analisar e executar o c´digo com o coment´rio como ir´ fazer com a o a a qualquer outra instru¸˜o MySQL, mas outros servidores SQL ir˜o ignorar as extens˜es. ca a o Por exemplo: SELECT /*! STRAIGHT_JOIN */ nome_campo FROM table1,table2 WHERE ... Se vocˆ adicionar um n´mero de vers˜o depois do ’!’, a sintaxe s´ ser´ executada se a e u a o a vers˜o do MySQL ´ igual ou maior que o n´mero de vers˜o usado: a e u a CREATE /*!32302 TEMPORARY */ TABLE t (a INT); O exemplo acima significa que se vocˆ tiver uma vers˜o do MySQL 3.23.02 ou mais nova, e a ent˜o o MySQL ir´ usar a palavra-chave TEMPORARY a a Extens˜es MySQL s˜o listadas abaixo: o a • 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 nada determinada pelo conjunto de caracteres corrente (ISO-8859-1 Latin1 por padr˜o). a Se vocˆ n˜o gosta disso vocˆ dever´ declarar suas colunas com o atributo BINARY ou e a e a usar o operador BINARY, que fazendo com que as compara¸˜es sejam feitas de acordo co com a ordem ASCII usada na m´quina servidora do MySQL. a
  • 78. 44 MySQL Technical Reference for Version 5.0.0-alpha • 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 do o banco de dados. Isto tem algumas implica¸˜es:co − 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). Veja Se¸˜o 6.1.3 [Name case sensitivity], P´gina 473. ca a ´ − Nomes de Bancos de dados, tabelas, indices, campos ou apelidos pode come¸ar c com um d´ igito (por´m n˜o podem consistir somente de digitos). e a − 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. • Em algumas instru¸˜es SQL, vocˆ pode acessar tabelas de diferentes bancos de dados co e com a sintaxe nome_bd.nome_tbl. Alguns servidores SQL fornecem a mesma fun- cionalidade mas chamam isto de User space. O MySQL n˜o suporta tablespaces como a em: create table ralph.my_table...IN minha_tablespace. • LIKE ´ permitido em campos num´ricos. e e • O uso de INTO OUTFILE e STRAIGHT_JOIN em uma instru¸˜o SELECT. Veja Se¸˜o 6.4.1 ca ca [SELECT], P´gina 562. a • A op¸˜o SQL_SMALL_RESULT em uma instru¸˜o SELECT. ca ca • EXPLAIN SELECT para obter uma descri¸˜o de como as tabelas s˜o ligadas. ca a • A utiliza¸˜o de nomes de ´ ca indices, ´indices em um prefixo de um campo, e uso de INDEX ou KEY em uma instru¸˜o CREATE TABLE. Veja Se¸˜o 6.5.3 [CREATE TABLE], P´gina 597. ca ca a • O uso de TEMPORARY ou IF NOT EXISTS com CREATE TABLE. • O uso de COUNT(DISTINCT lista) onde ’lista’ ´ maior que um elemento. e • O uso de CHANGE nome_campo, DROP nome_campo, ou DROP INDEX, IGNORE ou RENAME em uma instru¸˜o ALTER TABLE. Veja Se¸˜o 6.5.4 [ALTER TABLE], P´gina 607. ca ca a • O uso de RENAME TABLE. Veja Se¸˜o 6.5.5 [RENAME TABLE], P´gina 611. ca a • Utiliza¸˜o de m´ltiplas cl´usulas ADD, ALTER, DROP, ou CHANGE em uma instru¸˜o ALTER ca u a ca TABLE. • O uso de DROP TABLE com as palavras-chave IF EXISTS. • Vocˆ pode remover m´ltiplas tabelas com uma instru¸˜o unica DROP TABLE. e u ca ´ • As cl´usulas ORDER BY e LIMIT das instru¸˜es UPDATE e DELETE. a co • Sintaxe INSERT INTO ... SET col_name = .... • 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. a co • O uso de LOAD DATA INFILE. Em alguns casos essa sintaxe ´ compat´ com o Oracle e ivel LOAD DATA INFILE. Veja Se¸˜o 6.4.8 [LOAD DATA], P´gina 587. ca a • As intru¸˜es ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE, e REPAIR TABLE. co • A instru¸˜o SHOW. Veja Se¸˜o 4.6.8 [SHOW], P´gina 303. ca ca a • Strings podem ser fechadas pelo ‘"’ ou ‘’’, n˜o apenas pelo ‘’’. a
  • 79. Cap´ ıtulo 1: Informa¸˜es Gerais co 45 • O uso do meta-caractere de escape ‘’. • A instru¸˜o SET OPTION. Veja Se¸˜o 5.5.6 [SET OPTION], P´gina 461. ca ca a • Vocˆ n˜o precisa nomear todos os campos selecionados na parte GROUP BY. Isto fornece e a melhor performance para algumas consultas espec´ ificas, mas muito comuns. Veja Se¸˜o 6.3.7 [Group by functions and modifiers], P´gina 555. ca a • Pode ser especificado ASC e DESC com o GROUP BY. • Para tornar mais f´cil para usu´rios que venham de outros ambientes SQL, o MySQL a a suporta apelidos (aliases) para v´rias fun¸˜es. Por exemplo, todas fun¸˜es de string a co co suportam as sintaxes ANSI SQL e ODBC. • O MySQL entende os operadores || e && como ou(OR) e e(AND) logicos, como na linguagem de programa¸˜o C. No MySQL, || e OR s˜o sinˆnimos, assim como && e ca a o AND. Devido a esta ´tima sintaxe, o MySQL n˜o suporta o operador ANSI SQL para o a concatena¸˜o de strings ||; em vez disso, use o CONCAT(). Como CONCAT() aceita ca v´rios argumentos, ´ f´cil converter o uso do operador || para MySQL. a e a • CREATE DATABASE or DROP DATABASE. Veja Se¸˜o 6.5.1 [CREATE DATABASE], P´gina 596. ca a • 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 compara¸˜es de campos a esquerda do FROM nas instru¸˜es SELECT. Por exemplo: co co mysql> SELECT col1=1 AND col2=2 FROM nome_tabela; • A fun¸˜o LAST_INSERT_ID(). Veja Se¸˜o 12.1.3.31 [mysql_insert_id()], P´gina 799. ca ca a • 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 receber qualquer n´mero de argumentos.) u • 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 SQL-99 s´ suporta remo¸˜o de caracteres o ca unicos. ´ • As fun¸˜es do GROUP BY: STD(), BIT_OR(), BIT_AND() e BIT_XOR() e GROUP_CONCAT(). co Veja Se¸˜o 6.3.7 [Group by functions and modifiers], P´gina 555. ca a • Uso de REPLACE no lugar de DELETE + INSERT. Veja Se¸˜o 6.4.7 [REPLACE], P´gina 587. ca a • 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; 1.8.4 Diferen¸as do MySQL em Compara¸˜o com o SQL-92 c ca N´s tentamos fazer com que o MySQL siguisse os padr˜es ANSI SQL (SQL-92/SQL-99) e o o o ODBC SQL, mas em alguns casos, o MySQL realiza opera¸˜es de forma diferente: co • Para campos VARCHAR, expa¸os extras s˜o removidos quando o valor ´ armazenado. c a e Veja Se¸˜o 1.8.6 [Bugs], P´gina 53. ca a
  • 80. 46 MySQL Technical Reference for Version 5.0.0-alpha • Em alguns casos, campos CHAR s˜o alterados sem perguntas para o tipo de campo a VARCHAR. Veja Se¸˜o 6.5.3.1 [Silent column changes], P´gina 606. ca a • Privil´gios para uma tabela n˜o s˜o negadas automaticamente quando vocˆ apaga uma e a a e tabela. Vocˆ deve usar explicitamente um REVOKE para negar privil´gios para uma e e tabela. Veja Se¸˜o 4.4.1 [GRANT], P´gina 255. ca a Para uma lista priorizada indicando quando novas extens˜es ser˜o adi- o a cionadas ao MySQL vocˆ deve consultar lista TODO online do MySQL em e http://www.mysql.com/doc/en/TODO.html. Esta ´ a ultima vers˜o da lista TODO neste e ´ a manual. Veja Se¸˜o 1.6 [TODO], P´gina 26. ca a 1.8.4.1 Subqueries MySQL Version 4.1 supports subqueries and derived tables (unnamed views). Veja Se¸˜o 6.4.2 [Subqueries], P´gina 569. ca a For MySQL versions prior to 4.1, most subqueries can be successfully rewritten using joins and and other methods. Veja Se¸˜o 6.4.2.11 [Rewriting subqueries], P´gina 577. ca a 1.8.4.2 SELECT INTO TABLE O MySQL ainda n˜o suporta a extens˜o SQL Oracle: SELECT ... INTO TABLE .... MySQL a a suporta a sintaxe ANSI SQL INSERT INTO ... SELECT ..., que ´ basicamente a mesma e coisa. Veja Se¸˜o 6.4.3.1 [INSERT SELECT], P´gina 581. ca a INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100; De maneira alternativa, vocˆ pode usar SELECT INTO OUTFILE... ou CREATE TABLE ... e SELECT para resolver seu problema. 1.8.4.3 Transa¸oes e Opera¸˜es Atˆmicas c˜ co o O MySQL Server (vers˜o 3.23-max e todas as vers˜es 4.0 e acima) suportam transa¸˜es com a o co os mecanismos de armazenamento transacionais InnoDB e BDB. InnoDB fornece compat- ibilidade total com ACID. Veja Cap´ “ptexi tulo 7 [Tipos de tabelas], P´gina 629. a Os outros tipos de tabelas n˜o transacionais (tais como MyISAM) no MySQL Server seguem a um paradigma diferente para integridade de dados chamado “Oper¸~es At^micas.” Em co o termos de transa¸˜o, tabelas MyISAM efetivamente sempre operam em modo AUTOCOMMIT=1. ca Opera¸˜es atˆmicas geralmente oferecem integridade compar´vel com a mais alta perfor- co o a mance. Com o MySQL Server suportando ambos os paradigmas, o usu´rio pode decidir se precisa a da velocidade das opera¸˜es atˆmicas ou se precisa usar recursos transacionais em seu co o aplicativo. Esta escolha pode ser feita em uma base por tabela. Como notado, a compara¸˜o para tabelas transacionais vs. n˜o transacionais As noted, ca a the trade off for transactional vs. non-transactional table se encontra em grande parte no desempenho. Tabelas transacionais tem uma exigˆncia de mem´ria e espa¸o em disco e o c
  • 81. Cap´ ıtulo 1: Informa¸˜es Gerais co 47 significantemente maior e maior sobrecarga da CPU. Tipos de tabelas transacionais como InnoDB oferecem muitos recursos unicos. O projeto modular do MySQL Server permite ´ o uso concorrente de todas estes mecanismos de armazenamento para servir a diferentes exigˆncias e oferecer um ´timo desempenho em todas as situa¸˜es. e o co Mas como fazer uso dos recursos do MySQL Server para manter uma integridade rigorosa mesmo com tabelas MyISAM n˜o transacionais e como este recurso se compara com os tipos a de tabelas transacionais? 1. No paradigma transacional, se as suas aplica¸˜es s˜o escritas de uma forma que ´ co a e dependente na chamada de ROLLBACK em vez de COMMIT em situa¸˜es cr´ co iticas, ent˜o a transa¸˜es s˜o mais convenientes. Al´m disso, transa¸˜es asseguram que atualiza¸˜es co a e co co inacabadas ou atividades corrompidas n˜o sejam executadas no banco de dados; o a servidor oferece uma oportunidade para fazer um rollback autom´tico e seu banco de a dados ´ mantido. e O MySQL Server, na maioria dos casos, permite a vocˆ resolver potenciais problemas e incluindo simples conferˆncias antes das atualiza¸˜es e executando scripts simples que e co conferem inconsistˆncias no banco de dados e, automaticamente, repara ou avisa caso e 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. 2. Mais do que nunco, atualiza¸˜es transacionais fatais podem ser reescritas para serem co atˆmicas. De fato podemos dizer que todos problemas de integridade que transa¸˜es o co resolvem podem ser feitas com LOCK TABLES ou atualiza¸˜es atˆmicas, assegurando que co o vocˆ nunca ir´ ter uma finaliza¸˜o autom´tica da tabela, o que ´ um problema comum e a ca a e em bancos de dados transacionais. 3. Nem mesmo transa¸˜es podem prevenir todas as falhas se o servidor cair. Nestes co casos mesmo um sistema transacional pode perder dados. A diferen¸a entre sistemas c diferentes ´ apenas em qu˜o pequeno ´ o lapso de tempo em que eles podem perder e a e dados. Nenhum sistema ´ 100% seguro, somente “seguro o suficiente.” Mesmo o e Oracle, com reputa¸˜o de ser o mais seguro bancos de dados transacionais, tem relatos ca de algumas vezes perder dados nestas situa¸˜es. co Para estar seguro com o MySQL Server, vocˆ apenas deve fazer backups e ter o log e de atualiza¸˜es ligado. Com isto vocˆ pode se recuperar de qualquer situa¸˜o poss´ co e ca ivel ´ com bancos de dados transacionais. E sempre bom ter backups, independente de qual banco de dados vocˆ usa. e O paradigma transacional tem seus benef´ icios e suas desvantagens. Muitos usu´rios e a desenvolvedores de aplica¸˜es dependem da facilidade com a qual eles podem codificar co contornando problemas onde abortar parece ser, ou ´ necess´rio. No entanto, se vocˆ e a e ´ novo no paradigma de opera¸˜es atˆmicas ou tem mais familiaridade ou conforto com e co o transa¸˜es, considere o benef´ co icio da velocidade que as tabelas n˜o transacionais podem a oferece, na ordem de 3 a 5 vezes da velocidade que as tabelas transacionais mais r´pidas e a otimizadas. Em situa¸˜es onde integridade ´ de grande importˆncia, as atuais caracter´ co e a isticas do MySQL permitem n´ iveis transacionais ou melhor confian¸a e integridade. Se vocˆ bloquear tabelas c e com LOCK TABLES todos as atualiza¸˜es ir˜o ser adiadas at´ qualquer verifica¸˜o de inte- co a e ca gridade ser feita. Se vocˆ s´ obter um bloqueio de leitura (oposto ao bloqueio de escrita), e o
  • 82. 48 MySQL Technical Reference for Version 5.0.0-alpha ent˜o leituras e inser¸˜es poder˜o ocorrer. Os novos registros inseridos n˜o poder˜o ser vi- a co a a a sualizados por nenhum dos clientes que tiverem um bloqueio de LEITURA at´ eles liberarem e estes bloqueios. Com INSERT DELAYED vocˆ pode enfileirar inser¸˜es em uma fila local, at´ e co e os bloqueios serem liberados, sem que o cliente precise esperar at´ a inser¸˜o completar. a ca Veja Se¸˜o 6.4.3.2 [INSERT DELAYED], P´gina 581. ca a “Atˆmico”, no sentido em que n´s mencionamos, n˜o ´ m´gico. Significa apenas que vocˆ o o a e a e pode estar certo que enquanto cada atualiza¸˜o espec´ ca ifica est´ sendo executada, nenhum a outro usu´rio pode interferir com ela, e nunca haver´ um rollback autom´tico (que pode a a a acontecer em sistemas baseados em transa¸˜es se vocˆ n˜o tiver muito cuidado). O MySQL co e a tamb´m assegura que nunca ocorrer´ uma leitura suja. e a A seguir est˜o algumas t´cnicas para trabalhar com tabelas n˜o transacionais: a e a • Loops que precisam de transa¸˜es normalmente pode ser codificados com a ajuda de co LOCK TABLES, e vocˆ n˜o precisa de cursores para atualizar regitros imeditamente. e a • Para evitar o uso do ROLLBACK, vocˆ pode usar as seguintes estrat´gias: e e 1. Use LOCK TABLES ... para fazer um lock todas as tabelas que vocˆ quer acessar. e 2. Condi¸˜es de teste. co 3. Atualize se estiver tudo OK. 4. Use UNLOCK TABLES para liberar seus locks. Isto ´ normalmente um m´todo muito mais r´pido que usar transa¸˜es com poss´ e e a co iveis ROLLBACKs, mas nem sempre. A unica situa¸˜o que esta solu¸˜o n˜o pode tratar ´ ´ ca ca a e quando algu´m mata a threads no meio de uma atualiza¸˜o. Neste caso, todas os locks e ca ser˜o liberados mas algumas das atualiza¸˜o podem n˜o ter sido execuadas. a ca a • Vocˆ tamb´m pode usar fun¸˜es para atualizar registros em uma unica opera¸˜o. Vocˆ e e co ´ ca e pode conseguir uma aplica¸˜o muito eficiente usando as seguintes t´cnicas: ca e • Modifique campos em rela¸˜o ao seus valores atuais. ca • Atualize apenas aqueles campos que realmente tiveram altera¸˜es. co Por exemplo, quando fazemos atualiza¸˜es em alguma informa¸˜o de cliente, atual- co ca izamoa apenas os dados do clientes que alteraram e testamos apenas aqueles com dados alterados ou dados que dependem dos dados alterados, mudaram em compara¸˜o com o ca registro original. O teste dos dados alterados ´ feito com a cl´usula WHERE na instru¸˜o e a ca UPDATE. Se o registro n˜o foi atualizado, mandamos ao cliente uma mensagem: ”Some a of the data you have changed has been changed by another user.” Ent˜o mostramos o a registro antigo versus o novo em uma janela, assim o usu´rio pode decidir qual vers˜o a a do registro de cliente de ser usado. Isto nos d´ algo similar a lock de colunas mas que, na verdade, ´ melhor porque apenas a e atualizamos algumas das colunas, usando valores relativos ao seu valor atual. Isto significa que instru¸˜es UPDATE comuns se parecem com estas: co UPDATE nometabela SET pay_back=pay_back+125; UPDATE customer SET customer_date=’current_date’, address=’new address’,
  • 83. Cap´ ıtulo 1: Informa¸˜es Gerais co 49 phone=’new phone’, money_he_owes_us=money_he_owes_us-125 WHERE customer_id=id AND address=’old address’ AND phone=’old phone’; Como vocˆ pode ver, isto ´ muito eficiente e funciona mesmo se outro cliente alterar e e os valores nas colunas pay_back ou money_he_owes_us. • Em muitos casos, usu´rios querem fazer ROLLBACK e/ou LOCK TABLES com o prop´sito a o de gerenciarem identificadores unicos para algumas tabelas. Isto pode ser tratado muito ´ mais eficientemente usando uma coluna AUTO_INCREMENT e tamb´m uma fun¸˜o SQL e ca LAST_INSERT_ID() ou a fun¸˜o da API C mysql_insert_id(). Veja Se¸˜o 12.1.3.31 ca ca [mysql_insert_id()], P´gina 799. a Geralmente vocˆ pode codificar evitando lock de registro. Algumas situa¸˜es realmente e co precisam disto, e tabelas InnoDB suportam lock de regitstro. Comoo MyISAM, vocˆ e pode usar uma coluna de flag na tabela e fazer algo como a seguir: UPDATE nome_tbl SET row_flag=1 WHERE id=ID; O MySQL retorna 1 para o n´mero de linhas afetadas se as linhas foram encontradas u e row_flag j´ n˜o era 1 na linha original. a a Vocˆ pode pensar nisto como se o MySQL Server tivesse alterado a consulta anterior e para: UPDATE nome_tbl SET row_flag=1 WHERE id=ID AND row_flag <> 1; 1.8.4.4 Stored Procedures e Triggers Steored procedures est˜o sendo implementadas em nossa vers˜o 5.0 na ´rvore de desenvolvi- a a a mento. Veja Se¸˜o 2.3.4 [Instalando da ´rvore de fontes], P´gina 100. ca a a Este esfor¸o ´ baseado no SQL-99, que tˆm uma sintaxe b´sica similar (mas n˜o idˆntica) ao c e e a a e Oracle PL/SQL. Em adi¸˜o a isto, estamoas implementando o framework SQL-99 enganchar ca em linguagens externas. Uma Stored Procedure ´ um conjunto de comandos SQL que podem ser compilados e e armazenados no servidor. Uma fez feito isso, os clientes n˜o necessitam reescrever toda a a consulta mas podem fazer referˆncia ` stored procedure. Isto fornece melhor performance e a 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 ca e e ´ nivel conceitual tendo bibliotecas de fun¸˜es no servidor. No entanto, stored procedures co aumentam a carga no servidor de banco de dados, j´ que grande parte do trabalho ´ feito a e do lado do servidor e menos do lado do cliente (aplica¸˜o). ca Triggers est˜o programados para serem implementados no MySQL vers˜o 5.1. Um trigger a a ´ um tipo de stored procedure que ´ chamado quando um evento em particular ocorre. e e Por exemplo, vocˆ poderia configurar uma stored procedure que ´ disparada toda vez que e e um registro for apagado de uma tabela transacional que automaticamente apaga o cliente correspondente de uma tabela de clientes quando todas as transa¸˜es forem removidas. co
  • 84. 50 MySQL Technical Reference for Version 5.0.0-alpha 1.8.4.5 Chaves Estrangeiras No MySQL Server 3.23.44 e posterior, tabelas InnoDB suportam verifica¸˜o de restri¸˜o ca ca de chaves estrangeiras, incluindo CASCADE, ON DELETE, e ON UPDATE. Veja Se¸˜o 7.5.5.2 ca [Restri¸˜es de chaves estrangeiras do InnoDB], P´gina 652. co a Para outros tipos de tabela, o MySQL Server atualmente apenas analisa a sintaxe de FOREIGN KEY no comando CREATE TABLE, mas n˜o usa/armazena esta informa¸˜o. Em a ca um futuro pr´ximo esta implementa¸˜o ser´ estendida para que assim a informa¸˜o seja o ca a ca armazenada num arquivo de especifica¸˜o de tabela e possa ser recuperado por mysqldump ca e ODBC. Em um est´gio posterior, restri¸˜es de chaves estrangeiras ser˜o implementadas a co a para tabelas MyISAM. Note que as chaves estrangeiras no SQL n˜o s˜o usadas para ligar tabelas, mas s˜o usadas a a a para verificar a integridade referencial. Se vocˆ deseja obter resultados de m´ltiplas tabelas e u de uma instru¸˜o SELECT, vocˆ pode fazer isto ligando tabelas: ca e SELECT * FROM table1,table2 WHERE table1.id = table2.id; Veja Se¸˜o 6.4.1.1 [JOIN], P´gina 567. Veja Se¸˜o 3.6.6 [Exemplos de chaves estrangeiras], ca a ca P´gina 199. a Quando usada como uma restri¸˜o, FOREIGN KEYs n˜o precisa ser usado se a aplica¸˜o insere ca a ca duas linhas em tabelas MyISAM na ordem apropriada. Para tabelas MyISAM, vocˆ pode contornar a falta de ON DELETE adicionando a instru¸˜o e ca DELETE apropriada a uma aplica¸˜o quando vocˆ deletar registros de uma tabela que tem ca e uma chave estrangeira. Na pr´tica isto ´ mais r´pido e muito mais port´vel que utilizar a e a a chaves estrangeiras. No MySQL Server 4.0 vocˆ pode utilizar dele¸˜es multi-tabela para apagar linha de muitas e co tabelas com um comando. Veja Se¸˜o 6.4.5 [DELETE], P´gina 584. ca a A sintaxe FOREIGN KEY sem ON DELETE ... ´ usada geralmente por aplicac˜es ODBC para e o produzir cl´usulas WHERE autom´ticas. a a Note que chaves estrangeiras s˜o mal usadas com frequˆncia, o que pode causar graves a e problemas. Mesmo quando usado apropriadamente, o suporte a chaves estrangeiras n˜o ´ a e uma solu¸˜o m´gica para o problema de integridade referˆncial, embora possa ajudar. ca a e Algumas vantagens das chaves estrangeiras: • Assumindo o projeto apropriado das rela¸˜es, as restri¸˜es de chaves estrangeiras co co tornar˜o mais dif´ para um programador introduzir uma inconsistˆncia no banco a icil e de dados. • Usar atualiza¸˜es e dele¸˜es em cascata pode simplificar o c´digo do cliente. co co o • Regras de chaves estrangeiras projetados apropriadamente ajudam ao documentar a rela¸˜o entre as tabelas. ca Desvantagens: • Erros, que s˜o fac´is de se ter ao projetar a rela¸˜o das chaves, podem causar graves a e ca problemaspor exemplo, regras circulares ou a combina¸˜o errada de uma dele¸˜o em ca ca cascata. • Verifica¸˜o adicional no banco de dados afeta o desempenho, por esta raz˜o algumas ca a co o ´ da aplica¸˜o. das principais aplica¸˜es comerciais codificam sua l´gica no nivel ca
  • 85. Cap´ ıtulo 1: Informa¸˜es Gerais co 51 • N˜o ´ incomum para um DBA fazer uma topologia complexa de rela¸˜es que torna a e co muito dif´ e em alguns casos imposs´ icl, ivel, fazer backup ou restaurar tabelas individuais. 1.8.4.6 Views Views est˜o senda implementadas atualmente e aparecer˜o na vers˜o 5.0 e 5.1 do MySQL a a a Server. Historicamente o MySQL Server tem sido mais usado em aplica¸˜es e sistemas web onde o co ´ desenvolvedor da aplica¸˜o tem total controle sobre o uso do banco de dados. E claro que o ca uso aumentou em v´rias vezes e ent˜o descobrimos que um crescente n´meros de usu´rios a a u a consideram views como um importante aspecto. Unnamed views (derived tables, uma seubquery na cl´usula FROM de uma SELECT) j´ est˜o a a a implementadas na vers˜o 4.1. a Views geralmente s˜o muito uteis para permitir aos usu´rios acessar uma s´rie de rela¸˜es a ´ a e co (tabelas) como uma tabela, e limitar o acesso a apenas estas rela¸˜es. Views tamb´m co e podem ser usadas para restringir o acesso aos registros (um subconjunto de uma tabela em particular). Mas views n˜o s˜o necess´rias para restringir o acesso a registros j´ que a a a a o MySQL Server tem um sofisticado sistema de privil´gios. Veja Se¸˜o 4.3 [Sistema de e ca privil´gios], P´gina 227. e a Muitos SGBD n˜o permitem atualizar nenhum registro em uma view, mas vocˆ tem que a e fazer as atualiza¸˜es em tabelas separadas. co Em nosso projeto de implemta¸˜o de views, n´s buscamos (tanto quanto for poss´ dentro ca o ivel do SQL) compatibilidade com “Codd’s Rule #6” para sistemas de banco de dados rela- cionais: todos os views que s˜o teoricamente atualiz´veis, devem se atualizados tamb´m na a a e pr´tica. a 1.8.4.7 ‘--’ como In´ icio de Coment´rio a Outros bancos de dados SQL usam ‘--’ para iniciar coment´rios. O MySQL usa ‘#’ como a o caractere para in´ de coment´rio, mesmo se a ferramenta de linha de comando mysql icio a remover todas linhas que come¸am com ‘--’. Vocˆ tamb´m pode usar o coment´rio no c e e a estilo C /*isto ´ um coment´rio*/ com o MySQL Server. Veja Se¸˜o 6.1.6 [Coment´rios], e a ca a P´gina 479. a O MySQL Server vers˜o 3.23.3 e superior suporta o estilo de coment´rio ‘--’ somente se o a a coment´rio for seguido por um caractere de espa¸o (ou por um caracter de controle como a c uma nova linha). Isto ocorre porque este estilo de coment´rio causou muitos problemas a com queries SQL geradas automaticamente que usavam algo como o c´digo seguinte, onde o automaticamente er´ inserido o valor do pagamento para !pagamento!: a UPDATE nome_tabela SET credito=credito-!pagamento! O que vocˆ acha que ir´ acontecer quando o valor de pagamento for negativo? Como 1--1 e a ´ legal no SQL, n´s achamos terr´ que ‘--’ signifique in´ de coment´rio. e o ivel icio a Usando a nossa implementa¸˜o deste m´todo de coment´rio no MySQL Server Version ca e a 3.23.3 e posterior, 1-- Isto ´ um coment´rio ´ atualmente seguro. e a e Outro recurso seguro ´ que o cliente de linha de comando mysql remove todas as linhas que e iniciam com ‘--’.
  • 86. 52 MySQL Technical Reference for Version 5.0.0-alpha A seguinte discuss˜o somente interessa se vocˆ estiver executando uma vers˜o do MySQL a e a inferior a vers˜o 3.23: a Se vocˆ tem um programa SQL em um arquivo texto que contˆm coment´rios ‘--’ vocˆ e e a e dever´ usar: a shell> replace " --" " #" < arquivo-texto-com-coment´rio.sql a | mysql banco-de-dados No lugar de: shell> mysql banco-de-dados < arquivo-texto-com-comentario.sql Vocˆ tamb´m pode editar o pr´prio arquivo de comandos alterando os coment´rios ‘--’ e e o a para ‘#’: shell> replace " --" " #" -- arquivo-texto-com-comentario.sql Desfa¸a utilizando este comando: c shell> replace " #" " --" -- arquivo-texto-com-comentario.sql 1.8.5 Como o MySQL Lida com Restri¸˜es co Como o MySQL lhe permite trabalhar com tabelas transacionais e n˜o transacionais (que a n˜o permitem rollback), o tratamento de restri¸˜es ´ um pouco diferente no MySQL que a co e em outros bancos de dados. Temos que tratar o caso quando vocˆ atualiza diversos registros com uma tabela n˜o transa- e a cional que n˜o pode fazer rollback em erros. a A filosofia b´sica ´ tentar obter um erro para qualquer coisa que possamos detectar em temp a e de compila¸˜o mas tentar recuperar de qualquer erro que abtemos em tempo de execu¸˜o. ca ca Fazemos isto na maiorioa dos casos, mas n˜o para todos ainda. Veja Se¸˜o 1.6.4 [TODO a ca future], P´gina 29. a A op¸˜o b´sica que o MySQL tem ´ parar a instru¸˜o no meio ou fazer o melhor para se ca a e ca recuperar do problema e continuar. A seguir mostramos o que acontece com diferentes tipos de restri¸˜es. co 1.8.5.1 Restri¸oes de PRIMARY KEY / UNIQUE c˜ Normalmente vocˆ receber´ um erro quando tentar fazer um INSERT / UPDATE de um registro e a que cause uma viola¸˜o de uma chave prim´ria, chave unica ou chave estrangeira. Se vocˆ ca a ´ e estiver usando um mecanismo de armazenamento transacional, como InnoDB, o MySQL automaticamente far´ um rollback da transa¸˜o. Se vocˆ estiver usando mecanismos de a ca e armazenemento n˜o transacionais o MySQL ir´ para no registro errado e deiar o resto dos a a registros se processamento. Para tornar a vida mais f´cil o MySQL adicionou suporte a diretiva IGNORE para a maioria a dos comandos que podem causar uma viola¸˜o de chave (como INSERT IGNORE ...). Neste ca caso o MySQL ir´ ignorar qualquer viola¸˜o de chave e continuar´ com o processamento do a ca a pr´ximo registro. Vocˆ pode obter informa¸˜o sobre o que o MySQL fez com a fun¸˜o da o e ca ca API mysql_info() API function e em vers˜es posteriores do MySQL 4.1 com o comando o SHOW WARNINGS. Veja Se¸˜o 12.1.3.29 [mysql info], P´gina 798. Veja Se¸˜o 4.6.8.9 [SHOW ca a ca WARNINGS], P´gina 323. a
  • 87. Cap´ ıtulo 1: Informa¸˜es Gerais co 53 Note que no momento apenas as tabelas InnoDB suportam chaves estrangeiras. Veja Se¸˜o 7.5.5.2 [Restri¸˜es de chaves estrangeiras no InnoDB], P´gina 652. ca co a O suporte a chaves estrangeiras nas tabelas MyISAM est´ programado para ser inclu´ na a ida arvor´ de fonte do MySQL 5.0. e 1.8.5.2 Restri¸oes de NOT NULL c˜ Para poder suportar um f´cil tratamento de tabelas n˜o transacionais todos os campos no a a MySQL tˆm valores padr˜o. e a Se vocˆ inserir um valor ’errado’ em uma coluna como um NULL em uma coluna NOT NULL e ou um valor num´rico muito grande em um campo num´rico, o MySQL ir´ atribuir a coluna e e a ´ o ’melhor valor possivel’ em vez de dar uma mensagem de erro. Para strings este valor ´ e uma string vazia ou a maior string poss´ que possa estar na coluna. ivel Isto significa que se vocˆ tentar armazenar NULL em uma coluna que n˜o aceita valores NULL, e a o MySQL Server armazenar´ 0 ou ’’ (strig vazia) nela. Este ultimo comportamento pode, a ´ para uma simples inser¸˜o de registro, ser alterado com a op¸˜o de compila¸˜o -DDONT_ ca ca ca USE_DEFAULT_FIELDS.) Veja Se¸˜o 2.3.3 [Op¸˜es de configura¸˜o], P´gina 97. Isto faz com ca co ca a que as instru¸˜es INSERT gerem um erro a menos que vocˆ explicite valores espec´ co e ificos para todas as colunas que exigem um valor diferente de NULL. A raz˜o para as regras acima ´ que n˜o podemos verificar estas condi¸˜es antes da consulta a e a co come¸ar a executar. Se encontrarmos um problema depois de atualizar algumas linahs, n˜o c a podemos fazer um rollback j´ que o tipo de tabela n˜o suporta isto. A op¸˜o de parar n˜o a a ca a ´ t˜o boa como no caso em que a atualiza¸˜o esteja feita pela metade que ´ provavelmente e a ca e o pior cen´rio poss´ a ivel. Neste caso ´ melhor ’fazer o poss´ e ivel’ e ent˜o continuar como se a nada tivesse acontecido. No MySQL 5.0 plenejamos melhorar into forncendo avisos para convers˜es autom´ticas de campo, mais uma op¸˜o para deixar vocˆ fazer um rollback o a ca e das instru¸˜es que usam apenas tabelas transacionais no caso de tal instru¸˜o fizer uma co ca defini¸˜o de campo n˜o permitida. ca a O mostrado acima significa que n˜o se deve usar o MySQL para verificar o conte´do dos a u campos, mas deve se fazˆ-lo por meio da aplica¸˜o. e ca 1.8.5.3 Restri¸˜es de ENUM e SET co No MySQL 4.x ENUM n˜o ´ uma restri¸˜o real, mas um modo mauis eficiente de armazenar a e ca campos que possam apenas conter um conjunto de valores dados. Isto ´ devido as mesmas e raz˜es pelas quais NOT NULL n˜o ´ respeitado. Veja Se¸˜o 1.8.5.2 [restri¸˜es NOT NULL], o a e ca co P´gina 53. a Se vocˆ inserir um valor errado em um campo ENUM, ele ser´ configurado com uma string e a vazia em um contexto string. Veja Se¸˜o 6.2.3.3 [ENUM], P´gina 499. ca a Se vocˆ inserir uma op¸˜o errada em um campo SET, o valor errado ser´ ignorado. Veja e ca a Se¸˜o 6.2.3.4 [SET], P´gina 500. ca a 1.8.6 Erros Conhecidos e Deficiˆncias de Projetos no MySQL e
  • 88. 54 MySQL Technical Reference for Version 5.0.0-alpha 1.8.6.1 Erros da Vers˜o 3.23 Corrigidos em Vers˜es Posteriores do a o MySQL Os seguintes erros/bugs conhecidos n˜o est˜o corrigidos no MySQL 3.23 porque corrig´ a a i-los involveria a mudan¸a de muito c´digo, o que poderia introduzir outros erros, talvez piores. c o Os erros s˜o tamb´m classificados como ’n˜o fatal’ ou ’toler´vel’. a e a a • Pode se obter um deadlock ao fazer LOCK TABLE em multiplas tabelas e ent˜o na mesma a conex˜o fizer um DROP TABLE em uma delas enquanto outra thread est´ tentando blo- a a quear a tabela. Pode-se no entanto fazer um KILL em qualquer uma das threads envolvidas para resolver isto. Corrigido na vers˜o 4.0.12 a • SELECT MAX(campo_chave) FROM t1,t2,t3... onde uma das trˆs tabelas est´ vazia e a n˜o retorna NULL, mas sim o valor m´ximo da coluna. Corrigido na vers˜o 4.0.11. a a a • DELETE FROM heap_table sem um WHERE n˜o funcionam em tabelas HEAP com lock. a 1.8.6.2 Open Bugs / Deficiˆncias de Projeto no MySQL e Os seguintes problemas s˜o conhecidos e tem prioridade muito alta para serem corrigidos: a • FLUSH TABLES WITH READ LOCK n˜o bloqueia CREATE TABLE ou COMMIT, que pode criar a um problema com a posi¸˜o do log bin´rio ao se fazer um backup completo de tabelas ca a e do log bin´rio. a • ANALYZE TABLE em uma tabela BDB pode, em alguns, casos inutilizar a tabela at´ que e se reinicie o servidor mysqld. Quando isto acontecer vocˆ ir´ ver o seguinte tipo de e a erro no arquivo de erros do MySQL. 001207 22:07:56 bdb: log_flush: LSN past current end-of-log • O MySQL aceita parenteses na parte FROM, mas os ignora sem aviso. A raz˜o pela qual a n˜o s˜o retornados erros ´ que muitos clientes que geram consultas automaticamente a a e adicionam parentesis na parte FROM mesmo onde eles n˜o s˜o necess´rios. a a a • Concatenar muitos RIGHT JOINS ou combinar joins LEFT e RIGHT na mesma consulta podem dar uma resposta incorreta ja que o MySQL s´ gera registros NULL para tabelas o que precedem um join LEFT ou antes de um join RIGHT. Isto ser´ corrigido na vers˜o a a 5.0 junto com o suporte a parentesis na parte FROM. • N˜o execute ALTER TABLE em uma tabela BDB em que vocˆ estiver executando a e transa¸˜es multi-instru¸˜es n˜o completadas. co co a (A transa¸˜o provavelmente ser´ ca a ignorada). • ANALYZE TABLE, OPTIMIZE TABLE e REPAIR TABLE podem causar problemas em tabelas para as quais vocˆ estiver usando INSERT DELAYED. e • Fazendo um LOCK TABLE .. e FLUSH TABLES .. n˜o garante que n˜o existem transa¸˜es a a co n˜o terminadas em progresso na tabela. a • Tabelas BDB s˜o um pouco lentas para abrir. Se vocˆ tiver v´rias tabelas BDB em um a e a banco de dados, gastar´ muito tempo para usar o cliente mysql no banco de dados se a vocˆ n˜o estiver usando a op¸˜o -A ou se vocˆ estiver usando rehash. Isto ´ percebido e a ca e e principalmente quando vocˆ tiver um cache de tabelas grandes. e • A replica¸˜o utiliza o log a nivel de consulta: o master grava a consulta no log bin´rio. ca a Isto ´ um r´pido, compacto e eficiente m´todo de registro o que funciona perfeitamente e a e
  • 89. Cap´ ıtulo 1: Informa¸˜es Gerais co 55 na maioria dos casos. Embora nunca tenhamos ouvido sobre um caso ocorrido, h´ uma a chance te´rica que o dado no master e slave sejam diferente se uma consulta ´ feita o e de tal modo que a modifica¸˜o do dado ´ n˜o determin´ ca e a istica, isto ´, deixar ao desejo e do otimizador de consultas (o que geralmente n˜o ´ uma boa pr´tica, mesmo fora da a e a replica¸˜o!). Por exemplo: ca − CREATE ... SELECT ou INSERT ... SELECT que preenchem com zeros ou NULL uma coluna auto_increment. − DELETE se vocˆ estiver apagando registros de uma tabela que tem chaves es- e trangeiras com a propriedade ON DELETE CASCADE. − REPLACE ... SELECT, INSERT IGNORE ... SELECT se vocˆ tiver valores de chaves e duplicados nos dados inseridos. ˜ Se e somente se todos estas consultas NAO tiverem cl´usulas ORDER BY garantindo uma a ordem determin´ istica. Na verdade, por exemplo para INSERT ... SELECT sem ORDER BY, o SELECT pode re- tornar registros em uma ordem diferente (no qual resultar´ em um registro tendo a diferentes posi¸˜es, obtendo um n´mero diferente na coluna auto_increment), depen- co u dendo da escolhe feita pelo otimizador no master e slave. Uma consulta ser´ otimizada a deiferentemente no master e slave apenas se: − Os arquivos usados pelas duas consultas n˜o s˜o exatamente a mesma; por exemplo a a OPTIMIZE TABLE foi executado nas tabelas master e n˜o nas nas tabelas slave (para a corrigir isto, desde o MySQL 4.1.1, OPTIMIZE, ANALYZE e REPAIR s˜o escritos no a log bin´rio). a − A tabela est´ armazenada em um mecanismo de armazenamento diferente no mas- a ter e no slave (pode se executar diferentes mecanismos de armazenamento no metre e no slave: por exemplo, InnoDB ne master e MyISAM no slave, se o slave possuir menos espa¸o disppon´ em disco). c ivel − The MySQL buffers’ sizes (key_buffer_size etc) are different on the master and slave. − O master e slave executam vers˜es diferentes do MySQL, e o c´digo do toimizador o o ´ diferente entre estas vers˜es. e o Este problema tamb´m pode afetar a restaura¸˜o de um banco de dados usando e ca mysqlbinlog|mysql. O modo mais f´cil de evitar este problema em todos os casos ´ adicionar uma cl´usula a e a a ´ ORDER BY para tal consulta n˜o deterministica assegure que os registros s˜o sempre ar- a mazenados/modificados na mesma ordem. Nas vers˜es futuras do MySQL adicionare- o mos automaticamente uma cl´usula ORDER BY quando necess´rio. a a Os seguintes problemas s˜o conhecidos e ser˜o corrigidos na hora certa: a a • LIKE n˜o ´ seguro com caracteres multi-byte. A compara¸˜o ´ feita caracter por a e ca e caracter. • Ao usar fun¸˜es RPAD, ou qualquer outra fun¸˜o string que termina adicionando espa¸os co ca c em branco a direita, em uma consulta que preisa usar tabelas tempor´rias para ser a
  • 90. 56 MySQL Technical Reference for Version 5.0.0-alpha rsolvida, todas as strings resultantes ser˜o cortadas a direita (como em RTRIM). Este a ´ um exemplo de uma consulta: e SELECT RPAD(t1.field1, 50, ’ ’) AS f2, RPAD(t2.field2, 50, ’ ’) AS f1 FROM table1 as t1 LEFT JOIN table2 AS t2 ON t1.record=t2.joinID ORDER BY t2.record; O resultado final deste erro ´ que o usu´rio n˜o conseguira espa¸os em branco do lado e a a c direito do campo resultante. O comportamento anterior existe em todas as vers˜es do MySQL. o A raz˜o disto ´ devido ao fato de tabelas HEAP, que s˜o usadas primeiro para tabelas a e a tempor´rias, n˜o s˜o capazes de tratar colunas VARCHAR. a a a Este comportamento ser´ corrigido em uma das distribui¸˜es da s´rie 4.1. a co e • Devido ao modo como os arquvos de defini¸˜es de tabelas s˜o armazenados n˜o se co a a pode usar 255 caracteres (CHAR(255)) em nomes de tabelas, nomes de colunas e enum. Isto est´ programado para ser corrigido na vers˜o 5.1 quando temos novos arquivos de a a formatos de defini¸˜o de tabelas. ca • Quando estiver usando SET CHARACTER SET, n˜o ´ permitido usar caracteres especias a e no nome do banco de dados, tabelas ou campos. • Pode-se usar _ ou % com ESCAPE em LIKE ... ESCAPE. • se vocˆ tiver uma coluna DECIMAL com um n´mero armazenado em diferentes formatos e u (+01.00, 1.00, 01.00), GROUP BY pode considerar cada valor como um valor diferente. • DELETE FROM merge_table usado sem WHERE ir´ apenas apagar o mapeamento para a a tabela, n˜o apagando tudo nas tabelas mapeadas. a • 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 DISTINCT. Somente os primeiros bytes (padr˜o 1024) max_sort_length s˜o usados a a 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 a maioria dos casos ´ usar a substring: SELECT DISTINCT LEFT(blob,2048) FROM e nome_tabela. • C´lculos s˜o feitos com BIGINT ou DOUBLE (normalmente, ambos tem o tamanho de 64 a a bits). Depende da precis˜o utilizada na fun¸˜o. A regra geral ´ que fun¸˜es bin´rias a ca e co a s˜o feitas com precis˜o BIGINT, IF e ELT() com precis˜o BIGINT ou DOUBLE e o resto a a a com precis˜o DOUBLE. Devemos evitar o uso de valores sem sinal maiores que 63 bits a (9223372036854775807) para qualquer outra coisa al´m de campos bin´rios! e a • Todas os campos string, exceto campos do tipo BLOB e TEXTO tem, automaticamente, todos os espa¸os extras removidos quando recuperados. Para tipos CHAR, isto n˜o tem c a problema, e pode ser considerado como um recurso de acordo com o ANSI SQL92. O problema ´ que no MySQL, campos VARCHAR s˜o tratados desta mesma forma. e a • Vocˆ s´ pode ter at´ 255 colunas ENUM e SET em uma tabela. e o e • Em MIN(), MAX() e outras fun¸˜es de agrupamente, o MySQL atualmente compara as co colunas ENUM e SET pelo valor de suas strings ao inv´s da posi¸˜o relativa da string no e ca conjunto.
  • 91. Cap´ ıtulo 1: Informa¸˜es Gerais co 57 • mysqld_safe redireciona todas as mensagens de mysqld para o log mysqld. Um prob- lema com isto ´ que se vocˆ executar o mysqladmin refresh para fechar e reabrir o e e log, a stdout e a stderr continuam redirecionadas para o log antigo. Se vocˆ utiliza e --log extensivamente, dever´ editar o mysqld_safe para logar em ‘’hostname’.err’ a em vez de ‘’hostname’.log’; assim vocˆ pode facilmente utilizar o espa¸o do log antigo e c apagando-o e executando mysqladmin refresh. • Em instru¸˜es UPDATE, colunas s˜o atualizadas da esquerda para a direita. Se vocˆ co a e referenciar a uma coluna atualizada, vocˆ ir´ obter o valor atualizado em vez do valor e a original, por exemplo: mysql> UPDATE nome_tabela SET KEY=KEY+1,KEY=KEY+1; Isto atualiza KEY com 2 no lugar de 1. • Vocˆ pode se referir a m´ltiplas tabelas em uma mesma consulta, mas vocˆ n˜o pode se e u e a referir a qualquer tabelas tempor´rias dada mais de uma vez. Por exemplo, a seguinte a instru¸˜o n˜o funciona. ca a mysql> SELECT * FROM temporary_table, temporary_table AS t2; • RENAME n˜o funciona com tabelas tempor´rias (TEMPORARY) ou tabelas usadas em uma a a tabelas MERGE. • O otimizador pode lidar com o DISTINCT de forma diferente se vocˆ estiver usando col- e 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 a normais colunas escondidas n˜o participam na compara¸˜o DISTINCT. N´s provavel- a ca o 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; and 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; No segundo caso, vocˆ pode obter duas linhas idˆnticas no MySQL 3.23.x na s´rie do e e e resultado (porque o campo escondido ’id’ pode variar). Perceba que isto somente acontece em consultas onde vocˆ n˜o tem colunas ORDER e a BY no resultado, algo n˜o permitido no SQL-92. a • Como o MySQL permite trabalhar com tipos de tabelas que n˜o suportam transa¸˜es a co (e assim n˜o pode fazer rollback em dados) algumas coisas funcionam um pouco a diferentes de outros servidores SQL em MySQL (Isto serve para garantir que o MySQL nunca necessitar´ de um rollback para um comando SQL). Por´m isto pode ser um a e pouco estranho em casos que os valores dos campos devem ser verificados na aplica¸˜o, ca mas isto ira fornacer um ´timo ganho de velocidade assim como permite ao MySQL o fazer algumas otimiza¸˜es que de outro modo seriam muito dif´ co iceis para serem feitas.
  • 92. 58 MySQL Technical Reference for Version 5.0.0-alpha Se vocˆ informar um valor incorreto em uma coluna, o MySQL, em vez de fazer um e 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 ir´ armazenar o menor ou maior valor poss´ no campo. a ivel − Se tentar armazenar uma string que n˜o comece com um n´mero em uma coluna a u num´rica, o MySQL ir´ armazenar 0 na coluna. e a − Se vocˆ tentar armazenar NULL em uma coluna que n˜o aceita valores e a nulos, MySQL ir´ armazenar 0 ou ’’ (string vazia) na coluna. a (Este comportamento pode, entretanto, ser alterado com a op¸˜o de compila¸˜o ca 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). A id´ia ´ que n˜o ´ e e a e servi¸o do servidor SQL validar datas. Se o MySQL pode armazenar uma data e c recuperar extamente a mesma data, ent˜o o MySQL armazenar´ a data. Se a data a a estiver totalmente errada, o MySQL ir´ armazenar a data 0000-00-00 no campo. a − Se vocˆ especificar um valor n˜o suportado para um campo do tipo enum, ele ser´ e a a alterado para o valor de erro ’empty string’, com valor num´rico 0. e − Se vocˆ definir uma coluna SET com um valor n˜o suportado, o valor ser´ ignorado. e a a • Se vocˆ executar uma PROCEDURE em uma pesquisa que retorna uma s´rie vazia, em e e 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 ca a a compat´iveis. • O MySQL ainda n˜o pode lidar com valores NaN, -Inf e Inf em tipos double. Us´-los a a causar´ problemas na exporta¸˜o e importa¸˜o de dados. Uma solu¸˜o intermedi´ria a ca ca ca 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. • LIMIT em n´meros negativos s˜o tratados como n´meros grandes positivos. u a u • 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 tabela MERGE, a ordem das chaves ser´ diferente para as tabelas se existir uma chave a antiga n˜o unica na tabela. Isto ´ porque o ALTER TABLE coloca chaves UNIQUE antes a ´ e de chaves normais para ser poss´ detectar chaves duplicadas o mais cedo o poss´ ivel ivel. Os seguintes erros s˜o conhecidos em vers˜es mais antigas do MySQL: a o • 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 mesma linha poderia ter encontrado v´rios itens: a
  • 93. Cap´ ıtulo 1: Informa¸˜es Gerais co 59 UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY > 100; Um modo de contornar este erro ´ utilizar: e mysql> UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY+0 > 100; Isto funcionar´ porque MySQL n˜o utilizar´ indices em express˜es com a cl´usula a a a o a WHERE. • Antes da vers˜o 3.23 do MySQL, todos os tipos num´ricos tratados como campos a e de pontos fixos. Isto significa que vocˆ tem que especificar quantas casas decimais um e campo de ponto flutuante deve ter. Todos os resultados eram retornados com o n´mero u correto de casas decimais. Para erros espec´ificos na plataforma, vejas as se¸˜es sobre compila¸˜o e portabilidade. Veja co ca Se¸˜o 2.3 [Installing source], P´gina 94. Veja Apˆndice D [Porting], P´gina 1069. ca a e a
  • 94. 60 MySQL Technical Reference for Version 5.0.0-alpha 2 Instala¸˜o do MySQL ca Este cap´ itulo descreve como obter e instalar o MySQL: • Para uma lista de sites no quais vocˆ pode obter o MySQL, veja Se¸˜o 2.2.1 [Getting e ca MySQL], P´gina 75. a • Para saber quais s˜o as plataformas suportadas, veja em Se¸˜o 2.2.3 [Which OS], a ca P´gina 78. Por favor perceba que nem todas as plataformas suportadas s˜o igualmente a a boas para executar o MySQL. Algumas s˜o mais robustas e eficientes que outras - ver a Se¸˜o 2.2.3 [Which OS], P´gina 78 para detalhes. ca a • V´rias vers˜es do MySQL est˜o dispon´ a o a iveis em distribui¸˜es bin´rias e fonte. N´s co a o tamb´m fornecemos acesso p´blico ` nossa ´rvore fonte atual para aqueles que desejam e u a a ver nossos desenvolvimentos mais recentes e nos ajudar a testar novos c´digos. Para o determinar que vers˜o e tipo da distribui¸˜o vocˆ deve usar, veja Se¸˜o 2.2.4 [Which a ca e ca version], P´gina 80. Se ainda restar d´vidas, use uma a distribui¸˜o bin´ria. a u ca a • Instru¸˜es de instala¸˜o para distribui¸˜es bin´ria e fonte s˜o descritos em Se¸˜o 2.2.9 co ca co a a ca [Installing binary], P´gina 91 e Se¸˜o 2.3 [Installing source], P´gina 94. Cada conjunto a ca a de instru¸˜es inclui uma se¸˜o sobre problemas espec´ co ca ificos de sistemas que vocˆ pode e precisar. • Para procedimentos p´s-instala¸˜o, veja Se¸˜o 2.4 [Post-installation], P´gina 111. Estes o ca ca a procedimentos podem ser aplicados caso vocˆ use uma distribui¸˜o bin´ria ou fonte do e ca a MySQL. 2.1 Instala¸˜o r´pida padr˜o do MySQL ca a a Este cap´ itulo cobre a instala¸˜o do MySQL em plataformas onde oferecemos pacotes usando ca oformato de empacotamento nativo da respectiva plataforma. No entanto, as distribui¸˜es co bin´rias do MySQL est˜o dispon´ a a iveis para muitas outras plataformas, veja Se¸˜o 2.2.9 ca [Installing binary], P´gina 91 para instru¸˜es gerais de instala¸˜o para estes pacotes que se a co ca aplicam a todas as plataformas. Veja Se¸˜o 2.2 [General Installation Issues], P´gina 75 para mais informa¸˜es sobre quais ca a co outras distribui¸˜es bin´rias est˜o dispon´ co a a iveis e como obtˆ-las. e 2.1.1 Instalando o MySQL no Windows O processo de instala¸˜o para o MySQL no Windows tem os seguintes passos: ca 1. Instale a distribui¸˜o. ca 2. Configure um arquivo de op¸˜o se necess´rio. ca a 3. Selcione o servidor que vocˆ quer usar. e 4. Inicie o servidor. O MySQL para Windows est´ dispon´ em dois formatos de distribui¸˜o: a ivel ca • A distribui¸˜o bin´ria cont´m um programa de instala¸˜o que instala que vocˆ precisa ca a e ca e e assim possa iniciar o servidor imediatamente.
  • 95. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 61 • A distribui¸˜o fonte cont´m todo o c´digo e os arquivos suportados para construir o ca e o execut´vel usando o compilador VC++ 6.0. Veja Se¸˜o 2.3.7 [Constru¸˜o do fonte para a ca ca Windows], P´gina 107. a ca a ´ Geralmente, a melhor op¸˜o ´ a distribui¸˜o bin´ria. E mais simples e vocˆ n˜o precisa de ca e e a nenhuma ferramenta adicional para ter o MySQL em execu¸˜o.ca 2.1.1.1 Exigˆncias do Sistema Windows e Para executar o MySQL no Windows, vocˆ precisar´ do seguinte: e a • Um sistema operacional Windows de 32 bits como 9x, ME, NT, 2000 ou XP. A fam´ ilia NT (Windows NT, 2000 e XP) lhe permite executar o servidor MySQL como um servi¸o. Veja Se¸˜o 2.1.1.7 [NT start], P´gina 66. c ca a • Suporte ao protocolo TCP/IP. • Um c´pia da distribui¸˜o bin´ria do MySQL para Windows, o qual pode ser feito o ca a download em http://www.mysql.com/downloads/. Nota: A distribui¸˜o de arquivos s˜o fornecidas no formato zip e recomendamos o ca a uso de um cliente FTP com op¸˜o de resumo para evitar corrompimento de arquivos ca durante o processo de download. • Um programa ZIP para descompactar os arquivos da distribui¸˜o. ca • Espa¸o suficiente em disco para descompactar, instalar e criar o banco de dados de c acordo com suas exigˆncias. e • Se vocˆ planeja se conectar ao servidor MySQL via ODBC, vocˆ tamb´m precisar´ do e e e a dirver MyODBC. Veja Se¸˜o 12.2 [ODBC], P´gina 866. ca a • Se vocˆ precisa de tabelas com tamanho maior que 4GB, instale o MySQL em um e sistema de arquivos NTFS ou mais novo. N˜o se esque¸a de usar MAX_ROWS e AVG_ROW_ a c LENGTH quando criar tabelas. Veja Se¸˜o 6.5.3 [CREATE TABLE], P´gina 597. ca a 2.1.1.2 Instalando uma Distribui¸˜o Bin´ria do Windows ca a Para instalar o MySQL no Windows usando uma distribui¸˜o bin´ria, siga este procedi- ca a mento: 1. Se vocˆ estiver trabalhando em uma m´quina Windows NT, 2000, ou XP, esteja certo e a de que vocˆ est´ logado com um usu´rio com privileios de administrador. e a a 2. Se vocˆ estiver fazendo uma atualiza¸˜o de uma instala¸˜o MySQL mais nova, ´ e ca ca e necess´rio parar o servidor atual. Em m´quinas com Windows NT, 200 ou XP, se a a vocˆ estiver executando o servidor como um servi¸o, pare-o com o comando: e c C:> NET STOP MySQL Se vocˆ planeja usar um servidor diferente depois da atualiza¸˜o (por exemplo, se vocˆ e ca e quiser executar o mysqld-max em vez do mysqld), remova o servi¸o existente: c C:mysqlbin> mysqld --remove 3. Vocˆ pode reinstalar o servi¸o com o servidor pr´prio depois de atualizar. e c o Se vocˆ n˜o estiver executando o servidor MySQL como um servi¸o, pare desta forma: e a c
  • 96. 62 MySQL Technical Reference for Version 5.0.0-alpha C:mysqlbin> mysqladmin -u root shutdown 4. Finalize o programa WinMySQLAdmin se ele estiver em execu¸˜o. ca 5. Descompacte os arquivos de distribui¸˜o em um diret´rio tempor´rio. ca o a 6. Execute o programa ‘setup.exe’ para iniciar o processo de instala¸˜o. Se vocˆ quiser ca e instalar em um diret´rio diferente do padr˜o (‘c:mysql’), use o bot˜o Browse para o a a especificar seu diret´rio preferido. Se vocˆ n˜o instalar o MySQL no local padr˜o, vocˆ o e a a e precisar´ epecificar o local onde vocˆ inicia o servidor. O modo mais f´cil de se fazer a e a isto ´ usar um arquivo de op¸˜o, como descrito em Se¸˜o 2.1.1.3 [Windows prepare e ca ca environment], P´gina 62. a 7. Finalize o processo de instala¸˜o. ca 2.1.1.3 Preparando o Ambiente MySQL do Windows Se vocˆ precisar especificar op¸˜es de inicializa¸˜o quando executar o servidor, vocˆ pode e co ca e indentifica-los na linha de comando ou coloc´-los em um arquivo de op¸˜o. Par op¸˜es que a ca co s˜o usadas sempre que o servidor iniciar, vocˆ achar´ mais conveniente utilizar um arquivo a e a de opc˜o para especificar a configura¸˜o do seu MySQL. Isto ´ particularmente verdade sob a ca e as seguintes circunstˆncias: a • A localiza¸˜o do diret´rio de instala¸˜o ou dados s˜o diferentes dos locais padr˜o ca o ca a a (‘c:mysql’ e ‘c:mysqldata’). • Vocˆ precisa ajustar as configura¸˜es do servidor. Por exemplo, para usar as tabelas e co transacionais InnoDB no MySQL vers˜o 3.23, vocˆ deve criar manualmente dois novos a e diret´rios para guardar os arquivos de dados e de log do InnoDB — por exemplo, o ‘c:ibdata’ e ‘c:iblogs’. Vocˆ tamb´m poder´ adicionar algumas linhas extras ao e e a arquivo de op¸˜o, como descrito em Se¸˜o 7.5.3 [Iniciando o InnoDB], P´gina 643. (A ca ca a partir do MySQL 4.0, o InnoDB cria os seus arquivos de log e dados no diret´rio de da- o dos por padr˜o. Isto significa que vocˆ n˜o precisa configurar o InnoDB explicitamente. a e a Vocˆ ainda deve fazˆ-lo se desejar, e um arquivo de op¸˜o ser´ util neste caso.) e e ca a´ No Windows, o instalador do MySQL coloca o diret´rio de dados diretamente sob o diret´rio o o onde vocˆ instalou o MySQL. Se vocˆ quisesse utilizar um diret´rio de dados em um local e e o diferente, vocˆ deve copiar todo o conte´do do diret´rios data para a nova localiza¸˜o. Por e u o ca exemplo, por padr˜o, o instalador coloca o MySQL em ‘C:mysql’ e o diret´rio de dados a o em ‘C:mysqldata’. Se vocˆ quiser usar um diret´rio de dados de ‘E:mydata’, vocˆ deve e o e fazer duas coisas: • Mova o diret´rio de dados de ‘C:mysqldata’ para ‘E:mydata’. o • Use uma op¸˜o --datadir para especificar a nova localiza¸˜o do diret´rio de dados ca ca o cada vez que vocˆ iniciar o servidor. e Quando o servidor MySQL inicia no Windows, ele procura pelas op¸˜es em dois arquivos: co O arquivo ‘my.ini’ no diret´rio Windows e o arquivo chamado ‘C:my.cnf’. O diret´rio o o do Windows ´ normalmente chamado ‘C:WINDOWS’ ou ‘C:WinNT’. Vocˆ pode determinar e e a sua localiza¸˜o exata a partir do valor da vari´vel de ambiente WINDIR usando o seguinte ca a comando: C:> echo %WINDIR%
  • 97. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 63 O MySQL procura pelas op¸˜es primeiro no arquivo ‘my.ini’, e ent˜o pelo arquivo ‘my.cnf’. co a No entanto, para evitar confus˜o, ´ melhor se vocˆ usar apenas um destes arquivos. Se o a e e seu PC usa um boot loader onde o drive C: n˜o ´ o drive de boot, sua unica op¸˜o ´ usar a e ´ ca e o arquivo ‘my.ini’. Independente de qual arquivo usar, ele deve ser no formato texto. Um arquivo de op¸˜o pode ser criado e modificado com qualquer editor de texto como o ca programa Notepad. Por exemplo, se o MySQL est´ instalado em ‘D:mysql’ e o diret´rio a o de dados est´ localizado em ‘D:mydatadata’, vocˆ pode criar o arquivo de op¸˜o e definir a e ca uma se¸˜o [mysqld] para especificar valores para os parˆmetros basedir e datadir: ca a [mysqld] # defina basedir com o seu caminho de instala¸~o ca basedir=D:/mysql # defina datadir com o local do diret´rio de dados, o datadir=D:/mydata/data Note que os nome de caminho do Windows s˜o espec´ a ificados em arquivos de op¸˜o usando ca barras normais em ves de barra invertida. Se vocˆ usar barras invertidas, vocˆ deve us´-las e e a em dobro. Outro modo de se gerenciar um arquivo de op¸˜o ´ usar a ferramenta WinMySQLAdmin. Vocˆ ca e e pode encontrar o WinMySQLAdmin no diret´rio ‘bin’ de sua instala¸˜o MySQL, assim como o ca um arquivo de ajuda contendo instru¸˜es para us´-lo. O WinMySQLAdmin tem a capacidade co a de editar os seus arquivos de op¸˜o, mas note o seguinte: ca • WinMySQLAdmin usa apenas o arquivo ‘my.ini’. • Se o WinMySQLAdmin encontra o arquivo ‘C:my.cnf’, ele o renomear´ para a ‘C:my_cnf.bak’ para disabilit´-lo. a Agora vocˆ est´ pronto para testar o servidor. e a 2.1.1.4 Selecionando um Servidor Windows Iniciado com o MySQL 3.23.38, a distribui¸˜o Windows inclui ambos bin´rios, normal e o ca a MySQL-Max. Aqui est´ uma lista dos diferentes servidores MySQL dos quais vocˆ pode a e escolher: Binario Descri¸˜o ca mysqld Compilado com debugger integral e conferˆncia autom´tica de aloca¸˜o e a ca de mem´ria, links simb´licos, BDB e tabelas InnoDB. o o mysqld-opt Bin´rio otimizado. A partir da vers˜o 4.0 o InnoDB est´ habili- a a a tado. Antes desta vers˜o, este servidor n˜o tem suporte a tabelas a a transacionais. mysqld-nt Bin´rio otimizado para NT/2000/XP com suporte para named pipes. a mysqld-max Bin´rio otimizado com suporte para links simb´licos, tabelas BDB e a o InnoDB. mysqld-max-nt Como o mysqld-max, por´m compilado com suporte para named pipes. e Todos os bin´rios acima s˜o otimizados para processadores Intel modernos mas deve fun- a a cionar em qualquer processador Intel i386 ou melhor. Os servidores mysqld-nt e mysqld-max-nt suportam conex˜es named pipe. Se vocˆ usar o e um destes servidores, o uso de named pipes est´ sujeito a estas condi¸˜es: a co
  • 98. 64 MySQL Technical Reference for Version 5.0.0-alpha • Os servidores devem ser executados em uma vers˜o do Windows que suporte named a pipes (NT, 2000, XP). • A partir da vers˜o 3.23.50, named pipes s´ estar˜o habilitados se vocˆ iniciar estes a o a e servidores com a op¸˜o --enable-named-pipe. ca • Os servidores podem ser executados no Windows 98 ou Me, mas o TCP/IP deve estar instalado, e as conex˜es named pipes n˜o podem ser usadas. o a • No Windows 95, estes servidores n˜o podem ser usados. a 2.1.1.5 Iniciando o Servidor pela Primeira Vez No Windows 95, 98, ou Me, cliente MySQL sempre se conecta ao servidor usando TCP/IP. Nos sistemas baseados no NT, como o Windows NT, 2000, ou XP, os clientes possuem duas op¸˜es. Eles podem usar TCP/IP, ou eles podem usar um named pipe se o servidor suportar co conex˜es named pipes. o Para informa¸˜es sobre qual servidor bin´rio executar, veja Se¸˜o 2.1.1.3 [Windows prepare co a ca environment], P´gina 62. a Esta se¸˜o lhe d´ um vis˜o geral da inicializa¸˜o de um servidor MySQL. A seguinte se¸˜o ca a a ca ca fornce informa¸˜o mais espec´ ca ifica para vers˜es particulares do Windows. o Os exemplos nesta se¸˜o assumem que o MySQL est´ instalado sob a localiza¸˜o padr˜o, ca a ca a ‘C:mysql’. Ajuste o caminho mostrado nos exemplos se vocˆ tiver o MySQL instalado em e um local diferente. Fazer um teste a partir do prompt de comando do em uma janela de console (uma janela “DOS”) ´ a melhor coisa a fazer porque o servidor mostra a mensagem de status que aparece e na janela do DOS. Se alguma coisa estiver errado com sua configura¸˜o, estas mensagens ca tornar˜o mais f´cil para vocˆ de identificar e corrigir qualquer problema. a a e Tenha certeza que vocˆ est´ no diret´rio onde o servidor ´ localizado e ent˜o entre este e a o e a comando: shell> mysqld --console Para servidores que incluem suporte InnoDB, vocˆ deve ver as seguintes mensagens assim e que o servidor iniciar: InnoDB: The first specified datafile c:ibdataibdata1 did not exist: InnoDB: a new database to be created! InnoDB: Setting file c:ibdataibdata1 size to 209715200 InnoDB: Database physically writes the file full: wait... InnoDB: Log file c:iblogsib_logfile0 did not exist: new to be created InnoDB: Setting log file c:iblogsib_logfile0 size to 31457280 InnoDB: Log file c:iblogsib_logfile1 did not exist: new to be created InnoDB: Setting log file c:iblogsib_logfile1 size to 31457280 InnoDB: Log file c:iblogsib_logfile2 did not exist: new to be created InnoDB: Setting log file c:iblogsib_logfile2 size to 31457280 InnoDB: Doublewrite buffer not found: creating new InnoDB: Doublewrite buffer created InnoDB: creating foreign key constraint system tables InnoDB: foreign key constraint system tables created
  • 99. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 65 011024 10:58:25 InnoDB: Started Quando o servidor finaliza sua sequˆncia de inicializa¸˜o, vocˆ deve ver algo como abaixo, e ca e que indica que o servidor est´ pronto para o conex˜o com o cliente: a a mysqld: ready for connections Version: ’4.0.14-log’ socket: ’’ port: 3306 O servidor continuar´ a gravar no console qualquer sa´ de diagn´stico adicional que ele a ida o produza. Vocˆ pode abrir uma nova janela de console na qual se executar´ os programas e a clientes. Se vocˆ omitir a op¸˜o --console, o servidor grava a sa´ do diagn´stico no log de erro e ca ida o no diret´rio de dados. O log de erro ´ o arquivo com a extens˜o ‘.err’. o e a 2.1.1.6 Iniciando o MySQL no Windows 95, 98, ou Me No Windows 95, 98 ou Me, o MySQL usa TCP/IP para conectar um cliente a um servidor. (Isto permitir´ que qualquer m´quina na sua rede se conecte a seu servidor MySQL.) Por a a isto, vocˆ deve ter certeza de que o suporte TCP/IP est´ instalado na sua m´quina antes e a a de iniciar o MySQL. Vocˆ pode encontrar o TCP/IP no seu CD-ROM do Windows. e Note que se vocˆ estiver usando uma vers˜o antiga do Win95 (por exemplo, OSR2). E e a ´ prefer´ que vocˆ use um pacote antigo Winsock; para o MySQL ´ necess´rio o Winsock ivel e e a 2! Vocˆ pode obter o Winsock mais novo em http://www.microsoft.com. O Windows 98 e tem a nova biblioteca Winsock 2, portanto n˜o ´ necess´rio atualizar a biblioteca. a e a Para iniciar o servidor mysqld, vocˆ deve iniciar uma janela do Prompt (Janela “MS-DOS”) e e digitar: shell> C:mysqlbinmysqld Isto ir´ iniciar o mysqld em segundo plano. Isto ´, depois do servidor iniciar, vocˆ deve ver a e e outro prompt de comando. (Note que se vocˆ iniciar o servidor deste modo no Windows e NT, 2000 ou XP, o servidor ir´ executar em segundo plano e nenhum prompt de comando a aparecer´ at´ que o servidor finalize. Por isto, vocˆ deve abrir outro prompt de comando a e e para executar programas clientes enquanto o servidor estriver em execu¸˜o.) ca Vocˆ pode finalizar o servidor MySQL executando: e shell> C:mysqlbinmysqladmin -u root shutdown Isto chama o utilit´rio administrativo do MySQL mysqladmin para conectar ao servidor e a manda-lo finalizar. O comando conecta como root que ´ a conta administrativa padr˜o no e a sistema de permiss˜es do MySQL. Por favor, note que o sistema de permiss˜es do MySQL o o ´ totalmente independente de qualquer login de usu´rio sob o Windows. e a Se o mysqld n˜o iniciar, por favor, verifique o log de erro para ver se o servidor escreveu a alguma mensagem que possa indicar a causa do problema. Vocˆ pode tamb´m tentar iniciar e e o servidor com mysqld --console; neste caso, vocˆ pode obter alguma informa¸˜o util na e ca ´ tela que pode ajudar a resolver o problema. A ultima op¸˜o ´ iniciar o mysqld com --standalone --debug. Neste caso o mysqld ir´ ´ ca e a escrever em um arquivo log ‘C:mysqld.trace’ que deve conter a raz˜o pela qual o mysqld a n˜o inicia. Veja Se¸˜o D.1.2 [Making trace files], P´gina 1071. a ca a Use mysqld --help para mostrar todas as op¸˜es que o mysqld entende! co
  • 100. 66 MySQL Technical Reference for Version 5.0.0-alpha 2.1.1.7 Iniciando o MySQL no Windows NT, 2000, ou XP Na fam´ NT (Windows NT, 2000 ou XP) o modo recomendado de executar o MySQL ´ ilia e instal´-lo como um servi¸o do Windows. O Windows ent˜o inicia e para o servidor MySQL a c a automaticamente quando o Windows inicia e para. Um servidor instalado como um servi¸o c tamb´m pode ser controlado a partir da linha de comando usando os comandos NET, ou e com o utilit´rio gr´fico Servi¸os. a a c O utilit´rio Servi¸os (o Service Control Manager do Windows) pode ser encontrado no a c Painel de Controle do Windows (em Ferramentas Administrativas no Windows 2000). ´ E recomendado que se feche o utilit´rio Servi¸os enquanto realiza a opera¸˜es de instala¸˜o a c co ca ou remo¸˜o do servidor a partir desta linha de comando. Isto evita alguns erros estranhos. ca Para ter o MySQL funcionando com TCP/IP no Windows NT 4, vocˆ deve instalar o service e pack 3 (ou mais novo)! Antes de instalar o MySQL como um servi¸o, vocˆ deve primeiro parar o servidor atual em c e execu¸˜o usando o seguinte commando: ca shell> C:mysqlbinmysqladmin -u root shutdown Isto chama o utilit´rio administrativo do MySQL mysqladmin para conectar ao servidor a e mand´-lo parar. O comando conecta com root que ´ a conta administrativa padr˜o no a e a sistema de permiss˜es do MySQL. Por favor, note que o sistema de permiss˜es do MySQL o o ´ totalmente independente de qualquer login de usu´rio sob o Windows. e a Agora instale o servidor como um servi¸o: c shell> mysqld --install Se vocˆ n˜o definir um nome para o servi¸o, ele ´ instalado com o nome MySQL. Uma vez e a c e instalado, ele pode ser imediatamente iniciado a partir do utilit´rio Servi¸os, ou usando o a c comando NET START MySQL. (Este comando ´ caso insensitivo). e Uma vez em execu¸˜o, o mysqld pode ser parado usando o utilit´rio de Servi¸os ou usando ca a c o comando NET STOP MySQL, ou o comando mysqladmin shutdown. Se vocˆ tiver problemas instalando o mysqld como um servico usando apenas o nome do e servidor, tente instal´-lo usando seu caminho compelto: a shell> C:mysqlbinmysqld --install A partir do MySQL 4.0.2, vocˆ pode especificaro nome do servi¸o depois da op¸˜o -- e c ca install. A partir do MySQL 4.0.3, vocˆ pode especificar uma op¸˜o --defaults-file e ca depois do nome do servi¸o para indicar onde o servidor deve obter op¸˜es ao iniciar. A c co regras que determinam o nome do servi¸o e os arquivos de op¸˜o que o servidor usa s˜o as c ca a seguintes: • Se vocˆ n˜o especificar um nome de servi¸o, o servidor usa o nome padr˜o do MySQL e e a c a o servidor lˆ as op¸˜es do grupo [mysqld] no arquivo de op¸˜es padr˜o. e co co a • Se vocˆ especificar um nome de servi¸o depois da op¸˜o --install, o servidor ignora e c ca o grupo de op¸˜o [mysqld] em vez de ler op¸˜es do grupo que tem o mesmo nome que ca co o servi¸o. O servidor le op¸˜es do arquivo de op¸˜es padr˜o. c co co a • Se vocˆ especificar uma op¸˜o --defaults-file depois do nome de servi¸o, o servidor e ca c ignora o arquivo de op¸˜es padr˜o e lˆ op¸˜es apenas a partir do grupo [mysqld] do co a e co arquivo indicado.
  • 101. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 67 No caso normal que vocˆ instala o servidor com --install mas nenhum nome de servi¸o, e c o servidor ´ instalado com um nome de servi¸o de MySQL. e c Como um exemplo mais complexo, considere o seguinte comando: shell> C:mysqlbinmysqld --install mysql --defaults-file=C:my-opts.cnf Aqui, um nome de servi¸o ´ dado depois de op¸˜o --install. Se nenhuma op¸˜o -- c e ca ca defaults-file for dada, este comando teria o efeito de fazer o servidor ler o grupo [mysql] a partir do arquivo de op¸˜es padr˜o. (Isto seria uma m´ id´ia, porque aquele grupoo co a a e de op¸˜o ´ para ser usado pelo programa cliente mysql.) No entanto, como a op¸˜o -- ca e ca defaults-file est´ presente, o servidor lˆ as op¸˜es apenas a partir do arquivo indicado, a e co e apenas do grupo de op¸˜o [mysqld]. ca Vocˆ tamb´m pode especificar as op¸˜es como “Par^metros de inicializa¸~o” no e e co a ca utilit´rio de Servi¸os do Windows antes de vocˆ iniciar o servi¸o MySQL. a c e c Uma vez que o servidor MySQL ´ instalado, o Windows ir´ iniciar o servi¸o automaticamente e a c sempre que o Windows inicia. O servi¸o tamb´m pode ser iniciado imediatamente a partir c e do utilit´rio Servi¸os ou usando o comando NET START MYSQL. O comando NET n˜o ´ caso a c a e sensitivo. Note que quando executado como um servi¸o, o mysqld n˜o tˆm acesso a um console e c a e ent˜o nenhuma mensagem pode ser vista. Se o mysqld n˜o iniciar, verifique o log de erros a a par ver se o servidor gravou alguma mensagem l´ indicando a causa do problema. O log de a a o ´ erro est´ localizado no diret´rio ‘c:mysqldata’. E o arquivo com um sufixo ‘.err’. Quando o mysqld est´ executando como um servi¸o, ele pode ser parado usando o utilit´rios a c a Servi¸os, o comando NET STOP MYSQL, ou o comando mysqladmin shutdown. Se o servi¸p c c estiver em execu¸˜o quando o Windows desliga, o Windows ir´ parar o servidor automati- ca a camente. A partir do MySQL vers˜o 3.23.44, vocˆ pode escolher entre instalar o servidor como um a e servi¸o Manual se vocˆ n˜o deseja que os servi¸os sejam executados automaticamente du- c e a c rante o processo de inicializa¸˜o. Para fazer isto, use a op¸˜o --install-manual em vez ca ca da op¸˜o --install. ca shell> C:mysqlbinmysqld --install-manual Para remover um servi¸o que est´ instalado como um servi¸o, primeiro pare-o se ele estiver c a c em execu¸˜o. Ent˜o use a op¸˜o --remove para removˆ-lo: ca a ca e shell> mysqld --remove Um problema com a finaliza¸˜o autom´tica do servi¸o MySQL ´ que, para vers˜es do ca a c e o MySQL anteriores a 3.23.49, o Windows esparava apenas por alguns segundos para o desliga- mento completo, e matava os processos do servidor de banco de dados se o tempo limite fosse excedido. Isto potencialmente causava problemas. (Por exemplo, o mecanimo de ar- mazenamento InnoDB dever´ fazer uma recupera¸˜o de falhas na pr´xima inicializa¸˜o). A a ca o ca partir do MySQL 3.23.49, o Windows ir´ esperar mais para que a finaliza¸˜o do MySQL a ca Server esteja completa. Se vocˆ notar que ainda n˜o ´ o suficiente para a sua instala¸˜o, e a e ca n˜o ´ seguro executar o MySQL Server como um servi¸o. Em vez disso, execute-o a partir a e c do prompt de comando, e finalize-o com mysqladmin shutdown. A altera¸˜o para avisar para o Windows para esperar mais quando parar o servidor MySQL ca funciona apenas com o Windows 2000 e XP, mas n˜o para o Windows NT. No NT, o a Windows espera apenas 20 segundos para que o servi¸o seja finalizado, e depois desso ele c
  • 102. 68 MySQL Technical Reference for Version 5.0.0-alpha mata o processo do servi¸o. Vocˆ pode aumentar este padr˜o abrindo o Editor de Registro c e a (‘winntsystem32regedt32.exe’) e editar o valor de WaitToKillServiceTimeout em ‘HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControl’ na ´rvore do Registro. Es- a pecifique o novo valor mais largo em milisegundos (por exemplo 12000 para que o Windows NT espere at´ 120 segundos). e Se vocˆ n˜o quiser iniciar o mysqld como um servi¸o, vocˆ pode inici´-lo a partir da linha e a c e a de comando do mesmo modo que em vers˜es do Windows que n˜o s˜o baseados no NT. o a a Para instru¸˜es use Se¸˜o 2.1.1.6 [Win95 start], P´gina 65. co ca a 2.1.1.8 Executando o MySQL no Windows O MySQL suporta TCP/IP em todas as plataformas Windows. Os servidores mysqld-nt e mysql-max-nt suportam named pipes no NT, 2000 e XP. No entanto, o padr˜o ´ usar a e TCP/IP, independente da plataforma: • Named pipes ´ atualmente mais lento que TCP/IP em muitas configura¸˜es do Win- e co dows. • Alguns usu´rios encontraram problemas ao finalizar o servidor MySQL quando era a usado named pipes. A partir da vers˜o 3.23.50, named pipes s´ est´ habilitado para o mysqld-nt e mysql-max- a o a nt se eles forem iniciados com a op¸˜o --enable-named-pipe. ca Vocˆ pode for¸ar que um cliente MySQL use named pipes especificando a op¸˜o --pipe ou e c ca especificando . como nome de m´quina. Use a op¸˜o --socket para especificar o nome do a ca pipe. No MySQL 4.1, vocˆ deve usar a op¸˜o --protocol=PIPE. e ca Vocˆ pode testar se o MySQL est´ funcionando executando qualquer dos seguintes coman- e a dos: C:> C:mysqlbinmysqlshow C:> C:mysqlbinmysqlshow -u root mysql C:> C:mysqlbinmysqladmin version status proc C:> C:mysqlbinmysql test Se o mysqld est´ lento para responder a suas conex˜es no Win95/Win98, provavelmente a o existe um problema com seu DNS. Neste caso, inicie o mysqld com a op¸˜o --skip-name- ca resolve e use somente localhost e n´meros IP na coluna Host das tabelas de permiss˜es u o do MySQL. Existem duas vers˜es da ferramenta de linha de comando MySQL: o Binario Descri¸˜o ca mysql Compilado em Windows nativo, oferecendo capacidades de edi¸˜o de ca texto muito limitadas. mysqlc Compilado com o compilador Cygnus GNU, que oferece edi¸˜o ca readline. Se vocˆ desejar usar o mysqlc, deve ter uma c´pia da biblioteca ‘cygwinb19.dll’ em al- e o gum lugar que o mysqlc possa encontr´-la. Se sua distribui¸˜o do MySQL n˜o tiver esta a ca a biblioteca instalada no mesmo diret´rio que o mysqlc (o diret´rio bin sob o diret´rio base o o o sa dua instala¸˜o do MySQL). Se sua distribui¸˜o n˜o tem a biblioteca cygwinb19.dll no ca ca a diret´rio ‘bin’, olhe no diret´rio lib para encontr´-lo e copi´-lo para o seu diret´rio de o o a a o sistema no Windows. (‘Windowssystem’ ou um lugar parecido).
  • 103. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 69 Os privil´gios padr˜es no Windows d˜o a todos usu´rios locais privil´gios totais para todos e o a a e os bancos de dados sem necessidade de especificar uma senha. Para deixar o MySQL mais seguro, vocˆ deve configurar uma senha para todos os usu´rio e remover a linha na tabela e a mysql.user que tem Host=’localhost’ e User=’’. Vocˆ tamb´m deve adicionar uma senha para o usu´rio root. O exemplo seguinte exemplo e e a inicia removendo o usu´rio anˆnimo que tem todos os privil´gios, e ent˜o configura uma a o e a senha para o usu´rio root: a C:> C:mysqlbinmysql mysql mysql> DELETE FROM user WHERE Host=’localhost’ AND User=’’; mysql> FLUSH PRIVILEGES; mysql> QUIT C:> C:mysqlbinmysqladmin -u root password your_password Depois de configurar a senha, se vocˆ desejar desligar o servidor mysqld, vocˆ pode usar o e e seguinte comando: C:> mysqladmin --user=root --password=sua_senha shutdown Se vocˆ estiver usando o servidor de uma antiga vers˜o shareware do MySQL vers˜o 3.21m e a a o comando mysqladmin para configurar uma senha ir´ falhar com um erro: parse error a near ’SET password’. A corre¸˜o para este problema ´ atualizar para uma vers˜o mais ca e a nova do MySQL. Com as vers˜es atuais do MySQL vocˆ pode facilmente adicionar novos usu´rios e alterar o e a privil´gios com os comandos GRANT e REVOKE. Veja Se¸˜o 4.4.1 [GRANT], P´gina 255. e ca a 2.1.2 Instalando o MySQL no Linux O modo recomendado para instalar o MySQL no Linux ´ usando um arquivo RPM. Os e RPMs do MySQL atualmente s˜o constru´ a idos na vers˜o 7.3 do sistema Suse Linux mas a deve funcionar em outras vers˜es de Linux que suportam rpm e usam glibc. o Se vocˆ tiver problemas com um arquivo RPM (por exemplo, se vocˆ receber o e e erro “Sorry, the host ’xxxx’ could not be looked up”), veja Se¸˜o 2.6.2.1 [Binary ca notes-Linux], P´gina 141. a Na maioria dos casos, vocˆ s´ precisa instalar os pacotes servidor MySQL e o cliente e o MySQL para ter uma instala¸˜o funcional do MySQL. Os outros pacotes n˜o s˜o exigidos ca a a para uma instala¸˜o padr˜o. Se vocˆ quiser executar um servidor MySQL Max que tenha ca a e capacidades adicionais, vocˆ deve instalar o RPM MySQL-Max depois de instalar o RPM e MySQL-server. Veja Se¸˜o 4.8.5 [mysqld-max], P´gina 344. ca a Se vocˆ tiver um dependˆncia de falha ao tentar instalar os pacotes do MySQL 4.0 (ex.: e e “error: removing these packages would break dependencies: libmysqlclient.so.10 is needed by ...”), vocˆ tamb´m deve instalar o pacote MySQL-shared-compat, e e o qual inclui ambas as bibliotecas para compatibilidade com vers˜es anteriores o (libmysqlclient.so.12 para MySQL 4.0 e libmysqlclient.so.10 para MySQL 3.23). Muitas distribui¸˜es Linux ainda vˆm com o MySQL 3.23 a elas normalmente ligam as co e aplica¸˜es dinamicamente para economizar espa¸o em disco. Se estas bibliotecas compar- co c tilhadas est˜o em pacotes separados (ex.; MySQL-shared), ´ suficiente simplesmente deixar a e estes pacotes instalados e apenas atualizar os pacotes do servidor e cliente MySQL (que s˜o a
  • 104. 70 MySQL Technical Reference for Version 5.0.0-alpha estaticamente ligados e n˜o dependem de bibliotecas compartilhadas). Para distribui¸˜es a co que incluem as bibliotecas compartilhadas no mesmo pacote que o servidor MySQL (ex.: Red Hat Linux), vocˆ tamb´m pode instalar nosso RPM MySQL-shares 3.23 ou usar o e e pacote compat´ com MySQL-shared. ivel Os seguintes pacotes RPM est˜o dispon´ a iveis: • MySQL-server-VERSION.i386.rpm O servidor MySQL. Vocˆ ira precisar dele a n˜o ser que vocˆ apenas queira se conectar a e a e um servidor MySQL executando em outra m´quina. Note que este pacote era chamado a MySQL-VERSION.i386.rpm antes do MySQL 4.0.10. • MySQL-Max-VERSION.i386.rpm O servidor MySQL Max. Este seridor tem capacidades adicionais que o servidor no ROM MySQL-server n˜o tem. Vocˆ deve instalar o RPM MySQL-server primeiro, a e porque o RPM MySQL-Max depende dele. • MySQL-client-VERSION.i386.rpm Os programas clientes padr˜es do MySQL. Provavelmente vocˆ sempre instalar´ este o e a pacote. • MySQL-bench-VERSION.i386.rpm Testes e comparativos de performances (benchmarks). Necessita do Perl e m´dulos do o BDB-mysql. • MySQL-devel-VERSION.i386.rpm As bibliotecas e arquivos include necess´rios se vocˆ precisa para compilar outros a e clientes MySQL, como nos m´dulos Perl. o • MySQL-shared-VERSION.i386.rpm Este pacote cont´m as bibliotecas compartilhadas (libmysqlclient.so*) que certas e linguagens e aplica¸˜es nencess´rias para carregar dinˆmicamente e usar o MySQL. co a a • MySQL-shared-compat-VERSION.i386.rpm Este pacote inclui o biblioteca compartilhada para MySQL 3.23 e MySQL 4.0. In- stale este pacote em vez do MySQL-shared, se vocˆ tiver aplica¸˜es instaladas que s˜o e co a dinˆmicamente ligadas ao MySQL 3.23 mas vocˆ quer atualizar para o MySQL 4.0 sem a e quebrar as dependˆncias da biblioteca. Este pacote esta dispon´ e ivel desde o MySQL 4.0.13. • MySQL-embedded-VERSION.i386.rpm A biblioteca do servidor embutido MySQL (MySQL 4.0). • MySQL-VERSION.src.rpm Este cont´m o c´digo fonte para todos os pacotes acima. Ele tamb´m pode ser usado e o e para tentar construir RPMs para outras arquiteturas (por exemplo, Alpha ou SPARC). Para ver todos os arquivo em um pacote RPM, (por exemplo, um RPM MySQL-server), execute: shell> rpm -qpl MySQL-server-VERSION.i386.rpm Para realizar uma instala¸˜o m´ ca inima padr˜o, execute: a shell> rpm -i MySQL-server-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm Para instalar somente o pacote cliente, execute:
  • 105. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 71 shell> rpm -i MySQL-client-VERSION.i386.rpm O RPM fornece um recurso para verificar a integridade e autenticidade dos pacotes antes de instal´-los. Se vocˆ quiser aprender mais sobre este recurso, veja Se¸˜o 2.2.2 [Verifying a e ca Package Integrity], P´gina 75. a O RPM coloca dados sob o ‘/var/lib/mysql’. O RPM tamb´m cria as entradas apropriadas e em ‘/etc/rc.d/’ para iniciar o servidor automaticamente na hora do boot. (Isto significa que se vocˆ realizou uma instala¸˜o anterior e fez altera¸˜es em seu script de inicializa¸˜o, e ca co ca vocˆ pode desejar criar uma c´pia do script para que vocˆ n˜o perca ao instalar um RPM e o e a mais novo). Veja Se¸˜o 2.4.3 [Automatic start], P´gina 118 para mais informa¸˜es sobre ca a co como o MySQL pode ser iniciado automaticamente na inicializa¸˜o do sistema. ca Se vocˆ quiser instalar o RPM do MySQL em uma distribui¸˜o Linux mais antiga que n˜o e ca a suporte scripts de inicializa¸˜o no ‘/etc/init.d’ (diretamente ou via link simb´lico), vocˆ ca o e deve criar um link simb´lico que aponte para a localiza¸˜o onde o seu script de instala¸˜o o ca ca est´ atualmente instalado. Por exemplo, se esta localiza¸˜o for ‘/etc/rc.d/init.d’, use a ca estes comandos antes de intalar o RPM para criar ‘/etc/init.d’ como um link simb´lico o que aponte l´:a shell> cd /etc; ln -s rc.d/init.d . No entanto, todas as distribui¸˜es de Linux atuais j´ devem suportar este novo layout co a de diret´rio que usa ‘/etc/init.d’ j´ que ele ´ exigido para compatibilidade LBS (Linux o a e Standard Base). Se o arquivo RPM que vocˆ instalar inclui o MySQL-server, o daemon mysqld deve estar e pronto e em execu¸˜o ap´s a instala¸˜o. Agora vocˆ j´ deve poder iniciar o MySQL. Veja ca o ca e a Se¸˜o 2.4 [P´s Instala¸˜o], P´gina 111. ca o ca a Se alguma coisa der errado, vocˆ encontrar maiores informa¸˜es no cap´ e co itulo de instala¸˜o. ca Veja Se¸˜o 2.2.9 [Instalado o bin´rio], P´gina 91. ca a a 2.1.3 Instalando o MySQL no Mac OS X A partir do MySQL 4.0.11, vocˆ pode instalar o MySQL no Mac OS X 10.2 (“Jaguar”) e usando um pacote do bin´rio do Mac OS X PKG em vez da distribui¸˜o bin´rio em tarball. a ca a Note que vers˜es mais antigas do Mac OS X (ex.: 10.1.x) n˜o s˜o suportadas por este o a a pacote. Este pacote est´ localizado dentro de um arquivo de imagem de disco (.dmg). que vocˆ a e primeiro precisa montar com um duplo clique em sua ´ icone no Finder. Ele deve ent˜o a montar a imagem e exibir o seu conte´do. u NOTA: Antes de proceder com a instala¸˜o, tenha certeza que vocˆ finalizou todas as ca e instˆncias do MySQL em execu¸˜o usando o MySQL Manager Aplication (no Mac OS X a ca Server) ou via mysqladmin shutdown na linha de comando. Para relamente instalar o MySQL PKG, de um duplo clique na ´ icone do pacote. Isto inicia o Mac OS Package Installer, que ir´ guia-lo pela instala¸˜o do MySQL. a ca O Mac OS X PKG do MySQL ir´ se instalar em ‘/usr/local/mysql-<version>’ a e tamb´m instalr´ um link simb´lico ‘/usr/local/mysql’, apontando para a nova e a o localiza¸˜o. Se um diret´rio chamado ‘/usr/local/mysql’ j´ existe, ele ser´ renomeado ca o a a para ‘/usr/local/mysql.bak’ em primeiro lugar. Adicionalmente, ele ir´ instalar a a
  • 106. 72 MySQL Technical Reference for Version 5.0.0-alpha tabela de permiss˜es do banco de dados MySQL executando mysql_install_db depois da o instala¸˜o. ca O layout de instala¸˜o ´ similar a aquele da distribui¸˜o bin´ria, todos os bin´rios do MySQL ca e ca a a est˜o localizados no diret´rio ‘/usr/local/mysql/bin’. O socket MySQL ser´ colocado em a o a ‘/tmp/mysql.sock’ por padr˜o. Veja Se¸˜o 2.2.5 [Installation layouts], P´gina 83. a ca a A instala¸˜o do MySQL exige uma conta de usu´rio do Mac OS X chamada mysql (uma ca a conta de usu´rio com este nome existe por padr˜o no Mac OS X 10.2 e acima). a a Se vocˆ estiver executando o MAC OS X Server, vocˆ j´ ter´ uma vers˜o do MySQL e e a a a instalado: • Mac OS X Server 10.2-10.2.2 vem com o MySQL 3.23.51 instalado • Mac OS X Server 10.2.3-10.2.6 vem com o MySQL 3.23.53 • Mac OS X Server 10.3 vem com o MySQL 4.0.14 Esta se¸˜o do manual cobre a instala¸˜o apenas do MySQL Mac OS X PKG oficial. Leia o ca ca ajuda da Apple sobre a instala¸˜o do MySQL (Execute o aplicativo “Help View”, selecione ca a ajuda do “Mac OS X Server” e fa¸a uma busca por “MySQL” e leia o item entitulado c “Installing MySQL”). Note especialmente, que a vers˜o pr´-instalada do MySQL no Mac OS X Server ´ iniciado a e e com o comando safe_mysqld em vez de mysqld_safe. Se anteriormente vocˆ usava pacotes do MySQL de Marc Liyanage para Mac OS X de e http://www.entropy.ch, vocˆ pode simplesmente seguir as intru¸˜es de atualiza¸˜o para e co ca pacotes usando o layout de instala¸˜o dos bin´rio como dados em suas p´ginas. ca a a Se vocˆ est´ atualizado da vers˜o 3.23.xx de Marc ou do vers˜o Mac OS X Server do e a a a MySQL para o MySQL PKG oficial, vocˆ tamb´m deve converter a tabela de privil´gios do e e e MySQL existente para o formato atual, porque alguns novos privil´gios de seguran¸a foram e c adicionados. Veja Se¸˜o 2.5.6 [Upgrading-grant-tables], P´gina 130. ca a Se vocˆ preferisse iniciar automaticamente o MySQL durante o boot do sistema, vocˆ e e tamb´n precisa instalar o MySQL Startup Item. A partir do MySQL 4.0.15, ele ´ parte do e e disco de instala¸˜o do Mac OS X como um pacote de instala¸˜o separado. Simplesmente ca ca de um duplo clique no ´icone MySQLStartupItem.pkg e siga as instru¸˜es para instal´-lo. co a Note que isto s´ precisa ser feito uma vez! N˜o h´ necessidade de se instalar o Startup Item o a a toda vez que se atualizar o pacote do MySQL. Devido a um erro no instalador de pacotes do Mac OS X, algumas vezes vocˆ pode ver a e mensagem de erro You cannot install this software on this disk. (null) no di´logo a de sele¸˜o do disco de destino. Se este erro ocorrer, simplesmente clique no bot˜o Go ca a Back uma vez para retornar a tela anterior. Agora clique em Continue para avan¸ar para a c sele¸˜o do disco de destino novamente - agora vocˆ deve estar apto a escolher o disco destino ca e corretamente. N´s informamos este erro a Apple e eles est˜o investigando este problema. o a O Startup Item ser´ instalado em ‘/Library/StartupItems/MySQL’. Ele adiciona uma a vari´vel MYSQLCOM=-YES- ao arquivo de configura¸˜o do sistema (‘/etc/hostconfig’). Se a ca vocˆ desejasse diasbilitar a inicializa¸˜o autom´tica do MySQL, simplesmente altere o valor e ca a desta vari´vel para MYSQLCOM=-NO-. a No Mac OS X Server, o script de instala¸˜o do Startup Item disabilitar´ automatica- ca a mente a inicializa¸˜o da instala¸˜o padr˜o do MySQL alterando a vari´vel MYSQL em ca ca a a
  • 107. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 73 ‘/etc/hostconfig’ para MYSQL=-NO-. Isto ´ para evitar conflitos na inicializa¸˜o. No e ca entanto, ele n˜o desliga um servidor MySQL aj´ em execu¸˜o. a a ca Depois da instala¸˜o, vocˆ pode iniciar o MySQL executando os seguintes comandos em ca e um janela de terminal. Note qye vocˆ preceisa ter privil´gios de administrador para realizar e e esta tarefa. Se vocˆ tiver instalado o Startup Item: e shell> sudo /Library/StartupItems/MySQL/MySQL start (Enter your password, if necessary) (Press Control-D or enter "exit" to exit the shell) Se vocˆ n˜o tiver instalado o Startup Item, digite a seguinte sequˆncia de comandos: e a e shell> cd /usr/local/mysql shell> sudo ./bin/mysqld_safe (Enter your password, if necessary) (Press Control-Z) shell> bg (Press Control-D or enter "exit" to exit the shell) Agora vocˆ deve conseguir se conectar ao servidor MySQL, ex.: e executando ‘/usr/local/mysql/bin/mysql’ Se vocˆ instalar o MySQL pela primeira vez, lembre-se de consigurar uma senha para o e usu´rio root do MySQL! a Isto ´ feito com os seguintes comandos: e /usr/local/mysql/bin/mysqladmin -u root password <password> /usr/local/mysql/bin/mysqladmin -u root -h ‘hostname‘ password <password> Por favor, tenha certeza que o comando hostname na segunda linha est´ entre crases (‘), a ´ com a sa´ deste comando (o nome da m´quina deste assim a shell pode substitui-la ida a sistema)! Vocˆ tamb´m pode querer adicionar aliases ao seu arquivo de resursos do sheel para acessar e e mysql e mysqladmin da linha de comando: alias mysql ’/usr/local/mysql/bin/mysql’ alias mysqladmin ’/usr/local/mysql/bin/mysqladmin’ De forma alternativa, vocˆ pode simplesmente adicionar /usr/local/mysql/bin a sua e vari´vel de ambiente PATH, ex.: adicionando o seguinte ao arquivo ‘$HOME/.tcshrc’: a setenv PATH ${PATH}:/usr/local/mysql/bin Note que instalar um novo MySQL PKG n˜o remove o diret´rio de uma instala¸˜o mais a o ca antiga. Infelizmente o Mac OS X Installer ainda n˜o oferece a funcionalidade exigida para a atualizar apropriadamente pacotes instalados anteriormente. Depois de copiar os arquivos de banco de dados do MySQL sobre os da vers˜o a anterior e inicializar o nova vers˜o com sucesso, vocˆ deve remover os arquivos da a e instala¸˜o antiga para economizar espa¸o em disco. Adicionalmente vocˆ tamb´m ca c e e deve remover vers˜es mais antigas do diret´rio do Package Receipt localizados em o o ‘/Library/Receipts/mysql-<version>.pkg’.
  • 108. 74 MySQL Technical Reference for Version 5.0.0-alpha 2.1.4 Instalando o MySQL no NetWare A partir da vers˜o 4.0.11, o MySQL est´ dispon´ a a ivel para a Novell NetWare na forma de pacote do bin´rio. Para servir o MySQL, o servidor NetWare deve suprir estas exigˆncias: a e • NetWare vers˜o 6.5, ou NetWare 6.0 com Support Pack 3 instalado (Vocˆ pode obtˆ-lo a e e em http://support.novell.com/filefinder/13659/index.html). O sistema deve obedecer as exigˆncias m´ e inimas da Naveel para executar a respectiva vers˜o do Net- a Ware. • Os dados do MySQL, assim com os seus bin´rios, devem ser instalados em um volume a NSS; volumes tradicionais n˜o s˜o suportados. a a O pacote bin´rio para o NetWare pode ser obtido em http://www.mysql.com/downloads/. a Se vocˆ estiver executando o MySL no NetWare 6.0, sugerimos que vocˆ utilize a op¸˜o e e ca --skip-external-locking na linha de comando. Tamb´m ser´ necess´rio utilizar CHECK e a a TABLE e REPAIR TABLE em vez de myisamchk, porque myisamchk faz uso de lock externo. Lock externo possui problemas com NetWare 6.0; o problema foi eliminado no NetWare 6.5. 2.1.4.1 Instalando o MySQL para Bin´rios do NetWare a 1. Se vocˆ estiver atualizando de um instaa¸˜o anterior, para o servidor MySQL. Isto ´ e ca e feito a partir do console do servidor, usando: SERVER: mysqladmin -u root shutdown 2. Conecte-se no servidor alvo a partir de uma m´quina cliente com acesso ao local onde a vocˆ instalar´ o MySQL. e a 3. Extraia o pacote zip bin´rio em seu servidor. Tenha certeza de permitir que os caminhos a ´ no arquivo zip sejam usados. E seguro simplesmente extrair os arquivos para ‘SYS:’. Se vocˆ estiver atualizando de uma instalando anterior, vocˆ pode precisar copiar os e e diret´rios de dados (ex.: ‘SYS:MYSQLDATA’) agora, assim como ‘my.cnf’ se vocˆ o tiver o e costumizado. Vocˆ pode ent˜o deletar a c´pia antiga do MySQL. e a o 4. Vocˆ pode desejar renomear o diret´rio para algo mais consistente e f´cil de usar. e o a Recomendamos usar o ‘SYS:MYSQL’; exemplos no manual o usar˜o para se referir ao a diret´rio de instala¸˜o em geral. o ca 5. No console do servidor, adicione um caminho de busca no diret´rio contendo os NLMs o do MySQL. Por exemplo: SERVER: SEARCH ADD SYS:MYSQLBIN 6. Instale o banco de dados inicial, se necess´rio, digitando mysql_install_db no console a do servidor. 7. Inicie o servidor MySQL usando mysqld_safe no console do servidor. 8. Para finalizar a instala¸˜o, vocˆ tamb´m deve adicionar os seguintes comandos ao ca e e autoexec.ncf. Por exemplo, se sua instala¸˜o do MySQL est´ em ‘SYS:MYSQL’ e vocˆ ca a e quiser que o MySQL inicie automaticamente, vocˆ pode adicionar estas linhas: e #Starts the MySQL 4.0.x database server SEARCH ADD SYS:MYSQLBIN
  • 109. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 75 MYSQLD_SAFE Se vocˆ estiver usando NetWare 6.0, vocˆ deve adicionar o parˆmetro --skip- e e a external-locking: #Starts the MySQL 4.0.x database server SEARCH ADD SYS:MYSQLBIN MYSQLD_SAFE --skip-external-locking Se houver uma instala¸˜o existente do MySQL no servidor, verifique a existencia de coman- ca dos de inicializa¸˜o do MySQL em autoexec.ncf, e edite ou delete-os se necess´rio. ca a 2.2 Detalhes Gerais de Instala¸˜o ca 2.2.1 Como obter o MySQL Confira a homepage da MySQL homepage (http://www.mysql.com/) para informa¸˜es co sobre a vers˜o atual e para instru¸˜es de download. a co Nosso principal espelho de download est´ localizado em: http://mirrors.sunsite.dk/mysql/. a Para uma lista atualizada completa dos mirrors de download da MySQL, veja http://www.mysql.com/downloads/mirrors.html. Vocˆ tamb´m encontrar´ informa¸˜o e e a ca sobre como se tornar um mirror do MySQL e como relatar um mirror ruim ou desatualizado. 2.2.2 Verificando a Integridade do Pacote Usando MD5 Checksums ou GnuPG Depois de fazer o download do pacote MySQL que serve `s suas necessidades e antes de a tentar instal´-lo, vocˆ deve ter certeza de que ele esta intacto e n˜o foi manipulado. a e a A MySQL AB oferece dois tipos de verifica¸˜o de integridade: MD5 checksums e assinaturas ca criptografadas usando GnuPG, o GNU Privacy Guard. Verificando o MD5 Checksum Depois de fazer o download do pacote, vocˆ deve verificar se o MD5 checksum corresponde e a aquele fornecido na p´gina de download do MySQL. Cada pacote tem um checksum a individual, que vocˆ pode verificar com o seguinte comando: e shell> md5sum <pacote> Note que nem todos os sistemas operacionais suportam o comando md5sum - em alguns ele ´ simplesmente chamado md5, outros n˜o o possuem. No Linux, ele ´ parte do pacote e a e a ´ GNU Text Utilities, que est´ disponivel para uma grande faixa de plataformas. Vocˆ e pode fazer o download do c´digo fonte em http://www.gnu.org/software/textutils/. o Se vocˆ tiver o OpenSSL instalado, vocˆ tamb´m pode usar o comando openssl md5 e e e <pacote>. Uma implementa¸˜o do comando md5 para DOS/Windows est´ dispon´ em ca a ivel http://www.fourmilab.ch/md5/. Exemplo:
  • 110. 76 MySQL Technical Reference for Version 5.0.0-alpha shell> md5sum mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz 155836a7ed8c93aee6728a827a6aa153 mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz Vocˆ deve verificar se o resultado do checksum corresponde a aquele impresso no p´gina de e a download logo abaixo do respectivo pacote. A maioria do sites mirrors tamb´m oferecem um arquivo chamado ‘MD5SUMS’, que tamb´m e e inclui o MD5 checksums para todos os arquivos inclu´idos no diret´rio ‘Downloads’. Note no o entanto que ´ muito f´cil de modificar este arquivo e ele n˜o ´ um m´todo muito confi´vel. e a a e e a Caso esteja em d´vida, vocˆ deve consultar diferentes sites mirroers e comparar os resulta- u e dos. Verifica¸˜o de Assinatura Usando GnuPG ca Um m´todo de verifica¸˜o de integridade de um pacote mais confi´vel ´ o uso de assi- e ca a e naturas criptografadas. A MySQL AB usa o GNU Privacy Guard (GnuPG), uma alterna- tiva Open Source para o bem conhecido Pretty Good Privacy (PGP) de Phil Zimmermann. Veja http://www.gnupg.org/ and http://www.openpgp.org/ para mais informa¸˜es sobre co OpenPGP/GnuPG e como obter e instalar o GnuPG em seus sistema. A maioria das distribui¸˜es co de Linux j´ vˆm com o GnuPG instalado por padr˜o. a e a A partir do MySQL 4.0.10 (Fevereiro de 2003), a MySQL AB come¸ou a assinar o seus c pacotes de download com GnuPG. Assinaturas criptografadas s˜o um m´todo bem mais a e confi´vel de verifica¸˜o da integridade e autenticidade de um arquivo. a ca Para verificar a assinatura de um pacote espec´ ifico, vocˆ primeiro precisa obtter uma c´pia e o da chave p´blica GPG da MySQL AB (build@mysql.com). Vocˆ tamb´m pode cort´-la e u e e a col´-la diretamente daqui ou obtˆ-la em http://www.keyserver.net/. a e Key ID: pub 1024D/5072E1F5 2003-02-03 MySQL Package signing key (www.mysql.com) <build@mysql.com> Fingerprint: A4A9 4068 76FC BD3C 4567 70C8 8C71 8D3B 5072 E1F5 Public Key (ASCII-armored): -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org mQGiBD4+owwRBAC14GIfUfCyEDSIePvEW3SAFUdJBtoQHH/nJKZyQT7h9bPlUWC3 RODjQReyCITRrdwyrKUGku2FmeVGwn2u2WmDMNABLnpprWPkBdCk96+OmSLN9brZ fw2vOUgCmYv2hW0hyDHuvYlQA/BThQoADgj8AW6/0Lo7V1W9/8VuHP0gQwCgvzV3 BqOxRznNCRCRxAuAuVztHRcEAJooQK1+iSiunZMYD1WufeXfshc57S/+yeJkegNW hxwR9pRWVArNYJdDRT+rf2RUe3vpquKNQU/hnEIUHJRQqYHo8gTxvxXNQc7fJYLV K2HtkrPbP72vwsEKMYhhr0eKCbtLGfls9krjJ6sBgACyP/Vb7hiPwxh6rDZ7ITnE kYpXBACmWpP8NJTkamEnPCia2ZoOHODANwpUkP43I7jsDmgtobZX9qnrAXw+uNDI QJEXM6FSbi0LLtZciNlYsafwAPEOMDKpMqAK6IyisNtPvaLd8lH0bPAnWqcyefep rv0sxxqUEMcM3o7wwgfN83POkDasDbs3pjwPhxvhz6//62zQJ7Q7TXlTUUwgUGFj
  • 111. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 77 a2FnZSBzaWduaW5nIGtleSAod3d3Lm15c3FsLmNvbSkgPGJ1aWxkQG15c3FsLmNv bT6IXQQTEQIAHQUCPj6jDAUJCWYBgAULBwoDBAMVAwIDFgIBAheAAAoJEIxxjTtQ cuH1cY4AnilUwTXn8MatQOiG0a/bPxrvK/gCAJ4oinSNZRYTnblChwFaazt7PF3q zIhMBBMRAgAMBQI+PqPRBYMJZgC7AAoJEElQ4SqycpHyJOEAn1mxHijft00bKXvu cSo/pECUmppiAJ41M9MRVj5VcdH/KN/KjRtW6tHFPYhMBBMRAgAMBQI+QoIDBYMJ YiKJAAoJELb1zU3GuiQ/lpEAoIhpp6BozKI8p6eaabzF5MlJH58pAKCu/ROofK8J Eg2aLos+5zEYrB/LsrkCDQQ+PqMdEAgA7+GJfxbMdY4wslPnjH9rF4N2qfWsEN/l xaZoJYc3a6M02WCnHl6ahT2/tBK2w1QI4YFteR47gCvtgb6O1JHffOo2HfLmRDRi Rjd1DTCHqeyX7CHhcghj/dNRlW2Z0l5QFEcmV9U0Vhp3aFfWC4Ujfs3LU+hkAWzE 7zaD5cH9J7yv/6xuZVw411x0h4UqsTcWMu0iM1BzELqX1DY7LwoPEb/O9Rkbf4fm Le11EzIaCa4PqARXQZc4dhSinMt6K3X4BrRsKTfozBu74F47D8Ilbf5vSYHbuE5p /1oIDznkg/p8kW+3FxuWrycciqFTcNz215yyX39LXFnlLzKUb/F5GwADBQf+Lwqq a8CGrRfsOAJxim63CHfty5mUc5rUSnTslGYEIOCR1BeQauyPZbPDsDD9MZ1ZaSaf anFvwFG6Llx9xkU7tzq+vKLoWkm4u5xf3vn55VjnSd1aQ9eQnUcXiL4cnBGoTbOW I39EcyzgslzBdC++MPjcQTcA7p6JUVsP6oAB3FQWg54tuUo0Ec8bsM8b3Ev42Lmu QT5NdKHGwHsXTPtl0klk4bQk4OajHsiy1BMahpT27jWjJlMiJc+IWJ0mghkKHt92 6s/ymfdf5HkdQ1cyvsz5tryVI3Fx78XeSYfQvuuwqp2H139pXGEkg0n6KdUOetdZ Whe70YGNPw1yjWJT1IhMBBgRAgAMBQI+PqMdBQkJZgGAAAoJEIxxjTtQcuH17p4A n3r1QpVC9yhnW2cSAjq+kr72GX0eAJ4295kl6NxYEuFApmr1+0uUq/SlsQ== =YJkx -----END PGP PUBLIC KEY BLOCK----- Vocˆ pode importar esta chave em seu pasta de chaves publicas GPG usando gpg --import. e Veja a documenta¸˜o de GPG para mais informa¸˜es de como trabalhar com chaves p´blicas. ca co u Depois de fazer o download e importar a chave publica criada, fa¸a o download c do pacote MySQL desejado e da assinatura correspondente, que tamb´m est´ e a dispon´ ivel na p´gina de download. A assinatura tem a extens˜o ‘.asc’. Por exemplo, a a a assinatura de ‘mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz’ seria ‘mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz.asc’. Tenha certeza que ambos os arquivos est˜o armazenados no mesmo diret´rio e ent˜o execute o seguinte comando a o a para verificar a assinatura para este arquivo: shell> gpg --verify <package>.asc Exemplo: shell> gpg --verify mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz.asc gpg: Warning: using insecure memory! gpg: Signature made Mon 03 Feb 2003 08:50:39 PM MET using DSA key ID 5072E1F5 gpg: Good signature from "MySQL Package signing key (www.mysql.com) <build@mysql.com>" A mensagem "Good signature" indica que est´ tudo certo. a Verificando Assinatura Usando RPM Para pacotes RPM, n˜o h´ assinaturas separadas - pacotes RPM atualmente tˆm uma assi- a a e ´ e MD5 checksum. Vocˆ pode verific´-los executando o seguinte comando: natura GPG incluida e a
  • 112. 78 MySQL Technical Reference for Version 5.0.0-alpha shell> rpm --checksig <package>.rpm Exemplo: shell> rpm --checksig MySQL-server-4.0.10-0.i386.rpm MySQL-server-4.0.10-0.i386.rpm: md5 gpg OK Nota: Se vocˆ estiver usando RPM 4.1 e ele reclamar sobre (GPG) NOT OK (MISSING KEYS: e GPG#5072e1f5) (mesmo se vocˆ a importou para detro de sua pasta de chaves publicas e GPG), vocˆ precisa import´-las para dentro de sua pasta de chaves RPM primeiro. RPM e a 4.1 n˜o utiliza mais ias suas pastas de chaves GPG (e o pr´prio GPG), mas mant´m sua a o e pr´pria pasta de chaves (porque ele ´ um aplicativo do sistema e a pasta de chaves p´blicas o e u do GPG ´ um arquivo espec´ e ifico do usu´rio). Para importar a chave p´blica do MySQL em a u uma pasta de chaves RPM, use os seguintes comandos: shell> rpm --import <pubkey> Exemplo: shell> rpm --import mysql_pubkey.asc Caso vocˆ note que as assinaturas MD5 checksum ou GPG n˜o coincidem, tente primeiro fazer e a o download do pacote respectivo mais uma vez, talvez de outro site mirror. Se vocˆ n˜o e a obter sucesso na verifica¸˜o da integridade do pacote repetidas vezes, notifique-nos sobre ca tais incidentes incluindo o nome completo do pacote e o site que vocˆ tem utilizado para e fazer o download pelos emails webmaster@mysql.com ou build@mysql.com. 2.2.3 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 compilar somente o c´digo cliente, um compilador C++ ´ necess´rio mas threads n˜o.) N´s o e a a o mesmos usamos e desenvolvemos o software primeiramente no Linux (SuSE e red Hat), FreeBSD e Sun Solaris (Vers˜es 8 e 9). o Perceba que para alguns sistemas operacionais, o suporte nativo a thread funciona somente nas ultimas vers˜es. O MySQL compila com sucesso nas seguintes combina¸˜es de sistema ´ o co operacional/pacote de thread: • AIX 4.x com threads nativas. Veja Se¸˜o 2.6.6.4 [IBM-AIX], P´gina 155. ca a • Amiga. • BSDI 2.x com o pacote inclu´ MIT-pthreads. Veja Se¸˜o 2.6.4.5 [BSDI], P´gina 151. ido ca a • BSDI 3.0, 3.1 e 4.x com threads nativas. Veja Se¸˜o 2.6.4.5 [BSDI], P´gina 151. ca a • SCO OpenServer with a recent port of the FSU Pthreads package. Veja Se¸˜o 2.6.6.9 ca [SCO], P´gina 161. a • SCO UnixWare 7.0.1. Veja Se¸˜o 2.6.6.10 [SCO Unixware], P´gina 163. ca a • DEC Unix 4.x com threads nativas. Veja Se¸˜o 2.6.6.6 [Alpha-DEC-UNIX], P´gina 157. ca a • FreeBSD 2.x com o pacote inclu´ MIT-pthreads. Veja Se¸˜o 2.6.4.1 [FreeBSD], ido ca P´gina 149. a
  • 113. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 79 • FreeBSD 3.x e 4.x com threads nativas. Veja Se¸˜o 2.6.4.1 [FreeBSD], P´gina 149. ca a • FreeBSD 4.x com Linuxthreads. Veja Se¸˜o 2.6.4.1 [FreeBSD], P´gina 149. ca a • HP-UX 10.20 com o pacote incluido ´ MIT-pthreads ou DCE threads. Veja Se¸˜o 2.6.6.2 ca [HP-UX 10.20], P´gina 154. a • HP-UX 11.x com as threads nativas. Veja Se¸˜o 2.6.6.3 [HP-UX 11.x], P´gina 154. ca a • Linux 2.0+ com LinuxThreads 0.7.1+ ou glibc 2.0.7+. Veja Se¸˜o 2.6.2 [Linux], ca P´gina 137. a • Mac OS X Server. Veja Se¸˜o 2.6.5 [Mac OS X], P´gina 152. ca a • NetBSD 1.3/1.4 Intel e NetBSD 1.3 Alpha (Necessita GNU make). Veja Se¸˜o 2.6.4.2 ca [NetBSD], P´gina 150. a • Novell NetWare 6.0. Veja Se¸˜o 2.6.8 [Novell NetWare], P´gina 164. ca a • OpenBSD > 2.5 com threads nativas. OpenBSD < 2.5 com o pacote inclu´ MIT- ido pthreads . Veja Se¸˜o 2.6.4.3 [OpenBSD], P´gina 151. ca a • OS/2 Warp 3, FixPack 29 e OS/2 Warp 4, FixPack 4. Veja Se¸˜o 2.6.7 [OS/2], ca P´gina 164. a • SGI Irix 6.x com threads nativas. Veja Se¸˜o 2.6.6.8 [SGI-Irix], P´gina 160. ca a • Solaris 2.5 e superior com threads nativas nas plataformas SPARC e x86. Veja Se¸˜o 2.6.3 [Solaris], P´gina 145. ca a • SunOS 4.x com o pacote inclu´ MIT-pthreads. Veja Se¸˜o 2.6.3 [Solaris], P´gina 145. ido ca a • Tru64 Unix • Windows 9x, Me, NT, 2000 e XP. Veja Se¸˜o 2.6.1 [Windows], P´gina 133. ca a Perceba que nem todas as plataformas s˜o apropriadas para executar o MySQL. Os seguintes a 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 entretanto, se a biblioteca thread ´ inst´vel no c´digo que ´ usado pelo MySQL, mesmo e a o e se todo o resto for perfeito, o MySQL ir´ ser t˜o est´vel quanto a biblioteca thread. a a a • 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 pthread_mutex_lock() requisitar a CPU muito rapidamente, isto ir´ afetar o MySQL a tremendamente. Se esse detalhe n˜o estiver sendo cuidado, adicionar CPUs extras a 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- tadas na hora da compila¸˜o. N´s tamb´m podemos fornecer conselhos sobre como ca o e configurar seu sistema otimizadamente para o MySQL.
  • 114. 80 MySQL Technical Reference for Version 5.0.0-alpha • O volume de testes feitos internamente de configura¸˜es similares. co • O n´mero de usu´rios que tem executado o MySQL com sucesso naquela plataforma em u a configura¸˜es similares. Se esse n´mero for alto, as chances de se ter alguma surpresa co u espec´ ifica da plataforma fica muito menor. Baseado nos crit´rios acima, as melhores plataformas para a execu¸˜o do MySQL at´ este e ca e ponto s˜o o x86 com SuSe Linux 8.2, kernel 2.4 e ReiserFS (ou qualquer distribui¸˜o Linux a ca similar) e Sparc com Solaris (2.7-9). FreeBSD vem em terceiro, mas realmente temos esperan¸as que ele ir´ se unir ao clube dos tops uma vez que a biblioteca thread est´ c a a melhorando. N´s tamb´m acreditamos que em certo ponto iremos estar aptos para incluir o e todas as outras plataformas em que o MySQL compila e executa, mas n˜o t˜o bem e com a a o mesmo n´ ivel de estabilidade e performance, na categoria superior. Isto necessitar´ de a algum esfor¸o da nossa parte em coopera¸˜o com os desenvolvedores dos componentes do c ca Sistema Operacional/Biblioteca que o MySQL depende. Se vocˆ tiver interesse em melhorar e algum de nossos componentes, est´ em uma posi¸˜o para influenciar seu desenvolvimento, a ca e precisa de instru¸˜es mais detalhadas sobre o que o MySQL necessita para uma melhor co execu¸˜o, envie um e-mail para lista de email “insternals” do MySQL. Veja Se¸˜o 1.7.1.1 ca ca [Mailing-list], P´gina 33. a Por favor, perceba que a compara¸˜o acima n˜o ´ para dizer que um SO ´ melhor ou pior ca a e e que o outro em geral. N´s estamos falando sobre a escolha de um SO para um prop´sito o 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. E em alguns casos, a raz˜o de um SO ser melhor que o outro pode ser simplesmente a porque colocamos mais esfor¸o nos testes e otimiza¸˜o para aquela plataforma em particular. c ca Estamos apenas colocando nossas observa¸˜es para ajud´-lo na decis˜o de qual plataforma co a a usar o MySQL na sua configura¸˜o.ca 2.2.4 Qual vers˜o do MySQL deve ser usada a A primeira decis˜o a ser feita ´ se vocˆ deve usar a ultima vers˜o de desenvolvimento ou a a e e ´ a ultima vers˜o est´vel: ´ a a • Normalmente, se vocˆ estiver usando o MySQL pela primeira vez ou tentando port´- e a lo para algum sistema em que n˜o exista distribui¸˜o bin´ria, recomendamos o uso a ca a da vers˜o est´vel (atualmente Vers˜o 5.0.0-alpha). Repare que todos os lan¸amentos a a a c do MySQL s˜o conferidos com os testes comparativos de performance e um conjunto a extenso de testes antes de cada lan¸amento. c • Sen˜o, caso vocˆ esteja trabalhando com um antigo sistema e quiser atualiz´-lo, mas n˜o a e a a que correr o risco com uma atualiza¸˜o sem corre¸˜es, vocˆ deve faze-lo do mesmo ramo ca co e que vocˆ est´ usando (onde aenas o ultimo n´mero da vers˜o ´ mais novo que o seu). e a ´ u a e N´s temos tentado corrigir somente erros fatais e torn´-los menores, com altera¸˜es o a co relativamente seguras para aquela vers˜o. a A segunda decis˜o a ser feita ´ se vocˆ deseja usar uma distribui¸˜o fonte ou bin´ria. Na a e e ca a maioria dos casos provavelmente vocˆ dever´ usar a distribui¸˜o bin´ria, se alguma existir e a ca a para sua plataforma, ser´ normalmente muito mais f´cil para instalar do que a distribui¸˜o a a ca em c´digo fonte. o
  • 115. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 81 Nos seguites casos vocˆ provavelmente ser´ mais bem servido com uma instala¸˜o baseada e a ca em c´digo fonte: o • Se vocˆ desejar instalar o MySQL em algum lugar expec´ e ifico. (O padr˜o das dis- a tribui¸˜es bin´rias ´ estar“pronto para rodar” em qualquer lugar, mas talvez vocˆ co a e e deseje ainda mais flexibilidade). • Para estar apto e satisfazer diferentes requisi¸˜es dos usu´rios, estaremos fornecendo co a duas vers˜es bin´rias diferentes; Uma compilada com os manipuladores de tabelas n˜o o a a transacionais (um bin´rio r´pido e pequeno) e um configurado com as mais importantes a a op¸˜es extendidas como tabelas transacionais. Ambas vers˜es s˜o compiladas da mesma co o a distribui¸˜o fonte. Todos clientes MySQL nativos pode conectar com ambas vers˜es do ca o MySQL. A distribui¸˜o bin´ria extendida ´ marcada com o sufixo -max e ´ configurada com as ca a e e mesmas op¸˜es de mysqld-max. Veja Se¸˜o 4.8.5 [mysqld-max], P´gina 344. co ca a Se vocˆ deseja usar o RPM MySQL-Max, primeiramente vocˆ deve instalar o RPM MySQL- e e server padr˜o. a e ˜ • Se vocˆ deseja configurar mysqld com alguns recursos extras que NAO est˜o nas dis- a tribui¸˜es bin´rias. Segue abaixo a lista das op¸˜es extras mais comuns que vocˆ pode co a co e querer usar: • --with-innodb • --with-berkeley-db (padr˜o para o MySQL 4.0 e seguintes) a • --with-raid (n˜o disponivel a ´ para todas as plataformas) • --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 Se vocˆ precisar de um servidor MySQL mais r´pido vocˆ pode querer recompil´-lo com e a e a suporte para somente o conjunto de caracteres que vocˆ precisa, usar um compilador e melhor (como pgcc) ou usar op¸˜es de compiladores para usar otimiza¸˜es para seu co co processador. • Se vocˆ encontrar um erro e relat´-lo para o time de desenvolvimento do MySQL vocˆ e a e provavelmente receber´ um patch que ser´ necess´rio aplic´-lo para a distribui¸˜o fonte a a a a ca para ter o bug corrigido. • Se vocˆ deseja ler (e/ou modificar) o c´digo C e C++ que ´ o MySQL, vocˆ pode obter e o e e uma distribui¸˜o fonte. O c´digo fonte ´ sempre o manual final. Distribui¸˜es fontes ca o e co tamb´m contem mais testes e exemplos que as distribui¸˜es bin´rias. e co a O esquema de nomes do MySQL usa n´meros de vers˜es que consistem de tres n´meros e u o u um sufixo. Por exemplo, um nome de lan¸amento como mysql-4.1.0-alpha ´ interpretado c e da seguinte maneira: • O primeiro n´mero (4) ´ a vers˜o principal e tamb´m descreve o formato dos arquivos. u e a e Todas releases da Vers˜o 4 tem o mesmo formato de arquivo. a • O segundo n´mero (1) ´ o n´ da distribui¸ao. u e ivel c˜
  • 116. 82 MySQL Technical Reference for Version 5.0.0-alpha • O terceiro n´mero (0 ´ o n´mero da vers˜o do n´ de distribui¸˜o. Este ´ incrementado u e u a ivel ca e para cada nova distribui¸˜o. Normalmente vocˆ desejar´ a ultima vers˜o para o n´ ca e a ´ a ivel de publica¸˜o que tiver escolhido. ca • O sufixo (alpha) indica o n´ de estabilidade da vers˜o. Os poss´ ivel a iveis sufixo s˜o: a − alpha indica que a vers˜o cont´m grandes se¸˜es de novos c´digos que n˜o foram a e co o a 100% testados. Bugs conhecidos (normalmente n˜o tem nenhum) devem estar doc- a umentados na se¸˜o News. Veja Apˆndice C [News], P´gina 948. Existem tamb´m ca e a e novos comandos e extens˜es na maioria das publica¸˜es alpha. Desenvolvimento o co ativo que podem envolver maiores altera¸˜es no c´digo pode ocorrer numa vers˜o co o a alpha, mas tudo ser´ testado antes de fazer a publica¸˜o. N˜o podem existir erros a ca a conhecidos em nenhuma publica¸˜o do MySQL. ca − beta significa que todo o novo c´digo foi testado. N˜o ser˜o adicionados novos o a a recursos que podem causar algum tipo de corrompimento. N˜o deve existir bugs a conhecidos. Uma altera¸˜o de vers˜o de alpha para beta ocorre quando n˜o existir ca a a nenhum relato de erro fatal com uma vers˜o alpha por pelo menos um mˆs e n˜o a e a planejarmos adicionar nenhum recurso que pode deixar algum antigo comando menos confi´vel. a − gamma ´ o beta que j´ tem sido usado a algum tempo e parece funcionar bem. e a Apenas pequenas corre¸˜es s˜o adicionadas. Isto ´ o que muitas empresas chamam co a e de release. − Se n˜o existir um sufixo, significa que esta vers˜o j´ est´ sendo executada h´ a a a a a algum tempo em diferentes locais sem relatos de erros al´m dos espec´ e ificos de certas plataformas. Somente corre¸˜es de erros cr´ co iticos s˜o adicionados ao release. a Isto ´ o que chamamos de uma distribui¸˜o est´vel. e ca a No processo de desenvolvimento do MySQL, v´rias vers˜es coexistem e est˜o em um est´gio a o a a diferente. Naturalmente, corre¸˜es de erros relevantes de uma s´rie anterior s˜o propagados. co e a • Para a antiga s´rie 3.23 est´vel/de produ¸˜o, novas vers˜es s´ s˜o liberadas para erros e a ca o o a cr´ iticos. • A s´rie atual (4.0) ´ de qualidade est´vel/produ¸˜o. Nenhum novo recurso que possa e e a ca influenciar a estabilidade do c´digo ´ adicionado. o e • No ramo alpha 4.1 principal, novos recursos s˜o adicionados. Fontes e bin´rios est˜o a a a dispon´ iveis para uso e teste em sistemas de desenvolvimento. • O ramo de desenvolvimento 5.0 s´ est´ dispon´ para a ´rvore do BitKeeper. o a ivel a Todas as vers˜es do MySQL funcionam sobre nossos testes padr˜es e comparativos para o o garantir que eles s˜o relativamente seguros para o uso. Como os testes padr˜es s˜o exten- a o a didos ao longo do tempo para conferir por todos os bugs antigos encontrados, o pacote de testes continua melhorando. Perceba que todas publica¸˜es de vers˜es foram testadas pelo menos com: co o Um pacote de testes interna Faz parte de um sistema de produ¸˜o para um cliente. Ela tem diversas tabelas ca com centenas de megabytes de dados.
  • 117. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 83 O pacote de comparativos da MySQL e ´ Este executa uma s´rie de consultas comuns. E tamb´m um teste para ver se e o ultimo conjunto de otimiza¸˜es fez o c´digo mais r´pido. Veja Se¸˜o 5.1.4 ´ co o a ca [MySQL Benchmarks], P´gina 422. a O teste crash-me Este tenta determinar quais recursos o banco de dados suporta e quais s˜o suas a capacidades e limita¸˜es. Veja Se¸˜o 5.1.4 [MySQL Benchmarks], P´gina 422. co ca a Outro teste ´ que n´s usamos a vers˜o do MySQL mais nova em nosso ambiente de produ¸˜o e o a ca interna, em pelo menos uma m´quina. N´s temos mais de 100 gigabytes de dados com que a o trabalhar. 2.2.5 Layouts de Instala¸˜o ca Esta se¸˜o descreve o layout padr˜o dos diret´rios criados pela instal¸˜o das distribui¸˜es ca a o ca co bin´ria e fonte. a Uma distribui¸˜o bin´ria ´ instalada descompactando-a no local de instala¸˜o de sua escolha ca a e ca (tipicamente ‘/usr/local/mysql’) e cria os seguintes diret´rios nesses locais: o Diret´rio o Conte´do do diret´rio u o ‘bin’ Programas clientes e o servidor mysqld ‘data’ Arquivos Log, bancos de dados ‘docs’ Documenta¸˜o, Log de altera¸˜es ca co ‘include’ Arquivos de cabe¸alho (headers) c ‘lib’ Bibliotecas ‘scripts’ mysql_install_db ‘share/mysql’ Arquivos de mensagem de erro ‘sql-bench’ Benchmarks - testes comparativos Uma distribui¸˜o baseada em c´digo fonte ´ instalada depois de vocˆ configur´-la e compil´- ca o e e a a la. Por padr˜o, a instala¸˜o copia os arquivos em ‘/usr/local’, nos seguintes subdiret´rios: a ca o Diret´rio o Conte´do do diret´rio u o ‘bin’ Programas clientes e scripts ‘include/mysql’ rquivos de cabe¸alho (headers) A c ‘info’ Documenta¸˜o no formato Info ca ‘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 Dentro de um diret´rio de instala¸˜o, o layout de uma instala¸˜o baseada em fontes difer- o ca ca encia de uma instala¸˜o bin´ria nas seguintes formas: ca a • The mysqld server is installed in the ‘libexec’ directory rather than in the ‘bin’ directory. • The data directory is ‘var’ rather than ‘data’. • mysql_install_db is installed in the ‘/usr/local/bin’ directory rather than in ‘/usr/local/mysql/scripts’.
  • 118. 84 MySQL Technical Reference for Version 5.0.0-alpha • The header file and library directories are ‘include/mysql’ and ‘lib/mysql’ rather than ‘include’ and ‘lib’. You can create your own binary installation from a compiled source distribution by executing the script ‘scripts/make_binary_distribution’. 2.2.6 Como e quando as atualiza¸˜es s˜o lan¸adas? co a c O MySQL est´ evoluindo muito rapidamente na MySQL AB e n´s queremos compartilhar a o isto com outros usu´rios MySQL. Sempre que temos alguns recursos uteis que outros acham a ´ necess´io, tentamos fazer um release. a Tamb´m tentamos ajudar usu´rios que solicitam recursos que s˜o de f´cil implementa¸˜o. e a a a ca 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 N˜o existe uma real necessidade para baixar uma nova release. A se¸˜o News ir´ dizer se a a ca a nova vers˜o tem alguma coisa que vocˆ precisa. Veja Apˆndice C [News], P´gina 948. a e e a 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 tiver um maior n´mero de novos recursos ou menor incompatibilidade com vers˜es u o antigas, o segundo n´mero na vers˜o ´ incrementado. Quando o formato de arquivo u a e altera, o primeiro n´mero ´ aumentado. u e • Vers˜es est´veis testadas aparecem na m´dia de uma a duas vezes por ano, mas se o a e pequenos bugs s˜o encontrados, uma vers˜o ser´ lan¸ada apenas com as corre¸˜es dos a a a c co 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 leases mais importantes. Outras pessoas podem fazer distribui¸˜es bin´rias para outros co a sistemas mas provavelmente com menos frequencia. • N´s normalmente disponibilizamos os patches logo que localizamos e corrigimos o pequenos bugs. Eles normalmente s˜o imediatamente disponibilizados em nosso a reposit´rio publico do BitKeeper. Eles ser˜o inclu´ o a idos na pr´xima distribui¸˜o. o ca a ´ • Para bugs n˜o criticos, mas irritantes, disponibilizamos patches se eles s˜o enviados a para n´s. De qualquer forma, iremos combinar v´rios deles em um patch maior. o a • Se existitr, por algum motivo, um bug fatal numa vers˜o criaremos uma nova release a ´ ´ o mais cedo possivel. Gostariamos que outras empresas fizessem isto tamb´m. e A vers˜o est´vel atual ´ a 3.23; n´s j´ mudamos o desenvolvimento em atividade para a a a e o a vers˜o 4.0. Bugs contiuar˜o a ser corrigidos na vers˜o est´vel. N˜o acreditamos em um a a a a a congelamento completo, pois isto abandona a corre¸˜es de bugs e coisas que “devem ser co feitas.” “Alguma coisa congelada” significa que talvez possamos adicionar pequenas coisas que “com certeza n˜o afetar´ nada que j´ esteja funcionando.” a a a O MySQL usa um esquema de nomes um pouco diferente da maioria dos outros produtos. Em geral ´ relativamente seguro utilizar qualquer vers˜o que tenha sido lan¸ado a algumas e a c semanas e que n˜o tenham sido sustitu´ por uma nova vers˜o. Veja Se¸˜o 2.2.4 [Qual a ida a ca vers˜o], P´gina 80. a a
  • 119. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 85 2.2.7 Filosofia das Distribui¸˜es - Nenhum Bug Conhecidos nas co Distribui¸oes c˜ Colocamos muito tempo e esfor¸o em tornar nossas distribui¸˜es livres de erros. Pelo nosso c co conhecimento, n˜o liberamos uma unica vers˜o do MySSQL com qualquer erro conhecido a ´ a ’fatal’. Um erro fatal ´ algo que faz o MySQL falhar com o uso normal, traz respostas erradas para e consultas normais ou tem um problema de seguran¸a. c N´s temos documentados todos os problemas conhecidos, bugs e assuntos que s˜o depen- o a dentes das decis˜es de projeto. Veja Se¸˜o 1.8.6 [Bugs], P´gina 53. o ca a Nosso objeto ´ corrigir tudo que ´ poss´ e e ivel, mas sem correr o risco de tornarmos uma vers˜o menos est´vel. Em certos casos, isto significa que podemos corrigir um problema a a na(s) vers˜o(˜es) de desenvolvimento, mas n˜o o corrigirmos na vers˜o est´vel (produ¸˜o). a o a a a ca Naturalmente, documentamos tais problemas para que o usu´rios esteja ciente. a Aqui est´ um descri¸˜o de como nosso processo de contru¸˜o funciona: a ca ca • Monitoramos erros de nossa lista de suporte ao cliente, a lista de email externa do MySQL e o banco de dados de bugs em http://bugs.mysql.com/. • Todos os erros relatados em vers˜es usadas s˜o inseridos nio banco de dados de bugs. o a • Quando corrigimos um erro, sempre tentamos fazer um caso de teste para ele e inclu´ i-lo em nosso sistema de teste para assegurar que o erro nunca retornar´. (Cerca de 90% a de todos os erros corrigidos tˆm um caso de teste.) e • Tamb´m criamos casos de teste para todos os novos recursos adicionados ao MySQL. e • Antes de come¸armos a fazer uma nova distribui¸˜o do MySQL, asseguramos que todos c ca os erros repetit´ iveis relatados para a vers˜o do MySQL (3.23.x, 4.0.x, etc) est˜o cor- a a rigidos. Se algo for imposs´ de corrigir (devido a alguma decis˜o de projeto interno ivel a no MySQL), documentaremos isto no manual. Veja Se¸˜o 1.8.6 [Bugs], P´gina 53. ca a • N´s fazemos uma constru¸˜o para todas as plataformas para as quais suportamos o ca bin´rios (mais de 15 plataformas) e executamos nosso pacote de teste e benchmarks a para todas elas. • N˜o publicaremos um bin´rio para uma plataforma na qual os testes do pacote de a a benchmarks falharam. Se for um erro geral na fonte, o corrigimos e fazemos as con- tru¸˜es mais os teste em todos os sistemas novamente. co • Se n´s, durante a o porcesso de constru¸˜o e teste (que leva de 2 a 3 dias) recebermos um o ca relat´rio sobre um erro fatal (por exemplo, um que cause um core dump), o corrigiremos o e reiniciaremos o processo de constru¸˜o). ca • Depois de publicarmos os bin´rios em http://www.mysql.com/, enviamos um email a de an´ncio nas listas de email mysql e announce. Veja Se¸˜o 1.7.1.1 [Mailing-list], u ca P´gina 33. A mensagem de an´ncio cont´m uma lista de todas as altera¸˜es da dis- a u e co tribui¸˜o e qualquer problema conhecido com ela. (A se¸˜o ’problemas conhecidos’ na ca ca notas das distribui¸˜es s´ tem sido necess´ria em algumas da distribui¸˜es.) co o a co • Para darmos acesso rapidamente aos nossos usu´rios dos ultimos recursos do MySQL, a ´ fazemos uma nova distribui¸˜o do MySQL a cada 4-5 semanas. ca • Se, depois da distribui¸˜o estar pronta, recebermos qualquer relat´rio que houve (de- ca o pois de tudo) qualquer coisa criticamente errada com a constru¸˜o em uma plataforma ca
  • 120. 86 MySQL Technical Reference for Version 5.0.0-alpha espec´ ifica, corrigiremo-na imediatamente e liberaremos um nova distribui¸˜o ’a’ para ca aquela plataforma. Gra¸as aos nosso grande base de usu´rios, problemas s˜o encontra- c a a dos rapidamente. • Nosso registro para boas distribui¸˜es feitas ´ muito boa. Nas ultimas 150 distribui¸˜es, co e ´ co tivemos que fazer uma nova contru¸˜o para menos de 10 distribui¸˜es (em 3 destes ca co casos, o erro era uma biblioteca glibc com problema em uma de nossas m´quinas que a levamos um longo tempo para encontrar. 2.2.8 Bin´rios MySQL compilados pela MySQL AB a Como um servi¸o, n´s na MySQL AB fornecemos um conjunto de distribui¸˜es bin´rias do c o co a MySQL que s˜o compiladas no nosso site ou em sites onde os clientes cordialmente nos d˜o a a acesso as suas m´quinas. a Em adi¸˜o aos bin´rios forncedios em formatos de pacotes espec´ ca a ificos da plataforma (veja Se¸˜o 2.1 [Quick Standard Installation], P´gina 60), oferecemos distribui¸˜es bin´rios para ca a co a outras plataformas atrav´s de arquivos tar compactados (.tar.gz). e Estas distribui¸˜es s˜o geradas usando o script Build-tools/Do-compile que compila co a o c´digo fonte e cria o arquivo bin´rio em tar.gz usando scripts/make_binary_ o a distribution. Estes bin´rios s˜o configurados e constru´ a a idos com os seguintes compiladores e op¸˜es. co Bin´rios constru´ a idos no sistema de desenvolvimento da MySQL AB: Linux 2.4.xx x86 com gcc 2.95.3 CFLAGS="-O2 -mcpu=pentiumpro" CXX=gcc CXXFLAGS="-O2 - mcpu=pentiumpro -felide-constructors" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --disable-shared --with- client-ldflags=-all-static --with-mysqld-ldflags=-all-static Linux 2.4.xx Intel Itanium 2 com ecc (Intel C++ Itanium Compiler 7.0) CC=ecc CFLAGS="-O2 -tpp2 -ip -nolib_inline" CXX=ecc CXXFLAGS="-O2 -tpp2 -ip -nolib_inline" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile Linux 2.4.xx Intel Itanium com ecc (Intel C++ Itanium Compiler 7.0) CC=ecc CFLAGS=-tpp1 CXX=ecc CXXFLAGS=-tpp1 ./configure -- prefix=/usr/local/mysql --with-extra-charsets=complex --enable- thread-safe-client --enable-local-infile Linux 2.4.xx alpha com ccc (Compaq C V6.2-505 / Compaq C++ V6.3-006) CC=ccc CFLAGS="-fast -arch generic" CXX=cxx CXXFLAGS="- fast -arch generic -noexceptions -nortti" ./configure - -prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with- mysqld-ldflags=-non_shared --with-client-ldflags=-non_shared --disable-shared
  • 121. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 87 Linux 2.4.xx s390 com gcc 2.95.3 CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared --with-client-ldflags=-all-static --with-mysqld-ldflags=-all- static Linux 2.4.xx x86 64 (AMD64) com gcc 3.2.1 CXX=gcc ./configure --prefix=/usr/local/mysql --with-extra- charsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared Sun Solaris 8 x86 com gcc 3.2.3 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="- O3 -fno-omit-frame-pointer -felide-constructors -fno- exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql -- localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared --with-innodb Sun Solaris 8 sparc com gcc 3.2 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra- charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --with-named-z-libs=no --with-named-curses- libs=-lcurses --disable-shared Sun Solaris 8 sparc 64bit com gcc 3.2 CC=gcc CFLAGS="-O3 -m64 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -m64 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --with-named-z-libs=no --with-named-curses-libs=-lcurses --disable-shared Sun Solaris 9 sparc com gcc 2.95.3 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra- charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --with-named-curses-libs=-lcurses --disable- shared Sun Solaris 9 sparc com cc-5.0 (Sun Forte 5.0) CC=cc-5.0 CXX=CC ASFLAGS="-xarch=v9" CFLAGS="-Xa -xstrconst -mt -D_FORTEC_ -xarch=v9" CXXFLAGS="-noex -mt -D_FORTEC_ -xarch=v9" ./configure --prefix=/usr/local/mysql --with-extra- charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --with-named-z-libs=no --enable-thread-safe- client --disable-shared
  • 122. 88 MySQL Technical Reference for Version 5.0.0-alpha IBM AIX 4.3.2 ppc com gcc 3.2.3 CFLAGS="-O2 -mcpu=powerpc -Wa,-many " CXX=gcc CXXFLAGS="-O2 -mcpu=powerpc -Wa,-many -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra- charsets=complex --enable-thread-safe-client --enable-local-infile --with-named-z-libs=no --disable-shared IBM AIX 4.3.3 ppc com xlC_r (IBM Visual Age C/C++ 6.0) CC=xlc_r CFLAGS="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192" CXX=xlC_r CXXFLAGS ="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192" ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-named-z- libs=no --disable-shared --with-innodb IBM AIX 5.1.0 ppc com gcc 3.3 CFLAGS="-O2 -mcpu=powerpc -Wa,-many" CXX=gcc CXXFLAGS="-O2 -mcpu=powerpc -Wa,-many -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra- charsets=complex --with-server-suffix="-pro" --enable-thread- safe-client --enable-local-infile --with-named-z-libs=no --disable-shared HP-UX 10.20 pa-risc1.1 com gcc 3.1 CFLAGS="-DHPUX -I/opt/dce/include -O3 -fPIC" CXX=gcc CXXFLAGS="- DHPUX -I/opt/dce /include -felide-constructors -fno-exceptions -fno-rtti -O3 -fPIC" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client -- enable-local-infile --with-pthread --with-named-thread-libs=-ldce --with-lib-ccflags=-fPIC --disable-shared HP-UX 11.11 pa-risc2.0 64 bit com aCC (HP ANSI C++ B3910B A.03.33) CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure -- prefix=/usr/local/mysql --with-extra-charsets=complex --enable- thread-safe-client --enable-local-infile --disable-shared HP-UX 11.11 pa-risc2.0 32bit com aCC (HP ANSI C++ B3910B A.03.33) CC=cc CXX=aCC CFLAGS="+DAportable" CXXFLAGS="+DAportable" ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared --with-innodb Apple Mac OS X 10.2 powerpc com gcc 3.1 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra- charsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared
  • 123. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 89 FreeBSD 4.7 i386 com gcc 2.95.4 CFLAGS=-DHAVE_BROKEN_REALPATH ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --with-named-z-libs=not- used --disable-shared QNX Neutrino 6.2.1 i386 with gcc 2.95.3qnx-nto 20010315 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra- charsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared Os seguintes bin´rios s˜o contru´ a a idos em sistemas de terceiros gentilmente cedidos para a MySQL AB pou outros usu´rios. Pou favor, note que eles s´ s˜o fornecidos como cortesia. a o a Uma vez que a MySQL AB n˜o tem total controle sobre estes sistemas, n´s podemos fornecer a o apenas suporte limitado para os bin´rios constru´ a idos nestes sistemas. SCO Unix 3.2v5.0.6 i386 com gcc 2.95.3 CFLAGS="-O3 -mpentium" LDFLAGS=-static CXX=gcc CXXFLAGS="-O3 - mpentium -felide-constructors" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-named-z-libs=no --enable-thread-safe- client --disable-shared SCO OpenUnix 8.0.0 i386 com CC 3.2 CC=cc CFLAGS="-O" CXX=CC ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-named-z-libs=no --enable-thread-safe- client --disable-shared Compaq Tru64 OSF/1 V5.1 732 alpha com cc/cxx (Compaq C V6.3-029i / DIGITAL C++ V6.1-027) CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast - inline speed -speculate all" CXX="cxx -pthread" CXXFLAGS="-O4 -ansi_alias -fast -inline speed -speculate all -noexceptions -nortti" ./configure --prefix=/usr/local/mysql --with-extra- charsets=complex --enable-thread-safe-client --enable-local-infile --with-prefix=/usr/local/mysql --with-named-thread-libs="- lpthread -lmach -lexc -lc" --disable-shared --with-mysqld-ldflags=- all-static SGI Irix 6.5 IP32 com gcc 3.0.1 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra- charsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared
  • 124. 90 MySQL Technical Reference for Version 5.0.0-alpha FreeBSD 5.0 sparc64 com gcc 3.2.1 CFLAGS=-DHAVE_BROKEN_REALPATH ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared --with-innodb As seguintes op¸˜es de compila¸˜o foram usadas nos pacotes bin´rios que a MySQL AB co ca a costumava fornecer no passado. Estes bin´rios n˜o s˜o mais atualizados, mas as op¸˜es de a a a co compila¸˜o s˜o mantidas aqui com o prop´sito de referˆncia. ca a o e Linux 2.2.xx sparc com egcs 1.1.2 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra- charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --disable-shared 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-charsets=complex 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 acima) sun4u com egcs 1.0.3a ou 2.90.27 ou gcc 2.95.2 e mais novo 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 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 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 AIX 2 4 com gcc 2.7.2.2 CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex Qualquer que tenha mais op¸˜es otimizadas para qualquer das configura¸˜es listadas acima co co pode sempre envi´-los para a lista de email “internals” do MySQL. Veja Se¸˜o 1.7.1.1 a ca [Mailing-list], P´gina 33. a
  • 125. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 91 Distribui¸˜es RPM que anteceda o MySQL vers˜o 3.22 s˜o contribui¸˜es dos usu´rios. Os co a a co a RPMs gerados por n´s da MySQL AB s´ come¸aram a ser fornecidos a partir da vers˜o o o c a 3.22 do MySQL. Se vocˆ deseja compilar uma vers˜o para depura¸˜o do MySQL, vocˆ deve adicionar --with- e a ca e debug ou --with-debug=full para as linhas de configura¸˜o acima e remover qualquer ca op¸˜o -fomit-frame-pointer. ca Para distribui¸˜es do Windows, por favor, veja Se¸˜o 2.1.1 [Windows installation], co ca P´gina 60. a 2.2.9 Instalando uma Distribui¸˜o Bin´ria do MySQL ca a Este cap´itulo cobre a instala¸˜o da distribui¸˜o bin´ria do MySQL (.tar.gz Archives) para ca ca a v´rias plataformas (veja MySQL binaries para uma lista detalhada). a Em adi¸˜o a estes pacotes gen´ricos, tamb´m oferecemos bin´rios em formatos de pacote ca e e a espec´ificos da plataforma para plataformas selecionadas. Veja Se¸˜o 2.1 [Quick Standard ca Installation], P´gina 60 para mais informa¸˜es sobre como intal´-los. a co a As distribui¸˜es gen´ricas do MySQL est˜o empacotados com arquivos GNU tar com com- co e a pacta¸˜o gzip (.tar.gz). Vocˆ precisa das seguintes ferramentas para instalar um dis- ca e tribui¸˜o bin´ria do MySQL: ca a • GNU gunzip para descompactar a distribui¸˜o. ca • Um tar razo´vel para descompactar a distribui¸˜o. Sabemos que o GNU tar funciona. a ca Algumas implementa¸˜es tar que vˆm pr´-instaladas como o sistema operacional (ex. co e e Sun tar) possuem problemas (com nome de arquivos grandes, por exemplo) Neste caso, vocˆ deve instalar o GNU tar primeiro. e Se vocˆ tiver problemas, sempre use mysqlbug ao enviar d´vidas para a lista de email do e u MySQL. Mesmo se o problema n˜o for um bug, mysqlbug colhe informa¸˜es do sistema que a co ajudar˜o os outros a solucionar o seu problema. Se n˜o usar mysqlbug, vocˆ ter´ diminu´ a a e a ida a probabilidade de conseguir a solu¸˜o do seu problema. Vocˆ encontrar´ o mysqlbug no ca e a diret´rio ‘bin’ depois de descompactar a distribui¸˜o. Veja Se¸˜o 1.7.1.3 [Relato de erros], o ca ca P´gina 36. a Os comando b´sicos que vocˆ deve executar para instalar e usar uma distribui¸˜o bin´ria a e ca a do MySQL s˜o:a shell> groupadd mysql shell> useradd -g mysql mysql shell> cd /usr/local shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf - shell> ln -s full-path-to-mysql-VERSION-OS mysql shell> cd mysql shell> scripts/mysql_install_db shell> chown -R root . shell> chown -R mysql data shell> chgrp -R mysql . shell> bin/mysqld_safe --user=mysql & Se a sua vers˜o do MySQL ´ mais antiga que a 4.0, substitua bin/safe_mysqld por a e bin/mysqld_safe no comando final.
  • 126. 92 MySQL Technical Reference for Version 5.0.0-alpha Vocˆ pode adicionar novos usu´rios usando o script bin/mysql_setpermission se vocˆ e a e instalar os m´dulos Perl DBI e DBD-mysql. o Uma descri¸˜o mais detalhada ´ apresentada a seguir. ca e Para instalar uma distribui¸˜o bin´ria, siga estes passos, ent˜o proceda com a Se¸˜o 2.4 ca a a ca [P´s Instala¸˜o], P´gina 111, para a configura¸˜o da p´s istala¸˜o e testes: o ca a ca o ca 1. Escolha o diret´rio sob o qual vocˆ deseja descompactar a distribui¸˜o e a mova para o e ca dentro dele. No exemplo a seguir, descompactamos a distribui¸˜o sob ‘/usr/local’ e ca criamos um diret´rio ‘/usr/local/mysql’ dentro do qual o MySQL ´ instalado. (As o e seguintes instru¸˜es, consequentemente, assumem que vocˆ tem permiss˜o para criar co e a arquivos em ‘/usr/local’. Se este diret´rio ´ protegido, vocˆ precisar´ realizar a o e e a instala¸˜o como root.) ca 2. Obtenha um arquivo de distribui¸˜o de um dos sites listados em Se¸˜o 2.2.1 [Getting ca ca MySQL], P´gina 75. a As distribui¸˜es bin´rias do MySQL s˜o fornecidas como arquivos tar compactados e co a a tem nomes como ‘mysql-VERS~O-SO.tar.gz’, onde VERS~O ´ um n´mero (por exem- A A e u plo, 3.21.15) e SO indica o tipo de sistema operacional para o qual a distribui¸˜o ´ ca e pretendida (por exemplo, pc-linux-gnu-i586). 3. Se vocˆ ver uma distribui¸˜o bin´ria marcada com o sufixo -max, significa que o e ca a bin´rio tem suporte para tabelas transacionais e outros recursos. Veja Se¸˜o 4.8.5 a ca [mysqld-max], P´gina 344. Note que todos os bin´rios s˜o contru´ a a a idos a partir da mesma distribui¸˜o fonte do MySQL. ca 4. Adicione um usu´rio e grupo para o mysqld ser executado: a shell> groupadd mysql shell> useradd -g mysql mysql Estes comandos adicionam o grupo mysql e o usu´rio mysql. A sintaxe para useradd a e groupadd podem diferir um pouco nas diversas vers˜es de Unix. Eles tamb´mpodem o e ser chamado adduser e addgroup. Vocˆ pode desejar criar o grupo e usu´rio com outro e a nome, diferente de mysql. 5. Chame o diret´rio no qual se pretende fazer a instala¸˜o: o ca shell> cd /usr/local 6. Descompacte a distribui¸˜o, que criar´ o diret´rio de instala¸˜o. Ent˜o crie um link ca a o ca a simb´lico para aquele diret´rio: o o shell> gunzip < /path/to/mysql-VERS~O-SO.tar.gz | tar xvf - A shell> ln -s full-path-to-mysql-VERS~O-SO mysql A O primeiro comando cria um diret´rio chamado ‘mysql-VERS~O-SO’. O segundo co- o A mando cria um link simb´lico para o diret´rio. Isto torna a referˆncia ao diret´rio de o o e o instala¸˜o mais f´cil, chamado como ‘/usr/local/mysql’. ca a 7. Altere para p diret´rio de instala¸˜o: o ca shell> cd mysql Vocˆ encontrar´ diversos arquivos e subdiret´rios no diret´rio mysql. O mais impor- e a o o tante para prop´sitos de instala¸˜o s˜o os subdiret´rios ‘bin’ e ‘scripts’. o ca a o ‘bin’ Este diret´rio cont´m o programa cliente e o servidor. Vocˆ deve adicionar o e e o caminho completo deste diret´rio a sua vari´vel de ambiente PATH e o a
  • 127. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 93 assim a sua shell encontrar´ o programa MySQL de forma apropriada. a Veja Apˆndice E [Vari´veis de ambiente], P´gina 1083. e a a ‘scripts’ Este diret´rio cont´m o script mysql_install_db usado para inicializar o o e banco de dados mysql contendo a tabela de permiss˜es que armazenam o o servidor de permiss˜es de acesso. o 8. Caso vocˆ desejasse usar o mysqlaccess e a distribui¸˜o do MySQL est´ em um local e ca a diferente do padr˜o, vocˆ deve alterar a localiza¸˜o para onde o mysqlaccess espera a e ca encontrar o cliente mysql. Edite o script ‘bin/mysqlaccess’ aproximadamente na linha 18. Procure pela linha que se parece com a apresentada abaixo: $MYSQL = ’/usr/local/bin/mysql’; # path to mysql executable Altere o caminho para o local onde o mysql atualmente est´ armazaenado em seu a sistema. Se vocˆ n˜o fizer isto receber´ uma mensagem de erro Broken pipe quando e a a executar o mysqlaccess. 9. Crie as tabelas de permiss˜o do MySQL (necess´rio apenas se vocˆ n˜o tiver instalado a a e a o MySQL anteriormente): shell> scripts/mysql_install_db Note que as vers˜es mais antigas que a 3.22.10 iniciam o servidor MySQL quando vocˆ o e executa o mysql_install_db. Isto n˜o ocorre mais. a 10. Altere o propriet´rio dos bin´rios para o root e o propriet´rio do diret´rio de dados a a a o para o usu´rio com o quel vocˆ executar´ o mysqld: a e a shell> chown -R root /usr/local/mysql/. shell> chown -R mysql /usr/local/mysql/data shell> chgrp -R mysql /usr/local/mysql/. O primeiro comando altera o atributo owner dos arquivos para o usu´rio root, o a segundo altera o atributo owner do diret´rio de dados para o usu´rio mysql e o terceiro o a altera o atributo group para o grupo mysql. 11. Se vocˆ quiser instalar o suporte para a interface Perl DBI/DBD, veja Se¸˜o 2.7 [Perl e ca support], P´gina 165. a 12. Se vocˆ desejasse que o MySQL seja iniciado automaticamente quando vocˆ iniciar a e e sua m´quina, vocˆ pode copiar support-files/mysql.server para o local onde o seu a e sistema tem os arquivos de inicializa¸˜o. Mais informa¸˜es podem ser encontradas no ca co script support-files/mysql.server e em Se¸˜o 2.4.3 [Automatic start], P´gina 118. ca a Depois de tudo estar descompactado e instalado, vocˆ deve inicializar e testar a sua dis- e tribui¸˜o. ca Vocˆ pode iniciar o servidor MySQL com o seguinte comando: e shell> bin/mysqld_safe --user=mysql & Se a sua vers˜o do MySQl for mais antiga do que a 4.0, substitua bin/safe_mysqld por a bin/mysqld_safe no comando. Agora prossiga com Se¸˜o 4.8.2 [mysqld_safe], P´gina 332 e Veja Se¸˜o 2.4 [P´s instala¸˜o], ca a ca o ca P´gina 111. a
  • 128. 94 MySQL Technical Reference for Version 5.0.0-alpha 2.3 Instalando uma distribui¸˜o com fontes do MySQL ca Antes de vocˆ continuar com as instala¸˜es dos fontes, confira antes se nosso bin´rio est´ e co a a dispon´ para sua plataforma e se ela funcionar´ para vocˆ. N´s colocamos muito esfor¸o ivel a e o c para ter certeza que nossos bin´rios s˜o contru´ a a idos com as melhores op¸˜es poss´ co iveis. Vocˆ precisa das seguintes ferramentas para contruir e instalar o MySQL a partir do c´digo e o fonte: • GNU gunzip para descompactar a distribui¸˜o. ca • Um tar razo´vel para desempacotar a distribui¸˜o. Sabe-se que o GNU tar funciona. a ca Algumas implementa¸˜es tar que vˆm pr´-instaladas como o sistema operacional (ex. co e e Sun tar) possuem problemas (com nome de arquivos grandes, por exemplo) Neste caso, vocˆ deve instalar o GNU tar primeiro. e • Um compilador ANSI C++ funcional. gcc >= 2.95.2, egcs >= 1.0.2 ou egcs 2.91.66, SGI C++, e SunPro C++ s˜o alguns dos compiladores que sabemos que funcionam. a A libg++ n˜o ´ necess´ria quando o gcc for usado. gcc 2.7.x tem um bug que a e a torna imposs´ ivel compilar alguns arquivos C++ perfeitamente corretos, como o ‘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 e e algumas plataformas portanto ele deve ser evitado se existir um novo compilador para a plataforma. gcc >= 2.95.2 ´ recomendado quando compilar o MySQL Vers˜o 3.23.x. e a • Um bom programa make. GNU make ´ sempre recomendado e ´ algumas vezes e e necess´rio. Se vocˆ tiver problemas, recomendamos tentar o GNU make 3.75 ou mais a e novo. Se vocˆ estiver usando uma vers˜o recente de gcc, recente o bastante para entender a op¸˜o e a ca -fno-exceptions, ´ MUITO IMPORTANTE que vocˆ a use. De outra forma, vocˆ pode e e e compilar um bin´rio que quebra randomicamente. N´s tamb´m recomendamos que vocˆ use a o e e -felide-constructors e -fno-rtti juntas com -fno-exception. Se estiver com d´vidas,u fa¸a o seguinte: c CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static Na maioria dos sistemas vocˆ ir´ obter um bin´rio r´pido e est´vel com essas op¸˜es. e a a a a co Se vocˆ tiver problemas, SEMPRE USE mysqlbug quando postar quest˜es para a lista de e o email do MySQL Mesmo se o problema n˜o for um bug, mysqlbug recolhe informa¸˜es a co do sistema que facilitar´ aos outros resolverem seu problema. Por n˜o suar mysqlbug, a a vocˆ perde a vantagem de ter seu problema resolvido! Vocˆ ir´ encontrar mysqlbug no e e a diret´rio ‘scripts’ depois de desempacotar a distribui¸˜o. Veja Se¸˜o 1.7.1.3 [Bug reports], o ca ca P´gina 36. a
  • 129. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 95 2.3.1 Vis˜o geral da instala¸˜o r´pida a ca a Os comandos b´sicos que vocˆ deve executar para instalar o MysQL a partir da distribui¸˜o a e ca fonte s˜o: a 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/mysqld_safe --user=mysql & Se a sua vers˜o do MySQL ´ mais antiga que a 4.0, substitua bin/safe_mysqld por a e bin/mysqld_safe no comando final. Se vocˆ deseja ter suporte para tabelas InnoDB, vocˆ deve editar o arquivo /etc/my.cnf e e e remover o caractere # antes dos parˆmetros que iniciam com innodb_.... Veja Se¸˜o 4.1.2 a ca [Option files], P´gina 217. Veja Se¸˜o 7.5.3 [InnoDB start], P´gina 643. a ca a Se vocˆ iniciar de um RPM fonte, ent˜o fa¸a o seguinte: e a c shell> rpm --rebuild --clean MySQL-VERSION.src.rpm Isto ir´ criar um RPM bin´rio que vocˆ pode instalar. a a e Vocˆ pode adicionar novos usu´rios utilizando o script bin/mysql_setpermission se vocˆ e a e instalar os m´dulos Perl DBI e DBD-mysql. o Segue uma descri¸˜o mais detalhada. ca Para instalar uma distribui¸˜o fonte, siga os passos a seguir, ent˜o prossiga para Se¸˜o 2.4 ca a ca [Post-installation], P´gina 111, para inicializa¸˜o do p´s-instala¸˜o e testes: a ca o ca 1. Escolha o diret´rio sobre o qual vocˆ deseja descompactar a distribui¸˜o e v´ para ele. o e ca a 2. Obtenha um arquivo de distribui¸˜o de algum dos sites listados em Se¸˜o 2.2.1 [Getting ca ca MySQL], P´gina 75. a 3. Se vocˆ esta interessado em usar tabelas Berkeley DB com MySQL, vocˆ precisar´ obter e e a 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. Veja Se¸˜o 7.6 [BDB], P´gina 695. ca a Distribui¸˜es fontes do MySQL s˜o fornecidas como arquivos tar compactados e tem co a nomes como ‘mysql-VERSION.tar.gz’, onde VERSION ´ um n´mero como 5.0.0-alpha. e u 4. Adicione um usu´rio e grupo para o mysql executar assim: a shell> groupadd mysql shell> useradd -g mysql mysql Estes comandos adicionam o grupo mysql e o usu´rio mysql. A sintaxe para useradd e a groupadd podem mudar um pouco em diferentes vers˜es de Unix. Elas podem tamb´m o e
  • 130. 96 MySQL Technical Reference for Version 5.0.0-alpha ser chamadas adduser e addgroup. Vocˆ pode escolher outros nomes para o usu´rio e e a grupo em vez de mysql. 5. Descompacte a distribui¸˜o para o diret´rio corrente: ca o shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf - Este comando cria um diret´rio com o nome ‘mysql-VERSION’. o 6. Mude para o diret´rio da distribui¸˜o descompactada: o ca shell> cd mysql-VERSION Note que agora vocˆ deve configurar e construir o MySQL a partir deste diret´rio raiz e o 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 Quando vocˆ executar configure, vocˆ pode desejar especificar algumas op¸˜es. Exe- e e co cute ./configure --help para uma lista das op¸˜es. Se¸˜o 2.3.3 [configure options], co ca P´gina 97, discute algumas das op¸˜es mais usadas. a co Se o configure falhar, e vocˆ for enviar uma mensagem para lista de email do MySQL e para pedir ajuda, por favor, inclua qualquer linhas de ‘config.log’ que vocˆ acha e que pode ajudar a resolver o problema. Tamb´m inclua as ultimas linhas da sa´ e ´ ida de configure se o configure abortar. Envie o relat´rio de erros usando o script o mysqlbug. Veja Se¸˜o 1.7.1.3 [Bug reports], P´gina 36. ca a Se a compila¸˜o falhar, veja Se¸˜o 2.3.5 [Compilation problems], P´gina 103, para uma ca ca a ajuda com um varios problemas comuns. 8. Instalar tudo: shell> make install Vocˆ deve executar este comando como root. e 9. Crie as tabelas de permiss˜es do MySQL (necess´rias s´ se vocˆ n˜o tiver instalado o o a o e a MySQL anteriormente): shell> scripts/mysql_install_db Note que as vers˜es do MySQL anteriores ` vers˜o 3.22.10 iniciam o servidor MySQL o a a quando vocˆ executa mysql_install_db. Isto n˜o acontece mais! e a 10. Altere o dono dos bin´rios para root e do diret´rio dados para o usu´rio que ir´ a o a a 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 O primeiro comando altera o atributo de proriedade dos arquivos para o usu´rio root, a o segundo altera o atributo de propriedade do diret´rio de dados para o usu´rio mysql, o a e o terceiro altera o atributo de grupo para o grupo mysql. 11. Se vocˆ deseja instalar suporte para a interface Perl DBI/DBD, veja Se¸˜o 2.7 [Perl e ca support], P´gina 165. a 12. Se vocˆ deseja que o MySQL inicie automaticamente quando vocˆ ligar sua m´quina, e e a vocˆ pode copiar support-files/mysql.server para o local onde seu sistema tem seus e
  • 131. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 97 arquivos de incializa¸˜o. Mais informa¸˜es podem ser encontradas no pr´prio script ca co o support-files/mysql.server e em Se¸˜o 2.4.3 [Automatic start], P´gina 118. ca a Depois de tudo ter sido instalado, vocˆ deve iniciar e testar sua distribui¸˜o usando este e ca comando: shell> /usr/local/mysql/bin/mysqld_safe --user=mysql & Se a sua vers˜o do MySQL for mais antiga do que 4.0, substitua safe_mysqld por mysqld_ a safe no comando: Se o comando falhar imediatamente com mysqld daemon ended ent˜o vocˆ pode achar al- a e guma informa¸˜o no arquivo ‘diret´rio-dados-mysql/’nome_maquina’.err’. A raz˜o ca o a pode ser que vocˆ j´ possua outro servidor mysqld sendo executado. Veja Se¸˜o 4.2 [Mul- e a ca tiple servers], P´gina 220. a Veja Se¸˜o 2.4 [Post-installation], P´gina 111. ca a 2.3.2 Aplicando patches Algumas vezes patches aparecem na lista de mensagens ou s˜o colocados na ´rea de patches a a do MySQL. (http://www.mysql.com/downloads/patches.html). Para aplicar um patch da lista de mensagens, salve a mensagem em que o patch aparece em um arquivo, mude para o diret´rio raiz da sua distribui¸˜o fonte de seu MySQL e execute o ca 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 de mensagens. Para aplicar um patch compactado, mude para o diret´rio raiz da ´rvore o a fonte do MySQL e execute estes comandos: shell> gunzip < patch-file-name.gz | patch -p1 shell> rm config.cache shell> make clean Depois de aplicar um patch siga as instru¸˜es para uma instala¸˜o normal a partir dos co ca fontes come¸ando com o passo ./configure. Depois de executar o passo make install, c reinicie seu servidor MySQL. Vocˆ pode precisar derrubar algum servidor atualmente em execu¸˜o antes de executar make e ca install. (Use mysqladmin shutdown para fazer isto.) Alguns sistemas n˜o lhe permitem a instalar uma nova vers˜o do programa se ele substitui agum que estiver em execu¸˜o. a ca 2.3.3 Op¸oes t´ c˜ ipicas do configure O script configure fornece uma grande gama de controle sobre como vocˆ configura sua e distribui¸˜o MySQL. Normalmente vocˆ faz isto usando op¸˜es na linha de comando do ca e co configure. Vocˆ tamb´m pode alterar configure usando algumas vari´veis de ambiente. e e a Veja Apˆndice E [Environment variables], P´gina 1083. Para uma lista de op¸˜es suportadas e a co pelo configure, execute este comando:
  • 132. 98 MySQL Technical Reference for Version 5.0.0-alpha shell> ./configure --help Algumas das op¸˜es mais usadas normalmente com o configure est˜o descritas a seguir: co a • Para compilar apenas as bibliotecas clientes do MySQL e programas clientes e n˜o o a servidor, use a op¸˜o --without-server: ca shell> ./configure --without-server Se vocˆ n˜o possui um compilador C++, mysql n˜o ir´ compilar (ele ´ o programa e a a a e cliente que exige C++). Neste caso, vocˆ pode remover o c´digo no configure que e o testa pelo compilador C++ e executar ./configure com a op¸˜o --without-server. ca O passo da compia¸˜o continuar´ tentaindo construir mysql, mas vocˆ pode ignorar as ca a e advertˆncias sobre ‘mysql.cc’. (Se o make parar, tente make -k para continuar com o e resto da compila¸˜o mesmo se erros ocorrerem.) ca • Se vocˆ quiser uma biblioteca embutida do MySQL (libmysqld.a) vocˆ deve usar a e e op¸˜o --with-embedded-server. ca • 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 primeiro comando altera o diret´rio instala¸˜o para que tudo seja instalado sobre o ca ‘/usr/local/mysql’ em vez do padr˜o ‘/usr/local’. O segundo comando preserva o a diret´rio da instala¸˜o padr˜o, mas altera a localiza¸˜o padr˜o para diret´rios de ban- o ca a ca a o cos de dados (normalmente ‘/usr/local/var’) e altera para /usr/local/mysql/data. Depois de ter compilado o MySQL, vocˆ pode alterar estas op¸˜oes com arquivos de e ca op¸˜es. Veja Se¸˜o 4.1.2 [Option files], P´gina 217. co ca a • Se vocˆ estiver usando Unix e deseja que o arquivo socket do MySQL fique em um e diret´rio diferente do padr˜o (normalmente no diret´rio ‘/tmp’ ou ‘/var/run’) use o o a o comando configure da seguinte forma: shell> ./configure --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock Perceba que o arquivo fornecido deve ter um caminho absoluto ! Vocˆ tamb´m pode, e e mais tarde, alterar a localiza¸˜o de ‘mysql.sock’ usando os arquivos de op¸˜es do ca co MySQL. Veja Se¸˜o A.4.5 [Problems with mysql.sock], P´gina 925. ca a • Se vocˆ deseja compilar programas linkeditados estaticamente (por exemplo, para criar e uma distribui¸˜o bin´ria, obter mais velocidade, ou evitar problemas com algumas ca a distribui¸˜es Red Hat Linux), execute configure desta forma: co 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 Quando vocˆ usar como seu compilador C++, ele n˜o tentar´ ligar com o libg++ ou e a a libstdc++. Isto pode ser uma boa id´ia para se fazer se vocˆ tiver as bibliotecas acimas e e instaladas, j´ que algumas vers˜es destas bibliotecas tem causado problemas estranhos a o para usu´rios do MySQL no passado. a
  • 133. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 99 Segue algumas configura¸˜es de vari´veis de ambiente comuns, dependendo do compi- co a lador que vocˆ estiver usando: e Compiler Recommended options 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" gcc 2.95.2 CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 - mpentiumpro -felide-constructors -fno-exceptions -fno-rtti" pgcc 2.90.29 or CFLAGS="-O3 -mpentiumpro -mstack-align-double" CXX=gcc newer CXXFLAGS="-O3 -mpentiumpro -mstack-align-double -felide-constructors -fno-exceptions -fno-rtti" Na maioria dos casos vocˆ pode obter um bin´rio MySQL razoavelmente otimizado e a usando as op¸˜es acima e adicionar as seguintes op¸˜es para a linha de configura¸˜o: co co ca --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static A linha completa de configura¸˜o dever´ ser, em outras palavras, algo como o seguinte ca a para todas as vers˜es recentes do gcc: o 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 Os bin´rios que fornecemos no site Web MySQL em http://www.mysql.com s˜o to- a a dos compilados com otimiza¸˜o plena e deve ser perfeito para a maioria dos usu´rios. ca a Veja Se¸˜o 2.2.8 [Bin´rios do MySQL], P´gina 86. Existem algumas defini¸˜es de ca a a co configura¸˜o que vocˆ pode alterar para criar um bin´rio ainda mais r´pido, mas ca e a a isto ´ somente para usu´rios avan¸ados. Veja Se¸˜o 5.5.3 [Compile and link options], e a c ca P´gina 457. a Se a constru¸˜o falhar e produzir erros sobre seu compilador ou linkeditor n˜o ca a estarem aptos para criarem a biblioteca compartilhada ‘libmysqlclient.so.r#’ (‘r#’ ´ um n´mero de vers˜o), vocˆ pode evitar este problema fornecendo a op¸˜o e u a e ca --disable-share para o configure. Neste caso, configure n˜o construir´ uma a a biblioteca libmysqlclient.so.* compartilhada. • Vocˆ pode configurar o MySQL para n˜o usar valores de campos DEFAULT para campos e a n˜o-NULL (isto ´, campos que n˜o podem ser NULL). Veja Se¸˜o 1.8.5.2 [Restri¸˜es NOT a e a ca co NULL], P´gina 53. a shell> CXXFLAGS=-DDONT_USE_DEFAULT_FIELDS ./configure • Por padr˜o, o MySQL usa o conjunto de caracteres ISO-8859-1 (Latin1). Para alterar a o conjunto padr˜o, use a op¸˜o --with-charset: a ca 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. Veja Se¸˜o 4.7.1 [Conjunto de car- ca acteres], P´gina 326. a
  • 134. 100 MySQL Technical Reference for Version 5.0.0-alpha Se vocˆ desja converter os caracteres entre o servidor e o cliente, vocˆ deve dar uma e e olhada no comando SET OPTION CHARACTER SET. Veja Se¸˜o 5.5.6 [SET OPTION], ca P´gina 461. a Cuidado: Se vocˆ alterar o conjunto de caracteres depois de ter criado qualquer e tabela, vocˆ deve executar myisamchk -r -q --set-character--set=charset em e cada tabela. Seus ´ indices podem ser ordenados incorretamente. (Isto pode acontecer se vocˆ instalar o MySQL, criar algumas tabelas, depois reconfigurar o MySQL para e usar um conjunto diferente de caracteres e reinstal´-lo). a Com a op¸˜o --with-extra-charset=LISTA vocˆ pode definir qual conjunto de car- ca e acteres adicionais deve ser compilado no servidor. Aqui LISTA ´ uma lista de conjuntos de caracteres separados por espa¸os, complex e c para incluir todos caracteres que n˜o podem ser carregados dinamicamente ou all a para incluir todos os conjuntos nos bin´rios. a • Para configurar o MySQL com c´digo para depura¸˜o, use a op¸˜o --with-debug: o ca ca shell> ./configure --with-debug Isto inclui uma aloca¸˜o segura de mem´ria que pode encontrar alguns erros e ca o ´ sobre o que est´ acontecendo. Veja Se¸˜o D.1 [Depurando o servidor], fornecer saida a ca P´gina 1070. a • Se seus programas clientes usam threads, vocˆ precisar´ tamb´m compilar uma vers˜o e a e a thread-safe da biblioteca cliente do MySQL com as op¸˜es do configure --enable- co thread-safe-client. Isto ir´ criar uma biblioteca libmysqlclient_r com o qual a vocˆ dever´ ligar suas aplica¸˜es que fazem uso de threads. Veja Se¸˜o 12.1.14 [Clientes e a co ca em threads], P´gina 859. a • Op¸˜es que perten¸am a sistemas particulares podem ser encontrados na se¸˜o com co c ca detalhes espec´ ificos de sistemas neste manual. Veja Se¸˜o 2.6 [Notas espec´ ca ificas do Sistema Operacional], P´gina 132. a 2.3.4 Instalando pela ´rvore de fontes do desenvolvimento a CUIDADO: Vocˆ deve ler esta se¸˜o somente se vocˆ estiver interessado em nos ajudar a e ca e testar nossos novos c´digos. Se vocˆ s´ deseja deixar o MySQL funcionando em seus sistema, o e o vocˆ deve usar uma distribui¸˜o padr˜o (pode ser uma distribui¸˜o bin´ria ou fonte). e ca a ca a Para obter noss mais nova ´rvore de desenvolvimento, use estas instru¸˜es: a co 1. Fa¸a download do BitKeeper em http://www.bitmover.com/cgi-bin/download.cgi. c Vocˆ precisar´ do Bitkeeper 3.0 ou posterior para acessar nosso reposit´rio. e a o 2. Siga as instru¸˜es para instal´-lo. co a 3. Depois que o BitKeeper estiver instalado, primeiro v´ ao diret´rio no qual vocˆ deseja a o e trabalhar e ent˜o use um dos seguintes comandos para clonar o ramo da vers˜o MySQL a a de sua escolha: Para clonar o ramo 3.23 (antigo), use este comando: shell> bk clone bk://mysql.bkbits.net/mysql-3.23 mysql-3.23 Para clonar o ramo 4.0 (est´vel/produ¸˜o), use este comando: a ca shell> bk clone bk://mysql.bkbits.net/mysql-4.0 mysql-4.0 Para clonar o ramo 4.1 alfa, use este comando:
  • 135. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 101 shell> bk clone bk://mysql.bkbits.net/mysql-4.1 mysql-4.1 Para clonar o ramo de desenvolvimento 5.0, use este comando: shell> bk clone bk://mysql.bkbits.net/mysql-5.0 mysql-5.0 Nos exemplos anteriores a ´rvore bin´ria ser´ configurada no subdiret´rio a a a o ‘mysql-3.23/’, ‘mysql-4.0/’, ‘mysql-4.1/’, ou ‘mysql-5.0/’ do diret´rio atual. o Se vocˆ est´ atr´s de um firewall e s´ pode iniciar conex˜es HTTP, vocˆ tamb´m pode e a a o o e e o BitKeeper via HTTP. ˆ Se vocE precisa usar um servidor proxy, simplesmente configure a vari´vel de ambiente a http_proxy para apontar para o seu proxy: shell> export http_proxy="http://seu.servidor.proxy:8080/" Agora, simplesmente substitua o bk:// com o http:// ao fazer um clone. Exemplo: shell> bk clone http://mysql.bkbits.net/mysql-4.1 mysql-4.1 O download inicial da ´rvore fonte pode demorar um pouco, dependendo da velocidade a de sua conex˜o; seja paciente. a 4. Vocˆ precisar´ do GNU make, autoconf 2.53 (ou posterior), automake 1.5, e a libtool 1.4 e m4 para executar o pr´ximo conjunto de comandos. Embora muitos o sistemas operacionais j´ venham com suas pr´prias implementa¸˜es do make, as a o co chances de que a sua compila¸˜o falhe com mensagens de erros estranhas s˜o altas. ca a Consequentemente ´ altamente recomendado usar o GNU make (algumas vezes e tamb´m chamado gmake). e Felizmente, um grande n´mero de sistemas operacionais j´ vem com a ferramente GNU u a pr´ instalada ou s˜o fornecidos pacotes de instala¸˜o da mesma. De qualquer forma, e a ca elas podem ser encontradas nos seguintes locais: • http://www.gnu.org/software/autoconf/ • http://www.gnu.org/software/automake/ • http://www.gnu.org/software/libtool/ • http://www.gnu.org/software/make/ Se vocˆ estiver tentando configurar o MySQL 4.1 vocˆ tamb´m precisar´ do bison e e e a 1.75. Vers˜es mais antigas do bison podem exiobir este erro: sql_yacc.yy:#####: o fatal error: maximum table size (32767) exceeded. Nota: o tamanho m´ximo da a tabela n˜o ´ realmente excedido, o erro ´ causado por um bug nas vers˜es mais novas a e e o do bison. Vers˜es do MySQL anteriores a 4.1 podem tamb´m compilar com outras imple- o e menta¸˜es yacc (e.g. BSD yacc 91.7.30). Para vers˜es posteriores, GNU bison ´ uma co o e exigˆncia. e O comando comum para fazer em uma shell ´: e cd mysql-4.0 bk -r edit aclocal; autoheader; autoconf; automake (cd innobase; aclocal; autoheader; autoconf; automake) # for InnoDB (cd bdb/dist; sh s_all ) # for Berkeley DB ./configure # Adicione suas op¸~es favoritas aqui co
  • 136. 102 MySQL Technical Reference for Version 5.0.0-alpha make Caso apare¸am alguns erros estranhos durantes este est´gio, confira se vocˆ realmente c a e tem a libtool instalada! Uma cole¸˜o de nossos scripts de configura¸˜o padr˜es est´ localizada no subdiret´rio ca ca o a o ‘BUILD/’. Se preferir, vocˆ pode usar ‘BUILD/compile-pentium-debug’. Para compilar e em uma arquitetura diferente, modifique o script removendo op¸˜es que s˜o espec´ co a ificas da arquitetura Pentium. 5. Quando a constru¸˜o estiver pronta, execute make install. Seja cuidadoso com isto ca em uma m´quina de produ¸˜o; o comando pode sobrescrever sua vers˜o atual insta- a ca a lada. Se vocˆ tem outra instala¸˜o do MySQL, n´s recomendamos que vocˆ execute e ca o e ./configure com valores diferentes para as op¸˜es prefix, tcp-port e unix-socket- co path que as usadas pelo seu servidor em produ¸˜o. ca 6. Seja r´igido com sua nova instala¸˜o e tente fazer com que os novos recursos falhem. ca Inicie executando make test. Veja Se¸˜o 14.1.2 [MySQL test suite], P´gina 892. ca a 7. Se vocˆ chegar ao est´gio make e a distribui¸˜o n˜o compilar, por favor relate-o para e a ca a bugs@lists.mysql.com. Se vocˆ instalou as ultimas vers˜es das ferramentas GNU e ´ o exigidas, e elas falharam tentando processar nossos arquivos de configura¸˜o, por fa- ca vor informe isto tamb´m. Entretanto, se vocˆ executar aclocal e obtˆm um erro de e e e command not found n˜o o reporte.Tenha certeza que todas as ferramentas necess´rias a a estejam instaladas e que sua vari´vel PATH esteja corretamente configurada para que a sua shell possa encontr´-la. a 8. Depois da opera¸˜o inicial bk clone para obter a ´rvore fonte, vocˆ deve executar bk ca a e pull periodicamente para obter as atualiza¸˜es. co 9. Vocˆ pode examinar o hist´rico de altera¸˜es para a ´rvore com todos os diffs usando bk e o co a sccstool. Se vocˆ ver alguns diffs estranhos ou c´digo sobre o qual vocˆ tenha alguma e o e d´vida, n˜o hesite em enviar um e-mail para lista de email “internals” do MySQL. Veja u a Se¸˜o 1.7.1.1 [Mailing-list], P´gina 33. Al´m disso, se vocˆ pensar que tem uma id´ia ca a e e e melhor em como fazer algo, envie um email para o mesmo endere¸o com um patch. bk c diffs ir´ produzir um patch para vocˆ ap´s fazer as altera¸˜es no c´digo fonte. Se a e o co o vocˆ n˜o tiver tempo para codificar sua id´ia, apenas envie uma descri¸˜o. e a e ca 10. BitKeeper tem um ´timo utilit´rio de ajudar que vocˆ pode acessar via bk helptool. o a e 11. Note que qualquer commit (bk ci ou bk citool) ir´ disparar o envio da mensagem com a as altera¸˜es paa nossa lista de email internos, bem como a submiss˜o openlogging.org co a usual apenas com os coment´rios da altera¸˜o. Geralmente vocˆ n˜o precisar usar a ca e a commit (j´ que o ´rvore p´blica n˜o permitir´ bk push), mas ´ prefer´ usar o m´todo a a u a a e ivel e bk diffs descrito arteriormente. Vocˆ tamb´m pode procurar altera¸˜es, coment´rios e c´digo fonte online procurando por e e co a o ex. http://mysql.bkbits.net:8080/mysql-4.1 para MySQL 4.1. O manual est´ em uma ´rvore separad que pode ser clonada com: a a shell> bk clone bk://mysql.bkbits.net/mysqldoc mysqldoc Existe tamb´m um ´rvore p´blica do BitKeeper para o MySQL Control Center e Connec- e a u tor/ODBC. Eles podem ser clonados da seguintes forma, respectivamente: Para clonar o MySQL Control center, use o seguinte comando:
  • 137. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 103 shell> bk clone http://mysql.bkbits.net/mysqlcc mysqlcc Para clonar o Connector/ODBC, use o seguinte comando: shell> bk clone http://mysql.bkbits.net/myodbc3 myodbc3 2.3.5 Lidando com Problemas de Compila¸˜o ca Todos programas MySQL compilam de forma limpa sem alertas no solaris usando gcc. Em outros sistemas, alertas podem ocorrer devido a diferen¸as em arquivos include dos c sistemas. Veja Se¸˜o 2.3.6 [MIT-pthreads], P´gina 106 para avisos que podem ocorrer ca a usando MIT-pthreads. Para outros problemas, confira a lista abaixo. A solu¸˜o para v´rios problemas envolve reconfigura¸˜o. Se vocˆ precisa reconfigurar, fa¸a ca a ca e c notas do seguinte: • Se configure ´ executado depois dele j´ ter sido chamado, ele pode usar informa¸˜o e a ca que foi colhida durante a chamada anterior. Esta informa¸˜o ´ armazenada no ar- ca e quivo ‘config.cache’. Quando configure inicia, ele procura por este arquivo, lˆ seu e conte´do, se ele existir, assumindo que aquela informa¸˜o continua correta. Essa con- u ca jetura ´ inv´lida quando vocˆ reconfigurar. e a e • Cada vez que vocˆ executa configure, vocˆ deve executar make de novo para re- e e compilar. Entretanto, vocˆ pode desejar remover primeiro antigos arquivos objeto de e constru¸˜es anteriores, porque eles foram compilados usando diferentes op¸˜es de con- co co figura¸˜o. ca Para prevenir antigas informa¸˜es de configura¸˜es ou arquivos objetos de serem usados, co co execute estes comandos antes de re-executar configure: 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 mente tem de falta de mem´ria ou espa¸o de swap: o c Internal compiler error: program cc1plus got fatal signal 11 ou Out of virtual memory ou Virtual memory exhausted O problema ´ que gcc necessita de grande quantidade de mem´ria para compilar e o ‘sql_yacc.cc’ com fun¸˜es inline. Tente executando configure com a op¸˜o --with- co ca low-memory: shell> ./configure --with-low-memory Esta op¸˜o adiciona -fno-inline na a linha de compila¸˜o se vocˆ estiver usando ca ca e gcc e -O0 se vocˆ estiver usando outro programa. Vocˆ deve tentar a op¸˜o --with- e e ca low-memory mesmo se vocˆ tiver muita mem´ria e espa¸o de swap que vocˆ ache ser e o c e suficieente para n˜o ocorrer erros. Este problema tem ocorrido mesmo em sistemas a
  • 138. 104 MySQL Technical Reference for Version 5.0.0-alpha com boas configura¸˜es de hardware e a op¸˜o --with-low-memory geralmente corrige co ca isto. • Por padr˜o, configure escolhe c++ como o nome do compilador e GNU c++ liga com - a lg++. Se vocˆ estiver usando gcc, este comportamento pode causar problemas durante e a compila¸˜o, como o seguinte: ca configure: error: installation or configuration problem: C++ compiler cannot create executables. Vocˆ podem tamb´m ter problemas durante a compila¸˜o relacionados ` g++, libg++ e e ca a ou libstdc++. Uma causa destes problemas ´ que vocˆ pode n˜o ter g++ ou vocˆ pode ter g++ mas n˜o e e a e a ter o libg++ ou o libstdc++. De uma olhada no arquivo ‘config.log’. Ele deve conter a raz˜o exata do porque seu compilador C++ n˜o funciona! Para trabalhar evitando a a estes problemas, vocˆ pode usar gcc como seu compilador C++. Tente configurar a e vari´vel de ambiente CXX para "gcc -O3". Por exemplo: a shell> CXX="gcc -O3" ./configure Isto funciona porque gcc compila c´digo fonte C++ t˜o bem quanto g++ faz, mas n˜o o a a ifaz a liga¸˜o em libg++ ou libstdc++ por padr˜o. ca a Outra forma de corrigir estes problemas, com certeza, ´ instalando g++, libg++ e e libstdc++. No entanto gostariamos de lhe recomendar a n˜o usar libg++ ou a libstdc++ com o MySQL j´ que isto ir´ aumentar o tamanho do bin´rio do mysqld a a a sem lhe trazer nenhum benef´ icio. Algumas vers˜es destas bibliotecas tamb´m tem o e causado problemas estranhos para os usu´rios MySQL no passado. a Usar gcc como compilador C++ tamb´m ´ exigido, se vocˆ quiser compilar o MySQL e e e com a funcionalidade RAID (veja Se¸˜o 6.5.3 [CREATE TABLE], P´gina 597 para ca a mais informa¸˜es sobre tipos de tabela RAID) e vocˆ estiver usando o GNU gcc vers˜o co e a 3 e acima. Se vocˆ obter erros como estes abaixo durante o est´gio de liga¸˜o quando e a ca vocˆ configurar o MySQL para compilar com a op¸˜o --with-raid, tente usar o gcc e ca como o seu compilador C++ definindo a vari´vel de ambiente CXX mencionada acima: a gcc -O3 -DDBUG_OFF -rdynamic -o isamchk isamchk.o sort.o libnisam.a ../mysys/libmysys.a ../dbug/libdbug.a ../strings/libmystrings.a -lpthread -lz -lcrypt -lnsl -lm -lpthread ../mysys/libmysys.a(raid.o)(.text+0x79): In function ‘my_raid_create’: : undefined reference to ‘operator new(unsigned)’ ../mysys/libmysys.a(raid.o)(.text+0xdd): In function ‘my_raid_create’: : undefined reference to ‘operator delete(void*)’ ../mysys/libmysys.a(raid.o)(.text+0x129): In function ‘my_raid_open’: : undefined reference to ‘operator new(unsigned)’ ../mysys/libmysys.a(raid.o)(.text+0x189): In function ‘my_raid_open’: : undefined reference to ‘operator delete(void*)’ ../mysys/libmysys.a(raid.o)(.text+0x64b): In function ‘my_raid_close’: : undefined reference to ‘operator delete(void*)’ collect2: ld returned 1 exit status • Se sua compila¸˜o falhar com erros, como um dos seguintes, vocˆ deve atualizar sua ca e vers˜o de make para GNU make: a making all in mit-pthreads
  • 139. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 105 make: Fatal error in reader: Makefile, line 18: Badly formed macro assignment or make: file ‘Makefile’ line 18: Must be a separator (: or pthread.h: No such file or directory O Solaris e o FreeBSD s˜o conhecidos por terem alguns problemas com o make. a O GNU make vers˜o 3.75 ir´ funcionar. a a • Se vocˆ deseja definir algumas op¸˜es que devem ser usadas pelo seu compilador C ou e co C++, adicione as op¸˜es para as vari´veis de ambiente CFLAGS e CXXFLAGS. Vocˆ pode co a e tamb´m especificar os nomes do compilador a ser usado da mesma forma utilizando CC e e CXX. Exemplo: shell> CC=gcc shell> CFLAGS=-O3 shell> CXX=gcc shell> CXXFLAGS=-O3 shell> export CC CFLAGS CXX CXXFLAGS Olhe em Se¸˜o 2.2.8 [MySQL binaries], P´gina 86 para uma lista de defini¸˜o de op¸˜es ca a ca co que tenham sido uteis em v´rios sistemas. ´ a • Se vocˆ recebeu uma mensagem de erro como esta, ´ necess´rio atualizar o compilador e e a gcc: O gcc 2.8.1 funciona, mas recomendamos o uso do gcc 2.95.2 ou egcs 1.0.3a em seu lugar. • Se vocˆ obtem erros como estes vistos abaixo enquanto estiver compilando o mysqld, e o configure n˜o detectou corretamente o tipo do ultimo argumento para accept(), a ´ 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); Para corrigir isto, edite o arquivo ‘config.h’ (que ´ gerado pelo configure). Procure e 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 que vocˆ dever´ fazer isto cada vez que vocˆ executar configure, porque configure e a e regenera ‘config.h’.) • O arquivo ‘sql_yacc.cc’ ´ gerado pelo ‘sql_yacc.yy’. Normalmente o processo de e constru¸˜o n˜o necessita criar ‘sql_yacc.cc’, porque o MySQL j´ vem com uma c´pia ca a a o pr´-gerada. Entretanto, se vocˆ necessita recri´-lo vocˆ pode encontrar este erro: e e a e "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 instalar o bison (a vers˜o GNU de yacc) e us´-lo no lugar do yacc. a a
  • 140. 106 MySQL Technical Reference for Version 5.0.0-alpha • Se vocˆ necessita depurar mysqld ou um cliente MySQL, execute configure com a e op¸˜o --with-debug, ent˜o recompile e ligue seus clientes com a nova biblioteca cliente. ca a Veja Se¸˜o D.2 [Debugging client], P´gina 1076. ca a • Se vocˆ tem um erro de compila¸˜o no Linux (ex. SuSE Linux 8.1 ou Red Hat Linux e ca 7.3) parecido com o seguinte: libmysql.c:1329: warning: passing arg 5 of ‘gethostbyname_r’ from incompatible p libmysql.c:1329: too few arguments to function ‘gethostbyname_r’ libmysql.c:1329: warning: assignment makes pointer from integer without a cast make[2]: *** [libmysql.lo] Error 1 Por padr˜o, o script configure tenta determinar o n´mero correto de argumentos a u usando o compilador GNU C++ g++. Ele testa os resultados errados permitidos, se o g++ n˜o est´ instalado. Existem dois modos de contornar este problema: a a • Certifique-se de que o GNU C++ g++ est´ instalado. Em algumas distribui¸˜es a co Linux, o pacote exigido ´ chamado gpp, em outro ele ´ chamado gcc-c++. e e • Use o gcc como o seu compilador C++ configurando a vari´avel de ambiente CXX a para gcc: export CXX="gcc" Note que vocˆ precisa executar o configure novamente ap´s isto. e o 2.3.6 Notas MIT-pthreads Esta se¸˜o descreve alguns dos detalhes envolvidos no uso de MIT-pthreads. ca Note que no Linux vocˆ N~O deve usar MIT-pthreads mas instalar LinuxThreads! Veja e A Se¸˜o 2.6.2 [Linux], P´gina 137. ca a Se seu sistema n˜o fornece suporte nativo a thread, vocˆ precisar´ construir o MySQL a e a usando o pacote MIT-pthreads. Isto inclui antigos sistemas FreeBSD, SunOS 4.X, Solaris 2.4 e anteriores entre outros. Veja Se¸˜o 2.2.3 [Qual SO], P´gina 78. ca a Note que a partir do MySQL 4.0.2, MIT-pthreads n˜o fazem mais parte da distribui¸˜o a ca fonte. Se vocˆ precisar deste pacote, vocˆ precisa fazer o download dele separadamente em e e http://www.mysql.com/Downloads/Contrib/pthreads-1_60_beta6-mysql.tar.gz Depois do download, extraia este arquivo fonte no n´ mais alto do diret´rio de fontes do ivel o MySQL. Ele criar´ um novo subdiret´rio mit-pthreads. a o • Na maioria dos sitemas, vocˆ pode for¸ar o uso de MIT-pthreads executando o e c configure com a op¸˜o --with-mit-threads: ca shell> ./configure --with-mit-threads Constru¸˜o em um diret´rio n˜o fonte n˜o ´ suportado com o uso de MIT-pthreads, ca o a a e porque n´s queremos minimizar nossas altera¸˜es para este c´digo. o co o • As verifica¸˜es que determinam se MIT-pthreads ser´ usado ou n˜o, ocorrer´ somente co a a a durante a parte do processo de configura¸˜o que trata com o c´digo do servidor. Se vocˆ ca o e configurou a distribui¸˜o usando --without-server para construir somente o c´digo ca o cliente, clientes n˜o ir˜o saber se o MIT-pthreads est´ sendo usado e ir´ usar conex˜es a a a a o socket Unix por padr˜o. Como os sockets Unix n˜o funcionam sob MIT-pthreads, isto a a significa que vocˆ precisar´ usar -h ou --host quando executar programas clientes. e a
  • 141. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 107 • Quando o MySQL ´ compilado usando MIT-pthreads, travas de sistema s˜o desabil- e a itadas por padr˜o por raz˜es de performance. Vocˆ pode dizer ao servidor para usar a o e travas de sistema com a op¸˜o --external-locking. Isto s´ ´ necess´rio se vocˆ ca o e a e quiser executar dois servidores MySQL no mesmo diret´rio de dados (no que n˜o ´ o a e recomendado) • Algumas vezes o comando pthread bind() falha ao ligar a um socket sem nenhuma mensagem de erro (pelo menos no Solaris). O resultado ´ que todas conex˜es ao servidor e o falham. Por exemplo: shell> mysqladmin version mysqladmin: connect to server at ’’ failed; error: ’Can’t connect to mysql server on localhost (146)’ A solu¸˜o para isto ´ matar o servidor mysqld e reinici´-lo. Isto s´ aconteceu conosco ca e a o quando for¸amos uma queda do servidor e fizemos uma reinicializa¸˜o imediata. c ca • Com MIT-pthreads, a chamada de sistema sleep() n˜o ´ interromp´ com SIGINT a e ivel (break). Isto s´ ´ percebido quando vocˆ executa mysqladmin --sleep. Vocˆ deve es- oe e e perar pela chamada sleep() para terminar, antes da interru¸˜o ser servida e o processo ca 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 implicit declaration of function ‘int strtoll(...)’ implicit declaration of function ‘int strtoul(...)’ • N˜o colocamos readline para funcionar com MIT-pthreads. (Isto n˜o ´ necess´rio, a a e a mas pode ser interessante para alguns.) 2.3.7 Instalando o MySQL a partir do Fonte no Windows Estas instru¸˜es descrevem como construir o bin´rio do MySQL a partir do fonte paras co a vers˜es 4.1 e acima no Windows. As instru¸˜es s˜o fornecidas para construir bin´rios a o co a a partir de uma distribui¸˜o fonte padr˜o ou a partir da ´rvore do BitKeeper que cont´m o ca a a e fonte do desenvolvimento mais atuais. Nota: As instru¸˜es neste documento est˜o restritas aos usu´rios que queiram testar o co a a MySQL no Windows a partir da ultima distribui¸˜o fonte ou da ´rvore do BitKeeper. ´ ca a Para uso em produ¸˜o, a MySQL AB n˜o aconselha que vocˆ utilize um servidor MySQL ca a e constru´ por vocˆ mesmo a partir de um fonte. Normalmente ´ melhor usar uma dis- ido e e ca a e ´ especificamente para desem- tribui¸˜o bin´ria precompilada do MySQL que ´ construida
  • 142. 108 MySQL Technical Reference for Version 5.0.0-alpha penho otimizado no Windows pela MySQL AB. Instru¸˜es para instalar uma distribui¸˜o co ca bin´ria est´ dispon´ em Se¸˜o 2.1.1 [Windows installation], P´gina 60. a a ivel ca a Para construir o MySQL no Windows a partir do fonte, vocˆ precisa dos seguintes compi- e ladores e recursos dison´ iveis em seu sistema Windows: • Compilador VC++ 6.0 (atualizado com o SP 4 ou 5 e pacote Pre-processador) O pacote Pre-processador ´ necess´rio para a macro assembler. Mais detalhes em: e a http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp5/faq.aspx. • Aproximadamente 45 MB de espa¸o em disco. c • 64 MB de RAM Vocˆ tamb´m precisar´ de um distribui¸˜o fonte para o Windows. Existem dois modos de e e a ca conseguir uma distribui¸˜o fonte do MySQL vers˜o 4.1 e acima: ca a 1. Obtenha um pacote de uma distribui¸˜o fonte pela MySQL AB para a vers˜o do ca a MySQL que vocˆ est´ particularmente interessado. Distribui¸˜es fontes empacotadas e a co est˜o dispon´ a iveis para vers˜es distribu´ o idas do MySQ e podem ser obtidas em http://www.mysql.com/downloads/. 2. Vocˆ pode empacotar um distribui¸˜o fonte vocˆ mesmo a partir da ultima ´rvore fonte e ca e a de desenvolvimento do BitKeeper. Se vocˆ planeja fazer isto, vocˆ deve criar o pacote e e em um sistema Unix e ent˜o transfr´ para seu sistema Windows. (A raz˜o para isto ´ a i-lo a e que alguns dos passos de configura¸˜o e constru¸˜o exigem ferramentas que funcionam ca ca apenas no Unix.) A abordagem do BitKeeper, exige: • Um sistema executando Unix ou um sistema tipo Unix, como o Linux • BitKeeper 3.0 instalado neste sistema. Vocˆ pode obter o BitKeeper em e http://www.bitkeeper.com/. Se vocˆ estiver usando uma distribui¸˜o fonte do Windows, vocˆ pode ir diretamente para e ca e Se¸˜o 2.3.7.1 [Windows VC++ Build], P´gina 108. Para contruir a partir da ´rvore do ca a a BitKeeper, v´ para Se¸˜o 2.3.7.2 [Windows BitKeeper Build], P´gina 110. a ca a Se vocˆ encontrar alguma coisa que n˜o est´ funcionando como esperado, ou tiver sugest˜es e a a o sobre o mode de melhorar o processo de constru¸˜o atual no Windows, envie uma mensagem ca para a lista de email win32. Veja Se¸˜o 1.7.1.1 [Mailing-list], P´gina 33. ca a 2.3.7.1 Construindo o MySQL Usando VC++ Nota: O MySQL 4.1 e arquivos do espe¸o de trabalho do VC++ s˜o compat´ c a iveis com o Microsoft Visual Studio 6.0 e as edi¸˜es acima (7.0/.NET) e testados pela equipe da MySQL co AB antes de cada distribui¸˜o. ca Siga este procedimento para construir o MySQL: 1. Crie um diret´rio de trabalho (ex.: ‘workdir’). o 2. Descompacte a distribui¸˜o fonte no diret´rio mencionado acima usando Winzip ou ca o outra ferramenta que possa ler arquivos ‘.zip’. 3. Inicie o compilador VC++ 6.0. 4. No menu File, selecione Open Workspace. 5. Abra o workspace ‘mysql.dsw’ que vocˆ encontrar no diret´rio de trabalho. e o
  • 143. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 109 6. No menu Build, selcione o menu Set Active Configuration. 7. Clique sobre a tela selecionada mysqld - Win32 Debug e clique OK. 8. Pressione F7 para iniciar a constru¸˜o da depura¸˜o do servidor, bibliotecas e alguns ca ca aplicativos clientes. 9. Compile as vers˜es distribu´ o idas que vocˆ desejar, do mesmo modo. e 10. Vers˜es depuradas dos programas e bibliotecas s˜o colocados nos diret´rios o a o ‘client_debug’ e ‘lib_debug’. Vers˜es liberadas dos programas e bibliotecas s˜o o a colocados nos diret´rios ‘client_release’ e ‘lib_release’. Note que se vocˆ quiser o e construir tanto vers˜es liberadas quanto depuradas vocˆ pode selecionar a op¸˜o o e ca “build all” do menu Build. 11. Teste o servidor. O servidor constru´ usando as instru¸˜es anteriores ir´ esperar que ido co a o diret´rio base e de dados do MySQL seja ‘C:mysql’ e ‘C:mysqldata’ por padr˜o. o a Se vocˆ quiser testar o seu servidor usando o diret´rio raiz de uma ´rvore fonte e seu e o a diret´rio de dados como o diret´rio base e o diret´rio de dados, vocˆ precisar´ dizer ao o o o e a servidor os seus caminhos. Vocˆ tamb´m pode fazer into na linha de comando com as e e op¸˜es --basedir e --datadir, ou colocar op¸˜es apropriadas no arquivo de op¸˜es (o co co co arquivo ‘C:my.cnf’ ou ‘my.ini’ no diret´rio do Windows). Se vocˆ tiver um diret´rio o e o de dados existente em qualquer lugar que vocˆ queira usar, vocˆ pode especific´-lo no e e a se caminho. 12. Inicie o ser servidor a partir do diret´rio ‘client_release’ ou ‘client_debug’, depen- o dendo de qual servidor vocˆ queira usar. O instru¸˜es gerais de inicializa˜o do servidor e co a est˜o em Se¸˜o 2.1.1 [Windows installation], P´gina 60. Vocˆ precisar´ adaptar as a ca a e a instru¸˜es de forma apropriada se vocˆ quiser usar um diret´rio base ou diret´rio de co e o o dados diferente. 13. Quando o servidor est´ em execu¸˜o de modo independente ou como um servi¸o daseado a ca c em sua configura¸˜o, tente se conectar a ele pelo utilit´rio interativo mysql de linha de ca a comando que existe em seu diret´rio ‘client_release’ ou ‘client_debug’. o Quando vocˆ estiver certo de que os programas que vocˆ construiu est˜o funcionando cor- e e a retamente, pare o servidor. Ent˜o instale o MySQL da seguinte forma: a 1. Crie o diret´rio para instalar os arquivos do MySQL. Por exemplo, para instalar dentro o de ‘C:mysql’), use estes comandos: C: mkdir mysql mkdir mysqlbin mkdir mysqldata mkdir mysqlshare mkdir mysqlscripts Se vocˆ quiser compilar outros clientes e lig´-los ao MySQL, vocˆ tamb´m deve criar e a e e diversos diret´rios adicionais: o mkdir mysqlinclude mkdir mysqllib mkdir mysqllibdebug mkdir mysqllibopt Se vocˆ quiser fazer um benchamrk do MySQL, crie este diret´rio: e o
  • 144. 110 MySQL Technical Reference for Version 5.0.0-alpha mkdir mysqlsql-bench Benchmark exigem suporte Perl. 2. Copie do diret´rio workdir para o diret´rio c:mysql os seguintes diret´rios: o o o copy client_release*.exe C:mysqlbin copy client_debugmysqld.exe C:mysqlbinmysqld-debug.exe xcopy scripts*.* C:mysqlscripts /E xcopy share*.* C:mysqlshare /E Se vocˆ quiser compilar outros clientes e lig´-los ao MySQL, vocˆ tamb´m deve fazer e a e e isto: copy lib_debugmysqlclient.lib C:mysqllibdebug copy lib_debuglibmysql.* C:mysqllibdebug copy lib_debugzlib.* C:mysqllibdebug copy lib_releasemysqlclient.lib C:mysqllibopt copy lib_releaselibmysql.* C:mysqllibopt copy lib_releasezlib.* C:mysqllibopt copy include*.h C:mysqlinclude copy libmysqllibmysql.def C:mysqlinclude Se vocˆ quiser fazer um benchmark do MySQL, vocˆ tamb´m deve fazer isto: e e e xcopy sql-bench*.* C:mysqlbench /E Configure e inicie o servidor da mesma forma que a distribui¸˜o bin´ria do Windows. Veja ca a Se¸˜o 2.1.1.3 [Windows prepare environment], P´gina 62. ca a ´ 2.3.7.2 Criando um Pacote Fonte do Windows a partir da Ultima Fonte de Desenvolvimento Para construir o ultimo pacote fonte do Windows a partir da arvor´ fonte atual do Bit- ´ e Keeper, use as seguintes instru¸˜es. Por favor, note que este procedimento deve ser real- co izado em um sistema executando um sistema opercional Unix ou similar. (Sabe-se que este procedimento funciona bem com o Linux, por exemplo.) 1. Clone a ´rvore fonte do BitKeeper para o MySQL (vers˜o 4.1 ou acima, como dese- a a jado). Para mais informa¸˜es sobre como clonar a ´rvore fonte veja as instru¸˜es em co a co Se¸˜o 2.3.4 [Installing source tree], P´gina 100. ca a 2. Configure e construa as distribui¸˜es para que vocˆ tenha um bin´rio do servidor para co e a trabalhar. Um modo de se fazer isto ´ executar o seguinte comando no diret´rio de e o mais alto n´ de sua ´rvore fonte: ivel a shell> ./BUILD/compile-pentium-max 3. After making sure that the build process completed successfully, run the following utility script from top-level directory of your source tree: shell> ./scripts/make_win_src_distribution This script creates a Windows source package, to be used on your Windows system. You can supply different options to the script based on your needs. It accepts the following options:
  • 145. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 111 --debug Debug, without creating the package --tmp Specify the temporary location --suffix Suffix name for the package --dirname Directory name to copy files (intermediate) --silent Do not list verbosely files processed --tar Create tar.gz package instead of .zip --help Show this help message By default, make_win_src_distribution creates a zipped archive with the name ‘mysql-VERSION-win-src.zip’, where VERSION represents the version of your MySQL source tree. 4. Copy or upload to your Windows machine the Windows source package that you have just created. To compile it, use the instructions in Se¸˜o 2.3.7.1 [Windows VC++ Build], ca P´gina 108. a 2.4 Configura¸˜es e Testes P´s-instala¸˜o co o ca Uma vez instalado o MySQL (de uma distribui¸ao bin´ria ou fonte), vocˆ deve inicializar c˜ a e as tabelas de concess˜es, iniciar o servidor e ter certeza que o servidor est´ funcionando o a bem. Vocˆ pode tamb´m desejar que o servidor inicie e pare automaticamente quando seu e e sistema iniciar e desligar. Normalmente vocˆ instala as tabelas de concess˜es e inicia o servidor assim para instala¸˜es e o co baseadas em uma distribui¸˜o fonte: ca shell> ./scripts/mysql_install_db shell> cd diretorio_instala¸~o_mysql ca shell> ./bin/mysqld_safe --user=mysql & Para uma distribui¸˜o bin´ria (sem ser pacotes RPM ou PKG), fa¸a isto: ca a c shell> cd diretorio_instala¸~o_mysql ca shell> ./bin/mysql_install_db shell> ./bin/mysqld_safe --user=mysql & O script mysql_install_db cria o banco de dados mysql que ir´ armazenar todos privil´gios a e do banco de dados, o banco de dados test que vocˆ poder´ usar para testar o MySQL e e a tamb´m entradas de privil´gio para o usu´rio que usa o mysql_install_db e o usu´rio e e a a root. As estrandas s˜o criadas sem senhas. O script mysqld_safe inicia o servidor mysqld. a (Se sua vers˜o for anterior a 4.0, use safe_mysqld em vez de mysqld_safe.) 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 a a e a test vocˆ pode removˆ-lo com mysqladmin -u root drop test depois de iniciar o servidor. e e Testes s˜o geralmente facilmente feitos de um diret´rio raiz da distribui¸˜o MySQL. a o ca Para uma distribui¸˜o bin´ria, este ´ seu diret´rio de instala¸˜o (normalmente algo como ca a e o ca ‘/usr/local/mysql’). Para uma distrubui¸˜o fonte, este ´ o diret´rio principal da sua ca e o ´rvore fonte do MySQL. a Nos comandos mostrados abaixo nesta se¸˜o e nas seguintes subse¸˜es, BINDIR ´ o caminho ca co e para a localiza¸˜o na qual os programas como mysqladmin e mysqld_safe est˜o instalados. ca a Para uma distribui¸˜o bin´ria este ´ o diret´rio ‘bin’. Para uma distribui¸˜o fonte, BINDIR ca a e o ca
  • 146. 112 MySQL Technical Reference for Version 5.0.0-alpha ´ provavelmente ‘/usr/local/bin’, a menos que vocˆ especifique um diret´rio de instala¸˜o e e o ca diferente de ‘/usr/local’ quando vocˆ executa configure. EXECDIR ´ a localiza¸˜o na qual e e ca o servidor mysqld est´ instalado. Para uma distribui¸˜o bin´ria, isto ´ o mesmo que BINDIR. a ca a e Para uma distribui¸˜o fonte, EXECDIR ´ provavelmente ‘/usr/local/libexec’. ca e Os testes s˜o descritos em detalhes abaixo: a 1. Se necess´rio, inicie o servidor mysqld e configure as tabelas de concess˜es iniciais a o contendo os privil´gios que determinam como os usu´rios est˜o permitidos a conectar e a a ao servidor. Isto ´ feito normalmente com o script mysql_install_db: e shell> scripts/mysql_install_db Normalmente, mysql_install_db precisa ser executado somente na primeira vez que vocˆ instala o MySQL. Portanto, se vocˆ estiver atualizando uma instala¸˜o existente, e e ca vocˆ pode pular este passo. (entretanto, mysql_install_db ´ realmente seguro de usar e e e n˜o ir´ atualizar nenhuma tabela que j´ exista, ent˜o se vocˆ n˜o tem certeza do que a a a a e a fazer, vocˆ pode sempre executar mysql_install_db.) e mysql_install_db cria seis tabelas (user, db, host, tables_priv, columns_priv e func) no banco de dados mysql. Uma descri¸˜o dos privil´gios iniciais ´ fornecido ca e e em Se¸˜o 4.4.4 [Default privileges], P´gina 261. De forma resumidao, estes privil´gios ca a e permitem que o usu´rio root fa¸a qualquer coisa no MySQL, e permitem a qualquer a c um a criar ou usar bancos de dados com o nome de ’test’ ou iniciando com ’test_’ . Se vocˆ n˜o configurar as tabelas de concess˜es, o seguinte erro ir´ aparecer no arquivo e a o a log quando vocˆ n˜o iniciar o servidor: e a mysqld: Can’t find file: ’host.frm’ O erro acima pode tamb´m ocorrer com uma distribui¸˜o bin´ria do MySQL se vocˆ e ca a e n˜o iniciar o MySQL executando o ./bin/mysqld_safe! Veja Se¸˜o 4.8.2 [mysqld_ a ca safe], P´gina 332. a Vocˆ deve precisar executar mysql_install_db como root. Entretanto, se vocˆ e e preferir, pode executar o servidor MySQL como um usu´rio (n˜o-root) sem a a privil´gios, desde que o usu´rio possa ler e escrever arquivos no diret´rio de banco e a o de dados. Instru¸˜es para executar o MySQL como um usu´rio sem privil´gios ´ co a e e detalhado em Se¸˜o A.3.2 [Alterando usu´rios MySQL], P´gina 919 ca a a Se vocˆ tiver problemas com o mysql_install_db, veja Se¸˜o 2.4.1 [mysql_install_ e ca db], P´gina 115. a Existem algumas alternativas para executar o script mysql_install_db como ele ´ e fornecido na distribui¸˜o MySQL: ca • Vocˆ pode querer editar o mysql_install_db antes de execut´-lo, para alterar os e a privil´gios iniciais que s˜o instalados nas tabelas de concess˜es. Isto ´ util se vocˆ e a o e´ e deseja instalar o MySQL em v´rias m´quinas com os mesmos privil´gios. Neste a a e caso, ´ prov´vel que vocˆ s´ precise adicionar algumas instru¸˜es INSERT extras e a e o co para as tabelas mysql.user e mysql.db. • Se vocˆ deseja alterar o conte´do da tabelas de concess˜es depois de instal´- e u o a las, vocˆ pode executar mysql_install_db, ent˜o usar mysql -u root mysql para e a conectar `s tabelas de concess˜es como o usu´rio root e usar instru¸˜es SQL para a o a co modific´-las diretamente. a
  • 147. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 113 ´ • E poss´ recriar as tabelas de permiss˜es completamente depois delas j´ terem ivel o a sido criadas. Vocˆ pode querer fazer isto se vocˆ j´ instalou as tabelas mas deseja e e a recri´-las depois das edi¸˜es mysql_install_db. a co Para maiores informa¸˜es sobre estas alternativas, veja Se¸˜o 4.4.4 [Default privileges], co ca P´gina 261. a 2. Inicie o servidor MySQL assim: shell> cd diretorio_instalacao_mysql shell> bin/mysqld_safe & Se a sua vers˜o do MySQL for mais antiga do que 4.0, substitua bin/safe_mysqld por a bin/mysqld_safe no comando: Se vocˆ tiver problemas iniciando o servidor, veja Se¸˜o 2.4.2 [Starting server], e ca P´gina 116. a 3. Use mysqladmin para verificar se o servidor est´ em execu¸˜o. Os seguintes coman- a ca dos fornecem um teste simples para conferir se o servidor est´ em funcionamento e a respondendo `s conex˜es: a o shell> BINDIR/mysqladmin version shell> BINDIR/mysqladmin variables A sa´ de mysqladmin version varia muito pouco dependendo de sua plataforma e ida vers˜o do MySQL, mas deve ser similar a esta mostrada abaixo: a 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 tables: 0 Queries per second avg: 0.000 Memory in use: 132K Max memory used: 16773K Para ter uma id´ia do que vocˆ pode fazer com BINDIR/mysqladmin, invoque-o com a e e op¸˜o --help. ca 4. Verifique se vocˆ pode desligar o servidor: e shell> BINDIR/mysqladmin -u root shutdown 5. Verifique que vocˆ possa reiniciar o servidor. e Fa¸a isto usando mysqld_safe ou c chamado o mysqld diretamente. Por exemplo: shell> BINDIR/mysqld_safe --log &
  • 148. 114 MySQL Technical Reference for Version 5.0.0-alpha Se o mysqld_safe falhar, tente execut´-lo do diret´rio de instala¸˜o do MySQL (se a o ca vocˆ j´ n˜o estiver l´). Se n˜o funcionar, veja Se¸˜o 2.4.2 [Starting server], P´gina 116. e a a a a ca a 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 | | db | | func | | host | | tables_priv | | user | +--------------+ shell> BINDIR/mysql -e "SELECT host,db,user FROM db" mysql +------+--------+------+ | host | db | user | +------+--------+------+ | % | test | | | % | test_% | | +------+--------+------+ Tamb´m existe uma suite de benchmark no diret´rio ‘sql-bench’ (sob o diret´rio de e o o instala¸˜o do MySQL) que vocˆ pode usar para comparar como o MySQL se comporta ca e em diferentes plataformas. O diret´rio ‘sql-bench/Results’ cont´m os resultados de o e v´rias execu¸˜es em diferentes bancos de dados e plataformas. Os seguintes m´dulos a co o Perl adicionais s˜o necess´rios para executar o pacote de benchamrk: a a DBI DBD-mysql Data-Dumper Data-ShowTable Estes m´dulos podem ser obtidos em CPAN http://www.cpan.org/. Veja Se¸˜o 2.7.1 o ca [Instala¸˜o Perl], P´gina 165. ca a O diret´rio ‘sql-bench/Results’ cont´m os resultados de v´rias execu¸˜es em difer- o e a co entes bancos de dados e plataformas. Para executar todos testes, execute estes coman- dos:
  • 149. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 115 shell> cd sql-bench shell> run-all-tests Se vocˆ n˜o possui o diret´rio ‘sql-bench’, vocˆ provavelmente est´ usando uma dis- e a o e a tribui¸˜o bin´ria RPM. (Distribui¸˜es fontes RPMs incluem o diret´rio com os bench- ca a co o marks.) Neste caso, vocˆ deve primeiramente instalar a suite de benchmark antes e de poder us´-lo. A partir da vers˜o 3.22 do MySQL, come¸aram a existir arquivos a a c RPMs de benchmark chamados ‘mysql-bench-VERSION-i386.rpm’ que cont´m c´digo e o ie dados de benchmark. Se vocˆ tem uma distribui¸˜o fonte, vocˆ tamb´m pode executar os testes no subdi- e ca e e ret´rio ‘tests’. Por exemplo, para executar ‘auto_increment.tst’, fa¸a isto: o c shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst Os resultados esperados s˜o mostrados no arquivo ‘./tests/auto_imcrement.res’. a 2.4.1 Problemas Executando o mysql_install_db O prop´sito do script mysql_install_db ´ gerar novas tabelas de privil´gios. Ele n˜o ir´ o e e a a afeter nenhum outro dado! Ele tamb´m n˜o far´ nada se vocˆ j´ tem a tabela de privil´gio e a a e a e do MySQL instalada. Se vocˆ deseja refazer suas tabelas de privil´gios, vocˆ deve desligar o servidor mysqld, se e e e ele j´ est´ executando, ent˜o fa¸a assim: a a a c mv diretorio-dados-mysql/mysql diretorio-dados-mysql/mysql-old mysql_install_db Esta se¸˜o relaciona alguns problemas que podem ser encontrados ao executar mysql_ ca install_db: mysql_install_db n˜o instala as tabelas de permiss˜es a o Vocˆ pode descobrir que o mysql_install_db falha ao instalar as tabelas de e permiss˜es e termina depois de mostrar as seguintes mensagens: o starting mysqld daemon with databases from XXXXXX mysql daemon ended Neste caso, vocˆ deve examinar o arquivo de log com muito cuidado! O log deve e se encontrar no diret´rio ‘XXXXXX’ nomeado pela mensagem de erro, e deve o indicar porque mysqld n˜o inicializa. Se vocˆ n˜o entende o que aconteceu, a e a inclua o log quando vocˆ postar um relato de erro usando mysqlbug! Veja e Se¸˜o 1.7.1.3 [Bug reports], P´gina 36. ca a J´ existe um daemon mysqld sendo executado a Neste caso, provavelmente n˜o ser´ necess´rio executar o mysql_install_db. a a a Vocˆ deve executar o mysql_install_db somente uma vez, quando vocˆ insta- e e lar o MySQL da primeira vez. Instalair um segundo daemon mysqld n˜o funciona quando um daemon a estiver em execu¸˜o. ca Isto pode acontecer quando vocˆ j´ tiver uma instala¸˜o do MySQL existente, e a ca mas deseja colocar uma nova instala¸˜o em um diferente lugar (por exemplo, ca para testes, ou talvez vocˆ simplesmente deseja executar duas instala¸˜es ao e co
  • 150. 116 MySQL Technical Reference for Version 5.0.0-alpha 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 Neste caso vocˆ ir´ obter a mensagem de erro: Can’t start server: Bind e a on TCP/IP port: Address already in use ou Can’t start server: Bind on unix socket.... Veja Se¸˜o 4.2 [M´ltiplos servidores], P´gina 220. ca u a Vocˆ n˜o tem direito de escrita no diret´rio ‘/tmp’ e a o Se vocˆ n˜o tem direito de escrita para criar um arquivo socket no local padr˜o e a a (em ‘/tmp’) ou permiss˜o para criar arquivos tempor´ris em ‘/tmp,’ vocˆ ir´ a a e a obter um erro quando executar mysql_install_db ou quando iniciar ou usar mysqld. Vocˆ pode especificar socket e diret´rio tempor´rio diferentes, como segue: e o a shell> TMPDIR=/algum_dir_tmp/ shell> MYSQL_UNIX_PORT=/algum_dir_tmp/mysqld.sock shell> export TMPDIR MYSQL_UNIX_PORT Veja Se¸˜o A.4.5 [Problems with mysql.sock], P´gina 925. ca a ‘algum_dir_tmp’ deve ser o caminho para o mesmo diret´rio no qual vocˆ tem o e permiss˜o de escrita. Veja Apˆndice E [Environment variables], P´gina 1083. a e a Depois disto vocˆ deve estar apto para executar mysql_install_db e iniciar o e servidor com estes comandos: shell> scripts/mysql_install_db shell> BINDIR/mysqld_safe & mysqld falha imediatamente Se vocˆ estiver executando RedHat Vers˜o 5.0 com uma vers˜o de glibc an- e a a terior a 2.0.7-5 vocˆ deve ter certeza que vocˆ instalou todos os patches para e e a glibc! Existe muita informa¸˜o sobre isto nos arquivos das listas de men- ca sagens do MySQL. Links para os arquivos de correio est˜o dispon´ a iveis online em http://lists.mysql.com/. Veja tamb´m Se¸˜o 2.6.2 [Linux], P´gina 137. e ca a Vocˆ pode tamb´m iniciar o mysqld manualmente usando a op¸˜o --skip- e e ca grant-tables e adicionar a informa¸ao de privil´gios usando o mysql: c˜ e shell> BINDIR/mysqld_safe --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 reload ap´s dizer ao servidor para recarregar as tabelas de permiss˜es. o o 2.4.2 Problemas Inicializando o Servidor MySQL Se vocˆ for usar tabelas que suportem transa¸˜es (BDB, InnoDB), primeiro deve-se criar e co um arquivo my.cnf e configurar op¸˜es de inicializa¸˜o para os tipos de tabelas que vocˆ co ca e planeja usar. Veja Cap´ “ptexi tulo 7 [Table types], P´gina 629. a Geralmente, vocˆ inicia o servidor mysqld de uma das trˆs maneiras: e e • Invocando mysql.server. Este script ´ usado primariamente na inicializa¸˜o e final- e ca iza¸˜o do sistema, e ´ descrito de forma mais completa em Se¸˜o 2.4.3 [Automatic ca e ca start], P´gina 118. a
  • 151. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 117 • Invocando mysqld_safe, que tenta determinar as op¸˜es apropriadas para mysqld e co ent˜o execut´-lo com estas op¸˜es. Veja Se¸˜o 4.8.2 [mysqld_safe], P´gina 332. a a co ca a • Para o Windows NT/2000/XP, veja Se¸˜o 2.1.1.7 [NT start], P´gina 66. ca a • Invocando o mysqld diretamente. o o ´ Quando o daemon mysqld inicia, ele altera o diret´rio para o diret´rio de dados. E neste diret´rio que ele espera gravar arquivos de log e o arquivo pid (com o ID do processo) e o onde ele espera encontrar os bancos de dados. A localiza¸˜o do diret´rio de dados ´ especificada quando a distribui¸˜o ´ compilada. En- ca o e ca e tretanto, se o mysqld espera encontrar o diret´rio de dados em lugar diferente de onde ele o realmente est´ no seu sistema, ele n˜o funcionar´ corretamente. Se vocˆ tiver problemas a a a e com caminhos incorretos vocˆ pode encontrar quais op¸˜es o mysqld permite e quais s˜o e co a as configura¸˜es do caminho padr˜o chamando o mysqld com a op¸˜o --help. Vocˆ pode co a ca e sobrescrever os padr˜es especificando os caminhos corretos como argumentos de linha de o comando ao mysqld. (Estas op¸˜es tamb´m podem ser usadas com o mysqld_safe). co e Normalmente vocˆ precisaria indicar ao mysqld somente o diret´rio base sob o qual o e o MySQL ´ instalado. Vocˆ pode fazer isso usando a op¸˜o --basedir. Vocˆ pode tamb´m e e ca e e usar --help para conferir o efeito das ope¸˜es para se alterar o caminho (perceba que co --help deve ser a op¸˜o final do comando mysqld. Por exemplo: ca shell> EXECDIR/mysqld --basedir=/usr/local --help Uma vez que vocˆ determina as configura¸˜es de caminho que vocˆ deseja, inicie o servidor e co e sem a op¸˜o --help. ca Qualquer que tenha sido o m´todo utilizado para iniciar o servidor, se houver falha e na inicializa¸˜o, confira o arquivo de log para ver se vocˆ pode entender o porquˆ. ca e e Arquivos log est˜o localizados no diret´rio dados (normalmente ‘/usr/local/mysql/data’ a o para uma distribui¸˜o bin´ria, ‘/usr/local/var’ para uma distribui¸˜o fonte, ca a ca ‘mysqldatamysql.err’ no Windows.) Procure no diret´rio de dados por arquivos com o nomes no formato ‘nome_maquina.err’ e ‘nome_maquina.log’ onde nome_maquina ´ o e nome do servidor. Ent˜o confira as ultimas linhas destes arquivos: a ´ shell> tail nome_maquina.err shell> tail nome_maquina.log Se vocˆ encontrar algo como o seguinte no arquivo log: e 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 Significa que vocˆ n˜o inicializou o mysqld com --bdb-no-recover e o Berkeley DB encon- e a trou algo errado com seus arquivos log quando ele tentou recuperar seus bancos de dados. Para poder continuar, vocˆ deve mover o antigo arquivo log Berkeley DB do diret´rio do e o banco de dados para outro lugar, onde poder´ examin´-los posteriormente. Os arquivos log a a s˜o nomeados ‘log.0000000001’, onde o n´mero ir´ incrementar com o tempo. a u a Se vocˆ estiver executando o mysqld com suporte a tabelas BDB e o mysqld falhar no e in´ icio, pode ser devido a alguns problemas com o arquivo de recupera¸˜o BDB. Neste caso ca vocˆ pode tentar iniciar o mysqld com --bdb-no-recover. Se isto ajudar, ent˜o vocˆ pode e a e remover todos os arquivos ‘log.*’ do diret´rio de dados e tentar iniciar o mysqld novamente. o
  • 152. 118 MySQL Technical Reference for Version 5.0.0-alpha Se vocˆ obter o seguinte erro, significa que algum outro programa (ou outro servidor mysqld) e j´ est´ usando a porta TCP/IP ou socket mysqld est´ tentando usar: a a a Can’t start server: Bind on TCP/IP port: Address already in use ou Can’t start server: Bind on unix socket... Use ps para ter certeza que vocˆ n˜o tem outro servidor mysqld em execu¸˜o. Se vocˆ e a ca e n˜o consegue encontrar outro servidor, vocˆ pode tentar executar o comando telnet sua_ a e maquina numero_porta_tcp-ip e apertar ENTER v´rias vezes. Se vocˆ n˜o obter uma a e a mensagem como telnet: Unable to connect to remote host: Connection refused, algo est´ usando a mesma porta TCP/IP que o mysqld est´ tentando usar. Veja Se¸˜o 2.4.1 a a ca [mysql install db], P´gina 115 e Se¸˜o 4.2 [Multiple servers], P´gina 220. a ca a Se o mysqld est´ atualmente em execu¸˜o, vocˆ pode verificar as configura¸˜es que ele est´ a ca e co a usando executando este comando: shell> mysqladmin variables ou shell> mysqladmin -h ’your-host-name’ variables Se vocˆ obter o Errcode 13, que significa Permission denied, ao iniciar o mysqld isto e significa que vocˆ n˜o pode ter o direito de leitura/cria¸˜o de arquivos no diret´rio do e a ca o banco de dados ou log. Neste caso vocˆ tamb´m deve iniciar o mysqld como usu´rio root e e a ou alterar a permiss˜o para os arquivos e diret´rios envolvidos para uqe vocˆ tenha o direito a o e de us´-los. a Se o mysqld_safe inicia o servidor mas vocˆ n˜o consegue se conectar a ele, tenha certeza e a que vocˆ tem uma entrada no arquivo ‘/etc/hosts’ que parece com isto: e 127.0.0.1 localhost Este problema s´ ocorre em sistemas que n˜o possuem uma biblioteca thread funcional e o a para o qual o MySQL deve estar configurado para usar MIT-pthreads. Se vocˆ n˜o consegue iniciar o mysqld vocˆ pode tentar criar um arquivo para rastrea- e a e mento de erros (trace) para encontrar o problema. Veja Se¸˜o D.1.2 [Making trace files], ca P´gina 1071. a Se vocˆ estiver utilizando tabelas InnoDB, procure pelas op¸˜es especificas de inicializa¸˜o e co ca do InnoDB. Veja Se¸˜o 7.5.3 [InnoDB start], P´gina 643. ca a Se vocˆ estiver usando tabelas BDB (Berkeley DB), vocˆ deve se familiarizar com as difer- e e entes op¸˜es especificas de inicializa¸˜o do BDB. Se¸˜o 7.6.3 [BDB start], P´gina 696. co ca ca a 2.4.3 Inicializando e parando o MySQL automaticamente. Os scripts mysql.server e mysqld_safe podem ser usados para iniciar o servidor automati- camente na inicializa¸˜o do sistema. mysql.server tamb´m pode ser usado para parar o ca e 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
  • 153. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 119 mysql.server pode ser encontrado no diret´rio ‘share/mysql’ sob o diret´rio de instala¸˜o o o ca do MySQL ou no diret´rio ‘support-files’ da ´rvore fonte do MySQL. o a Note que se vocˆ usa o pacote RPM do Linux (MySQL-server-VERS~O.rpm), o script e A mysql.server j´ estar´ instalada como ‘/etc/init.d/mysql’ - vocˆ n˜o precisa instal´- a a e a a lo manualmente. Veja Se¸˜o 2.1.2 [Linux-RPM], P´gina 69 para mais informa¸˜es sobre ca a co pacotes RPM Linux. No Mac OS X, vocˆ pode instalar um pacote do MySQL Startup Item separado para e habilitar a inicializa¸˜o autom´tica do MySQL no boot so sistema. Veja Se¸˜o 2.1.3 [Mac ca a ca OS X installation], P´gina 71 para maiores detalhes. a Antes do mysql.server iniciar o servidor, ele vai para o diret´rio de instala¸˜o do MySQL, o ca e ent˜o chama o mysqld_safe. Vocˆ pode precisar editar o mysql.server se tiver uma dis- a e tribui¸˜o bin´ria instalada em um local n˜o-padr˜o. Modifique-o para chamar o diret´rio ca a a a o (cd) apropriado antes de executar o safe_mysql. Se vocˆ deseja que o servidor seja ex- e ecutado com um usu´rio espec´ a ifico, adicione uma linha user apropriada para o arquivo ‘/etc/my.cnf’, como ser´ visto posteriormente nesta se¸˜o. a ca mysql.server stop desliga o servidor MySQL enviando um sinal para ele. Vocˆ pode e desligar o servidor manualmente executando mysqladmin shutdown. Vocˆ precisa adicionar estes comandos start e stop nos lugares apropriados de seus arquivos e ‘/etc/rc.*’ quando vocˆ quiser iniciar o MySQL automaticamente no seu servidor. e On most current Linux distributions, it is sufficient to copy the file mysql.server into the ‘/etc/init.d’ directory (or ‘/etc/rc.d/init.d’ on older Red Hat systems). Afterwards, run the following command to enable the startup of MySQL on system bootup: shell> chkconfig --add mysql.server No FreeBSD o script de inicializa¸˜o normalmente deve ir no diret´rio ca o ‘/usr/local/etc/rc.d/’. A p´gina do manual rc(8) tamb´m diz que os scripts a e neste diret´rio s´ s˜o executados, se o seu nome de base corresponder padr˜o global o o a a da sheel *.sh. Qualquer outro arquivo ou diret´rio presente dentro do diret´rio s˜o o o a silenciosamente ignorados. Em outra palavras, no FreeBSD vocˆ deve instalar o arquivo e ‘mysql.server’ como ‘/usr/local/etc/rc.d/mysql.server.sh’ para habilitar a inicializa¸˜o autom´tica. ca a Como uma alternativa para o exposto acima, alguns sistemas operacionais tamb´m usam e ‘/etc/rc.local’ ou ‘/etc/init.d/boot.local’ para inicializar servi¸os adicionais durante c o boot. Para iniciar o MySQL usando este m´todo, vocˆ poderia poderia adicionar algo e e como o seguinte a ele: /bin/sh -c ’cd /usr/local/mysql; ./bin/mysqld_safe --user=mysql &’ Vocˆ tamb´m pode adicionar op¸˜es para mysql.server em um arquivo global e e co ‘/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 [mysql.server]
  • 154. 120 MySQL Technical Reference for Version 5.0.0-alpha basedir=/usr/local/mysql O script mysql.server entende as seguintes op¸˜es: datadir, basedir e pid-file. co A seguinte tabela mostra quais grupos de op¸˜es cada script de inicializa¸˜o lˆ dos arquivos co ca e de op¸˜es: co Script Grupos de op¸˜es co mysqld [mysqld], [server] e [mysqld-major-version] mysql.server [mysql.server], [mysqld], e [server] mysqld_safe [mysql.server], [mysqld], e [server] Para compatibilidade com vers˜es anteriores, o mysql.server tamb´m lˆ o grupo [mysql_ o e e server] e mysqld_safe tamb´m lˆ o grupo [safe_mysqld]. No entanto, vocˆ deve atu- e e e alizar os seus arquivos de op¸˜es para usar os grupos [mysql.server] e [mysqld_safe]. co Veja Se¸˜o 4.1.2 [Arquivos de Op¸˜es], P´gina 217. ca co a 2.5 Atualizando/Desatualizando o MySQL Antes de fazer uma atualiza¸˜o, vocˆ deve fazer o backup de seus bancos de dados antigos. ca e Vocˆ sempre pode mover os arquivos de formato e de dados do MySQL entre diferentes e vers˜es na mesma arquitetura enquanto vocˆ tiver vers˜o base do MySQL. A vers˜o base o e a a atual ´ 4. Se vocˆ alterar o conjunto de caracteres quando executar o MySQL, vocˆ deve e e e executar myisamchk -r -q --set-character--set=charset em todas tabelas. De outra forma seus ´ indices podem n˜o ser corretamente ordenados, porque alterar o conjunto de a caracteres tamb´m pode alterar a ordena¸˜o. e ca Se vocˆ tem receio de novas vers˜es, vocˆ sempre pode renomear seu antigo mysqld para e o e algo como mysqld-’n´mero-da-vers˜o-antiga’. Se o seu novo mysqld comportar de maneira u a inesperada, vocˆ simplesmente pode desliga-lo e reiniciar com seu antigo mysqld! e Se depois de uma atualiza¸˜o, vocˆ tiver problemas com programas clientes recompilados ca e como Commands out of sync ou “core dumps” inexperados, vocˆ provavelmente usou um e arquivo de cabe¸alho ou de biblioteca antigo na compila¸˜o de seus programas. Neste caso c ca vocˆ deve conferir a data de seu arquivo ‘mysql.h’ e da biblioteca ‘libmysqlclient.a’ e para verificar que eles s˜o da nova distribui¸˜o MySQL. Se n˜o, por favor, recompile seus a ca a programas! Se vocˆ tiver problemas, como na inicializa¸˜o do novo servidor mysqld ou caso vocˆ n˜o e ca e a consiga conectar sem uma senha, confira se o seu arquvo ‘my.cnf’ ´ o mesmo da antiga e instala¸˜o! Vocˆ pode conferir com isto: nome-programa --print-defaults. Se isto n˜o ca e a produzir outra sa´ al´m do nome do programa, vocˆ tem um arquivo my.cnf ativo que ida e e est´ afetando a operacionalidade do servidor! a ´ E uma boa id´ia reconstruir e reinstalar o m´dulo Perl DBD-mysql sempre que instalar uma e o nova vers˜o do MySQL. O mesmo se aplica para outras interfaces MySQL, como Python a MySQLdb. 2.5.1 Atualizando da Vers˜o 4.0 para 4.1 a Varias comportamentos vis´ iveis foram alteradas entre o MySQL 4.0 e o MySQL 4.1 para corrigir erros cr´ iticos e tornar o MySQL mais compat´ com o padr˜o ANSI SQL. Estas ivel a altera¸˜es podem afetar ` sua aplica¸˜o. co a ca
  • 155. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 121 Alguns dos comportamentos do MySQL 4.1 no 4.0 podem ser testados antes de realizar uma atualiza¸˜o completa para a vers˜o 4.1, adicionamos `s ultimas distribui¸˜es do MySQL 4.0 ca a a ´ co (a paritr da 4.0.12) a op¸˜o de inicializa¸˜o --new para o mysqld. ca ca Esta op¸˜o lhe d´ o comportamento da vers˜o 4.1 para as altera¸˜es mais cr´ ca a a co iticas. Vocˆ e tamb´m pode habilitar estes comportamentos para a conex˜o de uma determinado cliente e a com o comando SET @@new=1, ou desabilit´-lo se ele for iniciado com SET @@new=0. a Se vocˆ acredita que algumas das altera¸˜es da vers˜o 4.1 o afetar˜o, recomendamos que e co a a antes de atualizar para a vers˜o 4.1, vocˆ fa¸a o download da ultima distribui¸˜o do MySQL a e c ´ ca 4.0 e o execute com a op¸˜o --new adicionando o seguinte ao seu arquivo de configura¸˜o: ca ca [mysqld-4.0] new Deste modo vocˆ pode testar o novo comportamento com seus aplicativos na vers˜o 4.0 para e a certificar-se que eles funcionam. Isto o ajudar´ a ter uma transi¸˜o suave quando realizar a ca uma atualiza¸˜o completa do MySQL 4.1. Fazendo isto do modo acima ir´ assegurar que ca a vocˆ n˜o execute acidentalemte a vers˜o 4.1 com a op¸˜o --new mais tarde. e a a ca A seguinte lista descreve altera¸˜es que podem afetar aplica¸˜es e que vocˆ deve observar co co e ao atualizar para a vers˜o 4.1: a • TIMESTAMP agora ´ retornado como uma string com o formato ’YYYY-MM-DD HH:MM:SS’. e (A op¸˜o --new pode ser usada a partir da vers˜o 4.0.12 para fazer um servidor 4.0 ca a se comportar como 4.1 a este respeito.) Se vocˆ quiser tˆ-lo com um n´mero (como a e e u Vers˜o 4.0 faz) deve-se adicionar +0 a coluna TIMESTAMP a eles: a mysql> SELECT ts_col + 0 FROM tbl_name; Tamanhos de display para TIMESTAMP n˜o s˜o mais suportados. Por exemplo, se vocˆ a a e declarar um coluna como TIMESTAMP(10), o (10) ´ ignorado. e Esta mudan¸a era necess´ria para compatibilidade com os padr˜es SQL. Em uma vers˜o c a o a futura. Em uma vers˜o futura, uma altera¸˜o adicional ser´ feita (compat´ a ca a ivel com vers˜es anteriores com esta muda¸a), permitindo que o tamanho do timestamp indique o c o n´mero desejado de d´ u igitos de fra¸˜es de um segundo. co • Valores bin´rios (0xFFDF) agora s˜o assumidos como strings em vez de n´meros. Isto a a u corrige o problema com conjunto de caracteres onde ´ conveniente colocar a string como e um valor bin´rio. Com esta altera¸˜o vocˆ deve usar CAST() se vocˆ quiser comparar a ca e e valores bin´rios numericamente como inteiros: a SELECT CAST(0XFEFF AS UNSIGNED INTEGER) < CAST(0XFF AS UNSIGNED INTEGER) Se vocˆ n˜o usa CAST(), uma compara¸˜o lexicogr´fica da string ser´ feita: e a ca a a mysql> SELECT 0xFEFF < 0xFF; -> 1 Usando itens bin´rios em um contexto num´rico ou comparando-os usando o operador a e = deve funcionar como antes. (A op¸˜o --new pode ser usado para fazer o servidor 4.0 ca se comportar como 4.1 a partir da vers˜o 4.0.13.) a • Para fun¸˜es que produzem um valor DATE, DATETIME, ou TIME, o resultado retornado co para o cliente agora est´ corrigido para ter um tipo temporal. Por exemplo, no MySQL a 4.1, vocˆ tem este resultado: e mysql> SELECT CAST("2001-1-1" as DATETIME);
  • 156. 122 MySQL Technical Reference for Version 5.0.0-alpha -> ’2001-01-01 00:00:00’ No MySQL 4.0, o resultado ´ diferente: e mysql> SELECT CAST("2001-1-1" as DATETIME); -> ’2001-01-01’ • Valores DEFAULT n˜o podem mais ser especificado para colunas AUTO_INCREMENT (Na a vers˜o 4.0, um valor DEFAULT ´ ignorado sem aviso, na 4.1 ocorre um erro). a e • SERIALIZE n˜o ´ mais uma op¸˜o v´lida para sql_mode. a e ca a Deve-se usar SET TRANSACTION ISOLATION LEVEL SERIALIZABLE. SERIALIZE tamb´m n˜o ´ mais v´lido e a e a para a op¸˜o --sql-mode do mysqld. Use --transaction-isolation=SERIALIZABLE ca • Todas tabelas e colunas strings agora tˆm um conjunto de caracter. Veja Cap´ e “ptexi tulo 9 [Charset], P´gina 707. A informa¸˜o do conjunto de caracteres ´ mostrada por a ca e SHOW CREATE TABLE e mysqldump. (O MySQL vers˜o 4.0.6 e acima pode ler o novo a arquivo dump; vers˜es mais antigas n˜o podem.) o a • O formato de defini¸˜o de tabela usado nos arquivos ‘.frm’ mudaram um pouco na ca vers˜o 4.1. O MySQL 4.0.11 e adiante leˆm o novo formato ‘.frm’ diretamente, mas a e vers˜es mais antigas n˜o podem. Se vocˆ precisa mover tabelas da vers˜o 4.1. para o a e a uma mais nova que a 4.0.11, vocˆ de usar mysqldump. Veja Se¸˜o 4.9.7 [mysqldump], e ca P´gina 362. a • Se vocˆ estiver executando v´rios servidores na mesma m´quina Windows, vocˆ deve e a a e usar uma op¸˜o --shared_memory_base_name diferentes para cada m´quina ca a • A interface para agrupar fun¸˜es UDF alterou um pouco. Vocˆ deve agora declarar co e uma fun¸˜o xxx_clear() para cada fun¸˜o de agrupamento. ca ca Em geral, atualizar para o MySQL 4.1 a partir de uma vers˜o mais nova do MySQL envolve a os serguintes passos: • Verifique na se¸˜o de altera¸˜es se houve alguma mudan¸a que pode afetar a sua ca co c aplica¸˜o. ca • Leia os novos itens da vers˜o 4.1 para ver quais itens interessantes que vocˆ pode usar a e na vers˜o 4.1. Veja Se¸˜o C.2 [Novidades na vers˜o 4.1.x], P´gina 948. a ca a a • Se vocˆ estiver executando o MySQL Server no Windows, veja tamb´m Se¸˜o 2.5.8 e e ca [Windows upgrading], P´gina 132. a • Ap´s o upgrade, atualize a tabela de permiss˜es para gerar uma nova coluna Password o o maior que ´ necess´ria para tratamento seguro de senhas. O procedimento usa mysql_ e a fix_privilege_tables e est´ descrito em Se¸˜o 2.5.6 [Upgrading-grant-tables], a ca P´gina 130. Estrat´gias alternativas para tratamento de senhas depois de uma a e atualiza¸˜o est˜o descritos posteriormente nesta se¸˜o. ca a ca O mecanismo de hashing da senha foi alterado na vers˜o 4.1 para fornecer maior seguran¸a, a c mas ele pode causar problemas de compatibilidade se vocˆ ainda tiver clientes que usam a e ´ biblioteca cliente 4.0 ou anterior. (E bastante indesej´vel que vocˆ tenha clientes 4.0 em a e situa¸˜es onde o cliente conecta de uma m´quina remota que ainda n˜o tenha sido atualizada co a a para a vers˜o 4.1). A seguinte lista indica algumas estrat´gias poss´ a e iveis de atualiza¸˜o. Elas ca representam o que se deve fazer para escolher se ter compatibilidade com clientes antigos e ter maior seguran¸a. c • N˜o atualizar para a vers˜o 4.1. Nenhum comportamento ser´ alterado, mas ´ claro a a a e que vocˆ n˜o poder´ usar qualquer um dos novos recursos fornecido pelo protocolo e a a
  • 157. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 123 cliente/servidor da vers˜o 4.1. (O MySQL 4.1 tem um protocolo cliente/servidor ex- a tendido que oferece tais recursos como instru¸˜es preparadas e conjuntos de m´ltiplos co u resultados.) Veja Se¸˜o 12.1.4 [C API Prepared statements], P´gina 824. ca a • Atualizar para a vers˜o 4.1 e executar o script mysql_fix_privilege_tables para a aumentar a coluna Password na tabela user e assim poder guardar hashes de senhas longos. Mas execute o servidor com a op¸˜o --old-passwords para fornecer compati- ca bilidade com vers˜es anteriores que premitem que clientes pre-4.1 continuem a conectar o em suas contas de hash curto. Eventualmente, quando todos os seus clientes estiverem atualizados para a vers˜o 4.1, vocˆ pode parar de usar a op¸˜o do servidor --old- a e ca passwords. Vocˆ tamb´m pode alterar as senhas em sua conta MySQL para usar o e e novo formato que ´ mais seguro. e • Atualizar para vers˜o 4.1 e executar o script mysql_fix_privilege_tables para au- a mentar a coluna Password na tabela user. Se vocˆ sabe que todos os clientes tamb´m e e foram atualizados para a vers˜o 4.1, n˜o execute o servidor com a op¸˜o --old- a a ca passwords. Em vez disso, altere a senha em todas as contas existentes para que elas tenham o novo formato. Uma instala¸˜o pura da vers˜o 4.1 ´ o mais seguro. ca a e Informa¸˜es adicionais sobre hashing de senha em rela¸˜o a autentica¸˜o no cliente e co ca ca opera¸˜es de altera¸˜o de senha podem ser encontrados em Se¸˜o 4.3.11 [Password hashing], co ca ca P´gina 246. a 2.5.2 Atualizando da Vers˜o 3.23 para 4.0 a Em geral, o que vocˆ deve fazer ´ atualizar para a vers˜o 4.0 um vers˜o mais nova do e e a a MySQL: • Ap´s o upgrade, atualize a tabela de permiss˜es para adicionar novos privil´gios e o o e recursos. O procedimento usa o script mysql_fix_privilege_tables e est´ descrito a em Se¸˜o 2.5.6 [Upgrading-grant-tables], P´gina 130. ca a • Edite qualquer script de inicializa¸˜o ou arquivo de configura¸˜o para n˜o utilizar ca ca a nenhuma das op¸˜es obsoletas listadas posteriormente nesta se¸˜o. co ca • Converta seua arquivos ISAM antigos para arquivos MyISAM com o comando: mysql_ convert_table_format database. (Este ´ um script Perl; ele exige que o DBI esteja e instalado). Paa converter a tabela em um dado banco de dados, use este comando: shell> mysql_convert_table_format database db_name Note que ele deve ser usado apenas se vocˆ usar se todas as tabelas em um dado banco e de dados s˜o ISAM ou MyISAM. Para evitar a convers˜o de tabelas de outros tipos para a a MyISAM, vocˆ pode listar explicitamente o nome de suas tabelas ISAM depois do nome e do banco de dados na linha de comando. Vocˆ tamb´m pode executar uma instru¸˜o e e ca ALTER TABLE table_name TYPE=MyISAM para cada tabela ISAM para convertˆ-la para e MyISAM. Para descobir o tipo de uma determinada tabela, use esta instru¸˜o: ca mysql> SHOW TABLE STATUS LIKE ’tbl_name’; • Certifique-se de que vocˆ n˜o tem nenhum cliente MySQL que utiliza bibliotecas com- e a partilhadas (com o Perl DBD-mysql). Se vocˆ tiver, vocˆ deve recompil´-las j´ que e e a a as estruturas usadas em ‘libmysqlclient.so’ foram alteradas. O mesmo se aplica a outras interfaces MySQL, como Python MySQLdb.
  • 158. 124 MySQL Technical Reference for Version 5.0.0-alpha O MySQL 4.0 funcionar´ mesmo se vocˆ n˜o fizer o acima, mas vocˆ n˜o poder´ usar os a e a e a a novos privil´gios de seguran¸a pois o MySQL 4.0 e vocˆ podem encontrar problemas ao e c e atualizar o MySQL para a vers˜o 4.1 ou mais nova. O formato do arquivo ISAM ainda a funciona no MySQL 4.0 mas est´ obsoleto e ser´ disabilitado (n˜o compilado por padr˜o) a a a a no MySQL 4.1. Em vez disso deve se usar tabelas MyISAM. Clientes antigos devem funcionar com um servidor vers˜o 4.0 sem nenhum problema. a Mesmo se vocˆ fizer o indicado acima, vocˆ ainda pode voltar para o MySQL 3.23.52 ou e e mais novo se vocˆ encontrar problemas com o MySQL da s´rie 4.0. Neste caso vocˆ deve e e e ´ usar o mysqldump para fazer um dump de qualquer tabela que use um indice full-text e recarregar o arquivo de dump no servidor 3.23 (pois o 4.0 usa um novo formato para ´ indices full-text). A seguir est´ uma lista mais completa com o que deve ser observado para atualizar para a a vers˜o 4.0; a • O MySQL 4.0 tem v´rios novos privil´gios na tabela mysql.user. Veja Se¸˜o 4.4.1 a e ca [GRANT], P´gina 255. a Para fazer estes novos privil´gios funcionarem, deve se atualizar a tabela de permiss˜es. e o O procedimento est´ descrito em Se¸˜o 2.5.6 [Upgrading-grant-tables], P´gina 130. At´ a ca a e que este script esteja executando todos os usu´rios tˆm os privil´gios SHOW DATABASES, a e e CREATE TEMPORARY TABLES e LOCK TABLES. Os privil´gios SUPER e EXECUTE tiram o seu e valor de PROCESS. REPLICATION SLAVE e REPLICATION CLIENT tiram o seu valor de FILE. Se vocˆ tiver qualquer script que crie novos usu´rios, vocˆ pode querer alter´-los para e a e a usar os novos privil´gios. Se vocˆ n˜o est´ usando o comando GRANT nos scripts, este e e a a ´ um bom momento para alterar os seus scripts e usar GRANT em vez de modificar a e tabela de permiss˜es diretamente. o A partir da vers˜o 4.0.2 a op¸˜o --safe-show-database est´ obsoleta (e n˜o faz mais a ca a a nada). Veja Se¸˜o 4.3.3 [Op¸˜es de privil´gio], P´gina 231. ca co e a Se vocˆ receber um erro Access denied para novos usu´rios na vers˜o 4.0.2, vocˆ deve e a a e verificar se vocˆ precisa de alguma das novas concess˜es que vocˆ n˜o precisava antes. e o e a Em particular, vocˆ precisar´ REPLICATION SLAVE (em vez de FILE) para novos slaves. e a • ‘safe_mysqld’ ´ renomeado para ‘mysqld_safe’. Para compatibilidade com vers˜es e o anteriores, as distribui¸˜es bin´rias, ir˜o, por algum tempo, incluir safe_mysqld como co a a um link simb´lico para mysqld_safe. o • Suporte para InnoDB agora est´ inclu´ na distribui¸˜o bin´ria. Se vocˆ contruir o a ido ca a e MySQL a partir de um fonte, o InnoDB est´ configurado por padr˜o, Se vocˆ n˜o usar a a e a o InnoDB e quiser economizar mem´ria ao executar o servidor que possui suorte a o InnoDB habilitado, use a op¸˜o de inicializa¸˜o do servidor. Para compilar o MySQL ca ca sem suporte ao InnoDB, execute configure com a op¸˜o --without-innodb. ca • O parˆmetro de inicializa¸˜o myisam_max_extra_sort_file_size e myisam_max_ a ca extra_sort_file_size s˜o dados agora em bytes. (eram dados em megabytes antes a da vers˜o 4.0.3). a O lock de sistema externo dos arquivos MyISAM/ISAM agora est´ desligado por a padr˜o. Pode se lig´-los fazendo --external-locking. (Para a maioria dos usu´rios a a a isto nunca ´ necess´rio). e a
  • 159. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 125 • A seguintes vari´veis/op¸˜es de inicializa¸ao foram renomeadas: a co c Nome Antigo Novo Nome. myisam_bulk_insert_tree_size bulk_insert_buffer_size query_cache_startup_type query_cache_type record_buffer read_buffer_size record_rnd_buffer read_rnd_buffer_size sort_buffer sort_buffer_size warnings log-warnings --err-log --log-error (para mysqld_safe) As op¸˜es de inicializa¸˜o record_buffer, sort_buffer e warnings ainda funcionar˜o co ca a no MySQL 4.0 mas est˜p obsoletas. a • As seguintes veri´veis SQL mudaram o nome. a Nome Antigo Novo Nome. SQL_BIG_TABLES BIG_TABLES SQL_LOW_PRIORITY_UPDATES LOW_PRIORITY_UPDATES SQL_MAX_JOIN_SIZE MAX_JOIN_SIZE SQL_QUERY_CACHE_TYPE QUERY_CACHE_TYPE Os nomes antigos ainda funcionam no MySQL 4.0 mas est˜o obsoletos. a • Vocˆ deve usar SET GLOBAL SQL_SLAVE_SKIP_COUNTER=# em vez de SET SQL_SLAVE_ e SKIP_COUNTER=#. • As op¸˜es de inicializa¸˜o --skip-locking e --enable-locking foram renomeadas co ca para --skip-external-locking e --external-locking. • SHOW MASTER STATUS agora retorna um conjunto vazio se o log bin´rio n˜o estiver ha- a a bilitado. • SHOW SLAVE STATUS agora retorna um conjunto vazio se o slave n˜o est´ inicializado. a a • O mysqld agora tem a op¸˜o --temp-pool habilitada por padr˜o j´ que isto da melhor ca a a rendimento com alguns SO (Principalmente no Linux). • Colunas DOUBLE e FLOAT agora respeitam o parˆmetro UNSIGNED no armazenamento a (antes, UNSIGNED era ignortado por estas colunas). • ORDER BY coluna DESC ordena valores NULL por ultimo, como no MySQL 4.0.11. Na ´ vers˜o 3.23 e anteriores da vers˜o 4.0, isto nem sempre era consistente. a a • SHOW INDEX tem duas colunas a mais (Null e Index_type) que ele tinha nas vers˜es o 3.23. • CHECK, SIGNED, LOCALTIME e LOCALTIMESTAMP s˜o agora palavras reservadas. a • O resultado de todos os operadores bitwise (|, &, <<, >> e ~) agora s˜o unsigned. Isto a pode causar problemas se vocˆ estiver usando-as em um contexto onde vocˆ quer um e e resultado com sinal. Veja Se¸˜o 6.3.5 [Fun¸˜es de Convers˜o], P´gina 543. ca co a a • Nota: quando vocˆ usa subtra¸˜o entre valores inteiros onde um deles ´ do tipo e ca e UNSIGNED, o resultado ser´ sem sinal. Em oyras palavras, antes de atualizar para o a MySQL 4.0, vocˆ deve verificar sua aplica¸˜o para os casos onde vocˆ est´ subtraindo e ca e a um valor de uma entidade sem sinal e quer um n´mero negativo como resposta ou sub- u traindo um valor sem sinal de uma coluna do tipo inteiro. Vocˆ pode disabilitar este e comportamento usando a op¸˜o --sql-mode=NO_UNSIGNED_SUBTRACTION ao iniciar o ca mysqld. Veja Se¸˜o 6.3.5 [Fun¸˜es de convers˜o], P´gina 543. ca co a a
  • 160. 126 MySQL Technical Reference for Version 5.0.0-alpha • Para usar MATCH ... AGAINST (... IN BOOLEAN MODE) com suas tabelas, vocˆ precisa e recontru´ i-las com REPAIR TABLE nome_tabela USE_FRM. • LOCATE() e INSTR() s˜o caso sensitivo se um dos argumentos ´ uma string bin´ria. De a e a outra forma elas s˜o caso-insensitivo. a • STRCMP() agora usa o conjunto de caracteres atual ao fazer compara¸˜es, o que significa co que o comportamento padr˜o das compara¸˜es agora ´ caso-insensitivo. a co e • HEX(string) agora retorna os caracteres na string convertidos para hexadecimal. Se vocˆ quiser converter um n´mero para hexadecimal, vocˆ deve se assugurar que vocˆ e u e e chama HEX() com um argumento num´rico. e • Na vers˜o 3.23, INSERT INTO ... SELECT sempre tem o IGNORE habilitado. Na vers˜o a a a ´ 4.0.1, o MySQL ir´ parar (e possivelmente fazer um roll back) por padr˜o no caso de a ‘mysqld_safe’ ser renomeado para ‘mysqld_safe’. Por algum tempo incluiremos em nossa distribui¸˜o bin´ria o mysqld_safe como um link simb´lico para mysqld_safe. ca a o • um erro se vocˆ n˜o especificar IGNORE. e a • As fun¸˜es antigas da API C mysql_drop_db(), mysql_create_db() e mysql_ co connect() n˜o s˜ mais suportadas a menos que vocˆ compile o MySQL com a a e CFLAGS=-DUSE_OLD_FUNCTIONS. No entanto, ´ preferivel e ´ alterar o cliente para utilizar a nova API 4.0. • Na estrutura MYSQL_FIELD, length e max_length foram alterados de unsigned int para unsigned long. Isto n˜o deve causar problemas, exceto que eles podem gerar a mensagens de avisos quando quando usado como argumento em uma classe printf() de fun¸˜es. co • Vocˆ deve usar TRUNCATE TABLE quando quiser deletar todos os registros de uma tabela e e vocˆ n˜o precisa obter uma contagen de quantas colunas forma deletadas. (DELETE e a FROM table_name retorna a contagem de linhas na vers˜o 4.0, e TRUNCATE TABLE ´ mais a e r´pido.) a • Vocˆ receber´ um erro se tiver um LOCK TABLES ativo ou transa¸˜es ao tentar executar e a co TRUNCATE TABLE ou DROP DATABASE. • Vocˆ deve usar inteiros para armazenar valores em colunas BIGINT (em vez de usar e strings, como vocˆ fez no MySQL 3.23). Usar strings ainda funicona, mas usar inteiros e ´ mais eficiente. e • O formato de SHOW OPEN TABLE alterou. • Clientes multi-thread devem usar mysql_thread_init() e mysql_thread_end(). Veja Se¸˜o 12.1.14 [Clientes em threads], P´gina 859. ca a • Se vocˆ quiser recompilar o m´dulo Perl DBD::mysql, vocˆ deve conseguir o DBD-mysql e o e vers˜o 1.2218 ou mais novo porque os m´dulos DBD mais antigos usam a chamada a o obsoleta mysql_drop_db(). A vers˜o 2.1022 ou mais nova ´ recomendada. a e • Na vers˜o RAND(seed) retorna uma s´rie de n´mero randˆmicas diferente que na 3.23; a e u o isto foi feito para uma diferencia¸˜o maior de RAND(seed) e RAND(seed+1). ca • O tipo padr˜o retornado por IFNULL(A,B) agora est´ configurado para ser o mais ’geral’ a a ´ ´ string, REAL ou INTEGER). dos tipos de A e B. (A ordem geral-para-especifco e Se vocˆ estiver executando o MySQL Server no Windows, veja Se¸˜o 2.5.8 [Atualizando o e ca Windows], P´gina 132. Se vocˆ estiver usando replica¸˜o, veja Se¸˜o 4.11.2 [Replication a e ca ca Implementation], P´gina 380. a
  • 161. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 127 2.5.3 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ˆ a e n˜o necessita converter suas antigas tabelas para us´-las com a vers˜o 3.23. Por padr˜o, a a a a todas novas tabelas ser˜o criadas usando o tipo MyISAM (a menos que vocˆ inicie o mysqld a e com a op¸˜o --default-table-type=isam). Vocˆ pode converterr uma tabela ISAM para ca e uma formato MyISAM com ALTER TABLE nome_tabela TYPE=MyISAM ou com o script Perl mysql_convert_table_format. Os clientes vers˜es 3.22 e 3.21 ir˜o trabalhar sem quaisquer problemas com um servidor o a vers˜o 3.23. a As seguintes listas dizem o que vocˆ deve conferir quando atualizar para a vers˜o 3.23: e a • 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 e liga¸˜o e o banco de dados original ser˜o apagados. (Isto n˜o acontece na 3.22 porque ca a a o configure n˜o detecta a disponibilidade da chamada de sistema readlink). a • OPTIMIZE TABLE agora funciona somente para tabelas MyISAM. Para outros tipos de tabelas, vocˆ pode usar ALTER TABLE para otimizar a tabela. Durante o OPTIMIZE e TABLE a tabela ´, agora, bloqueada para prevenir que seja usada por outras threads. e • O cliente MySQL mysql ´, agora, inicializado por padr˜o com a op¸˜o --no-named- e a ca commands (-g). Esta op¸˜o pode ser desabilitada com --enable-named-commands ca (-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. • Fun¸˜es de data que funcionam em partes de datas (como MONTH()) n˜o retornar´ 0 co a a para datas 0000-00-00. (No MySQL 3.22 estas fun¸˜es retornam NULL.) co • Se vocˆ estiver usando a ordem de classifica¸ao de caracteres alem~ para tabelas ISAM, e c˜ a vocˆ deve reparar todas suas tabelas com isamchk -r, porque foram feitas altera¸˜es e co na sua ordem de classifica¸˜o! ca • O tipo padr˜o de retorno de IF() ir´ agora depender de ambos argumentos e n˜o a a a apenas do primeiro argumento. • Colunas AUTO_INCREMENT n˜o devem ser usadas para armazenar n´meros negativos. A a u raz˜o para isto ´ que n´meros negativos causam problemas quando o -1 passa para 0. a e u Vocˆ n˜o deve armazenar 0 em uma coluna AUTO_INCREMENT tamb´m; CHECK TABLE ir´ e a e a reclamar sobre valores 0 porque eles podem alterar se vocˆ fizer um dump e restaurar a e tabela. AUTO_INCREMENT ´, agora, tratado em um n´ mais baixo para tabelas MyISAM e ivel e ´ muito mais r´pido que antes. Para tabelas MyISAM n´meros antigos tamb´m n˜o e a u e a s˜o mais reusados, mesmo se vocˆ apagar algumas linhas da tabela. a e • 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 n´mero fixo de decimais. u • Quando estiver declarando colunas usando o tipo DECIMAL(tamanho,dec, o argumento tamanho n˜o inclui mais um lugar para o s´ a imbolo do ponto decimal.
  • 162. 128 MySQL Technical Reference for Version 5.0.0-alpha • 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 ca que o operador ’=’. Se vocˆ precisa do antigo compartamento, vocˆ pdoe compilar o e e MySQL com a op¸˜o CXXFLGAS=-DLIKE_CMP_TOUPPER. ca • REGEXP agora ´ caso insensitivo se nenhuma das strings forem bin´rias. e a • Quando for necess´rio dar manuten¸˜o ou reparar tabelas MyISAM ‘.MYI’ deve ser usado a ca a instru¸˜o CHECK TABLE ou o comando myisamchk. Para tabelas ISAM (.ISM), use o ca comando isamchk • Se desejar que os arquivos mysqldump sejam compat´ iveis entre as vers˜es 3.22 e 3.23 o do MySQL, n˜o deve ser usados as op¸˜es --opt ou --full com o mysqldump. a co • Confira todas suas chamadas ` DATE_FORMAT() para ter certeza que exista um ‘%’ antes a de cada caractere formatador. (Vers˜es mais antigas que o MySQL 3.22 aceitaivam esta o 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 fun¸˜o que obtem valores MYSQL_RES* como um argumento). Com um objeto MYSQL* ca agora voce deve usar 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´, em 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 a argumento. 2.5.4 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- 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 e a a mysqld. Depois de instalar o MySQL vers˜o 3.22, vocˆ deve iniciar o novo servidor e depois executar a e o script mysql_fix_privilege_tables. Isto adicionar´ os novos privil´gios que vocˆ pre- a e e cisar´ para usar o comando GRANT. Se vocˆ se esquecer disto, sera retornado o erro Access a e denied quando vocˆ tentar usar ALTER TABLE, CREATE INDEX ou DROP INDEX. O procedi- e mento para atualizar a tabela de permiss˜es est´ descrito em Se¸˜o 2.5.6 [Upgrading-grant- o a ca tables], P´gina 130. a A interface API C para mysql_real_connect() foi alterada. Se vocˆ tem um programa e cliente antigo que chama essa fun¸˜o, vocˆ deve colocar um 0 para o novo argumento db (ou ca e
  • 163. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 129 recodificar o cliente para enviar o elemento db para conex˜es mais r´pidas). Vocˆ tamb´m o a e e deve chamar mysql_init() antes de chamar mysql_real_connect()! Esta altera¸˜o foi ca feita para permitir ` nova fun¸˜o mysql_options() salvar op¸˜es na estrutura do manipu- a ca co lador do MYSQL. A vari´vel key_buffer do mysqld foi renomeada para key_buffer_size, mas vocˆ ainda a e pode usar o antigo nome nos seus arquivos de inicializa¸˜o. ca 2.5.5 Atualizando da vers˜o 3.20 para 3.21 a Se vocˆ estiver executando uma vers˜o mais antiga que a Vers˜o 3.20.28 e deseja mudar e a a para a vers˜o 3.21 vocˆ deve fazer o seguinte: a e Inicie o servidor mysqld vers˜o 3.21 com a op¸˜o --old-protocol para us´-lo com clientes a ca a de uma distribui¸˜o da vers˜o 3.20 Neste caso, a nova fun¸˜o cliente mysql_errno() n˜o ca a ca a ir´ retornar erro do servidor, somente CR_UNKNOWN_ERROR (mas isto funciona para erros de a clientes) e o servidor usa a forma fun¸˜o password() anterior a 3.21 para verifica¸˜o, ao ca ca inv´s do novo m´todo. e e Se vocˆ NAO e ˜ estiver usando a op¸˜o --old-protocol para mysqld, vocˆ precisar´ fazer as ca e a seguir altera¸˜es: co • 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 vers˜o do MySQL 3.20.28 e superiores podem manipular o novo formato da tabela de a usu´rios sem afetar os clientes. Se vocˆ tem uma vers˜o do MySQL mais nova que 3.20.28, a e a senhas n˜o ir˜o mais funcionar se vocˆ converter a tabela de usuaios. Por seguran¸a, vocˆ a a e c e primeiro deve fazer uma atualiza¸˜o para a vers˜o 3.20.28, pelo menos, e ent˜o atualizar ca a a para a vers˜o 3.21. a O novo c´digo cliente trabalha com um servidor mysqld 3.20.x, portanto se houver proble- o mas com 3.21.x vocˆ deve usar o antigo servidor 3.20.x sem a necessidade de recompilar os e clientes novamente. Se vocˆ n˜o est´ usando a op¸˜o --old-protocol para o mysqld, antigos clientes n˜o e a a ca a poder˜o se conectar e exibir˜o a seguinte mensagem de erro: a a ERROR: Protocol mismatch. Server Version = 10 Client Version = 9 A nova interface PERL DBI/DBD tamb´m suporta a antiga interface mysqlperl. A unica e ´ altera¸˜o que deve ser feita se vocˆ usa o mysqlperl ´ alterar os argumentos para a fun¸˜o ca e e ca connect(). Os novos argumentos s˜o: host, database, user, password (note que os a argumentos user e password foram alterados de lugar). Veja Se¸˜o 12.5.2 [Perl DBI Class], ca P´gina 877. a As seguintes altera¸˜es podem afetar consultas em antigas aplica¸˜es: co co • HAVING deve ser especificada antes de qualquer cl´usula ORDER BY. a
  • 164. 130 MySQL Technical Reference for Version 5.0.0-alpha • 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.6 Atualizando a Tabela de Permiss˜es o Algumas distribui¸˜es introduzem altera¸˜es a estrutura da tabelas de permiss˜es (a tabela co co o no banco de dados mysql) para adicionar novos privil´gios ou recursos. Para ter certeza e de que as suas tabelas de permiss˜es est˜o corretas quando vocˆ atualizar para uma nova o a e vers˜o do MySQL, vocˆ deve atualizar a sua tabela de permiss˜o tamb´m. a e a e Em sistemas Unix ou semelhantes, atualize a tabela de permiss˜es executando o script o mysql_fix_privilege_tables: shell> mysql_fix_privilege_tables Vocˆ deve executar este script enquanto o servidor est´ em execu¸˜o. Ele tenta se conectar e a ca ao servidor na m´quina local como root. Se sua conta root exige uma senha, indique a a senha na linha de comando. Para o MySQL 4.1 e acima, especifique a senha assim: shell> mysql_fix_privilege_tables --password=senha_root Antes do MySQL 4.1, especifique a senha desta forma: shell> mysql_fix_privilege_tables senha_root O script realiza mysql_fix_privilege_tables qualquer a¸˜o necess´ria para converter sua ca a tabela de permiss˜es para o formato atual. Vocˆ pode ver alguns avisos Duplicate column o e name, durante a execu¸˜o, eles podem ser ignorados. ca Depois de executar o script, pare o servidor e o reinicie. No Windows, n˜o existe uma modo f´cil de se atualizar a tabela de permiss˜es at´ o MySQL a a o e 4.0.15. A partir desta vers˜o, as distribui¸˜es do MySQL incluem um script SQL mysql_ a co fix_privilege_tables.sql que vocˆ pode executar usando o cliente mysql. Se sua in- e stala¸˜o do MySQL est´ localizada em ‘C:mysql’, o comando se parecer´ com este: ca a a C:mysqlbin> mysql -u root -p mysql mysql> SOURCE C:mysqlscriptsmysql_fix_privilege_tables.sql Se sua instala¸˜o est´ localizada em algum outro diret´rio, ajuste o caminha apropriada- ca a o mente. O comando ir´ lhe pedir a senha do root; digite-a quando pedido. a Como no procedimento com o Unix, vocˆ pode ver alguns avisos Duplicate column name e enquanto o mysql processa as instru¸˜es no script mysql_fix_privilege_tables.sql; eles co podem ser ignorados. Depois de executar o script, para o servidor e reinicie-o. 2.5.7 Atualizando para outra arquitetura Se vocˆ estiver usando o MySQL Vers˜o 3.23, vocˆ pode copiar os arquivos .frm, .MYI e a e e .MYD para tabelas MyISAM entre diferentes arquiteturas que suportem o mesmo formato
  • 165. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 131 de ponto flutuante. (O MySQL cuida de cada detalhe de troca de bytes.) Veja Se¸˜o 7.1 ca [MyISAM Tables], P´gina 630. a Os arquivos ISAM de dados e ´indices (‘*.ISD’ e ‘*.ISM’ respectivamente) s˜o dependentes a da arquitetura e em alguns casos dependentees do Sistema Operacional. Se vocˆ deseja e mover suas aplica¸˜es para outra m´quina que tem uma arquitetura ou SO diferentes da co a sua m´quina atual, vocˆ n˜o deve tentar mover um banco de dados simplesmente copiando a e a os arquivos para a outra m´quina. Use o mysqldump. a Por padr˜o, o mysqldump ir´ criar um arquivo contendo declara¸˜es SQL. Vocˆ pode ent˜o a a co e a transferir o arquivo para a outra m´quina e aliment´-la como uma entrada para o cliente a a mysql. Utilize mysqldump --help para ver quais op¸˜es est˜o dispon´ co a iveis. Se vocˆ est´ movendo e a os dados para uma vers˜o mais nova do MySQL, vocˆ deve usar mysqldump --opt com a a e nova vers˜o para obter uma descarga r´pida e compacta. a a A mais f´cil (mas n˜o a mais r´pida) forma para mover um banco de dados entre duas a a a m´quinas ´ executar os seguintes comandos na m´quina em que o banco de dados se en- a e a contra: shell> mysqladmin -h ’nome da outra maquina’ create nome_bd shell> mysqldump --opt nome_bd | mysql -h ’nome da outra maquina’ nome_bd Se vocˆ deseja copiar um banco de dados de um m´quina remota sobre uma rede lenta, e a pode ser usado: shell> mysqladmin create nome_bd shell> mysqldump -h ’nome de outra maquina’ --opt --compress nome_bd | mysql nome_bd O resultado pode tamb´m ser armazenado em um arquivo, depois transfira o arquivo para a e m´quina destino e carregue o arquivo no banco de dados. Por exemplo vocˆ pode descarregar a e um banco de dados para um arquivo na m´quina origem desta forma: a shell> mysqldump --quick nome_bd | gzip > nome_bd.contents.gz (O arquivo criado neste exemplo est´ compactado.) Transfria o arquivo contendo o conte´do a u do banco de dados para a m´quina destino e execute estes comandos: a shell> mysqladmin create nome_bd shell> gunzip < nome_bd.contents.gz | mysql nome_bd Tamb´m pode ser usado mysqldump e mysqlimport para ajudar na transferˆncia do banco de e e dados. Para grandes tabelas, isto ´ muito mais r´pido do que usar simplesmente mysqldump. e a Nos comandos abaixo, DUMPDIR representa o caminho completo do diret´rio que vocˆ utiliza o e para armazenar a sa´ de mysqldump. ida 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 Depois transfira os arquivo no diret´rio DUMPDIR para algum diret´rio correspondente na o o m´quina destino e carregue os arquivos no MySQL assim: a shell> mysqladmin create nome_bd # cria o banco de dados shell> cat DUMPDIR/*.sql | mysql nome_bd # cria tabelas no banco de dados
  • 166. 132 MySQL Technical Reference for Version 5.0.0-alpha shell> mysqlimport nome_bd DUMPDIR/*.txt # carrega dados nas tabelas N˜o se esque¸a de copiar o banco de dados mysql tamb´m, porque ´ nele que as tabelas a c e e de permiss˜es (user, db e host) s˜o armazenadas. Vocˆ pode ter que executar comandos o a e como o usu´rio root do MySQL na nova m´quina at´ que vocˆ tenha o banco de dados a a e e mysql no lugar. Depois de importar o banco de dados mysql para a nova m´quina, execute mysqladmin a flush-privileges para que o servidor recarregue as informa¸˜es das tabelas de permiss˜es. co o 2.5.8 Atualizando o MySQL no Windows Qaundo atualizar o MySQL no Windows, siga os passo abaixo: 1. Fa¸a o download do ultima distribui¸˜o MySQL do Windows. c ´ ca 2. Escolha uma hora do dia com pouco uso, onde a parada para manuten¸˜o ´ aceit´vel. ca e a 3. Alerte os usu´rios que ainda est˜o ativos para sua parada de manuten¸˜o. a a ca 4. Pare o Servidor MySQL em execu¸˜o (por exemplo, com NET STOP mysql ou com o ca utilit´rio de Servi¸os se vocˆ estiver exeutando MySQL como um servi¸o, ou com a c e c mysqladmin shutdown). 5. Finalize o programa WinMySQLAdmin se ele estiver em execu¸˜o. ca 6. Execute o script de instala¸˜o do arquivo de distribui¸˜o do Windows, clicando no ca ca bot˜o "Install" no WinZip e seguindo os passos da instala¸˜o do script. a ca 7. Vocˆ pode sobrescrever a sua instala¸˜o antiga do MySQL (normalmente em e ca ‘C:mysql’), ou instal´-la em um diret´rio diferente, como C:mysql4. Sobrescrever a a o instala¸˜o antiga ´ o recomendado. ca e 8. Reinicie o servi¸o MySQL Server (por exemplo, com NET START mysql se vocˆ executar c e o MySQL como um servi¸o, ou chamado o mysqld diretamente). c 9. Atualize a tabela de permiss˜es. O procedimento est´ descrito em Se¸˜o 2.5.6 o a ca [Upgrading-grant-tables], P´gina 130. a Situa¸˜es de erros poss´ co iveis: A system error has occurred. System error 1067 has occurred. The process terminated unexpectedly. Este erro significa que seu arquivo ‘my.cnf’ (por padr˜o ‘C:my.cnf’) cont´m uma op¸˜o a e ca que n˜o pode ser reconhecido pela MySQL. Vocˆ pode verificar que este ´ o caso tentando a e e reiniciar o MySQL com o arquivo ‘my.cnf’ renomeado, por exemplo, para ‘my_cnf.old’ para prevenirt o servidor de us´-lo. Uma vez verificado isto, vocˆ precisa identificar qual a e parˆmetro ´ o culpado. Crie um novo arquivo ‘my.cnf’ e mova as partes do arquivo antigo a e para ele (reiniciando o servidor depois de mover cada parte) at´ que vocˆ determine qual e e op¸˜o est´ fazendo a inicializa¸˜o do servidor falhar. ca a ca 2.6 Notas espec´ ificas para os Sistemas Operacionais
  • 167. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 133 2.6.1 Notas Windows Esta se¸˜o descreve assuntos espec´ ca ificos para usar MySQL no Windows. 2.6.1.1 Conectando em um MySQL Rematamente a Windows Utilizando SSH Aqui temos notas sobre como conectar a um servidor MySQL atrav´s de uma conex˜o e a remota e segura usando o SSH (por David Carlson dcarlson@mplcomm.com: 1. Instale um cliente SSH na sua m´quina Windows. Como um usu´rio, o melhor op¸˜o a a ca paga que encontrei ´ o SecureCRT da http://www.vandyke.com/. Outra op¸˜o ´ o f- e ca e secure da http://www.f-secure.com/. Vocˆ tamb´m pode encontrar algumas vers˜es e e o livres no Google em http://directory.google.com/Top/Computers/Security/Products_ and_Tools/Cryptography/SSH/Clients/Windows/. 2. Inicie seu cliente SSH Windows. Configure Host_Name = IP_ou_Nome_servidormysql. Configure userid=seu_userid para logar no seu servidor. Este valor userid n˜o pode a ser o mesmo do nome do usu´rio se sua conta MySQL. a 3. 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). 4. Salve tudo, sen˜o vocˆ ter´ que refazer tudo da pr´xima vez. a e a o 5. Logue ao seu servidor com a sess˜o SSH que acabou de ser criada. a 6. Na sua m´quina Windows, inicie algumas aplica¸˜es ODBC (como o Access). a co 7. Crie um novo arquivo no Windows e ligue ao MySQL usando o driver ODBC da mesma forma que vocˆ normalmente faz, EXCETO pelo fato de digitar localhost para a e m´quina servidora MySQL — n˜o nomeservidormysql. a a Vocˆ agora deve ter uma conex˜o ODBC ao MySQL, criptografada com SSH. e a 2.6.1.2 Distribuindo Dados Entre Diferentes Discos no Win32 A partir do MySQL vers˜o 3.23.16, o mysqld-max e servidores mysql-max-nt na distribui¸˜o a ca MySQL s˜o compilados com a op¸˜o -DUSE_SYMDIR. Isto permite que vocˆ coloque um di- a ca e ret´rio de banco de dados em discos diferentes adicionando um link simb´lico para ele. (Isto o o ´ parecido com o a com que links simb´licos funcionam no Unix, embora o procedimento e o para configurar o link seja diferente). No Windows, vocˆ cria um link simb´lico para um banco de dados MySQL criando um e o arquivo que contem o caminho para o diret´rio de destino. Salve o arquivo no diret´rio o o de dados usando o nome de arquivo ‘nome_bd.sym’, onde nome_bd ´ o nome do banco de e dados. Por exemplo, se o diret´rio de dados do MySQL ´ ‘C:mysqldata’ e vocˆ precisa o e e ter o banco de dados foo localizado em ‘D:datafoo’, vocˆ deve criar o arquivo e ‘C:mysqldatafoo.sym’ que contˆm o caminho D:datafoo. Depois disto, todas e tabelas criadas no banco de dados foo ser˜o criadas no ‘D:datafoo’. O diret´rio a o ‘D:datafoo’ deve existir para ele funcionar. Note tamb´m que o link simb´lico n˜o ser´ e o a a
  • 168. 134 MySQL Technical Reference for Version 5.0.0-alpha usado se um diret´rio com o nome do banco de dados existe no diret´rio de dados MySQL. o o Isto significa que se vocˆ j´ tem um diret´rio de banco de dados chamado ‘foo’ no direorio e a o de dados, vocˆ deve movˆ-lo para ‘D:data’ antes do link simb´lico ser efetivado. (Para e e o evitar problemas, o servidor n˜o deve estar executando quando vocˆ mover o diret´rio do a e o banco de dados.) Note que devido a penalidade que vocˆ tem na velocidade quando abre todas as tabelas, e n´s n˜o habilitamos esta op¸˜o por padr˜o, mesmo se vocˆ compilar o MySQL com suporte o a ca a e a isto. Para habilitar links simb´licos vocˆ deve colocar no seu arquivo my.cnf ou my.ini o e a seguinte entrada: [mysqld] symbolic-links No MySQL 4.0 --simbolic-links est´ habilitado por padr˜o. Se vocˆ n˜o precisa us´-lo a a e a a vocˆ pode usar a op¸˜o skip-symbolic-linkd. e ca 2.6.1.3 Compilando clientes MySQL no Windows Em seus arquivos fontes, vocˆ deve incluir ‘my_global.h’ antes de ‘mysql.h’: e #include <my_global.h> #include <mysql.h> ‘my_global.h’ inclui qualquer outro arquivo necess´rio para compatibilidade de Windows a (como o ‘windows.h’) se o arquivo ´ compilado no Windows. e Vocˆ tamb´m pode ligar seu c´digo coma biblioteca dinˆmica ‘libmysq.lib’, que ´ apenas e e o a e um wrapper para carregar em ‘libmysql.dll’ sobre demanda, ou ligar com a biblioteca est´tica ‘mysqlclient.lib’. a Perceba que como as bibliotecas clientes do MySQL s˜o compiladas como bibliotecas a threaded, vocˆ tamb´m deve compilar seu c´digo para ser multi-threaded! e e o 2.6.1.4 MySQL para Windows Comparado com o MySQL para Unix O MySQL para Windows tem provado ser muito est´vel. Esta vers˜o do MySQL tem os a a mesmos recursos que sua vers˜o correspondente Unix com as seguintes exce¸˜es: a co Win95 e threads O Win95 perde aproximadamente 200 bytes de mem´ria principal para cada o thread criada. Cada conex˜o no MySQL cria uma nova thread, portanto vocˆ a e n˜o deve executar o mysqld por um longo tempo no Win95 se seu servidor lida a com v´rias conex˜es! WinNT e Win98 n˜o sofrem deste bug. a o a Leituras simultˆneas a O MySQL depende das chamadas pread() e pwrite() para estar apto a misturar INSERT e SELECT. Atualmente n´s usamos mutexes para emular o pread()/pwrite(). N´s iremos, a longo prazo, trocar o n´ da interface de o ivel arquivos com uma interface virtual para que n´s possamos usar a interface o readfile()/writefile() no NT/2000/XP para obter mais velocidade. A implementa¸˜o atual limita o n´mero de arquivos abertos que o MySQL ca u
  • 169. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 135 pode usar para 1024, o que significa que vocˆ n˜o conseguir´ executar tantas e a a threads simultˆneas no NT/2000/XP como no Unix. a Leitura de blocos O MySQL usa uma leitura de blocos para cada conex˜o, que tem as seguintes a implica¸˜es: co • Uma conex˜o n˜o ir´ ser disconectada automaticamente depois de 8 horas, a a a como acontece com a vers˜o Unix do MySQL. a • 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 • mysqladmin shutdown n˜o pode abortar enquanto existirem conex˜es a o adormecidas. Planejamos corrigir este problema quando nossos desenvolvedores Windows tiverem conseguido um boa solu¸˜o. ca DROP DATABASE Vocˆ n˜o pode remover um banco de dados que est´ em uso por alguma thread. e a a Matando o MySQL do gerenciador de tarefas Vocˆ n˜o pode matar o MySQL do gerenciador de tarefas ou com o utilit´rio e a a shutdown no Win95. Vocˆ deve deslig´-lo com mysqladmin shutdown. e a Nomes case-insensitivo Nomes de arquivos n˜o s˜o caso sensitivo no Windows, portanto, nomes de a a bancos de dados e tabelas do MySQL tamb´m n˜o s˜o caso sensitivo no Win- e a a dows. A unica restri¸˜o ´ que os nomes de bancos de dados e tabelas devem ´ ca e usar o mesmo caso em uma senten¸a fornecida. Veja Se¸˜o 6.1.3 [Name case c ca sensitivity], P´gina 473. a O caracter de diret´rio ‘’ o Componentes de nomes de caminho no Win95 s˜o separados pelo caracter ‘’ o a qual tamb´m ´ o caractere de escape no MySQL. Se vocˆ estiver usando LOAD e e e DATA INFILE ou SELECT ... INTO OUTFILE, use nomes de arquivo no estilo Unix com caracteres ‘/’: mysql> LOAD DATA INFILE "C:/tmp/skr.txt" INTO TABLE skr; mysql> SELECT * INTO OUTFILE ’C:/tmp/skr.txt’ FROM skr; Uma alternativa ´ dobrar o caracter ‘/’: e mysql> LOAD DATA INFILE "C:tmpskr.txt" INTO TABLE skr; mysql> SELECT * INTO OUTFILE ’C:tmpskr.txt’ FROM skr; Problems with pipes. Pipes n˜o funcionam com confian¸a na linha de comando do Windows. Se o a c pipe incluir o caracter ^Z / CHAR(24), o Windows achar´ que ele encontrou o a fim de um arquivo e abortar´ o programa. a Isto ´ um problma principalmente quando se tenta aplicar um log bin´rio como e a a seguir: mysqlbinlog binary-log-name | mysql --user=root Se vocˆ obter um problema aplicando o log e suspeitar que seja devido a um e caracter ^Z/CHAR(24) vocˆ pode usar a seguinte alternativa: e
  • 170. 136 MySQL Technical Reference for Version 5.0.0-alpha mysqlbinlog binary-log-file --result-file=/tmp/bin.sql mysql --user=root --eexecute "source /tmp/bin.sql" O ultimo comando pode tamb´m ser usado para leitura em qualquer arquivo ´ e sql que contenha dados bin´rios. a erro: Can’t open named pipe Se vocˆ utiliza um servidor MySQL vers˜o 3.22 no NT com o os programas e a clientes MySQL mais novos, ser´ apresentado o seguinte erro: a error 2017: can’t open named pipe to host: . pipe... Isto ocorre porque a vers˜o do MySQL usa named pipes no NT por padr˜o. a a Vocˆ pode evitar este erro usando a op¸˜o --host=localhost para os novos e ca clientes MySQL ou criar um arquivo de op¸˜es ‘c:my.cnf’ que contenha a co seguinte informa¸˜o: ca [client] host = localhost A partir da vers˜o 3.23.50, named pipes s˜o habilitados somente se o mysqld-nt a a ou mysqld-nt-max for iniciado com a op¸˜o --enable-name-pipe. ca Erro Access denied for user Se vocˆ tenta executar um programa cliente MySQL para conectar a um servi- e dor em execu¸˜o na mesma m´quina, nas obtem o erro Access denied for ca a user: ’some-user@unknown’ to database ’mysql’ quando acessar um servi- dor MySQL na mesma m´quina, signifca que o MySQL n˜o pode resolver seu a a nome de m´quina corretamente. a Para corrigir isto, vocˆ deve criar um arquivo ‘Windowshosts’ com a seguinte e informa¸˜o: ca 127.0.0.1 localhost ALTER TABLE Enquanto vocˆ est´ executando uma instru¸˜o ALTER TABLE, a tabela est´ blo- e a ca a queada para ser usado por outras threads. Isto ocorre devido ao fato de que no Windows, vocˆ n˜o pode deletar um aruivo que est´ em uso por outra threads. e a a No futuro, podemos encontrar algum modo de contornarmos este problema. DROP TABLE DROP TABLE em uma tabela que est´ em uso por uma tabela MERGE n˜o fun- a a cionar´ no Windows porque o manipulador do MERGE faz o mapeamento da a tabela escondido da camada superior do MySQL. Como o Windows n˜o per- a mite que vocˆ delete arquivos que est˜o abertos, vocˆ primeiro deve descarregar e a e todas as tabelas MERGE (com FLUSH TABLES) ou apagar a tabela MERGE antes de deletar a tabela. Corrigiremos isto assim que introduzirmos views. DATA DIRECTORY e INDEX DIRECTORY As op¸˜es DATA DIRECTORY e INDEX DIRECTORY para CREATE TABLE s˜o igno- co a radas no Windows, porque ele n˜o suporta links simb´licos. a o Aqui est˜o alguns assuntos em aberto para qualquer um que queira melhorar o MySQL no a Windows: • Adicionar alguns ´ icones agrad´veis para o start e shutdown na instala¸˜o do MySQL. a ca
  • 171. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 137 • 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 mysqldump) seria ´timo. o • 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. • Adicionar macros para usar os m´todos mais r´pidos de incremento/decremento de e a threads seguras fornecidos pelo Windows. 2.6.2 Notas Linux (Todas as vers˜es) o As notas abaixo a respeito da glibc aplicam-se somente na situa¸˜o quando o MySQL ´ ca e construido por vocˆ mesmo. Se vocˆ est´ executando Linux em uma m´quina x86, na e e a a maioria dos casos ´ muito melhor para vocˆ usar nosso bin´rio. N´s ligamos nossos bin´rios e e a o a com a melhor vers˜o alterada da glibc, podemos escolher as melhores op¸˜es do compilador, a co em uma tentativa de torn´-la funcional para um servidor muito exigido. Para um usu´rio a a comum, mesmo para configura¸˜es com v´rias conex˜es concorrentes e/ou tabelas excedendo co a o o limite de 2 GB, nosso bin´rio ´, na maioria das vezes, a melhor escolha. Portanto se vocˆ a e e ler o texto abaixo, e est´ em d´vida sobre o que deve fazer, tente usar o nosso bin´rio a u a primeiro para ver se ele preenche suas necessidades, e preocupe-se com uma constru¸˜o ca pr´pria apenas se vocˆ descobrir que nosso bin´rio n˜o ´ bom o suficiente para vocˆ. Neste o e a a e e caso, ir´ iamos apreciar se fosse feito uma observa¸˜o sobre isto, para que possamos fazer ca uma melhor vers˜o bin´ris da pr´xima vez. a a o O MySQL usa LinuxThreads no Linux. Se vocˆ usa uma vers˜o do Linux que n˜o tenha e a a a glibc2, vocˆ deve instalar LinuxThreads antes de tentar compilar o MySQL. Vocˆ pode e e obter o LinuxThreads em http://www.mysql.com/downloads/os-linux.html. NOTA: Temos visto alguns problemas estranhos com o Linux 2.2.14 e MySQL em sistemas SMP; Se vocˆ tem um sistema SMP, recomendamos a atualiza¸˜o para o Linux 2.4! Seu e ca sistema ficar´ mais r´pido e mais est´vel. a a a Perceba que as vers˜es da glibc iguais ou anteriores ` Vers˜o 2.1.1 tem um bug fatal no o a a tratamento do pthread_mutex_timedwait, que ´ usado quando vocˆ executar instru¸˜es e e co INSERT DELAYED. Recomendamos n˜o usar INSERT DELAYED antes de atualizar a glibc. a Se vocˆ planeja ter mais de 1000 conex˜es simultˆneas, ser´ necess´rio fazer algumas e o a a a altera¸˜es na LinuxThreads, recompile-a e religue o MySQL ao novo ‘libpthread.a’. co 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 caminhos s˜o relativos ` raiz da glibc. Note que o MySQL n˜o ser´ est´vel com cerca de a a a a a 600-1000 conex˜es se o valor de STACK_SIZE for o padr˜o de 2MB. o a Se vocˆ tiver um problema com o MySQL, no qual ele n˜o consiga abrir v´rios arquivos ou e a a conex˜es, pode ser que vocˆ n˜o tenha configurado o Linux para lidar com o n´mero de o e a u arquivos suficiente. No Linux 2.2 e posteriores, vocˆ pode conferir o valor para a aloca¸˜o dos arquivos fazendo: e ca
  • 172. 138 MySQL Technical Reference for Version 5.0.0-alpha cat /proc/sys/fs/file-max cat /proc/sys/fs/dquot-max cat /proc/sys/fs/super-max Se vocˆ possui mais de 16M de mem´ria, deve ser adicionado o seguinte no seu script de e o boot (ex. ‘/etc/rc/boot.local’ no SuSE Linux): echo 65536 > /proc/sys/fs/file-max echo 8192 > /proc/sys/fs/dquot-max echo 1024 > /proc/sys/fs/super-max Vocˆ tamb´m pode executar os comandos acima da linha de comando como root, mas e e neste caso, os antigos limites voltar˜o a ser usados na pr´xima vez que o computador for a o reiniciado. De forma alternativa, vocˆ pode configurar estes parˆmteros durante a inicializa¸˜o usando a e a ca ferramenta sysctl, que ´ usada por muitas distribui¸˜es Linux (No SuSE a partir da vers˜o e co a 8.0). Apenas grave os seguintes valores em um arquivo chamado ‘/etc/sysctl.conf’: # Aumente alguns valores para o MySQL fs.file-max = 65536 fs.dquot-max = 8192 fs.super-max = 1024 You should also add the following to ‘/etc/my.cnf’: [mysqld_safe] open-files-limit=8192 Os parˆmetros acima permitem o MySQL criar at´ 8192 conex˜es + arquivos. a e o A constante STACK_SIZE na LinuxThreads controla o espa¸amento das pilhas threads no c espa¸o de endere¸amento. Ela necessita ser grande o bastante para que tenha espa¸o o c c c suficiente para a pilha de cada thread, mas pequena o bastante para manter a pilha de al- guma thread executando dos dados globais mysqld. Infelizmente, a implementa¸˜o Linux de ca mmap(), como descobrimos em experiˆncias, ir´ desmapear uma regi˜o j´ mapeada se vocˆ e a a a e solicitar o mapeamento de um endere¸o j´ em uso, zerando os dados de toda a p´gina ao c a a inv´s de retoernar. um erro. Portanto a seguran¸a do mysqld ou qualquer outra aplica¸˜o e c ca baseada em threads depende do comportamento gentil do c´digo que cria as threads. O o usu´rio deve tomar medidas para certirficar-se que o n´mero de threads em funcionamento a u em qualquer hora seja suficientemente baixo para que as pilhas das threads permane¸am c longe do monte global. Com mysqld vocˆ deve refor¸ar este comportamento "gentil" con- e c figurando um valor razo´vel para a vari´vel max_connections. a a Se vocˆ mesmo construiu o MySQL e n˜o deseja confus˜es corrigindo LinuxThreads, vocˆ e a o e deve configurar max_connections para um valor m´ximo de 500. Ele ainda deve ser menor a se vocˆ tiver uma chave grande para o buffer, grandes tabelas heap, ou outras coisas que e fazem o mysqld alocar muita mem´ria ou se vocˆ estiver executando um kernel 2.2 com o o e patch de 2GB. Se vocˆ estiver usando nosso bin´rio ou RPM vers˜o 3.23.25 ou posterior, e a a vocˆ pode seguramente configurar max_connections para 1500, assumindo que n˜o h´ e a a uma grande chave de buffer ou tabelas heap com grande quantidade de dados. Quanto mais vocˆ reduz STACK_SIZE em LinuxThreads mais threads vocˆ pode criar seguramente. e e Recomendamos os valores entre 128K e 256K. Se vocˆ usa v´rias conex˜es simultˆneas, vocˆ pode sofrer com um "recurso" do kernel e a o a e 2.2 que penaliza um processo por bifurcar-se ou clonar um filho na tentativa de prevenir
  • 173. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 139 um ataque de separa¸˜o. Isto faz com que o MySQL n˜o consiga fazer uma bom ca a escalonamento, quando o n´mero de clientes simultˆneos cresce. Em sistemas com CPU u a unica, temos visto isto se manifestar em uma cria¸˜o muito lenta das threads, tornando ´ ca a conex˜o ao MySQL muito lenta. Em sistemas de m´ltiplas CPUs, temos observado a u uma queda gradual na velocidade das consultas quando o n´mero de clientes aumenta. u No processo de tentar encontrar uma solu¸˜o, recebemos um patch do kernel de um de ca 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 atualmente o recomendamos para nossos usu´rios que continuando trabalhando com a servidores muito carregados em kernels 2.2. Este detalhe foi corrigido no kernel 2.4, portanto, se vocˆ n˜o est´ satisfeito com a performance atual do seu sistema, melhor do e a a que aplicar um patch ao seu kernel 2.2, pode ser mais f´cil simplesmente atualizar para o a 2.4, que lhe dar´ tamb´m uma melhora em seu sistemas SMP em adi¸˜o ` corre¸˜o do bug a e ca a ca discutido aqui. Estamos testando o MySQL no kernel 2.4 em uma m´quina com 2 processadores e desco- a brimos que o MySQL escalona muito melhor - virtualmente, n˜o h´ nenhuma perda de a a desempenho no throughput das consultas at´ cerca de 1000 clientes, e o fator da escala do e MySQL (computado com a raz˜o do throughput m´ximo para o thoughput de cada cliente.) a a foi de 180%. Temos observado resultados similares em sistemas com 4 processadores - vir- tualmente n˜o h´ perda de desempenho quando o n´mero de clientes ´ incrementado at´ a a u e e 1000 e o fator da escala foi de 300%. Portanto para um servidor SMP muito carregado n´so definitivamente recomendamos o kernel 2.4. N´s descobrimos que ´ essencial executar o o e processo mysqld com a mais alta prioridade poss´ no kernel 2.4 para obter performance ivel m´xima. Isto pode ser feito adicionando o comando renice -20 $$ ao mysqld_safe. Nos a nossos testes em uma m´quina com 4 processadores, o aumento da prioridade nos deu 60% a de aumento no throughput com 400 clientes. Atualmente estamos tentando coletar mais informa¸˜es sobre como o MySQL atua no kernel co 2.4 em sistemas com 4 e 8 processadores. Se vocˆ tem acesso a um sistema deste porte e tem e 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 multi processados. A implementa¸˜o de mutex em LinuxThreads na ca glibc-2.1 ´ muito ruim para programas com v´rias threads que travam o mutex e a por um tempo curto. Em um sistema SMP, ironicamente, se vocˆ liga o MySQL e com LinuxThreads sem modifica¸˜es, removendo processadores da m´quina, a co a performance do MySQL ´ melhorada em alguns casos. Para corrigir este compor- e tamento, disponibilizamos um patch para glibc 2.1.3, em linuxthreads-2.1-patch ( http://www.mysql.com/Downloads/Linux/linuxthreads-2.1-patch) Com a glibc-2.2.2, o MySQL vers˜o 3.23.36 ir´ usar o mutex adaptativo, que ´ muito a a e melhor,mesmo que o patch na glibc-2.1.3. Avisamos, entretando, que sobre algumas condi¸˜es, o c´digo mutex no glibc-2.2.2 overspins, que prejudica a performance do MySQL. co o A chance desta condi¸˜o pode ser reduzida mudando a prioridade do processo mysqld para ca a prioridade mais alta. N´s tamb´m corrigimos o comportamento overspin com um patch, o e ´ disponivel em http://www.mysql.com/Downloads/Linux/linuxthreads-2.2.2.patch.
  • 174. 140 MySQL Technical Reference for Version 5.0.0-alpha Ele combina a corre¸˜o do overspin, n´mero m´ximo de threads e espa¸amento das pilhas ca u a c em um unico patch. Vocˆ precisar´ aplic´-lo no diret´rio linuxthreads com patch -p0 ´ e a a o </tmp/linuxthreads-2.2.2.patch. Esperamos que seja inclu´ de alguma forma nos ido futuros lan¸amentos da glibc-2.2. De qualquer forma, se vocˆ ligar com glibc-2.2.2, c e ainda ser´ necess´rio corrigir STACK_SIZE e PTHREAD_THREADS_MAX. Temos esperan¸as que a a c os padr˜es ser˜o corrigidos para valores mais aceit´veis para configura¸˜es pesadasa do o a a co MySQL no futuro, ent˜o sua constru¸˜o poder´ ser reduzida a ./configure; make; make a ca a install. Recomendamos que vocˆ use os patches acima para construir uma vers˜o est´tica especial e a a de libpthread.a e use-a somente para liga¸˜es est´ticas com o MySQL. Sabemos que os co a patches s˜o seguros para o MySQL e pode melhorar significamente sua performance, mas n˜o a a podemos dizer nada sobre outras aplica¸˜es. Se vocˆ ligar outras aplica¸˜es coma a vers˜o co e co a modificada da biblioteca ou construir uma vers˜o alterada compartilhada e instal´-la no seu a a sistema, vocˆ estar´ fazendo por sua conta e risco e tenha aten¸˜o com outras aplica¸˜es e a ca co que dependem de LinuxThreads. Se vocˆ passar por problemas estranhos durante a instala¸˜o do MySQL ou com travamentos e ca de alguns utilit´rios comuns, ´ muito prov´vel que eles s˜o relacionados a problemas de a e a a bibliotecas ou compilador. Se for este o caso, o uso de nosso bin´rio ser´ a solu¸˜o. a a ca Um problema conhecido com a distribui¸˜o bin´ria ´ que com antigos sistemas Linux que ca a e usam libc (como o RedHat 4.x ou Slackware), vocˆ obter´ alguns problemas n˜o fatais e a a com resolu¸˜o de nomes. Veja Se¸˜o 2.6.2.1 [Binary notes-Linux], P´gina 141. ca ca a a ´ Quando estiver usando LinuxThreads vocˆ ver´ um minimo de trˆs processos em execu¸˜o. e e ca Estes s˜o de fato, threads. Existir´ uma thread para o gerenciador LinuxThreads, uma a a thread para lidar com conex˜es e uma thread para tartar de alarmes e sinais. o Perceba que o kernel Linux e a biblioteca LinuxThread pode por padr˜o ter apenas 1024 a threads. Isto significa que vocˆ pode ter at´ 1021 conex˜es ao MySQL em um sistema sem e e o corre¸˜o. A p´gina http://www.volano.com/linuxnotes.html cont´m informa¸˜es sobre ca a e co como contornar este limite. 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. Veja Se¸˜o A.4.1 e ca [Crashing], P´gina 921. a Para obter um descarga do core no Linux se o mysqld finalizar com um sinal SIGSEGV, vocˆ e pode iniciar o mysqld com a op¸˜o --core-file. Perceba que provavelmente vocˆ tamb´m ca e e precisar´ aumentar o core file size adicionando ulimit -c 1000000 para mysqld_safe a ou iniciar mysqld_safe com --core-file-sizes=1000000, Veja Se¸˜o 4.8.2 [safe_mysqld], ca P´gina 332. a Se vocˆ estiver ligando seu pr´prio cliente MySQL e obter o erro: e o ld.so.1: ./my: fatal: libmysqlclient.so.4: open failed: No such file or directory Quando execut´-los, o problema pode ser evitado com um dos seguintes m´todos: a e • Ligue o cliente com a seguinte op¸˜o (no lugar de -Lpath): ca -Wl,r/path- libmysqlclient.so. • Copie libmysqclient.so para ‘/usr/lib’.
  • 175. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 141 • Adicione o caminho do diret´rio onde libmysqlclient.so est´ localizado para a o a vari´vel de ambiente LD_RUN_PATH antes de executar seu cliente. a Se vocˆ estiver usando o compilador Fujitsu (fcc / FCC) vocˆ ter´ alguns problemas com- e e a pilando o MySQL porque os arquivos de cabe¸alho Linux s˜o muito orientados ao gcc. c a 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_STRTOLL_PROTO" CXX=FCC CXXFLAGS="-O -K fast -K lib -K omitfp -K preex --no_exceptions --no_rtti -D_GNU_SOURCE -DCONST=const -Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO ’-D_EXTERN_INLINE=static __inline’" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-low-memory 2.6.2.1 Notas Linux para distribui¸˜es bin´rias co a O MySQL necessita pelo menos do Linux vers˜o 2.0 a Aviso: Percebemos que alguns usu´rios do MySQL tiveram serios problemas de estabilidade a com o MySQL e o kernel 2.2.14 do Linux. Se vocˆ estiver usando este kernel vocˆ deve e e atualiz´-lo para o 2.2.19 (ou posterior) ou para o kernel 2.4. Se vocˆ tiver um gabinete a e multi-cpu, ent˜o vocˆ deve considerar seriamente o uso do kernel 2.4 uma vez que ele lhe a e trar´ uma melhora significante na velocidade. a A vers˜o bin´ria ´ ligada com -static, que significa que vocˆ normalmente n˜o precisa se a a e e a preocupar com qual vers˜o das bibliotecas do sistema vocˆ tem. Vocˆ n˜o precisa insta- a e e a lar LinuxThreads. Um programa ligado com a op¸˜o -static ´ um pouco maior que um ca e programa ligado dinamicamente e tamb´m um pouco mais r´pido (3-5%). Um problema, e a entretanto, ´ que vocˆ n˜o pode usar fun¸˜es definidas pelo usu´rio (UDF) com um pro- e e a co a grama ligado estaticamente. Se vocˆ for escrever ou usar fun¸˜es UDF (isto ´ algo para e co e programadores C ou C++), vocˆ deve compilar o MySQL, usando liga¸˜es dinamicas. e co Se vocˆ estiver usando um sistema baseado em libc (em vez de um sistema glibc2), vocˆ, e e provavelmente, ter´ alguns problemas com resolu¸˜o de nomes de m´quinas e getpwnam() a ca a com a vers˜o bin´ria. (Isto ´ porque o glibc infelizmente depende de algumas bibliotecas a a e externas para resolver nomes de m´quinas e getpwent(), mesmo quando compilado com a -static). Neste caso, vocˆ provavelmente obter´ a seguinte mensagem de erro quando e a executar mysql_install_db: Sorry, the host ’xxxx’ could not be looked up ou o seguinte erro quando vocˆ tentar executar mysqld com a op¸˜o --user: e ca getpwnam: No such file or directory Vocˆ pode resolver este problema usando de um dos modos seguintes: e • 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 install_db. O lado ruim ´ que vocˆ n˜o poder´ usar nomes de m´quinas nas tabelas e e a a a de permiss˜es; vocˆ deve usar n´meros IP no lugar (exceto para localhost). Se vocˆ o e u e
  • 176. 142 MySQL Technical Reference for Version 5.0.0-alpha estiver usando uma release antiga do MySQL que n˜o suporte --force, vocˆ deve a e remover o teste resolveip no mysql_install com um editor. • Inicie mysqld com su no lugar de usar --user. As distribui¸˜es bin´rias Linux-Intel e RPM do MySQL s˜o configuradas para o m´ximo co a a a ´ de desempenho possivel. N´s sempre tentamos usar o compilador mais r´pido e est´vel o a a dispon´ ivel. Suporte MySQL ao Perl exige Perl Vers˜o 5.004 03 ou mais novo. a Em algumas vers˜es 2.2 do kernel Linux,vocˆ pode obter o erro Resource temporarily o e unavailable quando vocˆ faz v´rias novas conex˜es para um servidor mysqld sobre e a o TCP/IP. O problema ´ que o Linux tem um atraso entre o momento em que vocˆ fecha um socket e e TCP/IP at´ que ele seja realmente liberado pelo sistema. Como s´ existe espa¸o para um e o c n´mero finito de slots TCP/IP, vocˆ ir´ obter o erro acima se vocˆ tentar fazer muitas novas u e a e conex˜es TCP/IP durante um pequeno tempo, como quando vocˆ executa o benchmark do o e MySQL ‘test-connect’ sobre TCP/IP. N´s enviamos emails sobre este problema v´rias vezes para diferentes listas de discuss˜o o a a Linux mas nunca conseguimos resolver este problema apropriadamente. A unica ’corre¸˜o’ conhecida , para este problema ´ usar conex˜es persistentes nos seus ´ ca e o clientes ou usar sockets, se vocˆ estiver executando o servidor de banco de dados e clientes e na mesma m´quina. N´s experamos que o kernel Linux 2.4 corrija este problema no futuro. a o 2.6.2.2 Notas Linux x86 O MySQL exige a vers˜o 5.4.12 ou mais nova da libc. Sabe-se que funciona com a libc a 5.4.46. A vers˜o 2.0.6 e posterior da glibc tamb´m deve funcionar. Existem alguns prob- a e lemas com os RPMs glibc da RedHat, portanto se vocˆ tiver problemas, confira se existe e alguma atualiza¸˜o! Sabemos que os RPMs glibc 2.0.7-19 e 2.0.7-29 funcionam. ca Se vocˆ estiver usando o Red Hat 8.0 ou uma nova biblioteca glibc 2.2.x, vocˆ deve iniciar o e e mysqld com a op¸˜o --thread-stack=192K (Use -O thread_stack=192K antes do MySQL ca 4). Se vocˆ n˜o fizer isto o mysqld finlizar´ em gethostbyaddr() porque a nova biblioteca e a a glibc exige mais de 128K de mem´ria na pilha para esta chamada. Este tamanho de pilha o ´ o padr˜o agora no MySQL 4.0.10 e acima. e a Se vocˆ est´ usando o gcc 3.0 e acima para compilar o MySQL, vocˆ deve instalar a e a e biblioteca libstdc++v3 antes de compilar o MySQL; se vocˆ n˜o fizer isto, vocˆ obter´ um e a e a erro sobre um s´ imbolo __cxa_pure_virtual perdido durante a liga¸˜o. ca Em algumas distribui¸˜es Linux mais antigas, configure pode produzir um erro como este: co Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file. See the Installation chapter in the Reference Manual. Fa¸a apenas o que a mensagem de erro diz e adicione um caractere sublinhado para a macro c _P que tem somente um caractere sublinhado e ent˜o tente novamente. a Vocˆ pode obter alguns aviso quando estiver compilando; os mostrados abaixo podem ser e ignorados:
  • 177. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 143 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’ O mysql.server pode ser encontrado no diret´rio ‘share/mysql’ sob o diret´rio de in- o o stala¸˜o MySQL ou no diret´rio ‘support-files’ da ´rvore fonte MySQL. ca o a Se o mysqld sempre descarregar um core na inicializa¸˜o, o problema pode ser que vocˆ ca e tenha um antigo ‘/lib/libc.a’. Tente renome´-lo depois remova ‘sql/mysqld’ e fa¸a um a c novo make install e tente novamente. Este problema foi relatado em algumas instala¸˜es co Slackware. Se vocˆ obter o seguinte erro quando ligar o mysqld, significa que seu ‘libg++.a’ n˜o est´ e a a instalado corretamente: /usr/lib/libc.a(putc.o): In function ‘_IO_putc’: putc.o(.text+0x0): multiple definition of ‘_IO_putc’ Vocˆ pode evitar o uso de ‘libg++.a’ executando configure desta forma: e shell> CXX=gcc ./configure 2.6.2.3 Notas Linux SPARC Em algumas implementa¸˜es, readdir_r() est´ quebrada. O sintoma ´ que SHOW co a e DATABASES sempre retorna um conjunto vazio. Isto pode ser corrigido removendo HAVE_READDIR_R do ‘config.h’ depois de configurar e antes de compilar. 2.6.2.4 Notas Linux Alpha O MySQL Vers˜o 3.23.12 ´ a primeira vers˜o do MySQL que ´ testada no Linux-Alpha. Se a e a e vocˆ planeja usar o MySQL no Linux-Alpha, vocˆ deve ter certeza que possui esta vers˜o e e a ou mais nova. Temos testado o MySQL no Alpha com nossos pacotes de benchmarks e testes, e ele parece funcinar muito bem. Quando n´s compilamos o bin´rios MySQL padr˜es, n´s est´vamos usando SuSE 6.4, kernel o a o o a 2.2.13-SMP, Compilador C Compaq (V6.2-504) e compilador C++ Compaq (V6.3-005) em uma m´quina Compaq DS20 com um processador Alpha EV6. a Vocˆ pode encontrar os compiladores acima em http://www.support.compaq.com/alpha-tools. e Usando estes compiladores, em vez do gcc, obtemos 9-14 % de melhora na performance com MySQL. Note que a linha de configura¸˜o otimiza o bin´rio para a CPU atual; isto significa que ca a vocˆ s´ pode utilizar nosso bin´rio se vocˆ tiver um processador Alpha EV6. N´s tamb´m e o a e o e compilamos estaticamente para evitar problemas de bibliotecas. A partir das pr´ximas distribui¸˜es adicionamos o parˆmetro -arch generic em nossas o co a op¸˜es de compila¸˜o, o qual assegura que o bin´rio execute em todos os processadores co ca a Alpha. N´s tamb´m compilamos estaticamente para evitar problemas de bibliotecas. o e
  • 178. 144 MySQL Technical Reference for Version 5.0.0-alpha CC=ccc CFLAGS="-fast -arch generic" CXX=cxx CXXFLAGS="-fast -arch generic -noexceptions -nortti" ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-thread-safe-client --with-mysqld-ldflags=-non_shared --with-client-ldflags=-non_shared Se vocˆ deseja usar egcs a seguinte linha de configura¸˜o funcionou para n´s: e ca o CFLAGS="-O3 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --disable-shared 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 4.18. Vocˆ deve fazer download e usar o gdb 5.0! e • Se vocˆ tentar ligar o mysqld estaticamente quando usar o gcc, a imagem resultante ir´ e a descarregar um arquivo core no in´ ˜ icio. Em outras palavras, NAO use --with-mysqld- ldflags=-all-static com gcc. 2.6.2.5 Notas Linux PowerPC O MySQL deve funcionar no MkLinux com o mais novo pacote glibc (testado com glibc 2.0.7). 2.6.2.6 Notas Linux MIPS Para ter o MySQL funcionando no Qube2. (Linux Mips), vocˆ precisar´ das bibliotecas e a glibc mais novas (Sabemos que glibc-2.0.7.29C2 funciona). Vocˆ tamb´m deve usar o e e compilador egcs C++ (egcs-1.0.2-9, gcc 2.95.2 ou mais nova). 2.6.2.7 Notas Linux IA-64 Para conseguir compilar o MySQL no Linux Ia64, usamos a seguinte linha de compila¸˜o: ca Usando gcc-2.96: CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql "--with-comment=Official MySQL binary" --with-extra-charsets=complex No Ia64 os bin´rios do cliente MySQL est˜o usando bibliotecas compartilhadas. Isto a a significa se vocˆ instalar nossa distribui¸˜o bin´rias em algum outro lugar diferente de e ca a ‘/usr/local/mysql’ vocˆ precisa modificar o ‘/etc/ld.so.conf’ ou adicionar o caminho e da o diret´rio onde est´ localizado o ‘libmysqlclient.so’ na vari´vel de ambiente LD_ o a a LIBRARY_PATH. Veja Se¸˜o A.3.1 [Erros de liga¸˜o], P´gina 918. ca ca a
  • 179. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 145 2.6.3 Notas Solaris No Solaris, vocˆ deve ter problemas mesmo antes de descompactar a distribui¸˜o MySQL! e ca O tar do Solaris n˜o pode tratar grandes nomes de arquivos, portanto vocˆ pode ver um a e 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 Neste caso, vocˆ deve usar o GNU tar (gtar) para desempacotar a dis- e tribui¸˜o. ca Vocˆ pode encontrar uma c´pia pr´-compilada para Solaris em e o e http://www.mysql.com/downloads/os-solaris.html. 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. Veja Se¸˜o 2.3.6 [MIT- a ca pthreads], P´gina 106. a Se vocˆ obter o seguinte erro de configure: e checking for restartable system calls... configure: error can not run test programs while cross compiling Isto significa que alguma coisa est´ errada com a instala¸˜o de seu compilador! Neste caso a ca vocˆ deve atualizar seu compilador para uma vers˜o mais nova. Vocˆ tamb´m pode resolver e a e e este problema inserindo a seguinte linha no arquivo ‘config.cache’: ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls=’no’} Se vocˆ est´ usando Solaris em um SPARC, o compilador recomendado ´ o gcc 2.95.2. Vocˆ e a e e pode encontr´-lo em http://gcc.gnu.org/. Perceba que egcs 1.1.1 e gcc 2.8.1 n˜o s˜o a a a est´veis no SPARC! a A linha do configure recomendado quando usando gcc 2.95.2 ´: e CC=gcc CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory --enable-assembler Se vocˆ possui um ultra sparc, vocˆ pode obter 4% a mais de performance adicionando e e "-mcpu=v8 -Wa,-xarch=v8plusa" para a CFLAGS e CXXFLAGS. Se vocˆ possui o compilador Sun Workshop (Fortre) 5.3 (ou mais novo), vocˆ pode executar e e configure da seguinte forma: CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt" CXX=CC CXXFLAGS="-noex -mt" ./configure --prefix=/usr/local/mysql --enable-assembler Vocˆ pode criar um bin´rio de 64 bits usando o compilador Forte da Sun com os seguintes e a parˆmetros de compila¸˜o: a ca CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v9" CXX=CC CXXFLAGS="-noex -mt -xarch=v9" ASFLAGS="-xarch=v9" ./configure --prefix=/usr/local/mysql --enable-assembler Para criar um bin´rio de 64 bits do Solaris usando gcc, e -m64 para CFLAGS e CXXFLAGS. a Note que isto s´ funciona com o MySQL 4.0 e acima - o MySQL 3.23 n˜o inclui as modi- o a fica¸˜es exigidas para suportar isto. co
  • 180. 146 MySQL Technical Reference for Version 5.0.0-alpha No benchmark do MySQL, conseguimos um aumento de velocidade de 4% em um Ultra- SPARC usando o Forte 5.0 no modo 32 bit em compara¸˜o com o uso do gcc 3.2 com o ca parametro -mcpu. Se vocˆ criar um bin´rio de 64 bits, ele ser´ 4$ mais lento que o bin´rio de 32 bits, mas o e a a a mysqld poder´ tratar mais threads e mem´ria. a o Se vocˆ tiver um problema com fdatasync ou sched_yield, vocˆ pode corrigir isto adicio- e e nando LIBS=-lrt para a linha de configura¸˜o ca O seguinte paragr´fo ´ relevante somente para compiladores mais antigos que o WorkShop a e 5.3: Vocˆ tamb´m pode ter que editar o script configure para alterar esta linha: e e #if !defined(__STDC__) || __STDC__ != 1 para isto: #if !defined(__STDC__) Se vocˆ ligar __STDC__ com a op¸˜o -Xc, o compilador Sun n˜o pode compilar com o arquivo e ca a de cabe¸alho ‘pthread.h’ do Solaris. Isto ´ um bug da Sun (compilador corrompido ou c e arquivo include corrompido). Se o mysqld emitir a mensagem de erro mostrada abaixo quando vocˆ execut´-lo, vocˆ deve e a e tentar compilar o MySQL com o compilador Sun sem habilitar a op¸˜o multi-thread (-mt): ca libc internal error: _rmutex_unlock: rmutex not held Adicione -mt a CFLAGS e CXXFLAGS e tente novamente. Se vocˆ estiver usando a vers˜o SFW do gcc (que vem com o Solaris 8), vocˆ deve adicionar e a e ‘/opt/sfw/lib’ a vari´vel de ambiente LD_LIBRARY_PATH antes de executar a configura¸˜o. a ca Se vocˆ estiver usando o gcc dispon´ em sunfreeware.com, vocˆ pode ter muitos prob- e ivel e lemas. Vocˆ deve recompilar o gcc e GNU binutils na m´quina que vocˆ o executar´ para e a e a evitar qualquer problema. Se vocˆ obter o seguinte erro quando estiver compilando o MySQL com gcc, significa que e seu gcc n˜o est´ configurado para sua vers˜o de Solaris: a a a 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’ A coisa apropriada para fazer neste caso ´ obter a vers˜o mais nova do gcc e compil´-lo e a a com seu compilador gcc atual! Ao menos para o Solaris 2.5, a maioria das vers˜es bin´rias o a de gcc tem arquivos in´teis e antigos que ir˜o quebrar todos programas que usam threads u a (e possivelmente outros programas)! O Solaris n˜o fornece vers˜es est´ticas de todas bibliotecas de sistema (libpthreads) e a o a libdl), portanto vocˆ n˜o pode compilar o MySQL com --static. Se vocˆ tentar fazer e a e isto, receber´ o erro: a ld: fatal: library -ldl: not found ou undefined reference to ‘dlopen’
  • 181. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 147 ou cannot find -lrt Se v´rios processos tentar conectar muito rapidamente ao mysqld, vocˆ ver´ este erro no a e a log do MySQL: Error in accept: Protocol error Vocˆ deve tentar iniciar o servidor com a op¸˜o --set-variable back_log=50 como uma e ca solu¸˜o para esta situa¸˜o. Note que --set-variable=nome=valor e -O nome=valor est´ ca ca a obsoleto desde o MySQL 4.0. Use apenas --back_log=50. Veja Se¸˜o 4.1.1 [Op¸˜es da ca co linha de comando], P´gina 208. a Se vocˆ est´ ligando seu pr´prio cliente MySQL, vocˆ deve obter o seguinte erro quando e a o e tentar execut´-lo: a ld.so.1: ./my: fatal: libmysqlclient.so.#: open failed: No such file or directory O problema pode ser evitado por um dos seguintes m´todos: e • 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’. • 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. Se vocˆ tiver problemas com o configure tentando ligar com -lz e vocˆ n˜o tem a zlib e e a instalada, vocˆ ter´ duas op¸˜es: e a co • 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. Se vocˆ estiver usando o gcc e tiver problemas carregando fun¸˜es UDF no MySQL, tente e co adicionar -lgcc para a linha de liga¸˜o para a fun¸˜o UDF. ca ca Se vocˆ deseja que o MySQL inicie automaticamente, e 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’. Como o Solaris n˜o suporta core files para aplica¸˜es setuid(), vocˆ n˜o pode obter um a co e a core file do mysqld se vocˆ estiver usando a op¸˜o --user. e ca 2.6.3.1 Notas Solaris 2.7/2.8 Vocˆ pode utilizar normalmente um bin´rio Solaris 2.6 no Solaris 2.7 e 2.8. A maioria dos e a detalhes do Solaris 2.6 tamb´m se aplicam ao Solaris 2.7 e 2.8. e Note que o MySQL vers˜o 3.23.4 e superiores devem estar aptos para autodetectar novas a vers˜es do Solaris e habilitar solu¸˜es para os problemas seguintes! o co Solaris 2.7 / 2.8 tem alguns bugs nos arquivos include. Vocˆ pode ver o seguinte erro quando e vocˆ usa o gcc: e
  • 182. 148 MySQL Technical Reference for Version 5.0.0-alpha /usr/include/widec.h:42: warning: ‘getwc’ redefined /usr/include/wchar.h:326: warning: this is the location of the previous definition Se isto ocorrer, vocˆ pode fazer o seguinte para corrigir o problema: e 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) Uma alternativa ´ editar o ‘/usr/include/widec.h’ diretamente. Desta forma, depois de e fazer a corre¸˜o, vocˆ deve remover o ‘config.cache’ e executar o configure novamente ! ca e Se vocˆ obter erros como estes quando vocˆ executar o make, ´ porque o configure e e e n˜o encontrou o arquivo ‘curses.h’ (provavelmente devido ao erro no arquivo a ‘/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 ‘;’ A solu¸˜o para isto ´ fazer uma das seguintes op¸˜es: ca e co • 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, provavelmente o problema ´ que seu arquivo ‘libz.so’ est´ instalado em ‘/usr/local/lib’. e a Vocˆ pode corrigir isto usando um dos seguintes m´todos: e e • 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 tribui¸˜o do Solaris 8. ca • Configure o MySQL com a op¸˜o --with-named-z-libs=no. ca 2.6.3.2 Notas Solaris x86 No Solaris 8 no x86, mysqld ir´ descarregar um core se vocˆ executar um ’strip’ no mesmo. a e Se vocˆ estiver usando gcc ou egcs no Solaris X86 e vocˆ tiver problemas com descarregos e e de core, vocˆ deve utilizar o seguinte comando configure: e 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 Isto ir´ evitar problemas com a biblioteca libstdc++ e com exce¸˜es C++. a co
  • 183. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 149 Se isto n˜o ajudar, vocˆ pode compilar uma vers˜o com debug e execut´-lo com um arquivo a e a a de ratreamento (trace) ou sob gdb. Veja Se¸˜o D.1.3 [Using gdb on mysqld], P´gina 1072. ca a 2.6.4 Notas BSD Esta se¸˜o fornece informa¸˜o para os v´rios tipos de BSD, assim como a vers˜o espec´ ca ca a a ifica para eles. 2.6.4.1 Notas FreeBSD FreeBSD 4.x ou mais novo ´ recomendado para executa¸˜o do MySQL uma vez que o pacote e ca thread ´ muito mais integrado. e A mais f´cil e portanto a forma preferida para instal´-lo ´ usar as portas mysql-server e a a e mysql-client dispon´ iveis em http://www.freebsd.org. Usando-as vocˆ obtem: e • Um MySQL funcional, com todas as otimiza¸˜es conhecidas para trabalhar na sua co vers˜o habilitada do FreeBSD. a • 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 todos com pkg delete se vocˆ n˜o quiser mais o MySQL na m´quina. e a a ´ E recomendado que vocˆ utilize MIT-pthreads no FreeBSD 2.x e threads nativas nas Vers˜es e o ´ 3 e superiores. E poss´ executar com threads nativas em algumas vers˜es antigas (2.2.x) ivel o mas vocˆ pode encontrar problemas ao finalizar o mysqld. e Infelizmente algumas chamadas de fun¸˜es no FreeBSD ainda n˜o s˜o totalmente seguras co a a com threads, principalmente a fun¸˜o gethostbyname(), que ´ usada pelo MySQL para ca e converter nomes de m´quinas em endere¸os IPs. Sob certas circunstˆncias, o processo a c a mysqld ir´ criar repentinamente um carga de CPU de 100% e ficar´ sem resposta. Se vocˆ a a e se deparar com isto, tente iniciar o MySQL usando a op¸˜o --skip-name-resolve. ca Alternativamente, vocˆ pode ligar o MySQL no FreeBSD 4.x com a biblioteca Linux- e Threads, que evita uns poucos problemas que a implementa¸˜o da thread nativa do FreeBSD ca tem. Para uma compara¸˜o muito boa do LinuxThreads vs. threads nativas dˆ uma ol- ca e hada no artigo "FreeBSD or Linux for your MySQL Server?" de Jeremy Zawodny em http://jeremy.zawodny.com/blog/archives/000697.html Os problemas conhecidos usando LinuxThreads na FreeBSD s˜o: a • wait_timeout n˜o est´ funcionando (provavemente problema de manipula¸˜o do signal a a ca em FreeBSD/LinuxThreads). Isto deveria ter sido corrigido no FreeBSD 5.0. O sintome a ´ que conex˜es persistentes podem se manter por um longo tempo sem serem fechadas. o O ‘Makefile’ do MySQL necessita o GNU make (gmake) para funcionar. Se vocˆ deseja e compilar o MySQL, antes vocˆ precisar´ instalar o GNU make. e a Tenha certeza que sua configura¸˜o de resolu¸˜o de nomes esteja correta. De outra forma ca ca vocˆ vai ter atrasos na resolu¸˜o ou falhas quando conectar ao mysqld. e ca
  • 184. 150 MySQL Technical Reference for Version 5.0.0-alpha Tenha certeza que a entrada localhost no arquivo ‘/etc/hosts’ esteja correta (de outra forma vocˆ ir´ ter problemas conectando ao banco de dados). O arquivo ‘/etc/hosts’ deve e a iniciar com a linha: 127.0.0.1 localhost localhost.seu.dominio O modo recomendado de compilar e instalar o MySQL no FreeBSD com gcc (2.95.2 e acima) ´: e CC=gcc CFLAGS="-O2 -fno-strength-reduce" CXX=gcc CXXFLAGS="-O2 -fno-rtti -fno-exceptions -felide-constructors -fno-strength-reduce" ./configure --prefix=/usr/local/mysql --enable-assembler gmake gmake install ./scripts/mysql_install_db cd /usr/local/mysql ./bin/mysqld_safe & Se vocˆ percber que o configure usar´ MIT-pthreads, vocˆ de ler as notas sobre MIT- e a e pthreads. Veja Se¸˜o 2.3.6 [MIT-pthreads], P´gina 106. ca a Se o make install n˜o puder encontrar ‘/usr/include/pthreads’, ´ porque o configure a e n˜o detectou que vocˆ precisava de MIT-pthreads. Isto ´ corrigido executando estes coman- a e e dos: shell> rm config.cache shell> ./configure --with-mit-threads O FreeBSD ´ tamb´m conhecido por ter um limite muito baixo para o manipulador de e e arquivos. Veja Se¸˜o A.2.17 [Not enough file handles], P´gina 917. Descomente a se¸˜o ca a ca ulimit -n no mysqld safe ou aumente os limites para o usu´rio mysqld no /etc/login.conf (e a reconstrua-o com cap mkdb /etc/login.conf). Tamb´m tenha certeza que vocˆ configurou e e a classe apropriada para este usu´rio no arquivo de senhas (password) se vocˆ n˜o estiver a e a usando o padr˜o (use: chpass nome usuario mysqld). Veja Se¸˜o 4.8.2 [mysqld_safe], a ca P´gina 332. a Se vocˆ tiver muita mem´ria vocˆ deve considerar em reconstruir o Kernel para permitir o e o e MySQL de usar mais de 512M de RAM. Dˆ uma olhada na op¸~o MAXDSIZ na arquivo de e ca configura¸˜o LINT para maiores informa¸˜es. ca co Se vocˆ tiver problemas com a data atual no MySQL, configurar a vari´vel TZ provavelmente e a ajudar´. Veja Apˆndice E [Environment variables], P´gina 1083. a e a Para obter um sistema seguro e est´vel vocˆ deve usar somente kernels FreeBSD que estejam a e marcados com -STABLE. 2.6.4.2 Notas NetBSD Para compilar no NetBSD vocˆ precisa do GNU make. De outra forma o compilador que- e braria quando o make tentasse executar lint em arquivos C++.
  • 185. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 151 2.6.4.3 Notas OpenBSD No OpenBSD Vers˜o 2.5, vocˆ pode compilar o MySQL com threads nativas com as a e seguintes op¸˜es: co CFLAGS=-pthread CXXFLAGS=-pthread ./configure --with-mit-threads=no 2.6.4.4 Notas OpenBSD 2.8 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 a Janeiro de 2001 a corre¸˜o foi dispon´ ca ivel apenas no ramo “-current”. Os sintomas deste bug nas threads s˜o: resposta lenta, alta carga, alto uso de CPU e quedas do servidor. a Se vocˆ obter um erro como Error in accept:: Bad file descriptor ou erro 9 ao ten- e tar abrir tabelas ou diret´rios, o problema ´ provavelmente que vocˆ n˜o alocou mem´ria o e e a o suficiente para os descritores de arquivo do MySQL. Neste caso tente iniciar o mysqld_safe como root com as seguintes op¸˜es: co shell> mysqld_safe --user=mysql --open-files-limit=2048 & 2.6.4.5 Notas BSDI Vers˜o 2.x a Se vocˆ obter o seguinte erro quando estiver compilando o MySQL, seu valor ulimit para e mem´ria virtual ´ muito baixo: o e 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 Tente usar ulimit -v 80000 e executar o make novamente. Se isto n˜o funcionar e vocˆ es- a e tiver usando o bash, tente trocar para csh ou sh; alguns usu´rios BSDI relataram problemas a com bash e ulimit. Se vocˆ utiliza gcc, vocˆ pode tamb´m ter de usar a op¸˜o --with-low-memory para o e e e ca configure estar apto a compilar o ‘sql_yacc.cc’. Se vocˆ tiver problemas com a data atual no MySQL, configurar a vari´vel TZ provavelmente e a ajudar´. Veja Apˆndice E [Environment variables], P´gina 1083. a e a 2.6.4.6 Notas BSD/OS Vers˜o 3.x a 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 O comeando seguinte tamb´m funciona: e
  • 186. 152 MySQL Technical Reference for Version 5.0.0-alpha shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-unix-socket-path=/var/mysql/mysql.sock Vocˆ pode alterar as localiza¸˜es dos diret´rios se vocˆ desejar, ou apenas usar os padr˜es e co o e o n˜o especificando nenhuma localiza¸˜o. a ca Se vocˆ tiver problemas com performance sob alta carga, tente usar a op¸˜o --skip-thread- e ca priority para mysqld! Isto ir´ executar todas as threads com a mesma prioridade; no BSDI a vers˜o 3.1, isto fornece melhor performance (pelo menos at´ o BSDI corrigir seu organizador a e de threads). Se vocˆ obter o erro virtual memory exhausted enquanto estiver compilando, deve tentar e usar ulimit -v 80000 e executar make novamente. Se isto n˜o funcionar e vocˆ estiver a e usando bash, tente trocar para csh ou sh; alguns usu´rios BSDI relataram problemas com a bash e ulimit. 2.6.4.7 Notas BSD/OS Vers˜o 4.x a O BSDI Vers˜o 4.x tem alguns bugs relacionados `s threads. Se vocˆ deseja usar o MySQL a a e nesta vers˜o, vocˆ deve instalar todas as corre¸˜es relacionadas `s threads. Pelo menos a a e co a M400-23 deve estar instalada. Em alguns sistemas BSDI vers˜o 4.x, vocˆ pode ter problemas com bibliotecas compartil- a e hadas. O sintoma ´ que vocˆ n˜o pode executar nenhum programa cliente, por exemplo, e e a mysqladmin. Neste caso vocˆ precisa reconfigurar o MySQL, para ele n˜o usar bibliotecas e a compartilhadas, com a op¸˜o --disable-shared. ca Alguns clientes tiveram problemas no BSDI 4.0.1 que o bin´rio do mysqld n˜o conseguia a a abrir tabelas depois de um tempo em funcionamento. Isto ´ porque alguns bugs relaciona- e dos a biblioteca/sistema fazem com que o mysqld altere o diret´rio atual sem nenhuma o informa¸˜o! ca A corre¸˜o ´ atualizar para a 3.23.34 ou depois de executar configure remova a linha ca e $define HAVE_REALPATH de config.h antes de executar o make. Perceba que com isso vocˆ n˜o pode fazer um link simb´lico de um diret´rio de banco de e a o o dados para outro diret´rio ou fazer um link simb´lico a uma tabela para outro banco de o o dados no BSDI! (Criar um link simb´lico para outro disco funciona). o 2.6.5 Notas Mac OS X 2.6.5.1 Mac OS X 10.x O MySQL deve funcionar sem problemas no Mac OS X 10.x (Darwin). Vocˆ n˜o precisa e a dos patches pthread para este SO. Isto tamb´m se aplica ao Mac OS X 10.x Server. A compila¸˜o para a plataforma Server ´ a e ca e mesma para a vers˜o cliente do Mac OS X. No entanto note que o MySQL vem preinstalado a no Servidor !
  • 187. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 153 Nosso bin´rio para Mac OS X ´ compilado no Darwin 6.3 com a seguinte linha de con- a e figura¸˜o: ca CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared Veja Se¸˜o 2.1.3 [Instala¸˜o do Mac OS X], P´gina 71. ca ca a 2.6.5.2 Mac OS X Server 1.2 (Rhapsody) Antes de tentar configurar o MySQL no MAC OS X server 1.2 (aka Rhapsody), primeiro vocˆ deve instalar o pacote pthread encontrado em: e http://www.prnet.de/RegEx/mysql.html. Veja Se¸˜o 2.1.3 [Instala¸˜o do Mac OS X], P´gina 71. ca ca a 2.6.6 Notas de Outros Unix 2.6.6.1 Notas HP-UX para distribui¸˜es bin´rias co a Alguma das distribui¸˜es bin´rias do MySQL para HP-UX ´ distribuida como um arquivo co a e depot da HP e como um arquivo tar. Para usar o arquivo depot vocˆ deve estar executando e pelo menos o HP-UX 10.x para ter acesso `s ferramentas de arquivos depot da HP. a A vers˜o HP do MySQL foi compilada em um servidor HP 9000/8xx sob HP-UX 10.20, a usando MIT-pthreads. Sob esta configura¸˜o o MySQL funciona bem. O MySQL Vers˜o ca a 3.22.26 e mais novas tamb´m podem ser construidas com o pacote thread nativo da HP. e Outras configura¸˜es que podem funcionar: co • HP 9000/7xx executando HP-UX 10.20+ • HP 9000/8xx executando HP-UX 10.30 As seguintes configura¸˜es definitivamente n˜o funcionar˜o: co a a • HP 9000/7xx ou 8xx executando HP-UX 10.x where x < 2 • HP 9000/7xx ou 8xx executando HP-UX 9.x Para instalar a distribui¸˜o, utilze um dos comandos abaixo, onde /path/to/depot ´ o ca e 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:
  • 188. 154 MySQL Technical Reference for Version 5.0.0-alpha shell> /usr/sbin/swinstall -s /path/to/depot mysql.developer O depot copia os bin´rios e bibliotecas em ‘/opt/mysql’ e dados em ‘/var/opt/mysql’. O a depot tamb´m cria as entradas apropriadas em ‘/etc/init.d’ e ‘/etc/rc2.d’ para iniciar e o servidor automaticamente na hora do boot. Obviamente, para instalar o usu´rio deve ser a o root. Para instalar a distribui¸˜o HP-UX tar.gz, vocˆ deve ter uma c´pia do GNU tar. ca e o 2.6.6.2 Notas HP-UX Vers˜o 10.20 a Existem alguns pequenos problemas quando compilamos o MySQL no HP-UX. N´s re-o comendamos que vocˆ use o gcc no lugar do compilador nativo do HP-UX, porque o gcc e produz um c´digo melhor! o N´s recomendamos o uso do gcc 2.95 no HP-UX. N˜o utilize op¸˜es de alta otimiza¸˜o o a co ca (como -O6) ja que isto pode n˜o ser seguro no HP-UX. a A seguine linha do configure deve funcionar com o gcc 2.95: CFLAGS="-I/opt/dce/include -fpic" CXXFLAGS="-I/opt/dce/include -felide-constructors -fno-exceptions -fno-rtti" CXX=gcc ./configure --with-pthread --with-named-thread-libs=’-ldce’ --prefix=/usr/local/mysql --disable-shared A seguinte linha do configure deve funcionar com o gcc 3.1: CFLAGS="-DHPUX -I/opt/dce/include -O3 -fPIC" CXX=gcc CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions -fno-rtti -O3 -fPIC" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-pthread --with-named-thread-libs=-ldce --with-lib-ccflags=-fPIC --disable-shared 2.6.6.3 Notas HP-UX Vers˜o 11.x a Para HP-UX Vers˜o 11.x n´s recomendamos o MySQL Vers˜o 3.23.15 ou posterior. a o a Por causa de alguns bugs cr´ iticos nas bibliotecas padr˜o do HP-UX, vocˆ deve instalar as a e seguintes corre¸˜es antes de tentar executar o MySQL no HP-UX 11.0: co PHKL_22840 Streams cumulative PHNE_22397 ARPA cumulative Isto ir´ resolver um problema que tem como retorno EWOLDBLOCK de recv() e EBADF de a accept() em aplica¸˜es threads. co Se vocˆ estiver usando gcc 2.95.1 em um sistema HP-UX 11.x sem corre¸˜es, vocˆ obter´ e co e 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:
  • 189. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 155 /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: O problema ´ que o HP-UX n˜o define consistentemente a pthreads_ e a atfork(). Ela tem prot´tipos coflitantes em ‘/usr/include/sys/unistd.h’:184 o e ‘/usr/include/sys/pthread.h’:440 (detalhes abaixo). Uma solu¸˜o ´ copiar ‘/usr/include/sys/unistd.h’ em ‘mysql/include’ e editar ca e ‘unistd.h’ alterando-o para coincidir com a defini¸˜o em ‘pthread.h’. Aqui est´ o diff: ca a 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-exceptions -fno-rtti -O3" ./configure --prefix=/usr/local/mysql --disable-shared Segue algumas inforama¸˜es que um usu´rio do HP-UX Vers˜o 11.x nos enviou sobre com- co a a pila¸˜o do MySQL com o compilador HP-UX: ca CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure --with-extra-character-set=com Vocˆ pode ignorar qualquer erro do tipo: e aCC: warning 901: unknown option: ‘-3’: use +help for online documentation Se vocˆ obter o seguinte erro do configure e checking for cc option to accept ANSI C... no configure: error: MySQL requires a ANSI C compiler (and a C++ compiler). Try gcc. See the Installation chapter in the Reference Manual. Confira se vocˆ n˜o tem o caminho para o compilador K&R antes do caminho para o e a compilador C e C++ do HP-UX. Outra raz˜o para n˜o estar compilando ´ vocˆ n˜o definir o parˆmetro +DD64 acima. a a e e a a Outra possibilidade para o HP-UX 11 ´ usar o bin´rio MySQL para HP-UX 10.20. Recebe- e a mos relatos de alguns usu´rios de que esses bin´rios funcionam bem no HP-UX 11.00. Se a a vocˆ encontrar problemas, verifique o n´ do pacth de seu HP-UX. e ivel 2.6.6.4 Notas IBM-AIX Detec¸˜o autom´tica de xlC est´ faltando no Autoconf, portando um comando configure ca a a deste tipo ´ necess´rio quando estiver compilando o MySQL (Este exemplo usa o compilador e a IBM): export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 " export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192"
  • 190. 156 MySQL Technical Reference for Version 5.0.0-alpha 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’ --enable-thread-safe-client --enable-large-files Acima est˜o as op¸˜es usadas para compilar a distribui¸˜o MySQL que pode ser encontrada a co ca em http://www-frec.bull.com/. Se vocˆ alterar o -O3 para -O2 na linha de configura¸˜o acima, vocˆ tamb´m deve remover e ca e e a op¸˜o -qstrict (isto ´ uma limita¸˜o no compilador C da IBM). ca e ca Se vocˆ estiver usando gcc ou egcs para compilar o MySQL, vocˆ DEVE usar a op¸˜o -fno- e e ca exceptions, j´ que o manipulador de exce¸˜es no gcc/egcs n˜o ´ seguro para threads! (Isto a co a e foi testado com egcs 1.1). Existem tamb´m alguns problemas conhecidos com o assembler e 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: o 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 O -Wa,-many ´ necess´rio para o compilador ser bem sucedido. IBM est´ ciente deste e a a a a ´ devido ao fato do problema poder ser problema mas n˜o est´ com pressa de corrigi-lo contornado. N´s n˜o sabemos se o -fno-exceptions ´ necess´rio com gcc 2.9.5, mas o a e a como o MySQL n˜o utiliza exce¸˜es e a op¸˜o acima gera c´digo mais r´pido, recomendamos a co ca o a que vocˆ sempre use esta op¸˜o com o egcs/gcc. e ca Se vocˆ tiver algum problema com c´digo assembler tente alterar o -mcpu=xxx para o seu e o processador. Normalmente power2, power ou powerpc podem ser usados, de uma maneira alternativa vocˆ pode precisar usar 604 ou 604e. N˜o tenho certeza mas acredito que usar e a "power" deve satisfazer a maioria dos casos, mesmo em uma m´quina power2. a Se vocˆ n˜o sabe qual ´ o seu processador, utilize o comando "uname -m", isto ir´ fornecer a e a e a vocˆ uma string que parece com "000514676700", com um formato de xxyyyyyymmss onde e xx e ss s˜o sempre 0s, yyyyyy ´ o ID unico do sistema e mm ´ o ID da CPU Planar. Uma a e ´ e tabela destes valores podem ser encontrados em http://publib.boulder.ibm.com/doc_ link/en_US/a_doc_lib/cmds/aixcmds5/uname.htm. Isto ir´ lhe fornecer um tipo de a m´quina e um modelo de m´quina que vocˆ pode usar para determinar que tipo de cpu a a e vocˆ tem. e Se vocˆ tiver problemas com sinais (MySQL finaliza sem notifica¸˜o sob alta carga) vocˆ e ca e pode ter encontrado um bug de SO com threads e sinais. Neste caso vocˆ pode dizer ao e MySQL para n˜o usar sinais configurando-o com: a
  • 191. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 157 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 Isto n˜o afeta a performance do MySQL, mas tem o efeito colateral que vocˆ n˜o pode a e a matar clientes que est˜o “dormindo” em uma conex˜o com mysqladmin kill ou mysqladmin a a shutdown. Neste caso, o cliente morrer´ quando ele chegar no pr´ximo comando. a o Em algumas vers˜es do AIX, ligando com libbind.a faz o getservbyname descarregar core. o Isto ´ erro no AIX e deve ser relatado para a IBM. e Para o AIX 4.2.1 e gcc vocˆ tem que fazer as seguintes altera¸˜es. e co Depois de configurar, edite o ‘config.h’ e ‘include/my_config.h’ e altere a linha que diz #define HAVE_SNPRINTF 1 para #undef HAVE_SNPRINTF E finalmente, no ‘mysqld.cc’ vocˆ precisa adicionar um prot´tipo para initgroups. e o #ifdef _AIX41 extern "C" int initgroups(const char *,int); #endif Se vocˆ precisar se alocar muita mem´ria para o processo mysqld, n˜o ´ suficiente apenas e o a e definir ’ulimit -d unlimited’. Vocˆ tamb´m deve configurar no mysqld_safe algo do tipo: e e export LDR_CNTRL=’MAXDATA=0x80000000’ Vocˆ pode encontrar mais sobre o uso de muita mem´ria em: http://publib16.boulder.ibm.com/pseries e o US/aixprggd/genprogc/lrg_prg_support.htm. 2.6.6.5 Notas SunOS 4 No SunOS 4, ´ necess´rio a MIT-pthreads para compilar o MySQL, o que significa que vocˆ e a e precisa do GNU make. Alguns sistemas SunOS 4 tem problemas com bibliotecas dinˆmicas e libtool. Vocˆ pode a e usar a seguinte linha do configure para evitar este problema: shell> ./configure --disable-shared --with-mysqld-ldflags=-all-static Quando compilando readline, vocˆ pode obter alguns avisos sobre defini¸˜es duplicadas e co que podem ser ignoradas. Ao compilar o mysqld, v˜o existir alguns alertas sobre implicit declaration of function a que tamb´m podem ser ignoradas. e 2.6.6.6 Notas Alpha-DEC-UNIX (Tru64) Se vocˆ est´ usando o egcs 1.1.2 no Digital Unix, vocˆ atualizar par o gcc 2.95.2, j´ que o e a e a egcs no DEC tem v´rios erros graves ! a Quando compilando programas com threads no Digital Unix, a documenta¸˜o recomenda ca usar a op¸˜o -pthread para cc e cxx e as bibliotecas -lmach -lexc (em adi¸˜o para - ca ca lpthread). Vocˆ deve executar o configure parecido com isto: e
  • 192. 158 MySQL Technical Reference for Version 5.0.0-alpha CC="cc -pthread" CXX="cxx -pthread -O" ./configure --with-named-thread-libs="-lpthread -lmach -lexc -lc" Quando compilando o mysqld, vocˆ deve ver alguns avisos como estes: e mysqld.cc: In function void handle_connections()’: mysqld.cc:626: passing long unsigned int *’ as argument 3 of accept(int,sockadddr *, int *)’ Vocˆ pode ignorar estes altertas com seguran¸a. Eles ocorrem porque o configure s´ pode e c o detectar erros e n˜o alertas. a Se vocˆ inicia o servidor diretamente da linha de comando, vocˆ pode ter problemas com e e a finaliza¸˜o do servidor ao sair (log out). (Quando vocˆ sai, seu processo superior recebe ca e 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 mysqld_safe, o qual invoca o mysqld usando nohup por vocˆ. Veja Se¸˜o 4.8.2 [mysqld_safe], P´gina 332. e ca a Se vocˆ tiver problemas quando compilar mysys/get opt.c, apenas remova a linha #define e NO PROTO do inicio do arquivo! Se vocˆ estiver utilizando o compilador CC da Compac, a seguinte linha de configura¸˜o e ca dever´ funcionar: a 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 -noexceptions -nortti" 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 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 e 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
  • 193. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 159 gnumake install scripts/mysql_install_db 2.6.6.7 Notas Alpha-DEC-OSF1 Se vocˆ tiver problemas com compila¸˜o e tem o DEC CC e o gcc instalados, tente executar e ca o configure desta forma: CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql Se vocˆ tiver problemas com o arquivo ‘c_asm.h’, vocˆ pode criar e usar um arquivo e e ‘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 fazendo o download do ultimo kit de atualiza¸˜o da DEC (Compaq) de ´ ca 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 tamb´m aparece estar quebrado (problemas com erros _exit undefined ocorrendo ao ligar e no mysqld). Neste sistema, temos compilado o MySQL com a seguinte linha configure, depois de substituir /bin/ld com a vers˜o do OSF 4.0C: a 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 -noexceptions -nortti export CC CFLAGS CXX CXXFLAGS ./configure --prefix=/usr/mysql/mysql --with-mysqld-ldflags=-all-static --disable-shared --with-named-thread-libs="-lmach -lexc -lc" Em algumas vers˜es do OSF1, a fun¸˜o alloca() est´ quebrada. Corrija isto removendo a o ca a linha no ‘config.h’ que define ’HAVE_ALLOCA’. A fun¸˜o alloca() pode tamb´m ter um prot´tipo incorreto em /usr/include/alloca.h. ca e o O alerta resultante deste erro pode ser ignorado. configure ir´ usar a seguinte biblioteca thread automaticamente: --with-named-thread- a libs="-lpthread -lmach -lexc -lc". Quando usar o gcc, vocˆ tamb´m pode tentar executar configure desta forma: e e shell> CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure ....
  • 194. 160 MySQL Technical Reference for Version 5.0.0-alpha Se vocˆ tiver problemas com sinais (MySQL finalzar inesperadamente sobre alta carga), e vocˆ pode ter encontrado um erro com threads e sinais no SO. Neste caso vocˆ pode dizer e e ao MySQL para n˜o usar sinais configurando-o com: a shell> CFLAGS=-DDONT_USE_THR_ALARM CXXFLAGS=-DDONT_USE_THR_ALARM ./configure ... 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 a mysqladmin shutdown. Neste caso o cliente ir´ morrer quando ele receber o pr´ximo a o comando. Com gcc 2.95.2, vocˆ provavelmente encontrar´ o seguinte erro de compila¸˜o: e a ca sql_acl.cc:1456: Internal compiler error in ‘scan_region’, at except.c:2566 Please submit a full bug report. Para corrigir isto vocˆ deve alterar para o diret´rio sql e fazer um “corta e cola” da ultima e o ´ linha gcc, mas altere -O3 para -O0 (ou adicione -O0 imediatamente depois de gcc se vocˆ e n˜o tiver algumas op¸˜o -O na sua linha de compila¸˜o.) Depois disto feito vocˆ deve apenas a ca ca e voltar ao diret´rio superior e executar make novamente. o 2.6.6.8 Notas SGI Irix Se vocˆ estiver usando Irix Vers˜o 6.5.3 ou mais novo, o mysqld s´ ir´ conseguir criar threads e a o a se vocˆ execut´-lo como um usu´rio com privil´gios de CAP_SCHED_MGT (como root) ou dar e a a e ao servidor mysqld este privil´gio com o seguinte comando shell: e shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld Vocˆ pode precisar indefinir alguns simbolos em ‘config.h’ depois de executar configure e e antes de compilar. Em algumas implementa¸˜es Irix, a fun¸˜o alloca() est´ quebrada. Se o servidor mysqld co ca a morrer em alguma instru¸˜o SELECT, remova as linhas de ‘config.h’ que definem HAVE_ ca ALLOC e HAVE_ALLOC_H. Se mysqladmin create n˜o funciona, remova a linha do ‘config.h’ a que define HAVE_READDIR_R. Vocˆ tamb´m deve precisar remover a linha HAVE_TERM_H. e e A SGI recomenda que vocˆ instale todos os patches desta p´gina: http://support.sgi.com/surfzone/patches/ e a No m´ inimo, vocˆ deve instalar o ultimo rollup do kernel, o ultimo rollup rld, e o ultimo e ´ ´ ´ rollup libc. Definitivamente vocˆ precisar´ de todos patches POSIX nesta p´gina, para suporte e a a pthreads: http://support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html Se vocˆ obter o seguinte erro quando estiver compilando o ‘mysql.cc’: e "/usr/include/curses.h", line 82: error(1084): invalid combination of type Digite o seguinte no diret´rio topo da sua ´rvore fonte do MySQL: o a shell> extra/replace bool curses_bool < /usr/include/curses.h > include/curses.h shell> make
  • 195. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 161 Existem relatos de problemas com organiza¸˜o de threads. Se somente uma thread estiver ca executando, o sistema fica lento. Pode se evitar isto iniciando outro cliente. Isto pode acarretar num crescimento de 2 para 10 vezes na velocidade de execu¸˜o para a outra ca thread. Isto ´ um problema n˜o compreendido com threads Irix; vocˆ deve improvisar para e a e encontrar solu¸˜es at´ que isto seja resolvido. co e Se vocˆ estiver compilando com gcc, vocˆ pode usar o seguinte comando configure: e e CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --enable-thread-safe-client --with-named-thread-libs=-lpthread No Irix 6.5.11 com Irix C nativo e compiladores C++ ver. 7.3.1.2, o seguinte ir´ funcionar a 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-innodb --with-berkeley-db --with-libwrap=/usr/local --with-named-curses-libs=/usr/local/lib/libncurses.a 2.6.6.9 Notas SCO A vers˜o atual foi testado somente nos sistemas “sco3.2v5.0.4” e “sco3.2v5.0.5”. A vers˜oo a a para o “sco 3.2v4.2” tamb´m tem tido muito progresso. e At´ o momento o compilador recomendado no OpenServer ´ o gcc 2.95.2. Com isto vocˆ e e e deve estar apto a compilar o MySQL apenas com: CC=gcc CXX=gcc ./configure ... (op¸~es) co 1. Para o OpenServer 5.0.X vocˆ precisa usar gcc-2.95.2p1 ou mais novo da Skunkware. e http://www.SCO.com/skunkware/ e ecolher o pacote OpenServer browser ou por ftp em ftp to ftp2.SCO.com no diret´rio pub/skunkware/osr5/devtools/gcc. o 2. Vocˆ precisa do GCC vers˜o 2.5.x para este produto e do sistema de desenvolvimento. e a Eles s˜o necess´rios nesta vers˜o do SCO Unix. Vocˆ n˜o pode usar apenas o sistema a a a e a GCC Dev. 3. Vocˆ deve obter o pacote FSU Pthreads e instal´-lo primeiro. Pode ser obtido em e a http://www.cs.wustl.edu/~schmidt/ACE_wrappers/FSU-threads.tar.gz. Vocˆ e pode tamb´m obter um pacote precompilado de http://www.mysql.com/Downloads/SCO/FSU-threads e 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 instalado usando uma boa vers˜o do GCC 2.5.x ODT ou OS 3.0, no qual vocˆ necessi- a e tar´ de uma boa vers˜o do GCC 2.5.x. Existem v´rios problemas sem uma boa vers˜o. a a a a Esta vers˜o do produto necessita do sistema de Desenvolvimento SCO Unix. Sem ele, a vocˆ estar´ perdendo as bibliotecas e o editor de liga¸˜o necess´rio. e a ca a 5. Para construir a FSU Pthreads no seu sistema, fa¸a o seguinte: c 1. Execute ./configure no diret´rio ‘threads/src’ e selecione a op¸˜o SCO o ca OpenServer. Este comando copia ‘Makefile.SCO5’ para ‘Makefile’. 2. Execute make.
  • 196. 162 MySQL Technical Reference for Version 5.0.0-alpha 3. Para instalar no diret´rio padr˜o ‘/usr/include’, use o usu´rio root, depois mude o a a para o diret´rio ‘thread/src’ e execute make install o 6. Lembre de usar o GNU make quando estiver construindo o MySQL. 7. Se vocˆ n˜o iniciou o mysqld_safe como root, vocˆ provavelmente s´ ir´ obter, por e a e o a padr˜o, os 110 arquivos abertos por processo. O mysqld ir´ gravar uma nota sobre isto a a no arquivo log. 8. Com o SCO 3.2V5.0.5, vocˆ deve usar o FSU Pthreads vers˜o 3.5c ou mais nova. Vocˆ e a e deve tamb´m usar o gcc 2.95.2 ou mais novo. e O seguinte comando configure deve funcionar: shell> ./configure --prefix=/usr/local/mysql --disable-shared 9. Com SCO 3.2V4.2, vocˆ deve usar FSU Pthreads vers˜o 3.5c ou mais nova. O seguinte e a 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" Vocˆ pode ter alguns problemas com alguns arquivos de inclus˜o. e a Neste caso, vocˆ pode encontrar novos arquivos de inclus˜o espec´ e a ificos do SCO em http://www.mysql.com/Downloads/SCO/SCO-3.2v4.2-includes.tar.gz. Vocˆ deve e descompactar este arquivo no diret´rio ‘include’ da sua ´rvore fonte do MySQL. o a 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 diz que suas bibliotecas de fun¸˜es s˜o re-entrantes, ent˜o elas devem ser re-entrantes co a a com as FSU-Pthreads. FSU Pthreads no OpenServer tentam usar o esquema SCO para criar bibliotecas re-entrantes. • FSU Pthreads (ao menos a vers˜o em http://www.mysql.com) vem ligada com GNU a malloc. Se vocˆ encontrar problemas com uso de mem´ria, tenha certeza que o e 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 deve remove-lo se vocˆ deseja executar o mysqld em uma m´quina OpenServer 5.0.6. e a • A SCO fornece Patches do Sistema Operacional em ftp://ftp.sco.com/pub/openserver5 para OpenServer 5.0.x • A SCO fornece corre¸˜es de seguran¸a e libsocket.so.2 em ftp://ftp.sco.com/pub/security/OpenSer co c e ftp://ftp.sco.com/pub/security/sse para OpenServer 5.0.x • Corre¸˜es de seguran¸a pre-OSR506. co c Tamb´ a corre¸˜o do telnetd em e ca ftp://stage.caldera.com/pub/security/openserver/ ou ftp://stage.caldera.com/pub/securi
  • 197. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 163 com a libsocket.so.2 e libresolv.so.1 com instru¸˜es para instalar em sistemas pre- co OSR506. ´ E provavelmente uma boa id´ia para instalar os patches acima tentando compilar/usar e o MySQL. Se vocˆ deseja instalar o DBI no SCO, vocˆ deve editar o ‘Makefile’ em DBI-xxx e cada e e subdiret´rio. o 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 Isto ´ porque o carregador dinˆmico Perl n˜o ir´ carregar os m´dulos DBI se elas foram e a a a o compiladas com icc ou cc. Perl trabalha melhor quando compilado com cc. 2.6.6.10 Notas SCO Unixware Version 7.0 Vocˆ deve usar uma vers˜o de MySQL pelo menos t˜o recente quando a Vers˜o 3.22.13 e a a a e UnixWare 7.1.0 porque esta vers˜o corrige alguns problemas de portabilidade sob o a Unixware. N´s temos compilado o MySQL com o seguinte comando configure no UnixWare Vers˜o o a 7.1.x: CC=cc CXX=CC ./configure --prefix=/usr/local/mysql Se vocˆ deseja usar o gcc, dever´ ser usado o gcc 2.95.2 ou mais novo. e a CC=gcc CXX=g++ ./configure --prefix=/usr/local/mysql 1. A SCO fornece Patches do Sistema Operacional em ftp://ftp.sco.com/pub/unixware7 para UnixWare 7.1.1 e 7.1.3 ftp://ftp.sco.com/pub/openunix8 para OpenUNIX 8.0.0 2. A SCO fornece informa¸˜o sobre Security Fixes em ftp://ftp.sco.com/pub/security/OpenUNIX ca para OpenUNIX ftp://ftp.sco.com/pub/security/UnixWare para UnixWare
  • 198. 164 MySQL Technical Reference for Version 5.0.0-alpha 2.6.7 Notas OS/2 O MySQL usa poucos arquivos aberto. Por isto, vocˆ deve adicionar uma linha parecida e com a abaixo em seu arquivo ‘CONFIG.SYS’: SET EMXOPT=-c -n -h1024 Se vocˆ n˜o fizer isto, provavelmente vai ter o seguinte erro: e a File ’xxxx’ not found (Errcode: 24) Quando usar o MysQL com OS/2 Warp 3, o FixPack 29 ou superior ´ necess´rio. Com OS/2 e a Warp 4, FixPack 4 ou acima ´ necess´rio. Isto ´ uma exigˆncia da biblioteca Pthreads. O e a e e MySQL deve estar instalado em uma parti¸˜o que suporta nomes longos de arquivos como ca no HPFS, FAT32, etc. O script ‘INSTALL.CMD’ deve ser executado pelo pr´prio ‘CMD.EXE’ do OS/2 e opde n˜o o a funcionar com shells substitutas como o ‘4OS2.EXE’. O script ‘scripts/mysql-install-db’ foi renomeado. Agora ele ´ chamado ‘install.cmd’ e e ´ um script REXX, que ir´ atualizar as configura¸˜es padr˜es de seguran¸a do MySQL e e a co o c criar os ´ icones na WorkPlace Shell para o MySQL. Suporte a m´dulos dinˆmicos ´ compilado mas n˜o totalmente testado. M´dulos dinˆmicos o a e a o a 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 Nota: Devido a limita¸˜es no OS/2, o nome do m´dulo UDF n˜o deve esceder 8 caracteres. co o a M´dulos s˜o armazenados no diret´rio ‘/mysql2/udf’; o script safe-mysqld.cmd ir´ colo- o a o a car este diret´rio na vari´vel de ambiente BEGINLIBPATH. Quando usando m´dulos UDF, o a o extens˜es espec´ o ificas s˜o ignoradas — consuidera-se que seja ‘.udf’. Por exemplo, no Unix, a o m´dulo compartilhado deve ser nomeado ‘example.so’ e vocˆ deve carregar uma fun¸˜o o e ca dele desta forma: mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example.so"; No OS/2, o m´dulo deve ter o nome de ‘example.udf’, mas vocˆ n˜o deve especificar a o e a extens˜o do m´dulo: a o mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example"; 2.6.8 Notas Novell NetWare Portar o MySQL para NetWare foi um grande esfor¸o da Novell. Os clientes da Novell estar˜o c a satisfeitos ao notarem que o NetWare 6.5 vir´ com os bin´rios do MySQL, completa com a a uma licen¸a de uso comercial automatica para todos os servidores executando esta vers˜o c a do NetWare. Veja Se¸˜o 2.1.4 [Instala¸˜o NetWare], P´gina 74. ca ca a MySQL para NetWare ´ compilado usando um combina¸˜o do Metrowerks CodeWarrior e ca for NetWare e uma vers˜o especial de compila¸˜o cruzada do GNU autotools. Verifique a ca esta se¸˜o no futuro para mais informa¸˜es sobre constru¸˜o e otimiza¸˜o do MySQL para ca co ca ca NetWare.
  • 199. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 165 2.6.9 Notas BeOS N´s j´ falamos com alguns desenvolvedores BeOS que disseram que o MySQL est´ 80% o a a portado para o BeOS, mas n´s n˜o sabemos qual a situa¸˜o no momento. o a ca 2.7 Coment´rios de Instala¸˜o do Perl a ca 2.7.1 Instalando Perl no Unix O suporte Perl para o MySQL ´ fornecido pela interface cliente DBI/DBD. Veja Se¸˜o 12.5 e ca [Perl], P´gina 877. O c´digo do cliente Perl DBD/DBI exige Perl Vers˜o 5.004 ou posterior. a o a A interface n˜o funcionar´ se vocˆ tiver uma vers˜o mais do Perl. a a e a O suporte MySQL Perl tamb´m exige que vocˆ tenha instalado o suporte a programa¸˜o e e ca do cliente MySQL. Se vocˆ instalou o MySQL a partir de arquivos RPM, os programas e cliente est˜o no cliente RPM, mas o suporte a programa¸˜o do cliente est´ no RPM de a ca a desenvolvimento. Certifique de se instalar este RPM posteriormente. Na Vers˜o 3.22.8, o suporte Perl ´ distribu´ separadamente do dsitribui¸˜o principal do a e ido ca MySQL. Se vocˆ quiser instalar o suporte Perl, os arquivos que vocˆ precisr´ pode ser e e a obtidos em http://www.mysql.com/downloads/api-dbi.html. As distribui¸˜es Perl s˜o fornecidas como arquios tar compactados e s˜o chamados co a a ‘MODULE-VERSION.tar.gz’, onde MODULE ´ o nome do modulo e VERSION ´ o n´mero da e e u vers˜o. Vocˆ deve conseguir as distribui¸˜es Data-Dumper, DBI, e DBD-mysql e instal´-las a e co a nesta ordem. O procedimento de instala¸˜o ´ mostrado aqui. O exemplo mostrado ´ para ca e e o m´dulo Data-Dumper, mas o procedimento ´ o mesmo para todas as distribui¸˜es: o e co 1. Descompacte as distribui¸˜es no diret´rio atual: co o shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf - Este comando cria um diret´rio chamado ‘Data-Dumper-VERSION’. o 2. Entre no diret´rio principal da distribui¸˜o descompactada: o ca shell> cd Data-Dumper-VERSION 3. Contrua a dsitribui¸˜o e compile tudo: ca shell> perl Makefile.PL shell> make shell> make test shell> make install O comando make test ´ importante porque verifica que o m´dulo est´ funcionando. Note e o a que ao executar este comando durante a instala¸˜o do DBD-mysql para exercitar o c´digo ca o da interface, o servidor MySQL deve estar em execu¸˜o ou teste ir´ falhar. ca a ´ E uma boa id´ia reconstruir e reinstalar a distribui¸˜o DBD-mysql mesmo se vocˆ instalar e ca e uma nova distribui¸˜o do MySQL, particularmente se vocˆ notar simntomas como se todos ca e os seus scripts DBI realizarem dump core depois de vocˆ atualizar o MySQL. e Se vocˆ n˜o tem o direito para instalar os m´dulos Perl no diret´rio de sistema ou se vocˆ e a o o e quiser instalar m´dulos Perl locais, a seguinte referˆncia pode ajud´-lo: o e a
  • 200. 166 MySQL Technical Reference for Version 5.0.0-alpha http://servers.digitaldaze.com/extensions/perl/modules.html#modules Procure sob o t´ itulo Installing New Modules that Require Locally Installed Modules. 2.7.2 Instalaando ActiveState Perl no Windows Para instalar o m´dulo DBD do MySQL com ActiveState Perl no Windows, vocˆ deve fazer o e o seguinte: • Obter o ActiveState Perl em http://www.activestate.com/Products/ActivePerl/ e instal´-lo. a • Abrir um prompt do DOS. • Se exigido, configurar a vari´vel HTTP_proxy. Por exemplo, vocˆ pode tentar: a e set HTTP_proxy=my.proxy.com:3128 • Inicie o progrma PPM: C:> c:perlbinppm.pl • Se vocˆ j´ n˜o o fez, instale o DBI: e a a ppm> install DBI • Se der tudo certo, execute o seguinte comando: install ftp://ftp.de.uu.net/pub/CPAN/authors/id/JWIED/DBD-mysql-1.2212.x86.ppd O acima deve funcionar pelo menos com o ActiveState Perl Vers˜o 5.6. a Se vocˆ n˜o puder fazer o mostrado acima funcionar, vocˆ deve instalar o driver MyODBC e e a e conectar ao servidor MySQL atrav´s do ODBC: e use DBI; $dbh= DBI->connect("DBI:ODBC:$dsn",$user,$password) || die "Got error $DBI::errstr when connecting to $dsnn"; 2.7.3 Problemas Usando a Interface Perl DBI/DBD Se Perl informar que n˜o pode encontrar o m´dulo ‘../mysql/mysql.so’, ent˜o o a o a problema mais prov´vel ´ que o Perl n˜o pode localizar a biblioteca compartilhada a e a ‘libmysqlclient.so’. Vocˆ pode corrigir isto por qualquer um dos seguintes m´todos: e e • Compile a distribui¸˜o DBD-mysql com perl Makefile.PL -static -config em vez ca de perl Makefile.PL. • Copie ‘libmysqlclient.so’ para a diret´rio onde sua bibliotecas compartilhadas est˜o o a localizadas (provavelmente ‘/usr/lib’ ou ‘/lib’). • No Linux vocˆ pode adicionar o caminho do diret´rio onde ‘libmysqlclient.so’ est´ e o a localizado ao arquivo ‘/etc/ld.so.conf’. • Adicione o caminho do diret´rio onde ‘libmysqlclient.so’ est´ localizada ` vari´vel o a a a de ambiente LD_RUN_PATH.
  • 201. Cap´ ıtulo 2: Instala¸˜o do MySQL ca 167 Se voce receber os seguintes erros de DBD-mysql, vocˆ provavelmente est´ usando gcc (ou e a usando um bin´rio antigo compilado com gcc): a /usr/bin/perl: can’t resolve symbol ’__moddi3’ /usr/bin/perl: can’t resolve symbol ’__divdi3’ Adicione -L/usr/lib/gcc-lib/... -lgcc ao comando de liga¸˜o quando a biblioteca ca ‘mysql.so’ estiver constru´ (verifique a sa´ de make para ‘mysql.so’ quando vocˆ ida ida e compilar o cliente Perl). A op¸˜o -L deve especificar o caminho do diret´rio onde ca o ‘libgcc.a’ est´ localizada no seu sistema. a Outra causa deste problema pode ser que Perl e o MySQL n˜o s˜o compilados com gcc. a a Neste caso, vocˆ pode resolver o problema compilando ambos com gcc. e Se vocˆ receber o seguinte erro de DBD-mysql quando executar o teste: e t/00base............install_driver(mysql) failed: Can’t load ’../blib/arch/auto/DBD/mysql/mysql.so’ for module DBD::mysql: ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169. significa que vocˆ precisa adicionar a biblioteca compactada, -lz, a sua linha de liga¸˜o. e ca Isto pode ser feito com a seguinte altera¸˜o no arquivo ‘lib/DBD/mysql/Install.pm’: ca $sysliblist .= " -lm"; Altere esta linha para: $sysliblist .= " -lm -lz"; Depois disto, vocˆ deve executar ’make realclean’ e proceder com o instala¸˜o desde o in´ e ca icio. Se vocˆ quiser usar o m´dulo Perl em um sistema que n˜o suporta liga¸˜o dinˆmica (como e o a ca a SCO) vocˆ pode gerar uma vers˜o est´tica do Perl que inclui DBI e DBD-mysql. O modo e a a que isto funciona ´ que vocˆ gera uma vers˜o do Perl com o ¸odigo DBI ligado e instalado e e a c no topo do seu Perl atual. Entao vocˆ o utiliza para construir uma vers˜o do Perl que e a adicionalmente tem o c´digo DBD ligado em si, e instale-o. o No SCO, vocˆ deve ter as seguintes vari´veis de ambiente configuradas: e a shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib ou shell> LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib: /usr/progressive/lib:/usr/skunk/lib shell> LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib: /usr/progressive/lib:/usr/skunk/lib shell> MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man: /usr/skunk/man: Primeiro crie um Perl que inclui um m´dulo DBI ligado estaticamente executando estes o comandos no diret´rio onde a sua distribui¸˜o DBI est´ localiada: o ca a shell> perl Makefile.PL -static -config shell> make shell> make install shell> make perl Ent˜o vocˆ deve intalar o novo Perl. A sa´ de make perl indicar´ o comando make a e ida a exato que vocˆ precisar´ executar para realizar a instala¸˜o. No SCO, isto ´ make -f e a ca e Makefile.aperl inst_perl MAP_TARGET=perl.
  • 202. 168 MySQL Technical Reference for Version 5.0.0-alpha A seguir use o Perl r´cem criado para criar outro Perl que tamb´m inclui uma DBD::mysql e e estaticamente ligado rodando estes comandos no diret´rio onde sua distribui¸˜o DBD-mysql o ca est´ localizada: a shell> perl Makefile.PL -static -config shell> make shell> make install shell> make perl Finalmente vocˆ deve instalar este novo Perl. Novamente, a sa´ de make perl indica o e ida comando a usar.
  • 203. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 169 3 Tutorial de Introdu¸˜o Do MySQL ca Este cap´itulo fornece um tutorial de introdu¸˜o ao MySQL demonstrando como usar o ca programa cliente mysql para criar e usar um banco de dados simples. mysql (algumas vezes apresentado como o “terminal monitor” ou apenas “monitor”) ´ um programa interativo que e lhe permite conectar a um servidor MySQL, executar consultas e visualizar os resultados. mysql pode tamb´m ser executado em modo batch: vocˆ coloca suas consultas em um e e arquivo, depois diz ao mysql para executar o conte´do do arquivo. Cobrimos aqui ambas u as formas de utilizar o mysql. Para ver uma lista de op¸˜es conhecidas pelo mysql, chame-o com a op¸˜o --help: co ca shell> mysql --help Este cap´itulo presume que o mysql est´ instalado na sua m´quina e que um servidor MySQL a a est´ dispon´ a ivel para quem puder conectar. Se isto n˜o for verdade, contate seu admin- a istrador MySQL. (Se vocˆ ´ o administrador, vocˆ precisar´ consultar outras se¸˜es deste e e e a co manual.) Este cap´ itulo descreve todo o processo de configura¸˜o e uso de um banco de dados. Se ca vocˆ estiver interessado em apenas acessar um banco de dados j´ existente, podera pular e a as se¸˜es que descrevem como criar o banco de dados e suas respectivas tabelas. co Como este cap´ itulo ´ um tutorial, v´rios detalhes s˜o necessariamente omitidos. Consulte e a a as se¸˜es relevantes do manual para mais informa¸˜es sobre os t´picos cobertos aqui. co co o 3.1 Conectando e Desconectando do Servidor Para conectar ao servidor, normalmente vocˆ precisar´ fornecer um nome de usu´rio quando e a a o mysql for chamado e, na maioria dos casos, uma senha. Se o servidor executa em uma m´quina diferente de onde vocˆ est´, vocˆ tamb´m precisar´ especificar um nome a e a e e a de m´quina. Contate seu administrador para saber quais parˆmetros de conex˜o vocˆ deve a a a e usar para conectar (isto ´, qual m´quina, usu´rio e senha usar). Uma vez que vocˆ saiba e a a e quais os parˆmetros corretos, vocˆ deve estar pronto para conectar da seguinte forma: a e shell> mysql -h servidor -u usuario -p Enter password: ******** Os asteriscos (********) representam sua senha; digite-a quando o mysql mostrar o prompt Enter password:. Se isto funcionar, vocˆ deve ver algumas informa¸oes iniciais seguidas de um prompt mysql> e c˜ shell> mysql -h host -u user -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 25338 to server version: 4.0.14-log Type ’help;’ or ’h’ for help. Type ’c’ to clear the buffer. mysql> O prompt lhe diz que o mysql est´ pronto para que vocˆ digite os comandos. a e
  • 204. 170 MySQL Technical Reference for Version 5.0.0-alpha Algumas instala¸˜es MySQL permitem aos usu´rios de se conectarem como usu´rios co a a anˆnimos ao servidor executando na m´quina local. Se isto ´ o caso na sua m´quina, vocˆ o a e a e deve conseguir conectar ao servidor chamando o mysql sem qualquer op¸˜o: ca shell> mysql Depois de vocˆ conectar com sucesso, vocˆ pode disconectar a qualquer hora digitando QUIT e e (ou q) no prompt mysql>: mysql> QUIT Bye No Unix, vocˆ tamb´m pode desconectar pressionando Control-D. e e A maioria dos exemplos nas se¸˜es seguintes assumem que vocˆ j´ est´ conectado ao servidor. co e a a Isto ´ indicado pelo prompt mysql>. e 3.2 Fazendo Consultas Tenha certeza que vocˆ est´ conectado ao servidor, como discutido na se¸˜o anterior. Isto e a ca feito, n˜o ser´ selecionado nenhum banco de dados para trabalhar, mas n˜o tem problemas. a a a Neste momento, ´ mais importante saber um pouco sobre como fazer consultas do que j´ e a criar tabelas, carregar dados para elas, e recuperar dados delas. Esta se¸˜o descreve os ca princ´ipios b´sicos da entrada de comandos, usando diversas consultas vocˆ pode tentar se a e familiarizar com o funcionamento do mysql. Aqui est´ um comando simples que solicita ao servidor seu n´mero de vers˜o e a data atual. a u a 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> Esta consulta ilustra v´rias coisas sobre o mysql: a • Um comando normalmente consiste de uma instru¸˜o SQL seguida por um ponto e ca v´ irgula. (Existem algumas exce¸˜es onde um ponto e v´ co irgula podem ser omitidos. QUIT mencionado anteriormente, ´ um deles. Saberemos de outros mais tarde.) e • Quando vocˆ emite um comando, o mysql o envia para o servidor para execu¸˜o e e ca mostra os resultados, depois imprime outro prompt mysql> para indicar que est´ pronto a para outro comando. • O mysql mostra a sa´ da consulta em forma tabular (linhas e colunas). A primeira ida linha cont´m r´tulos para as colunas. As linhas seguintes s˜o o resultado da consulta. e o a Normalmente, r´tulos de colunas s˜o os nomes das colunas que vocˆ busca das tabelas o a e do banco de dados. Se vocˆ est´ recuperando o valor de uma express˜o no lugar de e a a uma coluna de tabela (como no exemplo j´ visto), o mysql rotula a coluna usando a a pr´pria express˜o. o a
  • 205. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 171 • O mysql mostra quantas linhas foram retornadas e quanto tempo a consulta levou para executar, o que lhe d´ uma vaga id´ia da performance do servidor. Estes valores a e s˜o impreciso porque eles representam tempo de rel´gio (N˜o tempo de CPU ou de a o a m´quina), e porque eles s˜o afetados pelos fatores como a carga do servidor e latˆncia a a e de rede. (Para resumir, a linha “rows in set” n˜o ´ mostrada nos exemplos seguintes a e deste cap´ itulo.) Palavras Chave podem ser entradas em qualquer caso de letra. As seguintes consultas s˜o a equivalentes: mysql> SELECT VERSION(), CURRENT_DATE; mysql> select version(), current_date; mysql> SeLeCt vErSiOn(), current_DATE; Aqui est´ outra consulta. Ela demonstra que vocˆ pode usar o mysql como uma calculadora a e simples: mysql> SELECT SIN(PI()/4), (4+1)*5; +-------------+---------+ | SIN(PI()/4) | (4+1)*5 | +-------------+---------+ | 0.707107 | 25 | +-------------+---------+ As consultas mostradas at´ agora tˆm sido instru¸˜es relativamente pequenas, de uma linha. e e co Vocˆ pode tamb´m entrar com m´ltiplas instru¸˜es em uma unica linha. Basta finalizar e e u co ´ 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 | +---------------------+ Um comando n˜o necessita estar todo em uma unica linha, ent˜o comandos extensos que a ´ a necessitam de v´rias linhas n˜o s˜o um problema. O mysql determina onde sua instru¸˜o a a a ca termina atrav´s do ponto e v´ e irgula terminador, e n˜o pelo final da linha de entrada. (Em a 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.) Aqui est´ uma instru¸˜o simples usando m´ltiplas linhas: a ca u mysql> SELECT -> USER() -> , -> CURRENT_DATE; +--------------------+--------------+
  • 206. 172 MySQL Technical Reference for Version 5.0.0-alpha | USER() | CURRENT_DATE | +--------------------+--------------+ | joesmith@localhost | 1999-03-18 | +--------------------+--------------+ Neste exemplo, note como o prompt altera de mysql> para -> depois de vocˆ entrar a e primeira linha de uma consulta com m´ltiplas linhas. Isto ´ como o mysql indica que ainda u e n˜o achou uma instru¸˜o completa e est´ esperando pelo resto. O prompt ´ seu amigo, a ca a e porque ele fornece um retorno valioso. Se vocˆ usa este retorno, vocˆ sempre estar´ ciente e e a do que o mysql est´ esperando. a Se vocˆ decidir que n˜o deseja executar um comando que est´ no meio do processo de e a a entrada, cancele-o digitando c: mysql> SELECT -> USER() -> c mysql> Note o prompt aqui tamb´m. Ele troca para o mysql> depois de vocˆ digitar c, fornecendo e e retorno para indicar que o mysql est´ pronto para um novo comando. a A seguinte tabela mostra cada dos prompts que vocˆ pode ver e resume o que ele significa e sobre o estado em que o mysql se encontra: Prompt Significado mysql> Pronto para novo comando. -> Esperando pela pr´xima linha de comando com m´ltiplas linhas. o u ’> Esperando pela pr´xima linha, coletando uma string que comece com o uma aspas simples (‘’’). "> Esperando pela pr´xima linha, coletando uma string que comece com o aspas duplas (‘"’). ‘> Esperando pela pr´xima linha, coletando uma string que comece com o crase (‘‘’). ´ muito comum instru¸˜es multi-linhas ocorrerem por acidente quando vocˆ pretende pub- E co e licar 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() -> Se isto ocorrer com vocˆ (acha que entrou uma instru¸˜o mas a unica resposta ´ um prompt e ca ´ e ->), o mais prov´vel ´ que o mysql est´ esperando pelo ponto e v´ a e a irgula. Se vocˆ n˜o e a perceber o que o prompt est´ lhe dizendo, vocˆ pode parar por um tempo antes de entender a e o que precisa fazer. Entre com um ponto e v´ irgula para completar a instru¸˜o, e o mysql ca ir´ execut´-la: a a mysql> SELECT USER() -> ; +--------------------+ | USER() | +--------------------+ | joesmith@localhost | +--------------------+
  • 207. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 173 O prompt ’> e "> ocorrem durante a coleta de strings. No MySQL, vocˆ pode escrever e strings utilizando os caracteres ‘’’ ou ‘"’ (por exemplo, ’hello’ ou "goodbye"), e o mysql permite a entrada de strings que consomem m´ltiplas linhas. Quando vocˆ ver um prompt u e ’> ou ">, significa que vocˆ digitou uma linha contendo uma string que come¸a com um e c caracter de aspas ‘’’ ou ‘"’ mas ainda n˜o entrou com a aspas que termina a string. Isto a ´ bom se vocˆ realmente est´ entrando com uma string com m´ltiplas linhas, mas qual ´ e e a u e a probalidade disto acontecer ? N˜o muita. Geralmente, os prompts ’> e "> indicam que a vocˆ, por algum descuido, esqueceu algum caracter de aspas. Por exemplo: e mysql> SELECT * FROM minha_tabela WHERE nome = "Smith AND idade < 30; "> Se vocˆ entrar esta senten¸a SELECT, apertar ENTER e esperar pelo resultado, nada ir´ e c a acontecer. Em vez de se perguntar o porquˆ desta query demorar tanto tempo, perceba a e pista fornecida pelo prompt ">. Ele lhe diz que o mysql espera pelo resto de uma string n˜o terminada. (Vocˆ ve o erro na declara¸˜o? Falta a segunda aspas na string "Smith.) a e ca O que fazer neste ponto ? A coisa mais simples ´ cancelar o comando. Entretanto, vocˆ e e n˜o pode simplesmente digitar c neste caso, porque o mysql o intrerpreta como parte da a string que est´ coletando! Digite o caracter de aspas para fechar (ent˜o o mysql sabe que a a vocˆ fechou a string), ent˜o digite c: e a mysql> SELECT * FROM minha_tabela WHERE nome = "Smith AND idade < 30; "> "c mysql> O prompt volta para mysql>, indicando que o mysql est´ pronto para um novo comando. a O prompt ‘> ´ similar aos prompts ’> e ">, mas indica que vocˆ come¸ou mas n˜o completou e e c a um identificados citado com o sinal de crase. ´ E importante saber o que os prompts ’>, "> e ‘> significam, porque se vocˆ entrar sem e querer com uma string sem termina¸˜o, quaisquer linhas seguintes que forem digitadas ca ser˜o ignoradas pelo mysql — incluindo uma linha contendo QUIT! Isto pode ser um pouco a confuso, especialmente se vocˆ n˜o sabe que vocˆ precisa fornecer as aspas finais antes poder e a e cancelar o comando atual. 3.3 Cria¸˜o e Utiliza¸˜o de um Banco de Dados ca ca Agora que vocˆ j´ sabe como entrar com os comandos, ´ hora de acessar um banco de dados. e a e Suponha que vocˆ tenha diversos animais de estima¸˜o em sua casa (menagerie) e vocˆ e ca e gostaria de ter o registro de v´rios tipos de informa¸˜es sobre eles. Vocˆ pode fazer isto a co e criando tabelas para armazenar seus dados e carreg´-los com a informa¸˜o desejada. Depois a ca vocˆ pode responder diferentes tipos de quest˜es sobre seus animais recuperando dados das e o tabelas. Esta se¸˜o mostrar´ como: ca a • 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
  • 208. 174 MySQL Technical Reference for Version 5.0.0-alpha O banco de dados menagerie ser´ simples (deliberadamente), mas n˜o ´ dif´ a a e icil pensar em situa¸˜es na vida real em que um tipo similar de banco de dados pode co ser usado. Por exemplo, um banco de dados deste tipo pode ser usado por um fazendeiro para gerenciar seu estoque de animais, ou por um veterin´rio para a gerenciar registros de seus pacientes. Uma distribui¸˜o do menagerie contendo ca algumas das consultas e dados de exemplos usados nas se¸˜es seguintes podem ser co obtidas do site Web do MySQL. Est˜o dispon´ a iveis tanto no formato tar comprimido (http://www.mysql.com/Downloads/Contrib/Examples/menagerie.tar.gz) como no formato Zip (http://www.mysql.com/Downloads/Contrib/Examples/menagerie.zip). Utilize a instru¸˜o SHOW para saber quais bancos de dados existem atualmente no servidor: ca mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | | tmp | +----------+ A lista de bancos de dados provavelmente ser´ diferente na sua m´quina, mas os bancos de a a dados mysql e test provavelmente estar˜o entre eles. O banco de dados mysql ´ necess´rio a e a porque ele descreve privil´gios de acessos de usu´rios. O banco de dados test ´ geralamente e a e fornecido como um espa¸o para que os usu´rios possam fazer testes. c a Note que vocˆ n˜o pode ver todos os banco de dados se vocˆ n˜i tiver o privil´gio SHOW e a e a e DATABASES. Veja Se¸˜o 4.4.1 [GRANT], P´gina 255. ca a Se o banco de dados test existir, tente acess´-lo: a mysql> USE test Database changed Perceba que o USE, como o QUIT, n˜o necessitam de um ponto e v´ a irgula. (Vocˆ pode e terminar tais declara¸˜es com uma ponto e v´ co irgula se gostar; isto n˜o importa) A instru¸˜o a ca 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 e seguem mas qualquer coisa que vocˆ criar neste banco de dados pode ser removido por e qualquer um com acesso a ele. Por esta raz˜o, vocˆ provavelmente deve pedir permiss˜o a e a ao seu administrador MySQL para usar um banco de dados pr´prio. Suponha que vocˆ o o e chame de menagerie. O administrador precisar executar um comando como este: mysql> GRANT ALL ON menagerie.* TO ’your_mysql_name’@’your_client_host’; onde seu_usu´rio_mysql ´ o nome do usu´rio MySQL atribuido a vocˆ e your_client_ a e a e host ´ a m´quina da qual vocˆ se conecta ao servidor. e a e 3.3.1 Criando e Selecionando um Banco de Dados Se o administrador criar seu banco de dados quando configurar as suas permiss˜es, vocˆ o e pode come¸ar a us´-lo. Sen˜o, vocˆ mesmo precisa cri´-lo: c a a e a
  • 209. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 175 mysql> CREATE DATABASE menagerie; No Unix, nomes de bancos de dados s˜o caso sensitivo (ao contr´rio das palavras chave a a SQL), portanto vocˆ deve sempre fazer referˆncia ao seu banco de dados como menagerie e e e n˜o Menagerie, MENAGERIE ou outra varia¸˜o. Isto tamb´m ´ verdade para nomes de a ca e e tabelas. (No Windows, esta restri¸˜o n˜o se aplica, entiretanto vocˆ deve referenciar os ca a e 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 Seu banco de dados necessita ser criado somente uma unica vez, mas vocˆ deve selecion´-lo ´ e a para o uso cada vez que vocˆ iniciar uma se¸˜o mysql. Vocˆ pode fazer isso usando a e ca e instru¸˜o USE como visto no exemplo. Uma forma alternativa ´ selecionar o banco de dados ca e na linha de comando quando vocˆ chamar o mysql. Apenas especifique seu nome depois de e qualquer parˆmetro de conex˜o que vocˆ pode precisar fornecer. Por exemplo: a a e shell> mysql -h servidor -u usuario -p menagerie Enter password: ******** Perceba que menagerie n˜o ´ sua senha no comando mostrado. Se vocˆ precisar passar sua a e e senha na linha de comando depois da op¸˜o -p, vocˆ deve fazˆ-lo sem usar espa¸os (por ca e e c exemplo, -pminhasenha e n˜o como em -p minhasenha). Entretando, colocando sua senha a na linha de comando n˜o ´ recomendado, porque isto exp˜e sua senha permitindo que outro a e o usu´rio utilize a sua m´quina. a a 3.3.2 Criando uma Tabela Criar o banco de dados ´ a parte f´cil, mas neste ponto ele est´ vazio, como o SHOW TABLES e a a 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 vocˆ precisar´ e que colunas estar˜o em cada uma delas. e a a Vocˆ ir´ precisar de uma tabela para guardar um registro para cada um de seus animais e a de estima¸˜o. Esta tabela pode ser chamada pet, e ela deve conter, pelo menos, o nome ca de cada animal. Como o nome por si s´ n˜o ´ muito interessante, a tabela dever´ conter o a e a outras informa¸˜es. Por exemplo, se mais de uma pessoa na sua fam´ tamb´m tem co ilia e animais, vocˆ pode desejar listar cada dono. Vocˆ pode tamb´m desejargravar algumas e e e informa¸˜es descritivas b´sicas como esp´cie e sexo. co a e Que tal a idade? Pode ser do interesse, mas n˜o ´ uma boa coisa para se armazenar em um a e banco de dados. A idade muda ` medida em que o tempo passa, o que significa que vocˆ a e sempre ter´ de atualizar seus registros. Em vez disso, ´ melhor armazenar um valor fixo a e como a data de nascimento. Ent˜o, sempre que vocˆ precisar da idade, basta vocˆ calcul´-la a e e a como a diferen¸a entre a data atual e a data de anivers´rio. O MySQL fornece fun¸˜es para c a co fazer aritm´tica de datas, ent˜o isto n˜o ´ dif´ e a a e icil. Armazenando datas de anivers´rio no a lugar da idade tamb´m oferece outras vantagens: e
  • 210. 176 MySQL Technical Reference for Version 5.0.0-alpha • Vocˆ pode usar o banco de dados para tarefas como gerar lembretes para anivers´rios e a que est˜o chegando. (Se vocˆ pensa que este tipo de query ´ algo bobo, perceba que a e e ´ a mesma quest˜o que vocˆ perguntar no contexto de um banco de dados comercial e a e para identificar clientes para quais vocˆ precisar´ enviar cart˜o de anivers´rio, para um e a a a toque pessoal assistido pelo computador.) • Vocˆ pode calcular a idade em rela¸˜o a outras datas diferente da data atual. Por e ca exemplo, se vocˆ armazenar a data da morte no banco de dados, vocˆ poder´ facilmente e e a calcular qual a idade que o bicho tinha quando morreu. Vocˆ provavelmente pode pensar em outros tipos de informa¸˜es que poder˜o ser uteis e co a ´ na tabela pet, mas as identificadas at´ o momento s˜o suficientes por agora: nome(name), e a dono(owner), esp´cie(species), sexo(sex), data de nascimento(birth) e data da morte(death). e Utilize a sente¸a CREATE TABLE para especificar o layout de sua tabela: c mysql> CREATE TABLE pet (nome VARCHAR(20), owner VARCHAR(20), -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE); VARCHAR ´ uma boa escolha para os campos name, owner, e species porque os valores da e coluna s˜o de tamanho vari´vel. Os tamanhos destas colunas n˜o precisam necess´riamente a a a a de ser os mesmos e n˜o precisam ser 20. Vocˆ pode escolher qualquer tamanho de 1 a 255, a e o que vocˆ achar melhor. (Se vocˆ n˜o fizer uma boa escolha e depois precisar de um campo e e a maior, o MySQL fornece o comando ALTER TABLE.) O sexo dos animais podem ser representados em v´rias formas, por exemplo, "m" e "f" ou a ´ mesmo "macho" e "f^mea". E mais simples usar os caracteres "m" e "f". e O uso do tipo de dados DATE para as colunas birth e death s˜o obviamente a melhor a 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 | +---------------------+ Para verificar se sua tabela foi criada da forma que vocˆ esperava, utilize a instru¸˜o e ca 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 | | +---------+-------------+------+-----+---------+-------+ Vocˆ pode usar DESCRIBE a qualquer hora, por exemplo, se vocˆ esquecer os nomes das e e colunas na sua tabela ou de que tipos elas tˆm. e
  • 211. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 177 3.3.3 Carregando dados em uma tabela Depois de criar sua tabela, vocˆ precisar´ povo´-la. As instru¸˜es LOAD DATA e INSERT s˜o e a a co a uteis para isto. ´ Suponha que seu registro de animais possa ser descrito como ´ abaixo: (Observe que o e 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 1979-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 Como vocˆ est´ come¸ando com uma tabela vazia, uma forma simples de povo´-la ´ criar e a c a e um arquivo texto contendo uma linha para cada um de seus animais, e depois carregar o conte´do do arquivo para a tabela com uma simples instru¸˜o. u ca Vocˆ pode criar um arquivo texto ‘pet.txt’ contendo um registro por linha, com valores e separado por tabula¸˜es e na mesma ordem em que as colunas foram listadas na instru¸˜o co ca CREATE TABLE. Para valores em falta (como sexo desconhecido ou data da morte para animais que ainda est˜o vivos), vocˆ pode usar valores NULL. Para represent´-lo em seu a e a ´ arquivo texto, use N (barra invertidam N maiusculo). Por exemplo, o registro para Whistler the bird podem parecer com isto (onde o espa¸o em branco entre os valores ´ um simples c e caractere de tabula¸˜o): ca name owner species sex birth death 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; Vocˆ pode especificar o valor do separador de colunas e o marcador de final de linha explici- e tamente na instru¸˜o LOAD DATA se vocˆ desejar. Mas os valores omitidos s˜o suficientes ca e a para a instru¸˜o ler o arquivo ‘pet.txt’ corretamente. ca Se a instru¸˜o falhar, ´ desej´vel que a sua instala¸˜o do MySQL n˜o tenha a capacidade ca e a ca a do arquivo local habilitada por padr˜o. Veja Se¸˜o 4.3.4 [LOAD DATA LOCAL], P´gina 232 a ca a para informa¸˜es sobre como alterar isto. co Quando vocˆ desejar adicionar novos registros um a um, a instru¸˜o INSERT ´ usada. Na e ca e sua forma mais simples, vocˆ fornece valores para cada coluna, na ordem em que as colunas e foram listadas na instru¸˜o CREATE TABLE. Suponha que Diane tenha um novo hamster ca chamado Puffball. Vocˆ pode adicionar um registro utilizando uma instru¸˜o INSERT desta e ca forma: mysql> INSERT INTO pet -> VALUES (’Puffball’,’Diane’,’hamster’,’f’,’1999-03-30’,NULL);
  • 212. 178 MySQL Technical Reference for Version 5.0.0-alpha Perceba que os valores de string e datas s˜o especificados aqui como strings com aspas. a Com o INSERT vocˆ tamb´m pode inserir NULL diretamente para representar um valor em e e falta. N˜o pode ser usado N como vocˆ fez com LOAD DATA. a e A partir deste exemplo, vocˆ dever´ perceber que existem v´rias outras formas envolvidas e a a para carregar seus registros inicialmente utilizando diversas instru¸˜es INSERT do que uma co simples instru¸˜o LOAD DATA. ca 3.3.4 Recuperando Informa¸oes de uma Tabela c˜ A instru¸˜o SELECT ´ usada para recuperar informa¸˜es de uma tabela. A forma geral da ca e co instru¸˜o ´: ca e SELECT o_que_mostrar FROM de_qual_tabela WHERE condi¸~es_para_satisfazer; co 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 e os dados. A cl´usula WHERE ´ opcional. Se estiver presente, condi¸~es_para_satisfazer a e co especificam as condi¸˜es que os registros devem satisfazer para fazer parte do resultado. co 3.3.4.1 Selecionando Todos os Dados A forma mais simples do SELECT recuperar tudo de uma tabela: 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 | 1979-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 | +----------+--------+---------+------+------------+------------+ Esta forma do SELECT ´ util se vocˆ deseja ver sua tabela inteira como agora, depois de e ´ e vocˆ acabar de carreg´-la com os dados iniciais. Por exempo, vocˆ pode pensar que a data e a e de nascimento do Bowser n˜o est´ correta. Consultando seus pap´is originais de pedigree, a a e descobriu que o ano correto do nascimento deve ser 1989, n˜o 1979. a 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: mysql> DELETE FROM pet; mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
  • 213. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 179 Entretanto, se vocˆ fizer isto, vocˆ tamb´m deve refazer a entrada para Puffball. e e e • Corrigir somente o registro errado com uma instru¸˜o UPDATE: ca mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser"; O UPDATE altera apenas o registro em quest˜o e n˜o exige que vocˆ recarregue a tabela. a a e 3.3.4.2 Selecionando Registros Espec´ ificos Como foi mostrado na se¸˜o anterior, ´ f´cil recuperar uma tabela inteira. Apenas omita ca e a a cl´usula WHERE da instru¸˜o SELECT. Mas normalmente vocˆ n˜o quer ver toda a tabela, a ca e a particularmente quando a tabela ficar grande. Em vez disso, vocˆ estar´ mais interessado em e a ter a resposta de uma quest˜o em particular, no qual vocˆ especifica detalhes da informa¸˜o a e ca que deseja. Vamos ver algumas consultas de sele¸˜o nos termos das quest˜es sobre seus ca o animais. Vocˆ pode selecionar apenas registros espec´ e ificos da sua tabela. Por exemplo, se vocˆ deseja e verificar a altera¸˜o que fez na data de nascimento do Bowser, selecione o registro desta ca 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 1979. ida a Compara¸˜es de strings normalmente s˜o caso insensitivo, ent˜o vocˆ pode especificar o co a a e nome como "bowser", "BOWSER", etc. O resultado da pesquisa ser´ o mesmo. a Vocˆ pode especificar condi¸˜es em qualquer coluna, n˜o apenas no name. Por exemplo, e co a se vocˆ deseja saber quais foram os animais que nasceram depois de 1998, teste o campo e 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 | +----------+-------+---------+------+------------+-------+ Vocˆ pode combinar condi¸˜es, por exemplo, para encontrar cadelas (dog/f): e co mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+ A consulta anterior utiliza o operador l´gico AND (e). Existe tamb´m um operador OR (ou): o e
  • 214. 180 MySQL Technical Reference for Version 5.0.0-alpha 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 | +----------+-------+---------+------+------------+-------+ AND e OR podem ser misturados, embora AND tem maior precedˆncia que OR. Se vocˆ usar e e ambos os operadores, ´ uma ´tima id´ia usar parˆnteses para indicar explicitamente quais e o e e condi¸˜es devem ser agrupadas: co 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 Se vocˆ n˜o desejar ver todo o registro de sua tabela, especifique as colunas em que vocˆ e a e ´ estiver interessado, separado por virgulas. Por exemplo, se vocˆ deseja saber quando seus e animais nasceram, selecione as colunas name e birth: mysql> SELECT name, birth FROM pet; +----------+------------+ | name | birth | +----------+------------+ | 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 | +----------+------------+ Para saber quem s˜o os donos dos animais, use esta consulta: a mysql> SELECT owner FROM pet; +--------+ | owner | +--------+ | Harold |
  • 215. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 181 | 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 | +--------+ Vocˆ pode usar uma cl´usula WHERE para combinar sele¸˜o de registros com sele¸˜o de e a ca ca 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 | | Buffy | dog | 1989-05-13 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 | +--------+---------+------------+ 3.3.4.4 Ordenando Registros Vocˆ deve ter percebido nos exemplos anteriores que os registros retornados n˜o s˜o mostra- e a a dos de forma ordenada. Normalmente ´ mais f´cil examinar a saida e a ´ da consulta quando os registros s˜o ordenados com algum sentido. Para ordenar o resultado, utilize uma cl´usula a a ORDER BY. Aqui est´ o dia de nascimento dos animais, ordenado por data: a mysql> SELECT name, birth FROM pet ORDER BY birth; +----------+------------+
  • 216. 182 MySQL Technical Reference for Version 5.0.0-alpha | 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 | +----------+------------+ Em colunas de tipo de caracter, ordenai¸˜o como qualquer outra opera¸˜o de compara¸˜o ca ca ca ´ normalmente realizada no modo caso insensitivo. Isto significa que a ordem ser´ in- e a definida para colunas que s˜o idˆnticas exceto quanto ao caso da letra. Vocˆ pode for¸ar a e e c uma ordena¸˜o em caso senitivo para uma coluna usando a coer¸˜o BINARY: ORDER BY ca ca BINARY(campo). A ordena¸˜o padr˜o ´ crescente, com os valores menores em primeiro. Para ordena¸˜o na ca a e ca 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 | +----------+------------+ Vocˆ pode ordenar por m´ltiplas colunas e vocˆ pode classificar colunas em dire¸˜es difer- e u e co entes. Por exemplo, para ordenar o tipo de animal em ordem crescente, depois por dia de nascimento dentro do tipo de animal em ordem decrescente (com os mais novos primeiro), utilize a seguinte consulta: mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC; +----------+---------+------------+ | name | species | birth | +----------+---------+------------+ | Chirpy | bird | 1998-09-11 | | Whistler | bird | 1997-12-09 | | Claws | cat | 1994-03-17 | | Fluffy | cat | 1993-02-04 |
  • 217. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 183 | 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); ela n˜o afeta a ordena¸˜o da coluna species. a ca 3.3.4.5 C´lculo de Datas a O MySQL fornece v´rias fun¸˜es que vocˆ pode usar para realizar c´lculos em datas, por a co e a exemplo, para calcular idades ou extrair partes de datas. Para determinar quantos anos cada um do seus animais tem, compute a diferen¸a do ano c 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 e animal, a data de nascimento, a data atual e a idade em anos. mysql> SELECT name, birth, CURDATE(), -> (YEAR(CURDATE())-YEAR(birth)) -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) -> AS age -> FROM pet; +----------+------------+------------+------+ | name | birth | CURDATE() | age | +----------+------------+------------+------+ | Fluffy | 1993-02-04 | 2003-08-19 | 10 | | Claws | 1994-03-17 | 2003-08-19 | 9 | | Buffy | 1989-05-13 | 2003-08-19 | 14 | | Fang | 1990-08-27 | 2003-08-19 | 12 | | Bowser | 1989-08-31 | 2003-08-19 | 13 | | Chirpy | 1998-09-11 | 2003-08-19 | 4 | | Whistler | 1997-12-09 | 2003-08-19 | 5 | | Slim | 1996-04-29 | 2003-08-19 | 7 | | Puffball | 1999-03-30 | 2003-08-19 | 4 | +----------+------------+------------+------+ Aqui, YEAR() separa a parte do ano de uma data e RIGHT() separa os cinco caracteres mais a direita que representam a parte da data MM-DD. A parte da express˜o que compara os a valores MM-DD resulta em 1 ou 0, o qual ajusta a diferen¸a do ano um ano abaixo se CURDATE c ocorrer mais cedo, no ano, que birth. A express˜o completa ´ um tanto deselegante, ent˜o a e a um apelido (age) ´ usado para obter uma sa´ mais significativa. e ida A consulta funciona, mas o resultado pode ser mais compreens´ ivel se os registros forem apresentados em alguma ordem. Isto pode ser feito adicionando uma cl´usula ORDER BY a ´ pelo nome: name para ordenar a saida mysql> SELECT name, birth, CURDATE(),
  • 218. 184 MySQL Technical Reference for Version 5.0.0-alpha -> (YEAR(CURDATE())-YEAR(birth)) -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) -> AS age -> FROM pet ORDER BY name; +----------+------------+------------+------+ | name | birth | CURDATE() | age | +----------+------------+------------+------+ | Bowser | 1989-08-31 | 2003-08-19 | 13 | | Buffy | 1989-05-13 | 2003-08-19 | 14 | | Chirpy | 1998-09-11 | 2003-08-19 | 4 | | Claws | 1994-03-17 | 2003-08-19 | 9 | | Fang | 1990-08-27 | 2003-08-19 | 12 | | Fluffy | 1993-02-04 | 2003-08-19 | 10 | | Puffball | 1999-03-30 | 2003-08-19 | 4 | | Slim | 1996-04-29 | 2003-08-19 | 7 | | Whistler | 1997-12-09 | 2003-08-19 | 5 | +----------+------------+------------+------+ 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, CURDATE(), -> (YEAR(CURDATE())-YEAR(birth)) -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) -> AS age -> FROM pet ORDER BY age; +----------+------------+------------+------+ | name | birth | CURDATE() | age | +----------+------------+------------+------+ | Chirpy | 1998-09-11 | 2003-08-19 | 4 | | Puffball | 1999-03-30 | 2003-08-19 | 4 | | Whistler | 1997-12-09 | 2003-08-19 | 5 | | Slim | 1996-04-29 | 2003-08-19 | 7 | | Claws | 1994-03-17 | 2003-08-19 | 9 | | Fluffy | 1993-02-04 | 2003-08-19 | 10 | | Fang | 1990-08-27 | 2003-08-19 | 12 | | Bowser | 1989-08-31 | 2003-08-19 | 13 | | Buffy | 1989-05-13 | 2003-08-19 | 14 | +----------+------------+------------+------+ Uma consulta similar pode ser usada para determinar a idade na morte para animais que morreram. Para determinar quais s˜o os animais, confira se o valor de death n˜o ´ NULL. a a e Depois para estes com valores n˜o-NULL, compute a diferen¸a entre os valores dos campos a c 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; +--------+------------+------------+------+ | name | birth | death | age |
  • 219. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 185 +--------+------------+------------+------+ | Bowser | 1989-08-31 | 1995-07-29 | 5 | +--------+------------+------------+------+ A consulta usa death IS NOT NULL em vez de death != NULL porque NULL ´ um valor es- e pecial que n˜o pode ser comparada usando operadores comuns de compara¸˜o. Isto ser´ a ca a explicado depois. Veja Se¸˜o 3.3.4.6 [Working with NULL], P´gina 186. ca a E se vocˆ desejar saber quais animais fazem anivers´rio no pr´ximo mˆs? Para este tipo e a o e de c´lculo, ano e dia s˜o irrelevantes; vocˆ simplesmente deseja extrair a parte do mˆs da a a e e coluna birth. O MySQL fornece diversas fun¸˜es para extrair partes da data, como em co YEAR(), MONTH() e DAYOFMONTH(). MONTH ´ a fun¸˜o apropriada aqui. Para ver como ela e ca 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´ ivers´rio no pr´ximo mˆs tamb´m ´ f´cil. Suponha que o mˆs a o e e e a e atual ´ abril. Ent˜o o valor do mˆs ´ 4 e vocˆ procura por animais nascidos em Maio (mˆs e a e e e e 5) assim: mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5; +-------+------------+ | name | birth | +-------+------------+ | Buffy | 1989-05-13 | +-------+------------+ Existe uma pequena complica¸˜o se o mˆs atual ´ Dezembro, ´ claro. Vocˆ n˜o pode apenas ca e e e e a adicionar um para o n´mero do mˆs (12) e procurar por animais nascidos no mˆs 13, porque u e e n˜o existe tal mˆs. O certo seria procurar por animais nascidos em Janeiro (mˆs 1). a e e Vocˆ pode tamb´m escrever uma consulta para que funcione sem importar qual ´ o mˆs e e e e atual. Assim vocˆ n˜o tˆm quee usar um n´mero de mˆs em particular na consulta. DATE_ e a e u e ADD() permite adicionar um intervalo de tempo para uma data fornecida. Se vocˆ adicionar e um mˆs para o valor de CURDATE, ent˜o extrair a parte do mˆs com MONTH(), o resultado ´ e a e e o mˆs no qual vocˆ deseja procurar por anivers´rios: e e a mysql> SELECT name, birth FROM pet -> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(), INTERVAL 1 MONTH));
  • 220. 186 MySQL Technical Reference for Version 5.0.0-alpha Uma maneira diferente para realizar a mesma tarefa ´ adicionar 1 para obter o mˆs seguinte e e ao atual (depois de usar a fun¸˜o m´dulo (MOD) para o valor do mˆs retornar 0 se ele for ca o e 12): mysql> SELECT name, birth FROM pet -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1; Perceba que MONTH retorna um n´mero entre 1 e 12. E MOD(alguma_coisa,12) retorna um u 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) O valor NULL pode ser supreendente at´ vocˆ us´-lo. Conceitualmente, NULL significa valor e e a em falta ou valor desconhecido e ´ tratado de uma forma diferente de outros valores. Para e testar o valor NULL, vocˆ n˜o pode usar os operadores de compara¸˜es aritm´ticas como em e a co e =, <, ou !=. Para demonstrar para vocˆ mesmo, tente executar a seguinte consulta: e mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL; +----------+-----------+----------+----------+ | 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL | +----------+-----------+----------+----------+ | NULL | NULL | NULL | NULL | +----------+-----------+----------+----------+ Claramente vocˆ n˜o obter´ resultados significativos destas compara¸˜es. Utilize os oper- e a a co 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 | +-----------+---------------+ No MySQL, 0 ou NULL significa falso e o resto ´ verdadeiro. O valor verdadeiro por o padr˜o e a em uma opera¸˜o booleana ´ 1. ca e Este tratamento especial de NULL ´ porque, na se¸˜o anterior, foi necess´rio determinar e ca a quais animais n˜o estavam mais vivos usando death IS NOT NULL no lugar de death <> a NULL. Dois valores NULL s˜o considerados como iguais em um GROUP BY. a Ao fazer um ORDER BY, valores NULL s˜o apresentados primeiro se vocˆ fizer ORDER BY ... a e ASC e por ultimo se vocˆ fizer ORDER BY ... DESC. ´ e Note que o MySQL 4.0.2 a 4.0.10 sempre ordenam, incorretamente, valores NULL em primeiro independente da ordem escolhida. 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 ca de padr˜es baseado nas express˜es regulares extendidas similares `quelas usadas pelos o o a utilit´rios Unix como o vi, grep e sed. a
  • 221. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 187 A combina¸˜o de padr˜es SQL lhe permite vocˆ usar _ para coincidir qualquer caractere ca o e simples e % para coincidir um n´mero arbitr´rio de caracteres (incluindo zero caracter). u a No MySQL, padr˜es SQL s˜o caso insensitivo por padr˜o. Alguns exemplos s˜o vistos o a a a abaixo. Perceba que vocˆ n˜o usa = ou != quando usar padr˜es SQL; use os operadores de e a o compara¸˜o LIKE ou NOT LIKE neste caso. ca Para encontrar nomes come¸ando com ‘b’: c 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 cinco instˆncias do carac- a ter ‘_’: 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 | +-------+--------+---------+------+------------+-------+ O outro tipo de combina¸˜o de padr˜es fornecido pelo MySQL usa express˜es regulares ca o o extendidas. Quando vocˆ testa por uma combina¸˜o para este tipo de padr˜o, utilize os e ca a operadores REGEXP e NOT REGEXP (ou RLIKE e NOT RLIKE, que s˜o sinˆnimos). a o Algumas caracter´ isticas das express˜es regulares extendidas s˜o: o a • ‘.’ combina qualquer caractere unico ´
  • 222. 188 MySQL Technical Reference for Version 5.0.0-alpha • Uma classe de caracteres ‘[...]’ combina qualquer caractere que consta dentro dos colchetes. Por exemplo, ‘[abc]’ combina com ‘a’, ‘b’, ou ‘c’. Para nomear uma sequˆncia de caracteres utilize um tra¸o. ‘[a-z]’ combina com qualquer letra e ‘[0-9]’ e c combina com qualquer d´ igito. • ‘*’ combina com nenhuma ou mais instˆncias de sua precedˆncia. Por exemplo, ‘x*’ a e combina com qualquer n´mero de caracteres ‘x’, ‘[0-9]*’ combina com qualquer u n´mero de d´ u igitos e ‘.*’ combina com qualquer n´mero de qualquer coisa. u • Um padr˜o REGEXP casa com sucesso se ele ocorre em algum lugar no valor sendo a testado. (Ele difere do padr˜o LIKE, que s´ obtem suceeso se eles combinarem com a o todo o valor.) • Para fazer com que um padr˜o deva combinar com o come¸o ou o fim de um valor a c sendo testado, utilize ‘^’ no come¸o ou ‘$’ no final do padr˜o. c a Para demonstrar como express˜es regulares extendidas funcionam, as consultas com LIKE o mostradas acima foram reescritas abaixo usando REGEXP. Para encontrar nomes come¸ando com ‘b’, utilize ‘^’ para combinar com o come¸o do nome: c c 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 | +--------+--------+---------+------+------------+------------+ Antes da vers˜o 3.23.4 do MySQL, REGEXP era caso sensitivo, e a consulta anterior n˜o iria a a retornar nenhum registro. Neste caso, para combinar letras ‘b’ mai´sculas e min´sculas, u u utilize esta consulta: mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]"; A partir do MySQL 3.23.4, se vocˆ realmente deseja for¸ar uma compara¸˜o REGEXP com e c ca caso sensitivo, utilize a palavra-chave BINARY para tornar uma das strings em uma string bin´rias. Esta consulta ir´ combinar somente com ‘b’s min´sculos no come¸o de um nome: a a u c 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 | +--------+--------+---------+------+------------+-------+ Para encontrar nomes contendo um ‘w’, utilize esta consulta: mysql> SELECT * FROM pet WHERE name REGEXP "w"; +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+
  • 223. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 189 | 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 | +----------+-------+---------+------+------------+------------+ Como uma express˜o regular extendida encontra padr˜es coincidentes se eles ocorrem em a o qualquer lugar no valor comparado, n˜o ´ necess´rio utiliar, na consulta anterior, nenhum a e a metacaracter em nenhum dos lados do padr˜o para fazˆ-lo coincidir com todo o valor, como a e seria feito se fosse utilizado o padr˜o SQL. a Para encontrar nomes contendo exatamente cinco caracteres, utilize ‘^’ e ‘$’ para combinar com o come¸o e fim do nome e cinco instˆncias de ‘.’ entre eles. c a 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 | +-------+--------+---------+------+------------+-------+ Vocˆ pode tamb´m escrever a consulta anterior utilizando o operador ‘{n}’ “repete-n-vezes”: e e 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 Bancos de dados normalmente s˜o usados para responder a perguntas, “Qual a frequˆncia a e que certo tipo de dados ocorre em uma tabela?” Por exemplo, vocˆ deve querer saber e quantos animais tem, ou quantos animais cada dono tem, ou vocˆ pode querer fazer v´rios e a outros tipos de opera¸˜es de censo com seus animais. co Contando o n´mero total de animais que vocˆ tem ´ a mesma quest˜o como em “Quantos u e e a registros existem na tabela pet?” porque existe um registro por animal. COUNT(*) conta o n´mero de resultados n˜o-NULL, portanto a pesquisa para contar seus animais parecer´ u a a com isto: mysql> SELECT COUNT(*) FROM pet; +----------+ | COUNT(*) | +----------+ | 9 | +----------+ Logo, vocˆ recuperar´ os nomes das pessoas que possuam animais. Vocˆ pode usar COUNT() e a e se vocˆ desejar encontrar quantos animais cada dono possui: e
  • 224. 190 MySQL Technical Reference for Version 5.0.0-alpha mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; +--------+----------+ | owner | COUNT(*) | +--------+----------+ | Benny | 2 | | Diane | 2 | | Gwen | 3 | | Harold | 2 | +--------+----------+ Perceba o uso de GROUP BY para agrupar todos os registros para cada owner (dono). Sem ele, vocˆ teria uma mensagem de erro: e mysql> SELECT owner, COUNT(*) FROM pet; ERROR 1140: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause COUNT() e GROUP BY s˜o uteis para personalizar seus dados de diversas maneiras. Os a ´ seguintes exemplos mostram diferentes maneiras para realizar opera¸˜es de censo nos ani- co mais. N´mero de animais por esp´cie: u e mysql> SELECT species, COUNT(*) FROM pet GROUP BY species; +---------+----------+ | species | COUNT(*) | +---------+----------+ | bird | 2 | | cat | 2 | | dog | 3 | | hamster | 1 | | snake | 1 | +---------+----------+ N´mero de animais por sexo: u mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex; +------+----------+ | sex | COUNT(*) | +------+----------+ | NULL | 1 | | f | 4 | | m | 4 | +------+----------+ (Nesta sa´ida, NULL indica que o sexo ´ desconhecido.) e N´mero de animais combinando esp´cie e sexo: u e mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | NULL | 1 | | bird | f | 1 |
  • 225. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 191 | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+ N˜o ´ necess´rio selecionar uma tabela inteira quando estiver usando COUNT(). Por exemplo, a e a a consulta anterior, quando realizada apenas procurando por cachorros e gatos, se parece com isto: 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 | +---------+------+----------+ Ou se vocˆ desejar saber o n´mero de animais por sexo somente de animais com sexo e u 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 | +---------+------+----------+ 3.3.4.9 Utilizando M´ ltiplas Tabelas u A tabela pet mant´m informa¸˜es de quais animais vocˆ tem. Se vocˆ deseja gravar outras e co e e informa¸˜es sobre eles como eventos em suas vidas, tais como visitas ao veterin´rio ou sobre co a suas crias, vocˆ necessitar´ de outra tabela. Como esta tabela deve se parecer ? Ela precisa: e a • 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
  • 226. 192 MySQL Technical Reference for Version 5.0.0-alpha • Um campo para descrever o evento. • Um campo com o tipo de evento, se vocˆ desejar classific´-los por categoria. e a Dadas estas considera¸˜es, a instru¸˜o CREATE TABLE para a tabela event deve se parecer co ca com isto: mysql> CREATE TABLE event (name VARCHAR(20), date DATE, -> type VARCHAR(15), remark VARCHAR(255)); Como na tabela pet, ´ mais f´cil carregar os registros iniciais criando um arquivo texto e a delimitado por tabula¸˜es contendo a informa¸˜o: co ca name date type remark 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 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; Baseado no que vocˆ j´ aprendeu com as consultas realizadas na tabela pet, vocˆ deve estar e a e apto para realizar pesquisas na tabela event; os princ´ipios s˜o o mesmo. Mas quando a a tabela event, sozinha, ´ insuficiente para responder `s suas quest˜es? e a o Suppose you want to find out the ages at which each pet had its litters. We saw earlier how to calculate ages from two dates. The litter date of the mother is in the event table, but to calculate her age on that date you need her birth date, which is stored in the pet table. This means the query requires both tables: Suponha que vocˆ deseje descobrir as idades de cada animal quando eles tiveram cria. N´s e o vemos logo que ´ poss´ calcular a idade a partir das duas datas. A idade dos filhotes est´ e ivel a na tabela event, mas para calcular a idade da m˜e, vocˆ precisar´ da data de nascimento a e a dela, que est´ armazenado na tabela pet. Isto significa que vocˆ precisar´ das duas tabelas a e a para a consulta: mysql> SELECT pet.name, -> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age, -> remark -> FROM pet, event -> WHERE pet.name = event.name AND type = "litter"; +--------+------+-----------------------------+ | name | age | remark | +--------+------+-----------------------------+ | Fluffy | 2 | 4 kittens, 3 female, 1 male | | Buffy | 4 | 5 puppies, 2 female, 3 male | | Buffy | 5 | 3 puppies, 3 female |
  • 227. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 193 +--------+------+-----------------------------+ Existem v´rias coisas que devem ser percebidas sobre esta consulta: a • 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 registros em uma tabela podem ser coincididas com os registros na outra. Isto ´ simples e porque ambas possuem uma coluna name. A consulta utiliza a cl´usula WHERE para a 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 vocˆ est´ se referindo. Isto ´ feito usando o nome da tabela antes do nome da coluna e a e separados por um ponto (.). Vocˆ n˜o precisa ter duas tabelas diferentes para realizar uma uni˜o. Algumas vezes ´ util e a a e´ unir uma tabela a ela mesma, se vocˆ deseja comparar registros em uma tabela com outros e registros na mesma tabela. Por exemplo, para encontrar pares entre seus animais, vocˆ e pode unir a tabela pet com ela mesma para produzir pares candidatos de machos e fˆmeas e de acordo com as esp´cies: e 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"; +--------+------+--------+------+---------+ | name | sex | name | sex | species | +--------+------+--------+------+---------+ | Fluffy | f | Claws | m | cat | | Buffy | f | Fang | m | dog | | Buffy | f | Bowser | m | dog | +--------+------+--------+------+---------+ Nesta consulta, n´s especificamos apelidos para os nomes das tabelas para conseguir ref- o erenciar `s colunas e manter com qual instˆncia da tabela cada coluna de referˆncia est´ a a e a associdada. 3.4 Obtendo Informa¸oes Sobre Bancos de Dados e Tabelas c˜ E se vocˆ esquecer o nome de um banco de dados ou tabela, ou como ´ a estrutura de e e uma certa tabela (por exemplo, como suas colunas s˜o chamadas)? O MySQL resolve este a problema atrav´s de diversas instru¸˜es que fornecem informa¸˜es sobre os bancos de dados e co co e as tabelas que ele suporta. Vocˆ j´ viu SHOW DATABASES, que lista os bancos de dados gerenciados pelo servidor. Para e a saber qual banco de dados est´ sendo usado atualmente, utilize a fun¸˜o DATABASE(): a ca mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | menagerie | +------------+
  • 228. 194 MySQL Technical Reference for Version 5.0.0-alpha Se vocˆ ainda n˜o selecionou nenhum banco de dados ainda, o resultado ´ NULL. (ou a e a e string vazia antes do MySQL 4.1.1). Para saber quais tabelas o banco de dados atual contˆm (por exemplo, quando vocˆ n˜o e e a tem certeza sobre o nome de uma tabela), utilize este comando: mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | event | | pet | +---------------------+ Se vocˆ deseja saber sobre a estrutura de uma tabela, o comando DESCRIBE ´ util; ele mostra e e´ informa¸˜es sobre cada uma das colunas da tabela: co 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 | | +---------+-------------+------+-----+---------+-------+ 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 e ou n˜o e Default especifica o valor padr˜o da coluna. a a e ´ Se vocˆ tem indices em uma tabela, SHOW INDEX FROM tbl_nome traz informa¸˜es sobre eles. co 3.5 Utilizando mysql em Modo Batch Nas se¸˜es anteriores, vocˆ usou mysql interativamente para fazer consultas e ver os re- co e sultados. Vocˆ pode tamb´m executar mysql no modo batch. Para fazer isto, coloque os e e comando que vocˆ deseja executar em um arquivo, e diga ao mysqld para ler sua entrada e do arquivo: shell> mysql < batch-file Se vocˆ estiver executando o mysql no Windows e tiver algum caracter especial no arquivo e que provocou o problema, vocˆ pode fazer: e dos> mysql -e "source batch-file" Se vocˆ precisa especificar parˆmetros de conex˜o na linha de comando, o comando deve e a a parecer com isto: shell> mysql -h host -u user -p < batch-file Enter password: ********
  • 229. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 195 Quando vocˆ utilizar o mysql desta forma, vocˆ estar´ criando um arquivo script, depois e e a executando o script. Se vocˆ quiser que o script continue mesmo se hopuver erros, vocˆ deve usar a op¸˜o de e e ca linha de comando --force. Por que usar um script? Existem v´rias raz˜es: a o • Se vocˆ executa uma query repetidamente (digamos, todos os dias ou todas as semanas), e transform´-lo em um script permite que vocˆ n˜o o redigite toda vez que o executa. a e a • 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 particularmente para comandos de m´ltiplas linhas ou sequˆncias de comandos com u e v´rias instru¸˜es. Se vocˆ cometer um erro, n˜o ser´ necess´rio redigitar tudo. Apenas a co e a a a edite seu arquivo script e corrija o erro, depois diga ao mysql para execut´-lo novamente. a • Se vocˆ tem uma query que produz muita saida, vocˆ pode encaminhar a sa´ atrav´s e ´ e ida e de um p´ginador. a 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 uma consulta atrav´s de um processo autom´tico (cron job). Neste caso, vocˆ deve e a 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 species FROM pet se parece com isto quando vocˆ o executa interativamente: e +---------+ | species | +---------+ | bird | | cat | | dog | | hamster | | snake | +---------+ Mas fica assim quando vocˆ o executa no modo batch: e species bird cat dog hamster snake Se vocˆ desejar obter o formato de sa´ interativa no modo batch, utilize mysql -t. Para e ida ´ dos comandos que s˜o executados, utilize mysql -vvv. mostrar a saida a
  • 230. 196 MySQL Technical Reference for Version 5.0.0-alpha Vocˆ tamb´m pode utilizar scripts no prompt de linha de comando mysql usando o comando e e source: mysql> source filename; 3.6 Exemplos de Consultas Comuns Aqui est˜o os exemplos de como resolver problemas comuns com o MySQL. a Alguns dos exemplos usam a tabela shop para armazenar o pre¸o de cada ´ c item (article) para certas revendas (dealers). Supondo que cada revenda tenha um pre¸o fixo por artigo, c ent˜o (article, dealer) ´ uma chave prim´ria para os registros. a e a Inicie a ferramenta de linha de comando mysql e selecione um banco de dados: shell> mysql o-nome-do-seu-banco-de-dados (Na maioria das instala¸˜es do MySQL, vocˆ pode usar o banco de dados test). co e Vocˆ pode criar e popular a tabela exemplo assim: e mysql> 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)); mysql> 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); Depois de executar as instru¸˜es a tabela deve ter o seguinte conte´do: co u 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 | +---------+--------+-------+ 3.6.1 O Valor M´ximo para uma Coluna a “Qual ´ o maior n´mero dos ´ e u itens?” SELECT MAX(article) AS article FROM shop; +---------+ | article |
  • 231. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 197 +---------+ | 4 | +---------+ 3.6.2 O Registro que Armazena o Valor M´ximo para uma Coluna a Determinada “Encontre o n´mero, fornecedor e pre¸o do ´ u c item mais caro.” No SQL ANSI isto ´ feito f´cilmente com uma sub-consulta: e a SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop); No MySQL (que ainda n˜o suporta sub-selects), fa¸a isto em dois passos: a c 1. Obtenha o valor do pre¸o m´ximo da tabela com uma instru¸˜o SELECT. c a ca mysql> SELECT MAX(price) FROM shop; +------------+ | MAX(price) | +------------+ | 19.95 | +------------+ 2. Usando o valor 19.95 mostrado pela consulta anterior como o pre¸o m´ximo do artigo, c a grave uma consulta para localizar e mostrar o registro correspondente: mysql> SELECT article, dealer, price -> FROM shop -> WHERE price=19.95; +---------+--------+-------+ | article | dealer | price | +---------+--------+-------+ | 0004 | D | 19.95 | +---------+--------+-------+ Outra solu¸˜o ´ ordenar todos os registros por pre¸o de forma descendente e obtenha so- ca e c 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 ´ itens mais caros, cada um com um pre¸o de 19.95, a solu¸˜o c ca LIMIT mostra somente um deles ! 3.6.3 M´ximo da Coluna por Grupo a “Qual ´ o maior pre¸o por ´ e c item?”
  • 232. 198 MySQL Technical Reference for Version 5.0.0-alpha 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 | +---------+-------+ 3.6.4 As Linhas Armazenando o Group-wise M´ximo de um Certo a Campo “Para cada ´ item, encontre o(s) fornecedor(s) com o maior pre¸o.” c No SQL-99 (e MySQL 4.1 ou superior), o problema pode ser solucionado com uma subcon- sulta como esta: SELECT article, dealer, price FROM shop s1 WHERE price=(SELECT MAX(s2.price) FROM shop s2 WHERE s1.article = s2.article); Em vers˜es anteriores a do MySQL 4.1 ´ melhor fazˆ-lo em diversos passos: o e e 1. Obtenha a lista de pares (article,maxprice). 2. Para cada ´item, obtenha os registros correspondentes que tenham o maior pre¸o. c Isto pode ser feito facilmente com uma tabela tempor´ria e um join: a 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 chamado “truque MAX-CONCAT”:
  • 233. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 199 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 | +---------+--------+-------+ O ultimo exemplo pode, ´ claro, ser feito de uma maneira mais eficiente fazendo a separa¸˜o ´ e ca da coluna concatenada no cliente. 3.6.5 Utilizando Vari´veis de Usu´rio a a Vocˆ pode usar vari´veis de usu´rios no MySQL para lembrar de resultados sem a necessi- e a a dade de armazen´-las em vari´veis no cliente. Veja Se¸˜o 6.1.4 [Variables], P´gina 474. a a ca a Por exemplo, para encontrar os ´ itens com os pre¸os mais altos e mais baixos vocˆ pode fazer c e isto: 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.6.6 Utilizando Chaves Estrangeiras No MySQL 3.23.44 e acima, tabelas InnoDB suportam verifica¸˜o de restri¸˜es de chaves ca co estrangerias. Veja Se¸˜o 7.5 [InnoDB], P´gina 642. Veja tamb´m Se¸˜o 1.8.4.5 [ANSI diff ca a e ca Foreign Keys], P´gina 50. a Vocˆ n˜o precisa de chaves estrangeiras para unir 2 tabelas. Para outros tipos de tabela e a diferentes de InnoDB, As unicas coisas que o MySQL atualmente n˜o faz s˜o 1) CHECK, para ´ a a ter certeza que as chaves que vocˆ usa realmente existem na tabela ou tabelas referenciadas e e 2) apagar automaticamente registros da tabela com uma defini¸˜o de chave estrangeira. ca Usando suas chaves para unir a tabela funcionar´ bem: a CREATE TABLE person ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  • 234. 200 MySQL Technical Reference for Version 5.0.0-alpha name CHAR(60) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE shirt ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, style ENUM(’t-shirt’, ’polo’, ’dress’) NOT NULL, colour ENUM(’red’, ’blue’, ’orange’, ’white’, ’black’) NOT NULL, owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id), PRIMARY KEY (id) ); INSERT INTO person VALUES (NULL, ’Antonio Paz’); INSERT INTO shirt VALUES (NULL, ’polo’, ’blue’, LAST_INSERT_ID()), (NULL, ’dress’, ’white’, LAST_INSERT_ID()), (NULL, ’t-shirt’, ’blue’, LAST_INSERT_ID()); INSERT INTO person VALUES (NULL, ’Lilliana Angelovska’); INSERT INTO shirt 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 person; +----+---------------------+ | id | name | +----+---------------------+ | 1 | Antonio Paz | | 2 | Lilliana Angelovska | +----+---------------------+ SELECT * FROM shirt; +----+---------+--------+-------+ | id | style | colour | owner | +----+---------+--------+-------+ | 1 | polo | blue | 1 | | 2 | dress | white | 1 | | 3 | t-shirt | blue | 1 | | 4 | dress | orange | 2 | | 5 | polo | red | 2 |
  • 235. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 201 | 6 | dress | blue | 2 | | 7 | t-shirt | white | 2 | +----+---------+--------+-------+ SELECT s.* FROM person p, shirt s WHERE p.name LIKE ’Lilliana%’ AND s.owner = p.id AND s.colour <> ’white’; +----+-------+--------+-------+ | id | style | colour | owner | +----+-------+--------+-------+ | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | +----+-------+--------+-------+ 3.6.7 Pesquisando em Duas Chaves O MySQL ainda n˜o otimiza quando vocˆ pesquisa em duas chaves diferentes combinadas a e com OR (Pesquisa em uma chave com diferentes partes OR ´ muito bem otimizadas). e SELECT field1_index, field2_index FROM test_table WHERE field1_index = ’1’ OR field2_index = ’1’ A raz˜o ´ que n´s ainda n˜o tivemos tempos para fazer este tratamento de uma maneira a e o a eficiente no caso geral. (A manipula¸˜o do AND ´, em compara¸˜o, completamente geral e ca e ca funciona muito bem). No MySQL 4.0 e acimo, vocˆ pode solucionar este problema eficientemente usando um UNION e que combina a sa´ de duas instru¸˜es SELECT separadas. Veja Se¸˜o 6.4.1.2 [UNION], ida co ca P´gina 569. Cada SELECT busca apenas uma chave e pode ser otimizada. a SELECT field1_index, field2_index FROM test_table WHERE field1_index = ’1’ UNION SELECT field1_index, field2_index FROM test_table WHERE field2_index = ’1’; Em vers˜es do MySQL anteirores a 4.0, vocˆ pode conseguir o mesmo efeito usando uma o e tabela TEMPORARY e instru¸˜es SELECT separadas. Este tipo de otimiza¸˜o tamb´m ´ muito co ca e e boa se vocˆ estiver utilizando consultas muito complicadas no qual o servidor SQL faz as e otimiza¸˜es na ordem errada. co 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; A maneira descrita acima para resolver esta consulta ´ uma uni˜o (UNION) de duas consultas. e a
  • 236. 202 MySQL Technical Reference for Version 5.0.0-alpha 3.6.8 Calculando Visitas Di´rias a O seguinte exemplo mostra como vocˆ pode usar as fun¸˜es bin´rias de agrupamento para e co a calcular o n´mero de dias por mˆs que um usu´rio tem visitado uma p´gina web. u e a a 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 A tabela exemplo cont´m valores ano-mˆs-dia representando visitas feitas pelos usu´rios a e e a p´gina. Para determinar quantos quantos dias diferentes em cada mˆs estas visitas ocorriam, a e use esta consulta: SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month; que retornar´: a +------+-------+------+ | year | month | days | +------+-------+------+ | 2000 | 01 | 3 | | 2000 | 02 | 2 | +------+-------+------+ O exemplo acima calcula quantos dias diferentes foram usados para uma combina¸˜o ca fornecida de mˆs/ano, com remo¸˜o autom´tica de entradas duplicadas. e ca a 3.6.9 Usando AUTO_INCREMENT O atributo AUTO_INCREMENT pode ser usado para gerar uma identifica¸˜o unica para um ca ´ novo registro: CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id) ); INSERT INTO animals (name) VALUES ("dog"),("cat"),("penguin"), ("lax"),("whale"),("ostrich"); SELECT * FROM animals; Que retorna: +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | lax | | 5 | whale | | 6 | ostrich | +----+---------+ Vocˆ pode recuperar o valor AUTO_INCREMENT mais recente com a fun¸˜o SQL LAST_INSERT_ e ca ID() ou a fun¸˜o da API C mysql_insert_id(). Nota: para uma inser¸˜o de v´rias ca ca a
  • 237. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 203 linhas LAST_INSERT_ID()/mysql_insert_id() retornar´ atualmente a AUTO_INCREMENT a chave da primeira linha inserida. Isto permite que inser¸˜es multi-linhas sejam reproduzidas co corretamente em outros servidores em uma configra¸˜o de replica¸˜o. ca ca Para tabelas MyISAM e BDB vocˆ pode especificar AUTO_INCREMENT em uma coluna secund´ria e a em um ´ indice multi-coluna. Neste caso, o valor gerado para a coluna AUTO_INCREMENT ´ e calculado como MAX(auto_increment_column)+1) WHERE prefix=given-prefix. Isto ´ e util quando vocˆ quer colocar dados em grupos ordenados. ´ e CREATE TABLE animals ( grp ENUM(’fish’,’mammal’,’bird’) NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ); INSERT INTO animals (grp,name) VALUES("mammal","dog"),("mammal","cat"), ("bird","penguin"),("fish","lax"),("mammal","whale"), ("bird","ostrich"); SELECT * FROM animals ORDER BY grp,id; Que retorna: +--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich | +--------+----+---------+ Note que neste caso (quando o valor AUTO_INCREMENT ´ parte de um ´ e indice multi-coluna), o valor de AUTO_INCREMENT ser´ reutilizado se vocˆ deletar a linha com o maior valor AUTO_ a e INCREMENT em qualquer grupo. Isto caontece mesmo para tabelas MyISAM, para as quais os valores AUTO_INCREMENT normalmente n˜o s˜o reusados.) a a 3.7 Consultas de Projetos Gˆmeos e Em Analytikerna e Lentus, n´s estamos fazendo os sistemas e trabalho de campo para um o grande projeto de pesquisa. Este projeto ´ uma colabora¸˜o entre o Institudo de Medicina e ca Ambiental em Karolinksa Institutet Stockholm e a Se¸˜o de Pesquisa Cl´ ca inica em Envelhec- imento e Psicologia na University of Southern California. O projeto envolve uma parte de sele¸˜o onde todos os gˆmeos na Su´cia mais velhos que 65 ca e e anos s˜o entrevistados por telefone. Gˆmeos que preenchem certos crit´rios passam para a e e o pr´ximo est´gio. Neste est´gio posterior, gˆmeos que desejam participar s˜o visitados o a a e a por uma equipe de doutores/enfermeiros. Alguns dos consultas incluem exames f´ isicos e neuropsicol´gico, testes de laborat´rio, imagem neural, determina¸˜o do estado psicol´gico o o ca o
  • 238. 204 MySQL Technical Reference for Version 5.0.0-alpha e coletas de hist´rico familiar. Adicionalmente, dados s˜o coletados em fatores de riscos o a m´dicos e ambientais. e Mais informa¸˜es sobre o estudos dos gˆmeos pode ser encontrados em: co e http://www.mep.ki.se/twinreg/index_en.html A parte posterior do projeto ´ administrada com uma interface Web escrita utilizando a e linguagem Perl e o MySQL. Cada noite todos dados das entrevistas s˜o movidos para um banco de dados MySQL. a 3.7.1 Encontrando Todos Gˆmeos N˜o-distribu´ e a idos A seguinte consulta ´ usada para determinar quem vai na segunda parte do projeto: e 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 /* For Twin 2 */ LEFT JOIN twin_data AS td2 ON p2.id = td2.id
  • 239. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 205 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’
  • 240. 206 MySQL Technical Reference for Version 5.0.0-alpha OR h.status = ’Died’ OR h.status = ’Other’) ORDER BY tvid; Algumas explica¸˜es: co CONCAT(p1.id, p1.tvab) + 0 AS tvid N queremos ordenar o id e o tvab concatenados na ordem num´rica. Adicio- e nando 0 ao resultado faz o MySQL tratar o resultado como um n´mero. u coluna id Esta identifica um par de gˆmeos. Ela ´ uma chave em todas as tabelas. e e column tvab Esta identifica um gˆmeo em um par. Ela pode ter um valor de 1 ou 2. e column ptvab Esta ´ o inverso de tvab. Quando tvab ´ 1 este campo ´ 2 e vice versa. Ela e e e existe para poupar digita¸˜o e tornar mais f´cil para o MySQL otimizar a query. ca a Esta consulta demonstra, entre outras coisas, como fazer buscas em uma tabela a partir da mesma tabela com uma uniao (p1 e p2). No exemplo, isto ´ usado para conferir se um par e de um gˆmeo morreu antes de 65 anos. Se for verdade, a linha n˜o ´ retornada. e a e Tudo acima existe em todas as tabelas com informa¸˜es relacionada aos gˆmeos. N´s temos co e o uma chave em ambos id,tvab (todas as tabelas) e id,ptvab (person_data) para tornar as consultas mais r´pidas. a Na nossa m´quina de produ¸˜o (Um UltraSPARC 200MHz), esta consulta retorna entre a ca 150-200 linhas e gasta menos que um segundo. O n´mero atual de registros nas tabelas usadas acima: u Tabela Registros person_data 71074 lentus 5291 twin_project 5286 twin_data 2012 informant_data 663 harmony 381 postal_groups 100 3.7.2 Mostrando uma Tabela sobre a Situa¸˜o dos Pares Gˆmeos ca e Cada entrevista termina com um c´digo da situa¸˜o chamado event. A consulta mostrada o ca 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- e e minou e o outro foi recusado e assim por diante. SELECT t1.event, t2.event, COUNT(*) FROM lentus AS t1,
  • 241. Cap´ ıtulo 3: Tutorial de Introdu¸˜o Do MySQL ca 207 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 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 Existem programas que lhe permite autenticar seus usu´rios a partir de um banco de dados a MySQL e tamb´m permite gravar seus arquivos de log em uma tabela MySQL. e Vocˆ pode alterar o formato de log do Apache para ser facilmente lido pelo MySQL colo- e cando o seguinte no arquivo de configura¸˜o do Apache: ca LogFormat ""%h",%{%Y%m%d%H%M%S}t,%>s,"%b","%{Content-Type}o", "%U","%{Referer}i","%{User-Agent}i"" Para carregar uma arquivo de log naquele formato dentro do MySQL, vocˆ pode usar uma e instru¸˜o deste tipo: ca LOAD DATA INFILE ’/local/access_log’ INTO TABLE nome_tabela FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’"’ ESCAPED BY ’’ A tabela chamada deve ser criada para ter colunas que correpondem a aquelas que a linha LogFormat gravam no arquivo de log.
  • 242. 208 MySQL Technical Reference for Version 5.0.0-alpha 4 Administra¸˜o do Bancos de Dados MySQL ca 4.1 Configurando o MySQL 4.1.1 Op¸˜es de Linha de Comando do mysqld co Na maioria dos casos vocˆ deve gerenciar as op¸˜es do mysqld por meio dos arquivos de e co op¸˜es. Veja Se¸˜o 4.1.2 [Arquivos de op¸˜es], P´gina 217. co ca co a mysqld e mysqld.server lˆem op¸˜es dos grupos mysqld e server. mysqld_safe lˆ as e co e op¸˜es dos grupos mysqld, server, mysqld_safe e mysqld_safe. Um servidor MySQL co embutido normalmente lˆ op¸˜es do grupos server, embedded e xxxxx_SERVER, onde xxxxx e co ´ o nome da aplica¸˜o. e ca mysqld aceita os seguintes op¸˜es de linha de comando. Aqui est´ uma lista das mais co a comuns. Para uma lista completa execute mysqld --help. As op¸˜es usadas para replica¸˜o co ca est`o listadas em uma se¸˜o separada, veja Se¸˜o 4.11.6 [Replication Options], P´gina 393. a ca ca a --ansi Utilizar a sintaxe ANSI SQL no lugar da sintaxe MySQL Veja Se¸˜o 1.8.2 [ANSI ca mode], P´gina 42. a -b, --basedir=path Encaminho para o diret´rio de instala¸˜o. Todos os caminhos normalmente s˜o o ca a resolvidos em rela¸˜o a este. ca --big-tables Permite grandes conjuntos de resultados salvando todos os conjuntos tem- por´rios em um arquivo. Ele resolve a maioria dos erros ’table full’, mas a tamb´m abaixa a velocidade das consultas nas quais as tabelas em mem´ria e o seriam suficientes. Desde a Vers˜o 3.23.2, o MySQL ´ capaz de resolver isto au- a e tomaticamente usando mem´ria para pequenas tabelas tempor´rias e trocando o a para o disco as tabelas, quando for necess´rio. a --bind-address=IP Endere¸o IP para ligar. c --console Grava a mensagem de erro no stderr/stdout mesmo se --log-error ´ espefi- e cado. No Windows o mysqld n˜o fechar´ a tela de console se esta op¸˜o ´ a a ca e usada. --character-sets-dir=path Diret´rio onde est˜o os conjuntos de caracteres. Veja Se¸˜o 4.7.1 [Conjunto de o a ca caracteres], P´gina 326. a --chroot=path Coloca o daemon mysqld no diretorio chroot durante a inicializa¸˜o. Medida ca de seguran¸a recomendada desde o MySQL 4.0 (MySQL 3.23 n˜o est´ apto a c a a fornecer um chroot 100% fechado. Limita os comandos LOAD DATA INFILE e SELECT ... INTO OUTFILE.
  • 243. Cap´ ıtulo 4: Administra¸˜o do Bancos de Dados MySQL ca 209 --core-file Grava um arquivo core se o mysqld morrer. Para alguns sistemas vocˆ deve e tamb´m especificar --core-file-size para mysqld_safe. Veja Se¸˜o 4.8.2 e ca [mysqld_safe], P´gina 332. Note que em alguns sistemas, como Solaris, vocˆ a e n˜o consiguir´ um arquivo core se vocˆ tamb´m estiver usando a op¸˜o --user. a a e e ca -h, --datadir=caminho Encaminha para o diret´rio raiz dos bancos de dados. o --debug[...]= Se o MySQL est´ configurado com --with-debug, vocˆ pode usar esta op¸˜o a e ca para obter um arquivo de rastreamento indicando o que o mysqld est´ fazendo. a Veja Se¸˜o D.1.2 [Criando arquivos trace], P´gina 1071. ca a --default-character-set=conjunto_caracter Configura o conjunto de caracteres padr˜o. Veja Se¸˜o 4.7.1 [Conjunto de a ca caracteres], P´gina 326. a --default-table-type=tipo Configura o tipo de tabela padr˜o. Veja Cap´ a “ptexi tulo 7 [Tipos de tabelas], P´gina 629. a --delay-key-write[= OFF | ON | ALL] Como o DELAYED KEYS do MyISAM deve ser usado. Veja Se¸˜o 5.5.2 ca [Parˆmetros do servidor], P´gina 455. a a --delay-key-write-for-all-tables; No MySQL 4.0.3 voc^ deve usar e --delay-key-write=ALL. N˜o descarrega buffers das chaves entre escritas em nenhuma tabela MyISAM. a Veja Se¸˜o 5.5.2 [Parˆmetros do servidor], P´gina 455. ca a a --des-key-file=filename Read the default keys used by DES_ENCRYPT() and DES_DECRYPT() from this file. --enable-external-locking (era --enable-locking) Habilita o bloqueio do sistema. Perceba que se usar esta op¸˜o em um sistema ca que n˜o possui um lockd() completamente funcional (como no Linux) vocˆ pode a e fazer com que o mysqld entre em deadlock. --enable-named-pipe Habilita suporte para named pipes (somente no NT/Win2000/XP). -T, --exit-info Esta ´ uma m´scara bin´ria com diferˆntes parˆmetros que pode ser usada para e a a e a depurar o servidor mysqld; Esta op¸˜o n˜o deve ser usada por algu´m que n˜o ca a e a a conhe¸a muito bem! c --flush Atualiza todas as altera¸˜es no disco depois de cada comando SQL. Normal- co mente o MySQL s´ faz a escrita de todas as altera¸˜es no disco depois de cada o co comando SQL e deixa o sistema operacional lidar com a sincroniza¸˜o com o ca disco. Veja Se¸˜o A.4.1 [Falhas], P´gina 921. ca a
  • 244. 210 MySQL Technical Reference for Version 5.0.0-alpha -?, --help Mostra uma pequena ajuda e sai. --init-file=arquivo Lˆ comandos SQL do arquivo especificado na inicializa¸˜o. e ca -L, --language=... Mensagens de erro do cliente na l´ ingua especificada. Pode ser fornecido como um caminho completo. Veja Se¸˜o 4.7.2 [L´ ca inguas], P´gina 328. a -l, --log[=arquivo] Log de conex˜es e consultas ao arquivo. Veja Se¸˜o 4.10.2 [Log de consultas], o ca P´gina 373. a --log-bin=[arquivo] Registra todas as consultas que alteram dados em arquivo. Usado para backup e replica¸˜o. Veja Se¸˜o 4.10.4 [Binary log], P´gina 375. ca ca a --log-bin-index[=arquivo] Arquivo de ´indice para nomes de arquivos de log binario. Veja Se¸˜o 4.10.4 ca [Log bin´rio], P´gina 375. a a --log-error[=arquivo] Registra mensagens de erro e inicializa¸˜o neste arquivo. Veja Se¸˜o 4.10.1 [Log ca ca de erro], P´gina 373. a --log-isam[=arquivo] Log de todas altera¸˜es ISAM/MyISAM no arquivo (usado somente quando co estiver depurando bancos ISAM/MyISAM). --log-long-format Registra algumas informa¸˜es extras nos aruivos de log (log de atualiza¸˜es, co co log bin´rio de atualiza¸˜es e log de consultas lentas, independente de qual est´ a co a ativado). Por exemplo, nome do usu´rio e timestamp s˜o registrados para a a a consulta. Se vocˆ estiver usando --log-slow-queries e --log-long-format, e ent˜o consultas que n˜o est˜o usando ´ a a a indices s˜o registradas ao log de con- a sultas lentas. Note que --log-long-format est´ obsoleto a partir do MySQL a vers˜o 4.1, quando --log-short-format foi introduzido (--log-long-format a ´ a configura¸˜o padr˜o desde a vers˜o 4.1). Note tamb´m que a partir do e ca a a e MySQL 4.1, a op¸˜o --log-queries-not-using-indexes est´ dispon´ para ca a ivel prop´sito de registro de consultas que n˜o usam ´ o a indices para o log de consultas lentas. --log-queries-not-using-indexes Se vocˆ estiver usando --log-slow-queries, ent˜o consultas que n˜o est˜o e a a a ´ usando indices est˜o registradas no log de consultas lentas. Esta op¸˜es a co est´ dispon´ a ivel a partir do MySQL 4.1. Veja Se¸˜o 4.10.5 [Slow query log], ca P´gina 378. a --log-short-format Registra menos informa¸˜es extras nos aruivos de log (log de atualiza¸˜es, log co co bin´rio de atualiza¸˜es e log de consultas lentas, independente de qual est´ a co a
  • 245. Cap´ ıtulo 4: Administra¸˜o do Bancos de Dados MySQL ca 211 ativado). Por exemplo, nome do usu´rio e timestamp s˜o registrados para a a a consulta. Esta op¸˜o foi introduzida no MySQL 4.1. ca --log-slow-queries[=arquivo] Log de todas as consultas que levam mais de long_query_time segundos de execu¸˜o para um arquivo. Note que o padr˜o para a quantidade de informa¸˜o ca a ca registrada alterou no MySQL 4.1. Veja as op¸˜es --log-long-format e - co -log-long-format para mais detalhes. Veja Se¸˜o 4.10.5 [Slow query log], ca P´gina 378. a --log-update[=arquivo] Log de atualiza¸˜es para file.# onde # ´ um n´mero unico se n˜o for fornecido. co e u ´ a Veja Se¸˜o 4.10.3 [Log de atualiza¸˜o], P´gina 374. O log de atualiza¸˜o ca ca a ca est´obsoleto e ser´ removido no MySQL 5.0; vocˆ deve usar o log bin´rio em a a e a seu lugar (--log-bin). Veja Se¸˜o 4.10.4 [Log bin´rio], P´gina 375. A partir ca a a da vers˜o 5.0, usar --log-update apenar ligar´ o log bin´rio. a a a --low-priority-updates Opera¸˜es de altera¸˜es das tabelas (INSERT/DELETE/UPDATE) ir˜o ter priori- co co a dade menor do que as selects. Isto tamb´m pode ser feito usando {INSERT | e 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. Veja Se¸˜o 5.3.2 [Bloqueio de tabelas], ´ ca P´gina 445. a --memlock Bloqueia o processo mysqld na mem´ria. Isto funciona somente se o seu sistema o suportar a chamada de sistema mklockall() (como no Solaris). Isto pode ajudar se vocˆ tiver um problema no qual o sistema operacional faz com que e o mysqld fa¸a a troca em disco. Note que o uso desta op¸˜o exige que vocˆ c ca e execute o servidor como root, que normalmente n˜o ´ uma boa id´ia por raz˜es a e e o de seguran¸a. c --myisam-recover [=op¸~o[,op¸~o...]]] onde op¸~o ´ qualquer combina¸~o ca ca ca e ca de DEFAULT, BACKUP, FORCE ou QUICK. Vocˆ tamb´m pode configurar isto ex- e e plicitamente para "" se vocˆ deseja desabilitar esta op¸˜o. Se esta op¸˜o for e ca ca usada, o mysqld ir´ conferir na abertura se a tabela est´ marcada como que- a a brada ou se a tabela n˜o foi fechada corretamente. (A ultima op¸˜o funciona a ´ ca somente se vocˆ estiver executando com --skip-locking). Se este for o caso e mysqld ir´ executar uma conferˆncia na tabela. Se a tabela estiver corrompida, a e o mysqld ir´ tentar repar´-la. a a As seguintes op¸˜es afetam no funcionamento da repara¸˜o. co ca Op¸˜o ca Descri¸˜o ca DEFAULT O mesmo que n˜o fornecer uma op¸˜o para --myisam- a ca recover. BACKUP Se os dados da tabela foram alterados durante a recupera¸˜o, ca salve um backup do arquivo de dados ‘nome_tabela.MYD’ como ‘nome_tabela_dia_hora.BAK’. FORCE Execute a recupera¸˜o mesmo se perdermos mais de uma ca linha do arquivo .MYD.
  • 246. 212 MySQL Technical Reference for Version 5.0.0-alpha QUICK N˜o confira as linhas na tabela se n˜o existir nenhum bloco a a apagado. Antes da tabela ser reparada automaticamente, o MySQL ir´ adicionar uma a nota no log de erros. Se vocˆ desejar que a recupera¸˜o da maioria dos prob- e ca lemas n˜o tenha a interven¸˜o de algum usu´rio, devem ser usadas as op¸˜es a ca a co BACKUP,FORCE. Isto ir´ for¸ar um reparo de uma tabela mesmo se alguns reg- a c istros forem apagados, mas ele manter´ o arquivo de dados antigo como um a backup para que vocˆ possa examinar posteriormente o que aconteceu. e --new A partir da vers˜o 4.0.12, a op¸˜o --new pode ser usada para fazer o servidor a ca se comportar como 4.1 em certos aspectos, facilitando a atualiza¸˜o da vers˜o ca a 4.0 para 4.1: • TIMESTAMP ´ retornado com uma string com o formato ’YYYY-MM-DD e HH:MM:SSS. Veja Se¸˜o 6.2 [Tipos de colunas], P´gina 482. ca a --pid-file=caminho Encaminha para o arquivo pid usado pelo mysqld_safe. -P, --port=... N´mero da porta para conex˜es TCP/IP. u o -o, --old-protocol Utilize o protocolo 3.20 para compatibilidade com alguns clientes muito antigos. Veja Se¸˜o 2.5.5 [Atualizando a vers˜o 3.20], P´gina 129. ca a a --one-thread Usa somente uma thread (para depura¸˜o sobre Linux). Esta op¸˜o est´ ca ca a dispon´ ivel apenas se o servidor est´ constru´ com a depura¸˜o habilitada. a ido ca Veja Se¸˜o D.1 [Depurando o servidor], P´gina 1070. ca a --open-files-limit= Para alterar o n´mero de descritores de arquivos dispon´ u iveis para o mysqld. Se isto n˜o estiver configurado com 0, ent˜o o mysqld usar´ este valor para reservar a a a descritores de arquivos para usar com setrlimit(). Se este valor ´ 0 ent˜o o e a mysqld reservar´ max_connections*5 ou max_connections + table_cache*2 a (que ´ sempre