Escolar Documentos
Profissional Documentos
Cultura Documentos
Curso Completo de MySQL
Curso Completo de MySQL
Sum ario
1 Informa c oes Gerais . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 1.2 Sobre Este Manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.1.1 Conven c oes Usadas Neste Manual . . . . . . . . . . . . . . . . 2 Vis ao Geral do Sistema de Gerenciamento de Banco de Dados MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.1 Hist oria do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 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 Vis ao Geral da MySQL AB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3.1 O Modelo de Neg ocio e Servi cos da MySQL AB . . 13 1.3.1.1 Suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.3.1.2 Treinamento e Certica c ao . . . . . . . . . . . . . 13 1.3.1.3 Consultoria . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.3.1.4 Licen cas Comerciais . . . . . . . . . . . . . . . . . . . 14 1.3.1.5 Parcerias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.3.2 Informa c oes para Contato . . . . . . . . . . . . . . . . . . . . . . 15 Suporte e Licenciamento do MySQL . . . . . . . . . . . . . . . . . . . . . 16 1.4.1 Suporte Oferecido pela MySQL AB . . . . . . . . . . . . . 16 1.4.2 Copyrights e Licen cas Usadas pelo MySQL . . . . . . 17 1.4.3 Licen cas do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.4.3.1 Usando o Programa MySQL Sob uma Licen ca Comercial . . . . . . . . . . . . . . . . . . . . . . . . 18 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 ao de Altera c ao . . . . . . . . 20 1.4.4.3 Quando Voc e Precisa de Permiss ao de Altera c ao para Usar as Logomarcas do MySQL? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 c ao . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.4.4.6 Usando a Palavra MySQL em Nomes de Companhias e Produtos . . . . . . . . . . . . . . . . . . . 21 Mapa de Desenvolvimento do MySQL . . . . . . . . . . . . . . . . . . . . 21 1.5.1 MySQL 4.0 in a Nutshell . . . . . . . . . . . . . . . . . . . . . . . 22
1.3
1.4
1.5
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 oxima Distribui c ao de Desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.6 MySQL e o Futuro (o TODO) . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.6.1 Novos Recursos Planejados Para a Vers ao 4.1 . . . . 26 1.6.2 Novos Recursos Planejados Para a Vers ao 5.0 . . . . 27 1.6.3 Novos Recursos Planejados Para a Vers ao 5.1 . . . . 28 1.6.4 Novos Recursos Planejados Para a Vers ao em um Futuro Pr oximo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 1.6.5 Novos Recursos Planejados Para a Vers ao em um Futuro a M edio Prazo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 1.6.6 Novos Recursos que N ao Planejamos Fazer . . . . . . 32 1.7 Fontes de Informa c oes do MySQL . . . . . . . . . . . . . . . . . . . . . . . 33 1.7.1 Listas de Discuss ao MySQL . . . . . . . . . . . . . . . . . . . . 33 1.7.1.1 As Listas de Discuss ao do MySQL . . . . . . 33 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 oes na lista de discuss ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 1.7.2 Suporte a Comunidade MySQL Atrv es do IRC (Internet Relay Chat) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 1.8 Qual compatibilidade aos padr oes o MySQL oferece ? . . . . . 41 1.8.1 Qual Padr ao o MySQL Segue? . . . . . . . . . . . . . . . . . . 42 1.8.2 Executando o MySQL no modo ANSI . . . . . . . . . . . 42 1.8.3 Extens oes do MySQL para o Padr ao SQL-92 . . . . . 43 1.8.4 Diferen cas do MySQL em Compara c ao com o SQL-92 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 1.8.4.1 Subqueries . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 1.8.4.2 SELECT INTO TABLE . . . . . . . . . . . . . . . . . . . 46 1.8.4.3 Transa c oes e Opera c oes At omicas . . . . . . 46 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 icio de Coment ario . . . . . . . . 51 1.8.5 Como o MySQL Lida com Restri c oes . . . . . . . . . . . . 52 1.8.5.1 Restri c oes de PRIMARY KEY / UNIQUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 1.8.5.2 Restri c oes de NOT NULL . . . . . . . . . . . . . . . . 53 1.8.5.3 Restri c oes de ENUM e SET . . . . . . . . . . . . . . . 53 1.8.6 Erros Conhecidos e Deci encias de Projetos no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
iii 1.8.6.1 Erros da Vers ao 3.23 Corrigidos em Vers oes Posteriores do MySQL . . . . . . . . . . . . . . . . . . . . 53 1.8.6.2 Open Bugs / Deci encias de Projeto no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Instala c ao do MySQL . . . . . . . . . . . . . . . . . . . . . 60
2.1 Instala c ao r apida padr ao do MySQL . . . . . . . . . . . . . . . . . . . . . 60 2.1.1 Instalando o MySQL no Windows . . . . . . . . . . . . . . . 60 2.1.1.1 Exig encias do Sistema Windows . . . . . . . . 61 2.1.1.2 Instalando uma Distribui c ao Bin aria do 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 arios do NetWare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 2.2 Detalhes Gerais de Instala c ao . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 2.2.1 Como obter o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 75 2.2.2 Vericando a Integridade do Pacote Usando MD5 Checksums ou GnuPG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 2.2.3 Sistemas Operacionais suportados pelo MySQL . . 78 2.2.4 Qual vers ao do MySQL deve ser usada . . . . . . . . . . 80 2.2.5 Layouts de Instala c ao . . . . . . . . . . . . . . . . . . . . . . . . . . 83 2.2.6 Como e quando as atualiza c oes s ao lan cadas? . . . . 84 2.2.7 Filosoa das Distribui c oes - Nenhum Bug Conhecidos nas Distribui c oes . . . . . . . . . . . . . . . . . . . . . 84 2.2.8 Bin arios MySQL compilados pela MySQL AB . . . 86 2.2.9 Instalando uma Distribui c ao Bin aria do MySQL . . 91 2.3 Instalando uma distribui c ao com fontes do MySQL . . . . . . . 93 2.3.1 Vis ao geral da instala c ao r apida . . . . . . . . . . . . . . . . 94 2.3.2 Aplicando patches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 2.3.3 Op c oes t ipicas do configure . . . . . . . . . . . . . . . . . . . 97 2.3.4 Instalando pela arvore de fontes do desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 2.3.5 Lidando com Problemas de Compila c ao . . . . . . . . 103 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 Congura c oes e Testes P os-instala c ao . . . . . . . . . . . . . . . . . . . 111 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 ao 4.0 para 4.1 . . . . . . . . . . . . 120 2.5.2 Atualizando da Vers ao 3.23 para 4.0 . . . . . . . . . . . 123 2.5.3 Atualizando da vers ao 3.22 para 3.23 . . . . . . . . . . . 126 2.5.4 Atualizando da vers ao 3.21 para 3.22 . . . . . . . . . . . 128 2.5.5 Atualizando da vers ao 3.20 para 3.21 . . . . . . . . . . . 129 2.5.6 Atualizando a Tabela de Permiss oes . . . . . . . . . . . . 130 2.5.7 Atualizando para outra arquitetura . . . . . . . . . . . . 130 2.5.8 Atualizando o MySQL no Windows . . . . . . . . . . . . 132 2.6 Notas espec icas 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 oes) . . . . . . . . . . . . . . . . 137 2.6.2.1 Notas Linux para distribui c oes bin arias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 ao 2.x . . . . . . . . . . . . . . . 151 2.6.4.6 Notas BSD/OS Vers ao 3.x . . . . . . . . . . . . 151 2.6.4.7 Notas BSD/OS Vers ao 4.x . . . . . . . . . . . . 152 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 c oes bin arias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 2.6.6.2 Notas HP-UX Vers ao 10.20 . . . . . . . . . . . 154 2.6.6.3 Notas HP-UX Vers ao 11.x . . . . . . . . . . . . 154 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 Coment arios de Instala c ao do Perl . . . . . . . . . . . . . . . . . . . . . . 165 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
2.7
vi 3.6.4 As Linhas Armazenando o Group-wise M aximo de um Certo Campo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 3.6.5 Utilizando Vari aveis de Usu ario . . . . . . . . . . . . . . . . 199 3.6.6 Utilizando Chaves Estrangeiras . . . . . . . . . . . . . . . . 199 3.6.7 Pesquisando em Duas Chaves . . . . . . . . . . . . . . . . . . 201 3.6.8 Calculando Visitas Di arias . . . . . . . . . . . . . . . . . . . . 201 3.6.9 Usando AUTO_INCREMENT . . . . . . . . . . . . . . . . . . . . . . 202 3.7 Consultas de Projetos G emeos . . . . . . . . . . . . . . . . . . . . . . . . . 203 3.7.1 Encontrando Todos G emeos N ao-distribu idos . . . 204 3.7.2 Mostrando uma Tabela sobre a Situa c ao dos Pares G emeos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 3.8 Utilizando MySQL com Apache . . . . . . . . . . . . . . . . . . . . . . . . 207
vii 4.4.2 Nomes de Usu arios e Senhas do MySQL . . . . . . . . 260 4.4.3 Quando as Altera c oes nos Privil egios tem Efeito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 4.4.4 Congurando os Privil egios Iniciais do MySQL . . 261 4.4.5 Adicionando Novos Usu arios ao MySQL . . . . . . . . 262 4.4.6 Deletando Usu arios do MySQL . . . . . . . . . . . . . . . . 265 4.4.7 Limitando os Recursos dos Usu arios . . . . . . . . . . . . 266 4.4.8 Congurando Senhas . . . . . . . . . . . . . . . . . . . . . . . . . 267 4.4.9 Mantendo Sua Senha Segura . . . . . . . . . . . . . . . . . . 268 4.4.10 Usando Conex oes Seguras . . . . . . . . . . . . . . . . . . . . 269 4.4.10.1 Conceitos Basicos . . . . . . . . . . . . . . . . . . . 269 4.4.10.2 Exig encias . . . . . . . . . . . . . . . . . . . . . . . . . . 269 4.4.10.3 Congurando Certicados SSL para o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 4.4.10.4 Op c oes SSL do GRANT . . . . . . . . . . . . . . . 274 4.4.10.5 Op c oes SSL de Linha de Comando . . . 275 4.5 Preven c ao de Disastres e Recupera c ao . . . . . . . . . . . . . . . . . . 276 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 c ao de Tabelas e Recupera c ao em Caso de Falhas . . . . . . . . . . . . . . . . . . 281 4.5.6.1 Sintaxe do myisamchk . . . . . . . . . . . . . . . . 282 4.5.6.2 Op c oes Gerais do myisamchk . . . . . . . . . . 283 4.5.6.3 Op c oes de Verica c ao do myisamchk . . . 284 4.5.6.4 Op c oes de Reparos do myisamchk . . . . . 285 4.5.6.5 Outras Op c oes do myisamchk . . . . . . . . . 287 4.5.6.6 Uso de Mem oria do myisamchk . . . . . . . . 287 4.5.6.7 Uso do myisamchk para Recupera c ao em Caso de Falhas . . . . . . . . . . . . . . . . . . . . . . . . . . 288 4.5.6.8 Como Vericar Erros em Tabelas . . . . . . 289 4.5.6.9 Como Reparar Tabelas . . . . . . . . . . . . . . . 290 4.5.6.10 Otimiza c ao de Tabelas . . . . . . . . . . . . . . 292 4.5.7 Congurando um Regime de Manuten c ao das Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 4.5.8 Obtendo Informa c oes sobre as Tabelas . . . . . . . . . 293 4.6 Adiministra c ao do Banco de Dados e Refer encia de Linguagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 c oes sobre Bancos de 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 c ao do MySQL e Utiliza c ao Internacional . . . . . . . . 326 4.7.1 O Conjunto de Caracteres Utilizado para Dados e Ordena c ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 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 Deni c oes de Caracteres . . . . . . . . . 330 4.7.5 Suporte ` a Ordena c ao de Strings . . . . . . . . . . . . . . . 330 4.7.6 Suporte ` a Caracteres Multi-byte . . . . . . . . . . . . . . . 331 4.7.7 Problemas com Conjuntos de Caracteres . . . . . . . 331 4.8 Utilit arios e Scripts do Lado do Servidor MySQL . . . . . . . . 331 4.8.1 Vis ao Geral dos Scripts e Utilit arios do Lado Servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 4.8.2 mysqld-safe, o wrapper do mysqld . . . . . . . . . . . . 332 4.8.3 mysqld_multi, programa para gerenciar m ultiplos 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 arios e Scripts do Lado do Cliente MySQL . . . . . . . . . 346 4.9.1 Vis ao Geral dos Utilit arios e Scripts do Lado do 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 ario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 4.9.6 Usando mysqlcheck para Manuten c ao de Tabelas e Recupera c ao em Caso de Falhas . . . . . . . . . . . . . . . . . . 360 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 c oes para compila c ao do cliente MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 4.9.12 perror, Explicando C odigos de Erros . . . . . . . . . 372 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 c oes . . . . . . . . . . . . . . . . . . . . . . . 374 4.10.4 O Log Bin ario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 4.10.5 O Log para Consultas Lentas . . . . . . . . . . . . . . . . . 378 4.10.6 Manuten c ao do Log de Arquivo . . . . . . . . . . . . . . . 378 4.11 Replica c ao no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 4.11.1 Introdu c ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 4.11.2 Vis ao Geral da Implementa c ao da Replica c ao . . 380 4.11.3 Detalhes de Implementa c ao da Replica c ao . . . . . 381 4.11.4 Como Congurar a Replica c ao . . . . . . . . . . . . . . . . 386 4.11.5 Recursos de Replica c ao e Problemas Conhecidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 4.11.6 Op c oes de Inicializa c ao da Replica c ao . . . . . . . . . 392 4.11.7 Instru c oes SQL para Controle do Servidor Master . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 c oes SQL para Controle do Servidor Slave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 c ao . . . . . . . . . . . . . . . . . . . . . . . . . . 411 4.11.10 Problemas com Replica c ao . . . . . . . . . . . . . . . . . . 416 4.11.11 Relatando Problemas de Replica c ao . . . . . . . . . . 417
5.2
5.3
5.4
5.5
xi 5.6 5.5.6 Sintaxe de SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460 Detalhes de Disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 5.6.1 Utilizando Links Simb olicos . . . . . . . . . . . . . . . . . . . 466 5.6.1.1 Utilizando Links Simb olicos para Bancos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 5.6.1.2 Utilizando Links Simb olicos para Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
xii 6.3.1.4 Fun c oes de Fluxo de Controle . . . . . . . . . 510 6.3.2 Fun c oes String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511 6.3.2.1 Fun c oes de Compara c ao de Strings . . . . 519 6.3.2.2 Caso Sensitivo . . . . . . . . . . . . . . . . . . . . . . . 522 6.3.3 Fun c oes Num ericas . . . . . . . . . . . . . . . . . . . . . . . . . . . 522 6.3.3.1 Opera c oes Aritim eticas . . . . . . . . . . . . . . . 522 6.3.3.2 Fun c oes Matematicas . . . . . . . . . . . . . . . . . 523 6.3.4 Fun c oes de Data e Hora . . . . . . . . . . . . . . . . . . . . . . . 529 6.3.5 Fun c oes de Convers ao . . . . . . . . . . . . . . . . . . . . . . . . . 543 6.3.6 Outras Fun c oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545 6.3.6.1 Fun c oes Bin arias . . . . . . . . . . . . . . . . . . . . . 545 6.3.6.2 Fun c oes Diversas . . . . . . . . . . . . . . . . . . . . . 546 6.3.7 Fun c oes e Modicadores para Usar com Cl ausulas GROUP BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 6.3.7.1 Fun c oes GROUP BY . . . . . . . . . . . . . . . . . . . . 555 6.3.7.2 Modicadores GROUP BY . . . . . . . . . . . . . . 558 6.3.7.3 GROUP BY com Campos Escondidos . . . . 561 6.4 Manipula c ao de Dados: SELECT, INSERT, UPDATE e DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 c oes Usando Subquery . . . . . . . 571 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 Deni c ao de Dados: CREATE, DROP e ALTER . . . . . . . . . . . . . . 596 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 c ao de Especica c oes de Colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Comandos Utilit arios B asicos do Usu ario MySQL . . . . . . . . 613 6.6.1 Sintaxe USE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 6.6.2 Sintaxe DESCRIBE (Obtem Informa c oes Sobre Colunas) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 Comandos Transacionais e de Lock do MySQL . . . . . . . . . . 614 6.7.1 Sintaxe de START TRANSACTION, COMMIT e ROLLBACK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614 6.7.2 Instru c oes que N ao Podem Ser Desfeitas . . . . . . . . 615 6.7.3 Instru c oes que Fazem um Commit Implicito . . . . 615 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 Pesquisa Full-text no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . 618 6.8.1 Restri c oes Full-text . . . . . . . . . . . . . . . . . . . . . . . . . . . 622 6.8.2 Ajuste Fino de Pesquisas Full-text no MySQL . . 623 6.8.3 TODO de Pesquisas Full-text . . . . . . . . . . . . . . . . . . 624 Cache de Consultas do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 624 6.9.1 Como a Cache de Consultas Opera . . . . . . . . . . . . . 625 6.9.2 Congura c ao da Cache de Consultas . . . . . . . . . . . 626 6.9.3 Op c oes da Cache de Consultas na SELECT . . . . . . 627 6.9.4 Estado e Manuten c ao da Cache de Consultas . . . 627
6.6
6.7
6.8
6.9
7.2 7.3
xiv 7.4 7.5 Tabelas Tabelas 7.5.1 7.5.2 7.5.3 7.5.4 HEAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640 InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642 Vis ao Geral de Tabelas InnoDB . . . . . . . . . . . . . . . . 642 InnoDB no MySQL Vers ao 3.23 . . . . . . . . . . . . . . . . 642 Op c oes de Inicializa c ao do InnoDB . . . . . . . . . . . . . 643 Criando Tablespaces no InnoDB . . . . . . . . . . . . . . . 650 7.5.4.1 Se Alguma Coisa Der Errado Na Cria c ao 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 c oes FOREIGN KEY . . . . . . . . . . . . . . . 652 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 cando a recupera c ao . . . . . . . . . . . . . . 657 7.5.7.2 Ponto de Verica c ao . . . . . . . . . . . . . . . . . 658 7.5.8 Movendo um Banco de Dados InnoDB para Outra M aquina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658 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 Denidos por Diferentes Instru c oes SQL no InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . 662 7.5.9.6 Detec c ao de Deadlock e Rollback . . . . . . 663 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 c ao de Multi-versioning . . . . . . . . . . . 669 7.5.12 Estrutura de Tabelas e Indices . . . . . . . . . . . . . . . . 670 7.5.12.1 Estrutura F isica do Indice . . . . . . . . . . . 671 7.5.12.2 Buer de Inser c ao . . . . . . . . . . . . . . . . . . . 671 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 co de Arquivos e E/S de Disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673 7.5.13.1 E/S de Disco . . . . . . . . . . . . . . . . . . . . . . . 673
xv 7.5.13.2 Gerenciamento do Espa co de Arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674 7.5.13.3 Desfragmentando uma Tabela . . . . . . . . 675 7.5.14 Tratando Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675 7.5.15 Restri c oes em Tabelas InnoDB . . . . . . . . . . . . . . . 675 7.5.16 Hist orico de Altera c oes do InnoDB . . . . . . . . . . . . 677 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 co de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680 7.5.16.10 MySQL/InnoDB-4.0.12, 18 Mar co de 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 c oes de Contato do InnoDB . . . . . . . . . . . . 694 Tabelas BDB ou BerkeleyDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695 7.6.1 Vis ao Geral de Tabelas BDB . . . . . . . . . . . . . . . . . . . . 695 7.6.2 Instalando BDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695 7.6.3 Op c oes de Inicializa c ao do BDB . . . . . . . . . . . . . . . . . 696 7.6.4 Caracter isticas de Tabelas BDB: . . . . . . . . . . . . . . . . 697 7.6.5 Itens a serem corrigidos no BDB num futuro pr oximo: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698 7.6.6 Sistemas operacionais suportados pelo BDB . . . . . . 698 7.6.7 Restri c oes em Tabelas BDB . . . . . . . . . . . . . . . . . . . . 699 7.6.8 Erros Que Podem Ocorrer Usando Tabelas BDB . . 699
7.6
xvii
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 Congura c ao do Conjunto de 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 icas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725 9.11.3 Conjunto de Caracteres do Sul da Europa e Oriente M edio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725 9.11.4 Os Conjuntos de Caracteres Asi aticos . . . . . . . . . 725 9.11.5 Os Conjuntos de Caracteres B alticos . . . . . . . . . . 726 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
xix 10.4.2.1 Criando Valores Geometry Usando Fun c oes WKT . . . . . . . . . . . . . . . . . . . . . . . . . . . 739 10.4.2.2 Criando Valores Geometry Usando Fun c oes WKB . . . . . . . . . . . . . . . . . . . . . . . . . . . 740 10.4.2.3 Criando uma Valor de Geometira Usando Fun c oes Espec icas 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 c ao Espacial . . . . . . . . . . . . . . . . . . . . . . . 744 10.5.1 Fun c oes Para Converter Geometrias Entre Formatos Diferentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745 10.5.2 Fun c oes de An alise das Propriedades de Geometry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745 10.5.2.1 Fun c oes de An alise das Propriedades de Geometry em Geral . . . . . . . . . . . . . . . . . . . . . . 746 10.5.2.2 Fun c oes de An alise das Propriedades de Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747 10.5.2.3 Fun c oes de An alise das Propriedades de LineString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748 10.5.2.4 Fun c oes de An alise das Propriedades de MultiLineString . . . . . . . . . . . . . . . . . . . . . . . . 749 10.5.2.5 Fun c oes de An alise das Propriedades de Polygon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750 10.5.2.6 Fun c oes de An alise das Propriedades de MultiPolygon . . . . . . . . . . . . . . . . . . . . . . . . . . . 751 10.5.2.7 Fun c oes de An alise das Propriedades de GeometryCollection . . . . . . . . . . . . . . . . . . . . 751 10.5.3 Fun c oes Que Criam Novas Geometrias de Outras Existentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752 10.5.3.1 Fun c oes de Geometria Que Produzem Novas Geometrias . . . . . . . . . . . . . . . . . . . . . . . . 752 10.5.3.2 Operadores Espaciais . . . . . . . . . . . . . . . . 752 10.5.4 Fun c oes Para Testar Rela c oes Espaciais Entre Objetos Geom etricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753 10.5.5 Rela c oes de Ret angulo de Limite M inimo (Minimal Bounding Rectangles - MBR) em Geometrias . . . . . 753 10.5.6 Fun c oes que Testam Relacionamentos Espaciais Entre Geometrias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754 10.6 Otimizando An alises Espaciais . . . . . . . . . . . . . . . . . . . . . . . . 755 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 ao Est ao Implementados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758
11
xxi
12
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 c oes Preparadas da API C . . . . . . . . . . . . . . 824 12.1.5 Tipos de Dados de Instru c oes Preparadas da API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 824 12.1.6 Vis ao Geral das Fun c oes de Instru c oes Preparadas da API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827 12.1.7 Descri c ao das Fun c oes de Instru c ao Preparada da 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 c ao de M ultiplas Consultas na API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 851 12.1.9 Manipulando Valores de Data e Hora na API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
xxiii 12.1.10 Descri c ao das Fun c oes de Threads da API C . . 854 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 c ao das Fun c oes do Servidor Embutido da API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855 12.1.11.1 mysql_server_init() . . . . . . . . . . . . . 855 12.1.11.2 mysql_server_end() . . . . . . . . . . . . . . 856 12.1.12 D uvidas e problemas comuns ao utilzar a API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857 12.1.12.1 Porque Algumas Vezes mysql_store_result() Retorna NULL Ap os 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 c ao na API C . . . 858 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 ao Geral da Biblioteca do Servidor MySQL Embutido . . . . . . . . . . . . . . . . . . . . . . . 860 12.1.15.2 Compilando Programas com libmysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 861 12.1.15.3 Restri c oes no Uso de um Servidor MySQL Embutido . . . . . . . . . . . . . . . . . . . . . . . 861 12.1.15.4 Usando Arquivo de Op c oes com o 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 arios Campos no Programa de Administra c ao do ODBC . . . . . . . . . . . . . . . . . . . . . . . . 867 12.2.3 Par ametros de Conex ao do MyODBC . . . . . . . . . 868 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 . . . . . . . 12.5 API Perl do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5.1 DBI com DBD::mysql . . . . . . . . . . . . . . . . . . . . . . . . 12.5.2 A interface DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5.3 Mais Informa c oes DBI/DBD . . . . . . . . . . . . . . . . . . . 12.6 API C++ do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.6.1 Borland C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.7 API Python do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.8 API Tcl do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.9 Eiel Wrapper do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876 876 877 877 883 883 883 884 884 884
13 14
xxv
xxvi A.5.7 Problemas com Compara c ao de Ponto Flutuante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930 Assuntos Relacionados ao Otimizador . . . . . . . . . . . . . . . . . . 932 A.6.1 Camo evitar o varredura da tabela,,, . . . . . . . . . . . 933 Assuntos Relacionados a Deni c oes de Tabelas . . . . . . . . . . 933 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
A.6 A.7
xxvii C.3.10 Altera c oes na distribui c ao 4.0.8 (07 Jan 2003) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977 C.3.11 Altera c oes na distribui c ao 4.0.7 (20 Dec 2002) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977 C.3.12 Altera c oes na distribui c ao 4.0.6 (14 Dec 2002: Gamma) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 978 C.3.13 Altera c oes na distribui c ao 4.0.5 (13 Nov 2002) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 979 C.3.14 Altera c oes na distribui c ao 4.0.4 (29 Sep 2002) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 981 C.3.15 Altera c oes na distribui c ao 4.0.3 (26 Aug 2002: Beta) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 983 C.3.16 Altera c oes na distribui c ao 4.0.2 (01 Jul 2002) . . 985 C.3.17 Altera c oes na distribui c ao 4.0.1 (23 Dec 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 988 C.3.18 Altera c oes na distribui c ao 4.0.0 (Oct 2001: Alpha) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 989 C.4 Altera c oes na distribui c ao 3.23.x (Recent; still supported) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991 C.4.1 Altera c oes na distribui c ao 3.23.59 (not released yet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991 C.4.2 Altera c oes na distribui c ao 3.23.58 (11 Sep 2003) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 992 C.4.3 Altera c oes na distribui c ao 3.23.57 (06 Jun 2003) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 992 C.4.4 Altera c oes na distribui c ao 3.23.56 (13 Mar 2003) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 993 C.4.5 Altera c oes na distribui c ao 3.23.55 (23 Jan 2003) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 994 C.4.6 Altera c oes na distribui c ao 3.23.54 (05 Dec 2002) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 995 C.4.7 Altera c oes na distribui c ao 3.23.53 (09 Oct 2002) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 996 C.4.8 Altera c oes na distribui c ao 3.23.52 (14 Aug 2002) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997 C.4.9 Altera c oes na distribui c ao 3.23.51 (31 May 2002) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997 C.4.10 Altera c oes na distribui c ao 3.23.50 (21 Apr 2002) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 998 C.4.11 Altera c oes na distribui c ao 3.23.49 . . . . . . . . . . . . 999 C.4.12 Altera c oes na distribui c ao 3.23.48 (07 Feb 2002) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 999 C.4.13 Altera c oes na distribui c ao 3.23.47 (27 Dec 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000 C.4.14 Altera c oes na distribui c ao 3.23.46 (29 Nov 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000 C.4.15 Altera c oes na distribui c ao 3.23.45 (22 Nov 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
xxviii C.4.16 Altera c oes na distribui c ao 3.23.44 (31 Oct 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001 C.4.17 Altera c oes na distribui c ao 3.23.43 (04 Oct 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002 C.4.18 Altera c oes na distribui c ao 3.23.42 (08 Sep 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1003 C.4.19 Altera c oes na distribui c ao 3.23.41 (11 Aug 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1004 C.4.20 Altera c oes na distribui c ao 3.23.40 . . . . . . . . . . . 1004 C.4.21 Altera c oes na distribui c ao 3.23.39 (12 Jun 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1005 C.4.22 Altera c oes na distribui c ao 3.23.38 (09 May 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1005 C.4.23 Altera c oes na distribui c ao 3.23.37 (17 Apr 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006 C.4.24 Altera c oes na distribui c ao 3.23.36 (27 Mar 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1007 C.4.25 Altera c oes na distribui c ao 3.23.35 (15 Mar 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1007 C.4.26 Altera c oes na distribui c ao 3.23.34a . . . . . . . . . . 1008 C.4.27 Altera c oes na distribui c ao 3.23.34 (10 Mar 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1008 C.4.28 Altera c oes na distribui c ao 3.23.33 (09 Feb 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009 C.4.29 Altera c oes na distribui c ao 3.23.32 (22 Jan 2001: Production) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010 C.4.30 Altera c oes na distribui c ao 3.23.31 (17 Jan 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010 C.4.31 Altera c oes na distribui c ao 3.23.30 (04 Jan 2001) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011 C.4.32 Altera c oes na distribui c ao 3.23.29 (16 Dec 2000) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012 C.4.33 Altera c oes na distribui c ao 3.23.28 (22 Nov 2000: Gamma) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1013 C.4.34 Altera c oes na distribui c ao 3.23.27 (24 Oct 2000) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015 C.4.35 Altera c oes na distribui c ao 3.23.26 (18 Oct 2000) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015 C.4.36 Altera c oes na distribui c ao 3.23.25 (29 Sep 2000) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016 C.4.37 Altera c oes na distribui c ao 3.23.24 (08 Sep 2000) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017 C.4.38 Altera c oes na distribui c ao 3.23.23 (01 Sep 2000) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1018 C.4.39 Altera c oes na distribui c ao 3.23.22 (31 Jul 2000) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1019 C.4.40 Altera c oes na distribui c ao 3.23.21 . . . . . . . . . . . 1019 C.4.41 Altera c oes na distribui c ao 3.23.20 . . . . . . . . . . . 1020
xxix C.4.42 Altera c oes na distribui c ao 3.23.19 . . . . . . . . . . . 1020 C.4.43 Altera c oes na distribui c ao 3.23.18 . . . . . . . . . . . 1021 C.4.44 Altera c oes na distribui c ao 3.23.17 . . . . . . . . . . . 1021 C.4.45 Altera c oes na distribui c ao 3.23.16 . . . . . . . . . . . 1022 C.4.46 Altera c oes na distribui c ao 3.23.15 (May 2000: Beta) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1022 C.4.47 Altera c oes na distribui c ao 3.23.14 . . . . . . . . . . . 1023 C.4.48 Altera c oes na distribui c ao 3.23.13 . . . . . . . . . . . 1024 C.4.49 Altera c oes na distribui c ao 3.23.12 (07 Mar 2000) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024 C.4.50 Altera c oes na distribui c ao 3.23.11 . . . . . . . . . . . 1025 C.4.51 Altera c oes na distribui c ao 3.23.10 . . . . . . . . . . . 1025 C.4.52 Altera c oes na distribui c ao 3.23.9 . . . . . . . . . . . . 1025 C.4.53 Altera c oes na distribui c ao 3.23.8 (02 Jan 2000) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026 C.4.54 Altera c oes na distribui c ao 3.23.7 (10 Dec 1999) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1027 C.4.55 Altera c oes na distribui c ao 3.23.6 . . . . . . . . . . . . 1027 C.4.56 Altera c oes na distribui c ao 3.23.5 (20 Oct 1999) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1028 C.4.57 Altera c oes na distribui c ao 3.23.4 (28 Sep 1999) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029 C.4.58 Altera c oes na distribui c ao 3.23.3 . . . . . . . . . . . . 1029 C.4.59 Altera c oes na distribui c ao 3.23.2 (09 Aug 1999) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1030 C.4.60 Altera c oes na distribui c ao 3.23.1 . . . . . . . . . . . . 1031 C.4.61 Altera c oes na distribui c ao 3.23.0 (05 Aug 1999: Alpha) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1031 Altera c oes na distribui c ao 3.22.x (Old; discontinued) . . . 1033 C.5.1 Altera c oes na distribui c ao 3.22.35 . . . . . . . . . . . . 1033 C.5.2 Altera c oes na distribui c ao 3.22.34 . . . . . . . . . . . . 1033 C.5.3 Altera c oes na distribui c ao 3.22.33 . . . . . . . . . . . . 1033 C.5.4 Altera c oes na distribui c ao 3.22.32 (14 Feb 2000) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1033 C.5.5 Altera c oes na distribui c ao 3.22.31 . . . . . . . . . . . . 1034 C.5.6 Altera c oes na distribui c ao 3.22.30 . . . . . . . . . . . . 1034 C.5.7 Altera c oes na distribui c ao 3.22.29 (02 Jan 2000) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1034 C.5.8 Altera c oes na distribui c ao 3.22.28 (20 Oct 1999) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1034 C.5.9 Altera c oes na distribui c ao 3.22.27 . . . . . . . . . . . . 1034 C.5.10 Altera c oes na distribui c ao 3.22.26 (16 Sep 1999) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035 C.5.11 Altera c oes na distribui c ao 3.22.25 . . . . . . . . . . . 1035 C.5.12 Altera c oes na distribui c ao 3.22.24 (05 Jul 1999) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035 C.5.13 Altera c oes na distribui c ao 3.22.23 (08 Jun 1999) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035
C.5
xxx C.5.14 Altera c oes na distribui c ao 3.22.22 (30 Apr 1999) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036 C.5.15 Altera c oes na distribui c ao 3.22.21 . . . . . . . . . . . 1036 C.5.16 Altera c oes na distribui c ao 3.22.20 (18 Mar 1999) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036 C.5.17 Altera c oes na distribui c ao 3.22.19 (Mar 1999: Production) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036 C.5.18 Altera c oes na distribui c ao 3.22.18 . . . . . . . . . . . 1036 C.5.19 Altera c oes na distribui c ao 3.22.17 . . . . . . . . . . . 1037 C.5.20 Altera c oes na distribui c ao 3.22.16 (Feb 1999: Gamma) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1037 C.5.21 Altera c oes na distribui c ao 3.22.15 . . . . . . . . . . . 1037 C.5.22 Altera c oes na distribui c ao 3.22.14 . . . . . . . . . . . 1038 C.5.23 Altera c oes na distribui c ao 3.22.13 . . . . . . . . . . . 1038 C.5.24 Altera c oes na distribui c ao 3.22.12 . . . . . . . . . . . 1038 C.5.25 Altera c oes na distribui c ao 3.22.11 . . . . . . . . . . . 1039 C.5.26 Altera c oes na distribui c ao 3.22.10 . . . . . . . . . . . 1039 C.5.27 Altera c oes na distribui c ao 3.22.9 . . . . . . . . . . . . 1040 C.5.28 Altera c oes na distribui c ao 3.22.8 . . . . . . . . . . . . 1040 C.5.29 Altera c oes na distribui c ao 3.22.7 (Sep 1998: Beta) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041 C.5.30 Altera c oes na distribui c ao 3.22.6 . . . . . . . . . . . . 1041 C.5.31 Altera c oes na distribui c ao 3.22.5 . . . . . . . . . . . . 1042 C.5.32 Altera c oes na distribui c ao 3.22.4 . . . . . . . . . . . . 1043 C.5.33 Altera c oes na distribui c ao 3.22.3 . . . . . . . . . . . . 1044 C.5.34 Altera c oes na distribui c ao 3.22.2 . . . . . . . . . . . . 1044 C.5.35 Altera c oes na distribui c ao 3.22.1 (Jun 1998: Alpha) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1045 C.5.36 Altera c oes na distribui c ao 3.22.0 . . . . . . . . . . . . 1045 Altera c oes na distribui c ao 3.21.x . . . . . . . . . . . . . . . . . . . . . . 1047 C.6.1 Altera c oes na distribui c ao 3.21.33 . . . . . . . . . . . . 1047 C.6.2 Altera c oes na distribui c ao 3.21.32 . . . . . . . . . . . . 1047 C.6.3 Altera c oes na distribui c ao 3.21.31 . . . . . . . . . . . . 1047 C.6.4 Altera c oes na distribui c ao 3.21.30 . . . . . . . . . . . . 1048 C.6.5 Altera c oes na distribui c ao 3.21.29 . . . . . . . . . . . . 1048 C.6.6 Altera c oes na distribui c ao 3.21.28 . . . . . . . . . . . . 1048 C.6.7 Altera c oes na distribui c ao 3.21.27 . . . . . . . . . . . . 1049 C.6.8 Altera c oes na distribui c ao 3.21.26 . . . . . . . . . . . . 1049 C.6.9 Altera c oes na distribui c ao 3.21.25 . . . . . . . . . . . . 1049 C.6.10 Altera c oes na distribui c ao 3.21.24 . . . . . . . . . . . 1050 C.6.11 Altera c oes na distribui c ao 3.21.23 . . . . . . . . . . . 1050 C.6.12 Altera c oes na distribui c ao 3.21.22 . . . . . . . . . . . 1050 C.6.13 Altera c oes na distribui c ao 3.21.21a . . . . . . . . . . 1051 C.6.14 Altera c oes na distribui c ao 3.21.21 . . . . . . . . . . . 1051 C.6.15 Altera c oes na distribui c ao 3.21.20 . . . . . . . . . . . 1051 C.6.16 Altera c oes na distribui c ao 3.21.19 . . . . . . . . . . . 1052 C.6.17 Altera c oes na distribui c ao 3.21.18 . . . . . . . . . . . 1052 C.6.18 Altera c oes na distribui c ao 3.21.17 . . . . . . . . . . . 1052
C.6
xxxi C.6.19 Altera c oes na distribui c ao 3.21.16 . . . . . . . . . . . C.6.20 Altera c oes na distribui c ao 3.21.15 . . . . . . . . . . . C.6.21 Altera c oes na distribui c ao 3.21.14b . . . . . . . . . . C.6.22 Altera c oes na distribui c ao 3.21.14a . . . . . . . . . . C.6.23 Altera c oes na distribui c ao 3.21.13 . . . . . . . . . . . C.6.24 Altera c oes na distribui c ao 3.21.12 . . . . . . . . . . . C.6.25 Altera c oes na distribui c ao 3.21.11 . . . . . . . . . . . C.6.26 Altera c oes na distribui c ao 3.21.10 . . . . . . . . . . . C.6.27 Altera c oes na distribui c ao 3.21.9 . . . . . . . . . . . . C.6.28 Altera c oes na distribui c ao 3.21.8 . . . . . . . . . . . . C.6.29 Altera c oes na distribui c ao 3.21.7 . . . . . . . . . . . . C.6.30 Altera c oes na distribui c ao 3.21.6 . . . . . . . . . . . . C.6.31 Altera c oes na distribui c ao 3.21.5 . . . . . . . . . . . . C.6.32 Altera c oes na distribui c ao 3.21.4 . . . . . . . . . . . . C.6.33 Altera c oes na distribui c ao 3.21.3 . . . . . . . . . . . . C.6.34 Altera c oes na distribui c ao 3.21.2 . . . . . . . . . . . . C.6.35 Altera c oes na distribui c ao 3.21.0 . . . . . . . . . . . . Altera c oes na distribui c ao 3.20.x . . . . . . . . . . . . . . . . . . . . . . C.7.1 Altera c oes na distribui c ao 3.20.18 . . . . . . . . . . . . C.7.2 Altera c oes na distribui c ao 3.20.17 . . . . . . . . . . . . C.7.3 Altera c oes na distribui c ao 3.20.16 . . . . . . . . . . . . C.7.4 Altera c oes na distribui c ao 3.20.15 . . . . . . . . . . . . C.7.5 Altera c oes na distribui c ao 3.20.14 . . . . . . . . . . . . C.7.6 Altera c oes na distribui c ao 3.20.13 . . . . . . . . . . . . C.7.7 Altera c oes na distribui c ao 3.20.11 . . . . . . . . . . . . C.7.8 Altera c oes na distribui c ao 3.20.10 . . . . . . . . . . . . C.7.9 Altera c oes na distribui c ao 3.20.9 . . . . . . . . . . . . . C.7.10 Altera c oes na distribui c ao 3.20.8 . . . . . . . . . . . . C.7.11 Altera c oes na distribui c ao 3.20.7 . . . . . . . . . . . . C.7.12 Altera c oes na distribui c ao 3.20.6 . . . . . . . . . . . . C.7.13 Altera c oes na distribui c ao 3.20.3 . . . . . . . . . . . . C.7.14 Altera c oes na distribui c ao 3.20.0 . . . . . . . . . . . . Altera c oes na distribui c ao 3.19.x . . . . . . . . . . . . . . . . . . . . . . C.8.1 Altera c oes na distribui c ao 3.19.5 . . . . . . . . . . . . . C.8.2 Altera c oes na distribui c ao 3.19.4 . . . . . . . . . . . . . C.8.3 Altera c oes na distribui c ao 3.19.3 . . . . . . . . . . . . . 1053 1053 1054 1054 1054 1055 1055 1056 1056 1056 1057 1057 1057 1058 1058 1059 1059 1060 1060 1061 1062 1062 1062 1063 1063 1064 1064 1064 1064 1065 1066 1067 1067 1067 1068 1068
C.7
C.8
xxxii
Ap endice E Vari aveis de Ambientes do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1083 Ap endice F Sintaxe de Express oes Regulares do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1084 Ap endice G GPL - Licen ca P ublica Geral do GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1087 Indices dos Comandos, Tipos e Fun co es SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1093 Concept Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1102
O script mysqlbug deve ser usado para gerar comunicados de erros no Unix. (A distribui c ao do Windows cont em um arquivo mysqlbug.txt no diret orio base que pode ser usado como um template para um relat orio de erro. Em distribui c oes fonte, o script mysqlbug pode ser encontrado no diret orio scripts. Para distribui c oes bin arias, o mysqlbug pode ser encontrado no diret orio bin (/usr/bin para o pacote RMP do servidor MySQL. Se voc e encontrou um erro de seguran ca no Servidor MySQL, voc e deve enviar um email para security@mysql.com.
filename Fonte de largura xa com aspas e usada para nomes e caminhos de arquivos. Exemplo: A distribui c ao e instalada sobre o diret orio /usr/local. c Fonte de largura constante com aspas e tamb em usada para indicar sequ encias de caracteres. Exemplo: Para especicar um meta caracter, use o caractere %. Fonte It alica e usada para dar enfase, como aqui. Fonte em negrito e usada em cabe calhos de tabela e indicar enfase especial.
italic boldface
Quando um comando deve ser executado por um programa, ele e indicado por um prompt antes do comando. Por exemplo, shell> indica um comando que e executado do seu shell atual e mysql> indica um comando que e executado no programa cliente mysql; shell> digite um comando shell aqui mysql> digite um comando mysql aqui A shell e seu interpretador de comando. No Unix, ele e normalmente um programa como sh ou csh. No Windows, o equivalente e o command.com ou cmd.exe, normalmente executado como um console do Windows. Comandos Shell s ao mostrados usando a sintaxe do Shell Bourne. Se voc e usa um shell do estilo csh, pode ser necess ario alterar algum de seus comandos. Por exemplo, a sequ encia para congurar uma vari avel de ambiente e executar um comando se parece com o listado abaixo na sintaxe Bourne Shell: shell> NOMEVAR=valor algum_comando Para csh ou tcsh, execute a sequ encia desta forma: 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 c oes s ao necess arias, este manual usa nome_db, nome_tbl e nome_col. Por exemplo, voc e pode encontrar uma express ao assim: mysql> SELECT nome_col FROM nome_bd.nome_tbl; Isso signica que se voc e estiver trabalhando numa express ao similar, forneceria seu pr oprio nome de banco de dados, tabela e colunas, talvez assim: mysql> SELECT nome_autor FROM biblio_bd.lista_autor; SQL keywords n ao caso sensitivas e podem ser escritas em mai uscula ou min uscula. Este manual utiliza letras mai usculas. Em descri c oes de sintaxe, colchetes ([ e ]) s ao usados para indicar palavras ou cl ausulas opcionais. Por exemplo, na seguinte instru c ao, IF EXISTS e opcional: DROP TABLE [IF EXISTS] nome_tbl Quando elementos da sintaxe possuem mais de uma alternativa, elas s ao separados por barras verticais (|). Quando um menbro de um conjunto de op c oes pode ser escolhido, as alternativas s ao listadas em colchetes ([ e ]): TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) Quando um membro de um conjunto de op c oes deve ser selecionado, as alternativas s ao listadas dentro de chaves ({ e }): {DESCRIBE | DESC} nome_tbl {nome_col | metacar}
tivos de performance do Servidor MySQL com outros gerenciadores de bancos de dados na nossa p agina de benchmark Veja Se c ao 5.1.4 [MySQL Benchmarks], P agina 422. O Servidor MySQL foi desenvolvido originalmente para lidar com bancos de dados muito grandes de maneira muito mais r apida que as solu c oes existentes e tem sido usado em ambientes de produ c ao de alta demanda por diversos anos de maneira bem sucedida. Apesar de estar em constante desenvolvimento, o Servidor MySQL oferece hoje um rico e proveitoso conjunto de fun c oes. A conectividade, velocidade, e seguran ca fazem com que o MySQL seja altamente adapt avel para acessar bancos de dados na Internet. As caracter isticas t ecnicas do MySQL Para informa c oes t ecnicas avan cadas, veja Cap ptexi tulo 6 [Reference], P agina 469. O Programa de Banco de Dados MySQL e um sistema 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 c ao (APIs). Tamb em concedemos o Servidor MySQL como uma biblioteca multi-tarefa que voc e pode ligar ` a sua aplica c ao para chegar a um produto mais r apido, menor e mais f acilmente gerenci avel. MySQL tem muitos softwares de colaboradores dispon ivel. bem prov E avel que sua aplica c ao ou linguagem favorita j a suporte o Servidor de Banco de Dados MySQL. A pron uncia ocial do MySQL e Mai Ess Que Ell (e n ao MAI-SEQUEL). Mas n os n ao ligamos se voc e pronunciar MAI-SEQUEL ou de outra forma qualquer.
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 c ao 6.2 [Tipos de Coluna], P agina 482. Registros de tamanhos xos ou vari aveis. Comandos e Fun c oes Completo suporte a operadores e fun c oes nas partes SELECT e WHERE das consultas. Por exemplo: mysql> SELECT CONCAT(first_name, " ", last_name) -> FROM nome_tbl -> WHERE income/dependents > 10000 AND age > 30;
Suporte pleno ` as cl ausulas SQL GROUP BY e ORDER BY. Suporte para fun c oes 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 ao dispon iveis como denidos no padr ao SQL92. DELETE, INSERT, REPLACE, e UPDATE retornam o n umero de linhas que poss foram alteradas (afetadas). E ivel retornar o n umero de linhas com padr ao coincidentes congurando um par ametro quando estiver conectando ao servidor. O comando espec ico do MySQL SHOW pode ser usado para devolver informa c oes sobre bancos de dados, tabelas e indices. O comando EXPLAIN pode ser usado para determinar como o otimizador resolve a consulta. Nomes de fun c oes n ao conitam com nomes de tabelas ou colunas. Por exemplo, ABS e um nome de campo v alido. A u nica restri c ao e que para uma chamada de fun c ao, espa cos n ao s ao permitidos entre o nome da fun c ao e o ( que o segue. Veja Se c ao 6.1.7 [Palavras reservadas], P agina 479. Voc e pode misturar tabelas de bancos de dados diferentes na mesma pesquisa (como na vers ao 3.22). Seguran ca Um sistema de privil egios e senhas que e muito ex ivel, seguro e que permite verica c ao baseada em esta c oes/m aquinas. Senhas s ao seguras porque todo o tr aco de senhas e criptografado quando voc e se conecta ao servidor. Escalabilidade e limites Lida com bancos de dados enormes. Usamos o Servidor MySQL com bancos de dados que cont em 50.000.000 registros e sabemos de usu arios que usam o Servidor MySQL com 60.000 tabelas e aproximadamente 5.000.000.000 de linhas. S ao permitidos at e 32 indices por tabela. Cada indice pode ser composto de 1 a 16 colunas ou partes de colunas. O tamanho m aximo do indice e de 500 bytes (isto pode ser alterado na compila c ao do MySQL). Um indice pode usar o prexo 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 ilia NT (NT, 2000 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 ao ODBC (Open-DataBase-Connectivity). Por exemplo, voc e pode usar o MS Access para conectar ao seu servidor MySQL. Os clientes podem ser executados no Windows ou Unix. O fonte do Connector/ODBC est a dispon ivel. Todas as fun c oes ODBC s ao suportadas, assim como muitas outras. Veja Se c ao 12.2 [ODBC], P agina 866.
Localiza c ao O servidor pode apresentar mensagem de erros aos clientes em v arias l inguas. Veja Se c ao 4.7.2 [Languages], P agina 328. Suporte total para v arios conjuntos de caracteres, que incluem ISO-8859-1 (Latin1), big5, ujis e mais. Por exemplo, os caracteres Escandinavos ^ a, a, o s ao permitidos em nomes de tabelas e colunas. Todos os dados s ao armazenados no conjunto de caracteres escolhido. Todas as compara c oes em colunas de seq u encias caso-insensitivo. A ordena c ao e feita de acordo com o conjunto de caracteres escolhido (o poss modo sueco por padr ao). E ivel alterar isso quando o servidor MySQL e iniciado. Para ver um exemplo de v arias ordena c oes avan cadas, procure pelo c odigo de ordena c ao Tcheca. O Servidor MySQL suporta diversos conjuntos de caracteres que podem ser especicados em tempo de compila c ao e execu c ao. Clientes e Ferramentas O servidor MySQL foi constru ido com suporte para instru c oes SQL que vericam, otimizam e reparam tabelas. Estas instru c oes est ao dispon iveis a partir da linha de comando por meio do cliente myisamcheck, O MySQL inclui tamb em o myisamchk, um utilit ario muito r apido para realizar estas opera c oes em tabelas MyISAM. Veja Capptexi tulo 4 [MySQL Database Administration], P agina 208. Todos os programas MySQL podem ser chamados com as op c oes --help ou -? para obter ajuda online.
O Servidor MySQL e escrito em m ultiplas camadas com m odulos independentes. Alguns dos novos m odulos est ao listados abaixo com indica c oes de qu ao bem-testado foi cada um deles. Replica c ao Gamma Grandes grupos de servidores usando replica c ao est ao em uso, com bom resultados. O trabalho no aprimoramento dos recursos de replica c ao continua no MySQL 4.x. Tabelas InnoDB Est avel (na 3.23, 3.23.49) O mecanismo de armazenamento transacional InnoDB foi declarado est avel na arvore do MySQL 3.23, a partir da vers ao 3.23.49. InnoDB tem sido usado em sistema de produ c ao grandes e com carga pesada. Tabelas BDB Gamma O c odigo do Berkeley DB e muito est avel, mas ainda estamos melhorando a interface do mecanismo de armazenamento transacional do BDB no Servidor MySQL, assim levar a algum tempo at e que ele esteja t ao bem testado quanto os outro tipos de tabela. Pesquisas Full-text Beta Pesquisa full-text funcionam mas ainda n ao s ao largamente usadas. Melhoramentos importantes forma implementados no MySQL 4.0. MyODBC 3.51 (usa ODBC SDK 3.51) Est avel Em grande uso na produ c ao. Alguns problemas apresentados parecem ser relacionados a aplica c ao e independente do driver ODBC ou do servidor de banco de dados. Recupera c ao autom atica de tabelas MyISAM Gamma Este status se aplica apenas ao novo c odigo que confere no mecanismo de armazenamento MyISAM que verica, na inicializa c ao, se a tabela foi fechada corretamente e executa uma confer encia/reparo autom atico da tabela em caso negativo. Bulk-insert Alpha Novo recurso nas tabelas MyISAM no MySQL 4.0 para inser c oes mais r apidas de v arios registros. Locking Gamma Esse m odulo e muito dependente do sistema. Em alguns sistemas existem certos problemas por utilizar o locking padr ao do SO (fcntl(). Nestes casos, voc e deve executar o mysqld com o par ametro --skip-external-locking. S ao 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 em fornece uma lista de discuss ao como um recurso da comunidade onde qualquer pessoa pode tirar suas d uvidas. Erros s ao normalmente corrigidos com um patch; para erros s erios, normalmente e lan cada uma nova distribui c ao.
10
11
12
| 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 nal e zero porque o ano nal (2050) excede o TIMESTAMP maximo. O tipo de dados TIMESTAMP, que e usado para armazenar a hora atual, suporta valores na faixa de 19700101000000 a 20300101000000 em m aquinas 32 bits (valor com sinal). Em m aquinas de 64 bits, TIMESTAMP trata valores at e 2106 (valores sem sinal). O exemplo mostra que os tipos DATE e DATETIME n ao tem problemas com as datas usadas. Eles ir ao conseguir trabalhar com datas at e o ano 9999. Embora o MySQL Server seja seguro em rela c ao ao ano 2000, voc e pode ter problemas se voc e us a-lo com aplica c oes que n ao s ao seguras com o ano 2000. Por exemplo, muitas aplica c oes antigas armazenam ou manipulam anos usando valores de 2 digitos (que s ao amb iguos) em vez de 4 digitos. Este problema pode ser aumentado por aplica c oes que usam valores como 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 c oes e fun c oes de tratamento de datas. Assim, apesar do Servidor MySQL n ao ter problemas com o ano 2000, e de responsabilidade de sua aplica c ao fornecer datas que n ao sejam amb iguas. Veja Se c ao 6.2.2.1 [Y2K issues], P agina 490 para as regras do Servidor MySQL para lidar com entrada de datas amb iguas que contenham valores de ano com 2 d igitos.
13
O melhor e o mais usado banco de dados no mundo. Acess ivel e dispon ivel para todos. F acil de usar. Melhorado continuamente, permanecendo r apido e seguro. Divertido de se usar e aprimorar. Livre de erros (bugs).
A MySQL AB e sua equipe: Promovem a losoa Open Source e suporte ` a comunidade Open Source. Tem como objetivo serem bons cidad aos. Tem prefer encia por parceiros que compartilhem nossos valores e id eias. Respondem e-mails e d ao suporte. S ao uma empresa virtual, conectada com outras. Trabalha contra patentes de sistemas. O site do MySQL (http://www.mysql.com/) fornece as u ltimas informa c oes sobre o MySQL e a MySQL AB. A prop osito, a parte AB do nome da companhia e o acr onimo para a palavra su eca aktiebolag, ou sociedade an onima. Ela e traduzida para MySQL, Inc. De fato, MySQL Inc. e MySQL GmbH s ao exemplos de subsidi arias da MySQL AB. Elas est ao localizadas nos EUA e Alemanha, respectivamente.
1.3.1.1 Suporte
A MySQL AB e gerenciada pelos fundadores e principais desenvolvedores do banco de dados MySQL. Os desenvolvedores tem o compromisso de dar suporte aos clientes e outros usu arios com objetivo de manterem contato com as suas necessiades e problemas. Todo o nosso suporte e dado por desenvolvedores qualicado. D uvidas mais complicadas s ao respondidas por Michael Monty Widenius, principal autor do MySQL Server. Veja Se c ao 1.4.1 [Suporte], P agina 17. Para maiores informa c oes e pedido de suporte de diversos n iveis, veja http://www.mysql.com/support/ ou contate nossos vendedores em sales@mysql.com.
14
Se voc e estiber interessado em nosso treinamento como um participante em portencial ou como um parceiro de treinamento, viste a se c ao de treinamento em http://www.mysql.com/training/ ou contate nos em: training@mysql.com. Para detalhes sobre o Programa de Certifica c~ ao MySQL, veja http://www.mysql.com/certification/.
1.3.1.3 Consultoria
A MySQL AB e seus Parceiros Autorizados oferecem servi cos de consultoria para usu arios do Servidor MySQL e ` aqueles que utilizam o Servisdor MySQL embutido em seus programas, em qualquer parte do mundo. Nossos consultores podem ajud a-lo projetando e ajustando o seu banco de dados, criar consultas ecientes, ajustar sua plataforma para uma melhor performance, resolver quest oes de migra c ao, congurar replica c ao, criar aplica c oes transacionais robustas, e mais. Tamb em ajudamos os nossos clientes com o Servidor MySQL embutido em seus produtos e aplica c oes para desenvolvimento em larga-escala. Nossos consultores trabalham em colabora c ao com a nossa equipe de desenvolvimento, o que assegura a qualidade t ecnica de nossos servi cos prossionais. Os servi cos de consultoria varia de sess oes de 2 dias a projetos que gastam semanas e meses. Nosso peritos n ao apenas cobrem o Servidor MySQLeles tamb em conhecem sobre linguagens de programa c ao e scripts tais como PHP, Perl e mais. Se estiver interessado em nossos servi cos de consultoria ou quiser se tornar nosso parceiro, visite a se c ao sobre consultaria em nosso web site em http://www.mysql.com/consulting/ ou contate nossa equipe de consultoria em consulting@mysql.com.
15
1.3.1.5 Parcerias
A MySQL AB tem um programa de parceria mundial que cobre cursos de treinamento, consultaria e suporte, publica c oes, mais a revenda e distribiui c ao do MySQL e produtos relacionados. Os Parceiros da MySQL AB ganham visibilidade no nosso web site (http://www.mysql.com/) e o direito de usarem vers oes especiais da marca MySQL para identicar seus produtos e promoverem os seus neg ocios. Se voc e est a interessado em se tornar um Parceiro da MySQL AB, envie-nos um email para partner@mysql.com. A palavra MySQL e o logomarca do golnho da MySQL s ao marcas registradas da MySQL AB. Veja Se c ao 1.4.4 [MySQL AB Logos and Trademarks], P agina 20. Estas marcas registradas representam um valor signicante que os fundadores do MySQL construiram ao longo dos anos. O web site do MySQL (http://www.mysql.com/) e popular entre desenvolvedores e usu arios. Em Outubro de 2001, obtivemos mais de 10 milh oes e views. Nossos visitantes representam um grupo que tomam decis oes de compra e fazem recomend c oes de software e hardware. Vinte por cento de nossos vistantes autorizam decis oes de compra e apenas nove por cento n ao est ao envolvidos com a area de compras. Mais de 65% zeram uma ou mais compras online no u ltimo semaster e 70% planejam fazer uma compra nos pr oximos meses.
16
equipe de treinamento da MySQL AB via e-mail em training@mysql.com. Veja Se c ao 1.3.1.2 [Business Services Training], P agina 14. Para informa c oes sobre o Progrma de Certifica co MySQL, veja http://www.mysql.com/certification/. Veja Se c ao 1.3.1.2 [Business Services Training], P agina 14. Se voc e estiver interessado em consultoria, visite a se c ao de consultorias de nosso web site em http://www.mysql.com/consulting/. Se voc e tiver restri c oes acesso a internet, contate a equipe de consultores da MySQL AB via e-mail em consulting@mysql.com. Veja Se c ao 1.3.1.3 [Business Services Consulting], P agina 14. Licen cas comerciais podem ser compradas online em https://order.mysql.com/. L a voc e tamb em encontrar a informa c oes de como enviar um fax da sua ordem de compra para a MySQL AB. Mais informa c oes sobre licen cas podem ser encontradas em http://www.mysql.com/products/pricing.html. Se voc e tiver duvidas em rela c ao a licenciamento ou quiser cota para negocia c ao de um alto volume de licen cas, preencha o formul ario de contato em nosso site web (http://www.mysql.com/) ou envie um email para licensing@mysql.com (para quest oes sobre licenciamento) ou para sales@mysql.com (para pedidos de compra). Veja Se c ao 1.4.3 [Licen cas MySQL], P agina 18.
Se voc e est a interessado em fazer parceira com a MySQL AB, envie um e-mail para partner@mysql.com. Veja Se ca o 1.3.1.5 [Business Services Partnering], P agina 15. 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 c ao 1.4.4 [MySQL AB Logos and Trademarks], P agina 20. Se voc e est a interessado em qualquer um dos trabalhos da MySQL AB lista na se c ao de trabalhos (http://www.mysql.com/company/jobs/), envie um e-mail para jobs@mysql.com. N ao nos envie o seu CV em anexo, mas como texto no nal de sua mensagem de email. Para discuss oes gerais entre nosso muitos usu arios, direcione a sua aten c ao para a lista de discuss ao apropriada. Veja Se c ao 1.7.1 [D uvidas], P agina 33. Relat orios de erros (geralmente chamados bugs), assim como quest oes e coment arios, devem ser enviados para a lista de email geral do MySQL. Veja Se c ao 1.7.1.1 [Mailing-list], P agina 33. Caso voc e encontre um bug de seguran ca importante no MySQL Server, envie-nos um e-mail para security@mysql.com. Veja Se c ao 1.7.1.3 [Bug reports], P agina 36. Se voc e tiver resultados de benchmarks que podemos publicar, contate-nos via e-mail em benchmarks@mysql.com. Se voc e tiver sugest oes a respeito de adi c oes ou conex oes para este manual, envie-os para a equipe do manual via e-mail em docs@mysql.com.
Para quest oes ou coment arios sobre o funcionamento ou cote udo do web site da MySQL (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 oes a respeito desta pol itica, envie um e-mail para privacy@mysql.com. Para todos os outros assunto, envie um e-mail para info@mysql.com.
17
18
Envie-nos email para docs@mysql.com para maiores informa c oes ou se voc e estiver interessado em fazer a tradu c ao. Para informa c oes sobre como as licen cas do MySQL funcionam na pr atica, de uma olhada em Se c ao 1.4.3 [MySQL licenses], P agina 18. Veja tamb em Se c ao 1.4.4 [MySQL AB Logos and Trademarks], P agina 20.
O programa MySQL e distribu ido sob a GNU General Public License (GPL), que e provavelmente a melhor licen ca Open Source conhecida. Os termos formais da licen ca GPL pode ser encontrado em http://www.fsf.org/licenses/. Veja tamb em http://www.fsf.org/licenses/gpl-faq.html e http://www.gnu.org/philosophy/enforcing-gpl.htm Como o programa MySQL e distribu ido sob a GPL, ele pode ser usa geralmente de gra ca, mas para certos usos voc e pode querer ou precisar comprar lincen cas comerciais da MySQL AB em https://order.mysql.com/. Veja http://www.mysql.com/products/licensing.html para mais informa c oes. Vers oes mais antigas do MySQL (3.22 e anteriores) est ao sujeitos a uma licen ca mais estrita (http://www.mysql.com/products/mypl.html). Veja a documenta c ao da vers ao espec ica para mais informa c ao. Note que o uso do programa MySQL sob uma licen ca comercial, GPL ou a antiga licen ca do MySQL n ao d a automaticamente o direito de usar as marcas registradas da MySQL AB. Veja Se c ao 1.4.4 [MySQL AB Logos and Trademarks], P agina 20.
19
Se voc e requisita uma licecn ca, voc e precisar a de uma para cada instala c ao do programa MySQL. Ela cobre qualquer n umero de CPUs na m aquina, e n ap h a nenhum limite articial no n umero de clientes que conectam aom servidor de qualquer modo. Para licen cas comercias, ,visite o nosso site web em http://www.mysql.com/products/licensing.html. Para contrato de suporte, veja http://www.mysql.com/support/. Se voc e tiver necessidades especiais ou tiver acesso restrito a Internet, contate a nossa quipe de vendas via email em sales@mysql.com.
20
1.4.4.2 Logomarcas da MySQL que Podem Ser Usadas Sem Permiss ao de Altera c ao
Projetamos um conjunto de logos especiais de Uso Condicionale que podem se encontrados em nosso site web em http://www.mysql.com/press/logos.html e usado em sites web de terceiros sem permiss oes de escrita da MySQL AB. O uso destas logomarcas n ao s ao totalmente irrestritas mas, como o nome indica, sujeitos a nossa politica de marcas registradasque tamb em est a dispon ivel em nosso site. Voc e deve ler a pol itica de marcas registradas se plabeja us a-las. As exig encias s ao basicamente as apresentadas aqui: Use a logomarca que voc e preciisa como mostrado no site http://www.mysql.com/. Voc e pode mudar sua escala para servir as suas necessidades, mas n ao pode alterar cores ou o desenho, ou alterar os gracos de forma alguma. Deixe evidente que voc e, e n ao a MySQL AB, e o criado e propriet ario do site que mostra a logomarca do MySQL. N ao use a logomarca em detrimento ` a MySQL AB ou ao valor das marcas registradas da MySQL AB. Nos reservamos o direito de revogar o diretiro de uso da marcas registradas da MySQL AB. Se voc e utilizar as maracas em um site da web, fa ca com que ele contenha um link para http://www.mysql.com/. Se voc e utilizar o banco de dados MySQL sob GPL em uma aplica c ao, sua aplica c ao deve 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 especiais que sirvam as suas necessidades.
21
1.4.4.3 Quando Voc e Precisa de Permiss ao de Altera c ao para Usar as Logomarcas do MySQL?
Voc e precisa de permiss ao escrita da MySQL AB antes de usar as logomarcas do MySQL nos 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 mencionadas anteiormente em sites ou outro lugar. Devido a raz oes comerciais e legais monitoramos o so das marcas registradas do MySQL em proutos, livros e outros itens. Normalmente exigimos um valor para a exibi c ao das logomarcas da MySQL AB em produtos comerciais, j a que achamos razo avel que parte dos rendimentos seja retornado para nanciar o desenvolvimento do banco de dados MySQL.
22
R-trees Stored procedures Views Cursors Foreign keys Triggers Full outer join Constraints
4.1 (para tabelas MyISAM) 5.0 5.0 ou 5.1 5.0 5.1 (3.23 com InnoDB) 5.1 5.1 5.1
23
estrangeiras com UPDATE/DELETE em cacata e lock de registro agora s ao recursos padr oes. Veja Se c ao 7.5 [InnoDB], P agina 642. Novas fncionalidades A melhora das propriedades de busca FULLTEXT do MySQL Server 4.0 habilita indexa c ao FULLTEXT de grandes partes de texto com linguagem natural e bin aria de l ogica de busca. Voc e pode personalizar o tamanho m inimo de palavras e denir a sua pr opria lista de palavras de parasa em qualquer linguagem humana, habilitando um novo conjunto de aplica c oes a serem construidas no MySQL Server. Veja Se c ao 6.8 [Fulltext Search], P agina 618. Compatibilidade com os padr oes, portabilidade e migra c ao Recursos para simplicar a migra c ao de outros sistemas de banco de dados para o MySQL Server incluem TRUNCATE TABLE (como no Oracle) Muitos usu arios tamb em car ao satisfeitos ao perceber que o MySQL Server agora suporta a instru c ao UNION, um recurso padr ao SQL muito esperado. O MySQL agora pode ser executado nativamente na plataforma Novell NetWare 6.0. Veja Se c ao 2.6.8 [Novell NetWare], P agina 164. Internacionaliza c ao Nossos usu arios alem aes, austr iacos e sui cos notar ao que o MySQL agora suporta um novo conjunto de caracteres, latin1_de, que assegura que a Ordena c~ ao em alem~ ao classicar a palavras com umlauts na mesma ordem das agendas telef onicas alem as. Aprimoramento da Usabilidade No porcesso de constru c ao de recursos para novos usu arios, n ao esquecemos os pedidos de nossa leal comunidade de usu arios. A maioria dos par ametros mysqld (op c oes de inicializa c ao) agora podem ser denidas se nalizar o servidor. Isto e um recurso conveniente para Administradores de Bancos de Dados (DBAs). Veja Se c ao 5.5.6 [SET OPTION], P agina 461. Instru c oes DELETE e UPDATE multi-tabelas foram adicionadas. Foi adicionado suporte ao mecanismo de armazenamento MyISAM para link simb olico no n ivel de tabela (e n ao apenas a n ivel de banco de dados como antes) e para habilitar o tratamento de links simb olicos no Windows por padr ao. SQL_CALC_FOUND_ROWS e FOUND_ROWS() s ao novas fun c oes que tornaram poss ivel encontrar o n umeros de linhas que uma consulta SELECT que inclui uma cl ausula LIMIT teria retornado se a cl ausula n ao fosse utilizada. A se c ao de novidades deste manual inclui uma lista mais aprofundada dos recursos. Veja Se c ao C.3 [News-4.0.x], P agina 957.
24
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 u nico comando. Suporte aos tipos espaciais OpenGIS (dados geogr acos). Veja Cap ptexi tulo 10 [Spatial extensions in MySQL], P agina 730. A replica c ao pode ser feita sobre conex ao SSL. Compatibilidade aos padr oes, portabilidade e migra c ao O novo protocolo cliente/servidor adiciona a possibilidade de se passar m ultiplos avisos ao cliente, no lugar se um u nico resultado. Isto faz com que o trabalho como uma grande carga de dados seja muito mais f acil de rastrear. SHOW WARNINGS exibe avisos para o u ltimo comando. Veja Se c ao 4.6.8.9 [SHOW WARNINGS], P agina 323. Internacionaliza c ao Para suportar nossa base de usu ario sempre em expans ao usando linguagens locais nas aplica c oes, o programa MySQL agora oferece suporte Unicode extensivo por meio dos conjunto de caracteres utf8 e ucs2. Os conjuntos de caracteres agora podem ser denidos por colunas, tabelas e banco de dados. Isto permite um alto grau de exibilidade no desenho das aplica c oes, particularmente para sites-web multi-linguagens. Para documenta c ao sobre este suporte a conjunto de caracters aprimorados, veja Cap ptexi tulo 9 [Charset], P agina 707. Aprimoramento da usabilidade Em resposta a demanda popular, adicionamos um comando HELP com base no servidor que pode ser usado para conseguir ajuda para comandos MySQL. A vantagem de se ter esta informa c ao no lado do servidor e que a informa c ao e sempre aplic avel para aquela vers ao do servidor em particular. Como esta informa c ao est a dispon ivel executando uma instru c ao SQL, outros clientes tamb em poder ao ser escritos para acess a-la. Por exemplo, o cliente mysql de linha de comando foi modicado para ter esta capacidade. No novo protocolo cliente/servidor, v arias instru c oes podem ser feitas com uma u nica chamada. Veja Se c ao 12.1.8 [C API multiple queries], P agina 851. O novo protocolo cliente/servidor tamb em suporta retorno de v arios resultados. Isto pode ocorrer como resultado de enviar v arias instru c oes, por exemplo (Veja o item anterior). Uma nova sintaxe INSERT ... ON DUPLICATE KEY UPDATE ... tem sido implementada. Isto lhe permite executar um UPDATE em um registro existente se o um INSERT criasse uma chave ( indice) prim aria (PRIMARY) ou u nica (UNIQUE) (index) duplicada. Veja Se c ao 6.4.3 [INSERT], P agina 578. Projetamos uma nova fun c ao de agrupamento GROUP_CONCAT(), adicionando a capacidade de concatenar colunas de registros agrupados em uma
26
u nica string de resultado, o que e extremamente u til. Veja Se c ao 6.3.7 [Group by functions and modiers], P agina 555. A se c ao de novidades neste manual incluem uma lista mais completa de recursos. Veja Se c ao C.2 [Novidades na vers ao 4.1.x], P agina 948.
27
28
Permite que o DELETE em tabelas MyISAM usem a cache de registros. Para fazer isto, precisamos atualizar a thread da cache de registro quando atualizarmos os arquivos .MYD. Melhores tabes em mem oria (HEAP): Registro de tamanhos din amoicos. Tratamento de registro mais r apido (menos c opia). Internacionaliza c ao Ap usar SET CHARACTER SET devemos traduzir toda a consulta de uma vez e n ao apenas as strings. Isto permitir a que os usu arios usem caracteres traduzidos nos nomes de banco de dados, tabelas e colunas. Aprimoramento da usabilidade Resolver a quest ao de RENAME TABLE em uma tabela usada em uma tabela MERGE ativa, o que possivelmente corrompe a tabela.
29
30
mas muito ex ivel. SHOW INFO FROM tbl_name para informa c oes b asicas das tabelas deve ser implementado. Permite SELECT a FROM crash_me LEFT JOIN crash_me2 USING (a); neste caso e considerado que a vem da tabela crash_me. Op c oes DELETE e REPLACE para a instru c ao UPDATE (isto deletar a registros quando se tiver um erro de chave duplicada durante a atualiza c ao). Altera o formato de DATETIME para armazenar fra c oes de segundo. Possibilitar o uso da nova biblioteca regexp GNU em vez da atual (a biblioteca GNU deve ser muito mais r apida que a antiga). Compatibilidade com os padr oes, portabilidade e migra c ao N ao adicionar valores DEFAULT autom aticos as colunas. Enviar um erro ao usar um INSERT que n ao contenha uma coluna que n ao tenha um DEFAULT. Adicionar as fun c oes de agrupamento ANY(), EVERY() e SOME(). No padr ao SQL isto s o funciona em colunas booleanas, mas podemos extend e-las para funcionar em qualquer coluna/express ao tratando valores 0 como FALSE e valores diferentes de 0 como TRUE. Corrigir para que o tipo de MAX(coluna) seja o mesmo do tipo da coluna: mysql> mysql> mysql> mysql> CREATE TABLE t1 (a DATE); INSERT INTO t1 VALUES (NOW()); CREATE TABLE t2 SELECT MAX(a) FROM t1; SHOW COLUMNS FROM t2;
Aumento de velocidade N ao permitir mais que um n umero denido de threads fa cam a recupera c ao do MyISAM ao mesmo tempo. Alterar INSERT ... SELECT opcionalmente. para usar inser c oes concorrentes
Adicionar uma op c ao para descarregar paginas de chaves para tabelas com delayed keys se elas n ao forem usados por um tempo. Permitir joins em partes de chaves (otimiza c ao). Adicionar simula c ao de pread()/pwrite() no Windows para permitir inser c oes concorrentes. Um analizador de arquivos de log que possam analizar informa c oes sobre quais tabelas s ao usadas com mais frequ encia, a frequ encia com que joins multi-tables s ao executados, etc. Isto deve ajudar os usu arios a identicar areas ou projetos de tabelas que podiam ser otimizados para executar consultas muito mais ecientes. Internacionaliza c ao Aprimoramentos de usabilidade Retorna os tipos dos campos originais ao se fazer SELECT MIN(coluna) ... GROUP BY. Possibilita especicar long_query_time com uma granularidade em microsegundos.
31
Ligue o c odigo myisampack no servidor assim ele poder a realizar opera c oes PACK e COMPRESS. Adicionar uma cache de chaves tempor aria durante INSERT/DELETE/UPDATE para podermos fazer um recupera c ao se o indice car cheio. Se voc e realizar um ALTER TABLE em uma tabela que e ligada simbolicamente a outro disco, crie tabelas tenpor arias neste disco. Implementar um tipo DATE/DATETIME que trate as informa c oes de fusos hor arios de forma apropriada e assim lidar com datas em diferentes fusos hor arios ser a mais f acil. Corrigir o congure para se poder compilar todas as bibliotecas (como no MyISAM) sem threads. Permitir vari aveis SQL em LIMIT, como em LIMIT @a,@b. Saida autom atica do mysql para um navegador web. LOCK DATABASES (com diversas op c oes). Muito mais vari aveis para SHOW STATUS. Leitura e atualiza c ao de registros. Selects em 1 tabela e select com joins. N umero de tabelas na select. N umero de consultas ORDER BY e GROUP BY. mysqladmin copy database novo-banco_dados; exige que o comando COPY seja adicionado ao mysqld. Lista de processos deve mostar o n umero de consultas/threads. SHOW HOSTS para xibir informa c oes sobre a cache de nome de m aquina. Alterar o nome de tabelas de string vazias para NULL para colunas calculadas. N ao usar Item_copy_string em valores num ericos para evitar a convers ao number->string->number no casos de: SELECT COUNT(*)*(id+0) FROM nome_tabela GROUP BY id Alterar aqueles ALTER TABLE que n ao abortam clientes que executam INSERT DELAYED. Colunas refer enciadas em uma cl ausula UPDATE ir ao conter os valores antigos antes da atualiza c ao iniciar. Novos sistemas operacioais. Portar os clientes MySQL para LynxOS.
32
Views simples (inicialmente em uma tabela, depois em qualquer express ao). Veja Se c ao 1.8.4.6 [ANSI di Views], P agina 51. Fechar algumas tabelas automaticamente se uma tabela, tabela tempor aria ou arquivos tempor arios obtiverem o erro 23 (n ao pode abrir arquivos sucientes). Melhor propaga c ao de constantes. Quando uma ocorr encia de nome_col=n e encontrada em uma express ao, para algumas constantes n, substitua outras ocorr encias de nome_ col dentro da express ao por n. Atualmente, isto e feito somente para alguns casos simples. Alterar todas express oes const com express oes calculadas se poss ivel. Chave otimizadora = express ao. No momento somente a chave = campo ou a chave = constante s ao otimizadas. Melhorar o c odigo de algumas das fun c oes de c opia 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 umeros de argumentos em uma fun c ao. Utilizar nomes de c alculo completos na parte de ordena c ao. (For ACCESS97) MINUS, INTERSECT e FULL OUTER JOIN. (Atualmente UNION [na 4.0] e LEFT OUTER JOIN s ao suportados). SQL_OPTION MAX_SELECT_TIME=# para colocar um limite de tempo em uma pesquisa. Fazer o log de atualiza c oes gravar em um banco de dados. LIMIT negativo para recuperar dados do m. Alarmes em fun c oes clientes de conex ao, leitura e escrita. Por favor, perceba as altera c oes ao mysqld_safe: de acordo com o FSSTND (que o Debian tenta seguir) arquivos PID dever ir em /var/run/<progname>.pid e arquivos de log em /var/log. Seria otimo se voc e puder colocar o diret orio de dados na primeira declara c ao de "pidle" e "log", para que a coloca c ao destes arquivos possa ser alterada com uma simples instru c ao. Permitir um cliente requisitar log. Adicionar uso de zlib() a LOAD DATA INFILE, para permitir que as instru c oes leiam arquivos compactados com gzip. Corrigir ordena c ao e agrupamento de colunas BLOB (parcialmente resolvida agora). Alterar para o uso de sem aforos quando contar threads. Devemos primeiro implementar uma biblioteca de sem aforos para a MIT-pthreads. Adicionar suporte pleno para JOIN com par enteses. Como uma alternativa para uma thread / conex ao gerencie uma la de threads para manipular as pesquisas. Permitir obter mais de um bloqueio com GET_LOCK. Quando isto for feito, ser ao, tamb em, tratados os poss iveis deadlocks que essa altera c ao ir a acarretar. O tempo e fornecido de acordo com a quantidade de trabalho, e n ao tempo real.
33
mysql
mysql-digest A lista mysql na forma resumida. Isto signica que voc e ir a receber todas mensagens individuais, enviadas na forma de uma grande mensagem uma u nica vez ao dia. bugs Esta lista s o ser a do seu interesse se voc e quiser car informado sobre assuntos relatados desde a u ltima distribui c ao do MySQL ou se voc e quiser estar ativamente envolvido no processo de busca e corre c ao de erros. Veja Se c ao 1.7.1.3 [Relat orio de erros], P agina 36.
34
bugs-digest Uma vers ao resumida da lista bugs. internals Uma lista para pessoas que trabalham no c odigo do MySQL. Nesta lista pode-se discutir desenvolvimento do MySQL e pos-patches. internals Uma vers ao resumida da lista internals. mysqldoc Esta lista e para pessoas que trabalham na documenta c ao do MySQL: pessoas da MySQL AB, tradutores e outros membros da comunidade.
mysqldoc-digest Esta e uma vers ao resumida da lista mysqldoc. benchmarks Esta lista e para qualquer um interessado em assuntos de desempenho. Discuss oes concentradas em desempenho de banco de dados (n ao limitado ao MySQL) mas tamb em inclue categorias ,com desempenho do kernel, sistema de arquivos, sistema de disco e outros. benchmarks Esta e uma vers ao resumida da lista benchmarks. packagers Esta lista e para discuss oes sobre empacotamento e distribui c ao do MySQL. Este e o f orum usado pela pessoas que mant em a distribui c ao para troca de id eias de pacotes do MySQL e para assegurar que o MySQL esteja o mais parecido poss ivel em todas as plataformas e sistemas operacionais suportados. packagers-digest Esta e uma vers ao resumida da lista packagers. mais usada para discuss java Discuss ao sobre o servidor MySQL e Java. E oes sobre o driver JDBC, incluindo MySQL Connector/J. java-digest Uma vers ao resumida da lista java. win32 Esta e a lista para todos os t opicos relacionados ao MySQL em sistemas operacionais Microsoft, como o Win95, Win98, NT e Win2000.
win32-digest Uma vers ao resumida da lista win32. myodbc Lista para todos os t opicos relacionados a conectividade do MySQL com ODBC. myodbc-digest Uma vers ao resumida da lista myodbc. mysqlcc Esta lista e sobre todos os t opicos relativos ao cliente gr aco MySQL Control Center.
35
plusplus
Lista sobre todos os t opicos relacionados ` a programa c ao da API C++ para o MySQL.
plusplus-digest Uma vers ao resumida da lista plusplus. 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 ao do msql-mysql-modules. Se voc e n ao obtiver uma resposta para suas quest oes na lista de mensagens do MySQL, uma op c ao e pagar pelo suporte da MySQL AB, que ir a colocar voc e em contato direto com desenvolvedores MySQL. Veja Se c ao 1.4.1 [Suporte], P agina 17. A seguinte tabela mostra algumas listas de mensagens sobre o MySQL que utilizam linguas diferentes do Ingl es. Perceba que elas n ao s ao operadas pela MySQL AB, portanto, n ao 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 e pode encontrar informa c oes sobre esta lista de mensagens em http://www.4t2.com/mysql. mysql-br-request@listas.linkway.com.br Lista de mensagens em portugu es Envie subscribe mysql-br your@email.address para esta lista. mysql-alta@elistas.net Lista de mensagens espanhola. Envie subscribe mysql your@email.address para esta lista.
36
Voc e pode tamb em usar a p agina http://www.mysql.com/search.html para pesquisar todas as p aginas Web (incluindo o manual) que est ao localizados em http://www.mysql.com/. Se voc e n ao puder encontrar uma resposta no manual ou nos arquivos, conra com seu expert em MySQL local. Se voc e continua n ao encontrando uma resposta para sua quest ao, v a em frente e leia a pr oxima se c ao para saber como enviar email para lista de email do MySQL.
37
Lembre-se que e poss ivel responder a uma mensagem contendo muita informa c ao, mas n ao a uma contendo muito pouca. Frequentemente pessoas omitem fatos porque acreditam que conhecem a causa do problema e assumem que alguns detalhes n ao importam. Um bom milhares de principio e: Se voc e est a em d uvida sobre declarar alguma coisa, declare-a ! E vezes mais r apido e menos problem atico escrever um pouco de linhas a mais no seu relat orio do que ser for cado a perguntar de novo e esperar pela resposta porque voc e n ao forneceu informa c ao suente da primeira vez. Os erros mais comuns acontecem porque as pessoas n ao indicam o n umero da vers ao da distribui c ao do MySQL que est ao usando, ou n ao indicam em qual plataforma elas tem o MySQL instalado (Incluindo o n umero da vers ao da plataforma). Essa informa c ao e muito relevante, e em 99% dos casos o relato de erro e in util sem ela! Frequentemente n os recebemos quest oes como, Por que isto n ao funciona para mim? ent ao n os vemos que aquele recurso requisitado n ao estava implementado naquela vers ao do MySQL, ou que o erro descrito num relat orio foi resolvido em uma vers ao do MySQL mais nova. Algumas vezes o erro e dependente da plataforma; nesses casos, e quase imposs ivel corrigir alguma coisa sem conhecimento do sistema operacional e o n umero da vers ao da plataforma. Lembre-se tamb em de fornecer informa c oes sobre seu compilador, se isto for relacionado ao problema. Frequentemente pessoas encontram erros em compiladores e acreditam que o problema e relacionado ao MySQL. A maioria dos compiladores est ao sobre desenvolvimento todo o tempo e tornam-se melhores a cada vers ao. Para determinar se o seu problema depende ou n ao do compilador, n os precisamos saber qual compilador foi usado. Note que todo problema de compila c ao deve ser estimado como relato de erros e, consequentemente publicado. de grande ajuda quando uma boa descri E c ao do problema e inclu ida no relato do erro. Isto e, um bom exemplo de todas as coisas que o levou ao problema e a correta descri c ao do problema. Os melhores relat orios s ao aqueles que incluem um exemplo completo mostrando como reproduzir o erro ou o problema Veja Se ca o D.1.6 [Casos de teste reproduz iveis], P agina 1075. Se um programa produz uma mensagem de erro, e muito importante incluir essas mensagens no seu relat orio! Se n os tentarmos procurar por algo dos arquivos usando programas, e melhor que as mensagens de erro relatadas sejam exatamente iguais a que o programa produziu. (At e o caso deve ser observado!) Voc e nunca deve tentar lembrar qual foi a mensagem de erro; e sim, copiar e colar a mensagem inteira no seu relat orio! Se voc e tem um problema com o MyODBC, voc e deve tentar gerar um arquivo para rastremento de erros (trace) do MyODBC. Veja Se c ao 12.2.7 [MyODBC bug report], P agina 875. Por favor lembre-se que muitas das pessoas que ler ao seu relat orio podem usar um v ideo de 80 colunas. Quando estiver gerando relat orios ou exemplos usando a ferramenta de linha de comando mysql, ent ao dever a usar a op c ao --vertical (ou a instru c ao terminadora \G) para sa ida que ir a exceder a largura dispon ivel para este tipo de v ideo (por exemplo, com a instru c ao EXPLAIN SELECT; veja exemplo abaixo). Por favor inclua a seguinte informa c ao no seu relat orio: O n umero da vers ao da distribui c ao do MySQL que est a em uso (por exemplo, MySQL Version 3.22.22). Voc e poder a saber qual vers ao voc es est a executando, usando o
38
comando mysqladmin version. mysqladmin pode ser encontrado no diret orio bin sob sua instala c ao do MySQL. O fabricante e o modelo da m aquina na qual voc e est a trabalhando. O nome do sistema operacional e a vers ao. Para a maioria dos sistemas operacionais, voc e pode obter esta informa c ao executando o comando Unix uname -a. Se voc e trabalho no Windows, voc e pode normalmente conseguir o nome e o n umero da vers ao com um duplo clique sobre o icone Meu Computador e em seguida no menu Ajuda/Sobre o Windows. Algumas vezes a quantidade de mem oria (real e virtual) e relevante. Se estiver em d uvida, inclua esses valores. Se voc e estiver usando uma distribui c ao fonte do MySQL, e necess ario o nome e n umero da vers ao do compilador usado. Se voc e estiver usando uma distribui c ao bin aria, e necess ario o nome da distribui c ao. Se o problema ocorre durante a compila c ao, inclua a(s) exata(s) mensagem(s) de erro(s) e tamb em algumas linhas do contexto envolvendo o c odigo no arquivo onde o erro ocorreu. Se o mysqld nalizou, voc e dever a relatar tamb em a consulta que travou o mysqld. Normalmente voc e pode encontrar isto executando mysqld com o log habilitado. Veja Se c ao D.1.5 [Using log les], P agina 1074. Se alguma tabela do banco de dados estiver relacionado ao problema, inclua a sa ida de mysqldump --nodata nome_db nome_tbl1 nome_tbl2.... Isto e muito f acil de fazer e e um modo poderoso de obter informa c oes sobre qualquer tabela em um banco de dados que ir a ajudar-nos a criar uma situa c ao parecida da que voc e tem. Para problemas relacionados ` a velocidade ou problemas com instru c oes SELECT, voc e sempre deve incluir a sa ida de EXPLAIN SELECT ... e ao menos o n umero de linhas que a instru c ao SELECT produz. Voc e tamb em deve incluir a sa ida de SHOW CREATE TABLE nome_tabela para cada tabela envolvida. Quanto mais informa c ao voc e fornecer sobre a sua situa c ao, mais f acil ser a para algu em ajudar-lo! A seguir um exemplo de um relat orio de erros muito bom (ele deve ser postado com o script mysqlbug): Exemplo de execu c ao usando a ferramenta de linha de comando mysql (perceba o uso do instru c ao terminadora \G para instru c oes cuja largura de sa ida deva ultrapassar 80 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~ ao da sa ida do SELECT, 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 a reproduzir a anomalia. Este script deve incluir qualquer ar-
39
quivo de fonte necess ario. Quanto mais pr oximo o script puder reproduzir sua situa c ao, melhor. Se voc e puder fazer uma s erie de testes repetidos, voc e poder a post a-lo para o bugs@lists.mysql.com para um tratamento de alta prioridade! Se n ao puder fornecer o script, voc e ao menos deve incluir a sa ida de mysqladmin variables extended-status processlist na sua mensagem para fornecer alguma informa c ao da performance do seus sistema. Se voc e n ao puder produzir um caso de teste em algumas linhas, ou se a tabela de testes for muito grande para ser enviada por email para a lista de mensagens (mais de 10 linhas), voc e dever a dar um dump de suas tabelas usando o mysqldump e criar um arquivo README que descreve seu problema. Crie um arquivo comprimido de seus arquivos usando tar e gzip ou zip, e use o ftp para transferir o arquivo para ftp://support.mysql.com/pub/mysql/secret/. E envie uma pequena descri c ao do problema para bugs@lists.mysql.com. Se voc e achar que o MySQL produziu um resultado estranho para uma consulta, n ao inclua somente o resultado, mas tamb em sua opini ao de como o resultado deve ser, e uma conta descrevendo o base de sua opini ao. Quando fornecer um exemplo do problema, e melhor usar os nomes de vari aveis, nomes de tabelas, etc. utilizados na sua situa c ao atual do que enviar com novos nomes. O problema pode ser relacionado ao nome da vari avel ou tabela! Esses casos s ao raros, mas e melhor prevenir do que remediar. Al em disso, ser a mais f acil para voc e fornecer um exemplo que use sua situa c ao atual, que e o que mais importa para n os. No caso de ter dados que n ao deseja mostrar para outros, voc e pode usar o ftp para transferilo para ftp://support.mysql.com/pub/mysql/secret/. Se os dados s ao realmente condenciais, e voc e n ao deseja mostr a-los nem mesmo para n os, ent ao v a em frente e providencie um exemplo usando outros nome, mas, por favor considere isso como uma u nica chance. Inclua, se poss ivel, todas as op c oes fornecidas aos programas relevantes. Por exemplo, indique as op c oes que voc e utiliza quando inicializa o daemon mysqld e aquelas que s ao utilizadas para executar qualquer programa cliente MySQL. As op c oes para programas como o mysqld e mysql, e para o script configure, s ao frequentemente chaves para respostas e s ao muito relevantes! Nunca e uma m a id eia inclu i-las de qualquer forma! Se voc e usa algum m odulo, como Perl ou PHP por favor forne ca o n umero da vers ao deles tamb em. Se sua quest ao e relacionada ao sistema de privil egios, por favor forne ca a sa ida de mysqlaccess, a sa ida de mysqladmin reload, e todas as mensagens de erro que voc e obteve quando tentava conectar! Quando voc e testar seus privil egios, voc e deve primeiramente executar mysqlaccess. Depois, execute mysqladmin reload version e tente conectar com o programa que gerou o problema. mysqlaccess pode ser encontrado no diret orio bin sob seu diret orio de instala c ao do MySQL. Se voc e tiver um patch para um erro, isso e bom, mas n ao assuma que o patch e tudo que precisamos, ou que iremos us a-lo, se voc e n ao fornecer algumas informa c oes necess arias, como os casos de testes mostrando o erro que seu patch corrige. N os podemos encontrar problemas com seu patch ou n os podemos n ao entend e-lo ao todo; se for assim, n ao podemos us a-lo.
40
Se n os n ao vericarmos exatamente o que o patch quer dizer, n os n ao poderemos us alo. Casos de testes ir ao ajudar-nos aqui. Mostre que o patch ir a cuidar de todas as situa c oes que possam ocorrer. Se n os encontrarmos um caso (mesmo que raro) onde o patch n ao funcionaria, ele pode ser in util. Palpites sobre qual e o erro, porque ocorre, ou do que ele depende, geralmente est ao errados. Mesmo o time MySQL n ao pode adivinhar antecipadamente tais coisas sem usar um debugger para determinar a causa real do erro. Indique na sua mensagem de e-mail que voc e conferiu o manual de refer encia e o arquivo de mensagens para que outros saibam que voc e tentou solucionar o problema. Se voc e obter um parse error, por favor conra sua sintaxe com aten c ao! Se voc e n ao conseguiu encontrar nada errado com ela, e extremamente prov avel que que sua vers ao corrente do MySQL n ao suporte a consulta que voc e est a utilizando. Se voc e estiver usando a vers ao recente e o manual em http://www.mysql.com/documentation/manual.php n ao cobrir a sintaxe que voc e estiver usando, o MySQL n ao suporta sua consulta. Neste caso, suas unicas op c oes s ao implementar voc e mesmo a sintaxe ou enviar uma mensagem para mysql-licensing@mysql.com e perguntar por uma oferta para implement a-lo! Se o manual cobrir a sintaxe que voc e estiver usando, mas voc e tiver uma vers ao mais antiga do MySQL, voc e dever a conferir o hist orico de altera c oes do MySQL para ver quando a sintaxe foi implementada. Neste caso, voc e tem a op c ao de atualizar para uma nova vers ao do MySQL. Veja Ap endice C [News], P agina 948. Se voc e tiver um problema do tipo que seus dados aparecem corrompidos ou voc e obtem erros quando voc e acessa alguma tabela em particular, voc e dever a primeiro checar depois tentar reparar suas tabelas com myisamchk ou CHECK TABLE e REPAIR TABLE. Veja Cap ptexi tulo 4 [MySQL Database Administration], P agina 208. Se voc e frequentemente obt em tabelas corrompidas, voc e deve tentar encontrar quando e porque isto acontece! Neste caso, o arquivo mysql-data-directory/hostname.err deve conter algumas informa c oes sobre o que aconteceu. Veja Se c ao 4.10.1 [Error log], P agina 373. Por favor forne ca qualquer informa c ao relevante deste arquivo no seu relat orio de erro! Normalmente o mysqld NUNCA dever a danicar uma tabela se nada o nalizou no meio de uma atualiza c ao! Se voc e puder encontrar a causa do m do mysqld, se torna muito mais f acil para n os fornecemos a voc e uma solu c ao para o problema! Veja Se c ao A.1 [What is crashing], P agina 907. Se poss ivel, fa ca o download e instale a vers ao mais recente do MySQL para saber se ela resolve ou n ao o seu problema. Todas vers oes do MySQL s ao muito bem testadas e devem funcionar sem problemas! Acreditamos em deixar tudo, o mais comp ativel possivel com as vers oes anteriores, e voc e conseguir a mudar de vers oes MySQL em minutos! Veja Se c ao 2.2.4 [Which version], P agina 80.
Se voc e e um cliente de nosso suporte, por favor envio o seu relat orio de erros em mysql-support@mysql.com para tratamento de alta priorit ario, bem como para a lista de mensagens apropriada para ver se mais algu em teve experi encias com (e talvez resolveu) o problema. Para informa c oes sobre relatar erros no MyODBC, veja Se c ao 12.2.4 [ODBC Problems], P agina 869.
41
Para solu c oes a alguns problemas comuns, veja Veja Ap endice A [Problems], P agina 907. Quando respostas s ao enviadas para voc e individualmente e n ao para a lista de mensagens, 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 e recebeu que ajudaram a resolver seu problema!
42
Um dos nossos principais objetivos com o produto e continuar a trabalhar em acordo com o padr ao SQL-99, mas sem sacricar velocidade e conan ca. N ao estamos receosos em adicionar extens oes ao SQL ou suporte para recursos n ao SQL se ele aumentar extremamente a usabilidade do MySQL Server para uma grande parte de nossos usu arios. (A nova interface HANDLER no MySQL Server 4.0 e um exeemplo desta estrat egia. Veja Se c ao 6.4.9 [HANDLER], P agina 595.) Continuaremos a suportar bancos de dados transacionais e n ao transacionais para satisfazer tanto o uso pesado na web quanto o uso de miss ao critica 24/7. O MySQL Server foi projetado inicialmente para trabalhar com bancos de dados de tamanho m edio (10-100 milh oes de registros ou cerca de 100 MB por tabela) em sistemas computacionais pequenos. Continuaremos a extender o MySQL Server para funcionar ainda melhor com banco de dados na ordem de terabytes, assim como tornar poss ivel compilar uma vers ao reduzida do MySQL mais apropriadas para handhels e uso embutido. O design compacto do servidor MySQL tornam ambas as dire c oes poss iveis sem qualquer conito na arvore fonte. Atualmente n ao estamos buscando suporte em tempo real ou banco de dados em cluster (mesmo se voc e j a puder fazer muitas coisas com nossos servi cos de replica c ao). Estamos buscando melhoras no fornecimento de suporte a XML no servidor de banco de dados.
43
O n ivel de isolamento padr ao de um transa c ao e SERIALIZABLE. Veja Se c ao 6.7.6 [SET TRANSACTION], P agina 618. Voc e pode usar um campo/express ao em GROUP BY que n ao est a na lista de campos. Executando o servidor em modo ANSI e o mesmo que inici a-lo com estas op c oes: --sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES, IGNORE_SPACE,ONLY_FULL_GROUP_BY --transaction-isolation=serializable No MySQL 4.1, voc e pode conseguir o mesmo efeito com estas duas instru c oes: 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 u ltima op c ao sql_mode tamb em pode ser dada com: SET GLOBAL sql_mode="ansi"; No caso acima o sql_mode estar a congurado com todas as op c oes que s ao relevantes para o modo ANSI. Voc e pode vericar o resultado fazendo:
44
O MySQL mapeia cada banco de dados em um diret orio sob o diret orio de dados do MySQL, e tabelas internamente num banco de dados para arquivos no diret orio do banco de dados. Isto tem algumas implica c oes: Nomes de bancos de dados e tabelas s ao caso sensitivoo no MySQL em sistemas operacionais que possuem o sistema de arquivos caso sensitivoo (como na maioria dos sistemas Unix). Veja Se c ao 6.1.3 [Name case sensitivity], P agina 473. Nomes de Bancos de dados, tabelas, indices, campos ou apelidos pode come car com um d igito (por em n ao podem consistir somente de digitos). Voc e pode usar comandos padr ao do sistemas para fazer backups, renomear, apagar 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 c oes SQL, voc e pode acessar tabelas de diferentes bancos de dados com a sintaxe nome_bd.nome_tbl. Alguns servidores SQL fornecem a mesma funcionalidade mas chamam isto de User space. O MySQL n ao suporta tablespaces como em: create table ralph.my_table...IN minha_tablespace. LIKE e permitido em campos num ericos. O uso de INTO OUTFILE e STRAIGHT_JOIN em uma instru c ao SELECT. Veja Se c ao 6.4.1 [SELECT], P agina 562. A op c ao SQL_SMALL_RESULT em uma instru c ao SELECT. EXPLAIN SELECT para obter uma descri c ao de como as tabelas s ao ligadas. A utiliza c ao de nomes de indices, indices em um prexo de um campo, e uso de INDEX ou KEY em uma instru c ao CREATE TABLE. Veja Se c ao 6.5.3 [CREATE TABLE], P agina 597. O uso de TEMPORARY ou IF NOT EXISTS com CREATE TABLE. O uso de COUNT(DISTINCT lista) onde lista e maior que um elemento. O uso de CHANGE nome_campo, DROP nome_campo, ou DROP INDEX, IGNORE ou RENAME em uma instru c ao ALTER TABLE. Veja Se c ao 6.5.4 [ALTER TABLE], P agina 607. O uso de RENAME TABLE. Veja Se c ao 6.5.5 [RENAME TABLE], P agina 611. Utiliza c ao de m ultiplas cl ausulas ADD, ALTER, DROP, ou CHANGE em uma instru c ao ALTER TABLE. O uso de DROP TABLE com as palavras-chave IF EXISTS. Voc e pode remover m ultiplas tabelas com uma instru c ao u nica DROP TABLE. As cl ausulas ORDER BY e LIMIT das instru c oes UPDATE e DELETE. Sintaxe INSERT INTO ... SET col_name = .... A cl ausula DELAYED das instru c oes INSERT e REPLACE. A cl ausula LOW_PRIORITY das instru c oes INSERT, REPLACE, DELETE e UPDATE. O uso de LOAD DATA INFILE. Em alguns casos essa sintaxe e compat ivel com o Oracle LOAD DATA INFILE. Veja Se c ao 6.4.8 [LOAD DATA], P agina 587. As intru c oes ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE, e REPAIR TABLE. A instru c ao SHOW. Veja Se c ao 4.6.8 [SHOW], P agina 303. Strings podem ser fechadas pelo " ou , n ao apenas pelo .
45
O uso do meta-caractere de escape \. A instru c ao SET OPTION. Veja Se c ao 5.5.6 [SET OPTION], P agina 461. Voc e n ao precisa nomear todos os campos selecionados na parte GROUP BY. Isto fornece melhor performance para algumas consultas espec icas, mas muito comuns. Veja Se c ao 6.3.7 [Group by functions and modiers], P agina 555. Pode ser especicado ASC e DESC com o GROUP BY. Para tornar mais f acil para usu arios que venham de outros ambientes SQL, o MySQL suporta apelidos (aliases) para v arias fun c oes. Por exemplo, todas fun c oes de string 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 c ao C. No MySQL, || e OR s ao sin onimos, assim como && e AND. Devido a esta otima sintaxe, o MySQL n ao suporta o operador ANSI SQL para concatena c ao de strings ||; em vez disso, use o CONCAT(). Como CONCAT() aceita v arios argumentos, e f acil converter o uso do operador || para MySQL. CREATE DATABASE or DROP DATABASE. Veja Se c ao 6.5.1 [CREATE DATABASE], P agina 596. O operador % e um sin onimo para MOD(). Isto e, N % M e equivalente a MOD(N,M). % e suportado para programadores C e para compatibilidade com o PostgreSQL. Os operadores =, <>, <= ,<, >=,>, <<, >>, <=>, AND, OR ou LIKE podem ser utilizados em compara c oes de campos a esquerda do FROM nas instru c oes SELECT. Por exemplo: mysql> SELECT col1=1 AND col2=2 FROM nome_tabela; A fun c ao LAST_INSERT_ID(). Veja Se c ao 12.1.3.31 [mysql_insert_id()], P agina 799. Os operadores extendidos REGEXP e NOT REGEXP utilizados em express oes regulares. CONCAT() ou CHAR() com um ou mais de dois argumentos. (No MySQL, estas fun c oes receber qualquer n umero de argumentos.) As fun c oes BIT_COUNT(), CASE, ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(), ENCRYPT(), MD5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS() ou WEEKDAY(). Uso de TRIM() para cortar substrings. o SQL-99 s o suporta remo c ao de caracteres u nicos. As fun c oes do GROUP BY: STD(), BIT_OR(), BIT_AND() e BIT_XOR() e GROUP_CONCAT(). Veja Se c ao 6.3.7 [Group by functions and modiers], P agina 555. Uso de REPLACE no lugar de DELETE + INSERT. Veja Se c ao 6.4.7 [REPLACE], P agina 587. As instru c oes FLUSH, RESET e DO. A possibilidade de congurar vari aveis em uma instru c ao com :=: SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS media FROM tabela_teste; SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
46
Em alguns casos, campos CHAR s ao alterados sem perguntas para o tipo de campo VARCHAR. Veja Se c ao 6.5.3.1 [Silent column changes], P agina 606. Privil egios para uma tabela n ao s ao negadas automaticamente quando voc e apaga uma tabela. Voc e deve usar explicitamente um REVOKE para negar privil egios para uma tabela. Veja Se c ao 4.4.1 [GRANT], P agina 255. Para uma lista priorizada indicando quando novas extens oes ser ao adicionadas ao MySQL voc e deve consultar lista TODO online do MySQL em http://www.mysql.com/doc/en/TODO.html. Esta eau ltima vers ao da lista TODO neste manual. Veja Se c ao 1.6 [TODO], P agina 26.
1.8.4.1 Subqueries
MySQL Version 4.1 supports subqueries and derived tables (unnamed views). Veja Se c ao 6.4.2 [Subqueries], P agina 569. For MySQL versions prior to 4.1, most subqueries can be successfully rewritten using joins and and other methods. Veja Se c ao 6.4.2.11 [Rewriting subqueries], P agina 577.
47
signicantemente maior e maior sobrecarga da CPU. Tipos de tabelas transacionais como InnoDB oferecem muitos recursos u nicos. O projeto modular do MySQL Server permite o uso concorrente de todas estes mecanismos de armazenamento para servir a diferentes exig encias e oferecer um otimo desempenho em todas as situa c oes. Mas como fazer uso dos recursos do MySQL Server para manter uma integridade rigorosa mesmo com tabelas MyISAM n ao transacionais e como este recurso se compara com os tipos de tabelas transacionais? 1. No paradigma transacional, se as suas aplica c oes s ao escritas de uma forma que e dependente na chamada de ROLLBACK em vez de COMMIT em situa c oes cr iticas, ent ao transa c oes s ao mais convenientes. Al em disso, transa c oes asseguram que atualiza c oes inacabadas ou atividades corrompidas n ao sejam executadas no banco de dados; o servidor oferece uma oportunidade para fazer um rollback autom atico e seu banco de dados e mantido. O MySQL Server, na maioria dos casos, permite a voc e resolver potenciais problemas incluindo simples confer encias antes das atualiza c oes e executando scripts simples que conferem inconsist encias no banco de dados e, automaticamente, repara ou avisa caso isto ocorra. Perceba que apenas usando o log do MySQL ou mesmo adicionando um log extra, pode-se corrigir tabelas perfeitamente sem nenhuma perda de integridade. 2. Mais do que nunco, atualiza c oes transacionais fatais podem ser reescritas para serem at omicas. De fato podemos dizer que todos problemas de integridade que transa c oes resolvem podem ser feitas com LOCK TABLES ou atualiza c oes at omicas, assegurando que voc e nunca ir a ter uma naliza c ao autom atica da tabela, o que e um problema comum em bancos de dados transacionais. 3. Nem mesmo transa c oes podem prevenir todas as falhas se o servidor cair. Nestes casos mesmo um sistema transacional pode perder dados. A diferen ca entre sistemas diferentes e apenas em qu ao pequeno e o lapso de tempo em que eles podem perder dados. Nenhum sistema e 100% seguro, somente seguro o suciente. Mesmo o Oracle, com reputa c ao de ser o mais seguro bancos de dados transacionais, tem relatos de algumas vezes perder dados nestas situa co es. Para estar seguro com o MySQL Server, voc e apenas deve fazer backups e ter o log de atualiza c oes ligado. Com isto voc e pode se recuperar de qualquer situa c ao poss ivel com bancos de dados transacionais. E sempre bom ter backups, independente de qual banco de dados voc e usa. O paradigma transacional tem seus benef icios e suas desvantagens. Muitos usu arios e desenvolvedores de aplica c oes dependem da facilidade com a qual eles podem codicar contornando problemas onde abortar parece ser, ou e necess ario. No entanto, se voc e e novo no paradigma de opera c oes at omicas ou tem mais familiaridade ou conforto com transa c oes, considere o benef icio da velocidade que as tabelas n ao transacionais podem oferece, na ordem de 3 a 5 vezes da velocidade que as tabelas transacionais mais r apidas e otimizadas. Em situa c oes onde integridade e de grande import ancia, as atuais caracter isticas do MySQL permitem n iveis transacionais ou melhor conan ca e integridade. Se voc e bloquear tabelas com LOCK TABLES todos as atualiza c oes ir ao ser adiadas at e qualquer verica c ao de integridade ser feita. Se voc e s o obter um bloqueio de leitura (oposto ao bloqueio de escrita),
48
ent ao leituras e inser c oes poder ao ocorrer. Os novos registros inseridos n ao poder ao ser visualizados por nenhum dos clientes que tiverem um bloqueio de LEITURA at e eles liberarem estes bloqueios. Com INSERT DELAYED voc e pode enleirar inser c oes em uma la local, at e os bloqueios serem liberados, sem que o cliente precise esperar at a a inser c ao completar. Veja Se c ao 6.4.3.2 [INSERT DELAYED], P agina 581. At omico, no sentido em que n os mencionamos, n ao e m agico. Signica apenas que voc e pode estar certo que enquanto cada atualiza c ao espec ica est a sendo executada, nenhum outro usu ario pode interferir com ela, e nunca haver a um rollback autom atico (que pode acontecer em sistemas baseados em transa c oes se voc e n ao tiver muito cuidado). O MySQL tamb em assegura que nunca ocorrer a uma leitura suja. A seguir est ao algumas t ecnicas para trabalhar com tabelas n ao transacionais: Loops que precisam de transa c oes normalmente pode ser codicados com a ajuda de LOCK TABLES, e voc e n ao precisa de cursores para atualizar regitros imeditamente. Para evitar o uso do ROLLBACK, voc e pode usar as seguintes estrat egias: 1. Use LOCK TABLES ... para fazer um lock todas as tabelas que voc e quer acessar. 2. Condi c oes de teste. 3. Atualize se estiver tudo OK. 4. Use UNLOCK TABLES para liberar seus locks. Isto e normalmente um m etodo muito mais r apido que usar transa c oes com poss iveis ROLLBACKs, mas nem sempre. A u nica situa c ao que esta solu c ao n ao pode tratar e quando algu em mata a threads no meio de uma atualiza c ao. Neste caso, todas os locks ser ao liberados mas algumas das atualiza c ao podem n ao ter sido execuadas. Voc e tamb em pode usar fun c oes para atualizar registros em uma u nica opera c ao. Voc e pode conseguir uma aplica c ao muito eciente usando as seguintes t ecnicas: Modique campos em rela c ao ao seus valores atuais. Atualize apenas aqueles campos que realmente tiveram altera c oes. Por exemplo, quando fazemos atualiza c oes em alguma informa c ao de cliente, atualizamoa apenas os dados do clientes que alteraram e testamos apenas aqueles com dados alterados ou dados que dependem dos dados alterados, mudaram em compara c ao com o registro original. O teste dos dados alterados e feito com a cl ausula WHERE na instru c ao UPDATE. Se o registro n ao foi atualizado, mandamos ao cliente uma mensagem: Some of the data you have changed has been changed by another user. Ent ao mostramos o registro antigo versus o novo em uma janela, assim o usu ario pode decidir qual vers ao do registro de cliente de ser usado. Isto nos d a algo similar a lock de colunas mas que, na verdade, e melhor porque apenas atualizamos algumas das colunas, usando valores relativos ao seu valor atual. Isto signica que instru c oes UPDATE comuns se parecem com estas: UPDATE nometabela SET pay_back=pay_back+125; UPDATE customer SET customer_date=current_date, address=new address,
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 e pode ver, isto e muito eciente e funciona mesmo se outro cliente alterar os valores nas colunas pay_back ou money_he_owes_us. Em muitos casos, usu arios querem fazer ROLLBACK e/ou LOCK TABLES com o prop osito de gerenciarem identicadores u nicos para algumas tabelas. Isto pode ser tratado muito mais ecientemente usando uma coluna AUTO_INCREMENT e tamb em uma fun c ao SQL LAST_INSERT_ID() ou a fun c ao da API C mysql_insert_id(). Veja Se c ao 12.1.3.31 [mysql_insert_id()], P agina 799. Geralmente voc e pode codicar evitando lock de registro. Algumas situa c oes realmente precisam disto, e tabelas InnoDB suportam lock de regitstro. Comoo MyISAM, voc e pode usar uma coluna de ag 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 umero de linhas afetadas se as linhas foram encontradas e row_flag j a n ao era 1 na linha original. Voc e pode pensar nisto como se o MySQL Server tivesse alterado a consulta anterior para: UPDATE nome_tbl SET row_flag=1 WHERE id=ID AND row_flag <> 1;
50
51
N ao e incomum para um DBA fazer uma topologia complexa de rela c oes que torna muito dif icl, e em alguns casos imposs ivel, fazer backup ou restaurar tabelas individuais.
1.8.4.6 Views
Views est ao senda implementadas atualmente e aparecer ao na vers ao 5.0 e 5.1 do MySQL Server. Historicamente o MySQL Server tem sido mais usado em aplica c oes e sistemas web onde o claro que o desenvolvedor da aplica c ao tem total controle sobre o uso do banco de dados. E uso aumentou em v arias vezes e ent ao descobrimos que um crescente n umeros de usu arios consideram views como um importante aspecto. Unnamed views (derived tables, uma seubquery na cl ausula FROM de uma SELECT) j a est ao implementadas na vers ao 4.1. Views geralmente s ao muito u teis para permitir aos usu arios acessar uma s erie de rela c oes (tabelas) como uma tabela, e limitar o acesso a apenas estas rela c oes. Views tamb em podem ser usadas para restringir o acesso aos registros (um subconjunto de uma tabela em particular). Mas views n ao s ao necess arias para restringir o acesso a registros j a que o MySQL Server tem um sosticado sistema de privil egios. Veja Se c ao 4.3 [Sistema de privil egios], P agina 227. Muitos SGBD n ao permitem atualizar nenhum registro em uma view, mas voc e tem que fazer as atualiza c oes em tabelas separadas. Em nosso projeto de implemta c ao de views, n os buscamos (tanto quanto for poss ivel dentro do SQL) compatibilidade com Codds Rule #6 para sistemas de banco de dados relacionais: todos os views que s ao teoricamente atualiz aveis, devem se atualizados tamb em na pr atica.
52
A seguinte discuss ao somente interessa se voc e estiver executando uma vers ao do MySQL inferior a vers ao 3.23: Se voc e tem um programa SQL em um arquivo texto que cont em coment arios -- voc e dever a usar: shell> replace " --" " #" < arquivo-texto-com-coment ario.sql \ | mysql banco-de-dados No lugar de: shell> mysql banco-de-dados < arquivo-texto-com-comentario.sql Voc e tamb em pode editar o pr oprio arquivo de comandos alterando os coment arios -- para #: shell> replace " --" " #" -- arquivo-texto-com-comentario.sql Desfa ca utilizando este comando: shell> replace " #" " --" -- arquivo-texto-com-comentario.sql
53
Note que no momento apenas as tabelas InnoDB suportam chaves estrangeiras. Se c ao 7.5.5.2 [Restri c oes de chaves estrangeiras no InnoDB], P agina 652.
Veja
O suporte a chaves estrangeiras nas tabelas MyISAM est a programado para ser inclu ida na arvor e de fonte do MySQL 5.0.
54
55
na maioria dos casos. Embora nunca tenhamos ouvido sobre um caso ocorrido, h a uma chance te orica que o dado no master e slave sejam diferente se uma consulta e feita de tal modo que a modica c ao do dado e n ao determin istica, isto e, deixar ao desejo do otimizador de consultas (o que geralmente n ao e uma boa pr atica, mesmo fora da replica c ao!). Por exemplo: CREATE ... SELECT ou INSERT ... SELECT que preenchem com zeros ou NULL uma coluna auto_increment. DELETE se voc e estiver apagando registros de uma tabela que tem chaves estrangeiras com a propriedade ON DELETE CASCADE. REPLACE ... SELECT, INSERT IGNORE ... SELECT se voc e tiver valores de chaves duplicados nos dados inseridos. tiverem cl Se e somente se todos estas consultas NAO ausulas ORDER BY garantindo uma ordem determin istica. Na verdade, por exemplo para INSERT ... SELECT sem ORDER BY, o SELECT pode retornar registros em uma ordem diferente (no qual resultar a em um registro tendo diferentes posi c oes, obtendo um n umero diferente na coluna auto_increment), dependendo da escolhe feita pelo otimizador no master e slave. Uma consulta ser a otimizada deiferentemente no master e slave apenas se: Os arquivos usados pelas duas consultas n ao s ao exatamente a mesma; por exemplo OPTIMIZE TABLE foi executado nas tabelas master e n ao nas nas tabelas slave (para corrigir isto, desde o MySQL 4.1.1, OPTIMIZE, ANALYZE e REPAIR s ao escritos no log bin ario). A tabela est a armazenada em um mecanismo de armazenamento diferente no master 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 co disppon ivel em disco). The MySQL buers sizes (key_buffer_size etc) are dierent on the master and slave. O master e slave executam vers oes diferentes do MySQL, e o c odigo do toimizador e diferente entre estas vers oes. Este problema tamb em pode afetar a restaura c ao de um banco de dados usando mysqlbinlog|mysql. O modo mais f acil de evitar este problema em todos os casos e adicionar uma cl ausula ORDER BY para tal consulta n ao deterministica assegure que os registros s ao sempre armazenados/modicados na mesma ordem. Nas vers oes futuras do MySQL adicionaremos automaticamente uma cl ausula ORDER BY quando necess ario. Os seguintes problemas s ao conhecidos e ser ao corrigidos na hora certa: LIKE n ao e seguro com caracteres multi-byte. A compara c ao e feita caracter por caracter. Ao usar fun c oes RPAD, ou qualquer outra fun c ao string que termina adicionando espa cos em branco a direita, em uma consulta que preisa usar tabelas tempor arias para ser
56
rsolvida, todas as strings resultantes ser ao cortadas a direita (como em RTRIM). Este e um exemplo de uma consulta: 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 nal deste erro e que o usu ario n ao conseguira espa cos em branco do lado direito do campo resultante. O comportamento anterior existe em todas as vers oes do MySQL. A raz ao disto e devido ao fato de tabelas HEAP, que s ao usadas primeiro para tabelas tempor arias, n ao s ao capazes de tratar colunas VARCHAR. Este comportamento ser a corrigido em uma das distribui c oes da s erie 4.1. Devido ao modo como os arquvos de deni c oes de tabelas s ao armazenados n ao se pode usar 255 caracteres (CHAR(255)) em nomes de tabelas, nomes de colunas e enum. Isto est a programado para ser corrigido na vers ao 5.1 quando temos novos arquivos de formatos de deni c ao de tabelas. Quando estiver usando SET CHARACTER SET, n ao e permitido usar caracteres especias no nome do banco de dados, tabelas ou campos. Pode-se usar _ ou % com ESCAPE em LIKE ... ESCAPE. se voc e tiver uma coluna DECIMAL com um n umero armazenado em diferentes formatos (+01.00, 1.00, 01.00), GROUP BY pode considerar cada valor como um valor diferente. DELETE FROM merge_table usado sem WHERE ir a apenas apagar o mapeamento para a tabela, n ao apagando tudo nas tabelas mapeadas. Voc e n ao pode construir em outro diret orio quando estiver utilizando MIT-pthreads. Como isto necessitaria de altera c oes na MIT-pthreads, n os n ao estamos aptos a corrig ila. BLOB valores n ao podem ser usados com conan ca em GROUP BY, ORDER BY ou DISTINCT. Somente os primeiros bytes (padr ao 1024) max_sort_length s ao usados quando estiver comparando BLOBs nestes casos. Isto pode ser alterado com a op c ao -0 max_sort_lenght para mysqld. Uma forma de contornar este problema para a maioria dos casos e usar a substring: SELECT DISTINCT LEFT(blob,2048) FROM nome_tabela. C alculos s ao feitos com BIGINT ou DOUBLE (normalmente, ambos tem o tamanho de 64 bits). Depende da precis ao utilizada na fun ca o. A regra geral e que fun c oes bin arias s ao feitas com precis ao BIGINT, IF e ELT() com precis ao BIGINT ou DOUBLE e o resto com precis ao DOUBLE. Devemos evitar o uso de valores sem sinal maiores que 63 bits (9223372036854775807) para qualquer outra coisa al em de campos bin arios! Todas os campos string, exceto campos do tipo BLOB e TEXTO tem, automaticamente, todos os espa cos extras removidos quando recuperados. Para tipos CHAR, isto n ao tem problema, e pode ser considerado como um recurso de acordo com o ANSI SQL92. O problema e que no MySQL, campos VARCHAR s ao tratados desta mesma forma. Voc e s o pode ter at e 255 colunas ENUM e SET em uma tabela. Em MIN(), MAX() e outras fun c oes de agrupamente, o MySQL atualmente compara as colunas ENUM e SET pelo valor de suas strings ao inv es da posi c ao relativa da string no conjunto.
57
mysqld_safe redireciona todas as mensagens de mysqld para o log mysqld. Um problema com isto e que se voc e executar o mysqladmin refresh para fechar e reabrir o log, a stdout e a stderr continuam redirecionadas para o log antigo. Se voc e utiliza --log extensivamente, dever a editar o mysqld_safe para logar em hostname.err em vez de hostname.log; assim voc e pode facilmente utilizar o espa co do log antigo apagando-o e executando mysqladmin refresh. Em instru c oes UPDATE, colunas s ao atualizadas da esquerda para a direita. Se voc e referenciar a uma coluna atualizada, voc e ir a obter o valor atualizado em vez do valor original, por exemplo: mysql> UPDATE nome_tabela SET KEY=KEY+1,KEY=KEY+1; Isto atualiza KEY com 2 no lugar de 1. Voc e pode se referir a m ultiplas tabelas em uma mesma consulta, mas voc e n ao pode se referir a qualquer tabelas tempor arias dada mais de uma vez. Por exemplo, a seguinte instru c ao n ao funciona. mysql> SELECT * FROM temporary_table, temporary_table AS t2; RENAME n ao funciona com tabelas tempor arias (TEMPORARY) ou tabelas usadas em uma tabelas MERGE. O otimizador pode lidar com o DISTINCT de forma diferente se voc e estiver usando colunas escondidas em uma join ou n ao. Em uma join, colunas escondidas s ao contadas como parte do resultado (mesmo se elas n ao s ao mostradas) enquanto que em queries normais colunas escondidas n ao participam na compara c ao DISTINCT. N os provavelmente 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 e pode obter duas linhas id enticas no MySQL 3.23.x na s erie do resultado (porque o campo escondido id pode variar). Perceba que isto somente acontece em consultas onde voc e n ao tem colunas ORDER BY no resultado, algo n ao permitido no SQL-92. Como o MySQL permite trabalhar com tipos de tabelas que n ao suportam transa c oes (e assim n ao pode fazer rollback em dados) algumas coisas funcionam um pouco diferentes de outros servidores SQL em MySQL (Isto serve para garantir que o MySQL nunca necessitar a de um rollback para um comando SQL). Por em isto pode ser um pouco estranho em casos que os valores dos campos devem ser vericados na aplica c ao, mas isto ira fornacer um otimo ganho de velocidade assim como permite ao MySQL fazer algumas otimiza c oes que de outro modo seriam muito dif iceis para serem feitas.
58
Se voc e informar um valor incorreto em uma coluna, o MySQL, em vez de fazer um rollback, aramzenar a o melhor valor poss ivel no campo. Se tentar armazenar um valor fora da faixa em uma coluna num erico, o MySQL ir a armazenar o menor ou maior valor poss ivel no campo. Se tentar armazenar uma string que n ao comece com um n umero em uma coluna num erica, o MySQL ir a armazenar 0 na coluna. Se voc e tentar armazenar NULL em uma coluna que n ao aceita valores nulos, MySQL ir a armazenar 0 ou (string vazia) na coluna. (Este comportamento pode, entretanto, ser alterado com a op c ao de compila c ao -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 eia e que n ao e servi co do servidor SQL validar datas. Se o MySQL pode armazenar uma data e recuperar extamente a mesma data, ent ao o MySQL armazenar a a data. Se a data estiver totalmente errada, o MySQL ir a armazenar a data 0000-00-00 no campo. Se voc e especicar um valor n ao suportado para um campo do tipo enum, ele ser a alterado para o valor de erro empty string, com valor num erico 0. Se voc e denir uma coluna SET com um valor n ao suportado, o valor ser a ignorado. Se voc e executar uma PROCEDURE em uma pesquisa que retorna uma s erie vazia, em alguns casos a instru c ao PROCEDURE n ao ir a transformar as colunas. Cria c ao da tabela do tipo MERGE n ao veriva se as tabelas envolvidas s ao de tipos compat iveis. O MySQL ainda n ao pode lidar com valores NaN, -Inf e Inf em tipos double. Us a-los causar a problemas na exporta c ao e importa ca o de dados. Uma solu c ao intermedi aria e alterar NaN para NULL (se for poss ivel) e -Inf e Inf para o valor double m inimo ou m aximo respectivo poss ivel. LIMIT em n umeros negativos s ao tratados como n umeros grandes positivos. Se voc e usar ALTER TABLE para primeiro adicionar um indice UNIQUE a uma tabela usada em uma tabela MERGE e ent ao usar ALTER TABLE para adicionar um indice normal na tabela MERGE, a ordem das chaves ser a diferente para as tabelas se existir uma chave antiga n ao u nica na tabela. Isto e porque o ALTER TABLE coloca chaves UNIQUE antes de chaves normais para ser poss ivel detectar chaves duplicadas o mais cedo o poss ivel. Os seguintes erros s ao conhecidos em vers oes mais antigas do MySQL: Voc e pode pendurar um processo se voc e zer um DROP TABLE em uma tabela entre outras que esteja travada com LOCK TABLES. No caso seguinte voc e pode obter um descarrego de mem oria para o arquivo core: Tratamento de inser c oes com atraso tem deixado inser c oes pendentes na tabela. LOCK table com WRITE FLUSH TABLES Antes da vers ao 3.23.2 do MySQL um UPDATE que atualizava uma chave com um WHERE na mesma chave podia falhar porque a chave era usada para procurar por registros e a mesma linha poderia ter encontrado v arios itens:
59
UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY > 100; Um modo de contornar este erro e utilizar: mysql> UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY+0 > 100; Isto funcionar a porque MySQL n ao utilizar a indices em express oes com a cl ausula WHERE. Antes da vers ao 3.23 do MySQL, todos os tipos num ericos tratados como campos de pontos xos. Isto signica que voc e tem que especicar quantas casas decimais um campo de ponto utuante deve ter. Todos os resultados eram retornados com o n umero correto de casas decimais. Para erros espec icos na plataforma, vejas as se c oes sobre compila c ao e portabilidade. Veja Se c ao 2.3 [Installing source], P agina 94. Veja Ap endice D [Porting], P agina 1069.
60
2 Instala c ao do MySQL
Este cap itulo descreve como obter e instalar o MySQL: Para uma lista de sites no quais voc e pode obter o MySQL, veja Se c ao 2.2.1 [Getting MySQL], P agina 75. Para saber quais s ao as plataformas suportadas, veja em Se c ao 2.2.3 [Which OS], P agina 78. Por favor perceba que nem todas as plataformas suportadas s ao igualmente boas para executar o MySQL. Algumas s ao mais robustas e ecientes que outras - ver Se c ao 2.2.3 [Which OS], P agina 78 para detalhes. V arias vers oes do MySQL est ao dispon iveis em distribui c oes bin arias e fonte. N os tamb em fornecemos acesso p ublico ` a nossa arvore fonte atual para aqueles que desejam ver nossos desenvolvimentos mais recentes e nos ajudar a testar novos c odigos. Para determinar que vers ao e tipo da distribui c ao voc e deve usar, veja Se c ao 2.2.4 [Which version], P agina 80. Se ainda restar d uvidas, use uma a distribui c ao bin aria. Instru c oes de instala c ao para distribui c oes bin aria e fonte s ao descritos em Se c ao 2.2.9 [Installing binary], P agina 91 e Se c ao 2.3 [Installing source], P agina 94. Cada conjunto de instru c oes inclui uma se c ao sobre problemas espec icos de sistemas que voc e pode precisar. Para procedimentos p os-instala c ao, veja Se c ao 2.4 [Post-installation], P agina 111. Estes procedimentos podem ser aplicados caso voc e use uma distribui c ao bin aria ou fonte do MySQL.
61
A distribui c ao fonte cont em todo o c odigo e os arquivos suportados para construir o execut avel usando o compilador VC++ 6.0. Veja Se c ao 2.3.7 [Constru c ao do fonte para Windows], P agina 107. mais simples e voc Geralmente, a melhor op c ao e a distribui c ao bin aria. E e n ao precisa de nenhuma ferramenta adicional para ter o MySQL em execu c ao.
62
C:\mysql\bin> mysqladmin -u root shutdown 4. Finalize o programa WinMySQLAdmin se ele estiver em execu c ao. 5. Descompacte os arquivos de distribui c ao em um diret orio tempor ario. 6. Execute o programa setup.exe para iniciar o processo de instala c ao. Se voc e quiser instalar em um diret orio diferente do padr ao (c:\mysql), use o bot ao Browse para especicar seu diret orio preferido. Se voc e n ao instalar o MySQL no local padr ao, voc e precisar a epecicar o local onde voc e inicia o servidor. O modo mais f acil de se fazer isto e usar um arquivo de op c ao, como descrito em Se c ao 2.1.1.3 [Windows prepare environment], P agina 62. 7. Finalize o processo de instala c ao.
63
O MySQL procura pelas op c oes primeiro no arquivo my.ini, e ent ao pelo arquivo my.cnf. No entanto, para evitar confus ao, e melhor se voc e usar apenas um destes arquivos. Se o seu PC usa um boot loader onde o drive C: n ao e o drive de boot, sua u nica op c ao e usar o arquivo my.ini. Independente de qual arquivo usar, ele deve ser no formato texto. Um arquivo de op c ao pode ser criado e modicado com qualquer editor de texto como o programa Notepad. Por exemplo, se o MySQL est a instalado em D:\mysql e o diret orio de dados est a localizado em D:\mydata\data, voc e pode criar o arquivo de op c ao e denir uma se c ao [mysqld] para especicar valores para os par ametros basedir e datadir: [mysqld] # defina basedir com o seu caminho de instala c~ ao basedir=D:/mysql # defina datadir com o local do diret orio de dados, datadir=D:/mydata/data Note que os nome de caminho do Windows s ao espec icados em arquivos de op c ao usando barras normais em ves de barra invertida. Se voc e usar barras invertidas, voc e deve us a-las em dobro. Outro modo de se gerenciar um arquivo de op c ao e usar a ferramenta WinMySQLAdmin. Voc e pode encontrar o WinMySQLAdmin no diret orio bin de sua instala c ao MySQL, assim como um arquivo de ajuda contendo instru c oes para us a-lo. O WinMySQLAdmin tem a capacidade de editar os seus arquivos de op c ao, mas note o seguinte: WinMySQLAdmin usa apenas o arquivo my.ini. Se o WinMySQLAdmin encontra o arquivo C:\my.cnf, ele o renomear a para C:\my_cnf.bak para disabilit a-lo. Agora voc e est a pronto para testar o servidor.
Todos os bin arios acima s ao otimizados para processadores Intel modernos mas deve funcionar em qualquer processador Intel i386 ou melhor. Os servidores mysqld-nt e mysqld-max-nt suportam conex oes named pipe. Se voc e usar um destes servidores, o uso de named pipes est a sujeito a estas condi c oes:
64
Os servidores devem ser executados em uma vers ao do Windows que suporte named pipes (NT, 2000, XP). A partir da vers ao 3.23.50, named pipes s o estar ao habilitados se voc e iniciar estes servidores com a op c ao --enable-named-pipe. Os servidores podem ser executados no Windows 98 ou Me, mas o TCP/IP deve estar instalado, e as conex oes named pipes n ao podem ser usadas. No Windows 95, estes servidores n ao podem ser usados.
65
011024 10:58:25
InnoDB: Started
Quando o servidor naliza sua sequ encia de inicializa c ao, voc e deve ver algo como abaixo, que indica que o servidor est a pronto para o conex ao com o cliente: port: 3306 O servidor continuar a a gravar no console qualquer sa ida de diagn ostico adicional que ele produza. Voc e pode abrir uma nova janela de console na qual se executar a os programas clientes. Se voc e omitir a op c ao --console, o servidor grava a sa ida do diagn ostico no log de erro no diret orio de dados. O log de erro e o arquivo com a extens ao .err. mysqld: ready for connections Version: 4.0.14-log socket:
66
67
No caso normal que voc e instala o servidor com --install mas nenhum nome de servi co, o servidor e instalado com um nome de servi co de MySQL. Como um exemplo mais complexo, considere o seguinte comando: shell> C:\mysql\bin\mysqld --install mysql --defaults-file=C:\my-opts.cnf Aqui, um nome de servi co e dado depois de op c ao --install. Se nenhuma op c ao -defaults-file for dada, este comando teria o efeito de fazer o servidor ler o grupo [mysql] a partir do arquivo de op c oes padr ao. (Isto seria uma m a id eia, porque aquele grupoo de op c ao e para ser usado pelo programa cliente mysql.) No entanto, como a op c ao -defaults-file est a presente, o servidor l e as op c oes apenas a partir do arquivo indicado, e apenas do grupo de op c ao [mysqld]. Voc e tamb em pode especicar as op c oes como Par^ ametros de inicializa c~ ao no utilit ario de Servi cos do Windows antes de voc e iniciar o servi co MySQL. Uma vez que o servidor MySQL e instalado, o Windows ir a iniciar o servi co automaticamente sempre que o Windows inicia. O servi co tamb em pode ser iniciado imediatamente a partir do utilit ario Servi cos ou usando o comando NET START MYSQL. O comando NET n ao e caso sensitivo. Note que quando executado como um servi co, o mysqld n ao t em acesso a um console e ent ao nenhuma mensagem pode ser vista. Se o mysqld n ao iniciar, verique o log de erros par ver se o servidor gravou alguma mensagem l a indicando a causa do problema. O log de o arquivo com um suxo .err. erro est a localizado no diret orio c:\mysql\data. E Quando o mysqld est a executando como um servi co, ele pode ser parado usando o utilit arios Servi cos, o comando NET STOP MYSQL, ou o comando mysqladmin shutdown. Se o servi cp estiver em execu c ao quando o Windows desliga, o Windows ir a parar o servidor automaticamente. A partir do MySQL vers ao 3.23.44, voc e pode escolher entre instalar o servidor como um servi co Manual se voc e n ao deseja que os servi cos sejam executados automaticamente durante o processo de inicializa c ao. Para fazer isto, use a op c ao --install-manual em vez da op c ao --install. shell> C:\mysql\bin\mysqld --install-manual Para remover um servi co que est a instalado como um servi co, primeiro pare-o se ele estiver em execu c ao. Ent ao use a op c ao --remove para remov e-lo: shell> mysqld --remove Um problema com a naliza c ao autom atica do servi co MySQL e que, para vers oes do MySQL anteriores a 3.23.49, o Windows esparava apenas por alguns segundos para o desligamento 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 armazenamento InnoDB dever a fazer uma recupera c ao de falhas na pr oxima inicializa c ao). A partir do MySQL 3.23.49, o Windows ir a esperar mais para que a naliza c ao do MySQL Server esteja completa. Se voc e notar que ainda n ao e o suciente para a sua instala c ao, n ao e seguro executar o MySQL Server como um servi co. Em vez disso, execute-o a partir do prompt de comando, e nalize-o com mysqladmin shutdown. A altera c ao para avisar para o Windows para esperar mais quando parar o servidor MySQL funciona apenas com o Windows 2000 e XP, mas n ao para o Windows NT. No NT, o Windows espera apenas 20 segundos para que o servi co seja nalizado, e depois desso ele
68
mata o processo do servi co. Voc e pode aumentar este padr ao abrindo o Editor de Registro (\winnt\system32\regedt32.exe) e editar o valor de WaitToKillServiceTimeout em HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control na arvore do Registro. Especique o novo valor mais largo em milisegundos (por exemplo 12000 para que o Windows NT espere at e 120 segundos). Se voc e n ao quiser iniciar o mysqld como um servi co, voc e pode inici a-lo a partir da linha de comando do mesmo modo que em vers oes do Windows que n ao s ao baseados no NT. Para instru c oes use Se c ao 2.1.1.6 [Win95 start], P agina 65.
69
Os privil egios padr oes no Windows d ao a todos usu arios locais privil egios totais para todos os bancos de dados sem necessidade de especicar uma senha. Para deixar o MySQL mais seguro, voc e deve congurar uma senha para todos os usu ario e remover a linha na tabela mysql.user que tem Host=localhost e User=. Voc e tamb em deve adicionar uma senha para o usu ario root. O exemplo seguinte exemplo inicia removendo o usu ario an onimo que tem todos os privil egios, e ent ao congura uma senha para o usu ario root: C:\> C:\mysql\bin\mysql mysql mysql> DELETE FROM user WHERE Host=localhost AND User=; mysql> FLUSH PRIVILEGES; mysql> QUIT C:\> C:\mysql\bin\mysqladmin -u root password your_password Depois de congurar a senha, se voc e desejar desligar o servidor mysqld, voc e pode usar o seguinte comando: C:\> mysqladmin --user=root --password=sua_senha shutdown Se voc e estiver usando o servidor de uma antiga vers ao shareware do MySQL vers ao 3.21m o comando mysqladmin para congurar uma senha ir a falhar com um erro: parse error near SET password. A corre c ao para este problema e atualizar para uma vers ao mais nova do MySQL. Com as vers oes atuais do MySQL voc e pode facilmente adicionar novos usu arios e alterar privil egios com os comandos GRANT e REVOKE. Veja Se c ao 4.4.1 [GRANT], P agina 255.
70
estaticamente ligados e n ao dependem de bibliotecas compartilhadas). Para distribui c oes que incluem as bibliotecas compartilhadas no mesmo pacote que o servidor MySQL (ex.: Red Hat Linux), voc e tamb em pode instalar nosso RPM MySQL-shares 3.23 ou usar o pacote compat ivel com MySQL-shared. Os seguintes pacotes RPM est ao dispon iveis: MySQL-server-VERSION.i386.rpm O servidor MySQL. Voc e ira precisar dele a n ao ser que voc e apenas queira se conectar a um servidor MySQL executando em outra m aquina. Note que este pacote era chamado 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 ao tem. Voc e deve instalar o RPM MySQL-server primeiro, porque o RPM MySQL-Max depende dele. MySQL-client-VERSION.i386.rpm Os programas clientes padr oes do MySQL. Provavelmente voc e sempre instalar a este pacote. MySQL-bench-VERSION.i386.rpm Testes e comparativos de performances (benchmarks). Necessita do Perl e m odulos do BDB-mysql. MySQL-devel-VERSION.i386.rpm As bibliotecas e arquivos include necess arios se voc e precisa para compilar outros clientes MySQL, como nos m odulos Perl. MySQL-shared-VERSION.i386.rpm Este pacote cont em as bibliotecas compartilhadas (libmysqlclient.so*) que certas linguagens e aplica c oes nencess arias para carregar din amicamente e usar o MySQL. MySQL-shared-compat-VERSION.i386.rpm Este pacote inclui o biblioteca compartilhada para MySQL 3.23 e MySQL 4.0. Instale este pacote em vez do MySQL-shared, se voc e tiver aplica c oes instaladas que s ao din amicamente ligadas ao MySQL 3.23 mas voc e quer atualizar para o MySQL 4.0 sem quebrar as depend encias da biblioteca. Este pacote esta dispon 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 em o c odigo fonte para todos os pacotes acima. Ele tamb em pode ser usado 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 c ao m inima padr ao, execute: shell> rpm -i MySQL-server-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm Para instalar somente o pacote cliente, execute:
71
shell> rpm -i MySQL-client-VERSION.i386.rpm O RPM fornece um recurso para vericar a integridade e autenticidade dos pacotes antes de instal a-los. Se voc e quiser aprender mais sobre este recurso, veja Se c ao 2.2.2 [Verifying Package Integrity], P agina 75. O RPM coloca dados sob o /var/lib/mysql. O RPM tamb em cria as entradas apropriadas em /etc/rc.d/ para iniciar o servidor automaticamente na hora do boot. (Isto signica que se voc e realizou uma instala c ao anterior e fez altera c oes em seu script de inicializa c ao, voc e pode desejar criar uma c opia do script para que voc e n ao perca ao instalar um RPM mais novo). Veja Se c ao 2.4.3 [Automatic start], P agina 118 para mais informa c oes sobre como o MySQL pode ser iniciado automaticamente na inicializa c ao do sistema. Se voc e quiser instalar o RPM do MySQL em uma distribui c ao Linux mais antiga que n ao suporte scripts de inicializa c ao no /etc/init.d (diretamente ou via link simb olico), voc e deve criar um link simb olico que aponte para a localiza c ao onde o seu script de instala c ao est a atualmente instalado. Por exemplo, se esta localiza c ao for /etc/rc.d/init.d, use estes comandos antes de intalar o RPM para criar /etc/init.d como um link simb olico que aponte l a: shell> cd /etc; ln -s rc.d/init.d . No entanto, todas as distribui c oes de Linux atuais j a devem suportar este novo layout de diret orio que usa /etc/init.d j a que ele e exigido para compatibilidade LBS (Linux Standard Base). Se o arquivo RPM que voc e instalar inclui o MySQL-server, o daemon mysqld deve estar pronto e em execu c ao ap os a instala c ao. Agora voc e j a deve poder iniciar o MySQL. Veja Se c ao 2.4 [P os Instala c ao], P agina 111. Se alguma coisa der errado, voc e encontrar maiores informa c oes no cap itulo de instala c ao. Veja Se c ao 2.2.9 [Instalado o bin ario], P agina 91.
72
tabela de permiss oes do banco de dados MySQL executando mysql_install_db depois da instala c ao. O layout de instala c ao e similar a aquele da distribui c ao bin aria, todos os bin arios do MySQL est ao localizados no diret orio /usr/local/mysql/bin. O socket MySQL ser a colocado em /tmp/mysql.sock por padr ao. Veja Se c ao 2.2.5 [Installation layouts], P agina 83. A instala c ao do MySQL exige uma conta de usu ario do Mac OS X chamada mysql (uma conta de usu ario com este nome existe por padr ao no Mac OS X 10.2 e acima). Se voc e estiver executando o MAC OS X Server, voc e j a ter a uma vers ao do MySQL 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 c ao do manual cobre a instala c ao apenas do MySQL Mac OS X PKG ocial. Leia o ajuda da Apple sobre a instala c ao do MySQL (Execute o aplicativo Help View, selecione a ajuda do Mac OS X Server e fa ca uma busca por MySQL e leia o item entitulado Installing MySQL). Note especialmente, que a vers ao pr e-instalada do MySQL no Mac OS X Server e iniciado com o comando safe_mysqld em vez de mysqld_safe. Se anteriormente voc e usava pacotes do MySQL de Marc Liyanage para Mac OS X de http://www.entropy.ch, voc e pode simplesmente seguir as intru c oes de atualiza c ao para pacotes usando o layout de instala c ao dos bin ario como dados em suas p aginas. Se voc e est a atualizado da vers ao 3.23.xx de Marc ou do vers ao Mac OS X Server do MySQL para o MySQL PKG ocial, voc e tamb em deve converter a tabela de privil egios do MySQL existente para o formato atual, porque alguns novos privil egios de seguran ca foram adicionados. Veja Se c ao 2.5.6 [Upgrading-grant-tables], P agina 130. Se voc e preferisse iniciar automaticamente o MySQL durante o boot do sistema, voc e tamb en precisa instalar o MySQL Startup Item. A partir do MySQL 4.0.15, ele e parte do disco de instala c ao do Mac OS X como um pacote de instala c ao separado. Simplesmente de um duplo clique no icone MySQLStartupItem.pkg e siga as instru c oes para instal a-lo. Note que isto s o precisa ser feito uma vez! N ao h a necessidade de se instalar o Startup Item toda vez que se atualizar o pacote do MySQL. Devido a um erro no instalador de pacotes do Mac OS X, algumas vezes voc e pode ver a mensagem de erro You cannot install this software on this disk. (null) no di alogo de sele c ao do disco de destino. Se este erro ocorrer, simplesmente clique no bot ao Go Back uma vez para retornar a tela anterior. Agora clique em Continue para avan car para a sele c ao do disco de destino novamente - agora voc e deve estar apto a escolher o disco destino corretamente. N os informamos este erro a Apple e eles est ao investigando este problema. O Startup Item ser a instalado em /Library/StartupItems/MySQL. Ele adiciona uma vari avel MYSQLCOM=-YES- ao arquivo de congura c ao do sistema (/etc/hostconfig). Se voc e desejasse diasbilitar a inicializa c ao autom atica do MySQL, simplesmente altere o valor desta vari avel para MYSQLCOM=-NO-. No Mac OS X Server, o script de instala c ao do Startup Item disabilitar a automaticamente a inicializa c ao da instala c ao padr ao do MySQL alterando a vari avel MYSQL em
73
/etc/hostconfig para MYSQL=-NO-. Isto e para evitar conitos na inicializa c ao. No entanto, ele n ao desliga um servidor MySQL aj a em execu ca o. Depois da instala c ao, voc e pode iniciar o MySQL executando os seguintes comandos em um janela de terminal. Note qye voc e preceisa ter privil egios de administrador para realizar esta tarefa. Se voc e tiver instalado o Startup Item: shell> sudo /Library/StartupItems/MySQL/MySQL start (Enter your password, if necessary) (Press Control-D or enter "exit" to exit the shell) Se voc e n ao tiver instalado o Startup Item, digite a seguinte sequ encia de comandos: shell> shell> (Enter (Press shell> (Press cd /usr/local/mysql sudo ./bin/mysqld_safe your password, if necessary) Control-Z) bg Control-D or enter "exit" to exit the shell) executando
Se voc e instalar o MySQL pela primeira vez, lembre-se de consigurar uma senha para o usu ario root do MySQL! Isto e feito com os seguintes comandos: /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 a entre crases (), assim a shell pode substitui-la com a saida deste comando (o nome da m aquina deste sistema)! Voc e tamb em pode querer adicionar aliases ao seu arquivo de resursos do sheel para acessar 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 e pode simplesmente adicionar /usr/local/mysql/bin a sua vari avel de ambiente PATH, ex.: adicionando o seguinte ao arquivo $HOME/.tcshrc: setenv PATH ${PATH}:/usr/local/mysql/bin Note que instalar um novo MySQL PKG n ao remove o diret orio de uma instala c ao mais antiga. Infelizmente o Mac OS X Installer ainda n ao oferece a funcionalidade exigida para atualizar apropriadamente pacotes instalados anteriormente. Depois de copiar os arquivos de banco de dados do MySQL sobre os da vers ao anterior e inicializar o nova vers ao com sucesso, voc e deve remover os arquivos da instala c ao antiga para economizar espa co em disco. Adicionalmente voc e tamb em deve remover vers oes mais antigas do diret orio do Package Receipt localizados em /Library/Receipts/mysql-<version>.pkg.
74
75
MYSQLD_SAFE Se voc e estiver usando NetWare 6.0, voc e deve adicionar o par ametro --skipexternal-locking: #Starts the MySQL 4.0.x database server SEARCH ADD SYS:MYSQL\BIN MYSQLD_SAFE --skip-external-locking Se houver uma instala c ao existente do MySQL no servidor, verique a existencia de comandos de inicializa c ao do MySQL em autoexec.ncf, e edite ou delete-os se necess ario.
76
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 e deve vericar se o resultado do checksum corresponde a aquele impresso no p agina de download logo abaixo do respectivo pacote. A maioria do sites mirrors tamb em oferecem um arquivo chamado MD5SUMS, que tamb em inclui o MD5 checksums para todos os arquivos inclu idos no diret orio Downloads. Note no entanto que e muito f acil de modicar este arquivo e ele n ao e um m etodo muito con avel. Caso esteja em d uvida, voc e deve consultar diferentes sites mirroers e comparar os resultados.
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 e pode importar esta chave em seu pasta de chaves publicas GPG usando gpg --import. Veja a documenta c ao de GPG para mais informa c oes de como trabalhar com chaves p ublicas. Depois de fazer o download e importar a chave publica criada, fa ca o download do pacote MySQL desejado e da assinatura correspondente, que tamb em est a dispon ivel na p agina de download. A assinatura tem a extens ao .asc. Por exemplo, 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 ao armazenados no mesmo diret orio e ent ao execute o seguinte comando para vericar a assinatura para este arquivo: shell> gpg --verify <package>.asc Exemplo: shell> gpg --verify gpg: Warning: using gpg: Signature made gpg: Good signature "MySQL Package mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz.asc insecure memory! Mon 03 Feb 2003 08:50:39 PM MET using DSA key ID 5072E1F5 from signing key (www.mysql.com) <build@mysql.com>"
78
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 e estiver usando RPM 4.1 e ele reclamar sobre (GPG) NOT OK (MISSING KEYS: GPG#5072e1f5) (mesmo se voc e a importou para detro de sua pasta de chaves publicas GPG), voc e precisa import a-las para dentro de sua pasta de chaves RPM primeiro. RPM 4.1 n ao utiliza mais ias suas pastas de chaves GPG (e o pr oprio GPG), mas mant em sua pr opria pasta de chaves (porque ele e um aplicativo do sistema e a pasta de chaves p ublicas do GPG e um arquivo espec ico do usu ario). Para importar a chave p ublica do MySQL em uma pasta de chaves RPM, use os seguintes comandos: shell> rpm --import <pubkey> Exemplo: shell> rpm --import mysql_pubkey.asc Caso voc e note que as assinaturas MD5 checksum ou GPG n ao coincidem, tente primeiro fazer o download do pacote respectivo mais uma vez, talvez de outro site mirror. Se voc e n ao obter sucesso na verica c ao da integridade do pacote repetidas vezes, notique-nos sobre tais incidentes incluindo o nome completo do pacote e o site que voc e tem utilizado para fazer o download pelos emails webmaster@mysql.com ou build@mysql.com.
79
FreeBSD 3.x e 4.x com threads nativas. Veja Se c ao 2.6.4.1 [FreeBSD], P agina 149. FreeBSD 4.x com Linuxthreads. Veja Se c ao 2.6.4.1 [FreeBSD], P agina 149. HP-UX 10.20 com o pacote incluido MIT-pthreads ou DCE threads. Veja Se c ao 2.6.6.2 [HP-UX 10.20], P agina 154. HP-UX 11.x com as threads nativas. Veja Se c ao 2.6.6.3 [HP-UX 11.x], P agina 154. Linux 2.0+ com LinuxThreads 0.7.1+ ou glibc 2.0.7+. Veja Se c ao 2.6.2 [Linux], P agina 137. Mac OS X Server. Veja Se c ao 2.6.5 [Mac OS X], P agina 152. NetBSD 1.3/1.4 Intel e NetBSD 1.3 Alpha (Necessita GNU make). Veja Se c ao 2.6.4.2 [NetBSD], P agina 150. Novell NetWare 6.0. Veja Se c ao 2.6.8 [Novell NetWare], P agina 164. OpenBSD > 2.5 com threads nativas. OpenBSD < 2.5 com o pacote inclu ido MITpthreads . Veja Se c ao 2.6.4.3 [OpenBSD], P agina 151. OS/2 Warp 3, FixPack 29 e OS/2 Warp 4, FixPack 4. Veja Se c ao 2.6.7 [OS/2], P agina 164. SGI Irix 6.x com threads nativas. Veja Se c ao 2.6.6.8 [SGI-Irix], P agina 160. Solaris 2.5 e superior com threads nativas nas plataformas SPARC e x86. Veja Se c ao 2.6.3 [Solaris], P agina 145. SunOS 4.x com o pacote inclu ido MIT-pthreads. Veja Se c ao 2.6.3 [Solaris], P agina 145. Tru64 Unix Windows 9x, Me, NT, 2000 e XP. Veja Se c ao 2.6.1 [Windows], P agina 133. Perceba que nem todas as plataformas s ao apropriadas para executar o MySQL. Os seguintes fatores determinam se uma certa plataforma e apropriada para uma miss ao cr itica pesada: Estabilidade geral da biblioteca thread. Uma plataforma pode ter excelente reputa c ao, entretanto, se a biblioteca thread e inst avel no c odigo que e usado pelo MySQL, mesmo se todo o resto for perfeito, o MySQL ir a ser t ao est avel quanto a biblioteca thread. A habilidade do kernel e/ou a biblioteca thread tirar vantagem do SMP em sistemas multi-processados. Em outras palavras, quando um proceesso cria uma thread, deve ser poss ivel para aquela thread executar em uma CPU diferente que o processo original. A habilidade do kernel e/ou a biblioteca thread executar v arias threads que adiquire/libera um bloqueio mutex sobre uma pequena regi ao cr itica frequentemente sem trocas de contexto excessivos. Em outras palavras, se a implementa c ao de pthread_mutex_lock() requisitar a CPU muito rapidamente, isto ir a afetar o MySQL tremendamente. Se esse detalhe n ao estiver sendo cuidado, adicionar CPUs extras podem deixar o MySQL mais lento. Estabilidade e performance geral do sistema de arquivos. Habilidade do sistema de arquivos em lidar com arquivos grandes de forma eciente, se suas tabelas forem grandes. Nosso n ivel de experi encia aqui na MySQL AB com a plataforma. Se n os conhecemos bem uma plataforma, introduzimos otimiza c oes/corre coes espec icas para ela habilitadas na hora da compila c ao. N os tamb em podemos fornecer conselhos sobre como congurar seu sistema otimizadamente para o MySQL.
80
O volume de testes feitos internamente de congura c oes similares. O n umero de usu arios que tem executado o MySQL com sucesso naquela plataforma em congura c oes similares. Se esse n umero for alto, as chances de se ter alguma surpresa espec ica da plataforma ca muito menor. Baseado nos crit erios acima, as melhores plataformas para a execu c ao do MySQL at e este ponto s ao o x86 com SuSe Linux 8.2, kernel 2.4 e ReiserFS (ou qualquer distribui c ao Linux similar) e Sparc com Solaris (2.7-9). FreeBSD vem em terceiro, mas realmente temos esperan cas que ele ir a se unir ao clube dos tops uma vez que a biblioteca thread est a melhorando. N os tamb em acreditamos que em certo ponto iremos estar aptos para incluir todas as outras plataformas em que o MySQL compila e executa, mas n ao t ao bem e com o mesmo n ivel de estabilidade e performance, na categoria superior. Isto necessitar a de algum esfor co da nossa parte em coopera c ao com os desenvolvedores dos componentes do Sistema Operacional/Biblioteca que o MySQL depende. Se voc e tiver interesse em melhorar algum de nossos componentes, est a em uma posi c ao para inuenciar seu desenvolvimento, e precisa de instru c oes mais detalhadas sobre o que o MySQL necessita para uma melhor execu c ao, envie um e-mail para lista de email insternals do MySQL. Veja Se c ao 1.7.1.1 [Mailing-list], P agina 33. Por favor, perceba que a compara c ao acima n ao e para dizer que um SO e melhor ou pior que o outro em geral. N os estamos falando sobre a escolha de um SO para um prop osito dedicado: executar o MySQL, e comparamos as plataformas levando isto em considera c ao. Desta forma, o resultado desta compara c ao seria diferente se n os inclu issemos mais detalhes. E em alguns casos, a raz ao de um SO ser melhor que o outro pode ser simplesmente porque colocamos mais esfor co nos testes e otimiza c ao para aquela plataforma em particular. Estamos apenas colocando nossas observa c oes para ajud a-lo na decis ao de qual plataforma usar o MySQL na sua congura c ao.
81
Nos seguites casos voc e provavelmente ser a mais bem servido com uma instala c ao baseada em c odigo fonte: Se voc e desejar instalar o MySQL em algum lugar expec ico. (O padr ao das distribui c oes bin arias e estarpronto para rodar em qualquer lugar, mas talvez voc e deseje ainda mais exibilidade). Para estar apto e satisfazer diferentes requisi c oes dos usu arios, estaremos fornecendo duas vers oes bin arias diferentes; Uma compilada com os manipuladores de tabelas n ao transacionais (um bin ario r apido e pequeno) e um congurado com as mais importantes op c oes extendidas como tabelas transacionais. Ambas vers oes s ao compiladas da mesma distribui c ao fonte. Todos clientes MySQL nativos pode conectar com ambas vers oes do MySQL. A distribui c ao bin aria extendida e marcada com o suxo -max e e congurada com as mesmas op c oes de mysqld-max. Veja Se c ao 4.8.5 [mysqld-max], P agina 344. Se voc e deseja usar o RPM MySQL-Max, primeiramente voc e deve instalar o RPM MySQLserver padr ao. est Se voc e deseja congurar mysqld com alguns recursos extras que NAO ao nas distribui c oes bin arias. Segue abaixo a lista das op c oes extras mais comuns que voc e pode querer usar: --with-innodb --with-berkeley-db (padr ao para o MySQL 4.0 e seguintes) --with-raid (n ao disponivel para todas as plataformas) --with-libwrap --with-named-z-lib (Isto e feito para alguns dos bin arios) --with-debug[=full] A distribui c ao bin aria padr ao e normalmente compilada com suporte para todos conjuntos de caracteres e deve funcionar em uma variedade de processadores para a mesma fam ilia do processador. Se voc e precisar de um servidor MySQL mais r apido voc e pode querer recompil a-lo com suporte para somente o conjunto de caracteres que voc e precisa, usar um compilador melhor (como pgcc) ou usar op c oes de compiladores para usar otimiza c oes para seu processador. Se voc e encontrar um erro e relat a-lo para o time de desenvolvimento do MySQL voc e provavelmente receber a um patch que ser a necess ario aplic a-lo para a distribui c ao fonte para ter o bug corrigido. Se voc e deseja ler (e/ou modicar) o c odigo C e C++ que e o MySQL, voc e pode obter uma distribui c ao fonte. O c odigo fonte e sempre o manual nal. Distribui c oes fontes tamb em contem mais testes e exemplos que as distribui c oes bin arias. O esquema de nomes do MySQL usa n umeros de vers oes que consistem de tres n umeros e um suxo. Por exemplo, um nome de lan camento como mysql-4.1.0-alpha e interpretado da seguinte maneira: O primeiro n umero (4) e a vers ao principal e tamb em descreve o formato dos arquivos. Todas releases da Vers ao 4 tem o mesmo formato de arquivo. O segundo n umero (1) e o n ivel da distribui c ao.
82
O terceiro n umero (0 e o n umero da vers ao do n ivel de distribui c ao. Este e incrementado para cada nova distribui c ao. Normalmente voc e desejar aau ltima vers ao para o n ivel de publica c ao que tiver escolhido. O suxo (alpha) indica o n ivel de estabilidade da vers ao. Os poss iveis suxo s ao: alpha indica que a vers ao cont em grandes se c oes de novos c odigos que n ao foram 100% testados. Bugs conhecidos (normalmente n ao tem nenhum) devem estar documentados na se c ao News. Veja Ap endice C [News], P agina 948. Existem tamb em novos comandos e extens oes na maioria das publica c oes alpha. Desenvolvimento ativo que podem envolver maiores altera c oes no c odigo pode ocorrer numa vers ao alpha, mas tudo ser a testado antes de fazer a publica c ao. N ao podem existir erros conhecidos em nenhuma publica c ao do MySQL. beta signica que todo o novo c odigo foi testado. N ao ser ao adicionados novos recursos que podem causar algum tipo de corrompimento. N ao deve existir bugs conhecidos. Uma altera c ao de vers ao de alpha para beta ocorre quando n ao existir nenhum relato de erro fatal com uma vers ao alpha por pelo menos um m es e n ao planejarmos adicionar nenhum recurso que pode deixar algum antigo comando menos con avel. gamma e o beta que j a tem sido usado a algum tempo e parece funcionar bem. Apenas pequenas corre c oes s ao adicionadas. Isto e o que muitas empresas chamam de release. Se n ao existir um suxo, signica que esta vers ao j a est a sendo executada h a algum tempo em diferentes locais sem relatos de erros al em dos espec icos de certas plataformas. Somente corre c oes de erros cr iticos s ao adicionados ao release. Isto e o que chamamos de uma distribui c ao est avel. No processo de desenvolvimento do MySQL, v arias vers oes coexistem e est ao em um est agio diferente. Naturalmente, corre c oes de erros relevantes de uma s erie anterior s ao propagados. Para a antiga s erie 3.23 est avel/de produ c ao, novas vers oes s o s ao liberadas para erros cr iticos. A s erie atual (4.0) e de qualidade est avel/produ c ao. Nenhum novo recurso que possa inuenciar a estabilidade do c odigo e adicionado. No ramo alpha 4.1 principal, novos recursos s ao adicionados. Fontes e bin arios est ao dispon iveis para uso e teste em sistemas de desenvolvimento. O ramo de desenvolvimento 5.0 s o est a dispon ivel para a arvore do BitKeeper. Todas as vers oes do MySQL funcionam sobre nossos testes padr oes e comparativos para garantir que eles s ao relativamente seguros para o uso. Como os testes padr oes s ao extendidos ao longo do tempo para conferir por todos os bugs antigos encontrados, o pacote de testes continua melhorando. Perceba que todas publica c oes de vers oes foram testadas pelo menos com: Um pacote de testes interna Faz parte de um sistema de produ c ao para um cliente. Ela tem diversas tabelas com centenas de megabytes de dados.
83
O pacote de comparativos da MySQL tamb Este executa uma s erie de consultas comuns. E em um teste para ver se o u ltimo conjunto de otimiza c oes fez o c odigo mais r apido. Veja Se c ao 5.1.4 [MySQL Benchmarks], P agina 422. O teste crash-me Este tenta determinar quais recursos o banco de dados suporta e quais s ao suas capacidades e limita c oes. Veja Se c ao 5.1.4 [MySQL Benchmarks], P agina 422. Outro teste e que n os usamos a vers ao do MySQL mais nova em nosso ambiente de produ c ao interna, em pelo menos uma m aquina. N os temos mais de 100 gigabytes de dados com que trabalhar.
84
The header le 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.
85
2.2.7 Filosoa das Distribui c oes - Nenhum Bug Conhecidos nas Distribui co es
Colocamos muito tempo e esfor co em tornar nossas distribui c oes livres de erros. Pelo nosso conhecimento, n ao liberamos uma u nica vers ao do MySSQL com qualquer erro conhecido fatal. Um erro fatal e algo que faz o MySQL falhar com o uso normal, traz respostas erradas para consultas normais ou tem um problema de seguran ca. N os temos documentados todos os problemas conhecidos, bugs e assuntos que s ao dependentes das decis oes de projeto. Veja Se c ao 1.8.6 [Bugs], P agina 53. Nosso objeto e corrigir tudo que e poss ivel, mas sem correr o risco de tornarmos uma vers ao menos est avel. Em certos casos, isto signica que podemos corrigir um problema na(s) vers ao( oes) de desenvolvimento, mas n ao o corrigirmos na vers ao est avel (produ c ao). Naturalmente, documentamos tais problemas para que o usu arios esteja ciente. Aqui est a um descri c ao de como nosso processo de contru c ao funciona: 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 oes usadas s ao inseridos nio banco de dados de bugs. 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 a. (Cerca de 90% de todos os erros corrigidos t em um caso de teste.) Tamb em criamos casos de teste para todos os novos recursos adicionados ao MySQL. Antes de come carmos a fazer uma nova distribui c ao do MySQL, asseguramos que todos os erros repetit iveis relatados para a vers ao do MySQL (3.23.x, 4.0.x, etc) est ao corrigidos. Se algo for imposs ivel de corrigir (devido a alguma decis ao de projeto interno no MySQL), documentaremos isto no manual. Veja Se c ao 1.8.6 [Bugs], P agina 53. N os fazemos uma constru c ao para todas as plataformas para as quais suportamos bin arios (mais de 15 plataformas) e executamos nosso pacote de teste e benchmarks para todas elas. N ao publicaremos um bin ario para uma plataforma na qual os testes do pacote de benchmarks falharam. Se for um erro geral na fonte, o corrigimos e fazemos as contru c oes mais os teste em todos os sistemas novamente. Se n os, durante a o porcesso de constru c ao e teste (que leva de 2 a 3 dias) recebermos um relat orio sobre um erro fatal (por exemplo, um que cause um core dump), o corrigiremos e reiniciaremos o processo de constru c ao). Depois de publicarmos os bin arios em http://www.mysql.com/, enviamos um email de an uncio nas listas de email mysql e announce. Veja Se c ao 1.7.1.1 [Mailing-list], P agina 33. A mensagem de an uncio cont em uma lista de todas as altera c oes da distribui c ao e qualquer problema conhecido com ela. (A se c ao problemas conhecidos na notas das distribui c oes s o tem sido necess aria em algumas da distribui c oes.) Para darmos acesso rapidamente aos nossos usu arios dos u ltimos recursos do MySQL, fazemos uma nova distribui c ao do MySQL a cada 4-5 semanas. Se, depois da distribui c ao estar pronta, recebermos qualquer relat orio que houve (depois de tudo) qualquer coisa criticamente errada com a constru c ao em uma plataforma
86
espec ica, corrigiremo-na imediatamente e liberaremos um nova distribui c ao a para aquela plataforma. Gra cas aos nosso grande base de usu arios, problemas s ao encontrados rapidamente. Nosso registro para boas distribui c oes feitas e muito boa. Nas u ltimas 150 distribui c oes, tivemos que fazer uma nova contru c ao para menos de 10 distribui c oes (em 3 destes casos, o erro era uma biblioteca glibc com problema em uma de nossas m aquinas que levamos um longo tempo para encontrar.
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=-allstatic Linux 2.4.xx x86 64 (AMD64) com gcc 3.2.1 CXX=gcc ./configure --prefix=/usr/local/mysql --with-extracharsets=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 -fnoexceptions -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-extracharsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --with-named-z-libs=no --with-named-curseslibs=-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-extracharsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --with-named-curses-libs=-lcurses --disableshared 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-extracharsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --with-named-z-libs=no --enable-thread-safeclient --disable-shared
88
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-extracharsets=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-zlibs=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-extracharsets=complex --with-server-suffix="-pro" --enable-threadsafe-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 --enablethread-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-extracharsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared
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=notused --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-extracharsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared Os seguintes bin arios s ao contru idos em sistemas de terceiros gentilmente cedidos para a MySQL AB pou outros usu arios. Pou favor, note que eles s o s ao fornecidos como cortesia. Uma vez que a MySQL AB n ao tem total controle sobre estes sistemas, n os podemos fornecer apenas suporte limitado para os bin arios constru 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-safeclient --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-safeclient --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-extracharsets=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-extracharsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared
90
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 c oes de compila c ao foram usadas nos pacotes bin arios que a MySQL AB costumava fornecer no passado. Estes bin arios n ao s ao mais atualizados, mas as op c oes de compila c ao s ao mantidas aqui com o prop osito de refer encia. 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-extracharsets=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-mysqldldflags=-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-extracharsets=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 c oes otimizadas para qualquer das congura c oes listadas acima pode sempre envi a-los para a lista de email internals do MySQL. Veja Se c ao 1.7.1.1 [Mailing-list], P agina 33.
91
Distribui c oes RPM que anteceda o MySQL vers ao 3.22 s ao contribui c oes dos usu arios. Os RPMs gerados por n os da MySQL AB s o come caram a ser fornecidos a partir da vers ao 3.22 do MySQL. Se voc e deseja compilar uma vers ao para depura c ao do MySQL, voc e deve adicionar --withdebug ou --with-debug=full para as linhas de congura c ao acima e remover qualquer op c ao -fomit-frame-pointer. Para distribui c oes do Windows, por favor, veja Se c ao 2.1.1 [Windows installation], P agina 60.
92
Voc e pode adicionar novos usu arios usando o script bin/mysql_setpermission se voc e instalar os m odulos Perl DBI e DBD-mysql. Uma descri c ao mais detalhada e apresentada a seguir. Para instalar uma distribui c ao bin aria, siga estes passos, ent ao proceda com a Se c ao 2.4 [P os Instala c ao], P agina 111, para a congura c ao da p os istala c ao e testes: 1. Escolha o diret orio sob o qual voc e deseja descompactar a distribui c ao e a mova para dentro dele. No exemplo a seguir, descompactamos a distribui c ao sob /usr/local e criamos um diret orio /usr/local/mysql dentro do qual o MySQL e instalado. (As seguintes instru c oes, consequentemente, assumem que voc e tem permiss ao para criar arquivos em /usr/local. Se este diret orio e protegido, voc e precisar a realizar a instala c ao como root.) 2. Obtenha um arquivo de distribui c ao de um dos sites listados em Se c ao 2.2.1 [Getting MySQL], P agina 75. As distribui c oes bin arias do MySQL s ao fornecidas como arquivos tar compactados e tem nomes como mysql-VERS~ AO-SO.tar.gz, onde VERS~ AO e um n umero (por exemplo, 3.21.15) e SO indica o tipo de sistema operacional para o qual a distribui c ao e pretendida (por exemplo, pc-linux-gnu-i586). 3. Se voc e ver uma distribui c ao bin aria marcada com o suxo -max, signica que o bin ario tem suporte para tabelas transacionais e outros recursos. Veja Se c ao 4.8.5 [mysqld-max], P agina 344. Note que todos os bin arios s ao contru idos a partir da mesma distribui c ao fonte do MySQL. 4. Adicione um usu ario e grupo para o mysqld ser executado: shell> groupadd mysql shell> useradd -g mysql mysql Estes comandos adicionam o grupo mysql e o usu ario mysql. A sintaxe para useradd e groupadd podem diferir um pouco nas diversas vers oes de Unix. Eles tamb empodem ser chamado adduser e addgroup. Voc e pode desejar criar o grupo e usu ario com outro nome, diferente de mysql. 5. Chame o diret orio no qual se pretende fazer a instala c ao: shell> cd /usr/local 6. Descompacte a distribui c ao, que criar a o diret orio de instala c ao. Ent ao crie um link simb olico para aquele diret orio: shell> gunzip < /path/to/mysql-VERS~ AO-SO.tar.gz | tar xvf shell> ln -s full-path-to-mysql-VERS~ AO-SO mysql O primeiro comando cria um diret orio chamado mysql-VERS~ AO-SO. O segundo comando cria um link simb olico para o diret orio. Isto torna a refer encia ao diret orio de instala c ao mais f acil, chamado como /usr/local/mysql. 7. Altere para p diret orio de instala c ao: shell> cd mysql Voc e encontrar a diversos arquivos e subdiret orios no diret orio mysql. O mais importante para prop ositos de instala c ao s ao os subdiret orios bin e scripts. bin Este diret orio cont em o programa cliente e o servidor. Voc e deve adicionar o caminho completo deste diret orio a sua vari avel de ambiente PATH e
93
assim a sua shell encontrar a o programa MySQL de forma apropriada. Veja Ap endice E [Vari aveis de ambiente], P agina 1083. scripts Este diret orio cont em o script mysql_install_db usado para inicializar o banco de dados mysql contendo a tabela de permiss oes que armazenam o servidor de permiss oes de acesso.
8. Caso voc e desejasse usar o mysqlaccess e a distribui c ao do MySQL est a em um local diferente do padr ao, voc e deve alterar a localiza c ao para onde o mysqlaccess espera 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 a armazaenado em seu sistema. Se voc e n ao zer isto receber a uma mensagem de erro Broken pipe quando executar o mysqlaccess. 9. Crie as tabelas de permiss ao do MySQL (necess ario apenas se voc e n ao tiver instalado o MySQL anteriormente): shell> scripts/mysql_install_db Note que as vers oes mais antigas que a 3.22.10 iniciam o servidor MySQL quando voc e executa o mysql_install_db. Isto n ao ocorre mais. 10. Altere o propriet ario dos bin arios para o root e o propriet ario do diret orio de dados para o usu ario com o quel voc e executar a o mysqld: 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 ario root, o segundo altera o atributo owner do diret orio de dados para o usu ario mysql e o terceiro altera o atributo group para o grupo mysql. 11. Se voc e quiser instalar o suporte para a interface Perl DBI/DBD, veja Se c ao 2.7 [Perl support], P agina 165. 12. Se voc e desejasse que o MySQL seja iniciado automaticamente quando voc e iniciar a sua m aquina, voc e pode copiar support-files/mysql.server para o local onde o seu sistema tem os arquivos de inicializa c ao. Mais informa c oes podem ser encontradas no script support-files/mysql.server e em Se c ao 2.4.3 [Automatic start], P agina 118. Depois de tudo estar descompactado e instalado, voc e deve inicializar e testar a sua distribui c ao. Voc e pode iniciar o servidor MySQL com o seguinte comando: shell> bin/mysqld_safe --user=mysql & Se a sua vers ao do MySQl for mais antiga do que a 4.0, substitua bin/safe_mysqld por bin/mysqld_safe no comando. Agora prossiga com Se c ao 4.8.2 [mysqld_safe], P agina 332 e Veja Se c ao 2.4 [P os instala c ao], P agina 111.
94
95
96
5.
6.
7.
8.
9.
10.
11. 12.
ser chamadas adduser e addgroup. Voc e pode escolher outros nomes para o usu ario e grupo em vez de mysql. Descompacte a distribui c ao para o diret orio corrente: shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf Este comando cria um diret orio com o nome mysql-VERSION. Mude para o diret orio da distribui c ao descompactada: shell> cd mysql-VERSION Note que agora voc e deve congurar e construir o MySQL a partir deste diret orio raiz da distribui c ao. Voc e n ao pode constru i-lo em um diret orio diferente. Congure o release e compile tudo: shell> ./configure --prefix=/usr/local/mysql shell> make Quando voc e executar configure, voc e pode desejar especicar algumas op c oes. Execute ./configure --help para uma lista das op c oes. Se c ao 2.3.3 [configure options], P agina 97, discute algumas das op c oes mais usadas. Se o configure falhar, e voc e for enviar uma mensagem para lista de email do MySQL para pedir ajuda, por favor, inclua qualquer linhas de config.log que voc e acha que pode ajudar a resolver o problema. Tamb em inclua as u ltimas linhas da sa ida de configure se o configure abortar. Envie o relat orio de erros usando o script mysqlbug. Veja Se c ao 1.7.1.3 [Bug reports], P agina 36. Se a compila c ao falhar, veja Se c ao 2.3.5 [Compilation problems], P agina 103, para uma ajuda com um varios problemas comuns. Instalar tudo: shell> make install Voc e deve executar este comando como root. Crie as tabelas de permiss oes do MySQL (necess arias s o se voc e n ao tiver instalado o MySQL anteriormente): shell> scripts/mysql_install_db Note que as vers oes do MySQL anteriores ` a vers ao 3.22.10 iniciam o servidor MySQL quando voc e executa mysql_install_db. Isto n ao acontece mais! Altere o dono dos bin arios para root e do diret orio dados para o usu ario que ir 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 ario root, o segundo altera o atributo de propriedade do diret orio de dados para o usu ario mysql, e o terceiro altera o atributo de grupo para o grupo mysql. Se voc e deseja instalar suporte para a interface Perl DBI/DBD, veja Se c ao 2.7 [Perl support], P agina 165. Se voc e deseja que o MySQL inicie automaticamente quando voc e ligar sua m aquina, voc e pode copiar support-files/mysql.server para o local onde seu sistema tem seus
97
arquivos de incializa c ao. Mais informa c oes podem ser encontradas no pr oprio script support-files/mysql.server e em Se c ao 2.4.3 [Automatic start], P agina 118. Depois de tudo ter sido instalado, voc e deve iniciar e testar sua distribui c ao usando este comando: shell> /usr/local/mysql/bin/mysqld_safe --user=mysql & Se a sua vers ao do MySQL for mais antiga do que 4.0, substitua safe_mysqld por mysqld_ safe no comando: Se o comando falhar imediatamente com mysqld daemon ended ent ao voc e pode achar alguma informa c ao no arquivo diret orio-dados-mysql/nome_maquina.err. A raz ao pode ser que voc e j a possua outro servidor mysqld sendo executado. Veja Se c ao 4.2 [Multiple servers], P agina 220. Veja Se c ao 2.4 [Post-installation], P agina 111.
98
shell> ./configure --help Algumas das op c oes mais usadas normalmente com o configure est ao descritas a seguir: Para compilar apenas as bibliotecas clientes do MySQL e programas clientes e n ao o servidor, use a op c ao --without-server: shell> ./configure --without-server Se voc e n ao possui um compilador C++, mysql n ao ir a compilar (ele e o programa cliente que exige C++). Neste caso, voc e pode remover o c odigo no configure que testa pelo compilador C++ e executar ./configure com a op c ao --without-server. O passo da compia c ao continuar a tentaindo construir mysql, mas voc e pode ignorar as advert encias sobre mysql.cc. (Se o make parar, tente make -k para continuar com o resto da compila c ao mesmo se erros ocorrerem.) Se voc e quiser uma biblioteca embutida do MySQL (libmysqld.a) voc e deve usar a op c ao --with-embedded-server. Se voc e n ao deseja que seus arquivos de logs e diret orios de bancos de dados quem 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 orio instala c ao para que tudo seja instalado sobre /usr/local/mysql em vez do padr ao /usr/local. O segundo comando preserva o diret orio da instala c ao padr ao, mas altera a localiza c ao padr ao para diret orios de bancos de dados (normalmente /usr/local/var) e altera para /usr/local/mysql/data. Depois de ter compilado o MySQL, voc e pode alterar estas op c aoes com arquivos de op c oes. Veja Se c ao 4.1.2 [Option les], P agina 217. Se voc e estiver usando Unix e deseja que o arquivo socket do MySQL que em um diret orio diferente do padr ao (normalmente no diret orio /tmp ou /var/run) use 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 e tamb em pode, mais tarde, alterar a localiza c ao de mysql.sock usando os arquivos de op c oes do MySQL. Veja Se c ao A.4.5 [Problems with mysql.sock], P agina 925. Se voc e deseja compilar programas linkeditados estaticamente (por exemplo, para criar uma distribui c ao bin aria, obter mais velocidade, ou evitar problemas com algumas distribui c oes Red Hat Linux), execute configure desta forma: shell> ./configure --with-client-ldflags=-all-static \ --with-mysqld-ldflags=-all-static Se voc e estiver usando gcc e n ao tem libg++ ou libstdc++ instalados voc e pode dizer ao configure para usar o gcc como seu compilador C++: shell> CC=gcc CXX=gcc ./configure Quando voc e usar como seu compilador C++, ele n ao tentar a ligar com o libg++ ou libstdc++. Isto pode ser uma boa id eia para se fazer se voc e tiver as bibliotecas acimas instaladas, j a que algumas vers oes destas bibliotecas tem causado problemas estranhos para usu arios do MySQL no passado.
99
Segue algumas congura c oes de vari aveis de ambiente comuns, dependendo do compilador que voc e estiver usando: Compiler gcc 2.7.2.1 egcs 1.0.3a Recommended options CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors -fnoexceptions -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 e pode obter um bin ario MySQL razoavelmente otimizado usando as op c oes acima e adicionar as seguintes op c oes para a linha de congura c ao: --prefix=/usr/local/mysql --enable-assembler \ --with-mysqld-ldflags=-all-static A linha completa de congura c ao dever a ser, em outras palavras, algo como o seguinte para todas as vers oes recentes do gcc: 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 arios que fornecemos no site Web MySQL em http://www.mysql.com s ao todos compilados com otimiza c ao plena e deve ser perfeito para a maioria dos usu arios. Veja Se c ao 2.2.8 [Bin arios do MySQL], P agina 86. Existem algumas deni c oes de congura c ao que voc e pode alterar para criar um bin ario ainda mais r apido, mas isto e somente para usu arios avan cados. Veja Se c ao 5.5.3 [Compile and link options], P agina 457. Se a constru c ao falhar e produzir erros sobre seu compilador ou linkeditor n ao estarem aptos para criarem a biblioteca compartilhada libmysqlclient.so.r# (r# e um n umero de vers ao), voc e pode evitar este problema fornecendo a op c ao --disable-share para o configure. Neste caso, configure n ao construir a uma biblioteca libmysqlclient.so.* compartilhada. Voc e pode congurar o MySQL para n ao usar valores de campos DEFAULT para campos n ao-NULL (isto e, campos que n ao podem ser NULL). Veja Se c ao 1.8.5.2 [Restri c oes NOT NULL], P agina 53. shell> CXXFLAGS=-DDONT_USE_DEFAULT_FIELDS ./configure Por padr ao, o MySQL usa o conjunto de caracteres ISO-8859-1 (Latin1). Para alterar o conjunto padr ao, use a op c ao --with-charset: shell> ./configure --with-charset=CHARSET CHARSET pode ser um de big5, cp1251, cp1257, czech, danish, dec8, dos, euc_kr, gb2312, gbk, german1, hebrew, hp8, hungarian, koi8_ru, koi8_ukr, latin1, latin2, sjis, swe7, tis620, ujis, usa7, ou win1251ukr. Veja Se c ao 4.7.1 [Conjunto de caracteres], P agina 326.
100
Se voc e desja converter os caracteres entre o servidor e o cliente, voc e deve dar uma olhada no comando SET OPTION CHARACTER SET. Veja Se c ao 5.5.6 [SET OPTION], P agina 461. Cuidado: Se voc e alterar o conjunto de caracteres depois de ter criado qualquer tabela, voc e deve executar myisamchk -r -q --set-character--set=charset em cada tabela. Seus indices podem ser ordenados incorretamente. (Isto pode acontecer se voc e instalar o MySQL, criar algumas tabelas, depois recongurar o MySQL para usar um conjunto diferente de caracteres e reinstal a-lo). Com a op c ao --with-extra-charset=LISTA voc e pode denir qual conjunto de caracteres adicionais deve ser compilado no servidor. Aqui LISTA e uma lista de conjuntos de caracteres separados por espa cos, complex para incluir todos caracteres que n ao podem ser carregados dinamicamente ou all para incluir todos os conjuntos nos bin arios. Para congurar o MySQL com c odigo para depura c ao, use a op c ao --with-debug: shell> ./configure --with-debug Isto inclui uma aloca c ao segura de mem oria que pode encontrar alguns erros e fornecer saida sobre o que est a acontecendo. Veja Se c ao D.1 [Depurando o servidor], P agina 1070. Se seus programas clientes usam threads, voc e precisar a tamb em compilar uma vers ao thread-safe da biblioteca cliente do MySQL com as op c oes do congure --enablethread-safe-client. Isto ir a criar uma biblioteca libmysqlclient_r com o qual voc e dever a ligar suas aplica c oes que fazem uso de threads. Veja Se c ao 12.1.14 [Clientes em threads], P agina 859. Op c oes que perten cam a sistemas particulares podem ser encontrados na se c ao com detalhes espec icos de sistemas neste manual. Veja Se c ao 2.6 [Notas espec icas do Sistema Operacional], P agina 132.
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 arvore bin aria ser a congurada no subdiret orio mysql-3.23/, mysql-4.0/, mysql-4.1/, ou mysql-5.0/ do diret orio atual. Se voc e est a atr as de um rewall e s o pode iniciar conex oes HTTP, voc e tamb em pode o BitKeeper via HTTP. precisa usar um servidor proxy, simplesmente congure a vari Se vocE avel de ambiente 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 arvore fonte pode demorar um pouco, dependendo da velocidade de sua conex ao; seja paciente. 4. Voc e precisar a do GNU make, autoconf 2.53 (ou posterior), automake 1.5, libtool 1.4 e m4 para executar o pr oximo conjunto de comandos. Embora muitos sistemas operacionais j a venham com suas pr oprias implementa c oes do make, as chances de que a sua compila c ao falhe com mensagens de erros estranhas s ao altas. Consequentemente e altamente recomendado usar o GNU make (algumas vezes tamb em chamado gmake). Felizmente, um grande n umero de sistemas operacionais j a vem com a ferramente GNU pr e instalada ou s ao fornecidos pacotes de instala c ao da mesma. De qualquer forma, 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 e estiver tentando congurar o MySQL 4.1 voc e tamb em precisar a do bison 1.75. Vers oes mais antigas do bison podem exiobir este erro: sql_yacc.yy:#####: fatal error: maximum table size (32767) exceeded. Nota: o tamanho m aximo da tabela n ao e realmente excedido, o erro e causado por um bug nas vers oes mais novas do bison. Vers oes do MySQL anteriores a 4.1 podem tamb em compilar com outras implementa c oes yacc (e.g. BSD yacc 91.7.30). Para vers oes posteriores, GNU bison e uma exig encia. 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 c~ oes favoritas aqui
102
make Caso apare cam alguns erros estranhos durantes este est agio, conra se voc e realmente tem a libtool instalada! Uma cole c ao de nossos scripts de congura c ao padr oes est a localizada no subdiret orio BUILD/. Se preferir, voc e pode usar BUILD/compile-pentium-debug. Para compilar em uma arquitetura diferente, modique o script removendo op c oes que s ao espec icas da arquitetura Pentium. 5. Quando a constru c ao estiver pronta, execute make install. Seja cuidadoso com isto em uma m aquina de produ c ao; o comando pode sobrescrever sua vers ao atual instalada. Se voc e tem outra instala c ao do MySQL, n os recomendamos que voc e execute ./configure com valores diferentes para as op c oes prefix, tcp-port e unix-socketpath que as usadas pelo seu servidor em produ c ao. 6. Seja r igido com sua nova instala c ao e tente fazer com que os novos recursos falhem. Inicie executando make test. Veja Se c ao 14.1.2 [MySQL test suite], P agina 892. 7. Se voc e chegar ao est agio make e a distribui c ao n ao compilar, por favor relate-o para bugs@lists.mysql.com. Se voc e instalou as u ltimas vers oes das ferramentas GNU exigidas, e elas falharam tentando processar nossos arquivos de congura c ao, por favor informe isto tamb em. Entretanto, se voc e executar aclocal e obt em um erro de command not found n ao o reporte.Tenha certeza que todas as ferramentas necess arias estejam instaladas e que sua vari avel PATH esteja corretamente congurada para que sua shell possa encontr a-la. 8. Depois da opera c ao inicial bk clone para obter a arvore fonte, voc e deve executar bk pull periodicamente para obter as atualiza c oes. 9. Voc e pode examinar o hist orico de altera c oes para a arvore com todos os dis usando bk sccstool. Se voc e ver alguns dis estranhos ou c odigo sobre o qual voc e tenha alguma d uvida, n ao hesite em enviar um e-mail para lista de email internals do MySQL. Veja Se c ao 1.7.1.1 [Mailing-list], P agina 33. Al em disso, se voc e pensar que tem uma id eia melhor em como fazer algo, envie um email para o mesmo endere co com um patch. bk diffs ir a produzir um patch para voc e ap os fazer as altera c oes no c odigo fonte. Se voc e n ao tiver tempo para codicar sua id eia, apenas envie uma descri c ao. 10. BitKeeper tem um otimo utilit ario de ajudar que voc e pode acessar via bk helptool. 11. Note que qualquer commit (bk ci ou bk citool) ir a disparar o envio da mensagem com as altera c oes paa nossa lista de email internos, bem como a submiss ao openlogging.org usual apenas com os coment arios da altera c ao. Geralmente voc e n ao precisar usar commit (j a que o arvore p ublica n ao permitir a bk push), mas e prefer ivel usar o m etodo bk diffs descrito arteriormente. Voc e tamb em pode procurar altera c oes, coment arios e c odigo fonte online procurando por ex. http://mysql.bkbits.net:8080/mysql-4.1 para MySQL 4.1. O manual est a em uma arvore separad que pode ser clonada com: shell> bk clone bk://mysql.bkbits.net/mysqldoc mysqldoc Existe tamb em um arvore p ublica do BitKeeper para o MySQL Control Center e Connector/ODBC. Eles podem ser clonados da seguintes forma, respectivamente: Para clonar o MySQL Control center, use o seguinte comando:
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
104
com boas congura c oes de hardware e a op c ao --with-low-memory geralmente corrige isto. Por padr ao, configure escolhe c++ como o nome do compilador e GNU c++ liga com lg++. Se voc e estiver usando gcc, este comportamento pode causar problemas durante a compila c ao, como o seguinte: configure: error: installation or configuration problem: C++ compiler cannot create executables. Voc e podem tamb em ter problemas durante a compila c ao relacionados ` a g++, libg++ ou libstdc++. Uma causa destes problemas e que voc e pode n ao ter g++ ou voc e pode ter g++ mas n ao ter o libg++ ou o libstdc++. De uma olhada no arquivo config.log. Ele deve conter a raz ao exata do porque seu compilador C++ n ao funciona! Para trabalhar evitando estes problemas, voc e pode usar gcc como seu compilador C++. Tente congurar a vari avel de ambiente CXX para "gcc -O3". Por exemplo: shell> CXX="gcc -O3" ./configure Isto funciona porque gcc compila c odigo fonte C++ t ao bem quanto g++ faz, mas n ao ifaz a liga c ao em libg++ ou libstdc++ por padr ao. Outra forma de corrigir estes problemas, com certeza, e instalando g++, libg++ e libstdc++. No entanto gostariamos de lhe recomendar a n ao usar libg++ ou libstdc++ com o MySQL j a que isto ir a aumentar o tamanho do bin ario do mysqld sem lhe trazer nenhum benef icio. Algumas vers oes destas bibliotecas tamb em tem causado problemas estranhos para os usu arios MySQL no passado. Usar gcc como compilador C++ tamb em e exigido, se voc e quiser compilar o MySQL com a funcionalidade RAID (veja Se c ao 6.5.3 [CREATE TABLE], P agina 597 para mais informa c oes sobre tipos de tabela RAID) e voc e estiver usando o GNU gcc vers ao 3 e acima. Se voc e obter erros como estes abaixo durante o est agio de liga c ao quando voc e congurar o MySQL para compilar com a op c ao --with-raid, tente usar o gcc como o seu compilador C++ denindo a vari avel de ambiente CXX mencionada acima: 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 c ao falhar com erros, como um dos seguintes, voc e deve atualizar sua vers ao de make para GNU make: making all in mit-pthreads
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 ao conhecidos por terem alguns problemas com o make. O GNU make vers ao 3.75 ir a funcionar. Se voc e deseja denir algumas op c oes que devem ser usadas pelo seu compilador C ou C++, adicione as op c oes para as vari aveis de ambiente CFLAGS e CXXFLAGS. Voc e pode tamb em especicar os nomes do compilador a ser usado da mesma forma utilizando CC e CXX. Exemplo: shell> shell> shell> shell> shell> CC=gcc CFLAGS=-O3 CXX=gcc CXXFLAGS=-O3 export CC CFLAGS CXX CXXFLAGS
Olhe em Se c ao 2.2.8 [MySQL binaries], P agina 86 para uma lista de deni c ao de op c oes que tenham sido u teis em v arios sistemas. Se voc e recebeu uma mensagem de erro como esta, e necess ario atualizar o compilador 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 e obtem erros como estes vistos abaixo enquanto estiver compilando o mysqld, o configure n ao detectou corretamente o tipo do u ltimo argumento para accept(), getsockname() ou getpeername(): cxx: Error: mysqld.cc, line 645: In this statement, the referenced type of the pointer value "&length" is "unsigned long", which is not compatible with "int". new_sock = accept(sock, (struct sockaddr *)&cAddr, &length); Para corrigir isto, edite o arquivo config.h (que e gerado pelo configure). Procure por estas linhas: /* Define as the base type of the last arg to accept */ #define SOCKET_SIZE_TYPE XXX Altere XXX para size_t ou int, dependendo de seu sistema operacional. (Perceba que voc e dever a fazer isto cada vez que voc e executar configure, porque configure regenera config.h.) O arquivo sql_yacc.cc e gerado pelo sql_yacc.yy. Normalmente o processo de constru c ao n ao necessita criar sql_yacc.cc, porque o MySQL j a vem com uma c opia pr e-gerada. Entretanto, se voc e necessita recri a-lo voc e pode encontrar este erro: "sql_yacc.yy", line xxx fatal: default action causes potential... Isto e um ind icio de que sua vers ao do yacc e deciente. Provavelmente voc e precisar a instalar o bison (a vers ao GNU de yacc) e us a-lo no lugar do yacc.
106
Se voc e necessita depurar mysqld ou um cliente MySQL, execute configure com a op c ao --with-debug, ent ao recompile e ligue seus clientes com a nova biblioteca cliente. Veja Se c ao D.2 [Debugging client], P agina 1076. Se voc e tem um erro de compila c ao no Linux (ex. SuSE Linux 8.1 ou Red Hat Linux 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 ao, o script configure tenta determinar o n umero correto de argumentos usando o compilador GNU C++ g++. Ele testa os resultados errados permitidos, se o g++ n ao est a instalado. Existem dois modos de contornar este problema: Certique-se de que o GNU C++ g++ est a instalado. Em algumas distribui c oes Linux, o pacote exigido e chamado gpp, em outro ele e chamado gcc-c++. Use o gcc como o seu compilador C++ congurando a vari aavel de ambiente CXX para gcc: export CXX="gcc" Note que voc e precisa executar o configure novamente ap os isto.
107
Quando o MySQL e compilado usando MIT-pthreads, travas de sistema s ao desabilitadas por padr ao por raz oes de performance. Voc e pode dizer ao servidor para usar travas de sistema com a op c ao --external-locking. Isto s o e necess ario se voc e quiser executar dois servidores MySQL no mesmo diret orio de dados (no que n ao 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 e que todas conex oes ao servidor falham. Por exemplo: shell> mysqladmin version mysqladmin: connect to server at failed; error: Cant connect to mysql server on localhost (146) A solu c ao para isto e matar o servidor mysqld e reinici a-lo. Isto s o aconteceu conosco quando for camos uma queda do servidor e zemos uma reinicializa c ao imediata. Com MIT-pthreads, a chamada de sistema sleep() n ao e interromp ivel com SIGINT (break). Isto s o e percebido quando voc e executa mysqladmin --sleep. Voc e deve esperar pela chamada sleep() para terminar, antes da interru c ao ser servida e o processo parar. Na liga c ao, voc e pode receber mensagens de alerta como estes (pelo menos no Solaris); 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 em podem ser ignorados: implicit declaration of function int strtoll(...) implicit declaration of function int strtoul(...) N ao colocamos readline para funcionar com MIT-pthreads. (Isto n ao e necess ario, mas pode ser interessante para alguns.)
108
penho otimizado no Windows pela MySQL AB. Instru c oes para instalar uma distribui c ao bin aria est a dispon ivel em Se c ao 2.1.1 [Windows installation], P agina 60. Para construir o MySQL no Windows a partir do fonte, voc e precisa dos seguintes compiladores 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 e necess ario para a macro assembler. Mais detalhes em: http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp5/faq.aspx. Aproximadamente 45 MB de espa co em disco. 64 MB de RAM Voc e tamb em precisar a de um distribui c ao fonte para o Windows. Existem dois modos de conseguir uma distribui c ao fonte do MySQL vers ao 4.1 e acima: 1. Obtenha um pacote de uma distribui c ao fonte pela MySQL AB para a vers ao do MySQL que voc e est a particularmente interessado. Distribui c oes fontes empacotadas est ao dispon iveis para vers oes distribu idas do MySQ e podem ser obtidas em http://www.mysql.com/downloads/. 2. Voc e pode empacotar um distribui c ao fonte voc e mesmo a partir da ultima arvore fonte de desenvolvimento do BitKeeper. Se voc e planeja fazer isto, voc e deve criar o pacote em um sistema Unix e ent ao transfr i-lo para seu sistema Windows. (A raz ao para isto e que alguns dos passos de congura c ao e constru c ao exigem ferramentas que funcionam 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 e pode obter o BitKeeper em http://www.bitkeeper.com/. Se voc e estiver usando uma distribui c ao fonte do Windows, voc e pode ir diretamente para Se c ao 2.3.7.1 [Windows VC++ Build], P agina 108. Para contruir a partir da arvore do BitKeeper, v a para Se c ao 2.3.7.2 [Windows BitKeeper Build], P agina 110. Se voc e encontrar alguma coisa que n ao est a funcionando como esperado, ou tiver sugest oes sobre o mode de melhorar o processo de constru c ao atual no Windows, envie uma mensagem para a lista de email win32. Veja Se c ao 1.7.1.1 [Mailing-list], P agina 33.
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 c ao da depura c ao do servidor, bibliotecas e alguns aplicativos clientes. 9. Compile as vers oes distribu idas que voc e desejar, do mesmo modo. 10. Vers oes depuradas dos programas e bibliotecas s ao colocados nos diret orios client_debug e lib_debug. Vers oes liberadas dos programas e bibliotecas s ao colocados nos diret orios client_release e lib_release. Note que se voc e quiser construir tanto vers oes liberadas quanto depuradas voc e pode selecionar a op c ao build all do menu Build. 11. Teste o servidor. O servidor constru ido usando as instru c oes anteriores ir a esperar que o diret orio base e de dados do MySQL seja C:\mysql e C:\mysql\data por padr ao. Se voc e quiser testar o seu servidor usando o diret orio raiz de uma arvore fonte e seu diret orio de dados como o diret orio base e o diret orio de dados, voc e precisar a dizer ao servidor os seus caminhos. Voc e tamb em pode fazer into na linha de comando com as op c oes --basedir e --datadir, ou colocar op c oes apropriadas no arquivo de op c oes (o arquivo C:\my.cnf ou my.ini no diret orio do Windows). Se voc e tiver um diret orio de dados existente em qualquer lugar que voc e queira usar, voc e pode especic a-lo no se caminho. 12. Inicie o ser servidor a partir do diret orio client_release ou client_debug, dependendo de qual servidor voc e queira usar. O instru c oes gerais de inicializa ao do servidor est ao em Se c ao 2.1.1 [Windows installation], P agina 60. Voc e precisar a adaptar as instru c oes de forma apropriada se voc e quiser usar um diret orio base ou diret orio de dados diferente. 13. Quando o servidor est a em execu c ao de modo independente ou como um servi co daseado em sua congura c ao, tente se conectar a ele pelo utilit ario interativo mysql de linha de comando que existe em seu diret orio client_release ou client_debug. Quando voc e estiver certo de que os programas que voc e construiu est ao funcionando corretamente, pare o servidor. Ent ao instale o MySQL da seguinte forma: 1. Crie o diret orio para instalar os arquivos do MySQL. Por exemplo, para instalar dentro de C:\mysql), use estes comandos: C: mkdir \mysql mkdir \mysql\bin mkdir \mysql\data mkdir \mysql\share mkdir \mysql\scripts Se voc e quiser compilar outros clientes e lig a-los ao MySQL, voc e tamb em deve criar diversos diret orios adicionais: mkdir \mysql\include mkdir \mysql\lib mkdir \mysql\lib\debug mkdir \mysql\lib\opt Se voc e quiser fazer um benchamrk do MySQL, crie este diret orio:
110
mkdir \mysql\sql-bench Benchmark exigem suporte Perl. 2. Copie do diret orio workdir para o diret orio c:\mysql os seguintes diret orios: copy client_release\*.exe C:\mysql\bin copy client_debug\mysqld.exe C:\mysql\bin\mysqld-debug.exe xcopy scripts\*.* C:\mysql\scripts /E xcopy share\*.* C:\mysql\share /E Se voc e quiser compilar outros clientes e lig a-los ao MySQL, voc e tamb em deve fazer isto: copy copy copy copy copy copy copy copy lib_debug\mysqlclient.lib C:\mysql\lib\debug lib_debug\libmysql.* C:\mysql\lib\debug lib_debug\zlib.* C:\mysql\lib\debug lib_release\mysqlclient.lib C:\mysql\lib\opt lib_release\libmysql.* C:\mysql\lib\opt lib_release\zlib.* C:\mysql\lib\opt include\*.h C:\mysql\include libmysql\libmysql.def C:\mysql\include
Se voc e quiser fazer um benchmark do MySQL, voc e tamb em deve fazer isto: xcopy sql-bench\*.* C:\mysql\bench /E Congure e inicie o servidor da mesma forma que a distribui c ao bin aria do Windows. Veja Se c ao 2.1.1.3 [Windows prepare environment], P agina 62.
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 c ao 2.3.7.1 [Windows VC++ Build], P agina 108.
112
e provavelmente /usr/local/bin, a menos que voc e especique um diret orio de instala c ao diferente de /usr/local quando voc e executa configure. EXECDIR e a localiza c ao na qual o servidor mysqld est a instalado. Para uma distribui c ao bin aria, isto e o mesmo que BINDIR. Para uma distribui c ao fonte, EXECDIR e provavelmente /usr/local/libexec. Os testes s ao descritos em detalhes abaixo: 1. Se necess ario, inicie o servidor mysqld e congure as tabelas de concess oes iniciais contendo os privil egios que determinam como os usu arios est ao permitidos a conectar ao servidor. Isto e feito normalmente com o script mysql_install_db: shell> scripts/mysql_install_db Normalmente, mysql_install_db precisa ser executado somente na primeira vez que voc e instala o MySQL. Portanto, se voc e estiver atualizando uma instala c ao existente, voc e pode pular este passo. (entretanto, mysql_install_db e realmente seguro de usar e n ao ir a atualizar nenhuma tabela que j a exista, ent ao se voc e n ao tem certeza do que fazer, voc e pode sempre executar mysql_install_db.) mysql_install_db cria seis tabelas (user, db, host, tables_priv, columns_priv e func) no banco de dados mysql. Uma descri c ao dos privil egios iniciais e fornecido em Se c ao 4.4.4 [Default privileges], P agina 261. De forma resumidao, estes privil egios permitem que o usu ario root fa ca qualquer coisa no MySQL, e permitem a qualquer um a criar ou usar bancos de dados com o nome de test ou iniciando com test_ . Se voc e n ao congurar as tabelas de concess oes, o seguinte erro ir a aparecer no arquivo log quando voc e n ao iniciar o servidor: mysqld: Cant find file: host.frm O erro acima pode tamb em ocorrer com uma distribui c ao bin aria do MySQL se voc e n ao iniciar o MySQL executando o ./bin/mysqld_safe! Veja Se c ao 4.8.2 [mysqld_ safe], P agina 332. Voc e deve precisar executar mysql_install_db como root. Entretanto, se voc e preferir, pode executar o servidor MySQL como um usu ario (n ao-root) sem privil egios, desde que o usu ario possa ler e escrever arquivos no diret orio de banco de dados. Instru c oes para executar o MySQL como um usu ario sem privil egios e detalhado em Se c ao A.3.2 [Alterando usu arios MySQL], P agina 919 Se voc e tiver problemas com o mysql_install_db, veja Se c ao 2.4.1 [mysql_install_ db], P agina 115. Existem algumas alternativas para executar o script mysql_install_db como ele e fornecido na distribui c ao MySQL: Voc e pode querer editar o mysql_install_db antes de execut a-lo, para alterar os privil egios iniciais que s ao instalados nas tabelas de concess oes. Isto eu til se voc e deseja instalar o MySQL em v arias m aquinas com os mesmos privil egios. Neste caso, e prov avel que voc e s o precise adicionar algumas instru c oes INSERT extras para as tabelas mysql.user e mysql.db. Se voc e deseja alterar o conte udo da tabelas de concess oes depois de instal alas, voc e pode executar mysql_install_db, ent ao usar mysql -u root mysql para conectar ` as tabelas de concess oes como o usu ario root e usar instru c oes SQL para modic a-las diretamente.
113
poss E ivel recriar as tabelas de permiss oes completamente depois delas j a terem sido criadas. Voc e pode querer fazer isto se voc e j a instalou as tabelas mas deseja recri a-las depois das edi c oes mysql_install_db. Para maiores informa c oes sobre estas alternativas, veja Se c ao 4.4.4 [Default privileges], P agina 261. 2. Inicie o servidor MySQL assim: shell> cd diretorio_instalacao_mysql shell> bin/mysqld_safe & Se a sua vers ao do MySQL for mais antiga do que 4.0, substitua bin/safe_mysqld por bin/mysqld_safe no comando: Se voc e tiver problemas iniciando o servidor, veja Se c ao 2.4.2 [Starting server], P agina 116. 3. Use mysqladmin para vericar se o servidor est a em execu c ao. Os seguintes comandos fornecem um teste simples para conferir se o servidor est a em funcionamento e respondendo ` as conex oes: shell> BINDIR/mysqladmin version shell> BINDIR/mysqladmin variables A sa ida de mysqladmin version varia muito pouco dependendo de sua plataforma e vers ao do MySQL, mas deve ser similar a esta mostrada abaixo: shell> BINDIR/mysqladmin version mysqladmin Ver 8.14 Distrib 3.23.32, for linux on i586 Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license. Server version Protocol version Connection TCP port UNIX socket Uptime: 3.23.32-debug 10 Localhost via Unix socket 3306 /tmp/mysql.sock 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 eia do que voc e pode fazer com BINDIR/mysqladmin, invoque-o com a op c ao --help. 4. Verique se voc e pode desligar o servidor: shell> BINDIR/mysqladmin -u root shutdown 5. Verique que voc e possa reiniciar o servidor. chamado o mysqld diretamente. Por exemplo: shell> BINDIR/mysqld_safe --log & Fa ca isto usando mysqld_safe ou
114
Se o mysqld_safe falhar, tente execut a-lo do diret orio de instala c ao do MySQL (se voc e j a n ao estiver l a). Se n ao funcionar, veja Se c ao 2.4.2 [Starting server], P agina 116. 6. Execute alguns testes b asicos para vericar se o servidor est a funcionando. A sa 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 em existe uma suite de benchmark no diret orio sql-bench (sob o diret orio de instala c ao do MySQL) que voc e pode usar para comparar como o MySQL se comporta em diferentes plataformas. O diret orio sql-bench/Results cont em os resultados de v arias execu c oes em diferentes bancos de dados e plataformas. Os seguintes m odulos Perl adicionais s ao necess arios para executar o pacote de benchamrk: DBI DBD-mysql Data-Dumper Data-ShowTable Estes m odulos podem ser obtidos em CPAN http://www.cpan.org/. Veja Se c ao 2.7.1 [Instala c ao Perl], P agina 165. O diret orio sql-bench/Results cont em os resultados de v arias execu c oes em diferentes bancos de dados e plataformas. Para executar todos testes, execute estes comandos:
115
shell> cd sql-bench shell> run-all-tests Se voc e n ao possui o diret orio sql-bench, voc e provavelmente est a usando uma distribui c ao bin aria RPM. (Distribui c oes fontes RPMs incluem o diret orio com os benchmarks.) Neste caso, voc e deve primeiramente instalar a suite de benchmark antes de poder us a-lo. A partir da vers ao 3.22 do MySQL, come caram a existir arquivos RPMs de benchmark chamados mysql-bench-VERSION-i386.rpm que cont em c odigo ie dados de benchmark. Se voc e tem uma distribui c ao fonte, voc e tamb em pode executar os testes no subdiret orio tests. Por exemplo, para executar auto_increment.tst, fa ca isto: shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst Os resultados esperados s ao mostrados no arquivo ./tests/auto_imcrement.res.
116
mesmo tempo). Geralmente o problema que ocorre quando voc e tenta executar o segundo servidor e que ele tenta usar o mesmo socket e porta que o outro. Neste caso voc e ir a obter a mensagem de erro: Cant start server: Bind on TCP/IP port: Address already in use ou Cant start server: Bind on unix socket.... Veja Se c ao 4.2 [M ultiplos servidores], P agina 220. Voc e n ao tem direito de escrita no diret orio /tmp Se voc e n ao tem direito de escrita para criar um arquivo socket no local padr ao (em /tmp) ou permiss ao para criar arquivos tempor aris em /tmp, voc e ir a obter um erro quando executar mysql_install_db ou quando iniciar ou usar mysqld. Voc e pode especicar socket e diret orio tempor ario diferentes, como segue: shell> TMPDIR=/algum_dir_tmp/ shell> MYSQL_UNIX_PORT=/algum_dir_tmp/mysqld.sock shell> export TMPDIR MYSQL_UNIX_PORT Veja Se c ao A.4.5 [Problems with mysql.sock], P agina 925. algum_dir_tmp deve ser o caminho para o mesmo diret orio no qual voc e tem permiss ao de escrita. Veja Ap endice E [Environment variables], P agina 1083. Depois disto voc e deve estar apto para executar mysql_install_db e iniciar o servidor com estes comandos: shell> scripts/mysql_install_db shell> BINDIR/mysqld_safe & mysqld falha imediatamente Se voc e estiver executando RedHat Vers ao 5.0 com uma vers ao de glibc anterior a 2.0.7-5 voc e deve ter certeza que voc e instalou todos os patches para a glibc! Existe muita informa c ao sobre isto nos arquivos das listas de mensagens do MySQL. Links para os arquivos de correio est ao dispon iveis online em http://lists.mysql.com/. Veja tamb em Se c ao 2.6.2 [Linux], P agina 137. Voc e pode tamb em iniciar o mysqld manualmente usando a op c ao --skipgrant-tables e adicionar a informa c ao de privil egios usando o mysql: 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 os dizer ao servidor para recarregar as tabelas de permiss oes.
117
Invocando mysqld_safe, que tenta determinar as op c oes apropriadas para mysqld e ent ao execut a-lo com estas op c oes. Veja Se c ao 4.8.2 [mysqld_safe], P agina 332. Para o Windows NT/2000/XP, veja Se c ao 2.1.1.7 [NT start], P agina 66. Invocando o mysqld diretamente. neste Quando o daemon mysqld inicia, ele altera o diret orio para o diret orio de dados. E diret orio que ele espera gravar arquivos de log e o arquivo pid (com o ID do processo) e onde ele espera encontrar os bancos de dados. A localiza c ao do diret orio de dados e especicada quando a distribui c ao e compilada. Entretanto, se o mysqld espera encontrar o diret orio de dados em lugar diferente de onde ele realmente est a no seu sistema, ele n ao funcionar a corretamente. Se voc e tiver problemas com caminhos incorretos voc e pode encontrar quais op c oes o mysqld permite e quais s ao as congura c oes do caminho padr ao chamando o mysqld com a op c ao --help. Voc e pode sobrescrever os padr oes especicando os caminhos corretos como argumentos de linha de comando ao mysqld. (Estas op c oes tamb em podem ser usadas com o mysqld_safe). Normalmente voc e precisaria indicar ao mysqld somente o diret orio base sob o qual o MySQL e instalado. Voc e pode fazer isso usando a op c ao --basedir. Voc e pode tamb em usar --help para conferir o efeito das ope c oes para se alterar o caminho (perceba que --help deve ser a op c ao nal do comando mysqld. Por exemplo: shell> EXECDIR/mysqld --basedir=/usr/local --help Uma vez que voc e determina as congura c oes de caminho que voc e deseja, inicie o servidor sem a op c ao --help. Qualquer que tenha sido o m etodo utilizado para iniciar o servidor, se houver falha na inicializa c ao, conra o arquivo de log para ver se voc e pode entender o porqu e. Arquivos log est ao localizados no diret orio dados (normalmente /usr/local/mysql/data para uma distribui c ao bin aria, /usr/local/var para uma distribui c ao fonte, \mysql\data\mysql.err no Windows.) Procure no diret orio de dados por arquivos com nomes no formato nome_maquina.err e nome_maquina.log onde nome_maquina e o nome do servidor. Ent ao conra as u ltimas linhas destes arquivos: shell> tail nome_maquina.err shell> tail nome_maquina.log Se voc e encontrar algo como o seguinte no arquivo log: 000729 14:50:10 000729 14:50:10 000729 14:50:10 bdb: Recovery function for LSN 1 27595 failed bdb: warning: ./test/t1.db: No such file or directory Cant init databases
Signica que voc e n ao inicializou o mysqld com --bdb-no-recover e o Berkeley DB encontrou algo errado com seus arquivos log quando ele tentou recuperar seus bancos de dados. Para poder continuar, voc e deve mover o antigo arquivo log Berkeley DB do diret orio do banco de dados para outro lugar, onde poder a examin a-los posteriormente. Os arquivos log s ao nomeados log.0000000001, onde o n umero ir a incrementar com o tempo. Se voc e estiver executando o mysqld com suporte a tabelas BDB e o mysqld falhar no in icio, pode ser devido a alguns problemas com o arquivo de recupera c ao BDB. Neste caso voc e pode tentar iniciar o mysqld com --bdb-no-recover. Se isto ajudar, ent ao voc e pode remover todos os arquivos log.* do diret orio de dados e tentar iniciar o mysqld novamente.
118
Se voc e obter o seguinte erro, signica que algum outro programa (ou outro servidor mysqld) j a est a usando a porta TCP/IP ou socket mysqld est a tentando usar: Cant start server: Bind on TCP/IP port: Address already in use ou Cant start server: Bind on unix socket... Use ps para ter certeza que voc e n ao tem outro servidor mysqld em execu c ao. Se voc e n ao consegue encontrar outro servidor, voc e pode tentar executar o comando telnet sua_ maquina numero_porta_tcp-ip e apertar ENTER v arias vezes. Se voc e n ao obter uma mensagem como telnet: Unable to connect to remote host: Connection refused, algo est a usando a mesma porta TCP/IP que o mysqld est a tentando usar. Veja Se c ao 2.4.1 agina 115 e Se c ao 4.2 [Multiple servers], P agina 220. [mysql install db], P Se o mysqld est a atualmente em execu c ao, voc e pode vericar as congura c oes que ele est a usando executando este comando: shell> mysqladmin variables ou shell> mysqladmin -h your-host-name variables Se voc e obter o Errcode 13, que signica Permission denied, ao iniciar o mysqld isto signica que voc e n ao pode ter o direito de leitura/cria c ao de arquivos no diret orio do banco de dados ou log. Neste caso voc e tamb em deve iniciar o mysqld como usu ario root ou alterar a permiss ao para os arquivos e diret orios envolvidos para uqe voc e tenha o direito de us a-los. Se o mysqld_safe inicia o servidor mas voc e n ao consegue se conectar a ele, tenha certeza que voc e tem uma entrada no arquivo /etc/hosts que parece com isto: 127.0.0.1 localhost Este problema s o ocorre em sistemas que n ao possuem uma biblioteca thread funcional e para o qual o MySQL deve estar congurado para usar MIT-pthreads. Se voc e n ao consegue iniciar o mysqld voc e pode tentar criar um arquivo para rastreamento de erros (trace) para encontrar o problema. Veja Se c ao D.1.2 [Making trace les], P agina 1071. Se voc e estiver utilizando tabelas InnoDB, procure pelas op c oes especicas de inicializa c ao do InnoDB. Veja Se c ao 7.5.3 [InnoDB start], P agina 643. Se voc e estiver usando tabelas BDB (Berkeley DB), voc e deve se familiarizar com as diferentes op c oes especicas de inicializa c ao do BDB. Se c ao 7.6.3 [BDB start], P agina 696.
119
mysql.server pode ser encontrado no diret orio share/mysql sob o diret orio de instala c ao do MySQL ou no diret orio support-files da arvore fonte do MySQL. Note que se voc e usa o pacote RPM do Linux (MySQL-server-VERS~ AO.rpm), o script mysql.server j a estar a instalada como /etc/init.d/mysql - voc e n ao precisa instal alo manualmente. Veja Se c ao 2.1.2 [Linux-RPM], P agina 69 para mais informa c oes sobre pacotes RPM Linux. No Mac OS X, voc e pode instalar um pacote do MySQL Startup Item separado para habilitar a inicializa c ao autom atica do MySQL no boot so sistema. Veja Se c ao 2.1.3 [Mac OS X installation], P agina 71 para maiores detalhes. Antes do mysql.server iniciar o servidor, ele vai para o diret orio de instala c ao do MySQL, e ent ao chama o mysqld_safe. Voc e pode precisar editar o mysql.server se tiver uma distribui c ao bin aria instalada em um local n ao-padr ao. Modique-o para chamar o diret orio (cd) apropriado antes de executar o safe_mysql. Se voc e deseja que o servidor seja executado com um usu ario espec ico, adicione uma linha user apropriada para o arquivo /etc/my.cnf, como ser a visto posteriormente nesta se c ao. mysql.server stop desliga o servidor MySQL enviando um sinal para ele. Voc e pode desligar o servidor manualmente executando mysqladmin shutdown. Voc e precisa adicionar estes comandos start e stop nos lugares apropriados de seus arquivos /etc/rc.* quando voc e quiser iniciar o MySQL automaticamente no seu servidor. On most current Linux distributions, it is sucient to copy the le 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 c ao normalmente deve ir no diret orio /usr/local/etc/rc.d/. A p agina do manual rc(8) tamb em diz que os scripts neste diret orio s o s ao executados, se o seu nome de base corresponder padr ao global da sheel *.sh. Qualquer outro arquivo ou diret orio presente dentro do diret orio s ao silenciosamente ignorados. Em outra palavras, no FreeBSD voc e deve instalar o arquivo mysql.server como /usr/local/etc/rc.d/mysql.server.sh para habilitar a inicializa c ao autom atica. Como uma alternativa para o exposto acima, alguns sistemas operacionais tamb em usam /etc/rc.local ou /etc/init.d/boot.local para inicializar servi cos adicionais durante o boot. Para iniciar o MySQL usando este m etodo, voc e poderia poderia adicionar algo como o seguinte a ele: /bin/sh -c cd /usr/local/mysql; ./bin/mysqld_safe --user=mysql & Voc e tamb em pode adicionar op c oes para mysql.server em um arquivo global /etc/my.cnf. Um t ipico arquivo /etc/my.cnf pode parecer com isto: [mysqld] datadir=/usr/local/mysql/var socket=/var/tmp/mysql.sock port=3306 user=mysql [mysql.server]
120
basedir=/usr/local/mysql O script mysql.server entende as seguintes op c oes: datadir, basedir e pid-file. A seguinte tabela mostra quais grupos de op c oes cada script de inicializa c ao l e dos arquivos de op c oes: Script Grupos de op c oes 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 oes anteriores, o mysql.server tamb em l e o grupo [mysql_ server] e mysqld_safe tamb em l e o grupo [safe_mysqld]. No entanto, voc e deve atualizar os seus arquivos de op c oes para usar os grupos [mysql.server] e [mysqld_safe]. Veja Se c ao 4.1.2 [Arquivos de Op c oes], P agina 217.
121
Alguns dos comportamentos do MySQL 4.1 no 4.0 podem ser testados antes de realizar uma atualiza c ao completa para a vers ao 4.1, adicionamos ` as u ltimas distribui c oes do MySQL 4.0 (a paritr da 4.0.12) a op c ao de inicializa c ao --new para o mysqld. Esta op c ao lhe d a o comportamento da vers ao 4.1 para as altera c oes mais cr iticas. Voc e tamb em pode habilitar estes comportamentos para a conex ao de uma determinado cliente com o comando SET @@new=1, ou desabilit a-lo se ele for iniciado com SET @@new=0. Se voc e acredita que algumas das altera c oes da vers ao 4.1 o afetar ao, recomendamos que antes de atualizar para a vers ao 4.1, voc e fa ca o download da u ltima distribui c ao do MySQL 4.0 e o execute com a op c ao --new adicionando o seguinte ao seu arquivo de congura c ao: [mysqld-4.0] new Deste modo voc e pode testar o novo comportamento com seus aplicativos na vers ao 4.0 para certicar-se que eles funcionam. Isto o ajudar a a ter uma transi c ao suave quando realizar uma atualiza c ao completa do MySQL 4.1. Fazendo isto do modo acima ir a assegurar que voc e n ao execute acidentalemte a vers ao 4.1 com a op c ao --new mais tarde. A seguinte lista descreve altera c oes que podem afetar aplica c oes e que voc e deve observar ao atualizar para a vers ao 4.1: TIMESTAMP agora e retornado como uma string com o formato YYYY-MM-DD HH:MM:SS. (A op c ao --new pode ser usada a partir da vers ao 4.0.12 para fazer um servidor 4.0 se comportar como 4.1 a este respeito.) Se voc e quiser t e-lo com um n umero (como a Vers ao 4.0 faz) deve-se adicionar +0 a coluna TIMESTAMP a eles: mysql> SELECT ts_col + 0 FROM tbl_name; Tamanhos de display para TIMESTAMP n ao s ao mais suportados. Por exemplo, se voc e declarar um coluna como TIMESTAMP(10), o (10) e ignorado. Esta mudan ca era necess aria para compatibilidade com os padr oes SQL. Em uma vers ao futura. Em uma vers ao futura, uma altera c ao adicional ser a feita (compat ivel com vers oes anteriores com esta muda ca), permitindo que o tamanho do timestamp indique o n umero desejado de d igitos de fra c oes de um segundo. Valores bin arios (0xFFDF) agora s ao assumidos como strings em vez de n umeros. Isto corrige o problema com conjunto de caracteres onde e conveniente colocar a string como um valor bin ario. Com esta altera c ao voc e deve usar CAST() se voc e quiser comparar valores bin arios numericamente como inteiros: SELECT CAST(0XFEFF AS UNSIGNED INTEGER) < CAST(0XFF AS UNSIGNED INTEGER) Se voc e n ao usa CAST(), uma compara c ao lexicogr aca da string ser a feita: mysql> SELECT 0xFEFF < 0xFF; -> 1 Usando itens bin arios em um contexto num erico ou comparando-os usando o operador = deve funcionar como antes. (A op c ao --new pode ser usado para fazer o servidor 4.0 se comportar como 4.1 a partir da vers ao 4.0.13.) Para fun c oes que produzem um valor DATE, DATETIME, ou TIME, o resultado retornado para o cliente agora est a corrigido para ter um tipo temporal. Por exemplo, no MySQL 4.1, voc e tem este resultado: mysql> SELECT CAST("2001-1-1" as DATETIME);
122
-> 2001-01-01 00:00:00 No MySQL 4.0, o resultado e diferente: mysql> SELECT CAST("2001-1-1" as DATETIME); -> 2001-01-01 Valores DEFAULT n ao podem mais ser especicado para colunas AUTO_INCREMENT (Na vers ao 4.0, um valor DEFAULT e ignorado sem aviso, na 4.1 ocorre um erro). SERIALIZE n ao e mais uma op c ao v alida para sql_mode. Deve-se usar SET TRANSACTION ISOLATION LEVEL SERIALIZABLE. SERIALIZE tamb em n ao e mais v alido para a op c ao --sql-mode do mysqld. Use --transaction-isolation=SERIALIZABLE Todas tabelas e colunas strings agora t em um conjunto de caracter. Veja Cap ptexi tulo 9 [Charset], P agina 707. A informa c ao do conjunto de caracteres e mostrada por SHOW CREATE TABLE e mysqldump. (O MySQL vers ao 4.0.6 e acima pode ler o novo arquivo dump; vers oes mais antigas n ao podem.) O formato de deni c ao de tabela usado nos arquivos .frm mudaram um pouco na vers ao 4.1. O MySQL 4.0.11 e adiante le em o novo formato .frm diretamente, mas vers oes mais antigas n ao podem. Se voc e precisa mover tabelas da vers ao 4.1. para uma mais nova que a 4.0.11, voc e de usar mysqldump. Veja Se c ao 4.9.7 [mysqldump], P agina 362. Se voc e estiver executando v arios servidores na mesma m aquina Windows, voc e deve usar uma op c ao --shared_memory_base_name diferentes para cada m aquina A interface para agrupar fun c oes UDF alterou um pouco. Voc e deve agora declarar uma fun c ao xxx_clear() para cada fun c ao de agrupamento.
Em geral, atualizar para o MySQL 4.1 a partir de uma vers ao mais nova do MySQL envolve os serguintes passos: Verique na se c ao de altera c oes se houve alguma mudan ca que pode afetar a sua aplica c ao. Leia os novos itens da vers ao 4.1 para ver quais itens interessantes que voc e pode usar na vers ao 4.1. Veja Se c ao C.2 [Novidades na vers ao 4.1.x], P agina 948. Se voc e estiver executando o MySQL Server no Windows, veja tamb em Se c ao 2.5.8 [Windows upgrading], P agina 132. Ap os o upgrade, atualize a tabela de permiss oes para gerar uma nova coluna Password maior que e necess aria para tratamento seguro de senhas. O procedimento usa mysql_ fix_privilege_tables e est a descrito em Se c ao 2.5.6 [Upgrading-grant-tables], P agina 130. Estrat egias alternativas para tratamento de senhas depois de uma atualiza c ao est ao descritos posteriormente nesta se c ao. O mecanismo de hashing da senha foi alterado na vers ao 4.1 para fornecer maior seguran ca, mas ele pode causar problemas de compatibilidade se voc e ainda tiver clientes que usam a bastante indesej biblioteca cliente 4.0 ou anterior. (E avel que voc e tenha clientes 4.0 em situa c oes onde o cliente conecta de uma m aquina remota que ainda n ao tenha sido atualizada para a vers ao 4.1). A seguinte lista indica algumas estrat egias poss iveis de atualiza c ao. Elas representam o que se deve fazer para escolher se ter compatibilidade com clientes antigos e ter maior seguran ca. N ao atualizar para a vers ao 4.1. Nenhum comportamento ser a alterado, mas e claro que voc e n ao poder a usar qualquer um dos novos recursos fornecido pelo protocolo
123
cliente/servidor da vers ao 4.1. (O MySQL 4.1 tem um protocolo cliente/servidor extendido que oferece tais recursos como instru c oes preparadas e conjuntos de m ultiplos resultados.) Veja Se c ao 12.1.4 [C API Prepared statements], P agina 824. Atualizar para a vers ao 4.1 e executar o script mysql_fix_privilege_tables para aumentar a coluna Password na tabela user e assim poder guardar hashes de senhas longos. Mas execute o servidor com a op c ao --old-passwords para fornecer compatibilidade com vers oes anteriores que premitem que clientes pre-4.1 continuem a conectar em suas contas de hash curto. Eventualmente, quando todos os seus clientes estiverem atualizados para a vers ao 4.1, voc e pode parar de usar a op c ao do servidor --oldpasswords. Voc e tamb em pode alterar as senhas em sua conta MySQL para usar o novo formato que e mais seguro. Atualizar para vers ao 4.1 e executar o script mysql_fix_privilege_tables para aumentar a coluna Password na tabela user. Se voc e sabe que todos os clientes tamb em foram atualizados para a vers ao 4.1, n ao execute o servidor com a op c ao --oldpasswords. Em vez disso, altere a senha em todas as contas existentes para que elas tenham o novo formato. Uma instala c ao pura da vers ao 4.1 e o mais seguro. Informa c oes adicionais sobre hashing de senha em rela c ao a autentica c ao no cliente e opera c oes de altera c ao de senha podem ser encontrados em Se c ao 4.3.11 [Password hashing], P agina 246.
124
O MySQL 4.0 funcionar a mesmo se voc e n ao zer o acima, mas voc e n ao poder a usar os novos privil egios de seguran ca pois o MySQL 4.0 e voc e podem encontrar problemas ao atualizar o MySQL para a vers ao 4.1 ou mais nova. O formato do arquivo ISAM ainda funciona no MySQL 4.0 mas est a obsoleto e ser a disabilitado (n ao compilado por padr ao) no MySQL 4.1. Em vez disso deve se usar tabelas MyISAM. Clientes antigos devem funcionar com um servidor vers ao 4.0 sem nenhum problema. Mesmo se voc e zer o indicado acima, voc e ainda pode voltar para o MySQL 3.23.52 ou mais novo se voc e encontrar problemas com o MySQL da s erie 4.0. Neste caso voc e deve 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 a uma lista mais completa com o que deve ser observado para atualizar para a vers ao 4.0; O MySQL 4.0 tem v arios novos privil egios na tabela mysql.user. Veja Se c ao 4.4.1 [GRANT], P agina 255. Para fazer estes novos privil egios funcionarem, deve se atualizar a tabela de permiss oes. O procedimento est a descrito em Se c ao 2.5.6 [Upgrading-grant-tables], P agina 130. At e que este script esteja executando todos os usu arios t em os privil egios SHOW DATABASES, CREATE TEMPORARY TABLES e LOCK TABLES. Os privil egios SUPER e EXECUTE tiram o seu valor de PROCESS. REPLICATION SLAVE e REPLICATION CLIENT tiram o seu valor de FILE. Se voc e tiver qualquer script que crie novos usu arios, voc e pode querer alter a-los para usar os novos privil egios. Se voc e n ao est a usando o comando GRANT nos scripts, este e um bom momento para alterar os seus scripts e usar GRANT em vez de modicar a tabela de permiss oes diretamente. A partir da vers ao 4.0.2 a op c ao --safe-show-database est a obsoleta (e n ao faz mais nada). Veja Se c ao 4.3.3 [Op c oes de privil egio], P agina 231. Se voc e receber um erro Access denied para novos usu arios na vers ao 4.0.2, voc e deve vericar se voc e precisa de alguma das novas concess oes que voc e n ao precisava antes. Em particular, voc e precisar a REPLICATION SLAVE (em vez de FILE) para novos slaves. safe_mysqld e renomeado para mysqld_safe. Para compatibilidade com vers oes anteriores, as distribui c oes bin arias, ir ao, por algum tempo, incluir safe_mysqld como um link simb olico para mysqld_safe. Suporte para InnoDB agora est a inclu ido na distribui c ao bin aria. Se voc e contruir o MySQL a partir de um fonte, o InnoDB est a congurado por padr ao, Se voc e n ao usar o InnoDB e quiser economizar mem oria ao executar o servidor que possui suorte a InnoDB habilitado, use a op c ao de inicializa c ao do servidor. Para compilar o MySQL sem suporte ao InnoDB, execute configure com a op c ao --without-innodb. O par ametro de inicializa c ao myisam_max_extra_sort_file_size e myisam_max_ extra_sort_file_size s ao dados agora em bytes. (eram dados em megabytes antes da vers ao 4.0.3). O lock de sistema externo dos arquivos MyISAM/ISAM agora est a desligado por padr ao. Pode se lig a-los fazendo --external-locking. (Para a maioria dos usu arios isto nunca e necess ario).
125
A seguintes vari aveis/op c oes de inicializa cao foram renomeadas: 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 c oes de inicializa c ao record_buffer, sort_buffer e warnings ainda funcionar ao no MySQL 4.0 mas est ap obsoletas. As seguintes veri aveis SQL mudaram o nome. 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 ao obsoletos. Voc e deve usar SET GLOBAL SQL_SLAVE_SKIP_COUNTER=# em vez de SET SQL_SLAVE_ SKIP_COUNTER=#. As op c oes de inicializa c ao --skip-locking e --enable-locking foram renomeadas para --skip-external-locking e --external-locking. SHOW MASTER STATUS agora retorna um conjunto vazio se o log bin ario n ao estiver habilitado. SHOW SLAVE STATUS agora retorna um conjunto vazio se o slave n ao est a inicializado. O mysqld agora tem a op c ao --temp-pool habilitada por padr ao j a que isto da melhor rendimento com alguns SO (Principalmente no Linux). Colunas DOUBLE e FLOAT agora respeitam o par ametro UNSIGNED no armazenamento (antes, UNSIGNED era ignortado por estas colunas). ORDER BY coluna DESC ordena valores NULL por u ltimo, como no MySQL 4.0.11. Na vers ao 3.23 e anteriores da vers ao 4.0, isto nem sempre era consistente. SHOW INDEX tem duas colunas a mais (Null e Index_type) que ele tinha nas vers oes 3.23. CHECK, SIGNED, LOCALTIME e LOCALTIMESTAMP s ao agora palavras reservadas. O resultado de todos os operadores bitwise (|, &, <<, >> e ~) agora s ao unsigned. Isto pode causar problemas se voc e estiver usando-as em um contexto onde voc e quer um resultado com sinal. Veja Se c ao 6.3.5 [Fun c oes de Convers ao], P agina 543. Nota: quando voc e usa subtra c ao entre valores inteiros onde um deles e do tipo UNSIGNED, o resultado ser a sem sinal. Em oyras palavras, antes de atualizar para o MySQL 4.0, voc e deve vericar sua aplica c ao para os casos onde voc e est a subtraindo um valor de uma entidade sem sinal e quer um n umero negativo como resposta ou subtraindo um valor sem sinal de uma coluna do tipo inteiro. Voc e pode disabilitar este comportamento usando a op c ao --sql-mode=NO_UNSIGNED_SUBTRACTION ao iniciar o mysqld. Veja Se c ao 6.3.5 [Fun c oes de convers ao], P agina 543.
126
Para usar MATCH ... AGAINST (... IN BOOLEAN MODE) com suas tabelas, voc e precisa recontru i-las com REPAIR TABLE nome_tabela USE_FRM. LOCATE() e INSTR() s ao caso sensitivo se um dos argumentos e uma string bin aria. De outra forma elas s ao caso-insensitivo. STRCMP() agora usa o conjunto de caracteres atual ao fazer compara c oes, o que signica que o comportamento padr ao das compara c oes agora e caso-insensitivo. HEX(string) agora retorna os caracteres na string convertidos para hexadecimal. Se voc e quiser converter um n umero para hexadecimal, voc e deve se assugurar que voc e chama HEX() com um argumento num erico. Na vers ao 3.23, INSERT INTO ... SELECT sempre tem o IGNORE habilitado. Na vers ao 4.0.1, o MySQL ir a parar (e possivelmente fazer um roll back) por padr ao no caso de mysqld_safe ser renomeado para mysqld_safe. Por algum tempo incluiremos em nossa distribui c ao bin aria o mysqld_safe como um link simb olico para mysqld_safe. um erro se voc e n ao especicar IGNORE. As fun c oes antigas da API C mysql_drop_db(), mysql_create_db() e mysql_ connect() n ao s a mais suportadas a menos que voc e compile o MySQL com CFLAGS=-DUSE_OLD_FUNCTIONS. No entanto, e preferivel 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 ao deve causar problemas, exceto que eles podem gerar mensagens de avisos quando quando usado como argumento em uma classe printf() de fun c oes. Voc e deve usar TRUNCATE TABLE quando quiser deletar todos os registros de uma tabela e voc e n ao precisa obter uma contagen de quantas colunas forma deletadas. (DELETE FROM table_name retorna a contagem de linhas na vers ao 4.0, e TRUNCATE TABLE e mais r apido.) Voc e receber a um erro se tiver um LOCK TABLES ativo ou transa c oes ao tentar executar TRUNCATE TABLE ou DROP DATABASE. Voc e deve usar inteiros para armazenar valores em colunas BIGINT (em vez de usar strings, como voc e fez no MySQL 3.23). Usar strings ainda funicona, mas usar inteiros e mais eciente. O formato de SHOW OPEN TABLE alterou. Clientes multi-thread devem usar mysql_thread_init() e mysql_thread_end(). Veja Se c ao 12.1.14 [Clientes em threads], P agina 859. Se voc e quiser recompilar o m odulo Perl DBD::mysql, voc e deve conseguir o DBD-mysql vers ao 1.2218 ou mais novo porque os m odulos DBD mais antigos usam a chamada obsoleta mysql_drop_db(). A vers ao 2.1022 ou mais nova e recomendada. Na vers ao RAND(seed) retorna uma s erie de n umero rand omicas diferente que na 3.23; isto foi feito para uma diferencia c ao maior de RAND(seed) e RAND(seed+1). O tipo padr ao retornado por IFNULL(A,B) agora est a congurado para ser o mais geral dos tipos de A e B. (A ordem geral-para-especifco e string, REAL ou INTEGER). Se voc e estiver executando o MySQL Server no Windows, veja Se c ao 2.5.8 [Atualizando o Windows], P agina 132. Se voc e estiver usando replica c ao, veja Se c ao 4.11.2 [Replication Implementation], P agina 380.
127
128
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 c ao de caracteres que o operador =. Se voc e precisa do antigo compartamento, voc e pdoe compilar o MySQL com a op c ao CXXFLGAS=-DLIKE_CMP_TOUPPER. REGEXP agora e caso insensitivo se nenhuma das strings forem bin arias. Quando for necess ario dar manuten c ao ou reparar tabelas MyISAM .MYI deve ser usado a instru c ao CHECK TABLE ou o comando myisamchk. Para tabelas ISAM (.ISM), use o comando isamchk Se desejar que os arquivos mysqldump sejam compat iveis entre as vers oes 3.22 e 3.23 do MySQL, n ao deve ser usados as op c oes --opt ou --full com o mysqldump. Conra todas suas chamadas ` a DATE_FORMAT() para ter certeza que exista um % antes de cada caractere formatador. (Vers oes mais antigas que o MySQL 3.22 aceitaivam esta sintaxe.) mysql_fetch_fields_direct() agora e uma fun c ao (era uma macro) e ela retorna um ponteiro para um MYSQL_FIELD no lugar de um MYSQL_FIELD. mysql_num_fields() n ao pode mais ser usada em um objeto MYSQL* (agora e uma fun c ao que obtem valores MYSQL_RES* como um argumento). Com um objeto MYSQL* agora voce deve usar mysql_field_count(). No MySQL Vers ao 3.22, a sa ida de SELECT DISTINCT ... era na maioria das vezes ordenada. Na Vers ao 3.23, voc e deve usar GROUP BY ou ORDER BY para obter a sa ida ordenada. SUM() agora retorna NULL, em vez de 0 se n ao existir registros coincidentes. Isto e de acordo com o ANSI SQL. Um AND ou OR com valores NULL agora retornam NULL no lugar de 0. Isto afetar a, em grande parte, pesquisas que usam NOT em uma express ao AND/OR como NOT NULL = NULL. LPAD() e RPAD() reduzir ao a string resultante se ela for maior que o tamanho do argumento.
129
recodicar o cliente para enviar o elemento db para conex oes mais r apidas). Voc e tamb em deve chamar mysql_init() antes de chamar mysql_real_connect()! Esta altera c ao foi feita para permitir ` a nova fun c ao mysql_options() salvar op c oes na estrutura do manipulador do MYSQL. A vari avel key_buffer do mysqld foi renomeada para key_buffer_size, mas voc e ainda pode usar o antigo nome nos seus arquivos de inicializa c ao.
130
Os par ametros para LOCATE() foram trocados. Agora existem algumas palavras reservadasi novas. As mais not aveis s ao DATE TIME e TIMESTAMP.
131
de ponto utuante. (O MySQL cuida de cada detalhe de troca de bytes.) Veja Se c ao 7.1 [MyISAM Tables], P agina 630. Os arquivos ISAM de dados e indices (*.ISD e *.ISM respectivamente) s ao dependentes da arquitetura e em alguns casos dependentees do Sistema Operacional. Se voc e deseja mover suas aplica c oes para outra m aquina que tem uma arquitetura ou SO diferentes da sua m aquina atual, voc e n ao deve tentar mover um banco de dados simplesmente copiando os arquivos para a outra m aquina. Use o mysqldump. Por padr ao, o mysqldump ir a criar um arquivo contendo declara c oes SQL. Voc e pode ent ao transferir o arquivo para a outra m aquina e aliment a-la como uma entrada para o cliente mysql. Utilize mysqldump --help para ver quais op c oes est ao dispon iveis. Se voc e est a movendo os dados para uma vers ao mais nova do MySQL, voc e deve usar mysqldump --opt com a nova vers ao para obter uma descarga r apida e compacta. A mais f acil (mas n ao a mais r apida) forma para mover um banco de dados entre duas m aquinas e executar os seguintes comandos na m aquina em que o banco de dados se encontra: 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 e deseja copiar um banco de dados de um m aquina remota sobre uma rede lenta, pode ser usado: shell> mysqladmin create nome_bd shell> mysqldump -h nome de outra maquina --opt --compress nome_bd \ | mysql nome_bd O resultado pode tamb em ser armazenado em um arquivo, depois transra o arquivo para a m aquina destino e carregue o arquivo no banco de dados. Por exemplo voc e pode descarregar um banco de dados para um arquivo na m aquina origem desta forma: shell> mysqldump --quick nome_bd | gzip > nome_bd.contents.gz (O arquivo criado neste exemplo est a compactado.) Transfria o arquivo contendo o conte udo do banco de dados para a m aquina destino e execute estes comandos: shell> mysqladmin create nome_bd shell> gunzip < nome_bd.contents.gz | mysql nome_bd Tamb em pode ser usado mysqldump e mysqlimport para ajudar na transfer encia do banco de dados. Para grandes tabelas, isto e muito mais r apido do que usar simplesmente mysqldump. Nos comandos abaixo, DUMPDIR representa o caminho completo do diret orio que voc e utiliza para armazenar a sa ida de mysqldump. Primeiro, crie o diret orio para os arquivos de sa ida e descarregue o banco de dados: shell> mkdir DUMPDIR shell> mysqldump --tab=DUMPDIR nome_bd Depois transra os arquivo no diret orio DUMPDIR para algum diret orio correspondente na m aquina destino e carregue os arquivos no MySQL assim: shell> mysqladmin create nome_bd shell> cat DUMPDIR/*.sql | mysql nome_bd # cria o banco de dados # cria tabelas no banco de dados
132
N ao se esque ca de copiar o banco de dados mysql tamb em, porque e nele que as tabelas de permiss oes (user, db e host) s ao armazenadas. Voc e pode ter que executar comandos como o usu ario root do MySQL na nova m aquina at e que voc e tenha o banco de dados mysql no lugar. Depois de importar o banco de dados mysql para a nova m aquina, execute mysqladmin flush-privileges para que o servidor recarregue as informa c oes das tabelas de permiss oes.
133
134
usado se um diret orio com o nome do banco de dados existe no diret orio de dados MySQL. Isto signica que se voc e j a tem um diret orio de banco de dados chamado foo no direorio de dados, voc e deve mov e-lo para D:\data antes do link simb olico ser efetivado. (Para evitar problemas, o servidor n ao deve estar executando quando voc e mover o diret orio do banco de dados.) Note que devido a penalidade que voc e tem na velocidade quando abre todas as tabelas, n os n ao habilitamos esta op c ao por padr ao, mesmo se voc e compilar o MySQL com suporte a isto. Para habilitar links simb olicos voc e deve colocar no seu arquivo my.cnf ou my.ini a seguinte entrada: [mysqld] symbolic-links No MySQL 4.0 --simbolic-links est a habilitado por padr ao. Se voc e n ao precisa us a-lo voc e pode usar a op c ao skip-symbolic-linkd.
135
pode usar para 1024, o que signica que voc e n ao conseguir a executar tantas threads simult aneas no NT/2000/XP como no Unix. Leitura de blocos O MySQL usa uma leitura de blocos para cada conex ao, que tem as seguintes implica c oes: Uma conex ao n ao ir a ser disconectada automaticamente depois de 8 horas, como acontece com a vers ao Unix do MySQL. Se uma conex ao trava, e imposs ivel a naliza-la sem matar o MySQL. mysqladmin kill n ao ir a funcionar em uma conex ao adormecida. mysqladmin shutdown n ao pode abortar enquanto existirem conex oes adormecidas. Planejamos corrigir este problema quando nossos desenvolvedores Windows tiverem conseguido um boa solu c ao. DROP DATABASE Voc e n ao pode remover um banco de dados que est a em uso por alguma thread. Matando o MySQL do gerenciador de tarefas Voc e n ao pode matar o MySQL do gerenciador de tarefas ou com o utilit ario shutdown no Win95. Voc e deve deslig a-lo com mysqladmin shutdown. Nomes case-insensitivo Nomes de arquivos n ao s ao caso sensitivo no Windows, portanto, nomes de bancos de dados e tabelas do MySQL tamb em n ao s ao caso sensitivo no Windows. A u nica restri c ao e que os nomes de bancos de dados e tabelas devem usar o mesmo caso em uma senten ca fornecida. Veja Se c ao 6.1.3 [Name case sensitivity], P agina 473. O caracter de diret orio \ Componentes de nomes de caminho no Win95 s ao separados pelo caracter \ o qual tamb em e o caractere de escape no MySQL. Se voc e estiver usando LOAD 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 e dobrar o caracter /: mysql> LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr; mysql> SELECT * INTO OUTFILE C:\\tmp\\skr.txt FROM skr; Problems with pipes. Pipes n ao funcionam com conan ca na linha de comando do Windows. Se o pipe incluir o caracter ^Z / CHAR(24), o Windows achar a que ele encontrou o m de um arquivo e abortar a o programa. Isto e um problma principalmente quando se tenta aplicar um log bin ario como a seguir: mysqlbinlog binary-log-name | mysql --user=root Se voc e obter um problema aplicando o log e suspeitar que seja devido a um caracter ^Z/CHAR(24) voc e pode usar a seguinte alternativa:
136
mysqlbinlog binary-log-file --result-file=/tmp/bin.sql mysql --user=root --eexecute "source /tmp/bin.sql" Ou ltimo comando pode tamb em ser usado para leitura em qualquer arquivo sql que contenha dados bin arios. erro: Cant open named pipe Se voc e utiliza um servidor MySQL vers ao 3.22 no NT com o os programas clientes MySQL mais novos, ser a apresentado o seguinte erro: error 2017: cant open named pipe to host: . pipe... Isto ocorre porque a vers ao do MySQL usa named pipes no NT por padr ao. Voc e pode evitar este erro usando a op c ao --host=localhost para os novos clientes MySQL ou criar um arquivo de op c oes c:\my.cnf que contenha a seguinte informa c ao: [client] host = localhost A partir da vers ao 3.23.50, named pipes s ao habilitados somente se o mysqld-nt ou mysqld-nt-max for iniciado com a op c ao --enable-name-pipe. Erro Access denied for user Se voc e tenta executar um programa cliente MySQL para conectar a um servidor em execu c ao na mesma m aquina, nas obtem o erro Access denied for user: some-user@unknown to database mysql quando acessar um servidor MySQL na mesma m aquina, signifca que o MySQL n ao pode resolver seu nome de m aquina corretamente. Para corrigir isto, voc e deve criar um arquivo \Windows\hosts com a seguinte informa c ao: 127.0.0.1 localhost ALTER TABLE Enquanto voc e est a executando uma instru c ao ALTER TABLE, a tabela est a bloqueada para ser usado por outras threads. Isto ocorre devido ao fato de que no Windows, voc e n ao pode deletar um aruivo que est a em uso por outra threads. No futuro, podemos encontrar algum modo de contornarmos este problema. DROP TABLE DROP TABLE em uma tabela que est a em uso por uma tabela MERGE n ao funcionar a no Windows porque o manipulador do MERGE faz o mapeamento da tabela escondido da camada superior do MySQL. Como o Windows n ao permite que voc e delete arquivos que est ao abertos, voc e primeiro deve descarregar 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 c oes DATA DIRECTORY e INDEX DIRECTORY para CREATE TABLE s ao ignoradas no Windows, porque ele n ao suporta links simb olicos. Aqui est ao alguns assuntos em aberto para qualquer um que queira melhorar o MySQL no Windows: Adicionar alguns icones agrad aveis para o start e shutdown na instala c ao do MySQL.
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 oes GUI dos clientes MySQL padr oes (mysql, mysqlshow, mysqladmin e mysqldump) seria otimo. Seria muito bom se as fun c oes de leitura e escrita no socket em net.c fosse inter rompiveis. Isto tornaria poss ivel matar threads abertas com mysqladmin kill no Windows. Adicionar macros para usar os m etodos mais r apidos de incremento/decremento de threads seguras fornecidos pelo Windows.
138
cat /proc/sys/fs/file-max cat /proc/sys/fs/dquot-max cat /proc/sys/fs/super-max Se voc e possui mais de 16M de mem oria, deve ser adicionado o seguinte no seu script de 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 e tamb em pode executar os comandos acima da linha de comando como root, mas neste caso, os antigos limites voltar ao a ser usados na pr oxima vez que o computador for reiniciado. De forma alternativa, voc e pode congurar estes par amteros durante a inicializa c ao usando a ferramenta sysctl, que e usada por muitas distribui c oes Linux (No SuSE a partir da vers ao 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 ametros acima permitem o MySQL criar at e 8192 conex oes + arquivos. A constante STACK_SIZE na LinuxThreads controla o espa camento das pilhas threads no espa co de endere camento. Ela necessita ser grande o bastante para que tenha espa co o suciente para a pilha de cada thread, mas pequena o bastante para manter a pilha de alguma thread executando dos dados globais mysqld. Infelizmente, a implementa c ao Linux de mmap(), como descobrimos em experi encias, ir a desmapear uma regi ao j a mapeada se voc e solicitar o mapeamento de um endere co j a em uso, zerando os dados de toda a p agina ao inv es de retoernar. um erro. Portanto a seguran ca do mysqld ou qualquer outra aplica c ao baseada em threads depende do comportamento gentil do c odigo que cria as threads. O usu ario deve tomar medidas para certircar-se que o n umero de threads em funcionamento em qualquer hora seja sucientemente baixo para que as pilhas das threads permane cam longe do monte global. Com mysqld voc e deve refor car este comportamento "gentil" congurando um valor razo avel para a vari avel max_connections. Se voc e mesmo construiu o MySQL e n ao deseja confus oes corrigindo LinuxThreads, voc e deve congurar max_connections para um valor m aximo de 500. Ele ainda deve ser menor se voc e tiver uma chave grande para o buer, grandes tabelas heap, ou outras coisas que fazem o mysqld alocar muita mem oria ou se voc e estiver executando um kernel 2.2 com o patch de 2GB. Se voc e estiver usando nosso bin ario ou RPM vers ao 3.23.25 ou posterior, voc e pode seguramente congurar max_connections para 1500, assumindo que n ao h a uma grande chave de buer ou tabelas heap com grande quantidade de dados. Quanto mais voc e reduz STACK_SIZE em LinuxThreads mais threads voc e pode criar seguramente. Recomendamos os valores entre 128K e 256K. Se voc e usa v arias conex oes simult aneas, voc e pode sofrer com um "recurso" do kernel 2.2 que penaliza um processo por bifurcar-se ou clonar um lho na tentativa de prevenir
139
um ataque de separa c ao. Isto faz com que o MySQL n ao consiga fazer uma bom escalonamento, quando o n umero de clientes simult aneos cresce. Em sistemas com CPU u nica, temos visto isto se manifestar em uma cria c ao muito lenta das threads, tornando a conex ao ao MySQL muito lenta. Em sistemas de m ultiplas CPUs, temos observado uma queda gradual na velocidade das consultas quando o n umero de clientes aumenta. No processo de tentar encontrar uma solu c ao, recebemos um patch do kernel de um de nossos usu arios, que alega fazer muita diferen ca para seu site. O patch est a dispon ivel aqui (http://www.mysql.com/Downloads/Patches/linux-fork.patch). Atualmente temos feito testes extensivos deste patch nos sistemas de desenvolvimento e produ c ao. A performance do MySQL obtem uma melhora signicativa, sem causar problemas e atualmente o recomendamos para nossos usu arios que continuando trabalhando com servidores muito carregados em kernels 2.2. Este detalhe foi corrigido no kernel 2.4, portanto, se voc e n ao est a satisfeito com a performance atual do seu sistema, melhor do que aplicar um patch ao seu kernel 2.2, pode ser mais f acil simplesmente atualizar para o 2.4, que lhe dar a tamb em uma melhora em seu sistemas SMP em adi c ao ` a corre c ao do bug discutido aqui. Estamos testando o MySQL no kernel 2.4 em uma m aquina com 2 processadores e descobrimos que o MySQL escalona muito melhor - virtualmente, n ao h a nenhuma perda de desempenho no throughput das consultas at e cerca de 1000 clientes, e o fator da escala do MySQL (computado com a raz ao do throughput m aximo para o thoughput de cada cliente.) foi de 180%. Temos observado resultados similares em sistemas com 4 processadores - virtualmente n ao h a perda de desempenho quando o n umero de clientes e incrementado at e 1000 e o fator da escala foi de 300%. Portanto para um servidor SMP muito carregado n os denitivamente recomendamos o kernel 2.4. N os descobrimos que e essencial executar o processo mysqld com a mais alta prioridade poss ivel no kernel 2.4 para obter performance m axima. Isto pode ser feito adicionando o comando renice -20 $$ ao mysqld_safe. Nos nossos testes em uma m aquina com 4 processadores, o aumento da prioridade nos deu 60% de aumento no throughput com 400 clientes. Atualmente estamos tentando coletar mais informa c oes sobre como o MySQL atua no kernel 2.4 em sistemas com 4 e 8 processadores. Se voc e tem acesso a um sistema deste porte e tem feito alguns benchmarks, por favor envie um email para docs@mysql.com com os resultados - iremos inclu i-los neste manual. Existe outro detalhe que afeta muito a performance do MySQL, especialmente em sistemas multi processados. A implementa c ao de mutex em LinuxThreads na glibc-2.1 e muito ruim para programas com v arias threads que travam o mutex por um tempo curto. Em um sistema SMP, ironicamente, se voc e liga o MySQL com LinuxThreads sem modica c oes, removendo processadores da m aquina, a performance do MySQL e melhorada em alguns casos. Para corrigir este comportamento, 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 ao 3.23.36 ir a usar o mutex adaptativo, que e muito melhor,mesmo que o patch na glibc-2.1.3. Avisamos, entretando, que sobre algumas condi c oes, o c odigo mutex no glibc-2.2.2 overspins, que prejudica a performance do MySQL. A chance desta condi c ao pode ser reduzida mudando a prioridade do processo mysqld para a prioridade mais alta. N os tamb em corrigimos o comportamento overspin com um patch, disponivel em http://www.mysql.com/Downloads/Linux/linuxthreads-2.2.2.patch.
140
Ele combina a corre c ao do overspin, n umero m aximo de threads e espa camento das pilhas em um u nico patch. Voc e precisar a aplic a-lo no diret orio linuxthreads com patch -p0 </tmp/linuxthreads-2.2.2.patch. Esperamos que seja inclu ido de alguma forma nos futuros lan camentos da glibc-2.2. De qualquer forma, se voc e ligar com glibc-2.2.2, ainda ser a necess ario corrigir STACK_SIZE e PTHREAD_THREADS_MAX. Temos esperan cas que os padr oes ser ao corrigidos para valores mais aceit aveis para congura c oes pesadasa do MySQL no futuro, ent ao sua constru c ao poder a ser reduzida a ./configure; make; make install. Recomendamos que voc e use os patches acima para construir uma vers ao est atica especial de libpthread.a e use-a somente para liga c oes est aticas com o MySQL. Sabemos que os patches s ao seguros para o MySQL e pode melhorar signicamente sua performance, mas n ao podemos dizer nada sobre outras aplica c oes. Se voc e ligar outras aplica c oes coma a vers ao modicada da biblioteca ou construir uma vers ao alterada compartilhada e instal a-la no seu sistema, voc e estar a fazendo por sua conta e risco e tenha aten c ao com outras aplica c oes que dependem de LinuxThreads. Se voc e passar por problemas estranhos durante a instala c ao do MySQL ou com travamentos de alguns utilit arios comuns, e muito prov avel que eles s ao relacionados a problemas de bibliotecas ou compilador. Se for este o caso, o uso de nosso bin ario ser a a solu c ao. Um problema conhecido com a distribui c ao bin aria e que com antigos sistemas Linux que usam libc (como o RedHat 4.x ou Slackware), voc e obter a alguns problemas n ao fatais com resolu c ao de nomes. Veja Se c ao 2.6.2.1 [Binary notes-Linux], P agina 141. Quando estiver usando LinuxThreads voc e ver a um minimo de tr es processos em execu c ao. Estes s ao de fato, threads. Existir a uma thread para o gerenciador LinuxThreads, uma thread para lidar com conex oes e uma thread para tartar de alarmes e sinais. Perceba que o kernel Linux e a biblioteca LinuxThread pode por padr ao ter apenas 1024 threads. Isto signica que voc e pode ter at e 1021 conex oes ao MySQL em um sistema sem corre c ao. A p agina http://www.volano.com/linuxnotes.html cont em informa c oes sobre como contornar este limite. Se voc e ver um processo mysqld daemon nalizado com ps, isto normalmente signica que voc e encontrou um bug no MySQL ou que tenha uma tabela corrompida. Veja Se c ao A.4.1 [Crashing], P agina 921. Para obter um descarga do core no Linux se o mysqld nalizar com um sinal SIGSEGV, voc e pode iniciar o mysqld com a op c ao --core-file. Perceba que provavelmente voc e tamb em precisar a aumentar o core file size adicionando ulimit -c 1000000 para mysqld_safe ou iniciar mysqld_safe com --core-file-sizes=1000000, Veja Se c ao 4.8.2 [safe_mysqld], P agina 332. Se voc e estiver ligando seu pr oprio cliente MySQL e obter o erro: ld.so.1: ./my: fatal: libmysqlclient.so.4: open failed: No such file or directory Quando execut a-los, o problema pode ser evitado com um dos seguintes m etodos: Ligue o cliente com a seguinte op c ao (no lugar de -Lpath): libmysqlclient.so. Copie libmysqclient.so para /usr/lib. -Wl,r/path-
141
Adicione o caminho do diret orio onde libmysqlclient.so est a localizado para a vari avel de ambiente LD_RUN_PATH antes de executar seu cliente. Se voc e estiver usando o compilador Fujitsu (fcc / FCC) voc e ter a alguns problemas compilando o MySQL porque os arquivos de cabe calho Linux s ao muito orientados ao gcc. A seguinte linha configure deve funcionar com fcc/FCC: CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE \ -DCONST=const -DNO_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
142
estiver usando uma release antiga do MySQL que n ao suporte --force, voc e deve remover o teste resolveip no mysql_install com um editor. Inicie mysqld com su no lugar de usar --user. As distribui c oes bin arias Linux-Intel e RPM do MySQL s ao conguradas para o m aximo de desempenho possivel. N os sempre tentamos usar o compilador mais r apido e est avel dispon ivel. Suporte MySQL ao Perl exige Perl Vers ao 5.004 03 ou mais novo. Em algumas vers oes 2.2 do kernel Linux,voc e pode obter o erro Resource temporarily unavailable quando voc e faz v arias novas conex oes para um servidor mysqld sobre TCP/IP. O problema e que o Linux tem um atraso entre o momento em que voc e fecha um socket TCP/IP at e que ele seja realmente liberado pelo sistema. Como s o existe espa co para um n umero nito de slots TCP/IP, voc e ir a obter o erro acima se voc e tentar fazer muitas novas conex oes TCP/IP durante um pequeno tempo, como quando voc e executa o benchmark do MySQL test-connect sobre TCP/IP. N os enviamos emails sobre este problema v arias vezes para diferentes listas de discuss ao Linux mas nunca conseguimos resolver este problema apropriadamente. A u nica corre c ao conhecida , para este problema e usar conex oes persistentes nos seus clientes ou usar sockets, se voc e estiver executando o servidor de banco de dados e clientes na mesma m aquina. N os experamos que o kernel Linux 2.4 corrija este problema no futuro.
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 orio share/mysql sob o diret orio de instala c ao MySQL ou no diret orio support-files da arvore fonte MySQL. Se o mysqld sempre descarregar um core na inicializa c ao, o problema pode ser que voc e tenha um antigo /lib/libc.a. Tente renome a-lo depois remova sql/mysqld e fa ca um novo make install e tente novamente. Este problema foi relatado em algumas instala c oes Slackware. Se voc e obter o seguinte erro quando ligar o mysqld, signica que seu libg++.a n ao est a instalado corretamente: /usr/lib/libc.a(putc.o): In function _IO_putc: putc.o(.text+0x0): multiple definition of _IO_putc Voc e pode evitar o uso de libg++.a executando configure desta forma: shell> CXX=gcc ./configure
144
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 e deseja usar egcs a seguinte linha de congura c ao funcionou para n os: 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 c oes baseadas em threads como o MysQL n ao ir a funcionar com gdb 4.18. Voc e deve fazer download e usar o gdb 5.0! Se voc e tentar ligar o mysqld estaticamente quando usar o gcc, a imagem resultante ir a use --with-mysqlddescarregar um arquivo core no in icio. Em outras palavras, NAO ldflags=-all-static com gcc.
145
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 e deve usar o GNU tar (gtar) para desempacotar a distribui c ao. Voc e pode encontrar uma c opia pr e-compilada para Solaris em http://www.mysql.com/downloads/os-solaris.html. As threads nativas da Sun funcionam somente no Solaris 2.5 e superior. Para a vers ao 2.4 e anteriores, o MySQL ir a automaticamente usar MIT-pthreads. Veja Se c ao 2.3.6 [MITpthreads], P agina 106. Se voc e obter o seguinte erro de congure: checking for restartable system calls... configure: error can not run test programs while cross compiling Isto signica que alguma coisa est a errada com a instala c ao de seu compilador! Neste caso voc e deve atualizar seu compilador para uma vers ao mais nova. Voc e tamb em pode resolver este problema inserindo a seguinte linha no arquivo config.cache: ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls=no} Se voc e est a usando Solaris em um SPARC, o compilador recomendado e o gcc 2.95.2. Voc e pode encontr a-lo em http://gcc.gnu.org/. Perceba que egcs 1.1.1 e gcc 2.8.1 n ao s ao est aveis no SPARC! 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 e possui um ultra sparc, voc e pode obter 4% a mais de performance adicionando "-mcpu=v8 -Wa,-xarch=v8plusa" para a CFLAGS e CXXFLAGS. Se voc e possui o compilador Sun Workshop (Fortre) 5.3 (ou mais novo), voc e pode executar 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 e pode criar um bin ario de 64 bits usando o compilador Forte da Sun com os seguintes par ametros de compila c ao: 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 ario de 64 bits do Solaris usando gcc, e -m64 para CFLAGS e CXXFLAGS. Note que isto s o funciona com o MySQL 4.0 e acima - o MySQL 3.23 n ao inclui as modica c oes exigidas para suportar isto.
146
No benchmark do MySQL, conseguimos um aumento de velocidade de 4% em um UltraSPARC usando o Forte 5.0 no modo 32 bit em compara c ao com o uso do gcc 3.2 com o parametro -mcpu. Se voc e criar um bin ario de 64 bits, ele ser a 4$ mais lento que o bin ario de 32 bits, mas o mysqld poder a tratar mais threads e mem oria. Se voc e tiver um problema com fdatasync ou sched_yield, voc e pode corrigir isto adicionando LIBS=-lrt para a linha de congura c ao O seguinte paragr afo e relevante somente para compiladores mais antigos que o WorkShop 5.3: Voc e tamb em pode ter que editar o script configure para alterar esta linha: #if !defined(__STDC__) || __STDC__ != 1 para isto: #if !defined(__STDC__) Se voc e ligar __STDC__ com a op c ao -Xc, o compilador Sun n ao pode compilar com o arquivo de cabe calho pthread.h do Solaris. Isto e um bug da Sun (compilador corrompido ou arquivo include corrompido). Se o mysqld emitir a mensagem de erro mostrada abaixo quando voc e execut a-lo, voc e deve tentar compilar o MySQL com o compilador Sun sem habilitar a op c ao multi-thread (-mt): libc internal error: _rmutex_unlock: rmutex not held Adicione -mt a CFLAGS e CXXFLAGS e tente novamente. Se voc e estiver usando a vers ao SFW do gcc (que vem com o Solaris 8), voc e deve adicionar /opt/sfw/lib a vari avel de ambiente LD_LIBRARY_PATH antes de executar a congura c ao. Se voc e estiver usando o gcc dispon ivel em sunfreeware.com, voc e pode ter muitos problemas. Voc e deve recompilar o gcc e GNU binutils na m aquina que voc e o executar a para evitar qualquer problema. Se voc e obter o seguinte erro quando estiver compilando o MySQL com gcc, signica que seu gcc n ao est a congurado para sua vers ao de Solaris: shell> gcc -O3 -g -O2 -DDBUG_OFF -o thr_alarm ... ./thr_alarm.c: In function signal_hand: ./thr_alarm.c:556: too many arguments to function sigwait A coisa apropriada para fazer neste caso e obter a vers ao mais nova do gcc e compil a-lo com seu compilador gcc atual! Ao menos para o Solaris 2.5, a maioria das vers oes bin arias de gcc tem arquivos in uteis e antigos que ir ao quebrar todos programas que usam threads (e possivelmente outros programas)! O Solaris n ao fornece vers oes est aticas de todas bibliotecas de sistema (libpthreads) e libdl), portanto voc e n ao pode compilar o MySQL com --static. Se voc e tentar fazer isto, receber a o erro: ld: fatal: library -ldl: not found ou undefined reference to dlopen
147
ou cannot find -lrt Se v arios processos tentar conectar muito rapidamente ao mysqld, voc e ver a este erro no log do MySQL: Error in accept: Protocol error Voc e deve tentar iniciar o servidor com a op c ao --set-variable back_log=50 como uma solu c ao para esta situa c ao. Note que --set-variable=nome=valor e -O nome=valor est a obsoleto desde o MySQL 4.0. Use apenas --back_log=50. Veja Se c ao 4.1.1 [Op c oes da linha de comando], P agina 208. Se voc e est a ligando seu pr oprio cliente MySQL, voc e deve obter o seguinte erro quando tentar execut a-lo: ld.so.1: ./my: fatal: libmysqlclient.so.#: open failed: No such file or directory O problema pode ser evitado por um dos seguintes m etodos: Ligue o cliente com a seguinte op c ao (em vez de -Lpath): -Wl,r/full-path-tolibmysqlclient.so. Copie o arquivo libmysqclient.so para /usr/lib. Adicione o caminho do diret orio onde libmysqlclient.so est a localizado ` a vari avel de ambiente LD_RUN_PATH antes de executar seu cliente. Se voc e tiver problemas com o congure tentando ligar com -lz e voc e n ao tem a zlib instalada, voc e ter a duas op c oes: Se voc e deseja usar o protocol de comuni c ao de compactado voc e precisar a obter e instalar a zlib from ftp.gnu.org. Congure com --with-named-z-libs=no. Se voc e estiver usando o gcc e tiver problemas carregando fun c oes UDF no MySQL, tente adicionar -lgcc para a linha de liga c ao para a fun c ao UDF. Se voc e deseja que o MySQL inicie automaticamente, support-files/mysql.server para /etc/init.d e criar para ele, chamado /etc/rc.3.d/S99mysql.server. voc e pode copiar um link simb olico
Como o Solaris n ao suporta core les para aplica c oes setuid(), voc e n ao pode obter um core le do mysqld se voc e estiver usando a op c ao --user.
148
/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 e pode fazer o seguinte para corrigir o problema: Copie /usr/include/widec.h para .../lib/gcc-lib/os/gcc-version/include e mude a linha 41 : #if para #if !defined(lint) && !defined(__lint) && !defined(getwc) !defined(lint) && !defined(__lint)
Uma alternativa e editar o /usr/include/widec.h diretamente. Desta forma, depois de fazer a corre c ao, voc e deve remover o config.cache e executar o configure novamente ! Se voc e obter erros como estes quando voc e executar o make, e porque o configure n ao encontrou o arquivo curses.h (provavelmente devido ao erro no arquivo /usr/include/widec.h): In file included from mysql.cc:50: /usr/include/term.h:1060: syntax error before , /usr/include/term.h:1081: syntax error before ; A solu c ao para isto e fazer uma das seguintes op co es: Congure com CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H ./configure. Edite o /usr/include/widec.h como indicado acima e re-execute o congure. 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 e que seu arquivo libz.so est a instalado em /usr/local/lib. Voc e pode corrigir isto usando um dos seguintes m etodos: Adicione /usr/local/lib ao LD_LIBRARY_PATH. Adicione um link para libz.so a partir de /lib. Se voc e estiver usando o Solaris 8, voc e pode instalar a zlib opcional do CD de distribui c ao do Solaris 8. Congure o MySQL com a op c ao --with-named-z-libs=no.
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 a evitar problemas com a biblioteca libstdc++ e com exce c oes C++.
149
Se isto n ao ajudar, voc e pode compilar uma vers ao com debug e execut a-lo com um arquivo de ratreamento (trace) ou sob gdb. Veja Se c ao D.1.3 [Using gdb on mysqld], P agina 1072.
150
Tenha certeza que a entrada localhost no arquivo /etc/hosts esteja correta (de outra forma voc e ir a ter problemas conectando ao banco de dados). O arquivo /etc/hosts deve 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 e percber que o configure usar a MIT-pthreads, voc e de ler as notas sobre MITpthreads. Veja Se c ao 2.3.6 [MIT-pthreads], P agina 106. Se o make install n ao puder encontrar /usr/include/pthreads, e porque o configure n ao detectou que voc e precisava de MIT-pthreads. Isto e corrigido executando estes comandos: shell> rm config.cache shell> ./configure --with-mit-threads O FreeBSD e tamb em conhecido por ter um limite muito baixo para o manipulador de arquivos. Veja Se c ao A.2.17 [Not enough le handles], P agina 917. Descomente a se c ao ulimit -n no mysqld safe ou aumente os limites para o usu ario mysqld no /etc/login.conf (e reconstrua-o com cap mkdb /etc/login.conf). Tamb em tenha certeza que voc e congurou a classe apropriada para este usu ario no arquivo de senhas (password) se voc e n ao estiver usando o padr ao (use: chpass nome usuario mysqld). Veja Se c ao 4.8.2 [mysqld_safe], P agina 332. Se voc e tiver muita mem oria voc e deve considerar em reconstruir o Kernel para permitir o MySQL de usar mais de 512M de RAM. D e uma olhada na op c~ ao MAXDSIZ na arquivo de congura c ao LINT para maiores informa c oes. Se voc e tiver problemas com a data atual no MySQL, congurar a vari avel TZ provavelmente ajudar a. Veja Ap endice E [Environment variables], P agina 1083. Para obter um sistema seguro e est avel voc e deve usar somente kernels FreeBSD que estejam marcados com -STABLE.
151
152
shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 \ ./configure \ --prefix=/usr/local/mysql \ --with-unix-socket-path=/var/mysql/mysql.sock Voc e pode alterar as localiza c oes dos diret orios se voc e desejar, ou apenas usar os padr oes n ao especicando nenhuma localiza c ao. Se voc e tiver problemas com performance sob alta carga, tente usar a op c ao --skip-threadpriority para mysqld! Isto ir a executar todas as threads com a mesma prioridade; no BSDI vers ao 3.1, isto fornece melhor performance (pelo menos at e o BSDI corrigir seu organizador de threads). Se voc e obter o erro virtual memory exhausted enquanto estiver compilando, deve tentar usar ulimit -v 80000 e executar make novamente. Se isto n ao funcionar e voc e estiver usando bash, tente trocar para csh ou sh; alguns usu arios BSDI relataram problemas com bash e ulimit.
153
Nosso bin ario para Mac OS X e compilado no Darwin 6.3 com a seguinte linha de congura c ao: 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 c ao 2.1.3 [Instala c ao do Mac OS X], P agina 71.
2.6.6 Notas de Outros Unix 2.6.6.1 Notas HP-UX para distribui c oes bin arias
Alguma das distribui c oes bin arias do MySQL para HP-UX e distribuida como um arquivo depot da HP e como um arquivo tar. Para usar o arquivo depot voc e deve estar executando pelo menos o HP-UX 10.x para ter acesso ` as ferramentas de arquivos depot da HP. A vers ao HP do MySQL foi compilada em um servidor HP 9000/8xx sob HP-UX 10.20, usando MIT-pthreads. Sob esta congura c ao o MySQL funciona bem. O MySQL Vers ao 3.22.26 e mais novas tamb em podem ser construidas com o pacote thread nativo da HP. Outras congura c oes que podem funcionar: HP 9000/7xx executando HP-UX 10.20+ HP 9000/8xx executando HP-UX 10.30 As seguintes congura c oes denitivamente n ao funcionar ao: 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 c ao, utilze um dos comandos abaixo, onde /path/to/depot e o caminho completo do arquivo depot: Para instalar tudo, incluindo o servidor, cliente e ferramentas de desenvolvimento: shell> /usr/sbin/swinstall -s /path/to/depot mysql.full Para instalar somente o servidor: shell> /usr/sbin/swinstall -s /path/to/depot mysql.server Para instalar somente o pacote cliente: shell> /usr/sbin/swinstall -s /path/to/depot mysql.client Para instalar somente as ferramentas de desenvolvimento:
154
shell> /usr/sbin/swinstall -s /path/to/depot mysql.developer O depot copia os bin arios e bibliotecas em /opt/mysql e dados em /var/opt/mysql. O depot tamb em cria as entradas apropriadas em /etc/init.d e /etc/rc2.d para iniciar o servidor automaticamente na hora do boot. Obviamente, para instalar o usu ario deve ser o root. Para instalar a distribui c ao HP-UX tar.gz, voc e deve ter uma c opia do GNU tar.
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 e que o HP-UX n ao dene consistentemente a pthreads_ atfork(). Ela tem prot otipos coitantes em /usr/include/sys/unistd.h:184 e /usr/include/sys/pthread.h:440 (detalhes abaixo). Uma solu c ao e copiar /usr/include/sys/unistd.h em mysql/include e editar unistd.h alterando-o para coincidir com a deni c ao em pthread.h. Aqui est a o di: 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 congure 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 c oes que um usu ario do HP-UX Vers ao 11.x nos enviou sobre compila c ao do MySQL com o compilador HP-UX: CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure --with-extra-character-set=com Voc e pode ignorar qualquer erro do tipo: aCC: warning 901: unknown option: -3: use +help for online documentation Se voc e obter o seguinte erro do configure checking for cc option to accept ANSI C... no configure: error: MySQL requires a ANSI C compiler (and a C++ compiler). Try gcc. See the Installation chapter in the Reference Manual. Conra se voc e n ao tem o caminho para o compilador K&R antes do caminho para o compilador C e C++ do HP-UX. Outra raz ao para n ao estar compilando e voc e n ao denir o par ametro +DD64 acima. Outra possibilidade para o HP-UX 11 e usar o bin ario MySQL para HP-UX 10.20. Recebemos relatos de alguns usu arios de que esses bin arios funcionam bem no HP-UX 11.00. Se voc e encontrar problemas, verique o n ivel do pacth de seu HP-UX.
156
./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 ao as op c oes usadas para compilar a distribui c ao MySQL que pode ser encontrada em http://www-frec.bull.com/. Se voc e alterar o -O3 para -O2 na linha de congura c ao acima, voc e tamb em deve remover a op c ao -qstrict (isto e uma limita c ao no compilador C da IBM). Se voc e estiver usando gcc ou egcs para compilar o MySQL, voc e DEVE usar a op c ao -fnoexceptions, j a que o manipulador de exce c oes no gcc/egcs n ao e seguro para threads! (Isto foi testado com egcs 1.1). Existem tamb em alguns problemas conhecidos com o assembler da IBM que pode gerar c odigo errado quando usado com gcc. N os recomendamos a seguinte linha do configure com egcs e gcc 2.95 no AIX: CC="gcc -pipe -mcpu=power -Wa,-many" \ CXX="gcc -pipe -mcpu=power -Wa,-many" \ CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql --with-low-memory O -Wa,-many e necess ario para o compilador ser bem sucedido. IBM est a ciente deste problema mas n ao est a com pressa de corrigi-lo devido ao fato do problema poder ser contornado. N os n ao sabemos se o -fno-exceptions e necess ario com gcc 2.9.5, mas como o MySQL n ao utiliza exce c oes e a op c ao acima gera c odigo mais r apido, recomendamos que voc e sempre use esta op c ao com o egcs/gcc. Se voc e tiver algum problema com c odigo assembler tente alterar o -mcpu=xxx para o seu processador. Normalmente power2, power ou powerpc podem ser usados, de uma maneira alternativa voc e pode precisar usar 604 ou 604e. N ao tenho certeza mas acredito que usar "power" deve satisfazer a maioria dos casos, mesmo em uma m aquina power2. Se voc e n ao sabe qual e o seu processador, utilize o comando "uname -m", isto ir a fornecer a voc e uma string que parece com "000514676700", com um formato de xxyyyyyymmss onde xx e ss s ao sempre 0s, yyyyyy e o ID u nico do sistema e mm e o ID da CPU Planar. Uma 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 a lhe fornecer um tipo de m aquina e um modelo de m aquina que voc e pode usar para determinar que tipo de cpu voc e tem. Se voc e tiver problemas com sinais (MySQL naliza sem notica c ao sob alta carga) voc e pode ter encontrado um bug de SO com threads e sinais. Neste caso voc e pode dizer ao MySQL para n ao usar sinais congurando-o com:
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 ao afeta a performance do MySQL, mas tem o efeito colateral que voc e n ao pode matar clientes que est ao dormindo em uma conex ao com mysqladmin kill ou mysqladmin shutdown. Neste caso, o cliente morrer a quando ele chegar no pr oximo comando. Em algumas vers oes do AIX, ligando com libbind.a faz o getservbyname descarregar core. Isto e erro no AIX e deve ser relatado para a IBM. Para o AIX 4.2.1 e gcc voc e tem que fazer as seguintes altera c oes. Depois de congurar, edite o config.h e include/my_config.h e altere a linha que diz #define HAVE_SNPRINTF 1 para #undef HAVE_SNPRINTF E nalmente, no mysqld.cc voc e precisa adicionar um prot otipo para initgroups. #ifdef _AIX41 extern "C" int initgroups(const char *,int); #endif Se voc e precisar se alocar muita mem oria para o processo mysqld, n ao e suciente apenas denir ulimit -d unlimited. Voc e tamb em deve congurar no mysqld_safe algo do tipo: export LDR_CNTRL=MAXDATA=0x80000000 Voc e pode encontrar mais sobre o uso de muita mem oria em: http://publib16.boulder.ibm.com/pseries US/aixprggd/genprogc/lrg_prg_support.htm.
158
CC="cc -pthread" CXX="cxx -pthread -O" \ ./configure --with-named-thread-libs="-lpthread -lmach -lexc -lc" Quando compilando o mysqld, voc e deve ver alguns avisos como estes: mysqld.cc: In function void handle_connections(): mysqld.cc:626: passing long unsigned int * as argument 3 of accept(int,sockadddr *, int *) Voc e pode ignorar estes altertas com seguran ca. Eles ocorrem porque o configure s o pode detectar erros e n ao alertas. Se voc e inicia o servidor diretamente da linha de comando, voc e pode ter problemas com a naliza c ao do servidor ao sair (log out). (Quando voc e sai, seu processo superior recebe um sinal SIGHUP.) Se isto acontecer, tente iniciar o servidor desta forma: shell> nohup mysqld [options] & nohup faz com que o comando que o segue ignore qualquer sinal SIGHUP enviado pelo terminal. De forma alternativa, inicie o servidor executando mysqld_safe, o qual invoca o mysqld usando nohup por voc e. Veja Se c ao 4.8.2 [mysqld_safe], P agina 332. Se voc e tiver problemas quando compilar mysys/get opt.c, apenas remova a linha #dene NO PROTO do inicio do arquivo! Se voc e estiver utilizando o compilador CC da Compac, a seguinte linha de congura c ao dever a funcionar: CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host" CXX="cxx -pthread" CXXFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host \ -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 e tiver problemas com a libtool, ao compilar com bibliotecas compartilhadas como no exemplo acima, quando estiver ligando ao mysqld, voc e deve conseguir contornar este problema usando: cd mysql /bin/sh ../libtool --mode=link cxx -pthread -O3 -DDBUG_OFF \ -O4 -ansi_alias -ansi_args -fast -inline speed \ -speculate all \ -arch host -DUNDEF_HAVE_GETHOSTBYNAME_R \ -o mysql mysql.o readline.o sql_string.o completion_hash.o \ ../readline/libreadline.a -lcurses \ ../libmysql/.libs/libmysqlclient.so -lm cd .. gnumake
159
160
Se voc e tiver problemas com sinais (MySQL nalzar inesperadamente sobre alta carga), voc e pode ter encontrado um erro com threads e sinais no SO. Neste caso voc e pode dizer ao MySQL para n ao usar sinais congurando-o com: shell> CFLAGS=-DDONT_USE_THR_ALARM \ CXXFLAGS=-DDONT_USE_THR_ALARM \ ./configure ... Isto n ao afeta a performance do MySQL, mas tem efeitos colaterais que n ao permitem nalizar clientes que est ao dormindo em uma conex ao com mysqladmin kill ou mysqladmin shutdown. Neste caso o cliente ir a morrer quando ele receber o pr oximo comando. Com gcc 2.95.2, voc e provavelmente encontrar a o seguinte erro de compila c ao: sql_acl.cc:1456: Internal compiler error in scan_region, at except.c:2566 Please submit a full bug report. Para corrigir isto voc e deve alterar para o diret orio sql e fazer um corta e cola da u ltima linha gcc, mas altere -O3 para -O0 (ou adicione -O0 imediatamente depois de gcc se voc e n ao tiver algumas op c ao -O na sua linha de compila c ao.) Depois disto feito voc e deve apenas voltar ao diret orio superior e executar make novamente.
A SGI recomenda que voc e instale todos os patches desta p agina: http://support.sgi.com/surfzone/patches/ No m inimo, voc e deve instalar o u ltimo rollup do kernel, o u ltimo rollup rld, e o u ltimo rollup libc. Denitivamente voc e precisar a de todos patches POSIX nesta p agina, para suporte pthreads: http://support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html Se voc e obter o seguinte erro quando estiver compilando o mysql.cc: "/usr/include/curses.h", line 82: error(1084): invalid combination of type Digite o seguinte no diret orio topo da sua arvore fonte do MySQL: shell> extra/replace bool curses_bool < /usr/include/curses.h \ > include/curses.h shell> make
161
Existem relatos de problemas com organiza c ao de threads. Se somente uma thread estiver executando, o sistema ca lento. Pode se evitar isto iniciando outro cliente. Isto pode acarretar num crescimento de 2 para 10 vezes na velocidade de execu c ao para a outra thread. Isto e um problema n ao compreendido com threads Irix; voc e deve improvisar para encontrar solu c oes at e que isto seja resolvido. Se voc e estiver compilando com gcc, voc e pode usar o seguinte comando configure: 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 a funcionar CC=cc CXX=CC CFLAGS=-O3 -n32 -TARG:platform=IP22 -I/usr/local/include \ -L/usr/local/lib CXXFLAGS=-O3 -n32 -TARG:platform=IP22 \ -I/usr/local/include -L/usr/local/lib ./configure \ --prefix=/usr/local/mysql --with-innodb --with-berkeley-db \ --with-libwrap=/usr/local \ --with-named-curses-libs=/usr/local/lib/libncurses.a
3. Voc e deve obter o pacote FSU Pthreads e instal a-lo primeiro. Pode ser obtido em http://www.cs.wustl.edu/~schmidt/ACE_wrappers/FSU-threads.tar.gz. Voc e pode tamb em obter um pacote precompilado de http://www.mysql.com/Downloads/SCO/FSU-threads 4. FSU Pthreads pode ser compilado com SCO Unix 4.2 com tcpip, ou OpenServer 3.0 ou OpenDesktop 3.0 (OS 3.0 ODT 3.0), com o Sistema de Desenvolvimento da SCO instalado usando uma boa vers ao do GCC 2.5.x ODT ou OS 3.0, no qual voc e necessitar a de uma boa vers ao do GCC 2.5.x. Existem v arios problemas sem uma boa vers ao. Esta vers ao do produto necessita do sistema de Desenvolvimento SCO Unix. Sem ele, voc e estar a perdendo as bibliotecas e o editor de liga c ao necess ario. 5. Para construir a FSU Pthreads no seu sistema, fa ca o seguinte: 1. Execute ./configure no diret orio threads/src e selecione a op c ao SCO OpenServer. Este comando copia Makefile.SCO5 para Makefile. 2. Execute make.
162
3. Para instalar no diret orio padr ao /usr/include, use o usu ario root, depois mude para o diret orio thread/src e execute make install 6. Lembre de usar o GNU make quando estiver construindo o MySQL. 7. Se voc e n ao iniciou o mysqld_safe como root, voc e provavelmente s o ir a obter, por padr ao, os 110 arquivos abertos por processo. O mysqld ir a gravar uma nota sobre isto no arquivo log. 8. Com o SCO 3.2V5.0.5, voc e deve usar o FSU Pthreads vers ao 3.5c ou mais nova. Voc e deve tamb em usar o gcc 2.95.2 ou mais novo. O seguinte comando configure deve funcionar: shell> ./configure --prefix=/usr/local/mysql --disable-shared 9. Com SCO 3.2V4.2, voc e deve usar FSU Pthreads vers ao 3.5c ou mais nova. O seguinte comando configure deve funcionar: shell> CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \ ./configure \ --prefix=/usr/local/mysql \ --with-named-thread-libs="-lgthreads -lsocket -lgen -lgthreads" \ --with-named-curses-libs="-lcurses" Voc e pode ter alguns problemas com alguns arquivos de inclus ao. Neste caso, voc e pode encontrar novos arquivos de inclus ao espec icos do SCO em http://www.mysql.com/Downloads/SCO/SCO-3.2v4.2-includes.tar.gz. Voc e deve descompactar este arquivo no diret orio include da sua arvore fonte do MySQL. Notas de desenvolvimento SCO: O MySQL deve detectar automaticamente FSU Pthreads e ligar o mysqld com lgthreads -lsocket -lgthreads. As bibliotecas de desenvolvimento SCO s ao re-entrantes nas FSU Pthreads. A SCO diz que suas bibliotecas de fun c oes s ao re-entrantes, ent ao elas devem ser re-entrantes com as FSU-Pthreads. FSU Pthreads no OpenServer tentam usar o esquema SCO para criar bibliotecas re-entrantes. FSU Pthreads (ao menos a vers ao em http://www.mysql.com) vem ligada com GNU malloc. Se voc e encontrar problemas com uso de mem oria, tenha certeza que o gmalloc.o esteja inclu ido em libgthreads.a e libgthreads.so. Na FSU Pthreads, as seguintes chamadas de sistema s ao compat iveis com pthreads: read(), write(), getmsg(), connect(), accept(), select() e wait(). O CSSA-2001-SCO.35.2 (O patch e listado de costume como patch de seguran ca erg711905-dscr remap ver 2.0.0) quebra FSU threads e deixa o mysqld inst avel. Voc e deve remove-lo se voc e deseja executar o mysqld em uma m aquina OpenServer 5.0.6. A SCO fornece Patches do Sistema Operacional em ftp://ftp.sco.com/pub/openserver5 para OpenServer 5.0.x
A SCO fornece corre c oes de seguran ca e libsocket.so.2 em ftp://ftp.sco.com/pub/security/OpenSer e ftp://ftp.sco.com/pub/security/sse para OpenServer 5.0.x
163
com a libsocket.so.2 e libresolv.so.1 com instru c oes para instalar em sistemas preOSR506. provavelmente uma boa id E eia para instalar os patches acima tentando compilar/usar o MySQL. Se voc e deseja instalar o DBI no SCO, voc e deve editar o Makefile em DBI-xxx e cada subdiret orio. Note que o exemplo abaixo considera o gcc 2.95.2 ou mais novo: OLD: CC = cc CCCDLFLAGS = -KPIC -W1,-Bexport CCDLFLAGS = -wl,-Bexport LD = ld LDDLFLAGS = -G -L/usr/local/lib LDFLAGS = -belf -L/usr/local/lib LD = ld OPTIMISE = -Od NEW: CC = gcc CCCDLFLAGS = -fpic CCDLFLAGS = LD = gcc -G -fpic LDDLFLAGS = -L/usr/local/lib LDFLAGS = -L/usr/local/lib LD = gcc -G -fpic 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 e porque o carregador din amico Perl n ao ir a carregar os m odulos DBI se elas foram compiladas com icc ou cc. Perl trabalha melhor quando compilado com cc.
164
165
166
http://servers.digitaldaze.com/extensions/perl/modules.html#modules Procure sob o t itulo Installing New Modules that Require Locally Installed Modules.
167
Se voce receber os seguintes erros de DBD-mysql, voc e provavelmente est a usando gcc (ou usando um bin ario antigo compilado com gcc): /usr/bin/perl: cant resolve symbol __moddi3 /usr/bin/perl: cant resolve symbol __divdi3 Adicione -L/usr/lib/gcc-lib/... -lgcc ao comando de liga c ao quando a biblioteca mysql.so estiver constru ida (verique a sa ida de make para mysql.so quando voc e compilar o cliente Perl). A op c ao -L deve especicar o caminho do diret orio onde libgcc.a est a localizada no seu sistema. Outra causa deste problema pode ser que Perl e o MySQL n ao s ao compilados com gcc. Neste caso, voc e pode resolver o problema compilando ambos com gcc. Se voc e receber o seguinte erro de DBD-mysql quando executar o teste: t/00base............install_driver(mysql) failed: Cant 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. signica que voc e precisa adicionar a biblioteca compactada, -lz, a sua linha de liga c ao. Isto pode ser feito com a seguinte altera c ao no arquivo lib/DBD/mysql/Install.pm: $sysliblist .= " -lm"; Altere esta linha para: $sysliblist .= " -lm -lz"; Depois disto, voc e deve executar make realclean e proceder com o instala c ao desde o in icio. Se voc e quiser usar o m odulo Perl em um sistema que n ao suporta liga c ao din amica (como SCO) voc e pode gerar uma vers ao est atica do Perl que inclui DBI e DBD-mysql. O modo que isto funciona e que voc e gera uma vers ao do Perl com o codigo DBI ligado e instalado no topo do seu Perl atual. Entao voc e o utiliza para construir uma vers ao do Perl que adicionalmente tem o c odigo DBD ligado em si, e instale-o. No SCO, voc e deve ter as seguintes vari aveis de ambiente conguradas: 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 odulo DBI ligado estaticamente executando estes comandos no diret orio onde a sua distribui c ao DBI est a localiada: shell> perl Makefile.PL -static -config shell> make shell> make install shell> make perl Ent ao voc e deve intalar o novo Perl. A sa ida de make perl indicar a o comando make exato que voc e precisar a executar para realizar a instala c ao. No SCO, isto e make -f Makefile.aperl inst_perl MAP_TARGET=perl.
168
A seguir use o Perl r ecem criado para criar outro Perl que tamb em inclui uma DBD::mysql estaticamente ligado rodando estes comandos no diret orio onde sua distribui c ao DBD-mysql est a localizada: shell> perl Makefile.PL -static -config shell> make shell> make install shell> make perl Finalmente voc e deve instalar este novo Perl. Novamente, a sa ida de make perl indica o comando a usar.
169
170
Algumas instala c oes MySQL permitem aos usu arios de se conectarem como usu arios an onimos ao servidor executando na m aquina local. Se isto e o caso na sua m aquina, voc e deve conseguir conectar ao servidor chamando o mysql sem qualquer op c ao: shell> mysql Depois de voc e conectar com sucesso, voc e pode disconectar a qualquer hora digitando QUIT (ou \q) no prompt mysql>: mysql> QUIT Bye No Unix, voc e tamb em pode desconectar pressionando Control-D. A maioria dos exemplos nas se c oes seguintes assumem que voc e j a est a conectado ao servidor. Isto e indicado pelo prompt mysql>.
171
O mysql mostra quantas linhas foram retornadas e quanto tempo a consulta levou para executar, o que lhe d a uma vaga id eia da performance do servidor. Estes valores s ao impreciso porque eles representam tempo de rel ogio (N ao tempo de CPU ou de m aquina), e porque eles s ao afetados pelos fatores como a carga do servidor e lat encia de rede. (Para resumir, a linha rows in set n ao e mostrada nos exemplos seguintes deste cap itulo.) Palavras Chave podem ser entradas em qualquer caso de letra. As seguintes consultas s ao equivalentes: mysql> SELECT VERSION(), CURRENT_DATE; mysql> select version(), current_date; mysql> SeLeCt vErSiOn(), current_DATE; Aqui est a outra consulta. Ela demonstra que voc e pode usar o mysql como uma calculadora simples: mysql> SELECT SIN(PI()/4), (4+1)*5; +-------------+---------+ | SIN(PI()/4) | (4+1)*5 | +-------------+---------+ | 0.707107 | 25 | +-------------+---------+ As consultas mostradas at e agora t em sido instru c oes relativamente pequenas, de uma linha. Voc e pode tamb em entrar com m ultiplas instru c oes em uma u nica linha. Basta nalizar 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 ao necessita estar todo em uma u nica linha, ent ao comandos extensos que necessitam de v arias linhas n ao s ao um problema. O mysql determina onde sua instru c ao termina atrav es do ponto e v irgula terminador, e n ao pelo nal da linha de entrada. (Em outras palavras, o myqsl aceita entradas de livre formato: Ele coleta linhas de entrada mas n ao as executa at e chegar o ponto e v irgula.) Aqui est a uma instru c ao simples usando m ultiplas linhas: mysql> SELECT -> USER() -> , -> CURRENT_DATE; +--------------------+--------------+
172
| USER() | CURRENT_DATE | +--------------------+--------------+ | joesmith@localhost | 1999-03-18 | +--------------------+--------------+ Neste exemplo, note como o prompt altera de mysql> para -> depois de voc e entrar a primeira linha de uma consulta com m ultiplas linhas. Isto e como o mysql indica que ainda n ao achou uma instru c ao completa e est a esperando pelo resto. O prompt e seu amigo, porque ele fornece um retorno valioso. Se voc e usa este retorno, voc e sempre estar a ciente do que o mysql est a esperando. Se voc e decidir que n ao deseja executar um comando que est a no meio do processo de entrada, cancele-o digitando \c: mysql> SELECT -> USER() -> \c mysql> Note o prompt aqui tamb em. Ele troca para o mysql> depois de voc e digitar \c, fornecendo retorno para indicar que o mysql est a pronto para um novo comando. A seguinte tabela mostra cada dos prompts que voc e pode ver e resume o que ele signica sobre o estado em que o mysql se encontra: Prompt Signicado mysql> Pronto para novo comando. -> Esperando pela pr oxima linha de comando com m ultiplas linhas. > Esperando pela pr oxima linha, coletando uma string que comece com uma aspas simples (). "> Esperando pela pr oxima linha, coletando uma string que comece com aspas duplas ("). > Esperando pela pr oxima linha, coletando uma string que comece com crase (). E muito comum instru c oes multi-linhas ocorrerem por acidente quando voc e pretende publicar um comando em uma u nica 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 e (acha que entrou uma instru c ao mas a u nica resposta e um prompt ->), o mais prov avel e que o mysql est a esperando pelo ponto e v irgula. Se voc e n ao perceber o que o prompt est a lhe dizendo, voc e pode parar por um tempo antes de entender o que precisa fazer. Entre com um ponto e v irgula para completar a instru c ao, e o mysql ir a execut a-la: mysql> SELECT USER() -> ; +--------------------+ | USER() | +--------------------+ | joesmith@localhost | +--------------------+
173
O prompt > e "> ocorrem durante a coleta de strings. No MySQL, voc e pode escrever strings utilizando os caracteres ou " (por exemplo, hello ou "goodbye"), e o mysql permite a entrada de strings que consomem m ultiplas linhas. Quando voc e ver um prompt > ou ">, signica que voc e digitou uma linha contendo uma string que come ca com um caracter de aspas ou " mas ainda n ao entrou com a aspas que termina a string. Isto e bom se voc e realmente est a entrando com uma string com m ultiplas linhas, mas qual e a probalidade disto acontecer ? N ao muita. Geralmente, os prompts > e "> indicam que voc e, por algum descuido, esqueceu algum caracter de aspas. Por exemplo: mysql> SELECT * FROM minha_tabela WHERE nome = "Smith AND idade < 30; "> Se voc e entrar esta senten ca SELECT, apertar ENTER e esperar pelo resultado, nada ir a acontecer. Em vez de se perguntar o porqu e desta query demorar tanto tempo, perceba a pista fornecida pelo prompt ">. Ele lhe diz que o mysql espera pelo resto de uma string n ao terminada. (Voc e ve o erro na declara c ao? Falta a segunda aspas na string "Smith.) O que fazer neste ponto ? A coisa mais simples e cancelar o comando. Entretanto, voc e n ao pode simplesmente digitar \c neste caso, porque o mysql o intrerpreta como parte da string que est a coletando! Digite o caracter de aspas para fechar (ent ao o mysql sabe que voc e fechou a string), ent ao digite \c: mysql> SELECT * FROM minha_tabela WHERE nome = "Smith AND idade < 30; "> "\c mysql> O prompt volta para mysql>, indicando que o mysql est a pronto para um novo comando. O prompt > e similar aos prompts > e ">, mas indica que voc e come cou mas n ao completou um identicados citado com o sinal de crase. importante saber o que os prompts >, "> e > signicam, porque se voc E e entrar sem querer com uma string sem termina c ao, quaisquer linhas seguintes que forem digitadas ser ao ignoradas pelo mysql incluindo uma linha contendo QUIT! Isto pode ser um pouco confuso, especialmente se voc e n ao sabe que voc e precisa fornecer as aspas nais antes poder cancelar o comando atual.
174
O banco de dados menagerie ser a simples (deliberadamente), mas n ao e dif icil pensar em situa c oes na vida real em que um tipo similar de banco de dados pode ser usado. Por exemplo, um banco de dados deste tipo pode ser usado por um fazendeiro para gerenciar seu estoque de animais, ou por um veterin ario para gerenciar registros de seus pacientes. Uma distribui c ao do menagerie contendo algumas das consultas e dados de exemplos usados nas se c oes seguintes podem ser obtidas do site Web do MySQL. Est ao dispon 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 c ao SHOW para saber quais bancos de dados existem atualmente no servidor: mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | | tmp | +----------+ A lista de bancos de dados provavelmente ser a diferente na sua m aquina, mas os bancos de dados mysql e test provavelmente estar ao entre eles. O banco de dados mysql e necess ario porque ele descreve privil egios de acessos de usu arios. O banco de dados test e geralamente fornecido como um espa co para que os usu arios possam fazer testes. Note que voc e n ao pode ver todos os banco de dados se voc e n ai tiver o privil egio SHOW DATABASES. Veja Se c ao 4.4.1 [GRANT], P agina 255. Se o banco de dados test existir, tente acess a-lo: mysql> USE test Database changed Perceba que o USE, como o QUIT, n ao necessitam de um ponto e v irgula. (Voc e pode terminar tais declara c oes com uma ponto e v irgula se gostar; isto n ao importa) A instru c ao USE e especial em outra maneira, tamb em: Ela deve ser usada em uma u nica linha. Voc e opde usar o banco de dados test (Se voc e tiver acesso a ele) para os exemplos que seguem mas qualquer coisa que voc e criar neste banco de dados pode ser removido por qualquer um com acesso a ele. Por esta raz ao, voc e provavelmente deve pedir permiss ao ao seu administrador MySQL para usar um banco de dados pr oprio. Suponha que voc eo 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 ario_mysql e o nome do usu ario MySQL atribuido a voc e e your_client_ host e a m aquina da qual voc e se conecta ao servidor.
175
mysql> CREATE DATABASE menagerie; No Unix, nomes de bancos de dados s ao caso sensitivo (ao contr ario das palavras chave SQL), portanto voc e deve sempre fazer refer encia ao seu banco de dados como menagerie e n ao Menagerie, MENAGERIE ou outra varia c ao. Isto tamb em e verdade para nomes de tabelas. (No Windows, esta restri c ao n ao se aplica, entiretanto voc e deve referenciar os bancos de dados e tabelas usando o mesmo caso em toda a parte da consulta.) Criar um bancos de dados n ao o seleciona para o uso; voc e deve fazer isso de forma expl 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 u nica vez, mas voc e deve selecion a-lo para o uso cada vez que voc e iniciar uma se c ao mysql. Voc e pode fazer isso usando a instru c ao USE como visto no exemplo. Uma forma alternativa e selecionar o banco de dados na linha de comando quando voc e chamar o mysql. Apenas especique seu nome depois de qualquer par ametro de conex ao que voc e pode precisar fornecer. Por exemplo: shell> mysql -h servidor -u usuario -p menagerie Enter password: ******** Perceba que menagerie n ao e sua senha no comando mostrado. Se voc e precisar passar sua senha na linha de comando depois da op c ao -p, voc e deve faz e-lo sem usar espa cos (por exemplo, -pminhasenha e n ao como em -p minhasenha). Entretando, colocando sua senha na linha de comando n ao e recomendado, porque isto exp oe sua senha permitindo que outro usu ario utilize a sua m aquina.
176
Voc e pode usar o banco de dados para tarefas como gerar lembretes para anivers arios que est ao chegando. (Se voc e pensa que este tipo de query e algo bobo, perceba que e a mesma quest ao que voc e perguntar no contexto de um banco de dados comercial para identicar clientes para quais voc e precisar a enviar cart ao de anivers ario, para um toque pessoal assistido pelo computador.) Voc e pode calcular a idade em rela c ao a outras datas diferente da data atual. Por exemplo, se voc e armazenar a data da morte no banco de dados, voc e poder a facilmente calcular qual a idade que o bicho tinha quando morreu. Voc e provavelmente pode pensar em outros tipos de informa c oes que poder ao ser u teis na tabela pet, mas as identicadas at e o momento s ao sucientes por agora: nome(name), dono(owner), esp ecie(species), sexo(sex), data de nascimento(birth) e data da morte(death). Utilize a sente ca CREATE TABLE para especicar o layout de sua tabela: mysql> CREATE TABLE pet (nome VARCHAR(20), owner VARCHAR(20), -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE); VARCHAR e uma boa escolha para os campos name, owner, e species porque os valores da coluna s ao de tamanho vari avel. Os tamanhos destas colunas n ao precisam necess ariamente de ser os mesmos e n ao precisam ser 20. Voc e pode escolher qualquer tamanho de 1 a 255, o que voc e achar melhor. (Se voc e n ao zer uma boa escolha e depois precisar de um campo maior, o MySQL fornece o comando ALTER TABLE.) O sexo dos animais podem ser representados em v arias formas, por exemplo, "m" e "f" ou mais simples usar os caracteres "m" e "f". mesmo "macho" e "f^ emea". E O uso do tipo de dados DATE para as colunas birth e death s ao obviamente a melhor escolha. Agora que voc e criou uma tabela, a instru c ao SHOW TABLES deve produzir alguma sa ida: mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | pet | +---------------------+ Para vericar se sua tabela foi criada da forma que voc e esperava, utilize a instru c ao 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 e pode usar DESCRIBE a qualquer hora, por exemplo, se voc e esquecer os nomes das colunas na sua tabela ou de que tipos elas t em.
177
1995-07-29
Como voc e est a come cando com uma tabela vazia, uma forma simples de povo a-la e criar um arquivo texto contendo uma linha para cada um de seus animais, e depois carregar o conte udo do arquivo para a tabela com uma simples instru c ao. Voc e pode criar um arquivo texto pet.txt contendo um registro por linha, com valores separado por tabula c oes e na mesma ordem em que as colunas foram listadas na instru c ao CREATE TABLE. Para valores em falta (como sexo desconhecido ou data da morte para animais que ainda est ao vivos), voc e pode usar valores NULL. Para represent a-lo em seu arquivo texto, use \N (barra invertidam N maiusculo). Por exemplo, o registro para Whistler the bird podem parecer com isto (onde o espa co em branco entre os valores e um simples caractere de tabula c ao): name owner Whistler Gwen species sex birth bird \N 1997-12-09 death \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 e pode especicar o valor do separador de colunas e o marcador de nal de linha explicitamente na instru c ao LOAD DATA se voc e desejar. Mas os valores omitidos s ao sucientes para a instru c ao ler o arquivo pet.txt corretamente. Se a instru c ao falhar, e desej avel que a sua instala c ao do MySQL n ao tenha a capacidade do arquivo local habilitada por padr ao. Veja Se c ao 4.3.4 [LOAD DATA LOCAL], P agina 232 para informa c oes sobre como alterar isto. Quando voc e desejar adicionar novos registros um a um, a instru c ao INSERT e usada. Na sua forma mais simples, voc e fornece valores para cada coluna, na ordem em que as colunas foram listadas na instru c ao CREATE TABLE. Suponha que Diane tenha um novo hamster chamado Puball. Voc e pode adicionar um registro utilizando uma instru c ao INSERT desta forma: mysql> INSERT INTO pet -> VALUES (Puffball,Diane,hamster,f,1999-03-30,NULL);
178
Perceba que os valores de string e datas s ao especicados aqui como strings com aspas. Com o INSERT voc e tamb em pode inserir NULL diretamente para representar um valor em falta. N ao pode ser usado \N como voc e fez com LOAD DATA. A partir deste exemplo, voc e dever a perceber que existem v arias outras formas envolvidas para carregar seus registros inicialmente utilizando diversas instru c oes INSERT do que uma simples instru c ao LOAD DATA.
179
Entretanto, se voc e zer isto, voc e tamb em deve refazer a entrada para Puball. Corrigir somente o registro errado com uma instru c ao UPDATE: mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser"; O UPDATE altera apenas o registro em quest ao e n ao exige que voc e recarregue a tabela.
180
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 encia que OR. Se voc e usar ambos os operadores, e uma otima id eia usar par enteses para indicar explicitamente quais condi c oes devem ser agrupadas: mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m") -> OR (species = "dog" AND sex = "f"); +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
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 e pode usar uma cl ausula WHERE para combinar sele c ao de registros com sele c ao de colunas. Por exemplo, para obter a data de nascimento somente dos gatos e cachorros, utilize esta query: mysql> SELECT name, species, birth FROM pet -> WHERE species = "dog" OR species = "cat"; +--------+---------+------------+ | name | species | birth | +--------+---------+------------+ | Fluffy | cat | 1993-02-04 | | Claws | cat | 1994-03-17 | | Buffy | dog | 1989-05-13 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 | +--------+---------+------------+
182
| 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 c ao como qualquer outra opera c ao de compara c ao e normalmente realizada no modo caso insensitivo. Isto signica que a ordem ser a indenida para colunas que s ao id enticas exceto quanto ao caso da letra. Voc e pode for car uma ordena c ao em caso senitivo para uma coluna usando a coer c ao BINARY: ORDER BY BINARY(campo). A ordena c ao padr ao e crescente, com os valores menores em primeiro. Para ordena c ao na ordem reversa, adicione a palavra chave DESC (descendente) ao nome da coluna que deve ser ordenada: mysql> SELECT name, birth FROM pet ORDER BY birth DESC; +----------+------------+ | name | birth | +----------+------------+ | Puffball | 1999-03-30 | | Chirpy | 1998-09-11 | | Whistler | 1997-12-09 | | Slim | 1996-04-29 | | Claws | 1994-03-17 | | Fluffy | 1993-02-04 | | Fang | 1990-08-27 | | Bowser | 1989-08-31 | | Buffy | 1989-05-13 | +----------+------------+ Voc e pode ordenar por m ultiplas colunas e voc e pode classicar colunas em dire c oes diferentes. 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 |
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 ao afeta a ordena c ao da coluna species.
184
-> (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 ida por age em vez de name, e s o utilizar uma cl ausua ORDER BY diferente: 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 ao os animais, conra se o valor de death n ao e NULL. Depois para estes com valores n ao-NULL, compute a diferen ca entre os valores dos campos death e birth: mysql> SELECT name, birth, death, -> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5)) -> AS age -> FROM pet WHERE death IS NOT NULL ORDER BY age; +--------+------------+------------+------+ | name | birth | death | age |
185
+--------+------------+------------+------+ | Bowser | 1989-08-31 | 1995-07-29 | 5 | +--------+------------+------------+------+ A consulta usa death IS NOT NULL em vez de death != NULL porque NULL e um valor especial que n ao pode ser comparada usando operadores comuns de compara c ao. Isto ser a explicado depois. Veja Se c ao 3.3.4.6 [Working with NULL], P agina 186. E se voc e desejar saber quais animais fazem anivers ario no pr oximo m es? Para este tipo de c alculo, ano e dia s ao irrelevantes; voc e simplesmente deseja extrair a parte do m es da coluna birth. O MySQL fornece diversas fun c oes para extrair partes da data, como em YEAR(), MONTH() e DAYOFMONTH(). MONTH e a fun c ao apropriada aqui. Para ver como ela funciona, execute uma consulta simples que mostre o valor de birth e MONTH(birth): mysql> SELECT name, birth, MONTH(birth) FROM pet; +----------+------------+--------------+ | name | birth | MONTH(birth) | +----------+------------+--------------+ | Fluffy | 1993-02-04 | 2 | | Claws | 1994-03-17 | 3 | | Buffy | 1989-05-13 | 5 | | Fang | 1990-08-27 | 8 | | Bowser | 1989-08-31 | 8 | | Chirpy | 1998-09-11 | 9 | | Whistler | 1997-12-09 | 12 | | Slim | 1996-04-29 | 4 | | Puffball | 1999-03-30 | 3 | +----------+------------+--------------+ Encontrar animais com an ivers ario no pr oximo m es tamb em e f acil. Suponha que o m es atual e abril. Ent ao o valor do m es e 4 e voc e procura por animais nascidos em Maio (m es 5) assim: mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5; +-------+------------+ | name | birth | +-------+------------+ | Buffy | 1989-05-13 | +-------+------------+ Existe uma pequena complica c ao se o m es atual e Dezembro, e claro. Voc e n ao pode apenas adicionar um para o n umero do m es (12) e procurar por animais nascidos no m es 13, porque n ao existe tal m es. O certo seria procurar por animais nascidos em Janeiro (m es 1). Voc e pode tamb em escrever uma consulta para que funcione sem importar qual e o m es atual. Assim voc e n ao t em quee usar um n umero de m es em particular na consulta. DATE_ ADD() permite adicionar um intervalo de tempo para uma data fornecida. Se voc e adicionar um m es para o valor de CURDATE, ent ao extrair a parte do m es com MONTH(), o resultado e o m es no qual voc e deseja procurar por anivers arios: mysql> SELECT name, birth FROM pet -> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(), INTERVAL 1 MONTH));
186
Uma maneira diferente para realizar a mesma tarefa e adicionar 1 para obter o m es seguinte ao atual (depois de usar a fun c ao m odulo (MOD) para o valor do m es retornar 0 se ele for 12): mysql> SELECT name, birth FROM pet -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1; Perceba que MONTH retorna um n umero entre 1 e 12. E MOD(alguma_coisa,12) retorna um n umero entre 0 e 11. Ent ao a adi c ao tem que ser feita depois do MOD(), sen ao ir iamos de Novembro (11) para Janeiro (1).
187
A combina c ao de padr oes SQL lhe permite voc e usar _ para coincidir qualquer caractere simples e % para coincidir um n umero arbitr ario de caracteres (incluindo zero caracter). No MySQL, padr oes SQL s ao caso insensitivo por padr ao. Alguns exemplos s ao vistos abaixo. Perceba que voc e n ao usa = ou != quando usar padr oes SQL; use os operadores de compara c ao LIKE ou NOT LIKE neste caso. Para encontrar nomes come cando com b: 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 nal 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 ancias do caracter _: mysql> SELECT * FROM pet WHERE name LIKE "_____"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+ O outro tipo de combina c ao de padr oes fornecido pelo MySQL usa express oes regulares extendidas. Quando voc e testa por uma combina c ao para este tipo de padr ao, utilize os operadores REGEXP e NOT REGEXP (ou RLIKE e NOT RLIKE, que s ao sin onimos). Algumas caracter isticas das express oes regulares extendidas s ao: . combina qualquer caractere u nico
188
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 encia de caracteres utilize um tra co. [a-z] combina com qualquer letra e [0-9] combina com qualquer d igito. * combina com nenhuma ou mais inst ancias de sua preced encia. Por exemplo, x* combina com qualquer n umero de caracteres x, [0-9]* combina com qualquer n umero de d igitos e .* combina com qualquer n umero de qualquer coisa. Um padr ao REGEXP casa com sucesso se ele ocorre em algum lugar no valor sendo testado. (Ele difere do padr ao LIKE, que s o obtem suceeso se eles combinarem com todo o valor.) Para fazer com que um padr ao deva combinar com o come co ou o m de um valor sendo testado, utilize ^ no come co ou $ no nal do padr ao. Para demonstrar como express oes regulares extendidas funcionam, as consultas com LIKE mostradas acima foram reescritas abaixo usando REGEXP. Para encontrar nomes come cando com b, utilize ^ para combinar com o come co do nome: mysql> SELECT * FROM pet WHERE name REGEXP "^b"; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+ Antes da vers ao 3.23.4 do MySQL, REGEXP era caso sensitivo, e a consulta anterior n ao iria retornar nenhum registro. Neste caso, para combinar letras b mai usculas e min usculas, utilize esta consulta: mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]"; A partir do MySQL 3.23.4, se voc e realmente deseja for car uma compara c ao REGEXP com caso sensitivo, utilize a palavra-chave BINARY para tornar uma das strings em uma string bin arias. Esta consulta ir a combinar somente com bs min usculos no come co de um nome: mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b"; Para encontrar nomes nalizados com fy, utilize $ para combinar com o nal 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 | +----------+-------+---------+------+------------+------------+
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 ao regular extendida encontra padr oes coincidentes se eles ocorrem em qualquer lugar no valor comparado, n ao e necess ario utiliar, na consulta anterior, nenhum metacaracter em nenhum dos lados do padr ao para faz e-lo coincidir com todo o valor, como seria feito se fosse utilizado o padr ao SQL. Para encontrar nomes contendo exatamente cinco caracteres, utilize ^ e $ para combinar com o come co e m do nome e cinco inst ancias de . entre eles. mysql> SELECT * FROM pet WHERE name REGEXP "^.....$"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+ Voc e pode tamb em escrever a consulta anterior utilizando o operador {n} repete-n-vezes: mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
190
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 e teria uma mensagem de erro: 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 ao u teis para personalizar seus dados de diversas maneiras. Os seguintes exemplos mostram diferentes maneiras para realizar opera c oes de censo nos animais. N umero de animais por esp ecie: mysql> SELECT species, COUNT(*) FROM pet GROUP BY species; +---------+----------+ | species | COUNT(*) | +---------+----------+ | bird | 2 | | cat | 2 | | dog | 3 | | hamster | 1 | | snake | 1 | +---------+----------+ N umero de animais por sexo: mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex; +------+----------+ | sex | COUNT(*) | +------+----------+ | NULL | 1 | | f | 4 | | m | 4 | +------+----------+ (Nesta sa ida, NULL indica que o sexo e desconhecido.) N umero de animais combinando esp ecie e sexo: mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | NULL | 1 | | bird | f | 1 |
191
| cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+ N ao e necess ario selecionar uma tabela inteira quando estiver usando COUNT(). Por exemplo, a consulta anterior, quando realizada apenas procurando por cachorros e gatos, se parece com isto: 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 e desejar saber o n umero de animais por sexo somente de animais com sexo conhecido: mysql> SELECT species, sex, COUNT(*) FROM pet -> WHERE sex IS NOT NULL -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
192
Um campo para descrever o evento. Um campo com o tipo de evento, se voc e desejar classic a-los por categoria. Dadas estas considera c oes, a instru c ao CREATE TABLE para a tabela event deve se parecer com isto: mysql> CREATE TABLE event (name VARCHAR(20), date DATE, -> type VARCHAR(15), remark VARCHAR(255)); Como na tabela pet, e mais f acil carregar os registros iniciais criando um arquivo texto delimitado por tabula c oes contendo a informa c ao: name Fluy Buy Buy Chirpy Slim Bowser Fang Fang Claws Whistler date 1995-05-15 1993-06-23 1994-06-19 1999-03-21 1997-08-03 1991-10-12 1991-10-12 1998-08-28 1998-03-17 1998-12-09 type litter litter litter vet vet kennel kennel birthday birthday birthday remark 4 kittens, 3 female, 1 male 5 puppies, 2 female, 3 male 3 puppies, 3 female needed beak straightened broken rib
Gave him a new chew toy Gave him a new ea collar First birthday
Carregue os registros usando: mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event; Baseado no que voc e j a aprendeu com as consultas realizadas na tabela pet, voc e deve estar apto para realizar pesquisas na tabela event; os princ ipios s ao o mesmo. Mas quando a tabela event, sozinha, e insuciente para responder ` as suas quest oes? Suppose you want to nd 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 e deseje descobrir as idades de cada animal quando eles tiveram cria. N os vemos logo que e poss ivel calcular a idade a partir das duas datas. A idade dos lhotes est a na tabela event, mas para calcular a idade da m ae, voc e precisar a da data de nascimento dela, que est a armazenado na tabela pet. Isto signica que voc e precisar a das duas tabelas 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 |
193
+--------+------+-----------------------------+ Existem v arias coisas que devem ser percebidas sobre esta consulta: A cl ausula FROM lista as duas tabelas porque a consulta precisa extrair informa c ao de ambas. Quando combinar (unir) informa c oes de m ultiplas tabelas, voc e precisa especicar como registros em uma tabela podem ser coincididas com os registros na outra. Isto e simples porque ambas possuem uma coluna name. A consulta utiliza a cl ausula WHERE para coincidir registros nas duas tabelas baseadas nos valores de name. Como a coluna name ocorre em ambas tabelas, voc e deve especicar qual a tabela a que voc e est a se referindo. Isto e feito usando o nome da tabela antes do nome da coluna separados por um ponto (.). Voc e n ao precisa ter duas tabelas diferentes para realizar uma uni ao. Algumas vezes eu til unir uma tabela a ela mesma, se voc e deseja comparar registros em uma tabela com outros 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 emeas de acordo com as esp ecies: 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 os especicamos apelidos para os nomes das tabelas para conseguir referenciar ` as colunas e manter com qual inst ancia da tabela cada coluna de refer encia est a associdada.
194
Se voc e ainda n ao selecionou nenhum banco de dados ainda, o resultado e NULL. (ou a string vazia antes do MySQL 4.1.1). Para saber quais tabelas o banco de dados atual cont em (por exemplo, quando voc e n ao tem certeza sobre o nome de uma tabela), utilize este comando: mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | event | | pet | +---------------------+ Se voc e deseja saber sobre a estrutura de uma tabela, o comando DESCRIBE eu til; ele mostra informa c oes sobre cada uma das colunas da tabela: mysql> DESCRIBE pet; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ A coluna Field (campo) indica o nome da coluna, Type e o tipo de dados para a coluna, Null indica se a coluna pode conter valores nulos (NULL), key indica se a coluna e indexada ou n ao e Default especica o valor padr ao da coluna. Se voc e tem indices em uma tabela, SHOW INDEX FROM tbl_nome traz informa c oes sobre eles.
195
Quando voc e utilizar o mysql desta forma, voc e estar a criando um arquivo script, depois executando o script. Se voc e quiser que o script continue mesmo se hopuver erros, voc e deve usar a op c ao de linha de comando --force. Por que usar um script? Existem v arias raz oes: Se voc e executa uma query repetidamente (digamos, todos os dias ou todas as semanas), transform a-lo em um script permite que voc e n ao o redigite toda vez que o executa. Voc e pode gerar novas consultas a partir das j a existentes copiando e editando os arquivos de script. O modo batch pode tamb em ser u til quando voc e estiver desenvolvendo uma consulta, particularmente para comandos de m ultiplas linhas ou sequ encias de comandos com v arias instru c oes. Se voc e cometer um erro, n ao ser a necess ario redigitar tudo. Apenas edite seu arquivo script e corrija o erro, depois diga ao mysql para execut a-lo novamente. Se voc e tem uma query que produz muita saida, voc e pode encaminhar a sa ida atrav es de um p aginador. shell> mysql < batch-file | more Voc e pode capturar a sa ida em um arquivo para processamento posterior: shell> mysql < batch-file > mysql.out Voc e pode distribuir seu script para outras pessoas para que elas possam executar os comandos tamb em. Algumas situa c oes n ao permitem uso interativo, por exemplo, quando voc e executa uma consulta atrav es de um processo autom atico (cron job). Neste caso, voc e deve usar o modo batch. A formato padr ao de sa ida e diferente (mais conciso) quando voc e executa o mysql no modo batch do que quando voc e o usa interativamente. Por exemplo, a sa ida de SELECT DISTINCT species FROM pet se parece com isto quando voc e o executa interativamente: +---------+ | species | +---------+ | bird | | cat | | dog | | hamster | | snake | +---------+ Mas ca assim quando voc e o executa no modo batch: species bird cat dog hamster snake Se voc e desejar obter o formato de sa ida interativa no modo batch, utilize mysql -t. Para mostrar a saida dos comandos que s ao executados, utilize mysql -vvv.
196
Voc e tamb em pode utilizar scripts no prompt de linha de comando mysql usando o comando source: mysql> source filename;
197
+---------+ | 4 | +---------+
3.6.2 O Registro que Armazena o Valor M aximo para uma Coluna Determinada
Encontre o n umero, fornecedor e pre co do item mais caro. No SQL ANSI isto e feito f acilmente com uma sub-consulta: SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop); No MySQL (que ainda n ao suporta sub-selects), fa ca isto em dois passos: 1. Obtenha o valor do pre co m aximo da tabela com uma instru c ao SELECT. mysql> SELECT MAX(price) FROM shop; +------------+ | MAX(price) | +------------+ | 19.95 | +------------+ 2. Usando o valor 19.95 mostrado pela consulta anterior como o pre co m aximo do artigo, 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 c ao e ordenar todos os registros por pre co de forma descendente e obtenha somente o primeiro registro utilizando a cl ausula espec ica 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 co de 19.95, a solu c ao LIMIT mostra somente um deles !
198
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 | +---------+-------+
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 | +---------+--------+-------+ Ou ltimo exemplo pode, e claro, ser feito de uma maneira mais eciente fazendo a separa c ao da coluna concatenada no cliente.
200
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 (NULL, (NULL, (NULL, INTO shirt VALUES polo, blue, LAST_INSERT_ID()), dress, white, LAST_INSERT_ID()), t-shirt, blue, LAST_INSERT_ID());
INSERT INTO person VALUES (NULL, Lilliana Angelovska); INSERT (NULL, (NULL, (NULL, (NULL, INTO shirt VALUES dress, orange, LAST_INSERT_ID()), polo, red, LAST_INSERT_ID()), dress, blue, LAST_INSERT_ID()), 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 |
201
s.* FROM person p, shirt s p.name LIKE Lilliana% s.owner = p.id s.colour <> white;
+----+-------+--------+-------+ | id | style | colour | owner | +----+-------+--------+-------+ | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | +----+-------+--------+-------+
202
O seguinte exemplo mostra como voc e pode usar as fun c oes bin arias de agrupamento para calcular o n umero de dias por m es que um usu ario tem visitado uma p agina web. CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL, day INT(2) UNSIGNED Z INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),(2000,2,23),(2000 A tabela exemplo cont em valores ano-m es-dia representando visitas feitas pelos usu arios a p agina. Para determinar quantos quantos dias diferentes em cada m es estas visitas ocorriam, 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 c ao fornecida de m es/ano, com remo c ao autom atica de entradas duplicadas.
203
linhas LAST_INSERT_ID()/mysql_insert_id() retornar a atualmente a AUTO_INCREMENT chave da primeira linha inserida. Isto permite que inser c oes multi-linhas sejam reproduzidas corretamente em outros servidores em uma congra c ao de replica c ao. Para tabelas MyISAM e BDB voc e pode especicar AUTO_INCREMENT em uma coluna secund aria 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 u til quando voc e quer colocar dados em grupos ordenados. 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 e parte de um indice multi-coluna), o valor de AUTO_INCREMENT ser a reutilizado se voc e deletar a linha com o maior valor AUTO_ INCREMENT em qualquer grupo. Isto caontece mesmo para tabelas MyISAM, para as quais os valores AUTO_INCREMENT normalmente n ao s ao reusados.)
204
e coletas de hist orico familiar. Adicionalmente, dados s ao coletados em fatores de riscos m edicos e ambientais. Mais informa c oes sobre o estudos dos g emeos pode ser encontrados em: http://www.mep.ki.se/twinreg/index_en.html A parte posterior do projeto e administrada com uma interface Web escrita utilizando a linguagem Perl e o MySQL. Cada noite todos dados das entrevistas s ao movidos para um banco de dados MySQL.
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
OR h.status = Died OR h.status = Other) ORDER BY tvid; Algumas explica c oes: CONCAT(p1.id, p1.tvab) + 0 AS tvid N queremos ordenar o id e o tvab concatenados na ordem num erica. Adicionando 0 ao resultado faz o MySQL tratar o resultado como um n umero. coluna id Esta identica um par de g emeos. Ela e uma chave em todas as tabelas. column tvab Esta identica um g emeo em um par. Ela pode ter um valor de 1 ou 2. column ptvab Esta e o inverso de tvab. Quando tvab e 1 este campo e 2 e vice versa. Ela existe para poupar digita c ao e tornar mais f acil para o MySQL otimizar a query. 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 e usado para conferir se um par de um g emeo morreu antes de 65 anos. Se for verdade, a linha n ao e retornada. Tudo acima existe em todas as tabelas com informa c oes relacionada aos g emeos. N os temos uma chave em ambos id,tvab (todas as tabelas) e id,ptvab (person_data) para tornar as consultas mais r apidas. Na nossa m aquina de produ c ao (Um UltraSPARC 200MHz), esta consulta retorna entre 150-200 linhas e gasta menos que um segundo. O n umero atual de registros nas tabelas usadas acima: Tabela Registros person_data 71074 lentus 5291 twin_project 5286 twin_data 2012 informant_data 663 harmony 381 postal_groups 100
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;
208
-b, --basedir=path Encaminho para o diret orio de instala c ao. Todos os caminhos normalmente s ao resolvidos em rela c ao a este. --big-tables Permite grandes conjuntos de resultados salvando todos os conjuntos tempor arios em um arquivo. Ele resolve a maioria dos erros table full, mas tamb em abaixa a velocidade das consultas nas quais as tabelas em mem oria seriam sucientes. Desde a Vers ao 3.23.2, o MySQL e capaz de resolver isto automaticamente usando mem oria para pequenas tabelas tempor arias e trocando para o disco as tabelas, quando for necess ario. --bind-address=IP Endere co IP para ligar. --console Grava a mensagem de erro no stderr/stdout mesmo se --log-error e especado. No Windows o mysqld n ao fechar a a tela de console se esta op c ao e usada. --character-sets-dir=path Diret orio onde est ao os conjuntos de caracteres. Veja Se c ao 4.7.1 [Conjunto de caracteres], P agina 326. --chroot=path Coloca o daemon mysqld no diretorio chroot durante a inicializa c ao. Medida de seguran ca recomendada desde o MySQL 4.0 (MySQL 3.23 n ao est a apto a fornecer um chroot 100% fechado. Limita os comandos LOAD DATA INFILE e SELECT ... INTO OUTFILE.
209
--core-file Grava um arquivo core se o mysqld morrer. Para alguns sistemas voc e deve tamb em especicar --core-file-size para mysqld_safe. Veja Se c ao 4.8.2 [mysqld_safe], P agina 332. Note que em alguns sistemas, como Solaris, voc e n ao consiguir a um arquivo core se voc e tamb em estiver usando a op c ao --user. -h, --datadir=caminho Encaminha para o diret orio raiz dos bancos de dados. --debug[...]= Se o MySQL est a congurado com --with-debug, voc e pode usar esta op c ao para obter um arquivo de rastreamento indicando o que o mysqld est a fazendo. Veja Se c ao D.1.2 [Criando arquivos trace], P agina 1071. --default-character-set=conjunto_caracter Congura o conjunto de caracteres padr ao. Veja Se c ao 4.7.1 [Conjunto de caracteres], P agina 326. --default-table-type=tipo Congura o tipo de tabela padr ao. Veja Cap ptexi tulo 7 [Tipos de tabelas], P agina 629. --delay-key-write[= OFF | ON | ALL] Como o DELAYED KEYS do MyISAM deve ser usado. [Par ametros do servidor], P agina 455. Veja Se c ao 5.5.2
--delay-key-write-for-all-tables; No MySQL 4.0.3 voc^ e deve usar --delay-key-write=ALL. N ao descarrega buers das chaves entre escritas em nenhuma tabela MyISAM. Veja Se c ao 5.5.2 [Par ametros do servidor], P agina 455. --des-key-file=filename Read the default keys used by DES_ENCRYPT() and DES_DECRYPT() from this le. --enable-external-locking (era --enable-locking) Habilita o bloqueio do sistema. Perceba que se usar esta op c ao em um sistema que n ao possui um lockd() completamente funcional (como no Linux) voc e pode fazer com que o mysqld entre em deadlock. --enable-named-pipe Habilita suporte para named pipes (somente no NT/Win2000/XP). -T, --exit-info Esta e uma m ascara bin aria com difer entes par ametros que pode ser usada para depurar o servidor mysqld; Esta op c ao n ao deve ser usada por algu em que n ao a conhe ca muito bem! --flush Atualiza todas as altera c oes no disco depois de cada comando SQL. Normalmente o MySQL s o faz a escrita de todas as altera c oes no disco depois de cada comando SQL e deixa o sistema operacional lidar com a sincroniza c ao com o disco. Veja Se c ao A.4.1 [Falhas], P agina 921.
210
-?, --help Mostra uma pequena ajuda e sai. --init-file=arquivo L e comandos SQL do arquivo especicado na inicializa c ao. -L, --language=... Mensagens de erro do cliente na l ingua especicada. Pode ser fornecido como um caminho completo. Veja Se c ao 4.7.2 [L inguas], P agina 328. -l, --log[=arquivo] Log de conex oes e consultas ao arquivo. Veja Se c ao 4.10.2 [Log de consultas], P agina 373. --log-bin=[arquivo] Registra todas as consultas que alteram dados em arquivo. Usado para backup e replica c ao. Veja Se c ao 4.10.4 [Binary log], P agina 375. --log-bin-index[=arquivo] Arquivo de indice para nomes de arquivos de log binario. Veja Se c ao 4.10.4 [Log bin ario], P agina 375. --log-error[=arquivo] Registra mensagens de erro e inicializa c ao neste arquivo. Veja Se c ao 4.10.1 [Log de erro], P agina 373. --log-isam[=arquivo] Log de todas altera c oes ISAM/MyISAM no arquivo (usado somente quando estiver depurando bancos ISAM/MyISAM). --log-long-format Registra algumas informa c oes extras nos aruivos de log (log de atualiza c oes, log bin ario de atualiza c oes e log de consultas lentas, independente de qual est a ativado). Por exemplo, nome do usu ario e timestamp s ao registrados para a consulta. Se voc e estiver usando --log-slow-queries e --log-long-format, ent ao consultas que n ao est ao usando indices s ao registradas ao log de consultas lentas. Note que --log-long-format est a obsoleto a partir do MySQL vers ao 4.1, quando --log-short-format foi introduzido (--log-long-format e a congura c ao padr ao desde a vers ao 4.1). Note tamb em que a partir do MySQL 4.1, a op c ao --log-queries-not-using-indexes est a dispon ivel para prop osito de registro de consultas que n ao usam indices para o log de consultas lentas. --log-queries-not-using-indexes Se voc e estiver usando --log-slow-queries, ent ao consultas que n ao est ao usando indices est ao registradas no log de consultas lentas. Esta op c oes est a dispon ivel a partir do MySQL 4.1. Veja Se c ao 4.10.5 [Slow query log], P agina 378. --log-short-format Registra menos informa c oes extras nos aruivos de log (log de atualiza c oes, log bin ario de atualiza c oes e log de consultas lentas, independente de qual est a
211
ativado). Por exemplo, nome do usu ario e timestamp s ao registrados para a consulta. Esta op c ao foi introduzida no MySQL 4.1. --log-slow-queries[=arquivo] Log de todas as consultas que levam mais de long_query_time segundos de execu c ao para um arquivo. Note que o padr ao para a quantidade de informa c ao registrada alterou no MySQL 4.1. Veja as op c oes --log-long-format e -log-long-format para mais detalhes. Veja Se c ao 4.10.5 [Slow query log], P agina 378. --log-update[=arquivo] Log de atualiza c oes para file.# onde # e um n umero u nico se n ao for fornecido. Veja Se c ao 4.10.3 [Log de atualiza c ao], P agina 374. O log de atualiza c ao est aobsoleto e ser a removido no MySQL 5.0; voc e deve usar o log bin ario em seu lugar (--log-bin). Veja Se c ao 4.10.4 [Log bin ario], P agina 375. A partir da vers ao 5.0, usar --log-update apenar ligar a o log bin ario. --low-priority-updates Opera c oes de altera c oes das tabelas (INSERT/DELETE/UPDATE) ir ao ter prioridade menor do que as selects. Isto tamb em pode ser feito usando {INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... para baixar a prioridade de somente uma consulta, ou SET OPTION SQL_LOW_PRIORITY_UPDATES=1 para alterar a prioridade em uma u nica thread. Veja Se c ao 5.3.2 [Bloqueio de tabelas], P agina 445. --memlock Bloqueia o processo mysqld na mem oria. Isto funciona somente se o seu sistema suportar a chamada de sistema mklockall() (como no Solaris). Isto pode ajudar se voc e tiver um problema no qual o sistema operacional faz com que o mysqld fa ca a troca em disco. Note que o uso desta op c ao exige que voc e execute o servidor como root, que normalmente n ao e uma boa id eia por raz oes de seguran ca. --myisam-recover [=op c~ ao[,op c~ ao...]]] onde op c~ ao e qualquer combina c~ ao de DEFAULT, BACKUP, FORCE ou QUICK. Voc e tamb em pode congurar isto explicitamente para "" se voc e deseja desabilitar esta op c ao. Se esta op c ao for usada, o mysqld ir a conferir na abertura se a tabela est a marcada como quebrada ou se a tabela n ao foi fechada corretamente. (A u ltima op c ao funciona somente se voc e estiver executando com --skip-locking). Se este for o caso mysqld ir a executar uma confer encia na tabela. Se a tabela estiver corrompida, o mysqld ir a tentar repar a-la. As seguintes op c oes afetam no funcionamento da repara c ao. Op c ao Descri c ao DEFAULT O mesmo que n ao fornecer uma op c ao para --myisamrecover. BACKUP Se os dados da tabela foram alterados durante a recupera c ao, salve um backup do arquivo de dados nome_tabela.MYD como nome_tabela_dia_hora.BAK. FORCE Execute a recupera c ao mesmo se perdermos mais de uma linha do arquivo .MYD.
212
QUICK
N ao conra as linhas na tabela se n ao existir nenhum bloco apagado. Antes da tabela ser reparada automaticamente, o MySQL ir a adicionar uma nota no log de erros. Se voc e desejar que a recupera c ao da maioria dos problemas n ao tenha a interven c ao de algum usu ario, devem ser usadas as op c oes BACKUP,FORCE. Isto ir a for car um reparo de uma tabela mesmo se alguns registros forem apagados, mas ele manter a o arquivo de dados antigo como um backup para que voc e possa examinar posteriormente o que aconteceu. --new A partir da vers ao 4.0.12, a op c ao --new pode ser usada para fazer o servidor se comportar como 4.1 em certos aspectos, facilitando a atualiza c ao da vers ao 4.0 para 4.1: TIMESTAMP e retornado com uma string com o formato YYYY-MM-DD HH:MM:SSS. Veja Se c ao 6.2 [Tipos de colunas], P agina 482.
--pid-file=caminho Encaminha para o arquivo pid usado pelo mysqld_safe. -P, --port=... N umero da porta para conex oes TCP/IP. -o, --old-protocol Utilize o protocolo 3.20 para compatibilidade com alguns clientes muito antigos. Veja Se c ao 2.5.5 [Atualizando a vers ao 3.20], P agina 129. --one-thread Usa somente uma thread (para depura c ao sobre Linux). Esta op c ao est a dispon ivel apenas se o servidor est a constru ido com a depura c ao habilitada. Veja Se c ao D.1 [Depurando o servidor], P agina 1070. --open-files-limit= Para alterar o n umero de descritores de arquivos dispon iveis para o mysqld. Se isto n ao estiver congurado com 0, ent ao o mysqld usar a este valor para reservar descritores de arquivos para usar com setrlimit(). Se este valor e 0 ent ao o mysqld reservar a max_connections*5 ou max_connections + table_cache*2 (que e sempre e maior) n umero de arquivos. Voc e deve tentar aumentar isto se o mysqld lhe retornar o erro Too many open les. -O, --set-variable=name=value Fornece um valor para uma vari avel. --help lista as vari aveis. Voc e pode encontrar uma descri c ao completa para todas as vari aveis na se c ao SHOW VARIABLES deste manual. Veja Se c ao 4.6.8.4 [SHOW VARIABLES], P agina 310. A se c ao de sintonia dos par ametros do servidor inclui informa c oes sobre como otimiz a-los. Por favor, note que --set-variable=name=value e -O name=value est ao obsoletos desde o MySQL 4.0, apenas use --var=op c~ ao. Veja Se c ao 5.5.2 [Server parameters], P agina 455. No MySQL 4.0.2 pode-se denir uma vari avel diretamente com --variablename=op c~ ao e set-variable n ao e mais preciso no arquivo de op c oes. Se voc e quiser restringir o valor m aximo uma op c ao de inicializa c ao pode ser denida com SET, voc e pode den i-la usando a op c ao de linha de comando --maximum-variable-name. Veja Se c ao 5.5.6 [SET OPTION], P agina 461.
213
Note que quando um valor e atribu ido a uma vari avel, o MySQL pode carrig i-lo automaticamente para permanecer dentro de uma faixa dada e tamb em ajusta o valor um pouco para corrigir para o algoritmo usado. --safe-mode Salta alguns est agios de otimiza c ao. --safe-show-database Com esta op c ao, o comando SHOW DATABASES retorna apenas aqueles bancos de dados para os quais o usu ario tem algum tipo de privil egio. Desde a vers ao 4.0.2 esta op c ao esta obsoleta e n ao faz nada (a op c ao est a habilitada por padr ao) j a que agora temos o privil egio SHOW DATABASES. Veja Se c ao 4.4.1 [GRANT], P agina 255. --safe-user-create Se isto estiver ativo, um usu ario n ao pode criar novos usu arios com o comando GRANT, se o usu ario n ao ter o privil egio de INSERT na tabela mysql.user ou em alguma coluna desta tabela. --skip-bdb Disabilita o uso de tabelas BDB. Isto economizar a mem oria e pode aumentar a velocidade de algumas opera c oes. --skip-concurrent-insert Desliga a habilidade de selecionar e inserir ao mesmo tempo em tabelas MyISAM. (Isto s o e usado se voc e achar que encontrou um erro neste recurso). --skip-delay-key-write; No MySQL 4.0.3 voc e deve usar delay-key-write=OFF. Ignore a op c ao DELAY_ KEY_WRITE para todas as tabelas. Veja Se c ao 5.5.2 [Par ametros do servidor], P agina 455. --skip-grant-tables Esta op c ao faz com que o servidor n ao use o sistema de privil egio. Isto d aa todos acesso pleno a todos os bancos de dados! (Voc e pode dizer a um servidor em execu c ao para iniciar a usar as tabelas de permiss ao novamente executando mysqladmin flush-privileges ou mysqladmin reload.) --skip-host-cache Nunca utiliza cache para nomes de m aquina para resolu c oes de nomes mais r apidos, mas pesquisa o servidor DNS em todas conex oes. Veja Se c ao 5.5.5 [DNS], P agina 460. --skip-innodb Disabilita o uso de tabelas Innodb. Isto ir a economizar mem oria, espa co em disco e aumentar a velocidade de algumas opera c oes. --skip-external-locking (era --skip-locking) N ao utilizar bloqueio de sistema. Para usar isamchk ou myisamchk voc e deve desligar o servidor. Veja Se c ao 1.2.3 [Stability], P agina 8. Perceba que na Vers ao 3.23 do MySQL pode ser usado REPAIR e CHECK para reparar/conferir tabelas MyISAM.
214
--skip-name-resolve Nomes de m aquinas n ao s ao resolvidos. Todos os valores da coluna Host nas tabelas de permiss oes devem conter n umeros IP ou localhost. Veja Se c ao 5.5.5 [DNS], P agina 460. --skip-networking N ao escutair conex oes TCP/IP. Toda intera c ao com mysqld deve ser feito atrav es de named pipes ou sockets Unix. Esta op c ao e altamente recomendada para sistemas onde requisi c oes locais s ao permitidas. Veja Se c ao 5.5.5 [DNS], P agina 460. --skip-new N ao utilizar rotinas novas, poss ivelmente erradas.
--skip-symlink Op c ao obsoleta a partir da 4.0.13; use --skip-symbolic-links em seu lugar. --symbolic-links, --skip-symbolic-links Habilita ou desabilita suporte a link simb olico. Esta op c ao tem efeitos diferentes no Windows e Unix. No Windows, habilitar links simb ilicos lhe permite estabelecer um link simb olico a um diret orio de banco de dadosi criando um arquivo directory.sym que cont em o caminho para o diret orio real. Veja Se c ao 2.6.1.2 [Links simb olicos no Windows], P agina 133. No Unix, habilitar links simb olicos, signica que voc e pode ligar uma tabela MyISAM ou um arquivo de dados em outro dirt orio com as op c oes INDEX DIRECTORY ou DATA DIRECTORY da instru c ao CREATE TABLE. Se voc e deletar ou renomear a tabela, os arquivos para o qual o link simb olico aponta tamb em ser a deletado/renomeado. --skip-safemalloc Se o MySQL e congurado com --with-debug=full, todos os programas vericam a mem oria por erros para cada opera c ao de aloca c ao e libera c ao de mem oria. Esta consist encia e muito lenta, assim para o servidor voc e pode evit a-la, quando voc e n ao precisar dela usando a op c ao --skip-safemalloc. --skip-show-database N ao permite o comando SHOW DATABASE, a menos que o usu ario tenha privil egio SHOW DATABASES. --skip-stack-trace N ao gravar os rastreamentos de pilha. Esta op c ao eu til quando voc e estiver executando o mysqld sob um depurador. El alguns sistemas voc e tamb em deve usar esta op c ao para conseguir um arquivo core. Veja Se c ao D.1 [Depurando o servidor], P agina 1070. --skip-thread-priority Desabilita o uso de prioridade das threads para um tempo de resposta mais r apido.
215
--socket=path No Unix, o arquivo socket para usar em conex oes locais no lugar do padr ao /tmp/mysql.sock. No Windows, o nome do pipe para usar em conex oes locais que usam named pipe (padr ao MySQL).
--sql-mode=value[,value[,value...]] Os valores de op c ao pode ser qualquer combina c ao de: REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, ONLY_FULL_GROUP_BY, NO_UNSIGNED_SUBTRACTION, NO_AUTO_VALUE_ON_ZERO, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_KEY_OPTIONS, NO_DIR_IN_CREATE, MYSQL323, MYSQL40, DB2, MAXDB, MSSQL, ORACLE, POSTGRESQL, ou ANSI. O valor tamb em pode car vazio (--sql-mode="") se voc e desejar limp a-la. NO_AUTO_VALUE_ON_ZERO afeta o tratamento de colunas AUTO_INCREMENT. Normalmente, voc e gera a pr oxima sequ encia de n umeros da coluna inserindo NULL ou 0 nela. NO_AUTO_VALUE_ON_ZERO omite este comportamento para 0, assim apenas NULL gera a pr oxima sequ encia de n umeros. Este modo pode ser u til se 0 foi armazenado em uma coluna AUTO_INCREMENT da tabela (isto n ao e recomendado). Por exemplo, se voc e zer um dumpo de uma tabela com mysqldump e ent ao recarreg a-la, normalmente o MySQL ira gerar uma nova sequ encia de n umeros quando encontrar valores 0, resultando em uma tabela com conte udo diferente daquele do qual foi feito o dump. Habilitando NO_AUTO_VALUE_ON_ ZERO antes de recarregar o arquivo de dump soluciona este problema. (A partir do MySQL 4.1.1, quando este valor se tornar dispon ivel, o mysqldump inclui automaticamente a saida do dump para habilitar NO_AUTO_VALUE_ON_ZERO.) Diversos dos valores de op c ao s ao usados para compatibilidade com outros servidores. Se especicado, eles fazer o servidor omitir da sa ida de SHOW CREATE TABLE aquelas partes da instru c ao que n ao s ao entendidas pelas vers oes anteriores do MySQL ou outros servidores de banco de dados. Usar estes valores de op c oes resulta em instru c oes CREATE TABLE que s ao mais port aveis para usar com outros servidores: Os valores NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_DIR_IN_CREATE, e NO_KEY_OPTIONS causam a omiss ao da tabela de op c oes, ou op c oes pertencentes a deni c ao de colunas ou indices. Os valroes MYSQL323 e MYSQL40 s ao para compatibilidade com o MySQL 3.23 e MySQL 4.0. O valor usado para compatibilidade com outros servidores s ao DB2, MAXDB, MSSQL, ORACLE, e POSTGRESQL. Estas op c oes tamb em afetam a sa ida do mysqldump, porque este programa usa SHOW CREATE TABLE para obter a instru c ao de cria c ao da tabela a qual ele inclue em sua pr opria sa ida. Diversos valores de op c oes podem ter um efeito complexo porque eles s ao atalhos para um grupo ou conjunto de valores. Por exemplo, voc e pode dizer ao servidor para executar em modo ANSI usando a op c ao --sql-mode=ansi (ou --ansi), que e equivalente a especicar ambas das seguintes op c oes de linhas de comando: --sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FUL --transaction-isolation=SERIALIZABLE
216
Note que especicar o modo ANSI desta forma tamb em tem o efeito de congurar o n ivel de isola c ao da transa c ao. Para mais informa c oes sobre executar o servidor em modo ANSI, veja Se c ao 1.8.2 [ANSI mode], P agina 42. Outros valores de grupos s ao DB2, MAXDB, MSSQL, ORACLE, e POSTGRESQL. Esepcicar qualquer um dele ativa os valores PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, e NO_KEY_OPTIONS. A op c ao --sql-mode foi adicionada no MySQL 3.23.41. O valor NO_UNSIGNED_ SUBTRACTION foi adicionado na vers ao 4.0.0. NO_DIR_IN_CREATE foi adicionado na vers ao 4.0.15. NO_AUTO_VALUE_ON_ZERO, NO_TABLE_OPTIONS, NO_FIELD_ OPTIONS, NO_KEY_OPTIONS, MYSQL323, MYSQL40, DB2, MAXDB, MSSQL, ORACLE, POSTGRESQL, e ANSI foram adicionados na vers ao 4.1.1. --temp-pool Usar esta op c ao far a com que a maioria dos arquivos tempor arios criados pelo servidor para usarem um pequeno conjunto de nomes, em vez de um u nico nome para cada novo arquivo. Isto e para contornar um problema no kernel do Linux ao tratar com a cria c ao de muitos arquivos novos com nomes diferentes. Com o comportamento antigo, o Linux parece ter perda de mem oria, j a que ela e alocada na cache de entrada do diret orio em vez da cache de disco. --transaction-isolation={ READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE } Congura o n ivel de isola c ao da transa c ao padr ao. Veja Se c ao 6.7.6 [SET TRANSACTION], P agina 618. -t, --tmpdir=path Caminho do diret orio usado para criar os arquivos tempor arios. Ele pode ser u til se o seu diret orio padr ao /tmp est a em uma parti c ao muito pequena para armazenar tabelas tempor arias. A partir do MySQL 4.1, esta op c ao aceita diversos caminhos usados do modo round-robin. Os caminhos devem ser separados por dois pontos (:) (ponto e v irgula (;) no Windows). Eles ser ao usados de acordo com o m etodo round-robin. -u, --user=[nome_usu ario | id_usu ario] Executar o servidor mysqld como o usu ario nome_usu ario ou id_us ario (num erica). (User neste contexto se refere a conta de login do sistema, n ao um usu ario MySQL listado na tabela de permiss oes.) Esta op c ao e obrigat oria quando o mysqld e iniciado como usu ario root. O servidor ir a alterar o ID do usu ario durante sua inicializa c ao, fazendo com que ele seja executado como este usu ario particular em vez de root. Veja Se c ao 4.3.2 [Security], P agina 230. A partir do MySQL 3.23.56 e 4.0.12: Para evitar um poss ivel furo na seguran ca onde um usu ario adiciona uma op c ao --user=root a algum arquivo my.cnf (fazendo o servidor executar como root, o mysqld usa apenas a primeira op c ao --user especicada e produz um aviso se houver m ultiplas op c oes --user. As op c oes em /etc/my.cnf e datadir/my.cnf s ao processadas antes de uma op c ao de linha de comando, assim e recomendado que voc e coloque uma op c ao
217
--user em /etc/my.cnf e especique um outro valor diferente de root. A op c ao em /etc/my.cnf ser a encontrada antes de qualques outra op c ao -user, o que assegura que o servidor n ao execute como root, e que um aviso seja exibido se qualquer outra op c ao --user for encontrada. -V, --version Mostra a informa c ao da vers ao e sai. -W, --log-warnings Imprime avisos como Aborted connection... no arquivo .err. E recomend avel habilitar esta op c ao, por exemplo, se voc e estiver usando replica c ao (voc e obter a a mensagem sobre o que est a acontecendo como falhas de rede e reconex oes). Veja Se c ao A.2.10 [Erros de comunica c ao], P agina 914. Esta op c ao se chamava --warnings. Pode se alterar a maioria dos valores de um servidor em execu c ao com o comnado SET. Veja Se c ao 5.5.6 [SET OPTION], P agina 461.
Windows-directory e a localiza c ao do seu diret orio Windows. No Unix, o MySQL l e op c oes padr oes dos seguintes arquivos: Nome do arquivo /etc/my.cnf DATADIR/my.cnf defaults-extra-file ~/.my.cnf Prop osito Op c oes globais Op c oes espec icas do servidor O arquivo especicado com --defaultsextra-file=# Op c oes espec icas do usu ario
DATADIR e o diret orio de dados do MySQL (normalmente /usr/local/mysql/data para instala c oes bin arias ou /usr/local/var para instala c oes de c odigo fonte). Perceba que este e o diret orio que foi especicado na hora da congura c ao, n ao o especicado com --datadir quando o mysqld inicia! (--datadir n ao tem efeito sobre o local onde o servidor procura por arquivos de op c oes, porque ele procura pelos arquivos antes de processar qualquer argumento da linha de comando.) Note que no Windows, voc e deve especicar todos os caminhos no arquivo de op c ao com / no lugar de \. Se for utilizado o \, ser a necess ario digit a-lo duas vezes, pois o \ e o caractere de escape no MySQL. O MySQL tenta ler os arquivos de op c oes na ordem listada acima. Se m ultiplos arquivos de op c oes existirem, uma op c ao especicada em um arquivo lido depois recebe a preced encia sobre a mesma op c ao especicada em um arquivo lido anteriormente. Op c oes especicadas
218
na linha de comando recebem a preced encia sobre op c oes especicadas em qualquer arquivo de op c oes. Algumas op c oes podem ser especicadas usando vari aveis de ambiente. Op c oes especicadas na linha de comando ou nos arquivos de op c ao tem precendencia sobre valores nas vari aveis de ambiente. Veja Ap endice E [Vari aveis de ambiente], P agina 1083. Os seguintes programas suportam arquivos de op c oes: mysql, mysqladmin, mysqld, mysqld_ safe, mysql.server, mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk, e myisampack. Desde a vers ao 4.0.2, voc e pode usar o prexo loose para op c oes de linha de comando (ou op c oes no my.cnf). Se uma op c ao possui o prexo loose, o programa que a ler n ao nalizar a com um erro se uma op c ao for desconhecida, mas apenas enviar a um aviso: shell> mysql --loose-no-such-option Voc e pode usar arquivos de op c oes para especicar qualquer op c ao extendida que o programa suporte! Execute o programa com --help para obter uma lista das op c oes dispon iveis. Um arquivo de op c oes pode conter linhas na seguinte forma: #comentario Linhas de coment ario iniciam com o caractere # ou ;. Coment arios podem iniciar no meio de uma linha tamb em. Linhas vazias s ao ignoradas. [grupo] grupo e o nome do programa ou grupo para o qual voc e ir a congurar as op c oes. Depois de uma linha de grupo, qualquer linha de op c~ ao ou set-variable s ao referentes ao grupo at e o nal do arquivo de op c oes ou outra linha de in icio de grupo. Isto e equivalente ` a --op c~ ao na linha de comando.
op c~ ao
op c~ ao=valor Isto e equivalente ` a --op c~ ao=valor na linha de comando. Por favor, note que voc e deve colocar um argumento entre aspas duplas, se o argumento de uma op c ao conter um caracter de coment ario. set-variable = nome=valor Isto e equivalente ` a --set-variable nome=valor na linha de comando. Por favor, notem que --set-variable est a obsoleto desde o MySQL 4.0; a partir desta vers ao os nomes das vari aveis de programa podem ser usados como nome de op c oes. Na linha de comando, use apenas --nome=valor. Em um arquivo de op c ao, use nome=valor. O grupo [client] permite especicar op c oes para todos clientes MySQL (n ao o mysqld). Este e o grupo perfeito de se usar para especar a senha que voc e usa para conectar ao servidor. (Mas tenha certeza que o arquivo de op c oes s o pode ser lido e gravado por voc e) Se voc e quiser criar op c oes que devem ser lidas por uma vers ao especica do servidor mysqld voc e pode fazer isto com [mysqld-4.0], [mysqld-4.1] etc: [mysqld-4.0] new A nova op c ao acima s o ser a usada com o vers oes 4.0.x do servidor MySQL. Perceba que para op c oes e valores, todos espa cos em branco s ao automaticamente apagados. Voc e pode usar a sequencia de escape \b, \t, \n, \r, \\ e \s no valor da string (\s == espa co).
219
Aqui est a um t ipico arquivo de op c oes globais. [client] port=3306 socket=/tmp/mysql.sock [mysqld] port=3306 socket=/tmp/mysql.sock set-variable = key_buffer_size=16M set-variable = max_allowed_packet=1M [mysqldump] quick Aqui est a um t ipico arquivo de op c oes do usu ario [client] # A senha seguinte ser a enviada para todos clientes MySQL password="minha_senha" [mysql] no-auto-rehash set-variable = connect_timeout=2 [mysqlhotcopy] interactive-timeout Se voc e tem uma distribui c ao fonte, voc e encontrar a arquivos de exemplo de congura c ao chamados my-xxxx.cnf no diret orio support-files. Se voc e tem uma distribui c ao bin aria olhe no diret orio de instala c ao DIR/support-file, onde DIR e o caminho para o diret orio de instala c ao (normalmente C:\mysql ou /usr/local/mysql). Atualmente existem arquivos de congura c ao para sistemas pequenos, m edios, grandes e enormes. Voc e pode copiar my-xxxx.cnf para seu diret orio home (renomeie a c opia para .my.cnf para experimentar. Todos os programas MySQL que suportam arquivos de op c oes aceitam op c oes: Op c ao Descri c ao --no-defaults N ao l e nenhum arquivo de op c oes. --print-defaults Imprima o nome do programa e todas op c oes. --defaults-file=caminho-paraUtilize somente o arquivo de congura c ao esarquivo-padr~ ao pec icado. --defaults-extra-file=caminhoLeia este arquivo de congura c ao depois do arpara-arquivo-padr~ ao quivo de congura c ao global mas antes do arquivo de congura c ao do usu ario. Perceba que as op c oes acima devem vir primeiro na linha de comando para funcionar, com exce c ao que --print-defaults deve ser usado logo depois dos comandos --defaults-file ou --defaults-extra-file. Notas para desenvolvedores: O tratamento de arquivos de op c oes e implementado simplesmente processando todos as op c oes coincidentes (isto e, op c oes no grupo apropriado) antes
220
de qualquer argumento da linha de comando. Isto funciona bem para programas que usam au ltima inst ancia de uma op c ao que e especicada diversas vezes. Se voc e tem um programa antigo que trata op c oes especicadas v arias vezes desta forma mas n ao l e arquivos de op c oes, voc e s o precisa adicionar duas linhas para lhe dar esta capacidade. Verique o c odigo fonte de qualquer um dos clientes MySQL padr ao para ver como fazer isto. Nos scripts shell voc e pode usar o comando my_print_defaults para analisar os arquivos de op c ao. O seguinte exemplo mostar a sa ida que my_print_defaults pode produzir quando quando pedido para mostrar as op c oes encontradas nos grupos [client] e [mysql]: shell> my_print_defaults client mysql --port=3306 --socket=/tmp/mysql.sock --no-auto-rehash
221
--log-error=path --log-isam=path --bdb-logdir=path Se voc e quiser mais desempenho, voc e tamb em pode especicar as seguinte op c oes diferentemente para cada servidor para distribuir a carga entre v arios discos f isicos: --tmpdir=path --bdb-tmpdir=path Normalmente, cada servidor tamb em deve usar um diret orio de dados diferentes, que e especicado usando a op c ao --datadir=path. AVISO: Normalmente voc e nunca deve ter dois servidores que atualizam dados no mesmo banco de dados! Isto pode levar a supresas inesperadas se seu o seu sistema operacionaln ao suporta lock de sistema a prova de falhas, isto pode provocar surpresas indesej aveis! Se (apesar deste aviso) voc e executar diversos servidores usando o mesmo diret orio de dados e eles tiverem com o log habilitado, voc e usar as op c oes apropriadas para especicar os nomes dos arquivos de log que s ao u nicos em cada servidor. Sen ao, o servidores podem tentar gravar no mesmo arquivo de log. Este aviso contra o compartilhamento de arquivos de dados entre servidores tamb em se aplica em um ambeinte NFS. Permitir v arios servidores MySQL acessarem um diret orio de IDEIA ! dados comum sobre NFS, e normalmente uma MA O primeiro problema e que o NFS se tornar a um gargalo, tornando o sistema lento. Ele n ao se destina para este tipo de uso. Outro risco com NFS e que voc e ter a que conseguir um modo de se certicar que dois ou mais servidores n ao est ao interferindo uns com os outros. Normalmente o lock de arquivo e tratado pelo daemon lockd, mas no momento n ao existe nenhuma plataforma que fara o locck 100% de seguran ca, em todas as situa c oes. Facilite a sua vida: esque ca sobre compartilhar um diret orio de dados entre servidores sobre NFS. A solu c ao melhor e ter um computador com um sistema operacional que manipule threads de forma eciente threads e tenha diversas CPUs nele. Se voc e tiver m ultiplas instala c oes do MySQL em diferentes locais, normalemente voc e pode especicar o diret orio de instala c ao base de cada servidor com a op c ao --basedir=caminho para fazer que cada servidor use diferentes diret orios de dados, arquivos de log e arquivos PID. (O padr ao para todos estes valores s ao determinados em rela c ao ao diret orio base.) Neste caso, as u nicas outras op c oes que voc e precisa especicar s ao as op c oes --socket e -port. Por exempo, suponha que voc e instalou a vers ao bin aria do MySQL (arquivos .tar) em diferentes locais, assim voc e pode iniciar o servidor usando o comando ./bin/mysqld_ safe sob o diret orio base correspondente de cada instala c ao. mysqld_safe determinar aa op c ao --basedir apropriada para passar para mysqld, e voc e precisa especicar apenas as op c oes --socket e --port para o mysqld_safe. Como discutido nas se c oes a seguir, e poss ivel iniciar servidores adicionais congurando vari aveis de ambiente ou especicando as op c oes de linha de comando apropriada. No entanto, se voc e precisa executar m ultiplos servidores em uma base mais permanente, ser a mais coonveniente usar os arquivos de op c oes para especicar, para cada servidor, aquelas op c oes que devem ser u nicas para ele. Veja Se c ao 4.1.2 [Option les], P agina 217.
222
223
[mysqld] datadir = C:/mydata1 port = 3307 enable-named-pipe socket = mypipe1 Est ao inicie o servidor desta forma: shell> mysqld-nt --defaults-file=C:\my-opts1.cnf C:\my-opts2.cnf seria modicado de forma parecida para uso com o segundo servidor.
224
basedir = C:/mysql-4.0.8 port = 3307 enable-named-pipe socket = mypipe1 # op c~ oes para o servi co mysql2 [mysqld2] basedir = C:/mysql-4.0.17 port = 3308 enable-named-pipe socket = mypipe2 Instale os servi cos como a seguir, usando o caminho completo para o servidor para assegurar que o Windows registra o programa execut avel correto para cada servi co: shell> C:\mysql-4.0.8\bin\mysqld-nt --install mysqld1 shell> C:\mysql-4.0.17\bin\mysqld-nt --install mysqld2 Para iniciar os servi cos, use o gerenciador de servi cos, ou use NET START com o nome de servi co apropriado: shell> NET START mysqld1 shell> NET START mysqld2 Para parar os servi cos, use o gerenciador de servi cos, ou use NET STOP com o mesmo nome de servi co. shell> NET STOP mysqld1 shell> NET STOP mysqld2 Nota: Antes do MySQL 4.0.17, apenas um servidor instalado usando o nome de servi co padr ao (MySQL) ou instalado com um nome de servi co de mysqld ir a ler o grupo [mysqld] no arquivo de op c oes padr ao. A partir da vers ao 4.0.17, todos os servidores l eem o grupo [mysqld] se eles l eem o arquivo de op c oes padr ao, mesmo de esles est ao instalados usando outro nome de servi co. Isto permite que voc e use o grupo [mysqld] para op c oes que devam ser usadas por todos os servi cos MySQL, e um grupo de op c ao com o nome de cada servi co para o uso do servidor com aquele nome de servi co. Especique as op c oes para cada servidor em arquivos separados e use --defaultsfile quando instalar os servi cos para dizer para cada servidor que arquivo usar. Neste caso, cada arquivo deve listar as op c oes usando um grupo [mysqld]. Com esta abordagem, para especicar as op c oes para o mysqld-nt 4.0.8, crie um arquivo C:\my-opts1.cnf que se pare ca com: [mysqld] basedir = C:/mysql-4.0.8 port = 3307 enable-named-pipe socket = mypipe1 Para o mysqld-nt 4.0.17, crie um arquivo C:\my-opts2.cnf que se pare ca com: [mysqld] basedir = C:/mysql-4.0.17 port = 3308
225
enable-named-pipe socket = mypipe2 Instale o servi co como indicado a seguir (digite cada comando em uma u nica linha): shell> C:\mysql-4.0.8\bin\mysqld-nt --install mysqld1 --defaults-file=C:\my-opts1.cnf shell> C:\mysql-4.0.17\bin\mysqld-nt --install mysqld2 --defaults-file=C:\my-opts2.cnf Para usar uma op c ao --defaults-file quando instalar um servidor MySQL como um servi co, voc e deve anteceder a op c ao com o nome do servi co. Depois de instalarm, inicie e para os servi cos do mesmo modo que no exemplo anterior. Para remover v arios servi cos, use mysqld --remove para cada um, especicando um nome de servi co depois da op c ao --remove se o servi co a ser removido tiver um nome difertente do padr ao.
226
N ao e necess ario compilar um novo servidor MySQL apenas para iniciar com uma arquivo socket ou n umero de porta TCP/IP diferentes. Tamb em e poss ivel especicar estes valores em tempo de execu c ao. Um modo de faz e-lo e usando as op c oes de linha de comando: shell> /path/to/mysqld_safe --socket=file_name --port=port_number Para usar outro diret orio de banco de dados para o segundo servidor, passe uma op c ao --datadir=caminho para o mysqld_safe. Um outro modo de conseguir este efeito e usar as vari aveis de ambiente para congurar o nome do socket e o n umero da porta: shell> shell> shell> shell> shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock MYSQL_TCP_PORT=3307 export MYSQL_UNIX_PORT MYSQL_TCP_PORT scripts/mysql_install_db bin/mysqld_safe &
Este e um modo r apido para iniciar um segundo servidor para teste. O bom deste m etodo e que a congura c ao das vari aveis de ambiente se aplicar ao a qualquer programa cliente que voc e chame da shell acima. Assim, as conex oes para estes clientes ser ao automaticamente direcionadas para o segundo servidor! Ap endice E [Vari aveis de ambiente], P agina 1083 inclue uma lista de outras vari aveis de ambiente que voc e pode usar e que afetam o mysqld. Para a execu c ao automatica do servidor, seu script de inicializa c ao que e executado no tempo de boot deve executar o seguinte comando uma vez para cada servidor com um caminmho apropriado do arquivo de op c ao para cada comando: mysqld_safe --defaults-file=path-to-option-file Cada arquivo de op c ao deve conter valores espec icos para um dados servidor. No Unix, o script mysqld_multi e outro modo de de iniciar v arios servidores. Se c ao 4.8.3 [mysqld_multi], P agina 334. Veja
227
No Unix, congure as vari aveis de ambiente MYSQL_UNIX_PORT e MYSQL_TCP_PORT para apontar para o socket Unix e porta TCP/IP antes de iniciar seus clientes. Se voc e normalmente utiliza uma porta ou socket espec ico, voc e pode colocar os comandos para congurar as vari aveis de ambiente no arquivo .login, assim eles ser ao aplicados sempre quer voc e logar no sistema. Veja Ap endice E [Environment variables], P agina 1083. Especique o socket e porta TCP/IP padr oes no grupo [clients] de um arquivo de op c oes. Por exemplo, voc e pode usar C:\my.cnf no WIndows ou o arquivo .my.cnf em seu diret orio home no Unix. Veja Se c ao 4.1.2 [Option les], P agina 217. Em um programa C, voc e pode especicar os argumentos de porta ou socket na chamada de mysql_real_connect(). Voc e tamb em pode ter o programa lendo de um arquivo de op c oes chamando mysql_options(). Veja Se c ao 12.1.3 [C API functions], P agina 780. Se voc e estiver usando o m odulo Perl DBD::mysql voc e pode ler as op c oes dos arquivos de op c oes do MySQL. Por exemplo: $dsn = "DBI:mysql:test;mysql_read_default_group=client;" . "mysql_read_default_file=/usr/local/mysql/data/my.cnf"; $dbh = DBI->connect($dsn, $user, $password); Veja Se c ao 12.5.2 [Perl DBI Class], P agina 877.
228
Aprenda o sistema de controle de acessos do MySQL. Os comandos GRANT e REVOKE s ao usados para controlar o acesso ao MySQL. N ao conceda mais privil egios do que o necess ario. Nunca conceda privil egios para todas as m aquinas. Checklist: Tente mysql -u root. Se voc e conseguir conectar com sucesso ao servidor sem a solicita c ao de uma senha, voc e tem problemas. Qualquer um pode conectar ao seu servidor MySQL como o usu ario root com privil egios plenos! Revise as instru c oes de instala c ao do MySQL, prestando aten c ao particularmente ao item sobre congura c ao da senha do usu ario root. Utilize o comando SHOW GRANTS e conra para ver quem tem acesso a o que. Remova aqueles privil egios que n ao s ao necess arios utilizando o comando REVOKE. N ao mantenha nenhuma senha de texto puro no seu banco de dados. Quando seu computador ca comprometido, o intruso pode obter a lista completa de senhas e utiliz a-las. Utilize a fun c ao MD5(), SHA1() ou qualquer fun c ao de embaralhamento de via u nica. N ao escolha senhas de dicion arios. Existem programas especiais para quebr a-las. Mesmo senhas como xsh98 n ao sao boas. Muito melhor seria duag98 que cont em a mesma palavra sh mas digitada uma letra a esquerda em um teclado QWERTY convencional. Outro m etodo seria usar Mhall que e obtido dos primeiros caracteres de cada palavra na frase Mary has a litle lamb. Isto e f acil de lembrar e digitar, mas diculta que algu em que n ao a conhe ca a advinhe. Invista em um rewall. Ele protege voc e de pelo menos 50% de todos os tipos de exploits em qualquer software. Coloque o MySQL atr as do rewall ou em uma zona desmilitarizada (DMZ). Checklist: Tente examinar suas portas da Internet utilizando alguma ferramenta como o nmap. O MySQL utiliza a porta 3306 por padr ao. Esta porta n ao deve ser acess ivel para m aquinas n ao con aveis. Outra maneira simples para conferir se sua porta do MySQL est a aberta ou n ao e tentar o seguinte comando de alguma m aquina remota, onde nome_m aquina e o nome da m aquina ou o endere co IP de seu servidor MySQL: shell> telnet nome_m aquina 3306 Se voc e obter uma conex ao e alguns caracteres, a porta est a aberta e deve ser fechada no seu rewall ou roteador, a menos que voc e realmente tenha uma boa raz ao para mant e-la aberta. Se o telnet apenas parar ou a conex ao for recusada, tudo est a bem; a porta est a bloqueada. N ao cone em nenhum dado inclu idos pelos seus usu arios. Eles podem tentar enganar seu c odigo entrando com caracteres especiais ou sequencias de escape nos formul arios Web, URLS ou qualquer aplica c ao que voc e construa. Tenha certeza que sua aplica c ao continua segura se um usu ario entrar com algo do tipo ; DROP DATABASE mysql;. Este e um exemplo extremo, mas grandes falhas de seguran ca ou perda de dados podem ocorrer como o resultado de hackers utilizando t ecnicas similares, se voc e n ao estiver preparado para eles. Tamb em lembre de conferir dados num ericos. Um erro comum e proteger somente as strings. Em alguns casos as pessoas pensam que se um banco de dados cont em somente
229
dados dispon iveis publicamente, ele n ao precisa ser protegido. Isto n ao e verdade. No m inimo ataques do tipo denial-of-service podem ser feitos nestes bancos de dados. A maneira mais simples para proteger deste tipo de ataque e usar ap ostrofos em torno das contantes num ericas: SELECT * FROM tabela WHERE ID=234 em vez de SELECT * FROM table WHERE ID=234. O MySQL automaticamente converte esta string para um n umero e corta todos os s imbolos n ao-num ericos dela. Checklist: Todas aplica c oes Web: Tente inserir e " em todos seus formul arios Web. Se voc e obter qualquer tipo de erro do MySQL, investigue o problema imediatamente. Tente modicar qualquer URL din amica adicionando %22 ("), %23 (#) e %27 () na URL. Tente modicar os tipos de dados nas URLs din amicas de num erico para caractere contendo caracteres dos exemplos anteriores. Sua aplica c ao deve ser segura contra estes ataques e similares. Tente inserir caracteres, espa cos e s imbolos especiais no lugar de n umero nos campos num ericos. Sua aplica c ao deve remov e-los antes de pass a-los para o MySQL ou sua aplica c ao deve gerar um erro. Passar valores n ao vericados ao MySQL e extramente perigoso! Conra o tamanho dos dados antes de pass a-los ao MySQL. Considere ter sua aplica c ao conectando ao banco de dados utilizando um usu ario diferente doq ue o que e utilizado com prop ositos administrativos. N ao forne ca ` as suas aplica c oes mais privil egios de acesso do que elas necessitam. Usu arios do PHP: Conra a fun c ao addslashes(). No PHP 4.0.3, uma fun c ao mysql_escape_ string() est a dispon ivel e e baseada na fun c ao com o mesmo nome da API C do MySQL. Usu arios do API C do MySQL: Conra a chamada API mysql_escape_string(). Usu arios do MySQL: Conra os modicadores escape e quote para consultas streams. Usu arios do Perl DBI: etodo quote() ou utilize aspas simples ou duplas. Conra o m Usu arios do Java JDBC: Utilize um objeto PreparedStatement e aspas simples ou duplas. N ao transmita dados sem criptograa na Internet. Estes dados s ao acess iveis para todos que tenham o tempo e habilidade para intercept a-lo e us a-lo para seu prop osito pr oprio. No lugar, utilize um protocolo de criptograa como o SSL ou SSH. O MySQL suporta conex oes SSL interno desde a vers ao 3.23.9. O repasse de portas do SSH pode ser usado para criar um tunel criptografado (e com compress ao) para a comunica c ao.
230
Aprenda a usar os utilit arios tcpdump e strings. Para a maioria dos casos voc e pode conferir se o uxo de dados do MySQL est a ou n ao criptografado utilizando um comando parecido com este: shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings (Isto funciona sobre Linux e deve funcionar com pequenas modica c oes sob outros sistemas.) Alerta: Se voc e n ao ver dados n ao signica sempre que esteja criptografado. Se voc e necessita de alta seguran ca, voc e deve consultar um especialista em seguran ca.
231
de usu arios Unix. Para iniciar o mysqld como outro usu ario Unix, adicione uma linha user que especica o nome de usu ario para o grupo [mysqld] do arquivo de op c oes /etc/my.cnf ou o arquivo de op c oes my.cnf no diret orio de dados do servidor. Por exemplo: [mysqld] user=mysql Estas op c oes conguram o servidor para iniciar como o usu ario designado quando voc eo inicia manualmente ou usando mysqld_safe ou mysql.server. Para maiores detalhes, veja Se c ao A.3.2 [Changing MySQL user], P agina 919. N ao suportar links simb olicos para tabelas (Isto pode ser desabilitado com a op c ao -skip-symlink. Isto e muito importante caso voc e execute o mysqld como root, assim qualquer um que tenha acesso ` a escrita aos dados do diret orio do mysqld podem apagar qualquer arquivo no sistema! Veja Se c ao 5.6.1.2 [Symbolic links to tables], P agina 467. Verque se o usu ario Unix que executa o mysqld eou nico usu ario com privil egios de leitura/escrita nos diret orios de bancos de dados. N ao forne ca o privil egio PROCESS para todos os usu arios. A sa ida de mysqladmin processlits mostra as consultas atualmente em execu c ao, portanto qualquer usu ario que consiga executar este comando deve ser apto a ver se outro usu ario entra com uma consulta do tipo UPDATE user SET password=PASSWORD(n~ ao_seguro). O mysqld reserva uma conex ao extra para usu arios que tenham o privil egio process, portanto o usu ario root do MySQL pode logar e vericar a atividade do servidor mesmo se todas as conex oes normais estiverem em uso. N ao conceda o privil egio FILE a todos os usu arios. Qualquer usu ario que possua este privil egio pode gravar um arquivo em qualquer lugar no sistema de arquivos com os privil egios do daemon mysqld! Para tornar isto um pouco mais seguro, todos os arquivos gerados com SELECT ... INTO OUTFILE s ao lidos por todos, e n ao se pode sobrescrever arquivos existentes. O privil egio FILE pode tamb em ser usado para ler qualquer arquivo acess ivel para o usu ario Unix com o qual o servidor est a sendo executado. Pode ocorrer abusos como, por exemplo, usar LOAD DATA para carregar o arquivo /etc/passwd em uma tabela, que pode ent ao ser lido com SELECT. Se voc e n ao cona em seu DNS, voc e deve utilizar n umeros IP no lugar de nomes de m aquinas nas tabelas de permiss ao. De qualquer forma, voc e deve ter muito cuidado ao criar entradas de concess ao utilizando valores de nomes de m aquinas que contenham metacaractes! Se voc e deseja restrigir o n umero de conex oes para um u nico usu ario, voc e pode faze-lo congurando a vari avel max_user_connections no mysqld.
232
--safe-show-database Com esta op c ao, SHOW DATABASES retorna somente os bancos de dados nos quais o usu ario tem algum tipo de privil egio. A partir da vers ao 4.0.2 esta op c ao est a obsoleta e n ao faz nada (a op c ao est a habilitada por padr ao) j a que agora temos o privil egio SHOW DATABASES. Veja Se c ao 4.4.1 [GRANT], P agina 255. --safe-user-create Se for habilitado, um usu ario n ao consegue criar novos usu arios com o comando GRANT, se o usu ario n ao tiver privil egio de INSERT na tabela mysql.user. Se voc e desejar fornecer a um usu ario acesso para s o criar novos usu arios com privil egios que o usu ario tenha direito a conceder, voc e deve dar ao usu ario o seguinte privil egio: mysql> GRANT INSERT(user) ON mysql.user TO user@hostname; Isto ir a assegurar que o usu ario n ao poder a alterar nenhuma coluna de privil egios diretamente, mas tem que usar o comando GRANT para conceder direitos para outros usu arios. --skip-grant-tables Esta op c ao desabilita no servidor o uso do sistema de privil egios. Isto d a a todos os usu arios acesso total a todos os bancos de dados! (Voc e pode dizer a um servidor em execu c ao para para uar as tabelas de permiss oes executando mysqladmin flush-privileges ou mysqladmin reload.) --skip-name-resolve Nomes de m aquinas n ao s ao resolvidos. Todos os valores da coluna Host nas tabelas de permiss oes devem ser n umeros IP ou localhost. --skip-networking N ao permitir conex oes TCP/IP sobre a rede. Todas as conex oes para mysqld devem ser feitas via Sockets Unix. Esta op c ao n ao e possivel em sistemas que usam MIT-pthreads, porque o pacote MIT-pthreads n ao suporta sockets Unix. --skip-show-database N ao permite o comando SHOW DATABASES, a menos que o usu ario tenha o privil egio SHOW DATABASES. A partie da vers ao 4.0.2 voc e n ao deve mais precisar desta op c ao, j a que o aceesso pode agora ser concedido especicamente com o privil egio SHOW DATABASES.
233
tenha acesso de leitura (assumindo que um usu ario poderia executar qualquer comando no servidor SQL). Existem dois arquivos separados para isto: Se voc e n ao congurar o MySQL com --enable-local-infile, ent ao LOAD DATA LOCAL ser a disabilitado por todos os clientes, a menos que se chame mysql_options(... MYSQL_ OPT_LOCAL_INFILE, 0) no cliente. Veja Se c ao 12.1.3.39 [mysql_options()], P agina 805. Para o cliente de linha de comando mysql, LOAD DATA LOCAL pode ser habilitado especicado a op c ao --local-infile[=1], ou disabilitando com --local-infile=0. Por padr ao, todos os clientes e bibliotacas MySQL s ao compilados com --enable-localinfile, para ser compat ivel com o MySQL 3.23.48 e anterior. Pode se desabilitar todos os comandos LOAD DATA LOCAL no servidor MySQL iniciando o mysqld com --local-infile=0. No caso em que LOAD DATA LOCAL INFILE est a disabilitado no servidor ou no cliente, voc e receber a a seguinte mensagem de erro (1148): The used command is not allowed with this MySQL version
234
apagar uma tabela do banco de dados, o servidor se certica que voc e tem o privil egio select para a tabela ou o privil egio drop para o banco de dados. Note que se os seus privil egios s ao alterados (tanto por voc e quanto por outro) enquanto voc e est a conectado, estas altera c oes n ao ir ao necessariamente ter efeito com a sus pr oxima consulta ou consultas. Veja Se c ao 4.4.3 [Privilege changes], P agina 261 para maiores detalhes. O servidor utiliza as tabelas user, db e host no banco de dados mysql em ambos est agios do controle de acesso. Os campos nestas tabelas de permiss ao s ao detalhados abaixo: Nome da Tabela user db host Campos Escopo Campos Privil egio de Host User Password Select_priv Insert_priv Update_priv Delete_priv Index_priv Alter_priv Create_priv Drop_priv Grant_priv References_ priv Reload_priv Shutdown_ priv Process_priv File_priv Show_db_priv Super_priv Create_tmp_ table_priv Lock_tables_ priv Execute_priv Repl_slave_ priv Repl_client_ priv ssl_type ssl_cypher x509_issuer x509_cubject max_ questions Host Db User Select_priv Insert_priv Update_priv Delete_priv Index_priv Alter_priv Create_priv Drop_priv Grant_priv References_ priv Host Db Select_priv Insert_priv Update_priv Delete_priv Index_priv Alter_priv Create_priv Drop_priv Grant_priv References_ priv
de
235
max_updates max_ connections No segundo est agio do controle de acesso (verica c ao da solicita c ao), o servidor pode, se a solicita c ao involver tabelas, consultar adicionalmente as tabelas tables_priv e columns_ priv. Os campos nestas tabelas s ao mostrados abaixo: Nome da tabela Campos escopop de tables_priv Host Db User Table_name de Table_priv Column_priv Timestamp Grantor columns_priv Host Db User Table_name Column_name Column_priv Timestamp
Cada tabela de permiss oes cont em campos de escopo e campos de privil egios. Campos de escopo determinam o escopo de cada entrada nas tabelas, isto e, o contexto no qual a entrada se aplica. Por exemplo, uma entrada na tabela user com valores Host e User de thomas.loc.gov e bob devem ser usados para autenticar conex oes feitas ao servidor por bob da m aquina thomas.loc.gov. De maneira similar, uma entrada na tabela db com campos Host, User e Db de thomas.loc.gov, bob e reports devem ser usados quando bob conecta da m aquina thomas.loc.gov para acessar o banco de dados reports. As tabelas tables_priv e columns_priv contem campos de escopo indicando as combina c oes de tabelas ou tabela/coluna para o qual cada entrada se aplica. Para prop ositos de verica c ao de acessos, compara c oes de valores Host s ao caso insensitivo, valores User, Password, Db e Table_name s ao caso sensitivo. Valores Column_name s ao caso insensitivo no MySQL vers ao 3.22.12 ou posterior. Campos de privil egios indicam os privil egios concedidos por uma entrada na tabela, isto e, quais opera c oes podem ser realizadas. O servidor combina as informa c oes de v arias tabelas de concess ao para formar uma descri c ao completa dos privil egios de um usu ario. As regras usadas para fazer isto s ao descritas em Se c ao 4.3.10 [Request access], P agina 243. Campos de escopo s ao strings, declaradas como mostrado abaixo; os valores padr ao para cada e a string vazia: Nome do Campo Host User Password Db Table_name Column_name Tipo CHAR(60) CHAR(16) CHAR(16) CHAR(64) CHAR(60) CHAR(60)
236
Nas tabelas user, db e host, todos campos de privil egios s ao declarados como ENUM(N,Y) cada um pode ter um valor de N ou Y e o valor padr ao e N. Nas tabelas tables_ e columns_priv, os campos de privil egios s ao declarados como campos SET: Nome de Nome do Poss iveis elementos do conjunto tabela campo tables_priv Table_ Select, Insert, Update, Delete, priv Create, Drop, Grant, References, Index, Alter tables_priv Column_ Select, Insert, Update, priv References columns_ Column_ Select, Insert, Update, priv priv References De maneira resumida, o servidor utiliza as tabelas de permiss oes desta forma: Os campos de escopo da tabela user determinam quando permitir ou aceitar conex oes. Para conex oes permitidas, qualquer privil egio concedido em uma tabela user indica o privil egio global (superusu ario) do usu ario. Estes privil egios se aplicam a todos os bancos de dados no servidor. As tabelas db e host s ao usadas juntas: Os campos de escopo da tabela db determinam quais usu arios podem acessar determinados bancos de dados de m aquinas determinadas. Os campos de privil egios determinam quais opera c oes s ao permitidas. A tabela host e usada como uma extens ao da tabela db quando voc e quer que uma certa entrada na tabela db seja aplicada a diversas m aquinas. Por exemplo, se voc e deseja que um usu ario esteja apto a usar um banco de dados a partir de diversas m aquinas em sua rede, deixe o campo Host vazio no registro da tabela db, ent ao popule a tabela Host com uma entrada para cada uma das m aquinas. Este mecanismo e descrito com mais detalhes em Se c ao 4.3.10 [Request access], P agina 243. As tabelas tables_priv e columns_priv s ao similares ` a tabela db, por em s ao mais nas: Elas se aplicam ao nivel de tabelas e colunas em vez do nivel dos bancos de dados. Perceba que os privil egios administrativos (RELOAD, SHUTDOWN e etc) s ao especicados somente na tabela user. Isto ocorre porque opera c oes administrativas s ao opera c oes no pr oprio servidor e n ao s ao espec icas e n ao espec icas dos bancos de dados, portanto n ao existe raz ao para listar tais privil egios nas outras tabelas de permiss ao. De fato, somente a tabela user necessita ser consultada para determinar se voc e pode ou n ao realizar uma opera c ao administrativa. O privil egio FILE tamb em s o e especicado na tabela user. Ele n ao e um privil egio administrativo, mas sua habilidade para ler ou escrever arquivo no servidor e independtende do banco de dados que voc e est a acessando. O servidor mysqld le o conte udo das tabelas de permiss oes uma vez, quando e iniciado. Altera c oes nas tabelas de permiss oes tem efeito como indicado em Se c ao 4.4.3 [Alter cao de privil egios], P agina 261.
237
Quando voc e modica o conte udo das tabelas de permiss oes, e uma boa id eia ter certeza que suas altera c oes conguraram os privil egios da forma desejada. Para ajuda no diagnostico de problemas, veja Se c ao 4.3.12 [Access denied], P agina 251. Para conselhos sobre asssuntos de seguran ca, Veja Se c ao 4.3.2 [Security], P agina 230. Uma ferramenta de diagn ostico u til e o script mysqlaccess, que Yves Carlier fornece na distribui c ao MySQL. Chame mysqlaccess com a op c ao --help para descobrir como ele funciona. Perceba que o mysqlaccess confere o acesso usando somente as tabelas user, db e host. Ele n ao confere privil egios no n ivel de tabelas ou colunas.
238
SHUTDOWN SUPER
Os privil aegios SELECT, INSERT, UPDATE e DELETE permitem realizar opera c oes em registros nas tabelas existentes em um banco de dados. Instru c oes SELECT necessitam do privil egio select somente se ele precisar recuperar registros de uma tabela. Voc e pode executar certas instru c oes SELECT mesmo sem permiss ao para acessar algum dos bancos de dados no servidor. Por exemplo, voc e pode usar o cliente mysql como uma simples calculadora: mysql> SELECT 1+1; mysql> SELECT PI()*2; O privil egio INDEX permite a cria c ao ou remo c ao de indices. O privil egio ALTER permite utilizar ALTER TABLE. Os privil egios CREATE e DROP permitem a cria c ao de novos bancos de dados e tabelas, ou a remo c ao de bancos de dados e tabelas existentes. Perceba que se for concedido o privil egio DROP no banco de dados mysql para algum usu ario, este usu ario pode remover o banco de dados no qual os privil egios de acesso do MySQL est ao armazenados! O privil egio GRANT permite a voc e fornecer a outros usu arios os privil egios que voc e mesmo possui. O privil egio FILE fornece permiss ao para ler e escrever arquivos no servidor usando instru c oes LOAD DATA INFILE e SELECT ... INTO OUTFILE. Qualquer usu ario que tenha este privil egio pode ler ou gravar qualquer arquivo que o servidor MySQL possa ler ou escrever. O usu ario tamb em pode ler qualquer arquivo no diret orio de banco de dados atual. O usu ario n ao pode, no entanto, alterar qualquer arquivo existente. Os privil egios restantes s ao usados para opera c oes administrativas, que s ao realizadas utilizando o programa mysqladmin. A tabela abaixo mostra quais comandos do mysqladmin cada privil egio administrativos permite a execu c ao: Privil egio RELOAD SHUTDOWN PROCESS SUPER Comandos permitidos reload, refresh, flush-privileges, flush-hosts, flushlogs, and flush-tables shutdown processlist kill
O comando reload diz ao servidor para recarregar as tabelas de permiss oes. O comando refresh descarrega todas as tabelas e abre e fecha os arquivos de log. flush-privileges e um sin onimo para reload. Os outros comandos flush-* realizam fun c oes similares ao refresh mas s ao mais limitados no escopo e podem ser prefer iveis em alguns casos. Por exemplo, se voc e deseja descarregar apenas os arquivos log, flush-logs e uma melhor escolha do que refresh. O comando shutdown desliga o servidor. O comando processlist mostra informa c oes sobre as threads em execu c ao no servidor. O comando kill mata threads no servidor. Voc e sempre poder a mostrar ou matar suas
239
pr oprias threads, mas voc e precisa do privil egio PROCESS para mostrar e privil egio SUPER para matar threads iniciadas por outros usu arios. Veja Se c ao 4.6.7 [KILL], P agina 302. uma boa id E eia em geral conceder privil egios somente para aqueles usu arios que necessitem deles, mas voc e deve ter muito cuidado ao conceder certos privil egios: O privil egio grant permite aos usu arios repassarem seus privil egios a outros usu arios. Dois usu arios com diferentes privil egios e com o privil egio grant conseguem combinar seus privil egios. O privil egio alter pode ser usado para subverter o sistema de privil egios renomeando as tabelas. O privil egio FILE pode ser usado com abuso para ler qualquer arquivo de leitura no servidor em uma tabela de banco de dados, o conte udo pode ser acessando utilizando SELECT. Isto inclui o conte udo de todos os bancos de dados hospedados pelo servidor! O privil egio SHUTDOWN pode ser utilizado para negar inteiramente servi cos para oturos usu arios, terminando o servidor. O privil egio PROCESS pode ser usado para ver o texto das consultas atualmente em execu c ao, incluindo as consultas que conguram ou alteram senhas. Privil egios no banco de dados mysql pode ser utilizado para alterar senhas e outras informa c oes de privil egio de acesso. (Senhas s ao armazenadas criptografadas, portanto um usu ario malicioso n ao pode simplesmente l e-las para saber as senhas em texto puro). Se fosse poss ivel acessar a coluna password do banco mysql.user, seria poss ivel logar ao servidor MySQL como outro usu ario. (Com privil egios sucientes, o mesmo usu ario pode trocar a senha por outra diferente.) Existema algumas coisas que voc e n ao pode fazer com o sistem de privil egios do MySQL: Voc e n ao pode especicar explicitamente que um determinado usu ario deve ter acesso negado. Voc e n ao pode explicitamente comparar um usu ario e depois recusar sua conex ao. Voc e n ao pode especicar que um usu ario tenha privil egios para criar ou remover tabelas em um banco de dados, mas n ao possa criar ou remover o banco de dados.
240
O nome padr ao da m aquina (hostname) e localhost. O nome de usu ario padr ao e o mesmo nome do seu usu ario no Unix. Nenhuma senha e fornecida se faltar o par ametro -p. Ent ao, para um usu ario Unix joe, os seguintes comandos s ao equivalentes: shell> shell> shell> shell> mysql -h localhost -u joe mysql -h localhost mysql -u joe mysql
Outros clientes MySQL comportam-se de forma similar. Em sistemas Unix, voc e pode especicar valores padr oes diferentes para serem usados quendo voc e faz uma conex ao, assim voc e n ao precisa digit a-los na linha de comando sempre que chamar o programa cliente. Isto pode ser feito de v arias maneiras: Podem ser especicados par ametros de conex ao na se c ao [client] do arquivo de congura c ao .my.cnf no seu diret orio home. A se c ao relevante do arquivo deve se parecer com isto: [client] host=nome_m aquina user=nome_usu ario password=senha_usu ario Veja Se c ao 4.1.2 [Option les], P agina 217. Voc e pode especicar par ametros de conex ao utilizando vari aveis de ambiente. O nome de m aquina pode ser especicado para o mysql utilizando a vari avel MYSQL_HOST. O nome do usu ario MySQL pode ser especicado utilizando USER (isto e somente para Windows). A senha pode ser especicada utilizando MYSQL_PWD (mas isto n ao e seguro; veja a pr oxima se c ao). Veja Ap endice E [Vari aveis de ambiente], P agina 1083.
241
Um valor Host de % coincide com qualquer nome de m aquina. Um valor Host em branco signica que o privil egio deve ser adicionado com a entrada na tabela host que coincide com o nome de m aquina fornecido. Voc e pode encontrar mais informa c oes sobre isto no pr oximo cap itulo. Como no MySQL Vers ao 3.23, para valores Host especicados como n umeros IP, voc e pode especicar uma m ascara de rede indicando quantos bits de endere co ser ao usados para o n umero da rede. Por exemplo: mysql> GRANT ALL PRIVILEGES ON db.* -> TO david@192.58.197.0/255.255.255.0; Isto permitir a que todos a se conectarem a partir de determinado IP cuja condi c ao seguinte seja verdadeira: IP_usu ario & m ascara_rede = ip_maquina. No exemplo acima todos IPs no Intervalo 192.58.197.0 - 192.58.197.255 podem se conectar ao servidor MySQL. Metacaracteres n ao s ao permitidos no campo User, mas voc e pode especicar um valor em branco, que combina com qualquer nome. Se a entrada na tabela user que casa com uma nova conex ao tem o nome do usu ario em branco, o usu ario e considerado como um usu ario an onimo (o usu ario sem nome), em vez do nome que o cliente especicou. Isto signica que um nome de usu ario em branco e usado para todos as verica c oes de acessos durante a conex ao. (Isto e, durante o est agio 2). O campo Password pode car em branco. O que n ao signica que qualquer senha possa ser usada, signica que o usu ario deve conectar sem especicar uma senha. Valores de Password que n ao est ao em branco s ao apresentados como senhas criptografadas. O MySQL n ao armazena senhas na forma de texto puro para qualquer um ver. Em vez disso, a senha fornecida por um usu ario que est a tentando se conectar e criptografada (utilizando a fun c ao PASSWORD()). A senha criptografada e ent ao usada quando o cliente/servidor estiver conferindo se a senha e correta (Isto e feito sem a senha criptografada sempre trafegando sobre a conex ao.) Perceba que do ponto de vista do MySQL a senha criptografada e a senha REAL, portanto voc e n ao deve pass a-la para ningu em! Em particular, n ao forne ca a usu arios normais acesso de leitura para as tabelas no banco de dados mysql! A partir da vers ao 4.1, o MySQL emprega um mecanismo de senha e login diferente que e seguro mesmo se zerem um sni nos pacotes TCP/IP e/ou o banco de dados mysql e capturado. Os exemplos abaixo mostram v arias combina c oes de valores de Host e User nos registros da tabela user aplicando a novas conex oes: Valor em host thomas.loc.gov % % %.loc.gov Valor user fred fred em Conex oes casadas com o registro Qualquer usu ario, conectando de thomas.loc.gov fred, conectando a partir de qualquer m aquina Qualquer usu ario, conectando a partir de qualquer m aquina fred, conectando de qualquer m aquina do dom inio loc.gov
242
fred, conectando de x.y.net, x.y.com,x.y.edu, etc. (Isto provavelmente n ao eu til) 144.155.166.177 fred fred, conectando da m aquina com endere co IP 144.155.166.177 144.155.166.% fred fred, conectando de qualquer m aquina na subrede de classe C 144.155.166 144.155.166.0/255.255.255.0 fred o mesmo que no exemplo anterior Como voc e pode usar valores coringas de IP no campo Host (por exemplo, 144.155.166.% combina com todas m aquinas em uma subrede), existe a possibilidade que algu em possa tentar explorar esta capacidade nomeando a m aquina como 144.155.166.algumlugar.com. Para evitar tais tentativas, O MySQL desabilita a combina c ao com nomes de m aquina que iniciam com digitos e um ponto. Portanto se voc e possui uma m aquina nomeada como 1.2.foo.com, este nome nunca ir a combinar com uma coluna Host das tabelas de permiss oes. Somente um n umero IP pode combinar com um valor coringa de IP. Uma conex ao de entrada pode coincidir com mais de uma entrada na tabela user. Por exemplo, uma conex ao a partir de thomas.loc.gov pelo usu ario fred pode combinar com diversas das entradas vistas na tabela anterior. Como o servidor escolhe qual entrada usar se mais de uma coincide? O servidor resolve esta quest ao ordenando a tabela user no tempo de inicializa c ao, depois procura pelas entradas na ordem da classica c ao quando um usu ario tenta se conectar. A primeira entrada que coincidir e a que ser a usada. A ordena c ao da tabela user funciona da forma mostrada a seguir. Suponha que a tabela user se pare ca com isto: +-----------+----------+| Host | User | ... +-----------+----------+| % | root | ... | % | jeffrey | ... | localhost | root | ... | localhost | | ... +-----------+----------+Quando o servidor l e a tabela, ele ordena as entradas com os valores mais espec icos de Host primeiro (% na coluna Host signica qualquer m aquina e e menos espec ico). Entradas com o mesmo valor Host s ao ordenadas com os valores mais espec icos de User primeiro (um valor em branco na coluna User signica qualquer usu ario e e menos espec ico). O resultado da tabela user ordenada caria assim: +-----------+----------+| Host | User | ... +-----------+----------+| localhost | root | ... | localhost | | ... | % | jeffrey | ... | % | root | ... +-----------+----------+Quando uma conex ao e iniciada, o servidor procura entre as entradas ordenadas e utiliza a primeira entrada coincidente. Para uma conex ao a partir de localhost feito por jeffrey,
x.y.%
fred
243
as entradas com localhost na coluna Host coincide primeiro. Destas, a entrada com o nome do usu ario em branco combina com o nome da m aquina e o nome do usu ario. (A entrada %/jeffrey tamb em casaria, mas ela n ao e a primeira entrada coincidente na tabela. Aqui est a outro exemplo. Suponha que a tabela user fosse assim: +----------------+----------+| Host | User | ... +----------------+----------+| % | jeffrey | ... | thomas.loc.gov | | ... +----------------+----------+A tabela ordenada pareceria com isto: +----------------+----------+| Host | User | ... +----------------+----------+| thomas.loc.gov | | ... | % | jeffrey | ... +----------------+----------+Uma conex ao a partir de thomas.loc.gov feita por jeffrey coincide com a primeira entrada, no entanto, uma conex ao de whitehouse.gov fetia por jeffrey coincidiria com a segunda entrada na tabela. Um erro comum e pensar que para um determinado usu ario, todas as entradas que citam explicitamente este usu ario ser ao usadas primeiro quando o usu ario tentar encontrar uma combina c ao para a conex ao. Simplesmente isto n ao e verdade. O exemplo anterior ilustra isto, onde uma conex ao de thomas.loc.gov feita por jeffrey combina primeiro n ao com a entrada contendo jeffrey no valor do campo user, mas sim pela entrada sem o nome de usu ario! Se voc e tiver problemas conectando ao servidor, imprima a tabela user e ordene-a na manualmente para ver onde se deu o primeiro coincid encia de valores. Se a conex ao obtiver sucesso mas os seus privil egios n ao s ao os esperados, voc e pode usar a fun c ao CURRENT_ USER() (nova na vers ao 4.0.6) para ver com qual combina c ao usu ario/m aquina a sua conex ao coincide. Veja Se c ao 6.3.6.2 [CURRENT_USER()], P agina 546.
244
concede a algu em o privil egio delete, este usu ario pode apagar linhas de qualquer banco de dados no servidor! Em outras palavras, privil egios na tabela user s ao privil egios de superusu ario. O correto e conceder privil egios na tabela user apenas para superusu arios tais como os administradores de servidor ou de bancos de dados. Para outros usu arios, voc e deve deixar os privil egios na tabela user congurados para N e conceder privil egios somente em bancos de dados espec icos, utilizando as tabelas db e host. As tabelas db e host concedem privil egios para bancos de dados espec icos. Valores nos campos de escopo podem ser especicados como a seguir: Os metacaracteres % e _ podem ser usados nos campos Host e Db de ambas tabelas. Se voc e deseja usar um caracter _ como parte de um nome de banco de dados, especiqueo como \_ no comando GRANT. O valor % em Host na tabela db signica qualquer m aquina. Um valor em branco em Host na tabela db signica consulte a tabela host para informa c ao adicional. O valor % ou em branco no campo Host na tabela host signica qualquer m aquina. O valor % ou em branco no campo Db de ambas as tabelas signica qualquer banco de dados. O valor em branco no campo User em ambas tabelas coincide com o usu ario an onimo. As tabelas db e host s ao lidas e ordenadas quando o servidor inicia (ao mesmo tempo que ele l e a tabela user). A tabela db e ordenada nos campos de escopo Host, Db e User e a tabela host e ordenada nos campos de escopo Host e Db. Assim como na tabela user, a ordena c ao coloca os valores mais espec icos no in icio e os menos espec icos por u ltimo, e quando o servidor procura por entradas coincidentes, ele usa a primeira combina c ao que encontrar. As tabelas tables_priv e columns_priv concedem privil egios espec icos para tabelas e campos. Valores nos campos escopo podem ser especicados como a seguir: Os meta caracteres % e _ podem ser usados no campo Host de ambas tabelas. O valor % ou em branco no campo Host em ambas tabelas signicam qualquer m aquina Os campos Db, Table_name e Column_name n ao podem conter meta caracteres ou serem brancos em ambas tabelas. As tabelas tables_priv e columns_priv s ao ordenadas nos campos Host, DB e User. Isto e parecido com a ordena c ao da tabela db, no entanto, a ordena c ao e mais simples porque somente o campo Host pode conter meta caracteres. O processo de verica c ao da requisi c ao e descrito abaixo. (Se voc e j a est a familiarizado com o c odigo de verica c ao de acesso, voc e ir a perceber que a descri c ao aqui e um pouco diferente do algor itimo usado no c odigo. A descri c ao e equivalente ao que o c odigo realmente faz; ele s o e diferente para tornar a explica c ao mais simples.) Para requisi c oes administrativas (SHUTDOWN, RELOAD, etc.), o servidor confere somente a entrada da tabela user, porque ela eau nica tabela que especica privil egios administrativos. O acesso e concedido se o registro permitir a opera c ao requisitada ou negado caso o contr ario. Por exemplo, se voc e deseja executar mysqladmin shutdown mas a entrada em sua tabela user n ao lhe concede o privil egio SHUTDOWN, o acesso e negado mesmo sem consultar as tabelas db ou host. (elas n ao cont em o campo Shutdown_priv, portanto n ao existe esta necessidade.)
245
Para requisi c oes relacionadas aos bancos de dados (insert, udpdate, etc.), o servidor primeiro confere os privil egios globais do usu ario consultando as entradas da tabela user. Se a entrada permitir a opera c ao requisitada, o acesso e concedido. Se os privil egios globais na tabela user s ao insucientes, o servidor determina os privil egios espec icos de banco de dados para o usu ario consultando as tabelas db e host: 1. O servidor consulta a tabela db por uma combina c ao nos campos Host, Db e User. Os campos Host e User s ao comparados com o nome da m aquina e o nome do usu ario que faz a requisi c ao. O campo Db e comparado com o banco de dados que o usu ario deseja acessar. Se n ao existir entradas coincidentes para o Host e User, o acesso e negado. 2. Se existir uma combinca c ao com a entrada da tabela db e seu campo Host n ao estiver em branco, aquela entrada dene os privil egios especicos do banco de dados do usuario. 3. Se o registro coincidente da tabela db tiver o campo Host em branco, signica que a tabela host enumera quais m aquinas s ao permitidas acessar o banco de dados. Neste caso, uma consulta adicional e feita na tabela host para encontrar uma valores coincidentes nos campos Host e Db. Se nenhuma entrada na tabela host coincide, o acesso e negado. Se existir uma coincid encia, os privil egios espec icos de bancos de dados para o usu ario s ao computados como a interse c ao (n ao a uni ao!) dos privil egios nas entradas das tabelas db e host, isto e, os privil egios que s ao Y em ambas entradas. (Desta forma voc e pode conceder privil egios gerais em entradas na tabela db e ent ao restringi-los em uma base de m aquina a m aquina utilizando as entradas da tabela host.) Depois de determinar os privil egios espec icos do banco de dados concedido pelas entradas nas tabelas db e host, o servidor os adiciona aos privil egios globais concedidos pela tabela user. Se o resultado permitir a opera c ao requisitada, o acesso ser a concedido. De outra forma, o servidor consulta os privil egios de tabelas e campos do usuario nas tabelas tables_ priv e columns_priv e os adiciona aos privil egios do usu ario. O acesso ser a permitido ou negado baseado no resultado. Expresso em termos booleanos, a descri c ao precedente de como os privil egios de um usu ario s ao calculados podem ser resumido assim: global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges Ele pode n ao ser aparente porque, se os privil egios da entrada global de user s ao inicialmente insucientes para a opera c ao requisitada, o servidor adiciona estes privil egios mais tarde aos privil egios espec icos de banco de dados, tabelas e colunas. A raz ao e que uma requisi c ao pode exigir mais que um tipo de privil egio. Por exemplo, se voc e executar uma instru c ao INSERT ... SELECT, voc e precisa dos privil egios INSERT e SELECT. Seu privil egio pode ser tal que a entrada da tabela user concede um privil egio e a entrada da tabela db concede o outro. Neste caso, voc e tem os privil egios necess arios para realizar a requisi c ao, mas o servidor n ao pode obt e-los de ambas as tabelas por si pr oprio; os privil egios concedidos pelas entradas em ambas as tabelas de ser combinados. A tabela host pode ser usada para manter uma lista dos servidores seguros. Na Tcx, a tabela host cont em uma lista de todas as m aquina na rede local. A elas s ao concedidos todos os privil egios.
246
Voc e pode tamb em usar a tabela host para indicar m aquinas que n ao s ao seguras. Suponha que voc e tenha uma m aquina public.your.domain que est a localizada em uma area p ublica que voc e n ao considera segura. Voc e pode permitir o acesso a todas as m aquinas de sua rede exceto a esta m aquina usando entradas na tabela host desta forma: +--------------------+----+| Host | Db | ... +--------------------+----+| public.your.domain | % | ... (todos os privil egios configurados para N) | %.your.domain | % | ... (todos os privil egios configurados para Y) +--------------------+----+Naturalmente, voc e deve sempre testar suas entradas nas tabelas de permiss oes (por exemplo, usar o mysqlaccess para ter certeza que os privil egios de acesso est ao atualmente congurados da forma que voc e imagina.
247
A seguinte discuss ao descreve a diferen ca entre o antigo e o novo mecanismo de senha, e o que voc e deve fazer se voc e atualizar o seu servidor para a vers ao 4.1 mas precizar de manter compatibilidade com clientes pre-4.1. Nota: Esta discuss ao contrasta no comportamento da vers ao 4.1 com o comportamento da pre-4.1, mas o da vers ao 4.1 descrito aqui come ca relamente na vers ao 4.1.1. O MySQL e uma distribui c ao disferente porque ela tem um mecanismo um pouco diferente daquele implementado na 4.1.1 e acima. Diferen cas entre a vers ao 4.1.0 e as vers oes mais recentes s ao descritas posteriormente. Antes do MySQL 4.1, o hash de senha calculado pela fun c ao PASSWORD() tem tamanho de 16 bytes. Este hash se parece com: mysql> SELECT PASSWORD(mypass); +--------------------+ | PASSWORD(mypass) | +--------------------+ | 6f8c114b58f2ce9e | +--------------------+ A coluna Password da tabela user (na qual estes hashes s ao armazenados) tamb em t em 16 bytes de tamanho antes do MySQL 4.1. A partir do MySQL 4.1, a fun c ao PASSWORD() foi modicada para produzir um valor hash de 41 bytes. mysql> SELECT PASSWORD(mypass); +-----------------------------------------------+ | PASSWORD(mypass) | +-----------------------------------------------+ | *43c8aa34cdc98eddd3de1fe9a9c2c2a9f92bb2098d75 | +-----------------------------------------------+ De acordo com o mostrado, a coluna Password na tabela user tamb em deve ter 41 bytes para armazeanar estes valores. Se voc e realiza uma nova instala c ao do MySQL 4.1, a coluna Password ser a convertida para o tamanho de 41 bytes automaticamente. Se voc e atualizar uma instala c ao mais antiga para a vers ao 4.1, voc e executar o script mysql_fix_privilege_tables para atualizar o tamanho da coluna Password de 16 para 41 bytes. (O script n ao altera valores de senhas existentes, que continuam com 16 bytes.) Uma coluna Password mais larga pode armazenar hashes de senha no formato novo e no antigo. O formato de qualquer valor de hash de senha dado podeser determinado de dois modos: A diferen ca obvia e o tamanho (16 bytes versus 41 bytes) A segunda diferen ca e que os hashes de senha no novo formato sempre come cam com um caracter *, que as senhas no formato antigo nunca faziam. O formato maior do hash de senha tetm melhores propriedades criptogr acas, e a autentica c ao do cliente baseada em hashs mais longos e mais segura que aquela baseada nos antigos hashes menores.
248
A diferen ca entre os hashs de senhas menores e maiores s ao relevantes em como o servidor usa as senhas durante a autentica c ao e como ela gera hash de senhas para clientes conectados que realizam opera c oes de altera c ao de senha. O modo no qual o servidor usa o hash de senha durante a autentica c ao e afetada pela largura da coluna Password: Se a coluna n ao for larga, apenas a autentica c ao de hash curto e usada. Se a coluna e larga, ela pode guardar tanto hash curtas quanto hashs longas, e o servidor pode usar ambos os formatos: Clientes pre-4.1 podem conectar, mas como els s o conhecem o mecanismo hash antigo, eles s o podem se conectar pelas contas com hashes curtos. Clientes 4.1 podem autenticar contas com hashes longos ou curtos. Para contas com o hash curto, o processo de autentica c ao e na verdade um pouco mais seguro para clientes 4.1 que para clientes mais antigos. Em termos de seguran ca, o gradiente do menos para o mais seguro e: Clientes pre-4.1 autenticando em contas com hash de senha curto Clientes 4.1 autenticando em contas com hash de senha curto Clientes 4.1 autenticando em contas com hash de senha longo O modo no qual o servidor gera hashes de senhas para clientes conectados e afetado pela largura da coluna Password e pela op c ao --old-passwords. Um servidor 4.1 gera hashes longos apenas se certas condic oes forem encontradas: A coluna Password deve ser grande o suciente para armazenar valores longos e a op c ao --old-passwords n ao deve ser dada. Estas condi c oes se aplicam da seguinte forma: A coluna Password deve ser grande o suciente para armazenar hashes longos (41 bytes). Se a coluna n ao foi atualizada e ainda tem a largura de 16 bytes (antes da 4.1), o servidor avisa que o hash n ao pode caber nela e gera apenas hashes curtos quando um cliente realiza a opera c ao de troca de senha usando PASSWORD(), GRANT, ou SET PASSWORD. (Este comportamento ocoree se voc e tiver atualizado para a vers ao 4.1 mas n ao executou o script mysql_fix_privilege_tables para aumentar a coluna Password.) Se a coluna Password for larga, ela poder a aramazenar tanto os hashes de senha curtos quanto os longos. Neste caso, PASSWORD(), GRANT, e SET PASSWORD ir ao gerar hashes longos a menos que o servidor tenha sido iniciado com a op c ao --old-passwords. Esta op c ao for ca o servidor a gerar hashes de senha curtos. O prop osito da op c ao --old-passwords e permitir que voc e mantenha compatibilidade com clientes com vers oes anteriores ` a 4.1 sob circunst ancias nas quais os servidores gerariam hashes de senha longos. Ele n ao afeta a autentica c ao (clientes 4.1 podem ainda usar contas que possuem hash de senha longo), mas ele n ao previne a cria c oa de um hash de senha longo na tabela user como resultado de uma opera c ao de troca de senha. Onde isto ocorrer, a conta n ao mais poder a ser usada por clientes pr e-4.1. Se a op c ao --old-passwords, o seguinte cen ario e poss ivel: Um cliente antigo conecta a uma conta que t em um hash de senha curto. O cliente altera a senha das contas. Sem --old-passwords, isto resulta na conta que t em um hash de senha longo.
249
A pr oxima vez que o cliente antigo tentar se conectar ` a conta, ele n ao conseguir a, porque a conta agora exige o novo mecanismo de hash durante a autentica c ao. (Uma vez que uma conta tem um hash de senha longo na tabela de usu ario, apenas os clientes 4.1 poder ao ser autenticados, porque clientes de vers oes anteriores a 4.1 n ao entendem o hash longo.) Este cen ario mostra que e perigoso executar um servidor 4.1 sem usar a op c ao --oldpasswords, opera c oes de altera c ao de senha n ao ir ao gerar hashes de senha longos e assim n ao faz com que as contas se tornem inacess iveis para clientes mais antigos. (Estes clientes n ao podem bloquear eles mesmos inadivertidamente alterando suas senhas e cando com um hash de senha longo. A desvantagem da op c ao --old-passwords e que qualquer senha que voc e criar ou alterar usar a hashes curtos, mesmo para clientes 4.1. Assim, voc e perde a seguran ca adicional fornecida pelos hashes de senha longos. Se voc e quiser criar uma conta qye tenha um hash longo (por exemplom parr uso pelos clientes 4.1), voc e deve faz e-lo enquanto executa o servidor sem a op c ao --old-passwords. Os seguintes cen arios s ao poss iveis para executar um servidor 4.1: Cenario 1) Coluna Password menor na tabela de usu arios Apenas hashes curtos podem ser armazenados na coluna Password. O servidor usa apenas hasghes curtos durante a autentica c ao do cliente. Para clientes conectados, opera c oes de gera c ao de hash de senha envolvendo PASSWORD(), GRANT ou SET PASSWORD usa hashes curtos exclusivamebnte. Qualquer altera c ao a senha de uma conta faz com que a conta tenha um hash de senha curto. A op c ao --old-passwords pode ser usada mas e superua porque com uma coluna Password menor, o servidor ir a gerar hashes de senha curtos de qualquer forma. Cen ario 2) Colunas Password longas; servidor n ao iniciado com a op c ao --old-passwords Hashes de senha longos e curtos podem ser armazenados na coluna Password. Clientes 4.1 podem autenticar contas com hashes curtos ou longos. Clientes anteioriores ao 4.1 s o podem autenticar contas com hash curto. Para clientes conectados, opera c oes de gera c ao de hash de senha envolvendo PASSWORD(), GRANT, ou SET PASSWORD usam hashes longos exclusivamente. Qualquer mudan ca na senha de uma conta far a com que ela possua um hash de senha longo. OLD_PASSWORD() pode ser usado para gerar explicitamente um hash curto. Por exemplo, para atribuir uma senha curta a uma conta, use UPDATE da seguinte forma: mysql> UPDATE user SET Password = OLD_PASSWORD(mypass) -> WHERE Host = some_host AND User = some_user; mysql> FLUSH PRIVILEGES; Como indicado anteriormente, o perigoso neste cen ario e que e poss ivel que contas com hashes de senha curtos se tornem inacessiveis para cliente anteriores ao 4.1. Qualquer altera c ao a senha de uma conta feita via GRANT, SET PASSWORD, ou PASSWORD() faz com que a conta tenha um hash de senha longo, e a partir deste ponto, nenhum cliente anterior ao 4.1 poder a autenticar esta conta at e que ele seja atualizado para a vers ao 4.1. Cen ario 3) Coluna Password longa; servidor iniciado com a op c ao --old-passwords
250
Hashes longos e curtos podem ser armazenados na coluna Password. Clientes 4.1 podem autenticar contas que tenham hashes longos ou curtos (mas note que e poss ivel criar hashes longos apenas quando o servidor e iniciado sem --oldpasswords). Clientes anteriores ao 4.1 podem autentticar apenas contas com hashes curtos. Para clientes conectados, opera c oes de gera c ao de hash de senha envolvendo PASSWORD(), GRANT, ou SET PASSWORD usa hashes curtos exclusivamente. Qualquer altera c ao em uma senha de conta faz com que a conta tenha um hash de senha curto. Neste cen ario, voc e n ao pode criar contas que tenham hashes de senha longo, porque -old-passwords previne a cria c ao de hashes longos. Tamb em, se voc e criar uma conta com um hash longo antes de usar a op c ao --old-passwords, alterar a senha da conta enquanto --old-passwords est a funcionando faz com que seja dada a conta uma sena curta, fazendo com que ela perca os benef icios de seguran ca de um hash longo. As disvantagens para este cen ario pode ser resumido como a seguir: Cen ario 1) Voc e n ao pode tirar vantagem do hash longo que fornece mais autentica c ao segura. Cen ario 2) Contas com hashes curtos tornam clientes anteriores ao 4.1 inacess iveis se voc e alterar a senha deles sem usar OLD_PASSWORD() explicitamente. Cen ario 3) --old-passwords evita que as contas com hashes curtos se tornem inacess iveis, mas opera c oes de altera c ao de senhas fazem com que as contas com hashes longos seja revertida para hashes curtos, e voc e n ao pode alter a-las de volta para hashes longos enquanto --old-passwords est a em efeito.
251
252
Se os seus privil egios parecerem alterados no meio de uma sess ao, pode ser que o superusu ario os alterou. A recarga das tabelas de permiss oes afeta novas conex oes dos clientes, mas ela tamb em afeta conex oes existentes como indicado em Se c ao 4.4.3 [Privilege changes], P agina 261. Se voc e n ao consegue fazer a sua senha funcionar, lembre-se que voc e deve usar a fun c ao PASSWORD() se voc e congurar a senha com instru c oes INSERT, UPDATE ou SET PASSWORD. A fun c ao PASSWORD() e desnecess aria se voc e especicar a senha usando a instru c ao GRANT ... IDENTIFIED BY ou o comando mysqladmin password. Veja Se c ao 4.4.8 [Senhas], P agina 267. localhost e um sin onimo para seu nome de m aquina local, e e tamb em a m aquina padr ao em que clientes tentam se conectar se voc e n ao especicar explicitamente o nome da m aquina. Entretanto, conex oes para localhost n ao funcionam se voc e estiver executando em um sistema que utilize MIT-pthreads (conex oes localhost s ao feitas utilizando sockets Unix, que n ao s ao suportadas pelas MIT-pthreads). Para evitar este problema nestes sistemas, voc e deve utilizar a op c ao --host para nomear explicitamente o servidor. Isto far a uma conex ao TCP/IP ao servidor myssqld. Neste caso, voc e deve ter seu nome de m aquina real nos registros da tabela user no servidor. (Isto e verdadeiro mesmo se voc e estiver executando um programa cliente na mesma m aquina que o servidor.) Se voc e obter o erro Access denied quando tentando conectar ao banco de dados com mysql -u nome_usu ario _nome_bd, voc e pode ter um problema com a tabela user. Verique isto executando mysql -u root mysql e usando esta senten ca SQL: mysql> SELECT * FROM user; O resultado deve incluir uma entrada com as colunas Host e User combinando com o nome de seu computador e seu nome de usu ario no MySQL. A mensagem de erro Access denied ir a dizer a voc e com qual usu ario voc e est a tentando se logar, a m aquina que est a tentando conectar e se voc e est a utilizando uma senha ou n ao. Normalmente, voc e deve ter um registro na tabela user que combine exatamente com o nome de m aquina e o nome de usu ario que forem fornecidos na mensagem de erro. Por exemplo, se voc e obter uma mensagem de erro que contenha Using password: NO, isto signica que voc e est a tentando se conectar sem uma senha. Se voc e obter o seguinte erro quando estiver tentando conectar de uma m aquina diferente da que o servidor MySQL estiver executando, ent ao n ao deve existir um registro na tabela user que combine com esta m aquina: Host ... is not allowed to connect to this MySQL server Voc e pode corrigir isto utilizando a ferramenta de linha de comando mysql (no servidor!) para adicionar um registro ` a tabela user, db ou host para coincidir com o usu ario e nome de m aquina de onde voc e est a tentando conectar, depois execute o comando mysqladmin flush-privileges. Se voc e n ao estiver executando o MySQL Vers ao 3.22 e voc e n ao sabe o n umero IP ou o nome da m aquina da qual estiver conectando, voc e deve colocar uma entrada com o valor % na coluna Host da tabela user e reiniciar o mysqld com a op c ao --log na m aquina onde e executado o servidor. Depois tente conectar a partir da m aquina cliente, a informa c ao no log do MySQL ir a indicar como voc e est a realmente conectando. (Ent ao troque o % na tabela user com o nome da m aquina mostrado pelo log. De outra forma voc e teria um sistema que seria inseguro.)
253
Outra raz ao para este erro no Linux pode ser porque voc e est a utilizando uma vers ao bin aria do MySQL que e compilada com uma vers ao diferente da glibc que voc e est a usando. Neste caso voc e deve atualizar seu SO/Glibc ou fazer o download da vers ao fonte do MySQL e compil a-la. Um RPM fonte e, normalmente, f acil de compilar e instalar, logo, isto n ao e um grande problema. Se voc e obter uma mensagem de erro onde o nome da m aquina n ao e exibido ou, no lugar do nome da m aquina existir um IP, mesmo se voc e tenta a conex ao com um nome de m aquina: shell> mysqladmin -u root -pxxxx -h some-hostname ver Access denied for user: root@ (Using password: YES) Isto signica que o MySQL obteve algum erro quando tentava resolver o IP para um nome de maquina. Neste caso voc e pode executar mysqladmin flush-hosts para zerar o cache DNS interno. Veja Se c ao 5.5.5 [DNS], P agina 460. Algumas solu c oes permanentes s ao: Tente descobrir o que est a errado com seu servidor DNS e corrija os erros. Especique n umeros IPs no lugar de nomes nas tabelas de privil egios do MySQL. Inicie o mysqld com --skip-name-resolve. Inicie o mysqld com --skip-host-cache. Conecte ` a localhost se voc e estiver executando o servidor e o cliente na mesma m aquina. Coloque os nomes das m aquinas clientes em /etc/hosts. Se mysql -u root test funciona mas mysql -h nome_servidor -u root test resultar em Access denied, ent ao voc e pode n ao ter o nome correto para a sua m aquina na tabela user. Um problema comum e quando o valor de Host na entrada da tabela user especica um nome de m aquina n ao qualicado, mas as rotinas de resolu c ao de nomes de seu sistema retornam um nome qualicado completo do dom inio (ou viceversa). Por exemplo, se voc e tem uma entrada com o nome tcx na tabela user, mas seu DNS diz ao MySQL que o nome da m aquina e tcx.subnet.se, a entrada n ao ir a funcionar. Tente adicionar um registro ` a tabela user que contenha o n umero IP de sua m aquina como o valor da coluna Host. (Uma alternativa, seria adicionar um registro ` a tabela user com o valor de Host contendo um metacaracter, por exemplo, tcx.%. Entretanto, o uso de nomes de m aquinas terminando com % e inseguro e n ao e recomendado!) Se mysql -u nome_usu ario test funciona mas mysql -u nome_usu ario outro_bd n ao funconar, voc e n ao possui uma entrada para outro_bd listado na tabela db. Se mysql -u nome_usu ario nome_bd funciona quando executado no pr oprio servidor, mas mysql -u nome_m aquina -u nome_usu ario nome_bd n ao funciona quando executado em outra m aquina cliente, voc e n ao possui o nome da m aquina cliente listado na tabela user ou na tabela db. Se voc e n ao estiver entendendo porque obtem Access denied, remova da tabela user todas as entradas da coluna Host que contenham meta caracteres (entradas que contenham $ ou _). Um erro muito comum e inserir uma nova entrada com Host=% e User=algum usu ario, pensando que isto ir a permitir a voc e especicar localhost para conectar da mesma m aquina. A raz ao disto n ao funcionar e que os privil egios
254
padr oes incluem uma entrada com Host=localhost e User=. Como esta entrada tem o valor localhost em Host que e mais espec ica que %, ela e usada no lugar da nova entrada quando se conectar de localhost! O procedimento correto e inserir uma segunda entrada com Host=localhost e User=algum_usu ario, ou remover a entrada com Host=localhost e User= . Se voc e obter o seguinte erro, voc e pode ter um problema com a tabela db ou a tabela host: Access to database denied Se a entrada selecionada da tabela db tiver um valor vazio na coluna Host, tenha certeza que exista uma ou mais entradas correspondentes na tabela host especicando quais m aquinas aplicam-se ` a tabela db. Se voc e obter o erro quando estiver utilizando comandos SQL SELECT ... INTO OUTFILE ou LOAD DATA INFILE, a entrada na tabela user provavelmente n ao tem o privil egio le habilitado. Lembre-se que programas clientes ir ao usar par ametros de conex oes especicados em arquivos de congura c ao ou vari aveis ambientais. Veja Ap endice E [Environment variables], P agina 1083. Se parecer que algum cliente est a enviando par ametros errados para a conex ao e voc e n ao os especicou na linha de comando, verique seu ambiente e o arquivo .my.cnf no seu diret orio home. Voc e pode tamb em conferir os arquivos de congura c oes do servidor MySQL, apesar de n ao ser interessante gravar congura c oes de cliente nestes arquivos. Veja Se c ao 4.1.2 [Option les], P agina 217. Se voc e obter a mensagem de acesso negado (Access denied) quando estiver executando um cliente sem op c oes, tenha certeza que voc e n ao especicou uma senha antiga em nenhum de seus arquivos de op c oes! Veja Se c ao 4.1.2 [Option les], P agina 217. Se voc e zer altera c oes para as tabelas de permiss oes diretamente (utilizando uma instru c ao INSERT ou UPDATE) e suas altera c oes parecem ser ignoradas, lembre que voc e deve usar uma instru c ao FLUSH PRIVILEGES ou executar um comando mysqladmin flush-privileges para o servidor ler novamente as tabelas com os privil egios. De outra forma, suas altera c oes n ao far ao efeito at e que o servidor seja reiniciado. Lembrese que depois de congurar a senha de root com um comando UPDATE, n ao ser a necess ario especicar a senha at e que voc e atualize os privil egios, pois o servidor ainda n ao saber a que voc e alterou a senha! Se voc e tiver problemas de acesso com Perl, PHP, Python ou um programa ODBC, tente conectar ao servidor com mysql -u nome_usu ario nome_bd ou mysql -u nome_ usu ario -psua_senha nome_bd. Se voc e consegue conectar com o cliente mysql, existe algum problema com seu programa e n ao o acesso aos privil egios (Note que n ao espa co entre -p e a senha; voc e tamb em pode utilizar a sintaxe --password=sua_senha para especicar a senha. Se voc e utilizar a op c ao -p sozinha, o MySQL ir a lhe solicitar a senha.) Para testar, iniciae o daemon mysqld com a op c ao --skip-grant-tables. Ent ao voc e pode alterar as tabelas de permiss oes do MySQL e utilizar o script mysqlaccess para conferir se suas modica c oes zeram o n ao o efeito desejado. Quando voc e estiver satisfeito com suas altera c oes, execute mysqladmin flush-privileges para dizer ao servidor mysqld para iniciar utilizando as novas tabelas com os privil egios. Nota: Recarregar as tabelas de permiss oes sobrescreve a op c ao --skip-grant-tables. Isto
255
lhe permite dizer ao servidor para come car a utilizar as tabelas de permiss oes novamente sem reinici a-lo. Se tudo mais falhar, inicie o servidor mysqld com uma op c ao de depura c ao (por exemplo, --debug=d,general,query). Isto ir a imprimir informa c oes de m aquinas e usu arios sobre tentativas de conex oes, e tamb em informa c oes sobre cada comando disparado. Veja Se c ao D.1.2 [Making trace les], P agina 1071. Se voc e tiver outros problemas com as tabelas de permiss oes do MySQL e sente que deve enviar o problema para a lista de discuss ao, sempre forne ca um descarga das tabelas de permiss oes do seu MySQL. Voc e pode descarregar as tabelas com o comando mysqldump mysql. Como sempre, envie seus problemas utilizando o script mysqlbug. Veja Se c ao 1.7.1.3 [Bug reports], P agina 36. Em alguns casos voc e pode precisar reiniciar o mysqld com a op c ao --skip-grant-tables para executar o mysqldump.
256
N ivel dos bancos de dados Privil egios de bancos de dados aplicam-se a todas as tabelas em um determinado banco de dados. Estes privil egios s ao armazenados nas tabelas mysql.db e mysql.host. GRANT ALL ON db.* e REVOKE ALL ON db.* conceder ao e revogar ao apenas privil egios de banco de dados. N ivel das tabelas Privil egios de tabelas aplicam-se a todas as colunas em uma determinada tabela. Estes privil egios s ao armazenados na tabela mysql.tables_priv. GRANT ALL ON db.table e REVOKE ALL ON db.table conceder ao e revogar ao apenas privil egios de tabelas. N ivel das colunas Privil egios de colunas aplicam-se a uma u nica coluna em uma determinada tabela. Estes privil egios s ao armazenados na tabela mysql.columns_priv. Para as instru c oes GRANT e REVOKE, tipo_priv pode ser especicado como um dos seguintes: ALL [PRIVILEGES] ALTER CREATE CREATE TEMPORARY TABLES DELETE DROP EXECUTE FILE INDEX INSERT LOCK TABLES PROCESS REFERENCES RELOAD REPLICATION CLIENT REPLICATION SLAVE SELECT SHOW DATABASES SHUTDOWN SUPER Congura todos os privil egios simples exceto WITH GRANT OPTION Permite o uso de ALTER TABLE Permite o uso de CREATE TABLE Permite o uso de CREATE TEMPORARY TABLE Permite o uso de DELETE Permite o uso de DROP TABLE. Permite que o usu ario execute stored procedures (MySQL 5.0) Permite o uso de SELECT ... INTO OUTFILE e LOAD DATA INFILE. Permite o uso de CREATE INDEX e DROP INDEX Permite o uso de INSERT Permite o uso de LOCK TABLES em tabelas nas quais se tem o privil egio SELECT. Permite o uso de SHOW FULL PROCESSLIST Para o futuro Permite o uso de FLUSH Da o direto ao usu ario de perguntar onde o slave/master est a. Necess ario para a replica c ao dos slaves (para ler logs bin ario do master). Permite o uso de SELECT SHOW DATABASES exibe todos os banco de dados. Permite o uso de mysqladmin shutdown Permite a conex ao (uma vez) mesmo se max connections tiverem sido alcan cados e executa o comando CHANGE MASTER, KILL thread, mysqladmin debug, PURGE MASTER LOGS e SET GLOBAL Permite o uso de UPDATE Sin onimo para sem privil egios. Sin onimo para WITH GRANT OPTION
USAGE pode ser usado quando voc e quer criar um usu ario sem privil egios.
257
Os privil egios CREATE TEMPORARY TABLES, EXECUTE, LOCK TABLES, REPLICATION ..., SHOW DATABASES e SUPER s ao novos na vers ao 4.0.2. Para usar estes novos privil egios ap os atualizar para 4.0.2, voc e tem que executar o script mysql_fix_privilege_tables. Veja Se c ao 2.5.6 [Upgrading-grant-tables], P agina 130. Em vers oes anteriores do MySQL, o privil egio PROCESS d a o mesmo direitos que o novo privil egio SUPER. Para anular o privil egio grant de um usu ario, utilize o valor tipo_priv de GRANT OPTION: mysql> REVOKE GRANT OPTION ON ... FROM ...; Os u nicos valores de tipo_priv que voc e pode especicar para uma tabela s ao SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX e ALTER. Os u nicos valores de tipo_priv que voc e pode especicar para uma coluna (isto e, quando voc e usar uma cl ausula column_list) s ao SELECT, INSERT e UPDATE. O MySQL permite que voc e crie privil egios a n ivel de banco de dados mesmo se o banco de dados n ao existir para tornar f acil de se preparar para o uso do banco de dados. Atualmente, no entanto, o MySQL n ao permite criar permiss oes de a n ivel de tabela se a tabela n ao existir. O MySQL n ao revogar a automaticamente qualquer privil egio, mesmo se voc e apagar uma tabela ou banco de dados. Voc e pode congurar privil egios globais utilizando a sintaxe ON *.*. Voc e pode congurar privil egios de bancos de dados utilizando a sintaxe ON nome_bd.*. Se voc e especicar ON * e estiver com algum banco de dados aberto, ser a congurado os privil egios somente para este banco de dados. (AVISO: Se voc e especicar ON * e voc e n ao tem possui um banco de dados aberto, ir a afetar os privil egios globais!). Note por favor Os metacaracteres _ e % s ao permitidos na especica c ao dos nomes de bancos de dados em comandos GRANT. Isto signica que se voc e deseja usar um caracater _ como parte de um nome de banco de dados, voc e deve especic a-lo como \_ no comando GRANT, para prevenir o usu ario de poder acessar bancos de dados adicionais que correspondam ao padr ao do metacaracter, ex., GRANT ... ON foo\_bar.* TO .... Para acomodar concess oes de direitos para usu arios de m aquinas arbitr arias, o MySQL suporta a especica c ao do valor user_name no formato usu ario@m aquina. Se voc e desejar especicar uma string user contendo caracteres especiais (como o -), ou uma string contendo caracteres especiais ou meta caracteres (como o %), voc e pode colocar o usu ario ou o nome de m aquina entre aspas (por exemplo, usu ario-teste@m aquina-teste). Voc e pode especicar meta caracteres no nome da m aquina. Por exemplo, user@"%.loc.gov" se aplica a user para qualquer m aquina no dominio loc.gov, e user@"144.155.166.%" se aplica a user em qualquer m aquina na subrede de classe C 144.155.166. O formato simples user e sin onimo de user@"%". O MySQL n ao suporta metacaracteres em nomes de usu arios. Usu arios an onimos s ao denidos inserindo entradas com User= na tabela mysql.user ou criando um usu ario com um nome vazio com o comando GRANT. Nota: Se voc e permite o acesso de usu arios an onimos ao seu servidor MySQL, voc e deve tamb em concecder privil egios a todos os usu arios locais como user@localhost porque, de outra forma, a entrada de usu ario an onimo para a m aquina local na tabela mysql.user ser a usada quando o usu ario tentar a conex ao ao servidor MySQL da m aquina local!
258
Voc e pode vericar se isto se aplica a voc e executando a seguinte instru c ao: mysql> SELECT Host,User FROM mysql.user WHERE User=; No momento, GRANT suporta somente nomes de m aquinas, tabelas bancos de dados e colunas at e 60 caracteres. Um nome de usu ario pode ter at e 16 caracteres. Os privil egios para uma tabela ou coluna s ao formados atrav es do OU l ogico dos privil egios em cada um dos quatro niveis de privil egios. Por exemplo, se a tabela mysql.user especica que um usu ario tem um privil egio global select, isto n ao pode ser negado por uma entrada no n ivel de banco de dados, tabela ou coluna. Os privil egios para uma coluna podem ser calculados da seguinte forma: privil egios globais OR (privil egios de banco de dados AND privil egios de m aquina) OR privil egios de tabela OR privil egios de coluna Na maioria dos casos, os direitos a um usu ario s ao atribu idos em apenas um dos n iveis de privil egios, portanto a vida normalmente n ao e t ao complicada como mostrado acima. Os detalhes do procedimento de verica c ao dos privil egios s ao apresentados em Se c ao 4.3 [Sistema de privil egios], P agina 227. Se voc e concede privil egios para uma combina c ao de usu ario e m aquina que n ao existem na tabela mysql.user, um registro e adicionado e permanece l a at e ser removido com um comando DELETE. Em outras palavras, GRANT pode criar registros na tabela user, mas REVOKE n ao as remover a; para remov e-las voc e deve usar a instru c ao expl icita DELETE. Na Vers ao 3.22.12 ou posterior do MySQL, se um novo usu ario e criado ou se voc e possui privil egios de concess ao globais, a senha do usu ario ser a especicada utilizando a cl ausula IDENTIFIED BY, se uma for dada. Se o usu ario j a possui uma senha, ela e trocada pela nova. Se voc e n ao quiser enviar a senha em texto puro voc e pode usar a op c ao PASSWORD seguido de uma senha embaralhada da fun c ao SQL PASSWORD() ou da fun c ao da API C make_ scrambled_password(char *to, const char *password). CUIDADO: Se voc e criar um novo usu ario mas n ao especicar uma cl ausula IDENTIFIED BY, o usu ario n ao possuir a uma senha. Isto n ao e seguro. Senhas podem tamb em ser conguradas com o comando SET PASSWORD. Veja Se c ao 5.5.6 [SET OPTION], P agina 461. Se voc e conceder privil egios para um banco de dados, uma entrada na tabela mysql.db e criada se necess ario. Quando todos os privil egios para o banco de dados forem removidos com REVOKE, este registro e removido. Se um usu ario n ao tem privil egios em uma tabela, a tabela n ao e mostrada quando o usu ario solicita uma lista de tabelas (com a instru c ao SHOW TABLES por exemplo). O mesmo e verdade para SHOW DATABASES A cl ausula WITH GRANT OPTION d a ao usu ario habilidade de fornecer ` a outros usu arios quais quer privil egios que ele tenha em um nivel especico de privil egio. Voc e deve ter cuidado ao fornecer o privil egio grant, pois dois usu arios podem se unir para unir privil egios! MAX_QUERIES_PER_HOUR #, MAX_UPDATES_PER_HOUR # e MAX_CONNECTIONS_PER_HOUR # s ap novos no MySQL vers ao 4.0.2. Estas op c oes limitam o n umero de consultas/atualiza c oes e logins que o usu arios pode fazer durente uma hora. Se # e 0 (padr ao), ent ao isto signica que
259
n ao h a limites para aquele usu ario. Veja Se c ao 4.4.7 [Recursos do usu arios], P agina 266. Nota: para especicar qualquer destas op c oes para um usu ario existente sem adicionar outros privil egios adicionais, use GRANT USAGE ON *.* ... WITH MAX_.... Voc e n ao pode conceder a outro usu ario um privil egio que n ao possua; o privil egio GRANT possibilita fornecer somente os privil egios que possuir. Esteja ciente que quando conceder a um usu ario o privil egio GRANT em um n ivel particular de privil egios, qualquer privil egio que o usu ario j a possua (ou seja fornecido no futuro!) nesse n ivel tamb em pode ser concedido por este usu ario. Suponha que voc e conceda a um usu ario o privil egio INSERT em um banco de dados. Se voc e conceder o privil egio SELECT no banco de dados e especicar WITH GRANT OPTION, o usu ario al em de poder repassar o privil egio SELECT poder a tamb em repassar o insert. Se voc e concede o privil egio UPDATE para o usu ario no banco de dados, o usu ario poder a conceder os privil egios INSERT, SELECT e UPDATE. Voc e n ao deve conceder privil egios ALTER a um usu ario comum. Se voc e zer isto, o usu ario pode tentar enganar o sistema de privil egios renomeando tabelas! Perceba que se voc e estiver utilizando privil egios de tabelas ou colunas, mesmo que para apenas um usu ario, o servidor examina os privil egios de tabelas e colunas para todos os usu arios e isto ir a deixar o MySQL um pouco mais lento. Quando o mysqld inicia, todos os privil egios s ao lidos na mem oria. Privil egios de bancos de dados, tabelas e colunas s ao iniciados um vez, e privil egios ao n ivel de usu ario fazem efeito na pr oxima vez que o usu ario conectar. Modica c oes nas tabelas de permiss oes que voc e realiza utilizando GRANT ou REVOKE s ao percebidas pelo servidor imediatamente. Se voc e modicar as tabelas de permiss oes manualmente (utilizando INSERT, UPDATE, etc), voc e deve executar uma instru c ao FLUSH PRIVILEGES ou executar mysqladmin flush-privileges para dizer ao servidor para recarregar as tabelas de permiss oes. Veja Se c ao 4.4.3 [Privilege changes], P agina 261. As maiores diferen cas entre o padr ao SQL e vers oes MySQL de GRANT s ao: No MySQL privil egios s ao fornecidos para uma combina c ao de usu ario e m aquina e n ao somente para um usu ario. O SQL-99 n ao possui privil egios no n ivel global ou de bancos de dados, e n ao suporta todos os tipos de privil egios que o MySQL suporta. O MySQL n ao suporta os privil egios TRIGGER, EXECUTE ou UNDER do SQL-99. Os privil egios do SQL-99 s ao estruturadados em uma maneira hier arquica. Se voc e remover um usu ario, todos os privil egios do usu ario s ao removidos. No MySQL os privil egios concedidos n ao s ao removidos automaticamente, mas voc e deve remov e-los se necess ario. Se no MySQL voc e possuir o privil egio INSERT em somente parte das colunas em uma tabela, voc e pode executar instru c oes INSERT na tabela; As colunas em que voc e n ao tem o privil egio INSERT ir ao receber seus valores padr oes. O SQL-99 necessita que voc e tenha o privil egio INSERT em todas as colunas. Quando voc e remove uma tabela no SQL-99, todos os privil egios para a tabela s ao removidos. Se voc e remover um privil egio no SQL-99, todos os privil egios que foram concedidos baseado neste privil egio s ao tamb em removidos. No MySQL, privil egios s o podem ser removidos com comandos REVOKE expl icitos ou manipulando as tabelas de permiss oes do MySQL.
260
Para uma descri c ao do uso de REQUIRE, veja Se c ao 4.4.10 [Secure connections], P agina 269.
261
Em alguns sistemas, a chamada da biblioteca que e utilizada pelo MySQL para solicitar por uma senha corta automaticamente a senha para 8 caracteres. Internamente o MySQL n ao limita o tamanho limite da senha.
262
Como sua insta c ao inicialmente e parcialmente aberta, uma das primeiras coisas que voc e deve fazer e especicar uma senha para o usu ario root do MySQL. Voc e pode fazer isto como a seguir (perceba que a senha foi especicada utilizando a fun c ao PASSWORD()): shell> mysql -u root mysql mysql> SET PASSWORD FOR root@localhost=PASSWORD(nova_senha); Substitua nova_senha pela senha que voc e deseja usar. Se voc e souber o que esta fazendo, voc e tamb em pode manipular diretamente a tabela privil egios: shell> mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD(nova_senha) -> WHERE user=root; mysql> FLUSH PRIVILEGES; Outra forma de congurar a senha e utilizando o comando mysqladmin: shell> mysqladmin -u root password nova_senha Somente usu arios com acesso de escrita/atualiza c ao ao banco de dados mysql podem alterar a senha de outros usu arios. Todos os usu arios comuns (n ao os an onimos) podem alterar somente a pr opria senha com um dos comandos acima ou com SET PASSWORD=PASSWORD(nova_senha). Perceba que se voc e atualizar a senha na tabela user diretamente utilizando UPDATE, voc e deve dizer ao servidor para reler as tabelas de permiss oes (com FLUSH PRIVILEGES), de outra forma a altera c ao n ao seria noticada. Uma vez que a senha de root foi congurada, voc e deve informar a senha quando se conectar ao servidor MySQL como root. Voc e pode desejar deixar a senha de root em branco para que voc e n ao precise especic a-la quando realizar congura c oes adicionais ou testes. Entretanto, tenha certeza de congur a-la antes de utilizar sua instala c ao para qualquer ambiente de produ c ao. Veja o script scripts/mysql_install_db para ver como s ao congurados os privil egios padr oes. Voc e pode usar isto como uma base para ver como adicionar outros usu arios. Se voc e deseja que os privil egios iniciais sejam diferentes do descrito acima, e poss ivel modicar o script mysql_install_db antes de execut a-lo. Para recriar as tabelas de permiss oes completamente, remova todos os arquivos .frm .MYI e .MYD no diret orio contendo o banco de dados mysql. (Este e o diret orio chamado mysql sob o diret orio do banco de dados, que e listado quando voc e executa mysqld --help.) Depois execute o script mysql_install_db, possivelmente depois de edit a-lo para criar os privil egios desej aveis. NOTA: Para vers oes do MySQL mais antigas que a vers ao 3.22.10, voc e n ao deve apagar os arquivos .frm. Se voc e zer isso acidentalmente, voc e deve volt a-los a partir de sua distribui c ao MySQL antes de executar mysql_install_db.
263
GRANT, porque elas s ao mais concisas e menos propensas a erros. Veja Se c ao 4.4.1 [GRANT], P agina 255. Existem v arios programas de colaboradores (como o phpMyAdmin) que podem ser utilizados para criar e administrar usu arios. Os exemplos abaixo mostram como usar o cliente mysql para congurar novos usu arios. Estes exemplos assumem que privil egios s ao congurados de acordo com os padr oes descritos na se c ao anterior. Isto signica que para fazer altera c oes, voc e deve se conectar na mesma m aquina em que o mysqld est a executando, voc e deve se conectar com o usu ario root, e o usu ario root deve ter os privil egios inster ao banco de dados mysql e o administrativo reload. Tamb em, se voc e alterou a senha do usu ario root, voc e deve especic a-la para os comandos mysql abaixo. Primeiro, use o programa mysql para se conectar ao servidor como o usu ario root do MySQL: shell> mysql --user=root mysql Voc e pode adicionar novos usu arios utilizando instru c oes GRANT: mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY alguma_senha WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO monty@% IDENTIFIED BY alguma_senha WITH GRANT OPTION; mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost; mysql> GRANT USAGE ON *.* TO dummy@localhost; Estas instru c oes GRANT conguram tr es novos usu arios: monty Um superusu ario completo que pode conectar ao servidor de qualquer lugar, mas deve utilizar uma senha alguma_senha para fazer isto. Perceba que devemos utilizar instru c oes GRANT para monty@localhost e monty@"%". Se n os n ao adicionarmos a entrada com localhost, a entrada para o usu ario an onimo para localhost que e criada por mysql_install_db toma preced encia quando nos conectarmos da m aquina local, porque ele contem um campo Host com um valor mais espec ico e tamb em vem antes na ordena c ao da tabela user. Um usu ario que possa conectar de localhost sem uma senha e que e concedido os privil egios administrativos reload e process. Isto permite ao usu ario a execu c ao dos comandos mysqladmin reload, mysqladmin refresh e mysqladmin flush-*, bem como o mysqladmin processlist. Nenhum privil egio a n ivel de bancos de dados e concedido. (Depois eles podem ser adicionados utilizando instru c oes GRANT adicionais.) Um usu ario que pode conectar sem uma senha, mas somente na m aquina local. N ao s ao concedidos nenhum privil egioo tipo de privil egio USAGE permite a cria c ao de um usu ario sem privil egios. Ele tem o efeito de criar todos os privil egios globais com N. Considera-se que voc e ir a conceder privil egios espec icos a conta posteriormente.
admin
dummy
Tamb em e poss ivel adicionar a mesma informa c ao de acesso do usu ario diretamente, utilizando instru c oes INSERT e depois dizendo ao servidor para recarregar as tabelas de permiss oes:
264
shell> mysql --user=root mysql mysql> INSERT INTO user VALUES(localhost,monty,PASSWORD(alguma_senha), Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y); mysql> INSERT INTO user VALUES(%,monty,PASSWORD(alguma_senha), Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y); mysql> INSERT INTO user SET Host=localhost,User=admin, Reload_priv=Y, Process_priv=Y; mysql> INSERT INTO user (Host,User,Password) VALUES(localhost,dummy,); mysql> FLUSH PRIVILEGES; Dependendo da sua vers ao do MySQL, voc e pode precisar utilizar um n umero diferente de valores Y acima. (Vers oes anteriores ` a vers ao 3.22.11 tem menos campos de privil egios, e posteriores a 4.02 t em mais). Para o usu ario admin, a maior sintaxe legivel de INSERT usando SET que est a dispon ivel a partir da vers ao 3.22.11 e a utilizada. Note que para congurar um superusu ario, voc e s o precisar criar uma entrada na tabela user com os campos de privil egios congurados para Y. N ao e necess ario gerar entradas nas tabelas db ou host. Na u ltima instru c ao INSERT (para o usu ario dummy), apenas as colunas Host, User e Password nos registros da tabela user tem valores atribu idos. Nenhuma das colunas de privil egios s ao denidas explicitamente, assim o MySQL atribui a todas o valor padr ao de N. Isto e a mesma coisa que o GRANT USAGE faz. O seguinte exemplo adiciona um usu ario custom que pode acessar o banco de dados bankaccout apenas do localhost, o banco de dados expenses somente de whitehouse.gov e o banco de dados customer de todas de server.domain. Ele deseja utilizar a senha obscure das tr es m aquinas. Para congurar os privil egios deste usu ario utilizando instru c oes GRANT, execute estes comandos: shell> mysql> -> -> -> mysql> -> -> -> mysql> -> -> -> mysql --user=root mysql GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO custom@localhost IDENTIFIED BY obscure; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO custom@whitehouse.gov IDENTIFIED BY obscure; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO custom@server.domain IDENTIFIED BY obscure;
Para congurar os privil egios do usu ario modiciando as tabelas de permiss oes diretamente, utilize estes comandos (perceba o FLUSH PRIVILEGES no nal): shell> mysql --user=root mysql mysql> INSERT INTO user (Host,User,Password) -> VALUES(localhost,custom,PASSWORD(obscure));
265
mysql> -> mysql> -> mysql> -> -> -> -> mysql> -> -> -> -> mysql> -> -> ->
INSERT INTO user (Host,User,Password) VALUES(whitehouse.gov,custom,PASSWORD(obscure)); INSERT INTO user (Host,User,Password) VALUES(server.domain,custom,PASSWORD(obscure)); INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES (localhost,bankaccount,custom,Y,Y,Y,Y,Y,Y); INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES (whitehouse.gov,expenses,custom,Y,Y,Y,Y,Y,Y); INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES(server.domain,customer,custom,Y,Y,Y,Y,Y,Y);
Como no exemplo anterior que usaram as instru c oes INSERT, voc e pode precisar de usar um n umero diferentes de valores Y, dependendo de sua vers ao do MySQL. As primeiras tr es instru c oes INSERT adicionam entradas na tabela user que permite ao usu ario custom conectar a partir de v arias m aquinas com a senha determinada, mas n ao concede permiss oes ao mesmo (todos os privil egios s ao congurados com o valor padr ao de N). As pr oximas tr es instru c oes INSERT adicionam entradas na tabela db que concedem privil egios ` a custom para os bancos de dados bankaccount, expenses e customer, mas s o quando acessados ` a partir das m aquinas apropriadas. Normalmente, depois de modicar as tabelas de permiss oes diretamente, voc e deve dizer ao servidor para recarreg a-las (com FLUSH PRIVILEGES) para que as altera c oes nos privil egios tenham efeito. Se voc e deseja fornecer a um usu ario espec ico acesso de qualquer m aquina em um determinado dom inio (por exemplo, meudom inio.com), voc e pode utilizar uma instru c ao GRANT como a seguir: mysql> GRANT ... -> ON *.* -> TO myusername@%.mydomain.com -> IDENTIFIED BY mypassword; Para realizar a mesma coisa modicando diretamente as tabelas de permiss oes, fa ca isto: mysql> INSERT INTO user VALUES (%.meudominio, meunomedeusuario PASSWORD(minhasenha),...); mysql> FLUSH PRIVILEGES;
266
Ele apaga um usu ario que n ao possua nenhum privil agio. Para deletar um usu ario do MySQL voc e usar o seguinte procedimento, realizando os passos na ordem mostrada. 1. Verique quais privil egios o usu ario tem com SHOW PRIVILEGES. Veja Se c ao 4.6.8.11 [SHOW PRIVILEGES], P agina 326. 2. Delete todos os privil egios do usu ario com REVOKE. P agina 255. 3. Delete o usu ario com DROP USER. Se voc e estiver usando uma vers ao mais antiga do MySQL voc e deve primeiro revogar os privil egios e ent ao deletar o usu ario com: DELETE FROM mysql.user WHERE user=username and host=hostname; FLUSH PRIVILEGES; Veja Se c ao 4.4.1 [GRANT],
267
Os valores atualmente usados por um usu ario em particular pode ser descarregados (zerados) enviando uma instru c ao GRANT com qualquer das cl ausulas acima, inclu indo uma instru c ao GRANT com os valores atuais. Os valores atuais para todos os usu arios para todos os usu arios ser ao descarregados se os privil egios forem recarregados (no servidor ou usando mysqladmin reload) ou se o comando FLUSH USER_RESOURCES e executado. O resurso est a habilitado assim que e concedido a um u nico usu ario qualquer das cl ausulas GRANT de limita c ao. Como um prerequisito para a habilita c ao deste recurso, a tabela user no banco de dados mysql deve conter as colunas adicionais, como denido no script de cria c ao de tabelas mysql_install_db e mysql_install_db.sh no subdiret orio scripts.
268
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY biscuit; ou shell> mysqladmin -u jeffrey password biscuit NOTA: PASSWORD() e diferente da senha criptografada do Unix.
269
esta vers ao do ps, seria imprud encia assumir que n ao existe outro m etodo para observar o ambiente de processos. Veja Ap endice E [Vari aveis de ambiente], P agina 1083. Em resumo, os m etodos mais seguros seriam que o programa cliente solicitasse a senha ou especicar a senha em um arquivo .my.cnf corretamente protegido.
270
271
# # # # # # # # # # # # # #
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ., the field will be left blank. ----Country Name (2 letter code) [AU]:FI State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:MySQL admin Email Address []:
# # Create server request and key # openssl req -new -keyout $DIR/server-key.pem -out \ $DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf # # # # # # # # # # # # # # # # # # # # # # # # # # Sa ida exemplo: Using configuration from /home/monty/openssl/openssl.cnf Generating a 1024 bit RSA private key ..++++++ ..........++++++ writing new private key to /home/monty/openssl/server-key.pem Enter PEM pass phrase: Verifying password - Enter PEM pass phrase: ----You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ., the field will be left blank. ----Country Name (2 letter code) [AU]:FI State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:MySQL server Email Address []: Please enter the following extra attributes to be sent with your certificate request
272
# A challenge password []: # An optional company name []: # # Remove the passphrase from the key (optional) # openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem # # Assina o certificado do servidor # openssl ca -policy policy_anything -out $DIR/server-cert.pem \ -config $DIR/openssl.cnf -infiles $DIR/server-req.pem # # # # # # # # # # # # # # # # Sa ida exemplo: Using configuration from /home/monty/openssl/openssl.cnf Enter PEM pass phrase: Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:FI organizationName :PRINTABLE:MySQL AB commonName :PRINTABLE:MySQL admin Certificate is to be certified until Sep 13 14:22:46 2003 GMT (365 days) Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
# # Create client request and key # openssl req -new -keyout $DIR/client-key.pem -out \ $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf # # # # # # # # # da exemplo: Sai Using configuration from /home/monty/openssl/openssl.cnf Generating a 1024 bit RSA private key .....................................++++++ .............................................++++++ writing new private key to /home/monty/openssl/client-key.pem Enter PEM pass phrase: Verifying password - Enter PEM pass phrase: -----
273
# # # # # # # # # # # # # # # # # # #
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ., the field will be left blank. ----Country Name (2 letter code) [AU]:FI State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:MySQL user Email Address []: Please enter the following extra attributes to be sent with your certificate request A challenge password []: An optional company name []:
# # Remove a passphrase from the key (optional) # openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem # # Sign client cert # openssl ca -policy policy_anything -out $DIR/client-cert.pem \ -config $DIR/openssl.cnf -infiles $DIR/client-req.pem # # # # # # # # # # # # # # # Sa ida exemplo: Using configuration from /home/monty/openssl/openssl.cnf Enter PEM pass phrase: Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:FI organizationName :PRINTABLE:MySQL AB commonName :PRINTABLE:MySQL user Certificate is to be certified until Sep 13 16:45:17 2003 GMT (365 days) Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries
274
# Data Base Updated # # Create a my.cnf file that you can use to test the certificates # cnf="" cnf="$cnf [client]" cnf="$cnf ssl-ca=$DIR/cacert.pem" cnf="$cnf ssl-cert=$DIR/client-cert.pem" cnf="$cnf ssl-key=$DIR/client-key.pem" cnf="$cnf [mysqld]" cnf="$cnf ssl-ca=$DIR/cacert.pem" cnf="$cnf ssl-cert=$DIR/server-cert.pem" cnf="$cnf ssl-key=$DIR/server-key.pem" echo $cnf | replace " " > $DIR/my.cnf # # To test MySQL mysqld --defaults-file=$DIR/my.cnf & mysql --defaults-file=$DIR/my.cnf Voc e tamb em pode testar sua congura c ao modicando o arquivo my.cnf acima para fazer refer encia aos certicados de demonstra c ao no diret orio mysql-dist-fonte/SSL.
275
-> IDENTIFIED BY goodsecret REQUIRE X509; REQUIRE ISSUER emissor coloca uma restri c ao na tentativa de conex ao: O cliente deve apresentar um certicado X509 v alido emitido pelo CA emissor. Usar o certicado X509 sempre implica em criptograa, assim a op c ao SSL e desnecess aria. mysql> -> -> > GRANT ALL PRIVILEGES ON test.* TO root@localhost IDENTIFIED BY goodsecret REQUIRE ISSUER C=FI, ST=Some-State, L=Helsinki, O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com;
REQUIRE SUBJECT assunto exige que o cliente tenha um certicado X509 com o assunto assunto. Se o cliente apresenta um certicado que e valido mas tem um assunto diferente, a conex ao e disabilitada. mysql> -> -> > > GRANT ALL PRIVILEGES ON test.* TO root@localhost IDENTIFIED BY goodsecret REQUIRE SUBJECT C=EE, ST=Some-State, L=Tallinn, O=MySQL demo client certificate, CN=Tonu Samuel/Email=tonu@mysql.com;
REQUIRE CIPHER m etodo e necess ario para assegurar que uma criptograa forte ser a usada. O SSL pode ser fraco se algoritmos antigos com chaves de criptograas curtas s ao usados. Usando esta op c ao, podemos pedir por algum m etodo de criptograa exato para permitir a conex ao. mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost -> IDENTIFIED BY goodsecret -> REQUIRE CIPHER EDH-RSA-DES-CBC3-SHA; As op c oes SUBJECT, ISSUER e CIPHER podem ser combinadas na cl ausula REQUIRE desta forma: mysql> -> -> > > -> > -> GRANT ALL PRIVILEGES ON test.* TO root@localhost IDENTIFIED BY goodsecret REQUIRE SUBJECT C=EE, ST=Some-State, L=Tallinn, O=MySQL demo client certificate, CN=Tonu Samuel/Email=tonu@mysql.com AND ISSUER C=FI, ST=Some-State, L=Helsinki, O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com AND CIPHER EDH-RSA-DES-CBC3-SHA;
A partir do MySQL 4.0 a palavra chave AND e opcional entre op c oes REQUIRE. A ordem das op c oes n ao importa, mas nenhuma op c ao pode ser especicada duas vezes.
276
op c ao por si s o n ao e suciente para fazer uma conex ao SSL ser usada. Voc e tamb em deve especicar as op c oes --ssl-ca, --ssl-cert, e --ssl-key. Note que esta op c ao n ao exige uma conex ao SSL. Por exemplo, se o servidor ou clienteest a compilado sem suporte SSL, uma conex ao n ao criptografada normal ser a usada. O modo seguro de de se certicar que uma conex ao SSL ser a usada e criar uma conta no servidor que inclua uma cl ausula REQUIRE SSL na instru c ao GRANT. Ent ao use esta conta para se conectar ao servidor, com um servidor e cliente que tenham suporte a SSL habilitado. Voc e pode usar esta op c ao para indicar que a conex ao n ao deve usar SSL. Fa ca isto especicando a op c ao como --skip-ssl ou --ssl=0. --ssl-ca=file_name O caminho para um arquivo vom uma lista de Certifcados SSL con aveis. --ssl-capath=directory_name O caminho para um diret orio que cont em certicados SSL con aveis no formato pem. --ssl-cert=file_name O nome do arquivo de certicado SSL usado para estabelecer uma conex ao segura. --ssl-cipher=cipher_list Uma lista de chaves permitidas, usado para criptograa SSL. cipher_list tem o mesmo formato que o comando openssl ciphers. Example: --ssl-cipher=ALL:-AES:-EXP --ssl-key=file_name O nome do arquivo de chave SSL a ser usado para estabelecer uma conex ao segura.
277
Outra maneira de efetuar um backup de um banco de dados e utilizar o programa mysqldump ou o script mysqlhotcopy. Veja Se c ao 4.9.7 [mysqldump], P agina 362. Veja Se c ao 4.9.8 [mysqlhotcopy], P agina 366. 1. Fazer um backup completo do seu banco de dados: shell> mysqldump --tab=/path/to/some/dir --opt db_name ou shell> mysqlhotcopy db_name /path/to/some/dir Voc e tamb em pode simplesmente copiar os arquivos das tabelas (*.frm, *.MYD) e os arquivos *.MYI) quando o servidor n ao estiver atualizando nada. O script mysqlhotcopy utiliza este m etodo. (Mas nopte que estes m etodos n ao funcionar ao se seu banco de dados cont em tabelas InnoDB. InnoDB n ao armazena o conte udo das tabelas em diret orios de banco de dados, e o mysqlhotcopy funciona apenas para tabelas MyISAM e ISAM.) 2. Interrompa o mysqld caso ele esteja em execu c ao, depois inicie-o com a op c ao --logbin[=nome_arquivo]. Veja Se c ao 4.10.4 [Log bin ario], P agina 375. Os arquivos de log bin ario fornecem a informa c ao necess aria para replicar altera c oes ao banco de dados que forem feitas depois do ponto em que voc e executou mysqldump. Se o seu servidor MySQL e um slave, seja qual for o m etodo de backup que voc e escolha, quando voc e faz backup dos dados do slave, voc e deve tamb em fazer backup dos arquivos master.info e relay-log.info que s ao necess arios para continuar a replica c ao depois que voc e restaurar os dados do slave. Se seu slave est a sujeito a replica c ao de comandos LOAD DATA INFILE, voc e tamb em deve fazer backup dos arquivos SQL_LOAD-* que podem existir no diret orio especicado pela op c ao slave-load-tmpdir. (A localiza c ao padr ao desta op c ao e o valor da vari avel tmpdirse n ao especicado.) O slave precisar a destes arquivos para continuar a replica c ao de qualquer LOAD DATA INFILE interrompido. Se voc e necessita restaurar alguma coisa, tente primeiro recuperar suas tabelas utilizando REPAIR TABLE ou myisamchk -r. Isto deve funcionar em 99.9% de todos os caso, Se o myisamchk falhar, tente o seguinte procedimento: (Isto s o ir a funcionar se voc e iniciou o MySQL com --log-update, veja Se c ao 4.10.4 [Binary log], P agina 375,): 1. Restaure o backup original feito com o mysqldump ou backup bin ario. 2. Execute o seguinte comando para re-executar as atualiza c oes armazenadas no log bin ario: shell> mysqlbinlog hostname-bin.[0-9]* | mysql Em seu caso voc e pode querer re-executar apenas alguns log bin arios, a partir de certas posi c os (normalmente voc e quer re-executar todos os log bin arios a partir da data de restaura c ao do backup, co exce c ao de algumas consultas erradas). Veja Se c ao 4.9.5 [mysqlbinlog], P agina 359 fpara mais informa c oes sobre o utilit ario mysqlbinlog e como us a-lo. Se voc e estiver utilizando o log atualizado, voc e pode executar o conte udo do log de atualiza c ao desta forma: shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
278
O comando ls e usado para obter todos os arquivos de log na ordem correta. Voc e pode tamb em fazer backups seletivos com SELECT * INTO OUTFILE nome_arquivo FROM nome_tabela e restaurar com LOAD DATA INFILE nome_arquivo REPLACE.... Para evitar registros duplicados, voc e precisar a de um chave PRIMARY KEY ou uma UNIQUE na tabela. A palavra chave REPLACE substitui os antigos registros com os novos quando um novo registro duplica um antigo registro em uma chave de valores u nicos. Se voc e tiver problemas de performance realizando backups no seu sistema, voc e pode resolver isto congurando uma replica c ao e fazendo os backups na m aquina slave no lugar da master. Veja Se c ao 4.11.1 [Introdu c ao a Replica c ao], P agina 379. Se voc e estiver utilizando um sistema de arquivos Veritas, voc e pode fazer: 1. Executar em um cliente (perl ?) FLUSH TABLES WITH READ LOCK 2. Bifurcar uma shell ou executar em outro cliente mount vfxs snapshot. 3. Executar no primeiro cliente UNLOCK TABLES 4. Copiar arquivos do snapshot 5. Desmontar snapshot
279
indice. Quanto mais chaves tiver, mais demorado ser a. Como no comando BACKUP TABLE, atualmente s o funciona com tabelas MyISAM. O comando retorna uma tabela com as seguintes colunas: Coluna Table Op Msg type Msg text Valor Nome da Tabela Sempre restore Um dos seguintes: status, error, info ou warning A mensagem
Note que a instru c ao pode produzir v arias linhas de informa c oes para cada tabela conferida. Au ltima linha ir a ser do tipo Msg_type status e normalmente deve estar OK. Se voc e n ao obteve OK ou Not checked, deve ser executado, normalmente, um reparo da tabela. Veja Se c ao 4.5.6 [Table maintenance], P agina 281. Table is already up to date signica que o gerenciador de armazenamento para a tabela indica que n ao h a necessidade de vericar a tabela. Os diferentes tipos de consist encias s ao as seguintes: Tipo QUICK FAST CHANGED MEDIUM EXTENDED Signicado N ao busca os registros vericando liga c oes incorretas. S o confere tabelas que n ao foram fechadas corretamente. S o verica as tabelas que foram alteradas desde a u ltima confer encia ou que n ao foram fechadas corretamente. Busca os registros para vericanado que liga c oes removidas est ao ok. Isto tamb em calcula uma chave de confer encia para os registros e verica isto com um checksum calculado para as chaves. Faz uma busca completa nas chaves para todas as chaves em cada registro. Isto assegura que a tabela est a 100% consistente, mas pode demorar muito tempo para executar!
280
Para tabelas MyISAM de tamanho din amico, uma verica c ao iniciada sempre far a uma verica c ao MEDIUM. Para registros de tamanho est atico n os saltamos a busca de registros para QUICK e FAST j a que os registros est ao raramente corrompidos. Voc e pode combinar op c oes de consist encia como no exemplo a seguir que faz uma verica c ao r apida na tabela para ve se ela foi fechada corretamente: CHECK TABLE test_table FAST QUICK; NOTA: em alguns casos CHECK TABLE ir a alterar a tabela! Isto acontece se a tabela estiver marcada como corrupted (corrompida) ou not closed properly (n ao foi fechada corretamente) mas o CHECK TABLE n ao encontrar n ao encontrar nenhum problema na tabela. Neste caso, CHECK TABLE ir a marcar a tabela como ok. Se uma tabela estiver corrompida, e prefer ivel que seja um problema nos indices e n ao na parte de dados. Todos os tipos de consist encia acima sempre confere os indices e deve ent ao encontrar a maioria dos erros. Se voc e s o quiser conferir uma tabela que acredita estar ok, voc e n ao deve utilizar nenhuma op c ao para o comando check ou utilizar a op c ao QUICK. O u ltimo deve ser utilizado quando voc e estiver com pressa e o r isco do QUICK n ao encontrar um erro no arquivo de dados for minimo (Na maioria dos casos o MySQL pode encontrar, sob utiliza c ao normal, qualquer erro no arquivo de dados. Se isto ocorrer, ent ao a tabela ser a marcada como corrupted, neste caso a tabela n ao poder a ser utilizada at e ser reparada). FAST e CHANGED s ao normalmente chamados a partir de um script (um exemplo e ser executado a partir do cron) Se voc e desejar conferir suas tabelas de tempos em tempos. Na maioria dos casos, o FAT e uma op c ao melhor que CHANGED. (O u nico caso em que isto n ao acontece e quando voc e suspeita que encontrou um bug no c odigo do MyISAM.). EXTENDED deve ser utilizado somente depois de ter executado um check normalmente, mas continuar obtendo erros de uma tabela quando o MySQL tenta atualizar um registro ou encontrar um registro pela chave (isto seria muito dif icil ocorrer caso uma confer encia normal tenha executado com sucesso!). Alguns problemas relatados por CHECK TABLE, n ao podem ser corrigidas automaticamente: Found row where the auto_increment column has the value 0. Isto signica que voc e possui um registro na tabela onde o campo indice que utiliza o recurso auto_increment contem o valor 0. (E possivel criar um registro onde a coluna de auto incremento seja 0 denindo explicitamente 0 em uma instru c ao UPDATE). Isto n ao e exatamente um erro, mas pode causar problemas se voc e decidir descarregar a tabela e restaur a-la ou executar um ALTER TABLE na tabela. Neste caso a coluna de auto incremento ir a alterar seu valor, de acordo com as regras das colunas de auto incremento, que pode causar problemas como um erro de chave duplicada. Para se livrar do alerta, basta executar uma instru c ao UPDATE para congurar a coluna para algum outro valor diferente de 0.
281
Normalmente voc e nunca deve executar este comando, mas se um disastre ocorrer voc e vai precisar recuperar seus dados de uma tabela MyISAM utilizando REPAIR TABLE. Se as suas tabelas estiverem muito corrompidas, voc e deve encontrar a raz ao, para eleiminar a necessidade de se usar REPAIR TABLE! Veja Se c ao A.4.1 [Crashing], P agina 921. Veja Se c ao 7.1.3 [MyISAM table problems], P agina 635. REPAIR TABLE repara uma tabela possivelmente corrompida. O comando retorna uma tabela com as seguintes colunas: Coluna Valor Table Nome da Tabela Op Sempre repair Msg type Um dos seguintes: status, error, info ou warning Msg text A mensagem Note que a instru c ao pode produzir v arias linhas de informa c oes para cada tabela recuperada. A ultima linha ser a de Msg_type status e normalmente deve exibir OK. Se o retorno n ao for OK, voc e pode tentar reparar a tabela com myisamchk -o, j a que REPAIR TABLE ainda n ao implementa todas as op c oes de myisamchk. Futuramente iremos torn a-lo mais ex ivel. Se o par ametro QUICK for especicado, REPAIR tenta reparar somente a arvore de indices. Se voc e utilizar EXTENTED, o MySQL criar a o indice, registro a registro em vez de criar um indice de uma vez com ordena c ao; Isto pode ser melhor que a ordena c ao em chaves de tamanho xo se voc e tiver grandes chaves do tipo char() que compactam muito bem. No MySQL 4.0.2, existe um modo USE_FRM para REPAIR. Use-o se o arquivo .MYI estiver faltando ou o seu cabe calho estiver corrompido. Neste modo o MySQL recriar a a tabela, usando a informa c ao do arquivo .frm. Este tipo de reparo n ao pode ser feito com myisamchk. Aviso: Se o mysqld morre durante um REPAIR TABLE, e essencial que voc e fa ca imediatamente outro REPAIR na tabela antes de executar qualquer outro comando nela. (Claro que e sempre bom inciar com um backup). No pior caso voc e pode ter um novo arquivo de indice limpo sem informa c ao sobre o arquivo de dados e quando voc e executar o pr oximo comando o arquivo de dados pode ser sobreescrito. Isto n ao e um cen ario desej avel, mas poss ivel. Antes do MySQL 4.1.1, o comando REPAIR n ao era gravado no log bin ario. Desde o MySQL 4.1.1. eles s ao escritos no log bin ario a menos que a palavra chave opcional NO_WRITE_TO_ BINLOG (ou seu alias LOCAL) seja usada.
282
No texto a seguir iremos comentar sobre o myisamchk, mas tudo tamb em se aplica ao antigo isamchk. Voc e pode utilizar o utilit ario myisamchk para obter informa c oes sobre suas tabelas de bancos de dados, verc a-las, repar a-las ou otimiz a-las. As seguintes se c oes descrevem como executar myisamchk (incluindo uma descri c ao de suas op c oes), como montar um calend ario de manuten c ao, e como utilizar o myisamchk para executar suas v arias fun c oes. Voc e pode, na maioria dos casos, utilizar o comando OPTIMIZE TABLES para otimizar e reparar tabelas, mas n ao e t ao r apido e con avel (no caso real de erros fatais) como o mysisamchk. Por outro lado, OPTIMIZE TABLE e mais f acil de usar e voc e n ao tem que se preocupar com a recarrega das tabelas. Veja Se c ao 4.6.1 [OPTIMIZE TABLE], P agina 299. Embora os reparos realizados pelo myisamchk sejam bastante seguros, por em e sempre uma boa id eia fazer um backup dos dados ANTES de realizar um reparo (ou qualquer coisa que far a grandes altera c oes em alguma tabela)
283
myisamchk --silent --fast /caminho/para/diret orio_dados/*/*.MYI isamchk --silent /caminho/para/diret orio_dados/*/*.ISM Se voc e quiser conferir todas as tabelas e reparar todas que estiverem corrompidas, pode utilizar linha a seguir: myisamchk --silent --force --fast --update-state -O key_buffer=64M \ -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M \ /caminho/para/diret orio_dados/*/*.MYI isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M \ -O read_buffer=1M -O write_buffer=1M /caminho/para/diret orio_dados/*/*.ISM A linha acima assume que voc e tem mais de 64 MB de mem oria livre. Perceba que se voc e obter um erro do tipo: myisamchk: warning: 1 clients is using or hasnt closed the table properly Isto signica que voc e est a tentando vericar uma tabela que est a sendo atualizada por outro programa (como o servidor mysqld) que ainda n ao fechou o arquivo ou que nalizou sem fechar o arquivo corretamente. Se o mysqld est a em execu c ao, voc e deve for car o sincronimo e fechamento de todas tabelas com FLUSH TABLES e assegurar que ningu em mais esteja utilizando as tabelas quando for executar o myisamchk. No MySQL vers ao 3.23 a forma mais simples de evitar este problema e utilizar CHECK TABLE no lugar de myisamchk para vericar as tabelas.
-? ou --help Exibe uma mensagem de ajuda e sai. -O nome=op c~ ao, --set-variable=nome=op c~ ao Congura o valor de uma vari avel. Por favor note que as sintaxes --setvariable=nome=valor e -O name=value est ao obsoletas desde o MySQL 4.0. Use --nome=valor. As vari aveis poss iveis e seus valores padr oes para o myisamchk podem ser examinados com myisamchk --help Vari avel Valor key buer size 523264 read buer size 262136 write buer size 262136 sort buer size 2097144 sort key blocks 16 decode bits 9 sort_buffer_size e utilizado quando as chaves s ao reparadas pela ordena c ao das chaves, que e o caso normal quando voc e utiliza --recover. key_buffer_size e utilizando quando voc e estiver conferindo a tabela com -extended-check ou quando as chaves s ao reparadas inserindo-as registro a
284
registro na tabela (como com inserts normais). O reparo atrav es de buer de chaves (key buer) e utilizado nos seguintes casos: Se voc e utilizar --safe-recover. Se os arquivos tempor arios necess arios para ordenar as chaves forem maior que o dobro do tamanho de quando se criasse o arquivo de chaves diretamente. Isto e o caso quando se tem chaves CHAR, VARCHAR ou TEXT tao grandes quanto necess ario pela ordena c ao para armazenar todas as chaves durante o processo. Se voc e tiver muito espa co tempor ario e puder for car o myisamchk a reparar por ordena c ao voc e pode utilizar a op c ao --sortrecover. Repara c ao atrav es do buer de chaves (key buer) economiza muito mais espa co em disco do que utilizando ordena c ao, mas e muito mais lenta. Se voc e deseja uma repara c ao mais r apida, congure as vari aveis acima para cerca de 1/4 da sua mem oria dispon ivel. Voc e pode congurar as vari aveis para valores altos, pois somente um dos buers acima ser a utilizado a cada vez. -s ou --silent Modo discreto ou silencioso. Escreve a sa ida somente quando um erro ocorre. Voc e pode utilizar -s duas vezes (-ss) para deixar o mysisamchk mais silencioso. -v ou --verbose Modo prolixo. Gera mais informa c ao de sa ida. Ele pode ser utilizado com -d e -e. Utilize -v m ultiplas vezes -vv, -vvv) para gerar mais sa ida! -V ou --version Exibe a vers ao do myisamchk e sai. -w ou, --wait No lugar de gerar um erro se a tabela estiver bloqueada, espere at e que a tabela que livre antes de continuar. Perceba que se voc e estiver utilizando mysqld na tabela com --skip-external-locking, a tabela s o pode ser trancada por outro comadno myisamchk.
285
-F ou --fast Verica apenas tabelas que n ao foram fechadas corretamente. -C ou --check-only-changed Verica apenas tabelas que foram alteradas desde a u ltima verica c ao. -f ou --force Reinicia o myisamchk com -r (reparos) na tabela, se myisamchk encontrar quaisquer erros na tabela. -i ou --information Exibe informa c oes e estat isticas sobre a tabela que estiver sendo vericada. -m ou --medium-check Mais r apido que extended-check, mas encontra somente 99.99% de todos os erros. Deve, entretando, ser bom o bastante para a maioria dos casos. -U ou --update-state Armazena no arquivo .MYI quando a tabela foi vericada e se a tabela falhou. Isto deve ser utilizado para obter o benef icio integral da op c ao --check-onlychanged, mas voc e n ao deve utilizar esta op c ao se o servidor mysqld esta usando a tabela e o mysqld esta sendo executado com --skip-external-locking. -T ou --read-only N ao marca as tabelas como vericadas. Isto eu til se voc e utiliza o myisamchk para vericar uma tabela que esteja em uso por alguma outra aplica c ao que n ao utiliza bloqueios (como no mysqld --skip-external-locking).
286
informa quais chaves usar, onde cada bit seleciona uma chave (a primeira chave possui o bit 0). Isto pode ser utilizado para inser c oes mais r apidas! Indices desativados podem ser reativados utilizando myisamchk -r. -l ou --no-symlinks N ao segue links simb olicos. Normalmente o myisamchk repara a tabela para qual um link simb olico aponta. Esta op c ao n ao existe no MySQL 4.0 pois o MySQL 4.0 n ao ir a remover links simb olicos durante os reparos. -p or --parallel-recover Usa a mesma t ecnica que -r e -n, mas cria todas as chaves em paralelo, em threads diferentes. A op c ao foi adicionada no MySQL 4.0.2. Este c odigo e alfa. Use por sua conta e risco! -r ou --recover Pode concertar quase tudo excetos chaves u nicas que n ao s ao u nicas (Que e um erro extremamente indesej avel com tabelas ISAM/MyISAM). Se voc e deseja recuperar uma tabela, esta e primeira op c ao a ser tentada. Somente se o myisamchk relatar que a tabela n ao pode ser recuperada pelo -r voc e deve tentar ent ao a op c ao -o. (Perceba que no caso indesej avel de -r falhar, o arquivo de dados continuar a intacto.) Se voc e possui muita mem oria, voc e deve aumentar o tamanho de sort_buffer_size! -o ou --safe-recover Utiliza um antigo m etodo de recupera c ao (le atrav es de todos registros na ordem e atualiza todas as arvores de indices baseado nos registros encontrados); esta op c ao e muito mais lenta que -r, mas pode tratar v arios casos indesej aveis que o -r n ao consegue tratar. Este m etodo de recupera c ao tamb em utiliza muito menos espa co em disco que -r. Normalmente sempre se deve tentar, primeiro, um reparo com -r, e somente se ele falhar, usar -o. Se voc e possuir muita mem oria, voc e deve aumentar o tamanho de sort_ buffer_size! -n ou --sort-recover For ca o uso de ordena c ao do myisamchk para resolver as chaves mesmo se os arquivos tempor arios forem muito grandes. --character-sets-dir=... Diret orio onde conjuntos de caracteres s ao armazenados. --set-character-set=name Altere o conjunto de caracteres usado pelo indice .t ou --tmpdir=path Caminho para armazenar arquivos tempor arios. Se isto n ao for congurado, myisamchk ir a usar a vari avel de ambiente TMPDIR para isto. A partir do MySQL 4.1, tmpdir pode ser congurado com uma lista de caminhos separados por dois pontos : (ponto e virgula ; no Windows). Eles ser ao usado da forma robinround.
287
-q ou --quick Reparo r apido sem modicar o arquivo de dados. Pode ser fornecido um segundo -q para for car o myisamchk para modicar o arquivo de dados original no caso de chaves duplicadas. -u ou --unpack Descompacta arquivo empacotado com o myisampack.
288
Certique-se que o myisamchk utiliza arquivos tempor arios em TMPDIR. Se TMPDIR aponta para um sistema de arquivos em mem oria, voc e pode facilmente obter erros de mem oria. Se isto acontecer, congure TMPDIR para apontar para algum diret orio com mais espa co e reinicie o myisamchk. Quando reparando, o myisamchk tamb em precisar a de bastante espa co em disco: Dobra-se o tamanho do arquivo de registros (o original e uma c opia). Este espa co n ao e necess ario se for feito um reparo com --quick, j a que neste caso somente o arquivo de indices ser a recriado. Este espa co e necess ario no mesmo disco que se encontra o arquivo de registros original! Espa co para o novo arquivo de indice que substitui o antigo. O arquivo de indices antigo e truncando no inicio, portanto, normalmente este espa co e ignorado. Este espa co e necess ario no mesmo disco que o arquivo de indice original! Quando utilizando --recover ou --sort-recover (mas n ao quando usando --saferecover, ser a necess ario espa co para um buer de ordena c ao de: (maior_chave + tamanho_do_ponteiro_de_registro)*n umero_de_registros * 2. Voc e pode conferir o tamanho das chaves e o tamanho do ponteiro de registro com myisamchk -dv tabela. Este espa co e alocado no disco tempor ario (especicado por TMPDIR ou --tmpdir=#). Se voc e tiver um problema com espa co em disco durante o reparo, pode-se tentar usar --safe-recover em vez de --recover.
289
Quando se realizar recupera c ao devido a falhas, e importante entender que cada tabela nome_tabela em um banco de dados corresponde a tres arquivos no diret orio do banco de dados: Arquivo Prop osito nome_tabela.frm Arquivo com deni c oes da tabela (form) nome_tabela.MYD Arquivo de dados nome_tabela.MYI Arquivo de indices Cada um destes tr es tipos de arquivos est a sujeito a corrup c ao de v arias formas, mas problemas ocorrem mais frequentemente em arquivos de dados e indices. O myisamchk trabalha criando uma c opia do arquivo de dados .MYD linha a linha. Ele termina o est agio de reparos removendo o antigo arquivo .MYD e renomeando o novo arquivo com nome original. Se for utilizada a op c ao --quick, myisamchk n ao cria um arquivo .MYD tempor ario, mas assume que o arquivo .MYD est a correto e somente gera um novo arquivo indice sem mexer no arquivo de dados. Isto e seguro, pois o myisamchk detecta automaticamente se o arquivo .MYD est a corrompido e aborda o reparo neste caso. Voc e pode tamb em fornecer duas op c oes --quick para o myisamchk. Neste caso, o myisamchk n ao aborta em alguns erros (como chaves duplicadas) mas tenta resolv e-los modicando o arquivo .MYD. Normalmente o uso de duas op c oes --quick eu til somente se voc e tiver muito pouco espa co em disco para realizer um reparo normal. Neste caso voc e deve pelo menos fazer um backup antes de executar o myisamchk.
290
myisamchk -e -i nome_tabela Como o comando anterior, mas a op c ao -i diz ao myisamchk para exibir algumas informa c oes estat isticas tamb em.
291
Se voc e estiver utilizando o MySQL vers ao 3.23.16 e superior, voc e pode (e deve) usar os comandos CHECK e REPAIR para conferir e corrigir tabelas MyISAM. Veja Se c ao 4.5.4 [CHECK TABLE], P agina 279. Veja Se c ao 4.5.5 [REPAIR TABLE], P agina 280. A se c ao do manual sobre manuten c ao de tabelas inclui as op c oes para isamchk/myisamchk. Veja Se c ao 4.5.6 [Table maintenance], P agina 281. A seguinte se c ao s ao para os casos onde o comando acima falhar ou se voc e desejar usar os recursos extendidos que o isamchk e myisamchk fornecem. Se voc e for reparar uma tabela da linha de comandos, deve primeiro desligar o servidor mysqld. Perceba que quando voc e executa mysqladmin shutdown em um servidor remoto, o servidor mysqld ir a continuar funcionando por um tempo depois do mysqladmin retornar, at e que todas as queries parem e todas as chaves sejam descarregadas no disco. Est agio 1: Vericando suas tabelas Execute myisamchk *.MYI ou myisamchk -e *.MYI se voc e tiver tempo dispon ivel. Utilize a op c ao -s (silencioso) para suprimir informa c oes desnecess arias. Se o servidor mysqld parar, deve ser utilizada a op c ao update para dizer ao myisamchk marcar a tabela como checada. Voc e deve reparar somente as tabelas em que o myisamchk indicar um erro. Para tais tabelas, v a para o est agio 2. Se voc e obter erros estranhos na verca c ao (como nos erros out of memory), ou se o myisamchk quebrar, v a para o est agio 3. Est agio 2: Reparo simples e seguro NOTA: Se voc e deseja que os reparos sejam mais r apidos, devem ser usadas as op c oes: -O sorf_buffer=# -O key_buffer=# (onde # seria 1/4 da mem oria disponivel) para todos comandos isamchk/myisamchk. Primeiro, tente usar myisamchk -r -q nome_tabela (-r -q signica modo de recupera c ao r apida). Ele tentar a reparar o arquivo de indice sem mexer no arquivo de dados. Se o arquivo de dados estiver normal e os links apagados apontam nas localiza c oes corretas dentro do arquivo de dados, isto deve funcionar e a tabela ser a corrigida. Inicie o reparo da pr oxima tabela. Outra maneira seria utilizar os seguintes procedimentos: 1. Fa ca um backup do arquivo de dados antes de continuar. 2. Utilize myisamchk -r nome_tabela (-r signica modo de recupera c ao). Isto remover a registros incorretos e deletados do arquivo de dados e reconstroi o arquivo de indices. 3. Se o passo anterior falhar, utilize myisamchk --safe-recover nome_tabela. O modo de recupera c ao segura utiliza um met odo de recupera c ao antiga que trata de alguns casos que o modo de recupera c ao comum n ao consegue (por em e mais lento). Se voc e obter erros estranhos no reparo (como em erros out of memory), ou se o myisamchk falhar, v a para o est agio 3. Est agio 3: Reparo dif icil Voc e s o deve atingir este est agio se o primeiro bloco de 16K do arquivo de indice estiver destru ido ou conter informa c oes incorretas, ou se o arquivo de indice n ao existir. Neste caso, e necess ario criar um novo arquivo de indice. Fa ca como a seguir: 1. Mova o arquivo de dados para algum lugar seguro.
292
2. Use o arquivo de descri c ao de tabelas para criar novos arquivos (vazios) de dados e indices: shell> mysql nome_bd mysql> SET AUTOCOMMIT=1; mysql> TRUNCATE TABLE nome_tabela; mysql> quit Se sua vers ao do MySQL n ao possuir TRUNCATE TABLE, utilize DELETE FROM nome_ tabela. 3. Copie o antigo arquivo de dados de volta para o novo arquivo de dados criado. (N ao s o mova o antigo arquivo de volta para o novo arquivo; voc e deve uma c opia no caso de algo der errado.) Volte ao est agio 2. myisamchk -r -q deve funcionar agora. (Isto n ao deve ser um loop eterno.) No MySQL 4.0.2 voc e tamb em pode utilizar REPAIR ... USE_FRM o qual realiza todo o procedimento automaticamente. Est agio 4: Reparo muito dif icil Voc e deve atingir este est agio somente se o arquivo de descri c ao tamb em falhar. Isto nunca deve acontecer, porque o arquivo de descri c ao n ao e alterado depois da tabela ser criada: 1. Restaure o arquivo de descri c ao de um backup e volte ao est agio 3. Voc e pode tamb em restaurar o arquivo de indice e voltar ao est agio 2. No u ltimo caso, voc e deve iniciar com myisamchk -r. 2. Se voc e n ao tem um backup mas sabe exatamente como a tabela foi criada, crie uma c opia da tabela em outro banco de dados. Remova o novo arquivo de dados, e ent ao mova a descri c ao e arquivos de indice do outro banco de dados para o banco de dados com problemas. Isto lhe fornece um novo arquivos indice e descri c ao, mas mant em o arquivo de dados da mesma forma. Volte ao est agio 2 e tente reconstruir o arquivo de indices.
293
294
table description: Key Start Len Index Type 1 2 8 unique double 2 15 10 multip. text packed stripped 3 219 8 multip. double 4 63 10 multip. text packed stripped 5 167 2 multip. unsigned short 6 177 4 multip. unsigned long 7 155 4 multip. text 8 138 4 multip. unsigned long 9 177 4 multip. unsigned long 193 1 text Exemplo da sa ida de myisamchk -d -v : MyISAM file: company Record format: Fixed length File-version: 1 Creation time: 1999-10-30 12:12:51 Recover time: 1999-10-31 19:13:01 Status: checked Data records: 1403698 Deleted blocks: 0 Datafile parts: 1403698 Deleted data: 0 Datafilepointer (bytes): 3 Keyfile pointer (bytes): 3 Max datafile length: 3791650815 Max keyfile length: 4294967294
295
Recordlength:
226
table description: Key Start Len Index Type 1 2 8 unique double 2 15 10 multip. text packed stripped 3 219 8 multip. double 4 63 10 multip. text packed stripped 5 167 2 multip. unsigned short 6 177 4 multip. unsigned long 7 155 4 multip. text 8 138 4 multip. unsigned long 9 177 4 multip. unsigned long 193 1 text Exemplo da sa ida de myisamchk -eis: Checking MyISAM file: company Key: 1: Keyblocks used: 97% Key: 2: Keyblocks used: 98% Key: 3: Keyblocks used: 97% Key: 4: Keyblocks used: 99% Key: 5: Keyblocks used: 99% Key: 6: Keyblocks used: 99% Key: 7: Keyblocks used: 99% Key: 8: Keyblocks used: 99% Key: 9: Keyblocks used: 98% Total: Keyblocks used: 98% Records: 1403698 Packed: 0% Recordspace used: 100% Blocks/Record: 1.00 Record blocks: 1403698 Recorddata: 317235748 Lost space: 0 Packed: Packed: Packed: Packed: Packed: Packed: Packed: Packed: Packed: Packed:
Root Blocksize 15845376 1024 25062400 1024 40907776 1024 48097280 1024 55200768 1024 65145856 1024 75090944 1024 85036032 1024 96481280 1024
4 4 4 3 3 3 3 3 4
226 0% 0 0 0
User time 1626.51, System time 232.36 Maximum resident set size 0, Integral resident set size 0 Non physical pagefaults 0, Physical pagefaults 627, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 639, Involuntary context switches 28966 Exemplo da sa ida de myisamchk -eiv: Checking MyISAM file: company Data records: 1403698 Deleted blocks: - check file-size - check delete-chain block_size 1024: 0
296
index 1: index 2: index 3: index 4: index 5: index 6: index 7: index 8: index 9: No recordlinks - check index reference - check data record references Key: 1: Keyblocks used: 97% - check data record references Key: 2: Keyblocks used: 98% - check data record references Key: 3: Keyblocks used: 97% - check data record references Key: 4: Keyblocks used: 99% - check data record references Key: 5: Keyblocks used: 99% - check data record references Key: 6: Keyblocks used: 99% - check data record references Key: 7: Keyblocks used: 99% - check data record references Key: 8: Keyblocks used: 99% - check data record references Key: 9: Keyblocks used: 98% Total: Keyblocks used: 9%
index: 1 Packed: index: 2 Packed: index: 3 Packed: index: 4 Packed: index: 5 Packed: index: 6 Packed: index: 7 Packed: index: 8 Packed: index: 9 Packed: Packed:
Max levels: Max levels: Max levels: Max levels: Max levels: Max levels: Max levels: Max levels: Max levels:
4 4 4 3 3 3 3 3 4
- check records and index references [LOTS OF ROW NUMBERS DELETED] Records: 1403698 Recordspace used: 100% Record blocks: 1403698 Recorddata: 317235748 Lost space: 0 M.recordlength: Empty space: Delete blocks: Deleted data: Linkdata: 226 0% 0 0 0 Packed: Blocks/Record: 0% 1.00
User time 1639.63, System time 251.61 Maximum resident set size 0, Integral resident set size 0 Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0 Blocks in 4 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 10604, Involuntary context switches 122798
297
Aqui est ao os tamanhos dos arquivos de dados e indices para a tabela utilizada nos exemplos anteriores: -rw-rw-r-1 monty tcx 317235748 Jan 12 17:30 company.MYD -rw-rw-r-1 davida tcx 96482304 Jan 12 18:35 company.MYM Explica c oes para os tipos de informa c oes que o myisamchk produz s ao fornecidas abaixo. O keyle e o arquivo de indices. Registro e linha s ao sin onimos: ISAM le Nome do arquivo ( indice) ISAM. Isam-version Vers ao do formato ISAM. Atualmente sempre 2. Creation time Quando o arquivo de dados foi criado. Recover time Quando foi a u ltima vez que o arquivo de indices/dados foi reconstru ido. Data records Quantos registros existem na tabela. Deleted blocks Quantos blocos apagados continuam alocando espa co. Voc e pode otimizar sua tabela para minimizar este espa co. Veja Se c ao 4.5.6.10 [Otimiza c ao], P agina 292. Datale: Parts Para formato de registros din amicos, isto indica quantos blocos de dados existem. Para uma tabela otimizada sem registros fragmentados, isto e o mesmo que Data records. Deleted data Quantos bytes de dados deletados n ao recuperados existem. Voc e pode otimizar sua tabela para minimizar este espa co. Veja Se c ao 4.5.6.10 [Otimiza c ao], P agina 292. Data le pointer O tamanho do ponteiro do arquivo de dados, em bytes. Ele normalmente possui 2, 3, 4 ou 5 bytes. A maioria das tabelas trabalham com 2 bytes, mas isto ainda n ao pode ser controlado pelo MySQL ainda. Para tabelas xas, isto e um endere co de registro. Para tabelas din amicas, isto e um endere co de byte. Keyle pointer O tamanho de um ponteiro de arquivo de indices, em bytes. Ele normalmente possui 1, 2 ou 3 bytes. A maioria das tabelas trabalham com 2 bytes, mas isto e calculado automaticamente pelo MySQL. Ele e sempre um endere co de bloco. Max datale length Qual tamanho o arquivo de dados (arquivos .MYD) pode atingir, em bytes. Max keyle length Qual tamanho o arquivo de indices (.MYI pode atingir, em bytes. Recordlength Quanto espa co cada registro ocupa, em bytes. Record format O formato utilizado para armazenar as linhas da tabelas. Os exemplos anteriores abaixo utilizam Fixed length (tamanho xo). Outros valores poss iveis s ao Compressed(compactado) e Packed(empacotado). table description Uma lista de todas as chaves na tabela. Para cada chave, alguma informa c ao de baixo n ivel e apresentada: Key Start Len O N umero desta chave. Onde, no registro, esta parte do indice inicia. Qual o tamanho desta parte do indice. Para n umeros empacotados, isto deve sempre ser o tamanho total da coluna. Para strings, deve ser mais curto que o tamanho total da coluna indexada, porque voc e pode indexar um prexo de uma coluna string.
298
unique ou multip. (multiplos). Indica se um valor pode ou n ao exisitir v arias vezes neste indice. Que tipo de dados esta parte do indice tem. Isto e um tipo de dados ISAM com as op c oes packed, stripped ou empty. Endere co do bloco de indice raiz. O tamanho de cada bloco de indice. O tamanho padr ao e 1024, mas o valor pode ser alterado na compila c ao. Este e um valor estat istico utilizado pelo otimizador. Ele diz quantos registros existem por valor para esta chave. Uma chave u nica sempre tem um valor de 1. Ele pode ser atualizado depois que uma tabela e carregada (ou muito alterada) com myisamchk -a. Se isto n ao for completamente atualizado, um valor padr ao de 30 e fornecido.
Rec/key
No primeiro exemplo acima, a nona chave e uma chave multi partes com duas partes. Keyblocks used Qual o percentual de bloco de chaves s ao usados. Como a tabela usada nos exemplos foi reorganizada com myisamchk, os valores s ao muito altos (muito pr oximos do m aximo te orico). Packed O MySQL tenta empacotar chaves com um suxo comum. Isto pode ser usado somente para chaves CHAR/VARCHAR/DECIMAL. Para strings grandes como nomes, isto pode reduzir signicativamente o espa co utilizado. No terceiro exemplo acima, a quarta chave possui 10 caracteres e uma redu c ao de 60% no espa co e obtida. Max levels Qual a profundidade da arvore-B para esta chave. Grandes tabelas com chaves longas resultam em valores altos. Records Quantos registros existem na tabela. M.recordlength A m edia de tamanho do registro. tamanho xo, isto e o tamanho exato do registro. Para tabelas com registros de
Packed O MySQL corta espa cos do nal de strings. O valor Packed indica o percentual de economia alcan cado fazendo isto. Recordspace used Qual percentual do arquivo de dados e usado. Empty space Qual percetual do arquivo de dados n ao e usado. Blocks/Record N umero m edio de blocos por registro (isto e, de quantos links um registro fragmentado e composto). Sempre ser a 1 para tabelas de formato xo. Este valor deve permanecer o mais pr oximo poss ivel de 1.0. Se ele aumentar, voc e pode reorganizar a tabela com myisamchk. Veja Se c ao 4.5.6.10 [Otimiza c ao], P agina 292. Recordblocks Quantos blocos (links) s ao utilizados. Para formatos xos, este e o mesmo que o n umero de registros. Deleteblocks Quantos blocos (links) foram exclu idos. Recorddata Quantos bytes no arquivo de dados s ao usados. Deleted data Quantos bytes no arquivo de dados foram apagados (sem uso). Lost space Se um registro e atualizado para um tamanho menor, algum espa co e perdido. Isto e a soma de todas estas perdas, em bytes.
299
Linkdata Quando o formato de tabela din amica e utilizado, fragmentos de registros s ao ligados com ponteiros (4 a 7 bytes cada). Linkdata e a soma do montante de armazenamento utilizado por todos estes ponteiros. Se uma tabela foi compactada com myisampack, mysiamchk -d exibe informa c oes adicionais sobre cada coluna da tabela. Veja Se c ao 4.8.4 [myisampack], P agina 337, para um exemplo desta informa c ao e uma descri c ao do que ela signica.
300
Analisa e armazena a distribui c ao de chaves para a tabela. Durante a an alise a tabela e bloqueada com uma trava de leitura. Isto funciona em tabelas MyISAM e BDB. Isto seria equivalente a executar myisamchk -a na tabela. O MySQL utiliza a distribui c ao de chaves armazenadas para decidir em que ordem tabelas devem ser unidas quando algu em faz um join em alguma coisa diferente de uma constante. O comando retorna uma tabela com as seguintes colunas: Coluna Table Op Msg type Msg text Valor Nome da Tabela Sempre analyze Um dos seguintes: status, error, info ou warning A mensagem
Voc e pode vericar a distribui c ao de chaves armazenadas com o comando SHOW INDEX. Veja Se c ao 4.6.8.1 [Show database info], P agina 304. Se a tabela n ao foi alterada deste o u ltimo comando ANALYZE TABLE, a tabela n ao ser a analisada novamente. Antes do MySQL 4.1.1, o ANALYZE comnado n ao gravava no log bin ario. Desde o MySQL 4.1.1 eles s ao escritos no log bin ario a menos que a palavra chave opcional NO_WRITE_TO_ BINLOG (ou se alias LOCAL) seja usada.
301
HOSTS
Esvazia as tabelas de cache de nomes de m aquinas. Voc e deve descarregar as tabelas de nomes de m aquinas se alguma de suas m aquinas receber um n umero IP diferente ou se voc e obter a mensagem de erro Host ... is blocked. Quando mais de max_ connect_erros erros occorrer em um registro para uma determinada m aquina enquanto se conecta ao servidor MySQL, o MySQL assume que algo est a errado e bloqueia futuras requisi c oes desta m aquina. A descarga na tabela de nomes de m aquinas permite a m ` aquina se conectar novamente. Veja Se c ao A.2.5 [M aquina bloqueada], P agina 912.) Voc e pode iniciar o mysqld com -O max_connection_errors=999999999 para evitar esta mensagem de erro. Recarrega a chave DES do arquivo que foi especicado com a op c ao --des-key-file durante inicializa c ao do servidor. Fecha e reabre todos os arquivos de log. Se voc e tiver especicado o arquivo de logs de atualiza c oes ou um arquivo de log bin ario sem uma extens ao, o n umero de extens ao do arquivo log ser a sempre incrementado de um em rela c ao ao arquivo anterior. Se voc e usou uma extens ao no nome do arquivo, o MySQL ir a fechar e reabrir o arquivo de log de atualiza c oes. Veja Se c ao 4.10.3 [Log de atualiza c ao], P agina 374. Isto e a mesma coisa que enviar o sinal SIGHUP para o servidor mysqld. Recarrega os privil egios das tabelas de permiss oes no banco de dados mysql. Defragmenta a cache de consulta par utilizar melhor a sua mem oria. Este comando n ao remove qualquer consulta da cache, ao contr ario de RESET QUERY CACHE. Fecha todas as tabelas abertas e for ca o fechamento de todas as tabelas em uso Descarga somente das tabelas fornecidas. Fecha todas tabelas abertas e bloqueia todas tabelas para todos os bancos de dados com leitura at e que algu em execute UNLOCK TABLES. Isto e uma maneira muito conveniente para fazer backups se voc e possui um sistema de arquivos, como Veritas, que pode fazer uma imagem instant anea (snapshot) de um certo momento. Reinicia a maioria das vari aveis de status para zero. Isto e algo que deve ser usado somente para depurar uma consulta. Zera todos os recirsos dos usu arios. Isto permitir a que usu arios bloqueados fa cam login novamente. Veja Se c ao 4.4.7 [Recursos de usu arios], P agina 266.
DES_KEY_FILE LOGS
STATUS USER_RESOURCES
302
Antes do MySQL 4.1.1, o FLUSH comnado n ao gravava no log bin ario. Desde o MySQL 4.1.1 eles s ao escritos no log bin ario a menos que a palavra chave opcional NO_WRITE_TO_ BINLOG (ou se alias LOCAL) seja usada, ou que o comando contenha um dos argumentos: LOGS, MASTER, SLAVE, TABLES WITH READ LOCK, pois qualquer um desses argumwentos podem causar problemas se replicados para um slave. Voc e pode tamb em acessar cada um dos comandos vistos acima com o utilit ario mysqladmin, utilizando os comandos flush-hosts, flush-logs, reload ou flush-tables. Tamb em de uma olhada no comando RESET usado com a replica c ao. Veja Se c ao 4.6.5 [RESET], P agina 302.
SLAVE
QUERY CACHE
303
Voc e tamb em pode usar os comandos mysqladmin processlist e mysqladmin kill para examinar e matar threads. Nota : Atualmente voc e n ao pode utilizar KILL com a biblioteca do servidor MySQL embutido, porque o servidor embutido apenas roda dentro das threads da aplica c ao, ela n ao cria threads de conex oes por si pr opria. Quando voc e utiliza um KILL, um sinal (ag) kill especico e congurado para a thread. Na maioria dos casos pode levar algum tempo para a thread morrer pois o sinal kill s o e checado em intervalos especicos. Nos loops SELECT, ORDER BY e GROUP BY, o sinal e checado depois de ler um bloco de registros. Se o sinal kill est a habilitado a instru c ao e abortada. Na execu c ao de um ALTER TABLE o sinal kill e conferido antes de cada bloco de registros ser lido da tabela original. Se o sinal kill foi habilitado, o comando e abortado e a tabela tempor aria apagada. Ao fazer um UPDATE TABLE and DELETE TABLE, o sinal de kill e conferido depois de que cada bloco e lido e depois de cada atualiza c ao ou remo c ao de registro. Se o sinal kill est a habilitado, a instru c ao e abortada. Note que se voc e n ao estiver utilizando transa c oes, as altera c oes n ao ir ao ser desfeitas! GET_LOCK() ir a aborar com NULL. Uma thread INSERT DELAYED ir a rapidamente descarregar todos registros que estiverem em mem oria e morrer. Se a thread estiver no manipulador de bloqueio de tabelas (status: Locked), o bloqueio de tabela ser a abortado rapidamente. Se a thread estiver esperando por espa co livre em disco numa chamada write, a escrita e abortada com uma mensagem de espa co em disco insuciente.
304
SHOW fornece informa c oes sobre bancos de dados, tabelas, colunas ou informa c oes do estado do servidor. Se a parte LIKE wild e usada, a string wild pode ser uma string que usa os meta caracteres % e _ do SQL.
SHOW FIELDS e um sin onimo para SHOW COLUMNS e SHOW KEYS um sin onimo para SHOW INDEX. Voc e tamb em pode listar as colunas ou indices de uma tabela com mysqlshow nome_db nome_tabela ou mysqlshow -k nome_bd nome_tabela. SHOW INDEX retorna a informa c ao de indice em um formato que lembra bem a chamada SQLStatistics do ODBC. As seguintes colunas s ao retornadas: Coluna Table Non_unique Key_name Seq_in_ index Column_name Signicado Nome da tabela. 0 se o indice n ao puder conter duplicidades, 1 se puder Nome do indice. N umero da sequ encia da coluna no indice, ` a partir de 1. Nome da coluna.
305
Collation
Como a coluna e ordenada no indice. No MySQL, pode ter valores A (Ascendente) ou NULL (Not sorted). N umero de valores u nicos no indice. Isto e atualizado executando isamchk -a. N umero de caracteres indexados se a coluna s o e a indexada parcialmente. NULL se a chave inteira for indexada. Cont em YES se a coluna puder conter NULL. M etodo de indice utilizado. V arios coment arios. No momento, ele diz no MySQL < 4.0.2 se o indice e FULLTEXT ou n ao.
Perceba que como o Cardinality e contado baseado nas estat isticas armazenadas como inteiros, ele pode n ao ser exato para tabelas pequenas. As colunas Null e Index_type foram adicionadas no MySQL 4.0.2.
306
Comment
O Coment ario utilizado quando a tabela e criada (ou alguma informa c ao do porqu e do MySQL n ao poder acessar a informa c ao da tabela). Tabelas InnoDB ir ao relatar o espa co livre no tablespace no coment ario da tabela.
307
| Questions | 2026873 | | Select_full_join | 0 | | Select_full_range_join | 0 | | Select_range | 99646 | | Select_range_check | 0 | | Select_scan | 30802 | | Slave_running | OFF | | Slave_open_temp_tables | 0 | | Slow_launch_threads | 0 | | Slow_queries | 0 | | Sort_merge_passes | 30 | | Sort_range | 500 | | Sort_rows | 30296250 | | Sort_scan | 4650 | | Table_locks_immediate | 1920382 | | Table_locks_waited | 0 | | Threads_cached | 0 | | Threads_created | 30022 | | Threads_connected | 1 | | Threads_running | 1 | | Uptime | 80380 | +--------------------------+------------+ As vari aveis de estado listadas acima tem o seguinte signicado: Vari avel Aborted_clients Aborted_connects Bytes_received Bytes_sent Com_xxxx Connections Created_tmp_disk_ tables Created_tmp_tables Created_tmp_files Delayed_insert_threads Delayed_writes Delayed_errors Flush_commands Handler_delete Signcado N umero de conex oes abortadas porque o cliente morreu sem fechar a conex ao corretamente. Veja Se c ao A.2.10 [Erros de Comunica c ao], P agina 914. N umero de tentativas que falharam ao tentar a conex ao ao servidor MySQL. Veja Se c ao A.2.10 [Erros de Comunica c ao], P agina 914. N umero de bytes recebidos por todos os clientes. N umero de bytes enviados para todos os clientes.. N umero de vezes que os comandos xxx foram executados. N umero de tentativas de conex ao ao servidor MySQL. N umero de tabelas tempor arias implicitas em disco criadas durante a execu c ao de instru c oes. N umero de tabelas tempor arias implicitas na mem oria criadas durante execu c oes de instru c oes. Quantos arquivos tempor arios o mysqld criou. N umero de threads para tratamento de insertdelayed que est ao em uso. N umero de registros escritos com INSERT DELAYED. N umero de registros escritos com INSERT DELAYED onde algum erro ocorreu (provavelmente duplicate key). N umero de comandos FLUSH executados. N umero de vezes que um registro foi apagado da tabela.
308
Handler_read_first
Handler_read_key Handler_read_next
Handler_rollback Handler_update Handler_write Key_blocks_used Key_read_requests Key_reads Key_write_requests Key_writes Max_used_connections Not_flushed_key_blocks Not_flushed_delayed_ rows Open_tables Open_files Open_streams Opened_tables Rpl_status Select_full_join Select_full_range_join Select_range
N umero de vezes que a primeira entrada foi lida de um indice. Se este valor for alto, sugere que o servidor est a fazendo v arias leituras de indices, por exemplo, SELECT col1 FROM foo, assumindo que col1 e indexado. N umero de requisi c oes para ler um registro baseado em uma chave. Se este valor for alto, e uma boa indica c ao que suas pesquisas e tabelas est ao indexadas corretamente. N umero de requisi c oes para ler o pr oximo registro na ordem da chave. Este valor ser a aumentado se voc e consultar uma coluna de indice com uma faixa restrita. Ele tamb em aumentar a se forem feitas busca nos indices. N emro de requisi c oes ao registros anterior na ordem da chave. Ele e principalmente usado para otimizar ORDER BY ... DESC. N umero de requisi c oes para ler um registro baseado em uma posi c ao xa. O valor ser a alto se voc e estiver executando v arias pesquisas que exigem ordena c ao do resultado. N umero de requis oes para ler o pr oximo registro no arquivo de dados. Ser a alto se voc e estiver fazendo v arias buscas na tabela. Geralmente sugere que suas tabelas n ao est ao corretamente indexadas ou que suas pesquisas n ao foram escritas para tirar vantagem dos indices existentes. N umeros de comandos ROLLBACK internos. N umero de requisi c oes para atualizar um registro em uma tabela. N umero de requisi c oes para inserir um registro em uma tabela. O n umero de blocos utilizados no cache das chaves. O n umero de requisi c oes para ler um bloco de chaves do cache. O n umero de leituras f isicas de blocos de chaves do disco. O n umero de requisi c oes para gravar um bloco de chaves no cache. O n umero de escritas f isicas de um bloco de chaves para o disco. O n umero m aximo de conex oes simult aneas que foram usadas. Blocos de chaves no cache de chaves que foi alterado mas ainda n ao foi descarregado para o disco. N umero de registros esperando para serem escritos em las INSERT DELAY. N umero de tabelas abertas. N umero de arquivos abertos. N umero de uxos abertos (usado principalmente para logs). N umero de tabelas que foram abertas. Status de replica c ao segura. (Ainda n ao est a em uso). N umero de joins sem chaves (Se for 0, voc e deve conferir com cuidado o indice de suas tabelas). N umero de joins onde foram usadas pesquisas segmentadas na tabela de referencia. N umero de joins onde foram usadas faixas da primeira tabela. (Normalmente n ao e cr itica mesmo se o valor estiver alto.)
309
N umero de joins onde zemos uma busca completa na primeira tabela. Select_range_check N umero de joins sem chaves onde o uso de chave foi conferido ap os cada registro (Se for 0, o indice de suas tabelas deve ser conferido com cuidado) Questions N umero de consultas enviadas para o servidor. Slave_open_temp_tables N umero de tabelas tempor arias atualmente abertas pela thread slave. ON se este slave est Slave_running E a conectado a um master. Slow_launch_threads N umero de threads que levaram mais tempo do que slow_ lauch_time para serem criadas. Slow_queries N umero de consultas que levaram mais tempo que long_ query_time segundos. Veja Se c ao 4.10.5 [Log de consultas lentas], P agina 378. Sort_merge_passes N umero de ifus oes feitas pelo algor itmo de ordena c ao. Se este valor for alto voc e deve considerar o aumento de sort_ buffer. Sort_range N umero de ordena c oes que foram feitas com limites. Sort_rows N umero de registros ordenados. Sort_scan N umero de ordena c oes que foram feitas lendo a tabela. ssl_xxx Vari aveis usadas por SSL; Ainda n ao implementado. Table_locks_immediate N umero de vezes que um travamento de tabela foi obtido de maneira autom atica. Table_locks_waited N umero de vezes que um bloqueio de tabela n ao p ode ser obtido imediatamente e foi preciso esperar. Se o valor for alto, e voc e tiver problemas de performance, suas consultas devem ser otimizadas e depois dividir sua tabela ou tabelas ou usar replica c ao. Dispon ivel ` a partir da vers ao 3.23.33 Threads_cached N umero de threads no cache de threads. Threads_connected N umero de conex oes atuais abertas. Threads_created N umero de threads criadas para lidar com conex oes. Threads_running N umero de threads que n ao est ao dormindo. Uptime Quantos segundos o servidor est a funcionando. Alguns coment arios sobre a tabela acima: Se Opened_tables for grande, provavelmente sua vari avel table_cache est a muito pequena. Se key_reads for grande, provavelmente sua vari avel key_buffer_size provavelmente est a muito pequena. O indice de acertos do cache pode ser calculaldo com key_ reads/key_read_requests. Se Handler_read_rnd for grande, provavelmente voc e possui v arias consultas que exigem do MySQL fazer busca em tabelas inteiras ou voc e tem joins que n ao utilizam chaves corretamente. Se Threads_created for grande voc e pode desejar aumentar a vari avel thread_cache_size. A taxa de acerto da cache pode ser calculada com Threads_created/Connections. Se Created_tmp_disk_tables for grande, voc e pode querer aumentar a vari avel tmp_ table_size par obter tabelas tempor arias em mem orias em vez de tabelas em disco.
Select_scan
310
311
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
ft_stopword_file have_bdb have_innodb have_isam have_raid have_symlink have_openssl have_query_cache init_file innodb_additional_mem_pool_size innodb_buffer_pool_size innodb_data_file_path innodb_data_home_dir innodb_file_io_threads innodb_force_recovery innodb_thread_concurrency innodb_flush_log_at_trx_commit innodb_fast_shutdown innodb_flush_method innodb_lock_wait_timeout innodb_log_arch_dir innodb_log_archive innodb_log_buffer_size innodb_log_file_size innodb_log_files_in_group innodb_log_group_home_dir innodb_mirrored_log_groups interactive_timeout join_buffer_size key_buffer_size language large_files_support local_infile locked_in_memory log log_update log_bin log_slave_updates log_slow_queries log_warnings long_query_time low_priority_updates lower_case_table_names max_allowed_packet max_binlog_cache_size max_binlog_size max_connections
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
(built-in) YES YES YES NO DISABLED YES YES 1048576 8388608 ibdata1:10M:autoextend 4 0 8 1 ON 50 OFF 1048576 5242880 2 ./ 1 28800 131072 16773120 /usr/local/mysql/share/... ON ON OFF OFF OFF OFF OFF OFF OFF 10 OFF OFF 1047552 4294967295 1073741824 100
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
312
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
max_connect_errors max_delayed_threads max_heap_table_size max_join_size max_relay_log_size max_sort_length max_user_connections max_tmp_tables max_write_lock_count myisam_max_extra_sort_file_size myisam_repair_threads myisam_max_sort_file_size myisam_recover_options myisam_sort_buffer_size net_buffer_length net_read_timeout net_retry_count net_write_timeout open_files_limit pid_file port protocol_version query_cache_limit query_cache_size query_cache_type read_buffer_size read_rnd_buffer_size rpl_recovery_rank safe_show_database server_id slave_net_timeout skip_external_locking skip_networking skip_show_database slow_launch_time socket sort_buffer_size sql_mode table_cache table_type thread_cache_size thread_stack tx_isolation timezone tmp_table_size tmpdir version
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
10 20 16777216 4294967295 0 1024 0 32 4294967295 268435456 1 2147483647 force 8388608 16384 30 10 60 1024 /usr/local/mysql/name.pid 3306 10 1048576 0 ON 131072 262144 0 OFF 0 3600 ON OFF OFF 2 /tmp/mysql.sock 2097116 64 MYISAM 3 131072 READ-COMMITTED EEST 33554432 /tmp/:/mnt/hd2/tmp/ 4.0.4-beta
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
313
| wait_timeout | 28800 | +---------------------------------+------------------------------+ Cada op c ao e descrita abaixo. Valores para tamanhos de buer, comprimento e tamanho de pilha s ao fornecidos em bytes. Voc e pode especicar valores com suxos K ou M para indicar o valor em kilobytes ou megabytes. Por exemplo, 16M indica 16 Megabytes. N ao importa se os suxos est ao em letras mai usuculas ou min usculas; 16M e 16m s ao equivalentes: ansi_mode. Est a ligado (ON) se o mysqld foi iniciado com --ansi. Veja Se c ao 1.8.2 [Modo ANSI], P agina 42. back_log O n umero de requisi c oes de conex oes que o MySQL pode suportar. Isto entra em cena quando a thread principal do MySQL recebe MUITAS solicita c oes de conex oes em um espa co curto de tempo. Eles tomam algum tempo (por em muito pouco) da a thread principal para conferir a conex ao e iniciar uma nova thread. O valor back_log indica quantas requisi c oes podem ser empilhadas durante este breve tempo antes do MySQL parar de responder a novas requisi c oes. Voc e is o precisa aument a-lo se espera um n umero alto de conex oes em um curto periodo de tempo Em outras palavras, este valor e o tamanho da la de escuta para novas conex oes TCP/IP. Seu sistema operacional tem o pr oprio limite para o tamanho desta la. A p agina do manual Unix da chamada de sistema listen(2) deve fornecer maiores detalhes. Conra a documenta c ao do seus SO para saber o valor m aximo para esta vari avel. Tentativas de congurar back_log maior do que o limite de seu sistema operacional ser ao inecazes. basedir O valor da op c ao --basedir. bdb_cache_size O buer que e alocado para o cache de indice e registros de tabelas BDB. Se voc e n ao utiliza tabelas BDB, deve iniciar o mysqld com a op c ao --skip-bdb para evitar desperdicio de mem oria para este cache. bdb_log_buffer_size O buer que e alocado para o cache de indice e registros de tabelas BDB. Se voc e n ao utiliza tabelas BDB, deve congur a-la com 0 ou iniciar o mysqld com a op c ao --skip-bdb para evitar desperd icio de mem oria para este cache. bdb_home O valor para a op c ao --bdb-home. bdb_max_lock O n umero m aximo de bloqueios (1000 por padr ao) que podem ser feitas em uma tabela BDB. Voc e deve ser aument a-la se obter erros do tipo: bdb: Lock table is out of available locks ou Got error 12 from ... quando s ao necess arias longas transa c oes ou quando o mysqld precisar examinar v arios registros para calcular a pesquisa. bdb_logdir O valor da op c ao --bdb-logdir. bdb_shared_data Est a ligada (ON) se voc e estiver utilizando --bdb-shared-data. bdb_tmpdir O valor da op c ao --bdb-tmpdir. binlog_cache_size. O tamanho do cache para armazenar instru c oes SQL para o log bin ario durante uma transa c ao. Se voc e geralmente utiliza transa c oes grandes, multi-instru c oes, voc e pode aumentar este valor para obter mais performance. Veja Se c ao 6.7.1 [COMMIT], P agina 614. bulk_insert_buffer_size (era myisam_bulk_insert_tree_size) MyISAM usa uma cache especial em arvore para fazer inser c oes em bloco (isto e, INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., e LOAD DATA INFILE) mais r apidos.
314
Esta vari avel limita o tamanho da arvore cache em bytes por thread. Den i-la com 0 desabilitar a esta otimiza c ao Nota: esta cache s o e usada quando e adicionado dados a uma tabela n ao vazia. O valor padr ao e 8 MB. character_set O conjunto de caracteres padr ao. character_sets Os conjuntos de caracteres suportados. concurrent_inserts Se ON (ligado, por padr ao), o MySQL permitir a o uso de INSERT em tabelas MyISAM ao mesmo tempo em que s ao executadas consultas SELECT. Voc e pode desligar esta op c ao iniciando mysqld com --safe ou --skip-new. connect_timeout O n umero de segundos que o servidor mysqld espera para um pacote de conex ao antes de responder com Bad handshake. datadir O valor da op c ao --datadir. delay_key_write Option for MyISAM tables. Can have one of the following values: OFF All CREATE TABLE ... DELAYED_KEY_WRITE s ao ignorados. ON (padr ao) MySQL seguir a a op c ao DELAY_KEY_WRITE para CREATE TABLE. ALL Todas as novas tabelas abertas s ao tratadas como se fossem criadas com a op c ao DELAY_KEY_WRITE. Se DELAY_KEY_WRITE estiver habilitado, isto siginica que o buer de chaves das tabelas com esta op c ao n ao ser ao descarregadas a cada atualiza c ao do indice, mas somente quando a tabela e fechada. Isto ir a aumentar bem a velocidade de escrita em chaves, mas voc e deve adicionar verica c ao autom atica de todas as tabelas com myisamchk --fast --force se voc e us a-lo. delayed_insert_limit Depois de inserir delayed_insert_limit registros, o agente que cuida de INSERT DELAYED ira conferir se exitem instru c oes SELECT pendentes. Se sim, ele permite a execu c ao destas antes de continuar. delayed_insert_timeout Quanto tempo uma thread INSERT DELAYED deve esperar por instru c oes INSERT antes de terminar. delayed_queue_size Qual tamanho deve ser alocado para a la (em linhas) para lidar com INSERT DELAYED. Se a la encher, algum cliente que executar INSERT DELAYED ir a esperar at e existir espa co na la novamente. flush E habilitado (ON) se voc e iniciar o MySQL com a op c ao --flush. flush_time Se esta vari avel for congurada com um valor diferente de zero, ent ao a cada flush_time segundos todas tabelas ser ao fechadas (para economizar recursos e sincronizar dados com o disco). Recomendamos esta op c ao somente em sistemas com Win95, Win98 ou outros sistemas com poucos recursos. ft_boolean_syntax Lista de operadores suportados por MATCH ... AGAINST(... IN BOOLEAN MODE). Veja Se c ao 6.8 [Pesquisa Fulltext], P agina 618. ft_min_word_len O tamanho minimo da palavra a ser inclu ida em um indice FULLTEXT. Nota: indices FULLTEXT devem ser reconstruidos depois de alterar esta vari avel. (Esta op c ao e nova para o MySQL 4.0.) ft_max_word_len O tamanho m aximo da palavra a ser inclu ida em um indice FULLTEXT. Nota: indices FULLTEXT devem ser reconstru idos depois de alterar esta vari avel. (Esta op c ao e nova para o MySQL 4.0.)
315
ft_query_expansion_limit N unero de correspond encias a usar para consulta de expans ao (em MATCH ... AGAINST (... WITH QUERY EXPANSION). (Esta op c ao e nova no MySQL 4.1.1) ft_max_word_len_for_sort O tamanho m aximo da palavra a ser inclu ida em um indice FULLTEXT a ser usado no m etodo r apido de recria c ao do indice em REPAIR, CREATE INDEX, ou ALTER TABLE. Palavras mais longas s ao inseridas de modo lento. A regra do ded ao e a seguinte: com ft_max_word_len_for_sort aumentando, MySQL criar a arquivos tempor arios maiores (tornando o processo lente, devido a E/S de disco), e colocar a poucas chaves em um bloco ordenado (diminuindo a eci encia novamente). Quando ft_max_word_len_for_sort e muito pequeno, MySQL ir a inserir v arias palavras no indice de modo lento, mas pequenas palavras ser ao inseridas muito rapidamente. ft_stopword_file O arquivo do qual se l e a lista de palavras de parada para pesquisa fulltext. Todas as palavras do arquivo ser ao usadas; coment arios n ao s ao seguidos. Por padr ao, a lista j a incluida de palavras de parada e a usada (como denido em myisam/ft_static.c). Denir este par ametro com uma string vazia ("") disabilitaa o ltro de palavras de parada. Nota: indices FULLTEXT devem ser reconstru idos depois de alterar esta vari avel. (Esta op c ao e nova para o MySQL 4.0.) have_innodb YES if mysqld suporta tabelas InnoDB. DISABLED se --skip-innodb e usado. have_bdb YES se o mysqld suportar tabelas Berkeley DB. DISABLED se a op c ao --skipbdb for usada. have_raid YES se o mysqld suportar a op c ao RAID. have_openssl YES se o mysqld suportar SSL (criptograa) no protocolo cliente/ servidor. init_file O nome do arquivo especicado com a op c ao --init-file quando voc e iniciar o servidor. Este e um arquivo das instru c oes SQL que voc e deseja que o servidor execute quando e iniciado. interactive_timeout O n umero de segundos que o servidor espera por atividade em uma conex ao antes de fech a-la. Um cliente interativo e denido como um cliente que utiliza a op c ao CLIENT_INTERACTIVE para mysql_real_connect(). Veja tamb em wait_timeout. join_buffer_size O tamanho do buer que e utilizado para full joins (joins que n ao utilizam indices). O buer e alocado uma vez para cada full join entre duas tabelas. Aumente este valor para obter um full join mais r apido quando a adi c ao de indices n ao for possivel. (Normalmente a melhor forma de obter joins r apidas e adicionar indices.) key_buffer_size Blocos de indices s ao buferizados e compartilhados por todas as threads. key_buffer_size e o tamanho do buer utilizado para indexar blocos. Aumente-o para lidar melhor com os indices (para todas as leituras e escritas m ultiplas) para o m aximo poss ivel 64M em uma m aquina com 256M que executa, principalmente, o MySQL e bastante comum. Entretanto, se voc e deixar este valor muito grande (mais que 50% da sua mem oria total?) seu sistema pode iniciar a paginar e se tornar MUITO lento. Lembre-se que como o MySQL n ao utiliza cache de leitura de dados, ser a necess ario deixar algum espa co para o cache do sistema de arquivos para o Sistema Operacional.
316
Voc e pode vericar a performance do buer de chaves executando SHOW STATUS e examinar as vari aveis Key_read_requests, Key_reads, Key_write_requests e Key_writes. A raz ao de Key_reads/Key_read_request deve normalmente ser < 0.01. O Key_ write/Key_write_requests e normalmnte pr oximo de 1 se voc e estiver utilizando na maioria updates/deletes mas deve ser bem menor se voc e tender a fazer atualiza c oes que afetam v arias outras ao mesmo tempo ou se voc e estiver utilizando DELAY_KEY_WRITE. Veja Se c ao 4.6.8 [SHOW], P agina 303. Para obter ainda mais velocidade quando estiver gravando v arios registros ao mesmo tempo, utilize LOCK TABLES. Veja Se c ao 6.7.5 [LOCK TABLES], P agina 616. language A linguagem utilizada para mensagens de erro. large_file_support Se o mysqld foi compilado com op c oes para suporte a grandes arquivos. locked_in_memory Se o mysqld foi travado na mem oria com --memlock log Se o log de todas as consultas est a habilitado. log_update Se o log de atualiza c oes est a habilitado. log_bin Se o log bin arios est a habilitado. log_slave_updates Se as atualiza c oes do slave devem ser logadas. long_query_time Se uma consulta demorar mais que isto (em segundos), o contador Slow_queries ser incrementado. Se voc e estiver utilizando --log-slow-queries, a consulta ser a logada ao arquivo de consultas lentas. Veja Se c ao 4.10.5 [Slow query log], P agina 378. Este valor e medido em tempo real, n ao em tempo de CPU, assim uma consulta que pode estar pode estar abaixo do limiar de um sistema de carga leve pode estar acima do limiar de um sistema de carga pesada. Veja Se c ao 4.10.5 [Log de consultas lentas], P agina 378. lower_case_nome_tabelas Se estiver congurado para 1, nomes de tabelas s ao armazenados em letras min usculas no disco e nomes de tabelas ser ao caso-insensitivo. Na vers ao .0.2, esta op c ao tamb em se aplica aos nomes de banco de dados. Na vers ao 4.1.1 esta op c ao tamb em se aplcia a alias de tabelas. Veja Se c ao 6.1.3 [Caso sensitivo nos nomes], P agina 473. max_allowed_packet O valor m aximo de um pacote. O buer de mensagens e iniciado por net_buffer_length bytes, mas pode crescer at e max_allowed_packet bytes quando for necess ario. Este valor por padr ao e pequeno, para obter pacotes maiores (possivelmente errados). Voc e deve incrementar este valor se voc e estiver usando colunas BLOB grandes. Ele deve t ao grande quanto o maior BLOB que voc e deseja utilizar. O protocol atual limita o max_allowed_packet ` a 16M no MySQL 3.23 e 1G no MySQL 4.0. max_binlog_cache_size Se uma transa c ao multi-instru c oes necessitar de mais que este montante de mem oria, ser a obtido o erro "Multi-statement transaction required more than max binlog cache size bytes of storage" ("Transa c ao multi-instru c oes necessita mais que max binlog cache size bytes de armazenamento"). max_binlog_size Dispon ivel a partir da 3.23.33. Se uma escrita ao log bin ario (replica c ao) exceder o valor fornecido, rotacione os logs. Voc e n ao pode congur a-lo para menos de 4096 bytes (1024 na vers ao do MySQL anteriores a 4.0.14), ou mais que 1 GB. O valor padr ao e 1 GB. Nota se voc e estiver usando transa c oes: uma transa c ao
317
e escrita em um bloco no arquivo de log bin ario, j a que ele nunca e separado entre diversos logs bin arios. Desta forma, se voc e tiver grandes transa c oes, voc e pode ter logs bin arios maioores que max_binlog_size. Se max_relay_log_size (dispon ivel a partir do MySQL 4.0.14) e 0, ent ao max_binlog_size se aplicar a bem aos relay logs. max_connections O N umero de clientes simult aneos permitidos. Aumentar este valor aumente o n umero de descritores de arquivos que o mysqld necessita. Veja abaixo os coment arios sobre os limites de descritores de arquivos. Veja Se c ao A.2.6 [Muitas conex oes], P agina 912. max_connect_errors Se houver mais que este n umero de conex oes interrompidas a partir de uma m aquina est a m aquina ter a as pr oximas conex oes bloqueadas. Voc e pode desbloquar uma m aquina com o comadno FLUSH HOSTS. max_delayed_threads N ao inicie mais do que este n umero de threads para lidar com instru c oes INSERT DELAYED. Se voc e tentar inserir dados em uma nova tabela depois que todas as threads INSERT DELAYED estiverem em uso, o registro ser a inserido como se o atributo DELAYED n ao fosse especicado. Se voc e congur a-lo com 0, o MySQL nunca criar a uma thread max delayed. max_heap_table_size N ao permita cria c ao de tabelas heap maiores que este valor. max_join_size Joins que provavelmente forem ler mais que max_join_size registros retornam um erro. Congure este valor se os seus usu arios tendem a realizar joins que n ao possuem uma cl ausula WHERE, que tomam muito tempo, e retornam milh oes de registros. max_relay_log_size Dispon ivel a partir da vers ao 4.0.14. Se uma escrita ao relay log (um tipo de log usado por slaves de replica c ao, veja Se c ao 4.11.3 [Replication Implementation Details], P agina 381) exceder o valor dado, rotacione o relay log. Esta vari avel lhe permite colocar diferentes restri c oes de tamanho no relay logs e logs bin arios. No entanto, congurar a vari avel com 0 far a o MySQL usar max_binlog_size tanto para o log bin ario quanto para o relay logs. Voc e tem que congurar max_relay_log_size com 0 ou mais de 4096, e menos que 1 GB. O padr ao e 0. max_seeks_for_key Limite do n umero m aximo de buscas ao procurar linhas com base em uma chave. O otimizador MySQL assumir a que quando pesquisar por linhas correspondentes em uma tabela atrav es da varredura da chave, n ao faremos mais que este n umero de busca de chave independente da cardinalidade da chave. Congurando este par ametro com um valor baixo (100 ?) voc e pode for car o MySQL a preferir chaves em vez de varrer a tabela. max_sort_length O n umero de bytes utilizados para ordenar valores BLOB ou TEXT (somente os primeiros max_sort_lenght bytes de cada valor s ao usados; o resto e ignorado). max_user_connections O valor m aximo de conex oes ativas para um u nico usu ario (0 = sem limite). max_tmp_tables (Esta op c ao ainda n ao faz nada.) N umero m aximo de tabelas tempor arias que um cliente pode manter abertas ao mesmo tempo. max_write_lock_count Depois desta quantidade de bloqueios de escrita, permite que alguns bloqueios de leitura sejam executados. myisam_recover_options O valor da op c ao --myisam-recover.
318
myisam_sort_buffer_size O buer que e alocado ao ordenar o indice quando estiver fazendo um REPAIR ou estiver criando indices com CREATE INDEX ou ALTER TABLE. myisam_max_extra_sort_file_size. Se a cria c ao do arquivo tempor ario para cria c ao r apida de indices fosse este valor maior que quando for usado o cache de chaves, de prefer encia ao m etodo de cache de chaves. Isto e usado principalmente para for car que longas chaves de caracteres em tabelas grandes usem o m etodo de cache de chaves mais lenta para criar o indice. NOTE que este par ametro e fornecido em megabytes! myisam_repair_threads. Se este valor e maior que um, durante o processo reparo por ordena c~ ao os indices de tabels MyISAM ser ao criados em paralelo - cada indice em sua pr opria thread. Nota reparos com multi-threads est a ainda sob c odigo de qualidade alpha. myisam_max_sort_file_size O tamanho m aximo do arquivo tempor ario que e permitido ao MySQL usar enquanto recria os indices (durante REPAIR, ALTER TABLE ou LOAD DATA INFILE). Se o tamanho do arquivo for maior que isto, o indice ser a criado atrav es do cache de chaves (que e mais lento). NOTE que este par ametro e fornecido em megabytes antes da vers ao 4.0.3 e em bytes a partir desta vers ao. net_buffer_length O buer de comunica c oes e congurado para este tamanho entre queries. Isto n ao deve ser alterado normalmente, mas se voc e tem muito pouca mem oria, pode congur a-lo para o tamanho esperado de uma consulta. (Isto e, o tamanho experado das instru c oes SQL enviadas pelos clientes. Se as instru c oes excederem este valor, o buer e aumentado automaticamente, at e max_allowed_packet bytes.) net_read_timeout N umero de segundos para esperar por mais dados de uma conex ao antes de abortar a leitura. Perceba que quando n os n ao esperamos dados de uma conex ao, o tempo m aximo de espera e denido pelo write_timeout. Veja tamb em slave_read_timeout. net_retry_count Se uma leitura na porta de comunica c oes for interrompida, tente novamente net_retry_count vezes antes de parar. Este valor deve ser bem alto no FreeBSD j a que interrup c oes internas s ao enviadas para todas as threads. net_write_timeout N umero de segundos para esperar pela escrita de um bloco em uma conex ao antes de abortar a escrita. open_files_limit N umero de arquivos que o sistema permite que o mysqld abra. Este e o valor real dado para o sistema e pode ser diferente do valor que voc e passa ao mysqld como par ametro de inicializa c ao. Ele e 0 em sistemas onde o MySQL n ao pode alterar o n umero de arquivos abertos. pid_file O valor da op c ao --pid-file. port O valor da opcao --port. protocol_version A vers ao do protocolo usada pelo servidor MySQL. range_alloc_block_size Tamanho dos blocos que s ao alocados ao se fazer uma otimiza c ao da faixa. read_buffer_size (era record_buffer) Cada thread que faz uma leitura sequencial aloca um buer deste tamanho para cada tabela lida. Se voc e zer v arias leituras sequenciais, voc e pode desejar aumentar este valor.
319
read_rnd_buffer_ae (era record_rnd_buffer) Ao ler registros na ordem depois de uma ordena c ao, os registros s ao lidos atrav es deste buer para evitar pesquisas em disco. Pode melhorar bastante o ORDER BY se congurado com um valor alto. Como esta e uma vari avel espec ica da thread, n ao se pode den i-la globalmente, mas apenas alter a-la ao executar alguma consulta especica grande. query_alloc_block_size Tamanho dos blocos de aloca c ao de mem oria que s ao alocados para objetos criados durante a an alise e execu c ao da consulta. Se voc e tiver problemas com fragmenta c ao de mem oria ele pode ajudar a aumentar isto um pouco. query_cache_limit N ao armazena resultados que s ao maiores que esta vari avel. (Padr ao 1M). query_cache_size A mem oria alocada para armazenar resultados de consultas antigas. Se 0, a cache de consulta e desabilitada (padr aot). query_cache_type Pode ser congurado com (somente num erico) Valor Alias Coment ario 0 OFF N ao armazena ou recupera resultados 1 ON Armazena todos os resultados exceto consultas SELECT SQL_NO_ CACHE .... 2 DEMAND Armazena apenas consultas SELECT SQL_CACHE .... query_prealloc_size Buer persistente para an alise e execu c ao da consulta. N ao e liberado entre consultas. Em teoria, tornando-o grande o suciente voc e pode fazer o MySQL executar consultas sem ter que fazer uma u nica chamada malloc. safe_show_database N ao exibe bancos de dados nos quais o usu ario n ao tem nenhum privil egios. Isto pode melhorar a seguran ca se voc e se preocupa com o fato das pessoas estarem aptas a ver quais bancos de dados outros usu arios possuem. Veja tamb em skip_show_databases. server_id O valor da op c ao --server-id. skip_locking Est a desligado (OFF) se o mysqld usar bloqueio externo. skip_networking Est a ligado (ON) se somente permitimos conex oes locais (socket). skip_show_databases Isto previne usu arios de fazerem SHOW DATABASES se eles n ao possuirem o privil egio PROCESS_PRIV. Isto pode aumentar a seguran ca se voc e se preocupa com o fato das pessoas poderem ver quais bancos de dados outros usu arios possuem. Veja tamb em safe_show_databases. slave_net_timeout N umero de segundos para esperar por mais dados de uma conex ao de master/slave antes de abortar a leitura. slow_launch_time Se a cria c ao de threads demorar mais que este valor (em segundos), o contador Slow_launch_threads ser a incrementado. socket O socket Unix utilizado pelo servidor. sort_buffer Cada thread que precisar fazer uma ordena c ao aloca um buer deste tamanho. Aumente este valor para opera c oes ORDER BY ou GROUP BY mais r apidas. Veja Se c ao A.4.4 [Arquivos tempor arios], P agina 925. table_cache O n umero de tabelas abertas para todas as threads. Aumentar este valor aumenta o n umero de descritores de arquivos que o mysql necessita. O MySQL precisa de dois descritores de arquivos para cada tabela u nica aberta. Veja abaixo os comenta arios sobre os limites do descritor de arquivos. Voc e pode conferir se necessita
320
aumentar o cache de tabela conferindo a vari avel Opened_tables. Veja Se c ao 4.6.8.3 [Tabelas Abertas], P agina 306. Se esta vari avel for grande e voc e n ao faz muitos FLUSH TABLES (que apenas for ca todas as tabelas a serem fechadas e reabertas), ent ao voc e deve aumentar o valor desta vari avel. Para informa c oes sobre como o cache de tabelas funciona, veja Se c ao 5.4.7 [Table cache], P agina 452. table_type O tipo padr ao de tabelas. thread_cache_size Quantas threads devem ser mantidas em cache para reutiliza c ao. Quando um cliente desconecta, as threads dos clientes s ao colocadas no cache se n ao existir mais de thread_cache_size threads que antes. Todas novas threads ser ao obtidas primeiramente do cache, e s o quando o cache estiver vazio uma nova thread e criada. Esta vari avel pode ser aumentada para melhorar a performance se voc e tiver v arias conex oes novas. (Normalmente isto n ao d a uma melhora de performance not avel se voc e possuir uma boa implementa c ao de threads.) Examinando as diferen cas entre Connections e Threads_create (veja Se c ao 4.6.8.3 [SHOW STATUS], P agina 306 para maiores detalhes) pode ser visto o qu ao ecente e o cache de threads atual. thread_concurrency No Solaris, mysqld ir a chamar thr_setconcurrency() com este valor. thdr_setconcurrency() permite que a aplica c ao forne ca ao sistema de threads uma dica com o n umero desejado de threads que devem ser executados ao mesmo tempo. thread_stack O tamanho da pilha para cada thread. V arios dos limites detectados pelo teste crash-me s ao dependentes deste valor. O padr ao e grande o suciente para opera c oes normais. Veja Se c ao 5.1.4 [Benchmarks do MySQL], P agina 422. timezone O fuzo hor ario para este servidor. tmp_table_size Se uma tabela tempor aria em mem oria exceder este tamanho, o MySQL ir a a convert e-la automaticamente para uma tabela MyISAM em disco. Aumente o valor de tmp_table_size se voc e zer v arias consultas GROUP BY avan cadas e voc e tiver muita mem oria. tmpdir O diret orio utilizado para arquivos tempor arios e tabelas tempor arias. A partir do MySQL 4.1, ele pode ser denido com uma lista de caminhos separados por dois pontos (:) (ponto e v irgula (; no Windows). Eles ser ao usados de modo robin-round. Este recurso pode ser usado para dividir a craga entre diversos discos f isicos. transaction_alloc_block_size Tamanho dos blocos de aloca c ao de mem oria que s ao alocados para consultas de armazenamento que s ao parte de uma transa c ao que est a para ser armazenada no log bin ario ao se fazer um commit. transaction_prealloc_block_size Buer persistente para transaction_alloc_ blocks que n ao e liberado entre as consultas. Tornando-o grande o suciente para caber todas as consulta em uma transa c ao comum voc e pode evitar muitas chamadas malloc. version O n umero da vers ao do servidor. wait_timeout O n umero de segundos que o servidor espera pela atividade em uma conex ao antes de fech a-la. Veja tamb em interactive_timeout. Na inicializa c ao da thread, SESSION.WAIT_TIMEOUT e inicializado por GLOBAL.WAIT_ TIMEOUT ou GLOBAL.INTERACTIVE_TIMEOUT dependendo do tipo do cliente
321
Veja tamb em
A se c ao do manual que descreve o ajuste do MySQL cont em algumas informa c oes de como sintonizar as vari aveis acima. Veja Se c ao 5.5.2 [Par ametros do servidor], P agina 455.
322
deleting from reference tables Ao executar a segunda parte de um delete multitabela e estamos deletando o registros correspondentes em outras tabelas. Flushing tables A thread est a executando FLUSH TABLES e est a esperando que todas as threads fechem as suas tabelas. Killed Algu em enviou um sinal para matar a thread e ela deve abortar a pr oxima vez que ele vericar o par ametro kill. O par ametro e vericado em cada loop maior no MySQL, mas em alguns casos ainda pode levar um tempo curto para a thread morrer. Se a thread est a bloqueada par outra thread, a naliza c ao ter a efeito assim que as outras threads liberarem o bloqueio. Sending data A thread est a processando registros para uma instru c ao SELECT e tamb em est a enviando dados ao cliente. Sorting for group A thread est a fazendo uma ordena c ao para satisfazer a um GROUP BY. Sorting for order A thread est a fazendo uma ordena c ao para satisfazer a um ORDER BY. Opening tables Isto simplesmente signica que a thread est a tentando abrir uma tabela. Este deve ser um procedimento muito r apido, a menos que algo previna da abertura. Por exemplo um ALTER TABLE ou um LOCK TABLE pode prvenir a abertura de uma tabela at e que o comando esteja nalizado. Removing duplicates A consulta estava usando SELECT DISTINCT de tal modo que o MySQL n ao podia otimizar o distinct em um estagio anterior. Por isto o MySQL fez um est agio extra para remover todos os registros duplicados antes de enviar o resultado ao cliente. Reopen table A thread obteve um lock para a tabela, mas noticou ap os o lock que a estrutura da tabela alterou. Ela liberou o lock, fechou a tabela e agora est a tentando reabr i-la. Repair by sorting O c odigo de repara c ao est a utilizando ordenamento para recriar os indices. Repair with keycache O c odigo de repara c ao est a usando a cria c ao de chaves uma a uma atrav es da cache de chaves. Isto e muito mais lento que Repair by sorting. Searching rows for update A thread esta fazendo uma primeira fase pra encontrar todos os registros coincidentes antes de atualiz a-los. Isto deve ser feito se o UPDATE est a alterando o indice usado para encontrar os registros envolvidos. Sleeping A thread est a esperando que o cliente envie um novo comando a ela. System lock A thread est a esperando um lock de sistema externo para a tabela. Se voc e n ao est a usando m ultiplos servidores mysqld que est ao acessando a mesma tabela, voc e pode desabilitar o lock de sistema com a op c ao --skip-external-locking. Upgrading lock O manipulador de INSERT DELAYED est a tentando obter um lock para inserir registros na tabela. Updating A thread est a procurando por registros para atualiz a-los. User Lock A thread est a esperando um GET_LOCK(). Waiting for tables A thread recebeu uma notica c ao que a estrutura de uma tabela foi alterada e ela precisa reabrir a tabela para receber a nova estrutura. Para poder
323
reabrir a tabela ela deve esperar at e que todas a outras threads tenham fechado a tabela em quest ao. A notica c ao acontece se outra thread usou FLUSH TABLES ou um dos seguintes comando na tabela em quest ao: FLUSH TABLES nome_tabela, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE ou OPTIMIZE TABLE. waiting for handler insert O manipulador do INSERT DELAYED processou todas as inser c oes e est a esperado por outras. A maioria dos estados s ao opera c oes muito r apidas. Se a thread permanecer em qualquer destes estados por muitos segundos, pode haver um problema que precisa ser investigado. Existem outros estados que n ao s ao mencionados anteriormente, mas a maioia deles s o s ao u teis para encontrar erros no mysqld.
324
SHOW ERRORS [LIMIT row_count] Este comando e implementado no MySQL 4.1.0. Ele mostra os erros,a visos e notas recebidos para o u ltimo comando. Os erros/avisos s ao reiniciados para cada comando que utiliza uma tabela. O servidor MySQL envia de volta o n umero total de avisos e erros que voc e recebe para o u ltimo comando; Isto pode ser retornado chamando mysql_warning_count(). At e as mensagens max_error_count s ao armazenadas (vari aveis global e espec icas da thread). Voc e pode recuperar o n umero de erros de @error_count e avisos de @warning_count. SHOW WARNINGS mostra todos os erros, avisos e notas que voc e recebeu para o u ltimo comando enquanto SHOW ERRORS lhe mostra apenas o erro. mysql> DROP TABLE IF EXISTS no_such_table; mysql> SHOW WARNINGS; +-------+------+-------------------------------+ | Level | Code | Message | +-------+------+-------------------------------+ | Note | 1051 | Unknown table no_such_table | +-------+------+-------------------------------+ Note que no MySQL 4.1.0 apenas adicionamos a estrutura para avisos e poucos comandos MySQL ainda geraram avisos. A vers ao 4.1.1 suporta todos os tipos de avisos para LOAD DATA INFILE e instru c oes DML tais como os comandos INSERT, UPDATE e ALTER. Por exemplo, aqui est a um caso simple que produz avisos de convers ao para instru c oes de inser c ao. mysql> create table t1(a tinyint NOT NULL, b char(4)); Query OK, 0 rows affected (0.00 sec) mysql> insert into t1 values(10,mysql),(NULL,test),(300,open source); Query OK, 3 rows affected, 4 warnings (0.15 sec) Records: 3 Duplicates: 0 Warnings: 4 mysql> show warnings; +---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1263 | Data truncated for column b at row 1 | | Warning | 1261 | Data truncated, NULL supplied to NOT NULL column a at row 2 | | Warning | 1262 | Data truncated, out of range for column a at row 3 | | Warning | 1263 | Data truncated for column b at row 3 | +---------+------+---------------------------------------------------------------+ 4 rows in set (0.00 sec) O n umero m aximo de avisos pode ser espec icado usando a vari avel do servidor max_ error_count, SET max_error_count=[count]; Por padr ao e 64. No caso de avisos desabilitados, simplesmente zere esta vari avel. No caso de max_error_count ser 0, ent ao o conta-
325
dor de avisos ainda representa quantos avisos ocorreram, mas nenhuma das mensagens s ao armazenadas. Por exemplo, considere o seguinte instru c ao de tabela ALTER para o exemplo acima, o qual retorna apenas um mensagem de aviso embora o total de avisos seja 3, ao denir max error count=1. mysql> show variables like max_error_count; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_error_count | 64 | +-----------------+-------+ 1 row in set (0.00 sec) mysql> set max_error_count=1; Query OK, 0 rows affected (0.00 sec) mysql> alter table t1 modify b char; Query OK, 3 rows affected, 3 warnings (0.00 sec) Records: 3 Duplicates: 0 Warnings: 3 mysql> show warnings; +---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1263 | Data truncated for column b at row 1 | +---------+------+----------------------------------------+ 1 row in set (0.00 sec) mysql>
326
| InnoDB | YES | Supports transactions, row-level locking and foreign keys | | BDB | NO | Supports transactions and page-level locking | +--------+---------+-----------------------------------------------------------+ 6 rows in set (0.00 sec) A op c ao Support DEFAULT indica se um tipo de tabela particular e e suportado, e qual eo tipo padr ao. Se o servidor e iniciado com --default-table-type=InnoDB, ent ao o campo Support do InnoDB ter a o valor DEFAULT.
SHOW PRIVILEGES Este comando e implementado no MySQL 4.1.0. SHOW PRIVILEGES mostra a lista de privil egios de sistema o servidor MySQL suporta. mysql> show privileges; +------------+--------------------------+------------------------------------------| Privilege | Context | Comment +------------+--------------------------+------------------------------------------| Select | Tables | To retrieve rows from table | Insert | Tables | To insert data into tables | Update | Tables | To update existing rows | Delete | Tables | To delete existing rows | Index | Tables | To create or drop indexes | Alter | Tables | To alter the table | Create | Databases,Tables,Indexes | To create new databases and tables | Drop | Databases,Tables | To drop databases and tables | Grant | Databases,Tables | To give to other users those privileges yo | References | Databases,Tables | To have references on tables | Reload | Server Admin | To reload or refresh tables, logs and priv | Shutdown | Server Admin | To shutdown the server | Process | Server Admin | To view the plain text of currently execut | File | File access on server | To read and write files on the server +------------+--------------------------+------------------------------------------14 rows in set (0.00 sec)
327
aptos a lidar com o conjuntos de caracteres latin1 e todos os multi-byte no bin ario. Outros conjuntos de caracteres ser ao carregados de um arquivo de deni c oes de conjuntos de caracteres quando necess arios. O conjunto de caracteres determina quais s ao os caracteres permitidos em nomes e qual a forma de ordena c ao por cl ausulas ORDER BY e GROUP BY da instru c ao SELECT. Voc e pode alterar o conjunto de caracteres com a op c ao --default-character-set na inicializa c ao do servidor. Os conjuntos de caracteres dispon iveis dependem dos par ametros --with-charset=charset e --with-extra-charset= list-of-charset | complex | all | none e os arquivos de congura c oes de conjuntos de caracteres listados em SHAREDIR/charsets/ Index. Veja Se c ao 2.3.3 [Op c oes de congura c oes], P agina 97. Se o conjunto de caracteres for alterado durante a execu c ao do MySQL (que tamb em pode alterar a ordena c ao), deve-se executar o 0myisamchk -r -q --set-character-set=charset em todas as tabelas. De outra forma seus indices podem n ao ser ordenados corretamente. Quando um cliente conecta a um servidor MySQL, o servidor envia o conjunto de caracteres padr ao em uso ao cliente. O cliente ir a alternar para o uso deste conjunto de caracteres nesta conex ao. Deve ser utilizado mysql_real_escape_string() quando desejar ignorar segu encias de caracteres em uma consulta SQL. mysql_real_escape_string() e identico ` a antiga fun c ao mysql_espace_string(), exceto pelo fato de usar a manipulador de conex ao MySQL como o primeiro par ametro. Se o cliente for compilado com o caminho diferente daquele onde o servidor est a instalado e o usu ario que congurou o MySQL n ao incluiu todos os conjuntos de caracteres no bin arios do MySQL, deve ser especicado para o cliente onde ele pode encontrar os conjuntos de caracteres adcicionais que ser ao necess arios se o servidor executar com um conjunto de caracteres diferente do cliente. Isto pode ser especicado colocando em um arquivo de op c oes do MySQL: [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets onde o caminho aponta para onde os conjuntos de caracteres din amicos do MySQL s ao armazenados. Pode-se for car o cliente a usar conjuntos de caracteres espec icos especicando: [client] default-character-set=nome-conjunto-caracteres mas normalmente isto nunca ser a necess ario.
328
-> ue u -> ss Todos os caracteres acentuados, s ao convertidos para suas contra partes sem acentos e em letras mai usculas. Todas as letras s ao convertidas para mai usculas. Ao compara strings com LIKE o mapeamento de caracteres de um -> dois n ao e feito. Todas as letras s ao convertidas para mai usculas. Acentos s ao removidos para todas as letras exceto: U, u, O, o, Ae a.
329
Coment arios iniciam com um caractere # e continuam at e o m da linha. Palavras s ao separadas por quantidades arbitr arias de espa cos em brancos. Ao denir o conjunto de caracteres, cada palavra deve ser um n umero no formato hexadecimal O vetor ctype obt em as primeiras 257 palavras. Os vetores to_lower, to_upper e sort_order obt em, cada um, as 256 palavras seguintes. Veja Se c ao 4.7.4 [Vetor de caracteres], P agina 330. 3. Adicione o nome do conjunto de caracteres ` as listas CHARSETS_AVAILABLE e COMPILED_ CHARSETS no configure.in. 4. Recongure, recompile e teste. Para um conjunto de caracteres complexo fa ca o seguinte: 1. Crie o arquivo strings/ctype-MYSET.c na distribui c ao fonte do MYSQL. 2. Adicione MYSET ao nal do arquivo sql/share/charsets/Index. n umero u nico a ele. Associe um
3. Procure por um dos arquivos ctype-*.c existentes para ver o que precisa ser denido, por exemplo strings/ctype-big5.c. Perceba que os vetores no seu arquivo deve ter nomes como ctype_MYSET, to_lower_MYSET e etc. Isto corresponde aos arrays no conjunto simples de caracteres - Se c ao 4.7.4 [Vetor de caracteres], P agina 330 - para um conjunto de caracteres complexo. 4. Pr oximo ao topo do arquivo, coloque um coment ario especial como este: /* * This comment is parsed by configure to create ctype.c, * so dont change it unless you know what you are doing. * * .configure. number_MYSET=MYNUMBER * .configure. strxfrm_multiply_MYSET=N * .configure. mbmaxlen_MYSET=N */ O programa configure utiliza este coment ario para incluir o conjunto de caracteres na biblioteca MySQL automaticamente. As linhas strxfrm multiply e mbmaxlen ser ao explicadas nas pr oximas se c oes. S o as inclua se voc e precisar de fun c oes de ordena ca o de strings ou das fun c oes de conjuntos de caracteres multi-byte, respectivamente. 5. Voc e deve ent ao criar algumas das seguintes fun c oes: my_strncoll_MYSET() my_strcoll_MYSET() my_strxfrm_MYSET() my_like_range_MYSET() Veja Se c ao 4.7.5 [Ordena c ao de caracteres], P agina 330. 6. Adicione o nome do conjunto de caracteres ` as listas CHARSETS_AVAILABLE e COMPILED_ CHARSETS no configure.in.
330
7. Recongure, recompile e teste. O arquivo sql/share/charsets/README fornece algumas instru c oes a mais. Se voc e desejar ter o seu conjunto de caracteres inclu ido na distribui c ao MySQL, envie um email com um patch para a lista de email internals do MySQL. Veja Se c ao 1.7.1.1 [Mailing-list], P agina 33.
331
Voc e deve especicar o valor strxfrm_multiply_MYSET=N no coment ario especial no topo do arquivo. N deve ser congurado para a raz ao m axima que as strings podem crescer durante my_strxfrm_MYSET (ele deve ser um inteiro positivo).
332
Voc e pode sobrepor ignorar as op c oes padr oes para todos os programas clientes com um arquivo de op c oes. Se c ao 4.1.2 [Arquivo de op c oes], P agina 217. A lista abaixo descreve brevemente os programas MySQL. myisamchk Utilit ario para descrever, conferir, otimizar e reparar tabelas MySQL. Como o myisamchk tem muitas fun c oes, eles s ao descritos em seu pr oprio cap itulo. Veja Capptexi tulo 4 [Administra c ao do Banco de Dados MySQL], P agina 208. make_binary_distribution Cria uma edi c ao bin aria de um MySQL compilado. Isto pode ser enviado por FTP para /pub/mysql/Incoming em support.mysql.com para a conveni encia de outros usu arios MySQL. mysqlbug mysqld O script para relatar erros no MySQL. Este script deve sempre ser utilizado quando for necess ario preencher um relat orio de erros para a lista do MySQL. O servidor (daemon) SQL. Deve sempre estar em execu c ao.
mysql_install_db Cria as tabelas de permiss oes do MySQL com os privil egios padr oes. Este comando normalmente e executado somente na primeira vez quando o MySQL e instalado em um sistema.
333
--basedir=caminho --core-file-size=# Tamanho do arquivo core que o mysqld poder a criar. Passado para ulimit -c. --datadir=caminho --defaults-extra-file=caminho --defaults-file=caminho --err-log=caminho --log-error=caminho Gava o log de erro no caminho acima. P agina 373. --ledir=caminho Caminho para mysqld --log=caminho --mysqld=vers~ ao_do_mysqld Nome da vers ao do mysqld no diret orio ledir que voc e deseja iniciar. --mysqld-version=vers~ ao Similar ao --mysqld= mas aqui voc e s o fornece o suxo para o mysqld. Por exemplo, se voc e utiliza --mysqld-version=max, o mysqld_safe ir a iniciar a vers ao ledir/mysqld-max. Se o argumento para --mysqld-version estiver vazio, ledir/mysqld ser a usado. --nice=# (adicionado no MySQL 4.0.14) --no-defaults --open-files-limit=# N umero de arquivos que o mysqld poder a abrir. Passado para ulimit -n. Perceba que ser a necess ario iniciar mysqld_safe como root para isto funcionar corretamente! --pid-file=caminho --port=# --socket=caminho --timezone=# Congura a vari avel de fuso hor ario (TZ) para o valor deste par ametro. --user=# O script mysqld_safe e grav avel, portanto ele deve estar apto para iniciar um servidor que foi instalado de uma fonte ou uma vers ao bin aria do MySQL, mesmo se o servidor estiver instalado em localiza c oes um pouco diferentes. mysqld_safe espera uma destas condi c oes ser verdadeira: O servidor e o banco de dados pode ser encontrado relativo ao diret orio de onde o mysqld_safe foi chamado. mysqld_safe procura dentro de seu diret orio de trabalho pelos diret orios bin e data (para distribui c oes bin arias) ou pelos diret orios libexec e var (para distribui c oes baseadas em c odigo fonte). Esta condi c ao deve ser satisfeita se voc e executar o mysqld_safe a partir do seu diret orio da instala c ao do MySQL (por exemplo, /usr/local/mysql para uma distribui c ao bin aria).
334
Se o servidor e os bancos de dados n ao forem encontrados relativos ao diret orio de trabalho, mysqld_safe tenta localiz a-lo utilizando caminhos absolutos. Localiza c oes t ipicas s ao /usr/local/libexec e /usr/local/var. As localiza c oes atuais foram determinadas quando a distribui c ao foi constru ida da qual vem o mysqld_safe. Eles dever estar corretas se o MySQL foi instalado na localiza c ao padr ao. Como o mysqld_safe tentar a encontrar o servidor e o banco de dados relativo a seu diret orio de trabalho, voc e pode instalar uma distribui c ao bin aria do MySQL em qualquer lugar, desde de que o mysqld_safe seja iniciado a partir do diret orio da instala c ao: shell> cd diret orio_instala c~ ao_mysql shell> bin/mysqld_safe & Se o mysqld_safe falhar, mesmo se invocado a partir do diret orio de instala c ao do MySQL, voc e pode modic a-lo para usar o caminho para o mysqld e as op c oes de caminho que seriam corretas para seu sistema. Perceba que se voc e atualizar o MySQL no futuro, sua vers ao modicada de mysqld_safe ser a sobrescrita, portanto, voc e deve fazer uma c opia de sua vers ao editada para que voc e a possa reinstalar.
335
--example Fornece um exemplo de um arquivo de congura c ao. --help --log=... Arquivo Log. Deve ser informado o caminho completo e o nome do arquivo log. NOTA: se o arquivo existir, tudo ser a anexado. --mysqladmin=... Bin ario mysqladmin a ser usado para o desligamento do servidor. --mysqld=... Bin ario mysqld a ser usado. Lembre-se que voc e tamb em pode fornecer mysqld_ safe a esta op c ao. As op c oes s ao passadas ao mysqld. Apenas tenha certeza que o mysqld est a localizado na sua vari avel de ambiente PATH ou corrija o mysqld_safe. --no-log Imprime na sa ida padr ao em vez do arquivo log. Por padr ao o arquivo log sempre ca ligado. --password=... Senha do usu ario para o mysqladmin. --tcp-ip Conecta ao(s) servidor(es) MySQL atrav es de porta TCP/IP no lugar de socket UNIX. Isto afeta a a c ao de desligar e relatar. Se um arquivo socket estiver faltando, o servidor pode ainda estar executando, mas s o pode ser acessado atrav es da porta TCP/IP. Por padr ao a conex ao e feita atrav es de socket UNIX. Exibe esta ajuda e sai.
--user=... Usu ario MySQL para o mysqladmin. --version Exibe o n umero da vers ao e sai. Algumas notas sobre mysqld_multi: Tenha certeza que o usu ario MySQL, que nalizar os servi cos mysqld (e.g. utilizando o mysqladmin) tem a mesma senha e usu ario para todos os diret orios de dados acessados (para o banco de dados mysql). E tenha certeza que o usu ario tem o privil egio Shutdown priv ! Se voc e possui diversos diret orios de dados e v arios bancos de dados mysql com diferentes senhas para o usu ario root do MySQL, voc e pode desejar criar um usu ario comum multi-admin para cada um que utilize a mesma senha (veja abaixo). Exemplo de como fazer isto: shell> mysql -u root -S /tmp/mysql.sock -psenha_root -e "GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BY multipass" Veja Se c~ ao 4.3.6 [Privil egios], P agina 233. Voc e deve fazer isto para cada servidor mysqld executando em cada diret orio de dados, que voc e tem (Apenas altere o socket, -S=...) pid-file e muito importante, se voc e estiver utilizando mysqld_safe para iniciar o mysqld (ex. mysqld=mysqld safe) Todos os mysqld devem ter seus pr oprios pidfile. A vantagem de utilizar o mysqld_safe no lugar de executar diretamente o mysqld
336
e que mysqld_safe guarda todos os processos e ir a reinici a-los, se um processo do mysqld falhar devido a um sinal kill -9, ou similar. (Como um falha de segmenta c ao, que nunca pode acontecer com o MySQL.) Por favor note que pode ser necess ario executar o script mysqld_safe de um lugar espec ico. Isto signica que voc e pode ter que alterar o diret orio atual para um diret orio especico antes de iniciar o mysqld_multi. Se voc e tiver problemas ao iniciar, por favor veja o script mysqld_safe. Verique especialmente as linhas: -------------------------------------------------------------------------MY_PWD=pwd Check if we are starting this relative (for the binary release) if test -d /data/mysql -a -f ./share/mysql/english/errmsg.sys -a -x ./bin/mysqld -------------------------------------------------------------------------Veja Se c ao 4.8.2 [mysqld_safe], P agina 332. O teste acima deve ser bem sucedido, ou voc e pode encontrar problemas. Esteja certo do perigoso de iniciar m ultiplos mysqlds no mesmo diret orio de dados. Utilize diret orios de dados diferentes, a menos que voc e realmente SAIBA o que est a fazendo! O arquivo de socket e a porta TCP/IP devem ser diferentes para cada mysqld. O primeiro e quinto grupo mysqld foram intencionalmente deixados de lado no exemplo. Voc e pode ter lacunas no arquivo de congura c ao. Isto lhe permite mais exibilidade. A ordem na qual os mysqlds s ao iniciados ou desligados depende da ordem em que eles aparecem no arquivo de congura c ao. Quando voc e desejar referenciar a um grupo espec ico utilizando GNR com este programa, basta utilizar o n umero no m do nome do grupo ([mysqld# <==). Voc e pode desejar utilizar a op c ao user para o mysqld, mas para isto voc e precisa ser o usu ario root quando iniciar o script mysqld_multi. N ao importa se a op c ao existe no arquivo de congura c ao; voc e receber a apenas um alerta se voc e n ao for o superusu ario e o mysqlds for iniciado com a SUA conta no Unix. IMPORTANTE: Tenha certeza que o pid-file e o diret orio de dados e acess ivel para leitura e escrita (+execu c ao para o diret orio) para ESTE usu ario UNIX que iniciar a o processo mysqld. NAO utilize a conta de root para isto, a menos que voc e SAIBA o que est a fazendo! MAIS IMPORTANTE: Tenha certeza que voc e entendeu os signicados das op c oes que PRECISARIA ter processos mysqld s ao passadas para os mysqlds e porque VOCE IRA melhorar separados. Iniciando m ultiplos mysqlds em um diret orio de dados NAO a performance em um sistema baseado em threads. Veja Se c ao 4.2 [Servidores m ultiplos], P agina 220. Este e um exemplo do arquivo de congura c ao para o funcionamento do mysqld_multi.
# Este arquivo provavelmente deve estar em seu diret orio home (~/.my.cnf) ou /etc/my # Version 2.1 by Jani Tolonen [mysqld_multi] mysqld = /usr/local/bin/mysqld_safe mysqladmin = /usr/local/bin/mysqladmin user = multi_admin
337
password [mysqld2] socket port pid-file datadir language user [mysqld3] socket port pid-file datadir language user [mysqld4] socket port pid-file datadir language user [mysqld6] socket port pid-file datadir language user
= multipass
= = = = = =
= = = = = =
= = = = = =
= = = = = =
338
disco como faz o Stacker no MS-DOS. Normalmente, myisampack compacta o arquivo de dados 40%-70%. O MySQL utiliza mapeamento de mem oria (nmap()) em tabelas compactadas e retorna ao uso normal de leitura e escrita se nmap() n ao funcionar. Por favor, note o seguinte: Depois de comapctada, a tabela e somente-leitura. Isto e, normalmente, pretendido (como quando acessamos tabelas compactadas em um CD). Permitir que se fa ca grava c ao em uma tabela compactada tamb em est a em nossa lista TODO, mas com baixa prioridade. myisampack tamb em pode compactar colunas BLOB ou TEXT. O antigo pack_isam (para tabelas ISAM) n ao pode fazer isto. myisampack e chamado desta forma: shell> myisampack [op c~ oes] nome_arquivo ... indice (.MYI). Se voc e n ao se Cada nome arquivo deve ter o nome de um arquivo de encontra em um diret orio de bancos de dados, voc e deve especicar o caminho completo para o arquivo. Pode-se omitir a extens ao .MYI. myisampack suporta as seguintes op c oes: -b, --backup Realiza um backup da tabela como nome_tabela.OLD. -#, --debug=debug_options Log da sa ida de depura c ao. d:t:o,nome_arquivo. A string debug_options geralmante e
-f, --force For ca a compacta c ao da tabela mesmo se ela se tornar maior ou se o arquivo tempor ario existir. myisampack cria um arquivo tempor ario chamado nome_tabela.TMD enquanto ele compacta a tabela. Se voc e matar o myisampack o arquivo .TMD n ao pode ser removido. Normalmente, myisampack sai com um erro se ele descobrir que nome_tabela.TMD existe. Com --force, myisampack compacta a tabela de qualquer maneira. -?, --help Exibe uma mensagem de ajuda e sai. -j nome_tabela_grande, --join=nome_tabela_grande Une todas as tabelas nomeadas na linha de comando em uma u nica tabela nome_ tabela_grande. Todas tabelas que forem combinadas DEVEM ser id enticas (mesmos nomes de colunas e tipos, alguns indices, etc.). -p #, --packlength=# Especica o comprimento do tamanho de armazenamento, em bytes. O valor deve ser 1, 2 ou 3. (myisampack armazena todas as linhas com ponteiros de tamanhos 1, 2 ou 3 bytes. Na maioria dos casos normais, myisampack pode determinar o valor correto do tamanho antes de come car a compactar o arquivo, mas ele pode noticar durante o processo de compacta c ao que ele pode ter usado um tamanho menor. Neste caso myisampack ir a exibir uma nota dizendo que
339
a pr oxima vez que voc e compactar o mesmo arquivo voc e pode utilizar um registro de tamanho menor.) -s, --silent Modo silencioso. Escreve a sa ida somente quando algum erro ocorrer. -t, --test N ao compacta realmente a tabela, apenas testa a sua compacta c ao. -T dir_name, --tmp_dir=dir_name Utiliza o diret orio especicado como a localiza c ao em que ser ao gravadas as tabelas tempor arias. -v, --verbose Modo verbose. Escreve informa c ao sobre o prograsso e resultado da compacta c ao. -V, --version Exibe informa c ao de vers ao e sai. -w, --wait Espera e tenta novamente se a tabela estiver em uso. Se o servidor mysqld foi iniciado com a op c ao --skip-locking, n ao e uma boa id eia chamar myisampack se a tabela puder ser atualizada durante o processo de compacta c ao. A seq u encia de comandos mostrados abaixo ilustra uma t ipica se c ao de compacta c ao de tabelas: shell> ls -l station.* -rw-rw-r-1 monty my 994128 Apr 17 19:00 station.MYD -rw-rw-r-1 monty my 53248 Apr 17 19:00 station.MYI -rw-rw-r-1 monty my 5767 Apr 17 19:00 station.frm shell> myisamchk -dvv station MyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-02-02 3:06:43 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafile pointer (bytes): 2 Keyfile pointer (bytes): 2 Max datafile length: 54657023 Max keyfile length: 33554431 Recordlength: 834 Record format: Fixed length table description: Key Start Len Index Type 1 2 4 unique unsigned long 2 32 30 multip. text Field Start Length Type
Rec/key 1 1
340
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
1 2 6 10 11 31 32 62 97 132 167 171 187 222 226 242 262 282 302 332 336 340 341 349 357 365 367 369 373 377 378 380 388 392 396 400 404 405 409 413 417 421 425 429 449 479 480
1 4 4 1 20 1 30 35 35 35 4 16 35 4 16 20 20 20 30 4 4 1 8 8 8 2 2 4 4 1 2 8 4 4 4 4 1 4 4 4 4 4 4 20 30 1 1
341
48 49 50 51 52 53 54 55 56 57
481 560 639 718 797 805 806 807 827 831
79 79 79 79 8 1 1 20 4 4
shell> myisampack station.MYI Compressing station.MYI: (1192 records) - Calculating statistics normal: 20 empty-space: 16 pre-space: 0 end-space: 12 Original trees: 57 After join: 17 - Compressing file 87.14% shell> ls -l -rw-rw-r--rw-rw-r--rw-rw-r-station.* 1 monty 1 monty 1 monty empty-zero: table-lookups: 12 5 empty-fill: zero: 11 7
my my my
127874 Apr 17 19:00 station.MYD 55296 Apr 17 19:04 station.MYI 5767 Apr 17 19:00 station.frm
shell> myisamchk -dvv station MyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-04-17 19:04:26 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafilepointer (bytes): 3 Keyfile pointer (bytes): 1 Max datafile length: 16777215 Max keyfile length: 131071 Recordlength: 834 Record format: Compressed table description: Key Start Len Index Type 1 2 4 unique unsigned long 2 32 30 multip. text Field Start Length Type 1 1 1 constant 2 2 4 zerofill(1)
Rec/key 1 1
Huff tree 1 2
342
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
6 10 11 31 32 62 97 132 167 171 187 222 226 242 262 282 302 332 336 340 341 349 357 365 367 369 373 377 378 380 388 392 396 400 404 405 409 413 417 421 425 429 449 479 480 481 560
4 1 20 1 30 35 35 35 4 16 35 4 16 20 20 20 30 4 4 1 8 8 8 2 2 4 4 1 2 8 4 4 4 4 1 4 4 4 4 4 4 20 30 1 1 79 79
no zeros, zerofill(1) table-lookup no endspace, no endspace, no empty no endspace, zerofill(1) no endspace, no endspace, zerofill(1) no endspace, no endspace, no endspace, no endspace, no endspace, always zero always zero table-lookup table-lookup always zero no zeros, zerofill(1) no zeros, zerofill(1) table-lookup no zeros, zerofill(1) no zeros always zero table-lookup no zeros, zerofill(1) no zeros, zerofill(1) no zeros always zero no zeros always zero no zeros always zero no empty no empty not_always not_always, no empty not_always, no empty not_always, no empty not_always, no empty not_always, no empty not_always no empty no empty no empty
2 3 4 3 5 6 7 6 2 5 6 2 5 8 8 5 6 2 2 3 9 10 2 2 2 2 11 3 2 2 2 12 13 2 2 2 2 2 2 2 2 3 3 14 14 15 2
9 9 0 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 0 0 9 9 9 9 0 9 9 9 9 0 9 9 9 9 9 9 9 9 9 9 9 4 4 9 9
343
50 639 79 no empty 51 718 79 no endspace 52 797 8 no empty 53 805 1 54 806 1 55 807 20 no empty 56 827 4 no zeros, zerofill(2) 57 831 4 no zeros, zerofill(1) A informa c ao exibida pelo myisampack e descrita abaixo: normal
2 16 2 17 3 3 2 2
9 9 9 1 9 9 9 9
empty-space O n umero de colunas contendo valores que s ao somente espa cos; estes ocupar ao apenas 1 bit. empty-zero O n umero de colunas contendo valores que s ao somente 0s bin arios; ocupar ao 1 bit. empty-fill O n umero de colunas inteiras que n ao ocupam a faixa completa de bytes de seu tipo; estes s ao alteradas para um tipo menor (por exemplo, uma coluna INTEGER pode ser alterada para MEDIUMINT). pre-space O n umero de colunas decimais que s ao armazenadas com espa cos a esquerda. Neste caso, cada valor ir a conter uma contagem para o n umero de espa cos. end-space O n umero de colunas que tem muitos espa cos espa cos extras. Neste caso, cada valor conter a uma contagem para o n umero de espa cos sobrando. table-lookup A coluna tem somente um pequeno n umero de valores diferentes, que s ao convertidos para um ENUM antes da compress ao Human. zero O n umero de colunas em que todos os valores est ao zerados. Original trees O n umero inicial de arvores Human. After join O n umero de arvores Human distintas que sobram depois de unir arvores para poupar espa co de cabe calho. Depois que uma tabela foi compactada, myisamchk -dvv exibe informa c oes adicionais sobre cada campo: Type O tipo de campo deve conter as seguites descri c oes: constant Todas linhas tem o mesmo valor. no endspace N ao armazena espa cos no m.
344
no endspace, not_always N ao armazena espa cos no m e n ao faz compacta c ao de espa cos nais para todos os valores. no endspace, no empty N ao armazena espa cos no m. N ao armazena valores vazios. table-lookup A coluna foi convertida para um ENUM. zerofill(n) Os n bytes mais signicativos no valor s ao sempre 0 e n ao s ao armazenados. no zeros N ao armazena zeros. always zero Valores zero s ao armazenados em 1 bit. Huff tree A arvore Human associada com o campo. Bits O n umero de bits usado na arvore Human. Depois de ter executado pack_isam/myisampack voc e deve executar o isamchk/myisamchk para recriar o indice. Neste momento voc e pode tamb em ordenar os blocos de indices para criar estatisticas necess arias para o otimizador do MySQL trabalhar de maneira mais eciente. myisamchk -rq --analyze --sort-index nome_tabela.MYI isamchk -rq --analyze --sort-index nome_tabela.ISM Depois de instalar a tabela compactada no diret orio de banco de dados MySQL voc e deve fazer mysqladmin flush-tables para for car o mysqld a iniciar usando a nova tabela. Se voc e desejar descompactar uma tabela compactada, voc e pode fazer isto com a op c ao --unpack para o isamchk ou myisamchk.
mysqld-max e o servidor MySQL (mysqld) congurado com as seguintes op c oes de congura c ao: Op c ao Coment ario with-server-sux=-max Adiciona um suxo ` a string de vers ao mysqld with-innodb Suporte a tabelas InnoDB with-bdb Suporte para tabelas Berkeley DB (BDB) CFLAGS=Suporte a links simb olicos para Windows DUSE SYMDIR A op c ao para habilitar o suporte ao InnoDB e necess ario apenas no MySQL 3.23. No MySQL 4 e acima, o InnoDB j a e inclu ido por padr ao. Voc e pode encontrar os bin arios do MySQL-max em http://www.mysql.com/downloads/mysql-max-4.0.h A distribui c ao bin aria Windows MySQL 3.23 inclui tanto o bin ario mysqld.exe padr ao e o bin ario mysqld-max.exe. http://www.mysql.com/downloads/mysql-4.0.html. Veja Se c ao 2.1.1 [Instala c ao no Windows], P agina 60.
345
Note que como o Berkeley DB (BDB) n ao est a dispon ivel para todas plataformas, alguns dos bin arios Max podem n ao ter suporte para ela. Voc e pode conferir quais tipos de tabelas s ao suportadas executando a seguinte consulta: mysql> SHOW VARIABLES LIKE "have_%"; +------------------+----------+ | Variable_name | Value | +------------------+----------+ | have_bdb | NO | | have_crypt | YES | | have_innodb | YES | | have_isam | YES | | have_raid | NO | | have_symlink | DISABLED | | have_openssl | NO | | have_query_cache | YES | +------------------+----------+ O signicado dos valores na segunda coluna s ao: Valor Signicado. YES A op c ao est a ativa e e utilizada. NO O MySQL n ao est a compilado com suporte a esta op c ao. DISABLED A op c ao xxx est a desabilitada porque o mysqld foi iniciado com --skipxxxx ou porque n ao foi iniciado com todas as op c oes necess arias para habilitar esta op c ao. Neste caso o arquivo hostname.err deve conter uma raz ao indicando o porque da op c ao estar desabilitada. NOTA: Para conseguir criar tabelas InnoDB voc e DEVE editar suas op c oes de inicializa c ao para incluir ao menos a op c ao innodb_data_file_path. Veja Se c ao 7.5.2 [InnoDB no MySQL 3.23], P agina 642. Para obter melhor performance para tabelas BDB, voc e deve adicionar algumas op c oes de congura c ao para elas tamb em .Veja Se c ao 7.6.3 [Iniciando BDB], P agina 696. mysqld_safe tenta iniciar automaticamente qualquer bin ario mysqld com o prexo -max. Isto faz com que seja f acil testar um outro bin ario mysqld em uma instala c ao existente. Apenas execute o configure com as op c oes deseejadas e, ent ao, instale o novo bin ario mysqld como mysqld-max no mesmo diret orio onde seu antigo bin ario mysqld est a. Veja Se c ao 4.8.2 [mysqld_safe], P agina 332. No Linux, o RPM mysqld-max utiliza o recurso mysqld_safe j a mencionado. (Ele apenas instala o execut avel mysqld-max e o mysqld_safe usar a automaticamente este execut avel quando o mysqld_safe for reiniciado). A tabela a seguir mostra quais tipos de tabelas nossos bin arios MySQL-Max incluem: Sistema BDB InnoDB Windows/NT S S AIX 4.3 N S HP-UX 11.0 N S Linux-Alpha N S Linux-Intel S S Linux-IA-64 N S
346
Solaris-Intel N S SolarisS S SPARC SCO OSR5 S S UnixWare S S Mac OS X N S Note que a partir do MySQL 4, voc e n ao precisa de um servidos MySQL Max para o InnoDB porque ele e inclu ido por padr ao.
347
mysql
A ferramenta de linha de comando para a entrada de consultas interativamente ou a execu c ao de consultas a partir de um arquivo no modo batch. Veja Se c ao 4.9.2 [mysql], P agina 347. Este programa fornece uma interface gr aca para interagir com o servidor. server. Veja Se c ao 4.9.3 [mysqlcc], P agina 355.
mysqlcc
mysqlaccess Um script que verica os privil egios de acesso para uma combina c ao de nome de m aquina, usu ario e banco de dados. mysqladmin Utilit ario para realizar opera c oes administrativas, tais como cria c ao ou remo c ao de bancos de dados, recarga das tabelas de permiss oes, descarga de tabelas em disco e reabertura dos arquivos log. mysqladmin tamb em pode ser usado para exibir informa c oes de vers ao, processos e estado do servidor. Veja Se c ao 4.9.4 [mysqladmin], P agina 357. mysqlbinlog Utilit ario para leitura das consultas de um log bin ario. Pode ser usado para recupera c ao de falhas com um backup antigo. Veja Se c ao 4.9.5 [mysqlbinlog], P agina 359. mysqldump Descarrega um banco de dados MySQL em um arquivo como instru c oes SQL ou como arquivo texto separado por tabula c ao. Vers ao aprimorada do freeware escrito originalmente por Igor Romanenko. Veja Se c ao 4.9.7 [mysqldump], P agina 362. mysqlimport Importa arquivos texto em suas tabelas respectivas utilizando LOAD DATA INFILE. Veja Se c ao 4.9.9 [mysqlimport], P agina 368. mysqlshow replace Exibe informa c oes sobre bancos de dados, tabelas, colunas e indices. Um programa utilit ario que e usado pelo msql2mysql, mas que tamb em pode ser aplic avel mais genericamente. replace altera conjuntos de caracteres. Utiliza uma m aquina de estado nito para comparar strings maiores primeiro. Pode ser usada para trocar conjuntos de caracteres. Por exemplo, este comando troca a e b nos arquivos dados: shell> replace a b b a -- arquivo1 arquivo2 ...
348
shell> mysql database < script.sql > saida.tab Se voc e tiver problemas devido a mem oria insuciente no cliente, utilize a op c ao --quick! Isto for ca o mysql a utilizar mysql_use_result() no lugar de mysql_store_result() para recuperar o conjunto de resultados. Utilizar o mysql e muito f aci. Inicie-o como mostrado a seguir: mysql banco_de_dados ou mysql --user=nome_usu ario --password=sua_senha banco_de_dados. Digite uma instru c ao SQL, termine-a com ;, \g, ou \G e pressione RETURN/ENTER. O mysql Suporta as seguintes op c oes: -?, --help Exibe esta ajuda e sai. -A, --no-auto-rehash Sem reprocessamento autom atico. O rehash deve ser usado se o usu ario desejar que o cliente mysql complete as tabelas e campos. Esta op c ao e usada para acelerar a inicializa c ao do cliente. --prompt=... Congura o prompt do mysql com o formato especicado. -b, --no-beep Deliga o beep nos erros. -B, --batch Exibe resultados com o caractere de tabula c ao como o separador, cada registro em uma nova linha. N ao utiliza o arquivo de hist orico. --character-sets-dir=... Diret orio onde os conjuntos de caracteres est ao localizados. -C, --compress Utiliza compacta c ao no protocolo cliente/servidor. -#, --debug[=...] Log de Depura c ao. O padr ao e d:t:o,/tmp/mysql.trace. -D, --database=... Qual banco de dados usar. Isto geralmente e util em um arquivo my.cnf. --default-character-set=... Congura o conjunto de caracters padr ao. -e, --execute=... Executa o comando e sai. (Sa ida parecida com batch) -E, --vertical Exibe a sa ida de uma consulta (linhas) verticalmente. Sem esta op c ao voc e tamb em pode for car esta sa ida terminando suas instru c oes com \G. -f, --force Continue mesmo se for obtido um erro SQL.
349
-g, --no-named-commands Comandos nomeados ser ao desabilitados. Utilize somente a forma \*, ou use comandos nomeados apenas no come co da linha terminada com um ponto-ev irgula (;). Desde a vers ao 10.9, o cliente agora inicia com esta op c ao habilitada por padr ao! Com a op c ao -g, entretando, comandos de formato longo continuar ao funcionando na primeira linha. -G, --enable-named-commands Comandos nomeados s ao habilitados. Comandos de formato longo s ao aceitos assim como os comandos reduzidos \*. -i, --ignore-space Ignore caractere de espa co depois de nomes de fun c oes. -h, --host=... Conectar ` a m aquina especicada. -H, --html Produz sa ida HTML.
-X, --xml Produz sa ida XML. -L, --skip-line-numbers quando se deseja comparar N ao escreve o n umero da linha para os erros. Util arquivos com resultados que incluem mensagens de erro. --no-pager Desabilita pagina c ao e impress ao na sa ida padr ao. Veja tamb em a ajuda interativa (\h). Desabilita arquivo de sa ida. Veja tamb em a ajuda interativa (\h).
--no-tee
-n, --unbuffered Descarrega e atualiza o buer depois de cada pesquisa. -N, --skip-column-names N ao escrever nomes de colunas nos resultados. -O, --set-variable nome=op c~ ao Fornece um valor a uma vari avel. --help lista as vari aveis. Por favor, note que as sintaxes --set-variable=name=value e -O name=value est ao obsoletas desde o MySQL 4.0, use --nome=valor. -o, --one-database Atualiza somente o banco de dados padr ao. Isto eu til para evitar atualiza c ao em outros bancos de dados no log de atualiza c oes. --pager[=...] Tipo de sa ida. O padr ao e sua vari avel de ambiente PAGER. Paginadores v alidos s ao: less, more, cat [>nome arquivo], etc. Veja tamb em a ajuda interativa (\h). Esta op c ao n ao funciona no modo batch. A op c ao pager funciona somente no UNIX.
350
-p[password], --password[=...] Senha a ser usada ao conectar ao servidor. Se uma senha n ao e fornecida na linha de comando, lhe ser a solicitado uma. Perceba que se voc e utilizar o formato curto -p voc e n ao pode ter um espa co entre a op c ao e a senha. -P --port=... N umero da porta TCP/IP para usar na conex ao. --protocol=(TCP | SOCKET | PIPE | MEMORY) Especica o protocolo de conex ao usado. Novo no MySQL 4.1. -q, --quick N ao faz cache do resultado, imprime linha a linha. Isto pode deixar o servidor mais lento se a sa ida for suspendida. N ao usa arquivo de hist orico. -r, --raw Exibe valores de colunas sem convers ao de escapes. Utilizado com --batch --reconnect Se a conex ao e perdida, tentar reconectar ao servidor automaticamente (mas apenas uma vez). -s, --silent Op c ao para ser mais silencioso. -S --socket=... Arquivo socket para ser utilizado na conex ao. -t --table Sa ida no formato de tabela. Isto e padr ao no modo n ao-batch.
-T, --debug-info Exibe alguma informa c ao de depura c ao na sa ida. --tee=... Anexa tudo no arquivo de sa ida. Veja tamb em a ajuda interativa (\h). N ao funciona no modo batch.
-u, --user=# Usu ario para login diferente do usu ario atual do sistema. -U, --safe-updates[=#], --i-am-a-dummy[=#] Permite somente que UPDATE e DELETE utilizem chaves. Veja abaixo para maiores informa c oes sobre esta op c ao. Voc e pode zerar esta op c ao se possui-la no arquivo my.cnf utilizando --safe-updates=0. -v, --verbose Modo verbose (-v -v -v fornece o formato de sa ida da tabela). -V, --version Gera sa ida com informa c ao de vers ao e sai. -w, --wait Espera e repete em vez de sair se a conex ao estiver inacess ivel.
Voc e tamb em pode congurar as seguntes vari aveis com -O ou --set-variable. Por favor, note que as sintaxes --set-variable=nome=valor e -O name=value est ao obsoletas desde o MySQL 4.0, use --var=option:
351
Padr ao Descri c ao 0 N umero de seguntos antes de esgotar o tempo da conex ao 0 Disabilita (0) ou habilita (1) capacidade LOCAL para LOAD DATA INFILE max allowed packet 16777216Tamanho m aximo do pacote para enviar/receber do servidor net buer length 16384 Tamanho do buer para comunica c ao TCP/IP e socket select limit 1000 Limite autom atico para SELECT quando utilizar --safeupdtaes max join size 1000000 Limite autom atico para registros em uma join quando utilizar --safe-updtaes. Se o cliente mysql perder a conex` ao com o servidor enquanto envia uma consulta, ele tentar a se reconectar imediatamente e automaticamente uma vez e enviar a consulta novamente. Note que mesmo se ele obter sucesso na reconex ao, como sua primeira conex ao foi nalizada, todas seus objetos da sess ao anteriores foram perdidos: tabelas tempor arias, e vari aveis de sess ao e de usu ario. Desta forma, o comportamento acima pode ser perigoso para voc e, como neste exemplo onde o servidor foi desligado e reiniciado sem voc e saber: mysql> set @a=1; Query OK, 0 rows affected (0.05 sec) mysql> insert into t values(@a); ERROR 2006: MySQL server has gone away No connection. Trying to reconnect... Connection id: 1 Current database: test Query OK, 1 row affected (1.30 sec) mysql> select * from t; +------+ | a | +------+ | NULL | +------+ 1 row in set (0.05 sec) A vari avel de usu ario @a foi perdida com a conex ao e depois da reconex ao ela e indenida. Para se proteger deste risco, voc e pode iniciar o cliente mysql com a op c ao --disablereconnect. Se voc e digitar help na linha de comando, mysql ir a exibir os comandos que ele suporta: mysql> help MySQL commands: help (\h) ? (\h) clear (\c) connect (\r)
Display this text. Synonym for help. Clear command. Reconnect to the server. Optional arguments are db and host.
352
delimiter (\d) Set query delimiter. edit (\e) Edit command with $EDITOR. ego (\G) Send command to mysql server, display result vertically. exit (\q) Exit mysql. Same as quit. go (\g) Send command to mysql server. nopager (\n) Disable pager, print to stdout. notee (\t) Dont write into outfile. pager (\P) Set PAGER [to_pager]. Print the query results via PAGER. print (\p) Print current command. prompt (\R) Change your mysql prompt. quit (\q) Quit mysql. rehash (\#) Rebuild completion hash. source (\.) Execute an SQL script file. Takes a file name as an argument. status (\s) Get status information from the server. system (\!) Execute a system shell command. tee (\T) Set outfile [to_outfile]. Append everything into given outfile. use (\u) Use another database. Takes database name as argument. Os comandos edit, nopager, pager, e system funcionam apenas no Unix. O comando status lhe fornece algumas informa co es sobre a conex ao e o servidor que est a utilizando. Se voc e estiver executando no modo --safe-updates, status ir a tamb em imprimir os valores para as vari aveis mysql que afetam suas consultas. Uma op c ao u til para iniciantes (introduzido no MySQL vers ao 3.23.11) e o --safe-updates (ou --i-am-a-dummy para usu arios que uma vez possam ter feito um DELETE FROM nome_ tabela mas esqueceram da cl ausula WHERE). Quando utilizar esta op c ao, o mysql envia o seguinte comando ao servidor MySQL quando abrir a conex ao. SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#, SQL_MAX_JOIN_SIZE=#max_join_size#" onde #select_limit# e #max_join size# s ao vari aveis que podem ser conguradas da linha de comando mysql. Veja Se c ao 5.5.6 [SET OPTION], P agina 461. O efeito da op c ao acima e: Voc e n ao tem permiss ao de utilizar uma instru c ao UPDATE ou DELETE se voc e n ao possuir uma chave na parte WHERE. Pode-se, entretanto, for car um UPDATE/DELETE utilizando LIMIT: UPDATE nome_tabela SET campo_nao_chave=# WHERE campo_nao_chave=# LIMIT 1; Todos resultados maiores s ao limitados automaticamente a #select_limit# linhas. SELECTs que provavelmente precisar ao examinar mais que #max_join_size combina coes de linhas ser ao abortadas. Algumas dicas u teis sobre o cliente mysql:
353
Alguns dados s ao muito mais leg iveis quando exibido verticalmente, em vez da sa ida do tipo caixa horizontal comum. Por exemplo: Textos longos, que incluem v arias linhas, s ao muito mais f aceis de serem lidos com sa ida vertical. mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 lIMIT 300,1\G *************************** 1. row *************************** msg_nro: 3068 date: 2000-03-01 23:29:50 time_zone: +0200 mail_from: Monty reply: monty@no.spam.com mail_to: "Thimble Smith" <tim@no.spam.com> sbj: UTF-8 txt: >>>>> "Thimble" == Thimble Smith writes: Thimble> Hi. I think this is a good idea. Is anyone familiar with UTF-8 Thimble> or Unicode? Otherwise, Ill put this on my TODO list and see what Thimble> happens. Yes, please do that. Regards, Monty file: inbox-jani-1 hash: 190402944 1 row in set (0.09 sec) Para o log, voc e pode utilizar a op c ao tee. O tee pode ser iniciado com a op c ao --tee=..., ou pela linha de comando de maneira interativa com o comando tee. Todos os dados exibidos na tela ser ao anexados no arquivo fornecido. Isto tamb em pode ser muito u til para prop ositos de depura c ao. O tee pode ser desabilitado da linha de comando com o comando notee. Executando tee novamente o log e reiniciado. Sem um par ametro o arquivo anterior ser a usado. Perceba que tee ir a atualizar os resultados dentro do arquivo depois de cada comando, pouco antes da linha de comando reaparecer esperando pelo pr oximo comando. Navegar ou pesquisar os resultados no modo interativo em algum programa do UNIX como o less, more ou outro similar, e agora poss ivel com a op c ao --pager[=...]. Sem argumento, o cliente mysql ir a procurar pela vari avel de ambiente PAGER e congurar pager para este valor. pager pode ser iniciado a partir da linha de comando interativa com o comando pager e desabilitado com o comando nopager. O comando recebe um argumento opcional e e o pager ser a congurado com ele. O comando pager pode ser chamado com um argumento, mas isto requer que a op c ao --pager seja usada, ou o pager ser a usado com a sa ida padr ao. pager funciona somente no UNIX, uma vez que e utilizado a fun c ao popen(), que n ao existe no Windows. No Windows a op c ao tee pode ser utilizada, entretanto ela pode n ao ser c omoda como pager pode ser em algumas situa c oes. Algumas dicas sobre pager: Voc e pode us a-lo para gravar em um arquivo: mysql> pager cat > /tmp/log.txt
354
e os resultados ir ao somente para um arquivo. Voc e tamb em pode passar qualquer op c oes para os programas que voc e deseja utilizar com pager: mysql> pager less -n -i -S Note a op c ao -S exibida acima. Voc e pode ach a-la muito u til quando navegar pelos resultados; experimente com a op c ao com sa ida a horizontal (nalize os comandos com \g, ou ;) e com sa ida vertical (nal dos comandos com \G). Algumas vezes um resultado com um conjunto muito largo e dif icil ser lido na tela, com a op c ao -S para less, voc e pode navegar nos resultados com o less interativo da esquerda para a direita, evitando que linhas maiores que sua tela continuem na pr oxima linha. Isto pode tornar o conjunto do resultado muito mais legivel. voc e pode alterar o modo entre ligado e desligado com o less interativo com -S. Veja o h(help) para mais ajuda sobre o less. Voc e pode combinar maneiras muito complexas para lidar com os resultados, por exemplo, o seguinte enviaria os resultados para dois arquivos em dois diferentes diret orios, em dois discos diferentes montados em /dr1 e /dr2, e ainda exibe o resultado na tela via less: mysql> pager cat | tee /dr1/tmp/res.txt | \ tee /dr2/tmp/res2.txt | less -n -i -S Voc e tamb em pode combinar as duas fun c oes acima; tenha o tee habilitado, o pager congurado para less e voc e estar a apto a navegar nos resultados no less do Unix e ainda ter tudo anexado em um arquivo ao mesmo tempo. A diferen ca entre UNIX tee usado com o pager e o tee embutido no cliente mysql e que o tee embutido funciona mesmo se voc e n ao tiver o comando UNIX tee dispon ivel. O tee embutido tamb em loga tudo que e exibido na tela, e o UNIX tee usado com pager n ao loga completamente. Por u ltimo o tee interativo e mais c omodo para trocar entre os modos on e o, quando voc e desejar logar alguma coisa em um arquivo, mas deseja estar apto para desligar o recurso quando necess ario. A partir da vers ao 4.0.2 e possivel alterar o prompt no cliente de linha de comando mysql. Voc e pode usar as seguintes op c oes do prompt: Op c ao Descri c ao \v vers ao mysqld \d banco de dados em uso \h m aquina na qual est a conectado \p porta na qual est a conectado \u nome do usu ario \U nome usu ario@maquina \\ \ \n nova quebra de linha \t tab \ espa co \ espa co \R hora no formato 24h (0-23) \r hora no formato 12h (1-12) \m minutos \y ano com dois digitos \Y ano com quatro digitos
355
\D \s \w
formato completo da data segundos dia da semana no formato com 3 letras (Mon, Tue, ...) \P am/pm \o m es no formato de n umero \O m es no formato com 3 letras (Jan, Feb, ...) \c contador que cresce a cada comando \ seguido por qualquer outra letra apenas retorna aquela letra. Voc e pode denir o prompt nos seguintes lugares: Vari avel de Ambiente Voc e pode congurar o prompt em qualquer arquivo de congura c ao do MySQL, no grupo mysql. Por exemplo: [mysql] prompt=(\u@\h) [\d]>\_ Linha de Comando Voc e pode denir a op c ao --prompt na linha de comando para mysql. Por exemplo: shell> mysql --prompt="(\u@\h) [\d]> " (usu ario@maquina) [banco de dados]> Interativamente Voc e tamb em pode usar o comando prompt (ou \R) para alterar o seu prompt interativamente. Por exemplo: mysql> prompt (\u@\h) [\d]>\_ PROMPT set to (\u@\h) [\d]>\_ (usuario@maquina) [banco de dados]> (usuario@maquina) [banco de dados]> prompt Returning to default PROMPT of mysql> mysql>
356
-b, --blocking_queries Usa consultas em bloco. -C, --compress Usa o protocolo servidor/cliente compactado. -c, --connection_name=name Este e um sin onimo para --server. -d, --database=... Banco de dados a ser usado. Isto eu til principalmente no arquivo my.cnf. -H, --history_size=# Tamanho do hist orico para a janiela de consultas. -h, --host=... Conecta a uma determinda m aquina. -p[password], --password[=...] Senha usada ao se conectar ao servidor. Se uma senha n ao for especicada na linha de comando, voc e dever a inform a-la. Note que se voc e usar a forma simplicada -p n ao e permitido um espa co entre a op c oa e a senha. -g, --plugins_path=name Caminho para o diret orio onde os plugins do MySQL Control Center estao lacalizados. -P port_num, --port=port_num N umero da porta TCP/IP para uso na conex ao. -q, --query Abre uma janela de consulta na inicializa c ao. -r, --register Abre a caixa de di alogo Register Server na inicializa c ao. -s, --server=name Nome da conex ao do MySQL Control Center. -S --socket=... Arquivo socket usado na conex ao. -y, --syntax Habilita destque da sintaxe e complementa c ao -Y, --syntax_file=name Arquivo de sintaxe para complementa c ao. -T, --translations_path=name Caminho para o diret orio onde as tradu c oes do MySQL Control Center est ao localizados. -u, --user=# Usu ario para login se diferente do usu ario atual. -V, --version Exibe a vers ao e sai.
357
Voc e tamb em pode congurar as seguntes vari aveis com -O ou --set-variable. Por favor, note que as sintaxes --set-variable=nome=valor e -O name=value est ao obsoletas desde o MySQL 4.0, use --var=option: Variable Name Default Description connect timeout 0 Number of seconds before connection timeout. local-inle 0 Disable (0) or enable (1) LOCAL capability for LOAD DATA INFILE max allowed packet 16777216Max packet length to send to/receive from server net buer length 16384 Buer for TCP/IP and socket communication select limit 1000 Automatic limit for SELECT when using --safe-updtaes 1000000 Automatic limit for rows in a join when using --safemax join size updates
processlist Exibe lista de threads ativas no servidor, com a instru c ao SHOW PROCESSLIST. Se a op c ao --verbose e passada, a sa ida e como aquela de SHOW FULL PROCESSLIST.
358
Recarrega tabelas de permiss ao. Atualiza todas as tabelas e fecha e abre arquivos de log. Desliga o servidor.
slave-start Inicia thread de replica c ao no slave. slave-stop Termina a thread de replica c ao no slave. status variables version Fornece uma mensagem curta sobre o estado do servidor. Exibe vari aveis dispon iveis. Obt em informa c ao de vers ao do servidor.
Todos comandos podem ser reduzidos para seu prexo u nico. Por exemplo: shell> mysqladmin proc stat +----+-------+-----------+----+-------------+------+-------+------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------+-----------+----+-------------+------+-------+------+ | 6 | monty | localhost | | Processlist | 0 | | | +----+-------+-----------+----+-------------+------+-------+------+ Uptime: 10077 Threads: 1 Questions: 9 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 2 Memory in use: 1092K Max memory used: 1116K O resultado do comando mysqladmin status possui as seguintes colunas: Uptime Threads Questions Slow queries Opens Flush tables Open tables Memory in use Max memory used N umero de segundos que o servidor MySQL est a funcionando. N umero de threads ativas (clientes). N umero de solicita c oes dos clientes desde que o mysqld foi iniciado. Consultas que demoram mais que long_query_time segundos. Veja Se c ao 4.10.5 [Log de consultas lentas], P agina 378. Quantas tabelas foram abertas pelo mysqld. N umero de comandos flush..., refresh e reload. N umero de tabelas abertas atualmente. Mem oria alocada diretamente pelo c odigo do mysqld (dispon ivel somente quando o MySQL e compilado com with-debug=full). Mem oria m axima alocada diretamente pelo c odigo do mysqld (disponivel somente quando o MySQL e compilado com with-debug=full).
Se voc e executa um mysqladmin shutdown em um socket (em outras palavras, em um computador onde o mysqld est a executando), mysqladmin ir a esperar at e que o arquivopid do MySQL seja removido para garantir que o servidor mysqld parou corretamente.
359
360
Voc e tamb em pode usar o mysqlbinlog --read-from-remote-server para ler o log bin ario diretamente de um servidor MySQL remoto. No entanto, isto e algo que est a obsoleto j a que queremos tornar f acil de se aplicar os logs bin arios em servidores MySQL em execu c ao. mysqlbinlog --help lhe dar a mais informa c oes
361
--auto-repair Se uma tabela checada est a corrompida, ela e corrigida automaticamente. O reparo ser a feito depois que todas as tabelas tiverem sido checadas e forem detectadas tabelas corrompidas. -#, --debug=... Log de sa ida de depura c ao. Normalmente e d:t:o,lename --character-sets-dir=... Diret orio onde est ao os conjuntos de caracteres. -c, --check Verifca erros em tabelas -C, --check-only-changed Verica somente tabelas que foram alteradas desde a u ltima confer encia ou que n ao foram fechada corretamente. --compress Utilize compress ao no protocolo server/cliente. -?, --help Exibe esta mensagem de ajuda e sai. -B, --databases Para vericar diversos bancos de dados. Perceba a diferen ca no uso; Neste caso nenhuma tabela ser a fornecida. Todos os argumentos s ao tratados como nomes de bancos de dados. --default-character-set=... Congura o conjunto de caracteres padr ao. -F, --fast Verica somente as tabelas que n ao foram fechadas corretamente -f, --force Continue mesmo se n os obtermos um erro de sql. -e, --extended Se voc e estiver utilizando esta op c ao com CHECK TABLE, ir a garantir que a tabela est a 100 por cento consistente, mas leva bastante tempo. Se voc e utilizar esta op c ao com REPAIR TABLE, ele ir a executar um comando de reparos na tabela, que n ao s o ir a demorar muito tempo para executar, mas tamb em pode produzir muitas linhas de lixo. -h, --host=... Conecta ` a m aquina. -m, --medium-check Mais r apido que verica c ao extendida, mas encontra somente 99.99 de todos os erros. Deve resolver a maioria dos casos. -o, --optimize Otimizador de tabelas
362
-p, --password[=...] Senha para usar ao conectar ao servidor. Se a senha n ao for fornecida ser a solicitada no terminal. -P, --port=... N umero de porta para usar para conex ao. -q, --quick Se esta op c ao for utilizada com CHECK TABLE, evita a busca de registros vericando links errados. Esta e a confer encia mais r apida. Se voc e estiver utilizando esta op c ao com REPAIR TABLE, ela tentar a reparar somente a arvore de indices. Este e o m etodo de reparo mais r apido para uma tabela. -r, --repair Pode corrigir quase tudo exceto chaves u nicas que n ao s ao u nicas. -s, --silent Exibe somente mensagens de erro. -S, --socket=... Arquivo socket para usar na conex ao. --tables Sobrep oe a op c ao databases (-B). -u, --user=# Usu ario para o login, se n ao for o usu ario atual. -v, --verbose Exibe informa c ao sobre os v arios est agios. -V, --version Exibe informa c ao sobre a vers ao e sai.
363
Note que se voc e estiver utilizando uma c opia nova do programa mysqldump e se voc e for fazer uma descarga que ser a lida em um servidor MySQL muito antigo, voc e n ao deve utilizar as op c oes --opt ou -e. mysqldump suporta as seguintes op c oes: --add-locks Adicione LOCK TABLES antes de UNLOCK TABLE depois de cada descarga de tabelas. (Para obter inser c oes mais r apidas no MySQL.) --add-drop-table Adicione um drop table antes de cada instru c ao create. -A, --all-databases Descarrega todos os bancos de dados. Isto ir a ser o mesmo que --databases com todos os bancos de dados selecionados. -a, --all Inclui todas as op c oes do create espec icas do MySQL. --allow-keywords Permite cria c ao de nomes que colunas que s ao palavras chaves. Isto funciona utilizando o nome da tabela como prexo em cada nome de coluna. -c, --complete-insert Utilize instru c oes de insert completas (com nomes de colunas). -C, --compress Compacta todas as informa c oes entre o cliente e o servidor se ambos suportarem a compacta c ao. -B, --databases Para descarregar diversos bancos de dados. Perceba a diferen ca no uso. Neste caso nenhuma tabela e fornecida. Todos argumentos s ao estimados como nomes de bancos de dados. USE nome_bd; ser a inclu ido na sa ida antes de cada banco de dados novo. --delayed Insere registros com o comando INSERT DELAYED. -e, --extended-insert Utiliza a nova sintaxe multilinhas INSERT. (Fornece instru c oes de inser c ao mais compactas e mais r apidas.) -#, --debug[=option_string] Rastreia a utiliza c ao do programa (para depura c ao). --help Exibe uma mensagem de ajuda e sai. --fields-terminated-by=... --fields-enclosed-by=... --fields-optionally-enclosed-by=... --fields-escaped-by=... --lines-terminated-by=... Estas op c oes s ao usadas com a op c ao -T e tem o mesmo signicado que as cl ausulas correspondentes em LOAD DATA INFILE Veja Se c ao 6.4.8 [LOAD DATA], P agina 587.
364
-F, --flush-logs Atualiza o arquivo de log no servidor MySQL antes de iniciar a descarga. -f, --force, Continue mesmo se obter um erro de SQL durantes uma descarga de tabela. -h, --host=.. Descarrega dados do servidor MySQL na m aquina especicada. A m aquina padr ao e localhost. -l, --lock-tables. Bloqueia todas as tabelas antes de iniciar a descarga. As tabelas s ao bloqueadas com READ LOCAL para permitir inser c oes concorrentes no caso de tabelas MyISAM. Por favor, note que ao descarregar multiplas tabelas, --lock-tables bloquear a as tabelas de cada banco de dados separadamente. Assim, usar esta op c ao n ao garantir a que suas tabelas sejam logicamente consistentes entre os banco de dados. Tabela me diferentes bancos de dados podem ser descarregadas em estados completamente diferentes. -K, --disable-keys /*!40000 ALTER TABLE nome_tb DISABLE KEYS */; e /*!40000 ALTER TABLE nome_tb ENABLE KEYS */; ser a colocado na sa ida. Isto far a com que a carga de dados no MySQL 4.0 server seja mais r apida j a que os indices s ao criados depois que todos os dados s ao inseridos. -n, --no-create-db CREATE DATABASE /*!32312 IF NOT EXISTS*/ nome_bd; n ao ser a colocado na saida. A linha acima ser a adicionada se a op c ao --databases ou --all-databases for fornecida. -t, --no-create-info N ao grava informa c oes de cria c ao de tabelas (A instru c ao CREATE TABLE.) -d, --no-data N ao grava nenhuma informa c ao de registros para a tabela. Isto e muito u til se voc e desejar apenas um dump da estrutura da tabela! --opt O mesmo que --quick --add-drop-table --add-locks --extended-insert --lock-tables. Fornece a descarga mais r apida para leitura em um servidor MySQL.
-pyour_pass, --password[=sua_senha] A senha para usar quando conectando ao servidor. Se n ao for especicado a parte =sua_senha, o mysqldump ir a perguntar por uma senha. -P port_num, --port=porta_num O n umero da porta TCP/IP usado para conectar a uma m aquina. (Isto e usado para conex oes a m aquinas diferentes de localhost, na qual sockets Unix s ao utilizados.) -q, --quick N ao utiliza buers para as consultas, descarrega diretamente para sa ida padr ao. Utilize mysql_use_result() para fazer isto.
365
-Q, --quote-names Coloca os nomes de colunas e tabelas entre . -r, --result-file=... Direcione a sa ida para um determinado arquivo. Esta op c ao deve ser usada no MSDOS porque previne a convers ao de nova linha \n para \n\r (nova linha + retorno de carro). --single-transaction Esta op c ao envia um comando SQL BEGIN antes de carregar os dados do servidor. Ele e mais u til com tabelas InnoDB e n ivel READ_COMMITTED de isola c ao da transa c ao, j a que neste modo ela far a um dump do estado de consist encia do banco de dados no momento que o BEGIN for enviado sem bloquear qualquer aplica c ao. Ao usar esta op c ao voc e deve manter em mente que ser a feito um dump no estado consistente apenas das tabelas transacionais, ex., qualquer tabela MyISAM ou HEAP na qual for feito um dump durante est a p[ c ao pode ainda mudar de estado. A op c ao --single-transaction foi adicionada na vers ao 4.0.2. Esta op c ao e mutualmente exclusiva com a op c ao --lock-tables j a que LOCK TABLES j a faz um commit da transa c ao anterior internamente. -S /path/to/socket, --socket=/path/to/socket O arquivo socket que ser a utilizado quando conectar ` a localhost (que e a m aquina padr ao). --tables Sobrep oe a op c ao databases (-B). -T, --tab=path-to-some-directory Cria um arquivo nome_tabela.sql, que cont em os comandos SQL CREATE e um arquivo nome_tabela.txt, que cont em os dados, para cada tabela dada. O formato do arquivo .txt e feito de acordo com as op c oes --fields-xxx e -lines--xxx. Nota: Esta op c ao s o funciona se mysqldump est a sendo executado na mesma m aquina que o daemon mysqld. Voc e deve usar uma conta MySQL que tem o privil egio FILE, e o login de usu ario/grupo com o qual o mysqld est a sendo executado (normalmente usu ario mysql, grupo mysql) precisa ter permiss ao para criar/gravar um arquivo no local especicado. -u user_name, --user=user_name O nome do usu ario do MySQL para usar ao conectar ao servidor. O valor padr ao e seu nome de usu ario no Unix. -O nome=valor, --set-variable=nome=valor Conrgura o valor de uma vari avel. As vari aveis poss iveis s ao listadas abaixo. Note que a sintaxe --set-variable=nome=valor e -O nome=valor est a obsoleto desde o MySQL 4.0. Use --nome=valor. -v, --verbose Modo verbose. Exibe mais informa c oes sobre o que o programa realiza. -V, --version Exibe informa c oes de vers ao e sai.
366
-w, --where=where-condition Faz um dump apenas dos registros selecionados. Note que as aspas s ao obrigat orias: "--where=user=jimf" "-wuserid>1" "-wuserid<1" -X, --xml Faz um dump do banco de dados no formato XML -x, --first-slave Faz um lock de todas as tabelas de todos os bancos de dados. --master-data Como --first-slave, mas tamb em exibe algum comando CHANGE MASTER TO o qual, mais tarde, far a o seu slave iniciar a partir da posi c ao certa no log bin ario do master, se voc e tiver congurado o seu slave usando este dump SQL do master. -O net_buffer_length=#, where # < 16M Quando estiver criando instru c oes de inser c oes em m ultiplas linhas (com a op c ao --extended-insert ou --opt), mysqldump ir a criar linhas at e o tamanho de net_buffer_length. Se voc e aumentar esta vari avel, voc e tamb em deve se assegurar que a vari avel max_allowed_packet no servidor MySQL e maior que a net_buffer_length. O uso mais comum do mysqldump e provavelmente para fazer backups de bancos de dados inteiros. Veja Se c ao 4.5.1 [Backup], P agina 276. mysqldump --opt banco_dados > arquivo-backup.sql Voc e pode ler de volta no MySQL com: mysql banco_dados < arquivo-backup.sql ou mysql -e "source /path-to-backup/backup-file.sql" database Entretanto, e muito u til tamb em popular outro servidor MySQL com informa c oes de um banco de dados: mysqldump --opt banco_dados | mysql ---host=m aquina-remota -C banco_dados poss E ivel descarregar v arios bancos de dados com um comando: Se desejar descarregar todos os bancos de dados, pode-se utilizar: mysqldump --all-databases > todos_bancos_dados.sql
367
mysqlhotcopy nome_bd [/caminho/para/novo_diret orio] mysqlhotcopy nome_bd_2 ... nome_bd_2 /caminho/para/novo_diret orio mysqlhotcopy nome_bd./regex/ mysqlhotcopy suporta as seguintes op c oes: -?, --help Exibe uma tela de ajuda e sai -u, --user=# Usu ario para fazer login no banco de dados -p, --password=# Senha para usar ao conectar ao servidor -P, --port=# Porta para usar ao conectar ao servidor local -S, --socket=# Qual socket usar ao conectando a um servidor local --allowold N ao aborta se o alvo j a existir (renomeie-o para old) --keepold N ao apaga alvos anteriores (agora renomeados) quando pronto --noindices N ao inclui arquivos de indices na c opia para deixar o backup menor e mais r apido. Os indices podem ser recostru idos mais tarde com myisamchk -rq.. --method=# Met odo para copiar (cp ou scp). -q, --quiet Seja silencioso exceto em erros --debug Habilita depura c ao -n, --dryrun Relata a c oes sem realiz a-las --regexp=# Copia todos bancos de dados com nomes que coincidem com a express ao regular --suffix=# Suxo para nomes de bancos de dados copiados --checkpoint=# Insere entrada de ponto de controle um uma bd.tabela especicada --flushlog Atualiza logs uma vez que todas as tabelas estiverem bloqueadas. --tmpdir=# Diret orio Tempor ario (em vez de /tmp).
368
Voc e pode utilizar perldoc mysqlhotcopy para obter uma documenta c ao mais completa de mysqlhotcopy. mysqlhotcopy l e os grupos [client] e [mysqlhotcopy] dos arquivos de op c oes. Para poder executar mysqlhotcopy e necess ario acesso de escrita ao diret orio de backup, privil egio SELECT nas tabelas que desejar copiar e o privil egio Reload no MySQL (para poder executar FLUSH TABLES).
369
--help
-h host_name, --host=host_name Importa dados para o servidor MySQL na m aquina referida. A m aquina padr ao e localhost. -i, --ignore Veja a descri c ao para a op c ao --replace. --ignore-lines=n Ignora as primeiras n linhas do arquivo de dados. -l, --lock-tables Bloqueia TODAS as tabelas para escrita antes de processar qualquer arquivo texto. Isto garante que todas as tabelas s ao sincronizadas no servidor. -L, --local L e arquivos de entrada do cliente. Por padr ao, e assumido que os arquivos texto est ao no servidor se voc e conectar ` a localhost (m aquina padr ao). -pyour_pass, --password[=sua_senha] Senha para conectar ao servidor. Se voc e n ao especicar a parte =sua_senha, o mysqlimport ir a pedir por uma senha. -P port_num, --port=port_num O n umero da porta TCP/IP para usar quando conectar a uma m aquina. --protocol=(TCP | SOCKET | PIPE | MEMORY) Para especicar o protocolo de conex ao. Novo no MySQL 4.1. -r, --replace As op c oes --replace e --ignore controlam o tratamento de registros de entrada que duplicam registros existentes em valores de chaves u nicas. Se voc e especicar --replace, novos registros substituir ao registros que tiverem o mesmo valor na chave unica. Se voc e especicar --ignore, registros de entrada que duplicariam um registro existente em um valor de chave u nica s ao saltados. Se voc e n ao especicar nenhuma das duas op c oes, um erro ocorrer a quando um valor de chave duplicado for encontrado e o resto do arquivo texto ser a ignorado. -s, --silent Modo silencioso. Gera sa ida somente quando ocorrer algum erro. -S /path/to/socket, --socket=/path/to/socket O arquivo socket para usar ao conectar ` a localhost (m aquina padr ao). -u user_name, --user=user_name O nome de usu ario MySQL para usar ao conectar ao servidor. O valor padr ao e seu nome de usu ario atual no Unix. -v, --verbose Modo verbose. Gera mais informa c oes na sa ida. -V, --version Exibe informa c ao sobre a vers ao e sai.
370
Abaixo um exemblo da utiliza c ao de mysqlimport: $ mysql --version mysql Ver 9.33 Distrib 3.22.25, for pc-linux-gnu (i686) $ uname -a Linux xxx.com 2.2.5-15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown $ mysql -e CREATE TABLE imptest(id INT, n VARCHAR(30)) test $ ed a 100 Max Sydow 101 Count Dracula . w imptest.txt 32 q $ od -c imptest.txt 0000000 1 0 0 \t M a x S y d o w \n 1 0000020 1 \t C o u n t D r a c u l a 0000040 $ mysqlimport --local test imptest.txt test.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 $ mysql -e SELECT * FROM imptest test +------+---------------+ | id | n | +------+---------------+ | 100 | Max Sydow | | 101 | Count Dracula | +------+---------------+
0 \n
371
Se o u ltimo argumento conter uma shell ou um meta-caracter do SQL, (*, ?, % ou _) somente o que coincidir com o meta-caracter e exibido. Se um banco de dados conter underscore (_), eles devem ser precedidos por uma barra invertida (algumas shells de Unix ir ao exigir duas), para se obter tabelas/colunas apropriadamente. * s ao convertidos em metacaracteres % do SQL e ? em metacaracteres do SQL. Isto pode causar alguma confus ao quando algu em tentar exibir as colunas para uma tabela com um _, neste caso o mysqlshow exibe somente os nomes de tabelas que casarem com o padr ao. Isto e facilmente corrigido adicionando um % extra na linha de comando (como um argumento separador).
Se voc e executar mysql_config sem nenhuma op c ao ele exibir a todas as op c oes suportadas mais os valores de todas elas: shell> mysql_config Usage: /usr/local/mysql/bin/mysql_config [OPTIONS] Options: --cflags [-I/usr/local/mysql/include/mysql -mcpu=pentiumpro] --include [-I/usr/local/mysql/include/mysql] --libs [-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm --libs_r [-L/usr/local/mysql/lib/mysql -lmysqlclient_r -lpthread -lz -lcrypt --socket [/tmp/mysql.sock] --port [3306] --version [4.0.16] --libmysqld-libs [-L/usr/local/mysql/lib/mysql -lmysqld -lpthread -lz -lcrypt -lnsl Voc e pode us a-lo para compilar o cliente MySQL como a seguir:
372
373
374
nomeado nome_m aquina.log). Este log pode ser muito u til quando voc e suspeitar de um erro em um cliente e deseja saber exatamente o que o mysqld acha que o cliente enviou. Older versions of the mysql.server script (from MySQL 3.23.4 to 3.23.8) pass mysqld_ safe a --log option (enable general query log). If you need better performance when you start using MySQL in a production environment, you can remove the --log option from mysql.server or change it to --log-bin. Veja Se c ao 4.10.4 [Binary log], P agina 375. Vers oes mais antigas do script mysql.server (MySQL 3.23.4 a 3.23.8) passam ao safe_ mysql uma op c ao --log (habilita a log de consulta geral). Se voc e precisar melhorar a performance quando iniciar o uso do MySQL em um ambiente de produ c ao, pode remover a op c ao --log do mysql.server ou alter a-lo para --log-bin. Veja Se c ao 4.10.4 [Log bin ario], P agina 375. As entradas neste log s ao escritas quando o mysqld recebe as quest oes. Pode estar diferente da ordem em que as instru c oes s ao executadas. Isto est a em contraste com o log de atualiza c oes e o log bin ario nos quais as consultas s ao escritas depois de serem executadas, mas que quaisquer travas sejam liberadas.
375
O registro da atualiza c ao e feito imediatamente ap os uma consulta estar completa mas antes que as bloqueios sejam liberados ou que algum commit seja feito. Isto garante que o log seja escrito na ordem de execu c ao. Se voc e desejar atualizar um banco de dados a partir de arquivos de logs de atualiza c ao, voc e pode fazer o seguinte (assumindo que seus logs de atualiza c ao estejam nomeados na forma nome_arquivo.###): shell> ls -1 -t -r nome_arquivo.[0-9]* | xargs cat | mysql ls e utilizado para obter todos os arquivos de log na ordem correta. Isto pode ser u til se voc e tiver que recorrer a arquivos de backup depois de uma falha e desejar refazer as atualiza c oes que ocorreram entre a hora do backup e a falha.
376
Voc e pode utilizar as seguintes op c oes ao mysqld para afetar o que e documentado pelo log bin ario (tenha certeza de ler as notas que seguem esta tabela): Op c ao Descri c ao binlog-do-db=nome_banco_ Diz ao master que ele deve registrar atualiza c oes no dados log bin ario se o banco de dado atual (ex.: aquele selecionado por USE) e nome banco dados. Todos os outros bancos de dados que n ao forem explicitamente mencionados s ao ignorados. Note que se voc e utiliz a-lo voc e deve se assegurar que voc e s o faz atualiza c oes no banco de dados atual. (Exemplo: binlogdo-db=algum_bancodados) Exemplo do que n ao funciona como voc e poderia esperar: se o servidor e iniciado com binlogdo-db=sales, e voc e zer USE prices; UPDATE sales.january SET amount=amount+1000;, esta consulta n ao ser a gravada no log bin ario. binlog-ignore-db=nome_banco_ dados Diz ao master que atualiza c oes onde o banco de dados atual (ex.: aquele selecionado com USE) e nome banco dados n ao deve ser gravado no log bin ario. Note que se voc e usar esta op c ao voc e deve ter certeza que voc e s o faz atualiza c oes no banco de dados atual. (Exemplo: binlog-ignore-db=algum_ banco_dados) Exemplo do que n ao funciona como voc e poderia esperar: se o servidor e iniciado com binlogdo-db=sales, e voc e zer USE prices; UPDATE sales.january SET amount=amount+1000;, esta consulta ser a gravada no log bin ario.
As regras est ao avaliadas na seguinte ordem, para decidir se a consulta deve ser escrita no log bin ario ou n ao: 1. Existem as regras binlog-do-db ou binlog-ignore-db? N ao: grave a consulta no log bin ario e saia. Sim: V a para o passo abaixo. 2. Ent ao existe algumas regras (binlog-do-db ou binlog-ignore-db ou ambos). Existe um banco de dados atual (algum banco de dados foi selecionado com USE?)? grave a consulta e saia. N ao: NAO Sim: v a para o passo abaixo. 3. Existe um banco de dados. Existe alguma regra binlog-do-db? Sim: O banco de dados atual se encaixa em qualquer uma das regras binlog-dodb? Sim: grave a consulta e saia. grave a consulta e saia. N ao: NAO N ao: V a para o passo abaixo.
377
4. Existem algumas regras binlog-ignore-db. O banco de dados atual se encaixa em qualquer uma das regras binlog-ignore-db? Sim: n ao grave a consulta e saia. N ao: grave a consulta e saia. Ent ao, por exemplo, um slave em execu c ao com apenas binlog-do-db=sales n ao gravar a no log bin ario qualquer consulta em que o banco de dados atual e diferente de sales (em outras palavras, binlog-do-db pode, signicar algumas vezes, ignore outros bancos de dados). Para saber quais arquivos bin arios foram usados, o mysqld ir a criar tamb em um arquivo de indice para o log bin ario que cont em o nome de todos os arquivos de log bin ario usados. Por padr ao este arquivo tem o mesmo nome que o arquivo de log bin ario, com a extens ao .index. Voc e pode alterar o nome do arquivo de indice do log bin ario com a op c ao --logbin-index=[nome_arquivo]. Voc e n ao deve eduitar este arquivo manualmente enquanto o mysqld estiver em execu c ao; fazer isto confundiria o mysqld. Se estiver sendo usado replica c ao, os arquivos de log bin ario antigos n ao devem ser apagados at e ter certeza que nenhum slave ir a mais precisar deles. Uma forma de fazer isto e o utilizar mysqladmin flush-logs uma vez por dia e ent ao remover qualquer log com mais de 3 dias. Voc e pode remov e-los manualmente, ou de prefer encia usando PURGE MASTER LOGS (veja Se c ao 4.11.7 [Replica c ao SQL], P agina 401) o qual atualizar a de forma segura o arquivo de indice do log bin ario para voc e (e que pode ter um argumento de data desde o MySQL 4.1) Uma conex ao com o privil egio SUPER pode desabilitar o registro no log bin ario de suas consultas usando SET SQL_LOG_BIN=0. Veja Se c ao 4.11.7 [Replica c ao SQL], P agina 401. Voc e pode examinar o arquivo de log bin ario com o utilit ario mysqlbinlog. Por exemplo, voc e pode atualizar um servidor MySQL a partir de um log bin ario como mostrado a seguir: mysqlbinlog arquivo-log | mysql -h nome_servidor Veja Se c ao 4.9.5 [mysqlbinlog], P agina 359 para mais informa c oes sobre o utilit ario mysqlbinlog e como utiliz a-lo. mysqlbinlog --help ir a lhe fornecer mais informa c oes de como usar este programa! Se voc e estiver utilizando BEGIN [WORK] ou SET AUTOCOMMIT=0, voc e deve utilizar o log bin ario do MySQL para backups no lugar do antigo log de atualiza c ao. O Log bin ario e feito imedatamente depois que uma consulta terminar mas antes que os bloqueios sejam liberados ou algum commit seja feito. Isto garante que o log seja feito na ordem de execu c ao. Atualiza c oes em tabelas n ao transacionais s ao armazenadas o log bin ario imediatamentedepois da execu c ao. Para tabelas tranascionais como BDB ou InnoDB, Todas atualiza c oes (UPDATE, DELETE ou INSERT) que alteram uma tabela transacional s ao armazenadas no cache at e um COMMIT. Quaisquer atualiza c oes a uma tabela n ao transacional s ao armazenadas no log bin ario de uma vez. Todas as threads ir ao, no in icio, alocar um buer de binlog_ cache_size para registrar consultas. Se uma conaulta e maior que o registro, a thread ir a criar um arquivo tempor ario para lidar com a mesma. O arquivo tempor ario ser a apagado quando a thread terminar. O max_binlog_cache_size (padr ao 4G) pode ser usado para restringir o tamanho total usado para armazenar uma consulta multi-transacional. Se uma transa c ao e maior que isto ela falhar a e far a um roll back.
378
Se voc e estiver utilizando o log de atualiza c ao ou o bin ario, inser c oes concorrentes n ao funcionar ao juntas com CREATE ... INSERT e INSERT ... SELECT. Isto e para garantir que voc e possa recriar uma c opia exata de suas tabelas aplicando o log em um backup.
379
Se o log de atualiza c ao (--log-update) e usado, fecha o log de atualiza c ao e abre um novo arquivo log com uma sequ encia num erica mais alta. Se voc e s o estiver utilizando o log de atualiza c ao, voc e tem apenas que atualizar os logs e ent ao mover os arquivos de log antigos para um backup. Se voc e estiver utilizando o log normal, voc e pode fazer algo assim: shell> cd diret orio-dados-mysql shell> mv mysql.log mysql.old shell> mysqladmin flush-logs e ent ao fazer um backup e remover o mysql.old.
4.11.1 Introdu c ao
A partir da vers ao 3.23.15, o MySQL suporta replica c ao de uma via internamente. Um servidor atua como o master, enquando o outro atua como slave. O servidor master mant em mantido um log bin ario de atualiza c oes (veja Se c ao 4.10.4 [Log bin ario], P agina 375). E tamb em um arquivo de indices dos logs bin arios para manter os registro da rotatividade dos logs. Cada slave, na conex ao, informa ao master onde parou desde a u ltima atualiza c ao propagada com sucesso, realiza a atualiza c ao e ent ao para e espera o master informar sobre novas atualiza c oes. Um slave tamb em pode ser um master se voc e condigurar uma cadeia de servidores em replica c ao. Note que se voc e estiver usando replica c ao, todas atualiza c oes nas tabelas replicadas devem ser realizadas no servidor master. Sen ao, voc e sempre deve ter cuidados para evitar conitos entre as atualiza c oes que os usu arios enviam ao master e aquelas que os usu arios enviam ao slave. Replica c ao de uma via trazem benef icios de robustez, velocidade e administra c ao do sistema: A robustez e aumentada com uma congura ca o master/slave. No evento de problemas com o master, voc e pode trocar para o slave como um backup. A velocidade extra e alcan cada dividindo a carga das consultas dos clientes em processamento para entre os servidores master e slave, resultando em melhor tempo de resposta. Consultas SELECT podem ser enviadas para o slave para reduzir a carga do processamento das consultas do master. Consultas que modicam dados devem ainda
380
ser enviados para o master e slave para n ao carem fora de sincronia. Esta estrat egia de balancemento de carga e efetiva se consultas que n ao sejam de atualiza c ao dominarem, mas este e o caso normal. Outro benef icio de utilizar replica c ao e que pode-se obter backups intant aneos do sistema fazendo backups no slave em vez de faz e-los no master. Veja Se c ao 4.5.1 [Backup], P agina 276.
381
mysql> CHANGE MASTER TO MASTER_LOG_FILE=<name>, MASTER_LOG_POS=4; mysql> START SLAVE; Se voc e tamb em deve atualizar seus slaves da vers ao 3.23 para 4.0, voc e deve primeiro atualizar seus slaves: Desligue cada um, atualize-os e os reinicie. Ent ao atualize o master como descrito. A partir da vers ao 4.0.0, pode se usar LOAD DATA FROM MASTER para congurar um escrao. Esteja certo que LOAD DATA FROM MASTER funciona atualmente apenas se todas as tabelas no master s ao do tipo MyISAM. Al em disso, estas instru c ao ir ao adquirir lock global de leitura, assim nenhuma escrita ser a poss ivel enquanto as tabelas est ao sendo transferidas do master. Quando implementarmos hot backup de tabelas sem lock (no MySQL 5.0), este lock global de leitura n ao ser a mais necess ario. Devido a estas limita c oes, recomendamos que voc e s o use LOAD DATA FROM MASTER se o conjunto de dados de master for relativamente pequeno, ou se um lock de leitura prolongado no master e aceit avel. Enquanto a velocidade atual do LOAD DATA FROM MASTER pode variar de sistema para sistema, uma boa regra do ded ao de quanto tempo ser a necess ario e considerar 1 segundo por 1 MB do arquivo de dados. Voc e car a pr oximo da estimativa se tanto o master quanto o slave forem equivalentes a um Pentium 700 Mhz e estiverem conectado a claro, esta uma rede de 100 MBits/s. E e apenas uma estimativa grosseira da ordem de magnitude. Uma vez que o slave foi congurado corretamente e est a em execu c ao, ele simplesmente conectar a ao master e esperar a por atualiza c oes nos processos. Se o master for desligado ou o slave perder conectividade com seu master, ele tentar a conectar periodicamente at e conseguir reconectar e constinuar as atualiza c oes. O intervalo de tentativa e controlado pela op c ao --master-connect-retry. O padr ao e 60 segundos. Cada slave mant em registro de onde parou. O servidor master n ao tem conhecimento de quandos slaves existem ou quais est ao atualizados em um determinado momento.
382
mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 2 User: root Host: localhost:32931 db: NULL Command: Binlog Dump Time: 94 State: Has sent all binlog to slave; waiting for binlog to be updated Info: NULL No servidor slave, a sa ida se parece com isto: mysql> SHOW PROCESSLIST\G *************************** Id: 10 User: system user Host: db: NULL Command: Connect Time: 11 State: Waiting for master Info: NULL *************************** Id: 11 User: system user Host: db: NULL Command: Connect Time: 11 State: Has read all relay Info: NULL 1. row ***************************
Aqui a thread 2 est a no master. A thread 10 e a thread de E/S no slave. A thread 11 e a thread de SQL no slave; note que o valor na coluna Time pode dizer quando o slave e comparado com o master (veja Se c ao 4.11.9 [FAQ da Replica c ao], P agina 411). A lista a seguir mostra os estados mais comuns que voc e ver a na coluna State para a thread Binlog Dump do master. Se voc e n ao ver estas threads em um servidor master, a replica c ao n ao est a sendo executada. Sending binlog event to slave Logs bin arios consistem de eventos, onde um evento e normamente uma consulta mais alguma informa c ao. A thread l e um evento do log bin ario e ele e enviado para o slave. Finished reading one binlog; switching to next binlog A thread nalizou a leitura de um log bin ario e est a abrindo o seguinte a ser enviado para o slave.
383
Has sent all binlog to slave; waiting for binlog to be updated A thread leu todos os log bin arios e est a inativa. Ela est a esperando por conex oes no master para gravar mais dados no log bin ario, se ele quiser. Waiting to finalize termination Estado muito breve que ocorre quando a thread para. Aqui est ao os estados mais comuns que voc e ver a na coluna State para a thread de E/S de um servidor slave. A partir do MySQL 4.1.1, este estado tamb em aparece na coluna Slave_IO_State da sa ida de SHOW SLAVE STATUS. Isso signica que voc e pode ter uma boa vis ao do que est a acontecendo apenas com SHOW STATUS SLAVE. Connecting to master. Conectando ao master. Checking master version. Estado muito breve que ocorre um pouco depois da conex ao ser estabelecida. Registering slave on master. Estado muito breve que ocorre um pouco depois da conex ao ser estabelecida. Requesting binlog dump. Estado muito breve que ocorre um pouco depois da conex ao com o master ser estabelecida. A thread envia ao master um pedido para envio do conte udo de seu log bin ario, iniciando a partir do log bin ario requisitado e sua posi c ao. Waiting to reconnect after a failed binlog dump request. Se o pedido de dump do log bin ario falhar (devido a desconex ao), a thread ca neste estado enquanto est a inativa. A thread ca inativa por master-connectretry segundos antes de uma nova tentativa. Reconnecting after a failed binlog dump request. Ent ao a thread tenta se conectar com o master. Waiting for master to send event. A thread conectou e est a esperando que os eventos do log bin ario cheguem. Isto pode demorar se o master estiver inativo. Se a espera for maior que slave_read_timeout segundos, o tempo se esgotar a. Neste ponto, a thread ir a considerar a conex ao quebrada e far a uma nova tentativa de conex ao. Queueing master event to the relay log. A thread leu o evento e o est a copiando para o ser relay log para que a thread SQL possa process a-lo Waiting to reconnect after a failed master event read. Um erro ocorreu durante a leitura (devido a desconex ao); inativo por masterconnect-retry segundos antes de tentar se reconectar. Reconnecting after a failed master event read. Ent ao a thread tenta se reconectar. Quando a conex ao e estabelecida novamente, o estado se tornar a Waiting for master to send event. Waiting for the slave SQL thread to free enough relay log space Voc e est a usando um valor relay_log_space_limit diferente de zero e os relay logs tem crescido tanto que o seu tamanho combinado excedem este valor. A
384
thread E/S ent ao espera at e que a thread SQL libere espa co suciente deletando o conte udo dos relay logs e assim poder deletar alguns arquivos de relay logs. Waiting for slave mutex on exit. Estado muito breve que ocorre quando a thread esta parando. Aqui est ao os estado mais comuns que voc e ver a na coluna State para a thread de SQL de um servidor slave: Reading event from the relay log A thread leu um evento do relay log para poder process a-lo. Has read all relay log; waiting for the slave I/O thread to update it A thread processou todos os eventos nos arquivos de relay logs e est a esperando a thread de E/S gravar novos eventos no relay log. Waiting for slave mutex on exit. Estado muito breve que ocorre quando a thread e parada. A coluna State para a thread de E/S tamb em podem mostrar um string de consulta. Isto indica que a thread leu um evento do relay log, extraiu a conulta dele e est a a est a executando. Antes do MySQL 4.0.2, as threads de E/S e SQL eram combinadas em uma s o e nenhum relay log era usado. A vantagem do uso de duas threads e que elas separam a leitura e a execu c ao da consulta em duas tarefas independentes, e assim o trabalho de leitura da consulta n ao se torna lento se a execu c ao da consulta for lento. Por exemplo, se o servidor slave n ao estiver em execu c ao por um instante, a sua thread de E/S pode rapidamente buscar todos o conte udo dos logs bin arios do master quando o slave iniciar, mesmo se a thread de SQL demorar e levar horas para pegar os logs. Se o slave parar antes da thread SQL executar todas as consultas buscadas, a thread de E/S ter a nalmente buscado tudo e assim um c opia segura das consultas estar a armazenada localmente nos relay logs do slave para execu c ao na pr oxima execu c ao do slave. Isto permite que os log bin arios sejam apagados no master, j a que n ao h a mais necessidade de esperar que o slave busque o conte udo deles. Por padr ao, relay logs s ao nomeados usando nome de arquivos da forma host_name-relay-bin.nnn, onde host_name e o nome da m aquina servidora slave e nnn e uma sequ encia num erica. Arquivos de relay logs sucvessivos s ao criados usando uma sequ encia de n umeros sucessiva, come cando com 001. O slave mant em registro dos relay logs em uso atualmente em um arquivo de indice. O nome de arquivo padr ao dos relay logs e host_name-relay-bin.index. Por padr ao estes arquivos s ao criados no diret orio de dados do slave. O nome de arquivo padr ao pode ser sobrescrito com as op c oes --relay-log e --relay-log-index do servidor. Relay logs t em o mesmo formato dos logs bin arios, assim ele podem ser lidos com mysqlbinlog. Um relay log e automaticamente deletado pela thread de SQL t ao logo n ao seja mais necess aria (ex.: assim que tiver sido executado todos os seus eventos). N ao existem comandos para deletar relay logs j a que a thread SQL cuida de faz e-lo. No entanto, a partir do MySQL 4.0.14, FLUSH LOGS rotaciona os relay logs), o que ir a inuenciar quando a thread de SQL delet a-los. Um novo relay log e criado sob as seguintes condi c oes:
385
A primeira vez que a thread de E/S inicia depois que o servidor slave inicia (No MySQL 5.0, um novo relay log ser a criado a cada vez que a thread de E/S inicia, n ao apenas pela primeira vez.) Uma instru c ao FLUSH LOGS e executada (a partir da vers ao 4.0.14). O tamanho do relay log atual se torna muito grande. O signicado de muito grande e determinado da seguinte forma: max_relay_log_size, se max_relay_log_size > 0 max_binlog_size, se max_relay_log_size = 0 ou o MySQL e mais velho que 4.0.14 Um servidor de replica c ao slave cria dois arquivos pequenos no diret orio de dados. Estes arquivos s ao chamados master.info e relay-log.info por padr ao. Eles possuem informa c ao como aquela mostrada na sa ida da instru c ao SHOW SLAVE STATUS (veja Se c ao 4.11.8 [Replica c ao], P agina 402 para uma descri c ao deste comando). Como imagem de discos, eles sobrevivem ao desligamento do slave. A pr oxima vez que o slave e reiniciado, ele pode ler estes arquivos para saber o quanto ele processou do log bin ario do master e do seus pr oprios relay logs. O arquivo master.info e atualizado pela thread de E/S. A correspond encia entre as linhas do arquivo e as colunas mostradas por SHOW SLAVE STATUS aparece a seguir: Linha Descri c ao 1 Master_Log_File 2 Read_Master_Log_Pos 3 Master_Host 4 Master_User 5 Senha (n ao mostrado por SHOW SLAVE STATUS) 6 Master_Port 7 Connect_Retry O arquivo relay-log.info e atualizada pela thread de SQL. A correspond encia entre as linhas do arquivo e as colunas mostradas por SHOW SLAVE STATUS apaerece a seguir: Linha Descri c ao 1 Relay_Log_File 2 Relay_Log_Pos 3 Relay_Master_Log_File 4 Exec_Master_Log_Pos Quando voc e faz backup dos dados de seu slave, voc e deve fazer backup destes 2 pequenos arquivos, junto com seus relay logs pois eles s ao necess arios para continuar a replica c ao depois que voc e restaurar os dados do slave. Se voc e perder os seus relay logs mas ainda tiver o arquivo relay-log.info, voc e pode verifclos para determinar por quanto tempo a thread de SQL executou no log bin ario do master. Ent ao voc e pode usar CHANGE MASTER TO com as op c oes MASTER_RELAY_LOG e MASTER_RELAY_POS para dizer ao slave para reler os log bin arios a partir deste ponto. Isto exige que o log bin ario ainda exista no servidor master. e claro. Se seu slave est a sujeito a replica c ao de instru c oes LOAD DATA INFILE, voc e tamb em deve fazer backup dos arquivos SQL_L0AD-* que podem existir no diret orio que o slave uti-
386
liza para este prop osito. O slave precisar a destes arquivos para continuar a replica c ao de qualquer instru c ao LOAD DATA INFILE interrompido. A localiza c ao do diret orio e especicada usando a op c ao --slave-load-tmpdir. Seu valor padr ao, se n ao especicado, e o valor da vari avel tmpdir.
387
Conceda o privil egio SELECT em todas as tabelas que voc e deseja carregar. Qualquer das tabelas master nas quais a conta n ao possa fazer um SELECT ser ao ignoradas por LOAD DATA FROM MASTER. 3. Se voc e estiver usando tabelas MyISAM, descarregue todas as tabelas e bloqueie as consultas de escrita executando o comando FLUSH TABLES WITH READ LOCK mysql> FLUSH TABLES WITH READ LOCK; e fa ca uma c opia de todos os dados existentes em seu servidor master. A maneira mais f acil de fazer isto e simplesmente usar um programa (tar no Unix, PowerArchiver, WinRAR, WinZip ou qualquer outro software similar no Windows) para produzir um arquivo de banco de dados no diret orio de dados do seu master. Por exemplo, para usar tar que cria um arquivo que inclui todos os bancos de dados, altere a localiza c ao no diret orio de dados do servidor master, e ent ao execute este comando: shell> tar -cvf /tmp/mysql-snapshot.tar . Se voc e quiser que o arquivo inclua apenas um banco de dados chamado estebd, utilize este comando: shell> tar -cvf /tmp/mysql-snapshot.tar ./this_db Ent ao copie o arquivo para o diret orio /tmp na m aquina servidora slave. Naquela m aquina, altere a localiza c ao em um diret orio de dados do slave e desempacote o arquivo usando este comando: shell> tar -xvf /tmp/mysql-snapshot.tar Voc e pode n ao desejar replicar o banco de dados mysql. Se n ao, voc e pode exclu ilo do arquivo. Voc e tamb em n ao precisa incluir qualqer arquivo de log nos arquivos master.info ou relay-log.info. Enquanto o lock de leitura colocado por FLUSH TABLES WITH READ LOCK estiver em funcionando, leia o valor atual do nome do log bin ario e oset no master: mysql > SHOW MASTER STATUS; +---------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +---------------+----------+--------------+------------------+ | mysql-bin.003 | 73 | test,bar | foo,manual,mysql | +---------------+----------+--------------+------------------+ 1 row in set (0.06 sec) A coluna File exibe o nome do log, enquanto Position exibe o oset. No exemplo acima, o valor do log bin ario e mysql-bin.003 e o oset e 73. Grave os valores. Voc e precisar a us a-los mais tarde quando estiver congurando o slave. Uma vez realizada a c opia e gravado o nome do log e oset, voc e pode reabilitar a atividade de escrita no master: mysql> UNLOCK TABLES; Se voc e estiver usando tabelas InnoDB, voc e deve usar a ferramente InnoDB Hot Backup que est a disponivel para aqueles que compraram as licen cas comerciais do MySQL, suporte ou a pr opria ferramenta de backup. Ele faz uma c opia consistente sem fazer nenhum lock no servidor master, e grava o nome do log e o oset correspondente em um snapshot para ser usado postriormente no slave. Mais informa c oes sobre esta ferramenta esta disponivel em http://www.innodb.com/order.php.
388
Sem a ferramenta Hot Backup, o modo mais r apido para tirar uma c opia das tabelas InnoDB e desligar o servidor master e copiar os arquivos e logs de dados do InnoDB e os arquivos de deni c ao de tabela (.frm). Para gravar o nome e oset do arquivo de log atual voc e deve fazer o seguinte antes de desligar o servidor: mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS; E ent ao grave o nome e oset do log da sa ida de SHOW MASTER STATUS como mostrado anteriormente. Uma vez gravado o nome e o oset do log, desligue o servidor sem destravar as tabelas para se certicar que ele nalizar a com a c opia correspondente ao arquivo de log e oset: shell> mysqladmin -uroot shutdown Uma alternativa para tabelas MyISAM e InnoDB e fazer um dump SQL do master em vez de uma c opia bin aria como acima; para isso voc e pode usar mysqldump --masterdata em seu master e mais tarde executar o dump SQL em seu slave. No entanto, isto e mais lento que fazer a c opia bin aria. Se o master foi executado anteriormente sem o --log-bin habilitado, os valores do nome do log e da posi c ao mostrados por SHOW MASTER STATUS ou mysqldump estar ao vazios. Neste caso, grave a string vazia () para o nome do log e 4 para o oset. 4. Assegure-se que a se c ao [mysqld] do arquivo my.cnf no master inclui a op c ao logbin. Esta se c ao tamb em deve conter a op c ao server-id=unique number, onde master_ id deve ser um valor inteiro entre 1 e 2^32 - 1. Por exemplo: [mysqld] log-bin server-id=1 Se estas op c oes n ao est ao presentes, adicione-as e reinicie o servidor. 5. Pare o servidor que ser a usado como slave e adicione o seguinte ao arquivo my.cnf: [mysqld] server-id=slave_id O valor slave_id, como o valor master_id, deve ser um valor inteiro de 1 to 2^32 - 1. Adicionalmente, e muito importante que o ID do slave seja diferente do ID do master. Por exemplo: [mysqld] server-id=2 Se voc e estiver usando v arios servidores, cada um deve ter um valor server-id que seja diferente daquele do master e de cada um dos slaves. Pense nos valores de server-id como algo similar ao endere co IP: Estes IDs identicam de forma u nica cada inst ancia de servidor na comunidade dos parceiros de replica c ao. Se voc e n ao quiser especicar um server-id, ele ser a congurado com 1 se voc e n ao tiver denido master-host, sen ao ele ser a denido com 2. Note que no caso de omiss ao do server-id, um master ir a recusar conex oes de todos os slaves e um slave ir a recusar se conectar a um master. Assim, omitir server-id s o e bom para backups com um log bin ario. 6. Se voc e zer um backup bi ario dos dados do servidor master, copie-o para o diret orio de dados do servidor slave antes de inici a-lo. Certique-se que os privil egios nos arquivos
389
7.
8.
9.
10.
e diret orios est ao corretos. O usu ario com o qual o MySQL executa precisa estar apto a l e-los e alter a-los, assim como no master. Se voc e zer um backup usando mysqldump, inicie o slave primeiro (veja o pr oximo passo). Inicie o servidor slave. Se ele tiver sido replicado previamente, inicie o servidor slave com a op c ao --skip-slave-start. Voc e tamb em pode querer iniciar o servidor slave com a op c ao --log-warnings. Deste modo voc e ir a obter mais mensagens sobre problemas (por exemplo, problemas de rede, ou conex ao). Se voc e fez um backup dos dados do servidor master usando mysqldump, carregue o arquivo de dump no servidor slave: shell> mysql -u root -p < dump_file.sql Execute os seguintes comandos no slave, substutitua os valores dentro de <> com o os valores atuais relevantes ao ser sistema: mysql> CHANGE MASTER TO -> MASTER_HOST=<master host name>, -> MASTER_USER=<replication user name>, -> MASTER_PASSWORD=<replication password>, -> MASTER_LOG_FILE=<recorded log file name>, -> MASTER_LOG_POS=<recorded log offset>; A tabela a seguir lista o tamanho m aximo da string para as vari aveis: MASTER_HOST 60 MASTER_USER 16 MASTER_PASSWORD 32 MASTER_LOG_FILE 255 Inicie a thread slave: mysql> START SLAVE;
Depois de realizado este procedimento, o slave deve se conectar ao master e pegar todas as atualiza c oes que ocorreram desde que o backup foi restaurado. Se voc e esqueceu de congurar o server-id no master, os slaves n ao poder ao se conectar a eles: Se voc e esqueceu de congurar o server-id no slave, voc e ir a obter o seguinte erro no arquivo de log: Warning: one should set server_id to a non-0 value if master_host is set. The server will not act as a slave. Voc e tamb em encontrar a mensagens de erro no log de erro do slave se ele n ao puder replicar por qualquer motivo. Uma vez que um slave est a replicando, voc e encontrar a um arquivo chamado master.info e um chamado relay-log.info no diret orio de dados. Estes dois arquivos s ao usados pelo slave para manter o registro de quanto foi processado do log bin ario do master. N ao remova ou edite o arquivo, a menos que voc e realmente saiba o que est a fazendo e entenda as implica c oes. Mesmo neste caso, e mais aconselh avel usar o comando CHANGE MASTER TO. NOTA: o conte udo de master.info sobrep oe algumas op c oes especicadas na lina de comando ou no my.cnf veja Se c ao 4.11.6 [Op c oes de Replica c ao], P agina 393 para mais detalhes.
390
Agora que voc e tem uma c opia instant anea, voc e pode us a-la para congurar outros slaves. Para isso siga a por c ao referente ao slave descrita acima. Voc e n ao precisa ter outra c opia do master.
391
em uma tabela MERGE, voc e ter a uqe executar FLUSH TABLES manualmente no servidor. Desde o MySQL 4.1.1, estes comandos s ao escritos no log bin ario (exceto FLUSH LOGS, FLUSH MASTER, FLUSH SLAVE, FLUSH TABLES WITH READ LOCK) a menos que voc e especique NO_WRITE_TO_BINLOG (ou seu alias LOCAL). Para um exemplo da sintaxe Se c ao 4.6.4 [FLUSH], P agina 300. O MySQL suporta somente um master e v arios slaves. Posteriormente adicionaremos um algor itimo de vota c ao para trocar automaticamente o master se alguma coisa estiver errada com o master atual. Iremos tamb em introduzir processos agentes para ajudar a fazer o balanceamento de carga enviando consultas SELECT para diferentes slaves. Tabelas tempor arias s ao replicadas, exceto no caso em que voc e desliga o servidor slave (e n ao apenas a thread slave), e voc e tem alguns tabelas tempor arias replicadas e s ao usadas em instru c oes UPDATES que ainda n ao foram executadas no slave. (Se voc e desligar o slave, as tabelas tempor arias necess arias por estas atualiza c oes n ao estar ao mais dispon iveis quando o slave iniciar novamente.) Para evitar este problema, n ao desligue o servidor enquanto ele tiver tabelas tempor arias abertas. Em vez disto, use este procedimento: 1. Envie uma instru c ao STOP SLAVE. 2. Use SHOW STATUS para vericar o valor da vari avel Slave_open_temp_tables. 3. Se o valor e 0, envie um comando mysqladmin shutdown para desligar o slave. 4. Se o valor e diferente de 0, reinicie as threads slaves com START SLAVE. 5. Repita o procedimento anterior para ver se voc e ter a melhor sorte na pr oxima vez. Planejamoc corrigir este problema em um futuro pr oximo. seguro conectar servidores em um relacionamento master/slave circular com log E slave-updates habilitado. Note, entretanto, que v arias consultas n ao ir ao funcionar corretamente neste tipo de congura c ao a menos que o c odigo do cliente seja escrito para tomar cuidado dos potenciais problemas que podem ocorrer em diferentes sequ encias em servidores diferentes. Isto signica que voc e pode fazer uma congura c ao parecida com o seguinte: A -> B -> C -> A As IDs do servidor s ao codicadas nos eventos do log bin ario. A saber a quando o evento que ele l e e foi originalmente criado por A, assim A n ao o executar a n ao haver a loop innito. Mas esta congura c ao circular s o funcionar a se voc e realizar atualiza c oes n ao conitantes entre as tabelas. Em outras palavras, se voc e insere dados em A e C, voc e nunca deve inserir um registro em A que pode ter uma chave conltante com um registro em C. Voc e tamb em n ao deve atualizar os mesmos registros em dois servidores se a ordem que a atualiza c ao e aplicada importa. Se houver um erro em uma consulta no slave, a thread slave ir a terminar e uma mensagem ir a aparecer no log de erro do slave. Voc e deve ent ao conectar a um slave manualmente, corrigir a causa do erro (por exemplo, tabela n ao existente), e ent ao executar o comando sql SLAVE START. Se a conex ao para o master for perdida, o slave ir a tentar se reconectar imediatamente. Se ele falhar, o slave ir a tenatr a cada master-connect-retry segundos (padr ao 60). Por causa disto, e seguro desligar o master, e ent ao reinici a-lo depois de um tempo. O slave tamb em est a apto para lidar com interrup c oes de rede. No entanto o slave
392
noticar a a a perda da rede apenas ap os n ao ter recebido dados do master por slave_ net_timeout segundos. Assim se sua perda for pequena, voc e pode querer diminuir slave_net_timeout. Veja Se c ao 4.6.8.4 [SHOW VARIABLES], P agina 310. Desligar o slave (corretamente) tamb em e seguro, pois mant em sinais de onde parou. Desligamentos incorretos podem produzir problemas, especialmente se o cache de disco n ao foi sincronizado antes do sistema morrer. Seu sistema de toler ancia a falhas ser a melhorado se voc e possuir um bom No-Break ou UPS. Devido a natureza n ao trabnsacional das tabelas MyISAM, e poss ivel ter uma consulta que atulizar a apenas parcialmente uma taela e retornar a um c odigo de erro. Isto pode acontecer, por exemplo, em uma inser c ao multi-registro que tem uma viola c ao da restri c ao da chave o use uma consulta de atualiza c ao e nalizada ap os atualizar alguns dos registros. Se isto acontecer no master, a thread slave sair a e ir a esperar o DBA decidir o que fazer com isto a menos que seja autenticado e a execu c ao da consulta resulte no mesmo c odigo de erro. Se este comportamento da valida c ao do c odigo de erro n ao for desej avel, algum (ou todos) os erros podem ser ignorados com a op c ao --slave-skip-errors. Ela est a disponivel a partir da vers ao 3.23.47. Se voc e atualiza tabelas transacionais a partir de tabelas n ao-transacioanis dentro de um segmento BEGIN/COMMIT, a atualiza c ao no log bin ario pode estar fora de sincronia se algumas threads alterarem a tabela n ao transacional antes do commit da transa c ao. Isto e porque a transa c ao e escrita no log bin ario apenas quando e feito o commit. Antes da vers ao 4.0.15, qualquer atualiza c ao de uma tabela n ao transacional e gravada no log bin ario imeditamente quando a atualiza c ao e feita enquanto atualiza c oes transacionais s ao gravadas no COMMIT ou n ao gravadas se voc e utilizar um ROLLBACK. Voc e deve levar isto em conta quando atualizar tabelas transacionais e n ao transacionais na mesma transa c ao e voc e estiver usando o log bin ario para backup ou replica c ao. Na vers ao 4.0.15 n os alteramos o comportamento do registro de transa c oes que misturam atualiza c oes de tabelas transacionais e n ao transacionais, que soluciona o problema (ordem das consultas boas no log bin ario, e todas as consultas necess arias s ao gravadas no log bin ario mesmo no caso de um ROLLBACK). O problema que permanece e quando uma segunda conex ao atualiza uma tabela n ao transacional enquanto a primeira transa c ao da conex ao ainda n ao est a nalizada (ordena c ao errada ainda pode ocorrer, porque a atualiza c ao da segunda conex ao ser a gravada imediatamente depois de ela ter sido feita). A seguinte tabela lista problemas na vers ao 3.23 que est ao corrigidas na vers ao 4.0: LOAD DATA INFILE e tratado apropriadamente desde que o arquivo ainda esteja no servidor master no momento da propaga c ao da atualiza c ao. LOAD LOCAL DATA INFILE ser a ignorado. Na vers ao 3.23 RAND() em atualiza c oes n ao e replicado apropriadamente. Use RAND(alguma_expr_nao_rand) se voc e estiver replicando atualiz c oes com RAND(). Voc e pode, por exemplo, utilizar UNIX_TIMESTAMP() para o argumento de RAND(). Isto e corrigido na vers ao 4.0.
393
Se n ao existir nenhum arquivo master.info quando o servidor slave inicia, ele usa valores espec icados no arquivo de op c oes ou na linha de comando. Isto ir a ocorrer quando voc e iniciar o servidor como um slave de replica c ao pela primeira vez, ou voc e executar RESET SLAVE e desliga e reiniciar o servidor slave. No entanto, se o arquivo master.info existe quando o servidor slave iniciar, ele usa o valor no arquivo e IGNORA qualquer valor especicado para aquelas op c oes no arquivo de op c ao ou na linha de comando. Suponha que voc e especique esta op c ao em seu arquivo my.cnf: [mysqld] master-host=this_host A primeira vez que voc e iniciar o servidor como um slave de replica c ao, ele ir a ler e usar a op c ao do arquivo my.cnf. O servidor gravar a ent ao aquele valor no arquivo master.info. A pr oxima vez que voc e iniciar o servidor, ele ir a ler o valor da m aquina master a partir do arquivo master.info. Se voc e modicar o arquivo my.cnf para especicar uma m aquina master diferente, ele n ao ter a efeito. Voc e deve usar CHANGE MASTER TO. A partir do MySQL 4.1.1, as seguintes op c oes tamb em e tratada de forma especial: --master-ssl --master-ssl-ca --master-ssl-capath --master-ssl-cert --master-ssl-cipher --master-ssl-key
O arquivo master.info inclui os valores correspondentes a essas op c oes. Adicionalmente, o formato do arquivo na vers ao 4.1.1 inclui na sua primeira linha o n umero de linhas no arquivo. Se voc e atualizar um servidor mais antigo para a vers ao 4.1.1, o master.info ser a atualizado para o novo formato automaticamente quando o novo servidor iniciar. (Se
394
voc e substituir um MySQL 4.1.1 ou mais novo por uma vers ao mais antiga que a 4.1.1, voc e deve remover a primeira linha manualmente antes de iniciar o servidor mais antigo pela primeira vez.) Como o servidor da preced encia a uma arquivo master.info existente sobre as op c oes de inicializa c ao acima descrito, voc e pode preferir usar as op c oes de inicializa c ao para estes valores, e especique-os usando a instru c ao CHANGE MASTER TO. See Se c ao 4.11.8.1 [CHANGE MASTER TO], P agina 402. Este exemplo mostra um uso mais extensivo das op c oes de inicializa c ao para congurar um servidor slave: [mysqld] server-id=2 master-host=db-master.mycompany.com master-port=3306 master-user=pertinax master-password=freitag master-connect-retry=60 report-host=db-slave.mycompany.com The following list describes startup options for controlling replication: --log-slave-updates Diz ao slave para registrar as atualiza c oes feitas pela thread da SQL do slave desligado por padr claro que ele exige que ele no log bin ario do slave. E ao. E exige que o slave seja iniciado com o log bin ario habilitado (op c ao --log-bin). --log-slave-updates e usado quando voc e deseja colocar diversos servidores em cadeia. Por exemplo, voc e pode querer uma congura c ao como esta: A -> B -> C Isto e, A e o servidor master do slave B, e B e o servidor master do slave C. Para isto funcionar, onde B e tanto uma master quanto um slave, voc e deve iniciar B com a op c ao --log-slave-updates. A e B devem ser iniciados com o log bin ario habilitado. --log-warnings Fazer slave exibir mais mensagens sobre o que est a sendo feito. Por exemplo, ele avisar a que ele obteve sucesso em reconectar depois de uma falha de conex ao/rede, o avisr a sobre cada thread slave iniciada. Esta op c ao n ao est a limitada apenas ao uso da replica c ao. Ela produz avisos atrav es de um espectro de servidores ativos. --master-host=host Especica o nome de m aquina ou endere co de IP do master para replica c ao. Se esta op c ao n ao for dada, a thread slave n ao ser a iniciada. O valor em master.info tem preced encia se ele puder ser lido. Provavelmemte um nome nelhor para est a op c ao seria algo do tipo --bootstrap-master-host, mas e muito tarde para alter a-la agora. --master-user=nome_usu ario O usu ario da conta que a thread slave usar a para autenticar ao conectar ao master. A conrta deve ter o privil egio REPLICATION SLAVE (Em vers oes an-
395
teriores a 4.0.2 ele devia ter o privil egio FILE). Se o usu ario do master n ao for congurado, assume-se o usu ario teste. O valor em master.info toma preced encia se puder ser lida. --master-password=password A senha da conta com a qual a thread slave autenticar a quando conectar ao master. Se n ao denida, um senha vazia e considerada. O valor em master.info toma preced encia se puder ser lido. --master-port=portnumber A porta que o master est a escutando. Se n ao denifa, a congura c ao de compila c ao do MYSQL_PORT e consierada. Se voc e n ao alterou as op c oes do configure , ela deve ser 3306. O valor em master.info toma preced encia se ele puder ser lido. --master-connect-retry=seconds O n umero de segundos que a thread slave espera antes de tentar se conectar ao master no caso do master ter ca ido ou a conex ao for perdida. O padr ao e 60. O valor em master.info toma preced encia se puder ser lido. --master-info-file=filename Especica o nome a ser usado no arquivo que o slave grava a informa c ao sobre o master. O nome padr ao e master.info no diret orio de dados. --master-ssl --master-ssl-ca=file_name --master-ssl-capath=directory_name --master-ssl-cert=file_name --master-ssl-cipher=cipher_list --master-ssl-key=filename Estas op c oes s ao usadas para congurar um conex ao de replica c ao segura para o servidor master usando SSL. Os seus signicados s ao os mesmos das op c oes correspondentes --ssl, --ssl-ca, --ssl-capath, --ssl-cert, --ssl-cipher, --ssl-key descritas em Se c ao 4.4.10.5 [SSL options], P agina 275. Estas op c oes est ao operacionais a partir do MySQL 4.1.1. --max-relay-log-size=# Para rotacionar o relay log automaticamente. VARIABLES], P agina 310. Veja Se c ao 4.6.8.4 [SHOW
--relay-log=filename Para especicar a localiza c ao e nome que deve ser usado os relay logs. Voc e pode us a-lo para ter nomes de relay logs independentes do nome de m aquina, ou se o seu relay log tend a ser grande (e voc e n ao que diminuir max_relay_ log_size) e voc e precisa coloc a-los em alguma area diferente do diret orio de dados, ou se voc e quiser aumentar a velocidade balanceando as cargas entre os discos. --relay-log-index=filename Para especicar a localiza c ao e nome que deve ser usado para arquivo de indice dos relay logs.
396
--relay-log-info-file=filename Para dar outro nome a relay-log.info e/ou coloc a-lo em outro diret orio, diferente do diret orio de dados. --relay-log-purge=0|1 Disabilita/habilita a remo c ao autom atica dos relay logs assim que ele n ao s ao mais necess arios. Esta e uma vari avel global que ode ser alterada din amicamente com SET GLOBAL RELAY_LOG_PURGE=0|1. o valor padr ao e 1. Esta op c ao est a dispon ivel a partir do MySQL 4.1.1. --relay-log-space-limit=# Para colocar um limite superior no tamanho total de todos os relay logs no slave (Um valor 0 signica ilimitado). Isto eu til se voc e tiver um disco r igido pequeno em. sua m aquina slave. Quando o limite e alcan cado, a thread de E/S ca em pausa (n ao l e o log bin ario do master) at e que a thread de SQL tenha buscado e deletado alguns dos relay logs n ao utilizados. Note que este limite n ao e absoluto: existem casos onde a thread SQL precisa de mais eventos para poder deletar, neste caso a thread de E/S ir a superar o limite at e que a dele c ao seja poss ivel. Se isto n ao for feito ela entra em deadlock (o que acontecia antes do MySQL 4.0.13). Os usu arios n ao devem congurar --relay-log-space-limit para menos que duas vezes o valor de --max-binlog-size (ou --max-binlogsize se --max-relay-log-size for 0) porque neste caso h a a chance de que quando a thread de E/S espera por espa co livre porque --relay-log-spacelimit e excedido, a thread de SQL n ao tem relay log para apagar e assim n ao pode satisfazer a thread de E/S, for cando-a a ignorar temporariamente --relay-log-space-limit. --replicate-do-table=db_name.nome_tabela Diz para thread slave restrigir a replica c ao a uma tabela espec ica. Para especicar mais de uma tabela, use a diretiva m ultiplas vezes, uma para cada tabela. Isto funcionar a para atualiza c oes atrav es de bancos de dados, em contraste com --replicate-do-db. Por favor, leia as notas que seguem esta lista de op c oes --replicate-ignore-table=db_name.nome_tabela Diz a thread slave para n ao replicar qualquer comando que atualiza a tabela especicada (mesmo se qualquer outra tabela puder ser atualizada pelo mesmo comando). Para especicar mais de uma tabela a ser ignorada, use a diretiva v arias vezes, para cada tabela. Isto funcionar a para atualiza c oes atrav es de bancos de dados, em contraste com --replicate-ignore-db. Por favor, leia as notas que seguem esta lista de op c oes --replicate-wild-do-table=db_name.nome_tabela Diz a thread slave para restringir a replica c ao a consultas onde qualquer das tabelas atualizadas correspondam a padr ao de meta caracteres especicado. Para especicar mais de uma tabela, use a diretiva v aria vezes, uma para cada tabela, Isto funciona para atualiza c oes atrav es de banco de dados. Por favor, leia as notas que seguem esta lista de op c oes Exemplo: --replicate-wild-do-table=foo%.bar% replicar a apenas atualiza c oes que usam uma tabela em qualquer banco de dadis que comece com foo e cujos nomes de tabelas comecem com bar.
397
Note que se voc e zer --replicate-wild-do-table=foo%.% ent ao a regra ser a propagada para CREATE DATABASE e DROP DATABASE, ex.: estas duas instru c oes ser ao replicadas se o nome de banco de dados corresponder ao padr ao do banco de dados (foo% aqui) (testa m agica e poss ivel por % ser o padr ao da tabela). Caracteres curingas _ e % escapados: se voc e quiser replicar, por exemplo, todas as tableas do banco de dados my_own%db (este e o nome exato do banco de dados), e n ao replicar tabelas do banco de dados my1ownAABCdb, voc e deve escapar o _ e %: voc e deve usar algo como isto: replicate-wild-do-table=my\_ own\%db. E se voc e estiver especicando esta op c ao para a linha de comando, dependendo do seu sistema, voc e precisar a escapar o \ (por exemplo, com uma shell bash, voc e precisaria digitar --replicate-wild-do-table=my\\_ own\\%db). --replicate-wild-ignore-table=db_name.nome_tabela Diz a thread slave pra n ao replicar um consulta onde qualquer tabela corresponda ao padr ao de meta caracteres dado. Para especicar mais de uma tabela, use a diretiva v arias vezes, uma vez para cada tabela. Isto funcionar a para atualiza c oes atrav es de banco de dados. Por favor, leia as notas que seguem esta lista de op c oes Exemplo: --replicate-wild-ignore-table=foo%.bar% n ao atualizar a tabelas no banco de dados que iniciar com foo e cujo os nomes de tabela iniciem com bar. Note que se voc e zer --replicate-wild-ignore-table=foo%.% ent ao a regra ser a propagada para CREATE DATABASE e DROP DATABASE, ex. estas duas instru c oes n ao ser ao replciadas se o nome do banco de dados n ao corresponder ao padr ao (foo% aqui) (esta m agica ocorre devido ao % como padr ao da tabela). Caracteres curingas _ e % escapados: veja as anota c oes na descri c ao de replicate-wild-do-table logo acima. --replicate-do-db=nome_bd Diz ao slave para restringir a replica c ao a comandos onde o banco de dados atual (p.ex., aquele selecionado por USE) e nome_bd. Para especicar mais de uym banco de dadosm use a diretiva v arias vezes, uma vez por tabela. Note que isto n ao replicar a consultas entre bancos de dados tais como UPDATE algum_ bd.alguma_tabela SET foo=bar se for selecionado outro banco de dados ou nenhum banco de dados. Se voc e precisa que atualiza c oes entre bancos de dados funcionem, certique-se de que voc e tem o MySQL 3.23.28 ou posterior, e use --replicate-wild-do-table=db_name.%. Por favor, leia as notas que seguem esta lista de op c oes Exemplo do que n ao funciona como voc e espera: se o slave e iniciado com -replicate-do-db=sales, e voc e faz USE prices; UPDATE sales.january SET amount=amount+1000;, esta consulta n ao ser a replicada. Se voc e precisar que atualiza c oes entre bancos de dados funcionem, use -replicate-wild-do-table=db_name.%. A principal raz ao para este comportamento de apenas vericar o banco de dados atual e que e dif icil para um comando sozinho saber se deve ser replicado ou
398
n ao; por exemplo se voc e est a usando comandos delete ou update multi-tabelas que continuam entre m ultiplos bancos de dados. Tamb em e muito mais r apido vericar apenas o banco de dados atual. --replicate-ignore-db=nome_bd Diz ao slave para n ao replicar qualquer comando onde o banco de dados atual (p.ex. o selecionado por USE) e nome_bd. Para especicar mais bancos de daods use a diretiva diversas vezes, uma para cada banco de dados. Voc e n ao deve utilizar esta diretiva se voc e est a usando atualiza c ao atrav es de tabelas e voc e n ao quer que estas atualiza c oes sejam replicadas. Por favor, leia as notas que seguem esta lista de op c oes Exemplo do que n ao funcionaria como esperado: se o slave e iniciado com -replicate-ignore-db=sales, e voc e faz USE prices; UPDATE sales.january SET amount=amount+1000;, esta consulta ser a replicada. Se voc e precisar de atualiza c oes entre banco de dados funcione, use --replicate-wild-ignore-table=db_name.%. --replicate-rewrite-db=de_nome->para_nome Diz ao slave para traduzir o banco de dados atual (p.ex. aquele selecionado por USE) para para_nome se ele era de_nome no master. Apenas instru c oes envolvendo a tabela podem ser afetadas (CREATE DATABASE, DROP DATABASE n ao poder ao), e apenas se de_nome era o banco de dados atual no master. Isto n ao funcionar a para atualiza c oes entre banco de dados. Note que a transla c ao e feita antes das regras de --replicate-* serem testadas. Exemplo: replicate-rewrite-db=master_db_name->slave_db_name --report-host=host O Nome de m aquina ou n umero IP do slave a ser relatado ao master durante o registro do slave. Aparecer a na sa ida de SHOW SLAVE HOSTS. Deixe indenido se voc e n ao quiser que o slave se registre no master. Note que ele n ao e suciente para o master simplesmente ler o n umero IP do slave fora dos sockets uma vez que o slave se conecte. Devido ao NAT e outros assuntos de roteamento,a quele IP pode n ao ser v alido para se conectar ao slave a partir do master ou outras m aquinas. Esta op c ao est a dispon ivel a partir do MySQL 4.0.0. --report-port=portnumber Porta para conex ao do slave relatado ao master durante o registro do slave. Dena-o apenas se o slave est a escutando por uma porta diferente da padr ao ou se voc e tiver um tunel especial do master ou outros clientes para o slave. Se n ao tiver certeza, deixe esta op c ao indenida. Esta op c ao est a disponivel a partir do MySQL 4.0.0. --skip-slave-start Diz ao servidor slave para n ao iniciar a thread slave na iicializa c ao do servidor. O usu ario pode inici a-las mais tarde com START SLAVE. --slave_compressed_protocol=# Se 1, usa compacta c ao no protocolo cliente/servidor se tanto o slave quanto o mester suport a-la.
399
--slave-load-tmpdir=filename Esta op c ao e igual ao valor da vari avel tmpdir por padr ao. Quando a thread SQL do slave replica um comando LOAD DATA INFILE, ele extrai os arquivos a serem carregados do relay logs em arquivos tempor arios, e ent ao os carrega dentro da tabela. Se o arquivo carregado no master era enorme, os arquivos tempor arios no slave tamb em ser ao enormes; embora voc e possa desejar que o slave coloque o arquivo tempor ario em algum disco grande diferente de tmpdir, usando esta op c ao. Nestes caso, voc e tamb em pode usar a op c ao --relay-log, j a que os relay logs ser ao grandes tamb em. --slave-load-tmpdir deve apontar para o sistema de arquivo baseado em disco; n ao em um baseado em mem oria. Como o slave precisa de arquivos tempor arios usados para replicar LOAD DATA INFILE) para sobreviver a uma reinicializa c ao da m aquina. --slave-net-timeout=# N umero de segundos a esperer por mais dados do master antes de abortar a leitura, considerando o quebra de conex ao e as tentativas de reconectar. A primeira vez ocorre imediatamente depois do tempo limite. O intervalo entre tentativas e controlado pela op c ao --master-connect-retry. --slave-skip-errors= [err_code1,err_code2,... | all] Diz ao a thread SQL do slave para continuar a replica c ao quando uma consulta retornar um erro de uma lista fornecida. Normalmente, a replica c ao ir a parar ao encontrar um erro, dando ao usu ario a chance de resolver a inconsist encian nos dados manualmente. N ao use esta op c ao a menos que voc e saiba exetamente o motivo dos erros. Se n ao houver erros em sua congura c ao da replica c ao e programas clientes, e n ao houver erros no MySQL, voc e nunca deve ter uma replica c ao abortada com erro. O uso indiscriminado desta op c ao resultar a em slaves fora de sincronia com o master e voc e n ao ter a id eia de como o problema aconteceu. Para c odigos de erros, voc e deve usar o n umero fornecido pela mensagem de erron no seu log de erros do slave e na sa ida de SHOW SLAVE STATUS. Uma lista completa de mensagens de erro podem ser encontradas na distribui c ao fonte em Docs/mysqld_error.txt. Os c odigos de erros do servidor tamb em s ao listados em Se c ao 13.1 [Error-returns], P agina 885. Voc e tamb em pode (mas n ao deve) usar um valor n ao recomendado de all o que ir a ignorar todas as mensagens de erro e continua em frente indiferentemente. N ao e preciso dizer, que se voc e usar isto, n ao podemos garantir a integridade dos seus dados. Por favor, n ao reclame se seus dados no slave n ao estiver nem pr oximo daqueles em seu master neste caso voc e foi avisado. Exemplos: --slave-skip-errors=1062,1053 --slave-skip-errors=all Algumas destas op c oes, como todas as op c oes --replicate-*, s o podem ser denidas na inicializa c ao do servidor slave, e n ao com ele ligado. Planejamos corrigir isto. Aqui est a a ordem de avalia c ao das regras --replicate-*, para decidir se a consulta ser a executada pelo slave ou ignorada por ele:
400
1. Existe alguma regra --replicate-do-db ou --replicate-ignore-db? Sim: teste-as como para --binlog-do-db e --binlog-ignore-db (veja Se c ao 4.10.4 [Binary log], P agina 375). Qual e o resultado do teste? ignore a consulta: ignore-a e saia. execute a consulta: n ao execute-a imediatamente, adie a decis ao, v a para o passo abaixo. N ao: v a para o passo abaixo. 2. Existe alguma regra --replicate-*-table? N ao: execute a consulta e saia. Sim: v a para o passo abaixo. Apenas tabela que ser ao atualizadas ser ao comparadas ` as regras (INSERT INTO sales SELECT * from prices: apenas sales ser a comparada ` as regras). Se v arias tabelas forem ser atualizadas (instru c oes multitabelas) a primeira a corresponder a regra (com do ou ignore) vence (isto e, a primeira tabela e comparada a regra. se nenhuma decis ao pode ser tomada a segunda tabela e compara ` as regras, etc). 3. Existe alguma regra --replicate-do-table? Sim: o tabela encaixa em alguma delas? Sim: execute a consulta e saia. N ao: v a para o passo abaixo. N ao: v a para o passo abaixo. 4. Existe alguma regra --replicate-ignore-table? Sim: a tabela encaixa em alguma delas? Sim: ignore a consulta e saia. ao: v a para o passo abaixo. N N ao: v a para o passo abaixo. 5. Existe alguma regra --replicate-wild-do-table? Sim: a tabela se encaixa em qualquer uma delas? Sim: execute a consulta e saia. N ao: v a para o passo abaixo. N ao: v a para o passo abaixo. 6. Existe alguma regra --replicate-wild-ignore-table? Sim: a tabela se encaixa em qualquer uma delas? Sim: ignore a consulta e saia. N ao: v a para o passo abaixo. N ao: v a para o passo abaixo. 7. Nenhuma regra --replicate-*-table foi correspondida. Existe outra tabela para se testar com estas regras? Sim: loop. N ao: testamos todas as tabelas a serem atualizadas, nenhuma regra foi obedecida. Existem regras --replicate-do-table ou --replicate-wild-do-table? Sim: ignore a consulta e saia. N ao: execute a consulta e saia.
401
402
403
| | | | |
MASTER_SSL_CA = ca_file_name MASTER_SSL_CAPATH = ca_directory_name MASTER_SSL_CERT = cert_file_name MASTER_SSL_KEY = key_file_name MASTER_SSL_CIPHER = cipher_list
Altera os par ametros que o servidor slave usa para conectar e comunicar com o servidor master. Os valores poss iveis para o valor master_def est ao mostrados acima. As op c oes do relay log (RELAY_LOG_FILE e RELAY_LOG_POS) est ao dispon iveis a partir do MySQL 4.0. As op c oes SSL (MASTER_SSL, MASTER_SSL_CA, MASTER_SSL_CAPATH, MASTER_SSL_CERT, MASTER_SSL_KEY, e MASTER_SSL_CIPHER) est ao dispon iveis a partir do MySQL 4.1.1. Voc e pode alterar estas op c oes mesmo nos slaves que s ao compilados sem suporte a SSL. Eles ser ao salvos no arquivo master.info mas ignorados at e que voc e use um servidor que tenha suporte a SSL habilitado. Por exemplo: mysql> CHANGE MASTER TO -> MASTER_HOST=master2.mycompany.com, -> MASTER_USER=replication, -> MASTER_PASSWORD=bigs3cret, -> MASTER_PORT=3306, -> MASTER_LOG_FILE=master2-bin.001, -> MASTER_LOG_POS=4, -> MASTER_CONNECT_RETRY=10; mysql> CHANGE MASTER TO -> RELAY_LOG_FILE=slave-relay-bin.006, -> RELAY_LOG_POS=4025; MASTER_USER, MASTER_PASSWORD, MASTER_SSL, MASTER_SSL_CA, MASTER_SSL_CAPATH, MASTER_SSL_CERT, MASTER_SSL_KEY, and MASTER_SSL_CIPHER are information for the slave to be able to connect to its master. If you dont specify some of these informations, the non-specied informations will keep their old value. For example, if the password to connect to your MySQL master has changed, you just need to issue mysql> STOP SLAVE; -- if replication was running mysql> CHANGE MASTER TO MASTER_PASSWORD=new3cret; mysql> START SLAVE; -- if you want to restart replication to tell the slave about the new password; no need to specify the information which did not change (host, port, user etc). MASTER_HOST, MASTER_PORT are the hostname or IP adress of the master host, and its TCP port. Note that if MASTER_HOST is equal to localhost, then, like in other parts of MySQL, the port may be ignored (if Unix sockets can be used for example). Se voc e especicar MASTER_HOST ou MASTER_PORT, o slave assumir a que o mestre e diferente do anterior (mesmo se voc e especicar um valor de nost ou porta iguais ao do valor atual.) Neste caso Assim, os valores antigos do nome e posi c ao do log bin ario do mestre n ao s ao mais aplic aveis, assim se voc e n ao especicar MASTER_LOG_FILE e MASTER_LOG_POS no comando, MASTER_LOG_FILE= e MASTER_LOG_POS=4 s ao silenciosamente adicionados a ele.
404
MASTER_LOG_FILE e MASTER_LOG_POS s ao as coordenadas das quais a thread de E/S do slave come cara a ler do master na pr oxima vez em que ele for iniciado. If you specify any of them, you cant specify RELAY_LOG_FILE or RELAY_LOG_POS. If none of MASTER_LOG_FILE and MASTER_LOG_POS was specied, then the last coordinates of the slave SQL thread before CHANGE MASTER was issued, are used. This ensures that replication has no discontinuity, even if the slave SQL thread was late compared to the slave I/O thread, when you just want to change, say, the password to use. This safe behaviour was introduced starting from MySQL 4.0.17 and 4.1.1. (Before these versions, the used coordinates were the last coordinates of the slave I/O thread before CHANGE MASTER was issued, which caused the SQL thread to sometimes lose some events from the master, thus breaking replication.) CHANGE MASTER TO deleta todos os relay logs (e inicia um novo), a menos que voc e especique RELAY_LOG_FILE ou RELAY_LOG_POS (neste caso os relay logs ser ao mantidos; desde o MySQL 4.1.1 a vari avel global RELAY_LOG_PURGE ser a denida com zero sem aviso pr evio). CHANGE MASTER TO atualiza master.info e relay-log.info. CHANGE MASTER e util para congurar um slave quando voc e tem a c opia do master e gravou o registro e oset no master que corresponde a c opia tirada. Voc e pode executar CHANGE MASTER TO MASTER_LOG_FILE=log_name_on_master, MASTER_LOG_POS=log_ offset_on_master no slave depois de restaurar a c opia. O primeiro exemplo acima (CHANGE MASTER TO MASTER_HOST=master2.mycompany.com etc) altera as coordenadas do master e do seu log bin ario. Isto e quando voc e deseja que o slave replique o master. O segundo exemplo, usado com menos frequ encia, e quando o slave possui relay logs que, por alguma raz ao, voc e deseja que o slave execute novamente; para fazer isto o master n ao precisa estar alcan cavel, voc e s o precisa fazer CHANGE MASTER TO e iniciar a thread de SQL (START SLAVE SQL_THREAD). Voc e pode usar isto mesmo fora da consigura c ao de replica c ao, em um servidor standalone, slave-de-ningu em, para recupera c ao depois de uma falha. Suponha que o seu servidor tenha falhado e voc e tenha restaurado um backup. Voc e deseja reexecutar o pr oprio log bin ario do servidor (n ao os relay logs, mas logs bin arios regulares), supostamente chamado myhost-bin.*. Primeiro fa ca uma c opia destes logs bin arios em alguns lugares seguros, no caso de voc e n ao seguir exatamente o procedimento abaixo e acidentalmente apagar os logs bin arios de servidor. Se voc e estiver usando o MySQL 4.1.1 ou mais novos, dena SET GLOBAL RELAY_LOG_PURGE=0 para seguran ca adicional. Ent ao inicie o servidor sem log-bin, com um novo ID do servidor (diferente do anterior), com relay-log=myhost-bin (para fazer o servidor acreditar que estes logs bin arios regulares s ao relay logs) e skip-slave-start, ent ao execute estas instru c oes: mysql> CHANGE MASTER TO -> RELAY_LOG_FILE=myhost-bin.153, -> RELAY_LOG_POS=410, -> MASTER_HOST=some_dummy_string; mysql> START SLAVE SQL_THREAD; Ent ao o servidor ir a ler e executar seus pr oprios logs bin arios, e assim conseguindo a recupera c ao de falhas. Uma vez que a recupera c ao est a nalizada, execute STOP SLAVE, desligue o servidor, delete master.info e relay-log.info, e reinicie o servidor com suas op c oes originais. No momento, especicar MASTER_HOST (mesmo com um valor modelo) e compuls orio para fazer o servidor pensar que ele e um slave, e dar ao servidor um novo ID,
405
diferente do anterior e compuls orio sen ao o servidor ver a os eventos com seus IDs e pensar a que ele est a em uma congura c ao de replica c ao circular e ignora os eventos, o que e indesejado. No futuro planejamos adicionar op c oes para lidar com estas pequenas restri c oes.
406
4.11.8.4 MASTER_POS_WAIT()
SELECT MASTER_POS_WAIT(master_log_file, master_log_pos) usada para assegurar que o slave tenha alcan Esta e uma fun c ao, n ao um comando. E cado (lido e executado) uma dada posi c ao no log bin ario do master. Veja Se c ao 6.3.6.2 [Miscellaneous functions], P agina 546 para uma descri c ao completa.
407
Master_Log_File: gbichot-bin.005 Read_Master_Log_Pos: 79 Relay_Log_File: gbichot-relay-bin.005 Relay_Log_Pos: 548 Relay_Master_Log_File: gbichot-bin.005 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 79 Relay_Log_Space: 552 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 8 Dependendp da sua vers ao do MySQL, voc e pode n ao ver todos os campos como aqui mostrado. Alguns campos est ao presentes apenas a partir do MySQL 4.1.1. Os campos mostrados por SHOW SLAVE STATUS tem o seguinte signicado: Slave_IO_State Uma c opia da coluna State da sa ida de SHOW PROCESSLIST para a thread de E/S do slave; lhe dir a se est a thread est a tentando se conectar ao master, esperando por eventos do master, reconectando ao master, etc. Os estados poss iveis est ao listados em Se c ao 4.11.2 [Replication Implementation], P agina 380. Olhar est a coluna e necess ario porque, por exemplo, a thread pode estar em execu c ao mas n ao tem sucesso ao tentar se conectar ao master: apenas esta coluna lhe deixar a ciente do problema de conex ao. Por outro lado, o estado da thread SQL n ao e copiada, porque as coisas s ao mais simples para esta thread: se ela estiver em execu c ao, n ao haver a problema; se n ao, voc e encontrar a o erro na coluna Last_Error (descrita abaixo). Este campo est a presente a partir do MySQL 4.1.1. Master_Host A m aquina master atual. Master_User O usu ario usado para conectar ao master.
408
Master_Port A porta atual do master. Connect_Retry O valor atual de master-connect-retry. Master_Log_File O nome do arquivo de log bin ario do master no qual a thread de E/S est a lendo atualmente. Read_Master_Log_Pos A posi c ao at e a qual a thread de E/S leu no log bin ario do master. Relay_Log_File O nome do arquivo de relay log na qual a thread SQL est a lendo e executando atualmente. Relay_Log_Pos A posi c ao at e a qual a thread de SQL leu e executou neste relay log. Relay_Master_Log_File O nome do arquivo de log bin ario do master no qual cont em o u ltimo evento executado pela thread de SQL. Slave_IO_Running Diz se a thread de E/S foi iniciada ou n ao. Slave_SQL_Running Diz se a thread de SQL est a iniciada ou n ao. Replicate_Do_DB, Replicate_Ignore_DB A lista de banco de dados que foi especicado com as op c oes --replicate-dodb e --replicate-ignore-db. Replicate_Do_Table, Replicate_Ignore_Table, Replicate_Wild_Do_Table, Replicate_Wild_Ignore_Table As tabelas que foram especicadas com as op c oes --replicate-do-table, --replicate-ignore-table, --replicate-wild-do-table, e --replicatewild-ignore_table. Estes campos est ao presentes a partir do MySQL 4.1.1. Last_Errno O n umero de erro retornado pela consulta executada mais recentemente. Um valor 0 signica sem erro. Last_Error A mensagem de erro retonada pela consulta executada mais recentemente. Por exemplo: Last_Errno: 1051 Last_Error: error Unknown table z on query drop table z A mensagem indica que a tabela z existia no mestre e foi apagada l a, mas ela n ao existe no slave, assim DROP TABLE falhou no servidor. (Isto pode ocorrer se o usu ario esqueceu de copi a-la no slave ao congur a-lo).
409
A string vazia signica sem erro. Se o valor Last_Error n ao for vazio, ele tamb em apareceria como uma mensagem no log de erro do slave. Por exemplo: Skip_Counter Ou ltimo valor usado por SQL_SLAVE_SKIP_COUNTER. Exec_Master_Log_Pos A posi c ao no log bin ario do master (Relay_Master_Log_File) do u ltimo evento executado pela thread de SQL. ((Relay_Master_Log_File,Exec_Master_Log_ Pos) no log bin ario do master corresponde a (Relay_Log_File, Relay_Log_ Pos) no relay log). Relay_Log_Space O tamanho total de todos os relay logs existentes. Until_Condition, Until_Log_File, Until_Log_pos O valor especicado na cl ausula UNTIL da instru c ao START SLAVE. Until_Condition possui estes valores estes valorer: None se nenhuma cl ausula UNTIL foi especicada Master se o slave estiver lendo at e uma dada posi c ao no log bin ario do master. Relay se o slave estiver lendo at e uma dada posi c ao em seus relay logs Until_Log_File e Until_Log_Pos indicam o nome do arquivo de log e e posi c ao que dene o ponto no qual a thread SQL ir a parar a execu c ao. Estes campos est ao presentes a partir do MySQL 4.1.1. Master_SSL_Allowed, Master_SSL_CA_File, Master_SSL_CA_Path, Master_SSL_Cert, Master_SSL_Cipher, Master_SSL_Key Estes campos mostram os par ametros SSL usado pelo slave para se conectar os master, se existirem. Master_SSL_Allowed possui estes valores: Yes se uma conex ao SSL ao master e permitida No se uma conex ao SSL ao master n ao e permitida Ignored se uma conex ao SSL permitida pelo servidor slave n ao tem suporte a SSL habilitado. Os valores dos outros campos correspodem ao valor das op c oes --master-ca, --master-capath, --master-cert, --master-cipher, e --master-key. Estes campos est ao presentes a partir do MySQL 4.1.1. Seconds_Behind_Master O n umero de segundos passados desde o u ltimo evento do master executado pela thread salve SQL. Ser a NULL quando nenhum evento foi executado ainda, ou depois de CHANGE MASTER e RESET SLAVE. Esta coluna pode ser usada para saber "qu ao atrasado est a o seu slave". Funcionar a mesmo se o seu master e slave n ao tiverem clocks id enticos. Estes campos est ao presentes a partir do MySQL 4.1.1.
410
411
412
Voc e tamb em pode usar LOAD DATA FROM MASTER. Este e um comando conveniente que tira uma c opia, a restaur a no slave e ajustar o nome e oset do log no slave, todos de uma vez. No futuro, LOAD DATA FROM MASTER ser a o modo recomendado de congurar um slave. Esteja avisado, no entanto, que o lock de leitura pode ser mantido por um longo tempo se voc e usar este comando. Ele ainda n ao est a implementado de forma t ao eciente quanto gostariamos. Se voc e tiver tabelas grandes, o m etodo prefer ivel neste momento ainda e com uma c opia tar local depois de executar FLUSH TABLES WITH READ LOCK. P: O slave precisa estar conectado ao master o tempo todo? R: N ao, ele n ao precisa. O slave pode ser desligado ou permanecer desconectado por horas ou mesmo dias, ent ao reconecta e busca as atualiza c oes. Por exemplo, voc e pode usar uma rela c ao master/slave sobre uma conex ao dial-up que est a ligada espor adicamente apenas por um curto per iodo de tempo. A implica c ao disto e que a uma hora dada qualquer n ao temos garantias de que o slave est a sincronizado com o master a menos que voc e tire algumas medidas especiais. No futuro, teremos a op c ao de bloquear o master at e que pelo menos um slave esteja sincronizado. P: Como posso saber se um slave est a atrasado comparado ao master? Em outra palavras, como eu sei que o dado da u ltima consulta replicada pelo escravo? R: Se o slave for 4.1.1 ou mais novo, leia a coluna Seconds_Behind_Master de SHOW SLAVE STATUS. Para vers ao mais antigas o seguinte se aplica. Isto s o e poss ivel se a thread salve de SQL existir (p.ex. se ele for exibida em SHOW PROCESSLIST, veja Se c ao 4.11.3 [Replication Implementation Details], P agina 381) (no MySQL 3.23: se a thread slave existir, p.ex. e mostrada em SHOW PROCESSLIST), e se ela executou pelo menos um evento do master. Realmente, quando a thread slave de SQL executa um evento lido do master, esta thread modica seu pr oprio tempo do timestamp do evento ( e por isto que TIMESTAMP e bem replicado). Assim e indicado na coluna Time na sa ida de SHOW PROCESSLIST, o n umero de segundos entre o timestamp do u ltimo evento replicado e o tempo real da m aquina slave. Vopc e podee usar isto para determinar a data do u ltimo evento replicado. Note que se o seu slave foi desconectado do master por uma hora e ent ao reconectado, voc e poder a ver uma vlaor de 3600 na coluna Time para a thread slave de SQL em SHOW PROCESSLIST... Isto ocorreria porque o slave est a executando consultas de uma hora atr as. P: Como eu for co o master a bloquear as atualiza c oes at e que o slave as busque? R: Use o seguinte procedimento: 1. No master, execute estes comandos: mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS; Grave o nome do log e o oset da sa ida da instu c ao SHOW. 2. No slave, execute este comando, onde as coordenadas da replica c ao que s ao os argumentos da fun c ao MASTER_POS_WAIT() s ao os valores gravados nos passos anteriores: mysql> SELECT MASTER_POS_WAIT(log_name, log_offset); A instru c ao SELECT ser a bloqueada at e que o slave alcance o arquivo de log e oset especicados. Neste ponto, o slave estar a em sincronia com o master e a instru c ao ir a retornar. 3. No master, execute a seguinte instru c ao para permitir que o master comece a processar atualiza c oes novamente:
413
mysql> UNLOCK TABLES; P: Sobre quais assuntos eu devo estar ciente ao congurar uma replica c ao de duas vias? R: Atualmente a replica c ao do MySQL n ao suporta nenhum protocolo de locking entre master e slave para garantir a atomicidade de uma atualiza c ao distribu ida (entre servidores). Em outras palavras, e poss ivel para um cliente A fazer uma atualiza c ao para um co-master 1, e neste tempo, antes de propagar para o co-master 2, o cliente B pode fazer uma atualiza c ao para o co-master 2 que far a a atualiza c ao do cliente A funcionar diferentemente da que ele fez no co-master 1. Assim, quando a atualiza c ao do cliente A zer a atualiza c ao para o co-master, ele produzir a tabelas que s ao diferentes daquelas que voc e tem no co-master 1, mesmo depois de todas as atualiza c oes do co-master2 tamb em terem sido propagadas. Por isso voc e n ao deve co-encadear dois servidores em uma replica c ao de duas vias, a menos que voc e possa assegurar que suas atualiza c oes possem seguramente ocorrer em qualquer ordem, ou que de alguma forma voc e cuide de alguma forma a atualiza c ao fora de ordem no c odigo do cliente. Voc e tamb em deve perceber que replica c ao de duas vias n ao melhorar em muito o desempenho, j a que temos atualiza c oes envolvidas. Ambos os servidores precisam fazer a mesma quantidade de atualiza c oes cada, como se tivesse um servidor. A u nica diferen ca e que haver a uma pouco menos de conten c ao de lock, porque as atualiza c oes originando em outro servidor ser ao serializadas em uma thread slave. mesmo assim, este benef icio pode ser por atrasos de rede. P: Como eu posso usar replica c ao para melhorar a performance do meu sistema? R: Voc e devev congurar um servidor como master e direcionar todas as escritas para ele. Ent ao congure tantos slaves quantos voc e pode comprar e instalar, e distribua as leituras entre o master e os slaves. Voc e tamb em pode iniciar os slaves com --skip-bdb, --lowpriority-updates e --delay-key-write=ALL para conseguir aumento de velocidade para o slave. Neste caso o slave usar a tabelas MyISAM n ao transacionais em vez de tabelas BDB para conseguir mais velocidade. Q: O que eu devo fazer para preparar o c odigo do cliente em minhas pr oprias aplica c oes para usar replica c ao para melhora de performance? A: Se a parte do seu c odigo que for respons avel pela acesso ao banco de dados tiver sido absta ido/modularizado apropriadamente, converte-lo para executar com uma congura c ao de replica c ao deve ser bem f acil. Apenas altere a implementa c ao de seu acesso a banco de dados para enviar todas as escritas para o master e todas as leituras para o master e o slave. Se o seu c odigo n ao tiver este n ivel de abstra c ao, congurar um sistema de replica c ao lhe dar a a oportunidade e motiva c ao de limp a-lo. Voc e deve iniciar criando uma biblioteca ou m odulo wrapper com as seguites fun c oes: safe_writer_connect() safe_reader_connect() safe_reader_query() safe_writer_query() safe_ no nome de cada fun c ao signica que a fun c ao cuidar a do tratamento de todas as condi c oes de erro.
414
Voc e pode, e claro, usar diferentes nomes para as fun c oes. O importante e ter uma interface unicada para conex ao para leitura, conex ao para escrita, fazer uma leitura e fazer uma escrita. Voc e deve ent ao converter o c odigo do seu cliente para usar a biblioteca wrapper. Este pode ser um processo doloroso e assustador a princ ipio, mas ser a graticante a longo prazo. Todas as aplica c oes que usam a abordagem descrita poder ao tirar vantagem de uma congura c ao master/slave, mesmo envolvendo v arios slaves. O c odigo ser a muito mais f acil de manter, e adicionar op c oes para solu c oes de problemas ser a trivial. Voc e s o precisar a modicar uma ou duas fun c oes, por exemplo, para registrar quanto tempo uma consulta gastou ou qual consulta, entre todas elas, retornou um erro. Se voc e j a tiver escrito muito c odigo, voc e pode querer automatizar a convers ao de tarefas usando o utilit ario replace, que vem com a distribui c ao padr ao do MySQL, ou simplesmente escrever seu pr oprio script Perl. Provavelmente, o seu c odigo segue algum padr ao de reconhecimento. Se n ao, ent ao talvez sej a melhor reescrev e-lo ou pelo menos coloc a-lo dentro de um padr ao. Q: Quando e em quanto a replica c ao do MySQL pode aumentar a performance do meu sistema? A: A replica c ao do MySQL e mais ben eca para um sistema com leituras frequentes e escritas infrequentes. Em teoria, usando uma congura c ao um mastre/v arios slaves voc e pode escalar o sistema adicionando mais slaves at e que voc e que sem largura de banda na rede, ou a sua carga de atualiza c oes cres ca ao ponto que o master n ao possa trat a-la. Para determinar quantos slaves voc e pode ter antes dos beneficios adicionados come carem a estabilzar e quanto voc e pode melhorar o desempenho do seu site, voc e precisa saber o padr ao de suas consultas e determinar empiricamente (pelo benchmark) a rala c ao entre a taxa nas leituras (leituras por segundo, ou max_reads) e nas escritas (max_writes) em um master e um slave comum. O exemplo aqui lhe mostrar a um calculo simplicado do que voc e pode obter com replica c ao para o nosso sistema hipot etico. Vamos dizer que o sistema de cargas consiste de 10% de escrita e 90% de leitura, e determinamos max_reads para ser 1200 - 2 * max_writes. Em outras palavras, nosso sistema pode fazer 1200 leituras por segundo sem nenhuma escrita, a escrita m edia e duas vezes mais lenta que a leitura m edia e a reala c ao e linear. Vamos supor que o master e cada slave possuem a mesma capacidade, e temos 1 master e N slaves. Ent ao temos para cada servidor (master ou slave): leituras = 1200 - 2 * escritas (a partir do benchmark) leituras = 9* escritas / (N + 1) (as leituras s ao separadas, mas a escrita deve ir para todos os servidores) 9*escritas/(N+1) + 2 * escritas = 1200 escritas = 1200/(2 + 9/(N+1) Esta an alise leva as seguintes conclus oes: Se N = 0 (que signica que n ao temos replica c ao) nosso sistema pode tratar 1200/11, cerca de 109, escritas por segundos (o que signica que teremos 9 vezes mais leituras devidos a natureza de nossa aplica c ao) Se N = 1, podemos aumentar para 184 escritas por segundos. Se N = 8, conseguimos 400.
415
Se N = 17, 480 escritas. Eventualmente, a medida que N se aproxima de innito (e seu or camento de menos innito), podemos chegar pr oximo a 600 escritas por segundo, aumentando o throughput do sistema em cerca de 5,5 vezes. No entanto, com apenas 8 servidores, j a o aumentamos em quase 4 vezes. Note que nossos calculos assumem uma largura de banda de rede innita, e negligencia v arios outros fatores que podiam se tornar signicante em seu sistema. Em muitos casos, voc e pode n ao conseguir fazer um c alculo similar ao acima que ir a predizer exatamente o que acontecer a em seus sistema se voc e adicionar N slaves de replica c ao. No entanto, responder as seguintes quest oes deve ajud a-lo a decidir quando e quanto a replica c ao aumentar a a performance do seu sistema: Qual a raz ao da leitura/escrita no seu sistema? Quanto mais de carga de escrita um servidor pode tratar se voc e reduzir a leitura? Para quantos slaves voc e tem largura de banda disponiovel em sua rede? P: Como eu posso usar replica c ao para fornecer redund ancia/alta disponibilidade? R: Com os recursos dispon iveis atualmente, voc e teria que congurar um master e um slave (ou diversos slaves) e escrever um script que monitoraria o master para ver se ele est a no ar e instruir as suas aplica c oes e os slaves do master a alterar no caso de falha. Sugest oes: Para dizer para um slave para alterar o master, use o comando CHANGE MASTER TO. Um bom modo de manter sua aplica c ao informadas sobre a localiza c ao do master e tendo uma entrada DNS din amica para o master. Com bind voc e pode usar nsupdate para atualizar dinamicamente o seu DNS. Voc e deve executar seus escravos com a op c ao --log-bin e sem --log-slave-updates. Deste modo o slave estar a pronto para se tornar um master assim que voc e executar STOP SLAVE; RESET MASTER, e CHANGE MASTER TO em outros slaves. Por exemplo, considere que voce e tenha a seguinte congura c ao (M representa o master, S o slave, WC o cliente que faz a leitura e escrita do banco de dados; clientes que fazem apenas a leitura do banco de dados b ao s ao representadas j a que elas n ao precisam trocar): WC \ v WC----> M / | \ / | \ v v v S1 S2 S3 S1 (como S2 e S3) e um slave executando com --log-bin e sem --log-slave-updates. Como as u nicas escritas executada em S1 s ao aquelas replicadas de M, o log bin ario em S1 e empty (lembre-se, que S1 e executado sem --log-slave-updates). Ent ao, por alguma raz ao, M se torna indispon ivel, e voc e quer que o S1 se torne o novo master (isto e, direciona todos os WC para S1 e fa ca S2 e S3 replicar em S1). Certique-se que todos os slaves processaram aqulquer consulta em seus relay log. Em cada slave, execute STOP SLAVE IO_THREAD, ent ao verique a sa ida de SHOW
416
PROCESSLIST at e voc e ver Has read all relay log. Quando isto ocorrer para todos os slaves, eles podem ser recongurados para a nova congura c ao. Envie STOP SLAVE para todos os slaves, RESET MASTER no slave sendo promovido para master, e CHANGE MASTER nos outros slaves. Nenhum WC acessa M. Instru todos os WCs a direcionar as suas consultas para S1. De agora em diante, todas as consultas enviadas por WC para S1 s ao escritas no log bin ario de S1. O log bin ario de S1 cont em exatamente todas as consultas de escrita enviada para S1 desde que M foi nalizado. Em S2 (e S3) fa ca STOP SLAVE, CHANGE MASTER TO MASTER_HOST=S1 (onde S1 e substituido pelo nome de m aquina real de S1). Para CHANGE MASTER, adicione todas as informa c oes sobre como conectar a S1 de S2 ou S3 (usu ario, senha, porta). Em CHANGE MASTER, n ao e necess ario especicar o nome do log bin ario de S1 ou a sua posi c ao: n os sabemos que ele e o primeiro log bin ario, na posi c ao 4, e estes s ao os padr oes de CHANGE MASTER. Finalmente fa ca START SLAVE em S2 e S3, e agora voc e ter a isto: WC / | WC | M(indispon ivel) \ | \ | v v S1<--S2 S3 ^ | +-------+ Quando M estiver ativo novamente, voc e s o precisa enviar a ele o mesmo CHANGE MASTER enviado a S2 e S3, assim que M se tornar um slave de S1 e pegar tudo que WC gravou enquando ele estava desativado. Agora para tornarmos M como master novamente (por exemplo, porque ela e a melhor m aquina), siga os procedimentos como se S1 estivesse indisponivel e M fosse o novo master; ent ao durante o procedimento n ao esque ca d executar RESET MASTER em M antes de tornar S1, S2, S3 como slaves de M ou eles podem buscar escritas antigas de WC, antes da indisponibilidade de M. Atualmente estamos trabalhando na integra c ao de um sistema de elei c ao de master autmotico dentro do MySQL, mas at e que ele esteja pronto, voc e ter a que criar suas pr oprias ferramentas de monitoramento.
417
O slave est a executando? Fa ca SHOW SLAVE STATUS e verique se os valores Slave_IO_ Running e Slave_SQL_Running s ao ambos Yes. Se n ao, verique a op c ao do slave. Se o slave estiver rodando, ele estabeleceu uma conex ao com o master? Fa ca SHOW PROCESSLIST, encontre as threads de E/S e SQL (veja Se c ao 4.11.3 [Replication Implementation Details], P agina 381 para ver como e exibido), e verique a sua coluna State. Se ela disser Connecting to master, verique os privil egios do usu ario de replica c ao no master, nome de m aquina do master, sua congura c ao de DNS, se o master est a atualmente em execu c ao e se ele est a a alcance do slave. Se o slave estava em execu c ao antes mas agora parou, a raz ao e que normalmente algumas consultas que obtem sucesso no master falham no slave. Into nunca deve acontecer se voc e tiver tirado a c opia apropriada do master e nunca modicou os dados no slave fora da thread slave. Se isto ocorrer, voc e encontrou um erro; leia abaixo como relat a-lo. Se uma consulta bem sucedida no master se recusou a executar no slave, e n ao parece pr atico fazer um nova sincroniza c ao completa do banco de dados (p.ex.: deletar o banco de dados slave e fazer uma nova c opia do master), tente o seguinte: Primeiro veja se a tabela do slave estava diferente da do master. Entenda como isto aconteceu (pode ser um erro: leia o registro de altera c oes no manual online do MySQL como http://www.mysql.com/documentation para vericar se este e um erro conhecido e se ele j a est a corrigido). Ent ao fa ca a tabela do slave id entica a do master e execute START SLAVE. Se o acima n ao funcionar ou n ao se aplica, tente entender se ele estaria seguro para fazer uma atualiza c ao manualmente (se necess ario) e ent ao ignorar a pr oxima consulta do master. Se voc e decidiu que voc e pode saltar a pr oxima consulta, execute as seguintes instru c oes: mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n; mysql> START SLAVE; O valor de n deve ser 1 se a consulta n ao usa AUTO_INCREMENT ou LAST_INSERT_ ID(). Sen ao, o valor de ser 2. A raz ao para usarem um valor de 2 para consultas que usam AUTO_INCREMENT ou LAST_INSERT_ID() e que elas gastam dois eventos no log bin ario do master. Tenha certeza de que voc e n ao est a tendo problemas com um erro antigo atualizando para a vers ao mais recente. Se voc e tem certeza que o slave iniciou perfeitamente em sincronia com o master, e que as tabelas envolvidas nao foram atualizadas fora da thread slave, relate o erro.
418
Se voc e tiver uma forma repetit ivel de demonstrar o problema, por favor inclua-o em nosso banco de dados de bugs http://bugs.mysql.com. Se voc e tem um problema de fantasma (um problema que n ao pode ser duplicado a sua vontade), use o seguinte procedimento: 1. Verique se nenhum erro de usu ario est a envolvido. Por exemplo, se voc e atualiza o slave fora da thread slave, os dados podem car fora de sincronia e podem ocorrer viola c oes de chave u nica nas atualiza c oes. Neste caso a thread slave ir a terminar e esperar que voc e limpe as tabelas manualmente para entrar em sincronia. Este n ao e um problema de replica c ao; e um problema de interfer encia externa que faz com que a replica c ao falhe. 2. Execute o slave com as op c oes log-slave-updates e log-bin. Elas far ao com que o registre todas as atualiza c oes que ele receber no seu pr oprio log bin ario. 3. Salve todas as evid encias antes de restaurar o estado da replica c ao. Se n ao tivermos nenhuma informa c ao ou apenas algum esbo co, ser a um pouco mais dif icil para rastrearmos o problema. As evid encias que voc e deve coletar s ao: Todos os logs bin arios no master Todos os logs bin arios no slave A saida de SHOW MASTER STATUS no master na hora que voc e descobriu o problema. A saida de SHOW SLAVE STATUS no master na hora que voc e descobriu o problema. Logs de erro no master e no slave 4. Utilize mysqlbinlog para examinar os logs bin arios. A informa c ao a seguir pode ser u til para encontrar a consulta problem atica, por exemplo: mysqlbinlog -j pos_from_slave_status /caminho/para/log_do_slave | head Uma vez que voc e coletou as evid encias do problema fantasma, tente isol a-lo em um caso de testes separados inicialmente. Ent ao relate o problema para http://bugs.mysql.com/ com a maior quantidade poss iveis de informa c oes.
419
5 Otimiza c ao do MySQL
Otimiza c ao e uma tarefa complicada porque necessita um entendimento do sistema como um todo. Enquanto for poss ivel fazer algumas otimiza c oes com pequeno conhecimento de seu sistema ou aplica c ao, quanto mais otimizado voc e desejar que o seu sistema esteja, mais ter a que saber sobre ele. Este cap itulo tentar a explicar e fornecer alguns exemplos de diferentes formas de otimizar o MySQL. Lembre-se, no entanto, que sempre existir ao (cada vez mais dif iceis) formas adicionais de deixar seu sistema mais r apido.
420
Todas as colunas possuem valor padr ao. Se voc e inserir um valor errado em uma coluna, como um NULL em uma coluna NOT NULL ou um valor num erico muito grande em uma coluna num erica, o MySQL denir a coluna com o melhor valor poss ivel em vez de dar um erro. Para valores num ericos isto e 0, o menor valor possivel ou o maior valor possivel. Para strings into e tanto uma string vazia quanto a maior string poss ivel que possa estar na coluna. Todas as express oes calculadas retornam um valor que pode ser usado em vez de apresentar uma condi c ao de erro. Por exemplo, 1/0 retorna NULL Para mais informa c oes sobre isto, veja Veja Se c ao 1.8.5 [Constraints], P agina 52. O mostrado acima quer dizer que n ao se deve usar o MySQL para vericar o conte udo dos campos, mas deve se fazer isto no aplicativo.
5.1.2 Portabilidade
Como todos os servidores SQL implementam diferentes partes de SQL, e trabalhoso escrever aplicativos SQL port aveis. Para selects/inserts muito simples e muito f acil, mas quanto mais recursos voc e precisa, mais dif icil se torna. Se voc e quiser uma aplica c ao quue e r apida com muitos bancos de dados ela se torna ainda mais dificil. Para fazer um aplicativo port avel complexo voc e precisa escolher um n umero de servidores SQL com o qual ele deve trabalhar.
Voc e pode utilizar o MySQL programa/web-page crash-me - http://www.mysql.com/information/crash- para encontrar fun c oes, tipos e limites que voc e pode utilizar com uma sele c ao de servidores de bancos de dados. O Crash-me agora testa quase tudo poss ivel, mas continua compreens ivel com aproximadamente 450 itens testados. Por exemplo, voc e n ao deve ter nomes de colunas maior do que 18 caracteres se desejar utilizar o Informix ou DB2. Os programas de benchmarks e crash-me do MySQL s ao bastante independentes do bancos de dados. Dando uma olhada em como n os os tratamos, voc e pode sentir o que e necess ario para escrever sua aplica c ao independente do banco de dados. Os benchmarks podem ser encontrados no diret orio sql-bench na distribui c ao fonte do MySQL. Eles s ao escritos em Perl com a interface de banco de dados DBI (que resolve a parte do problema de acesso). Veja http://www.mysql.com/information/benchmarks.html para os resultados deste benchmark. Como pode ser visto nestes resultados, todos os bancos de dados tem alguns pontos fracos. Isto e, eles possuem diferentes compromissos de projeto que levam a comportamentos diferentes. Se voc e procura por independencia de banco de dados, precisar a ter uma boa id eia dos gargalos de cada servidor SQL. O MySQL e muito r apido para recupera c ao e atualiza c ao de dados, mas ter a problemas em misturar leituras/escritas lentas na mesma tabela. O Oracle, por outro lado, possui um grande problema quando voc e tentar acessar registros que foram recentemente atualizados (at e eles serem atualizados no disco). Bancos de dados transacionais geralmente n ao s ao muito bons gerando tabelas de resumo das tabelas log, nestes casos o travamento de registros e praticamente in util.
421
Para fazer sua aplica c ao realmente independente de banco de dados, voc e precisar a denir uma interface que possa ser expandida, por meio da qual voc e far a a manipula c ao dos dados. Como o C++ est a dispon ivel na maioria dos sistemas, faz sentido utilizar classes C++ para fazer a interface ao banco de dados. Se voc e utilizar algum recurso espec ico para algum banco de dados (como o comando REPLACE no MySQL), voc e deve codicar um m etodo para os outros serviodores SQL para implementar o mesmo recurso (mas mais lento). Com o MySQL voc e pode utilizar a sintaxe /*! */ para adicionar palavras chave especicas do MySQL para uma query. O c odigo dentro de /**/ ser a tratado como um coment ario (ignorado) pela maioria dos servidores SQL. Se alta performance REAL e mais importante que exatid ao, como em algumas aplica c oes WEB, uma possibilidade e criar uma camada de aplica c ao que armazena todos os resultados para lhe fornecer uma performance ainda mais alta. Deixando resultados antigos expirar depois de um tempo, voc e pode manter o cache razoavelmente atual. Isto e muito bom no caso de uma carga extremamente pesada, pois neste caso voc e pode aumentar o cache dinamicamente e congurar o tempo de expira c ao maior at e que as coisas voltem ao normal. Neste caso a informa c ao de cria c ao de tabelas devem conter informa c oes do tamanho inicial do cache e com qual frequ encia a tabela, normalmente, deve ser renovada.
422
simples, pois mantemos todas as tabelas com as transa c os no disco. (Atualmente possuimos pelo menos 50G de tabelas com transa c oes e 200G de outos dados do cliente.) N os tamb em deixamos nossos clientes acessarem as tabelas sum arias diretamente com ODBC para que os usu arios avan cados possam tamb em fazer experimentar com os dados. N os n ao tivemos nenhum problema lidando com isso em um servidor Sun Ultra SPARCstation (2x200 Mhz) bem modesto. Atualmente atualizamos um de nossos servidores para um UltraSPARC com 2 CPUs de 400 Mhz, e planejamos lidar com transa c oes no n ivel de produto, o que pode signicar um aumento de pelo menos dez vezes nosso volume de dados. Acreditamos que podemos lidar com isto apenas adicionando mais disco aos nossos sistemas. Tamb em estamos experimentando com Intel-Linux para obter mais poder de CPU por um melhor pre co. Agora que possuimos o formato bin arios do bancos de dados port aveis (a partir da vers ao 3.23), come caremos a utiliz a-lo para partes da aplica c ao. Nossa sensa c ao inicial e que o Linux ir a atuar muito melhor em cargas baixas e m edias e o Solaris ir a atuar melhor quando voc e come car a ter uma carga alta pelo uso extremo de IO de disco, mas ainda n ao temos nada conclusivo sobre isto. Depois de algumas discuss oes com um desenvolvedor do kernel do Linux, conclu imos que isto pode ser um efeito colateral do Linux; alocar muitos recursos para uma tarefa batch que a performance interativa se torna muito baixa. Isto deixa a m aquina muito lenta e sem resposta enquanto grandes batches estiverem em execu c ao. Esperamos que isto tenha um tratamento melhor em futuras vers oes do kernel Linux.
423
Inserindo 350768 linhas mysql mysql odbc db2 odbc informix odbc ms-sql odbc oracle odbc solid odbc sybase odbc
SegundosSegundos 381 206 619 3460 2692 4012 11291 1801 4802
Para os testes anteriores, o MySQL foi executado com um cache de indices de 8M.
Temos concentrado alguns resultados de benchmarks em http://www.mysql.com/information/benchmark Perceba que a Oracle n ao est a inclu ida porque eles solicitaram a remo c ao. Todos benchmarks Oracle devem ser aprovados pela Oracle! Acreditamos que os benchmarks da Oracle s ao MUITO tendecioso pois os benchmarks acima devem ser executados supostamente para uma instala c ao padr ao para um u nico cliente. Para executar a suite de benchmarks, as seguintes exig encias devem ser satisfeitas: O pacote de benchamark e fornecido com a distribui c ao fonte do MySQL, assim voc e deve ter uma distribui c ao fonte. Voc e tamb em pode fazer um download de uma distribui c ao em http://www.mysql.com/downloads/, ou usar a arvore fonte de desenvolvimento atual. (veja Se c ao 2.3.4 [Installing source tree], P agina 100). Os scripts do benchmark s ao escritos em Perl e usam o m odulo Perl DBI para acessar o servidor de banco de dados, assim o DBI deve estar instalado. Voc e tamb em precisar a do driver DBD espercico do servidor para cada um dos servidores que voc e quer testar. Por exemplo, para testar o MySQL, PostgreSQL, e DB2, os m odulos DBD::mysql, DBD::Pg e DBD::DB2 devem estar instalados. O pacote de benchmark est a localizado no diret orio sql-bench da distribi c ao fonte do MySQL. Para executar o teste de benchmark, altera a localiza c ao dentro daquele diret orio e execute o script run-all-tests: shell> cd sql-bench shell> perl run-all-tests --server=server_name server_name e um dos servidores suportados. Voc e pode obter uma lista de todos par ametros e servidores suportados executando run-all-tests --help. crash-me tenta determinar quais recursos um banco de dados suporta e quais suas capacidades e limita c oes atuais para a execu c ao de consultas. Por exemplo, ele determina: Quais tipos de colunas s ao suportados Quantos indices s ao suportados Quais fun c oes s ao suportadas Qual o tamanho m aximo de uma query Qual o tamanho m aximo de um registro do tipo VARCHAR Podemos encontrar o resultado do crash-me para diversos bancos de dados em http://www.mysql.com/information/crash-me.php.
424
425
O exemplo acima demonstra que o MySQL pode excutar 1.000.000 express oes + em 0.32 segundos em um PentiumII 400MHz. Todas fun c oes MySQL devem ser bem otimizadas, mas existem algumas excess oes e o benchmark(loop_count,expression) e uma otima ferramenta para saber se existe um problema com sua query.
EXPLAIN nome_tabela e um sin onimo para DESCRIBE nome_tabela ou SHOW COLUMNS FROM nome_tabela. Quando uma instru c ao SELECT for precedida da palavra chave EXPLAIN, o MySQL explicar a como ele deve processar a SELECT, fornecendo informa c ao sobre como as tabelas est ao sendo unidas e em qual ordem. Com a ajuda de EXPLAIN, voc e pode ver quando devem ser adicionados indices ` a tabelas para obter uma SELECT mais r apida que utiliza indices para encontrar os registros. Voce deve executar frequentemente ANALYZE TABLE para atualizar estat isticas de tabela tais como a cardinalidade das chaves que podem afetar a escolha que o otimizador faz. Veja Se c ao 4.6.2 [ANALYZE TABLE], P agina 299. Voc e tamb em pode ver se o otimizador une as tabelas em uma melhor ordem. Para for car o otimizador a utilizar uma ordem espec ica de join para uma instru c ao SELECT, adicione uma cl ausula STRAIGHT_JOIN. Para liga c oes mais complexas, EXPLAIN retorna uma linha de informa c ao para cada tabela utilizada na instru c ao SELECT. As tabelas s ao listadas na ordem que seriam lidas. O MySQL soluciona todas as joins utilizando um m etodo multi-join de varedura simples. Isto signica que o MySQL l e uma linha da primeira tabela, depois encontra uma linha que combina na segunda tabela, depois na terceira tabela e continua. Quando todas tabelas s ao processadas, ele exibe as colunas selecionadas e recua atrav es da lista de tabelas at e uma tabela na qual existem registros coincidentes for encontrada. O pr oximo registro e lido desta tabela e o processo continua com a pr oxima tabela. No MySQL vers ao 4.1 a sa ida do EXPLAIN foi alterada para funcionar melhor com constru c oes como UNIONs, subqueries e tabelas derivadas. A mais not avel e a adi c ao de duas novas colunas: id e select_type. A sa ida de EXPLAIN inclui as seguintes colunas: id Identicador SELECT, o n umero sequ encial desta SELECT dentro da consulta.
select_type Tipo de cl ausula SELECT, que pode ser uma das seguintes: SIMPLE PRIMARY UNION SELECT simples (sem UNIONs ou subqueries). SELECT mais externa. Segunda SELECT e as SELECTs posteriores do UNION
426
DEPENDENT UNION Seunda SELECT e SELECTs posteriores do UNION, dependente da subquery exterior. SUBQUERY Primeiro SELECT na subquery. DEPENDENT SUBQUERY Primeiro SELECT, dependente da subquery exterior. DERIVED table type SELECT de tabela derivada (subquery na cl ausula FROM). A tabela para a qual a linha de sa ida se refere. O tipo de join. Os diferentes tipos de joins s ao listados aqui, ordenados do melhor para o pior tipo: system const A tabela s o tem uma linha (= tabela de sistema). Este e um caso especial do tipo de join const. A tabela t em no m aximo um registro coincidente, o qual ser a lido na inicializa c ao da consulta. Como s o h a um registro, os valores da coluna neste registro podem ser considerados constantes pelo resto do otimizador. Tabelas const s ao muito r apidas e s ao lidas apenas uma vez! const e usado quando voc e compara todas as partes de uma chave PRIMARY/UNIQUE com restri c oes: SELECT * FROM const_table WHERE primary_key=1; SELECT * FROM const_table WHERE primary_key_part1=1 AND primary_key_part2=2; eq_ref Uma linha ser a lida desta tabela para cada combina c ao de linhas da tabela anterior. Este e o melhor tipo de join depois dos tipos usado quando todas as partes do const. E indice s ao usados pela join e o indice e eu nico (UNIQUE) ou uma chave prim aria (PRIMARY KEY). eq_ref pode ser usado para coluna indexadas que e comparada com o\ operador =. O item comparado pode ser uma constante ou uma express ao que usa colunas de tabelas que s ao lidas antes desta tabela. Nos seguintes examplos, ref_table poder a usar eq_ref SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column; SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1; Todas as colunas com valores de indices correspondentes ser ao lidos desta tabela para cada combina c ao de registros da tabela anterior. ref e usado se o join usa apenas o prexo mais a esquerda da
ref
427
chave, ou se a chave n ao eu nica (UNIQUE) ou uma chave prim aria (PRIMARY KEY) (em outras palavras, se a join n ao puder selecionar um u nico registro baseado no valor da chave). Se a chave que e usada coincide apenas em alguns registros, este tipo de join e bom. ref pode ser usado para colunas indexadas que s ao comparadas com o operador =. Nos seguintes exemplos, ref_table poder a usar ref SELECT * FROM ref_table WHERE key_column=expr; SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column; SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1; ref_or_null Como ref, mas com o adicional que faremos uma busca extra para linhas com NULL. Veja Se c ao 5.2.5 [IS NULL optimization], P agina 435. Esta otimiza c ao do tipo join e nova para o MySQL 4.1.1 e e mais usada na resolu c ao de sub queries. range Apenas registros que est ao numa dada faixa ser ao retornados, us ando um indice para selecionar os registros. A coluna key indica qual indice e usado. key_len cont em a maior parte da chave que foi usada. A coluna ref ser a NULL para este tipo. range pode ser usado para quando uma coluna de chave e comparada a uma constante com =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN e IN. SELECT * FROM range_table WHERE key_column = 10; SELECT * FROM range_table WHERE key_column BETWEEN 10 and 20; SELECT * FROM range_table WHERE key_column IN (10,20,30);
SELECT * FROM range_table WHERE key_part1= 10 and key_part2 IN ( index Isto e o mesmo que ALL, exceto que apenas a arvore de indice e varrida. Isto e normalmente mais r apido que ALL, j a que o arquivo de indice normalmente e menor que o arquivo de dados. Ele pode ser usado quando a consulta s o usa colunas que s ao parte de um indice. ALL Ser a feita uma varredura completa da tabela para cada combina c ao de registros da tabela anterior. Isto normalmente n ao e bom se a
428
tabela e a primeiro tabela n ao marcada como const, e normalmente muito ruim em todos os casos ordenados. Voc e normalmente pode ebitar ALL adicionando mais indices, assim o registro pode ser retornado baseado em valores constantes ou valores de colunas de tabelas anteriores. possible_keys A coluna possible_keys indica quais indices o MySQL pode utilizar para encontrar os registros nesta tabela. Note que esta coluna e totalmente independente da ordem das tabelas. Isto signica que algumas das chaves em possible_ keys podem n ao ser usadas na pr atica com a ordem de tabela gerada. Se esta coluna for NULL, n ao existem indices relevantes. Neste caso, voc e poder a melhora a performance de sua query examinando a cl ausula WHERE para ver se ela refere a alguma coluna ou colunas que podem ser indexadas. Se for verdade, crie um indice apropriado e conra a consulta com EXPLAIN novamente. Veja Se c ao 6.5.4 [ALTER TABLE], P agina 607. Para ver os indices existentes em uma tabela, utilize SHOW INDEX FROM nome_ tabela. key A coluna key indica a chave ( indice) que o MySQL decidiu usar. A chave ser a NULL se nenhum indice for escolhido. Para for car o MySQL a usar um indice listado na coluna possible_keys, use USE INDEX/IGNORE INDEX em sua consulta. Veja Se c ao 6.4.1 [SELECT], P agina 562. Executando myisamchk --analyze (veja Se c ao 4.5.6.1 [sintaxe do myisamchk], P agina 282) ou ANALYSE TABLE (veja Se c ao 4.6.2 [ANALYZE TABLE], P agina 299) na tabela tamb em ajudar a o otimizador a escolher indices melhores. key_len A coluna key_len indica o tamanho da chave que o MySQL decidiu utilizar. O tamanho ser a NULL se key for NULL. Note que isto nos diz quantas partes de uma chave multi-partes o MySQL realmente est a utilizando. A coluna ref exibe quais colunas ou contantes s ao usadas com a key para selecionar registros da tabela. A coluna rows informa o n umero de linhas que o MySQL deve examinar para executar a consulta. Esta coluna contem informa c oes adicionais de como o MySQL ir a resolver a consulta. A seguir uma explica c ao das diferentes strings de texto que podem ser encontradas nesta coluna: Distinct O MySQL n ao continuar a a procurar por mais registros para a combina c ao de registro atual depois de ter encontrado o primeiro registro coincidente. O MySQL estava apto a fazer uma otimiza c ao LEFT JOIN na consulta e n ao examinar a mais registros nesta tabela para a combina c ao do registro anterior depois que encontrar um registro que satisfa ca o crit erio do LEFT JOIN. Exemplo:
Not exists
429
SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL; Assume que t2.id e denido com NOT NULL. Neste caso o MySQL ir a percorrer t1 e procurar pelos registros em t2 atrav es de t1.id. Se o MySQL encontrar um registro combinando em t2, ele sabe que t2.id nunca poder a ser NULL e n ao ir percorrer at e o resto dos registros em t2 que possuirem o mesmo id. Em outras palavras, para cada registro em t1 o MySQL s o precisa fazer uma u nica pesquisa em t2, independente de quantos registros coincidentes existirem em t2. range checked for each record (index map: #) O MySQL n ao encontrou um bom indice para usar. No lugar, ele ir a fazer uma verica c ao sobre qual indice usar (se existir) para cada combina c ao das tabelas precedentes, e usar a este indice para recuperar os registros da tabela. Isto n ao e muito r apido mas e mais r apido que fazer um join sem um indice. Using filesort O MySQL precisar a fazer uma passada extra para descobrir como recuperar os registros na ordem de classica c ao. A classica c ao e feita indo atrav es de todos os registros de acordo com join type e armazenar a chave de ordena c ao mais o ponteiro para o registro para todos os registros que combinarem com o WHERE. Ent ao as chaves s ao classicadas. Finalmente os registros s ao recuperados na ordem de classica c ao. Using index A informa c ao da coluna e recuperada da tabela utilizando somente informa c oes na arvore de indices sem ter que fazer uma pesquisa adicional para ler o registro atual. Isto pode ser feito quando todas as colunas usadas para a tabela zerem parte do mesmo indice. Using temporary Para resolver a consulta, o MySQL precisar a criar uma tabela tempor aria para armazenar o resultado. Isto acontece normalmente se voc e zer um ORDER BY em um conjunto de colunas diferentes das quais voc e fez um GROUP BY. Using where Uma cl ausula WHERE ser a utilizada para restringir quais registros ser ao combinados com a pr oxima tabela ou enviar para o cliente. se voc e n ao possui esta informa c ao e a tabela e do tipo ALL ou index, pode existir alguma coisa errada na sua query (Se voc e n ao pretender examinar todos os registros da tabela). Se voc e desejar deixar suas consultas o mais r apido poss ivel, voc e deve dar uma olhada em Using filesort e Using temporary. Voc e pode ter uma boa indica c ao de qu ao boa e sua join multiplicando todos os valores na coluna rows na saida de EXPLAIN. Isto deve dizer a grosso modo quantos registros o
430
MySQL deve examinar para executar a consulta. Este n umero e tamb em usado quando voc e restringe consultas com a vari avel max_join_size. Veja Se c ao 5.5.2 [Par ametros de servidor], P agina 455. O exemplo a seguir mostra como um JOIN pode ser otimizado progressivamente utilizando a informa c ao fornecida por EXPLAIN. Suponha que voc e tem a instru c ao SELECT exibida abaixo, que voc e est a examinando utilizando EXPLAIN: EXPLAIN SELECT tt.TicketNumber, tt.TimeIn, tt.ProjectReference, tt.EstimatedShipDate, tt.ActualShipDate, tt.ClientID, tt.ServiceCodes, tt.RepetitiveID, tt.CurrentProcess, tt.CurrentDPPerson, tt.RecordVolume, tt.DPPrinted, et.COUNTRY, et_1.COUNTRY, do.CUSTNAME FROM tt, et, et AS et_1, do WHERE tt.SubmitTime IS NULL AND tt.ActualPC = et.EMPLOYID AND tt.AssignedPC = et_1.EMPLOYID AND tt.ClientID = do.CUSTNMBR; Para este exemplo, assuma que: As colunas comparadas foram declaradas como a seguir: Tabela Coluna Tipo da coluna tt ActualPC CHAR(10) tt AssignedPC CHAR(10) tt ClientID CHAR(10) et EMPLOYID CHAR(15) do CUSTNMBR CHAR(15) As tabelas possuem os indices mostrados abaixo: Tabela Indice tt ActualPC tt AssignedPC tt ClientID et EMPLOYID (chave prim aria) do CUSTNMBR (chave prim aria) The tt.ActualPC values arent evenly distributed. Initially, before any optimizations have been performed, the EXPLAIN statement produces the following information: table type possible_keys key key_len ref rows Extra et ALL PRIMARY NULL NULL NULL 74 do ALL PRIMARY NULL NULL NULL 2135 et_1 ALL PRIMARY NULL NULL NULL 74 tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872
431
range checked for each record (key map: 35) Como o tipo e ALL em todas tabelas, esta sa ida indica que o MySQL est a gerando um produto Cartesiano de todas as tabelas! Isto levar a muito tempo para ser executado, pois o produto do n umero de registros em cada tabela deve ser examinado ! Neste caso, existem 74 * 2135 * 74 * 3872 registros. Se as tabelas forem maiores, imagine quanto tempo este tipo de consulta pode demorar. Um dos problemas aqui e que o MySQL n ao pode (ainda) utilizar indices em colunas de maneira eciente se elas foram declaras ide forma diferente. Neste contexto, VARCHAR e CHAR s ao o mesmo a menos que tenham sido declarados com tamanhos diferentes. Como tt.ActualPC e declarado como CHAR(10) e et.EMPLOYID e declarado como CHAR(15), existe aqui uma diferen ca de tamanho. Para corrigir esta diferen ca entre tamanhos de registros, utilize ALTER TABLE para alterar o tamanho de ActualPC de 10 para 15 caracteres: mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15); Agora ambos campos tt.ActualPC e et.EMPLOYID s ao VARCHAR(15). Executando a instru c ao EXPLAIN novamente produzir a este resultado: table type possible_keys key key_len ref rows Extra tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872 Using where do ALL PRIMARY NULL NULL NULL 2135 range checked for each record (key map: 1) et_1 ALL PRIMARY NULL NULL NULL 74 range checked for each record (key map: 1) et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1 Isto n ao est a perfeito, mas est a bem melhor ( o produto dos valores de rows agora menor por um fator de 74 ). Esta vers ao e executada em v arios segundos. Uma segunda altera c ao pode ser feita para eliminar as diferen cas de tamanho das colunas para as compara c oes tt.AssignedPC = et_1.EMPLOYID e tt.ClientID = do.CUSTNMBR : mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15), -> MODIFY ClientID VARCHAR(15); Agora EXPLAIN produz a sa ida mostrada abaixo: table type possible_keys key key_len ref rows Extra et ALL PRIMARY NULL NULL NULL 74 tt ref AssignedPC, ActualPC 15 et.EMPLOYID 52 Using where ClientID, ActualPC et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1 do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1 Este resultado e quase o melhor que se pode obter. O problema restante e que, por padr ao, o MySQL assume que valores na coluna tt.ActualPC est ao distribu idos igualmente, e este n ao e o caso para a tabela tt. Felizmente, e f acil informar ao MySQL sobre isto: shell> myisamchk --analyze PATH_TO_MYSQL_DATABASE/tt shell> mysqladmin refresh Agora a join est a perfeita, e EXPLAIN produz esta sa ida:
432
possible_keys key key_len ref rows Extra AssignedPC NULL NULL NULL 3872 Using where ClientID, ActualPC et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1 et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1 do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1 Perceba que a coluna rows na sa ida de EXPLAIN e uma boa ajuda para otimizador de joins do MySQL. Para otimizar uma consulta, voc e deve conferir se os n umeros est ao perto da realidade. Se n ao, voc e pode obter melhor desempenho utilizando STRAIGHT_JOIN em sua instru c ao SELECT e tentar listar as tabelas em uma ordem diferente na cl ausula FROM.
433
Para ajudar o MySQL a otimizar melhor as consultas, execute myisamchk --analyze em uma tabela depois dela ter sido carregada com dados relevantes. Isto atualiza um valor para cada parte do indice que indica o n umero m edio de registros que tem o mesmo valor. (Para indices u nicos, isto e sempre 1, e claro). O MySQL usar a isto para decidir qual indice escolher quando voc e conectar duas tabelas utilizando uma express ao n ao constante. Os resultados de analyze podem ser conferidos utilizando SHOW INDEX FROM nome_tabela e examindo a coluna Cardinality. Para ordenar um indice e dados de acordo com um indice, utilize myisamchk --sortindex --sort-records=1 (se voc e deseja ordenar pelo indice 1). Se voc e possui um indice unico no qual deseja ler todos registros na ordem do indice, esta e uma boa forma para torn a-lo mais r apido. Perceba entretanto, que esta ordena c ao n ao foi escrita de maneira otimizada e levar a muito tempo em tabelas grandes!
434
Uma tabela vazia ou uma tabela com 1 registro. Uma tabela que e usada com uma cl ausula WHERE em um indice UNIQUE, ou uma PRIMARY KEY, onde todas as partes do indice s ao usadas com express oes constantes e as partes do indice s ao denidas como NOT NULL. Todas as tabelas seguintes s ao usadas como tabelas constantes: mysql> SELECT * FROM t WHERE primary_key=1; mysql> SELECT * FROM t1,t2 -> WHERE t1.primary_key=1 AND t2.primary_key=t1.id; A melhor combina c ao de join para unir as tabelas e encontrada tentando todas as possibilidades. Se todas colunas em ORDER BY e em GROUP BY vierem da mesma tabela, ent ao esta tabela ser a preferencialmente a primeira na uni ao. Se existerem uma cl ausula ORDER BY e uma GROUP BY diferente, ou se a ORDER BY ou GROUP BY conterem colunas de tabelas diferentes da primeira tabela na la de join, uma tabela tempor aria ser a criada. Se voc e utilizar SQL_SMALL_RESULT, o MySQL usar a a tabela tempor aria em mem oria. Cada indice de tabela e consultado e o melhor indice que cobrir menos de 30% dos registros e usado. Se nenhum indice for encontrado, uma varredura r apida e feita pela tabela. Em alguns casos, o MySQL pode ler registros do indice mesmo sem consultar o arquivo de dados. Se todas colunas usadas do indice s ao num ericas, ent ao somente a arvore de indice e usada para resolver a consulta. Antes de dar sa ida em cada registro, aqueles que n ao combinam com a cl ausula HAVING s ao ignorados.
Some examples of queries that are very fast: mysql> SELECT COUNT(*) FROM tbl_name; mysql> SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name; mysql> SELECT MAX(key_part2) FROM tbl_name -> WHERE key_part_1=constant; mysql> SELECT ... FROM tbl_name -> ORDER BY key_part1,key_part2,... LIMIT 10; mysql> SELECT ... FROM tbl_name -> ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10; As seguintes consultas s ao resolvidas utilizando somente a arvore de indices (assumindo que as colunas indexadas s ao num ericas): mysql> SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val; mysql> SELECT COUNT(*) FROM tbl_name -> WHERE key_part1=val1 AND key_part2=val2; mysql> SELECT key_part2 FROM tbl_name GROUP BY key_part1; As consultas a seguir utilizam indexa c ao para recuperar os registros na ordem de classica c ao sem um passo de ordena c ao separado: mysql> SELECT ... FROM tbl_name -> ORDER BY key_part1,key_part2,... ; mysql> SELECT ... FROM tbl_name -> ORDER BY key_part1 DESC,key_part2 DESC,... ;
435
SELECT * FROM t1,t2 WHERE (t1.a=t2.a AND t2.a IS NULL AND ...) OR (t1.a=t2.a AND t2. ref_or_null funciona fazendo primeiro uma leitura na chave indicada e depois disto uma busca separada por linhas com chave NULL. Note que a otimiza c ao s o pode tratar um n ivel IS NULL. SELECT * FROM t1,t2 where (t1.a=t2.a AND t2.a IS NULL) OR (t1.b=t2.b AND t2.b IS NUL No caso acima o MySQL s o usar a busca de chave na parte (t1.a=t2.a AND t2.a IS NULL) e n ao poder a usar a parte da chave em b.
436
SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a; Neste caso, assumindo que t1 e usando antes de t2 (conra com EXPLAIN), MySQL ir a parar de ler de t2 (para aquele registro particular em t1) quandoo primeiro registro em t2 for encontrado.
437
Isto pode ser feito mais r apido j a que o MySQL pode agora usar a tabela t2 antes da tabela t1 se resultasse consulta melhor. Para for car uma ordem de tabela espec ica, use STRAIGHT JOIN. O MySQL ir a fazer uma pesquisa completa em b j a que o LEFT JOIN ir a for ca-lo a ser lido antes de d. A corre c ao neste caso e alterar a consulta para: SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
438
Armazena a chave ordenada em um buer (de tamanho sort_buffer). Quando o buer car cheio, execute ordeno-o e armazene o resultado em um arquivo temposr ario. Salve um ponteiro para o bloco ordenado. (No caso de todos os regitros caberem no buer ordenado, nenhum arquivo tempor ario e criado). Repete o armazenamento acima at e todas as linhas tenham sido lidos. Faz um multi-merge at e MERGEBUFF (7) regi oes para um bloco em outro arquivo tempor ario. Repete at e que todos os blocos do primeiro arquivo estejam no segundo arquivo. Repete o seguinte at e que restem menos que MERGEBUFF2 (15) blocos. No u ltimo multi-merge, s o o ponteiro para o registro ( ultima parte de chave ordenada) e escrito em um arquivo de resultado. Agora o c odigo em sql/records.cc ser a usado para ler atrav es deles ordenadamente usando os ponteiros de registro no arquivo resultante. Para otimiza c ao , lemos em um grande bloco de ponteiros de registros, ordena-os ent ao lemos o registros ordenadamente de de um buer de registro. (read_rnd_buffer_size) . Voc e pode vericar com EXPLAIN SELECT ... ORDER BY se o MySQL pode usar indices para resolver a consulta. Se voc e obtiver Using filesort na coluna extra, ent ao o MySQL n ao pode usar indices para resolver o ORDER BY. Veja Se c ao 5.2.1 [EXPLAIN], P agina 425. Se voc e quiser ter uma velocidade ORDER BY maior, primeiro voc e deve ver se voc e pode fazer que o MySQL use indices em vez de fazer um fase de ordena c ao extra. Se n ao for poss ivel, ent ao voc e pode fazer: Aumente o tamanho da vari avel sort_buffer_size. Aumente o temenho da vari avel read_rnd_buffer_size. Altere tmpdir para apontar para um disco dedicado com muito espa co vazio. Se voc e usa o MySQL 4.1 ou posterior voc e pode distribuir a carga entre diversos discos fisicos denindo tmpdir com uma lista de caminhos separados por dois pontos : (ponto e v irgula ; no Windows). Eles ser ao usados de acordo com o m etodo round-robin. Nota: Estes caminho devem estar em diferentes discos f isicos, e n ao em diferentes parti c oes do mesmo disco. Por padr ao, o MySQL ordena todas as consultas GROUP BY x,y[,...] como se voc e tivesse especicado ORDER BY x,y[,...]. Se voc e incluir a cl ausula ORDER BY explicitamente, o MySQL a otimizar a sem qualquer penalidade na velocidade, embora a ordenacao ainda ocorra. Se a consulta inclui um GROUP BY mas voc e deseja evitar a sobrecarga da ordenar o resultado, voc e pode suprimir a ordenacao especicando ORDER BY NULL: INSERT INTO foo SELECT a,COUNT(*) FROM bar GROUP BY a ORDER BY NULL;
439
Se voc e utilizar LIMIT row_count com ORDER BY, O MySQL ir a terminar a ordena c ao logo que ele encontrar os primeiros row_count registros em vez de ordenar a tabela inteira. Ao combinar LIMIT row_count com DISTINCT, o MySQL ir a parar logo que ele encontrar row_count registros u nicos. Em alguns casos um GROUP BY pode ser resolvido lendo a chave em ordem (ou fazer uma classica c ao na chave) e ent ao calcular resumos at e o valor da chave alterar. Neste caso, LIMIT row_count n ao ir a calcular nenhum GROUP BY desnecess ario. Logo que o MySQL enviar os primeiros # registros para o cliente, ele ir a abortar a consulta. LIMIT 0 ir a sempre retornar rapidamente um conjunto vazio. Isto e util para conferir a consulta e obter os tipos de campos do resultado. Quando o servidor utiliza tabelas tempor arias para resolver a consulta, o LIMIT row_ count e usado para calcular a quantidade de espa co necess ario.
440
poss E ivel com algum trabalho extra fazer o LOAD DATA INFILE executar ainda mais r apido quando a tabela tiver v arios indices. Utilize o seguinte procedimento: 1. Opcionalmente crie a tabela com CREATE TABLE. Por exemplo, utilizando mysql ou Perl-DBI. 2. Execute a instru c ao FLUSH TABLES ou o comando shell mysqladmin flush-tables. 3. Utilize myisamchk --keys-used=0 -rq /path/to/db/nome_tabela. Isto remover a o uso de todos os indices da tabela. 4. Insira dados na tabela com LOAD DATA INFILE. Isto n ao atualizar a indices e ser a muito mais r apido. 5. Se no futuro voc e precisar da tabela somente para leitura, execute myisampack na mesma para torn a-la menor. Veja Se c ao 7.1.2.3 [Formato compactado], P agina 634. 6. Recrie os indices com myisamchk -r -q /caminho/para/bd/nome_tabela. Isto criar a a arvore de indices em mem oria antes de escrev e-la para o disco, que e muito mais r apido porque evita que seja feita muita busca disco. A arvore de indices resultante e tamb em balanceada perfeitamente. 7. Execute uma instru c ao FLUSH TABLES ou o comando shell mysqladmin flushtables. Note que LOAD DATA INFILE tamb e faz a otimiza c ao acima se voc e a inser c ao for em uma tabela vazia; a principal diferen ca com o procedimento acima e qeu voc e pode deixar o myisamchk alocar muita mais mem oria tempor aria para a cria c ao do indice que voc e deseje que o MySQL alocasse para todas as recria c oes de indice. Desde o MySQL 4.0 voc e tamb em pode usar ALTER TABLE nome_tbl DISABLE KEYS em vez de myisamchk --keys-used=0 -rq /caminho/para/bd/nome_tbl e ALTER TABLE nome_tbl ENABLE KEYS em vez de myisamchk -r -q /caminho/para/bd/nome_tbl. Deste modo voc e tamb em pode saltar os passos FLUSH TABLES. Voc e pode acelerar inser c oes feitas usando v arias instru c oes bloqueando suas tabelas: LOCK TABLES a WRITE; INSERT INTO a VALUES (1,23),(2,34),(4,33); INSERT INTO a VALUES (8,26),(6,29); UNLOCK TABLES; A principal diferen ca na velocidade e que o buer de indices e descarregado no disco somente uma vez, depois de todas instru c oes INSERT term sido completadas. Normalmente existiria tantas descargas do buer de indices quanto instru c oes INSERT diferentes. O bloqueio n ao e necess ario se voc e pode inserir todos registros com uma simples instru c ao. Para tabelas transacionais, voc e deve usar BEGIN/COMMIT em vez de LOCK TABLES para conseguir um aumento na velocidade. O bloqueio ir a tamb em diminuir o tempo total de testes de multi-conex oes, mas o tempo m aximo de espera para algumas threads ir a aumentar (porque eles esperam pelos bloqueios). Por exemplo: thread 1 faz 1000 inser c~ oes thread 2, 3 e 4 faz 1 inser c~ ao thread 5 faz 1000 inser c~ oes mysql> mysql> mysql> mysql>
441
Se voc e n ao estiver usando travas, 2, 3 e 4 ir ao terminar antes de 1 e 5, Se estiver utilizando travas, 2, 3 e 4 provavelmente n ao ir ao terminar antes de 1 ou 5, mas o tempo total deve ser cerca de 40% mais r apido. Como as opera c oes INSERT, UPDATE e DELETE s ao muito r apidas no MySQL, voc e obter a melhor perfomance geral adicionando travas em tudo que zer mais que cerca de 5 inser c oes ou atualiza c oes em um registro. Se voc e zer v arias inser c oes em um registro, voc e pode utilizar LOCK TABLES seguido de um UNLOCK TABLES de vez em quando (em torno de 1000 registro) para permitr que outras threads acessem a tabela. Isto tamb em continua mostrando um bom ganho de performance. Com certeza, LOAD DATA INFILE e muito mais r apido para carregar dados. Para obter mais velocidade para LOAD DATA INFILE e INSERT, aumente o tamanho do buer de chaves. Veja Se c ao 5.5.2 [Par ametros de servidor], P agina 455.
442
Tente evitar consultas SELECT complexas em tabelas que s ao muito atualizadas. Isto evita problemas com travamento de tabelas. Com tabelas MyISAM que n ao tenham linhas deletadas, voc e pode inserir registros ao mesmo tempo que outra tabela a estiver lendo. Se este recurso e importante para voc e, deve considerar m etodos onde voc e n ao tem que apagar registrou ou executar OPTIMIZE TABLE depois de ter apagado v arios registros. Utilize ALTER TABLE ... ORDER BY expr1,expr2... se voc e na maioria das vezes recupera registros na ordem expr1,expr2... Utilizando esta op c ao depois de grandes altera c oes para a tabela, pode lhe dar um ganho de performance. Em alguns casos pode fazer sentido introduzir uma coluna hash baseada nas informa c oes das outras colunas. Se esta coluna for curta e razoavelmente u nica pode ser muito mais r apido do que ter um grande indice em v arias colunas. No MySQL e muito f acil usar esta coluna extra: SELECT * FROM nome_tabela WHERE hash=MD5(concat(col1,col2)) AND col_1=constante AND col_2=constante Para tabelas que alteram muito voc e deve tentar evitar todas colunas VARCHAR ou BLOB. Voc e ter a tamanho de registro din amico assim que usar um simples campo VARCHAR ou BLOB. Veja Cap ptexi tulo 7 [Tipos de tabelas], P agina 629. Normalmente n ao e muito u til cortar uma tabela em diferentes tabelas apenas porque os registros est ao grandes. Para acessar um registro, o maior problema para a performance e a busca em disco para encontra o primeiro byte do registro. Depois de encontrar os dados a maioria dos novos discos podem ler o registro inteiro r apido o bastante para a maioria das aplica c oes. Os u nicos caos onde realmente faz sentido dividir uma tabela e se ela e uma tabela de registros com tamanho din amico (veja acima) que voc e pode alterar para um tamanho xo, ou se voc e frequentemente precisa examinar a tabela e n ao precisa da maioria das colunas. Veja Cap ptexi tulo 7 [Tipos de tabela], P agina 629. Se frequentemente voc e precisar calcular alguma coisa baseada em informa c ao de v arios registros (ex: contagem de registros), provavlmente e melhor introduzir uma nova tabela e atualizar o contador em tempo real. Uma atualiza c ao do tipo UPDATE table set count=count+1 where index_column=constante e muito rapida! Isto e realmente importante quando voc e usa bancos de dados como o MySQL que s o tem travamento de tabelas (multiplos leituras/escrita u nica). Isto tamb em dar a melhor performance com a maioria dos banco de dados, j a que o gerenciador de bloqueio de registro ter a menos a fazer neste caso. Se voc e precisar colerar estatisicas de tabelas maiores, utilize tabelas resumo em vez de buscar em toda a tabela. Manter os resumos deve ser mais r apido que tentar criar muito mais r estatit iscas instantaneamente. E apido criar novas tabelas atrav es dos logs quando as coisas mudam (dependendo das descis oes de neg ocio) que ter que alterar a aplica c ao em execu c ao. Se possivel, deve-se classicar relat orios como instant aneo ou estat isticos onde os dados necess arios para relat orios estaiisticos s ao gerados apenas com base nas tabelas resumo que s ao geradas a partir dos dados atuais. Tire vantagem do fato de que a coluna tem valores padr oes. Insira valores explicitamente apenas quando os valores a serem inseridos diferem do padr ao. Isto reduz a analise que o MySQL precisa fazer e aumenta a velocidade de inser c ao.
443
Em alguns casos e conveniente empacotar e armazenar os dados em um campo blob. Neste caso voc e deve adicionar algum c odigo em sua aplica c ao para empacotar/desempacotar as coisas no campo blob, mas isto pode poupar v arios acessos a algum est agio. Isto e pr atico quando voc e possui dados que n ao conformam com uma estrutura est atica de tabela. Normalmente, voc e deve tentar manter todos dados n ao-redundantes (o que e chamado de 3a forma normal na teoria de bancos de dados), mas voc e n ao deve ter medo de duplicar alguns itens ou criar tabelas de resumo se voc e precisar delas para ganhar mais velocidade. Stored Procedures ou UDF (fun c oes denidas pelo usu arios) pode ser uma boa forma para obter mais performance. Neste caso voc e deve, entretanto, sempre ter uma maneira de fazer isso de outra maneira (mais lenta) se voc e utilizar algum banco de dados que n ao suporta isto. Voc e sempr pode ganhar velocidade fazendo cache de perguntas/respostas na sua aplica c ao e tentando fazer v arias inser c oes/atualiza c oes ao mesmo tempo. Se seu banco de dados suporta travamento de tabelas (como o MySQL e Oracle), isto deve ajudar a garantir que o cache de indices e descarregado somente uma vez depois de todas atualiza c oes. Use INSERT /*! DELAYED */ quando n ao precisar saber quando os dados s ao gravados. Isto melhora a velocidade porque v arios registros podem ser gravados com uma simples escrita em disco. Use INSERT /*! LOW_PRIORITY */ quando voc e desejar que suas consultas sejam mais importantes. Use SELECT /*! HIGH_PRIORITY */ para obter consultas que ignoram a la. Isto e, a consulta e feita mesmo se alguem estiver esperando para fazer uma escrita. Use a instru c ao INSERT multi-linhas para armazenar v arios registros com um comando SQL (v arios servidores SQL suportam isto). Use LOAD DATA INFILE para carregar volumes maiores de dados. Isto e mais r apido que as inser c oes normais e mais r apido at e quando o myisamchk for integrado no mysqld. Use colunas AUTO_INCREMENT para garantir valores u nicos. Use OPTIMIZE TABLE de vez em quando para evitar fragmenta c ao quando estiver usando formatos de tabela din amica. Veja Se c ao 4.6.1 [OPTIMIZE TABLE], P agina 299. Use tabelas HEAP para obter mais velocidade sempre que poss ivel. Veja Cap ptexi tulo 7 [Tipos de tabelas], P agina 629. Quando estiver usando uma congura c ao de servidor Web normal, imagens devem ser armazenadas como arquivos. Isto e, armazene apenas uma refer encia para o arquivo no banco de dados. A principal raz ao para isto e que um servidor Web normal e muito melhor trabalhando com cache de arquivos do que com conte udo de banco de dados. Portanto ser a muito mais f acil obter um sistema r apido se voc e utilizar arquivos. Use tabelas em mem oria para dados n ao-criticos que s ao acessados frequentemente (como informa c oes sobre o u ltimo banner visto para usu arios que n ao possuem cookies). Colunas com informa c oes identicas em diferentes tabelas devem ser declaradas id enticas e ter nomes id enticos. No entanto, antes da vers ao 3.23, voc e pode obter liga c oes mais lentas.
444
Tente manter os nomes mais simples (use nome em vez de nome_cliente na tabela cliente). Para deixar seus nomes port aveis para outros servidores SQL voc e deve mant elos menores que 18 caracteres. Se voc e realmente precisa de alta velocidade, voc e deve vericar as interfaces de baixo n ivel para armazenagem de dados que os diferentes servidores SQL suportam! Por exemplo, para acessar tabelas MySQL MyISAM diretamente, voc e pode obter um aumento de velocidade de 2-5 vezes comparado ao uso da interface SQL. Para conseguir essa fa canha, os dados devem estar no mesmo servidor que sua aplica c ao, e normalmente devem ser acessados por apenas um processo (porque travamento de arquivos externo s ao muito lentos). Os problemas acima podem ser eliminados introduzindo comandos MyISAM de baixo n ivel no servidor MySQL (isto pode ser a maneira mais f acil para aumentar a performance). Tenha cuidado em projetar a interface com o banco de dados, ela deve ser bem facil para suportar estes tipos de otimiza c oes. Em v arios casos e mais r apido acessar dados de um banco de dados (utilizando uma conex ao ativa) do que acessar um arquivo texto, apenas pelo fato do banco de dados ser mais compacto do que o arquivo texto (se voc e estiver utilizando dados num ericos), e isto ir a envolver menos acessos ` a disco. Voc e tamb em ir a poupar c odigo porque n ao ser a necess ario analisar seus arquivos texto para encontrar limites de registros e campos. Voc e pode tamb em usar replica c ao para conseguir ainda mais performance nas suas aplica c oes. Veja Se c ao 4.11 [Replica c ao], P agina 379. Declarando uma tabela com DELAY_KEY_WRITE=1 ir a tornar a atualiza c ao de indices mais r apida, pois as mesmas n ao ser ao escritas em disco at e o arquivo ser fechado. O lado ruim e que voc e deve executar myisamchk nestas tabelas antes de iniciar o mysqld para garantir que os dados est ao corretos se o mysqld for nalizado no meio da execu c ao. Como a informa c ao de chave pode sempre ser gerada a partir dos dados, voc e n ao deve perder nada usando DELAY_KEY_WRITE.
445
O m etodo de bloqueio que o MySQL utilizado para LEITURA funciona da seguinte maneira: Se n ao existirem tarvas na tabela, coloca um bloqueio de leitura na mesma. Caso contr ario, coloca a requisi c ao de trava na la de bloqueios para leitura. Quando um bloqueio e liberado, a trava ca dispon ivel para as threads na la de bloqueios de escrita, e ent ao para as threads na la de bloqueios de leitura. Isto signica que se voc e possui v arias atualiza c oes em uma tabela, instru c oes SELECT ir ao esperar at e que n ao existam mais atualiza c oes. Para contornar este problema no caso onde voc e precisa fazer v arias opera c oes de INSERT e SELECT em uma tabela, voc e pode inserir registros em uma tabela tempor aria e atualizar a tabela real com os registros da tabela tempor aria de uma s o vez. Isto pode ser feito usando o c odigo a seguir: mysql> mysql> mysql> mysql> LOCK TABLES real_table WRITE, insert_table WRITE; INSERT INTO real_table SELECT * FROM insert_table; TRUNCATE TABLE insert_table; UNLOCK TABLES;
Voc e pode utilizar as op c oes LOW_PRIORITY com INSERT, UPDATE ou DELETE ou HIGH_ PRIORITY com SELECT se voc e desejar priorizar a recupera c ao em alguns casos espec icos. Tamb em podei-se iniciar o mysqld com --low-priority-updates para obter o mesmo comportamento. Utilizar SQL_BUFFER_RESULT pode tamb em tornar a cria c ao de locks de tabelas mais curtos.Veja Se c ao 6.4.1 [SELECT], P agina 562. Voc e tamb em pode alterar o c odigo de bloqueioss no mysys/thr_lock.c para usar uma la simples. Neste caso, bloqueios de escrita e leitura devem ter a mesma prioridade, o que pode ajudar em algumas aplica c oes.
446
exclusivo. Durante a atualiza c ao, todas outras threads que desejarem acessar esta tabela em particular ir ao esperar at e que a atualiza c ao acabe. Como atualiza c oes em tabelas normalmente s ao consideradas mais importantes que SELECT, todas as instru c oes que atualizam uma tabela tem maior prioridade que instru c oes que simplesmente recuperam informa c oes. Isto deve garantir que atualiza c oes n ao quem na la por terem sido passadas v arias consultas pesadas em uma tabela espec ica. (Voc e c ao que faz a atualiza c ao ou pode alterar isto utilizando LOW PRIORITY com a instru HIGH_PRIORITY com a instru c ao SELECT.) A partir do MySQL vers ao 3.23.7 pode-se utilizadar a vari avel max_write_lock_count para for car o MySQL a fornecer temporariamente a todas as instru c oes SELECT, que esperam por uma tabela, uma prioridade mais alta depois de um n umero espec ico de inser c oes em uma tabela. O bloqueio de tabela n ao e, no entanto, muito bom sobre os seguintes cen arios: Um cliente emite uma SELECT que exige muito tempo para ser executada. Outro cliente ent ao executa um UPDATE na tabela usada. Este cliente ter a que esperar at e que a SELECT seja terminada. Outro cliente executa outra instru c ao SELECT na mesma tabela. Como UPDATE tem maior prioridade que SELECT, esta SELECT ir a esperar pelo t ermino da UPDATE. Ela tamb em ir a esperar pelo t ermino da primeira SELECT! Uma thread est a esperando por algo do tipo disco cheio, caso em que todas as threads que desejam acessar a tabela com problema ir ao ser colocadas em estado de espera at e que mais espa co em disco seja dispon ivel. Algumas solu c oes poss iveis para este problema s ao: Tente deixar suas instru c oes SELECT sempre r apidas. Voc e pode ter que criar algumas tabelas de resumo para fazer isto. Inicie o mysqld com --low-priority-updates. Isto ir a fornecer a todas instru c oes que atualizam (modicam) uma tabela prioridade menor que uma instru c ao SELECT. Neste caso a u ltima instru c ao SELECT no cen ario anterior deveria executar antes da instru c ao INSERT. Voc e pode fornecer a uma instru c ao INSERT, UPDATE ou DELETE espec ica menor prioridade com o atributo LOW_PRIORITY. Inicie o mysqld com um valor baixo para max write lock count para fornecer bloqueios de LEITURA depois de um certo n umero de bloqueios de ESCRITA. Voc e pode especicar que todas as atualiza c oes de uma thread espec ica deve ser feita utilizando prioridade baixa com o comando SQL: SET SQL_LOW_PRIORITY_UPDATES=1. Veja Se c ao 5.5.6 [SET OPTION], P agina 461. Voc e pode especicar que uma SELECT espec ica e muito importante com o atributo HIGH_PRIORITY. Veja Se c ao 6.4.1 [SELECT], P agina 562. Se voc e tiver problemas com INSERT combinado com SELECT, utilize as novas tabelas MyISAM, pois elas suportam SELECTs e INSERTs concorrentes. Se voc e utiliza principalmente instru c oes INSERT e SELECT misturadas, o atributo DELAYED no INSERT provavelmente ir a resolver seus problemas. Veja Se c ao 6.4.3 [INSERT], P agina 578.
447
Se voc e tiver problemas com SELECT e DELETE, a op c ao LIMIT para DELETE pode ajudar. Veja Se c ao 6.4.5 [DELETE], P agina 584.
448
Utilize tipos inteiros menores se poss ivel para obter tabelas menores. Por exemplo, MEDIUMINT normalmente e melhor que INT. Declare colunas para serem NOT NULL se poss ivel. Isto deixa tudo mais r apido e voc e economiza um bit por coluna. Perceba que se voc e realmente precisa de NULL nas suas aplica c oes, podem ser usados. Tente simplesmente n ao us a-la em todas as colunas por padr ao. Se voc e n ao possui nenhuma coluna de tamanho vari avel (VARCHAR, TEXT ou BLOB), um formato de registro de tamanho xo para e utilizado. Isto e mais r apido mas infelizmente pode ocupar mais espa co. Veja Se c ao 7.1.2 [Formatos de tabelas MyISAM], P agina 633. O indice prim ario de uma tabela deve ser o mais curto poss ivel. Isto torna a identica c ao de um registro f acil e eciente. Para cada tabela, voc e deve decidir qual met odo de armazenamento/ indice utilizar. Veja Cap ptexi tulo 7 [Tipos de tabelas], P agina 629. Crie somente os indices necess arios. Indices s ao bons para recupera c ao mas ruins quando voc e precisa armazenar os dados rapidamente. Se na maioria das vezes voc e acessa uma tabela pesquisando em uma combina c ao de colunas, crie um indice para elas. A primeira parte do indice deve ser a coluna mais utilizada. Se voc e SEMPRE utiliza v arias colunas, deve usar a coluna com mais duplica c oes em primeiro lugar para obter melhor compacta c ao do indice. Se for melhor que uma coluna tenha um prexo u nico nos primeiros caracteres, e melhor indexar somente este prexo. O MySQL suporta um indice em uma parte de uma coluna de caracteres. Indices menores s ao mais r apidos n ao somente porque eles exigem menos espa co em disco mas tamb em porque eles ir ao fornecer a voc e mais acerto no cache de indice e isto diminui acessos a disco. Veja Se c ao 5.5.2 [Par ametros de servidor], P agina 455. Em algumas circunst ancias pode ser ben eco dividir uma tabela que e varrida frequentemente em duas. Isto e verdade especicamente se a tabela tiver um formato din amico e for poss ivel utilizar um formato de tabela est atico que possa ser usada para encontrar os registros relevantes quando se zer uma varredura da tabela.
449
Indices s ao utilizados nos seguintes modos: Para encontrar rapidamente os registros que coincidam com uma cl ausula WHERE. Para recuperar registros de outras tabelas ao realizar joins. Para encontrar o valor MAX() ou MIN() para uma coluna indexada espeica. Isto e otimizado por um preprocessador que confere se voc e est a utilizando WHERE key part #=constante em todas as partes da chave < N. Neste caso o MySQL ir a fazer uma simples procura na chave e trocar a express ao MIN() com uma constante. Se todas as express oes forem trocadas por constantes, a consulta retornar a imediatamente: SELECT MIN(key_part2),MAX(key_part2) FROM nome_tabela where key_part1=10 Para ordenar ou agrupar uma tabela se a ordena c ao ou agrupamento for feito em um prexo mais ` a esquerda de uma chave util (por exemplo, ORDER BY key_part_1, key_ part_2 ). A chave e lida na ordem invertida se todas as partes da chave forem seguidas por DESC. Veja Se c ao 5.2.8 [Otimiza c ao ORDER BY], P agina 437. Em alguns casos uma consulta pode ser otimizada para recuperar valores sem consultar o arquivo de dados. Se todas colunas utilizadas para alguma tabela s ao num ericas e formam um prexo mais ` a esquerda para alguma chave, os valores podem ser recuperados da arvore de indices para aumentar a velocidade: SELECT key_part3 FROM nome_tabela WHERE key_part1=1 Suponha que voc e utilize a seguinte instru c ao SELECT: mysql> SELECT * FROM nome_tabela WHERE col1=val1 AND col2=val2; Se um indice de colunas m ultiplas existir em col1 e col2, os registros apropriados podem ser recuperados diretamente. Se indices separados de u nicas colunas existirem em col1 e col2, o otimizador tentar a encontrar o indice mais restritivo decidindo qual indice ir a encontrar menos registros e usar a este indice para recuperar os registros. Se a tabela possuir um indice de m ultiplas colunas, qualquer prexo mais ` a esquerda do indice pode ser usado pelo otimizador para encontrar registros. Por exemplo, se voc e possui um indice de tr es colunas em (col1, col2, col3), voc e tem capacidades de busca indexada em (col1), (col1, col2) e (col1, col2, col3). O MySQL n ao pode utilizar um indice parcial se as colunas n ao formarem um prexo mais ` a esquerda do indice. Suponha que voc e tenha as instru c oes SELECT mostradas abaixo: mysql> SELECT * FROM nome_tabela WHERE col1=val1; mysql> SELECT * FROM nome_tabela WHERE col2=val2; mysql> SELECT * FROM nome_tabela WHERE col2=val2 AND col3=val3; Se um indice existir em (col1, col2, col3), somente a primeira consulta anteriores utiliza o indice. A segunda e terceira consultas involvem colunas indexadas, mas (col2) e (col2, col3) n ao s ao os prexos mais ` a esquerda de (col1, col2, col3). O MySQL tamb em utiliza indices para compara c oes do tipo LIKE se o argumento para LIKE for uma string constante que n ao inicie com um meta caracter Por exemplo as seguintes instru c oes SELECT utilizam indices: mysql> SELECT * FROM nome_tbl WHERE key_col LIKE "Patrick%"; mysql> SELECT * FROM nome_tbl WHERE key_col LIKE "Pat%_ck%";
450
Na primeira instru c ao, somente os registros com "Patrick" <= key_col < "Patricl" s ao considerados. Na segunda instru c ao, somente registros com "Pat" <= key_col < "Pau" s ao considerados. As seguintes instru c oes SELECT n ao usar ao indices: mysql> SELECT * FROM nome_tbl WHERE key_col LIKE "%Patrick%"; mysql> SELECT * FROM nome_tbl WHERE key_col LIKE other_col; Na primeira instru c ao, o valor LIKE inicia com um meta caracter. Na segunda instru c ao, o valor LIKE n ao e uma constante. O MySQL 4.0 faz outra otimiza c ao em LIKE. Se voc e usar ... LIKE "%string%" e string tiver mais de 3 caracteres, o MySQL usar a o algor itmo Turbo Boyer-Moore para inicializar o padr ao para a string e ent ao usar este padr ao para realizar a pesquisa mais r apido. Buscas usando nome_coluna IS NULL usa indices se nome_coluna e um indice. O MySQL normalmente utiliza o indice que encontra o menor n umero de registros. Um indice e usado para colunas que voc e compara com os seguintes operadores: =, >, >=, <, <=, BETWEEN ou um LIKE com um padr ao que come ca com um prexo sem meta caracteres como algo%. Qualquer indice que n ao cobrem todos os n iveis de AND na cl ausula WHERE n ao e utilizado para otimizar a consulta. Em outras palavras: Para poder usar um indice, um prexo do indice deve ser utilizado em todo agrupamento AND. A seguinte cl ausula WHERE utilizar a indices: ... WHERE index_part1=1 AND index_part2=2 AND other_column=3 ... WHERE index=1 OR A=10 AND index=2 /* index = 1 OR index = 2 */ ... WHERE index_part1=hello AND index_part_3=5 /* optimised like "index_part1=hello" */ ... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3; /* Can use index on index1 but not on index2 or index 3 */ Estas cl ausulas WHERE n ao utilizam indices: /* index_part_1 is not used */ /* Index is not used in both AND parts */ ... WHERE index_part1=1 OR index_part2=10 /* No index spans all rows */ Perceba que algumas vezes o MySQL n ao utilizar a um indice, mesmo se algum estiver dispon ivel. Um exemplo deste caso e quando o uso do indice necessita que o MySQL acesse mais de 30% dos registros na tabela. (Neste caso uma varredura da tabela e provavelmente mais r apido, j a que ela necessitar a de menos pesquisas em discos). No entanto, se uma consulta utiliza LIMIT para recuperar somente parte dos registros, o MySQL ir a utilizar um indice de qualquer forma, pois assim pode encontrar os poucos registros mais rapidamente e retornar o resultado. ... WHERE index_part2=1 AND index_part3=2 ... WHERE index=1 OR A=10
451
O n umero m aximo de indices por tabelas e o tamanho m aximo de um indice e denido pelo mecanismo de armazenamento. Veja Capptexi tulo 7 [Table types], P agina 629. Todos os mecanismos de armazenamentos suportam um m inimo de 16 chaves por tabela e um indice de tamanho total m inimo de 256 bytes. Para colunas CHAR e VARCHAR voc e pode indexar um prexo da coluna. Isto e muito mais r apido e necessita de menos espa co em disco do que indexar a coluna inteira. A sintaxe para utilizar na instru c ao CREATE TABLE para indexar um prexo de uma coluna se parece com o exemplo a seguir: INDEX nome_indice (nome_campo(tamanho)) O exemplo abaixo cria um indice para os primeiros 10 caracteres da coluna nome: mysql> CREATE TABLE teste ( nome CHAR(200) NOT NULL, INDEX nome_indice (nome(10))); Para colunas BLOB e TEXT, voc e deve indexar um prexo da coluna. O indice pode ter at e 255 bytes. No MySQL Vers ao 3.23.23 ou posterior, voc e pode tamb em criar indices FULLTEXT especiais. Eles s ao utilizados para pesquisas textuais. Somente o tipo de tabela MyISAM suporta indices FULLTEXT e apenas para colunas CHAR, VARCHAR e TEXT. Indexa c ao sempre acontece sobre toda a coluna e indexa c ao parcial (prexo) n ao e suportada. Veja Se c ao 6.8 [Fulltext Search], P agina 618 para detalhes.
452
mysql> SELECT * FROM teste WHERE ultimo_nome="Widenius" AND primeiro_nome="Michael"; mysql> SELECT * FROM teste WHERE ultimo_nome="Widenius" AND (primeiro_nome="Michael" OR primeiro_nome="Monty"); mysql> SELECT * FROM teste WHERE ultimo_nome="Widenius" AND primeiro_nome >="M" AND primeiro_nome < "N"; Entretanto, o indice nome n ao ser a usado nas seguintes consultas: mysql> SELECT * FROM teste WHERE primeiro_nome="Michael"; mysql> SELECT * FROM teste WHERE ultimo_nome="Widenius" OR primeiro_nome="Michael"; Para maiores informa c oes sobre a maneira que o MySQL utiliza indices para melhorar o desempenho das consultas, veja Se c ao 5.4.3 [ indices do MySQL], P agina 448.
453
Esteja certo de que o seu sistema operacional pode tratar o n umero de descritores de arquivos abertos denido pelo valor de table_cache. Se table_cache for muito alto, o MySQL pode esgotar os descritores de arquivo e recusar conex oes, falhar na execu c ao de consultas e ser muito instavel. Voc e tamb em t em que levar em conta que o mecanismo de armazenamento MyISAM precisa de dois descritores de arquivos para cada tabela aberta. Voc e pode aumentar o n umero de descritores de arquivo dispon iveis para o MySQL com a op c ao de inicializa c ao --open-files-limit=#. Veja Se c ao A.2.17 [Tratamento de arquivos insucientes], P agina 917. A cache de tabelas abertas ser a mantido em um n ivel de table_cache entradas. O valor padr ao e 64; isto pode ser alterado com a op c ao -O table_cache=# do mysqld. Note que o MySQL pode temporariamente abrir mais tabelas para poder se executar consultas. Um tabela n ao usada e fechada e removida da cache de tabelas sob as seguintes circunt ancias: Quando a cache est a cheia e um thread tenta abrir uma tabela que n ao est a na cache. Quando a cache cont em mais que table_cache entradas e uma thread n ao est a mais usando uma tabela. Quando algu em executa mysqladmin refresh ou mysqladmin flush-tables. Quando algu em executa uma instru c ao FLUSH TABLES. Quando o cache de tabela encher, o servidor usa o seguinte procedimento para encontrar uma entrada de cache para usar: Tabelas que n ao estiverem em uso s ao liberadas, na ordem LRU (least-recently-used), ou seja, a tabela que foi usada menos rcentemente. Se o cache estiver cheio e nenhuma tabelas pode ser liberada, mas uma nova tabela precisar ser aberta, o cache e extendido temporariamente quando necess ario. Se o cache estiver no estado temporariamente extendido e uma tabela vai do estado em-uso para o fora-de-uso, a tabela e fechada e liberada do cache. A table is opened for each concurrent access. This means the table needs to be opened twice if two threads access the same table or if a thread accesses the table twice in the same query (for example, by joining the table to itself). Uma tabela e aberta para cada acesso simult aneo. Isto signica a tabela precisa ser aberta duas vezes se duas threads acessam a mesma tabela ou se uma thread acessa a tabela duas vezes na mesma consulta (por exemplo, fazendo um join da tabela com ela mesma). A primeira abertura de qualquer tabela exige dois descritores de arquivos; cada uso adicional da tabela exige somente um descritor. O descritor extra para a primeira abertura e para o arquivo de indice: este descritor e compartilhado entre todas as threads. Se voc e est a abrindo uma tabela com a instru c ao HANDLER nome_tabela OPEN, uma tabela dedicada e alocada para a thread. Este objeto da tabela n ao e compartilhado por outras threads e n ao ser a fechado at e que a thread chame HANDLER nome_tabela CLOSE ou seja nalizada. Veja Se c ao 6.4.9 [HANDLER], P agina 595. Quando isto acontece, a tabela e colocada de volta na cache de tabela (se a cache n ao estiver cheia). Voc e pode conferir se o seu cache de tabela est a muito pequeno conferindo a vari avel opened_ tables do mysqld. Se este valor for muito grande, mesmo se voc e n ao fez v arios FLUSH TABLES, voc e deve aumentar o tamanho da sua cache de tabelas. Veja Se c ao 4.6.8.3 [Opened_ tables], P agina 306.
454
455
456
mysql> SHOW VARIABLES; Voc e tamb em pode ver algumas estat isticas e indicadores de status para um servidor em execu c ao executando este comando: mysql> SHOW STATUS; Para encontrar uma descri c ao completa de todas as vari aveis na se c ao SHOW VARIABLES neste manual. Veja Se c ao 4.6.8.4 [SHOW VARIABLES], P agina 310. Para informa c ao sobre vari aveis de estado, veja Se c ao 4.6.8.3 [SHOW STATUS], P agina 306. Vari aveis de servidor e informa c ao de status tamb em pode ser obtido usando mysqladmin: shell> mysqladmin variables shell> mysqladmin extended-status O MySQL utiliza algor itmos que s ao muito escal aveis, portanto, normalmente voc e pode trabalhar com pouca mem oria. Entretanto, se voc e fornecer ao MySQL mais mem oria, obter a um desempenho melhor. Quando estiver ajustando um servidor MySQL, as duas vari aveis mais importantes que devem ser usadas s ao key_buffer_size e table_cache. Voc e deve se sentir conante que as duas estejam corretas antes de tentar alterar qualquer outra vari avel. Os seguintes exemplos indicam alguns valores t ipicos de vari aveis para diferentes congura c oes de tempo de execu c ao. Os exemplos usam o script mysqld_safe e usam a sintaxe --name=value para denir a vari avel name com o valor value. Esta sintaxe est a dispon ivel a partir do MySQL 4.0. Para vers oes mais antigas do MySQL, tome as seguintes diferen cas nas contas: Use safe_mysqld em vez de mysqld_safe. Congure as vari aveis usando a sintaxe --set-variable=name=value ou -O name=value Para nomes de vari aveis que nalizam em _size, voc e pode precisar especic a-las sem _size. Por exemplo, o nome antigo para sort_buffer_size e sort_buffer. O nome antigo para read_buffer_size e record-buffer. Para ver quais vari aveis a vers ao do seu servidor reconhece, use mysqld --help. Se voc e possui miuita mem oria (pelo menos 256M) e v arias tabelas e deseja obter o melhor desempenho com um n umero moderado de clientes, deve utilizar algo como: shell> mysqld_safe --key_buffer_size=64M --table_cache=256 \ --sort_buffer_size=4M --read_buffer_size=1M & Se possui apenas 128M de mem oria e apenas algumas poucas tabelas, mas ainda deseja realizar v arias ordena c oes, voc e pode utilizar: shell> mysqld_safe --key_buffer_size=16M --sort_buffer_size=1M Se voc e possuir pouca mem oria e tiver muitas conex oes, utilize algo como: shell> mysqld_safe --key_buffer_size=512K --sort_buffer_size=100K \ --read_buffer_size=100K & ou mesmo isto: shell> mysqld_safe --key_buffer_size=512K --sort_buffer_size=16K \ --table_cache=32 --read_buffer_size=8K -O net_buffer_length=1K &
457
Se voc e estiver executando um GROUP BY ou ORDER BY em tabelas que s ao muito maiores que sua mem oria dispon ivel voc e deve aumentar o valor de record_rnd_buffer_size para acelerar a leitura de registros ap os a opera c ao de ordena c ao. Quando voc e tiver instalado o MySQL, o diret orio support-files ir a conter alguns arquivos exemplos do my.cnf, my-huge.cnf, my-large.cnf, my-medium.cnf e my-small.cnf, voc e pode us a-los como base para otimizar seu sistema. Se voc e possui v arias conex oes simult aneas, problemas de trocas podem ocorrer a menos que o mysqld tenha sido congurado para usar muito pouca mem oria para cada conex ao. O mysqld tem melhor performance se voc e tiver mem oria suciente para todas as conex oes, e claro. Perceba que se voc e especica uma op c ao na linha de comando para o mysqld, ou mysqld_ safe ele permanece em efeito somente para aquela chamada do servidor. Para usar a op c ao toda vez que o servidor executa, coloque-o em um arquivo de op c ao. Para ver os efeitos de uma altera c ao de par ametro, fa ca algo como: shell> mysqld --key_buffer_size=32m --help Tenha certeza que a op c ao --help seja a u ltima do comando; de outra forma o efeito de qualquer op c oes listadas depois na linha de comando n ao ser ao reetidas na sa ida.
458
Se voc e liga dinamicamente (sem -static), o resultado e 13% mais lento no Linux. Note que voc e ainda pode utilizar uma biblioteca do MySQL dinamicamente ligada ` a s sua aplica c ao cliente. E o o servidor que e cr itico para performance. Se voc e corta seu bin ario mysqld com strip libexec/mysqld, o bin ario gerado pode car at e 4% mais r apido. Para uma conex ao de um cliente para um servidor em execu c ao na mesma m aquina, se voc e conecta utilizando TCP/IP em vez de utilizar um arquivo socket Unix, o rendimento e 7.5% mais lento no mesmo computador. (Se voc e zer conex ao ` a localhost, o MySQL ir a, por padr ao, utilizar sockets). Para conex oes TCP/IP de um cliente para um servidor, conectando a um servidor remoto em outra m aquina ser a 8-11% mais lento que conectando ao servidor local na mesma m aquina, mesmo para conex oes Ethernet de 100M. Quando executar o nosso teste de benchamrk usando conex oes seguras (todos os dados crptografados com suporte interno SSL) ele se torna 55% mais lento. Se voc e compilar com --with-debug=full, a maioria das consultas ser a 20% mais lentas. Algumas consultas podem demorar muito mais tempo (por exemplo, os benchmarks do MySQL demonstram 35% de perda). Se utilizar --with-debug, a queda ser a de apenas 15%. Para uma vers ao do mysqld compilada com --with-debug=full, voc e pode desabilitar a verica c ao de mem oria em tempo de execu c ao iniciando-o com a op c ao --skip-safemalloc. O resultado nal neste caso deve estar pr oximo de quando compilado com --with-debug. Em um Sun UltraSPARC-IIe, Forte 5.0 e 4% mais r apido que gcc 3.2. Em um Sun UltraSPARC-IIe, Forte 5.0 e 4% mais r apido em modo de 32 bits que em modo de 64 bits. Compilando com gcc 2.95.2 para o ultrasparc com a op c ao -mcpu=v8 -Wa,xarch=v8plusa melhora a performance em 4%. No Solaris 2.5.1, a MIT-pthreads e 8-12% mais lenta do que as threads nativas do Solaris em um u nico processador. Com mais carga/CPUs a diferen ca deve aumentar. Executar com --log-bin deixa o mysqld 1 % mais lento. Compilando no Linux-x86 com gcc sem frame pointers -fomit-frame-pointer ou fomit-frame-pointer -ffixed-ebp deixa o mysqld 1-4% mais r apido. A distribui c ao MySQL-Linux fornecida pela MySQL AB e normalmente compilada com pgcc, mas vamos retornar ao uso do gcc pelo fato de um bug no pgcc que gera o c odigo que n ao executa no AMD. Continuaremos a usar o gcc at e que o bug seja resolvido. Neste meio tempo, se voc e possui uma m aquina que n ao seja AMD, voc e pode ter um bin ario mais r apido compilando com o pgcc. O bin ario padr ao do MySQL para Linux e ligado estaticamente para conseguir mais desempenho e ser mais port avel.
459
O buer de chave (vari avel key_buffer_size) e compartilhado por todas as threads; Outros buers usados pelo servido s ao alocados quando necess arios. Veja Se c ao 5.5.2 [Par ametros de servidor], P agina 455. Cada conex ao utiliza algum espa co espec ico da thread: Uma de pilha (padr ao de 64K, vari avel thread_stack), um buer de conex ao (vari avel net_buffer_lenght), e um buer de resultados (vari avel net_buffer_lenght). Os buers de conex oes e resultados s ao aumentados dinamicamente para max_allowed_packet quando necess ario. Quando uma consulta est a sendo executada, uma c opia da string da consulta atual e tamb em alocada. Todas as threads compartilhas a mesma mem oria base. Somente as tabelas ISAM e MyISAM compactadas s ao mapeadas em mem oria. Isto e porque o espa co de mem oria de 32-bits de 4GB n ao e grande o bastante para a maioria das grandes tabelas. Quando sistemas com endere camento de 64-bits se tornarem comuns poderemos adicionar um suporte gieral para o mapeamento de mem oria. Cada requisi c ao fazendo uma varredura sequencial em uma tabela aloca um buer de leitura (vari avel read_buffer_size). Ao ler registros na ordem rand omica (por exemplo, depois de uma ordena c ao) um buer de leitura rand omico e alocado para evitar pesquisas em disco. (vari avel read_ rnd_buffer_size). Todas as joins s ao feitas em um u nico passo, e a maioria delas podem ser feitas mesmo sem usar uma tabela tempor aria. A maioria das tabelas tempor arias s ao tabelas baseadas em mem oria (HEAP). Tabelas tempor arias com uma grande extens ao de registros (calculada como a soma do tamanho de todas as colunas) ou que contenham colunas BLOB s ao armazenadas em disco. Um problema nas vers oes do MySQL anteriores a 3.23.2 e que se uma tabela HEAP excede o tamanho de tmp_table_size, voc e recebe o erro The table nome_tabela is full. A partir da vers ao 3.23.2, isto e tratado alterando automaticamente a tabela em mem oria HEAP para uma tabela baseada em disco MyISAM quando necess ario. Para contornar este problema, voc e pode aumentar o tamanho da tabela tempor aria congurando a op c ao tmp_table_size do mysqld, ou congurando a op c ao do SQL SQL_ BIG_TABLES no progrma cliente. Veja Se c ao 5.5.6 [SET OPTION], P agina 461. Na vers ao 3.20 do MySQL, o n umero m aximo da tabela tempor aria e record_buffer*16; se voc e estiver utilizando esta vers ao, voc e ter a que aumentar o valor record_buffer. Voc e tamb em pode iniciar o mysqld com a op c ao --big-tables para sempre armazenar as tabelas tempor arias em disco. Entretanto isto afetar a a velocidade de v arias consultas complicadas. A maioria das requisi c oes que realizam ordena c ao alocam um bufer de ordena c ao e 0-2 arquivos tempor arios dependendo do tamanho do resultado. Veja Se c ao A.4.4 [Arquivos tempor ario], P agina 925. Quase todas as an alises e c alculos s ao feitos em um armazenamento de mem oria local. Nenhuma sobrecarga de mem oria e necess ario para itens pequenos e a aloca c ao e libera c ao normal de mem oria lenta e evitada. A mem oria e alocada somente para grandes strings inesperadas; isto e feito com malloc() e free(). Cada arquivo de indice e aberto uma vez e o arquivo de dados e aberto uma vez para cada thread concorrente. Uma estrutura de tabela, estrutura de coluna para
460
cada coluna e um buer de tamanho 3 * n e alocado para cada thread concorrente. (onde n e o maior tamanho do registro, sem levar em considera c ao colunas BLOB. Uma coluna BLOB utiliza de 5 a 8 bytes mais o tamanho dos dados contidos na mesma. O manipulador de tabelas ISAM/MyISAM ir ao usar um registro extra no buer para uso interno. Para cada tabela com colunas BLOB, um buer e aumentado dinamicamente para ler grandes valores BLOB. Se voc e ler uma tabela, um buer do tamanho do maior registro BLOB e alocado. Estruturas de manipulac ao para todas tabelas em uso s ao salvos em um cache e gerenciado como FIFO. Normalmente o cache possui 64 entradas. Se uma tabela foi usada por duas threads ao mesmo tempo, o cache ter a duas entredas para a tabela. Veja Se c ao 5.4.7 [Cache de tabela], P agina 452. Um comando mysqladmin flush-tables fecha (ou instru c oes FLUSH TABLES) todas tabelas que n ao est ao em uso e marca todas tabelas em uso para serem fechadas quando a thread atualmente em execu c ao terminar. Isto ir a liberar efetivamente a maioria da mem oria em uso. ps e outros programas de informa c oes do sistema podem relatar que o mysqld usa muita mem oria. Isto pode ser causado pelas pilhas de threads em diferentes endere cos de mem oria. Por exemplo, a vers ao do ps do Solaris conta a mem oria n ao usada entre as pilhas como mem oria usada. Voc e pode vericar isto conferindo a mem oria dispon ivel com swap -s. Temos testado o mysqld com detectores comerciais de perda de mem oria, portanto tais perdas n ao devem existir.
461
462
SHOW VARIABLES like "max_join_size"; SHOW GLOBAL VARIABLES like "max_join_size"; SELECT @@max_join_size, @@global.max_join_size; Segue aqui a descri c ao das vari aveis que usam uma sintaxe SET n ao padr ao e algumas das outras vari aveis. A deni c ao das outras vari aveis podem ser encontrados na se c ao vari aveis de sistema, entre as op c oes de inicializa c ao ou na descri c ao de SHOW VARIABLES. Veja Se c ao 6.1.5 [Vari aveis de sistema], P agina 475. Veja Se c ao 4.1.1 [Op c oes de linha de comando], P agina 208. Veja Se c ao 4.6.8.4 [SHOW VARIABLES], P agina 310. AUTOCOMMIT= 0 | 1 Se congurado com 1 todas altera c oes em uma tabela ser a feita de uma vez. Para iniciar uma transa c ao de v arios comandos, deve ser usada a instru c ao BEGIN. Veja Se c ao 6.7.1 [COMMIT], P agina 614. Se congurado com 0 deve ser usado COMMIT/ROLLBACK para aceitar/recusar aquela transa c ao. Veja Se c ao 6.7.1 [COMMIT], P agina 614. Note que quando voc e altera do modo n ao-AUTOCOMMIT para AUTOCOMMIT, o MySQL ir a fazer um COMMIT autom atico em quaisquer transa c oes abertas. BIG_TABLES = 0 | 1 Se denido com 1, todas as tabelas tempor arias s ao armazenadas no disco em vez de o ser na me oria. Isto ser a um pouco mais lento, mas voc e n ao ter a o erro The table tbl_name is full para grandes opera c oes SELECT que exigem uma tabela tempor aria maior. O valor padr ao para uma nova conex ao e 0 (isto e, usa tabelas tempor arias em mem oria) Esta op c ao era chamada SQL_BIG_TABLES. No MySQL 4.0 voc e normalmente nunca deve precisar deste par ametro j a que o MySQL converter a automaticamente tabelas em mem oria para tabelas em disco se isto for necess ario. CHARACTER SET nome_conjunto_caracteres | DEFAULT Mapeia todas as strings do e para o cliente com o mapa especicado. Atualmente a u nica op c ao para character_set_name e cp1251_koi8, mas voc e pode adicionar novos mapas editando o arquivo sql/convert.cc na distribui c ao fonte do MySQL. O mapeamento padr ao pode ser restaurado utilizando o valor DEFAULT para character_set_name. Perceba que a sintaxe para congurar a op c ao CHARACTER SET e diferente da sintaxe para congurar as outras op co es. DATE_FORMAT = format_str Determina como o servidor converte valores DATE para strings. Esta vari avel est a disponivel como uma op c ao global, local ou de linha de comando. format_ str pode ser especicado convenientemente usando a fun c ao GET_FORMAT(). Veja Veja Se c ao 6.3.4 [Date and time functions], P agina 529. DATETIME_FORMAT = format_str Determina como o servidor converte valores DATETIME para string. Esta vari avel est a dispon ivel como uma op c ao global, local ou de linha de comando. format_str pode ser especicada convenientemente usando a fun c ao GET_FORMAT(). Veja Veja Se c ao 6.3.4 [Date and time functions], P agina 529.
463
INSERT_ID = # Congura o valor que ser a usado pelo comando INSERT ou ALTER TABLE seguinte ao inserir um valor AUTO_INCREMENT. Isto e usado principalmente com o log de atualiza c oes. LAST_INSERT_ID = # Congura o valor a ser retornado de LAST_INSERT_ID(). Ele e armazenado no log de atualiza c oes quando voc e utiliza LAST_INSERT_ID() em um comando que atualiza uma tabela. LOW_PRIORITY_UPDATES = 0 | 1 Se congurado com 1, todas instru c oes INSERT, UPDATE, DELETE e LOCK TABLE WRITE ir ao esperar at e que n ao existam SELECT ou LOCK TABLE READ pendentes na tabela afetada. Esta op c ao era chamada SQL_LOW_PRIORITY_UPDATES. MAX_JOIN_SIZE = value | DEFAULT N ao permite que SELECTs que provavelmente necessitem examinar mais que valor combina c oes de registros. Congurando este valor, voc e pode obter SELECTs onde chaves n ao s ao usadas corretamente e que provavelmente gastar ao um bom tempo. Congurando-o para um valor diferente do DEFAULT ir a denir o atributo SQL_BIG_SELECTS com o padr ao. Se voc e congurar o atributo SQL_ BIG_SELECTS novamente, a vari avel SQL_MAX_JOIN_SIZE ser a ignorada. Voc e pode congurar um valor padr ao para esta vari avel iniciando o mysqld com -O max_join_size=#. Esta op c ao era chamada SQL_MAX_JOIN_SIZE Note que se o resultado da consulta ja estiver na cache de consultas, o vericai c ao acima n ao ser a feita. O MySQL ir a enviar o resultado ao cliente. Uma vez que o resultado da consulta j a foi consultado e n ao ser a responsabilidade do servidor enviar o resultado ao cliente. PASSWORD = PASSWORD(alguma senha) Congura a senha para o usu ario atual. Qualquer usu ario que n ao seja an onimo pode alterar sua pr opria senha! PASSWORD FOR user = PASSWORD(alguma senha) Congura a senha para um usu ario espec ico no servidor atual. Somente um usu ario com acesso ao banco de dados mysql pode fazer isto. O usu ario deve ser fornecido no formato usu ario@home_maquina, onde usu ario e nome_ m aquina s ao exatamente o que est ao listados nas colunas User e Host da tabela mysql.user. Por exemplo, se voc e possui uma entrada com os campos User e Host com bob e %.loc.gov, voc e escreveria: mysql> SET PASSWORD FOR bob@%.loc.gov = PASSWORD(newpass); Que e equivalente a: mysql> UPDATE mysql.user SET Password=PASSWORD(newpass) -> WHERE User=bob AND Host=%.loc.gov; mysql> FLUSH PRIVILEGES; QUERY_CACHE_TYPE = OFF | ON | DEMAND QUERY_CACHE_TYPE = 0 | 1 | 2 Dene a congura c ao da cache de consultas para esta thread. Set query cache setting for this thread.
464
Op c ao 0 ou OFF 1 ou ON 2 ou DEMAND
Descri c ao N ao armazena ou recupera resultados. Armazena todos os resultados, exceto consultas SELECT SQL_ NO_CACHE .... Armazena apenas consultas SELECT SQL_CACHE ....
SQL_AUTO_IS_NULL = 0 | 1 Se congurado com 1 (padr ao) o u ltimo registro inserido em uma tabela com um regitro auto incremnto pode ser encontrado com a seguinte constru c ao: WHERE auto_increment_column IS NULL. Isto e usado por alguns programas ODBC como o Access. SQL_BIG_SELECTS = 0 | 1 Se congurado com 0, o MySQL aborta as instru c oes SELECTs que provavelmente levam muito tempo (isto e, instru c oes para as quais o otimizador estima que o n umero de registros examinados provavelmente ir a exceder o valor de MAX_JOIN_SIZE. Isto eu til quando uma instru c ao WHERE n ao aconselhada for utilizado. O valor padr ao para uma nova conex ao e 1 (que permitir a qualquer instru c ao SELECT). Se voc e denir MAX_JOIN_SIZE com um valor diferente de DEFAULT, SQL_BIG_ SELECTS ser a denida com 0. SQL_BUFFER_RESULT = 0 | 1 SQL_BUFFER_RESULT for ca para que o resultado das SELECTs seja colocado em tabelas tempor arias. Isto ir a ajudar o MySQL a liberar mais cedos bloqueios de tabela e ajudar ao em casos onde elas ocupam muito tempo para enviar o conjunto de resultados para o cliente. SQL_SAFE_UPDATES = 0 | 1 Se congurado com 1, o MySQL ir a aborar se tentarmos fazer um UPDATE ou DELETE sem utilizar uma chave ou LIMIT na cl ausula WHERE. Desta forma e possivel capturar atualiza c oes erradas ao criarmos comandos SQL manualmente. SQL_SELECT_LIMIT = valor | DEFAULT O n umero m aximo de registros para retornar de instru c oes SELECT. Se uma SELECT tem uma cl ausula LIMIT, o LIMIT tem preced eencia sobre o valor de SQL_SELECT_LIMIT. O valor padr ao para uma nova conex ao e unlimited (ilimitado). Se voc e alterou o limite, o valor padr ao pode ser restaurado atribuindo o valor DEFAULT a SQL_SELECT_LIMIT. SQL_LOG_OFF = 0 | 1 Se congurado com 1, nenhum registro ser a feito no log padr ao para este cliente, se o cliente tiver o privil egio SUPER. SQL_LOG_BIN = 0 | 1 Se congurada com 0, nenhum registro e feito no log bin ario para o cliente, se o cliente tiver o privil egio SUPER.
465
SQL_LOG_UPDATE = 0 | 1 Se congurado com 0, nenhum registro ser a feito no log de atualiza c oes para o cliente, se o cliente tiver o privil egio SUPPER. Esta vari avel est a obsoleta a partir da vers ao 5.0. SQL_QUOTE_SHOW_CREATE = 0 | 1 Se congurado com 1, SHOW CREATE TABLE ir a colocar os nomes de tabela e colunas entre aspas. Est a ligado por padr ao, para que replica c ao de tabelas com nomes de colunas estranhos funcione. Se c ao 4.6.8.8 [SHOW CREATE TABLE], P agina 323. TIMESTAMP = valor_timestamp | DEFAULT usado para obter a hora e data Congura a hora/data para este cliente. E original se voc e utiliza o log de atualiza c oes para restaurar registros. valor_ timestamp deve ser um timestamp UNIX Epoch, n ao um timestamp MySQL. TIME_FORMAT = format_str Determina como o servidor converte valores TIME para string. Esta vari avel est a dispon ivel como uma op c ao global, local ou de linha de comando. format_str pode ser especicada convenientemente usando a fun c ao GET_FORMAT(). Veja Veja Se c ao 6.3.4 [Date and time functions], P agina 529.
466
Perceba que a diferen ca de velocidade para striping e muito dependente dos par ametros. Dependendo de como voc e congura os par ametros do striping e do n umero de discos voc e pode obter uma diferen ca de v arias ordens de grandeza. Note que voc e deve escolher a otimiza c ao rand omica ou pelo acesso sequencial. Para conabilidade voc e pode desejar utilizar RAID 0+1 (striping + espelhamento) mas neste caso voc e ir a precisar de 2*N discos para armazenar N discos de dados. Isto e provavelmente a melhor op c ao se voc e possuir dinheiro! Voc e pode tamb em, entretanto, ter que investir em algum software gerenciador de volumes para lidar com isto ecientemente. Uma boa op c ao e variar os n iveis de RAID de acordo com a import ancia do dado. a Por exemplo, ter dados com alguma import ancia que podem ser regenerados em um armazenamento RAID 0 enquanto os dados realemtente importantes como informa c oes de m aquinas e logs em um sistema RAID 0+1 ou RAID de N discos. RAID N pode ser um problema se voc e tem v arias escritas devido ao tempo para atualizar os bits de paridade. Voc e pode tamb em congurar os par ametros para o sistema de arquivos que o banco de dados usa. Uma altera c ao simples e montar o sistema de arquivos com a op c ao noatime. Isto faz com que ele evite a atualiza c ao do u ltimo tempo de acesso no inode e com isto tamb em evita algumas buscas em disco. No Linux, voc e pode obter um desempenho muito melhor (cerca de 100% sobre carga pode ser comum) utilizando hdparm para congurar sua interface de disco! O exemplo a seguir deve ser muito u til para o MySQL (e provavelmente v arias outras aplica c oes): hdparm -m 16 -d 1 Perceba que o desempenho/conan ca ao utilizar o exemplo acima depende de seu hardware, portanto n os sugerimos que voc e teste bem seu sistema depois de utilizar hdparm! Por favor consulte a p agina do manual (man) do hdparm para maiores informa c oes! Se o hdparm n ao for usado corretamente, poder a resultar em corrup c ao do sistema de arquivos. Realize backups de tudo antes de experimentar! Em v arios sistemas operacionais os discos podem ser montados com a op c ao async para congurar o sistema de arquivos a ser atualizado de modo ass incrono. Se o seu computador e razoavelmente est avel, isto deve fornecer mais desempenho sem sacricar a seguran ca. (Esta op c ao e ligada por padr ao no Linux.) Se voc e n ao precisar saber a u ltima vez que um arquivo foi acessado (o que realmente n ao e muito u til em um servidor de banco de dados), voc e pode montar seus sistema de arquivos com a op c ao noatime.
467
468
A liga c ao pode ser feita partir do sistema operacional (se o mysqld n ao estiver em execu c ao) ou com o comando INDEX/DATA DIRECTORY="caminho-para- diretorio" em CREATE TABLE. Veja Se c ao 6.5.3 [CREATE TABLE], P agina 597. myisamchk n ao ir a substituir um link simb olico pelo indice/arquivo mas funciona diretamente nos arquivos apontados pelos links simb olicos. Qualquer arquivo tempor ario ser a criado no mesmo diret orio que o arquivo de dados/indice est a. Quando voc e remove uma tabela que est a usando links simb olicos, o link e o arquivo para o qual ela aponta s ao apagados. Esta e uma boa raz ao pela qual voc e n~ ao deve executar mysqld como root e n ao deve permitir que pessoas tenham acesso de escrita ao diret orios de bancos de dados do MySQL. Se voc e renomear uma tabela com ALTER TABLE RENAME e n ao deseja alterar o banco de dados, o link simb olico para o diret orio de banco de dados ser a renomeada corretamente. Se voc e utiliza ALTER TABLE RENAME para mover uma tabela para outro banco de dados, ent ao a tabela ser a movida para outro diret orio de banco de dados e os links simb olicos antigos e os arquivos para os quais eles apontam ser ao removidos. Se voc e n ao utiliza links simb olicos, voc e deve usar a op c ao --skip-symlink do mysqld para garantir que ningu em pode apagar ou renomear um arquivo fora do diret orio de dados do mysqld. O que ainda n ao e suportado: ALTER TABLE ignora todas as op c oes de tabela DATA DIRECTORY e INDEX DIRECTORY. CREATE TABLE n ao relata se a tabela possui links simb olicos. O mysqldump n ao inclui a informa c ao de links simb olicos na sa ida. BACKUP TABLE e RESTORE TABLE n ao respeitam links simb olicos. O arquivo frm nunca deve ser um link simb olico (como dito anteriormente, apenas os dados e indices podem ser links simb olicos). Fazer isto (por exemplo para fazer sin onimos), produzir a resultados errados. Suponha que voc e tenha um banco de dados db1 sob o diret orio de dados do MySQL, uma tabela tbl1 neste banco de dados e voc e fa ca um link simb olico tbl2 no diret orio db1 que aponmta para tbl1: shell> cd /path/to/datadir/db1 shell> ln -s tbl1.frm tbl2.frm shell> ln -s tbl1.MYD tbl2.MYD shell> ln -s tbl1.MYI tbl2.MYI Agora se uma thread l e db1.tbl1 e outra thread atualiza db1.tbl2, haver a problemas: a cache de consultas ser a enganada (ela acreditar a que tbl1 n ao foi atualizado e retornar a resultados desatualizados), o comando ALTER em tbl2 tamb em ir a falhar.
469
6.1.1.1 Strings
Uma string e uma sequ encia de caracteres, cercada por caracteres de aspas simples () ou duplas (") (Se voc e utiliza o modo ANSI deve utilizar somente as aspas simples). Exemplos: uma string "outra string" Em uma string, certas sequ encias tem um signicado especial. Cada uma destas sequ encias come cam com uma barra invertida (\), conhecida como caracter de escape. O MySQL reconhece a seguinte sequ encia de escape: \0 \ \" \b \n \r \t \z Um caracter ASCII 0 (NUL). Um caracter de aspas simples (). Um caracter de aspas duplas ("). Um caracter de backspace. Um caracter de nova linha. Um caracter de retorno de carro. Um caracter de tabula c ao. ASCII(26) (Control-Z). Este caracter pode ser codicado para permitir que voc e contorne o problema que o ASCII(26) possui comoEND-OF-FILE ou EOF (Fim do arquivo) no Windows. (ASCII(26) ir a causar problemas se voc e tentar usar mysql banco_dados < nome_arquivo). O caracter de barra invertida (\) character. Um caracter %. Ele pode ser usado para pesquisar por inst ancias literais de % em contextos onde % deve, de outra maneira, ser interpretado como um meta caracter. Veja Se c ao 6.3.2.1 [Fun c oes de compara c oes de string], P agina 519.
\\ \%
470
\_
Um caracter _. Ele e usado para pesquisar por inst ancias literais de _ em contextos onde _ deve, de outra maneira, ser intrerpretado como um meta caracter. Veja Se c ao 6.3.2.1 [Fun c oes de compara c oes de string], P agina 519.
Note que se voc e utilizar \% ou \_ em alguns contextos de strings, eles retornar ao as strings \% e \_ e n ao % e _. Estas s ao as v arias maneiras de incluir aspas com uma string: Um dentro de uma string com pode ser escrita como . Um " dentro de uma string com " pode ser escrita como "". Voc e pode preceder o caracter de aspas com um caracter de escape (\). Um dentro de uma string com " n ao precisa de tratamento especial e n ao precisa ser duplicada ou utilizada com caracter de escape. Da mesma maneira, " dentro de uma string com n ao necessita de tratamento especial. As instru c oes SELECT exibidas abaixo demonstram como cita c oes e escapes funcionam: mysql> SELECT hello, "hello", ""hello"", hello, \hello; +-------+---------+-----------+--------+--------+ | hello | "hello" | ""hello"" | hello | hello | +-------+---------+-----------+--------+--------+ mysql> SELECT "hello", "hello", "hello", "hel""lo", "\"hello"; +-------+---------+-----------+--------+--------+ | hello | hello | hello | hel"lo | "hello | +-------+---------+-----------+--------+--------+ mysql> SELECT "This\nIs\nFour\nlines"; +--------------------+ | This Is Four lines | +--------------------+ Se voc e deseja inserir dados bin arios em uma coluna BLOB, os caracteres a seguir devem ser representados por sequ encias de espace: NUL \ " ASCII 0. Voc e deve represent a-lo como \0 (uma barra invertida e um caractere 0). ASCII 92, barra invertida. Representado como \\. ASCII 39, aspas simples. Representado como \. ASCII 34, aspas duplas. Representado como \".
Se voc e escreve c odigo C, voc e pode utilizar a fun c ao da API C mysql_escape_string() para caracteres de escape para a instru c ao INSERT. Veja Se c ao 12.1.2 [Vis ao geral da fun c ao API C], P agina 775. No Perl, pode ser utilizado o m etodo quote do pacote DBI para converter caracteres especiais para as sequ encias de escape corretas. Veja Se c ao 12.5.2 [Classe DBI do Perl], P agina 877.
471
Deve ser utilizada uma fun c ao de escape em qualquer string que cont em qualquer um dos caracteres especiais listados acima! Alternativamente, muitas APIs do MySQL fornecem algumas da capacidades de placeholder que permitem que voc e insira marcadores especiais em um string de consulta e ent ao ligar os valores dos dados a eles quando voc e executa a consulta. Neste caso, a API inclui, automaticamente, os caracteres especiais de escape nos valores para voc e.
6.1.1.2 N umeros
Inteiros s ao representados como uma sequ encia de d igitos. N umeros de ponto utuante utilizam . como um separador decimal. Ambos os tipos devem ser precedidos por - para indicar um valor negativo. Exemplos de inteiros v alidos: 1221 0 -32 Exemplo de n umeros de ponto utuante v alidos: 294.42 -32032.6809e+10 148.00 Um inteiro pode ser usado em um contexto de ponto utuante; ele e interpretado como o de ponto utuante equivalente. A partir da vers ao 4.1.0, a constante TRUE e avaliada com 1 e FALSE e avaliada com 0.
472
Note que em adi c ao ao mostrado acima, voc e n ao pode ter ASCII(0) ou ASCII(255) ou o caracter de cita c ao (aspas) em um identicador. Se o identicador e uma palavra restrita ou cont em caracteres especiais voc e deve sempre coloc a-lo entre ao us a-lo: mysql> SELECT * FROM select WHERE select.id > 100; Veja Se c ao 6.1.7 [Reserved words], P agina 479. Se voc e estiver executando o MySQL no modo MAXDB ou ANSI_QUOTES, ele tamb em pode citar identicadores com aspas duplas: mysql> CREATE TABLE "test" (col INT); ERROR 1064: You have an error in your SQL syntax. (...) mysql> SET SQL_MODE="ANSI_QUOTES"; mysql> CREATE TABLE "test" (col INT); Query OK, 0 rows affected (0.00 sec) Veja Se c ao 4.1.1 [Command-line options], P agina 208. Em vers oes do MySQL anteriores a 3.23.6, as regras se nomes eram as seguintes: Um nome pode consistir de caracteres alfanum ericos do conjunto atual de caractres e tamb em _ e $. O conjunto de caracteres padr ao e o ISO-8859-1 Latin1; e pode ser alterado com a op c ao --default-character-set no mysqld. Veja Se c ao 4.7.1 [Conjunto de caracteres], P agina 326.
473
Um nome pode iniciar com qualquer caractere que e legal no nome. Em particular, pode iniciar com um n umero (isto difere de v arios outros sistemas de bancos de dados!). Entretanto um nome n ao pode consistir somente de n umeros. O caractere . n ao pode ser utilizado em nomes porque ele e usado para extender o formato pelo qual voc e pode fazer refer encias a colunas (veja abaixo). recomendado que voc E e n ao utilize nomes como 1e, porque uma express ao como 1e+1 e ambigua. Ela pode ser interpretada como a express ao 1e + 1 ou como o n umero 1e+1. No MySQL voc e pode se referir a uma coluna utilizando uma das formas seguintes: Signicado Coluna nome_campo de qualquer tabela usada na consulta contendo uma coluna com aquele nome. nome_tabela.nome_campo Coluna nome_campo da tabela nome_tabela do banco de dados atual. nome_bd.nome_tabela.nome_ Coluna nome_campo da tabela nome_tabela do banco campo de dados nome_bd. Esta forma e dispon ivel no MySQL Vers ao 3.22 ou posterior. nome_coluna Uma coluna que e uma palavra chave ou contem caracteres especiais. Voc e n ao precisa especicar um prexo de nome_tabela ou nome_bd.nome_tabela para uma refer encia de coluna em uma instru c ao, a menos que a refer encia seja amb igua. Por exemplo, suponha que cada tabela t1 e t2 contenham uma coluna c, e voc e deve recuperar c em uma instru c ao SELECT que utiliza ambas tabelas t1 e t2. Neste caso, c e amb iguo porque ele n ao eu nico entre as tabelas usadas na instru c ao, portanto deve ser indicado qual e a tabela que se deseja escrever, t1.c ou t2.c. De mesma forma, se voc e for recuperar de uma tabela t em um banco de dados db1 e uma tabela t em um banco de dados db2, voc e deve se refererir ` as colunas nestas tabelas como db1.t.nome_campo e db2.t.nome_campo. A sintaxe .nome_tabela indica a tabela nome_tabela no banco de dados atual. Esta sintaxe e aceitada para compatibilidade ODBC, porque alguns programas ODBC prexam os nomes das tabelas com um caracter .. Coluna de refer encia nome_campo
474
Aliases nas tabelas s ao caso sensitivo. A consulta seguinte n ao deve funcionar porque ela faz refer encia ao alias como a e como A. mysql> SELECT nome_campo FROM nome_tabela AS a WHERE a.nome_campo = 1 OR A.nome_campo = 2; Se voc e tem um problema para lembrar o caso usado para os nomes de tabelas, adote uma conven c ao consistente, como sempre criar bancos de dados e tabelas utilizando nomes em min usculas. Uma maneira para evitar este problema e iniciar o mysqld com -O lower_case_nome_ tabelas=1. Por padr ao esta op c ao e 1 no Windows e 0 no Unix. Se lower_case_nome_tabelas for 1, o MySQL ir a converte todos os nomes de tabelas para min usculo no armazenamento e pesquisa. (A partir da vers ao 4.0.2, esta op c ao tamb em se aplica ao nome do banco de dados. A partir da 4.1.1 isto tamb em se aplica a alias de tabelas). Perceba que se voc e alterar esta op c ao, ser a necess ario converter primeiramente seus nomes de tabelas antigos para min usculo antes de iniciar o mysqld. Se voc e mover os arquivos MyISAM do Windows pare o Unix, voc e pode, em alguns casos, precisar usar a ferramenta mysql_fix_extensions para corrigir o caso ad extens ao do arquivo em cada diret orio de banco de dados espec ico (.frm em letra min uscula, .MYI e .MYD em letras mai usculas). mysql_fix_extensions pode ser encontado no subdiret orio scripts.
475
Vari aveis de usu arios devem ser utilizadas em express oes onde s ao permitidas. Isto n ao inclui utiliza-las em contextos onde um n umero e explicitamente necess ario, assim como na cl ausula LIMIT de uma instru c ao SELECT ou a clausula IGNORE number LINES de uma instru c ao LOAD DATA. NOTE: Em uma instru c ao SELECT , cada express ao s o e avaliada quando enviada ao cliente. Isto signica que nas cl ausula HAVING, GROUP BY, ou ORDER BY, voc e n ao pode fazer refer encia a uma exprees ao que envolve vari aveis que s ao conguradas na instru c ao SELECT. Por funcionar examplo, a seguinte instru c ao NAO a como o esperado: SELECT (@aa:=id) AS a, (@aa+3) AS b FROM nome_tabela HAVING b=5; A raz ao e que o @aa n ao ir a conter o valor da linha atual, mas o valor da id da linha previamente aceita. A regra geral e nunca atribuir e usar a mesma vari avel na mesma instru c ao. Outra quest ao com congurar uma vari avel e us a-la na mesma instru c ao e que o tipo do resultado padr ao de uma vari avel e baseada no tipo da vari avel no in icio da instru c ao. (Assume-se que uma vari avel n ao atribu ida possui o valor NULL e e do tipo STRING). O seguitne exemplo ilustra isto: mysql> SET @a="test"; mysql> SELECT @a,(@a:=20) FROM table_name; Neste caso o MySQL relatar a ao cliente que a coluna 1 e uma string e converte todos os acessos de @a a strings, mesmo que @a seja congurada com um n umero para a segunda linha. Depois que a instru c ao e executada @a ser a considerado como um n umero. Se voc e tiver qualquer problema com isto, evite tanto congurar e usar a mesma vari avel na mesma instru c ao ou congurar a vari avel com 0, 0.0 ou "" antes de us a-la.
476
SET SESSION sort_buffer_size=valor; SET @@session.sort_buffer_size=valor; SET sort_buffer_size=valor; Se voc e n ao especicar GLOBAL ou SESSION ent ao ser a usado SESSION. Veja Se c ao 5.5.6 [SET OPTION], P agina 461. LOCAL e um sin onimo para SESSION. Para recuperar o valor de uma vari avel GLOBAL voc e pode usar um dos seguintes comandos: SELECT @@global.sort_buffer_size; SHOW GLOBAL VARIABLES like sort_buffer_size; Para retornar o valor de uma vari avel SESSION voc e pode usar um dos seguintes comandos: SELECT @@session.sort_buffer_size; SHOW SESSION VARIABLES like sort_buffer_size; Quando voc e retorna o valor de uma cari avel com a sintaxe @@nome_vari avel e voc e n ao especicar GLOBAL ou SESSION ent ao o MySQL retornar a o valor espec ico da thread (SESSION), se ele existir. Se n ao, o MySQL retornar a o valor global. A raz ao da exig encia de GLOBAL apenas para denir a vari avel GLOBAL, mas n ao para recuper a-la e assegurar que n ao criemos problemas posteriormente ao introduzirmos um vari avel especica da thread com o mesmo nome ou remover uma vari avel especica da thread. Neste caso, voc e pode acidentalmente alterar o estado do servidor como um todo, e n ao apenas em sua conex ao. A seguir apresentamos uma lista completa de todas as vari aveis que altera e recupera se voc e pode usar GLOBAL ou SESSION com elas. Nome Vari avel Tipo Valor Tipo autocommit bool SESSION big tables bool SESSION binlog cache size num GLOBAL bulk insert buer size num GLOBAL | SESSION concurrent insert bool GLOBAL connect timeout num GLOBAL convert character set string SESSION delay key write OFF | ON | ALL GLOBAL delayed insert limit num GLOBAL delayed insert timeout num GLOBAL delayed queue size num GLOBAL error count num SESSION ush bool GLOBAL ush time num GLOBAL foreign key checks bool SESSION identity num SESSION insert id bool SESSION interactive timeout num GLOBAL | SESSION join buer size num GLOBAL | SESSION key buer size num GLOBAL
477
last insert id local inle log warnings long query time low priority updates max allowed packet max max max max max binlog cache size binlog size connect errors connections error count
bool bool bool num bool num num num num num num num num num num num num num num num num num num num num num num num num enum num num num bool num
max delayed threads max heap table size max join size max relay log size max sort length max tmp tables max user connections max write lock count myisam max extra sort le size myisam repair threads myisam max sort le size myisam sort buer size net buer length net read timeout net retry count net write timeout query cache limit query cache size query cache type read buer size read rnd buer size rpl recovery rank safe show database server id
SESSION GLOBAL GLOBAL GLOBAL SESSION GLOBAL SESSION GLOBAL SESSION GLOBAL GLOBAL GLOBAL GLOBAL GLOBAL SESSION GLOBAL GLOBAL SESSION GLOBAL SESSION GLOBAL GLOBAL SESSION GLOBAL GLOBAL GLOBAL GLOBAL SESSION GLOBAL SESSION GLOBAL SESSION GLOBAL SESSION GLOBAL SESSION GLOBAL SESSION GLOBAL SESSION GLOBAL SESSION GLOBAL GLOBAL GLOBAL GLOBAL SESSION GLOBAL SESSION GLOBAL GLOBAL GLOBAL
| | |
| | | |
| | | | | | | |
| |
478
slave compressed protocol slave net timeout slow launch time sort buer size sql sql sql sql sql sql sql sql auto is null big selects big tables buer result log binlog log o log update low priority updates
bool num num num bool bool bool bool bool bool bool bool num bool bool bool num bool num enum num bool enum enum num num bool
sql max join size sql quote show create sql safe updates sql select limit sql slave skip counter sql warnings table cache table type thread cache size timestamp tmp table size tx isolation wait timeout warning count unique checks
GLOBAL GLOBAL GLOBAL GLOBAL SESSION SESSION SESSION SESSION SESSION SESSION SESSION SESSION GLOBAL SESSION GLOBAL SESSION SESSION SESSION SESSION GLOBAL SESSION GLOBAL GLOBAL SESSION GLOBAL SESSION GLOBAL SESSION GLOBAL SESSION GLOBAL SESSION SESSION SESSION
| |
| | |
Vari aveis marcadas com num podem ter um valor num erico. Vari aveis marcadas com bool podem ser denidas com 0, 1, ON ou OFF. Vari aveis do tipo enum devem, normalmente, ser atribu idas com um dos valores dispon iveis para a vari avel, mas podem tamb em ser denidas com o n umero correspondente ao valor enum. (O primeiro valor enum e 0). Aqui est a uma descri c ao de algumas das vari aveis: Vari aveis identity sql low priority updates sql max join size version Descri c ao Alias para Alias para Alias para Alias para last insert id (compatibilidade com Sybase) low priority updates max join size VERSION() (compatibilidade com Sybase (?))
Uma descri c ao da outra deni c ao de tabela pode ser encontrada na se c ao de op c oes de inicializa c ao, na descri c ao de SHOW VARIABLES e na se c ao SET. Veja Se c ao 4.1.1 [Op c oes de linha de comando], P agina 208. Veja Se c ao 4.6.8.4 [SHOW VARIABLES], P agina 310. Veja Se c ao 5.5.6 [SET OPTION], P agina 461.
479
480
Word ADD ANALYZE ASC BDB BETWEEN BLOB CALL CHANGE CHECK COLUMNS CONSTRAINT CROSS CURRENT_TIMESTAMP DATABASES DAY_MINUTE DECIMAL DELAYED DESCRIBE DISTINCTROW DROP ENCLOSED EXIT FETCH FOR FOUND FULLTEXT HAVING HOUR_MINUTE IGNORE INFILE INOUT INT INTO ITERATE KEYS LEAVE LIMIT LOCALTIME LONG LOOP MATCH MEDIUMTEXT MINUTE_SECOND NOT NUMERIC OPTION
Word ALL AND ASENSITIVE BEFORE BIGINT BOTH CASCADE CHAR COLLATE CONDITION CONTINUE CURRENT_DATE CURSOR DAY_HOUR DAY_SECOND DECLARE DELETE DETERMINISTIC DIV ELSE ESCAPED EXPLAIN FIELDS FORCE FRAC_SECOND GRANT HIGH_PRIORITY HOUR_SECOND IN INNER INSENSITIVE INTEGER IO_THREAD JOIN KILL LEFT LINES LOCALTIMESTAMP LONGBLOB LOW_PRIORITY MEDIUMBLOB MIDDLEINT MOD NO_WRITE_TO_BINLOG ON OPTIONALLY
Word ALTER AS AUTO_INCREMENT BERKELEYDB BINARY BY CASE CHARACTER COLUMN CONNECTION CREATE CURRENT_TIME DATABASE DAY_MICROSECOND DEC DEFAULT DESC DISTINCT DOUBLE ELSEIF EXISTS FALSE FLOAT FOREIGN FROM GROUP HOUR_MICROSECOND IF INDEX INNODB INSERT INTERVAL IS KEY LEADING LIKE LOAD LOCK LONGTEXT MASTER_SERVER_ID MEDIUMINT MINUTE_MICROSECOND NATURAL NULL OPTIMIZE OR
481
ORDER OUTFILE PRIVILEGES READ REGEXP REPLACE RETURN RLIKE SENSITIVE SHOW SONAME SQL SQLWARNING SQL_SMALL_RESULT SQL_TSI_HOUR SQL_TSI_QUARTER SQL_TSI_YEAR STRAIGHT_JOIN TABLES TIMESTAMPADD TINYINT TRAILING UNION UNSIGNED USE UTC_DATE VALUES VARCHARACTER WHERE WRITE ZEROFILL
OUT PRECISION PROCEDURE REAL RENAME REQUIRE REVOKE SECOND_MICROSECOND SEPARATOR SMALLINT SPATIAL SQLEXCEPTION SQL_BIG_RESULT SQL_TSI_DAY SQL_TSI_MINUTE SQL_TSI_SECOND SSL STRIPED TERMINATED TIMESTAMPDIFF TINYTEXT TRUE UNIQUE UPDATE USER_RESOURCES UTC_TIME VARBINARY VARYING WHILE XOR
OUTER PRIMARY PURGE REFERENCES REPEAT RESTRICT RIGHT SELECT SET SOME SPECIFIC SQLSTATE SQL_CALC_FOUND_ROWS SQL_TSI_FRAC_SECOND SQL_TSI_MONTH SQL_TSI_WEEK STARTING TABLE THEN TINYBLOB TO UNDO UNLOCK USAGE USING UTC_TIMESTAMP VARCHAR WHEN WITH YEAR_MONTH
Os simbolos seguintes (da tabela acima) n ao s ao permitidos pelo SQL-99 mas permitidos pelo MySQL como nome de campos/tabelas. Isto ocorre porque alguns destes nomes s ao muito naturais e v arios pessoas j a o utilizaram. ACTION BIT DATE ENUM NO TEXT TIME TIMESTAMP
482
Colchetes ([ and ]) indicam partes de tipos espec icos que s ao opicionais Note que se voc e especicar ZEROFILL para um campo MySQL automaticamente ir a adicionar o atributo UNSIGNED ao campo. Aviso: voc e deve estar ciente de que quando zer uma subtra c ao entre valores inteiros, onde um deles e do tipo UNSIGNED, o resultado ser a sem sinal! Veja Se c ao 6.3.5 [Fun c oes de coer c ao], P agina 543. TINYINT[(M)] [UNSIGNED] [ZEROFILL] Um inteiro muito pequeno. A faixa deste inteiro com sinal e de -128 at e 127. A faixa sem sinal e de 0 at e 255. BIT BOOL BOOLEAN
Estes s ao sin onimos para TINYINT(1). O sin onimo BOOLEAN foi adicionado na vers ao 4.1.0. Um tipo boolean verdadeiro ser a introduzido de acordo com o SQL-99.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL] Um inteiro pequeno. A faixa do inteiro com sinal e de -32768 at e 32767. A faixa sem sinal e de 0 a 65535. MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] Um inteiro de tamanho m edio. A faica com sinal e de -8388608 a 8388607. A faixa sem sinal e de 0 to 16777215. INT[(M)] [UNSIGNED] [ZEROFILL] Um inteiro de tamanho normal. A faixa com sinal e de -2147483648 a 2147483647. A faixa sem sinal e de 0 a 4294967295. INTEGER[(M)] [UNSIGNED] [ZEROFILL] Este e um sin onimo para INT.
483
BIGINT[(M)] [UNSIGNED] [ZEROFILL] Um inteiro grande. A faixa com sinal e de -9223372036854775808 a 9223372036854775807. A faixa sem sinal e de 0 a 18446744073709551615. Existem algumas coisas sobre campos BIGINT sobre as quias voc e deve estar ciente: Todas as opera c oes aritim eticas s ao feitas usando valores BIGINT ou DOUBLE com sinal, n ao devemos util cizar inteiros sem sinal maiores que 9223372036854775807 (63 bits) exceto com fun c oes ded bit! Se voc e zer isto, alguns dos u ltimos digitos no resultado podem estar errados por causa de erros de arredondamento na convers ao de BIGINT para DOUBLE. O MySQL 4.0 pode tratar BIGINT nos seguintes casos: Usar inteiros para armazenar grandes valores sem sinais em uma coluna BIGINT. Em MIN(big_int_column) e MAX(big_int_column). Quando usar operadores (+, -, *, etc.) onde ambos os operandos s ao inteiros. Voc e pode armazenar valores inteiro exatos em um campo BIGINT aramzenando-os como string, como ocorre nestes casos n ao haver a nenhuma representa c ao intermediaria dupla. -, +, e * ser ao utilizados em c alculos aritim eticos BIGINT quando ambos os argumentos forem valores do tipo INTEGER! Isto signica que se voc e multilicar dois inteiros grandes (ou obter resultados de fun c oes que retornam inteiros) voc e pode obter resultados inesperados quando o resultado for maior que 9223372036854775807. FLOAT(precis~ ao) [UNSIGNED] [ZEROFILL] Um n umero de ponto utuante. N ao pode ser sem sinal. precis~ ao pode ser <=24 para um n umero de ponto utuante de precis ao simples e entre 25 e 53 para um n umero de ponto utuante de dupla-precis ao. Estes tipos s ao como os tipos FLOAT e DOUBLE descritos logo abaixo. FLOAT(X) tem o mesma faixa que os tipos correspondentes FLOAT e DOUBLE, mas o tamanho do display e n umero de casas decimais e indenido. Na vers ao 3.23 do MySQL, este e um verdadeiro valor de ponto utuante. Em vers oes anteriores , FLOAT(precis~ ao) sempre tem 2 casas decimais. Note que o uso de FLOAT pode trazer alguns problemas inesperados como nos c alculos j a que em MySQL todos s ao feitos com dupla-precis ao. Veja Se c ao A.5.6 [Registros sem correspondentes], P agina 930. Esta sintaxe e fornecida para comptibilidade com ODBC. FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] Um n umero de ponto utuante pequeno (precis ao simples). Os valores permitidos est ao entre -3.402823466E+38 e -1.175494351E-38, 0 e entre 1.175494351E-38 e 3.402823466E+38. Se UNSIGNED for especicado, valores negativos n ao s ao permitidos O M e a largura do display e o D e o n umero de
484
casas decimais. FLOAT sem um argumento ou FLOAT(X) onde X <=24 tende a um n umero de ponto utuante de precis ao simples. DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] Um n umero de ponto utuante de tamanho normal (dupla-precis ao). Valores permitidos est ao entre -1.7976931348623157E+308 e -2.2250738585072014E-308, 0 e entre 2.2250738585072014E-308 e 1.7976931348623157E+308. Se UNSIGNED for especicado, valores negativos n ao s ao permitidos. O M e a largura do display e o D e n umero de casa decimais. DOUBLE sem argumento ou FLOAT(X) onde 25 <= X <= 53 s ao n umeros de ponto utuante de dupla-precis ao. DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL] REAL[(M,D)] [UNSIGNED] [ZEROFILL] Estes s ao sin onimos para DOUBLE. DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL] Um n umero de ponto utuante n ao empacotado. Se comporta como um campo CHAR: n ao empacotado signica que o n umero e armazenado como uma string, usando um caracter para cada digito do valor. O ponto decimal e, para n umeros negativos, o sinal de menos (-), n ao s ao contados em M (mas e reservado espa co para isto). Se D for 0, os valores n ao ter ao ponto decimal ou parte fracion aria. A faixa m axima do valor DECIMAL e a mesma do DOUBLE, mas a faixa atual para um campo DECIMAL dado pode ser limitado pela escolha de M e D. Se UNSIGNED e especicado, valores negativos n ao s ao permitidos. Se D n ao for denido ser a considerado como 0. Se M n ao for denido e considerado como 10. Note que antes da vers ao 3.23 do MySQL o argumento M deve incluir o espa co necess ario para o sinal e o ponto decimal. DEC[(M[,D])] [UNSIGNED] [ZEROFILL] NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL] FIXED[(M[,D])] [UNSIGNED] [ZEROFILL] Este e um sin onimo para DECIMAL. O alias FIXED foi adicionado na vers ao 4.1.0 para compatibilidade com outros servidores. DATE Uma data. A faixa suportada e entre 1000-01-01 e 9999-12-31. MySQL mostra valores DATE no formato AAAA-MM-DD, mas permite a voc ea atribuir valores a campos DATE utilizando tanto strings quanto n umeros. Veja Se c ao 6.2.2.2 [DATETIME], P agina 491. DATETIME Um combina c ao de hora e data. A faixa suportada e entre 1000-01-01 00:00:00 e 9999-12-31 23:59:59. MySQL mostra valores DATETIME no formato AAAA-MM-DD HH:MM:SS, mas permite a voc e que atribuir valores a campos DATETIME utilizado strings ou n umeros. Veja Se c ao 6.2.2.2 [DATETIME], P agina 491.
485
TIMESTAMP[(M)] Um timestamp. A faixa e entre 1970-01-01 00:00:00 e algum momento no ano 2037. No MySQL 4.0 ou anteriores, os valores TIMESTAMP s ao exibidos nos formatos YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, ou YYMMDD, dependendo se M e 14 (ou n ao denido), 12, 8 ou 6, mas permite a voc e atribuir valores ao campo TIMESTAMP usando strings ou n umeros. Um campo TIMESTAMP e util para gravar a data e a hora em uma opera c ao de INSERT or UPDATE porque e automaticamente denido a data e a hora da opera c ao mais recente se voc e pr oprio n ao especicar um valor. Voc e tamb em pode denir a data e a hora atual atribuindo ao campo um valor NULL. Veja Se c ao 6.2.2 [Tipos de hora e data], P agina 489. Desde o MySQL 4.1, TIMESTAMP e retornado com um string com o formato YYYY-MM-DD HH:MM:SS. Se voc e deseja t e-lo como um n umero voc e deve adcionar +0 a coluna timestamp. Teimestamp de tamanhos diferentes n ao s ao supoortados. Desde a vers ao 4.0.12, a op c ao --new pode ser usada para fazer o servidor se comportar como na vers` ao 4.1. Um TIMESTAMP sempre e armazenado em 4 bytes. O argumento M s o afeta como a coluna TIMESTAMP e exibida. Note que colunas do tipo TIMESTAMP(M) columns onde M e 8 ou 14 s ao apresentadas como n umeros enquanto as outras colunas TIMESTAMP(M) s ao strings. Isto e apenas para assegurar que podemos eliminar e restaurar com seguran ca tabelas com estes tipos! Veja Se c ao 6.2.2.2 [DATETIME], P agina 491. TIME Uma hora. A faixa e entre -838:59:59 e 838:59:59. MySQL mostra valores TIME no formato HH:MM:SS, mas permite a voc e atribuir valores para as colunas TIME usando strings ou n umeros. Veja Se c ao 6.2.2.3 [TIME], P agina 495. YEAR[(2|4)] Um ano no formato de 2 ou 4 digitos (padr ao s ao 4 digitos). Os valores permitidos est ao entre 1901 e 2155, 0000 no formato de 4 digitos, e 1970-2069 se voc e estiver usando o formato de 2 digitos (70-69). MySQL mostra valores YEAR no formato YYYY, mas permie atribuir valores aos campos do tipo YEAR usando strings ou n umeros. (O tipo YEAR e novo na vers ao 3.22 do MySL). Veja Se c ao 6.2.2.4 [YEAR], P agina 496. [NATIONAL] CHAR(M) [BINARY | ASCII | UNICODE] Uma string de tamanho xo que e sempre preenchida a direita com espa cos at eo tamanho especicado quando armazenado. A faixa de M e de 1 a 255 caracteres. Espa cos extras s ao removidos quando o valor e recuperado. Valores CHAR s ao ordenados e comparados no modo caso insensitivo de acordo com o conjunto de caracteres padr ao, a menos que a palavra chave BINARY seja utilizada. A partir da vers ao 4.1.0, se o valor M especicado e maio que 255, o tipo de coluna e convertido para TEXT. Este e um recurso de compatibilidade.
486
NATIONAL CHAR (ou em sua forma reduzida NCHAR) e o modo SQL-99 de denir que um campo CHAR deve usar o conjunto CHARACTER padr ao. Este e o padr ao no MySQL. CHAR e uma simplica c ao para CHARACTER. A partir da vers ao 4.1.0, o atributo ASCII pode ser especicado o que atribui o conjunto de caracteres latin1 a coluna CHAR. A partir da vers ao 4.1.1, o atributo UNICODE pode ser especicado o que atribui o conjunto de caracteres ucs2 a coluna CHAR. O MySQL lhe permite criar um campo do tipo CHAR(0).Isto e muito u til quando voc e precisa de comptibilidade com aplicativos antigos que dependem da exist encia de uma coluna, mas que, na verdade, n ao utiliza um valor. Isto tamb em e muito bom quando voc e precisa de uma coluna que s o pode receber 2 valores. Um CHAR(0), que n ao e denido como um NOT NULL, s o ir a ocupar um bit e pode assumir 2 valores: NULL or "". Veja Se c ao 6.2.3.1 [CHAR], P agina 497. BIT BOOL CHAR This is a synonym for CHAR(1).
[NATIONAL] VARCHAR(M) [BINARY] Uma string de tamanho vari avel. NOTA: Espa cos extras s ao removidos quando o caracter e armazenado (o que difere da especica c ao ANSI SQL). A faixa de M e de 1 a 255 characters. Valores VARCHAR s ao ordenados e comparados no modo caso insensitivo a menos que a palavra chave BINARY seja utilizada. Veja Se c ao 6.5.3.1 [Silent column changes], P agina 606. A partir da vers ao 4.1.0, se o valor M especicado e maio que 255, o tipo de coluna e convertido para TEXT. Este e um recurso de compatibilidade. VARCHAR e uma simplica c ao para CHARACTER VARYING. Veja Se c ao 6.2.3.1 [CHAR], P agina 497. TINYBLOB TINYTEXT Um campo BLOB ou TEXT com tamanho m aximo de 255 (2^8 - 1) caracteres. Veja Se c ao 6.5.3.1 [Silent column changes], P agina 606. Veja Se c ao 6.2.3.2 [BLOB], P agina 498. BLOB TEXT Um campo BLOB ou TEXT com tamanho m aximo de 65535 (2^16 - 1) caracteres. Veja Se c ao 6.5.3.1 [Silent column changes], P agina 606. Veja Se c ao 6.2.3.2 [BLOB], P agina 498. MEDIUMBLOB MEDIUMTEXT Um campo BLOB ou TEXT com tamanho m aximo de 16777215 (2^24 - 1) caracteres. Veja Se c ao 6.5.3.1 [Silent column changes], P agina 606. Veja Se c ao 6.2.3.2 [BLOB], P agina 498.
487
LONGBLOB LONGTEXT Um campo BLOB ou TEXT com tamanho m aximo de 4294967295 ou 4G (2^32 - 1) caracteres. Veja Se c ao 6.5.3.1 [Silent column changes], P agina 606. Veja Se c ao 6.2.3.2 [BLOB], P agina 498. At e a vers ao 3.23 o protocolo cliente/servidor e tabelas MyISAM tinham um limite de 16M por pacote de transmiss ao/registro de tabela, a partir da vers ao 4.x o tamanho m aximo permitido das colunas LONGTEXT ou LONGBLOB depende do tamanho m aximo congurado para o pacote no protocolo cliente/servidor e da mem oria dispon ivel. Veja Se c ao 6.2.3.2 [BLOB], P agina 498. ENUM(valor1,valor2,...) Uma enumera c ao. Um objeto string que s o pode ter um valor, selecionado da lista de valores valor1, valor2, ..., NULL ou valor especial de erro "". Um ENUM pode ter um m aximo de 65535 valores diferentes. Veja Se c ao 6.2.3.3 [ENUM], P agina 499. SET(valor1,valor2,...) Um conjunto. Um objeto string que pode ter zero ou mais valores, cada um deve ser selecionado da lista de valores valor1, valor2, .... Um SET pode ter at e 64 membros. Veja Se c ao 6.2.3.4 [SET], P agina 500.
488
Valores DECIMAL e NUMERIC s ao armazenados como strings, ao inv es de um n umero de pontoutuante bin ario, para preservar o precis ao decimal destes valores. Um caracter e usado para cada digito, para o ponto decimal (se escala > 0), e para o sinal - (para n umeros negativos). Se escala e 0, valores DECIMAL e NUMERIC n ao cont em ponto decimal ou parte fracion aria. A faixa m axima dos valores DECIMAL e NUMERIC e o mesmo do DOUBLE, mas a faixa real para um campo DECIMAL or NUMERIC pode ser limitado pela precis~ ao ou pela escala para uma dada coluna. Quando e atribu ido a uma coluna um valor com mais digitos ap os o ponto decimal do que o permitido especicado na escala, o valor e arredondado para aquela escala. Quando e atribuido um valor a uma coluna DECIMAL ou NUMERIC o qual excede a faixa determinada pelas precis~ ao e escala especicada (ou padr ao), MySQL armazena o valor correspondente ao nal daquela faixa. Como uma extens ao do padr ao ANSI/ISO SQL92, MySQL tamb em suporta os tipos integrais TINYINT, MEDIUMINT, e BIGINT como listado nas tabelas abaixo. Outra extens ao suportada pelo MySQL e especicar, opcionalmente, o tamanho do display de um valor inteiro entre parenteses seguindo o nome do tipo (por exemplo, INT(4)). Esta especica c ao opcional do tamanho e usada para preenchimento a esquerda do display de valores cujo tamanho e menor que o especicado para a coluna, mas n ao limita a faixa de valores que podem ser armazendos na coluna, nem o n umero de d igitos que ser ao mostrados para valores que excederem o tamanho especicado na coluna. Quando usados em conjunto com o atributo opcional de extens ao ZEROFILL, o padr ao do preenchimento de espa cos e a substitui c ao por zeros. Por exemplo, para uma coluna declarada com INT(5) ZEROFILL, o valor 4 e retornado como 00004. Note que se voc e armazenar valores maiores que a largura do display em um coluna do tipo inteiro, voc e pode ter problemas quando o MySQL gerar tabelas tempor arias para algum join complicado, j a que nestes casos o MySQL acredita que os dados cabem na largura original da coluna. Todos os tipos inteiros podem ter um atributo opcional (n ao-padr ao) UNSIGNED. Valores sem sinal podem ser usados quando voc e permite apenas n umeros positivos em uma coluna e voc e precisa de uma faixa de valores um pouco maior para a coluna. Desde o MySQL 4.0.2, tipos de ponto utuante tamb em podem ser sem sinal (UNSIGNED). Como no tipos inteiros, este atributoprevine que valores negativos sejam armazenados na coluna. Ao contr ario dos tipos negativos, o valor m aximo da faixa permitida permanece o mesmo. O tipo FLOAT e usado para representar tipos de dados num ericos aproximados. O padr ao SQL-92 permite uma especica c ao opcional da precis ao (mas n ao da faixa do expoente) em bits, ap os a a palavra FLOAT e entre parenteses. A implementa c ao MySQL tamb em suporta esta especica c ao opcional de precis ao. Quando FLOAT e usada para uma tipo de coluna sem especica c ao de precis ao, MySQL utiliza quatro bytes para armazenar os valores. Uma sintaxe variante tamb em e suportada, com dois numeros entre parenteses ap os a palavra FLOAT. Com esta op c ao, o primeiro n umero continua a representar a quantidade de bytes necess aria para armazenar o valor, e o segundo n umero especica o n umero de d igitos a serem armazenados e mostrados ap os o ponto decimal (como com DECIMAL e NUMERIC). Quando e pedido ao MySQL para armazenar um n umero em uma coluna com mais digitos decimais ap os o ponto decimal que o especicado para esta coluna, o valor e arredondado eliminando os digitos extras quando armazenado.
489
Os tipos REAL e DOUBLE PRECISION n ao aceitam especica c oes de precis ao. Como uma extens ao do padr ao SQL-92, o MySQL reconhece DOUBLE como um sin onimo para o tipo DOUBLE PRECISION. Em constraste com a exigencia do padr ao de que a precis ao do tipo REAL seja menor que aquele usado pelo DOUBLE PRECISION, MySQL implementa ambos como valores de ponto utuante de 8 bits de dupla precis ao (quando n ao estiver executando em modo ANSI). Para uma portabilidade m axima, c odigos que requerem armazenamento de valores de dados num ericos aproximados usam FLOAT ou DOUBLE PRECISION sem especica c ao de precis ao ou de numeros decimais. Quando solicitado a armazenar um valor em uma coluna num erica que est a fora da faixa permitida pelo tipo da coluna, o MySQL ajusta o valor ao limite da faixa permitida mais apropriado e armazena este valor. Por exemplo, a faixa de uma coluna INT e de -2147483648 a 2147483647. Se voc e tentar inserir -9999999999 em uma coluna INT, o valor e ajustado para o limite mais baixo da faixa de valores e -2147483648 e armazenado. Da mesma forma, se voc e tentar inserir 9999999999, 2147483647 ser a armazenado. Se o campo INT e UNSIGNED, o tamanho da faixa do campo e o mesmo mas o limite passa a ser de 0 a 4294967295. Se voc e tentar armazenar -9999999999 e 9999999999, os valores armazenados na coluna ser ao 0 e 4294967296. Convers oes que ocorrem devido a ajustes s ao relatados como avisos para ALTER TABLE, LOAD DATA INFILE, UPDATE, e instru c oes INSERT multi-registros. Tipo Bytes De At e TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807
490
exemplo, quando voc e especica um valor a ser atribuido ou comparado a um tipo de data ou hora). No entanto, s o os formatos descritos na se c ao seguinte s ao suportados. E esperado que voc e forne ca valores permitidos. Resultados imprevisiveis podem ocorrer se voc e usar outros formatos. Embora o MySQL tente interpretar valores em diversos formatos, ele sempre espera que a parte da data referente ao ano esteja mais a esquerda do valor. Datas devem ser dadas na ordem ano-m es-dia (por exemplo, 98-09-04), ao inv es das ordens mais usadas m es-dia-ano ou dia-m es-ano (por exemplo: 09-04-98, 04-09-98). MySQL converte automaticamente um tipo de data ou hora em um n umero se o valor e usado em um contexto num erico, e vice-versa. Quando o MySQL encontra um valor para um tipo de data ou hora que est a fora da faixa permitida ou e ilegal neste tipo (veja o inicio desta se c ao), ele converte o valor para zero. (A exce c ao ocorre no campo TIME, onde o valor fora da faixa e ajustado para o valor limite apropriado na faixa de valores deste tipo.) A tabela abaixo mostra o formato do valor zero para cada tipo: Tipo de Valor Zero Coluna DATETIME 0000-00-00 00:00:00 DATE 0000-00-00 TIMESTAMP 00000000000000 (tamanho depende do tamanho do display) TIME 00:00:00 YEAR 0000 Os valores zero s ao especiais, mas voc e pode armazenar ou fazer refer encia a eles explicitamente usando os valores mostrados na tabela. Voc e tamb em pode fazer into usando 0 ou 0, o que e mais f acil de escrever. Valores zero para data ou hora usados em MyODBC s ao convertidos automaticamente para NULL na vers ao 2.50.12 MyODBC e acima, porque ODBC n ao pode tratar tais valores.
491
Note temb em que algumas fun c oes com MIN() e MAX() ir ao converter TIMESTAMP/DATE para um n umero. Isto signica que um timestamp com ano de 2 digitos n ao ir a funcionar corretamente com estas fun c oes. A solu c ao neste caso e converter o TIMESTAMP/DATE para um formato de ano de 4 digitos ou usar algo como MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS)).
492
Outras colunas TIMESTAMP, al em da primeira podem ser denidas com a data e hora atuais. Basta deni-las com NULL ou NOW() Voc e pode denir colunas TIMESTAMP com um valor diferente da data e hora atuais colocando explicitamente o valor desejado. Isto e verdade mesmo para a primeira coluna TIMESTAMP. Voc e pode usar esta propriedade se, por exemplo, voc e quiser que um TIMESTAMP tenha seu valor denido como a data e hora atuais na cria c ao de registros, mas n ao quer alter a-los quando o registro for atualizado mais tarde: Deixe o MySQL denir a coluna quando o registro e criado. Isto ir a inicializa-la com a data e hora atuais. Quando voc e realizar subsequentes atualiza c oes em outras colunas do registro, dena explicitamente a coluna TIMESTAMP com o valor atual. Por outro lado, voc e pode achar que e mais f acil usar uma coluan DATETIME que voc e inicializa com NOW() quando o registro for criado e deixa como est a em atualiza c oes subsequentes.
493
Todas as colunas TIMESTAMP tem o mesmo tamanho de armazenamento, independente do tamanho de display. Os tamanhos de display mais comuns s ao 6, 8, 12, e 14. Voc e pode especicar um tamanho de display arbitrario na hora da cria c ao da tabela, mas valores de 0 ou maiores que 14 s ao mudados para 14. Valores impares de tamanho na faixa de 1 a 13 s ao mudados para o maior n umero par mais pr oximo. Nota: Na vers ao 4.1, TIMESTAMP e retornado com uma string com o formato YYYY-MM-DD HH:MM:SS, e timestamp de diferentes tamamnhos n ao s ao mais suportados. Voc e pode especicar calores DATETIME, DATE e TIMESTAMP usando qualquer conjunto de formatos comum: Como uma string nos formatos YYYY-MM-DD HH:MM:SS ou YY-MM-DD HH:MM:SS. Uma sintaxe relaxada e permitidanenhum caracter de pontua c ao pode ser usado como um delimitador entre parte de data ou hora. Por exemplo, 98-12-31 11:30:45, 98.12.31 11+30+45, 98/12/31 11*30*45, e 98@12@31 11^30^45 s ao equivalentes. Como uma string nos formatos YYYY-MM-DD ou YY-MM-DD. Uma sintaxe relaxada e permitida aqui tamb em. Por exemplo, 98-12-31, 98.12.31, 98/12/31, e 98@12@31 s ao equivalentes. Como uma string sem delimitadores nos formatos YYYYMMDDHHMMSS ou YYMMDDHHMMSS, desde que a string fa ca sentido como data. Por example, 19970523091528 e 970523091528 s ao interpretadas com 1997-05-23 09:15:28, mas 971122129015 e ilegal (tem uma parte de minutos sem sentido) e se torna 0000-00-00 00:00:00. Como uma string sem delimitadores nos formatos YYYYMMDD ou YYMMDD, desde que a string tenha sentido com data. Por exemplo, 19970523 e 970523 s ao interpretedas como 1997-05-23, mas 971332 e ilegal (tem uma parte de m es sem sentido) e se torna 0000-00-00. Como um n umero nos formatos YYYYMMDDHHMMSS ou YYMMDDHHMMSS, desde que o n umero fa ca sentido como uma data. Por exemplo, 19830905132800 e 830905132800 s ao interpretedos como 1983-09-05 13:28:00. Como um n umero nos formatos YYYYMMDD ou YYMMDD, desde que o n umero fa ca sentido como data. Por exemplo, 19830905 e 830905 s ao interpretedos como 1983-09-05. Como o resultado de uma fun c ao que retorne uma valor aceitavel em um contexto DATETIME, DATE ou TIMESTAMP, tal como NOW() ou CURRENT_DATE. Valores DATETIME, DATE, ou TIMESTAMP ilegais s ao convertidos para o valor zero do tipo apropriado (0000-00-00 00:00:00, 0000-00-00, ou 00000000000000). Para valores especicados com strings que incluem delimitadores de data, n ao e necess ario especicar dois digitos para valores de m es ou dia qua s ao menores que 10. 1979-6-9 e o mesmo que 1979-06-09. Similarmente, para valores especicados como strings que incluem delimitadores de hora, n ao e necess ario especicar dois digitos para valores de hora, minutos ou segundo que s ao menores que 10. 1979-10-30 1:2:3 R e o mesmo que 1979-10-30 01:02:03. Valores especicados como n umeros devem ter 6, 8, 12, ou 14 digitos. Se o n umero e de 8 ou 14 digitos, ele assume estar no formato YYYYMMDD ou YYYYMMDDHHMMSS e que o ano e dado pelos 4 primeiros d igitos. Se o e de 6 ou 12 d igitos, ele assume estar no formato
494
YYMMDD or YYMMDDHHMMSS e que o ano e dado pelos 2 primeiros digitos. N umeros que n ao possua estes tamanho s ao interpretados como calores preenchidos com zero at e o tamanho mais pr oximo. Valores especicados como strings n ao delimitadas s ao interpretados usando o seu tamanho como dado. Se a string possui 8 ou 14 caracteres, o ano e assumido como os 4 primeiros caracteres. De outra forma o assume-se que o ano s ao os 2 primeiros caracteres. A string e interpretadada esquerda para direita para encontrar os valores do ano, m es, dia, hora, minute e segundo, para as partes da string. Isto signica que voc e n ao deve utilizar strings com menos de 6 caracteres. Por exemplo, se voc e especicar 9903, pensando em representar Mar co de 1999, voc e perceber a que o MySQL insere uma data zero em sua tabela. Isto ocorre porque os valores do ano e m es s ao 99 e 03, mas a parte contendo o dia n ao existe (zero), ent ao o valor n ao e uma data legal. No entanto, a partir do MySQL 3.23, voc e pode especicar explicitamente um valor de zero para representar dia ou m es faltantes. Por exemplo, voc e pode usar 990300 para inserir o valor 1999-03-00. Colunas TIMESTAMP armazena valores legais utilizando precis ao total com a qual os valores foram especicados, independente do tamanho do display. Isto tem diversas implica c oes: Sempre especique o ano, m es e dia, mesmo se seus tipos de coluna s ao TIMESTAMP(4) ou TIMESTAMP(2). De outra forma, os valores n ao ser ao datas legais date e um 0 ser a armazenado. Se voc e usa ALTER TABLE para aumentar uma coluna TIMESTAMP, informa c oes ser ao mostradas como se antes estivessem escondidas. De forma similar, reduzindo o tamanho de uma coluna TIMESTAMP n ao causa perda de informa c ao, exceto no sentido de que menos informa c ao aparece quando os valores s ao mostrados. Embora os valores TIMESTAMP sejam armazenados com precis ao total, a u nica fun c ao que opera diretamente com o valor armazenado e UNIX_TIMESTAMP(). OUtras fun c oes operam com o formato do valor recuperado Isto signica que n ao se pode usar fun c oes como HOUR() or SECOND() a menos que a parte relevante do valor TIMESTAMP esteja inclu ido no valor formatado. POr exemplo, a parte HH de uma coluna TIMESTAMP n ao e mostrada a menos que o tamanho do display seja de pelo menos 10, logo tentar usar HOUR() em um valor TIMESTAMP menor produz um resultado sem signicado. Voc e pode, algumas vezes, atribuir valores de um tipo de data para um objeto de um diferente tipo de data. No entanto pode haver algumas altera c oes de valores ou perda de informa c ao Se voc e atribuir um valor de DATE value a um objeto DATETIME ou TIMESTAMP, a parte da hora do valor resultante e denido como 00:00:00, porque o vlaor DATE n ao cont em informa c oes de hora. Se voc e atribuir um valor DATETIME ou TIMESTAMP para um objeto DATE, a parte da hora do valor resultante e deletado, pois o tipo DATE n ao armazena informa c oes de hora. Lembre-se de que embora todos os valores DATETIME, DATE, e TIMESTAMP possam ser especicados usando o mesmo conjunto de formatos, os tipos n ao tem a mesa faixa de valores. Por exemplo, valores TIMESTAMP n ao podem ser anteriores a 1970 ou posteriores a 2037. Isto signicia que datas como 1968-01-01, s ao permitidas como valores
495
DATETIME ou DATE, mas n ao s ao v alidas para valores TIMESTAMP e ser ao covertidas para 0 se atribuidas para tais objetos. Esteja ciente de certas diculdades quando especicar valores de data: A forma relaxada permitida em valores especicados com strings podem causar certas confus oes. Por exemplo, um valor como 10:11:12 pode parecer com um valor de hora devido ao limitador :, mas se usado em um contexto de data ser a interpretado como o ano 2010-11-12. O valor 10:45:15 ser a convertido para 0000-00-00 pois 45 n ao e um valor de m es permitido. O servidor MySQL funciona basicamente checando a validade da data: dias entre 0031, m es entre 00-12, anos entre 1000-9999. Qualquer data que n ao esteja nesta faixa ser a revetida para 0000-00-00. Por favor, note que isto ainda lhe permite armazenar datas invalidas tais como 2002-04-31. Isto permite a aplica c oes web armazenar dados de um formul ario sem verica c oes adicionais. Para assegurar que a data e valida, fa ca a checagem em sua aplica c ao. Valores de anos especicados com 2 digitos s ao amb iguos, pois o s eculo n ao e conhecido. MySQL interpreta valores de anos com dois digitos usando as seguintes regras: Valores de ano na faixa de 00-69 s ao convertidos para 2000-2069. Valores de ano na faixa de 70-99 s ao convertidos para 1970-1999.
496
Para valores TIME especicados como uma string que incluem delimitadores de hora, n ao e necess ario especicar dois d igitos para valores de hora, minutos ou segundos que sejam menores que 10. 8:3:2 e o mesmo que 08:03:02. Seja cuidadoso ao atribuir valores TIME pequenos para uma coluna TIME. Sem dois pontos, o MySQL interprete valores assumindo que os digitos mais a direita representam segundos. (MySQL interpreta valores TIME como tempo decorrido ao inv es de hora do dia.) Por exemplo, voc e poderia pensar em 1112 e 1112 signicam 11:12:00 (11 horas e 12 minutos), mas o MySQL o intepreta como 00:11:12 (onze minutos e 12 segundos). De forma similar, 12 e 12 s ao interpretados como 00:00:12. Valores TIME com dois pontos, em contrapartida, s ao tratados como hora do dia. Isto e, 11:12 signicar a 11:12:00, n ao 00:11:12. Valores que s ao legais mas que est ao fora da faixa permitidas s ao ajustados para o valor limita da faixa mais apropriado. Por exemplo, -850:00:00 e 850:00:00 s ao convertidos para -838:59:59 e 838:59:59, respectivmente. Valores TIME ilegais s ao convertidos para 00:00:00. Note que como 00:00:00 e um valor TIME, n ao temos com dizer, a partir de um valor 00:00:00 armazenado na tabela, se o valor original armazenado foi especicado como 00:00:00 ou se foi ilegal.
497
Os valores recuperados para as colunas CHAR(4) e VARCHAR(4) ser ao os mesmos em cada caso, j a que espa cos ectras s ao removidos das colunas CHAR quando recuperados. Valores nas colunas CHAR e VARCHAR s ao ordenados e comparadaos no modo caso-insensitivo, a menos que o atributo BINARY seja especicado quando a tabela for criada. O atributo BINARY signica que os valores das colunas s ao ordenados e comparados no modo casosensitivo de acordo com a ordem ASCII da maquina onde o servidor MySQL est a sesndo executado. BINARY n ao afeta como as colunas s ao armazenadas e recuperadas. A partir da vers ao 4.1.0, o tipo de coluna CHAR BYTE e um alias para CHAR BINARY. Thite e um recurso para compatibilidade. O atributo BINARY e pegajoso. Isto signica que se uma coluna denida com BINARY e usada na express ao, toda a express ao e comparada como um valor BINARY. MySQL pode alterar sem aviso o tipo de uma coluna CHAR ou VARCHAR na hora de criar a tabela. Veja Se c ao 6.5.3.1 [Silent column changes], P agina 606.
498
499
Note que cada valor BLOB ou TEXT e representado internamente por um objeto alocado searadamente. Est a e uma diferen ca com todos os outros tipos de colunas, para o qual o armazenamento e alocado um por coluna quando a tabela e aberta.
Uma enumera c ao pode ter um m aximo de 65535 elementos. A partir da vers ao 3.23.51 espa cos extras s ao automaticamente deletados dos valores ENUM quando a tabela e criada. O caso da letra e irrelevante quando voc e atribui valores a um coluna ENUM. No entanto, valores recuperados posteriormente da coluna ter a o caso de letras de acordo com os valores que foram usados para especicar os valores permitidos na cria c ao da tabela. Se voc e recupera um ENUM em um contexto num erico, o indice do valor da coluna e retornado. Por exemplo, voc e pode recuperar valores num ericos de uma coluna ENUM desta forma: mysql> SELECT col_enum+0 FROM nome_tabela;
500
Se voc e armazena um n umero em um ENUM, o n umero e tratado como um indice, e o valor armazenado e o membro da enumera c ao com este indice. (No entanto, este n ao ir a funcionar com LOAD DATA, o qual trata todas as entradas como strings.) N ao e aconselh avel armazenar n umeros em uma string ENUM pois pode tornar as coisas um pouco confusas. Valores ENUM s ao armazenados de acordo com a ordem na qual os membros da enumera c ao foram listados na especica c ao da coluna. (Em outras palavras, valores ENUM s ao ordenados de acordo com o seus n umeros de indice.) Por exemplo, "a" vem antes de "b" para ENUM("a", "b"), mas "b" vem antes de "a" para ENUM("b", "a"). A string vazia vem antes de strings n ao-vazias, e valores NULL vem antes de todos os outros valores de enumera c ao. Para evitar resultados inesperados, especique a lista ENUM em ordem alfab etica. Voc e tamb em pode usar GROUP BY CONCAT(col) para ter certeza de que as colunas est ao ordenadas alfabeticamente e n ao pelo indice num erico. Se voc e quiser obter todos os valores possiveis para uma coluna ENUM, voc e deve usar: SHOW COLUMNS FROM nome_tabela LIKE nome_coluna_enum e analizar a deni c ao de ENUM na segunda coluna.
501
b c d
2 4 8
Se voc e atribuir um valor 9 a esta coluna, que e 1001 em bin ario, o primeiro e o quarto valores membros do SET "a" e "d" s ao selecionados e o valor resultante e "a,d". Para um valor contendo mais que um elemento de SET, n ao importa em qual ordem os elementos s ao listados quando foram inseridos seus valores. Tamb em n ao importa quantas vezes um dado elemento e listado no valor. Quando o valor e recuperado posteriormente, cada elemento aparecer a uma vez, listados de acordo com a ordem em que eles foram especicados na cri c ao da tabela. Por exemplo, se uma coluna e especicada como SET("a","b","c","d"), ent ao "a,d", "d,a" e "d,a,a,d,d" ir ao todos aparecer como "a,d" quando recuperados. Se voc e dene um valor que n ao e suportado pela coluna SET, o valor ser a ignorado. Valores SET s ao ordenados num ericamente. Valores NULL v em antes de valores SET n ao NULL. Normalmente, voc e realiza um SELECT em uma coluna SET usando o operador LIKE ou a fun c ao FIND_IN_SET(): mysql> SELECT * FROM nome_tabela WHERE col_set LIKE %valor%; mysql> SELECT * FROM nome_tabela WHERE FIND_IN_SET(valor,col_set)>0; Mas o seguinte tamb em funciona: mysql> SELECT * FROM nome_tabela 2 WHERE col_set = val1,val2; mysql> SELECT * FROM nome_tabela 3 WHERE col_set & 1; A primeira desta instru c oes procura por uma correpondencia exata. A segunda por valores contendo o primeiro membro. Se voc e quer obter todos os valores poss iveis para uma coluna SET, voc e deve usar: SHOW COLUMNS FROM nome_tabela LIKE nome_coluna_set e analizar a deni c ao do SET na segunda coluna.
502
O mapeamento do tipo de campo ocorre na cria c ao da tabela. Se voc e cria uma tabela com tipos usador por outras empresas e ent ao executa uma instru c ao DESCRIBE nome_tabela, MySQL relaciona a estrutura de tabela utilizando os tipos equivalentes do MySQL.
503
504
505
s ao convertidas automaticamente para n umeros e n umeros para strings quando necess ario (como em Perl). MySQL realiza compara c oes de acordo com as seguintes regras: Se um ou ambos os argumentos s ao NULL, o resultado da compara c ao e NULL, exceto para o operador <=>. Se ambos os argumentos em uma compara ca o s ao strings, eles s ao comparados como strings. Se ambos os argumentos s ao inteiros, eles s ao comparados como inteiros. Valores hexadecimais s ao tratados como strings bin arias se n ao comparadas a um n umero. Se uma dos argumentos e uma coluna TIMESTAMP ou DATETIME e o outro argumento e uma constante, a constante e convertida para um timestamp antes da compara c ao ser realizada. Isto ocorre para ser mais amig avel ao ODBC. Em todos os outros casos, os argumentos s ao coparados como n umeros de ponto utuante (real). Por padr ao, compara c oes de string s ao feita de modo independente do caso, usando o conjunto de caracteres atual (ISO-8859-1 Latin1 por padr ao, o qual tamb em funciona de forma excelente para o Ingl es). Se voc e est a comparando strings em caso insensitivo com qualquer dos operadores padr oes (=, <>..., mas n ao o LIKE) espa cos em branco no m da string (espa cos, tabs e quebra de linha) ser ao ignorados. mysql> SELECT "a" ="A \n"; -> 1 Os seguintes exemplos ilustram a convers ao de strings para n umeros para opera c oes de compara c ao: mysql> SELECT -> 0 mysql> SELECT -> 1 mysql> SELECT -> 0 mysql> SELECT -> 1 1 > 6x; 7 > 6x; 0 > x6; 0 = x6;
Note que quando voc e est a comparando uma coluna string com um n umero, o MySQL n ao pode usar indices para encontrar o valor rapidamente: SELECT * FROM table_name WHERE string_key=1 A raz ao para isto e que existem muitas strings diferentes que podem retornar o valor 1: "1", " 1", "1a" ... = Igual: mysql> SELECT 1 = 0; -> 0 mysql> SELECT 0 = 0;
506
-> 1 mysql> SELECT 0.0 = 0; -> 1 mysql> SELECT 0.01 = 0; -> 0 mysql> SELECT .01 = 0.01; -> 1 <> != Diferente: mysql> SELECT .01 <> 0.01; -> 1 mysql> SELECT .01 <> 0.01; -> 0 mysql> SELECT zapp <> zappp; -> 1 <= Menor que ou igual: mysql> SELECT 0.1 <= 2; -> 1 < Menor que: mysql> SELECT 2 < 2; -> 0 >= Maior que ou igual: mysql> SELECT 2 >= 2; -> 1 > Maior que: mysql> SELECT 2 > 2; -> 0 <=> Igual para NULL: mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1 1 0 IS NULL IS NOT NULL Teste para saber se um valor e ou n ao NULL: mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL; -> 0 0 1 mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1 1 0 Para estar apto a funcionar bem com outros programas, MySQL suporta os seguintes recursos extras quando utiliza-se IS NULL: Voc e pode encontrar o u ltimo registro inserido com: SELECT * FROM nome_tabela WHERE auto_col IS NULL
507
Isto pode ser desabilitado congurando SQL_AUTO_IS_NULL=0. Veja Se c ao 5.5.6 [SET OPTION], P agina 461. Para colunas DATE e DATETIME NOT NULL voc e pode encontrar a data especial 0000-00-00 utilizando: SELECT * FROM nome_tabela WHERE coluna_data IS NULL Isto e necess ario para que algums aplica c oes ODBC funcionem (j a que ODBC n ao tem suporte a data 0000-00-00) expr BETWEEN min AND max Se expr e maior que ou igual a min e expr e menor que ou igual a max, BETWEEN retorna 1, sen ao e retornado 0. Isto e equivalente a express ao (min <= expr AND expr <= max) se todos os argumentos s ao do mesmo tipo. Sen ao os tipos s ao convertidos, conforme as regras acima, e aplicadas a todos os tr es argumentos. Note que antes da vers ao 4.0.5 argumentos eram convertidos para o tipo da expr. mysql> SELECT 1 BETWEEN 2 AND 3; -> 0 mysql> SELECT b BETWEEN a AND c; -> 1 mysql> SELECT 2 BETWEEN 2 AND 3; -> 1 mysql> SELECT 2 BETWEEN 2 AND x-3; -> 0 expr NOT BETWEEN min AND max O mesmo que NOT (expr BETWEEN min AND max). expr IN (valor,...) Retorna 1 se expr e qualquer dos valores na lista IN, sen ao retorna 0. Se todos os valores s ao constantes, ent ao os valores s ao avaliados de acordo com o tipo da expr e ordenado. A busca do item e ent ao feita usando pesquisa bin aria. Isto signica que IN e muito r apido se os valores da lista IN forem todos contantes. Se expr e uma express ao strig em caso-sensitivo, a compara c ao e realizadas no modo caso-sensitvo: mysql> SELECT 2 IN (0,3,5,wefwf); -> 0 mysql> SELECT wefwf IN (0,3,5,wefwf); -> 1 O n umero de valores na lista IN e limitada apenas pelo valor max_allowed_ packet. Na vers ao 4.1 (para se adequar ao padr ao SQL-99), IN returna NULL n ao apeans se a express ao a sua esquerda e NULL, mas tamb em se nenhuma correspond encia e encontrada na lista e uma de suas express oes e NULL. A partir do MySQL vers ao 4.1, uma cl ausula IN() tamb em pode conter uma subquery. Veja Se c ao 6.4.2.3 [ANY IN SOME subqueries], P agina 571. expr NOT IN (valor,...) O mesmo que NOT (expr IN (valor,...)).
508
ISNULL(expr) Se expr e NULL, ISNULL() retorna 1, sen ao retorna 0: mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1 Note que a compra c ao de valores NULL usando = sempre ser a falso! COALESCE(lista) Retorna o primeiro elemento n ao NULL na lista: mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL INTERVAL(N,N1,N2,N3,...) Retorna 0 se N < N1, 1 se N < N2 e assim por diante ou -1 se N e NULL. Todos os argumentos s ao tratados como inteiros. Isto exige que N1 < N2 < N3 < ... < Nn para que esta fun c ao funcione corretamente. Isto ocorre devido a utiliza c ao pesquisa bin aria (muito r apida): mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); -> 3 mysql> SELECT INTERVAL(10, 1, 10, 100, 1000); -> 2 mysql> SELECT INTERVAL(22, 23, 30, 44, 200); -> 0
509
Ou ltimo exemplo produz 1 pois a a express ao e avaliada como (!1)+1. AND && AND l ogico. Avalia como 1 se todos os operandos s ao diferentes de zero e n ao e NULL, como 0 se um ou mais operandos s ao 0, sen ao retorna NULL. mysql> SELECT 1 && 1; -> 1 mysql> SELECT 1 && 0; -> 0 mysql> SELECT 1 && NULL; -> NULL mysql> SELECT 0 && NULL; -> 0 mysql> SELECT NULL && 0; -> 0 Por favor note que as vers oes do MySQL anteriores a vers ao 4.0.5 param a avalia c ao quando um valor NULL e encontrado, e n ao continua o processo buscando por poss iveis 0s. Isto signica que nessa vers ao, SELECT (NULL AND 0) retorna NULL ao inv es de 0. Na vers ao 4.0.5 o c odigo tem sido re-elaborado para que o resultado sempre seja como prescrito pelo padr ao SQL utilizando a otimiza c ao sempre que poss ivel. OR l ogico. Avalia como 1 se algum operando e diferente de zero e como NULL se algum operando for NULL, sen ao 0 e retornado. mysql> SELECT 1 || 1; -> 1 mysql> SELECT 1 || 0; -> 1 mysql> SELECT 0 || 0; -> 0 mysql> SELECT 0 || NULL; -> NULL mysql> SELECT 1 || NULL; -> 1 XOR l ogico. Retorna NULL se o operando tamb em e NULL. Para operandos n ao NULL, avalia como 1 se um n umero impar de operandos e diferente de zero, sen ao 0 e retornado. mysql> SELECT 1 XOR 1; -> 0 mysql> SELECT 1 XOR 0; -> 1 mysql> SELECT 1 XOR NULL; -> NULL mysql> SELECT 1 XOR 1 XOR 1; -> 1 a XOR b e matematicamente igual a (a AND (NOT b)) OR ((NOT a) and b).
OR ||
XOR
510
511
esperava. No segundo caso, a compara c ao testa se o valor de ponto utuante n ao e zero. O resultado da compara c ao converte o termo em um interiro. O tipo de retorno padr ao de IF() (o que pode importar quando ele e armazenado em uma tabela tempor aria) e calculado na vers ao 3.23 do MySQL de seguinte forma: Express ao expr2 ou expr3 retorna string expr2 ou expr3 retorna um valor de ponto utuante expr2 ou expr3 retorna um inteiro Valor de retorno string ponto utuante inteiro
Se expr2 e expr3 s ao strings, ent ao o resultado e caso-insensitivo se ambas strings s ao caso insensitivo. (A patir da vers ao 3.23.51) IFNULL(expr1,expr2) Se expr1 n ao e NULL, IFNULL() retorna expr1, sen ao retorna expr2. IFNULL() retorna um valor num erico ou string, dependendo do contexto no qual e usado: mysql> SELECT IFNULL(1,0); -> 1 mysql> SELECT IFNULL(NULL,10); -> 10 mysql> SELECT IFNULL(1/0,10); -> 10 mysql> SELECT IFNULL(1/0,yes); -> yes Na vers ao 4.0.6 e acima o valor resultante padr ao de IFNULL(expr1,expr2) eo mais geral das duas express oes, na seguinte ordem: STRING, REAL ou INTEGER. A diferen ca das vers oes anteriores e mais not avel quando se cria uma tabela baseada em uma express ao ou o MySQL tem que armazenar internamente um valor de IFNULL() em uma tabela tempor aria. CREATE TABLE foo SELECT IFNULL(1,"teste") as teste; Na vers ao 4.0.6 do MySQL o tipo da coluna teste e CHAR(4) enquanto nas vers oes anteriores ela seria do tipo BIGINT. NULLIF(expr1,expr2) Se expr1 = expr2 for verdadeiro, e retornado NULL sen ao e retornado expr1. Isto e o mesmo que CASE WHEN x = y THEN NULL ELSE x END: mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1 Note que expr1 e avaliada duas vezes no MySQL se os argumentos n ao s ao iguais.
512
BIT_LENGTH(str) Retorna o tamanho da string str em bits: mysql> SELECT BIT_LENGTH(text); -> 32 CHAR(N,...) CHAR() interpretia os argumentos como inteiros e retorna uma string com caracteres dados pelo valor do c odigo ASCII referentes a estes inteiros. Valores NULL s ao desconsiderados: mysql> SELECT CHAR(77,121,83,81,76); -> MySQL mysql> SELECT CHAR(77,77.3,77.3); -> MMM CONCAT(str1,str2,...) Retorna a string resultante da concatena c ao dos argumentos. Retorna NULL se qualquer dos argumentos for NULL. Pode ter mais de 2 argumentos. Um argumento num erico e convertido para sua forma string equivalente: mysql> SELECT CONCAT(My, S, QL); -> MySQL mysql> SELECT CONCAT(My, NULL, QL); -> NULL mysql> SELECT CONCAT(14.3); -> 14.3
513
CONCAT_WS(separador, str1, str2,...) CONCAT_WS() signica CONCAT With Separator (CONCAT com separador) e e uma forma especial do CONCAT(). O primeiro argumento e o separador para os outros argumentos. O separador e adicionado entre as strings a serem concatenadas: O separador pode ser uma string assim como os outros argumentos. Se o separador e NULL, o resultado ser a NULL. A fun c ao ir a desconsiderar qualquer NULL depois do argumento do separador. mysql> SELECT CONCAT_WS(",","First name","Second name","Last Name"); -> First name,Second name,Last Name mysql> SELECT CONCAT_WS(",","First name",NULL,"Last Name"); -> First name,Last Name Antes do MySQL 4.1.1, CONCAT_WS() desconsiderava strings vazias assim como valores NULL. CONV(N,da_base,para_base) Converte n umeros entre diferentes bases. Retorna uma representa c ao string do n umero N, convertido da base da_base para base para_base. Retorna NULL se qualquer argumento e NULL. O argumento N e interpretado como um inteiro, mas pode ser especicado como um inteiro ou uma string. A base m inima e2 e a m axima e 36. Se para_base e um n umero negativo, N e considerado como um n umero com sinal. Caso contr ario, N e tratado como um n umero sem sinal. CONV funciona com precis ao de 64-bit: mysql> SELECT CONV("a",16,2); -> 1010 mysql> SELECT CONV("6E",18,8); -> 172 mysql> SELECT CONV(-17,10,-18); -> -H mysql> SELECT CONV(10+"10"+10+0xa,10,10); -> 40 ELT(N,str1,str2,str3,...) Retorna str1 se N = 1, str2 se N = 2, e assim por diante. Retorna NULL se N e menor que 1 ou maior que o n umero de argumentos. ELT() e o complemento de FIELD(): mysql> SELECT ELT(1, ej, Heja, hej, foo); -> ej mysql> SELECT ELT(4, ej, Heja, hej, foo); -> foo EXPORT_SET(bits,on,off,[separador,[numero_de_bits]]) Retorna uma string onde para todo bit 1 em bit, voc e obt em uma string on e para cada bit 0 voc e obtem uma string o, Cada string e separada com separador (padr ao,,) e s o n umero de bits (padr ao 64) de bits e usado: mysql> SELECT EXPORT_SET(5,S,N,,,4) -> S,N,S,N
514
FIELD(str,str1,str2,str3,...) Retorna o indice de str na lista str1, str2, str3, .... Retorns 0 se str n ao for encontrada. FIELD() e o complemento de ELT(): mysql> SELECT FIELD(ej, Hej, ej, Heja, hej, foo); -> 2 mysql> SELECT FIELD(fo, Hej, ej, Heja, hej, foo); -> 0 FIND_IN_SET(str,strlista) Retorna um valor 1 para N se a string str est a na lista strlist contendo N substrings. A lista de string e composta de substrings separadas pelo caracter ,. Se o primeiro argumento e uma string constante e o segundo e uma coluna do tipo SET, a fun c ao FIND_IN_SET() e otimizada para usar aritm etica bin aria! Retorna 0 se str n ao est a na strlista ou se strlista e uma string vazia. Retorna NULL se os argumentos s ao NULL. Esta fun c ao n ao ir a funcionar adequadamente se o primeiro argumento cont em uma virgula (,): mysql> SELECT FIND_IN_SET(b,a,b,c,d); -> 2 HEX(N_ou_S) Se N OU S e um n umero, e retornado um representa c ao string do valor hexadecimal de N, onde N e um n umero muito grande (BIGINT). Isto e equivalente a CONV(N,10,16). Se N OU S e uma string, e retornado uma string hexadecimal de N OU S onde cada caracter de N OU S e convertido para 2 d igitos hexadecimais. Isto e o inverso da string 0xff. mysql> SELECT HEX(255); -> FF mysql> SELECT HEX("abc"); -> 616263 mysql> SELECT 0x616263; -> "abc" INSTR(str,substr) Retorna a posi c ao da primeira ocorr encia da substring substr na string str. E o mesmo que as o LOCATE() com dois argumentos, exceto pelo fato de que os argumentos est ao tracados: mysql> SELECT INSTR(foobarbar, bar); -> 4 mysql> SELECT INSTR(xbar, foobar); -> 0 Esta fun c ao e multi-byte. Na vers ao 3.23 do MySQL esta fun c ao e caso sensitivo, enquanto na vers ao 4.0 ela s o e caso-sensitivo se os argumentos s ao uma string bin aria. INSERT(str,pos,tam,novastr) Retorna a string str, com a a substring come cando na posi c ao pos e contendo tam caracteres substituida pela string novastr:
515
mysql> SELECT INSERT(Quadratico, 3, 4, Onde); -> QuOndetico Esta fun c ao e multi-byte. LCASE(str) LOWER(str) Retorna a string str com todos caracteres alterados para letra min usculas de acordo com o conjunto de caracteres atual (o padr ao e ISO-8859-1 Latin1): mysql> SELECT LCASE(MYSQL); -> mysql Esta e uma fun c ao multi-byte. LEFT(str,tam) Retorna os tam caracteres mais a esquerda da string str: mysql> SELECT LEFT(foobarbar, 5); -> fooba Esta fun c ao e multi-byte. LOAD_FILE(nome_arquivo) L eb o arquivo e retona o conteudo do arquivo como uma string. O arquivo beve estar no servidor, voc e deve especicar o caminho completo para o arquivo, e voc e deve ter o privil egio FILE. O arquivo deve ser leg ivel para todos e ser menor que o especicado em max_allowed_packet. Se o arquivo n ao existe ou n ao pode ser lido devido a alguma das raz oes acima, a fun c ao retornar a NULL: mysql> UPDATE nome_tabela SET coluna_blob=LOAD_FILE("/tmp/picture") WHERE id=1; Se voc e n ao est a usando a vers ao 3.23 MySQL, voc e tem que fazer a leitura do arquivo dentro do seu aplicativo e criar uma instru c ao INSERT para atualizar o banco de dados com a informa c ao do arquivo. Um modo de se fazer isto, se voc e estiver usando a biblioteca MySQL++, pode ser encontrada em http://www.mysql.com/documentation/mysql++/mysql++-examples.html. LPAD(str,tam,strpreench) Retorna a string str, preenchida a esquerda com a string strpreench para um tamanho de tam caracteres. Se str e maior que tam, o valor retornado e reduzido para tam caracteres. mysql> SELECT LPAD(hi,4,??); -> ??hi LTRIM(str) Retorna a string str com caracteres de espa cos extras iniciais removidos: mysql> SELECT LTRIM( barbar); -> barbar MAKE_SET(bits,str1,str2,...) Retorna um conjunto (uma string contendo substrings separadas por ,) contendo as strings que tem o bit correspondente em bits denido . str1 corre-
516
sponde ao bit 1, str2 ao bit 2, etc. Strings NULL em str1, str2, ... n ao s ao adicionadas ao resultado: mysql> SELECT MAKE_SET(1,a,b,c); -> a mysql> SELECT MAKE_SET(1 | 4,Oi,meu,mundo); -> Oi,mundo mysql> SELECT MAKE_SET(0,a,b,c); -> OCT(N) Retorna uma representa c ao string do valor octal de N, onde N e um n umero muito grande. Isto e equivalente a CONV(N,10,8). Retorna NULL se N e NULL: mysql> SELECT OCT(12); -> 14 ORD(str) Se o caracter mais a esquerda da string str e um caracter multi-byte, e retornado o c odigo para este caracter, calculado a partir dos valores do c odigo ASCII dos seus caracteres contituintes utizando-se a seguinte f ormula: ((primeiro byte do c odigo ASCII)*256+(segundo byte do c odigo ASCII))[*256+terceiro byte do c odigo ASCII...]. Se o caracter mais a esquerda n ao e multi-byte, e retornado o mesmo valor que a fun c ao ASCII() retorna: mysql> SELECT ORD(2); -> 50
LENGTH(str) OCTET_LENGTH(str) CHAR_LENGTH(str) CHARACTER_LENGTH(str) Retorna o tamanho da string str: mysql> SELECT LENGTH(text); -> 4 mysql> SELECT OCTET_LENGTH(text); -> 4 LENGTH() e OCTET_LENGTH() s ao sin onimos e medem o tamanho da length em bytes (octets). Um caracter multi-byte conta e considerado v arios bytes. CHAR_ LENGTH() e CHARACTER_LENGTH() s ao sin onimos e medem o tamanho da string em caracteres. Um caracter multi-byte conta como um u nico caracter. Isto signica que para uma string contendo cinco caracteres de dois bytes, LENGTH() retorna 10, enquanto CHAR_LENGTH() retorna 5. LOCATE(substr,str) POSITION(substr IN str) Retorna a posi c ao da primeira ocorr encia da substring substr na string str. Retorna 0 se substr n ao est a na str: mysql> SELECT LOCATE(bar, foobarbar); -> 4 mysql> SELECT LOCATE(xbar, foobar);
517
-> 0 Esta fun c ao e multi-byte. Na vers ao 3.23 do MySQL esta fun c ao e caso sensitivo, enquanto na vers ao 4.0 ela s o e caso-sensitivo se os argumentos s ao uma string bin aria. LOCATE(substr,str,pos) Retorna a posi c ao da primeira ocorr encia da substring substr na string str, iniciando na posi c ao pos. Retorna 0 se substr n ao est a em str: mysql> SELECT LOCATE(bar, foobarbar,5); -> 7 Esta fun c ao e multi-byte. Na vers ao 3.23 do MySQL esta fun c ao e caso sensitivo, enquanto na vers ao 4.0 ela s o e caso-sensitivo se os argumentos s ao uma string bin aria. QUOTE(str) Coloca uma string entre aspas para produzir um resultado que possa ser usada em uma intru c ao SQL como um valor de dados com o caracter de escape correto. A string e retornada entre aspas simples e cada inst aqncia de aspas simples (), barra invertida (\), ASCII NUL, e Control-Z e precedida por uma barra invertida. Se o argumento e NULL, o valor retornado e a palavra NULL sem aspas simples. A fun c ao QUOTE() foi adicionada na vers ao 4.0.3 do MySQL. mysql> SELECT QUOTE("Dont"); -> Don\t! mysql> SELECT QUOTE(NULL); -> NULL REPEAT(str,cont) Retorna uma string consistindo da string str repetida cont vezes. Se cont <= retornado NULL se str ou cont s 0, e retornado uma string vazia. E ao NULL: mysql> SELECT REPEAT(MySQL, 3); -> MySQLMySQLMySQL REPLACE(str,da_str,para_str) Retorna a string str com todas ocorr encias da string da_str substituida pela string para_str: mysql> SELECT REPLACE(www.mysql.com, w, Ww); -> WwWwWw.mysql.com Esta fun c ao e multi-byte. REVERSE(str) Returns the string str with the order of the characters reversed: mysql> SELECT REVERSE(abc); -> cba Esta fun c ao e multi-byte. RIGHT(str,tem) Retorna os tam caracteres mais a esquerda da string str:
518
mysql> SELECT RIGHT(foobarbar, 4); -> rbar Esta fun c ao e multi-byte. RPAD(str,tam,strpreech) Retorna a string str, preenchida a direita com a string strpreench para um tamanho de tam caracteres. Se str e maior que tam, o valor retornado e reduzido para tam caracteres. mysql> SELECT RPAD(hi,5,?); -> hi??? RTRIM(str) Retourna a string str com caracteres de espa cos extras nais removidos: mysql> SELECT RTRIM(barbar ); -> barbar Esta fun c ao e multi-byte. SOUNDEX(str) Retorna uma string soundex de str. Duas strings que parecidas fon eticamentea devem ter strings soundex iguais. Uma string soundex padr ao possui 4 caracteres, mas a fun c ao SOUNDEX() retorna uma string de tamanho arbitr ario. Voc e posde usar SUBSTRING() no resultado para obter uma string soundex padr ao. Todos os caracteres n ao alfanum ericos s ao ignorados na string dada. Todas caracteres internacionais fora da faixa A-Z s ao tratados como vogais: mysql> SELECT SOUNDEX(Hello); -> H400 mysql> SELECT SOUNDEX(Quadratically); -> Q36324 SPACE(N) Retorna uma string contendo N caracteres de espa co: mysql> SELECT SPACE(6); ->
SUBSTRING(str,pos,tam) SUBSTRING(str FROM pos FOR tam) MID(str,pos,tam) Retorna a substring com tam caracteres da string str, iniciando da posi c ao pos. A forma variante que utiliza FROM e a sintaxe SQL-92: mysql> SELECT SUBSTRING(Quadratically,5,6); -> ratica Esta fun c ao e multi-byte. SUBSTRING(str,pos) SUBSTRING(str FROM pos) Retorna uma substring da string str iniciando na posi c ao pos: mysql> SELECT SUBSTRING(Quadratically,5); -> ratically
519
mysql> SELECT SUBSTRING(foobarbar FROM 4); -> barbar Esta fun c ao e multi-byte. SUBSTRING_INDEX(str,delim,cont) Retorna a substring da string str antes de cont ocorrencias do delimitador delim. Se cont e positivo, tudo a esquerda do delimitador nal (contando a partir da esquerda) e retornado. Se cont e negativo, tudo a direita do delimitador nal (contando a partir da direita) e retornado. mysql> SELECT SUBSTRING_INDEX(www.mysql.com, ., 2); -> www.mysql mysql> SELECT SUBSTRING_INDEX(www.mysql.com, ., -2); -> mysql.com Esta fun c ao e multi-byte. TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) Retorna a string str com todos prexos e/ou suxos remstr removidos. Se nenhum dos especicadores BOTH, LEADING ou TRAILING s ao dados, e considerado BOTH. Se remstr n ao e especicada, espa cos s ao removidos: mysql> SELECT TRIM( bar ); -> bar mysql> SELECT TRIM(LEADING x FROM xxxbarxxx); -> barxxx mysql> SELECT TRIM(BOTH x FROM xxxbarxxx); -> bar mysql> SELECT TRIM(TRAILING xyz FROM barxxyz); -> barx Esta fun c ao e multi-byte. UCASE(str) UPPER(str) Retorna a string str com todos caracteres alterados para letra mai usculas de acordo com o conjunto de caracteres atual (o padr ao e ISO-8859-1 Latin1): mysql> SELECT UCASE(Hej); -> HEJ Esta e uma fun c ao multi-byte.
520
Se uma fun c ao de string tem uma string bin aria como argumento, a string resultante e tamb em um string bin aria. Um n umero convertido para uma string e tratado como um string bin aria. Isto afeta apenas a compara c ao. Normalmente, se qualquer express ao em uma string e caso-sensitivo, a compara c ao e realizada no modo caso sensitivo. expr LIKE pad [ESCAPE car-escape] Correspond encia de padr oes usando uma simples express ao de compara c oes SQL. Retorna 1 (VERDADEIRO) ou 0 (FALSO). Com LIKE voc e pode usar os seguintes meta-caracteres no padrao: Car % _ Descri c ao Corresponde a qualquer n umero de caracteres, at e zero caracteres Corresponde a exatamente um caracter mysql> SELECT David! LIKE David_; -> 1 mysql> SELECT David! LIKE %D%v%; -> 1 Para testar inst ancias literais de um meta caracter, preceda o caracter com o carcter de escape. Se voc e n ao especicar o caracter de ESCAPE, assume-se \: String \% \_ Description Correponde a um caracter % Correponde a um caracter _
mysql> SELECT David! LIKE David\_; -> 0 mysql> SELECT David_ LIKE David\_; -> 1 Para especicar um caracter de escape diferebte, use a cl ausula ESCAPE: mysql> SELECT David_ LIKE David|_ ESCAPE |; -> 1 As seguintes instru c oes mostram que a compara c ao de strings s ao caso-insensitivo, a menos que um dos operandos seja uma string bin aria: mysql> SELECT abc LIKE ABC; -> 1 mysql> SELECT abc LIKE BINARY ABC; -> 0 LIKE e permitido em uma express ao num erica! (Esta e uma extens ao MySQL para o LIKE do SQL-99.) mysql> SELECT 10 LIKE 1%; -> 1 Nota: Como MySQL usa sintaxe de escape do C em strings (por exemplo, \n), voc e deve dobrar qualquer \ que voc e usar em sua string LIKE. Por exemplo, para pesquisar por \n, especique-o como \\n. Para buscar por \, especique-o como \\\\ (as barras invertidas s ao eliminadas uma vez pelo
521
analizador e outra vez quando a correspond encia de padr oes e feita, deixando uma u nicas barra invertida para ser vericada). Note: O LIKE atual n ao e um caracter multi-byte. Compara c aoes s ao feitas caracter por caracter. expr NOT LIKE pad [ESCAPE car-escape] O mesmo que NOT (expr LIKE pad [ESCAPE car-escape]). expr SOUNDS LIKE expr O mesmo que SOUNDEX(expr)=SOUNDEX(expr) (dispon ivel apenas na vers ao 4.1 ou posterior). expr REGEXP pad expr RLIKE pad Realiza a busca de padr oes em uma express a string com base no padr ao pad. O padr ao pode ser uma express ao regular extendida. Veja Ap endice F [Regexp], P agina 1084. Retorna 1 se expr conincide com pad, sen ao retorna 0. RLIKE e um sin onimo para REGEXP, fornecido para compatibilidade com mSQL. Nota: Como MySQL usa a sintaxe de escape do C em strings (por exemplo, \n), voc e deve dobrar qualquer \ que voc e use em sua string REGEXP. Como na vers ao 3.23.4 do MySQL, REGEXP e caso- insensitivo para strings normais (n ao bin arias). mysql> SELECT -> 0 mysql> SELECT -> 1 mysql> SELECT -> 1 mysql> SELECT -> 1 mysql> SELECT -> 1 Monty! REGEXP m%y%%; Monty! REGEXP .*; new*\n*line REGEXP new\\*.\\*line; "a" REGEXP "A", "a" REGEXP BINARY "A"; 0 "a" REGEXP "^[a-d]";
REGEXP e RLIKE usam o conjunto de caracteres atual (ISO-8859-1 Latin1 por padr ao) para decidir o tipo de caracter. expr NOT REGEXP pad expr NOT RLIKE pad O mesmo que NOT (expr REGEXP pad). STRCMP(expr1,expr2) STRCMP() retorna 0 se as string s ao a mesma, -1 se o primeiro argumento e menor que o segundo de acordo com a ordena c ao atual e 1 em caso contr ario: mysql> SELECT STRCMP(texto, texto2); -> -1 mysql> SELECT STRCMP(texto2, texto); -> 1 mysql> SELECT STRCMP(texto, texto); -> 0
522
MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION] ) MATCH ... AGAINST() e usado para busca de textos completos e retorna a relv ancia - similaridade medidad entre o texto nas colunas (col1,col2,...) e a consulta expr. Relev ancia e um n umero de ponto utuante. Relev ancia zero signica que n ao houve nenhuma similaridade. MATCH ... AGAINST() est a dispon ivel na vers ao 3.23.23 ou posterior do MySQL. A extens ao IN BOOLEAN MODE foi adicionada na vers ao 4.0.1, WITH QUERY EXPANSION foi adicionado na vers ao 4.1.1. Para detalhes e exemplos de uso, veja Se c ao 6.8 [Fulltext Search], P agina 618.
Se voc e quiser compara um blob caso-insensitivo voc e pode sempre convert e-lo para letras mai usculas antes de faer a compara c ao: SELECT A LIKE UPPER(col_blobl) FROM nome_tabela; N ao planejamos introduzir em breve coer c ao (casting) entre diferentes conjuntos de caracteres para tornar compar c oes de strings mais ex ivel.
523
mysql> SELECT 3-5; -> -2 * Multiplica c ao: mysql> SELECT 3*5; -> 15 mysql> SELECT 18014398509481984*18014398509481984.0; -> 324518553658426726783156020576256.0 mysql> SELECT 18014398509481984*18014398509481984; -> 0 O resultado da u ltima express ao e incorreta porque o resultado da multiplica c ao de inteiros excede a faixa de 64-bits dos c alculos BIGINT. Divis ao: mysql> SELECT 3/5; -> 0.60 Divis oes por zero produz um resultado NULL: mysql> SELECT 102/(1-1); -> NULL Uma divis ao ser a calculada com aritim etica BIGINT somente se executada em um contexto no qual o resultado e convertido para um interiro!
ABS(X)
SIGN(X)
524
MOD(N,M) %
Modulo (como o operador % em C). Retorna o resto de N dividido por M: mysql> SELECT MOD(234, 10); -> 4 mysql> SELECT 253 % 7; -> 1 mysql> SELECT MOD(29,9); -> 2 mysql> SELECT 29 MOD 9; -> 2 O uso desta fun c ao e seguro com valores BIGINT. O u ltimo exemplo s o funciona no MySQL 4.1 Retorna o maior valor inteiro n ao maior que X: mysql> SELECT FLOOR(1.23); -> 1 mysql> SELECT FLOOR(-1.23); -> -2 Note que o valor retornado e convertido para um BIGINT!
FLOOR(X)
CEILING(X) CEIL(X) Retorna o menor valor inteiro n ao menor que X: mysql> SELECT CEILING(1.23); -> 2 mysql> SELECT CEIL(-1.23); -> -1 O alias CEIL() foi adicionado vers ao 4.0.6. Note que o valor retornado e convertido para um BIGINT! ROUND(X) ROUND(X,D) Retorna o argumeto X, arredondado para o inteiro mais pr oximo. Com dois argumentos o arredandamento e feito para um n umero com D decimais. mysql> SELECT ROUND(-1.23); -> -1 mysql> SELECT ROUND(-1.58); -> -2 mysql> SELECT ROUND(1.58); -> 2 mysql> SELECT ROUND(1.298, 1); -> 1.3 mysql> SELECT ROUND(1.298, 0); -> 1 mysql> SELECT ROUND(23.298, -1); -> 20 Note que o comportamento de ROUND() quando o argumento est a no meio do caminho entre dois inteiros depende da implementa c ao da biblioteca C. Alguns
525
arredondamentos para o n umero mais pr oximo, s ao sempre para baixo, para cima ou s ao zero. Se voc e precisa de um tipo de arredondamento, voc e deve usar uma fun c ao bem denida como TRUNCATE() ou FLOOR(). DIV Divis ao de inteiros. Similar ao FLOOR() mas seguro com valores BIGINT. mysql> SELECT 5 DIV 2 -> 2 DIV e novo no MySQL 4.1.0. Retorna o valor de e (the base of natural logarithms) raised to the power of X: mysql> SELECT EXP(2); -> 7.389056 mysql> SELECT EXP(-2); -> 0.135335 Retorna o logaritmo natural de X: mysql> SELECT LN(2); -> 0.693147 mysql> SELECT LN(-2); -> NULL sin Esta fun c ao foi adicionada na vers ao 4.0.3 do MySQL. E onimo de LOG(X) no MySQL. Se chamado com um par ametro, esta fun c ao retorna o logar itmo natural de X: mysql> SELECT LOG(2); -> 0.693147 mysql> SELECT LOG(-2); -> NULL Se chamado com dois par ametros, esta fun c ao retorna o logar itmo natural de X para uma base arbitraria B: mysql> SELECT LOG(2,65536); -> 16.000000 mysql> SELECT LOG(1,100); -> NULL A op c ao de base arbitr aria foi adicionada na vers ao 4.0.3 do MySQL. LOG(B,X) e equivalente a LOG(X)/LOG(B). Returna o logar itmo na base 2 de X: mysql> SELECT LOG2(65536); -> 16.000000 mysql> SELECT LOG2(-100); -> NULL LOG2() e u til para descobrir quantos bits um n umero necessitaria para ser armazenado. Esta fun c ao foi adicionada na vers ao 4.0.3 do MySQL. Em vers oes anteriores, voc e pode usar LOG(X)/LOG(2). Returna o logar itmo na base 10 de X:
EXP(X)
LN(X)
LOG(X) LOG(B,X)
LOG2(X)
LOG10(X)
526
mysql> SELECT LOG10(2); -> 0.301030 mysql> SELECT LOG10(100); -> 2.000000 mysql> SELECT LOG10(-100); -> NULL POW(X,Y) POWER(X,Y) Retorna o valor de X elevado a pot encia de Y: mysql> SELECT POW(2,2); -> 4.000000 mysql> SELECT POW(2,-2); -> 0.250000 SQRT(X) Retorna o a raiz quadrada n ao negativa de X: mysql> SELECT SQRT(4); -> 2.000000 mysql> SELECT SQRT(20); -> 4.472136 Retorna o valor de PI. A quantidade de n umeros decimais padr ao e 5, mas o MySQL usa internamente a precis ao dupla completa para PI. mysql> SELECT PI(); -> 3.141593 mysql> SELECT PI()+0.000000000000000000; -> 3.141592653589793116 Retorna o cosseno de X, onde X e dado em radianos: mysql> SELECT COS(PI()); -> -1.000000 Retorna o seno de X, onde X e dado em radianos: mysql> SELECT SIN(PI()); -> 0.000000 Retorna a tangente de X, onde X e dado em radianos: mysql> SELECT TAN(PI()+1); -> 1.557408 Retorna o arco cosseno X, isto e, o valor cujo cosseno e X. Retorna NULL se X n ao est a na faixa de -1 a 1: mysql> SELECT ACOS(1); -> 0.000000 mysql> SELECT ACOS(1.0001); -> NULL mysql> SELECT ACOS(0); -> 1.570796 Retorna o arco seno X, isto e, o valor cujo seno e X. Retorna NULL se X n ao est a na faixa de -1 a 1:
PI()
COS(X)
SIN(X)
TAN(X)
ACOS(X)
ASIN(X)
527
mysql> SELECT ASIN(0.2); -> 0.201358 mysql> SELECT ASIN(foo); -> 0.000000 ATAN(X) Retorna o arco tangente X, isto e, o valor cuja tangente e X. X: mysql> SELECT ATAN(2); -> 1.107149 mysql> SELECT ATAN(-2); -> -1.107149 ATAN(Y,X) ATAN2(Y,X)
similar ao caclculo do arco Retorna o arco tangente de duas variaveis X e Y. E tengente de Y / X, exceto que os sinais de ambos argumentos s ao usados para determinas o quadrante do resultado: mysql> SELECT ATAN(-2,2); -> -0.785398 mysql> SELECT ATAN2(PI(),0); -> 1.570796
COT(X)
Returns a cotangente de X: mysql> SELECT COT(12); -> -1.57267341 mysql> SELECT COT(0); -> NULL
CRC32(expr) Calcula um valor de verica c ao de redund ancia c iclica e retorna um valor unsigned de 32 bits. O resultado e NULL se o argumento e NULL. O argumento esperado e uma string e ser a tratado como tal se n ao for. mysql> SELECT CRC32(MySQL); -> 3259397556 CRC32() est a dispon ivel a partir do MySQL 4.1.0. RAND() RAND(N) Retorna um valor de ponto utuante aleat orio na faixa de 0 a 1.0. Se um argumento inteiro N e especicado, ele e usado como uma semente (produzindo uma sequ encia repetitiva): mysql> SELECT RAND(); -> 0.9233482386203 mysql> SELECT RAND(20); -> 0.15888261251047 mysql> SELECT RAND(20); -> 0.15888261251047 mysql> SELECT RAND(); -> 0.63553050033332 mysql> SELECT RAND();
528
-> 0.70100469486881 Voc e n ao pode usar uma coluna com valores RAND() em uma cl ausula ORDER BY, pois ORDER BY avaliaria a coluna m ultiplas vezes. Na vers ao 3.23 voc e pode fazer: SELECT * FROM nome_tabela ORDER BY RAND() Isto e u til para obter um amostra aleat oria de um conjunto SELECT * FROM tabela1,tabela2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000. Note que um RAND() em uma cl ausula WHERE ser a reavliado toda vez que WHERE e executado. RAND() n ao e um gerador de n umeros aletat orios perfeito, mas e um modo r apido de se gerar n umeros aleat orios ad hoc que ser ao port aveis entre plataformas para a mesma vers ao do MySQL. LEAST(X,Y,...) Com dois ou mais argumentos, retorna o menor (valor-m inimo) argumento. Os argumentos s ao comparados usando as seguintes regras: Se o valor de retorno e usado em um contexto INTEGER, ou todos argumentos s ao valores inteiro, eles s ao comparados como inteiros. Se o valor de retorno e usado em um contexto REAL, ou todos argumentos s ao valores reais, eles s ao comparados como inteiros. Se qualquer um dos argumento for uma string caso-sensitivo, os argumentos s ao comparados como strings caso-sensitivo. Nos outros casos, os argumentos s ao comparados como strings caso-insensitivo: mysql> SELECT LEAST(2,0); -> 0 mysql> SELECT LEAST(34.0,3.0,5.0,767.0); -> 3.0 mysql> SELECT LEAST("B","A","C"); -> "A" Em vers oes do MySQL anteriores a vers ao 3.22.5, voc e pode usar MIN() no lugar de LEAST. GREATEST(X,Y,...) Retorna o maior (valor m aximo) argumento. Os argumentos s ao comparados usando as mesmas regras do LEAST: mysql> SELECT GREATEST(2,0); -> 2 mysql> SELECT GREATEST(34.0,3.0,5.0,767.0); -> 767.0 mysql> SELECT GREATEST("B","A","C"); -> "C" Em vers oes do MySQL anteriores a vers ao 3.22.5, voc e pode usar MAX() no lugar de GRATEST. DEGREES(X) Retorna o argumento X, convertido de radianos para graus:
529
mysql> SELECT DEGREES(PI()); -> 180.000000 RADIANS(X) Retorna o argumento X, convertido de graus para radianos: mysql> SELECT RADIANS(90); -> 1.570796 TRUNCATE(X,D) Retiorna o n umero X, truncado para D casas decimais. Se D e 0, o resultado n ao ter a ponto deciaml ou prate fracion aria: mysql> SELECT TRUNCATE(1.223,1); -> 1.2 mysql> SELECT TRUNCATE(1.999,1); -> 1.9 mysql> SELECT TRUNCATE(1.999,0); -> 1 mysql> SELECT TRUNCATE(-1.999,1); -> -1.9 A partir do MySQL 3.23.51 todos o n umeros s ao arredondados para zero. Se D e negativo, ent ao D numeros da parte inteira s ao zerados: mysql> SELECT TRUNCATE(122,-2); -> 100 Note que como os n umeros decimais n ao s ao normalmente armazenados como n umeros exatos, mas como valores de dupla precis ao, voc e pode obter o seguinte resultado: mysql> SELECT TRUNCATE(10.28*100,0); -> 1027 O resultado acima acontece porque 10.28 e, na verdade, armazenado como 10.2799999999999999.
530
Fun c oes que retornam a data ou hora atual s ao avaliadas apenas uma vez por consulta, no inicio da sua execu c ao. Isto signica que v arias refer encias a uma fun c ao com NOW() dentro de uma mesma consulta sempre produzir a o memo resultado. Este princ ipio tamb em se aplica a CURDATE(), CURTIME(), UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP(), e qualquer um dos seus sin onimos. A faixa do valor retornado na seguinte descri c ao da fun c ao se aplica a datas completas. Se uma data e um valor zero ou uma data incompleta tal como 2001-11-00, fun c oes que extraem parte de uma data podem retornam 0. Por exemplo, DAYOFMONTH(2001-11-00) retorna 0. DATE(expr) Extrai a parte da data da express ao date ou datetime em expr. mysql> SELECT DATE(2003-12-31 01:02:03); -> 2003-12-31 DATE() est a dispon ivel a partir do MySQL 4.1.1. TIME(expr) Extrai a parte da hora da express ao time ou datetime em expr. mysql> SELECT TIME(2003-12-31 01:02:03); -> 01:02:03 mysql> SELECT TIME(2003-12-31 01:02:03.000123); -> 01:02:03.000123 TIME() est a dispon ivel a partir do MySQL 4.1.1. TIMESTAMP(expr) TIMESTAMP(expr,expr2) Com um argumento, retorna a express ao date ou datetime em expr como um valor datetime. Com dois argumentos, adiciona a express ao time e expr2 ` a express ao date ou datetime em expr e retorna um valor datetime. mysql> SELECT TIMESTAMP(2003-12-31); -> 2003-12-31 00:00:00 mysql> SELECT TIMESTAMP(2003-12-31 12:00:00,12:00:00); -> 2004-01-01 00:00:00 TIMESTAMP() est a dispon ivel a partir do MySQL 4.1.1. DAYOFWEEK(data) Retorna o indice do dia da semana para data (1 = Domingo, 2 = Segunda, ... 7 = S abado). Estes valores de indices correspondem ao padr ao ODBC. mysql> SELECT DAYOFWEEK(1998-02-03); -> 3 WEEKDAY(data) Retorna o indice do dia das semana para data (0 = Segunda, 1 = Ter ca, ... 6 = Domingo): mysql> SELECT WEEKDAY(1998-02-03 22:23:00); -> 1 mysql> SELECT WEEKDAY(1997-11-05); -> 2
531
DAYOFMONTH(data) Retorna o dia do m es para data, na faixa de 1 at e 31: mysql> SELECT DAYOFMONTH(1998-02-03); -> 3 DAY(date) DAY() e um sin onimo para DAYOFMONTH(). Est a dispon ivel a partir do MySQL 4.1.1.
DAYOFYEAR(data) Retorna o dia do ano para data, na faixa de 1 at e 366: mysql> SELECT DAYOFYEAR(1998-02-03); -> 34 MONTH(data) Retorna o m es para data, na faixa de 1 at e 12: mysql> SELECT MONTH(1998-02-03); -> 2 DAYNAME(data) Retorna o nome do dia da semana para data: mysql> SELECT DAYNAME(1998-02-05); -> Thurday MONTHNAME(data) Retorna o nome do m es para data: mysql> SELECT MONTHNAME(1998-02-05); -> February QUARTER(data) Retorna o trimaster para data, na faixa de 1 at e 4: mysql> SELECT QUARTER(98-04-01); -> 2 WEEK(data) WEEK(data,inicio) Com um u nico argumento, retorna a semana para date, na faixa de 0 a 53 (sim, pode ter o inicio de uma semana 53), para locais onde Domingo e o primeiro dia da semana. A forma de WEEK com dois argumentos permite especicar se a semana come ca no Domingo ou na Segunda e se o valor de retorno de estar na faixa 0-53 ou 1-52. A seguinte tabela demonstra como o argumento inicio funciona: Valor Signicado 0 Semana come ca no Domingo; retorna valor na faixa de 0 a 53 1 Semana come ca na Segunda; retorna valor na faixa de 0 a 53 2 Semana come ca no Domingo; retorna valor na faixa de 1 a 53 3 Semana come ca na Segunda; retorna valor na faixa de 1 a 53 (ISO 8601) O valor inicio de 3 pode ser usado a partir do MySQL 4.0.5.
532
mysql> SELECT WEEK(1998-02-20); -> 7 mysql> SELECT WEEK(1998-02-20,0); -> 7 mysql> SELECT WEEK(1998-02-20,1); -> 8 mysql> SELECT WEEK(1998-12-31,1); -> 53 No MySQL 3.23 e 4.0 o valor padr ao do argumento inicio e 0. No MySQL 4.1 voc e pode denir o valor padr ao do argumento inicio atrav es de uma vari avel default_week_format. A sintaxe de default_week_format e: SET [SESSION | GLOBAL] default_week_format = {0|1|2|3}; Nota: Na vers ao 4.0, WEEK(#,0) foi alterado para corresponder ao calend ario americano. Antes WEEK() era calculada de forma errada para data no EUA. (Na verdade WEEK(#) e WEEK(#,0) era errado para todos os casos). Note que se a data for a u ltima semana do ano anterior, o MySQL retornar a0 se voc e n ao usar 2 ou 3 como argumento opcional inicio: mysql> SELECT YEAR(2000-01-01), WEEK(2000-01-01,0); -> 2000, 0 Pode-se questionar que o MySQL deveria retornar 52 para a fun c ao WEEK() ja que a data dada ocorre, na verdade, ma 52a. semana de 1999. N os decidimos retornar 0 j a que queremos que fun c ao retorne o n umero da semana do ano dado. Isto faz com que o uso da fun c ao WEEK() seja seguro quando combinado com outras fun c oes que extraiam um parte de uma data. Se voc e prefere que o resultado seja avaliado em relac ao ao ano que aont em o primeiro dia da semana de uma data dada, ent ao voc e deve usar o 2 ou 3 como argumento opcional inicio: mysql> SELECT WEEK(2000-01-01,2); -> 52 Alternativamente voc e pode usar a fun c ao YEARWEEK(): mysql> SELECT YEARWEEK(2000-01-01); -> 199952 mysql> SELECT MID(YEARWEEK(2000-01-01),5,2); -> 52 WEEKOFYEAR(data) Retorna a semana da data como um n umero na faixa de 1 a 53. mysql> SELECT WEEKOFYEAR(1998-02-20); -> 8 WEEKOFYEAR() esta dispon ivel a partir do MySQL 4.1.1. YEAR(data) Retorna o ano para data na faixa de 1000 a 9999: mysql> SELECT YEAR(98-02-03); -> 1998
533
YEARWEEK(data) YEARWEEK(data,inicio) Retorna o ano e a semana para a data. O argumento inicio funciona exatamente como o argumento inicio de WEEK(). Note que o ano pode ser diferente do ano no argumento data para a primeira e a u ltima semana do ano: mysql> SELECT YEARWEEK(1987-01-01); -> 198653 Note que o n umero da semana e diferente do que seria retornado pela fun c ao WEEK() (0) para os argumentos opcionais 0 ou 1, j a que WEEK() retorna a semana no centexto de um ano dado. HOUR(hora) Retorna a hora para hora. A faixa do valor retornado ser a de 0 a 23 para o valor hora do dia. mysql> SELECT HOUR(10:05:03); -> 10 No entanto, a faixa dos valores TIME atualmente s ao muito grandes, assim HOUR pode retornar valores maior que 23: mysql> SELECT HOUR(272:59:59); -> 272 MINUTE(hora) Retorna o minuto para hora, na faixa de 0 a 59: mysql> SELECT MINUTE(98-02-03 10:05:03); -> 5 SECOND(hora) Retorna o segundo para hora, na faixa de 0 a 59: mysql> SELECT SECOND(10:05:03); -> 3 MICROSECOND(expr) Retorna os microsegundos da express ao time ou datetime em expr como um n umero na faixa de 0 a 999999. mysql> SELECT MICROSECOND(12:00:00.123456); -> 123456 mysql> SELECT MICROSECOND(1997-12-31 23:59:59.000010); -> 10 MICROSECOND() est a dispon ivel a partir do MySQL 4.1.1. PERIOD_ADD(P,N) Adiciona N meses ao per iodo P (no formato AAMM ou AAAAMM). Retorna um valor no formato AAAAMM. Note que o argumento de per iodo P n ao e um valor de data: mysql> SELECT PERIOD_ADD(9801,2); -> 199803
534
PERIOD_DIFF(P1,P2) Retorna o n umero de meses entre os per iodos P1 e P2. P1 e P2 devem estar no formato AAMM ou AAAAMM. Note que os argumentos de per iodo P1 e P2 n ao s ao valores de data: mysql> SELECT PERIOD_DIFF(9802,199703); -> 11 DATE_ADD(data,INTERVAL tipo expr) DATE_SUB(data,INTERVAL tipo expr) Estas fun c oes realizam opera c oes aritm eticas em datas. A partir do MySQL 3.23, INTERVAL expr tipo e permitido nos dois lados do operador + se a expressao em ambos os lados e um valor date ou datetime. Para o operador -, INTERVAL expr tipoe e permitido apenas no lado direito, porque n ao faz sentido subtrair um valor date ou datetime de um intervalo. (Veja exemplo abaixo.) data e um valor DATETIME ou DATE especicando a data de in icio. expr is an express ao especicando o intervala a ser adicionado ou subtraido da data de in icio. expr e uma string; ela pode iniciar com um - para intervalos negativos. type e uma palavra chave indicando como a express ao deve ser interpretada. A seguinte tabela mostra como os argumentos tipo e expr se relacionam: tipo do valor SECOND MINUTE HOUR DAY MONTH YEAR MINUTE_SECOND HOUR_MINUTE DAY_HOUR YEAR_MONTH HOUR_SECOND DAY_MINUTE DAY_SECOND DAY_MICROSECOND HOUR_MICROSECOND MINUTE_MICROSECOND SECOND_MICROSECOND MICROSECOND Formarto esperado da expr SECONDS MINUTES HOURS DAYS MONTHS YEARS MINUTES:SECONDS HOURS:MINUTES DAYS HOURS YEARS-MONTHS HOURS:MINUTES:SECONDS DAYS HOURS:MINUTES DAYS HOURS:MINUTES:SECONDS DAYS.MICROSECONDS HOURS.MICROSECONDS MINUTES.MICROSECONDS SECONDS.MICROSECONDS MICROSECONDS
Os valores do tipo DAY_MICROSECOND, HOUR_MICROSECOND, MINUTE_ MICROSECOND, SECOND_MICROSECOND e MICROSECOND s ao permitidos ap os o MySQL 4.1.1. O MySQL permite qualquer delimitador de pontua c ao no formato de expr. Os delimitadores mostrados na tabela s ao apenas sugeridos. Se o argumento date e um valor de DATA e seus c alculos envolvem apenas as partes ANO, M^ ES, e DIA
535
(into e, nenhuma parte de hora), o resultado e um valor do tipo DATE. Sen ao, o resultado e um valor do tipo DATETIME: mysql> SELECT 1997-12-31 23:59:59 + INTERVAL 1 SECOND; -> 1998-01-01 00:00:00 mysql> SELECT INTERVAL 1 DAY + 1997-12-31; -> 1998-01-01 mysql> SELECT 1998-01-01 - INTERVAL 1 SECOND; -> 1997-12-31 23:59:59 mysql> SELECT DATE_ADD(1997-12-31 23:59:59, -> INTERVAL 1 SECOND); -> 1998-01-01 00:00:00 mysql> SELECT DATE_ADD(1997-12-31 23:59:59, -> INTERVAL 1 DAY); -> 1998-01-01 23:59:59 mysql> SELECT DATE_ADD(1997-12-31 23:59:59, -> INTERVAL 1:1 MINUTE_SECOND); -> 1998-01-01 00:01:00 mysql> SELECT DATE_SUB(1998-01-01 00:00:00, -> INTERVAL 1 1:1:1 DAY_SECOND); -> 1997-12-30 22:58:59 mysql> SELECT DATE_ADD(1998-01-01 00:00:00, -> INTERVAL -1 10 DAY_HOUR); -> 1997-12-30 14:00:00 mysql> SELECT DATE_SUB(1998-01-02, INTERVAL 31 DAY); -> 1997-12-02 mysql> SELECT DATE_ADD(1992-12-31 23:59:59.000002, -> INTERVAL 1.999999 SECOND_MICROSECOND); -> 1993-01-01 00:00:01.000001 Se voc e especicado um intervalo muito curto (n ao inclue todas as partes que seriam esperadas pelo intervalo para aquele tipo), MySQL assume que voc e n ao especicou a parte mais a esquerda do valor do intervalo. Por exemplo, se voc e especica um tipo DAY_SECOND, o valor esperado de expr dever a ter as partes de dias, horas, minutos e segundos. Se voc e especica um valor como 1:10, MySQL assume que as partes do dia e da hora foram esquecidas e o valor representa minutos e segundos. Em outras palavras, 1:10 DAY_SECOND e interpretado de forma equivalente a 1:10 MINUTE_SECOND. Isto e an alogo a forma que o MySQL interpreta valores TIME representado tempo decorrido no lugar de hora do dia. Note que se voc e adicionar ou subtrair de uma data algo contendo uma parte de hora, o resultado e automaticamente convertido para um valor datetime: mysql> SELECT DATE_ADD(1999-01-01, INTERVAL 1 DAY); -> 1999-01-02 mysql> SELECT DATE_ADD(1999-01-01, INTERVAL 1 HOUR); -> 1999-01-01 01:00:00
536
Se voc e utilizar datas mal formadas, o valor retornado NULL. S e voc e adicionar MONTH, YEAR_MONTH, ou YEAR e a data resultante tiver um dia maior que o dia m aximo para aquele m es, o dia e ajustado para o dia m aximo no m es. mysql> SELECT DATE_ADD(1998-01-30, interval 1 month); -> 1998-02-28 Note pelo exemplo anterior que a palavra-chave INTERVAL e o especicador tipo n ao s ao caso sensitivo. ADDDATE(data,INTERVAL expr type) SUBDATE(data,INTERVAL expr type) ADDDATE(expr,dias) SUBDATE(expr,dias) Quando chamada com a forma INTERVAL do segundo argumento, ADDDATE() e SUBDATE() s ao sin onimos para DATE_ADD() e DATE_SUB(). mysql> SELECT DATE_ADD(1998-01-02, INTERVAL 31 DAY); -> 1998-02-02 mysql> SELECT ADDDATE(1998-01-02, INTERVAL 31 DAY); -> 1998-02-02 mysql> SELECT DATE_SUB(1998-01-02, INTERVAL 31 DAY); -> 1997-12-02 mysql> SELECT SUBDATE(1998-01-02, INTERVAL 31 DAY); -> 1997-12-02 A partir do MySQL 4.1.1, a segunda sintaxe e permitida, onde expr e uma expres ao date ou datetime e dias e o n umero de dias a ser adicionado ou subtra ido de expr. mysql> SELECT ADDDATE(1998-01-02, 31); -> 1998-02-02 mysql> SELECT SUBDATE(1998-01-02 12:00:00, 31); -> 1997-12-02 12:00:00 ADDTIME(expr,expr2) SUBTIME(expr,expr2) expr e uma express ao date ou datetime, e expr2 e uma express ao time. ADDTIME() adiciona expr2 a expr e retorna o resultado. SUBTIME() subtrai expr2 de expr e retorna o resultado. mysql> SELECT ADDTIME("1997-12-31 23:59:59.999999", "1 1:1:1.000002"); -> 1998-01-02 01:01:01.000001 mysql> SELECT SUBTIME("1997-12-31 23:59:59.999999", "1 1:1:1.000002"); -> 1997-12-30 22:58:58.999997 mysql> SELECT ADDTIME("01:00:00.999999", "02:00:00.999998"); -> 03:00:01.999997 mysql> SELECT SUBTIME("01:00:00.999999", "02:00:00.999998"); -> -00:59:59.999999 ADDTIME() e SUBTIME() foram adicionado no MySQL 4.1.1.
537
EXTRACT(tipo FROM data) A fun c ao EXTRACT() usa o mesmo tipo de intervalo especicado como DATE_ ADD() ou DATE_SUB(), mas extrai partes da da data em vez de realizar aritim etica de data. mysql> SELECT EXTRACT(YEAR FROM "1999-07-02"); -> 1999 mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03"); -> 199907 mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03"); -> 20102 mysql> SELECT EXTRACT(MICROSECOND FROM "2003-01-02 10:30:00.00123"); -> 123 DATEDIFF(expr,expr2) TIMEDIFF(expr,expr2) DATEDIFF() retorna o n umero de dias entre a data inicial expr e a data nal expr2. expr e expr2 s ao express oes de datas ou data e hora. Apenas a parte da data dos valores s a usados no c alculo. TIMEDIFF() retorna o tempo entre a hora inicial expr e a hora nal expr2. expr e expr2 s ao express oes de hora ou data e hora, mas ambas devem ser do mesmo tipo. mysql> SELECT DATEDIFF(1997-12-31 -> 1 mysql> SELECT DATEDIFF(1997-11-31 -> -30 mysql> SELECT TIMEDIFF(2000:01:01 -> -00:00:00.000001 mysql> SELECT TIMEDIFF(1997-12-31 -> 46:58:57.999999 23:59:59,1997-12-30); 23:59:59,1997-12-31);
23:59:59.000001,1997-12-30 01:01:01.0
DATEDIFF() e TIMEDIFF() foram adicionados no MySQL 4.1.1. TO_DAYS(data) Dada uma data data, retorna o n umero do dia (o n umero de dias desde o ano 0); mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS(1997-10-07); -> 729669 TO_DAYS() n ao pode ser usado com valores que orecedem o advento do calendario Gregoriano (1582), porque ele n ao leva em conta os dias perdidos quando o calend ario foi mudado. FROM_DAYS(N) Dado um n umero de dia N, retorna um valor DATE: mysql> SELECT FROM_DAYS(729669); -> 1997-10-07
538
FROM_DAYS() n ao pode ser usado com valores que orecedem o advento do calendario Gregoriano (1582), porque ele n ao leva em conta os dias perdidos quando o calend ario foi mudado. DATE_FORMAT(data,formato) Formata o valor de data de acordo com a string formato string. Os seguintes identicadores podem ser utilizados na string formato: Specier %M %W %D %Y %y %X %x %a %d %e %m %c %b %j %H %k %h %I %l %i %r %T %S %s %f %p %w %U %u %V %v %% Description Nome do m es (January..December) Nome da semana (Sunday..Saturday) Dia do m es com suxo Ingl es (0th, 1st, 2nd, 3rd, etc.) Ano, numerico, 4 digitos Ano, numerico, 2 digitos Ano para a semana onde o Domingo e o primeiro dia da semana, numerico, 4 digitos; usado com %V Ano para a semana onde a segunda e o primeiro dia da semana, numerico, 4 digitos; usado com %v Nome da semana abreviado (Sun..Sat) Dia do m es, numerico (00..31) Dia do m es, numerico (0..31) M es, numerico (00..12) M es, numerico (0..12) Nome do m es abreviado (Jan..Dec) Dia do ano (001..366) Hora (00..23) Hora (0..23) Hora (01..12) Hora (01..12) Hora (1..12) Minutos, numerico (00..59) Tempo, 12-horas (hh:mm:ss seguido por AM ou PM) Tempo, 24-horas (hh:mm:ss) Segundos (00..59) Segundos (00..59) Microsegundos (000000..999999) AM ou PM Dia da semana (0=Domingo..6=Sabado) Semana(00..53), onde o Domingo e o primeiro dia da semana. Semana(00..53), onde a Segunda e o primeiro dia da semana. Semana(01..53), onde o Domingo e o primeiro dia da semana; usado com %X Semana(01..53), onde a Segunda e o primeiro dia da semana; usado com %x Um literal %.
Todos os outros caracteres s ao apenas copiados para o resultado, sem interpreta c ao.
539
O especicador dr formato %f est a dispon ivel a partir do MySQL 4.1.1. Como na vers ao 3.23 do MySQL, o caracter % e exigido antes dos caracteres de especica c ao de formato. Em vers oes anteriores do MySQL % era opcional. A raz ao para a faixa de valores do m es e do dia come carem com zero e que o MySQL permite datas incompletas tais como 2004-00-00 serem armazenadas no MySQL 3.23. mysql> SELECT DATE_FORMAT(1997-10-04 22:23:00, %W %M %Y); -> Saturday October 1997 mysql> SELECT DATE_FORMAT(1997-10-04 22:23:00, %H:%i:%s); -> 22:23:00 mysql> SELECT DATE_FORMAT(1997-10-04 22:23:00, %D %y %a %d %m %b %j); -> 4th 97 Sat 04 10 Oct 277 mysql> SELECT DATE_FORMAT(1997-10-04 22:23:00, %H %k %I %r %T %S %w); -> 22 22 10 10:23:00 PM 22:23:00 00 6 mysql> SELECT DATE_FORMAT(1999-01-01, %X %V); -> 1998 52 STR_TO_DATE(str,format) Esta e a fun c ao reversa da fun c ao DATE_FORMAT(). Ela pega uma string str, e um formato format, e retorna uma valor DATETIME. Os valores date, time, ou datetime contidos em str devem ser dados no formato indicado por format. Para o especicadores que podem ser usados em format, veja a tabela na descri c ao da fun c ao DATE_FORMAT(). Todos os outros caracteres ser ao apenas exibidos, n ao sendo interpretados. Se str cont em um valor date, time, ou datetime ilegal, STR_TO_DATE() retorna NULL. mysql> SELECT STR_TO_DATE(03.10.2003 09.20, %d.%m.%Y %H.%i) -> 2003-10-03 09:20:00 mysql> SELECT STR_TO_DATE(10rap, %crap) -> 0000-10-00 00:00:00 mysql> SELECT STR_TO_DATE(2003-15-10 00:00:00, %Y-%m-%d %H:%i:%s) -> NULL STR_TO_DATE() est a dispon ivel a partir do MySQL 4.1.1. GET_FORMAT(DATE | TIME | TIMESTAMP, EUR | USA | JIS | ISO | INTERNAL) Retorna uma string de formato. Esta fun c ao eu til combinado com as fun c oes DATE_FORMAT() e STR_TO_DATE(), e quando congurarmos as vari aveis do servidor DATE_FORMAT, TIME_FORMAT e DATETIME_FORMAT. Os tr es valores poss iveis para o primeiro argumento e os cinco valores possiveis para o segundo argumento resultam em 15 strings de formato poss iveis (para o especicador usado, veja a tabela na descri c ao da fun c ao DATE_FORMAT()): Chamada da Fun c ao Resultado GET_FORMAT(DATE,USA) %m.%d.%Y GET_FORMAT(DATE,JIS) %Y-%m-%d GET_FORMAT(DATE,ISO) %Y-%m-%d GET_FORMAT(DATE,EUR) %d.%m.%Y
540
GET_FORMAT(DATE,INTERNAL) %Y%m%d GET_FORMAT(TIMESTAMP,USA) %Y-%m-%d-%H.%i.%s GET_FORMAT(TIMESTAMP,JIS) %Y-%m-%d %H:%i:%s GET_FORMAT(TIMESTAMP,ISO) %Y-%m-%d %H:%i:%s GET_FORMAT(TIMESTAMP,EUR) %Y-%m-%d-%H.%i.%s GET_FORMAT(TIMESTAMP,INTERNAL) %Y%m%d%H%i%s GET_FORMAT(TIME,USA) %h:%i:%s %p GET_FORMAT(TIME,JIS) %H:%i:%s GET_FORMAT(TIME,ISO) %H:%i:%s GET_FORMAT(TIME,EUR) %H.%i.%S GET_FORMAT(TIME,INTERNAL) %H%i%s Formato ISO e do ISO ISO 9075, n ao do ISO 8601. mysql> SELECT DATE_FORMAT(2003-10-03, GET_FORMAT(DATE, EUR) -> 03.10.2003 mysql> SELECT STR_TO_DATE(10.31.2003, GET_FORMAT(DATE, USA)) -> 2003-10-31 mysql> SET DATE_FORMAT=GET_FORMAT(DATE, USA); SELECT 2003-10-31; -> 10-31-2003 GET_FORMAT() est a dispon ivel a partir do MySQL 4.1.1. Veja Veja Se c ao 5.5.6 [SET OPTION], P agina 461. TIME_FORMAT(hora,formato) usado como a fun E c ao DATE_FORMAT() acima, mas a string de formato pode conter apenas os especicadores de formato que tratam de horas, minutos e segundos. Outros especicadores produzem um valor NULL ou 0. Se o valor time cont em uma hora que e maior que 23, os especicadores de formato de hora %H e %k produzem um valor maior que a faixa como de 0..23. O outro especicador do formato de hora produz o valor da hora m odulo 12: mysql> SELECT TIME_FORMAT(100:00:00, %H %k %h %I %l); -> 100 100 04 04 4 LAST_DAY(data) Pega um valor date ou datetime e retorna o valor correspondente para o u ltimo dia do m es. Retorna NULL se o argumento e invalido. mysql> SELECT LAST_DAY(2003-02-05), LAST_DAY(2004-02-05); -> 2003-02-28, 2004-02-29 mysql> SELECT LAST_DAY(2004-01-01 01:01:01); -> 2004-01-31 mysql> SELECT LAST_DAY(2003-03-32); -> NULL LAST_DAY() est a dispon ivel a partir do MySQL 4.1.1. MAKEDATE(ano,diadoano) Retorna uma data, dado os valores da ano e dia do ano. diadoano deve ser maior que 0 ou o resultado ser a NULL. mysql> SELECT MAKEDATE(2001,31), MAKEDATE(2001,32); -> 2001-01-31, 2001-02-01
541
mysql> SELECT MAKEDATE(2001,365), MAKEDATE(2004,365); -> 2001-12-31, 2004-12-30 mysql> SELECT MAKEDATE(2001,0); -> NULL MAKEDATE() est a dispon ivel a partir do MySQL 4.1.1. MAKETIME(hora,minuto,segundo) Retorna um valor time calculado a partir dos argmentos hora, minuto e segundo. mysql> SELECT MAKETIME(12,15,30); -> 12:15:30 MAKETIME() est a dispon ivel a partir do MySQL 4.1.1. CURDATE() CURRENT_DATE CURRENT_DATE() Retorna a data atual como um valor no formato YYYY-MM-DD ou YYYYMMDD, dependendo se a fun c ao e usada num contexto num erico ou de string. mysql> SELECT CURDATE(); -> 1997-12-15 mysql> SELECT CURDATE() + 0; -> 19971215 CURTIME() CURRENT_TIME CURRENT_TIME() Retorna a hora atual como um valor no formato HH:MM:SS ou HHMMSS, dependo se a fun c ao e usada em um contexto num erico ou como string: mysql> SELECT CURTIME(); -> 23:50:26 mysql> SELECT CURTIME() + 0; -> 235026 NOW() SYSDATE() CURRENT_TIMESTAMP CURRENT_TIMESTAMP() LOCALTIME LOCALTIME() LOCALTIMESTAMP LOCALTIMESTAMP() Retorna a data e hora atual como um valor no formato YYYY-MM-DD HH:MM:SS ou YYYYMMDDHHMMSS, dependendo se a fun c ao e utilizada num contexto num erico ou de string. mysql> SELECT NOW(); -> 1997-12-15 23:50:26 mysql> SELECT NOW() + 0; -> 19971215235026
542
UNIX_TIMESTAMP() UNIX_TIMESTAMP(data) Se chamado sem argumento, retorna um tipo timestamp do Unix (segundos desde 1970-01-01 00:00:00 GMT) como um inteiro sem sinal. Se UNIX_ TIMESTAMP() e chamada com um argumento data, e retornado o valor do argumento como segundo desde 1970-01-01 00:00:00 GMT. data pode ser um string DATE, uma string DATETIME, um TIMESTAMP, ou um n umero no formato YYMMDD ou YYYYMMDD na hora local: mysql> SELECT UNIX_TIMESTAMP(); -> 882226357 mysql> SELECT UNIX_TIMESTAMP(1997-10-04 22:23:00); -> 875996580 Qaundo UNIX_TIMESTAMP e usado em uma coluna TIMESTAMP, a fun c ao retorna o valor timestamp interno diretamente, sem nenhuma convers ao string-paraunix-timestamp implicita. Se voc e passar uma data fora da faixa para UNIX_ TIMESTAMP(), a fun c ao ir a retornar 0, mas por favor note que s o verica c oes b asicas s ao realizadas. (ano 1970-2037, m es 01-12, dia 01-31). Se voc e subtrair colunas UNIX_TIMESTAMP(), voc e pode querer mudar o resultado para inteiro com sinal. Veja Se c ao 6.3.5 [Fun c oes de tipagem], P agina 543. FROM_UNIXTIME(unix_timestamp) FROM_UNIXTIME(unix_timestamp,format) Retorna a representa c ao do argumento unix_timestamp como um valor no formato YYYY-MM-DD HH:MM:SS ou YYYYMMDDHHMMSS, dependendo de do contexto em que a fun c o e utilizada: mysql> SELECT FROM_UNIXTIME(875996580); -> 1997-10-04 22:23:00 mysql> SELECT FROM_UNIXTIME(875996580) + 0; -> 19971004222300 Se o formato e dado o resultado e formatado de acordo com a string formato. formato pode conter os especicadores listados acima para a fun c ao DATE_ FORMAT() mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), -> %Y %D %M %h:%i:%s %x); -> 2003 6th August 06:22:58 2003 SEC_TO_TIME(seconds) Retorna o argumento segundos, convertido em horas, minutos e segundos como um valor no formato HH:MM:SS ou HHMMSS, dependendo do contexto em que a fun c ao e utilizada: mysql> SELECT SEC_TO_TIME(2378); -> 00:39:38 mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938 TIME_TO_SEC(time) Retorna o argumento time, convertido em segundos:
543
mysql> SELECT TIME_TO_SEC(22:23:00); -> 80580 mysql> SELECT TIME_TO_SEC(00:39:38); -> 2378 UTC_DATE UTC_DATE() Retorna a data UTC atual como um valor no formato YYYY-MM-DD ou YYYYMMDD, dependendo se a fun c ao e usada emum contexto string ou num erico: mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> 2003-08-14, 20030814 UTC_DATE() est a dispon ivel a partir do MySQL 4.1.1. UTC_TIME UTC_TIME() Retorna a hora UTC atual como um valor no formato HH:MM:SS ou HHMMSS, dependendo se a fun c ao e usada em um contexto string ou num erico: mysql> SELECT UTC_TIME(), UTC_TIME() + 0; -> 18:07:53, 180753 UTC_TIME() est a dispon ivel a partir do MySQL 4.1.1. UTC_TIMESTAMP UTC_TIMESTAMP() Retorna a data e hora UTC atual como um valor no formato YYYY-MM-DD HH:MM:SS ou YYYYMMDDHHMMSS, dependendo se a fun c ao e usada em um contexto string ou num erico: mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0; -> 2003-08-14 18:08:04, 20030814180804 UTC_TIMESTAMP() est a dispon ivel a partir do MySQL 4.1.1.
544
UNSIGNED {INTEGER} CAST() e CONVERT() est ao dispon iveis a partir do MySQL 4.0.2. O tipo de convers ao CHAR est a disponivel a partir do vers ao 4.0.6. A forma USING de CONVERT() est a dispon ivel a partir da vers ao 4.1.0. CAST() e CONVERT(... USING ...) s ao da sintaxe SQL-99. CONVERT() e da sintaxe ODBC. A forma n ao-USING de
CAST() e da sintaxe SQL-99 syntax e CONVERT() e da sintaxe ODBC. As fun c oes de convers ao s ao principalmente u teis quando voc e deseja criar uma coluna com um tipo espec ico em uma CREATE ... SELECT: CREATE TABLE nova_tabela SELECT CAST(2000-01-01 AS DATE); As fun c oes tamb em podem ser u teis para ordenar colunas ENUM na ordem lexicogr aca. Normalmente a ordena c ao das colunas ENUM ocorrem usando os valores num ericos internos. Converter os valores para CHAR resultam em uma ordena c ao lexicogr aca: SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR); CAST(string AS BINARY) e a mesma coisa que BINARY string. CAST(expr AS CHAR) trata a express ao como uma string com o conjunto de caracteres padr ao. NOTA: No MysQL 4.0 o CAST() para DATE, DATETIME ou TIME s o marca a coluna para ser um tipo espec ico mas n ao altera o valor da coluna. No MySQL 4.1.0 o valor ser a convertido para a coluna correta quando for enviado para o usu ario (este e um recurso de como o novo protocolo na vers ao 4.1 envia as informa c oes de data para o cliente): mysql> SELECT CAST(NOW() AS DATE); -> 2003-05-26 Em vers oes futuras do MySQL (provavelmente 4.1.2 ou 5.0) iremos corrigir o fato de que CAST tamb em altera o resultado se voc e us a-lo como parte de uma express ao mais complexa, como CONCAT("Data: ",CAST(NOW() AS DATE)). Voc e n ao deve utilizar CAST() para extrair dados em formatos diferentes, mas sim para usar fun c oes strins como LEFT ou EXTRACT(). Veja Se ca o 6.3.4 [Fun c oes de data e tempo], P agina 529. Para converter uma string para um valor num erico, normalmente n ao e necess ario se fazer nada; apenas use a string como se fosse um n umero: mysql> SELECT 1+1; -> 2 Se voc e usar um n umero em um contexto string, o n umero ser a convertido automaticamente para uma string BINARY. mysql> SELECT CONCAT("hello you ",2); -> "hello you 2" O MySQL suporta aritim etico com valores de 64 bits com sinal e sem sinal. Se voc e est a usando opera c oes num ericas (como +) e um dos operandos e unsigned integer (inteiro sem sinal), o resultado tamb em ser a sem sinal (unsigned). Voc e pode for car o tipo usando os operadores de convers ao SIGNED e UNSIGNED para converter a opera c ao para um inteiro de 64 bits com sinal e sem sinal, respectivamente.
545
mysql> SELECT CAST(1-2 AS UNSIGNED) -> 18446744073709551615 mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED); -> -1 Note que se um dos operandos for um valor de ponto utuante o resultado e um valor de ponto utuante e n ao e afetado pela regra acima. (Neste contexto DECIMAL() e considerado um valor de ponto utuante). mysql> SELECT CAST(1 AS UNSIGNED) -2.0; -> -1.0 Se voc e estiver utilizando uma string em uma opera c ao aritim etica, ela e convertida para um n umero de ponto utuante. O tratamento de valores sem sinais foi mudado no MySQL 4.0 para suportar valores BIGINT apropriadamente. Se voc e tiver algum c odigo que deseja executar no MySQL 4.0 e 3.23 (casos em que voc e provavelmente n ao poder a usar a fun c ao CAST()), voc e pode utilizar o seguinte truque para conseguir um resultado com sinal quando subtraindo duas colunas do tipo unsigned integer (inteiro sem sinal): SELECT (coluna_sem_sinal_1+0.0)-(coluna_sem_sinal_2+0.0); A id eia e que as colunas sejam convertidas para valores de ponto utuante antes da subtra c ao ocorrer. Se voc e tiver algum problema com colunas UNSIGNED no seu aplica c ao MySQL antiga ao portar para o MySQL 4.0, voc e pode usar a op c ao --sql-mode=NO_UNSIGNED_SUBTRACTION ao iniciar mysqld. Note, no entanto, que enquanto voc e utilizar esta op c ao, n ao ser a poss ivel conseguir um uso efetivo do tipo de coluna BIGINT UNSIGNED. CONVERT() com USING e usado para converter dados entre diferentes conjuntos de caracteres. No MySQL, nomes trancodicados s ao o mesmo que o nome do conjunto de caracteres correspondentes. Por exemplo, esta instru c ao converte a string abc no conjunto de caracteres padr ao do servidor na string correspondente no conjunto de caracteres utf8: SELECT CONVERT(abc USING utf8);
&
546
Operado bin ario XOR mysql> SELECT 1 ^ 1; -> 0 mysql> SELECT 1 ^ 0; -> 1 mysql> SELECT 11 ^ 3; -> 8 O resultado e um inteiro sem sinal de 64 bits. XOR foi adicionado na vers ao 4.0.2.
<< Desloca um n umero BIGINT (muito grande) a esquerda: mysql> SELECT 1 << 2; -> 4 O resultado e um inteiro sem sinal de 64 bits. >> Desloca um n umero BIGINT (muito grande) a direita: mysql> SELECT 4 >> 2; -> 1 O resultado e um inteiro sem sinal de 64 bits. ~ Inverte todos os bits: mysql> SELECT 5 & ~1; -> 4 O resultado e um inteiro sem sinal de 64 bits. BIT_COUNT(N) Retorna o n umero de bits que s ao passados no argumento N: mysql> SELECT BIT_COUNT(29); -> 4
547
O valor indica o nome do usu ario que voc e especicou ao conectar ao servidor e a m aquina cliente da qual voc e se conectou. (Antes do MySQL vers ao 3.22.11, o valor da fun c ao n ao inclui o nome da m aquina cliente.) Voc e pode extrair apenas a parte do nome do usu ario, desconsiderando se o valor inclui a parte do nome de m aquina, desta forma: mysql> SELECT SUBSTRING_INDEX(USER(),"@",1); -> davida CURRENT_USER() Retorna o nome do usu ario e o nome de m aquina com os quais a sess ao atual foi autenticada. Este valor corresponde a conta que e usada para acessar seu privil egio de acessos. Ela pode ser diferente do valor de USER().
mysql> SELECT USER(); -> davida@localhost mysql> SELECT * FROM mysql.user; -> ERROR 1044: Access denied for user: @localhost to database m mysql> SELECT CURRENT_USER(); -> @localhost O exemplo ilustra que embora o cliente tenha especicado um nome de usu ario davida (como indicado pelo valor da fun c ao USER()), o servidor autenticou o cliente usando uma conta de usu ario an onimo (como visto pela parte vazia no nome de usu ario do valor CURRENT_USER()). Um modos de isto ocorrer e que n ao haja uma conta listada na tabela de permiss oes para davida. PASSWORD(str) OLD_PASSWORD(str) Calcula a senha a partir de senha str em texto puro. Est a e a fun c ao que e utilizada para criptografar a senha do MySQL para armazenamento na coluna Password da tabela de permiss oes user mysql> SELECT PASSWORD(badpwd); -> 7f84554057dd964b A criptograa de PASSWORD() n ao e revers ivel. PASSWORD() n ao realiza a criptograa da senha da mesa maneira que as senhas Unix s ao criptografadas. Veja ENCRYPT(). Note: A fun c ao PASSWORD() e usada pelo sistema de autentica c ao no servidor MySQL, voc e N~ AO deve uitliz a-las em suas pr oprias aplica c oes. Para este prop osito utilize MD5() ou SHA1(). Veja tamb em RFC-2195 para maiores informa c oes sobre o tratamento de senha e autentica c ao segura em suas aplica c oes. ENCRYPT(str[,salt]) Criptografa str utilizando a chamada de sistema crypt() do Unix. O argumento salt deve ser uma string com dois caracteres. (Na vers ao 3.22.16 do MySQL, salt deve ser maior que dois caracteres.) mysql> SELECT ENCRYPT("hello"); -> VxuFAJXVARROc
548
ENCRYPT() ignora tudo depois dos primeiros 8 caracteres de str, pelo menos em alguns sistemas. Este comportamento e determinado pela implementa c ao da chamada de sistema crypt(). Se crypt() n ao estiver dispon ivel no seu sistema, ENCRYPT() sempre retorna NULL. Devido a isto recomendamos que voc e use MD5() ou SHA1() em vez dos existentes em sua plataforma. ENCODE(str,senha_str) Criptografa str usando senha_str como a senha. Para descriptografar o resultado, utilize DECODE(). O resultado e uma string bin aria do mesmo tamanho de str. Se voc e deseja salv a-la em uma coluna, use uma coluna do tipo BLOB. DECODE(cript_str,senha_str) Descriptografa o string criptografada cript_str usando senha_str como a senha. cript_str deve ser uma string retornada de ENCODE(). MD5(string) Calcula um checksum MD5 de 128 bits para a string. O valor e retornado como um n umero hexadecimal de 32 digitos que pode, por exemplo, ser usado como uma chave hash: mysql> SELECT MD5("testing"); -> ae2b1fca515949e5d54fb22b8ed95575 Este e o "RSA Data Security, Inc. MD5 Message-Digest Algorithm". SHA1(string) SHA(string) Calcula um checksum SHA1 de 160 bit para a string, como descrito no RFC 3174 (Algoritmo Hash de Seguran ca). O valor e retornado como um n umero hexadecial de 40 digitos, or NULL no caso do argumento ser NULL . Uma das possibilidades para o uso desta fun c ao e a chave hash. Voc e tamb em pode us a-lo como uma fun c ao segura de criptograa para armazenar senhas. mysql> SELECT SHA1("abc"); -> a9993e364706816aba3e25717850c26c9cd0d89d SHA1() foi adicionado na vers ao 4.0.2, e pode ser considerada um equivalente ao MD5() com criptograa mais segura. SHA() e um sin onimo para SHA1(). AES_ENCRYPT(string,string_chave) AES_DECRYPT(string,string_chave) Estas fun c oes permitem criptograa/descriptograa de dados usando o algoritmo ocial AES (Padr ao Avan cado de Criptograa), antes conhecido como Rijndael. Criptgraa com uma chave de 128 bits podem ser usadas, mas voc e pode extend e-la para 256 bits atrav es da fonte. N os escolhemos 128 bits porque e muito mais r apido e e bastante seguro. Os argumentos de entrada podem ser de qualquer tamanho. Se ambos argumentos s ao NULL, o resultado desta fun c ao tam b em ser a NULL. Como o AES e um algor itimo de n ivel de bloco, padding e usado para codicar strings de tamanho impares e ent ao a string resultante pode ser calculada como 16*(trunc(tamanho string/16)+1).
549
Se AES_DECRYPT() detectar dados inv alidos ou padding incorreto, ela retorna NULL. No entanto, e poss ivel para o AES_DECRYPT() retornar um valor n ao-NULL (possivelmente lixo) se os dados de entrada ou a chave eram inv alidos Voc e pode usar as fun c oes AES para armazenar dados de forma criptografada modicando as suas consultas: INSERT INTO t VALUES (1,AES_ENCRYPT(text,password)); Voc e pode obter mais seguran ca n ao transferindo a chave em suas conex oes a cada consulta, o que pode ser conseguido armazenando-o em var aveis do lado do servidor na hora das conex ao. SELECT @password:=my password; INSERT INTO t VALUES (1,AES_ENCRYPT(text,@password)); AES_ENCRYPT() e AES_DECRYPT() foram adicionados na vers ao 4.0.2, e podem ser considerados a fun c ao de criptograa mais segura atualmente dispon ivel no MySQL. DES_ENCRYPT(string_para_ciptografar [, (numero_chave | chave_string) ] ) Criptografa a string com a chave dada utilizando o algortimo Triplo-DES. Note que esta fun c ao s o funciona se o MySQL tiver sido congurado com suporte a SSL. Veja Se c ao 4.4.10 [Conex oes seguras], P agina 269. A chave de criptograa utilizada e escolhida da seguinte forma: Argumento Somente um argumento N umero da chave string Descri c ao A primeira chave de des-key-file e utilizada.
A chave dada (0-9) de des-key-file e utilizada. A chave_string dada ser a utilizada para criptografar string_para_criptografar. O string retornada ser a uma string bin aria onde o primeiro caracter ser a CHAR(128 | n umero_chave). O 128 e adicionado para facilitar o reconhecimento da chave de criptograa. Se voc e usar uma chave string, num ero_chave ser a 127.
Havendo erro, esta fun c ao retorna NULL. O tamanho da string para o resultado ser a novo_tamanho= tamanho_orig + (8-(tamanho_orig % 8))+1. O des-key-file ter a o seguinte formato: numero_chave chave_string_des numero_chave chave_string_des Cada numero_chave deve ser um n uero na faixa de 0 a 9. As linhas do arquivo podem estar em qualquer ordem. chave_string_des e a string que ser a usada para criptografar a mensagem. Entre o n umero e a chave deve haver pelo menos um espa co. A primeira chave e a chave padr ao que ser a utilizada se n ao for especicada nenhuma chave como argumento para DES_ENCRYPT() Voc e pode dizer ao MySQL para ler novos valores de arquivos de chave com o comando FLUSH DES_KEY_FILE. Isto exige o privil egio Reload_priv.
550
Um benef icio de ter um conjunto de chaves padr oes e que ele d a a aplica c ao um modo de vericar a exist encia de valores criptografados em colunas, sem dar ao usu ario nal o direito de descriptografar estes valores. mysql> SELECT endereco_clientes FROM tabela_clientes WHERE cartao_credito_criptografado = DES_ENCRYPT("numero_cartao_credito") DES_DECRYPT(string_para_descriptografar [, chave_string]) Derscritogra uma string criptografada com DES_ENCRYPT(). Note que esta fun c ao s o funciona se o MySQL tiver sido congurado com suporte SSL. Veja Se c ao 4.4.10 [Conex oes seguras], P agina 269. Se nenhum argumento chave_string for dado, DES_DECRYPT() examina o primeiro byte da string criptografada para determinar o n umero de chave DES que foi usado para criptografar a string original, e ent ao l e a chave de des-keyfile para descriptografar a mensagem. Para isto funcionar o usu ario deve ter o privil egio SUPER. Se voc e passar para esta fun c ao um argumento chave_string, aquela string e usada como a chave para descriptografar a mensagem. Se a string_para_descriptografar n ao se paracer com uma string criptografada, o MySQL retornar a a string_para_descriptografar dada. Havendo erro, esta fun c ao retorna NULL. COMPRESS(string_para_compactar) Compacta uma string mysql> SELECT LENGTH(COMPRESS(REPEAT("a",1000))); -> 21 1 row in set (0.00 sec) mysql> SELECT LENGTH(COMPRESS("")); -> 0 1 row in set (0.00 sec) mysql> SELECT LENGTH(COMPRESS("a")); -> 13 1 row in set (0.00 sec) mysql> SELECT LENGTH(COMPRESS(REPEAT("a",16))); -> 15 1 row in set (0.00 sec) COMPRESS() foi adicionado no MySQL 4.1.1. Se exigido, o MySQL tem que ser compilado com uma biblioteca de compacta c ao como zlib. Sen ao , o valor de retorno e sempre NULL. O conte udo da string compactada e armazenada da seguinte forma: Strings vazias s ao armazenadas como strings vazias Strings que n ao est ao vazias s ao armazenadas como um string descompacatada de 4 byte de tamanho (low-byte-rst) seguida pela string compactada com gzip. Se a string naliza com espa co, adicionamos um .
551
extra para evitar problemas com o corte do espa co nal o resultado deve ser armazenado em um campo CHAR ou VARCHAR. O uso de CHAR ou VARCHAR melhor usar para armazenar strings compactadas n ao e recomendado. E uma coluna BLOB. UNCOMPRESS(string_para_descompactar) Descompacta uma string compactado pela fun c ao COMPRESS() mysql> select UNCOMPRESS(COMPRESS("any string")); -> any string 1 row in set (0.00 sec) UNCOMPRESS() foi adicionado no MySQL 4.1.1 Se exigido, o MySQL tem que ser compilado com uma biblioteca de compacta c ao como zlib. Sen ao , o valor de retorno e sempre NULL. UNCOMPRESSED_LENGTH(string_compactada) Retorna o tamanho da string compactada antes da compacta c ao mysql> select UNCOMPRESSED_LENGTH(COMPRESS(REPEAT("a",30))); -> 30 1 row in set (0.00 sec) UNCOMPRESSED_LENGTH() foi adicionado no MySQL 4.1.1 LAST_INSERT_ID([expr]) Retorna o u ltimo valor gerado automaticamente que tenha sido inserido em um coluna AUTO_INCREMENT. mysql> SELECT LAST_INSERT_ID(); -> 195 Ou ltimo ID que foi gerado e mantido no servidor em uma base por conex ao. Isto signica que o valor que a fun c ao retona para um dado cliente e o valor AUTO_INCREMENT gerado mais recentemente por aquele cliente. O valor n ao pode ser afetado pelos outros clientes, mesmo se eles gerarem um valor AUTO_ INCREMENT deles mesmos. Este comportamento assegura que voc e pode recuperar seu pr oprio ID sem se preocupar com a atividade de outros clientes e sem precisar de locks ou transa c oes. O valor de LAST_INSERT_ID() n ao e alterado se voc e atualizar uma coluna AUTO_INCREMENT de uma linha com um valor n ao-m agico (Isto e, um valor que n ao seja NULL e nem 0). Se voc e inserir muitos registros ao mesmo tempo com uma instru c ao insert, LAST_INSERT_ID() retorna o valor da primeira linha inserida. A raz ao para isto e tornar possivel reproduzir facilmente a mesma intru c ao INSERT em algum outro servidor. Se expr e dado com um argumento para LAST_INSERT_ID(), ent ao o valor do argumento e retornado pela fun c ao e e congurado como o pr oximo valor para ser retornado pela LAST_INSERT_ID(). Isto pode ser u til para simular sequ encias: Primeiro crie a tabela: mysql> CREATE TABLE sequencia (id INT NOT NULL);
552
mysql> INSERT INTO sequencia VALUES (0); Ent ao a tabela pode ser usada para gerar sequ encia de n umeros como estes: mysql> UPDATE sequencia SET id=LAST_INSERT_ID(id+1); Voc e pode gerar sequ encias sem chamar LAST_INSERT_ID(), mas a utilidade de se usar a fun c ao deste modo e que o valor ID e mantido no servidor como o u ltimo valor gerado automaticamente (seguro para multi-usur ario). Voc e pode recuperar a nova ID como voc e leria qualquer valor AUTO_INCREMENT normal no MySQL. Por exemplo, LAST_INSERT_ID() (sem um argmento) retornar aa nova ID. A fun c ao mysql_insert_id() da API C tamb em pode ser usada para obter o valor. Note que como mysql_insert_id() s o e atualizado depois de instru c oes INSERT e UPDATE, voc e n ao pode utilizar a fun c ao da API C para recuperar o valor para LAST_INSERT_ID(expr) depois de executar outra instru c ao SQL como SELECT ou SET. Veja Se c ao 12.1.3.31 [mysql_insert_id()], P agina 799. FORMAT(X,D) Formata o n umero X com um format como #,###,###.##, arredondado para D casas decimais, e retorna o resultado como uma string. Se D e 0, o resultado n ao ter a nehum ponto decimal ou parte fracion aria: mysql> SELECT FORMAT(12332.123456, 4); -> 12,332.1235 mysql> SELECT FORMAT(12332.1,4); -> 12,332.1000 mysql> SELECT FORMAT(12332.2,0); -> 12,332 VERSION() Retorna uma string indicando a vers ao do servidro MySQL: mysql> SELECT VERSION(); -> 3.23.13-log Note que se seu vers ao nalizar com -log, signica que o log est a habilitado. CONNECTION_ID() Retorna a identica c ao (ID da thread) desta conex ao. Cada conex ao tem seu pr oprio ID u nico: mysql> SELECT CONNECTION_ID(); -> 23786 GET_LOCK(str,temo_limite) Tenta conseguir uma trava com o nome dado pela string str, com um tempo limite de timeout segundos. Retorna 1 se o bloqueio foi obtido com sucesso, 0 se o tempo esgotou (por exemplo, porque outro cliente ja bloqueou o nome), ou NULL se uma erro ocorreu (tal como estouro de mem oria ou a threado tiver sido nalizada com mysqladmin kill). Uma trava e liberada quando voc e executa RELEASE_LOCK(), executa uma nova GET_LOCK(), ou a thread termina. (tanto de forma normal quanto anormal) Esta fun c ao pode ser usada para implementar bloqueio de aplica c ao ou para simular registros travados. Nomes s ao bloqueados
553
em uma base ampla do servidor. Se um nome foi bloqueado por um cliente, GET_LOCK() trava qualquer pedido de bloqueio de outro cliente com o mesmo nome. Isto permite que clientes que concordam com um dado nome da trava possam usar a string para realizar travamento de consultas cooperativas: mysql> SELECT GET_LOCK("lock1",10); -> 1 mysql> SELECT IS_FREE_LOCK("lock2"); -> 1 mysql> SELECT GET_LOCK("lock2",10); -> 1 mysql> SELECT RELEASE_LOCK("lock2"); -> 1 mysql> SELECT RELEASE_LOCK("lock1"); -> NULL Note que a segunda chamada de RELEASE_LOCK() retorna NULL porque a trava "lock1" foi liberada automaticamente pela segunda chamada GET_LOCK(). RELEASE_LOCK(str) Libera a trava nomeada pela string str que foi obtida com GET_LOCK(). Retorna 1 se a trava foi liberada, 0 se a trava n ao foi bloquada pela thread (caso onde a trava n ao e liberada), e NULL se o nome da trava n ao existe. (A trava nunca exitir a se ela nunca for obtida pela chamada de GET_LOCK() ou se ela ja tiver sido liberada). A instru c ao DO e conveniente para ser utilizada com RELEASE_LOCK(). Veja Se c ao 6.4.10 [DO], P agina 596. IS_FREE_LOCK(str) Verica se a trava chamada str est a livre para ser utilizada (ex. n ao est a bloqueada). Retorna 1 se a trava est a liver (ningu em a esta usando), 0 se a trava est a em uso, e NULL caso ocorra erro (como argumentos incorretos). BENCHMARK(cont,expr) A fun c ao BENCHMARK() executa a express ao expr repetidamente cont vezes. Ela pode ser usada para medir a velocidade em que o MySQL processa a express ao. O valor resultante e sempre 0. A inten c ao e us a-la no clientei mysql, relatando o tempo de execu c ao da consulta: mysql> SELECT BENCHMARK(1000000,ENCODE("hello","goodbye")); +----------------------------------------------+ | BENCHMARK(1000000,ENCODE("hello","goodbye")) | +----------------------------------------------+ | 0 | +----------------------------------------------+ 1 row in set (4.74 sec) O tempo relatado e o tempo decorrido no cliente, n ao o tempo de CPU no servidor. Pode ser aconselh avel executar BENCHMARK() diversas vezes e interpretar o resultado cosiderado o peso da carga da maquina servidora.
554
INET_NTOA(expr) Dado um endere co num erico de rede (4 ou 8 bytes), retorna a representac ao no formato com pontos do endere co como uma string: mysql> SELECT INET_NTOA(3520061480); -> "209.207.224.40" INET_ATON(expr) Dada a represena c ao com pontos de um endere co de rede como uma string, retorna um inteiro que representa o valor num erico deste endere co. Endere cos podem ter 4 ou 8 bytes de endere camento: mysql> SELECT INET_ATON("209.207.224.40"); -> 3520061480 O n umero gerado e sempre na ordem de bytes da rede; por exemplo o n umero acima e calculado como 209*256^3 + 207*256^2 + 224*256 +40. MASTER_POS_WAIT(nome_log, log_pos [, tempo_limite]) Envia blocos o slave alcan car (ex.: ter lido e aplicado todas as atualiza c oes) a posi c ao especica no log master. Se a informa c ao master n ao est a inicializada, ou se os argumentos est ao incorretos, retorna NULL. Se o slave n ao est a em execu c ao, enviar a blocos e ir a esperar at e que ele seja iniciado e v a para (ou passe por) a posi c ao especicada. Se o slave j a passou pela posi c ao especicada, retorna imediatamente. Se tempo_limite (novo na vers ao 4.0.10) e especicado, ir a esperar at e que tempo_limite segundos tenham se passado. tempo_limite deve ser maior que 0; zero ou um tempo_limite negativo signica sem tempo limite. O valor de retorno e o n umero de eventos de log que ele tem que esperar para obter a posi c ao especicada, NULL no caso de erro, ou -1 se o tempo limite tiver sido excedido. O comando eu til para controle de sincroniza c ao mo master/slave. FOUND_ROWS() Uma instru c ao SELECT pode incluir uma cl ausula LIMIT para restringir o n umero de linhas que o servidor retorna para um cliente. Em alguns casos, e desej avel saber quantas linhas a instru c ao teria retornado sem o LIMIT, mas sem executar a instru c ao novamente. Para obter esta contagem de linhas, inclua uma op c ao SQL_CALC_FOUND_ROWS na instru c ao SELECT, ent ao chame FOUND_ROWS() loga depois: mysql> SELECT SQL_CALC_FOUND_ROWS * FROM nome_tabela WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS(); O segundo SELECT ir a retornar um n umero indicando quantas linhas o primeiro SELECT teria retornado se ele fosse escrito sem a cl ausula LIMIT. (Se o instru c ao SELECT anterior n ao inclui a op c ao SQL_CALC_FOUND_ROWS, ent ao FOUND_ROWS() pode retornar um resultado diferente quando LIMIT e usado daquele que n ao e usado). Note que se voc e estiver usando SELECT SQL_CALC_FOUND_ROWS ..., o MySQL tem que calcular quantos registros existem em todo o conjunto de resultados.
555
No entanto, isto e mais r apido que se voc e n ao utilizar LIMIT, j a que o resultado precisa ser enviado ao cliente. SQL_CALC_FOUND_ROWS e FOUND_ROWS() podem ser u teis em situa c oes em que voc e queira restringir o n umero de registros que uma consulta retorna, mas tamb em determinar o n umero de linhas em todo o resultado sem executar a consulta novamente. Um exemplo e um script web que apresenta um display paginado contendo links para as p aginas que mostram outras se c oes de um resultado de busca. Usar FOUND_ROWS() lhe permite determinar quantos outras p aginas s ao necess arias para o resto do resultado. O uso de SQL_CALC_FOUND_ROWS e FOUND_ROWS() e mais complexa para consultas UNION que para instru c oes SELECT simples, porque LIMIT pode ocorrer em v arios lugares em um UNION. Ele pode ser aplicado a instru c oes SELECT individuais no UNION, ou globais ao resultado UNION como um todo. A inten c ao de SQL_CALC_FOUND_ROWS para UNION e que ele deve retornar a contagem das linhas que seriam retornadas sem um LIMIT global. As consi c oes para uso de SQL_CALC_FOUND_ROWS com UNION s ao: A palavra chave SQL_CALC_FOUND_ROWS deve aparecer na primeira SELECT do UNION. O valor de FOUND_ROWS() e exato apenas se UNION ALL for usado. Se UNION sem ALL for usado, as duplicatas s ao removidas e o valor de FOUND_ROWS() e apenas aproximado. Se nenhum LIMIT est a presente no UNION, SQL_CALC_FOUND_ROWS e ignorado e retorna o n umero de linhas na tabela tempor aria que e criada para processar o UNION. SQL_CALC_FOUND_ROWS e FOUND_ROWS() est ao dispon iveis a partir da vers ao 4.0.0 do MySQL.
6.3.7 Fun co es e Modicadores para Usar com Cl ausulas GROUP BY 6.3.7.1 Fun co es GROUP BY
Se voc e utiliza um fun c ao de agrupamento em uma instru c ao que n ao contenha um cl ausula GROUP BY, equivale a fazer um agrupamento com todos os registros. COUNT(expr) Retorna a quantidade instrucao SELECT: mysql> SELECT -> -> -> de valores n ao-NULL nos registros recuperados por uma estudante.nome_estudente,COUNT(*) FROM estudante,curso WHERE estudante.id_estudante=curso.id_estudante GROUP BY nome_estudante;
COUNT(*) difere um pouco ao retornar o n umero de registros recuperados, se eles possuirem ou n ao valores NULL.
556
COUNT(*) e otimizado para retornar muito r apido se SELECT recuoperar registros de uma tabela, nenhuma outra coluna for retornada, e n ao houver nenhuma cl ausula WHERE. Por exemplo: mysql> SELECT COUNT(*) FROM estudente; Esta otimizac ao se aplica apenas a tabelas MyISAM e ISAM, porque uma contagem exata de registros e armazenada para estes tipos de tabelas e podem ser acessadas muito rapidamente. Para mecanismos de armazenamentos transacionais (InnodB, BDB), armazenar um contagem de registros exatos e mais problem atico porque m ultiplas transa c oes podem estar ocorrendo, e cada uma pode afetar a contagem. COUNT(DISTINCT expr,[expr...]) Retorna a quantidade de regiastros com valores n ao-NULL diferentes: mysql> SELECT COUNT(DISTINCT resultados) FROM estudente; No MySQL voc e pode obter o n umero de combina c ao de express oes distintas que n ao cont em NULL fornecendo uma lista de express oes. No SQL-99 voc e teria que concatenar todas as express ao utilizando COUNT(DISTINCT ...). AVG(expr) Retorna o valor m edio de expr: mysql> SELECT nome_estudante, AVG(nota_teste) -> FROM estudante -> GROUP BY nome_estudante; MIN(expr) MAX(expr)
Retorna o valor m inimo o u m aximo de expr. MIN() e MAX() poder usar uma string como argumento; nestes casos eles retornam o a string de valor m inimo ou m aximo. Veja Se c ao 5.4.3 [ Indices do MySQL], P agina 448. mysql> SELECT nome_estudante, MIN(nota_teste), MAX(nota_teste) -> FROM estudante -> GROUP BY nome_estudante; Em MIN(), MAX() e outras fun c oes de agrupamento o MySQL, atualmente, compara colunas ENUM e SET pelo seu valor string em vez de faz e-lo pela sua posi c ao relativa de string no conjunto. Isto ser a reticado.
SUM(expr) Retorna a soma de expr. Note que se o conjunto de retorno n ao possuir registros ele retornar a NULL! GROUP_CONCAT(expr) Sintaxe completa: GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {inteiro_sem_sinal | nome_coluna | formula} [ASC | [SEPARATOR valor_str]) Esta fun c ao foi adicionada na vers ao 4.1 do MySQL. Ele retorna a string resultante contendo valores de um grupo:
557
mysql> SELECT nome_estudante, -> GROUP_CONCAT(note_teste) -> FROM estudante -> GROUP BY nome_estudante; ou mysql> SELECT nome_estudante, -> GROUP_CONCAT(DISTINCT nota_teste -> ORDER BY nota_teste DESC SEPARATOR " ") -> FROM estudante -> GROUP BY nome_estudante; No MySQL voc e pode obter valores de combina c oes de express oes concatenados. Voc e pode eliminar valores duplicados utilizando DISTINCT. Se voc e quiser ordenar valores no resultado voc e deve utilizar a cl ausula ORDER BY. Para ordenar inversamente, adicione a palavra chave DESC (descendente) ao nome da coluna que voc e est a ordenando na cl ausula ORDER BY. O padr ao e a ordem crescente; pode-se tamb em especic ala explicitamente usando a palavra chave ASC. SEPARATOR e o valor string que deve ser inserido entre os valores no resultado. O padr ao e um virgula (","). Voc e pode remover o separador especicando SEPARATOR "". Voc e pode denir um tamanho m aximo permitido com a vari avel group_ concat_max_len em sua congura c ao. A sintaxe para se fazer isto em tempo de execu c ao e: SET [SESSION | GLOBAL] group_concat_max_len = unsigned_integer; Se um tamanho m aximo tiver sido atribuido, o resultado e truncado no seu tamanho m aximo. A fun c ao GROUP_CONCAT() e uma implementa c ao aprimorada da fun c ao b asica LIST() suportada pelo Sybase SQL Anywhere. GROUP_CONCAT() e compat ivel com a funcionalidade extrwemamente limitada de de LIST(), se utilizada em apenas uma coluna e nenhuma outra op c ao e especicada. LIST() n ao tem uma ordem de classica c ao padr ao. VARIANCE(expr) Retorna a vari ancia padr ao de expr (considerando linha como toda a popula c ao, n ao com uma amostra; assim ele tem o n umero de linhas como denominador). Esta e uma extens ao do SQL-99 (dispon ivel somente a partir da vers ao 4.1). STD(expr) STDDEV(expr) Retorna o desvio padr ao de expr (a raiz quadrada de VARIANCE()). Esta e uma extens ao do SQL-99. O formato STDDEV() desta fun c ao e fornecida para compatibilidade com Oracle. BIT_OR(expr) Retorna o resultado da opera c ao bin aria OR de todos os bits em expr. O calcululo e relizado com precis ao de 64 bits (BIGINT). A fun c ao retortna 0 se n ao houver registros coincidentes.
558
BIT_XOR(expr) Retorna o bitwise XOR de todos os bits em expr. O calculo e relizado com precis ao de 64-bits (BIGINT). A fun c ao retorna 0 se n ao houver linhas coincidentes. Esta fun c ao est a dispon ivel a partir do MySQL 4.1.1. BIT_AND(expr) Retorna o resultado da opera c ao bin aria AND de todos os bits em expr. O calcululo e relizado com precis ao de 64 bits (BIGINT). A fun c ao retortna 1 se n ao houver registros coincidentes.
559
+------+-------------+ | 2000 | 4525 | | 2001 | 3010 | | NULL | 7535 | +------+-------------+ A linha de total super-agrupada e identicada pelo valor NULL na coluna year. ROLLUP tem um efeito mais complexo quando h a m ultiplas colunas GROUP BY. Neste caso, cada vez que houver um break (altera c ao no valor) em qualquer agrupamento, com exce c ao da u ltima coluna, a consulta produz um linha resumo super-agrupada extra. Por exemplo, sem ROLLUP, um resumo na tabela sales baseada no year, country e product pode se parecer com isto: mysql> SELECT year, country, product, SUM(profit) -> FROM sales -> GROUP BY year, country, product; +------+---------+------------+-------------+ | year | country | product | SUM(profit) | +------+---------+------------+-------------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | | 2000 | USA | Calculator | 75 | | 2000 | USA | Computer | 1500 | | 2001 | Finland | Phone | 10 | | 2001 | USA | Calculator | 50 | | 2001 | USA | Computer | 2700 | | 2001 | USA | TV | 250 | +------+---------+------------+-------------+ A saida indica os valores resumidos apenas no n ivel year/country/product da an alise. Quando ROLLUP e adicionado, a consulta produz diversas linhas extras: mysql> SELECT year, country, product, SUM(profit) -> FROM sales -> GROUP BY year, country, product WITH ROLLUP; +------+---------+------------+-------------+ | year | country | product | SUM(profit) | +------+---------+------------+-------------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | Finland | NULL | 1600 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | | 2000 | India | NULL | 1350 | | 2000 | USA | Calculator | 75 | | 2000 | USA | Computer | 1500 | | 2000 | USA | NULL | 1575 |
560
| 2000 | NULL | NULL | 4525 | | 2001 | Finland | Phone | 10 | | 2001 | Finland | NULL | 10 | | 2001 | USA | Calculator | 50 | | 2001 | USA | Computer | 2700 | | 2001 | USA | TV | 250 | | 2001 | USA | NULL | 3000 | | 2001 | NULL | NULL | 3010 | | NULL | NULL | NULL | 7535 | +------+---------+------------+-------------+ Para esta consulta, adicionar ROLLUP faz com que a sa ida inclua uma informa c ao resumida nos qualtro n iveis de an alise, n ao s o em um. Aqui est a como interpretar a sa ida ROLLUP: Seguindo cada conjunto de produtos para um dado ano e pa is, um linha de resumo extra e produzida mostrando o total para todos os produtos. Estas linhas t em a coluna product atribu ida com NULL. Seguindo cada conjunto de linhas para um dado ano, uma l;inha resumo extra e produzida mostrando o total para todos os pa ises e produtos. Estas linhas t em as colunas country e products atribu idas com NULL. Finalmente, seguindo todas as outras linhas, um linha resumo extra e produzida mostrando o total geral para todos os anos, paises e produtos. Esta linha tem as colunas year, country e products atribu idas com NULL. Outras Considera c oes ao Usar ROLLUP O seguinte item lista alguns comportamentos espec icaos para a implementa c ao do ROLLUP no MySQL: Quando voc e usa ROLLUP, voc e n ao pode usar uma cl ausula ORDER BY para ordenar os resultados. (Em outras palavras, ROLLUP e ORDER BY s ao exclusivos mutualmente.) No entanto, voc e ainda tem algum controle sobre a ordem de ordena c ao. O GROUP BY no MySQL ordena os resultados, e voc e pode usar as palavras chaves ASC e DESC explicitamente com colunas chamadas na lista GROUP BY para especicar a ordem de classica c ao para colunas individuais. (A linha resumo de n ivel mais alto adicionado por ROLLUP ainda aparece depois da linha para as quais elas s ao calculadas, considerando a ordena c ao.) LIMIT pode ser usado para restringir o n umerod e linhas retornadas para o cliente. LIMIT e aplicado depois do ROLLUP, assim o limite se aplica contra as linhas extras adicionadas por ROLLUP. Por exemplo: mysql> SELECT year, country, product, SUM(profit) -> FROM sales -> GROUP BY year, country, product WITH ROLLUP -> LIMIT 5; +------+---------+------------+-------------+ | year | country | product | SUM(profit) | +------+---------+------------+-------------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | Finland | NULL | 1600 | | 2000 | India | Calculator | 150 |
561
| 2000 | India | Computer | 1200 | +------+---------+------------+-------------+ Note que usar LIMIT com ROLLUP pode produzir resultados mais dif iceis de interpretar, porque voc e t em menos contexto para entender as linhas super agrupadas. O indicador NULL em cada linha super-agrupadas s ao produzidas quando a linha e enviada para o cliente. O servidor olha por cada coluna chamada na cl ausula GROUP BY seguindo aquela mais a esquerda que tem o valor alterado. Para qualquer coluna no resultado com o nome que e uma combina c ao l exica de qualquer daqueles nomes, seu valor e denido com NULL. (Se voc e especica o agrupamento de colunas pelo n umero da coluna, o servidor identica quais colunas denir com NULL pelo n umero.) Como os valores NULL em linhas super agrupadas s ao colocadas dentro do resultado como um est agio posterior no processamento da consulta, voc e n ao pode test a-los com valores NULL dentro da pr opria consulta. Por exemplo, voc e n ao pode adicionar HAVING product IS NULL a consulta para eliminar da sa ida todas as linhas com exce c ao das agrupadas. Por outro lado, o valor NULL aparece como NULL no lado do cliente e pode ser testado usando qualquer interface de programa c ao do cliente MySQL.
562
563
A cl ausula FROM table_references indica a tabela de onde os registros ser ao retornados. Se voc e indicar mais de uma tabela, voc e estar a realizando uma join. Para informa c oes sobre a sintaxe de join, veja Se ca o 6.4.1.1 [JOIN], P agina 567. Para cada tabela especicada, voc e pode, opcionalmente, especicar um alias.
nome_tabela [[AS] alias] [[USE INDEX (lista_indice)] | [IGNORE INDEX (lista_indi Como na vers ao 3.23.12 do MySQL, voc e pode dar sugest oes sobre qual indice o MySQL deve usar ao recuperar informa c oes de uma tabela. Isto eu til se EXPLAIN mostrar que o MySQL esta utilizando o indice errado da lista de indices poss iveis. Especicando USE INDEX (lista_indice) voc e pode dizer ao MySQL para usar somente um dos indices possiveis para encontrar registros em uma tabela. A sintaxe alternativa IGNORE INDEX (lista_indice) pode ser usada para dizer ao MySQL para n ao utilizar alguns indices particulares. Na vers ao 4.0.9 do MySQL voc e tamb em pode usar FORCE INDEX. Ele funciona como USE INDEX (lista_indice) mas ele assume que uma varredura em uma tabelas e MUITO cara. Em outras palavras, uma varredura s o ser a usada se n ao houver nenhum modo de utilizar um dos indices dados para encontrar registros nas tabelas. USE/IGNORE/FORCE KEY e sin onimo de USE/IGNORE/FORCE INDEX. Nota: USE/IGNORE/FORCE INDEX afeta apenas os indices usados quando o MySQL decide como encontrar registros na tabela e como fazer a liga c ao. Ele n ao tem efeito se um indice ser a usado ao resolver um ORDER BY ou GROUP BY. No MySQL 4.0.14 voc e pode usar SET MAX_SEEKS_FOR_KEY=# como um modo alternativo de for car o MySQL a preferir a busca em chaves em vez de varrer a tabela. Voc e pode se referir a uma tabela como nome_tabela (dentro do banco de dados atual) ou como nomebd.nome_tabela para especicar um banco de dados. Voc e pode se referir a um coluna como nome_coluna, nome_tabela.nome_coluna ou nomebd.nome_tabela.nome_coluna. Voc e n ao precisa especicar um prexo nome_tabla ou nomebd.nome_tabela para refer encia a uma coluna em uma instru c ao SELECT a menos a refer encia seja amb igua. Veja Se c ao 6.1.2 [Legal names], P agina 472, para exemplos de ambiguidade que exigem a forma mais explicita de refer encia a coluna. A partir da vers ao 4.1.0, voc e pode especicar DUAL como um nome de tabela dummy, em situa c oes onde nenhuma tabela for refer enciada. Este e um recurso puramente para compatibilidade, alguns outros servidores exijem esta sintaxe. mysql> SELECT 1 + 1 FROM DUAL; -> 2 Pode se denir um alias fazendo refer encia a uma tabela utilizando nome_tabela [AS] nome_alias: mysql> SELECT t1.nome, t2.salario FROM funcionarios AS t1, info AS t2 -> WHERE t1.nome = t2.nome; mysql> SELECT t1.nome, t2.salario FROM funcionarios t1, info t2 -> WHERE t1.nome = t2.nome; Colunas selecionadas para sa ida podem ser referidas em cl ausulas ORCER BY e GROUP BY usando nomes de colunas, alias de colunas ou posi c oes de colunas. As posi c oes de colunas come cam com 1:
564
mysql> SELECT college, region, seed FROM tournament -> ORDER BY region, seed; mysql> SELECT college, region AS r, seed AS s FROM tournament -> ORDER BY r, s; mysql> SELECT college, region, seed FROM tournament -> ORDER BY 2, 3; Para ordenar inversamente, adicione a palavra-chave DESC (descendente) ao nome da coluna na cl ausula ORDER BY na qual voc e est a ordenando. A ordem padr ao e ascedente; ela pode ser especicada explicitamente usando a palavra-chave ASC. Na cl ausula WHERE, voc e pode usar qualquer uma das fun c oes suportadas pelo MySQL. Exceto para fun c oes de agruopamento (resumo) Veja Se c ao 6.3 [Fun c oes], P agina 504. A cl ausula HAVING pode se referir a qualquer coluna ou alias denido na express~ ao_ select. Ele e aplicado no nal, pouco antes dos itens serem enviados ao cliente, sem otimiza c ao. LIMIT e aplicada depois de HAVING.) estar na cl ausula WHERE. Por exemplo, n ao escreva isto: mysql> SELECT nome_col FROM nome_tabela HAVING nome_col > 0; Escreva assim: mysql> SELECT nome_col FROM nome_tabela WHERE nome_col > 0; Na vers ao 3.22.5 ou posterior, voc e tamb em pode escrever consultar desta forma: mysql> SELECT usuario,MAX(salario) FROM usuarios -> GROUP BY usuario HAVING MAX(salario)>10; Em vers oes mais antigas, voc e pode escrever desta forma: mysql> SELECT usuario,MAX(salario) AS soma FROM usuarios -> group by usuario HAVING soma>10; As op c oes DISTINCT, DISTINCTROW e ALL especicam quando registros duplicados devem ser retornados. O padr ao e (ALL), todos os registros coincidentes s ao retornaodos. DISTINCT e DISTINCTROW s ao sin onimos e espcicam que registros duplicados no conjunto de resultados devem ser remopvidos. STRAIGHT_JOIN, HIGH_PRIORITY e op c oes come cando com SQL_ s ao extens oes do MySQL para SQL-99. No MySQL 4.1.1, GROUP BY permite um modicador WITH ROLLUP. Se c ao 6.3.7.2 [Modicadores GROUP BY], P agina 558. Veja
HIGH_PRIORITY dar a uma prioridade maior ao SELECT do que para uma instru c ao que atualizam uma tabela. Voc e s o deve isto para consultas que sejam r apidas e devam ser feitas imediatamente. Uma consulta SELECT HIGH_PRIORITY retornar a se a tabela est a bloqueada para leitura memsmo se houver uma instru c ao de atualiza c ao que estiver esperando a libera c ao da tabela. SQL_BIG_RESULT pode ser usado com GROUP BY ou DISTINCT para dizer ao otimizador que o conjunto de resultados ter a muitas linhas. Neste caso, o MySQL usar a diretamente tabelas temporarias em disco se necess ario. O MySQL tamb em ir a, neste caso, preferir ordenar fazendo uma tabela tempor aria com um cahve nos elementos GROUP BY.
565
SQL_BUFFER_RESULT for ca para que o resultado seja colocado em uma tabela tempor aria. Isto ajuda o MySQL a liberar as travas de tabelas mais cedo e ajudar a nos casos onde ele lev a muito tempo para enviar o conjunto de resultado ao cliente. SQL_SMALL_RESULT, uma op c ao especica do MySQL, pode ser usada com GROUP BY ou DISTINCT para dizer ao otimizador que o conjunto de resultados ser a pequeno. Neste caso, o MySQL usa tabelas tempor arias r apidas para armazenar a tabela resultante em vez de usar ordena c ao. Na vers ao 3.23 do MySQL isto n ao e necess ario normalmente. SQL_CALC_FOUND_ROWS (vers ao 4.0.0 e acima) diz ao MySQL para calcular quantas linhas haveriam no conjunto de resultados, desconsiderando qualquer cl ausula LIMIT. O n umero de linhas pode ser recuperado com SELECT FOUND_ROWS(). Veja Se c ao 6.3.6.2 [Fun c oes diversas], P agina 546. Por favor, note que em nvers oes anteriores a 4.1.0 isto n ao funciona com LIMIT 0, o qual e otimizado para retornar instantaneamente (resultando em 0 registros). Veja Se c ao 5.2.9 [Otimiza c ao LIMIT], P agina 438. SQL_CACHE diz ao MySQL para armazenar o resultado da consulta em um cache de consultas se voc e estiver utilizando QUERY_CACHE_TYPE=2 (DEMAND). Veja Se c ao 6.9 [Cache de consultas], P agina 624. No caso da consulta com UNIONs e/ou subqueries esta op c ao ter a efeito se usada em qualquer SELECT da consulta. SQL_NO_CACHE diz ao MySQL para n ao armazenar o resulado da consulta nesta cache de consultas. Veja Se c ao 6.9 [Cache de consultas], P agina 624. No caso da consulta com UNIONs e/ou subqueries esta op c ao ter a efeito se usada em qualquer SELECT da consulta. Se voc e utiliza GROUP BY, os registros de sa ida ser ao ordenados de acordo com o GROUP BY como se voc e tivesse um ORDER BY sobre todos os campos no GROUP BY. O MySQL tem expandido a cl ausula GROUP BY para que voc e tamb em possa especicar ASC e DESC depois das colunas chamadas na cl ausula: SELECT a,COUNT(b) FROM tabela_teste GROUP BY a DESC O MySQL tem extendido o uso do GROUP BY para lhe permitir selecionar campos que n ao est ao mencionados na cl ausula GROUP BY. Se voc e n ao est a conseguindo os resultados esperados ara a sua consulta, leia a descri c ao de GROUP BY. Veja Se c ao 6.3.7 [Group by functions and modiers], P agina 555. A partir do MySQL 4.1.1, GROUP BY permite um modicador WITH ROLLUP. Veja Se c ao 6.3.7.2 [GROUP BY Modiers], P agina 558. A cl ausula LIMIT pode ser usada para restringir o n umero de linhas retornadas pela instru c ao SELECT. LIMIT utiliza um ou dois agumebntos num ericos, que devem ser constants inteiras. Com um argumento. o valor especif ica o n umero de linhas para retornar do in icio do resultado. Com dois argumentos, o primeiro especica a posi c ao do primeiro registro a ser retornado e o segundo especica o n umero m aximo de linhas a retornar. A posi c ao do registro inicial e 0 (n ao 1): Para ser compat ivel com o PostgreeSQL, o MySQL suporta a sintaxe: LIMIT row_count OFFSET offset. mysql> SELECT * FROM tabela LIMIT 5,10; # Recupera linhas 6-15
566
To retrieve all rows from a certain oset up to the end of the result set, you can use -1 for the second parameter: mysql> SELECT * FROM tabela LIMIT 95,-1; # Recupera linhas 96-ultima. Se um dos argumentos e dado, ele indica o n umero m aximo de linhas a retornar: mysql> SELECT * FROM tabela LIMIT 5; # Recupera as primeiras 5 linhas Em outras palavras, LIMIT n e equivalente a LIMIT 0,n. A forma SELECT ... INTO OUTFILE nome_arquivo do SELECT grava os registros selecionados em um arquivo. O arquivo e criado na m aquina servidora e n ao pode j a existir (entre outras coisas, isto previne tabelas de banco de dados e arquivos tais como /etc/passwd de serem destru idos). Voc e deve ter o privil egio FILE na m aquina servidora para utilizar esta forma de SELECT. A instru c ao SELECT ... INTO OUTFILE tem como inten c ao deixar que voc e descarregue rapidamente um tabela de uma m aquina servidora. Se voc e quiser criar o arquivo resultante em outra m aquina, diferente do servidor, voc e n ao deve usar SELECT ... INTO OUTFILE. Neste caso voc e deve usar algum programa cliente como mysqldump --tab ou mysql -e "SELECT..." > outfile para gerar o arquivo. SELECT ... INTO OUTFILE e o complemento de LOAD DATA INFILE; a sintaxe para a parte op c~ oes_exporta c~ ao de uma instru c ao consiste das mesmas cl ausulas CAMPOS e LINHAS que s ao usadas com a instru c ao LOAD DATA INFILE. Veja Se c ao 6.4.8 [LOAD DATA], P agina 587. No arquivo texto resultante, somente os seguintes coracteres s ao escritos com o caracter ESCAPE BY: O caracter ESCAPE BY O primeiro caracter em FIELDS TERMINATED BY O primeiro caracter em LINES TERMINATED BY Adicionalmente, ASCII 0 e convertido para ESCAPE BY seguido por 0 (ASCII 48). A raz ao para o mostrado acima e que voc e deve escapar qualquer caracter FIELDS TERMINATED BY, ESCAPE BY, or LINES TERMINATED BY para termos a seguran ca que o feito escape de ASCII 0 para facilitar a visuzliza arquivo poder a ser lido de volta. E c ao com alguns paginadores. Como o arquivo resultante n ao tem que estar em conformidade com a sintaxe SQL, nada mais precisa ser seguido de caraceres de escape. Aqui segue um exemplo de como se obter um arquivo no formato usado por muitos programas antigos. SELECT a,b,a+b INTO OUTFILE "/tmp/result.text" FIELDS TERMINATED BY , OPTIONALLY ENCLOSED BY " LINES TERMINATED BY "\n" FROM tabela_teste; Se voc e utilizar INTO DUMPFILE em vez de INTO OUTFILE, o MySQL s o ir a escrever um linha no arquivo, sem nenhum terminador de linha ou colunas e sem realizar nenhum processo de escape. Ele eu til se voc e quiser armazenar um valor BLOB em um arquivo. Note que qualuqer arquivo criado por INTO OUTFILE e INTO DUMPFILE ser ao escritos por todos os usu arios no servidor! A raz ao e que o servidor MySQL n ao pode criar
567
um arquivo que pertence a qualquer um al em do usu ario que o est a executando (voc e nunca deve executar mysqld como root). Assim o arquivo tem que poder ser gravado por todos para que voc e possa manipular o seu conte udo. Uma cl ausula PROCEDURE chama um procedimento que devia processar os dados em um resultado. Para um exemplo, veja Se c ao 14.3.1 [procedure analyse], P agina 905. Se voc e utilizar FOR UPDATE em um mecanismo de armazenamento com locks de p aginas ou registros, as linhas examinadas ser ao travadas para escrita at e o m da transa c ao atual.
568
-> WHERE tabela2.id IS NULL; Este exemplo encontra todas as linhas em tabela1 com um valor id que n ao est a presente em tabela2 (isto e, toda as linhas em tabela1 sem linha correspondente em tabela2). Assume-se que tabela2.id e declarada NOT NULL. Veja Se c ao 5.2.7 [Otimiza c ao LEFT JOIN], P agina 436. A cl ausula USING (lista_colunas) nomeia uma lista de colunas que devem existir em ambas as tabelas. As seguintes duas cl ausulas s ao semanticamente id enticas: a LEFT JOIN b USING (c1,c2,c3) a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3 Um NATURAL [LEFT] JOIN de duas tabelas e denido para ser semanticamente equivalente a um INNER JOIN ou um LEFT JOIN com uma cl ausula USING que nomeia todas as colunas que exitem em ambas as tabelas. INNER JOIN e , (v irgula) s ao semanticamente equivalentes na aus encia da condi c ao join: ambos produzir ao um produto Cartesiano entre as tabelas especicadas. (isto e, todos os registros na primeira tabela ser ao ligados com todos os registros na segunda tabela). RIGHT JOIN funciona de forma an aloga a um LEFT JOIN. Para manter o c odigo port avel entre banco de dados, e recomendado usar LEFT JOIN em vez de RIGHT JOIN. STRAIGHT_JOIN e identico a JOIN, exceto pelo fato de que a tabela de esquerda sempre e lida antes da tabela da direita. Ele pode ser usado para aqueles casos (poucos) onde o otimizador join coloca as tabelas na ordem errada. Como na vers ao 3.23.12, voc e pode dar sugest oes sobre qual indice o MySQL deve us quando retornar informa c oes de uma tabela. Isto e u til se EXPLAIN mostar que o MySQL est a utilizando o indice errado da lista de indices poss iveis. Especicando USE INDEX (lista_indice), voc e pode dizer ao MySQL para usar somente um dos indices poss iveis para encontrar registros em uma tabela. A sintaxe alternativa IGNORE INDEX (lista_indice) pode ser usado para dizer ao MySQL para n ao utilizar indices particulares. Na vers ao 4.0.9 do MySQL voc e tamb em pode utilizar FORCE INDEX. Ele funciona como USE INDEX (key_list) mas com assume que uma varredura na tabela e MUITO cara. Em outras palavras, uma varredura na tabela s o ser a feita se n ao houver modo de uitlizar um dos indices fornecidos para se enecontrar registros no tabela. USE/IGNORE KEY s ao sin onimos de USE/IGNORE INDEX. Nota: USE/IGNORE/FORCE INDEX afeta apenas os indices usados quando o MySQL decide como encontrar registros na tabela e como fazer a liga c ao. Ele n ao tem efeito se um indice ser a usado ao resolver um ORDER BY ou GROUP BY. Alguns exemplos: mysql> SELECT * FROM tabela1,tabela2 WHERE tabela1.id=tabela2.id; mysql> SELECT * FROM tabela1 LEFT JOIN tabela2 ON tabela1.id=tabela2.id; mysql> SELECT * FROM tabela1 LEFT JOIN tabela2 USING (id); mysql> SELECT * FROM tabela1 LEFT JOIN tabela2 ON tabela1.id=tabela2.id -> LEFT JOIN tabela3 ON tabela2.id=tabela3.id; mysql> SELECT * FROM tabela1 USE INDEX (chave1,chave2) -> WHERE chave1=1 AND chave2=2 AND chave3=3;
569
mysql> SELECT * FROM tabela1 IGNORE INDEX (chave3) -> WHERE chave1=1 AND chave2=2 AND chave3=3; Veja Se c ao 5.2.7 [Otimiza c ao LEFT JOIN], P agina 436.
570
elas s ao, na opini ao de muitas pessoas, leg iveis. De fato, foi a inova c ao das subqueries que deu ` as pessoas a id eia original do nome SQL Structured Query Language. Com vers oes MySQL anteriores era necess ario evitar ou contornar as subqueries, mas as pessoas que come cam a escrever c odigo agora descobrir ao que subqueries s ao uma parte muito u til do pacote de ferramentas. Aqui est a uma instru c ao exemplo que mostra o ponto principal sobre a sintaxe de subquery como especicado pelo SQL padr ao e suportado no MySQL. DELETE FROM t1 WHERE s11 > ANY (SELECT COUNT(*) /* no hint */ FROM t2 WHERE NOT EXISTS (SELECT * FROM t3 WHERE ROW(5*t2.s1,77)= (SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM (SELECT * FROM t5) AS t5))); Para as vers oes do MySQL anteriores a 4.1, a maioria da subqueries podem ser reescritas com sucesso usando join e outros m etodos. Veja Se c ao 6.4.2.11 [Rewriting subqueries], P agina 577.
571
CREATE TABLE t2 (s1 INT); INSERT INTO t2 VALUES (2); Then perform a SELECT: SELECT (SELECT s1 FROM t2) FROM t1; The result will be 2 because there is a row in t2, with a column s1, with a value of 2. The subquery may be part of an expression. If it is an operand for a function, dont forget the parentheses. For example: SELECT UPPER((SELECT s1 FROM t1)) FROM t2;
572
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2); The word SOME is an alias for ANY. Thus these two statements are the same: SELECT s1 FROM t1 WHERE s1 <> ANY (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2); Use of the word SOME is rare, but the above example shows why it might be useful. The English phrase a is not equal to any b means, to most peoples ears, there is no b which is equal to a which isnt what is meant by the SQL syntax. By using <> SOME instead, you ensure that everyone understands the true meaning of the query.
573
column1 = ANY (SELECT column1 FROM t2) would be TRUE, but in this example the WHERE clause within the subquery is FALSE (because 7 <> 5), so the subquery as a whole is FALSE. Scoping rule: MySQL evaluates from inside to outside. For example: SELECT column1 FROM t1 AS x WHERE x.column1 = (SELECT column1 FROM t2 AS x WHERE x.column1 = (SELECT column1 FROM t3 WHERE x.column2 = t3.column1)); In the above, x.column2 must be a column in table t2 because SELECT column1 FROM t2 AS x ... renames t2. It is not a column in table t1 because SELECT column1 FROM t1 ... is an outer query which is further out. For subqueries in HAVING or ORDER BY clauses, MySQL also looks for column names in the outer select list. MySQLs unocial recommendation is: avoid correlation because it makes your queries look more complex, and run more slowly.
574
575
SELECT AVG(sum_column1) FROM (SELECT SUM(column1) AS sum_column1 FROM t1 GROUP BY column1) AS t1; Notice that the column name used within the subquery (sum_column1) is recognized in the outer query. At the moment, subqueries in the FROM clause cannot be correlated subqueries.
576
Error 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000 Message = "You cant specify target table x for update in FROM clause" This error will occur in cases like this: UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1); Its okay to use a subquery for assignment within an UPDATE statement, since subqueries are legal in UPDATE and in DELETE statements as well as in SELECT statements. However, you cannot use the same table, in this case table t1, for both the subquerys FROM clause and the update target. Usually, failure of the subquery causes the entire statement to fail.
577
SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t2.column1=t1.column1 AND t2.column2=t1.column2); Using NOT (a = ANY (...)) rather than a <> ALL (...). Using x = ANY (table containing {1,2}) rather than x=1 OR x=2. Using = ANY rather than EXISTS The above tricks may cause programs to go faster or slower. Using MySQL facilities like the BENCHMARK() function, you can get an idea about what helps in your own situation. Dont worry too much about transforming to joins except for compatibility with older versions. Some optimizations that MySQL itself will make are: 1. MySQL will execute non-correlated subqueries only once, (use EXPLAIN to make sure that a given subquery really is non-correlated), 2. MySQL will rewrite IN/ALL/ANY/SOME subqueries in an attempt to take advantage of the possibility that the select-list columns in the subquery are indexed, 3. MySQL will replace subqueries of the form ... IN (SELECT indexed_column FROM single_table ...) with an index-lookup function, which EXPLAIN will describe as a special join type, 4. MySQL will enhance expressions of the form value {ALL|ANY|SOME} {> | < | >= | <=} (non-correlated subquery) with an expression involving MIN or MAX (unless NULLs or empty sets are involved). For example, WHERE 5 > ALL (SELECT x FROM t) might be treated as WHERE 5 > (SELECT MAX(x) FROM t) There is a chapter titled How MySQL Transforms Subqueries in the MySQL Internals Manual, which you can nd by downloading the MySQL source package and looking for a le named internals.texi.
578
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL; A LEFT [OUTER] JOIN can be faster than an equivalent subquery because the server might be able to optimise it better a fact that is not specic to MySQL Server alone. Prior to SQL-92, outer joins did not exist, so subqueries were the only way to do certain things in those bygone days. Today, MySQL Server and many other modern database systems oer a whole range of outer joins types. For more complicated subqueries you can often create temporary tables to hold the subquery. In some cases, however, this option will not work. The most frequently encountered of these cases arises with DELETE statements, for which standard SQL does not support joins (except in subqueries). For this situation there are three options available: The rst option is to upgrade to MySQL version 4.1. The second option is to use a procedural programming language (such as Perl or PHP) to submit a SELECT query to obtain the primary keys for the records to be deleted, and then use these values to construct the DELETE statement (DELETE FROM ... WHERE ... IN (key1, key2, ...)). The third option is to use interactive SQL to construct a set of DELETE statements automatically, using the MySQL extension CONCAT() (in lieu of the standard || operator). For example: SELECT CONCAT(DELETE FROM tab1 WHERE pkid = , "", tab1.pkid, "", ;) FROM tab1, tab2 WHERE tab1.col1 = tab2.col2; You can place this query in a script le and redirect input from it to the mysql command-line interpreter, piping its output back to a second instance of the interpreter: shell> mysql --skip-column-names mydb < myscript.sql | mysql mydb MySQL Server 4.0 supports multiple-table DELETEs that can be used to eciently delete rows based on information from one table or even from many tables at the same time. Multiple-table UPDATEs are also supported from version 4.0.
or
or
579
INSERT insere novos registros em uma tabela existente. A forma INSERT ... VALUES da instru c ao insere registros baseado em valores especicados explicitamente. A forma INSERT ... SELECT insere linhas selecionadas de outra(s) tabela(s). A forma INSERT ... VALUES com listas de m ultiplos valores e suportado a partir da vers ao 3.22.5. A sintaxe nome_ coluna=express~ ao e suportada a partir da ver ao 3.22.10 do MySQL. nome_tabela e a tabela na qual as linhas ser ao inseridas. A lista de nome das colunas ou a cl ausula SET indica para quais colunas a instru c ao especica valor: Se voc e n ao especicar a lista de colunas para INSERT ... VALUES ou INSERT ... SELECT, os valores para todas as colunas na tabela devem ser fornecidos na lista VALUES() ou pelo SELECT. Se voc e n ao souber a ordem das colunas nas tabelas, use DESCRIBE nome_tabela para descobrir. Qualquer coluna que n ao tiver o valor fornecido explicitamente assumir a o seu valor padr ao. Por exemplo, se voc e especicar uma lista de colunas que n ao denem todas as coolunas na tabela, ` as colunas n ao denidas ser ao atribu idos o seu valor padr ao. Atribui c ao de valor padr ao e denido em Se ca o 6.5.3 [CREATE TABLE], P agina 597. Voc e tamb em pode utilizar a palavra-chave DEFAULT para atribuir o valor padr ao a uma coluna (Novo na vers ao 4.0.3. do MySQL). Fica mais f acil de se escrever instru c oes INSERT que atribuem valor a apenas algumas colunas porque ele permite que voc e evite escrever uma lista VALUES() incompleta (uma lista que n ao inclu um valor para cada coluna da tabela). De outa forma, voc e teria que escrever a lista de nomes de colunas correspondentes a cada valor na lista VALUES(). MySQL sempre tem uma valor padr ao para todos os campos. Isto e algo imposto pelo MySQL para estar apto a funcionar com tabelas transacionais e n ao transcaionais. Nossa vis ao e que a verica c ao do conte udo dos campos deve ser feita pela application and not in the database server. Uma express~ ao pode se referir a qualquer coluna que tenha sida denaida anteriormente na lista de valores. Por exemplo, voc e pode dizer: mysql> INSERT INTO nome_tabela (col1,col2) VALUES(15,col1*2); Mas n ao: mysql> INSERT INTO nome_tabela (col1,col2) VALUES(col2*2,15); Se voc e especicar a palavra chave DELAYED, o servidor coloca a linha ou linhas a serem inseridas em um buer, e o cliente que envia a instru c ao INSERT DELAYED ent ao pode contiuar. Se a tabela est a ocupada, o servidor guarda a linha. Quando a tabela ca livre, ele come ca a inserir linhas, vericando peri odicamente para ver se h a novos pedidos de leitura para a tabela. Se houver, a la de linhas atrasadas e suspensa at e que a tabela que livre de novo. Se voc e especicar a palavra-chave LOW_PRIORITY, a execu c ao do INSERT e atrasada at e que nenhum outro cliente esteja lendo a tabela. Isto inclui outros clientes que come cam a ler enquanto clientes existentes j a est ao lendo e enquanto a instru c ao INSERT LOW_ poss PRIORITY est a esperando. E ivel, consequentemente, para um cliente que envia uma instru c ao INSERT LOW_PRIORITY esperar por um tempo muito longo (ou mesmo para diferente de INSERT DELAYED, que deixa sempre) em um ambiente de muita leitura. (E o cliente continuar de uma vez. Veja Se c ao 6.4.3.2 [INSERT DELAYED], P agina 581. Note que LOW_PRIORITY n ao deve normalmente ser usado com tabelas MyISAM ja que elas disabilitam inser c oes concorrentes. Veja Se c ao 7.1 [MyISAM], P agina 630.
580
Se voc e especicar a palavra-chave IGNORE em um INSERT com muitas linhas, quqlquer linha que duplicar uma chave PRIMARY ou UNIQUE existente em uma tabela s ao ignorados e n ao s ao inseridos. Se voc e n ao especicar IGNORE, a inser c ao e abortada se houver quqlquer linhq que duplique um valor de uma chave existente. Voc e pode determinar com fun c ao mysql_info() da API C quantas linhas foram inseridas nas tabelas. Se voc e especicar se uma cl ausula ON DUPLICATE KEY UPDATE (noca no MySQL 4.1.0), e uma linha que causasse a duplica c ao de um valor fosse inserida em uma chave PRIMARY ou UNIQUE, um UPDATE da linha antiga seria realizado. Por exemplo, o comando: mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=c+1; no caso da coluna a ser declarada como UNIQUE e ja existir o valor 1, o exemplo acima seria id entico a mysql> UPDATE table SET c=c+1 WHERE a=1; Nota: se a coluna b tamb em for u nica, o comando UPDATE seria escrito como mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1; e se a=1 OR b=2 casasse com diversas linhas, somente uma linha ser a atualizada! em geral, deve-se tentar evitar utilizar a cl ausula ON DUPLICATE KEY em tabelas com m ultiplas chaves UNIQUE. Desde o MySQL 4.1.1 pode-se utilizar a fun c ao VALUES(nome_coluna) para se referir ao valor da coluna na parte INSERT do comando INSERT ... UPDATE - que e o valor que seria inserido se n ao houvesse conitos de chaves duplicadas. Esta fun c ao e especialmente u til em inser c oes de m ultiplas linhas. Naturalmente a fun c ao VALUES() s o tem sentido em um comando INSERT ... UPDATE e retorna NULL no caso de outros comandos. Exemplo: mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); O camondo acima e id entico a mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=3; mysql> INSERT INTO table (a,b,c) VALUES (4,5,6) -> ON DUPLICATE KEY UPDATE c=9; A utilizar ON DUPLICATE KEY UPDATE, a op c ao DELAYED e ignorada. Se MySQL foi congurado usando a op c ao DONT_USE_DEFAULT_FIELDS, instru c oes INSERT geram um erro a menos que voc e especique valores explicitamete para todas as colunas que exigem um valor n ao-NULL. Veja Se c ao 2.3.3 [Op c oes do configure], P agina 97. Voc e pode encontrar o valor usado por uma coluna AUTO_INCREMENT com a fun c ao mysql_insert_id. Veja Se c ao 12.1.3.31 [mysql_insert_id()], P agina 799. Se voc e utilizar instru c oes INSERT ... SELECT ou INSERT ... VALUES com lista de valores m ultiplos, voc e pode utilizar a fun c ao mysql_info() da API C para obter informa c ao sobre a consulta. O formato da string de informa c ao e mostrado aqui: Records: 100 Duplicates: 0 Warnings: 0
581
Duplicates indica o n umero de linhas que n ao puderam ser inseridas porque duplicariam alguns valores de indices u nicos existentes. Warnings indica o n umero de tentativas de inser c ao de um valor em uma coluna que de alguma forma estava problematico. Avisos (Warnings) podem ocorrer sob qualquer uma das seguintes condi c oes: Inserir NULL em uma coluna declarada com NOT NULL. A coluna e denida com o seu valor padr ao. Denir uma coluna num erica com um valor que esteja fora da faixa permitida. O valor e revertido para nal apropriado da faixa. Denir uma coluna num erica com um valor como 10.34 a. O lixo no nal e eliminado e a parte num erica restante e inserida. Se o valor n ao zer sentido como um n umero, e atribuido 0 a coluna. Inserir uma string em uma coluna CHAR, VARCHAR, TEXT, ou BLOB e que exceda o tamanho m aximo da coluna. O valor e truncado para o tamanho m aximo da coluna. Inserir um valor em uma coluna date ou time e que seja inv alido para o tipo da coluna. A coluna e preenchida com o valor de zero apropriado para o tipo.
582
comum quando voc e utiliza o MySQL para fazer log e voc e tamb em execute periodicamente instru c oes SELECT e UPDATE que levem muito tempo para completar. DELAYED foi intriduzido no MySQL vers ao 3.22.15. Ela e uma extens ao do MySQL ao SQL-92. INSERT DELAYED s o funciona com tabelas ISAM e MyISAM. Note que como tabelas MyISAM suportam SELECT e INSERT concorrentes, se n ao houver blocos livres no meio do arquivo de dados, voc e raramente precisar a utilizar INSERT DELAYED com MyISAM. Veja Se c ao 7.1 [MyISAM], P agina 630. Quando voc e utiliza INSERT DELAYED, o cliente ir a obter um OK de uma vez e a linha ser a inserida quando a tabela n ao estiver sendo usada por outra thread. Outro grande beneficio do uso de INSERT DELAYED e que inser c oes de muitos clientes s ao empacotados juntos e escritos em um bloco. Isto e muito mais r apido que se fazer muitas inser c oes seperadas. Note que atualmente as linhas enleirdas s o s ao armazenadas em mem oria at e que elas sejam inseridas na tabela. Isto signica que se voc e matar o mysqld com kill -9 ou se o mysqld nalizar inesperadamente, as linhas enleiradas que n ao forma escritas em disco s ao perdidas. A seguir temos uma descri c ao em detalhes do que acontece quando voc e utiliza a op c ao DELAYED com INSERT ou REPLACE. Nesta descri ca o, a thread e a thread que recebe um comando INSERT DELAYED e handler e a thread que trata todas as instru c oes INSERT DELAYED de uma tabela particular. Quando uma thread executa uma instru c ao DELAYED em uma tabela, uma thread handler e criada para processar todas as instru c oes DELAYED para a tabela, se tal handler ainda n ao existir. A thread verica se o handler j a adquiriu uma trava DELAYED; se n ao, ele diz a thread handler para faz e-lo. A trava DELAYED pode ser obtida mesmo se outras threads tiver uma trava de LEITURA ou ESCRITA na tabela. De qualquer forma, o handler ir a esperar por todas as travas ALTER TABLE ou FLUSH TABLES para se assegurar que a estrutura da tabela est a atualizada. A thread executa a instru c ao INSERT, mas em vez de escrever a linha na tabela, ela p oe uma c opia da linha nal na la que e gerenciada pela thread handler. Quaisquer erros de sintaxe s ao noticados pela thread e relatadas ao programa cliente. O cliente n ao pode relatar o n umero de duplicatas ou o valor AUTO_INCREMENT para a linha resultante; ele n ao pode obt e-los do servidor, pois o INSERT retorna antes da opera c ao de inser c ao ser completada. Se voc e utiliza a API C, a fun c ao mysql_info() n ao ir a retornar nada signicante, pela mesma raz ao. O log bin ario e atualizado pela thread handler quando a linha e inserida na tabela. No caso de inser c ao de m ultiplas linhas, o log bin ario e atualizado quando a primeira linha e inserida. Depois que todas as linhas delayed_insert_limit s ao escrita, o handle verica se alguma instru c ao SELECT est a pendente. Se estiver, ele permite que ela seja executada antes de continuar. Quando o handler n ao tiver mais linhas na la, a tabela e destravada. Se nunhum comando INSERT DELAYED novo e recebido dentro de delayed_insert_timeout segundos, o handler termina.
583
Se mais que delayed_queue_size est ao pendentes em uma la handler espec ica, a thread requisitando INSERT DELAYED espera at e que haja espa c o na la. Isto e feito para assegurar que o servidor mysqld n ao utilize toda a mem oria area de mem oria de atraso. A thread handler ir a aparecer na lista de processos do MySQL process list com delayed_insert na coluna Command. Ela ser a nalizada se voc e executar um comando FLUSH TABLES ou mat a-la com KILL thread_id. No entanto, primeiro ela armazenar a todas as linhas enleiradas na tabela antes de sair. Durante este tempo ela n ao aceitar a nenhum comando INSERT novo da outra thread. Se voc e executar um comando INSERT DELAYED depois disto, uma nova thread handler ser a criada. Note que o mostrado acima signica que o comando INSERT DELAYED tem prioridade maior que um comando INSERT normal se j a houver um handler INSERT DELAYED em execu c ao! Outro comando de atualiza c ao ter a que esperar at e que a la INSERT DELAYED esteja vazia, algu em nalize a thread handler (com KILL thread_id), ou algu em execute FLUSH TABLES. As seguintes vari aveis de estado fornecem inform c ao sobre comandos INSERT DELAYED: Vari avel Signicado Delayed_insert_threads N umero de threads handler Delayed_writes N umeros de linhas escrita com INSERT DELAYED Not_flushed_delayed_ N umero de linhas esperando para serem escritas rows Voc e pode visualizar estas vari aveis com a instru c ao SHOW STATUS ou executando um comando mysqladmin extended-status. Note que INSERT DELAYED e mais lento que um INSERT normal se a tabela n ao estiver em uso. Tamb em h a uma sobrecarga adicional para o servidor tratar um thread separada para cada tabela na qual voc e utiliza INSERT DELAYED. Isto signica que voc e s o deve usar INSERT DELAYED quando voc e estiver certo de necessita dele!
584
Se voc e especicar a palavra-chave LOW_PRIORITY, a execu c ao de UPDATE e atrasada at e que nenhum outro cliente esteja lendo da tabela. Se voc e especicar a palavra-chave IGNORE, a instru c ao n ao ser a abortada memso se n os obtermos erros de chaves duplicadas durante a atualiza c ao. Linhas que causem conitos n ao ser ao atualizadas. Se voc e acessa um coluna de nome_tabela em uma express ao, UPDATE utiliza o valor atual da coluna. Por exemplo, a seguinte instru c ao dene a coluna age com o valor atual mais um: mysql> UPDATE persondata SET age=age+1; Atribui c aoes UPDATE s ao avaliadas da esquerda para a direitat. Por exemplo, a seguinte instru c ao dobra a coluna age e ent ao a incrementa: mysql> UPDATE persondata SET age=age*2, age=age+1; Se voc e dene uma coluna ao valor que ela possui atualmente, o MySQL notar a isto e n ao ir a atualiz a-la. UPDATE retorna o n umero de linhas que forma realmente alteradas. No MySQL Vers ao 3.22 ou posterior, a fun c ao mysql_info() da API C retorna o n umero de linhas encontradas e atualizadas e o n umero de avisos que ocorreram durante o UPDATE. A partir do MySQL vers ao 3.23, voc e pode utilizar LIMIT row_count para restringir o escopo do UPDATE. Uma cl ausula LIMIT funciona da seguinte forma: Antes do MySQL 4.0.13, LIMIT e uma restri c ao que afeta as linhas. A instru c ao para assim que altera row_count linhas que satisfa cam a cl ausula WHERE. Da vers ao 4.0.13 em diante, LIMIT e uma restri c ao de linhas correspondentes. A instru c ao para assim que ela encontrar row_count linhas que satisfa cam a cl ausula WHERE, tendo elas sido alteradas ou n ao. Se uma cl ausula ORDER BY e utilizada (dispon ivel no MySQL 4.0.0), as linhas ser ao atualizadas nesta ordem. Isto s o e util em conjunto com LIMIT. A partir da MySQL Vers ao 4.0.4, voc e tamb em pode realizar opera c oes UPDATE que cobrem m ultiplas tabelas: UPDATE items,month SET items.price=month.price WHERE items.id=month.id; O exemplo mostra um inner join usando o operador de v irgula, mas instru c oes UPDATE multi-tabelas podem usar qualquer tipo de join permitida na instru c ao SELECT, como LEFT JOIN. Nota: voc e n ao pode utilizar ORDER BY ou LIMIT com multi-tabelas UPDATE.
585
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] table_name[.*] [, table_name[.*] ...] FROM tabelas-referentes [WHERE defini c~ ao_where] ou DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM nome_tabela[.*] [, nome_tabela[.*] ...] USING tabelas-referentes [WHERE defini c~ ao_where] DELETE deleta linhas de nome_tabela que satisfa cam a condi c ao dada por defini c~ ao_ where, e retorna o n umero de registros deletados. Se voc e exeecutar um DELETE sem cl ausula WHERE, todas as linhas s ao deletadas. Se voc eo zer no modo AUTOCOMMIT, isto ir a funcionar como TRUNCATE. Veja Se c ao 6.4.6 [TRUNCATE], P agina 586. No MySQL 3.23, DELETE sem uma cl ausula WHERE retornar a zero como o n umero de registros afetados. Se voc e realmente quiser saber quantos registros s ao deletados quando voc e deletar todas as linhas mesmo sofrendo uma com a queda da velocidade, voc e pode utilizar uma instru c ao DELETE desta forma: mysql> DELETE FROM nome_tabela WHERE 1>0; Note que isto e muito mais lento que DELETE FROM nome_tabela sem cl ausula WHERE, pois ele deleta uma linha de cada vez. Se voc e especicar a palavra-chave LOW_PRIORITY, a execu c ao do DELETE e atrasda at e que nenhum outro cliente esteja lendo da tabela. Para tabelas MyISAM, Se voc e especicar a palavra QUICK, o mecanismo de armazenamento n ao ir a fundir os indices exclu idos durante a dele c ao, o que pode aumentar a velocidade de certos tipos de dele c ao. A velocidade das opera c oes de dele c ao tamb em pode ser afetadas pelos fatores discutidos em Se c ao 5.2.12 [Delete speed], P agina 441. A op c ao IGNORE faz com que o MySQL ignore todos os erros durente o processo de dele c ao dos registros. Erros encontrados durante o est agio de an alise s ao processados da maneira comum. Erros que s ao ignorados devido ao uso desta op c ao s ao retornados como aviso. Esta op c ao aparece pela primeira vez na vers ao 4.1.1. Em tabelas MyISAM, registros deletados s ao mantidos em uma lista encadeada e oper c oes INSERT subsequentes reutilizam posi c oes de registros antigos. Para recuperar espe cos n ao utilizados e reduzir o tamanho do arquivo, utilize a instru c ao OPTIMIZE TABLE ou o utilizt ario myisamchk para reorganizar as tabelas. OPTIMIZE TABLE e mais f acil, mas myisamchk e mais r apido. Veja Se c ao 4.6.1 [OPTIMIZE TABLE], P agina 299 e Se c ao 4.5.6.10 [Optimization], P agina 292. O primeiro formato de del c ao de multi-tabelas e suportado a partir do MySQL 4.0.0. O segundo formato de dele c ao multi-tabelas e suportado a partir do MySQL 4.0.2. A id eia e que apenas linhas coincidentes da tabelas listadas antes de FROM ou antes da cl ausula USING s ao deletadas. O efeito e que voc e pode deletar l;inhas de muitas tabelas ao mesmo tempo e tamb em ter tabelas adicionais que s ao utilizadas para busca.
586
O .* depois do nome da tabela existe apenas para ser compat ivel com o Access: DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id ou DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id No cso acima n os deletamos linhas coincidente apenas na tabela t1 e t2. O exemplo mostra um inner join usando o operador de v irgula, mas instru c oes UPDATE multi-tabelas podem usar qualquer tipo de join permitida na instru c ao SELECT, como LEFT JOIN. Se uma cl ausula ORDER BY e utilizada (dispon ivel no MySQL 4.0.0), as linhas ser ao deletadas naquela ordem. Isto s o eu til se usado em conjunto com LIMIT. Por exemplo: DELETE FROM somelog WHERE user = jcole ORDER BY timestamp LIMIT 1 Isto ir a deletar as entradas antigas (por timestamp) onde as linhas casam com a cl ausula WHERE. A op c ao espec ica do MySQL LIMIT row_count para DELETE diz ao servidor o n umero m aximo de linhas a serem deletadas antes do controle retornar ao cliente. Isto pode ser usado para assegurar que uma comando DELETE espec ico m ao tomar a muito tempo, Voc e pode simplesmente repetir o comando DELETE at e que o n umero de linhas afetadas seja menor que o valor LIMIT. No MySQL 4.0, voc e pode especicar m ultiplas tabelas na instru c ao DELETE para deletar linhas de uma ou mais tabelas dependendo de uma condi c ao particular em v arias tabelas. No entanto voc e n ao pode utilizar ORDER BY ou LIMIT em uma multi-tabela DELETE.
587
588
] [LINES [STARTING BY ] [TERMINATED BY \n] ] [IGNORE n umero LINES] [(nome_coluna,...)] A instru c ao LOAD DATA INFILE l e linhas de uma arquivo texto para uma tabela em uma velocidade muito alta. Se a palavra-chave LOCAL e especicada, ela e interpretada com respeito ao m da conex ao do cliente. Quando LOCAL e especicado, o arquivo e lido pelo programa cliente na m aquina cliente e enviada ao servidor. Se LOCAL n ao e especicada, o arquivo deve estar localizado na m aquina servidora e e lida diretamente pelo servidor (LOCAL est a disponivel no MySQL Vers ao 3.22.6 ou posterior). Por raz oes de seguran ca, ao ler arquivos textos no servidor, os arquivos devem tamb em estar no diret orio de banco de dados ou serem lidos por todos. Tamb em, para utilizar LOAD DATA INFILE em arquivos do servidor, voc e deve ter privil egio FILE na m aquina servidora. Veja Se c ao 4.3.7 [Privil egios fornecidos], P agina 237. A partir do MySQL 3.23.49 e MySQL 4.0.2 (4.0.13 no Windows) LOCAL s o funcionar a se o seu servidor e o seu cliente forem habilitados para permitir isto. Por exemplo so o mysqld foi iniciado com --local-infile=0, LOCAL n ao ir a funcionar. Veja Se c ao 4.3.4 [LOAD DATA LOCAL], P agina 232. Se voc e especicar a palavra-chave LOW_PRIORITY, a execu c ao da instru c ao LOAD DATA e atrasada at e nenhum outro cliente estar lendo a tabela. Se voc e especicar a palavra-chave CONCURRENT com uma tabela MyISAM, outras threads podem retornar dados da tabela enquanto LOAD DATA est a executando. Utilizar esta op c ao ir a afetar o desempenho de LOAD DATA um pouco, mesmo se nenhuma outra thread utilizar a tabela ao mesmo tempo. Utilizar LOCAL ser a um pouco mais lento que deixar o servidor acessar os arquivos diretamente, pois o conte udo do arquivo deve ser enviado pela conex ao da m aquina cliente at ea m aquina servidora. Por outro lado, voc e n ao precisa de ter o privil egio FILE para carregar arquivos locais. Se voc e estiver utilizando uma vers ao do MySQL anterior a 3.23.24, voc e n ao poder a ler de um FIFO com LOAD DATA INFILE. Se voc e precisar ler de um FIFO (por exemplo a sa ida de gunzip), utilize LOAD DATA LOCAL INFILE. Voc e tamb em pode carregar arquivo de dados utilizado o utilit ario mysqlimport; ele opera enviando um comando LOAD DATA INFILE para o servidor. A op c ao --local faz com que mysqlimport leia ao arquivo de dados a partir da m aquina cliente. Voc e pode especicar a op c ao --compress para conseguir melhor desempenho sobre redes lentas se o cliente e o servidor suportar protocolos compactados. Ao localizar arquivos na m aquina servidora, o servidor utiliza as segintes regras: Se um caminho absoluto e dado, o servidor utiliza o caminho desta forma. Se um caminho relativo com um ou mais componentes e dados, o servidor busca o arquivo em rela c ao ao diret orio de dados do servidor. Se um nome de arquivo sem nenhum componente e dado, o servidor procura pelo arquivo no diretorio de banco de dados do banco de dados atual.
589
Note que estas regras signicam que um arquivo chamado ./myfile.txt e lido no diret orio de dados do servidor, enquanto um arquivo chamado myfile.txt l e o diret orio de dados do naco de dados atual. Por exemplo, a seguinte instru c ao LOAD DATA l e o arquivo data.txt do diret orio de dados de db1 pois db1 e o banco de dados atual, mesmo que a instru c ao carrega explicitamente o arquivo em uma tabela no banco de dados db2: mysql> USE db1; mysql> LOAD DATA INFILE "data.txt" INTO TABLE db2.my_table; As palavras-chave REPLACE e IGNORE controlam o tratamento de entrada de registros que duplicam linhas existentes em valores de chave u nica. Se voc e especicar REPLACE, as linhas inseridas substituir ao as linhas existentes (em outras palavras, linhas que tiverem o mesmo valor de um indice prim ario ou u nico como linhas existentes). Veja Se c ao 6.4.7 [REPLACE], P agina 587. Se voc e especicar IGNORE, registros inseridos que duplicam uma linha existente em um valor de chave u nica ser a ignorados. Se voc e n ao especicar nenhuma das op c oes, o comportamento depende de se a palavra chave LOCAL e especicada ou n ao. Sem LOCAL, um erro ocorre quando um valor de chave duplicada e encontrado, e o resto do arquivo texto e ignorado. Com LOCAL o comportamento padr ao e o mesmo de quando IGNORE for especicado, isto e porque o servidor n ao tem como parar no meio da opera c ao. Se voc e quiser ignorar as restri c oes de chaves estrangeiras durante a carga voc e pode faze SET FOREIGN_KEY_CHECKS=0 antes de executar LOAD DATA. Se voc e utiliza LOAD DATA INFILE em uma tabela MyISAM vazia, todos os indices n ao- unicos s ao criados em um batch separado (como em REPAIR). Isto normalmente torna LOAD DATA INFILE muito mais r apido quando voc e tem diversos indices. Normalmente isto e muito r apido mas em casos extremos voc e pode tornar o indice mais r apido ainda desligando-os com ALTER TABLE .. DISABLE KEYS e usando ALTER TABLE .. ENABLE KEYS para recriar os indices. Veja Se c ao 4.5.6 [Manuten c ao de tabelas], P agina 281. LOAD DATA INFILE e o complemento de SELECT ... INTO OUTFILE. Veja Se c ao 6.4.1 [SELECT], P agina 562. Para gravar dados de uma tabela em um arquivo, use SELECT ... INTO OUTFILE. Para ler o arquivo de volta em uma tabela, use LOAD DATA INFILE. A sintaxe das cl ausulas FIELDS e LINES e a mesma para ambos os comandos. Ambas as cl ausulas s ao opicionais, mas FIELDS deve preceder LINES se ambos s ao especicados. Se voc e especicar uma cl ausula FIELDS, cada uma das subcl ausulas (TERMINATED BY, [OPTIONALLY] ENCLOSED BY, e ESCAPED BY) tamb em s ao opicionais, exceto pelo fato de que voc e deve especicar pelo menos uma delas. Se voc e n ao especicar uma cl ausula FIELDS, o padr ao e o mesmo que se voc e tivesse escrito isto: FIELDS TERMINATED BY \t ENCLOSED BY ESCAPED BY \\ Se voc e n ao especicar uma cl ausula LINES, o padr ao e o mesmo que se voc e tivesse escrito isto: LINES TERMINATED BY \n Nota: Se voc e gerou o arquivo texto no Windows, voc e deve alterar o mostrado acima para: LINES TERMINATED BY \r\n j a que o Windows utiliza dois caracteres como um terminador de linha. Alguns programas como wordpad, pode usar \r como terminador de linha.
590
Se todas as linas que voc e deseja ler tem um prexo comum que voc e quer saltar, voc e pode usar LINES STARTING BY prefix_string. Em outras palavras, o padr ao faz com que LOAD DATA INFILE funcione da seguinte maneira ao se ler uma entrada: Procure pelo limite da linha em linhas novas. Se LINES STARTING BY prefix for usado, l e at e que o prexo seja encontrado e come ca a ler o caracter seguinte ao prexo. Se a linha n ao inclui o preco e;a ser a saltada. Quebre a linha em campos na tabula c oes. N ao espere que os campos estejam entre aspas. Interprete a ocorr encia de tabula c oes, novas linhas ou \ precedidos por \ como caracteres literias que s ao parte dos valores dos campos. Inversamente, os padr oes fazem SELECT ... INTO OUTFILE funcionar da seguinte forma ao escrever as saidas: Escreva tabula c oes entre os campos. N ao coloque campos entre aspas. Utilize \ para considerar como parte dos campos inst ancias de tabula c ao, nova linha ou \ que estejam dentro dos valores dos campos. Escreva novas linhas no m de cada linha. Note que para escrever FIELDS ESCAPED BY \\, voc e deve especicar duas barras invertidas para que o valor seja lido como uma u nica barra invertida. A op c ao IGNORE n umero LINES pode ser utilizado para ignorar linhas no inicio do arquivo. Por exemplo, voc e pode usar IGNORE 1 LINES para saltar uma linha de cabe calho contendo nomes de colunas: mysql> LOAD DATA INFILE "/tmp/file_name" INTO TABLE test IGNORE 1 LINES; Quando voc e utiliza SELECT ... INTO OUTFILE em conjunto com LOAD DATA INFILE para escrever os dados de um banco de dados em um arquivo e ent ao ler o arquivo de volta no banco de dados posteriormente, as op c oes para tratamento de linhas e campos para ambos os comandos devem coincidir. Sen ao, LOAD DATA INFILEn ao ir a interpretar o conte udo do arquivo de forma apropriada. Suponha que voc e utilize SELECT ... INTO OUTFILE para escrever um arquivo com os campos separados por v irgulas: mysql> SELECT * INTO OUTFILE data.txt -> FIELDS TERMINATED BY , -> FROM ...; Para ler o arquivo delimitado com v irgula de volta, a instru c ao correta seria: mysql> LOAD DATA INFILE data.txt INTO TABLE table2 -> FIELDS TERMINATED BY ,; Se voc e tentasse ler do arquivo com a instru c ao abaixo, n ao iria funcionar pois ela instrui LOAD DATA INFILE a procurar por tabula c oes entre campos: mysql> LOAD DATA INFILE data.txt INTO TABLE table2 -> FIELDS TERMINATED BY \t; O resultado desejado e que cada linha de entrada fosse interpretada como um u nico campo.
591
LOAD DATA INFILE pode ser usado para ler arquivos obtidos de fontes externas. Por exemplo, um arquivo no formato dBASE ter a campos separados por v irgulas e entre aspas duplas. Se as linhas no arquivo s ao terminadas por com uma nova linha, o comando mostardo aqui ilustra as op c oes do tratamento de campos e linhas que voc e usaria pra carregar o arquivo. the le: mysql> LOAD DATA INFILE data.txt INTO TABLE nome_tabela -> FIELDS TERMINATED BY , ENCLOSED BY " -> LINES TERMINATED BY \n; Qualquer uma das op c oes de tratamento de campos e linhas podem especicar uma string vazia (). Se n ao for vazio, os valores de FIELDS [OPTIONALLY] ENCLOSED BY e FIELDS ESCAPED BY devem ser um caracter simples. Os valores de FIELDS TERMINATED BY e LINES TERMINATED BY podem ser mais de uma caracter. Por exemplo, para escrever linhas terminadas pelos par retorno de carro/alimenta c ao de linha, ou para ler um arquivo contendo tais linhas, especique uma cl ausula LINES TERMINATED BY \r\n. Por exemplo, para ler um arquivo de piadas, que s ao separadas com uma linha de %%, em uma tabela SQL, voc e pode fazer: CREATE TABLE jokes (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joke TEXT NOT NULL); LOAD DATA INFILE "/tmp/jokes.txt" INTO TABLE jokes FIELDS TERMINATED BY "" LINES TERMINATED BY "\n%%\n" (joke); FIELDS [OPTIONALLY] ENCLOSED BY controla a cita c ao dos campos. Para saida (SELECT ... INTO OUTFILE), se voc e omitir a palavra OPTIONALLY, todos os campos estar ao entra o caracter ENCLOSED BY. Um exemplo de tal saida (usando virgula como delimitador de campo) e mostrado abaixo: "1","a "2","a "3","a "4","a string","100.20" string containing a , comma","102.20" string containing a \" quote","102.20" string containing a \", quote and comma","102.20"
Se voc e especicar OPTIONALLY, o caracter ENCLOSED BY s o e usados para delimitar campos CHAR e VARCHAR: 1,"a 2,"a 3,"a 4,"a string",100.20 string containing a , comma",102.20 string containing a \" quote",102.20 string containing a \", quote and comma",102.20
Note que a ocorr encia de caracter ENCLOSED BY dentro do valor do campo e indicado colocando um caracter ESCAPED BY antes dele. Note tamb em que se voc e especicar um valor ESCAPED BY vazio, e poss ivel gerar sa idas que n ao poder ao ser lidas aprorpiadamente por LOAD DATA INFILE. Por exemplo, a sa ida mostrada seria apareceria como a seguir se o caracter de escape fosse vazio. Observe que o segundo campo na quarta linha cont em uma virgula seguida de aspas, o que (erroneamente) parece terminar o campo: 1,"a 2,"a 3,"a 4,"a string",100.20 string containing a , comma",102.20 string containing a " quote",102.20 string containing a ", quote and comma",102.20
592
Para entrada, o caracter ENCLOSED BY, se presente, ser a eliminado do m dos valores dos campos. (Isto e verdade se OPTIONALLY for especicado; OPTIONALLY n ao tem efeito na interpreta c ao da entrada). A ocorr encia de caracteres ENCLOSED BY precedido pelo caracter ESCAPED BY s ao interpretados como parte do campo atual. Se o campo come ca com o caracter ENCLOSED BY, inst ancias daquele caracter s ao reconhecidos como termina c ao de um valor do campo apenas se seguido pelo campo ou sequ encia de linah TERMINATED BY. Para evitar ambiguidade, ocorr encias do caracter ENCLOSED BY dentro de um valor de campo pode ser duplicado e ser a interpretado como uma u nica inst ancia do caracter. Por exemplo, se ENCLOSED BY " for especicado, aspas ser ao tratadas como mostrado abaixo: "The ""BIG"" boss" The "BIG" boss The ""BIG"" boss -> The "BIG" boss -> The "BIG" boss -> The ""BIG"" boss
FIELDS ESCAPED BY controla como escrever ou ler caracteres especiais. Se o caracter FIELDS ESCAPED BY n ao estivaer vazio, ele ser a usado para preceder o seguinte caracter de sa ida: O caracter FIELDS ESCAPED BY O caracter FIELDS [OPTIONALLY] ENCLOSED BY O primeiro caracter dos valores FIELDS TERMINATED BY e LINES TERMINATED BY ASCII 0 (o que e escrito seguido de um caracter de escape e ASCII 0, n ao o byte de valor zero). Se o caracter FIELDS ESCAPED BY estiver vazio, nenhum caracter ser a escapado. Provavelmente n ao e uma boa id eia especicar um caracter de escape vazio, principalmente se os valores dos campos em seus conter qualquer caracter na lista dada. Para entradas, se o caracter FIELDS ESCAPED BY n ao estiver vazio, as ocorr encias daquele caracter s ao eliminadas e o caracter seguinte e tomado como parte do valor do campo. As exce c oes s ao um 0 ou N escapado (por exemplo, \0 ou \N se o caracter de escape for \). Estas sequencias s ao interpretadas como os ASCII 0 (um byte de valor zero) e NULL. Veja abaixo as regras no tratamento de NULL. Para maiores informa c oes sobre a sintaxe \-escape, veja Se c ao 6.1.1 [Literals], P agina 469. Em certos casos, as op c oes de tratamento de campoe e linhas se interagem: Se LINES TERMINATED BY e uma string vazia e FIELDS TERMINATED BY n ao e vazio, as linhas tamb em ser ao terminadas com FIELDS TERMINATED BY. Se os valores FIELDS TERMINATED BY e FIELDS ENCLOSED BY s ao ambos vazios (), um formato de linha de tamanhos xos (sem delimitadores) e utilizada. Com formato de linhas de tamanho xo, nenhum deliitador e usado entre os campos (mas voc e ainda pode ter um terminador de linha). Valores de colunas s ao escritos e lidos usando o tamanho denido das colunas. Por exemplo, se uma coluna e declarada como INT(7), os valores das colunas s ao escritos utilizando campos de 7 caracteres. Na sa ida, os valores das colunas s ao obtidos lendo 7 caracteres. LINES TERMINATED BY ainda e usado para separar linhas. Se uma linha n ao cont em todos os campos, o resto dos campos ser ao congurados com o seu valor padr ao. Se voc e n ao tiver um terminador de linha, voc e deve deni-lo com . Neste caso o arquivo texto deve conter todos os campos para cada linha.
593
O formato de linhas de tamanho xo tamb em afetam o tratamento de valores NULL; veja abixo. Note que este formato n ao funciona se voc e estiver utilizando um conjunto de caracteres mulyi-byte. O tratamento do valor NULL varia, dependendo das op c oes de FIELDS e LINES que voce usar: Para os valores FIELDS e LINES padr oes, NULL e escrito como \N para sa ida e \N e lido como NULL para as entradas (assumindo que o caracter ESCAPED BY e \). Se FIELDS ENCLOSED BY n ao for vazio, um campo contendo a palavra literal NULL como seu valor e lido como um valor NULL (isto difere da palavra NULL entre os caracteres FIELDS ENCLOSED BY, a qual e lida como a string NULL). Se FIELDS ESCAPED BY for vazio, NULL e escrito como a palavra NULL. Com os formatos de tamanho xos (que acontecem quando FIELDS TERMINATED BY e FIELDS ENCLOSED BY estiverem ambos vazios), NULL e escrito como uma string vazia. Note que isto faz com que os valores NULL e uma string vazia na tabela ser ao indist ing uiveis quando escritas no arquivo pois elas s ao ambas escritas como strings vazias. Se voc e precisar estar saber diferenciar as duas ao ler o arquivo de volta, voc e n ao deve utilizar o formato de tamanho xo. Alguns casos n ao s ao suportados por LOAD DATA INFILE: Linhas de tamanho xo (FIELDS TERMINATED BY e FIELDS ENCLOSED BY vazios) e colunas BLOB ou TEXT. Se voc e especicar um separador que e igual ao prexo do outro, LOAD DATA INFILE n ao poder a interpretar a entratada apropriadamente. Por exemplo, a seguinte cl ausula FIELDS causaria problemas: FIELDS TERMINATED BY " ENCLOSED BY " Se FIELDS ESCAPED BY estiver vazio, um valor de campo que cont em uma ocorr encia de FIELDS ENCLOSED BY ou LINES TERMINATED BY seguido por valores FIELDS TERMINATED BY far a com que LOAD DATA INFILE pare de ler um campo ou linha antes do esperado. Isto ocorre porque LOAD DATA INFILE n ao pode determinar apropriadamente onde o valor de campo ou linha acaba. A oseguinte exemplo carrega todas as colunas da tablea persondata: mysql> LOAD DATA INFILE persondata.txt INTO TABLE persondata; Nenhuma lista de campo e especicada, assim LOAD DATA INFILE espera linhas de entradas que contenha um campo para cada coluna da tabela. Os valores padr oes de FIELDS e LINES s ao usados. Se voc e deseja carregar somente algumas das colunas das tabelas, especique uma lista de campos: mysql> LOAD DATA INFILE persondata.txt -> INTO TABLE persondata (col1,col2,...); Voc e deve especicar uma lista de campos se a ordem dos campos no arquivo de entrada diferem da ordem das colunas na tabela. Sen ao o MySQL n ao poder a dizer como combinar os campos da entrada nas colunas da tabela.
594
Se uma linha tiver poucos campos, as colunas para os quais o campo de entrada n ao estiverem presentes ser ao denidas com o valor padr ao. Atribui c ao de valor padr ao e descrito em Se c ao 6.5.3 [CREATE TABLE], P agina 597. Um valor de campo vazio e interpretado de forma diferente de que se o valor do campo estiiver faltando: Para tipos string, a coluna e denida com uma string vazia. Para tipos num ericos, a coluna e denida com 0. Para tipos de data e hora, a coluna e denida com o valor zero apropriado para o tipo. Veja Se c ao 6.2.2 [Tipos date e time], P agina 489. Note que estes s ao os mesmos valores que resultam se voc e atribuir uma string vazia explicitamente a um tipo string, num erico, de data ou de hora em uma instru c ao INSERT ou UPDATE. Colunas TIMESTAMP s o s ao denidas com a hora e data atual se houver um valor NULL para a coluna (isto e, \N), ou (apenas para a primeira coluna TIMESTAMP) se a coluna TIMESTAMP esta a esquerda da lista de campos quando esta for especicada. Se uma linha de entrada tiver muitos campos, os campos extras ser ao ignorados e o n umero de avisos e incrementado. Note que antes do MySQL 4.1.1 o aviso e apenas um n umero que indica que alguma coisa deu errado. No MySQL 4.1.1 voc e pode fazer SHOW WARNINGS para obter mais informa c oes sobre o que deu errado. LOAD DATA INFILE considera todas as entradas como strings, assim voc e n ao pode utiliar valores num ericos para colunas ENUM ou SET do mesmo modo que voc e pode com instru c oes INSERT. Todos os valores ENUM e SET devem ser espec icados como strings! Se voc e estiver usando a API C, voc e pode obter informa c oes sobre a consulta chamando a fun c ao mysql_info() da API C quando a consulta LOAD DATA INFILE terminar. O formato da string de informa c ao e mostrado aqui: Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 Avisos ocorrem sob as mesmas circunt ancias que quando s ao inseridos via instru c ao INSERT (veja Se c ao 6.4.3 [INSERT], P agina 578), exceto que LOAD DATA INFILE tamb em gera avisos quando houver poucos ou muitos campos na linha de entrada. Os avisos n ao s ao armazenados em nenhum local; o n umero de avisos s o pode ser utilizado como uma indica c ao se tudo correr bem. Se voc e obter avisos e quiser saber exatamente porque eles ocorreram, um modo de se fazer isto e utilizar SELECT ... INTO OUTFILE em outro arquivo e campor a-lo ao arquivo de entrada original. Se voc e precisar que LOAD DATA leia de um pipe, voc e pode utilizar o seguinte truque: mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x cat < /dev/tcp/10.1.1.12/4711 > /nt/mysql/db/x/x mysql -e "LOAD DATA INFILE x INTO TABLE x" x Se voc e estiver usando uma vers ao do MySQL a anterior a 3.23.25 voc e s o poder a fazer o descrito acima com LOAD DATA LOCAL INFILE. No MySQL 4.1.1 voc e pode usar SHOW WARNINGS para conseguir a lista do primeiros max_ error_count avisos. Veja Se c ao 4.6.8.9 [SHOW WARNINGS], P agina 323.
595
Para mais informa c oes sobre a eci encia de INSERT versus LOAD DATA INFILE e a melhora na velocidade de LOAD DATA INFILE, Veja Se c ao 5.2.10 [Velocidade da inser c ao], P agina 439.
596
Ela e mais r apida que SELECT porque: Um mecanismo de armazenamento designado e alocado pela thread em HANDLER OPEN. Existe menos an alise envolvida. N` ao existe sobrecaga de otimiza c ao e verica c ao de consultas. A tabela utilizada n ao precisa estar travada em pedidos de dois handlers. A interface handler n ao precisa fornecer uma apr encia consistente dos dados (por exemplo, dirty-reads s ao permitidas), assim o mecanismo de armazenamento pode fazer otimiza c oes que o SQL normalmente n ao permite. E muito mais f acil portar aplica c oes que usam interface como ISAM para o MySQL. Ele permite se fazer uma travessia em um banco de dados de uma maneira que n ao e facil (em alguns casos imposs ivel) de fazer com SQL. A interface handler e um modo mais natural de mostrar dados ao trabalhar com aplica c oes que fornecem uma interface interativa com o usu ario para o banco de dados.
6.4.10 Sintaxe DO
DO express~ ao, [express~ ao, ...] Executa a express ao mas n ao retorna nenhum resultado. Este e um modo curto de SELECT express~ ao, express~ ao, mas tem a vantagem de ser r apida quando voc e n ao se preocupa com o resultado. Ele eu til principalmente com fun c oes que tem efeitos em um dos lados, como RELEASE_LOCK.
597
DROP DATABASE deleta todos as tabelas no banco de dados e deleta o banco de dados. Se voc e zer um DROP DATABASE em um banco de dados ligado simbolicamente, o link e o banco de dados original s ao deletados. Tenha cuidado com este comando! DROP DATABASE retorna o n umero de arquivos que foram removidos do diretorio de banco de dados. Para tabelas MyISAM, isto e tr es vezes o n umero de tabelas, pois cada tabela corresponde a um arquivo .MYD, um arquivo .MYI e um arquivo .frm. O comando DROP DATABASE remove do diret orio de banco de dados dado todos os arquivos com a seguinte extens ao: Ext .BAK .ISM .MYI Ext .DAT .ISM .db Ext .HSH .MRG .frm Ext .ISD .MYD
Todos os subdiret orios que consistem de 2 digitos (diret orios RAID) tamb em s ao removidos. No MySQL Vers ao 3.22 ou posterior, voc e pode utilizar a palavra chave IF EXISTS para prevenir da ocorr encia de um erro se o banco de dados n ao existir. Voc e tamb em pode deletar um banco de dados com mysqladmin. Veja Se c ao 4.9 [Scripts do Lado do Servidor], P agina 346.
598
| | | | | | | | | | | | | | | | | | | | | |
BIGINT[(tamanho)] [UNSIGNED] [ZEROFILL] REAL[(tamanho,decimais)] [UNSIGNED] [ZEROFILL] DOUBLE[(tamanho,decimais)] [UNSIGNED] [ZEROFILL] FLOAT[(tamanho,decimais)] [UNSIGNED] [ZEROFILL] DECIMAL(tamanho,decimais) [UNSIGNED] [ZEROFILL] NUMERIC(tamanho,decimais) [UNSIGNED] [ZEROFILL] CHAR(tamanho) [BINARY | ASCII | UNICODE] VARCHAR(tamanho) [BINARY] DATE TIME TIMESTAMP DATETIME TINYBLOB BLOB MEDIUMBLOB LONGBLOB TINYTEXT TEXT MEDIUMTEXT LONGTEXT ENUM(value1,value2,value3,...) SET(value1,value2,value3,...)
index_nome_coluna: nome_coluna [(tamanho)] [ASC | DESC] defini c~ ao_refer^ encia: REFERENCES nome_tabela [(index_nome_coluna,...)] [MATCH FULL | MATCH PARTIAL] [ON DELETE op c~ ao_refer^ encia] [ON UPDATE op c~ ao_refer^ encia] op c~ ao_refer^ encia: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT op c~ oes_tabela: table_option [table_option] ... op c~ oes_tabela: TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM } | AUTO_INCREMENT = # | AVG_ROW_LENGTH = # | CHECKSUM = {0 | 1} | COMMENT = string | MAX_ROWS = # | MIN_ROWS = # | PACK_KEYS = {0 | 1 | DEFAULT} | PASSWORD = string
599
| | | | | | | |
DELAY_KEY_WRITE = {0 | 1} ROW_FORMAT = { DEFAULT | DYNAMIC | FIXED | COMPRESSED } RAID_TYPE = { 1 | STRIPED | RAID0 } RAID_CHUNKS=# RAID_CHUNKSIZE=# UNION = (table_name,[table_name...]) INSERT_METHOD = { NO | FIRST | LAST } DATA DIRECTORY = caminho absluto para o diret orio INDEX DIRECTORY = caminho absluto para o diret orio DEFAULT CHARACTER SET character_set_name [COLLATE collation_name]
CREATE TABLE cria uma tabela com op nome dado no banco de dados atual. As regras para nomes de tabelas permitidos s ao dados em Se c ao 6.1.2 [Legal names], P agina 472. Por padr ao a tabela e criada no banco de dados atual. Um erro ocorre se n ao houver o banco de dados atual ou se a tabela j a existir. No MySQL Vers ao 3.22 ou posterior, o nome de tabela pode ser especicado como nome_ bd.nome_tabela para criar a tabela em um banco de dados espec ico. Ele funciona sem se preoocupar se existe um banco de dados atual. A partir do MySQL Vers ao 3.23, voc e pode usar a palavra-chave TEMPORARY qaundo voc e criar uma tabela. A tabela tempor aria e visivel apenas a para a conex ao atual, e ser a automaticamente deletada quando a conex ao e fechada. Isto signica que duas conex oes diferentes podem usar o mesmo nome de tabela tempor aria sem conitos outras ou com uma tabela existente com o mesmo nome. (A tabela existente e escondida at e que a tabela tempor aria seja deletada). A partir do MySQL 4.0.2 voc e deve ter o privil egio CREATE TEMPORARY TABLES para poder criar tabelas tempor arias. No MySQL Vers ao 3.23 ou posterior voc e pode utilizar as palavras-chaves IF NOT EXISTS para que n ao ocorra um erro se a tabela j a existir. Note que n ao h a verica c ao de que a tabela existente tem uma estrutura id entica a aquela indicada pela instru c ao CREATE TABLE A partir da vers ao 4.1.0, o atributo SERIAL pode ser usado com um alias para BIGINT NOT NULL AUTO_INCREMENT UNIQUE. Este e um recuros para compatibilidade. Como no MySQL 3.23, voc e pode criar uma tabela de autra adicionando uma instru c ao SELECT no m da instru c ao CREATE TABLE: CREATE TABLE new_tbl SELECT * FROM orig_tbl; Os indices n ao s ao transportados para a nova tabela, e algumas convers oes de tipos de coluna podem ocorrer. Por exemplo, o atributoAUTO_INCREMENT n ao est a preservado e colunas VARCHAR podem se tornar colunas CHAR. No MySQL 4.1, voc e pode especicar explicitamente o tipo para uma coluna gerada: CREATE TABLE foo (a tinyint not null) SELECT b+1 AS a FROM bar; No MySQL 4.1 voc e pode utilizar LIKE para criar uma tabela baseada em uma deni c ao de outra tabela. No MySQL 4.1 voc e tamb em pode especicar o tipo para uma coluna gerada: CREATE TABLE new_tbl LIKE orig_tbl; Cada tabela nome_tabela e representada por algum arquivo no diret orio de banco de dados. No caso das tabelas tipo MyISAM voc e ir a obter:
600
LIKE n ao copia nenhuma op c ao de tabela DATA DIRECTORY ou INDEX especicada para a tabela original. Proposito Arquivo de formato (deni c ao) da tabela. nome_tabela.MYD Arquivo de dados nome_tabela.MYI Arquivo Indice Para mais informa c oes de propriedades de varios tipo de coluna, veja Se c ao 6.2 [Column types], P agina 482: Se nem NULL nem NOT NULL for especicado, a coluna e tratada como se NULL fosse especicado. Uma coluna integer pode ter o atributo adicional AUTO_INCREMENT. Quando voc e insere um valor de NULL (recomendado) ou 0 em uma coluna AUTO_INCREMENT indexada, a coluna e denida com o valor da pr oxima sequ encia. Normalmente ele e valor+1, onde valor e o maior valor para a coluna column atualmente na tabela. A sequ encia de AUTO_ INCREMENT come ca com 1. Veja Se c ao 12.1.3.31 [mysql_insert_id()], P agina 799. A partir do MySQL 4.1.1, especicando o par ametro NO_AUTO_VALUE_ON_ZERO para a op c ao do servidor --sql-mode ou a vari avel do servidor sql_mode permite que voc e aramzene 0 nas colunas AUTO_INCREMENT como 0, em vez de gerar uma nova sequ encia de valores. Veja Se c ao 4.1.1 [Command-line options], P agina 208. Se voc e deletar a linha contendo o valor m aximo para uma coluna AUTO_INCREMENT, o valor ser a reutilizado por uma tabela ISAM, ou BDB, mas n ao por tabelas MyISAM ou InnoDB. Se voc e deletar todas as linhas na sua tabela com DELETE FROM nome_ tabela (sem um WHERE) no modo AUTOCOMMIT, a sequencia ser a reiniciada em todos os tipos de tabela, exceto InnoDB. Veja Se c ao 7.5.12.5 [InnoDB auto-increment column], P agina 672. Nota: S o pode haver uma coluna AUTO_INCREMENT por tabela, e ela deve ser indexada e n ao pode ter uma valor DEFAULT. No MySQL Vers ao 3.23, uma coluna AUTO_INCREMENT funcionar a corretamente apenas se conter apenas valores positivos. Inserir um n umero negativo e considerado como a inser c ao de um n umero positivo muito grande. Isto ocorre para evitar problemaa de precis ao quando os n umeros v ao de positivo para negativo e tamb em para assegurar que n ao se obtenha, acidentalmente, uma coluna AUTO_INCREMENT que contenha 0. Em tabelas MyISAM e BDB voc e pode especicar colunas AUTO_INCREMENT secund arias em uma chave ulti-coluna. Veja Se c ao 3.6.9 [exemplo-AUTO INCREMENT], P agina 202. Para tornar MySQL compat ivel com alguns aplicativos ODBC, voc e pode encontrar o valor AUTO_INCREMENT da u ltima linha inserida com a seguinte consulta: SELECT * FROM nome_tabela WHERE auto_col IS NULL Valores NULL s ao tratados em colunas TIMESTAMP de modo diferente de outros tipos de colunas. Voc e n ao pode armazenar um NULL literal em uma coluna TIMESTAMP; denindo a coluna com NULL lhe atribui a a data e a hora atual. Como colunas TIMESTAMP se comportam desta forma, os atributos NULL e NOT NULL n ao se aplicam de modo normal e s ao ignorados se voc e os especicar. Por outro lado, tornar o uso de colunas TIMESTAMP mais f acil para os clientes MySQL, o servidor relata que tal coluna pode ter o valor NULL atribu ido (a que e verdade), mesmo
601
que TIMESTAMP nunca contenham, realmente, um valor NULL. Voc e pode ver isto quando voc e utiliza DESCRIBE nome_tabela para obter informa c oes sobre sua tabela. Note que denir uma coluna TIMESTAMP com 0 n ao e o mesmo que den i-la com NULL, porque 0 e um valor TIMESTAMP v alido. Um valor padr ao (DEFAULT) tem que ser constante, ele n ao pode ser uma fun c ao ou uma express ao. Se nenhum valor DEFAULT e especicado para uma coluna, o MySQL atribuir a um automaticamente, como a seguir. Se a coluna aceitar NULL como um valor, o valor padr ao e NULL. Se a coluna e declarada como NOT NULL, o valor padr ao depende do tipo de coluna: Para tipos num ericos n ao declarados com o atributo AUTO_INCREMENT, o padr ao e 0. Para uma coluna AUTO_INCREMENT, o valor padr ao e o pr oximo valor na sequ encia. Para tipos date e time diferentes de TIMESTAMP, o padr ao e o valor zero apropriado para o tipo. Para a primeira coluna TIMESTAMP na tabela, o padr ao e a data e hora atuais. Veja Se c ao 6.2.2 [Tipos date e time], P agina 489. Para tipos string diferentes de ENUM, o valor padr ao e uma string vazia. Para ENUM, o padr ao e o primeiro valor enumerado. Valores padr oes devem ser constantes. Isto signica, por exemplo, que voc e n ao pode denir o padr ao de uma coluna date como o valor de fun c oes como NOW() or CURRENT_ DATE. Um coment ario para uma coluna pode ser especicado com a op c ao COMMENT. O coment ario e mostrado pela instru c ao SHOW CREATE TABLE e por SHOW FULL COLUMNS. Esta op c ao est a dispon ivel a partir do MySQL 4.1. (Ela e perimitida mas ignorada em vers oes anteriores.) KEY e normalmente um sin onimo para INDEX. A partir da vers ao 4.1, o atributo de chave PRIMARY KEY tamb em pode ser especicado apenas como KEY. Isto foi implementado para compatibilidade com outros bancos de dados. No MySQL,uam chave UNIQUE s o pode ter valores distintos. Um erro ocorre se voc e tantar adicionar uma nova linha com uma chave que coincida com uma j a existente. PRIMARY KEY e uma chave u nica (KEY) onde todas as colunas chaves devem ser denidas como NOT NULL. Se elas n ao forem explicitamente declaradas como NOT NULL, isto ser a feito implicitamente e sem aviso. No MySQL a chave e chamada PRIMARY. Uma tabela pode ter apenas uma PRIMARY KEY. Se voc e n ao tiver uma PRIMARY KEY e alguma aplica c ao perguntar pela PRIMARY KEY em sua tabela, o MySQL retornar a a primeira chave UNIQUE, que n ao possui nenhuma coluna NULL, como a PRIMARY KEY. Uma PRIMARY KEY pode ser um indice multi-coluna. Por em, voc e n ao pode criar um indice multi-coluna usando o atributo de chave PRIMARY KEY em uma especica c ao de coluna. Fazendo assim apenas colunas simples poder ao ser marcadas como prim arias. Voc e deve utilizar uma cl ausula PRIMARY KEY(index_nome_coluna, ...) separada. Um indice UNIQUE e aquele no qual todos os valores no indice devem ser distintos. A exce c ao a isto e que se for permtido conter valores NULL em uma coluna no indice, ele pode conter m ultiplos valores NULL. Este exce c ao n ao se aplica a tabelas BDB, que permitem apenas um u nico NULL.
602
Se a chave PRIMARY ou UNIQUE consistir de apenas uma coluna e ela e do tipo inteiro, voc e tamb em poder a se referir a ela como _rowid (novo na vers ao 3.23.11). Se voc e n ao atribuir um nome ao indice que n ao e um PRIMARY KEY, ele ter a o mesmo nome da prmeira index_nome_coluna, com um suxo opicional (_2, _3, ...) para torn a-lo u nico. Voc e pode nome de indices para uma tabela usando SHOW INDEX FROM nome_tabela. Veja Se c ao 4.6.8.1 [Show database info], P agina 304. Apenas os tipos de tabelas MyISAM, InnoDB, e BDB suportam indices em coluna que possam ter valores NULL. Nos outros casos voc e deve declarar tais colunas NOT NULL ou um erro ser a retornado. Com a sintaxe nome_coluna(length) em uma especica c ao de indice, voc e pode criar um indice que utiliza apenas os primeiros length() bytes de uma coluna CHAR ou VARCHAR. Isto pode tornar o arquivo de indices muito menor. Veja Se c ao 5.4.4 [ Indices], P agina 450. Apenas os tipos de tabela MyISAM e (a partir do MySQL 4.0.14) InnoDB suportam indice em colunas BLOB e TEXT. Ao colocar um indice em uma coluna BLOB ou TEXT voc e sempre DEVE especicar o tamanho do indice, at e 255 bytes. Por exemplo: CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10))); Uma especica c ao index_col_name pode nalizar com ASC ou DESC. Esta palavras chaves s ao permitidas para estens ao futura para especicar o armazenamento do valor do indice em crescente ou decrescente. Atualmente elas s ao analisadas mas ignoradas; valores de indice s ao sempre armazenados em ordem crescente. Quando voc e utiliza ORDER BY ou GROUP BY com uma coluna TEXT ou BLOB, o servidor ardena valores usando apenas o n umero inicial de bytes, indicado pela vari avel do servidor max_sort_length. Veja Se c ao 6.2.3.2 [BLOB], P agina 498. No MySQL Vers ao 3.23.23 ou posterior, voc e tamb em pode criar indices FULLTEXT especiais. Eles s ao usados para busca full-text. Apenas o tipo de tabela MyISAM suporta indices FULLTEXT. Eles s o podem ser criados em colunas CHAR, VARCHAR, e TEXT. A indexa c ao sempre ocorre sobre toda a coluna; indices parciais n ao s ao suportados. Veja Se c ao 6.8 [Fulltext Search], P agina 618 para detalhes de opera c ao. No MySQL Vers ao 3.23.44 ou posterior, tabelas InnoDB suportam verica c ao de chaves estrangeiras. Veja Se c ao 7.5 [InnoDB], P agina 642. Note que a sintaxe FOREIGN KEY no InnoDB e mais restrita que a sintaxe apresentada acima. As colunas da tabela indicada devem ser nomeadas explicitmente. O InnoDB suporta ambas as a c oes ON DELETE e ON UPDATE em chaves esrtrangiras nos MySQL 3.23.50 e 4.0.8, respectivamente. Veja a se c ao InnoDB do manual para a sintaxe precisa. Veja Se c ao 7.5.5.2 [InnoDB foreign key constraints], P agina 652. Para outros tipos de tabelas, MySQL Server analisa as sinatxes FOREIGN KEY, CHECK e REFERENCES no comando CREATE TABLE, mas sem tal a c ao ser tomada. Veja Se c ao 1.8.4.5 [ANSI di Foreign Keys], P agina 50. Para tabelas ISAM e MyISAM, cada coluna NULL tem um bit extra, arredondado para o byte mais pr oximo. O tamanho m aximo de um registro em bytes pode ser calculado como a seguir: tamanho da linha = 1 + (soma do tamanho da coluna) + (n umeros de coluna NULL + delete_flag 7)/8 + (n umero de colunas de tamanho vari avel)
603
delete_flag e 1 para tabelas com formato de registro est atico. Tabelas est aticas usam um bit no registro para um par ametro que indica se o linha foi deletada. delete_flag e 0 para tabelas din amicas porque este par ametro e armazenado no cabe calho da linha din amica. Estes c alculos n ao se aplicam ` a tabelas InnoDB, para a qual o tamanho do armazenamento n ao e diferente para colunas NULL comparados a colunas NOT NULL. A op cao op c~ ao_tabela e SELECT s o s ao implmentadas no MySQL Vers ao 3.23 e acima. A op c ao TYPE para especicar o tipo de tabela possui os seguintes valores: Tipo de tabela BDB ou BerkeleyDB HEAP ISAM InnoDB MERGE MRG_MyISAM MyISAM Descri c ao Tabelas de transa c ao segura com bloqueio de p agina. Veja Se c ao 7.6 [BDB], P agina 695. Os dados desta tabela s ao armazenados apenas na mem oria. Veja Se c ao 7.4 [HEAP], P agina 641. O mecanismo de armazenamento original. Veja Se c ao 7.3 [ISAM], P agina 640. Tabelas com transa c oes eguras com bloqueio de linha. Veja Se c ao 7.5 [InnoDB], P agina 642. Uma cole c ao de tabelas MyISAM usadas como uma tabela. Veja Se c ao 7.2 [MERGE], P agina 637. Um apelido para tabelas MERGE O novo mecanismo de armazenamento port avel bin ario que substitui o ISAM. Veja Se c ao 7.1 [MyISAM], P agina 630.
Veja Cap ptexi tulo 7 [Tipos de tabelas], P agina 629. Se um tipo de tabela e especicado, e este tipo n ao est a dispon ivel, MySQL ir a usar MyISAM. Por exemplo, se uma deni c ao de tabela inclui a op c ao TYPE=BDB mas o MySQL n ao suporta tabelas BDB, a tabela ser a criada como uma tabela MyISAM. Isto torna poss ivel de se ter uma congura c ao de replica c ao onde voc e tem tabelas transacionaisno master mas as tabelas criadas no slave s ao n ao transacionais (para obter mais velocidade). No MySQL 4.1.1 voc e obt em um aviso se o tipo de tabela especicado n ao e aceito. Os outros tipos de tabelas s ao utilizados para otimizar o comportamento da tabela. Na maioria dos casos, voc e n ao precisa especicar nenhuma delas. As op c oes funcionam com todos os tipos, a menos que haja indica c ao: Op c ao AUTO_INCREMENT Descri c ao O pr oximo valor AUTO_INCREMENT que voc e quer denir em sua tabela (apenas MyISAM; para denir o primeiro valor auto incrementeem uma tabela InnoDB insira uma linha com um valor de menos um e delete esta linha). Uma aproxima c ao do tamanho m edio de linha em sua tabela. Voc e s o precisa den i-la para tabelas grnades com tamanho de registros vari aveis. Dena com 1 se voc e quiser manter um checksum para todas as linha (deixa a tabela um pouco mais lenta para atualiza c oes, mas ca mais f acil encontrar tabelas corrompidas) (apenas MyISAM). Um coment ario de 60 caracteres para a sua tabela.
AVG_ROW_LENGTH CHECKSUM
COMMENT
604
N umero m aximo de linhas que voc e deseja armazenar na tabela. N umero m inimo de linha que voc e planeja armazenar na tabela. Dena com 1 se voc e quiser um indice menor, Normalmente torna a atualiza c ao mais lenta e a leitura mais r apida (apenas MyISAM e ISAM). Denr com 0 ir a desabilitar empacotamento das chaves. Denir com DEFAULT (MySQL 4.0) dir a ao mecanismo de armazenamento para empacotar apenas colunas CHAR/VARCHAR longas. Criptografa o arquivo .frm com uma senha. Esta op c ao n ao fa nada na vers ao padr ao do MySQL. Dena com 1 se quiser atrasar a atualiza c ao das chaves da tabela at e que a tabela seja fechada (apenas MyISAM). Dene como as linhas devem ser armazenadas. Atualmente esta op c ao s o funciona com tabelas MyISAM, as quais suportam os formatos de linha DYNAMIC e FIXED. Veja Se c ao 7.1.2 [Formatos das tabelas MyISAM], P agina 633.
Quando voc e utiliza uma tabela MyISAM, MySQL usa o produto de MAX_ROWS * AVG_ ROW_LENGTH para decidir o tamanho da tabela resultante. Se voc e n ao especicar qualquer uma das op c oes acima, o tamanho m aximo de uma tabela ser a 4G (ou 2G se o seu sistema operacional s o suporta tabelas de 2G). A raz ao para isto e apenas manter o tamanho dos ponteiros baixo para tornar o indice menor e mais r apido se voc e realmente n ao precisa de tabelas grandes. Se voc e n ao utilizar PACK_KEYS, o padr ao e s o empacotar strings, n ao n umeros. Se voc e utilizar PACK_KEYS=1, n umeros tamb em ser ao empacotados. Ao empacotar chaves num ericas bin arias, o MySQL usar a a compacta c ao prexada. Isto signica que voc e s o ter a grandes benef icios disto se voc e tiver muitos n umeros iguais. Compacta c ao prexada signica que toda a chave precisa de um byte extra para indicar quantos bytes das caves anteriores s ao o mesmo da pr oxima chave (note que o ponteiro para a linha e armazenado na ordem do byte mais alto em primeiro diretamente depois da chave, para aumentar compacta c ao). Isto signica que se voc e tiver muitas chaves iguais em duas linhas consecutivas, todas os chaves iguais seguintes ir ao normalmente ter apenas 2 bytes (incluindo o ponteiro para a linha). Compare isto isto ao caso comum onde as chaves seguintes ir ao levar tamanho armazenamento chave + tamanho ponteiro (nomralmente 4). Por outro lado, se todas as chaves s ao totalmente diferente, voc e usar a 1 byte por chave, se a chave n ao puder ter valores NULL. (Neste caso o tamanho da chave empacotada ser a armazenado no mesmo byte que e usado para marcar se a chave e NULL.) No MySQL 3.23, Se voc e especicar um SELECT depois de uma instru c ao CREATE, MySQL criar a novos campos para todos os elemento em SELECT. Por exemplo: mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (a), KEY(b)) -> TYPE=MyISAM SELECT b,c FROM test2;
605
Isto ir a criar uma tabela MyISAM com tr es colunas, a, b e c. Note que as colunas da instru c ao SELECT s ao inseridas do lado correto da tabela, n` ao sobreposta nela. Considere o seguinte exemplo: mysql> SELECT * FROM foo; +---+ | n | +---+ | 1 | +---+ mysql> CREATE TABLE bar (m INT) SELECT n FROM foo; Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM bar; +------+---+ | m | n | +------+---+ | NULL | 1 | +------+---+ 1 row in set (0.00 sec) Para cada linha na tabela foo, uma linha e inserida em bar com os valores de foo e os valores padr oes para a nova coluna. CREATE TABLE ... SELECT n ao ir a criar automaticamente nenhum indice para voc e. Isto e feito intencionalmente para deixar o comando o mais exivel possivel. Se voc e quiser ter indices em uma tabela criada, voc e deve especic a-lo antes da instru c ao SELECT: mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo; Se ocorrer qualquer erro durante enquanto os dados s ao copiados para a tabela, ele ser a automaticamente deletado. Voc e pode preceder o SELECT por IGNORE ou REPLACE para indicar como tratar registros que duplicam valores de chave u nica. Com IGNORE, novos registros que duplicam um registro existente em um valor de chave u nica s ao descartados. Com REPLACE, novos registros substituem registros que tem o mesmo valor de chave u nica. Se nem IGNORE nem REPLACE s ao especicados, valir de chave unica duplicados resultam em erro. Para assegurar que o log bin ario/atualiza c ao pode ser usado para recriar a tabela original, MySQL n ao permitir a inser c oes concorrentes durante um CREATE TABLE ... SELECT. A op c ao RAID_TYPE ir a ajud a-lo a exceder o limite de 2G/4G limit para arquivo de dados MyISAM (n ao o arquivo de indice) em sistemas operacionais que n ao suportam arquivos grandes. Note que esta op c ao n ao e recomendada para sistema de arquivos que suportam arquivos grandes! Voc e pode obter mais velocidade da gargalo de E/S colocando diretorios RAID em diferentes discos f isicos. RAID_TYPE funcionar a em qualquer sistema operacional, desde
606
que voc e tenha congurado o MySQL com --with-raid. Por agora o u nico RAID_TYPE permitido e STRIPED (1 e RAID0 s ao utilizados para isto). Se voc e especicar RAID_TYPE=STRIPED para tabeals MyISAM, MyISAM criar a subdiret orios RAID_CHUNKS chamados 00, 01, 02 no diret orio de banco de dados. Em cada um destes diret orios MyISAM criar a uma nome_tabela.MYD. Ao escrever dados no arquivo de dados, o manipulador RAID ir a mapear o primeiro RAID_CHUNKSIZE *1024 bytes para o primeiro arquivo e os pr oximos RAID_CHUNKSIZE *1024 bytes para o pr oximo arquivo. UNION e utilizado quando voc e quer utilizar uma cole c ao de tabelas identicas como uma. Isto s o funciona com tabelas MERGE. Veja Se c ao 7.2 [MERGE], P agina 637. No momento voc e precisa ter privil egios SELECT, UPDATE e DELETE nas tabelas mapeadas para uma tabela MERGE. Todas as tabelas mapeadas devem estar no mesmo banco de dados na tabela MERGE. Se voc e quiser inserir dados em uma tabela MERGE, voc e tem que especicar com INSERT_METHOD na tabela onde o registro deve ser inserido. INSERT_METHOD e uma op c ao u til somente para tabelas MERGE. Veja Se c ao 7.2 [MERGE], P agina 637. Esta op c ao foi introduzida no MySQL 4.0.0. Na tabela criada a chave PRIMARY ser a colocado primeiro, seguida de todas a chaves u nicas (UNIQUE) e ent ao das chaves normais. Isto ajuda o otimizador MySQL para priorizar qual chave utilizar e tamb em a detectaa mais rapidamente chaves u nicas (UNIQUE) duplicadas. Utilizando DATA DIRECTORY=directorio ou INDEX DIRECTORY=directorio voc e pode especicar onde o mecanismo de armazenamento deve colocar os seus arquivos de tabelas e indices. Note que diret orio deve ser um caminho completo para o diret orio (n ao um caminho relativo). Isto s o funciona para tabelas MyISAM no MySQL 4.0, quando n ao estiver usando a op c ao --skip-symlink. Veja Se c ao 5.6.1.2 [Links simb olicos para tabelas], P agina 467.
607
Tamanhos de valor impar na faixa de 1 a 13 s ao convertidos para o n umero para mais pr oximo acima. Voc e n ao pode armazenar um NULL literal em uma coluna TIMESTAMP; den i-la com NULL a atribui a data e hora atual. Por colunas TIMESTAMP comportarem deste modo, os atributos NULL e NOT NULL n ao se aplicam no modo normal e s ao ignorados se voc e especic a-los. DESCRIBE nome_tabela sempre indica que a uma coluna TIMESTAMP pode ser atribu ido valores NULL. MySQL mapeia certos tipos de colunas utilizados por outros produtos de banco de dados para tipos MySQL. Veja Se c ao 6.2.5 [Tipos de colunas de outros produtos], P agina 502. Se voc e quiser ver se o MySQL utiliza um tipo de coluna diferente do especicado, axecute uma instru c ao DESCRIBE nome_tabela depois de criar ou alterar a sua tabela. Outras altera c oes de tipos de colunas podem ocorrer se voc e compactar a tabela utilizando myisampack. Veja Se c ao 7.1.2.3 [Formato compactado], P agina 634.
608
Se voc e utilizar ALTER TABLE para alterar a especica c ao da coluna, mas DESCRIBE tbl_ name indicar que a sua coluna n ao foi alterada, e poss ivel que o MySQL tenha ignorado ou a sua modica c ao por uma das raz oes descritas em Se c ao 6.5.3.1 [Silent column changes], P agina 606. Por exemplo, se voc e tentar alterar uma coluna VARCHAR para CHAR, MySQL ainda usar a VARCHAR se a tabela conter outras colunas de tamanho vari avel. ALTER TABLE funciona fazendo uma c opia tempor aria da tabela original. A altera c ao e realizada na c opia, assim a tabela original e deletada e a nova tabela e renomeada. Isto e feito de tal forma que todas as desnecess ariaatualiza c oes s ao automaticamente redirecionadas para a nova tabela sem nenhuma atualiza c ao errada. Enquanto o ALTER TABLE e executado, a tabela original pode ser lida por outros clientes. Atualiza c oes e escrita na tabela s ao guardadas at e a nova tabela estar pronta. Note que se voc e utilizar qualquer outra op c ao de ALTER TABLE, exceto RENAME, o MySQL ir a sempre criar um a tabela tempor aria, mesmo se os dados n ao precisarem realmente serem copiados (como quando voc e altera o nome de uma coluna). Planejamos corrigir isto no futuro, mas como n ao se faz ALTER TABLE com tanta frequ encia, isto n ao e de alta prioridade em nosso TO DO. Para tabelas MyISAM, vOc e pode aumentar a velocidade na parte da recria c ao dos indices (que a parte mais lenta do processo recria c ao) atribuindo um alto valor ` a vari avel myisam_sort_buffer_size. Para utilizar ALTER TABLE, voc e precisa dos privil egios ALTER, INSERT e CREATE na tabela. IGNORE e uma extens ao do MySQL ao SQL-92. Ele controla como o ALTER TABLE funciona se houver duplica c ao em chaves u nicas na nova tabela. Se IGNORE n ao e especicado, a c opia e abortada e retornada. Se IGNORE for especicado, para linhas com duplicatas em chaves u nicas, somente a primera linha e usada; as outras s ao deletadas. Voc e pode executar m ultiplas cl ausulas ADD, ALTER, DROP e CHANGE em uma u nica instru c ao ALTER TABLE. Esta e uma extens ao do MySQL ao SQL-92, que permite paenas uma cl ausula de cada por instru c ao ALTER TABLE. CHANGE col_name, DROP col_name, e DROP INDEX s ao extens oes do MySQL ao SQL-92. MODIFY e uma extens ao do Oracle para ALTER TABLE. A palavra opcional COLUMN e uma palavra puramente desnecess aria e pode ser omitida. Se voc e utilizar ALTER TABLE nome_tbl RENAME TO novo_nome sem nenhuma outra op c ao, MySQL simplesmente renomeia os arquivos correspondentes a tabela nome_tbl. N ao h a necessidade de se criar uma tabela tempor aria. Veja Se c ao 6.5.5 [RENAME TABLE], P agina 611. Cl ausulas defini ca ~o_create usam a mesma sintaxe para ADD e CHANGE assim como para CREATE TABLE. Note que a sintaxe inclui o nome da coluna, n ao apenas o tipo da coluna. Veja Se c ao 6.5.3 [CREATE TABLE], P agina 597. Voc e pode renomear ma coluna usando uma cl ausula CHANGE nome_col_antiga defini c~ oes_create. Para tal, especique o nome das colunas antiga e da nome e o tipo que a coluna atual possui. Por exemplo, para renomear uma coluna INTEGER de a para b, fa ca assim: mysql> ALTER TABLE t1 CHANGE a b INTEGER; Se voc e quiser mudar um tipo de coluna, mas n ao o nome, a sintaxe CHANGE ainda exige dois nomes de colunas, mesmo que sejam o mesmo. Por exemplo:
609
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL; No entanto, como no MySQL Vers ao 3.22.16a, voc e tamb em pode utilizar MODIFY para alterar um tipo de coluna sem renome a-lo: mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL; Se voc e utilizar CHANGE ou MODIFY para reduzir uma coluna na qual exista um indice em parte da coluna (por exemplo, se voc e tiver um indice nos primeiros 10 caracteres de uma coluna VARCHAR), voc e n ao poder a reduzir a coluna para um tamanho menor que o n umero de caracteres indexados. Quando voc e altera um tipo de coluna usando CHANGE ou MODIFY, erter os dados para o novo tipo da melhor forma poss ivel. No MySQL Vers ao 3.22 ou posterior voc e pode utilizar FIRST ou ADD ... AFTER nome_ col para aadicionar uma coluna em uma posi c ao espec ica na linha da tabela. O padr ao e adicionar a coluna no m. A partir do MySQL Vers ao 4.0.1, voc e pode tamb em utilizar as palvras-chave FIRST e AFTER em CHANGE ou MODIFY. ALTER COLUMN especica um novo valor padr ao para uma coluna ou remover o valor padr ao antigo. Se o padr ao antigo e removido e a coluna pode ser NULL, o novo padr ao e NULL. Se a coluna n ao pode ser NULL, MySQL atribui um valor padr ao, como descrito em Se c ao 6.5.3 [CREATE TABLE], P agina 597. DROP INDEX remove um indice. Esta e uma extens ao do MySQL ao SQL-92. Veja Se c ao 6.5.8 [DROP INDEX], P agina 613. Se colunas forem removidas de uma tabela, as colunas tamb em s ao removidas de qualquer indice do qual eles fazem parte. Se todas as colunas que comp oe um indice s ao exclu idas, o indice tamb em e exclu ido. Se uma tabela cont em apenas uma coluna, a coluna n ao pode ser exclu ida. Se o que voc e pretende e remover a tabela, use DROP TABLE. DROP PRIMARY KEY deleta o indice prim ario. Se tal indice n ao existe, ele apaga o prmeiro indice u nico (UNIQUE) na tabela. (MySQL marca a primeira chave u nica (UNIQUE) como PRIMARY KEY se nenhuma PRIMARY KEY foi especicada explicitamente.) Se voc e adicionar UNIQUE INDEX ou PRIMARY KEY a uma tabela, elas s ao armazenadas antes de qualquer indice n ao UNIQUE para que possa detectar cahves duplicadas o mais r apido poss ivel. ORDER BY lhe permite criar a nova tabela com as linhas em uma ordem espec ica. Note que a tabela n ao permanecer a nesta ordem depois de insr c oes e dele c oes. Em algunas casos, isto pode tornar a ordena c ao mais para o MySQL se a tabela estiver ordenada pela coluna que voc e escolheu. Esta op c ao eu til principalmente quando voc e sabe qeu na maioria das vezes voc e ir a inserir os registros em certa ordem; utilizando esta op c ao depois de grandes mudan cas na tabela, voc e obter a melhor desempenho. Se voc e utilizar ALTER TABLE em uma tabela MyISAM, todos os indices que n ao s ao u nicos s ao criados em um grupo separado (como em REPAIR). Isto deve tornar ALTER TABLE muito mais r apido quando voc e tiver v arios indices. A partir do MySQL 4.0 o recurso acima pode ser ativado explicitamente. ALTER TABLE ... DISABLE KEYS faz o MySQL parar de atualizar chaves que n ao s ao u nicas em tabelas MyISAM. ALTER TABLE ... ENABLE KEYS deve ser usado para recriar indices perdidos. Como o MySQL faz isso com um algoritmo especial que e muito mais r apido que
610
inserir chaves uma a uma, disabilitar chaves podem trazer um aumento de velocidade consider avel em inser c oes volumosas. Com a fun c ao mysql_info() da API C, voc e pode saber quantos registros foram copiados, e (quando IGNORE for usado) quantos registros foram deletados devido a duplica c ao de valores de chaves u nicas. As cl ausulas FOREIGN KEY, CHECK e REFERENCES n ao fazem nada, exceto para tipos de tabela InnoDB que suportam ... ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...) e ... DROP FOREIGN KEY .... Veja Se c ao 7.5.5.2 [InnoDB foreign key constraints], P agina 652. A sintaxe para outros tipos de tabela s o e fornecido para comptibilidade, para tornar f acil portar o c odigo de outro servidor SQL e executar aplica c oes que criam tabelasd com refer encias. Veja Se c ao 1.8.4 [Diferen cas do ANSI], P agina 45. ALTER TABLE ignora as op c oes de tabela DATA DIRECTORY e INDEX DIRECTORY. Se voc e quiser alterar todas as colunas CHAR/VARCHAR/TEXT para um novo conjunto de caracteres (por exemplo, depois de atualizar do MySQL 4.0.x para o 4.1.1) voc e pode fazer: ALTER TABLE table_name CHARACTER SET character_set_name; Note que o seguinte comando s o ir a alterar o default character set para uma tabela: ALTER TABLE table_name DEFAULT CHARACTER SET character_set_name; O default character set e o conjunto de caracteres que e usado se voc e n ao especicar o conjunto de caracteres para uma nova coluna que voc e adicionar a tabela (por exemplo com ALTER TABLE ... ADD coluna).
Aqui temos um exemplo que mostra alguns dos usos de ALTER TABLE. N os come camos com uma tabela t1 que e crida como mostrado aqui: mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10)); Para renomear a tabela de t1 para t2: mysql> ALTER TABLE t1 RENAME t2; Para alterar a coluna a de INTEGER para TINYINT NOT NULL (deixando o mesmo nome), e alterar a coluna b de CHAR(10) para CHAR(20) e renome a-la de b para c: mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20); Para adicionar um nova coluna TIMESTAMP chamada d: mysql> ALTER TABLE t2 ADD d TIMESTAMP; Para adicionar um indice na coluna d, e tornar a colua a a chave prim aria: mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a); Para remover a coluna c: mysql> ALTER TABLE t2 DROP COLUMN c; Para adiciomar um nova coluna inteira AUTO_INCREMENT chamada c: mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD INDEX (c); Note que n os indexamos c, porque colunas AUTO_INCREMENT devem ser indexadas e tamb em por isso declaramos c como NOT NULL, pois colunas indexadas n ao podem ser NULL.
611
Quando voc e adicionar uma coluna AUTO_INCREMENT, valores de coluna s ao preenchidos com sequ encia de n umeros automaticamente para voc e. Voc e pode denir o primeiro n umero da sequ encia executando SET INSERT_ID=valor antes de ALTER TABLE ou usando a op c ao de tabela AUTO_INCREMENT=valor. Veja Se c ao 5.5.6 [SET OPTION], P agina 461. Com tabelas MyISAM tables, se voc e n ao alterar a coluna AUTO_INCREMENT, a sequ encia de n umeros n ao ser a afetada. Se voc e excluir uma coluna AUTO_INCREMENT e adicionar outra coluna AUTO_INCREMENT, a numera c ao iniciar a a partir do 1 novamente. Veja Se c ao A.7.1 [Problemas com ALTER TABLE], P agina 934.
612
Nota: DROP TABLE far a automaticamente um commit da transa c ao ativa atualmente (exceto se voc e estiver usando a vers ao 4.1 e a palavra-chave TEMPORARY. A opc ao TEMPORARY e ignorada na vers ao 4.0. Na vers ao 4.1 esta op c ao funciona como a seguir: S o apaga tabelas tempor arias. IN ao naliza uma transa c ao em execu c ao. Nenhum direito de acesso e vericado. Usar TEMPORARY e uma boa maneira de assegurar que voc e n ao apague uma tabela real.
613
crescente ou decrescente. Atualmente elas s ao analisadas mas ignoradas; valores de indice s ao sempre armazenados em ordem crescente. Para mais detalhes sobre como o MySQL utiliza indices, veja Se c ao 5.4.3 [ Indices MySQL], P agina 448. Ind ices FULLTEXT s o podem indexar colunas CHAR, VARCHAR e TEXT, e apenas em tabelas MyISAM. Indices FULLTEXT est ao dispon iveis no MySQL Vers ao 3.23.23 e posterior. Se c ao 6.8 [Pesquisa Fulltext], P agina 618.
614
apenas com nomes que corespondam com a string. N ao e necess ario colocar a string entre aspas. Se os tipos de colunas s ao diferentes do esperado baseado nas instru c oes CREATE TABLE, note que algumas vezer o MySQL altera o tipo das colunas. Veja Se c ao 6.5.3.1 [Alterando colunas sem aviso], P agina 606. Esta instru c ao e fornecida para compatibilidade com Oracle. A instru c ao SHOW fornece informa c ao similar. Veja Se c ao 4.6.8 [SHOW], P agina 303.
615
Voc e pode alterar o n ivel isola c ao para transa c oes com SET TRANSACTION ISOLATION LEVEL. Veja Se c ao 6.7.6 [SET TRANSACTION], P agina 618.
616
Se o comando retorna o seguinte erro, signica que n ao existem savepoints como o nome especicado. ERROR 1181: Got error 153 during ROLLBACK Todos os savepoints da transa c ao atual s ao deletados se voc e executar um COMMIT ou um ROLLBACK que n ao chamou um savepoint.
617
2. Se uma tabela e bloqueada com uma trava de leitura e de escrita, coloque a trava de escrita antes da trava de leitura. 3. Bloqueie uma tabela por vez at e que a thread obtenha todas as travas. Esta pol itica assegura que as tabelas sejam bloqueadas sem deadlock. H a no entanto outra coisa da qual e preciso estar ciente neste esquema: Se coc e estiver usando uma trava de escita LOW_PRIORITY WRITE em uma tabela, signica apenas que o MySQL ir a esperar por esta trava particular at e que n ao haja mais treads fazendo um bloqueio de leitura (READ). Quando a thread tiver obtido a trava de escrita (WRITE) e est a esperando ppo obter o trava para a pr oxima tabela na lista de tabelas bloqueadas, todas as outras threads ir ao esperar que a trva de escrita (WRITE) seja liberada. Se isto tornar um s erio problema com sua aplica c ao, voc e deve converter algumas de suas tabellas para tabelas com seguran ca em transa c oes. Voc e pode matar com seguran ca um thread que est a esperando por um bloqueio de tabela com KILL. Veja Se c ao 4.6.7 [KILL], P agina 302. Note que voc e n ao deve travar nenhuma tabela que voc e esteja usando com INSERT DELAYED. Isto e porque este e o caso que o INSERT e feito por uma thread separada. Normalmente, voc e n ao tem que travar tabelas, j a que todas as instru c oes UPDATE s ao atomicas; nenhuma outra thread pode interferir com qualquer outra executando uma instru c ao SQL. Existem poucos casos em que voc e gostaria de travar as tabelas de qualquer forma: Se voc e for executar opera c oes em um grupo de tabelas, e muito mais r apido travar as tabelas que voc e for utilizar. O lado ruim e que nenhuma outra thread pode atualizar uma tabela travada para leitura (READ) (incluindo aquela que guarda o lock) e nenhuma outra thread pode ler uma tabela bloqueada para escrita (WRITE) al em daquele que guarda o lock. A raz ao de algumas coisas serem r apidas sob LOCK TABLES e que o MySQL n ao ir a descarregar a cache de tabelas bloqueadas at e que UNLOCK TABLES seja chamado (normalmente a cache de chaves e descarregada a cada instru c ao SQL). Isto aumenta a velocidade de inser c ao, atualiza c ao e dele c ao) em tabelas MyISAM. Se voc e estiver usando um mecanismo de armazenamento no MySQL que n ao suporte transa c oes, voc e deve usar LOCK TABLES se voc e quiser se assegurar que nenhuma outra thread venha entre um SELECT e um UPDATE. O exemplo mostrado aqui exige LOCK TABLES para ser executado com seguran ca: mysql> mysql> mysql> -> mysql> LOCK TABLES trans READ, customer WRITE; SELECT SUM(value) FROM trans WHERE customer_id=some_id; UPDATE customer SET total_value=sum_from_previous_statement WHERE customer_id=some_id; UNLOCK TABLES;
Sem LOCK TABLES, existe uma chance que outra thread possa inserir uma nova linha na tabela trans entre a execu c ao das instru c oes SELECT e UPDATE. Utilizando atualiza c oes incrementais (UPDATE customer SET value=value+new_value) ou a fun c ao LAST_INSERT_ID()i, voc e pode evitar o uso de LOCK TABLES em muitos casos. Voc e tamb em pode resolver alguns casos usando as fun c oes de bloqueio a n ivel de usu ario GET_LOCK() e RELEASE_LOCK(). Estas travas s ao salvas em uma tabela hash no servidor e
618
implementado com pthread_mutex_lock() e pthread_mutex_unlock() para alta velocidade. Veja Se c ao 6.3.6.2 [Fun c oes diversas], P agina 546. Veja Se c ao 5.3.1 [Internal locking], P agina 444, para mais informa c oes sobre pol itica de bloqueios. Voc e pode trocar todas as tabelas em todos os banco de dados com trava de leitura com o comando FLUSH TABLES WITH READ LOCK. Veja Se c ao 4.6.4 [FLUSH], P agina 300. Este e um modo muito conveiente de tirar backups se voc e tiver um sistema de arquivos, como Veritas, que pode tirar snapshots. NOTE: LOCK TABLES m ao e seguro com transa c oes e far a um commit implicitamente em qualquer transa c ao ativa antes de tentar travar as tabelas.
619
-> ); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO articles VALUES -> (NULL,MySQL Tutorial, DBMS stands for DataBase ...), -> (NULL,How To Use MySQL Efficiently, After you went through a ...), -> (NULL,Optimizing MySQL,In this tutorial we will show ...), -> (NULL,1001 MySQL Tricks,1. Never run mysqld as root. 2. ...), -> (NULL,MySQL vs. YourSQL, In the following database comparison ...), -> (NULL,MySQL Security, When configured properly, MySQL ...); Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM articles -> WHERE MATCH (title,body) AGAINST (database); +----+-------------------+------------------------------------------+ | id | title | body | +----+-------------------+------------------------------------------+ | 5 | MySQL vs. YourSQL | In the following database comparison ... | | 1 | MySQL Tutorial | DBMS stands for DataBase ... | +----+-------------------+------------------------------------------+ 2 rows in set (0.00 sec) A fun c ao MATCH() realiza um busca de linguagem natural por uma string comtra uma cole c ao de texto (um conjunto de uma ou mais colunas inclu idas em um indice FULLTEXT). A string pesquisada e dada como o argumento de AGAINST(). A busca e realizada na forma caso-insensitivo. Para cada uma das linhas da tabela, MATCH() retorna um valor relevante, isto e, uma medida de similaridade entre a string pesquisada e o texto naquela nas colunas identicadas na lista MATCH(). Quando MATCH() e utilizado na cl ausula WHERE (veja exemplo acima) as linhas retornadas s ao automaticamente ordenadas com a maior relev ancia primerio. Valores de relev ancia s ao n umeros de ponto utuante n ao negativos. Relev ancia zero signica nenhuma similaridade. Relev ancia e computado baseada no n umero de palavras na linha, o n umero de palavras u nica naquela linha, o n umero de palavras na cole c ao e o n umero de documentos (linhas) que contenham uma palavra particular. Tamb em e poss ivel realizar uma busca no modo booleano. Isto e explicado posteriormente nesta se c ao. O exemplo precedente e uma ilustr c ao b asica mostrando como usar a fun c ao MATCH(). Linhas s ao retornodas em ordem decrescente de relev ancia. O pr oximo exemplo mostra como retornar o valores de relev ancia explicitamente. Como nem a cl ausula WHERE nem a ORDER BY est ao presentes, as linhas s ao retornadas fora de ordem. mysql> SELECT id,MATCH (title,body) AGAINST (Tutorial) FROM articles; +----+-----------------------------------------+ | id | MATCH (title,body) AGAINST (Tutorial) | +----+-----------------------------------------+
620
| 1 | 0.64840710366884 | | 2 | 0 | | 3 | 0.66266459031789 | | 4 | 0 | | 5 | 0 | | 6 | 0 | +----+-----------------------------------------+ 6 rows in set (0.00 sec) O exemplo seguinte e mais complexo. A consulta retorna a relev ancia e ainda ordena as linhas em ordem decrescente de relev ancia. Para conseguir este resultado, voc e deve especicar MATCH() duas vezes. Isto n ao ir a causar sobrecarga adicional, pois o otimizador MySQL ir a notar que duas chamadas MATCH() s ao id enticas e invocam o c odigo da busca full-text apenas uma vez. mysql> SELECT id, body, MATCH (title,body) AGAINST -> (Security implications of running MySQL as root) AS score -> FROM articles WHERE MATCH (title,body) AGAINST -> (Security implications of running MySQL as root); +----+-------------------------------------+-----------------+ | id | body | score | +----+-------------------------------------+-----------------+ | 4 | 1. Never run mysqld as root. 2. ... | 1.5055546709332 | | 6 | When configured properly, MySQL ... | 1.31140957288 | +----+-------------------------------------+-----------------+ 2 rows in set (0.00 sec) Desde a vers ao 4.1.1, pesquisas full-text suportam expans ao de consulta (em particular, sua variante blind query expansion). Ela e geralmente u til quando uma frase pesquisada e muito curta - frase curta signica que um usu ario est a conando em um conhecimento contido, que a pesquisa full-text normalmente perde. Ex. pesquisas do usu ario por database implicam que MySQL, Oracle, DB2, RDBMS s ao todos databases e devem ser encontrados tamb em - isto e conhecimento contido. Blind query expansion (also known as automatic relevance feedback) works by performing the search twice, with the search phrase for the second search being the original search phrase concatenated with the few top found documents from the rst search. Thus if one of these documents containted the word databases and the word MySQL, then the second search will nd the documents that contain the word MySQL but not database. Another example could be searching for Georges Simenon books about Maigret, when a user is not sure how to spell Maigret. Then, searching for Megre and the reluctant witnesses will nd only Maigret and the Reluctant Witnesses without query expansion, but all books with the word Maigret on the second pass of a search with query expansion. Note: as blind query expansion tends to increase noise signicantly, by returning non relevant documents, its only meaningful to use when a search phrase is rather short. O MySQL utiliza um analizados mutio simples para separa texto em palavras. Uma palavra e uma sequ encia de caracteres consistindo de letras, digitos, , e _. Qualquer palavra presente na lista de palavra de parada ou for muito curta e ignorada. O tamanho padr ao minimo das palavras que ser ao encontradas pela pesquisa full-text e de qua-
621
tro caracteres. Isto pode ser alterado como descrito em Se c ao 6.8.2 [Fulltext Fine-tuning], P agina 623. Toda palavra correta na lista de cole c oes e na consulta e pesada de acordo com sua signic ancia na consulta ou cole c ao. Deste modo, uma palavra que est a presente em v arios documentos ter a peso menor (e poder a ter at e mesmo um peso zero), j a que ele t em um valor sem antico baixo nesta cole c ao particular. Por outro lado, se a palavra e rara, ela receber a um peso alto. O peso das palavras s ao ent ao combinados para computar a relev ancia das linhas. Tal t ecnica funciona melhor com cole c oes grandes (de fato, ela e cuidadosamente ajustado deste modo). Para tabelas muito pequenas, a distribui c ao das palavras n ao reetem adequadamente seus valores sem anticos, e este modelo pode algumas vezes produzir resultados bizarros. mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST (MySQL); Empty set (0.00 sec) A busca pela palavra MySQL n ao produz resultados no exemplo acima, porque esta palavra est a presente em mais da metade das linhass. Como tal, ela e efetivamente tratada como palavra de parada (isto e, uma palavra com valor sem antico zero). Este e o comportamento mais desej avel uma consulta de linguagem natural n ao deve retornar toda segunda linha de uma tabela de 1 GB. Uma palavra que casa com metade dos registros em uma tabela tem menos chance de encontrar dosumentos relevantes. De fato, e muito mais prov avel encontrar v arios documentos irrelevantes. Todos n os sabemos que isto acontece com muita frequ encia quando tentamos com esta raz encontrar alguma coisa na internet com um mecanismo de busca. E ao que estes registros tem sido atribuido com um baixo valor sem antico neste banco de dados particular. Na vers ao 4.0.1, MySQL tamb em pode realizar buscas full-text booleanas usando o modicador IN BOOLEAN MODE. mysql> SELECT * FROM articles WHERE MATCH (title,body) -> AGAINST (+MySQL -YourSQL IN BOOLEAN MODE); +----+------------------------------+-------------------------------------+ | id | title | body | +----+------------------------------+-------------------------------------+ | 1 | MySQL Tutorial | DBMS stands for DataBase ... | | 2 | How To Use MySQL Efficiently | After you went through a ... | | 3 | Optimizing MySQL | In this tutorial we will show ... | | 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... | | 6 | MySQL Security | When configured properly, MySQL ... | +----+------------------------------+-------------------------------------+ Esta consulta recupera todos os registros que contenham a palavra MySQL (note: o ponto inicial de 50% n ao e utilizado), mas que n ao contenha a palavra YourSQL. Note que a pesquisa em modo booleano n ao ordena os registros automaticamente em ordem decrescente de relev ancia. Voc e pode ver isto no resultado da consulta anterior, onde a linha coo a maior relev ancia (aquela que cont em MySQL duas vezes) e listada por u ltimo, n ao em primeiro. Um busca full-text booleana tamb em pode funcionar mesmo sem um indice FULLTEXT, no entanto ela seria lenta. A busca full-text booleana suporte potencialmente as seguintes opera c oes:
622
+ -
Um sinal de mais precedente indica que esta palavra deve estar presente em cada linha retornada. Um sinal de menos precedente indice que esta palavra n ao deve estar presente em qualquer linha retornada. Por padr ao (quando nem mais nem menos e especicado) a palavra e opcional, mas as linhas que a cont em ser ao avaliadas positivamente. Isto dene o comportamento de MATCH() ... AGAINST() sem o modicados IN BOOLEAN MODE.
<>
Estes dois operadores s ao usados para alterar a contribui c ao de uma palvara no valor de relev ancia que a tribu ido a um registro. O operador < reduz a contribui c ao e o operador > a aumenta. Veja o exemplo abaixo. Parenteses s ao usado para agrupar palavras em subexpress oes. Um til precedente atua como um operador de nega c ao, tornando a contribui c ao da palavra para a relev ancia da linha ser negativa. Ele e u til para marcar palavras "ruidosas". Linhas com tais palavras ter ao uma avalia c ao mais baixa que outras, mas n ao ser a exclu ida, como seria com o operador -. Um asterisco e um operador de truncamento. Diferente dos outros operadores, ele deve ser inserida ao m da palavra, n ao deve ser precedente. A frase que e colocada entre aspas duplas ", coincidem apenas com linhas que contenha esta frase literalmente, como foi digitada.
() ~
* "
E aqui est ao alguns exeplos: apple banana encontra linhas que contenha pela menos uma destas palavras. +apple +juice ... ambas as palavras. +apple macintosh ... palavra apple, mas avaliada mais alto se tamb em conter macintosh. +apple -macintosh ... palavra apple mas n ao macintosh. +apple +(>turnover <strudel) ... apple e turnover, ou apple e strudel (em qualquer ordem), mas avalia apple pie melhor que apple strudel. apple* ... apple, apples, applesauce, e applet. "some words" ... some words of wisdom, mas n ao some noise words.
623
Todos os par ametros da fun c ao MATCH() devem ser colunas da mesma tabela que e parte do mesmo indice FULLTEXT, a menos que MATCH() esteja IN BOOLEAN MODE. Todas as colunas no indice FULLTEXT devem ter o mesmo conjunto de caracter. A lista de coluna MATCH() deve casar exatamente a lista de colunas em algum deni c ao de indice FULLTEXT para a tabela, a menos que este MATCH() seja IN BOOLEAN MODE. O argumento para AGAINST() deve ser uma string constante.
624
Algumas vezes o mantedor do mecanismo de busca gostaria de alterar os operadores usados por busca full-text boolanas. Eles s ao denidos pela vari avel ft_boolean_ syntax. Veja Se c ao 4.6.8.4 [ft_boolean_syntax], P agina 310. Ainda, esta vari avel e somente leitura; este valor est a denido em myisam/ft_static.c. Para mudan cas full-text que exigem que voc e reconstrua seu indice FULLTEXT, o modo mais f acil de faz e-lo para uma tabela MyISAM e usar a seguinte instru c ao, a qual reconstroi o arquivo de indice: mysql> REPAIR TABLE nome_tabela QUICK;
625
Buscas depois de uma linha em uma tabela de uma linha e 238% mais r apido. Isto pode ser considerado perto do m inimo de ganho a ser esperado para uma consulta que est a armazenada. Se voc e quiser disabilitar o codigo da cache de consulta dena query_cache_size=0. Disabilitando o c odigo da cache de consultas n ao haver a nenhuma sobrecarga not avel. (cache de consultas pode ser excluido do c odigo com ajuda da op c ao de conigura c ao --without-query-cache)
626
GET_LOCK RELEASE_LOCK LOAD_FILE MASTER_POS_WAIT NOW SYSDATE CURRENT_TIMESTAMP CURDATE CURRENT_DATE CURTIME CURRENT_TIME DATABASE ENCRYPT (com um par ametro) LAST_INSERT_ID RAND UNIX_TIMESTAMP (sem USER BENCHMARK par ametros) Um consulta n ao pode ser armazenada em cache se conter vari aveis, referenciar o banco de dados do sistema mysql, for da forma SELECT ... IN SHARE MODE, SELECT ... INTO OUTFILE ..., SELECT ... INTO DUMPFILE ... ou da forma SELECT * FROM AUTOINCREMENT_FIELD IS NULL (para retornar a ID da ultima inser c ao - ODBC contorna este problema). No entanto, FOUND_ROWS() retornar a o valor correto, mesmo se a consulta precedente foi buscada da cache. No caso de uma consulta n ao utilizar qualquer tabela, ou utilizar tabelas tempor arias, ou se o usu ario tiver um privil egio de coluna para qualquer tabela chamada, esta consulta n ao ser a armazenada em cache. Antes de uma consulta ser trazida da cache de consulta, o MySQL ir a vericar se o usu ario com privil egio SELECT para todos os banco de dados e tabelas envolvidos. Se este n ao for o caso, o resultado em cache n ao ser a usado.
627
Se voc e tem muitas consultas com resultados grandes (veja Qcache_total_blocks e Qcache_queries_in_cache),voc e pode aumentar a performance aumentadno query_cache_min_res_unit. No entanto, seja cuidadoso para n ao torn a-lo muito grande (veja o ponto anterior). query_cache_size A quantidade de mem oria (especicada em bytes) alocada para armazenar resultados de consultas antigas. Se ele for 0, a cache de consultas est a desbilitada (padr ao). query_cache_type Pode ser atribuido (apenas num erico) com Op c ao Descri c ao 0 (OFF, n ao armazene ou retorne resultados) 1 (ON, armazene todos os resultados, exceto consultas SELECT SQL_ NO_CACHE ...) 2 (DEMAND, armazene apenas cconsultas SELECT SQL_CACHE ...) Dentro de uma thread (conex ao), o comportamento da cache de consulta pode ser alterado do padr ao. A sintaxe e a seguinte: QUERY_CACHE_TYPE = OFF | ON | DEMAND QUERY_CACHE_TYPE = 0 | 1 | 2 Op c ao Descri c ao 0 or OFF N ao armazene ou recupere resultados 1 or ON Aramazene todos os resultados exceto consultas SELECT SQL_ NO_CACHE .... 2 or DEMAND Armazene apenas consultas SELECT SQL_CACHE ....
628
| have_query_cache | YES | +------------------+-------+ 1 row in set (0.00 sec) Voc e pode monitorar o desempenho da cache de consultas com SHOW STATUS: Vari avel Descri c ao Qcache_queries_in_ N umero de consultas registrada na cache. cache Qcache_inserts N umero de consultas adicionadas na cache. Qcache_hits N umero de acertos da cache. Qcache_lowmem_prunes N umero de consultas que foram deletadas da cache devido a mem oria baixa. Qcache_not_cached N; umero de consultas n ao armazenadas em cache (n ao armazen aveis, ou devido a QUERY_CACHE_TYPE). Qcache_free_memory Quantidade de mem oria livre para cache de consultas. Qcache_free_blocks N umero de blocos de mem oria livre na cache de consultas Qcache_total_blocks N umero total de blocos na cache de consultas. N umero total de consultas = Qcache_inserts + Qcache_hits + Qcache_not_cached. A cache de consultas utiliza blocos de tamanhos vari aveis, assim Qcache_total_blocks e Qcache_free_blocks podem indicar fragmenta c ao de mem oria da cache de consultas. Depois de um FLUSH QUERY CACHE apenas um u nico (grande) bloco livre permanece. Nota: Toda consulta precisa de um m inimo de 2 blocos (um para o texto da consulta e um ou mais para o resultado da conulta). Tamb em, cada tabela que e usada por uma consulta precisa de um bloco, mas se duas ou mais consultas usam a mesma tabela, apenas um bloco precisa ser alocado. Voc e pode utilizar a vari avel de estado Qcache_lowmem_prunes para ajustar o tamanho da cache de consultas. Ela conta o n umero de consultas que s ao removidas da cache para liberar mem oria para armazenar novas consultas. A cache de consultas utiliza uma estrat egia least recently used (LRU) para decidir quais consultas ser ao removidas da cache.
629
630
631
Valores NULL s ao perimitidos em colunas indexadas. Isto gasta 0-1 bytes/chave. O tamanho m aximo da chave e de 500 bytes por padr ao (pode ser alterado recomopilando). No caso de chaves maiores que 250 bytes, um tamanho de bloco de chave maior que o padr ao de 1024 bytes e usado para esta chave. N umero m aximo de chaves/tabelas e 32 por padr ao. Isto pode ser aumentado para 64 sem ser necess ario recompilar myisamchk. myisamchk marcar a as tabelas como vericadas se algu em execut a-las sem --updatestate. myisamchk --fast s o vericar a aquelas tabelas que n ao tenham esta marca. myisamchk -a armazena estat isticas para partes de chaves(e n ao apenas para toda a chave como no ISAM). Linhas de tamanho din amico ser ao agora muito menos fragmentados quando misturar dele c oes com atualiza c oes e inser c oes. Isto e feito combinando automaticamente blocos deletados adjacentes e extendendo blocos se o pr oximo bloco e deletado. myisampack pode empacotar colunas BLOB e VARCHAR. Voc e pode colocar arquivos de dados e indices em diret orios diferentes para obter maior velocidade (com a op c ao DATA/INDEX DIRECTORY="caminho" para CREATE TABLE). Veja Se c ao 6.5.3 [CREATE TABLE], P agina 597. MyISAM tamb em suporta os seguintes itens, os quais o MySQL estar a apto a utilizar em um futuro pr oximo: Suporte a tipos VARCHAR reais; uma coluna VARCHAR inicia com um tamanho armazenado em 2 bytes. Tabelas com VARCHAR podem ter um registro de tamanho xo ou din amico. VARCHAR e CHAR podem ser maior que 64K. Todos os segmentos de chaves t em a sua pr opria deni c ao de linguagem. Isto habilitar a o MySQL para ter diferentes deni c oes de linguagens por coluna. Um indice computado em hash pode ser usado para UNIQUE. Isto lhe permitir a ter UNIQUE em qualquer combina c ao de colunas na tabela. (Voc e n ao pode procurar em um em um indice computado UNIQUE, de qualquer forma.) Note que os arquivos de indice s ao muito menores com MyISAM que com ISAM. Isto signica que MyISAM usar a normalmente menos recursos do sistema que ISAM, mas precisar a de mais tempo de CPU quando inserir dados em um indice compactado. As seguintes op c oes para mysqld podem ser usadas para alterar o comportamento de tabelas MyISAM. Veja Se c ao 4.6.8.4 [SHOW VARIABLES], P agina 310. Op c ao --myisam-recover=# -O myisam_sort_buffer_size=# --delay-key-write=ALL -O myisam_max_extra_sort_file_ size=# Descri c ao Recupera c ao autom atica de tabelas com falhas. Buer utilizado ao recuperar tabelas. N ao desarrega buers de chaves entre escritas para qualquer tabela MyISAM Usada paa ajudar o MySQL a decidir quando utilzar o m etodo lento, mas seguro, de cria c ao de indices de cache de chaves. Note este par ametro e dado em megabytes antes da vers ao 4.0.3 e em bytes a partir desta vers ao.
632
N ao utilzia o m etodo r apido de ordena c ao de indice para criar indices se o arquivo tempor ario se tornasse maior que o valor dado. Note que este par ametro e dado em megabytes antes da vers ao 4.0.3 e em bytes a partir desta vers ao. -O bulk_insert_buffer_size=# Tamanho da arvore cache utilizado na otimiza c ao de inser c oes em bloco. Note que este e um limite por thread! A recupera c ao autom atica e ativada se voc e iniciar o mysqld com --myisam-recover=#. Veja Se c ao 4.1.1 [Op c oes de linha de comando], P agina 208. Na abertura, e vericado se a tabela est a marcada como quebrada ou se a variavel de contagem de abertura para esta tabela n ao e 0 e voc e a est a executando com --skip-external-locking. Se nenhuma das verica c oes acima forem verdadeiras o seguinte ocorre. -O myisam_max_sort_file_size=# Verica-se se a tabela possui erros. Se encontrarmos um erro, tente fazer um repara c ao r apida (com ordena c ao e sem recriar o arquivo de dados) da tabela. Se o repara c ao falhar devido a um erro no arquivo de dados (por exemplo um erro de chave duplicada), e feita uma nova tentativa, mas desta vez o arquivo de dados e recriado. Se a repara c ao falhar, tente mais uma vez com o antigo m etodo de op c ao de repara c ao (escrever linha a linha sem ordena c ao) o qual deve estar apto a reparar qualquer tipo de erros com pequenas exig encias de disco. Se a recupera c ao n ao estiver apta a recuperar todas as linhas de uma instru c ao completada previamente e voc e n ao especicou FORCE como uma op c ao para myisam-recover, ent ao a repara c ao autom atica abortar a com uma mensagem de erro no arquivo de erros: Error: Couldnt repair table: test.g00pages Caso voc e tenha utilizado a op c ao FORCE, voc e ir a obter um aviso no arquivo de erro: Warning: Found 344 of 354 rows when repairing ./test/g00pages Note que se voc e executar uma recupera c ao autom atica com a op c ao BACKUP, voc e deve ter um script cron que mova automaticamente arquivos com nome como tablename-datetime.BAK do diret orio de banco de dados para uma media de backup. Veja Se c ao 4.1.1 [Op c oes de linha de comando], P agina 208.
633
iniciam com uma string. A Compacta c ao de prexo ajuda se existirem muitas strings com o prexo id entico. Em tabelas MyISAM, voc e tamb em pode utilizar prexos em n umeros comprimidos especicando PACK_KEYS=1 quando voc e cria a tabela. Isto ajuda quando voc e tem muitas chaves inteiras que t em prexo id entico quando o n umero e armazenado com o byte mais alto primeiro.
634
635
Todas as distribui c oes MySQL, mesmo aquelas existentes antes do MySQL se tornar GPL, podem ler tabelas que forma compactadas com myisampack. Tabelas compactadas utilizam muito pouco espa co em disco. Isto minimiza o uso de disco, o que e muito bom quando se utiliza discos lentos (com CD-ROMs). Cada registro e compactado separadamente (pouca sobrecarga de acesso). O cabe calho de um registro e xo (1-3 bytes) dependendo do maior registro na tabela. Cada coluna e compactada diferentemente. Alguns dos tipos de compacta c ao s ao: Existe, geralmente, uma tabela Human diferente para cada coluna. Compacta c ao de espa co de suxos. Compacta c ao de espa co de prexos. N umeros com valor 0 s ao armazenados usando 1 bit. Se os valores em uma coluna inteira tem uma faixa pequena, a coluna e armazenada usando o menor tipo poss ivel. Por exemplo, uma coluna BIGINT (8 bytes) pode ser armazenada como uma coluna TINYINT (1 byte) se todos os valores est ao na faixa de 0 a 255. Se uma coluna tem apenas um pequeno conjunto de valores poss iveis, o tipo de coluna e convertido para ENUM. Uma coluna pode usar uma combina c ao das compacta c oes acima. Pode tratar registros de tamanho xo ou din amico. Pode ser descompactada com myisamchk.
636
Voc e pode vericar se uma tabela est a ok com o comando CHECK TABLE. Veja Se c ao 4.5.4 [CHECK TABLE], P agina 279. Voc e pode repara um tabela corrompida com REPAIR TABLE. Veja Se c ao 4.5.5 [REPAIR TABLE], P agina 280. Voc e tamb em pode repar a-la, quando o mysqld n ao estiver em execu c ao com o comando myisamchk. sintaxe myisamchk. Se a sua tabela estiver muito corrompida voc e deve tentar encontrar o raz ao! Veja Se c ao A.4.1 [Falhas], P agina 921. Neste caso, a coisa mais importante de saber e se a tabela foi corrompida porque o mysqld foi nalizado (pode se vericar isto facilmente vericando se h a uma linha restarted mysqld recente no arquivo de erro do mysql. Se este n ao e o caso, ent ao voc e deve tentar fazer um caso de teste disto. Veja Se c ao D.1.6 [Caso de teste reproduz iveis], P agina 1075.
637
638
Contornam o limite de tamanho de arquivos do sistema operacional. Voc e pode criar um apelido/sin onimo para uma tabela usando MERGE sobre uma tabela. N ao deve haver nenhum impacto not avel na performance ao se fazer isto (apenas algumas chamadas indiretas e chamadas de memcpy() para cada leitura). As desvantagens de tabelas MERGE s ao: Voc e s o pode utilizar tabelas MyISAM id enticas em uma tabela MERGE. REPLACE n ao funciona. Tabelas MERGE usam mais descritores de arquivos. Se voc e estiver usando uma tabela MERGE que mapeia mais de 10 tabelas e 10 usu arios a est ao usando, voc e est a usando 10*10 + 10 descritores de arquivos. (10 arquivos de dados para 10 usu arios e 10 arquivos de indices compartilhados). A leitura de chaves e lenta. Quando voc e faz uma leitura sobre uma chave, o mecanismo de armazenamento MERGE precisar a fazer uma leitura em todas as tabelas para vericar qual casa melhor com a chave dada. Se voc e ent ao zer uma "leia pr oximo", o mecanismo de armazenamento MERGE precisar a procurar os buers de leitura para encontrar a pr oxima chave. Apenas quando um buer de chaves e usado, o mecanismo de armazenamento precisar a ler o pr oximo bloco de chaves. Isto torna as chaves MERGE mais lentas em pesquisas eq_ref, mas n ao em pesquisas ref. Veja Se c ao 5.2.1 [EXPLAIN], P agina 425. Voc e n ao pode fazer DROP TABLE, ALTER TABLE, DELETE FROM nome_tabela sem uma cl ausula WHERE, REPAIR TABLE, TRUNCATE TABLE, OPTIMIZE TABLE, ou ANALYZE TABLE em nenhuma das tabelas que e mapeada por uma tabela MERGE que est a "aberta". Se voc e zer isto, a tabela MERGE pode ainda se referir a tabela original e voc e obter a resultados inexperados. O modo mais f acil de contornar esta deci encia e atrav es do comando FLUSH TABLES, assegurando que nenhuma tabela MERGE permanecer a "aberta". Quando voc e cria uma tabela MERGE voc e deve especicar com UNION=(lista-de-tabelas) quais tabelas voc e quer usar com uma. Opcionalmente voc e pode especicar com INSERT_ METHOD se voc e quer que inser c oes em tabelas MERGE ocorram na primeira ou na u ltima tabela da lista UNION. Se voc e n ao especicar INSERT_METHOD ou especicar NO, enta ao todos os comandos INSERT na tabela MERGE retornar ao um erro. O seguinte exemplo lhe mostra como utilizaqr tabelas MERGE: TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)); TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)); INTO t1 (message) VALUES ("Testing"),("table"),("t1"); INTO t2 (message) VALUES ("Testing"),("table"),("t2"); TABLE total (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST; SELECT * FROM total; Note que n ao criamos uma chave UNIQUE ou PRIMARY KEY na tabela total j a que a chave n ao ser au nica na tabela total. Note que voc e tamb em pode manipular o arquivo .MRG diretamente de fora do servidor MySQL: shell> cd /mysql-data-directory/current-database CREATE CREATE INSERT INSERT CREATE
639
shell> ls -1 t1.MYI t2.MYI > total.MRG shell> mysqladmin flush-tables Agora voc e pode fazer coisas como: mysql> SELECT * FROM total; +---+---------+ | a | message | +---+---------+ | 1 | Testing | | 2 | table | | 3 | t1 | | 1 | Testing | | 2 | table | | 3 | t2 | +---+---------+ Note que a coluna a, declarada como PRIMARY KEY, n ao e unica, j a que tabelas MERGE n ao podem forca a unicidade sobre um conjunto de tabelas MyISAM selecionadas. Para remapear uma tabela MERGE voc e pode fazer o seguinte: Fazer um DROP na tabela e recri a-la Usar ALTER TABLE nome_tabela UNION=(...) Alterar o arquivo .MRG e executar um FLUSH TABLE na tabela MERGE e todas as tabelas selecionadas para for car o mecanismo de armazenamento a ler o novo arquivo de deni c ao.
640
antes de chaves normais para estar apto a detectar chaves duplicadas o mais r apido poss ivel. DROP TABLE em uma tabela que est a em uso por uma tabela MERGE n ao funcionar a no Windows porque o mecanismo de armazenamento MERGE faz o mapeamento da tabela escondido da camada mais alta do MySQL. Como o Windows n ao permite que voc e apague arquivos que estejam abertos, voc e deve primeiro descarregar todas as tabelas MERGE (com FLUSH TABLES) ou apagar a tabela MERGE antes de apagar a tabela. N os consertaremos isto assim que introduzirmos VIEWs.
641
642
SUM_OVER_ALL_KEYS(max_length_of_key + sizeof(char*) * 2) + ALIGN(length_of_row+1, sizeof(char*)) sizeof(char*) e 4 em uma m aquina de 32 bits e 8 em uma m aquina de 64 bits.
643
Se voc e tiver feito o download de uma vers ao bin aria do MySQL que inclui suporte para InnoDB, simplesmente siga as instru c oes do manual do MySQL para instalar um vrs ao bin aria do MySQL. Se voc e j a tem o MySQL-3.23 instalado, ent ao o modo mais simples de instalar MySQL -Max e substituir i execut avel do servidor mysqld com o execut avel correspondente na distribui c ao -Max. MySQL e MySQL -Max diferem apenas no execut avel do servidor. Veja Se c ao 2.2.9 [Instalando uma distribui c ao bin aria], P agina 91. Veja Se c ao 4.8.5 [mysqld-max], P agina 344. Para compilar o MySQL com suoprte a InnoDB, fa ca o download do MySQL-3.23.34a ou posterior de http://www.mysql.com/ e congure o MySQL com a op c ao --with-innodb. Veja o manual MySQL sobre como instalar uma distribui c ao fonte. Veja Se c ao 2.3 [Instalando uma distribui c ao fonte], P agina 94. cd /caminho/para/fonte/mysql-3.23.37 ./configure --with-innodb Para utiliar tabelas InnoDB no MySQL-Max-3.23 voc e deve especicar par ametros de congura c ao na se c ao [mysqld] do arquivo de congura c ao my.cnf, ou no Windows opcionalmente em my.ini. No m inimo, na vers ao 3.23 voc e deve especicar innodb_data_file_path onde voc e especicar o nome e tamanho dos arquivos de dados. Se voc e n ao mencionar innodb_data_home_ dir em my.cnf o padr ao e criar estes arquivoas no diretorio_dados do MySQL. Se voc e especicar innodb_data_home_dir como uma string vazia, ent ao voc e pode dar caminhos absolutos ao seu arquivo de dados em innodb_data_file_path. O modo m inimo de modicar e de adicionar a se ca o [mysqld] a linha innodb_data_file_path=ibdata:30M mas para obter melhor desempenho e melhor que voc e especique as op c oes como recomendado. Veja Se c ao 7.5.3 [Inicializa c ao InnoDB], P agina 643.
644
Se voc e especicar o u ltimo arquivo de dados coma a op c ao autoextend, InnoDB extender a ou ltimo arquivo de dados se ele car sem espa co no tablespace. O aumento e de 8 MB a cada vez. Um exemplo: innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend instrui InnoDB a criar apenas um u nico arquivo de dados com tamanho inicial de 100 MB e que e extendido em blocos de 8 MB quando o espa co acabar. Se o disco car cheio voc e pode querer adicionar outro arquivo de dados a outro disco, por exemplo. Ent ao voc e tem que olhar o tamanho de ibdata1, arredondar o tamanho para baixo at e o m ultiplo de 1024 * 1024 bytes (= 1 MB) mais pr oximo, e especicar o tamanho arredondado de ibdata1 explicitamente em innodb_data_file_path. Depois disto voc e pode adicionar outros arquivos de dados: innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend Tenha cuidado com sistema de arquivos onde o tamanho m aximo do arquivo e 2 GB. O InnoDB n ao est a ciente disto. Neste sistemas de arquivos voc e pode querer especicar o tamanho m aximo para o arquivo de dados: innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend:max:2000M Um exemplo de my.cnf simples. Suponha que voc e tenha um computador com 128 MB RAM e um disco r igido. Abaixo est a o exemplo dos par ametros de congura c ao poss iveis para my.cnf ou my.ini para o InnoDB. N os consideramos que voc e est a executando MySQL-Max-3.23.50 ou posterior, our MySQL-4.0.2 ou posterior. Este exemplo serve para a maioria dos usu arios, tanto em Unix e Windows, que n ao querem distribuir arquivos de dados InnoDB e arquivos de log em v arios discos. Isto cria um arquivo de dados ibdata1 auto-extens ivel e dois arquivos de log ib_logfile0 e ib_logfile1 do InnoDB no datadir do MySQL (normalmente /mysql/data). O arquivo de log ib_arch_log_0000000000 do InnoDB tamb em ca em datadir. [mysqld] # Voc^ e pode escrever outras op c~ oes do servidor MySQL aqui # ... # Arquivos de dados deve estar aptos # a guardar os seus dados e indices. # Esteja certo que voc^ e tem espa co # livre suficiente em disco. innodb_data_file_path = ibdata1:10M:autoextend # Defina o tamanho da area de buffer com # 50 - 80 % da me oria do seu computador set-variable = innodb_buffer_pool_size=70M set-variable = innodb_additional_mem_pool_size=10M # Defina o tamanho do seu arquivo log # para 25 % da tamanho da area de buffer set-variable = innodb_log_file_size=20M set-variable = innodb_log_buffer_size=8M # Defina ..flush_log_at_trx_commit
645
# com 0 se voc^ e puder perder # algumas das ultimas trnsa c~ oes innodb_flush_log_at_trx_commit=1 Check that the MySQL server has the rights to create les in datadir. Note que os arquivo de dados devem ser < 2 GB em alguns sistemas de arquivos! O tamanho combinao do arquivos de log devem ser < 4 GB. O tamanho combinado dos arquivos de dados devem ser >= 10 MB. Quando voc e criar um banco de dados pela primeira vez, e melhor que voc e inicie o servidor MySQL do prompt de comando. Ent ao InnoDB ir a imprimir a informa c ao sobre a cria c ao do banco de dados na tela e voc e poder a ver o que est a acontecendo. Veja abaixo na pr oxima se c ao como a sa ida na tela se parece. Por exemplo, no Windows voc e pode iniciar mysqld-max.exe com: your-path-to-mysqld\mysqld-max --console Onde colocar o my.cnf ou my.ini no Windows? As regras para o Windows s ao o seguinte: Apenas o my.cnf ou my.ini deve ser criado. O arquivo my.cnf deve ser colocado no diret otio raiz do drive C:. O arquivo my.ini deve ser colocado no diret orio WINDIR, e.g, C:\WINDOWS ou C:\WINNT. Voc e pode usar o comando SET do MS-DOS para imprimir o valor de WINDIR. Se o seu PC utiliza um carrgador de boot onde o drive C: n ao e o drive de boot, ent ao a sua u nica op c` ao e usar o arquivo my.ini. Onde especicar as op c oes no Unix? No Unix o mysqld l e op c oes dos seguintes arquivos, se eles existirem, na seguinte ordem: /etc/my.cnf Op c oes globais. COMPILATION_DATADIR/my.cnf Op c oes espec icas do servidor. defaults-extra-file O arquivo especicado com --defaults-extra-file=.... ~/.my.cnf Op c oes espec icas do usu ario COMPILATION_DATADIR e o dirert orio de dados do MySQL o qual foi especicado como uma op c ao do ./configure quando o mysqld foi compilado. (normalmente /usr/local/mysql/data para uma instala c ao bin aria ou /usr/local/var para uma instala c ao fonte). Se voc e n ao estiver certo de onde mysqld l e o seu my.cnf ou my.ini, voc e pode dar o caminho como a primeira op c ao de linha de comando para o servidor: mysqld --defaultsfile=your_path_to_my_cnf. O InnoDB forma o caminho do diret orio a um arquivo de dados concatenando textualmente innodb_data_home_dir a um nome de arquivo de dados ou caminho em innodb_data_ file_path, adicionando uma poss ivel barra ou barra invertida entre eles se for necess ario. Se a palavra-chave innodb_data_home_dir n ao e mencionada em my.cnf, o padr ao para ele e o diret orio ponto ./ que signica o datadir de MySQL. Um exemplo de my.cnf avan cado. Suponha que voc e tenha um computador Linux com 2 GB RAM e tr es disco r igidos de 60 GB (no caminho de diret orios /, /dr2 e /dr3). Abaixo esta um exemplo de par ametros de congura c ao poss iveis no arquivo my.cnf para o InnoDB.
646
Note que o InnoDB n ao cria diret orios: voc e mesmo deve cri a-los. Use o comando mkdir do Unix ou MS-DOS para criar o diret orio base do grupo de dados e de log. [mysqld] # Voc^ e pode escrever outras op c~ oes do servidor MySQL aqui # ... innodb_data_home_dir = # Os arquivos de devem estar aptos a # guardar seus dados e indices innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend # Defina o tamanho da area de buffer para # 50 - 80 % da mem oria do seu computador, # mas esteja certo, no Linux x86, que o # total de mem oria usada e < 2 GB set-variable = innodb_buffer_pool_size=1G set-variable = innodb_additional_mem_pool_size=20M innodb_log_group_home_dir = /dr3/iblogs # .._log_arch_dir deve ser o mesmo # que .._log_group_home_dir innodb_log_arch_dir = /dr3/iblogs set-variable = innodb_log_files_in_group=3 # Defina o tamanho do arquivo de log # para cerca de 15% do tamanho da # area da buffer set-variable = innodb_log_file_size=150M set-variable = innodb_log_buffer_size=8M # Defina ..flush_log_at_trx_commit com # 0 se voc^ e puder permitir a perda de # algumas das ultimas transa c~ oes. innodb_flush_log_at_trx_commit=1 set-variable = innodb_lock_wait_timeout=50 #innodb_flush_method=fdatasync #set-variable = innodb_thread_concurrency=5 Note que n os colocamos os dois arquivos de dados em discos diferentes. O InnoDB preencher a o tablespace de tabela formado pelos arquivos de dados de baixo para cima. Em alguns casos ele aumentar a o desempenho do banco de dados se todos os dados n ao forem colocados no mesmo disco f isico. Colocar os arquivos de log em discos diferentes dos de dados e geralmente, ben eco para o desempenho. Voc e pode usar parti c oes de discos raw (dispositivos raw) como arquivos de dados. Em alguns Unixs eles aumentam a E/S. Vejam a se c ao sobre gerenciamento de espa co de arquivos no InnoDB para saber como especic a-los no my.cnf. Aviso: no Linux x86 voc e deve ter cuidado par n ao denir um uso de mem oria muito alto. glibc permitir a que o area do processo cres ca acima da pilha da thread, o que far a com que o seu servidor falhe. Isto e um risco se o valor de innodb_buffer_pool_size + key_buffer + max_connections * (sort_buffer + read_buffer_size) + max_connections * 2 MB
647
e pr oximo de 2 GB ou exceda 2 GB. Cada thread usar a uma pilha (geralmente 2 MB, mas no bin ario da MySQL AB e somente 256 KB) e no pior caso usar a tmab em sort_buffer + read_buffer_size de mem oria adicional. Como sintonizar outros par ametros do servidor mysqld? Valores comuns que servem para a maioria dos usu arios s ao: skip-locking set-variable set-variable set-variable # # # # # # set-variable = max_connections=200 = read_buffer_size=1M = sort_buffer=1M Defina key_buffer com 5 - 50% de sua RAM dependendo de quanto voc^ e usa tabelas MyISAM, mas mantenha key_buffer + tamanho da area de buffer do InnoDB < 80% de sua RAM = key_buffer=...
Note que alguns par ametros s ao dados usando o formato do par ametro num erico de my.cnf: set-variable = innodb... = 123, outros (par ametros string e booleanos) com outro formato: innodb_... = ... . O signicado dos par ametros de congura c ao s ao os seguintes: Op c ao innodb_data_home_dir Descri c ao A parte comum do caminho do diret orio para todos arquivos de dados InnoDB. Se voc e n ao mencionar esta op c ao em my.cnf, o padr ao e o datadir do MySQL. Voc e pde especic a-lo tamb em como uma string vazia, e neste caso voc e poder a utilizar caminhos de arquivos absolutos em innodb_data_file_path. Caminho para os arquivos de dados individuais e os seus tamanhos. O caminho do diret orio completo para cada arquivo de dados e obtido concatenando innodb data home dir ao caminho especicado aqui. O tamanho do arquivo e especicado em megabytes, adicionando o M depois da especica c ao do tamanho. InnoDB tamb em entende a abrevia c ao G, 1 G signica 1024 MB. A partir da vers ao 3.23.44 voc e pode denir o tamanho do arquivo maior que 4 GB em sistemas operacionais que seuportam que suportam arquivos grandes. Em alguns sistemas operacionais arquivos devem ser menor que 2 GB. Se voc e n ao especicar innodb_data_file_path, o comportamento padr ao a partir do vers ao 4.0 e criar um arquivo de dados ibdata1 de 10 MB auto-extens ivel. A soma do tamanho dos arquivos devem ser menores que 10 MB. N umero de c opias id enticas de grupos de log mantidos para os banco de dados. Atualmente deve ser denido com 1.
innodb_data_file_path
innodb_mirrored_log_groups
648
innodb_log_buffer_size
innodb_flush_log_at_trx_ commit
innodb_log_arch_dir
innodb_log_archive
Caminho do diret orio de arquivos de log do InnoDB. Se voc e n ao mencionar esta op c ao no my.cnf o padr ao eo datadir do MySQL. N umero de arquivos de log no grupo de log. O InnoDB escreve nos arquivos de modo circular. O valor recomendado aqui e 2. O valor padr ao e 2. Tamanho de cada arquivo de log em um grupo de logs em megabytes. Faixa de valores sens iveis de 1M a 1/n-th do tamanho do area de buer especicado abaixo, onde n e o n umero de arquivos de log no grupo. Quanto maior eo valor, menos atividade de descarga e necess aria na area de buer, economizando E/S de disco. Mas arquivos de log maiores tamb em signica que a recupera c ao ser a lenta no caso de falhas. O tamanho combinado do arquivo de log deve ser menor que 4GB em comutadores de 32 bits. O padr ao e 5M. O tamanho do buer que o InnoDB utiliza para escrever o log em aruivos no disco. Faixa de valores sens iveis de 1M a 8M. Um buer de log grande permite aumentar transa c oes para executarem sem precisar de escrever o log em at e se fazer um commit da transa c ao. iAlem disso, se voc e tiver grande transa c oes, fazer um buer de log maior economiza E/S de disco. Normalmente e atribuido 1, signicando que em um commit de uma transa c ao o log e descarregado para o disco e as modica c oes feitas pela transa c ao se tornam permanentes, sobrevivendo a uma falha no banco de dados. Se voc e estiver disposto a comprometer esta segran ca e est a executando transa c oes pequenas, voc e pode den i-lo com 0 ou 2 para reduzir E/S de discos nos logs. O valor 0 signica que o log s o e escrito no arquivo e este e descarregado pro disco aproximadamente uma vez por segundo. O valor 2 signica que o log e escrito no arquivo a cada commit, mas o arquivo de log s o e descarregado em disco aproximadamente uam vez por segundo. O valor padr ao e 1 a partir do MySQL-4.0.13; antes era 0. O diret orio onde arquivos de log totalmente escritos seriam escritos se usarmos arquivamento de log. Atualmente o valor deste par ametro deve ser denido igual a innodb_log_group_home_dir. Atualmente este valor deve ser denido com 0. Como a recupera c ao ai partir de um backup deve ser feito pelo MySQL usando os seus pr oprios arquivos de log, n ao h a nenhuma necessidade de se arquivos os arquivos de log do InnoDB.
649
innodb_buffer_pool_size
innodb_buffer_pool_awe_ mem_mb
innodb_additional_mem_ pool_size
innodb_file_io_threads innodb_lock_wait_timeout
innodb_flush_method
O tamanho do buer de mem oria que o InnoDB usa para armazenar dados e indices de suas tabelas. Quanto maior for este valor, menor ser a a necessidade de E/S de disco para acessar dados na tabela. Em um servidor de banco de dados dedicado voc e pode denir este par ametro at e 80% do tamanho da mem oria f isica da m aquina. N ao atribua um valor muito alto, pois a competi c ao da mem oria f isica pode causar pagina c ao no sistema operacional. Tamanho da area de buer em Mb, se estiver localizado na mem oria AWE do Windows 32 bits. Deipon ivel a partir da vers ao 4.1.0 e relevante apenas no Windows 32 bits. Se o seu Windows suporta mais 4GB de mem oria, chamado Address Windowing Extensions, voc e pode alolcar a area de buer do InnoDB em uma mem oria f isica AWE usando este par ametro. O maior valor possivel para isto e 64000. Se este par ametro for especicado, ent ao innodb buer pool size e a janela no espa co de endere co de 32 bits do mysqld onde o InnoDB mapeia aquela mem oria AWE. Um bom valor para innodb buer pool size e 500M. Tamanho do pool da mem oria que o InnoDB utiliza para armazenar informa c oes de dicion ario de dados e outras estruturas de dados internas. Um bom valor aqui pode ser 2M, mas quanto mais tabelas voc e tiver em sua aplica c ao, mais voc e precisar a alocar aqui. Se o InnoDB car sem mem oria neste pool, ele l come cara a alocar mem oria do sistema operacional e a escrever mensagens de aviso no log de erro do MySQL. N umero de threads de E/S de arquivos no InnoDB. Normalmente ele deve ser 4, mas no Windows E/S de disco pode se beneciar de um n umero maior. Tempo limite em segundos que uma transa c ao InnoDB pode esperar por uma trava antes de fazer um roll back. InnodDB detecta automaticamente deadlocks de transa c oes em sua pr opria tabela bloqueada e faz um roll back da transa c ao. Se voc e utiliza o comando LOCK TABLES, ou outro mecanismo de armazenamento seguro com transa c oes diferente do InnoDB na mesma transa c ao, ent ao um deadlock pode crescer, o que n ao seria noticado pelo InnoDB. Nestes casos o tempo limite eu til para resolver a situa c ao. (Dispon ivel a partir da vers ao 3.23.40.) O valor padr ao para este par ametro e fdatasync. Outra op c ao e O_ DSYNC.
650
innodb_force_recovery
Aviso: esta op c ao s o deve ser denida em uma situa c ao de emerg encia quando voc e quiser um dump de suas tabelas em um banco de dados corropido! Os valores poss iveis s ao de 1 - 6. Veja abaixo na se c ao For cando a recupera c ao sobre o signicado dos valores. Como uma medida segura o InnoDB previne que um usu ario modique os dados quando esta op c ao e > 0. Esta op c ao est a dispon ivel a partir da vers ao 3.23.44.
651
InnoDB: Shutdown completed Agora voc e pode ver os diret orios de arquivos de dados e logs e voc e ver a os arquivos criados. O diret orio de log tamb em ir a conter um pequeno arquivo chamado ib_arch_log_0000000000. Este arquivo foi resultado da cria c ao do banco de dados, depois do InnoDB desligar o arquivamento de log. Quando o MySQL for iniciado novamente, a sa ida ser a a seguinte: ~/mysqlm/sql > mysqld InnoDB: Started mysqld: ready for connections
652
SHOW TABLE STATUS FROM test LIKE CUSTOMER Note que a estat isticas SHOW dada sobre tabelas InnoDB s ao apenas aproximadas: elas n ao s ao usadas na otimiza c ao SQL. Tamanho reservado de tabelas e indices em bytes est ao acurado.
653
Ambas as tabelas devem ser do tipo InnoDB, na tabela deve existir um indice onde as colunas de chaves estrangeiras listadas como as PRIMEIRAS colunas e na tabela indicada deve haver um indice onde as colunas indicadas s ao listadas como as PRIMEIRAS colunas e na mesma ordem. O InnoDB n ao cria indices automaticamente em chaves estrangeiras para chaves refer enciadas: voc e tem que cri a-las explicitamente. Os indices s ao necess arios para verica c ao de chaves estrangeiras para ser r apido e n ao exigir a varredura da tabela. Colunas correspondentes nas chaves estrangeiras e a chave referenciada devem ter tipos de dados internos parecidos dentro do InnoDB para que possam ser comparados sem uma convers ao de tipo. O tamanho e a sinaliza c ao de tipos inteiros devem ser o mesmo. O tamanho do tipos string n ao precisam ser o mesmo. Se voc e especicar uma a c ao SET NULL, esteja certo de que voc e n ao declarou as colunas na tabela lha como NOT NULL. Se o MySQL retornar o erro de n umero 1005 de uma instru c ao CREATE TABLE, e a string de mensagem de erro se referir ao errno 150, ent ao a cria c ao da tabela falhou porque um restri c ao de chaves estrangeiras n ao foi formada corretamente. Similarmente, se uma ALTER TABLE falhar e se referir ao errno 150, sgnica que um deni c ao de chave estrangeira foi formada incorretamente na tabela alterada. A partir da vers ao 4.0.13, voc e pode usar SHOW INNODB STATUS para ver uma explica c ao detalhada do ultimo erro de chave estrangeira do InnoDB no servidor. A partir de vers ao 3.23.50, InnoDB n ao verica restri c oes de chaves estrangeiras naqueles valores de chaves estrangeiras ou chaves refer enciadas que contenham uma coluna NULL. Um desvio do padr ao SQL: se na tabela pai existirem diversos registros t em o mesmo valor de chave refer encia, ent ao o InnoDB atua na verica c ao da chave estrangeira como o outro registro pai como se o mesmo valor de chave n ao existisse. Por exemplo, se voc e tiver denido uma restri c ao de tipo RESTRICT, e existir um registro lho com diversos registros pais, o InnoDB n ao permite a dele c ao de qualquer um dos registros pais. A partir da vers ao 3.23.50, voc e tamb em pode associar a cl ausula ON DELETE CASCADE ou ON DELETE SET NULL com a restri c ao de chave estrangeira. Op c oes correspondentes do ON UPDATE est ao dispon iveis a partir da vers ao 4.0.8. Se ON DELETE CASCADE for especicado, e um registro na tabela pai for deletado, ent ao o InnoDB automaticamente tamb em deleta todos aqueles registros na tabela lha cujos valores de chaves estrangeiras s ao iguais ao valor da chave refer enciada no registro pai Se ON DELETE SET NULL for especicado, os registros lhos s ao automaticamente atualizados e assim as colunas na chave estrangeira s ao denidas com o valor NULL do SQL. Um desvio dos padr oes SQL: se ON UPDATE CASCADE ou ON UPDATE SET NULL retornam para atualizar a MESMA TABELA que ja tenha sido atualizada durante o processo cascata, ele atua como RESTRICT. Isto e para prevenirloops innitos resultantes de atualiza c oes em cascata. Um ON DELETE SET NULL auto refer encial, por outro lado, funciona desde a vers ao 4.0.13. ON DELETE CASCADE auto refer encial j a est a funcionando. Um exemplo: CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB; CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE SET NULL ) TYPE=INNODB; Um exemplo complexo:
654
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, price DECIMAL, PRIMARY KEY(category, id)) TYPE=INNODB; CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB; CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, PRIMARY KEY(no), INDEX (product_category, product_id), FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX (customer_id), FOREIGN KEY (customer_id) REFERENCES customer(id)) TYPE=INNODB; A partir da vers ao 3.23.50 o InnoDB lhe permite adicionar novas restri co oes de chaves estrangeiras a uma tabela. ALTER TABLE seunomedetabela ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES anothertablename(...) [on_delete_and_on_update_actions] Lembre-se de criar os indices necess arios primeiro. A partir da vers ao 4.0.13, o InnoDB suporta ALTER TABLE suatabela DROP FOREIGN KEY id_chave_estrangeira_gerada_internamente Voc e tem que usar SHOW CREATE TABLE para daterminar as ids de chaves estrangeiras geradas internamente quando voc e apaga uma chave estrangeira. Na vers ao anterior a 3.23.50 do InnoDB, ALTER TABLE ou CREATE INDEX n ao devem ser usadas em conex oes com tabelas que t em restri co es de chaves estrangeiras ou que s ao refer enciadas em restri c oes de chaves estrangeiras: Qualquer ALTER TABLE remove todas as restri c oes de chaves estrangeiras denidas na tabela. Voc e n ao deve utilizar ALTER TABLE para tabela referenciadas tamb em, mas utilizar DROP TABLE e CREATE TABLE para modifcar o esquema. Quando o MySQL faz um ALTER TABLE ele pode usar internamente RENAME TABLE, e isto ir a confundir a restri c ao de chave estrangeira que se refere a tabela. Uma instru c ao CREATE INDEX e processada no MySQL como um ALTER TABLE, e estas restri c oes tamb em se aplicam a ele. Ao fazer a verica c ao de chaves estrangeiras, o InnoDB dene o bloqueio a nivel de linhas compartilhadas em registros lhos e pais que ele precisa vericar. O InnoDB verica a restri c ao de chaves estrangeiras imediatamente: a verica c ao n ao e aplicada no commit da transa cao. Se voc e quiser ignorar as restri c oes de chaves estrangeiras durante, por exemplo um opera c ao LOAD DATA, voc e pode fazer SET FOREIGN_KEY_CHECKS=0. O InnoDB lhe permite apagar qualquer tabela mesmo que ela quebre a restri c ao de chaves estrangeira que referencia a tabela. Ao apagar um tabela restri c ao que e denida na instru c ao create tamb em e apagada.
655
Se voc e recriar uma tabela que foi apagada, ela deve ter uma deni c ao de acordo com a restri c ao de chaves estrangeiras que faz refer encia a ela. Ela deve ter os nomes e tipos de colunas corretor e deve ter os indices na chave referenciada como indicado acima. Se esta condi c ao n ao for satisfeita, o MySQL retornar a o erro de n umero 1005 e se refere ao errno 150 na string de mensagem de erro. A partir da vers ao 3.23.50 o InnoDB retorna da deni c ao de chave estrangeira de uma tabela quando voc e chama SHOW CREATE TABLE seunometabela Assim o mysqldump tamb em produz as dini c oes de tabelas corretas no arquivo dump e n ao se esquece das chaves estrangeiras. Voc e tamb em pode listar as restri c oes de chaves estrangeiras de uma tabela T com SHOW TABLE STATUS FROM seubancodedados LIKE T As restri c oes de chaves estrangeiras s ao listadas no coment ario da tabela impresso na sa ida.
656
Se voc e puder desativar o servidor MySQL, ent ao, para fazer um backup de binario do seu banco de dados voc e deve fazer o seguinte: Finalize o seu banco de dados MySQL e certique-se de que ele nalizou sem erros. Copie todos os seus arquivos de dados em um local seguro. Copie todos os seus arquivos de log do InnoDB em um local seguro. Copie o(s) seu(s) arquivo(s) de congura c ao my.cnf em um local seguro. Copie todos os arquivos .frm da suas tabelas InnoDB em um local seguro. Al em de fazer um backup de bin ario descrito acima, voc e tamb em deve fazer um dump da sua tabela com mysqldump. A raz ao para se fazer isto e que um arquivo bin ario pode ser corrompido cem voc e perceber. Dumps de tabelas s ao armazenados em um arquivo texto leg ivel e muito mais simples que arquivos bin arios de banco de dados. Ver tabelas corropidas atrav es de arquivos de dump e mais f acil e, como o seu formato e simples, a chance dos dados se corromperem seriamente s ao bem menores. Uma boa id eia e fazer dumps ao mesmo tempo que voc e faz o backup de bin ario do seu banco de dados. Voc e tem que fechar todos os bancos de dados nos clientes para ter uma c opia consistente de todas as suas tabelas em seu dump. Ent ao voc e pode fazer o backup de bin ario e voc e ter a uma c opia consistente de seu banco de dados em dois formatos. Para se poder recuperar o seu banco de dados InnoDB atrav es do backup de bin ario descrito acima, voc e tem que executar o seu banco de dados MySQL com o sistema de log geral e o arquivamento de log do MySQL ligado. Com sistema de log geral n os queremos dizer o mecanismo de log do servidor MySQL que e independente dos logs do InnoDB. Para recupera c ao de falhas do seu processo do servidor MySQL, a u nica coisa que voc e deve fazer e reinici a-lo. InnoDB vericar a automaticamente os logs e realizar a um roll-forward do banco de dados para o situa c ao atual. O InnoDB far a automaticamente um roll back de transa c oes sem commit existentes no momento da falha. Durante a recupera c ao, InnoDB ir a imprimir algo como o seguinte: ~/mysqlm/sql > mysqld InnoDB: Database was not shut down normally. InnoDB: Starting recovery from log files... InnoDB: Starting log scan based on checkpoint at InnoDB: log sequence number 0 13674004 InnoDB: Doing recovery: scanned up to log sequence number InnoDB: Doing recovery: scanned up to log sequence number InnoDB: Doing recovery: scanned up to log sequence number InnoDB: Doing recovery: scanned up to log sequence number ... InnoDB: Doing recovery: scanned up to log sequence number InnoDB: Doing recovery: scanned up to log sequence number InnoDB: Doing recovery: scanned up to log sequence number InnoDB: 1 uncommitted transaction(s) which must be rolled InnoDB: Starting rollback of uncommitted transactions InnoDB: Rolling back trx no 16745 InnoDB: Rolling back of trx no 16745 completed InnoDB: Rollback of uncommitted transactions completed
0 0 0 0
657
Starting an apply batch of log records to the database... Apply batch completed Started ready for connections
Se o seu banco de dados for corrompido ou o seu disco falhar, voc e ter a que fazer recupera c oes de um backup. no caso de dados corropidos, voc e deve primeiro encontrar um backup que n ao est a corrompido. A partir de um backup, fa ca a recupera c ao a partir do arquivo de logs gerais do MySQL de acordo com a instru c ao no manual do MySQL.
658
4 (SRV FORCE NO IBUF MERGE) tamb em previne opera c oes merge no buer de inser c oes: se eles causassem falhar, melhor n ao faz e-los; n ao calcula as estat isticas da tabelas; 5 (SRV FORCE NO UNDO LOG SCAN) n ao procura por undo logs quando iniciar o banco de dados: InnoDB tratar a mesmo transa c oes incompletas como comitadas; ao fa ca o roll-forward no log em em conex ao com 6 (SRV FORCE NO LOG REDO) n recupera c ao.
659
um banco de dados InnoDB simplesmente copiando todos os arquivos relevantes, os quais n os j a listamos na se c ao anterior sobre backup do banco de dados. Se o formato de ponto utuante nas m aquinas s ao diferentes mas voc e n ao utiliza tipos de dados FLOAT ou DOUBLE em suas tabelas ent ao o procedimento e o mesmo; apenas copie os arquivos relevantes. Se os formatos s ao diferentes e suas tabelas contenham dados de ponto utuante, voc e tem que utilizar mysqldump e mysqlimport para mover estas tabelas. Uma dica de desempenho e desligar o modo auto-commit quando voc e importa dados em seu banco de dados, assumindo que o seu tablespace tem espa co suciente para o grande segmento de roolback que a transa c ao de importa c ao ira gerar. S o fa ca o commit depois de importar toda a tabela ou um segmento de uma tabela.
660
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE} Note que n ao h a hifens no nome dos n iveis na sintaxe SQL. O comportamento padr ao e denir o n ivel de isolamento para a pr oxima transa c ao (n ao iniciada). Se voc e especicar a palavra chave GLOBAL na instru c ao acima, ela determinar ao n ivel de isolamento globalmente para todas as novas conex oes criadas a partir deste ponto (mas n ao conex ao exitentes). Voc e precisa do privil egio SUPER para fazer isto. Usar a palavra chave SESSION dine a transa c ao padr ao para todas as transa c oes realizadas futuramente na conex ao atual. Qualquer cliente e livre para alterar o nivel de isolamento da sess ao (mesmo no meio de uma transa c ao), ou o n ivel de isolamento para a pr oxima transa c ao. Voc e pode consultar o n ivel de isolamento da transa c ao global ou da sess ao com: SELECT @@global.tx_isolation; SELECT @@tx_isolation; Nos travamentos de registro, InnoDB usa o chamado bloqueio de chave seguinte (next-key locking). Isto signica que al em dos registros de indices, o InnoDB tamb em pode bloquear a lacuna antes de um registro de indice para bloquear inser c oes por outros usu arios imediatamente antes do registro de indice. Um bloqueio de chave seguinte signica um bloqueio que trava um registro de indice e a lacuna antes dele. O bloqueio de lacuna signica um bloqueio que s o trava a lacuna antes do registro de indice. Uma descri c ao detalhada de cada nivel de isolamento em InnoDB: READ UNCOMMITTED Tamb em e chamada dirty read: SELECTs sem bloqueio s ao realizados de forma a n ao procurar por uma poss ivel vers ao mais nova de um registro; assim as leituras n ao s ao consistentes sob este n ivel de isolamento; de outra forma este nivel funciona como READ COMMITTED. READ COMMITTED N ivel de isolamento parecido com o Oracle. Todas as instru c oes SELECT ... FOR UPDATE e SELECT ... LOCK IN SHARE MODE s o travam o registro de indice, n~ ao a lacuna antes dele e assim permite livre inser c ao de novos registros pr oximo ao registro travado. Mas ainda no tipo de faixa UPDATE e DELETE, o InnoDB deve denir lock da chave seguinte ou da lacuna e bloquear inser c oes feitas por outros usu arios nas lacunas cobertas pela faixa. Ist o e necess ario j a que deve se bloquear linhas fantasmas para a replica c ao e recupera c ao no MySQL funcionar. Leituras consistentes (Consistent reads) comportam como no Oracle: cada leitura consistente, mesmo dentro da mesma transa c ao, congura e l e a sua pr opria c opia recente. REPEATABLE READ Este e o nivel de isolamento padr ao do InnoDB. SELECT ... FOR UPDATE, SELECT ... LOCK IN SHARE MODE, UPDATE, e DELETE que utilizam um indice u nico com uma condi c ao de busca u nica, travam apenas o registro de indice encontrado, e n ao a lacuna antes dele. De outra forma estas opera c oes empregam travamento de registro seguinte, bloqueando a faixa de indice varrida com trava de chave seguinte ou de lacuna e bloqueando novas inser c oes feitas por outros usu arios. Em leituras consistentes (consistent reads) existe uma diferen ca importante do n ivel de isolmento anterior: neste nivel todas as leituras consistentes dentro da mesma transa c ao l eem o mesma c opia estabelacido pela primeira leitura. Esta convers ao signica que se voc e executa diversas SELECTs dentro da mesma transa c ao, elas tamb em s ao consistentes entre elas.
661
SERIALIZABLE Este n ivel e como o anterior, mas todos os SELECTs s ao convertidos implicitamente para SELECT ... LOCK IN SHARE MODE.
7.5.9.3 Lock de Leitura SELECT ... FOR UPDATE e SELECT ... LOCK IN SHARE MODE
Uma leitura consistente n ao e conveniente em alguma circunst ancias. Suponha que voc e queira adicionar uma nova linha em sua tabela CHILD, e est a certo que ela j a possui um pai na tabela PARENT. Suponha que voc e utilize leitura consistente para ler a tabela PARENT e certamente veja o pai do lho na tabela. Agora voc e pode adiciona com seguran ca o registro lho na tabela CHILD? N ao, porque pode ter acontecido de outro usu ario ter deletado o registro pai da tabela PARENT, e voc e n ao estar ciente disto. A solu c ao e realizar o SELECT em um modo de travamento, LOCK IN SHARE MODE. SELECT * FROM PARENT WHERE NAME = Jones LOCK IN SHARE MODE; Realizar uma leitura em modo compartilhado signica que lemos o dado dispon ivel por u ltimo e conguramos travas de leitura nos registros lidos. Se o este dado pertencer a uma transa c ao de outro usu ario que ainda n ao fez commit, esperaremos at e que o commit seja realizado. Uma trava em modo compartilhado previne que ocorra atualiza c oes ou dele c oes de registros j a lidos. Depois de vermos que a consulta acima retornou o pai Jones, podemos com seguran ca adicionar o seu lho a tabela CHILD, e realizar o commit de nossa transa c ao. Este exemplo mostra como implementar integridade refer encial no c odigo de sua aplica c ao. Deixe-nos mostrar outro exemplo: temos um compo de contador inteiro em uma tabela CHILD_CODES que usamos para atribuir um identicador u nico para cada lho que adicionamos na tabela CHILD. Obviamente, usar uma leitura consistente ou uma leitura em modo compartilhado para ler o valor atual do contador n ao e uma boa id eia, j a que dois
662
usu arios do banco de dados podem ver o mesmo valor para o contador e, assim, ter iamos um erro de chave duplicada ao adicionarmos os dois lhos com o mesmo identicador para a tabela. Neste caso existem dois bons modos de se implementar a leitura e o incremento do contador: (1) atualizar o contador primeiro aumentando-o de 1 e s o depois disto l e-lo, ou (2) ler o contador primeiro com um modo de bloqueio FOR UPDATE, e increment a-lo depois disto: SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE; UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1; Um SELECT ... FOR UPDATE ir a ler o dado dispon ivel por u ltimo atribuindo travas exclusivas a cada linha que ele ler. Assim ele atribui uma mesma trava que um UPDATE SQL pesquisado atribuiria nos registros.
663
664
determinado pelo n umero de linhas que foram inseridas, atualizadas ou deletadas. Antes da vers ao 4.0.5, InnoDB sempre fazia roll back da transa c ao cujo pedido de bloqueio fosse o u ltimo a criar o deadlock, isto e, um ciclo no grafo de espera da transa c ao. O InnoDB n ao pode detectar deadlocks onde uma trava atribuida por uma instru c ao MySQL LOCK TABLES est a envolvida ou se uma trava denida em outro mecanismo de banco de dados diferente de InnoDB est a envolvida. Voc e tem que resolver estas situa c oes usando innodb_lock_wait_timeout congurado em my.cnf. Quando o InnoDB realiza um rollback completo de uma transa c ao, todos as travas da transa c ao s ao liberadas. No entanto, se e feito o rollback de apenas uma u nica instru c ao SQL como um resultado de um erro, algumas das travass denidas pela instru c ao podem ser preservadas. Isto ocorre porque o InnoDB armazena as travas de registro em um formato onde ele n ao pode saber qual trava foi denida por qual instru c ao SQL.
665
Assima o usu ario A v e a linha inserida por B apenas quando B zer um commit da inser c ao e A tiver feito um commit de sua pr opria transa c ao pois assim o ponto no tempo e avan cado para depois do commit de B. Se voc e deseja ver o estado mais atual do banco de dados, voc e deve utilizar uma trava de leitura: SELECT * FROM t LOCK IN SHARE MODE;
O InnoDB utiliza bloqueio autom atico de registro. Voc e pode obter deadlocks mesmo no caso de transa c oes que inserem ou deletam uma u nica linha. Isto ococrre porque estas opera c oes n ao s ao realmente at omicas: elas automaticamente atribuem travas aos (possivelmente muitos) registros se indices da linha inserida/deletada. Voc e pode lidar com deadlocks e reduz i-lo com os seguintes truques: Use SHOW INNODB STATUS em vers oes do MySQL posteriores a 3.23.52 e 4.0.3 para determinar a causa do u ltimo deadlock. Isto pode lhe ajudar a sintonizar a sua aplica c ao a avitar travas. Sempre estar preparado para reexecutar uma transa c ao se ela falhar em um deadlock. perigosos. Apenas tente de novo. Deadlocks n ao sAo Commit sua transa c oes com frequ encia. Transa c oes pequenas t em menos chaces de colidir. Se voc e estiver utilizando as travas de leitura SELECT ... FOR UPDATE ou ... LOCK IN SHARE MODE, tente usar um n ivel de isolamente mais baixo READ COMMITTED. Accesse as suas tabelas e linha em uma ordem xa. Assim as transa c oes formar ao las ordenadas e n ao entrar ao em deadlock. Adicione indices bem escolhidos a sua tabela. Ent ao a suas consultas precisar ao varrer menos registros de indice e consequentemente atribuir ao menos locks. Use EXPLAIN SELECT para fazer o MySQL selecione indices apropriados a sua consulta. Use menos locks: se voc e pode utilizar um SELECT para retornar dados de uma copia de banco de dados antiga, n ao adicione a cl ausula FOR UPDATE ou LOCK IN SHARE MODE. Usar o n ivel de isolamento READ COMMITTED e bom aqui, pois cada leitura consistente dentro da mesma transa c ao l e da sua pr opria c opia atual. Se nada ajudar, serialize suas transa c oes com bloqueio de tabela: LOCK TABLES t1 WRITE, t2 READ, ... ; [faz algo com tabelas t1 e t2 aqui]; UNLOCK TABLES. Bloqueio de tabela faz com que suas transa c oes se enlerem em ordem e deadlocks ser ao evitados. Note que LOCK TABLES inicia implictamente uma transa c ao, assim como o comando BEGIN, e UNLOCK TABLES naliza implicitamente uma transa c ao em um COMMIT.
666
Outra solu c ao para colocar transa c oes em s erie e criar uma tabela sem aforo auxiliar onde exista apenas uma u nica linha. Cada transa c ao atualiza esta linha antes de acessar outra tabela. Deste modo todas as transa c oes acontecem em s erie. Note que o algoritmo de detec c ao autom atico de deadlock do InnoDB tamb em funciona pois a trava de s erie e uma trava de registro. Na trava de tabela do MySQL n os temos que recorrer ao m etodo do tempo limite para resolver um deadlock.
667
8. Tome ci encia dos grandes rollbacks de inser c oes em massa: o InnoDB utiliza o buer de inser c ao para economizar E/S de disco em inser c oes, mas em um rollback correspondente tal mecanismo n ao e usado. Um rollback no limite de disco pode demorar cerca de 30 vezes mais que a insser c ao correspondente. Matar o processa de banco de dados n ao ir a ajudar pois o rollback ir a reiniciar ao se entrar no banco de dados. O u nico modo de se livrar de um rollback deste tipo e aumentar a area de buer de forma que o rollback dependa do limite de CPU e seja executado r apidamente ou deltar todo o banco de dados InnoDB. 9. Tome ci encia tamb em de outras grandeas opera c oes com limite de disco. Use DROP TABLE ou TRUNCATE (a partiir do MySQL-4.0) para esvaziar uma tabela, n ao DELETE FROM suatabela. 10. Utilize INSERT multi-line para reduzir a sobrecarga de comunica c ao entre o cliente e o servidro se voc e precisar inserir muitas linhas: INSERT INTO suatabela VALUES (1, 2), (5, 5); Esta dica e v alida para inser c oes em qualquer tipo de tabela, n ao apenas no InnoDB.
668
DROP TABLE innodb_monitor; A sintaxe CREATE TABLE e s o um modo de passar um comando ao mecanismo InnoDB atrav es do analisador SQL do MySQL: a tabela criada n ao e relevante para o Monitor InnoDB. Se voc e fechar o banco de dados quando o manitor estiver em execu c ao, e voc e quiser iniciar o monitor novamente, voc e deve apagar a tabela antes de executar um novo CREATE TABLE para iniciar o monitor. A sinstaxe pode alterar em distribui c ao futuras. Uma sa ida padr ao do Monitor InnoDB: ================================ 010809 18:45:06 INNODB MONITOR OUTPUT ================================ -------------------------LOCKS HELD BY TRANSACTIONS -------------------------LOCK INFO: Number of locks in the record hash table 1294 LOCKS FOR TRANSACTION ID 0 579342744 TABLE LOCK table test/mytable trx id 0 582333343 lock_mode IX RECORD LOCKS space id 0 page no 12758 n bits 104 table test/mytable index PRIMARY trx id 0 582333343 lock_mode X Record lock, heap no 2 PHYSICAL RECORD: n_fields 74; 1-byte offs FALSE; info bits 0 0: len 4; hex 0001a801; asc ;; 1: len 6; hex 000022b5b39f; asc ";; 2: len 7; hex 000002001e03ec; asc ;; 3: len 4; hex 00000001; ... ----------------------------------------------CURRENT SEMAPHORES RESERVED AND SEMAPHORE WAITS ----------------------------------------------SYNC INFO: Sorry, cannot give mutex list info in non-debug version! Sorry, cannot give rw-lock list info in non-debug version! ----------------------------------------------------SYNC ARRAY INFO: reservation count 6041054, signal count 2913432 4a239430 waited for by thread 49627477 op. S-LOCK file NOT KNOWN line 0 Mut ex 0 sp 5530989 r 62038708 sys 2155035; rws 0 8257574 8025336; rwx 0 1121090 1848344 ----------------------------------------------------CURRENT PENDING FILE I/OS -------------------------Pending normal aio reads: Reserved slot, messages 40157658 4a4a40b8 Reserved slot, messages 40157658 4a477e28 ... Reserved slot, messages 40157658 4a4424a8 Reserved slot, messages 40157658 4a39ea38 Total of 36 reserved aio slots
669
Pending aio writes: Total of 0 reserved aio slots Pending insert buffer aio reads: Total of 0 reserved aio slots Pending log writes or reads: Reserved slot, messages 40158c98 40157f98 Total of 1 reserved aio slots Pending synchronous reads or writes: Total of 0 reserved aio slots ----------BUFFER POOL ----------LRU list length 8034 Free list length 0 Flush list length 999 Buffer pool size in pages 8192 Pending reads 39 Pending writes: LRU 0, flush list 0, single page 0 Pages read 31383918, created 51310, written 2985115 ---------------------------END OF INNODB MONITOR OUTPUT ============================ 010809 18:45:22 InnoDB starts purge 010809 18:45:22 InnoDB purged 0 pages Algumas notas sobre a sa ida: Se a se c ao LOCKS HELD BY TRANSACTIONS relatar espera de bloqueios, ent ao a sua aplica c ao pode ter diputa de travas. A saida tamb em ajuda a rastrear as raz oes de deadlocks nas transa c oes. A se c ao SYNC INFO ir a relatar sem aforos reservados se voc e compilar o InnoDB com UNIV_SYNC_DEBUG denido em univ.i. A se c ao SYNC ARRAY INFO relatas as threads que esperam por sem aforos e estat isticas sobre quantas vezes a thread precisou esperar por um mutex ou por um sem aforo de trava de leitura/escrita. Um n umero grande de espera da thread pelo sem aforo pode ser um resultado de E/S de disco ou problemas de disputa dentro do InnoDB. As disoutas pode ser devido a paralelismo pesado de consultas ou problemas na programa c ao das threads no sistema operacional. A se c ao CURRENT PENDING FILE I/OS lista os pedidos de E/S de arquivos que est ao pendente. Um n umero grande indica que a carga de trabalho esta no limite de disco. A se c ao BUFFER POOL lhe d a estat iticas sobre leitura e escrita das p aginas. Voc e pode calcular a partir destes n umeros quanto de E/S em arquivos de dados a sua consulta esta fazendo atualmente.
670
671
os arquivos .frm e porque DROP DATABASE n ao funcionava em tabelas do tipo InnoDB em do MySQL anteriores a 3.23.43. versOes Toda tabela InnoDB tem um indice especial chamado de indice agrupado onde os dados dos registros s ao armazenados. Se voc e denir um chave primaria (PRIMARY KEY) na sua tabela, ent ao o indice da chave prim aria ser a o indice agrupado. Se voc e n ao denir uma chave prim aria para a sua tabela, o InnoDB ir a gerar internamente um indice agrupado qonde as linhas s ao ordenadas pela ID da linha que o InnoDB atribui as linhas nestas tabelas. O ID da linha e um campo de 6 bytes que cresce quando novas linhas s ao inseridas. Assim as linhas armazenadas pela sua ID estar ao sicamente na ordem de inser c ao. Acessar uma linha pelo indice agrupado e r apido porque os dados do registro estar ao na mesma p agina que a busca de indice nos indicar. Em muitos bancos de dados, os dados s ao armazenados em p agina diferente daquela em que se encontra os registros de indices, Se uma tabela e grande, a arquitetura do indice agrupado geralmente economiza E/S de disco se coparado a solu c ao tradicional. O registro em indices n ao agrupados (tamb em os chamamos de indices secund arios) em InnoDB cont em o valor da chave prim aria para a linha. O InnoDB usa este valor de chave prim aria para buscar o registro do indice agrupado. Note que se a chave prim aria for grande, os indices secund arios ir ao utilizar ainda mais espa co.
672
de inser c ao especial. O buer de inser c ao e mantido t ao pequeno que ele cabe totalmente na area de buer e inser c oes nele podem ser feitas muito r apido. O buer de inser c ao e unido periodicamente ` a arvore de indices secund arios no banco de dados. Geralmente n os podemos juntar diversas inser c oes na mesma p agina na arvore indice o que economiza E/S de disco. Buers de inser c oes podem aumentar a velocidade das inser c oes em uma tabela em cerca de 15 vezes.
673
e atribui aquele valor incrementado de um a coluna e ao contador de auto incremento da tabela. Dizemos que o contador de auto incremento para a tabela T foi inicializado. O InnoDB segue o mesmo procedimento na inicializa c ao do contador de auto incremento para uma tabela recem criada. Note que se o usu ario especica em uma inser ca o o valor 0 a coluna auto-increment. o InnoDM trata a linha como se o valor n ao tivesse sido especicado. Depois do contador de auto incremento tiver sido inicializado, se um usu ario insere uma linha onde especicamos explicitamente o valor da coluna e o valor e maior que o valor atual do contador, ent ao o contador e congurado com o valor especicado. Se o usu ario n ao especicar um valor explicitamente, o InnoDB incrementa a contador de um e atribui o seu novo valor a coluna. O mecanismo de auto incremento, ao atribuir valor ao contador, desvia de manipuladores de travas e transa c oes. De outra forma voc e tamb em pode obter lacuas na sequ encia de n umeros se voc e zer um roll back da transa c ao que tiver obtido n umeros do contador. O comportamento do auto incremento n ao e denido se um usu ario passar um valor negativo a coluna ou se o valor se tornar maior que o valor inteiro m aximo que pode ser armazenado no tipo inteiro especicado.
674
do arquivo de dados em innodb_data_file_path. A parti c ao deve ter, pelo menos, o tamanho que voc e especicou. Note que 1M no InnoDB e 1024 x 1024 bytes, enquanto na especica c ao de disco 1 MB normalmente signica 1000 000 bytes. innodb_data_file_path=/dev/hdd1:5Gnewraw;/dev/hdd2:2Gnewraw Quando voc e reinicia o banco de dados voc e deve alterar a palavra chave para raw. Sen ao o InnoDB escrever a sobre a sua parti c ao! innodb_data_file_path=/dev/hdd1:5Graw;/dev/hdd2:2Graw Usando um disco raw voc e pode ter E/S sem buer em algumas ves oes de Unix. Quando voc e usar parti c oes de disco raw, certique-se de que voc e tem permiss oes que permitem acesso de leitura e escrita na conta usada para executar o servidor MySQL. Existem duas heur isticas read-ahead no InnoDB: read-ahead sequencial e read-ahead aleat oria. Na read-ahead sequencial o InnoDB percebe que o padr ao de acesso a um segmento no tablespace e sequencial. ent ao o InnoDB enviar a uma grupo de leitura das paginas do banco de dados para o sistema de E/S. No read-ahead aleat orio o InnoDB percebe que algumas areas no tablespace parecem estar no processo de serem totalmente lidas na area de buer. O InnoDB envia as leituras remanescente para o sistema de E/S.
675
Quando voc e deletar dados de uma tabela, o InnoDB contrair a o indice de arvore-B correspondente. Ele depende do padr ao de dele c oes se isto liberar p aginas individuais ou extens oes da tablespace, assim que o espa co liberado estiver dispon ivel para outros usu arios. Apagar a tabela ou deletar todos os registros dela garante a libera c ao do espa co para outros usu arios, mas lembre-se que registros deletados s o podem ser sicamente removidos em uma opera c ao de remo c ao (purge), depois que n ao houver mais necessidades de rollback em trasa c oes ou leituras consistentes.
676
No Windows o InnoDB armazena os nomes de banco de dados e tabelas internamente sempre em letras min usculas. Para mover bancos de dados em um formato bin ario do Unix para o Windows ou do Windows para o Unix voc e deve ter todas os nomes de tabelas e banco de dados em letras min uscula. converta o sistema de tabelas MySQL de MyISAM PARA InnoDB! Isto Aviso: NAO n ao e suportado; se voc e zer isto o MySQL n ao reiniciar a at e que voc e restaure o sistema de tabelas antigo de um backup ou os regenere com o script mysql_install_ db. SHOW TABLE STATUS n ao d a estat isticas exatas sobre tabelas InnoDB, exceto sobre o tamanho fisico reservado pela tabela. O contador de linha e apenas uma estimativa rude usada na otimiza c ao SQL. Se voc e tentar criar um indice u nico em um prexo de coluna voc e obter a um erro. CREATE TABLE T (A CHAR(20), B INT, UNIQUE (A(5))) TYPE = InnoDB; Se voc e criar um indice que n ao seja u nico em um prexo de uma coluna, o InnoDB criar a um indice sobre toda a coluna. INSERT DELAYED n ao e suportado por tabelas InnoDB. As opera c oes LOCK TABLES do MySQL n ao tem conhecimento dos bloqueios de resistro do InnoDBcongurados em instru c oes SQL completadas: isto signica que voc e pode conseguir um bloqueio de tabela mesmo se j a existir transa c oes de outros usu arios que tiverem bloqueios de registros na mesma tabela. Assim suas opera c oes sobre a tabela poder ter que esperar se eles colidirem com essas travas de outros usu arios. Tamb em pode ocorrer um deadlock. No entanto isto n ao tarz perigo a instegridade da transa c ao, pois o bloqueio de registro denido pelo InnoDB sempre cuidar a da integridade. Um bloqueio de tabela tamb em previne que outras transa c oes adquiram mais bloqueios de registros (em um modo de bloqueio conitante) na tabela. Uma tabela n ao pode ter mais de 1000 colunas. DELETE FROM TABLE n ao gera a tabela novamente, mas, ao inv es diato, deleta todas as linhas, uma a uma, o que n ao e r apido. Em vers oes futuras do MySQL voc e poder a usar TRUNCATE que e mais r apido. O tamanho de p agina padr ao utilizado no InnoDB e 16KB. Recompilando o c odigo pode se congur a-la com 8 KB a 64 KB. O tamanho m aximo de um registro e menos da metade da p agina de banco de dados nas vers oes anteriores a 3.23.40 do InnoDB. A partir da distribui c ao fonte da vers ao 3.23.41 colunas BLOB e TEXT podem ter at e4 GB e o tamanho total do registro tamb em devem ser menores que 4GB. O InnoDB n ao armazena campos cjo tamanho e menor que 128 bytes em p aginas separadas. Depois do InnoDB modicar o registro armazenando campos grandes em p aginas separadas, o tamanho restante da linha deve ser menor que metade da p agina de banco de dados. O tamanho m aximo da chave e de 7000 bytes. Em alguns sistemas operacionais os arquivos de dados devem ser menores que 2 GB. O tamanho combinado dos arquivos de log devem ser menores que 4GB. O tamanho m aximo do tablespace e 4 bilh oes de p aginas de banco de dados. Este tamb em e o tamanho m aximo da tabela. O tamanho m inimo do tabelspace e de 10 MB. Quando voc e reinicia o servidor MySQL, o InnoDB pode reutilizar um valor antigo para uma coluna AUTO_INCREMENT.
677
Voc e n ao pode denir o primeiro valor de uma coluna AUTO_INCREMENT no InnoDB com CREATE TABLE ... AUTO_INCREMENT=... (ou ALTER TABLE ...). Para denir este valor insira uma linha com o valor de menos e delete esta linha.
678
index. In a similar insert, InnoDB would leak reserved le space extents, which would only be freed at the next mysqld startup. Fixed a bug: if you used big BLOB values, and your log les were relatively small, InnoDB could in a big BLOB operation temporarily write over the log produced after the latest checkpoint. If InnoDB would crash at that moment, then the crash recovery would fail, because InnoDB would not be able to scan the log even up to the latest checkpoint. Starting from this version, InnoDB tries to ensure the latest checkpoint is young enough. If that is not possible, InnoDB prints a warning to the .err log of MySQL and advises you to make the log les bigger. Fixed a bug: setting innodb_fast_shutdown=0 had no eect. Fixed a bug introduced in 4.0.13: if a CREATE TABLE ended in a comment, that could cause a memory overrun. Fixed a bug: If InnoDB printed Operating system error number .. in a file operation to the .err log in Windows, the error number explanation was wrong. Workaround: look at section 13.2 of http://www.innodb.com/ibman.php about Windows error numbers. Fixed a bug: If you created a column prex PRIMARY KEY like in t(a CHAR(200), PRIMARY KEY (a(10))) on a xed-length CHAR column, InnoDB would crash even in a simple SELECT. CCHECK TABLE would report the table as corrupt, also in the case where the created key was not PRIMARY.
679
bullet Na vers ao 4.0.13 fazemos SHOW INNODB STATUS exibir informa c oes detalhadas sobre o u ltimo erro de UNIQUE KEY, mas armazenar esta informa c ao podia deixar o REPLACE bem mais lento. N ao exibimos nem armazenamos mais a informa c ao. bullet Corrigido um erro: SET FOREIGN KEY CHECKS=0 n ao era replicado apropriadamente na replica c ao do MySQL. A corre c ao provavelmente n ao ser a feita na s erie 3.23. bullet Corrigido um erro: o par ametro innodb max dirty pages pct n ao levav em conta as p aginas livres na area de buer. Isto podia levar a descargas excessivas mesmo se houvesse muitas p aginas livres na area de buer. Solu c ao: SET GLOBAL innodb max dirty pages pct = 100.
680
bullet Adicionado uma nova vari avel global congur avel de sistema do MySQL (innodb_max_ dirty_pages_pct). Ela e um interio na faixa de 0 - 100. O padr ao e 90. A thread principal no InnoDB tenta descarregar as p aginas da area de buer j a que grande parte deste percetual ainda n ao foi descarregado em nenhum momento. bullet Se innodb_force_recovery=6, n ao deixar o InnoDB fazer repara c ao de p aginas corrompidas baseadas no buer de dupla escrita. bullet O InnoDB agora inica mais r apido porque ele n ao dene a mem oria na area de buer para zero. bullet Corrigido um erro: a deni c ao FOREIGN KEY do InnoDB era confudida com as palavras chaves foreign key dentro dos coment arios do MySQL. bullet Corrigido um ero: se voc e apagasse um tablea para qual havia uma refer encia de chave estrangeira, e posteriormente criasse a mesma tabela com tipo de colunas n ao correspondentes, o InnoDB podia entrar em dict0load.c, na fun c ao dict_load_table. bullet Corrigido um erro: GROUP BY e DISTINCT podia tratar valores NULL como diferentes. O MySQL tamb em falahva ao fazer o lock da pr oxima chave no caso de uma faixa de indice vazia. bullet Corrigido um erro: n ao faz COMMIT da transa c ao atual quando uma tabela MyISAM e atualizada; isto tamb em faz com que CREATE TABLE n ao fa ca commit de uma transa c ao InnoDB, mesmo quando o log bin ario estiver habilitado. bullet Corrigido um erro: n ao permite que ON DELETE SET NULL modique a mesma tabela onde o delete foi feito; podemos permit i-lo porqeu into n ao pode produzir loops innitos em opera c oes em cascata. bullet Corrigido um erro: permitir HANDLER PREV e NEXT tamb em depois de posicionar o cursor com uma busca u nica na chave prim aria bullet Corrigido um erro: se MIN() ou MAX() resultasse em um deadlock ou em esgotamento do tempo de espera do lock, o MySQL n ao retornava um erro, mas NULL como o valor da fun c ao. bullet Corrigido um erro: o InnoDB esquecia de chamar pthread_mutex_destroy() quando uma tabela era apagada. Isto podia causar perda de mem oria no FreeBSD e outros Unix, exceto o Linux.
681
SELECT ... WHERE indice col < x and SELECT ... WHERE indice col > x podiam provocar a varredura da tabela mesmo se a seletividade fosse muito boa. Corrigido um erro potencial quando MySQL chama store lock with TL IGNORE no meio de uma consulta.
682
Corrigido um erro: algumas ferramentas de snapshot de sistema de arquivos no Windows 2000 podia provocar uma falha na escrita em arquivo s InnoDB com erro ERROR LOCK VIOLATION. Agora, em escritas s incronas, o InnoDB tenta escrever novamente at e 100 vezes em intervalos de 1 segundo. Corrigido um erro: REPLACE INTO t1 SELECT ... n ao funciona se t1 tiver uma coluna com auto incremento. ao e replicado de forma Um erro proeminente: SET FOREIGN KEY CHECKS=0 n apropriada em replica c oes do MySQL.
683
Isto poderia fazer com que a recupera c ao em caso de falhas e o InnoDB Hot Backup falhassem na varredura do log. Corrigido um erro: restaura c ao do cursos de indice poderia, teoricamente, falhar.
684
Corrigido um erro: TRUNCATE em uma tabela tempor aria causa erro no InnoDB. Corrigido um erro introduzido na vers ao 4.0.5: se o log bin ario n ao estivessem ligado, INSERT INTO ... SELECT ... ou CREATE TABLE ... SELECT ... podiam fazer com que o InnoDB pendurasse em um sem aforo criado em btr0sea.c, line128. Solu c ao: ligar o log bin ario. Corrigido um erro: na replica c ao, executar SLAVE STOP no meio de uma transa c ao multi-instru c ao podia fazer com que SLAVE START s o realizasse parte da transa c ao. Um erro parecido podia ocorrer se o slave nalizasse devido a um erro e fosse reiniciado.
685
Se voc e denir innodb force recovery > 0, o InnoDB tenta saltar para os registros e p aginas com indices corrompidos fazendo SELECT * FROM tabela. Isto ajuda no dump. O InnoDB agora usa E/S ass incrona e sem buer no Windows 2000 e XP; e apenas E/S sem buer ass incrono por simula c ao no NT, 95/98/ME. Corrigido um erro: a estimativa de alcance do InnoDB exagerava em muito o tamanho de de uma pequna faixa de indice se o caminho ao ponto nal da faixa na arvore de indice j a era um ramo na ra iz. Isto podia causar varreduras de tabela desnecess ariaem consultas SQL. A corre c ao tamb em ser a feita na vers ao 3.23.54. Corrigido um erro presente nas vers oes 3.23.52, 4.0.3, 4.0.4: A inicializa c ao do InnoDB podia levar muito tempo ou at e mesmo falhar em alguns computadores Windows 95/98/ME. Corrigido um erro: o lock AUTO-INC er a guardado para o m da transa c ao se ele fosse concedido depois de uma espera de lock. Isto podia causar deadlocks desnecess arios. Corrigido um erro: se SHOW INNODB STATUS, innodb monitor, ou innodb lock monitor tiver exibido centenas de transa c oes em um relat orio, e a sa ida car truncada, o InnoDB travaria, imprimindo no log de erros muitas esperas por um mutex criado em srv0srv.c, line 1621. Corrigido um erro: SHOW INNODB STATUS no Unix sempre relata o tamanho m edio dos arquivos lidos como 0 bytes. Corrigido um erro potencial na vers ao 4.0.4: o InnoDB agora faz ORDER BY ... DESC como o MyISAM. Corrigido um erro: DROP TABLE podia causar falhas ou um travamento se houvesse um rollback executando concorrentemente na tabela. A corre c ao ser a feita na s erie 3.23 se este for um problema para os usu arios. Corrigido um erro: ORDER BY podia falhar se voc e n ao tivesse criado um chave prim aria para uma tabela, mas tivesse denido diversos indices nos quais pelo menos um seja um indice u nico (UNIQUE) com todas as suas colunas declaradas como NOT NULL. Corrigido um erro: um espera pelo tempo limite na conex ao com ON DELETE CASCADE podia causar corrompimento nos indices. Corrigido um erro: se um SELECT era feito com uma chave u nica a partir de um indice prim ario e a busca correspondesse a um registro marcado para dele c ao, o InnoDB podia retornar o pr oximo registro. Outstanding bugs: na vers ao 4.0.4 dois erros foram introduzidos no AUTO INCREMENT. REPLACE pode fazer com que o contador seja decrementado. Um deadlock ou uma espera de tempo limite de lock pode causar o mesmo problema. Eles ser ao corrigidos na versao 4.0.6.
686
Ajustamos a estimativa de faixa para uqe varreduras de indices na faixa tenham prefer encia sobre a varredura completa de indices. Permitir a remo c ao e cria c ao de tableas mesmo se o innodb force recovery est a congurado. Pode se usar isto para remover uma tabela que causaria uma falha no rollback ou dele c ao, ou se uma importa c ao de tabelas com falhas causa um rollback na recupera c ao. Corrigido um erro presente nas vers oes 3.23.52, 4.0.3, 4.0.4: A inicializa c ao do InnoDB podia demorar ou mesmo travar em alguns computadores Windows 95/98/ME. Corrigido um ero: a naliza c ao r apida (que e padr ao), algumas vezes cava lenta pela uni ao do buer de remo c ao e inser c ao. Corrigido um erro: fazer um grande SELECT de uma tabela onde nenhum registro estava vis ivel em uma leitura consistente podia causar uma espera de sem aforo muito longo (> 600 segundos) em btr0cur.c line 310. Corrigido um erro: o lock AUTO-INC era guarda para o m da transa c ao se fosse concedido depois de uma espera de lock. Isto podia causar um deadlock desnecess ario. Corrigido um erro: se voc e criar uma tabela tempor aria dentro de LOCK TABLES, e usar esta tabela tempor aria, causar a um falha de declara c ao em ha innobase.cc. Corrigido um erro: se SHOW INNODB STATUS, innodb monitor, ou innodb lock monitor tiver exibido centenas de transa c oes em um relat orio, e a sa ida car truncada, o InnoDB travaria, imprimindo no log de erros muitas esperas por um mutex criado em srv0srv.c, line 1621. Corrigido um erro: SHOW INNODB STATUS no Unix sempre relata o tamanho m edio dos arquivos lidos como 0 bytes.
687
Corrigido um erro: se a cache de consultas do MySQL foi usada, ela n ao ca invalidada por uma modica c ao feita por ON DELETE CASCADE ou ...SET NULL. Corrigido um erro: se voc e criar uma tabela tempor aria dentro de LOCK TABLES, e usar esta tabela tempor aria, causar a um falha de declara c ao em ha innobase.cc. Corrigido um erro: se voc e denisse innodb ush log at trx commit com 1, SHOW VARIABLES mostraria seu valor como 16 milh oes.
688
t ao r apido quanto congurar innodb ush log at trx commit=0, e congurar com 2 tamb em tem o recurso no qual em uma falha onde o sistema operacional n ao teve problemas, nenhuma transa c ao cujo commit foi realizado e perdida. Se osistema operacional falhar ou houver um queda de for ca,ent ao a congurar com 2 n ao e mais segura que congurar com 0. Adicionado campos de checksum ao bloqueio de log. SET FOREIGN KEY CHECKS=0 ajuda na importa c ao de tabelas numa ordem arbitr aria que n ao respeita as regras de chaves estrangeiras. SET UNIQUE CHECKS=0 aumenta a velocidade da importa c ao das tabelas dentro do InnoDB se voc e tiver restri c oes de chave u nica em indices secund arios. SHOW TABLE STATUS agora tamb em lista poss iveis ON DELETE CASCADE ou ON DELETE SET NULL no campo de coment ario da tabela. Quando CHECK TABLE est a executando em qualquer tipo de tabela InnoDB, ela agora verica tamb em o indice hash adaptativo para todas as tabelas. Se voc e deniu ON DELETE CASCADE ou SET NULL e atualizou o chave referenciada no registro pai, o InnoDB deletava ou atualizava o registro lho. Isto est a alterado conforme o SQL-92: voc e recebe o erro Cannot delete parent row. Melhorado o algoritmo de auto incremento: agora o primeiro inserte ou SHOW TABLE STATUS inicializa o contador de auto incremento para a tabela. Isto remove quase todos os deadlocks causados pelo SHOW TABLE STATUS. Alinhado alguns buers usados na leitura e escrita dos arquivos de dados. Isto permite usar dispositivos raw sem buer como arquivos de dados no Linux. Corrigido um erro: se voc e atualizasse a chave prim aria de uma tabela, podia ocorrer uma falha de declara c ao em page0page.ic line 515. Corrigido um erro: se voc e deleta ou atualiza um registro referenciado em uma restri c ao de chave estrangeira e a verica c ao de chave estrangeira esperapor um lock, ent ao a verica c ao pode relatar um resultado err oneo. Isto tamb em afeta a opera c ao ON DELETE... Corrigido um erro: Um deadlock ou um erro de tempo esgotado na espera do lock no InnoDB causa um rollback de toda a transa c ao, mas o MySQL ainda podia gravar as instru c oes SQL no log bin ario, embora o InnoDB fa ca um rollback delas. Isto podia, por exemplo, fazer a replica c ao do banco de dados car fora de sincronia. Corrigido um erro: se o banco de dados falha no meio de um commit, ent ao a recupera c ao pode perder p aginas de tablespace. Corrigido um erro: se voc e especicar um conjunto de caracteres no my.cnf, ent ao, ao contr ario do que est a no manual, em uma restri c ao de chave estrangeira uma coluna do tipo string tinha que ter o mesmo tamanho na tabela que faz a refer encia e na tabela referenciada. Corrigido um erro: DROP TABLE ou DROP DATABASE podiam falhar se houvesse um CREATE TABLE executando simultaneamente. Corrigido um erro: se voc e congurasse a area de buer com mais de 2GB em um computador de 32 bits, o InnoDB falharia no buf0buf.ic linha 214.
689
Corrigido um erro: Em cmputadores de 64 bits,atualizando registros que contenham SQL NULL em algumas colunas faziam o undo log e o ordinary log se tornavam corrupto. Corrigido um erro: innodb log monitor causava um travamento se ele suprimisse a exibi c ao de locks para uma p agina. Corrigido um erro: na vers ao HP-UX-10.20, mutexes perderiam mem oria e causariam condi c oes de corrida e falhariam em alguma parte do c odigo do InnoDB. Corrigido um erro: se voc e rodou em modo AUTOCOMMIT, executou um SELECT, e imeditamente depois um RENAME TABLE, ent ao RENAME falharia e o MySQL reclamaria com o erro 192. Corrigido um erro: se compilado no Solaris 64 bits, o InnoDB produiria um erro de bus na inicializa c ao.
690
Para permitir que a ferramenta de hot backp funcione, no Windows n ao usaremos mais E/S sem buer ou E/S ass incrona nativa; usaremos a mesma assincronia simulada como no Unix. Agora voc e pode denir as cl ausulas ON DELETE CASCADE ou ON DELETE SET NULL em caves estrangeiras. Restri c oes de chaves estrangeiras agora sobrevivem a ALTER TABLE e e CREATE INDEX. Suprimimos a verica c ao de FOREIGN KEY se qualquer um dos valores de coluna na chave estrangeira ou chave referenciada a ser vericada e SQL NULL. Isto ecompat ivel com Oracle, por exemplo. SHOW CREATE TABLE agora tamb em lista todas as restri c oes de chaves estrangeiras. O mysqdump tamb em n ao esquece mais sobre sobre chaves estrangeiras na deni c aode tabelas. Agora voc e pode adicionar uma nova restri ca o de chave estrangeira com ALTER TABLE ... ADD CONSTRAINT FOREIGN KEY (...) REFERENCES ... (...). As deni c oes de FOREIGN KEY agora permitem nomes de tabela e colunas entre aspas invertidas. O comando MySQL SET TRANSACTION ISOLATION LEVEL ... agora tem o seguinte efeito em tabelas InnoDB: se uma transa c ao e denida como SERIALIZABLE ent ao o InnoDB conceitualmente adiciona LOCK IN SHARE MODE para todas as leituras consistentes. Se uma transa c ao e denida com qualquer outro n ivel de isola c ao, ent ao o InnoDB obedece sua estrat egia de lock padr ao que e REPEATABLE READ. SHOW TABLE STATUS n ao conguram mais um x-lock no m de um indice auto incremento se um contador auto incremento j a tiver sido inicializado. Isto remove quase todos os casos de deadlock causados por SHOW TABLE STATUS. Corrigido em erro: em uma instru c ao CREATE TABLE statement a string foreign seguida por caracter que n ao seja de espa co confuder o analizador do FOREIGN KEY e faz a cria c ao de tabelas falhar com n umero de erro 150.
691
com mais frequencia. Corrigido um problema de performance quando diversas consultas SELECT grandes est ao executando concorrentemente em um computados Linux multiprocessador. Grandes consultas SELECT no limite da CPU tambe ser ao executadas mais rap ido em todas as plataformas de uma maneira geral. Se olog bin ario do MySQL e usado, o InnoD agora exibe, ap os a recupera c ao de falhas, o nome do u ltimo arquivo de log bin ario do MySQL e a posi c ao neste arquivo (=byte oset) que o InnoDB pode recuperar. Isto eu til, por exemplo, quando sincronizar um banco de dados master e um slave na replica c ao novamente. Adicionado uma mensagem de erro melhor para ajudar nos problemas de instala c ao. Pode-se agora recuperar tamb em tabelas tempor arias do MySQL que se tronaram orf ao dentro do tablespace do InnoDB. O InnoDB agora previne que uma declara c ao FOREIGN KEY onde o sinal n ao e o mesmo nas colunas inteiras de refer encia e referenciada. Corrigido um erro: chamar SHOW CREATE TABLE ou SHOW TABLE STATUS poderia causar corrompimento de mem oria e fazer o mysqld falhar. O mysqldump, especialmente, corria este risco, j a que ele chamava SHOW CREATE TABLE com frequencia. Corrigido um erro: se no Unix voc e fazia um ALTER TABLE em uma tabela e, simultaneamente, executava consultas nela, o mysqld podia falhar em uma declara c ao no row0row.c, linha 474. Corrigido um erro: se inserir diversas tabelas contendo uma coluna auto incremento estava envolvida dentro do LOCK TABLES, o InnoDB falhava em lock0lock.c. A vers ao 3.23.47 permitia diversos NULLS em um indice secund ario UNIQUE. Mas CHECK TABLE n ao era relaxed: ele rporta atabela como corrompida. CHECK TABLE n ao reclama mais nesta situa c ao. Corrigido um erro: no Sparc e outros processadores high-endian, SHOW VARIABLES exibia innodb ush log at trx commit e outros par ametros de inicializa c ao booleanos sempre como OFF mesmo se eles estivessem habiliados. Corrigido um erro: se voc e executava mysqld-max-nt como um servi co no Windows NT/2000, a naliza c ao do servi co n aoesperava o suciente que o desligamento do InnoDb nalizasse.
692
O InnoDB permite uma coluna FOREIGN KEY do tipo CHAR se referir a uma coluna do tipo VARCHAR e vice versa. O MySQL silenciosamente troca os tipos de algumas colunas entre CHAR e VARCHAR e estas altera c oes silenciosas n ao seguem declara c oes de FOREIGN KEY mais. A recupera c ao era mais sucept ivel ao corrompimento de arquivos de log. C alculo de estat isticas desnecess arias forma removidas das consultas que geravam um tabea tempor aria. Algumas consultas ORDER BY e DISTINCT executar ao muito mais r apido agora. O MySQL agora sabe que a varredura de uma tabela InnoDB e feita atrav es de uma chave prim aria. Isto economizar a uma ordena c ao em algumas consultas ORDER BY. O tamanho m aximo da chave de tabelas InnoDB est a restrita novamente a 500 bytes. O interpretador do MySQL n ao pode tratar chaves longas. O valor padr ao de innodb lock wait timeout foi alterado de innito para 50 segundos, e o valor padr ao de innodb le io threads de 9 para 4.
693
Corrigido um erro: quando voc e criava uma tabela tempor aria de um tipo InnoDB e ent ao usava ALTER TABLE para ela,o servidor MySQL podia falhar. Previnia a cria c ao das tabeas do sistema do MySQL, mysql.user, mysql.host, ou mysql.db, no tipo InnoDB. Corrigido um erro que podia causar um falha de declara c ao na vers ao 3.23.44 em srv0srv.c, linha 1728.
694
695
696
cd /path/to/source/of/mysql-3.23.34 ./configure --with-berkeley-db Por favor, de uma olhada no manual fornecido com a distribui c ao BDB para informa c oes mais atualizadas. Mesmo sendo o BerkeleyDB muito testado e con avel, a interface com o MySQL ainda e considerada com qualidade gamma. N os estamos ativamente melhorando e otimizando para torn a-la est avel o mais breve poss ivel.
N ao sincroniza logs descarregados. N ao inicia Berkeley DB no modo de recupera c ao. --bdb-shared-data Inicia Berkeley DB no modo de multi-processos (N ao usa DB_PRIVATE ao inicializar Berkeley DB) --bdbDiretorio de arquivos tempor arios do Berkeley tmpdir=directory DB. --skip-bdb Disabilita o uso de tabelas BDB. -O bdb_max_ Dene o n umero m aximo de travas poss iveis. lock=1000 Veja Se c ao 4.6.8.4 [bdb_max_lock], P agina 310. Se voc e utiliza --skip-bdb, MySQL n ao ir a inicializar o biblioteca Berkeley DB e isto ir a claro que voc economizar muita mem oria. E e n ao pode utilizar tabelas BDB se voc e estiver usando esta op c ao. Se voc e tentar criar uma tabela BDB, o MySQL criar a uma tabela MyISAM. Normalmente voc e deve iniciar mysqld sem --bdb-no-recover se voc e pretende usar tabelas BDB. Isto pode, no entanto, lhe trazer problemas quando voc e tentar iniciar o mysqld e os arquivos de log do BDB estiverem corrompidos. Veja Se c ao 2.4.2 [Iniciando o servidor], P agina 116.
697
Com bdb_max_lock voc e pode especicar o n umero m acimo de travas (10000 por padr ao) que voc e pode tar ativas em uma tabela BDB. Voc e deve aument a-lo se voc e obter um erro do tipo bdb: Lock table is out of available locks ou Got error 12 from ... quando voc e zer transa c oes longas ou quando mysqld tiver que examinar muitas linhas para calcular a consulta. Voc e tamb em pode desejar alterar binlog_cache_size e max_binlog_cache_size se voc e estiver usando transa c oes multi-linhas. Veja Se c ao 6.7.1 [COMMIT], P agina 614.
698
A aplica c ao sempre deve estar preparada para tratar casos onde qualquer altera c ao de uma tabela BDB pode fazer um rollback autom atico e quqlquer leitura pode falhar com um erro de deadlock. As chaves n ao s ao compactadas por prexo ou por suxo como em tabelas MyISAM. Em outras palavras, a informa c ao da chave gastar a um pouco mais de espa co em tabelas BDB quando comparadas a tabelas MyISAM. Existem buracos frequentemente em tabelas BDB para permitir que voc e insira novas linhas no meio da arvore de chaves. Isto torna tabelas BDB um pouco maiores que tabelas MyISAM. O otimizador precisa conhecer aproximadamente o n umero de linhas na tabela. O MySQL resolve isto contando inser c oes e mantendo isto em um segmento separado em cada tabela BDB. Se voc e n ao executar v arias instru c oes DELETE ou ROLLBACK, este n umero dever a estar sucientemente pr oximo do exato para o otimizador do MySQL, mas como o MySQL s o armazerna o n umero ao nalizar, ele pode estar incorreto se o MySQL nalizar inesperadamente. Isto n ao deve ser fatail mesmo se este n umero n ao for 100% correto. POde se atualizar o n umero de linhas executando ANALYZE TABLE ou OPTIMIZE TABLE. Veja Se c ao 4.6.2 [ANALYZE TABLE], P agina 299 . Veja Se c ao 4.6.1 [OPTIMIZE TABLE], P agina 299. Se voc e car com o seu disco cheio com uma tabela BDB, voc e obter a um erro (provavelmente erro 28) e deve ser feito um rollback da transa c ao. Isto est a em contraste com as tabelas MyISAM e ISAM onde o mysqld ir a esperar por espa co suciente em disco pra continuar.
699
Ele
n ao funciona com os seguintes sistemas operacionais. Linux 2.x Alpha Linux 2.x AMD64 Linux 2.x IA64 Linux 2.x s390 Max OS X
Nota: A lista acima n ao est a completa; atualizaremos ela assim que recebermos mais informa c oes. Se voc e construir o MySQL como suporte a tabelas BDB e obter o seguinte erro no arquivo de log quando voc e iniciar o mysqld: bdb: architecture lacks fast mutexes: applications cannot be threaded Cant init dtabases Isto signica que as tabelas BDB n ao s ao suportadas por sua arquitetura. Neste caso voc e deve reconstruir o MySQL sem o suporte a tabelas BDB.
700
Isto n ao e fatal mas n ao recomendamos deletar tabelas se n ao estiver no modo autocommit, at e que este problema seja resolvido (a solu c ao n ao e trivial).
701
8 Introdu c ao ao MaxDB
MaxDB e um banco de dados empresarial. O MaxDB e o novo nome de um sistema de gerenciamento de banco de dados formalmente chamado SAP DB.
702
703
CHECK TABLE Column types SQL function Implicit commits of transactions happen when data denition queries are being issued SQL function SQL function SQL, data denition language SQL function
704
DATE() DATEDIFF() DAY() DAYOFWEEK() DISTINCT DROP EBCDIC() EXPAND() EXPLAIN FIXED() FLOAT() HEX() INDEX() INDEX
SQL functions AVG, MAX, MIN, SUM inter alia in DROP INDEX SQL function SQL function Optimization SQL function SQL function SQL function SQL function USE INDEX, IGNORE INDEX and similar hints are being used right after SELECT, like SELECT ... USE INDEX SQL function SQL function SQL function Comparisons MaxDB supports %, , ctrl+underline, ctrl+up arrow, *, and ? as wildcards in a LIKE comparison SQL function SQL function SQL function SQL function SQL function SQL function SQL function Column comparisons types;
CURRENT_DATE DATEDIFF(); new in MySQL version 4.1.1 Nothing comparable DAYOFWEEK(); the rst day (1) by default is Monday in MaxDB, and Sunday in MySQL DISTINCT; but used in a dierent context: SELECT DISTINCT DROP INDEX; similar, but not identical usage Nothing comparable Nothing comparable EXPLAIN; similar, but not identical usage Nothing comparable Nothing comparable HEX(); similar, but not identical usage INSTR() or LOCATE(); similar, but not identical syntaxes and meanings USE INDEX, IGNORE INDEX and similar hints are being used in the FROM clause of a SELECT query, like in SELECT ... FROM ... USE INDEX Nothing comparable LENGTH(); identical syntax, but slightly different implementation Nothing comparable LIKE; but the extended LIKE MaxDB provides rather resembles the MySQL REGEX MySQL supports %, and as wildcards in a LIKE comparison
PI REF
LPAD(); slightly dierent implementation LTRIM(); slightly dierent implementation MAKEDATE(); new in MySQL version 4.1.1 MAKETIME(); new in MySQL version 4.1.1 Nothing comparable MICROSECOND(); new in MySQL version 4.1.1 Nothing comparable NULL; MaxDB supports special NULL values that are returned by arithmetic operations that lead to an overow or a division by zero; MySQL does not support such special values PI(); identical syntax and implementation, but parantheses are mandatory Nothing comparable
705
RFILL() ROWNO RPAD() RTRIM() SEQUENCE SINH() SOUNDS() STATISTICS SUBSTR() SUBTIME() SYNONYM
SQL function Predicate in WHERE clause SQL function SQL function CREATE SEQUENCE, DROP SEQUENCE SQL function SQL function UPDATE STATISTICS SQL function SQL function Data denition language: CREATE [PUBLIC] SYNONYM, RENAME SYNONYM, DROP SYNONYM SQL function SQL function SQL function SQL function SQL function
Nothing comparable Similar to LIMIT clause RPAD(); slightly dierent implementation RTRIM(); slightly dierent implementation AUTO_INCREMENT; similar concept, but differing implementation Nothing comparable SOUNDEX(); slightly dierent syntax ANALYZE; similar concept, but diering implementation SUBSTRING(); slightly dierent implementation SUBTIME(); new in MySQL version 4.1.1 Nothing comparable
TANH() TIME() TIMEDIFF() TIMESTAMP() TIMESTAMP() as argument to DAYOFMONTH() and DAYOFYEAR() TIMEZONE() TRANSACTION() TRANSLATE() TRIM() TRUNC() USE USER UTC_DIFF() VALUE() VARIANCE() WEEKOFYEAR()
Nothing comparable CURRENT_TIME TIMEDIFF(); new in MySQL version 4.1.1 TIMESTAMP(); new in MySQL version 4.1.1 Nothing comparable
SQL function Returns the ID of the current transaction SQL function SQL function SQL function mysql commandline user interface command SQL function SQL function SQL function, alias for COALESCE() SQL function SQL function
Nothing comparable Nothing comparable REPLACE(); identical syntax and implementation TRIM(); slightly dierent implementation TRUNCATE(); slightly dierent syntax and implementation USE USER(); identical syntax, but slightly different implementation, and parantheses are mandatory UTC_DATE(); provides a means to calculate the result of UTC_DIFF() COALESCE(); identical syntax and implementation Nothing comparable WEEKOFYEAR(); new in MySQL version 4.1.1
8.8 Fun co es
706
707
708
Permite a especica c ao de conjunto de caracteres e collations em qualquer n ivel A este respeito, o MySQL 4.1 n ao s o e mais ex ivel que o MySQL 4.0, mas tamb em est a bem a frente de outros SGBDs. No entanto, para usar os novos recursos efetivamente, voc e precisar a aprender quais conjuntos de caracteres e collations est ao dispon iveis, como alterar os seus padr oes e o que os v arios operadores de string fazem como ele.
709
Neste n ivel, a decis ao e simples. O conjunto de caracteres e collations do servidor dependem das op c oes que voc e usa quando voc e inicia o mysqld. Voc e pode usar --default-character-set=character_set_name para o conjunto de caracteres, e junto com isto voc e pode adcionar --default-collation=collation_name para a collation. Se voc e n ao especicar um conjunto de caracteres, e o mesmo que utilizar --default-character-set=latin1. Se voc e especicar apenas um conjunto de caracteres (por exemplo, latin1) mas n ao uma collation, e o mesmo que usar --default-charset=latin1 --collation=latin1_swedish_ci pois latin1_swedish_ci e a collation padr ao para latin1. Desta forma, os tr es comando seguintees todos t em o mesmo efeito: shell> mysqld shell> mysqld --default-character-set=latin1 shell> mysqld --default-character-set=latin1 --default-collation=latin1_swedish_ci Um modo de o conjunto e recompilando. Se voc e quiser alterar o conjunto de caracteres e collation padr oes na constru c ao dos fontes, utilize: --with-character-set e --withcollation como argumento para configure. Por exemplo: shell> ./configure --with-character-set=latin1 ou shell> ./configure --with-character-set=latin1 --with-collation=latin1_german1_ci Tanto o mysqld quanto o configure vericam que a combina c ao conjunto de caracteres/collations e v alida. Cada programa exibe um mensagem de erro e termina se a combina c ao n ao for v alida.
710
Sen ao utiliza o conjunto de caracteres e a collation de servidor. A sintaxe CREATE DATABASE ... DEFAULT CHARACTER SET ... do MySQL e an aloga a sin taxe CREATE SCHEMA ... CHARACTER SET ... do padr ao SQL. Por isto, e possivel criar bancos de dados com com conjunto de caracteres e collations diferentes, no mesmo servidor MySQL. O conjuto de caracteres e collations do banco de dados s ao usados como valores padr oes se o conjunto de caracteres e a collation de tabela n ao forem especicados nas instru c oes CREATE TABLE. Eles n ao possuem nenhum outro prop osito.
711
); O MySQL escolhe o conjunto de caracteres e collation de coluna desta forma: Se CHARACTER SET X e COLLATE Y forem especicados, ent ao o conjunto de caracteres e X e collation e Y. Se CHARACTER SET X foi especicado sem COLLATE, ent ao o conjunto de caracteres eX e o collation e o padr ao. Sen ao, o conjunto de caracteres e collation s ao os padr oes. As cl ausulas CHARACTER SET e COLLATE s ao do padr ao SQL.
712
713
Quando voc e executa SET NAMES ou SET CHARACTER SET, voc e tamb em est a alterando a collation da conex ao. No entanto a collation da conex ao existe apenas para consist encia. Normalmente o seu valor n ao importa. Com o cliente mysql, n ao e necess ario executar SET NAMES todas as vezes que voc e inic a-lo. Voc e pode adicionar a op c ao --default-character-set-name a sua linha de instru c ao do mysql, ou em seu arquivo de op c ao. Por exemplo, a seguinte congura c ao do arquivo de op c ao ir a alterar o conjunto de caracteres da conex ao cada vez que voc e executar mysql: [mysql] default-character-set-name=character_set_name
714
Uma string com conjunto de caracteres latin1 e e sua collation padr ao, isto e, latin1_ swedish_ci: SELECT _latin1M uller; Uma string com o conjunto de caracteres e a collation da conex ao/literal: SELECT M uller; Introdutores de conjunto de caracteres e a cl ausula COLLATE s ao implementados de acordo com as especica c oes do padr ao SQL.
715
716
Exemplos: column1 = A column1 = A COLLATE x column1 COLLATE x = A COLLATE y Usa a collation de column1 Usa a collation de A Error
717
9.4.2 CONVERT()
CONVERT() fornece um modo de converter dados entre diferentes conjunto de caracteres. A sintaxe e: CONVERT(expr USING transcoding_name) No MySQL, nomes transcodicados s ao o mesmo que o nomes dos conjuntos de caracteres correspondentes. Exemplos: SELECT CONVERT(_latin1M uller USING utf8); INSERT INTO utf8table (utf8column) SELECT CONVERT(latin1field USING utf8) FROM latin1table; CONVERT(... USING ...) e implementado de acordo com a especica c ao SQL-99.
718
9.4.3 CAST()
Voc e tamb em pode usar CAST() para converter uma string para um conjunto de caracteres diferente. O novo formato e: CAST ( character_string AS character_data_type CHARACTER SET character_set_name ) Exemplo: SELECT CAST(_latin1test AS CHAR CHARACTER SET utf8); Voc e n ao usar uma cl ausula COLLATE dentro de um CAST(), mas voc e pode us a-la fora, isto e, CAST(... COLLATE ...) e ilegal mas CAST(...) COLLATE ... e permitido. Exemplo: SELECT CAST(_latin1test AS CHAR CHARACTER SET utf8) COLLATE utf8_bin; Se voc e usar CAST() sem especicar CHARACTER SET, ent ao o conjunto de caracteres e collation resultante s ao o conjunto de caracteres da conex ao/literal e a sua collation padr ao. Se voc e usar CAST() com CHARACTER SET X, ent ao o conjunto de caracteres resultante eXe a collation resultante e a collation padr ao de X.
719
| latin1_german1_ci | latin1 | 5 | | | 0 | | latin1_swedish_ci | latin1 | 8 | Yes | Yes | 0 | | latin1_danish_ci | latin1 | 15 | | | 0 | | latin1_german2_ci | latin1 | 31 | | Yes | 2 | | latin1_bin | latin1 | 47 | | Yes | 0 | | latin1_general_ci | latin1 | 48 | | | 0 | | latin1_general_cs | latin1 | 49 | | | 0 | +-------------------+---------+----+---------+----------+---------+ 7 rows in set (0.00 sec) A coluna Default indica se uma collation e o padr ao para o seu conjunto de caracteres. Compiled indica se o conjunto de caracteres e ou n ao compilado no servidor. Sortlen e relacionado a quantidade de mem oria exigida para armazenar strings expressadas no conjunto de caracteres.
mysql> SHOW CREATE DATABASE a; +----------+-----------------------------------------------------------------------| Database | Create Database +----------+-----------------------------------------------------------------------| a | CREATE DATABASE a /*!40100 DEFAULT CHARACTER SET macce COLLATE macce_ +----------+-----------------------------------------------------------------------1 row in set (0.00 sec)
720
721
nome column1 ser a retornado do servidor para o cliente no conjunto de caracteres do cliente como determinado pela instru c ao SET NAMES.) Se voc e quizer que o servidor passe o resultado de volta em um conjunto de caracteres n aoUTF8, ent ao use SET CHARACTER SET para for car o servidor a converter (veja Se c ao 9.3.6 [Charset-connection], P agina 712), ou congurar o cliente para fazer a a convers ao, mas esta op c ao n ao estar a disponivel para muitos clientes at e no nal no ciclo do produto MySQL 4.x. Se voc e est a apenas usando, por exemplo, a fun c ao USER() para compara c ao ou atribui c ao dentro de uma u nica instru c ao ... n ao preocupe. O MySQL far a alguma convers ao autom atica para voc e. SELECT * FROM Table1 WHERE USER() = latin1_column; Isto funcionar a, porque o conte udo de latin1_column e convertido automaticamente para UTF8 antes da compara c ao. INSERT INTO Table1 (latin1_column) SELECT USER(); Isto funcionar a, porque o cont eudo de USER() e convertido automaticamente para latin1 antes da atribui c ao. A convers ao autom atica ainda n ao est a totalmente implementada, mas deve funcionar corretamente em uma vers ao posterior. Embora a convers ao autom atica n ao esteja no padr ao SQL, o documento do padr ao SQL diz que todo conjunto de caracteres e (em termos de caracteres suportados) um subconjunto do Unicode. Desde que isto seja um princ ipio bem conhecido que o que aplica a um superconjunto pode ser aplicado a um subconjunto, acreditamos que uma collation para Unicode pode ser aplicado para compara c oes com strings n ao -Unicode. 4.1.1: Os arquivos errmsg.txt estar NATA DA VERSAO ao todos em UTF8 depois deste ponto. Convers ao o conjunto de caracteres do clientes ser ao autom aticos, como para metadados. Tamb em: Podemos alterar o comportamento padr ao para passar de volta o metadado do resultado em um futuro pr oximo.
722
723
shell> ./configure --with-character-set=latin1 --with-collation=latin1_danish_ci shell> ./mysqld --default-character-set=latin1 --default-collation=latin1_danish_ci Use a tabela mostrada na pr oxima se c ao para encontrar o nome do antigo conjunto de caracteres do MySQL 4.0 e o par conjunto de caracteres/collation equivalente no MySQL 4.1.
724
725
NB: TODOS OS CONJUNTO DE CARACTERES TEM UMA COLLATION BINARIA. NAO INCLUIMOS A COLLATION BINARIA EM TODAS AS DESCRIC OES A SEGUIR.
726
+----------+-----------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | | gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 | | gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 | | euckr | EUC-KR Korean | euckr_korean_ci | 2 | | ujis | EUC-JP Japanese | ujis_japanese_ci | 3 | | sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 | | tis620 | TIS620 Thai | tis620_thai_ci | 1 | +----------+-----------------------------+---------------------+--------+
727
+----------------------+----------+----+---------+----------+---------+ cp866 (DOS Russian): +----------------------+----------+----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +----------------------+----------+----+---------+----------+---------+ | cp866_general_ci | cp866 | 36 | Yes | | 0 | | cp866_bin | cp866 | 68 | | | 0 | +----------------------+----------+----+---------+----------+---------+ koi8r (KOI8-R Relcom Russian, primarily used in Russia on Unix): +----------------------+----------+----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +----------------------+----------+----+---------+----------+---------+ | koi8r_general_ci | koi8r | 7 | Yes | | 0 | | koi8r_bin | koi8r | 74 | | | 0 | +----------------------+----------+----+---------+----------+---------+ koi8u (KOI8-U Ukrainian, primarily used in Ukraine on Unix): +----------------------+----------+----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +----------------------+----------+----+---------+----------+---------+ | koi8u_general_ci | koi8u | 22 | Yes | | 0 | | koi8u_bin | koi8u | 75 | | | 0 | +----------------------+----------+----+---------+----------+---------+
728
| Collation | Charset | Id | Default | Compiled | Sortlen | +----------------------+----------+----+---------+----------+---------+ | macce_general_ci | macce | 38 | Yes | | 0 | | macce_bin | macce | 43 | | | 0 | +----------------------+----------+----+---------+----------+---------+ latin2 (ISO 8859-2 Central European): +----------------------+----------+----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +----------------------+----------+----+---------+----------+---------+ | latin2_czech_ci | latin2 | 2 | | Yes | 4 | | latin2_general_ci | latin2 | 9 | Yes | | 0 | | latin2_hungarian_ci | latin2 | 21 | | | 0 | | latin2_croatian_ci | latin2 | 27 | | | 0 | | latin2_bin | latin2 | 77 | | | 0 | +----------------------+----------+----+---------+----------+---------+ keybcs2 (DOS Kamenicky Czech-Slovak): +----------------------+----------+----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +----------------------+----------+----+---------+----------+---------+ | keybcs2_general_ci | keybcs2 | 37 | Yes | | 0 | | keybcs2_bin | keybcs2 | 73 | | | 0 | +----------------------+----------+----+---------+----------+---------+
729
As collations latin1_german1_ci e latin1_german2_ci s ao baseadas nos padr oes DIN-1 e DIN-2, onde DIN signica Deutsches Institut f ur Normung (isto e, a resposta Alem a ao ANSI). DIN-1 e chamada collation de dicion ario e o DIN-2 e chamado a collation de agenda. Regras latin1_german1_ci (dicion arios): A = A, O = O, U = U, = s Regras latin1_german2_ci (agendas): A = AE, O = OE, U = UE, = ss macroman (Mac West European): +----------------------+----------+----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +----------------------+----------+----+---------+----------+---------+ | macroman_general_ci | macroman | 39 | Yes | | 0 | | macroman_bin | macroman | 53 | | | 0 | +----------------------+----------+----+---------+----------+---------+ cp850 (DOS West European): +----------------------+----------+----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +----------------------+----------+----+---------+----------+---------+ | cp850_general_ci | cp850 | 4 | Yes | | 0 | | cp850_bin | cp850 | 80 | | | 0 | +----------------------+----------+----+---------+----------+---------+
730
10.1 Introdu c ao
O MySQL implementea extens oes espaciais seguindo especica c oes do Open GIS Consortium (OGC). Este e um cons orcio internacional com mais de 250 companhias, ag encias, universidades participando no desenvolvimento de solu c oes conceituais dispon iveis publicamente que podem der u teis com todos os tipos de aplica c oes que gerenciam dados espaciais. O OGC mant em um web site em http://www.opengis.org/. Em 1997, o Open GIS Consortium publicou o OpenGIS R Simple Features Specications For SQL (Especica c oes de Recursos OpenGIS R Simples Para SQL), um documento que propos diversos modos conceituais de para extender um SQL RDBMS para suportar dados espaciais. Esta especica c ao est a dispon ivel no web site do OpenGIS em http://www.opengis.org/techno/implementation.htm. Ele cont em informa c oes adicionais relevantes a este cap itulo. O MySQL implementa um subconjunto do ambiente SQL com Tipos Geom etricos proposto pela OGC. Este termo se refere a um ambiente SQL que tem sido extendido com um conjunto de tipos geom ertricos. Uma coluna SQL com valor geom etrico e implementada como uma coluna de um tipo geom etrico. As especica c oes descrevem um conjunto de tipod geom etricos do SQL, bem como fun c oes deste tipo para criar e analisar valores geom etricos. Um recurso geogr aco e qualquer coisa no mundo que tem uma posi c ao. Um recurso pode ser: Uma entidade. Por exemplo, uma montanha, uma lagoa, em cidade Um espa co. Por exemplo, um area de c odigo postal, os tr opicos Uma localiza c ao denida. Por exemplo, um cruzamento. como um lugar espec ico onde duas ruas se interceptam. Voc e tamb em pode encontrar documentos que utilizam o termo recurso geoespacial para se referir a recursos geogr acos. Geometria e outra palavra que denota um recurso geogr aco. O signicado original da palavra geometria denota um ramo da matem atica. Outro signicado vindo da cartograa, se referem aos recursos geom etricos que os cart ografos usam para mapear o mundo. Este cap itulo utiliza todos estes termos como sin onimo: recurso geogr aco, recurso geoespacial, recurso ou geometria, O termo normalmente mais usado aqui e geometry. Vamos denir uma geometria como um ponto ou um agregado de pontos representando alguma coisa no mundo que possui uma localiza c ao.
731
732
GeometryCollection tem classes de cole c ao com zero-, uma- e duas-dimens oes chamadas MultiPoint, MultiLineString e MultiPolygon para modelagem geom etrica correspondente a cole c oes de Points, LineStrings e Polygons respectivamente. MultiCurve e MultiSurface s ao introduzidas como superclasses abastratas que generalizam a interface de cole c ao para tratar Curves e Surfaces. Geometry, Curve, Surface, MultiCurve e MultiSurface s ao denidos como classes n ao instanci aveis. Eles denem em conjunto de m etodos comuns para suas subclasses e incluidos por raz oes de extensabilidade. Point, LineString, Polygon, GeometryCollection, MultiPoint, MultiLineString, MultiPolygon s ao classses instanci aveis.
Propriedades de geometria
Um valor geometry tem as seguintes propriedades: o tipo (type). Cada geometria pertence a uma das classes instanci E aveis na hierarquia. Seu SRID ou Identicador de Refer encia Espacial. Este valor identica o Sistema de Refer encia Espacial associada da geometria, o qual descreve o coordenada espacial na qual objeto geomtrico est a denido. Coordenadas (coordinates) em seu Sistema de Refer encia Espacial, representado por um n umero de precis ao dupla (8 byte). Todas as geometrias n ao-vazias incluem pelo menos um par de coordenadas (X,Y). Geometrias vazias n ao contem cooredenadas. Coordenadas est ao relacionadas ao SRID. Por exemplo, em sistemas de coordenadas diferentes, a dist ancia entre dois objetos podem diferir mesmo quando os objetos t em as mesmas coordenadas, porque as dist ancias no sistema de coordenadas planar e a dist ancia no sistema geocentrico (coordenadas na superf icie da Terra) s ao coisas diferentes. Seu interior (interior), limite (boundary) e exterior (exterior). Todas as geometrias ocupam alguma por c ao no espa co. O exterior de uma geometria e todo espa co n ao ocupado pela geometria. O interiro e o espea co ocupado pela geometria. O limite e a interface entre o interior e o exterior Seu MBR (Ret angulo de Limite M inimo - Minimum Bounding Rectangle), ou Envelope, da geometria. Este e a geometria limitar, formado pelas coordenadas de m inimo e m aximo (X,Y): ((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY)) A qualidade de ser simple ou non-simple (simples ou n ao simples). Valores geometricos alguns tipos (LineString, Multipoint, MultiLineString) podem ser simples ou n aosimples. Cada tipo determina sua pr orpia arma c ao de ser simples ou n ao-simples.
733
A qualidade de ser closed ou not closed (fechado ou n ao fechado). Valores geom etricos de alguns tipos (LineString, MultiString) podem ser fechado ou n ao fechado. Cada tipo determina a sua pr opria arma c ao de ser fechado ou n ao fachado. A qualidade de ser empty ou not empty (vazio ou n ao vazio). Uma geometria e vazia se ela n ao tem nenhum ponto. Exterior, interior e limite de ma geometria vazia n ao est ao denidos. (isto e, eles s ao representados por valores NULL). Uma geometria vazia e denida sempre simples e ter um area de 0. Sua dimens ao (dimension). Uma geometria pode ter uma dimens ao de 1, 0, 1 or 2: 1 usado para geometrias vazias 0 usado para geometrias sem tamanho e sem area. 1 usado para geometrias com tamanho diferente de zero e sem area. 2 usado para geometrias com area diferente de zero. Points tem uma dimensi ao de zero. LineStrings tem uma dimens ao de 1. Polygons tem uma dimens ao de 2. Dimens oes de MultiPoints, MultiLineStrings e MultiPolygons s ao a e mesma da dimens ao dos elementos dos quais eles consistem.
Exemplos de Point
Imagine um mapa do munod de larga-escala com muitas cidades. Um ponto poderia representar cada cidade. Em um mapa da cidade, um Point poderia epresntar uma parada de onibus.
Propriedades de Point
Valor de coordenada X. Valor da coordenada Y. O Point e denido como uma geometria de dimens ao zero. O limite de um Point e um conjunto vazio.
Propriedades de Curve
As coordenadas de seus pontos. Curve e deniido como uma geometria unidimensional.
734
A Curve e simples (simple) se ela n ao passa pelo mesmo ponto duas vezes. A Curve e fechada (closed) se o ponto inicial e igual ao ponto nal. O limite (boundary) de uma Curve fechada e vazio. O limite (boundary) de uma Curve n ao-fachada cociste do seus dois pontos nais. A Curve que e simples (simple) e fechada (closed) e uma LinearRing.
Exemplos de LineString
Em um mapa mundi uma LineStrings poderia representar os rios. Um um mapa da cidade uma LineStrings poderia respresntar ruas.
Propriedades LineString
Coordenadas de segmentos LineString denidos por cada par de pontos consecutivos. Uma LineString e uma Line, se ela consiste de exatamente dois pontos. A LineString e uma LinearRing, se for fechada (closed) e simples (simple).
Propriedades de Surface
Uma Surface e denida com uma geomtria bidimensional. A especica c ao OpenGIS dene uma Surface simples como uma geometria que consiste de um u nico patch que e associado com um exterior boundary (limite exterior) e zero ou mais interior boundaries (limites interiores). O limite (boundary) de uma Surface simples e o conjunto de curvas fechadas correspondente a seus limites exterior e interior.
735
Exemplos de Polygon
Em um mapa de regi ao, objetos Polygon podem representar orestas, distritos, etc. As arma c oes para os polygons (as regras que denem polygons v alidos) s ao: 1. O limite (boundary) de um Polygon consiste de um conjunto de LinearRings (ex. LineStrings que s ao simples e fechadas) que fazem os seus limites interior e exterior. 2. Dois aneis no limite n ao podem se cruzar. Os aneis no limite de um Polygon podem se interseptar em um Point, mas apenas como uma tangente. 3. Um Polygon n ao pode ter linhas cortadas, pontas ou cavidades. 4. O interior de cada Polygon e um conjunto de pontos conectados. 5. O Exterior de um Polygon com um ou mais buracos n ao est a conectado. Cada buraco dene um componenete conectados do exterior. Nas arma c oes acimas, poligonos s ao geometrias simples. Estas arma c oes fazem de um Polygon uma geometria simples.
Exemplos de MultiPoint
Em um mapa mundi, um Multipoint podia representar uma cadeia de pequenas ilhas.
Propriedades de MultiPoint
MultiPoint e denido com uma geometria sem dimens ao. Um MultiPoint e simples se n ao h a dois valores de seus Point iguais no MultiPoint (tem valores de coordenadas iguais). O limite (boundary) de um MultiPoint e um conjunto vazio.
736
Propriedades de MultiCurve
A MultiCurve e denida como uma geometria de uma dimens ao. A MultiCurve e simples se e somente se todos os seus elementos s ao simples, a u nica interse c ao entre quaisquer dois elementos ocorrem entre pontos que est ao nos limites (boundaries) de ambos os elementos. O limite (boundary) de uma MultiCurve e obtida aplicando a "mod 2 union rule": Um ponto est a no limite (boundary) de uma MultiCurve se ele est a no limite de um n umero impar de elementos da MultiCurve. Um MultiCurve e fechado se todos os seus elementos s ao fechados. O limite de uma MultiCurve fechada e sempre vazio.
MultiLineString
Em uma mapa regional, um MultiLineString pode represntar um rede hidrograca ou uma malha de rodovias.
Arma co es de MultiSurface
1. O interior de quaisquer duas superf icies em uma MultiSurface n ao podem se interceptar. 2. O limite de quaiqsquer dois elementos em um MultiSurface podem interceptar em um n umero nito de pontos.
Exemplos de MultiPolygon
Em um mapa regional, um MultiPolygon pode representar um sistema de lagos.
737
Propriedades de MultiPolygon
MultiPolygon e denido como uma geometria bidimensional. O limite (boundary) de um MultiPolygon e um conjunto de curvas fechadas (valores LineStrings) correspondente ao limite dos valores seus elementos Polygon. Cada Curve no limite do MultiPolygon este no limite de exatamente um elemento Polygon. Toda Curve no limite de um elemento Polygon est a no limite do MultiPolygon.
738
Um Polygon (pol igono) com um anel exterior e um an el interior. POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5)) Um MultiPoint (multipontos) com tr es valores Points. MULTIPOINT(0 0, 20 20, 60 60) Um MultiLineString (multi linhas) com dois valores LineString. MULTILINESTRING((10 10, 20 20), (15 15, 30 15)) Um MultiPolygon (multi pol igonos) com dois valores Polygon. MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5))) Um GeometryCollection (Cole c ao de Geometria) consistindo de dois valores Points e um LineString. GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20)) Uma gram atica Backus-Naur que especica as regras de produ c ao formal para gravar valores WKT podem ser encontrados na documenta c ao de especica c ao OGC indicada pr oximo ao in icio deste cap itulo.
739
740
PointFromText(wkt[,srid]) Controi um valor POINT usando sua representa c ao WKT e SRID. LineFromText(wkt[,srid]) LineStringFromText(wkt[,srid]) Constroi um valor LINESTRING usando sua representa c ao WKT e SRID. PolyFromText(wkt[,srid]) PolygonFromText(wkt[,srid]) Constroi um valor POLYGON usasdo sua representa c ao WKT e SRID. MPointFromText(wkt[,srid]) MultiPointFromText(wkt[,srid]) Contr oi um valor MULTIPOINT usando sua representa c ao WKT e SRID. MLineFromText(wkt[,srid]) MultiLineStringFromText(wkt[,srid]) Contr oi um valor MULTILINESTRING usando sua representa c ao WKT e SRID. MPolyFromText(wkt[,srid]) MultiPolygonFromText(wkt[,srid]) Contr oi um valor MULTIPOLYGON usando sua representa c ao WKT e SRID. GeomCollFromText(wkt[,srid]) GeometryCollectionFromText(wkt[,srid]) Constr oi um valor GEOMETRYCOLLECTION usando sua representa c ao WKT e SRID. A especica c ao OpenGIS tamb em descreve fun co es opcionais para constru c ao de valores Polygon ou MultiPolygon baseados na representa c ao WKT de uma cole c ao de an eis ou valores LineString fechados. Estes valores podem se interceptar. OMySQL ainda n ao implementou estas fun c oes: BdPolyFromText(wkt,srid) Constr oi um valor Polygon a partir de um valor MultiLineString no formato WKT contendo uma cole c ao arbitr aria de valores LineString fechados. BdMPolyFromText(wkt,srid) Constr oi um valor MultiPolygon a partir de um valor MultiLineString no formato WKT contendo uma cole c ao arbitr aria de vlaores LineString fechados.
741
GeomFromWKB(wkb,srid) GeometryFromWKB(wkt,srid) Constr oi um valor geometria de qualquer tipo usando seua representa c ao WKB e SRID. PointFromWKB(wkb[,srid]) Constr oi um valor POINT usando sua representa c ao WKB e SRID. LineFromWKB(wkb[,srid]) LineStringFromWKB(wkb[,srid]) Constr oi um valor LINESTRING usando sua representa c ao WKB e SRID. PolyFromWKB(wkb[,srid]) PolygonFromWKB(wkb[,srid]) Constr oi um valor POLYGON usando sua representa c ao WKB e SRID. MPointFromWKB(wkb[,srid]) MultiPointFromWKB(wkb[,srid]) Constr oi um valor MULTIPOINT usando sua representa c ao WKB e SRID. MLineFromWKB(wkb[,srid]) MultiLineStringFromWKB(wkb[,srid]) Constr oi um valor MULTILINESTRING usando sua representa c ao WKB e SRID. MPolyFromWKB(wkb[,srid]) MultiPolygonFromWKB(wkb[,srid]) Constr oi um valor MULTIPOLYGON usando sua representa c ao WKB e SRID. GeomCollFromWKB(wkb[,srid]) GeometryCollectionFromWKB(wkt[,srid]) Constr oi um valor GEOMETRYCOLLECTION usando sua representa c ao WKB e SRID. A especica c ao do OpenGIS tamb em descreve fun c oes adicionais para constru c ao de valores Polygon ou MultiPolygon baseados em uma representa c ao WKB de uma cole c ao de an eis ou valores de LineString fechadas. Estes valores podem se interceptar. O MySQL ainda n ao implementou estas fun c oes: BdPolyFromWKB(wkb,srid) Constr oi um valor Polygon a partir de um valor MultiLineString no formato WKB contendo uma cole c ao arbitr aria de valores LineString fechados. BdMPolyFromWKB(wkb,srid) Constr oi um valor MultiPolygon a partir de um valor MultiLineString no formato WKB contendo uma cole c ao arbitr aria de valores LineString fechados.
742
O resultado destas fun c oes s ao valores BLOBs contendo representa c oes WKB de valores de geometria sem SRID. Os resultados destas fun c oes podem ser substituidos como primeiro argumento para a fam ilia de fun c oes GeomFromWKB(). Point(x,y) Constr oi um Point WKB usando suas cooerdenadas. MultiPoint(pt1,pt2,...) Constr oi um MultiPoint WKB usando WKBPoints. Quando o argumento n ao e Point WKB, o valor de retorno e NULL. LineString(pt1,pt2,...) Constr oi um LineString WKB de um n umero de Points WKB. Quando o argumento n ao e Point WKB, o valor de retorno e NULL. Quando o n umero de Points e menor que dois o valor de retorno e NULL. MultiLineString(WKBLineString,WKBLineString,...,WKBLineString) Constr oi um MultiLineString WKB usando LineStrings WKB. Quando o argumento n ao e LineString WKB, o valor de retorno e NULL. Polygon(ls1,ls2,...) Constr oi um Polygon de um n umero de LineStrings WKB. Quando o arguemnto n ao representa o WKB de um LinearRing (ex. LineString n ao fechada e simples) o valor de retorno e NULL. MultiPolygon(poly1,poly2,...) Constr oi um MultiPolygon WKB de um conjunto de Polygons WKB. Quando o argumento n ao e um Polygon WKB, o valor de retorno e NULL. GeometryCollection(WKBGeometry,WKBGeometry,..,WKBGeometry) Constucts a GeometryCollection WKB. Quando o argumento n ao e uma representa c ao WKB bem formada de uma geometria, o valor de retorno e NULL.
743
Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE geom DROP pt; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>
744
para o servidor. No entanto, existem diversos modos de satisfazer esta exig encia. Por exemplo: Inserindo um Point(1,1) com sintaxe literal hexa: Uma aplica c ao ODBC pode enviar uma representa c ao WKB, ligando como um argumento do tipo BLOB: INSERT INTO geom VALUES (GeomFromWKB(?)); Outra interfaces de programa c ao podem suportar um mecanimo de placeholder similar. Em um programa C, voc e pode fazer um escape de um valor bin ario usando mysql_ real_escape_string() e incluindo o resultado em string de consulta que e enviada ao servidor. Veja Se c ao 12.1.3.43 [mysql_real_escape_string()], P agina 812.
745
746
Envelope(geometry g):geometry Retorna o Ret angulo de Limite M inimo (Minimum Bounding Rectangle (MBR)) para o valor de geometria g. O resultado e retornado como um polygon (poligono).
747
mysql> SELECT AsText(Envelope(GeomFromText(LineString(1 1,2 2),101))); +------------------------------------------------------+ | AsText(Envelope(GeomFromText(LineString(1 1,2 2))) | +------------------------------------------------------+ | POLYGON((1 1,2 1,2 2,1 2,1 1)) | +------------------------------------------------------+ O polygon e denido pelos pontos nos cantos da caixa que o limita: POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY)) A especica c ao OpenGIS tamb em dene as seguintes fun c oes, que o MySQL ainda n ao implementou: Boundary(g) Retorna uma geometria que e o fechamento do limite combinacional do valor da geometria g. IsEmpty(g) Retorna 1 se o valor da geometria g e a geometria vazia, 0 se ela n ao est a vazia e 1 se o argumento e NULL. Se a geometria est a vazia, ela representa um conjunto de pontos vazios. IsSimple(g) Atualmewnte esta fun c ao n ao deve ser usada. Quando implementada, seu comportamento ser a como descrito no pr oximo par agrafo. Retorna 1 se o valor da geometria g n ao tem nenhum ponto geom etrico anormal, como a interse c ao pr opria ou tangente pr opria. IsSimple retorna 0 se o argumento n ao e simples, e 1 se e NULL. A descri c ao de cada geom etrica instanci avel dada anteriormente neste cap itulo inclui a condi c ao especica que faz com que uma inst ancia desta classe seja classicada como n ao simples.
748
mysql> SELECT Y(GeomFromText(Point(56.7 53.34))); +--------------------------------------+ | Y(GeomFromText(Point(56.7 53.34))) | +--------------------------------------+ | 53.34 | +--------------------------------------+
749
| 3 | +----------------------------------------------------+ PointN(ls,n) Returna o n- esimo ponto no valor Linestring ls. mysql> SELECT AsText(PointN(GeomFromText(LineString(1 1,2 2,3 3)),2)); +-----------------------------------------------------------+ | AsText(PointN(GeomFromText(LineString(1 1,2 2,3 3)),2)) | +-----------------------------------------------------------+ | POINT(2 2) | +-----------------------------------------------------------+
StartPoint(ls) Returna o Point que e o ponto inicial do valor LineString ls. mysql> SELECT AsText(StartPoint(GeomFromText(LineString(1 1,2 2,3 3)))); +-------------------------------------------------------------+ | AsText(StartPoint(GeomFromText(LineString(1 1,2 2,3 3)))) | +-------------------------------------------------------------+ | POINT(1 1) | +-------------------------------------------------------------+ A especica c ao OpenGIS tamb em dene as seguintes fun c oes, que o MySQL ainda n ao implementou: IsRing(ls) Retorna 1 se o valor LineString ls e fechado (isto e, seus valores StartPoinnt() e EndPoint() s ao os mesmos) e e simples (n ao passa pelo mesmo ponto mais de uma vez). Retorna 0 se ls n ao e um anel, 1 se e NULL.
GLength(mls) Retorna o tamanho do valor de MultiLineString mls como um n umero e precis ao dupla. O tamanha de mls e igual a soma dos tamanhos de seus elementos. mysql> SELECT GLength(GeomFromText(MultiLineString((1 1,2 2,3 3),(4 4,5 5 +-------------------------------------------------------------------+ | GLength(GeomFromText(MultiLineString((1 1,2 2,3 3),(4 4,5 5)))) | +-------------------------------------------------------------------+ | 4.2426406871193 | +-------------------------------------------------------------------+ IsClosed(MultiLineString m):Integer IsClosed(mls) Returna 1 se o valor MultiLineString mls e fechado (isto e, os valores StartPoint() e EndPoint() s ao os mesmos para cada LineString em mls). Returna 0 se mls n ao e fechada, e 1 se for NULL. mysql> SELECT IsClosed(GeomFromText(MultiLineString((1 1,2 2,3 3),(4 4,5 +--------------------------------------------------------------------+
750
Returna como um n umero de dupla precis ao a area do valor Polygon poly, como medido em seu sistema de refer encia espacial. mysql> SELECT Area(GeomFromText(Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 +------------------------------------------------------------------------| Area(GeomFromText(Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)) +------------------------------------------------------------------------| +-------------------------------------------------------------------------
NumInteriorRings(poly) Retorna o n umero de an eis interiores no valor Polygon poly. mysql> SELECT NumInteriorRings(GeomFromText(Polygon((0 0,0 3,3 3,3 0,0 0) +------------------------------------------------------------------------| NumInteriorRings(GeomFromText(Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 +------------------------------------------------------------------------| +------------------------------------------------------------------------1 row in set (0.00 sec)
ExteriorRing(poly) Retorna o anel exterior do valor Polygon poly como uma LineString. mysql> SELECT AsText(ExteriorRing(GeomFromText(Polygon((0 0,0 3,3 3,3 0,0 +------------------------------------------------------------------------| AsText(ExteriorRing(GeomFromText(Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2 +------------------------------------------------------------------------| LINESTRING(0 0,0 3,3 3,3 0,0 0) +-------------------------------------------------------------------------
InteriorRingN(poly,n) Retorna o n- esimo anel exterior para o valor Polygon poly como uma LineString. mysql> SELECT AsText(InteriorRingN(GeomFromText(Polygon((0 0,0 3,3 3,3 0, +------------------------------------------------------------------------| AsText(InteriorRingN(GeomFromText(Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 +------------------------------------------------------------------------| LINESTRING(1 1,1 2,2 2,2 1,1 1) +------------------------------------------------------------------------A especica c ao OpenGIS tamb em dene as seguintes fun c oes, que o MySQL ainda n ao implementou:
751
Centroid(poly) O cent oide matem atico para o valor Polygon poly como um Point. O resultado n ao e garantido estar neste Polygon. PointOnSurface(poly) Returna um valor Point que esta garantidamente no valor Polygon poly.
Area(mpoly) Retorna como um n umero de precis ao dupla a area do valor MultiPolygon mpoly, como medido no sistema de refer encia espacial deste MultiPolygon. mysql> SELECT Area(GeomFromText(MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1, +------------------------------------------------------------------------| Area(GeomFromText(MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1, +------------------------------------------------------------------------| +------------------------------------------------------------------------A especica c ao OpenGIS tamb em dene as seguintes fun c oes, que o MySQL ainda n ao implementou: Centroid(mpoly) O centr oide matem atico para este MultiPolygon como um Point. O resultado n ao e garantido estar neste MultiPolygon. PointOnSurface(mpoly) Retorna um valor Point que e garantido estar no valor MultiPolygon mpoly.
NumGeometries(gc) Retorna o n umero de geometrias no valor GeometryCollection gc. mysql> SELECT NumGeometries(GeomFromText(GeometryCollection(Point(1 1),Li +------------------------------------------------------------------------| NumGeometries(GeomFromText(GeometryCollection(Point(1 1),LineString(2 2 +------------------------------------------------------------------------| +-------------------------------------------------------------------------
GeometryN(gc,n) Retorna o n- esima geometria no valor GeometryCollection gc. O n umero de geometrias come ca em 1. mysql> SELECT AsText(GeometryN(GeomFromText(GeometryCollection(Point(1 1) +------------------------------------------------------------------------| AsText(GeometryN(GeomFromText(GeometryCollection(Point(1 1),LineString( +-------------------------------------------------------------------------
752
| POINT(1 1) +------------------------------------------------------------------------Nota: Fun c oes para tipos de geometrias espec icas retornam NULL se a geomtria passada e do tipo de geometria errado. Por exemplo Area() retorna NULL se o tipo do objeto n ao e nem Polygon nem MultiPolygon.
10.5.3 Fun co es Que Criam Novas Geometrias de Outras Existentes 10.5.3.1 Fun co es de Geometria Que Produzem Novas Geometrias
Na se c ao Se c ao 10.5.2 [Geometry property functions], P agina 746 n os j a discutimos algumas fun c oes que podem construir novas geometrias se outras existentes: Envelope(g) StartPoint(ls) EndPoint(ls) PointN(ls,n) ExteriorRing(poly) InteriorRingN(poly,n) GeometryN(gc,n)
753
ConvexHull(g) Retorna uma geometria que representa a casca convexa de do valor da geometria g.
10.5.4 Fun co es Para Testar Rela c oes Espaciais Entre Objetos Geom etricos
A fun c ao descrita nesta se c ao toma duas geometrias como par ametros de entrada e retorna uma rela c ao qualitativa ou quantitativa entre eles.
10.5.5 Rela c oes de Ret angulo de Limite M inimo (Minimal Bounding Rectangles - MBR) em Geometrias
O MySQL fornece algumas fun c oes que podem testar rela c oes entre ret angulos de limite m inimo de duas geometrias g1 e g2. Elas incluem: MBRContains(g1,g2) Retorna 1 ou 0 para indicar se o Ret angulo de Limite M inimo de g1 cont em o Ret angulo de Limite Minimo de g2. mysql> SET @g1 = GeomFromText(Polygon((0 0,0 3,3 3,3 0,0 0))); mysql> SET @g2 = GeomFromText(Point(1 1)); mysql> SELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1); ----------------------+----------------------+ | MBRContains(@g1,@g2) | MBRContains(@g2,@g1) | +----------------------+----------------------+ | 1 | 0 | +----------------------+----------------------+ MBRWithin(g1,g2) Retorna 1 ou 0 para indicar se o Ret angulo de Limite M inimo de g1 esta dentro do Ret angulo de Limite M inimo de g2. mysql> SET @g1 = GeomFromText(Polygon((0 0,0 3,3 3,3 0,0 0))); mysql> SET @g2 = GeomFromText(Polygon((0 0,0 5,5 5,5 0,0 0))); mysql> SELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1); +--------------------+--------------------+ | MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) | +--------------------+--------------------+ | 1 | 0 | +--------------------+--------------------+ MBRDisjoint(g1,g2) Retorna 1 ou 0 para indicar se o Ret angulo de Limite M inimo de duas geometrias g1 e g2 n ao fazem interse c ao. MBREqual(g1,g2) Retorna 1 ou 0 para indicar se o Ret angulo de Limite M inimo de duas geometrias g1 e g2 s ao o mesmo.
754
MBRIntersects(g1,g2) Retorna 1 ou 0 para indicar se o Ret angulo de Limite M inimo de duas geometrias g1 e g2 se interseptam. MBROverlaps(g1,g2) Retorna 1 ou 0 para indicar se o Ret angulo de Limite M inimo de duas geometrias g1 e g2 se sobrep oe. MBRTouches(g1,g2) Retorna 1 ou 0 para indicar se o Ret angulo de Limite M inimo de duas geometrias g1 e g2 se tocam.
755
Touches(g1,g2) Retorna 1 ou 0 para indicar se g1 spatially touches g2, ou n ao. Duas geometrias se tocam espacialmente se o interiro de ambas geometrias n ao se interseptam, mas o limite de uma delas intersepta o limite ou o interior das geometrias. Within(g1,g2) Retorna 1 ou 0 para indicar se g1 est a espacialmente dentro da g2, ou n ao. Distance(g1,g2) Retorna como um n umero de precis ao dupla, a menor dist ancia entre quaiquer dois pontos nas duas geometrias. Related(g1,g2,pattern_matrix) Retorna 1 ou 0 indicando se o relacionamento espacial especicado por matriz_ padr~ ao existe entre g1 e g2 ou n ao. Retorna 1 se os argumentos s ao NULL. A matriz padr ao e uma string. Sua especica c ao ser a indicada aqui quando esta fun c ao estiver implementada.
756
Com ALTER TABLE: mysql> ALTER TABLE geom (ADD SPATIAL KEY(g)); Com DROP INDEX: mysql> DROP INDEX sp_index ON geom; Example: Suponha que uma tabela geom cont em mais de 32000 geometrias, que est ao armazenadas na coluna g do tipo GEOMETRY. A tabela tamb em tem um campo AUTO_ INCREMENT fid, armazenando valores dos IDs de objetos. mysql> SHOW FIELDS FROM geom; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | fid | int(11) | | PRI | NULL | auto_increment | | g | geometry | | | | | +-------+----------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> SELECT COUNT(*) FROM geom; +----------+ | count(*) | +----------+ | 32376 | +----------+ 1 row in set (0.00 sec) Para adicionar um indice espacial na coluna g, use esta instru c ao: mysql> ALTER TABLE geom ADD SPATIAL INDEX(g); Query OK, 32376 rows affected (4.05 sec) Records: 32376 Duplicates: 0 Warnings: 0
O otimizador investiga se os indices espaciais dispon iveis podem ser envolvidos na busca se uma consulta com uma fun c ao como MBRContains() ou MBRWithin() na cl ausula WHERE e executada. Por exemplo, suponhamos que queremos encontrar todos os objetos que est ao no ret angulo dado: mysql> SELECT fid,AsText(g) FROM geom WHERE mysql> MBRContains(GeomFromText(Polygon((30000 15000,31000 15000,31000 16000,30000 +-----+----------------------------------------------------------------------------| fid | AsText(g) +-----+----------------------------------------------------------------------------| 21 | LINESTRING(30350.4 15828.8,30350.6 15845,30333.8 15845,30333.8 15828.8) | 22 | LINESTRING(30350.6 15871.4,30350.6 15887.8,30334 15887.8,30334 15871.4) | 23 | LINESTRING(30350.6 15914.2,30350.6 15930.4,30334 15930.4,30334 15914.2) | 24 | LINESTRING(30290.2 15823,30290.2 15839.4,30273.4 15839.4,30273.4 15823) | 25 | LINESTRING(30291.4 15866.2,30291.6 15882.4,30274.8 15882.4,30274.8 15866.2) | 26 | LINESTRING(30291.6 15918.2,30291.6 15934.4,30275 15934.4,30275 15918.2)
757
| 249 | LINESTRING(30337.8 15938.6,30337.8 15946.8,30320.4 15946.8,30320.4 15938.4) | 1 | LINESTRING(30250.4 15129.2,30248.8 15138.4,30238.2 15136.4,30240 15127.2) | 2 | LINESTRING(30220.2 15122.8,30217.2 15137.8,30207.6 15136,30210.4 15121) | 3 | LINESTRING(30179 15114.4,30176.6 15129.4,30167 15128,30169 15113) | 4 | LINESTRING(30155.2 15121.4,30140.4 15118.6,30142 15109,30157 15111.6) | 5 | LINESTRING(30192.4 15085,30177.6 15082.2,30179.2 15072.4,30194.2 15075.2) | 6 | LINESTRING(30244 15087,30229 15086.2,30229.4 15076.4,30244.6 15077) | 7 | LINESTRING(30200.6 15059.4,30185.6 15058.6,30186 15048.8,30201.2 15049.4) | 10 | LINESTRING(30179.6 15017.8,30181 15002.8,30190.8 15003.6,30189.6 15019) | 11 | LINESTRING(30154.2 15000.4,30168.6 15004.8,30166 15014.2,30151.2 15009.8) | 13 | LINESTRING(30105 15065.8,30108.4 15050.8,30118 15053,30114.6 15067.8) | 154 | LINESTRING(30276.2 15143.8,30261.4 15141,30263 15131.4,30278 15134) | 155 | LINESTRING(30269.8 15084,30269.4 15093.4,30258.6 15093,30259 15083.4) | 157 | LINESTRING(30128.2 15011,30113.2 15010.2,30113.6 15000.4,30128.8 15001) +-----+----------------------------------------------------------------------------20 rows in set (0.00 sec) Agora veriquemos o modo que esta consulta e executada, usando EXPLAIN:
mysql> EXPLAIN SELECT fid,AsText(g) FROM geom WHERE mysql> MBRContains(GeomFromText(Polygon((30000 15000,31000 15000,31000 16000,30000 +----+-------------+-------+-------+---------------+------+---------+------+------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | +----+-------------+-------+-------+---------------+------+---------+------+------+| 1 | SIMPLE | geom | range | g | g | 32 | NULL | 50 | +----+-------------+-------+-------+---------------+------+---------+------+------+1 row in set (0.00 sec) Agora veriquemos o que aconteceria se n os n ao tiv essemos indices espaciais:
mysql> EXPLAIN SELECT fid,AsText(g) FROM geom IGNORE INDEX (g) WHERE mysql> MBRContains(GeomFromText(Polygon((30000 15000,31000 15000,31000 16000,30000 +----+-------------+-------+------+---------------+------+---------+------+-------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | +----+-------------+-------+------+---------------+------+---------+------+-------+| 1 | SIMPLE | geom | ALL | NULL | NULL | NULL | NULL | 32376 | +----+-------------+-------+------+---------------+------+---------+------+-------+1 row in set (0.00 sec) Vamos executar a consulta acima, ignorando a chave espacial que temos:
mysql> SELECT fid,AsText(g) FROM geom IGNORE INDEX (g) WHERE mysql> MBRContains(GeomFromText(Polygon((30000 15000,31000 15000,31000 16000,30000 +-----+----------------------------------------------------------------------------| fid | AsText(g) +-----+----------------------------------------------------------------------------| 1 | LINESTRING(30250.4 15129.2,30248.8 15138.4,30238.2 15136.4,30240 15127.2) | 2 | LINESTRING(30220.2 15122.8,30217.2 15137.8,30207.6 15136,30210.4 15121) | 3 | LINESTRING(30179 15114.4,30176.6 15129.4,30167 15128,30169 15113) | 4 | LINESTRING(30155.2 15121.4,30140.4 15118.6,30142 15109,30157 15111.6) | 5 | LINESTRING(30192.4 15085,30177.6 15082.2,30179.2 15072.4,30194.2 15075.2)
758
| 6 | LINESTRING(30244 15087,30229 15086.2,30229.4 15076.4,30244.6 15077) | 7 | LINESTRING(30200.6 15059.4,30185.6 15058.6,30186 15048.8,30201.2 15049.4) | 10 | LINESTRING(30179.6 15017.8,30181 15002.8,30190.8 15003.6,30189.6 15019) | 11 | LINESTRING(30154.2 15000.4,30168.6 15004.8,30166 15014.2,30151.2 15009.8) | 13 | LINESTRING(30105 15065.8,30108.4 15050.8,30118 15053,30114.6 15067.8) | 21 | LINESTRING(30350.4 15828.8,30350.6 15845,30333.8 15845,30333.8 15828.8) | 22 | LINESTRING(30350.6 15871.4,30350.6 15887.8,30334 15887.8,30334 15871.4) | 23 | LINESTRING(30350.6 15914.2,30350.6 15930.4,30334 15930.4,30334 15914.2) | 24 | LINESTRING(30290.2 15823,30290.2 15839.4,30273.4 15839.4,30273.4 15823) | 25 | LINESTRING(30291.4 15866.2,30291.6 15882.4,30274.8 15882.4,30274.8 15866.2) | 26 | LINESTRING(30291.6 15918.2,30291.6 15934.4,30275 15934.4,30275 15918.2) | 154 | LINESTRING(30276.2 15143.8,30261.4 15141,30263 15131.4,30278 15134) | 155 | LINESTRING(30269.8 15084,30269.4 15093.4,30258.6 15093,30259 15083.4) | 157 | LINESTRING(30128.2 15011,30113.2 15010.2,30113.6 15000.4,30128.8 15001) | 249 | LINESTRING(30337.8 15938.6,30337.8 15946.8,30320.4 15946.8,30320.4 15938.4) +-----+----------------------------------------------------------------------------20 rows in set (0.46 sec) Quando o indice n ao e usado, o tempo de execu c ao para esta consulta cresce de 0.00 segundos para 0.46 segundos. Nas ver oes futuras, indices espaciais tamb em ser ao usados para otimizar outras fun c oes. Veja Se c ao 10.5.4 [Functions for testing spatial relations between geometric objects], P agina 753.
759
A fun c ao OpenGIS Length() em LineString e MultiLineString atualmente devem ser chamadas como GLength() no MySQL. O problema e que ela conita com a fun c ao SQL existente Length() que calcula o tamanho de um valor string e algumas vezes n ao e poss ivel distinguir se a fun c ao foi chamada co contexto textual ou espacial. N os precisamos resolver isto de algum modo, ou escolher um outro nome de fun c ao.
760
761
At present, MySQL only preserves context for the default database. That is, if you say USE dbname within a procedure, the original default database is restored upon routine exit. A routine inherits the default database from the caller, so generally routines should either issue a USE dbname statement, or specify all tables with an explicit database reference, e.g. dbname.tablename. MySQL supports the very useful extension that allows the use of regular SELECT statements (that is, without using cursors or local variables) inside a stored procedure. The result set of such a query is simply sent directly to the client. Multiple SELECT statements generate multiple result sets, so the client must use a MySQL client library that supports multiple result sets. This means the client must use a client library from a version of MySQL at least as recent as 4.1. This following section describes the syntax used to create, alter, drop, and query stored procedures and functions.
11.1.1 Maintaining Stored Procedures 11.1.1.1 CREATE PROCEDURE and CREATE FUNCTION
CREATE PROCEDURE sp_name ([parameter[,...]]) [characteristic ...] routine_body CREATE FUNCTION sp_name ([parameter[,...]]) [RETURNS type] [characteristic ...] routine_body parameter: [ IN | OUT | INOUT ] param_name type type: Any valid MySQL data type characteristic: LANGUAGE SQL | [NOT] DETERMINISTIC | SQL SECURITY {DEFINER | INVOKER} | COMMENT string routine_body: Valid SQL procedure statement(s) The RETURNS clause may be specied for a only FUNCTION. It is used to indicate the return type of the function, and the function body must contain a RETURN value statement. The parameter list enclosed within parentheses must always be present. If there are no parameters, an empty parameter list of () should be used. Each parameter is an IN parameter by default. To specify otherwise for a parameter, use the keyword OUT or INOUT before the parameter name. Specifying IN, OUT or INOUT is only valid for a PROCEDURE.
762
The CREATE FUNCTION statement is used in earlier versions of MySQL to support UDFs (User Dened Functions). Veja Se c ao 14.2 [Adding functions], P agina 895. UDFs continue to be supported, even with the existence of stored functions. A UDF can be regarded as an external stored function. However, do note that stored functions share their namespace with UDFs. A framework for external stored procedures will be introduced in the near future. This will allow you to write stored procedures in languages other than SQL. Most likely, one of the rst languages to be supported will be PHP, as the core PHP engine is small, thread-safe and can easily be embedded. As the framework will be public, it is expected that many other languages will also be supported. A function is considered deterministic if it always returns the same result for the same input parameters, and not deterministic otherwise. The optimizer can use of this fact. Currently, the DETERMINISTIC characteristic is accepted, but not yet used. The SQL SECURITY characteristic can be used to specify whether the routine should be executed using the permissions of the user who creates the routine, or the user who invokes it. The default value is DEFINER. This feature is new in SQL:2003. MySQL does not yet use the GRANT EXECUTE privilege. So for now, if a procedure p1() mentions table t1, the caller must have privileges on table t1 in order to call procedure p1() successfully. MySQL stores the SQL_MODE settings in eect at the time a routine is created, and will always execute routines with these settings in force. The COMMENT clause is a MySQL extension, and may be used to describe the stored procedure. This information is displayed by the SHOW CREATE PROCEDURE and SHOW CREATE FUNCTION statements. MySQL allows routines to contain DDL statements (such as CREATE and DROP) and SQL transaction statements (such as COMMIT). This is not required by the standard and is therefore implementation-specic. NOTE: Currently, stored FUNCTIONs may not contain references to tables. Please note that this includes some SET statements, but excludes some SELECT statements. This limitation will be lifted as soon as possible. The following is an example of a simple stored procedure that uses an OUT parameter. The example uses the mysql client delimiter command to change the statement delimiter prior to dening the procedure. This allows the ; delimiter used in the procedure body to be passed through to the server rather than being interpreted by mysql itself. mysql> delimiter | mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM t; -> END -> | Query OK, 0 rows affected (0.00 sec) mysql> CALL simpleproc(@a)| Query OK, 0 rows affected (0.00 sec)
763
mysql> SELECT @a| +------+ | @a | +------+ | 3 | +------+ 1 row in set (0.00 sec) The following is an example of a function that takes a parameter, performs an operation using an SQL function, and returns the result: mysql> delimiter | mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) -> RETURN CONCAT(Hello, ,s,!); -> | Query OK, 0 rows affected (0.00 sec) mysql> SELECT hello(world)| +----------------+ | hello(world) | +----------------+ | Hello, world! | +----------------+ 1 row in set (0.00 sec)
764
11.1.3 CALL
CALL sp_name([parameter[,...]]) The CALL command is used to invoke a routine that was dened previously with CREATE PROCEDURE.
765
766
767
Query OK, 0 rows affected (0.00 sec) mysql> SELECT @x| +------+ | @x | +------+ | 3 | +------+ 1 row in set (0.00 sec) Notice that @x is 3, which shows that MySQL executed to the end of the procedure. If the line DECLARE CONTINUE HANDLER FOR 23000 SET @x2 = 1; had not been present, MySQL would have taken the default (EXIT) path after the second INSERT failed due to the PRIMARY KEY constraint, and SELECT @x would have returned 2.
11.1.8 Cursors
Simple cursors are supported inside stored procedures and functions. The syntax is as in embedded SQL. Cursors are currently asensitive, read-only, and non-scrolling. Asensitive means that the server may or may not make a copy of its result table. For example: CREATE PROCEDURE curdemo() BEGIN DECLARE done INT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLSTATE 02000 SET done = 1; DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1; DECLARE cur2 CURSOR FOR SELECT i FROM test.t2; DECLARE a CHAR(16); DECLARE b,c INT; OPEN cur1; OPEN cur2; REPEAT FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF NOT done THEN IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END IF; UNTIL done END REPEAT; CLOSE cur1; CLOSE cur2;
768
END
11.1.9.1 IF Statement
IF search_condition THEN statement(s) [ELSEIF search_condition THEN statement(s)] ... [ELSE statement(s)] END IF IF implements a basic conditional construct. If the search_condition evaluates to true, the corresponding SQL statement is executed. If no search_condition matches, the statement in the ELSE clause is executed. Please note that there is also an IF() function. Veja Se c ao 6.3.1.4 [Control ow functions], P agina 510.
769
770
label1: LOOP SET p1 = p1 + 1; IF p1 < 10 THEN ITERATE label1; END IF; LEAVE label1; END LOOP label1; SET @x = p1; END
771
begin_label and end_label must be the same, if both are specied. For example: CREATE PROCEDURE dowhile() BEGIN DECLARE v1 INT DEFAULT 5; WHILE v1 > 0 DO ... SET v1 = v1 - 1; END WHILE; END
772
773
774
enum enum_field_types tipo O tipo do campo. O valor tipo pode ser um dos seguintes: Valou tipo Descri c ao do tipo FIELD_TYPE_TINY campo TINYINT FIELD_TYPE_SHORT campo SMALLINT FIELD_TYPE_LONG campo INTEGER FIELD_TYPE_INT24 campo MEDIUMINT FIELD_TYPE_LONGLONG campo BIGINT FIELD_TYPE_DECIMAL campo DECIMAL ou NUMERIC FIELD_TYPE_FLOAT campo FLOAT FIELD_TYPE_DOUBLE campo DOUBLE ou REAL FIELD_TYPE_TIMESTAMP campo TIMESTAMP FIELD_TYPE_DATE campo DATE FIELD_TYPE_TIME campo TIME FIELD_TYPE_DATETIME campo DATETIME FIELD_TYPE_YEAR campo YEAR FIELD_TYPE_STRING campo CHAR FIELD_TYPE_VAR_STRING campo VARCHAR FIELD_TYPE_BLOB campo BLOB ou TEXT (usa max_length para determinar o tamanho m aximo) FIELD_TYPE_SET campo SET FIELD_TYPE_ENUM campo ENUM FIELD_TYPE_NULL campo tipo-NULL FIELD_TYPE_CHAR Deprecado; use FIELD_TYPE_TINY Voc e pode utilizar a macro IS_NUM() para testar se uma campo tem um tipo num erico. Passe o valor tipo para IS_NUM() e ele ir a avaliar como VERDADEIRO (TRUE) se o campo for num erico: if (IS_NUM(campo->tipo)) printf("Campo e num erico\n"); unsigned int length A largura de um campo, como especicado nas deni c oes da tabela. unsigned int max_length A largura m axima do campo no conjunto de resultados (O tamanho do maior valor do campo para os registro no resultado atual). Se voc e utilizar mysql_ store_result() ou mysql_list_fields(), ele contem o tamanho m aximo para o campo. Se voc e utiliza mysql_use_result(), o valor desta vari avel e zero. unsigned int param Diferentes par ametros bin arios para o campo. O valor de param pode ter zero ou mais dos seguintes conjunto de bits: Valor param Descri c ao param NOT_NULL_FLAG Campo n ao pode ser NULL PRI_KEY_FLAG Campo e parte de uma chave prim aria UNIQUE_KEY_FLAG Campo e parte de uma chave u nica MULTIPLE_KEY_FLAG Campo e parte de uma chave n ao u nica
775
UNSIGNED_FLAG Campo tem o atributo UNSIGNED ZEROFILL_FLAG Campo tem o atributo ZEROFILL BINARY_FLAG Campo tem o atributo BINARY AUTO_INCREMENT_FLAG Campo tem o atributo AUTO_INCREMENT ENUM_FLAG Campo e um ENUM (obsoleto) SET_FLAG Campo e um SET (obsoleto) BLOB_FLAG Campo e um BLOB ou TEXT (obsoleto) TIMESTAMP_FLAG Campo e um TIMESTAMP (obsoleto) Uso dos par ametros BLOB_FLAG, ENUM_FLAG, SET_FLAG, e TIMESTAMP_FLAG foram obsoletos porque eles indicavam o tipo de um campo e n ao um prefer atributo do tipo. E ivel testar campo->tipo para FIELD_TYPE_BLOB, FIELD_TYPE_ENUM, FIELD_TYPE_SET, ou FIELD_TYPE_TIMESTAMP. O seguinte exemplo ilustra o uso t ipico do valor param: if (campo->param & NOT_NULL_FLAG) printf("Campo n~ ao pode ser nulo\n"); Voc e pode usar as seguintes macros para determinar o status dos valores param: Status param Descri c ao IS_NOT_NULL(param) Verdadeiro se se este campo e denido como NOT NULL IS_PRI_KEY(param) Verdadeiro de este campo e uma chave prim aria IS_BLOB(param) Verdadeiro se este campo e um BLOB ou TEXT (obsoleto; teste campo->tipo) unsigned int decimals O n umero de decimais para um campo num erico.
776
mysql data seek() mysql debug() mysql drop db() mysql dump debug info() mysql eof()
Busca por uma n umero de linha arbitr ario em um conjunto de resultados de uma consulta. Faz um DBUG_PUSH com a string dada. Apaga um banco de dados; Esta fun c ao esta obsoleta; utiliza o comando SQL DROP DATABASE. Faz o servidor escrever informa c oes de depoura c ao no log. Determina quando a ulitma linha de um conjunto de resultados foi lida. Esta fun c ao foi obsoleta; Utilize mysql_ errno() ou mysql_error() Retorna o n umero de erro para a fun c ao MySQL chamada mais recentemente. Retorna a mensagem de erro para fun c ao MySQL chamada mais recentemente. Escapa caracteres especiais em uma string para ser usada em uma instru c ao SQL. Retorna o tipo do pr oximo campo na tabela. Retorna o tipo de um campo da tabela, dado um n umero do campo. Retorna um vetor de todas as estruturas do campo. Retorna o tamanho de todas as colunas na linha atual. Busca o pr oximo registro no conjunto de resultados. Coloca o cursor da coluna em uma coluna espec ica. Retorna o n umero de colunas resultantes da consulta mais recente. Retorna a posi c ao do cursos de campos usado pelo u ltimo mysql_fetch_field(). Libera a mem oria usada por um conjunto de resultados. Retorna a vers ao do cliente. Retorna uma string descrevendo a conex ao. Retorna o n umero da vers ao do servidor como um inteiro (Novo na vers ao 4.1) Retorna a vers ao do protovolo usado para a conex ao. Retorna o n umero da vers ao do servidor.
mysql errno() mysql error() mysql escape string() mysql fetch eld() mysql fetch eld direct() mysql fetch elds() mysql fetch lengths() mysql fetch row() mysql eld seek() mysql eld count() mysql eld tell() mysql free result() mysql get client info() mysql get host info() mysql get server version() mysql get proto info() mysql get server info()
777
mysql info() mysql init() mysql insert id() mysql kill() mysql list dbs() mysql list elds() mysql list processes() mysql list tables() mysql num elds() mysql num rows() mysql options() mysql ping() mysql query() mysql real connect() mysql real escape string()
Retorna informa c ao sobre a consulta executada mais recentemente. Obtem ou inicializa uma estrutura MYSQL. Retorna o ID gerado para uma coluna AUTO_INCREMENT pela consulta anterior. Mata uma thread dada. Retorna o nome do banco de dados correspondente a uma express ao regular. retorna nome de campos coincidindo com uma express ao regular. Retorna uma lista das threads atuais do servidor. Retorna os nomes de tabelas correspondente a uma express ao regular. Retorna o n umero de coluans em um conjunto de resultados. Retorna o n umero de linhas em um conjunto de resultados. Dene op c oes de conex ao para mysql_connect(). Verica se a conex ao ao servidor est a funcionando, reconectando se necess ario. Executa uma consulta SQL especicada com uma string terminada com null. Conecta ao servidor MySQL. Escapa caracteres especiais em uma string para ser utilizada em uma instru c ao SQL, olhando na conta o conjunto de caracteres atual da conex ao Executa uma consulta SQL especicada como uma string xa. Diz ao servidor pra recarregar a tabela de permiss oes Busca por um oset de linha no resultado, usando o valor retornado de mysql_row_tell(). Retorna a posi c ao dio cursor de linhas. Seleciona um banco de dados. Dene uma op c ao para a conex ao (como multistatements).
mysql real query() mysql reload() mysql row seek() mysql row tell() mysql select db() mysql set server option()
778
mysql sqlstate() mysql shutdown() mysql stat() mysql store result() mysql thread id() mysql thread safe() mysql use result() mysql commit() mysql rollback() mysql autocommit() mysql more results() mysql next result()
Retorna o c odigo de erro SQLSTATE para o u ltimo erro. Desliga o servidor de banco de dados. Retorna o status do servidor como uma string. Recupera um resultado completo para o cliente. Retorna a identica c ao da thread atual. Retorna 1 se o cliente foi compilado como thread-safe. Inicia uma resultado recuperado registro por registro. Faz um commits na transa c ao (novo na vers ao 4.1). Faz um roll back na transa c ao (novo na vers ao 4.1). Muda o modo autocommit em ligado/desligado (novo na vers ao 4.1). Verica se n ao existem mais resultados (novo na vers ao 4.1).
Retorna/Inicia o pr oximo resultado em execu c oes consultas m ultiplas (inovo na vers ao 4.1). Para se conectar ao servidor, chame mysql_init() para iniciar um manipulador de conex ao, ent ao chame mysql_real_connect() com este manipulador (com informa c oes de nome de m aquina, usu arios e senha). Conectado, mysql_real_connect() dene o par ametro reconnect (parte da estrutura MYSQL) para um valor de 1. Este par ametro indica, no evento que uma consulta n ao pode ser realizada por perda de conex ao, para tentar reconectar ao servidor ao antes de desistir. Quando n ao precisar mais da conex ao, chame mysql_ close() para termin a-la. Enquanto a conex ao estiver ativa, o cliente pode enviar consultas SQL para o servidor usando mysql_query() ou mysql_real_query(). A diferen ca entre os dois e que mysql_ query() espera que a consulta seja especicada como uma string terminada em null, enquanto mysql_real_query() espera um string de tamanho xa. Se a string conter dados bin arios (a qual pode incluir bytes null), voc edeve usar mysql_real_query(). Para cada consulta n ao-SELECT (por exemplo, INSERT, UPDATE, DELETE), voc e pode descobrir quantas linhas foram alteradas (afetadas) chamando mysql_affected_rows(). Para consultas SELECT, voc e retorna os registros selecionados como um resultado. (Note que algumas intru c oes s ao como a SELECT ao retornar registros. Elas incluem SHOW, DESCRIBE e EXPLAIN. elas devem ser tratadas da mesma maneira que instru c oes SELECT.) Existem dois modos para um cliente processae o resultado. Um mode e recuperar todo o resultado de uma vez chamando mysql_store_result(). Esta fun c ao busca no servidor todas as linhas retornadas pela consulta e as armazena no cliente. O segundo modo e o cliente iniciar um retorno do resultado registro por registro chamando mysql_use_result(). Esta fun c ao inicia o retorno, mas n ao busca realmente nenhuma linha do servidor. Em ambos os casos, acesse registros chamando mysql_fetch_row(). Com mysql_store_ result(), mysql_fetch_row() acessa registros que j a tenham sido buscado do servidor. Com mysql_use_result(), mysql_fetch_row() recupera, na verdade, o registro do servi-
779
dor. Informa c oes sobre o tamanho dos dados em cada registro e dispon ivel pela chamada mysql_fetch_lengths(). Depois de nalizar o uso do resultado, chame mysql_free_result() para liberar a mem oria usada por ele. Os dois mecanismos de recupera c ao s ao complementares. Programas clientes devem escolher a abordagem mais apropriada para suas necessidades. Na pr atica, clientes tendem a utilizar mysql_store_result(). Uma vantagem de mysql_store_result() e que pelo fato de todos os registros serem trazidos para o cliente, voc e n ao s o pode acessar registros sequencialmente, mas tamb em pode mover para tarz e para frente no resultado utilizando mysql_data_seek() ou mysql_ row_seek() para altera a posi c ao atual do registro no resultado. Voc e tamb em pode saber quantas linhas existem chamando mysql_num_rows(). Por outro lado, a necessidade de mem oria para mysql_store_result() pode ser muito alta para resultados grandes e voc e encontrar a como mais facilidade condi c oes de estouro de mem oria. Uma vantagem de mysql_use_result() e que o clientes exige menos mem oria para o resultado porque ele mantem apenas um registro por vez (por haver menor sobrecarga de aloca c ao, mysql_use_result() pode ser mais r apido). As desvantagens s ao que voc e deve processar cada registro rapidamente para evitar prender o servidor, voc e n ao tem acesso aleat orio aos registros no resultado (voc e s o pode acess a-los sequencialmente) e voc e n ao sabe quantos registros existem no resultado at e que voc e recupere todos eles. Al em disso, voc e deve recuperar todos os registros mesmo que voc e j a tenham encontrado a informa c ao que procura antes do nalizar o conjunto de resultados. A API torna poss ivel para os clientes responder apropriadamente as consultas (recuperando somente os regiostros necess arios) sem saber se a consulta e uma instru c ao SELECT ou n ao. Voc e pode fazer isto chamando mysql_store_result() depois de cada mysql_query() (ou mysql_real_query()). Se o resultado for obtido com sucesso, a consulta foi um SELECT e voc e pode ler os registros. Se a obten c ao do resultado falhar, chame mysql_field_count() para determinar se o resultado era o esperado. Se mysql_field_count() retornar zero, a consulta n ao retornou nenhum dado (indicando que ela era um INSERT, UPDATE, DELETE, etc.), e n ao era esperado que retornasse registros. Se mysql_field_count() e diferente de zero, a consulta deveria retornar registros, mas n ao o fez. Isto indica que a consulta foi um SELECT que falhou. Veja a descri c ao de mysql_field_count() para um exemplo de como deve ser feito. mysql_store_result() e mysql_use_result() permitem que voc e obtenha informa c ao sobre os campos que montam o resultado (o n umero de campos, os seus nome e tipos, etc.) Voc e pode acessar informa c oes de campo sequencialmente dentro dos registros chamando mysql_fetch_field() repetidamente, ou pelo n umero do campo dentro do registro chamando mysql_fetch_field_direct(). A posi c ao atual do cursor de campos pode ser alterada cahamando mysql_field_seek(). Denir o cursor de campo afeta chamadas subsequentes de mysql_fetch_field(). Voc e tamb em pode conseguir informa c oes de todos os campos de uma s o vez chamando mysql_fetch_fields(). Para detectar e relatar problemas, o MySQL fornace acesso a informa c oes de erro atrav es das fun c oes mysql_errno() e mysql_error(). Elas retornam o c odigo de erro ou a mensagem de erro para a fun c ao chamada mais recentemente que tenha tido sucesso ou que tenha falhado, permitindo a voc e determinar quando um erro ocorreu e qual foi ele.
780
/* incorrect */
/* incorrect */
Quando uma fun c ao retornar um erro, a subsecao Erros de descri c ao de fun c oes lista os poss iveis tipos de erro. Voc e pode descobrir quais deles ocorreu chamando mysql_errno(). Uma representa c ao string do erro pode ser obtida chamando mysql_error().
12.1.3.1 mysql_affected_rows()
my_ulonglong mysql_affected_rows(MYSQL *mysql)
Descri c ao
Retorna o n umero de registros alterados pelo u ltimo UPDATE, deletados elo u ltimo DELETE ou inseridos pelo u ltimo INSERT. Pode ser chamado imediatamente ap os mysql_query() para instru c oes UPDATE, DELETE, ou INSERT. Para instru c oes SELECT, mysql_affected_rows() funciona como mysql_num_rows().
Valor Retornado
Um inteiro maior que zero indica o n umero de registros afetados ou recuperados. Zero indica que nenhum registro foi atualizado por uma instru c ao UPDATE, nenhuma linha foi encontrada pela cl ausula WHERE na consulta ou a consulta ainda n ao foi executada. -1 indica que a consulta retornou um erro ou que, para uma consulta SELECT, mysql_affected_rows() foi chamado antes da chamada mysql_store_result().
Erros
Nenhum.
781
Exemplo
mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"); printf("%ld products updated",(long) mysql_affected_rows(&mysql)); Se se for especicado o par ametro CLIENT_FOUND_ROWS ao conectar no mysqld, mysql_ affected_rows() retornar a o n umero de linhas encontardos pela cl ausula WHERE para a instru c ao UPDATE. Note que quando for utilizado um comando REPLACE, mysql_affected_rows() retornar a 2 se o novo registro substituir um mais antigo. Isto e porque neste caso um registro foi inserido e depois os registros duplicados foram deletados.
12.1.3.2 mysql_change_user()
my_bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db)
Descri c ao
Altera o usu ario e faz com que o banco de dados especicado por db se torne o banco de dados padr ao (atual) na conex ao especicada por mysql. Em consultas subsequentes este banco de dados e o padr ao para refer encias a tabelas que n ao especicam o banco de dados explicitamente. Esta fun c ao foi introduzida na vers ao do MySQL. mysql_change_user() falha a menos que o usu ario conectado possa ser autenticado ou se ele n ao tiver permiss ao para utilizar o banco de dodos. Neste caso o usu ario e o banco de dados n ao s ao alterados. O par ametro db pode ser denido como NULL se voc e n ao dseseja ter um banco de dados padr ao. A partir da vers ao 4.0.6 do MySQL este comando sempre far a ROLLBACK de qualquer transa c ao ativa, fecha todas as tabelas tempor arias, destrava todas as tabelas bloqueadas e volta a um estado como se tivesse feito uma inova conex ao. Isto ir a acontecer mesmo se o usu ario n ao foi alterado.
Valor Retornado
Zero se obteve successo. Diferente de zero se ocorreu um erro.
Erros
O mesmo que pode ser obtido com mysql_real_connect(). CR_COMMANDS_OUT_OF_SYNC Comandos forma executados em ordem inapropriada. CR_SERVER_GONE_ERROR O servidor MySQL nalizou.
782
CR_SERVER_LOST A conex ao ao servidor foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu. ER_UNKNOWN_COM_ERROR O servidor MySQL n ao possui este comando (provavelmente um vers ao mais antiga) ER_ACCESS_DENIED_ERROR O usu ario ou a senha estavam errados. ER_BAD_DB_ERROR O banco de dados n ao existe. ER_DBACCESS_DENIED_ERROR O usu ario n ao tem direitos de acessoa este banco de dados. ER_WRONG_DB_NAME O nome de banco de dados e muito grande.
Exemplo
if (mysql_change_user(&mysql, "user", "password", "new_database")) { fprintf(stderr, "Failed to change user. Error: %s\n", mysql_error(&mysql)); }
12.1.3.3 mysql_character_set_name()
const char *mysql_character_set_name(MYSQL *mysql)
Descri c ao
Retorna o conjunto de caracteres padr ao para a conex ao atual.
Valor Retornado
O conjunto de carcteres padr ao
Erros
Nenhum.
12.1.3.4 mysql_close()
void mysql_close(MYSQL *mysql)
783
Descri c ao
feca uma conex ao aberta anteriormente. mysql_close() tamb em desaloca o ponteiro do manipulador da conex ao para o mysql se ele tiver sido alocado automaticamente por mysql_ init() ou mysql_connect().
Valor Retornado
Nenhum.
Erros
Nenhum.
12.1.3.5 mysql_connect()
MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)
Descri c ao
melhor utilizar mysql_real_connect(). A fun c ao est a obsoleta. E mysql_connect() tenta estabelecer uma conex ao a um banco de dados MySQL executando em host. mysql_connect() deve completar com suceso antes que voc e podssa executar qualquer uma das fun c ao da API, com a exce c ao de mysql_get_client_info(). O signicado dos par ametros s ao os mesmos que os par ametros correspondentes para mysql_ real_connect() com a diferen ca que o par ametro de conex ao pode ser NULL. Neste caso a API C aloca mem oria para a estrutura de conex ao automaticamente e a libera quando voc e chamar mysql_close(). A disvantagem desta abordagem e que voc e n ao pode retornar uma mensagem de erro se a conex ao falhar. (Para obter informa c oes de erro de mysql_errno() ou mysql_error(), voc e deve fornecer um ponteiro MYSQL v alido.)
Valor Retornado
O mesmo de mysql_real_connect().
Erros
O mesmo de mysql_real_connect().
12.1.3.6 mysql_create_db()
int mysql_create_db(MYSQL *mysql, const char *db)
784
Descri c ao
Cria o banco de dados nomeado pelo par ametro db. Esta fun c ao est a obsoleta. E melhor utilizar mysql_query() para comandar uma instru c ao SQL CREATE DATABASE.
Valor Retornado
Zero se o banco de dados foi criado com successo. Diferente de zero se ocorreu um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
Exemplo
if(mysql_create_db(&mysql, "my_database")) { fprintf(stderr, "Failed to create new database. mysql_error(&mysql)); }
Error: %s\n",
12.1.3.7 mysql_data_seek()
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset)
Descri c ao
Busca um registro arbitr ario em um resultado de uma consulta. O valor do oset e um n umero de linha e deve estar em uma faixa de 0 at e mysql_num_rows(stmt)-1. Esta fun c ao exige que a estrutura do resultado contenha todo o resultado da consulta, assim mysql_data_seek() s o pode ser usado em conjunto com mysql_store_result(), n ao com mysql_use_result().
Valor Retornado
Nenhum.
785
Erros
Nenhum.
12.1.3.8 mysql_debug()
void mysql_debug(const char *debug)
Descri c ao
Faz um DBUG_PUSH com a string dada. mysql_debug() usa a biblioteca de depura c ao Fred Fish. Para utilizar esta fun c ao voc e deve compilar a biblioteca cliente para suportar depura c ao. Veja Se c ao D.1 [Depurando o servidor], P agina 1070. Veja Se c ao D.2 [Depurando o cliente], P agina 1076.
Valor Retornado
Nenhum.
Erros
Nenhum.
Exemplo
A chamada mostrada aqui faz com que a biblioteca cliente gere um arquivo de rastreamento /tmp/client.trace na m aquina cliente: mysql_debug("d:t:O,/tmp/client.trace");
12.1.3.9 mysql_drop_db()
int mysql_drop_db(MYSQL *mysql, const char *db)
Descri c ao
Apaga o banco de dados nomeado pelo par ametro db. melhor utilizar mysql_query() para realizar uma instru Esta fun c ao est a obsoleta. E c ao SQL DROP DATABASE.
Valor Retornado
Zero se o banco de dados foi apagdo com sucesso. Diferente de zero ocorreu um erro.
786
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
Exemplo
if(mysql_drop_db(&mysql, "my_database")) fprintf(stderr, "Failed to drop the database: Error: %s\n", mysql_error(&mysql));
12.1.3.10 mysql_dump_debug_info()
int mysql_dump_debug_info(MYSQL *mysql)
Descri c ao
Instrui o servidor a gravar algumas informa c oes de depura c ao no log. Para funcionar, o usu ario conectado deve ter pivil egio SUPER.
Valor Retornado
Zero se o comando obteve sucesso. Diferete de zero se ocorreu um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.11 mysql_eof()
my_bool mysql_eof(MYSQL_RES *result)
787
Descri c ao
Esta fun c ao est a obsoleta. mysql_errno() ou mysql_error() podem ser usados em seu lugar. mysql_eof() determina se o u ltimo registro de um resultado foi lido. Se voc e buscar um resultado com um chamada mysql_store_result() bem sucedida, o cliente recebe todo o resultado em uma opera c ao. Neste caso, e um valor NULL retornado de mysql_fetch_row() sempre signica que o m do resultado foi atingido e n ao e necess ario chamar mysql_eof(). Quando usado com mysql_store_result(), mysql_eof() sempre retornar a verdadeiro. Por outro lado, se voc e utilizar mysql_use_result() para iniciar um resultado recuperado, as linhas do conjunto s ao obtido do servidor uma a uma, chamando mysql_fetch_row() repetidamente. Como pode ocorrer um erro na conex ao durante este processo, um valor NULL retornado de mysql_fetch_row() n ao signica, necess ariaemente, que o m do resultado fo atingido normalmente. Neste caso, voc e pode utilizar mysql_eof() para determinar o que aconteceu. mysql_eof() retorna um valor diferente de zero se o m do resultaod foi atingido e zero se ocorreu um erro. Historicamente, mysql_eof() e preterido pelas fun c oes de erro padr ao do MySQL mysql_ errno() e mysql_error(). Como estas fun c oes de erro fornecem a mesma informa c ao, o uso das duas u ltimas e preferido sobre mysql_eof(), a qual est a obsoleta. (De fato, elas fornecem mais informa c oes, porque mysql_eof() retorna apenas um valor booleano enquanto as fun c oes de erro indicam uma raz ao para a ocorr encia do erro quando ele ocorre).
Valor Retornado
Zero se nenhum erro ocorreu. Diferente de zero o m do resultado foi atingido.
Erros
Nenhum.
Exemplo
Os exemplos seguintes mostram como voc e deve usar mysql_eof(): mysql_query(&mysql,"SELECT * FROM some_table"); result = mysql_use_result(&mysql); while((row = mysql_fetch_row(result))) { // faz algo com os dados } if(!mysql_eof(result)) // mysql_fetch_row() falha devido a um erro { fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); } No entanto, voc e pode conseguir o mesmo efeito com as fun c oes de erro padr oes do MySQL:
788
mysql_query(&mysql,"SELECT * FROM some_table"); result = mysql_use_result(&mysql); while((row = mysql_fetch_row(result))) { // faz algo com os dados } if(mysql_errno(&mysql)) // mysql_fetch_row() falha devido a um erro { fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); }
12.1.3.12 mysql_errno()
unsigned int mysql_errno(MYSQL *mysql)
Descri c ao
Para a conex ao especicada pelo mysql, mysql_errno() retorna o c odigo de erro para a fun c ao API chamada mais recentemente que tenha obtido sucesso ou falhado. Um valor de retorno de zero signica que um erro ocorreu. N umeros de mensagens de erro de clientes s ao listados no arquivo de cabe calho errmsg.h do MySQL. N umeros de mensagem de erros do servidor s ao listados no arquivo mysqld_error.h. Na distribui c ao fonte do MySQL voc e pode encontrar uma lista completa de n ueros de mensagens de erro no arquivo Docs/mysqld_error.txt. Os c odigos de erros do servidor est ao listados em Se c ao 13.1 [Error-returns], P agina 885. Note que algumas fun c oes como mysql_fetch_row() n ao conguram o mysql_errno() se elas obterem sucesso. Uma regra do ded ao e que todas as fun c oes que precisam perguntar ao servidor por informa c ao ir ao zerar mysql_errno() se obterem sucesso.
Valor Retornado
Um valor de c odigo de erro para a u ltima chamada mysql xxx, se ele falhar, Zero signica que nenhum erro ocorreu.
Erros
Nenhum.
12.1.3.13 mysql_error()
const char *mysql_error(MYSQL *mysql)
789
Descri c ao
Para a conex ao especicada por mysql, mysql_error() retorna um string terminada em null contendo a mensagem de erro para a fun c ao de API chamda mais recentemente que tenha falhado. Se a fun c ao n ao falhou, o valor de retorno de mysql_error() pode ser o erro anterior ou uma string vazia para indicar que n ao ocorreu erro. Uma regra do ded ao e que todas as fun c oes que precisam pedir informa c ao ao servidor ir ao zerar mysql_error() se obterem sucesso. Para todas as fun c oes que zeram mysql_errno, os seguintes dois testes s ao equivalentes: if(mysql_errno(&mysql)) { // ocorreu um erro } if(mysql_error(&mysql)[0] != \0) { // ocorreu um erro } A l ingua da mensagem de erro do cliente pode ser alterada recompilando a biblioteca do cliente MySQL. Atualmente voc e pode escolher mensagens de erro em v arias l inguas diferentes. Veja Se c ao 4.7.2 [Languages], P agina 328.
Valor Retornado
Uma string terminada em null que descreve um erro. Uma string vazia se nenhum erro ocorrer.
Erros
Nenhum.
12.1.3.14 mysql_escape_string()
Voc e deve usar mysql_real_escape_string() em seu lugar! Esta fun c ao e identica a mysql_real_escape_string() exceto que mysql_real_escape_ string() pega um manipulador de cnex ao como seu primeiro argumento e escapa a string de acordo com a conjunto de caracteres padr ao. mysql_escape_string() n ao utiliza um argumento de conex ao e n ao respeita o conjunto de caracteres atual.
12.1.3.15 mysql_fetch_field()
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
790
Descri c ao
Retorna a deni c ao de uma coluna de um resultado como uma estrutura MYSQL_FIELD. Chame esta fun c ao repetidamente para retornar informa c oes sobre todas as colunas no resultado. mysql_fetch_field() retorna NULL quando n ao existirem mais campos. mysql_fetch_field() e denido para retornar a informa c ao do primeiro campo cada vez que voc e executar uma nova consulta SELECT. O campo retornado por mysql_fetch_ field() tamb em e afetado pela chamadas mysql_field_seek(). Se vov e tiver chamado mysql_query() para realizar um SELECT em uma tabela mas n ao tiver chamado mysql_store_result(), MySQL retorna o tamanho padr ao do blob (8K bytes) quando chamar mysql_fetch_field() para saber o tamanho de um campo BLOB. (O tamanho de 8 k e escolhido porque o MySQL n ao sabe o tamanho m aximo do BLOB. Ele pode ser congurado algumas vezes.) Uma vez retornado o resultado, campo->tamanho_max cont em o tamanho da maior valor para esta coluna em uma consulta espec ica.
Valor Retornado
A estrutura MYSQL_FIELD para a coluna atual. NULL n ao houver mais colunas.
Erros
Nenhum.
Exemplo
MYSQL_FIELD *field; while((field = mysql_fetch_field(result))) { printf("field name %s\n", field->name); }
12.1.3.16 mysql_fetch_fields()
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
Descri c ao
Retorna um vetor de todas as estruturas MYSQL_FIELD no resultado. Cada estrutura fornece a deni c ao do campo para uma coluna do resultado.
Valor Retornado
Um vetor da estrutura MYSQL_FIELD para todas as colunas no resultado.
791
Erros
Nenhum.
Exemplo
unsigned int num_fields; unsigned int i; MYSQL_FIELD *fields; num_fields = mysql_num_fields(result); fields = mysql_fetch_fields(result); for(i = 0; i < num_fields; i++) { printf("Field %u is %s\n", i, fields[i].name); }
12.1.3.17 mysql_fetch_field_direct()
MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr)
Descri c ao
Dado um n umero de campo fieldnr para uma colua em resultado, retorna a informa c ao de campo daquela coluna como uma estrutura MYSQL_FIELD Voc e pode utilizar esta fun c ao para retornar a deni c ao para uma coluna arbitr aria. O valor de fieldnr deve estar na faixa de 0 a mysql_num_fields(result)-1.
Valor Retornado
A estrutura MYSQL_FIELD para uma coluna espec ica.
Erros
Nenhum.
Exemplo
unsigned int num_fields; unsigned int i; MYSQL_FIELD *field; num_fields = mysql_num_fields(result); for(i = 0; i < num_fields; i++) {
792
12.1.3.18 mysql_fetch_lengths()
unsigned long *mysql_fetch_lengths(MYSQL_RES *result)
Descri c ao
Retorna o tamanho da coluna do registro atual em um resultado. Se voc e planeja copiar calores dos compos, esta informa c ao de tamanho e u til tamb em para a otimiza c ao, porque voc e pode evitar a chamada strlen(). Se o resultado cont em dados bi arios, voc e deveutilizar esta fun c ao para determinar o tamanho dos dados, pois strlen() retorna um valor incorreto para quaquer campo contendo caracteres nulos. O tamanho para colunas vazias e para colunas contendo valores NULL e zero. Para ver como distnguir este dois casos, veja a descri c ao de mysql_fetch_row().
Valor Retornado
Um vetor de unsigned long integers (inteiros longos sem sinal) representando o tamanho de cada coluna (n ao incluindo nenhuma caracter nulo). NULL se ocorrer um erro.
Erros
mysql_fetch_lengths() s o e v alido para o registro atual no resultado. Ele retorna NULL se voc e cham a-lo antes de mysql_fetch_row() ou depois de retornar todos os registros em um resultado.
Exemplo
MYSQL_ROW row; unsigned long *lengths; unsigned int num_fields; unsigned int i; row = mysql_fetch_row(result); if (row) { num_fields = mysql_num_fields(result); lengths = mysql_fetch_lengths(result); for(i = 0; i < num_fields; i++) { printf("Column %u is %lu bytes in length.\n", i, lengths[i]); } }
793
12.1.3.19 mysql_fetch_row()
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
Descri c ao
Recuera o pr oximo registro do resultado. Quando usado depois de mysql_store_result(), mysql_fetch_row() retorna NULL quando n ao houver mais registros para retornar. Quando usado depois de mysql_use_result(), mysql_fetch_row() retorna NULL quando n ao houver mais registros para retornar ou ocorrer um erro. O n umero de valores no registro e dado por mysql_num_fields(result). Se row guarda o valor retornado de uma chamada mysql_fetch_row(), apontadores para os valores s ao acessados como row[0] a row[mysql_num_fields(result)-1]. Valores NULL no registro s ao indicados por apontadores NULL. Os tamanhos dos valores do campo no registro poden ser obtidos chamando mysql_fetch_ lengths(). Campos vazios e campos contendo NULL tem tamanho 0; voc e pode distingui-los vericando o apontador para o valor do campo. Se o apontador e NULL, o campo e NULL; sen ao o campo est a vazio.
Valor Retornado
Uma estrutura MYSQL_ROW para o pr oximo registro. NULL se n ao houver mais linhas para retornar ou ocorrer um erro.
Erros
Note que o erro n ao e zerado entre as chamadas a mysql_fetch_row() CR_SERVER_LOST A conex ao com o servidor foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
Exemplo
MYSQL_ROW row; unsigned int num_fields; unsigned int i; num_fields = mysql_num_fields(result); while ((row = mysql_fetch_row(result))) { unsigned long *lengths; lengths = mysql_fetch_lengths(result); for(i = 0; i < num_fields; i++)
794
12.1.3.20 mysql_field_count()
unsigned int mysql_field_count(MYSQL *mysql) Se voc e estiver utilizando uma vers ao anterior a vers ao 3.22.24 do MySQL, voc e deve utilizar unsigned int mysql_num_fields(MYSQL *mysql).
Descri c ao
Retorna o n umero de colunas para a consulta mais recente na conex ao. Normalmente esta fun c ao e utilizada quando mysql_store_result() retorna NULL (ent ao voc e n ao possui um apontador para o resultado). Neste caso, voc e pode chamar mysql_ field_count() para determinar se mysql_store_result() n ao produziu um resultado vazio. Isto permite que o programa cliente tome a a c ao aprpriada sem saber se a consulta foi uma instru c ao SELECT (ou do mesmo tipo). O exemplo mostrado aqui ilustra como isto pode ser feito. Veja Se c ao 12.1.12.1 [NULL mysql_store_result()], P agina 857.
Valor Retornado
Um unsigned integer (inteiro sem sinal) representando o n umero de campo em um resultado.
Erros
Nenhum.
Exemplo
MYSQL_RES *result; unsigned int num_fields; unsigned int num_rows; if (mysql_query(&mysql,query_string)) { // error } else // query succeeded, process any data returned by it { result = mysql_store_result(&mysql); if (result) // there are rows
795
{ num_fields = mysql_num_fields(result); // retrieve rows, then call mysql_free_result(result) } else // mysql_store_result() returned nothing; should it have? { if(mysql_field_count(&mysql) == 0) { // query does not return data // (it was not a SELECT) num_rows = mysql_affected_rows(&mysql); } else // mysql_store_result() should have returned data { fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); } } } Uma alternativa e substituir a chamada mysql_field_count(&mysql) com mysql_errno(&mysql). Neste caso, voc e est a vericando diretamente um erro de mysql_store_result() em vez de conferir o valor de mysql_field_count() se a instru c ao foi uma SELECT.
12.1.3.21 mysql_field_seek()
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)
Descri c ao
Dene o cursor campo com o oset dado. A pr oxima chamada para mysql_fetch_field() ir a recuperar a deni c ao de campo da coluna associada com o oset. Para buscar o inicio de um registro, passe zero como valor do offset.
Valor Retornado
O valor anterior do cursor de campo.
Erros
Nenhum.
12.1.3.22 mysql_field_tell()
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)
796
Descri c ao
Retorna a posi c ao do cursos do campo usado pelo u ltimo mysql_fetch_field(). Este valor pode ser usado como um argumento para mysql_field_seek().
Valor Retornado
O oset atual do cursor de campo.
Erros
Nenhum.
12.1.3.23 mysql_free_result()
void mysql_free_result(MYSQL_RES *result)
Descri c ao
Libera a mem oria alocada para o resultado por mysql_store_result(), mysql_use_ result(), mysql_list_dbs(), etc. Quando voc e nalizar o uso do resultado, voc e deve liberar a mem oria utilizada chamando mysql_free_result().
Valor Retornado
Nenhum.
Erros
Nenhum.
12.1.3.24 mysql_get_client_info()
char *mysql_get_client_info(void)
Descri c ao
Retorna uam string que representa a vers ao da biblioteca cliente.
Valor Retornado
Uma string representando a vers ao da biblioteca cliente do MySQL.
797
Erros
Nenhum.
12.1.3.25 mysql_get_host_info()
char *mysql_get_host_info(MYSQL *mysql)
Descri c ao
Retorna uma string descrevendo o tipo da conex ao em uso, incluindo o nome da maquina servidora.
Valor Retornado
Uma string respresntando o nome da m aquina servidora e o tipo de conex ao.
Erros
Nenhum.
12.1.3.26 mysql_get_proto_info()
unsigned int mysql_get_proto_info(MYSQL *mysql)
Descri c ao
Retorna a vers ao do protocolo usado pela conex ao atual.
Valor Retornado
Um unsigned integer (inteiro sem sinal) representando a vers ao do protocolo usado pela conex ao atual.
Erros
Nenhum.
12.1.3.27 mysql_get_server_info()
char *mysql_get_server_info(MYSQL *mysql)
Descri c ao
Retorna um string que representa o n umero da vers ao do servidor.
798
Valor Retornado
Um string representando o n umero da vers ao do servidor.
Erros
Nenhum.
12.1.3.28 mysql_get_server_version()
unsigned long mysql_get_server_version(MYSQL *mysql)
Descri c ao
Retorna o n umero de vers ao do servidor como um inteiro (novo na vers ao 4.1)
Valor Retornado
Um n umero que representa a vers ao do servidor MySQL no formato: ao menor*100 + sub vers ao vers ao principal*10000 + vers Por exemplo, 4.1.0 e retornado como 40100. Ela eu til para determinar a vers ao do servidor rapidamente em um programa cliente para saber se algumas capacidades existem.
Erros
Nenhum.
12.1.3.29 mysql_info()
char *mysql_info(MYSQL *mysql)
Descri c ao
Retorna um string fornecendo informa c ao sobre a consulta executada mais recentemente, mas apenas para as instru c oes listadas aqui. Para outras inastru c oes, mysql_info() retorna NULL. O formato da string varia dependendo do tipo de consulta, como descrito aqui. Os n umeros s ao apenas ilustrativos; a string ir a conter valores apropriados para a consulta. INSERT INTO ... SELECT ... Formato da string: Records: 100 Duplicates: 0 Warnings: 0 INSERT INTO ... VALUES (...),(...),(...)... Formato da string: Records: 3 Duplicates: 0 Warnings: 0
799
LOAD DATA INFILE ... Formato da string: Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 ALTER TABLE Formato da string: Records: 3 Duplicates: 0 Warnings: 0 UPDATE Formato da string: Rows matched: 40 Changed: 40 Warnings: 0
Note que mysql_info() retorna um valor n ao-NULL para INSERT ... VALUES somente na forma de m ultiplas linhas da instru c ao (isto e, apenas se uma lista com v arios valores e especicada).
Valor Retornado
Uma string represntando informa c ao adicional sobre a consulta executada mais recentemente. NULL se n ao houver nenhuma informa c ao dispon ivel para a consulta.
Erros
Nenhum.
12.1.3.30 mysql_init()
MYSQL *mysql_init(MYSQL *mysql)
Descri c ao
Aloca ou inicializa um objeto MYSQL apropriado para mysql_real_connect(). Se mysql e um ponteiro NULL, a fun c ao aloca, inicializa e retorna um novo objeto. Sen ao o objeto e inicializado e o endere co do objeto e retornado. Se mysql_init() aloca um novo objeto, ele ser a liberado quando mysql_close() for chamado para fechar a conex ao.
Valor Retornado
Um handle MYSQL* inicializado. NULL se n ao houver mem oria suciente para alocar o novo objeto.
Erros
Em caso de mem oria insuciente, NULL e retornado.
12.1.3.31 mysql_insert_id()
my_ulonglong mysql_insert_id(MYSQL *mysql)
800
Descri c ao
Retorna o ID gerado para uma coluna AUTO_INCREMENT pela consulta anterior. Use esta fun c ao depois de ter realizado um consulta INSERT em uma tabela que contenha um campo AUTO_INCREMENT. Note que mysql_insert_id() retorna 0 se a consulta anterior n ao gerar um valor AUTO_ INCREMENT. Se voc e desejar salvar o valor para uso posterior, chame mysql_insert_id() imediatamente depois da consulta que gerou o valor. Se a consulta anterior retornar um erro, o valor de mysql_insert_id() e indenido. mysql_insert_id() e atualizado depois de instru c oes INSERT e UPDATE que geram um valor AUTO_INCREMENT ou que denem um valor de coluna com LAST_INSERT_ID(expr). Veja Se c ao 6.3.6.2 [Fun c oes diversas], P agina 546. Note tamb em que o valor da fun c ao SQL LAST_INSERT_ID() sempre cont em o o valor AUTO_ INCREMENT gerado mais recentemente e n ao e zerado entre as consultas porque o valor desta fun c ao e mantido no servidor.
Valor Retornado
O valor do campo AUTO_INCREMENT que foi atualizado pela consulta anterior. Retorna zero se n ao houve consultas anteriores na conex ao ou se a consulta n ao atualizou o valor AUTO_INCREMENT.
Erros
Nenhum.
12.1.3.32 mysql_kill()
int mysql_kill(MYSQL *mysql, unsigned long pid)
Descri c ao
Diz para o servidor matar um thread especicada pelo pid.
Valor Retornado
Zero em caso de sucesso. Diferente de zero se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado.
801
CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.33 mysql_list_dbs()
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)
Descri c ao
Retorna um resultado com nome de banco de dados no servidor que correspondem a uma express ao regular especicada pelo par ametro wild. wild pode conter o meta caracteres % ou _, ou pode ser um ponteiro NULL para coreesponder a todos os banco de dados. Chamar mysql_list_dbs() e o mesmo que executar a consulta SHOW databases [LIKE wild]. Voc e deve liberar o resultado com mysql_free_result().
Valor Retornado
Um conjunto de resultados MYSQL_RES no caso de sucesso. NULL se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.34 mysql_list_fields()
MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
Descri c ao
Retorna um resultado contendo nomes de campos de uma tabela dada que correspondam a express ao regular especicada pelo par ametro wild. wild pode conter os metacaracteres % ou _, ou pode ser um ponteiro NULL para corresponder a todos os campos. Chamar mysql_ list_fields() e o mesmo que executar a consulta SHOW COLUMNS FROM nome_tabela [LIKE wild].
802
Note que e recomendado que voc e use SHOW COLUMNS FROM nome_tabela em vez de mysql_ list_fields(). Voc e deve liberar o resultado com mysql_free_result().
Valor Retornado
Um conjunto de resultados MYSQL_RES em caso de sucesso. NULL se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.35 mysql_list_processes()
MYSQL_RES *mysql_list_processes(MYSQL *mysql)
Descri c ao
o mesmo tipo de informa Retorna um resultado descrevendo a thread atual do servidor. E c ao relatado por mysqladmin processlist ou uma consulta SHOW PROCESSLIST. Voc e deve liberar o resultado com mysql_free_result().
Valor Retornado
Um conjunto de resultados MYSQL_RES em caso de sucesso. NULL se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
803
12.1.3.36 mysql_list_tables()
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)
Descri c ao
Retorna um resultado contendo nomes de tabelas no banco de dados atual que correspondam a express ao regular especicada pelo par ametro wild. wild pode conter os mets caracteres % or _, ou pode ser uma ponteiro NULL para corresponde a todas as tabelas. Chamar mysql_list_tables() e o mesmo que executar a consulta SHOW tables [LIKE wild]. Voc e deve liberar o resultado com mysql_free_result().
Valor Retornado
Um conjunto de resultados MYSQL_RES em caso de sucesso. NULL se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.37 mysql_num_fields()
unsigned int mysql_num_fields(MYSQL_RES *result) ou unsigned int mysql_num_fields(MYSQL *mysql) A segunda forma n ao funciona na vers ao 3.22.24 ou mais novas do MySQL. Para passar um argumento MYSQL* voc e de utilizar unsigned int mysql_field_count(MYSQL *mysql) em seu lugar.
Descri c ao
Retorna o n umero de colunas em um resultado. Note que voc e pode obter o n umero de colunas com um ponteiro para o conjunto de resultados ou para um manipulador (handle) de conex ao. Voc e usaria o manipular de conex ao se mysql_store_result() ou mysql_use_result() retorna NULL (ent ao voc e n ao tem um
804
ponteiro para o resultado). Neste caso, voc e pode chamar mysql_field_count() para determinar se mysql_store_result() n ao produziu um resultado vazio. Isto permite que o programa cliente tome a a c ao apropriada sem saber se a consulta foi uma instru c ao SELECT (ou do tipo SELECT). O exemplo mostrado abaixo ilustra como isto pode ser feito. Veja Se c ao 12.1.12.1 [NULL mysql_store_result()], P agina 857.
Valor Retornado
Um unsigned integer (inteiro sem sinal) representando o n umero de campos no conjunto de resultasdos.
Erros
Nenhum.
Exemplo
MYSQL_RES *result; unsigned int num_fields; unsigned int num_rows; if (mysql_query(&mysql,query_string)) { // erro } else // query succeeded, process any data returned by it { result = mysql_store_result(&mysql); if (result) // existem resgitros { num_fields = mysql_num_fields(result); // retorna registros e chama mysql_free_result(result) } else // mysql_store_result() retorna vazio; era esperado? { if (mysql_errno(&mysql)) { fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); } else if (mysql_field_count(&mysql) == 0) { // consulta n~ ao retora dados // (ela n~ ao era um SELECT) num_rows = mysql_affected_rows(&mysql); } }
805
} Uma alternativa (se voc e souber qyue a sua consulta retornou um resultado) e substituir a chamada mysql_errno(&mysql) pela verica c ao de se mysql_field_count(&mysql) e= 0. Isto s o acontece se alguma coisa der errado.
12.1.3.38 mysql_num_rows()
my_ulonglong mysql_num_rows(MYSQL_RES *result)
Descri c ao
Retorna o n umero de linhas em um resultado. O uso de mysql_num_rows() depende de se voc e utiliza mysql_store_result() ou mysql_ use_result() para retornar o resultado. Se voc e usa mysql_store_result(), mysql_num_ rows() pode ser chamado imediatamente. Se voc e usa mysql_use_result(), mysql_num_ rows() n ao retornar a o valor correto at e que todas as linhas no resultado tenham sido recuperadas.
Valor Retornado
O n umero de linhas no resultado.
Erros
Nenhum.
12.1.3.39 mysql_options()
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)
Descri c ao
Pode ser usado para denir op c oes extras de conex ao e afetar o comportamento de uma conex ao. Esta fun c ao pode ser chamada v arias vezes para denir diversas op c oes. mysql_options() deve ser chamado depois de mysql_init() e antes de mysql_connect() ou mysql_real_connect(). O argumento option e a op c ao que voc e que denir; o argumento arg e o valor para a op c ao. Se a op c ao e um inteiro, ent ao arg deve apontar para o valor do inteiro. Valores poss iveis para as op c oes: Op c ao Tipo de Fun c ao argumento MYSQL_OPT_CONNECT_TIMEOUT unsigned int Tempo limite de conex ao em * segundos. MYSQL_OPT_COMPRESS N ao usado Usa o protocolo cliente/servidor compactado.
806
MYSQL_OPT_READ_TIMEOUT
unsigned int * unsigned int * ponteiro para unsigned integer opcional N ao usado char *
MYSQL_OPT_WRITE_TIMEOUT
MYSQL_OPT_LOCAL_INFILE
MYSQL_OPT_NAMED_PIPE MYSQL_INIT_COMMAND
MYSQL_READ_DEFAULT_FILE MYSQL_READ_DEFAULT_GROUP
char * char *
MYSQL_OPT_PROTOCOL
MYSQL_SHARED_MEMORY_BASE_NAME
Limite de tempo para a leitura do servidor (funciona atualmente apenas no Windows em conex oes TCP/IP) Limite de tempo para a escrita no servidor (funciona atualmente apenas no Windows em conex oes TCP/IP) Se nenhum ponteiro for dado ou se apontar para um unsigned int != 0 o comando LOAD LOCAL INFILE est a habilitado. Usa named pipes para conectar ao servidor MySQL no NT. Comando para executar ao conectar ao servidor MySQL. Ser a automaticamente executado ao se reconectar. L e op c oes do arquivo de op c oes denido no lugar de my.cnf. L e op c oes do grupo indicado no arquivo my.cnf ou no arquivo especicado com MYSQL_READ_ DEFAULT_FILE. Tipo de protocolo usado. Deve ser um dos valores apresentados em mysql_protocol_type denido no mysql.h. Nome do objeto em me oria para comunica c ao com o servidor. Deve ser o mesmo que a op c ao shared-memory-base-name usada para o servidor mysqld no qual voc e quer se conectar.
Note que o grupo client e sempre lido se voc e utiliza MYSQL_READ_DEFAULT_FILE ou MYSQL_ READ_DEFAULT_GROUP. O grupo especicado no arquivo de op c os pode conter as seguintes op c oes: Op c ao connect-timeout compress database debug disable-localinfile host Descri c ao Tempo limite de conex ao em segundos. No Linux este tempo limite tamb em e utilizado para esperar pela primeira resposta do servidor Utiliza o protocolo cliente/servidor compactado. Conecta a este banco de dados se nenhum banco de dados for especicado no comando de conex ao. Op c oes de depura c ao. Disabilita o uso de LOAD DATA LOCAL. Nome de m aquina padr ao.
807
init-command interactivetimeout localinfile[=(0|1)] max_allowed_packet password pipe protocol=(TCP | SOCKET | PIPE | MEMORY) port return-found-rows shared-memorybase-name=name socket user
Comando para executar ao conectar ao servidor MySQL. Ser a executado automaticamente ao reconectar. O mesmo que o especicado em CLIENT_ INTERACTIVE para mysql_real_connect(). Veja Se c ao 12.1.3.42 [mysql real connect], P agina 809. Se n ao houver argumento ou o argumento for diferente de 0 habilita o uso de LOAD DATA LOCAL. Tamanho m aximo dos pacotes que o cliente pode ler do servidor. Senha padr ao. Usa named pipes para conectar ao servidor MySQL no NT. Qual protocolo usar ao conectar no servidor (Novo na vers ao 4.1) N umero padr ao da porta. Diz ao mysql_info() para retornar registros encontrados no lugar de registros atualizados ao usar UPDATE. Nome da mem oria comprtilhada utilizada para conectar ao servidor (o padr ao e "MySQL"). Novo na vers ao 4.1. N umero padr ao do socket. Usu ario padr ao.
Note que timeout foi substituido por connect-timeout, mas timeout ainda funcionar a por enquanto. Para maiores informa c oes sobre arquivos de op c oes, veja Se c ao 4.1.2 [Arquivo de op c oes], P agina 217.
Valor Retornado
Zero em caso de sucesso. Diferente de zero se voc e utilizar uma op c ao desconhecida.
Exemplo
MYSQL mysql; mysql_init(&mysql); mysql_options(&mysql,MYSQL_OPT_COMPRESS,0); mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"odbc"); if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)) { fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(&mysql)); } O exemplo acima diz ao cliente para usar o protocolo cliente/servidor compactado e ler a op c ao adicional da se c ao odbc no arquivo de op c oes my.cnf.
808
12.1.3.40 mysql_ping()
int mysql_ping(MYSQL *mysql)
Descri c ao
Verica se a conex ao ao servidor est a funcionando. Se ela tiver ca ido e feita uma tentativa de conex ao automaticamente. Esta fun c ao pode ser usada pelos clientes que se cam inativo por um longo tempo para vericar se o servidor fechou a conex ao e reconectar se necess ario.
Valor Retornado
Zero se o servidor estiver funcionando. Diferente de zero se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.41 mysql_query()
int mysql_query(MYSQL *mysql, const char *query)
Descri c ao
Executa uma consulta SQL apontada pela string terminada em null query. A consulta deve deve consistir de uma u nica instru c ao SQL. Voc e n ao deve adicionar ponto e v irgula (;) ou \g ao m da instru c ao. mysql_query() n ao pode ser usadas por consultas que contenham dados bin arios; voc e deve utilizar mysql_real_query() em seu lugar. (Dados bin arios podem conter o caracter \0, que mysql_query() interpreta como o m a string de consulta.) Se voc e quiser saber se a consulta deve retornar um resultado ou n ao, voc e pode utilizar mysql_field_count() para vericar isto. Veja Se c ao 12.1.3.20 [mysql_field_count()], P agina 794.
Valor Retornado
Zero se a consulta obteve sucesso. Diferente de zero se ocorreu um erro.
809
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.42 mysql_real_connect()
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
Descri c ao
mysql_real_connect() tenta estabelecer uma conex ao mecanismo MySQL de banco de dados executando em host. mysql_real_connect() deve completar com suceeso antes que voc e possa executar qualquer um das outars fun c aoes da API, com a excess ao de mysql_ get_client_info(). Os par ametros s ao especicados da seguinte forma: O primeiro par ametro deve ser o endere co de uma estrutura MYSQL existente. Antes de chamar mysql_real_connect() voc e deve chamar mysql_init() para inicializar a estrutura MYSQL. Voc e pode alterar v aria op c oes de conex ao com a chamada mysql_ options(). Veja Se c ao 12.1.3.39 [mysql options], P agina 805. O valor de host pode ser tanto um nome de m aquivo quanto um endere co IP. Se host e NULL ou a string "localhost", a conex ao e feita na m aquina local. Se o SO suporta sockets (Unix) ou named pipes (Windows), eles s ao utilizados em vez de TCP/IP para a conex ao ao servidor. O par ametro user cont em a indetica c ao do usu ario MySQL. Se user e NULL ou a string vazia "", considera-se o usu ario padr ao. Sob Unix, ele e o login atual. Sob ODBC no Windows, o usu ario atual deve ser especicado explicitamente. Veja Se c ao 12.2.2 [Administrador ODBC], P agina 867. O par ametro passwd cont em a senha para user. Se passwd e NULL, somente entradas na tabela user para usu arios que tenham campo de senha em branco (vazia) ser ao vericados ipor um padr ao coincidenete. Isto permite que o admistrador do banco de dados congure o sistema de privil egios do MySQL de tal maneira que usu arios os usu arios conseguir ao privileios diferentes, dependendo se ele espcicou ou n ao uma senha. Nota: N ao tente criptografar a senha antes de chamar mysql_real_connect(); senhas criptografadas s ao tratadas automaticamente pela API cliente.
810
db e o nome de banco de dados. Se db n ao e NULL, a conex ao denir a o banco de dados padr ao com este valor. Se port n ao e 0, o valor ser a usado como o n umero da porta para as conex oes TCP/IP. Note que o par ametro host determina o tipo da conex ao. Se unix_socket n ao e NULL, a string especica o socket ou named pipe que deve ser usado. Note que o par ametro host determina o tipo de conex ao. O valor de client_flag e normalmente 0, mas pode ser denido como uma combina c ao dos par ametro seguintes em circunst ancias especiais: Nome do par ametro CLIENT_COMPRESS CLIENT_FOUND_ROWS CLIENT_IGNORE_SPACE CLIENT_INTERACTIVE CLIENT_LOCAL_FILES CLIENT_MULTI_ STATEMENTS Descri c ao do par ametro Usa protocolo compactado. Retorna o n umero de linhas encontradas (correspondentes a um padr ao), n ao o n umero de linha efetivo. Permite espa co depois do nome de fun c oes. torna todos os nomes de fun c oes palavras reservadas. Permite interactive_timeout segundos (no lugar de wait_timeout segundos) de inatividade antes de fechar a conex ao. Habilita LOAD DATA LOCAL. Diz ao servidor que o cliente pode enviar consultas multi linhas (separado com ;). Se este par ametro n ao est a denido, consultas de multil linhas est a disabilitado. (Novo na vers ao 4.1). Diz ao servidor que o cliente pode tratar mult iplos conjuntos de resultados de um multi consulta ou stored procedures. Isto e denido automaticamente se CLIENT_ MULTI_STATEMENTS est a lidado. Novo na vers ao 4.1. N ao permite a sintaxe db_name.nome_tabela.nome_ coluna. Isto e para o ODBC. Ele faz com que o analu izador gere um erro se voc e utilizar aquela sintaxe. E til para achar erros em alguns programas ODBC. O cliente e um cliente ODBC. Torna o mysqld mais amig avel ao ODBC. Usa SSL (protocolo criptografado). Esta op c ao n ao deve ser congura c ao pelo aplicativo; ele e denida internamente na biblioteca cliente.
CLIENT_MULTI_RESULTS
CLIENT_NO_SCHEMA
CLIENT_ODBC CLIENT_SSL
Valor Retornado
Um handle de conex ao MYSQL* se a conex ao foi obtida com sucesso, NULL se a conex ao falhou. Para um conex ao estabelecida o valor de retorn e o mesmo que o valor do primeiro par ametro.
Erros
CR_CONN_HOST_ERROR Falhou ao conectar ao servidor MySQL.
811
CR_CONNECTION_ERROR Falhou ao conectar ao servidor MySQL local. CR_IPSOCK_ERROR Falhou au criar um socket IP. CR_OUT_OF_MEMORY Sem mem oria. CR_SOCKET_CREATE_ERROR Falhou ao criar um socket Unix. CR_UNKNOWN_HOST Falhou ao procurar o endere co IP para o nome de maquina. CR_VERSION_ERROR Um erro de protocolo resultou da tentativa de conexao a um servidor com uma biblioteca cliente que utiliza uma vers ao de protocolo diferente. Isto pode acontecer se voc e utiliza uma biblioteca cliente muito antiga para se conectar a um novo servidor qua n ao foi iniciado com a op c ao --old-protocol. CR_NAMEDPIPEOPEN_ERROR Falhou ao criar um named pipe no Windows. CR_NAMEDPIPEWAIT_ERROR Falhou ao esperar por um named pipe no Windows. CR_NAMEDPIPESETSTATE_ERROR Falhou ao conseguir mainpulador do pipe no Windows. CR_SERVER_LOST Se connect_timeout > 0 e leva mais que connect_timeout segundos para conectar ao servidor ou se o servidro foi nalizado ao executar o init-command.
Exemplo
MYSQL mysql; mysql_init(&mysql); mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"seu_programa"); if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)) { fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(&mysql)); } Usando mysql_options() a biblioteca MySQL ir a ler as se c oes [client] e [seu_programa] no arquivo my.cnf o qual ir a assegurar que seu programa ir a funcionar, mesmo se alguem tiver congurado o MySQL de um modo fora do padr ao. Note que sob a conex ao, mysql_real_connect() dene o par ametro reconnect (parte da estrutura MYSQL) para um valor de 1. Este par ametro indica, no evento em que uma consulta n ao pode ser realizada devido a perda de conex ao, para tentar se reconectar ao servidor antes de esgotar as tentativas.
812
12.1.3.43 mysql_real_escape_string()
unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length)
Descri c ao
A fun c ao e usada para criar um string SQL v alida que voc e pode usar em uma instru c ao SQL. Veja Se c ao 6.1.1.1 [Sintaxe de string], P agina 469. A string em from e codicada para uma string SQL com escape, levando em conta o conjunto de caracteres atual da conex aon. O resultado e colocada em to e uma byte nulo de termin c ao e adcionado. Caracteres codicados s ao NUL (ASCII 0), \n, \r, \, , " e Control-Z (veja Se c ao 6.1.1 [Literais], P agina 469). (O MySQL precisa que apenas a barra invertida e as aspas utilizadas para citar a consulta sejam escapadas. Esta fun c ao coloca os outros caracteres entre aspas para torn a-lo mais f acil de ser lido em arquivos log.) A string apontada por from deve ter o tamanho de length bytes. Voc e deve alocar o buer to para o tamanho de pelo menos length*2+1 bytes. (No pior caso, cada caracter pode precisar de ser codicado como se utilizasse dois bytes, e voc e preciria de espa co para o byte null de termina c ao.) Quando mysql_real_escape_string() retornar, o conte udo de to ser a uma string terminada em null. O valor e o tamanho da string codicada. n ao incluindo o caracter nulo usado para terminar a string.
Exemplo
char query[1000],*end; end = strmov(query,"INSERT INTO test_table values("); *end++ = \; end += mysql_real_escape_string(&mysql, end,"Whats this",11); *end++ = \; *end++ = ,; *end++ = \; end += mysql_real_escape_string(&mysql, end,"binary data: \0\r\n",16); *end++ = \; *end++ = ); if (mysql_real_query(&mysql,query,(unsigned int) (end - query))) { fprintf(stderr, "Failed to insert row, Error: %s\n", mysql_error(&mysql)); } A fun c ao strmov() usada no exemplo est a inclu ida na biblioteca mysqlclient e funciona como strcpy() mas retorna um ponteiro para null de termina c ao do primeiro par ametro.
813
Valor Retornado
O tamanho do valor colocado em to, n ao incluindo o caracter null de termina c ao.
Erros
Nenhum.
12.1.3.44 mysql_real_query()
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
Descri c ao
Executa a consulta SQL apontada por query, que deve ser uma string de length bytes. A consulta deve consistir de uma instru c ao SQL simples. Voc e n ao deve adicionar um ponto e virgula (;) ou \g no m da instru c ao. Voc e deve utilizar mysql_real_query() em lugar de mysql_query() para consultas que contenham dados bin arios, pois eles podem conter o caracter \0. Al em disso, mysql_real_ query() e mais r apido que mysql_query() pois ele n ao faz chamadas strlen() na string de consulta. Se voc e quiser saber se a consulta retornou um resultado ou n ao, voc e pode usar mysql_ field_count(). Veja Se c ao 12.1.3.20 [mysql eld count], P agina 794.
Valor Retornado
Zero se a consulta obteve sucesso. Deiferente de zero se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.45 mysql_reload()
int mysql_reload(MYSQL *mysql)
814
Descri c ao
Diz ao servidor MySQL para recarregar a tabela de ables. The connected user must have the RELOAD privilege. This function is deprecated. It is preferable to use mysql_query() to issue a SQL FLUSH PRIVILEGES statement instead.
Valor Retornado
Zero for success. Non-zero if an error occurred.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.46 mysql_row_seek()
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset)
Descri c ao
Atribui ao cursor de linha um registro arbitr ario em resultado de uma consulta. O valor do offset e um oset do registro que deve ser um valor retornado de mysql_row_tell() ou mysql_row_seek(). Este valor n ao simplesmente um n umero de linha; se voc e quiser buscar um registro em um resultado usando o n umero de linha utilize mysql_data_seek(). Esta fun c ao exige que a estrutura do resultado contenha todo o resultado da consulta, assim mysql_row_seek() pode ser um usado em conjunto apenas com mysql_store_result(), e n ao com mysql_use_result().
Valor Retornado
O valor anterior do cursor de linha. Este valor pode ser passado a uma chamada subsequente mysql_row_seek().
Erros
Nenhum.
815
12.1.3.47 mysql_row_tell()
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)
Descri c ao
Retorna a posi c ao atual do cursor de linha para a u ltima mysql_fetch_row(). Este valor pode ser utilizado como argumento para mysql_row_seek(). Voc e deve utilizar mysql_row_tell() somente depois de mysql_store_result(), e n ao depois de mysql_use_result().
Valor Retornado
O oset atual do cursos de linha.
Erros
Nenhum.
12.1.3.48 mysql_select_db()
int mysql_select_db(MYSQL *mysql, const char *db)
Descri c ao
Faz com que o banco de dados espexcicado por db se torne o padr ao (atual) na conex ao especicada por mysql. Nas consultas seguintes este banco de dados e o padr ao para tabelas que n ao incluem uma especica c ao explicita para o banco de dados. mysql_select_db() falha a menos que o usu ario conectado possa ser autenticado com permiss ao para utilizar o banco de dados.
Valor Retornado
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
816
12.1.3.49 mysql_set_server_option()
int mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option)
Descri c ao
Habilita ou desabilita uma op c ao para a conex ao. option por ter um dos seguintes valores: MYSQL OPTION MULTI STATEMENTS Habilita suporte ON a multi instru c oes. MYSQL OPTION MULTI STATEMENTS Desabilita suporte OFF a multi instru c oes.
Valores Retornados
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. ER_UNKNOWN_COM_ERROR O servidor n ao suportou mysql_set_server_option() (que o caso no qual o servidor e mais antigo que 4.1.1) ou o servidor n ao suportou a op c ao que se tentou denir.
12.1.3.50 mysql_shutdown()
int mysql_shutdown(MYSQL *mysql)
Descri c ao
Diz ao servidor de banco de dados para nalizar. O usu ario conectado deve ter privil egio SHUTDOWN.
Valor Retornado
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
817
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.51 mysql_sqlstate()
const char *mysql_sqlstate(MYSQL *mysql)
Descri c ao
Retorna uma string terminada em null contendo o c odigo de erro SQLSTATE para o u ltimo erro. O c odigo de erro consiste de cinco caracteres. 00000 signica sem erros. Os valores s ao especicados pelo ANSI SQL e ODBC. Para uma lista de valores poss iveis, veja Se c ao 13.1 [Error-returns], P agina 885. Note que nem todos os erros j a est ao mapeados para SQLSTATE. O valor HY000 (erro geral) e usado para erros n ao mapeados. Esta fun c ao foi adicionada ao MySQL 4.1.1.
Valores Retornados
Uma string terminada em null contendo o c odigo de erro SQLSTATE.
Veja Tamb em
Veja Se c ao 12.1.3.12 [mysql errno], P agina 788. Veja Se c ao 12.1.3.13 [mysql error], P agina 788. Veja Se c ao 12.1.7.18 [mysql stmt sqlstate], P agina 851.
12.1.3.52 mysql_ssl_set()
int mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher)
Descri c ao
mysql_ssl_set() e usado para estabelecer conex ao segura usando SSL. Ela deve ser chamada antes de mysql_real_connect().
818
mysql_ssl_set() n ao faz nada a mesno que o suporte OpenSSL esteja habilitado na biblioteca cliente. mysql e o handler da conex ao retornado de mysql_init(). Os outros par ametros s ao especicados como a seguir: key e o caminho para o arquivo de chave. cert e o caminho para o arquivo do certicado. ca e o caminho para o arquivo de autoridade do certicado. capath e o caminho para um diret orio que cont em certicados SSL CA con aveis no formato pem. cipher e a lista de cifras permitidas para uso para criptograa SSL. Qualquer par ametro SSL n ao utilizado pode ser dado com NULL.
Valores Retornados
Esta fun c ao sempre retorna 0. Se a congura c ao SSL est a incorreta, mysql_real_connect() retornar a um erro quando voc e tentar se conectar.
12.1.3.53 mysql_stat()
char *mysql_stat(MYSQL *mysql)
Descri c ao
Retorna uma string contendo informa c oes sinmilares a aquelas fornecidas pelo comando mysqladmin status. Isto inclui o tempo de conex ao em segundos e o n umero de threads em execu c ao, recargas e tabelas abertas.
Valor Retornado
Uma string descrevendo o status do servidor. NULL se um erro ocorrer.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
819
12.1.3.54 mysql_store_result()
MYSQL_RES *mysql_store_result(MYSQL *mysql)
Descri c ao
Voc e deve chamar mysql_store_result() ou mysql_use_result() para cada consulta que retorne dados com sucesso (SELECT, SHOW, DESCRIBE, EXPLAIN). Voc e n ao precisa chamar mysql_store_result() ou mysql_use_result() para outras consultas, mas ele n ao causar a nenhum dano ou nenhuma queda notel de desempenho se voc e chamar mysql_store_result() em todos os casos. Voc e pode detectar se a consulta n ao obteve resultado vericando se mysql_store_result() retornou 0. Se voc e quiser saber se a consulta devia retornar algum resultado, voc e pode utilizar mysql_field_count() para fazer a verica c ao. Veja Se c ao 12.1.3.20 [mysql eld count], P agina 794. mysql_store_result() l e todo o resultado de uma consulta para um cliente, aloca uma estrutura MYSQL_RES e coloca o resultado nesta estrutura. mysql_store_result() retorna um ponteiro para null se a consulta n ao retornar um resultado (se a consulta foi, por exemplo, uma instru c ao INSERT). mysql_store_result() tamb em retorna um ponterio para null se a leitura do resultado falhar. Voc e pode vercar se voc e obteve um erro vericando se mysql_error() n ao retornou um ponterio para null, se mysql_errno() retorna <> 0, ou se mysql_field_count() retorna <> 0. Um resultado vazio e retornado se n ao houver registros a retornar. (Um resultado vazio e diferente de um ponteiro para null em um valor de retorno). Uma vez que voc e tenha chamado mysql_store_result() e tenha retornado um resultado que n ao e uma apontador para null, voc e pode chamar mysql_num_rows() para descobrir quantas linhas existem no resultado. Voc e pode chamar mysql_fetch_row() para buscar registros no resultado ou mysql_row_ seek() e mysql_row_tell() para obter ou denir a poi c ao atual do registro dentro do resultado. Voc e deve chamar mysql_free_result() quando tiver terminado com o resultado. Veja Se c ao 12.1.12.1 [NULL mysql_store_result()], P agina 857.
Valor Retornado
Uma estrutura de resultado MYSQL_RES com o resultado. NULL se um erro ocorreu.
Erros
mysql_store_result() zera mysql_error e mysql_errno se ela obter sucesso. CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada.
820
CR_OUT_OF_MEMORY Sem memoria. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.55 mysql_thread_id()
unsigned long mysql_thread_id(MYSQL *mysql)
Descri c ao
Retorna a ID da thread da conex ao atual. Este valor pode ser usado como um argumento para mysql_kill() para nalizar a thread. Se a conex ao for perdida e voc e reconectar com mysql_ping(), a ID da thread ir a alterar. Isto signica que voc e deve obter a ID da thread e guard a-la para uso posterior. Voc e deve obt e-la quando precisar dela.
Valor Retornado
A ID da thread da conex ao atual.
Erros
Nenhum.
12.1.3.56 mysql_use_result()
MYSQL_RES *mysql_use_result(MYSQL *mysql)
Descri c ao
Voc e deve chamar mysql_store_result() ou mysql_use_result() para cada consulta que retornar data com sucesso (SELECT, SHOW, DESCRIBE, EXPLAIN). mysql_use_result() inicicia a recupera c ao de um resultado mas n ao l e realmente o resultado no cliente como mysql_store_result() faz. Cada regiostro deve ser recuperado individualmente fazendo chamadas a mysql_fetch_row(). Ele l e o resultado de uma consulta diretamente do servidor sem armazenar em uma tabela tempor aria ou em um buer local, o o que e mais r apido e utiliza menos mem oria que mysql_store_result(). O cliente s io ir a alocar mem oria para o registro atual para o buer de comunica c ao que pode crescer para max_allowed_packet bytes.
821
Por outro lado , voc e n ao deve utilizar mysql_use_result() se voc e estiver fazendo v arios processamentos para cada registros no lado do cliente, ou se a sa ida e enviada para a tela, na qual o usu ario de digitar um ^S (parada de tela). Isto ir a prender o servidor e impedir outras threads de atualizar qualquer tabela na qual o dados esteja sendo buascado. Ao usar mysql_use_result(), voc e deve executar mysql_fetch_row() at e um valor NULL ser retornado, sen ao, os registros n ao buscados retornar ao como part do resultado de sua pr oxima consulta. A API C fornecer a o erro Commands out of sync; you cant run this command now se voc e esquecer de faz e-lo. Voc e n ao pode utilizar mysql_data_seek(), mysql_row_seek(), mysql_row_tell(), mysql_num_rows(), ou mysql_affected_rows() com m resultado retornado de mysql_use_result(), nem pode executar outras consultas at e que mysql_use_result() tenha nalizado. (No entanto, depois de buscar todos os regitros, mysql_num_rows() retornar a corretamente o n umero de regiostros buscados). Voc e deve chamar mysql_free_result() ap os terminar de utilizar o resultado.
Valor Retornado
Uma estrutura de resultado MYSQL_RES. NULL se ocorrer um erro.
Erros
mysql_use_result() zera mysql_error e mysql_errno se ela obter sucesso. CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_OUT_OF_MEMORY Sem mem oria. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.57 mysql_commit()
my_bool mysql_commit(MYSQL *mysql)
Descri c ao
Faz um commits na transa c ao atual. Dispon ivel no MySQL 4.1
Valor Retornado
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
822
Erros
Nenhum.
12.1.3.58 mysql_rollback()
my_bool mysql_rollback(MYSQL *mysql)
Descri c ao
Faz um rollback na transa c ao atual. Dispon ivel no MySQL 4.1
Valor Retornado
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
Erros
Nenhum.
12.1.3.59 mysql_autocommit()
my_bool mysql_autocommit(MYSQL *mysql, my_bool mode)
Descri c ao
Dene o modo autocommit como ligado se mode e 1, desligado se mode e 0.
Valor Retornado
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
Erros
Nenhum.
12.1.3.60 mysql_more_results()
my_bool mysql_more_results(MYSQL *mysql)
Descri c ao
Retorna verdade se mais resultados da consulta atualmente em execu c ao existem, e a aplica c ao deve chamar mysql_next_result() para buscar os resultados. Dispon ivel no MySQL 4.1
823
Valor Retornado
TRUE (1) se existem mais resultados. FALSE (0) se n ao existem mais resultados. Note que na maioria dos casos chama-se mysql_next_result() para se mais de um resultado existe e inicia o pr oximo resultado se ele existir. Veja Se c ao 12.1.8 [C API multiple queries], P agina 851. Veja Se c ao 12.1.3.61 [mysql next result], P agina 823.
Erros
Nenhum.
12.1.3.61 mysql_next_result()
int mysql_next_result(MYSQL *mysql)
Descri c ao
Se existem mais resultados da consulta, mysql_next_result() l e o pr oximo resultado da consulta e retorna o status a aplica c ao. Disponivel no MySQL 4.1 Note que voc e deve chamar mysql_free_result() para a consulta anterior se ela retornar um resultado. Depois de chamar mysql_next_result() o estado da conex ao e como se tivesse chamado mysql_real_query() para a prima consulta. Isto signica que voc e agora pode chamar mysql_store_result(), mysql_warning_count(), mysql_affected_rows() ... na conex ao. Se mysql_next_result() retorna um erro, nenhuma outra instru c ao ser a executada e n ao haver a mais resultado para buscar. Veja Se c ao 12.1.8 [C API multiple queries], P agina 851.
Valor Retornado
0 em caso de sucesso e haver mais resultados. -1 se n ao houver mais resultados. > 0 se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. Por exemplo se voc e n ao chamar mysql_use_result() para um resulatdo anterior. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta.
824
825
A estrutura MYSQL_BIND cont em os seguintes membros para uso em aplicativos. Cada um deles utiliza tanto a entrada quanto a sa ida, embora algumas vezes sejam para diferentes prop ositos dependendo da dire c ao da transfer6encia de dados: enum enum_field_types buffer_type O tipo do buer. Os valores de buffer_type est ao listados posteriormente nesta se c ao. Para entrada, buffer_type indica que tipo de valor voc e est a ligando a um par ametro de uma consulta. Para a sa ida, ele indica que tipo de valor voc e espera receber em um buer de resultado. void *buffer Para entrada, este e um ponteiro para o buer no qual os dados de par ametros de uma consulta, est ao armazenados. Para sa ida, ele e um ponteiro para o buer no qual se deve retornar o valor de uma coluna do resultado. Para tipos num ericos, o buffer deve apontar para uma vari avel do tipo C apropriado. (Se voc e estiver associando a vari avel com uma coluna que tem o atributo UNSIGNED, a vari avel deve ser um tipo C unsigned.) Para colunas de tipo data e hora, o buffer deve apontar para uma estrutura MYSQL_TIME. Para colunas do tipo caracter e string bin aria, o buffer aponta para um buer de caracter. unsigned long buffer_length O tamanho atual de *buffer em bytes. Ele indica a quantidade m axima de dados que pode ser armazenado no buer. Para caracteres e dados C bin arios, o valor buffer_length especica o tamanho do *buffer quando utilizado com mysql_bind_param(), ou o n umero m aximo de bytes de dados que pode ser buscado em um buer quando usado com mysql_bind_result(). unsigned long *length Um ponteiro para uma vari avel unsigned long que indica o n umero atual de bytes de dados armazenado em *buffer. length e usado e usado para caracteres e dados C bin arios. Para a liga c ao dos dados do par ametro de entrada, length aponta para uma vari avel unsigned long que indica o tamanho do valor do par ametro armazenado em *buffer; isto e usado pelo mysql_execute(). Se o tamanho e um ponteiro nulo, o protocolo assume que todos os caracteres e dados bin arios s ao terminaodos com null. Para liga c ao dos valores de sa ida, mysql_fetch() coloca o tamanho dos valores de coluna retornados na vari avel para onde o *length aponta. length e ignorado por tipos de dados num ericos e trmporais porque o tamanho do valord dos dados e determinado pelo valor buffer_ type.
826
bool *is_null Este membro aponta para uma vari avel my_bool que e verdadeiro se um valor e NULL, falso se ele n ao e NULL. Para entrada, dena *IS_NULL como verdadeiro para indicar que voc e est a passando um valor NULL como um par ametro. Para saida, este valor e verdadeiro se o valor de um resultado retornado de uma consulta e NULL. MYSQL_TIME Esta estrutura e utilizada para enviar e receber dados DATE, TIME, DATETIME e TIMESTAMP diretamente de e para o servidor. Isto e feito congurando o membro buffer_type de uma estrutura MYSQL_BIND para um dos tipos temporais e congurando o membro buffer para apontar para uma estrutura MYSQL_TIME. A estrutura MYSQL_TIME cont em os seguintes membros: unsigned int year O ano. unsigned int month O m es do ano. unsigned int day O dia do m es. unsigned int hour A hora do dia. unsigned int minute O minuto da hora. unsigned int second Os segundos. my_bool neg Um par ametrio booleano para indicar se o tempo e negativo. unsigned long second_part A parte fracion aria do segundo. Este membro n ao e atualmente usado. Apenas aquelas partes de uma estrutura MYSQL_TIME que se aplica a um dado tipo de valor temporal s ao usados: Os elementos year, month e day s ao usados para valores DATE, DATETIME e TIMESTAMP. Os elementos hour, minute e second s ao usados para valores TIME, DATETIME e TIMESTAMP. Veja Se c ao 12.1.9 [C API date handling], P agina 852. A seguinte tabela mostra os valores permitidos que podem ser especicados no membro buffer_type da estrutura MYSQL_BIND. A tabela tamb em mostra aqueles tipos SQL que correspondem mais proximamente a cada valor buffer_type, e, para tipos num ericos e temporais, o tipo C correspondente. buffer_type Valor MYSQL_TYPE_TINY MYSQL_TYPE_SHORT Tipo SQL TINYINT SMALLINT Tipo C char short int
827
MYSQL_TYPE_LONG INT MYSQL_TYPE_LONGLONG BIGINT MYSQL_TYPE_FLOAT FLOAT MYSQL_TYPE_DOUBLE DOUBLE MYSQL_TYPE_TIME TIME MYSQL_TYPE_DATE DATE MYSQL_TYPE_DATETIME DATETIME MYSQL_TYPE_TIMESTAMP TIMESTAMP MYSQL_TYPE_STRING CHAR MYSQL_TYPE_VAR_STRING VARCHAR MYSQL_TYPE_TINY_BLOB TINYBLOB/TINYTEXT MYSQL_TYPE_BLOB BLOB/TEXT MYSQL_TYPE_MEDIUM_BLOB MEDIUMBLOB/MEDIUMTEXT MYSQL_TYPE_LONG_BLOB LONGBLOB/LONGTEXT Uma convers ao de tipo implcita pode ser realizada em ambas
long int long long int float double MYSQL_TIME MYSQL_TIME MYSQL_TIME MYSQL_TIME
as dire c oes.
828
mysql stmt row seek() mysql stmt row tell() mysql stmt num rows() mysql fetch() mysql stmt close() mysql stmt errno() mysql stmt error() mysql stmt sqlstate() mysql send long data()
Busca por um oset de registro no resultado de uma busca, utilizando o valor reotornado de mysql_stmt_row_tell(). Retorna a posi c ao do cursor de registro. Retorna o total de registros do resultado de uma instru c ao armazenada. Busca o pr oximo conjunto de dados do resultado e retorna os dados para todas as colunas limites. Libera a mem oria usada pela instru c ao preparada. Retorna o n umero de erro para a u ltima instru c ao executada. Retorna a mensagem de erro para a u ltima instru c ao executada. Retorna o c odigo de erro SQLSTATE para a execu c ao da u ltima instru c ao. Envia dados longos em blocos para o servidor.
Chama mysql_prepare() para preparar e iniciar o manipulador de instru c oes, mysql_bind_ param() para fornecer os dados do par ametro e mysql_execute() para executar a consulta. Voc e pode repetir o mysql_execute() alterando o valor do par ametro no buer respectivo fornecido por mysql_bind_param(). Se a consulta e uma instru c ao SELECT ou qualquer outra consulta que produz um resultado, mysql_prepare() tamb em retornar a a informa c ao dos meta dados do resultado na forma de um resultado MYSQL_RES atrav es de um mysql_get_metadata(). Voc e pode forncer o buer de resultado usando mysql_bind_result(), assim mysql_ fetch() retornar a automaticamente os dados para este buer. Esta busca e feita registro a registro. Voc e tamb em pode enviar o texto ou dado bin ario em blocos para o servidor utilizando mysql_send_long_data(), especcando a op c ao is_long_data=1 ou length=MYSQL_LONG_ DATA ou -2 na estrutura MYSQL_BIND fornecida com mysql_bind_param(). Quando a execu c ao for completada, o handler da instru c ao deve ser fechado usando mysql_ stmt_close() para que todos os recursos associados a ele sejam liberados. Se voc e obteve os metadados de um resultado de uma instru c ao SELECT chamando mysql_ get_metadata(), voc e tamb em deve liber a-lo usando mysql_free_result().
Execution Steps:
Para prepara e executar uma instru c ao, uma aplica c ao: 1. Chama mysql_prepare() e passa uma string contendo uma instru c ao SQL. Em uma opera c ao de preparo bem sucedida, o mysql_prepare retorna o manipulador de instru c ao v alido para a aplica c ao.
829
2. Se a consulta produz um resultado, chama mysql_get_metadata para obter o conjunto de resultado de metadados. Este metadado est a na forma de um resultado, embora um separado daqueles que cont em as linhas retornadas pela consulta. O resultado de metadados indica quantos colunas est ao no resultado e cont em informa c oes sobre cada coluna. 3. Dene o valor de qualquer par ametro usando mysql_bind_param. Todos os par ametros devem ser denidos. De outra forma a execu c ao da consulta retornar a um erro ou produzir a resultados inesperados. 4. Chama mysql_execute() para executar a instru c ao. 5. Se a consulta produz um resultado, liga o buer de dados usado para retornar o valor do registro chamando mysql_bind_result(). 6. Busca os dados no buer, registro a registro chamando mysql_fetch() repetidas vezes at e n ao haver mais registros. 7. Repete os passos de 3 a 6 como necess ario, alterando o valor dos par ametros e reexecutando a instru c ao. Quando mysql_prepare() e chamado, o protocolo cliente/servidor do MySQL realiza as seguintes a c oes: O servidor analiza a consulta e envia o status de OK de volta para o cliente atribuindo uma identica c ao de instru c ao. Ele tamb em envia um n umero total de par ametros, uma contagem de colunas e sua meta informa c ao se for um resultado orientado a consulta. Toda a sintaxe e sem antica da consulta e vericada pelo servidor durante a chamada. O cliente utiliza esta identica c ao da instru c ao para as opera c oes adicionais, assim o servidor pode identicar a instru c ao dentre outras existentes. O cliente tamb em aloca um manipulador de instru c oes com esta identica c ao e o retorna para a aplica c ao. Quando o mysql execute() e chamado, no protocolo cliente/servidor do MySQL realiza as seguintes opera c oes: O cliente utiliza o manipulador de instru c oes e envia o dado do par ametro para o servidor. O servidor identica a instru c ao usando a identica c ao fornecida pelo cliente, substitui o marcador do par ametro com o dado fornecido mais recente e executa a consulta. Se a consulta produz um resultado, o servidor envia o dado de volta para o cliente. Sen ao envia o status de OK como n umero total de registros alterados, deletados ou inseridos. Quando mysql_fetch() e chamado, no protocolo cliente/servidor do MySQL realiza as seguintes a c oes: O cliente l e os dados do pacote registro por registro e o coloca no buer de dados da aplica c ao fazendo as convers oes necess arias. Se o tipo do buer de aplica c ao e o mesmo do tipo do campo retornado do servidor, as convers oes s ao diretas. Voc e pode obter o c odigo de erro, mensagens e o valor SQLSTATE da instru c ao utilizando mysql_stmt_errno(), mysql_stmt_error() e mysql_stmt_sqlstate() respectivamente.
830
12.1.7.1 mysql_prepare()
MYSQL_STMT * mysql_prepare(MYSQL *mysql, const char *query, unsigned long length)
Descri c ao
Prepara a consulta SQL apontada pela string com termina c ao em nulo query, e retorna um handle da instru c ao para ser usado por opera c oes adicionais na instru c ao. A consulta deve consistir de uma u nica instru c ao SQL. Voc e n ao deve adicionar ponto e virgula (;) ou \g a instru c ao. A aplica c ao pode incluir um ou mais marcadores de par ametro na instru c ao SQL, embutindo interroga c oes (?) na string SQL na posi c ao aprpriada. Os marcadores s o s ao v alidos em certos lugares na instru c ao SQL. Por exemplo, eles n ao s ao permitidos em lista VALUES() de uma instru c ao INSERT (para especicar valores para uma linha ou em uma compara c ao com uma coluna em uma cl ausula WHERE para especicar uma valor de compara c ao. No entanto, eles n ao s ao permitidos como identicadores (tais como nomes de colunas ou tabelas), na lista select que indica as colunas a serem retornadas por uma instru c ao SELECT), ou para especicar ambos operandos de um operador bin ario como o sinal de igual =. A u ltima restri c ao e necess aria porque seria impossivel determinar o tipo do par ametro. Em geral, par ametros s ao v alidos somente em instru c ao de Linguagem de Manipula c ao de Dados (Data Manipulation Languange-DML), e n ao em instru c oes de Linguagem de Deni c ao de Dados (Data Denation Language-DDL). Os marcadores de par ametro devem limitar vari aveis de aplica c oes utilizando mysql_bind_ param() antes de executar a instru c ao.
Valor Retornado
Um ponteiro para uma estrutura MYSQL_STMT se o preparo obteve sucesso. NULL se ocorreu um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_OUT_OF_MEMORY Falta de mem oria CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
831
Se o preparo n ao obteve sucesso (isto e, mysql_prepare() retorna um ponteiro NULL), as mensagens de erros podem ser obtidas chamando mysql_error().
Exemplo
Para o uso de mysql_prepare() consulte o exemplo de Se c ao 12.1.7.5 [mysql_execute()], P agina 833.
12.1.7.2 mysql_param_count()
unsigned long mysql_param_count(MYSQL_STMT *stmt)
Descri c ao
Retorna o n umero de marcadores de par ametros presentes na consulta preparada.
Valor Retornado
Um unsigned long (inteiro sem sinal) representando o n umero de par ametros em uma instru c ao.
Erros
Nenhum.
Exemplo
Para utilizar mysql_param_count() consulte o exemplo de Se c ao 12.1.7.5 [mysql_ execute()], P agina 833.
12.1.7.3 mysql_get_metadata()
MYSQL_RES *mysql_get_metadata(MYSQL_STMT *stmt)
Descri c ao
Se uma instru c ao passada para mysql_prepare() rproduziu um resultado, mysql_get_ metadata() retorna o resultado dos meta dados na forma de um ponteiro para uma estrutura MYSQL_RES que tamb em pode ser usada para processar a meta informa c ao como o n umero total de campos e informa c ao de campos indiv iduais. Este ponteriro para o resultado pode ser passado como um argumento para qualquer um dos campos com base na API que processam o resultado dos metadados, como: mysql_num_fields() mysql_fetch_field()
832
mysql_fetch_field_direct() mysql_fetch_fields() mysql_field_count() mysql_field_seek() mysql_field_tell() mysql_free_result() A estrutura do resultado deve estar liberada quando voc e acabar de us a-lo. Voc e pode semelhante ao modo que voc faz e-lo passando para mysql_free_result(). E e libera um resulatdo chamado com mysql_store_result(). O resultado retornado por mysql_get_metadata() cont em apenas metadados. Ele n ao cont em qualquer resultado de registro. As linhas s ao obtidas usando o handle de instru c ao com mysql_fetch().
Valor Retornado
Uma estrutura de resultado MYSQL_RES. NULL se nenhuma meta informa c ao existe para a consulta preparada.
Erros
CR_OUT_OF_MEMORY Falta de mem oria CR_UNKNOWN_ERROR Ocorreu um erro desconhecido
Exemplo
Para utilizar mysql_get_metadata() [mysql_fetch()], P agina 842 consulte o exemplo de Se c ao 12.1.7.13
12.1.7.4 mysql_bind_param()
my_bool mysql_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind)
Descri c ao
mysql_bind_param() e utilizado para ligar dados para os marcadores de par ametros na instru c ao SQL que foi passada para mysql_prepare(). Ele utiliza a estrutura MYSQL_BIND para fornecer os dados. bind e o endere co de um vetor de estruturas MYSQL_BIND. A biblioteca cliente espera que o vetor deve contenha um elemento para cada marcador de par ametro ? que est a presente na consulta. Suponha que voc e prepare a seguinte instru c ao:
833
INSERT INTO mytbl VALUES(?,?,?) Quando voc e ligar os par ametros, o vetor da estrutura MYSQL_BIND deve conter tr es elementos e pode estar declarado assim: MYSQL_BIND bind[3]; O membro de cada elemento MYSQL_BIND que deve estar congurado est a descrito em Se c ao 12.1.5 [C API Prepared statement datatypes], P agina 824.
Valor Retornado
Zeros se a liga c ao foi obtida com sucesso. Diferente de zero se ocorrer um erro.
Erros
CR_NO_PREPARE_STMT N ao existem instru c oes preparadas CR_NO_PARAMETERS_EXISTS N ao existem par ametros para ligar CR_INVALID_BUFFER_USE Indica se a liga c ao forncer a dados longos em bolcos e se o tipo de buer e bin ario ou n ao e uma string. CR_UNSUPPORTED_PARAM_TYPE A convers ao n ao e suportada. Possivelmente o valor de buffer_type e inv alido ou n ao e um dos tipos suportados listados acima. CR_OUT_OF_MEMORY Falta de mem oria CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
Exemplo
Para utilizar mysql_bind_param() consulte o exemplo de Se c ao 12.1.7.5 [mysql_ execute()], P agina 833.
12.1.7.5 mysql_execute()
int mysql_execute(MYSQL_STMT *stmt).
Descri c ao
mysql_execute() executa a consulta preparada associada ao controlador de instru c oes. O valor atual do marcador de par ametros e enviado para o servidor durante esta chamada, e o servidor substituir marcadores com os novos dados fornecidos.
834
Se a instru c ao e um UPDATE, DELETE ou INSERT, o n umero total de registros altrados, deletados ou inseridos pode ser encontrado chamando mysql_stmt_affected_rows(). Se este e um resultado de uma consulta como SELECT, deve se chamar mysql_fetch() para buscar dados previamente para fazer qualquer outra fun c ao que resulte em um processamento de consulta. Para mais informa c oes sobre como buscar os resultados, consulte Se c ao 12.1.7.13 [mysql_fetch()], P agina 842
Valor Retornado
Zero se a execu c ao obteve sicesso. Diferente de zero se ocorreu um erro. O c odigo de erro e a mensagem podem ser obtidas chamando mysql_stmt_errno() e mysql_stmt_error().
Erros
CR_NO_PREPARE_QUERY Nenhuma consulta preprada previamente para execu c ao CR_ALL_PARAMS_NOT_BOUND N ao forma fornecidos todos os dados de par ametros. CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_OUT_OF_MEMORY Falta de mem oria CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
Exemplo
O seguinte exemplo demonstra como criar e preencher uma tabela usando mysql_ prepare(), mysql_param_count(), mysql_bind_param(), mysql_execute() e mysql_stmt_affected_rows(). A vari avel mysql e considerada como um controlador de conex ao v alido. #define STRING_SIZE 50 #define DROP_SAMPLE_TABLE "DROP TABLE IF EXISTS test_table" #define CREATE_SAMPLE_TABLE "CREATE TABLE test_table(col1 INT,\ col2 VARCHAR(40),\ col3 SMALLINT,\ col4 TIMESTAMP)" #define INSERT_SAMPLE "INSERT INTO test_table(col1,col2,col3) VALUES(?,?,?)"
835
MYSQL_STMT MYSQL_BIND my_ulonglong int short int char unsigned long my_bool
if (mysql_query(mysql, DROP_SAMPLE_TABLE)) { fprintf(stderr, " DROP TABLE failed\n"); fprintf(stderr, " %s\n", mysql_error(mysql)); exit(0); } if (mysql_query(mysql, CREATE_SAMPLE_TABLE)) { fprintf(stderr, " CREATE TABLE failed\n"); fprintf(stderr, " %s\n", mysql_error(mysql)); exit(0); } /* Prepare an INSERT query with 3 parameters */ /* (the TIMESTAMP column is not named; it will */ /* be set to the current date and time) */ stmt = mysql_prepare(mysql, INSERT_SAMPLE, strlen(INSERT_SAMPLE)); if (!stmt) { fprintf(stderr, " mysql_prepare(), INSERT failed\n"); fprintf(stderr, " %s\n", mysql_error(mysql)); exit(0); } fprintf(stdout, " prepare, INSERT successful\n"); /* Get the parameter count from the statement */ param_count= mysql_param_count(stmt); fprintf(stdout, " total parameters in INSERT: %d\n", param_count); if (param_count != 3) /* validate parameter count */ { fprintf(stderr, " invalid parameter count returned by MySQL\n"); exit(0); }
836
/* Bind the data for all 3 parameters */ /* INTEGER PARAM */ /* This is a number type, so there is no need to specify buffer_length */ bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&int_data; bind[0].is_null= 0; bind[0].length= 0; /* STRING PARAM */ bind[1].buffer_type= MYSQL_TYPE_VAR_STRING; bind[1].buffer= (char *)str_data; bind[1].buffer_length= STRING_SIZE; bind[1].is_null= 0; bind[1].length= &str_length; /* SMALLINT PARAM */ bind[2].buffer_type= MYSQL_TYPE_SHORT; bind[2].buffer= (char *)&small_data; bind[2].is_null= &is_null; bind[2].length= 0; /* Bind the buffers */ if (mysql_bind_param(stmt, bind)) { fprintf(stderr, " mysql_bind_param() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Specify the data values for the first row */ int_data= 10; /* integer */ strncpy(str_data, "MySQL", STRING_SIZE); /* string str_length= strlen(str_data); /* INSERT SMALLINT data as NULL */ is_null= 1; /* Execute the INSERT statement - 1*/ if (mysql_execute(stmt)) { fprintf(stderr, " mysql_execute(), 1 failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Get the total number of affected rows */
*/
837
affected_rows= mysql_stmt_affected_rows(stmt); fprintf(stdout, " total affected rows(insert 1): %ld\n", affected_rows); if (affected_rows != 1) /* validate affected rows */ { fprintf(stderr, " invalid affected rows by MySQL\n"); exit(0); } /* Specify data values for second row, then re-execute the statement */ int_data= 1000; strncpy(str_data, "The most popular open source database", STRING_SIZE); str_length= strlen(str_data); small_data= 1000; /* smallint */ is_null= 0; /* reset */ /* Execute the INSERT statement - 2*/ if (mysql_execute(stmt)) { fprintf(stderr, " mysql_execute, 2 failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Get the total rows affected */ affected_rows= mysql_stmt_affected_rows(stmt); fprintf(stdout, " total affected rows(insert 2): %ld\n", affected_rows); if (affected_rows != 1) /* validate affected rows */ { fprintf(stderr, " invalid affected rows by MySQL\n"); exit(0); } /* Close the statement */ if (mysql_stmt_close(stmt)) { fprintf(stderr, " failed while closing the statement\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); }
Nota: Para exemplos completos do uso das fun c oes de instru c oes preparadas, veja tests/client_test.c. Este arquivo pode ser obtido em uma distribui c ao fonte ou do reposit orio do Bitkeeper.
838
12.1.7.6 mysql_stmt_affected_rows()
my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt)
Descri c ao
Retorna o n umero total de registros alterados, deletados ou inseridos pela u ltima instru c ao executada. Pode ser chamada imediatamente depois de mysql_execute() para instru c oes UPDATE, DELETE ou INSERT. Para instru c oes SELECT, mysql_stmt_affected_rows() funciona como mysql_num_rows().
Valor Retornado
Um integer (inteiro) maior que zero indica o n umero de registros afetados ou retornados. Zero indica que nenhum registro foi atualizado em uma instru c ao UPDATE, nenhum regitro coincidiu com a cl ausula WHERE na consulta ou que nenhuma consulta foi exeutada ainda. 1 indica que a consulta retornou um erro ou que, para uma consulta SELECT, mysql_stmt_ affected_rows() foi chamado antes de chamra mysql_fetch().
Erros
Nenhum.
Exemplo
Para utilizar mysql_stmt_affected_rows() consulte o exemplo de Se c ao 12.1.7.5 [mysql_ execute()], P agina 833.
12.1.7.7 mysql_bind_result()
my_bool mysql_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind)
Descri c ao
mysql_bind_result() e usado para associar (ligar) colunas no resultados ao buer de dados e buer de tamanho. Quando mysql_fetch() e chamado para buscar dados, o protocolo cliente/servidor MySQL os coloca os dados para as colunas limite no buer especicado. Note que todas as colunas devem ser limitadas por buers antes da chamada de mysql_ fetch(). bind e o endere co de um vetor de estruturas MYSQL_BIND. A biblioteca cliente espera que o vetor contenha um elemento para cada coluna no resultado. Sen ao mysql_ fetch() simplesmente ignorado os dados trazidos; os buers devem se sucientemente grande para guardar os dados, porque o protocolo n ao retorna dados em blocos. Uma coluna pode ser limitada a qualquer hora, mesmo depois do resultado ter sido parcialmente recuperado. A nova liga c ao tem efeito ba pr oxima vez em que mysql_fetch()
839
e chamado. Suponha que uma aplica c ao liga a coluna em um resultado e chama mysql_ fetch(). O protocolo cliente/servidor retorna dados em buers limitados. Agora suponha que a aplica c ao ligue a coluna a um diferente cojunto de buers, ent ao o protocolo n ao coloca os dados em um novo buer limitado at e que a pr oxima chamada mysql_fetch() ocorra. Para ligar uma coluna, uma aplica c ao chama mysql_bind_result() e passa o tipo, o endere co e o endere co do buer do tamanho. Os membros de cada elemento MYSQL_BIND que deve ser congurado est ao descritos em Se c ao 12.1.5 [C API Prepared statement datatypes], P agina 824.
Valor Retornado
Zero se a liga c ao obteve sucesso. Diferente de zero se ocorreu um erro.
Erros
CR_NO_PREPARE_STMT N ao existe instru c oes preparadas CR_UNSUPPORTED_PARAM_TYPE A convers ao n ao e suportada. Possivelmente o buffer_type e inv alido ou n ao na lista dos tipos de buers suportados CR_OUT_OF_MEMORY Falta de mem oria CR_UNKNOWN_ERROR Ocorreu um erro desconhecido
Exemplo
Para utilizar mysql_bind_result() consulta o exemplo de Se c ao 12.1.7.13 [mysql_ fetch()], P agina 842
12.1.7.8 mysql_stmt_store_result()
int mysql_stmt_store_result(MYSQL_STMT *stmt)
Descri c ao
Voc e deve chamar mysql_stmt_store_result() para cada consulta que produz um resultado com sucesso (SELECT,SHOW,DESCRIBE, EXPLAIN), e s o se voc e quiser armazenar todo o resultado no buer no cliente, assim que a chamada mysql_fetch() subsequente retornar os dados em buers. Voc e e necess ario chamar mysql_stmt_store_result() para outras consultas, mas se voc e o zer, n ao causar a nenhum dano ou queda de performance em todo caso. Voc e pode detectar se a consulta produziu um resultado vericado se mysql_get_metadata() retorna NULL. Para mais informa c oes consulte Se c ao 12.1.7.3 [mysql_get_metadata()], P agina 831.
840
Valor Retornado
Zero se o resultado foi armazenado em buer com sucesso ou Diferente de zero em caso de erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_OUT_OF_MEMORY Falta de memoria. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.7.9 mysql_stmt_data_seek()
void mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset)
Descri c ao
Busca um registro arbitr ario no resultado de uma instru c ao. O valor do offset e um n umero de registro e deve estar na faixa de 0 a mysql_stmt_num_rows(stmt)-1. Esta fun c ao exige que a estrutura do resultado da instru c ao contenha todo o resultado da u ltima consulta executada, assim mysql_stmt_data_seek() pode ser usada em conjunto apenas com mysql_stmt_store_result().
Valor Retornado
Nenhum.
Erros
Nenhum.
12.1.7.10 mysql_stmt_row_seek()
MYSQL_ROW_OFFSET mysql_stmt_row_seek(MYSQL_STMT *stmt, MYSQL_ROW_OFFSET offset)
841
Descri c ao
Dene o cursor de linha com um registro arbitr ario em um resultado de instru c ao. O valor do offset e um oset de registro e deve ser um valor retornado de mysql_stmt_row_tell() ou mysql_stmt_row_seek(). Este valor n ao e um n umero de linha; se voc e quiser buscar um registro em um resultado usando um n umero de linha, utilize mysql_stmt_data_seek(). Esta fun c ao exige que a estrutura do resultado contenha todo o resultado da consulta, assim mysql_stmt_row_seek() pode ser usado em conjunto apenas com mysql_stmt_store_ result().
Valor Retornado
O valor anterior do cursor de linha. Este valor pode ser passado a uma chamada subsequente de mysql_stmt_row_seek().
Erros
Nenhum.
12.1.7.11 mysql_stmt_row_tell()
MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT *stmt)
Descri c ao
Retorna a posi c ao corrente do cursor de linha para o u ltimo mysql_fetch(). Este valor pode ser usado como um argumento para mysql_stmt_row_seek(). Voc e deve usar mysql_stmt_row_tell() somente depois de mysql_stmt_store_result().
Valor Retornado
O oset atual do cursor de linha.
Erros
Nenhum.
12.1.7.12 mysql_stmt_num_rows()
my_ulonglong mysql_stmt_num_rows(MYSQL_STMT *stmt)
842
Descri c ao
Rertorna o n umero de registros no resultado. O uso de mysql_stmt_num_rows() depende de se voc e utilizou ou n ao mysql_stmt_store_ result() para armazenar todo o resultado no manipulador de instru c oes. Se voc e utilizou mysql_stmt_store_result(), mysql_stmt_num_rows() pode ser chamado imediatamente.
Valor Retornado
O n umero de linhas no resultado.
Erros
Nenhum.
12.1.7.13 mysql_fetch()
int mysql_fetch(MYSQL_STMT *stmt)
Descri c ao
mysql_fetch() retorna o pr oximo registro no resultado. Ele pode ser chamado apenas enquanto existir o conjunto de resultados. Per exemplo, depois de uma chamada de mysql_ execute() que cria o resultado ou depois de mysql_stmt_store_result(), que e chamado depois de mysql_execute() para armazenar todo o resultado. mysql_fetch retorna os dados de uma linha usando o buers limitado por mysql_bind_ result(). Ele retorna os dados neste buer para todas as colunas no registro atual e os tamanhos s ao retornados para o apontador length. Note que, todas as colunas devem ser limitadas pela aplica c ao antes de chamar mysql_ fetch(). Se um valor do dado buscado e um valor NULL, o valor *is_null da estrutura MYSQL_BIND correspondente cont em VERDADEIRO (1). Sen ao, o dado e seu tamanho e retornado nos elementos *buffer e *length baseados no tipo de buer especicado pela aplica c ao. Cada tipo num erico e temporal tem um tamanho xo como mostrado na tabela a seguir. O tamano dos tipos strings dependem do tasmanho do valor dos dados atual, como indicado por data_length. Type Length MYSQL_TYPE_TINY 1 MYSQL_TYPE_SHORT 2 MYSQL_TYPE_LONG 4 MYSQL_TYPE_LONGLONG 8 MYSQL_TYPE_FLOAT 4 MYSQL_TYPE_DOUBLE 8
843
MYSQL_TYPE_TIME MYSQL_TYPE_DATE MYSQL_TYPE_DATETIME MYSQL_TYPE_TIMESTAMP MYSQL_TYPE_STRING MYSQL_TYPE_VAR_STRING MYSQL_TYPE_TINY_BLOB MYSQL_TYPE_BLOB MYSQL_TYPE_MEDIUM_BLOB MYSQL_TYPE_LONG_BLOB
sizeof(MYSQL_TIME) sizeof(MYSQL_TIME) sizeof(MYSQL_TIME) sizeof(MYSQL_TIME) tam_dado tam_dado tam_dado tam_dado tam_dado tam_dado
Valor Retornado
Valor retornado 0 1 MYSQL_NO_DATA Descri c ao Sucesso, o dado foi buscado para o buers de dados da aplica c ao. Ocorreu um erro. O c odigo e a mensagem de erro podem ser obtidos chamando mysql_stmt_errno() e mysql_ stmt_error(). N ao existem mais registros/dados
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_OUT_OF_MEMORY Falta de memoria. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conex ao ao servidor MySQL foi perdida durante a consulta. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu. CR_UNSUPPORTED_PARAM_TYPE O tipo de buer e MYSQL_TYPE_DATE, MYSQL_TYPE_TIME, MYSQL_TYPE_ DATETIME, ou MYSQL_TYPE_TIMESTAMP, mas o tipo de dado n ao e DATE, TIME, DATETIME ou TIMESTAMP. Todos os outros erros de convers ao n ao suportada s ao retornados de mysql_ bind_result().
Exemplo
O seguinte exemplo demonstra como buscar dados de uma tabela usando mysql_get_ metadata(), mysql_bind_result() e mysql_fetch(). (Este exemplo espera recuperar
844
as duas linahs inseridas pelo exemplo mostrado em Se c ao 12.1.7.5 [mysql_execute()], P agina 833.) A vari avel mysql considerada como um handle de conex ao v alido handle. #define STRING_SIZE 50 #define SELECT_SAMPLE "SELECT col1, col2, col3, col4 FROM test_table" MYSQL_STMT MYSQL_BIND MYSQL_RES MYSQL_TIME unsigned long int short int char my_bool *stmt; bind[4]; *prepare_meta_result; ts; length[4]; param_count, column_count, row_count; small_data; int_data; str_data[STRING_SIZE]; is_null[4];
/* Sample which is incorporated directly in the manual under Prepared statements section (Example from mysql_fetch() */ /* Prepare a SELECT query to fetch data from test_table */ stmt = mysql_prepare(mysql, SELECT_SAMPLE, strlen(SELECT_SAMPLE)); if (!stmt) { fprintf(stderr, " mysql_prepare(), SELECT failed\n"); fprintf(stderr, " %s\n", mysql_error(mysql)); exit(0); } fprintf(stdout, " prepare, SELECT successful\n"); /* Get the parameter count from the statement */ param_count= mysql_param_count(stmt); fprintf(stdout, " total parameters in SELECT: %d\n", param_count); if (param_count != 0) /* validate parameter count */ { fprintf(stderr, " invalid parameter count returned by MySQL\n"); exit(0); } /* Fetch result set meta information */ prepare_meta_result = mysql_get_metadata(stmt); if (!prepare_meta_result) {
845
fprintf(stderr, " mysql_get_metadata(), returned no meta information\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Get total columns in the query */ column_count= mysql_num_fields(prepare_meta_result); fprintf(stdout, " total columns in SELECT statement: %d\n", column_count); if (column_count != 4) /* validate column count */ { fprintf(stderr, " invalid column count returned by MySQL\n"); exit(0); } /* Execute the SELECT query */ if (mysql_execute(stmt)) { fprintf(stderr, " mysql_execute(), failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Bind the result buffers for all 3 columns before fetching them */ /* INTEGER COLUMN */ bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&int_data; bind[0].is_null= &is_null[0]; bind[0].length= &length[0]; /* STRING COLUMN */ bind[1].buffer_type= MYSQL_TYPE_VAR_STRING; bind[1].buffer= (char *)str_data; bind[1].buffer_length= STRING_SIZE; bind[1].is_null= &is_null[1]; bind[1].length= &length[1]; /* SMALLINT COLUMN */ bind[2].buffer_type= MYSQL_TYPE_SHORT; bind[2].buffer= (char *)&small_data; bind[2].is_null= &is_null[2]; bind[2].length= &length[2]; /* TIMESTAMP COLUMN */ bind[3].buffer_type= MYSQL_TYPE_TIMESTAMP; bind[3].buffer= (char *)&ts;
846
bind[3].is_null= &is_null[3]; bind[3].length= &length[3]; /* Bind the result buffers */ if (mysql_bind_result(stmt, bind)) { fprintf(stderr, " mysql_bind_result() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Now buffer all results to client */ if (mysql_stmt_store_result(stmt)) { fprintf(stderr, " mysql_stmt_store_result() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Fetch all rows */ row_count= 0; fprintf(stdout, "Fetching results ...\n"); while (!mysql_fetch(stmt)) { row_count++; fprintf(stdout, " row %d\n", row_count); /* column 1 */ fprintf(stdout, " column1 (integer) : "); if (is_null[0]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %d(%ld)\n", int_data, length[0]); /* column 2 */ fprintf(stdout, " column2 (string) : "); if (is_null[1]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %s(%ld)\n", str_data, length[1]); /* column 3 */ fprintf(stdout, " column3 (smallint) : "); if (is_null[2]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %d(%ld)\n", small_data, length[2]);
847
/* column 4 */ fprintf(stdout, " column4 (timestamp): "); if (is_null[3]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %04d-%02d-%02d %02d:%02d:%02d (%ld)\n", ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, length[3]); fprintf(stdout, "\n"); } /* Validate rows fetched */ fprintf(stdout, " total rows fetched: %d\n", row_count); if (row_count != 2) { fprintf(stderr, " MySQL failed to return all rows\n"); exit(0); } /* Free the prepared result metadata */ mysql_free_result(prepare_meta_result);
/* Close the statement */ if (mysql_stmt_close(stmt)) { fprintf(stderr, " failed while closing the statement\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); }
12.1.7.14 mysql_send_long_data()
my_bool mysql_send_long_data(MYSQL_STMT *stmt, unsigned int parameter_number, const char *data, ulong length)
Descri c ao
Permite que um aplica c ao envie os dados dos par ametros para o servidor em partes (ou blocos). Esta fun c ao pode ser chamada v arias vezes parar enviar partes de valores de dados bin arios e caracteres para uma coluna, que deve do tipo TEXT ou BLOB. parameter_number indica a qual par ametro o dado e associado. Os par ametros s ao numerados come cando com 0. data e um ponteiro para um buer contendo dados a serem enviados, e length indica a quantidade de bytes no buer.
848
Valor Retornado
Zero se os dados s ao enviados com sucesso para o servidir. Diferente de zero se ocorrer um erro.
Erros
CR_INVALID_PARAMETER_NO N umero de par ametro inv alido CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_OUT_OF_MEMORY Falta de memoria. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
Example
O exemplo seguinte demonstra como enviar os dados para um coluna do tipo TEXT em blocos. Ele insere o dado MySQL - The most popular open source database na coluna text_column. A vari avel mysql e considerada como um handle de conex ao v alido. #define INSERT_QUERY "INSERT INTO test_long_data(text_column) VALUES(?)" MYSQL_BIND bind[1]; long length; if (!mysql_prepare(mysql, INSERT_QUERY, strlen(INSERT_QUERY)) { fprintf(stderr, "\n prepare failed"); fprintf(stderr, "\n %s", mysql_error(mysql)); exit(0); } memset(bind, 0, sizeof(bind)); bind[0].buffer_type= MYSQL_TYPE_STRING; bind[0].length= &length; bind[0].is_null= 0;
849
fprintf(stderr, "\n param bind failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Supply data in chunks to server */ if (!mysql_send_long_data(stmt,0,"MySQL",5)) { fprintf(stderr, "\n send_long_data failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Supply the next piece of data */ if (mysql_send_long_data(stmt,0," - The most popular open source database",40)) { fprintf(stderr, "\n send_long_data failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Now, execute the query */ if (mysql_execute(stmt)) { fprintf(stderr, "\n mysql_execute failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); }
12.1.7.15 mysql_stmt_close()
my_bool mysql_stmt_close(MYSQL_STMT *)
Descri c ao
Fecha a instru c ao preparada. mysql_stmt_close() tamb em desaloca o manipulador de instru c oes apontado por stmt. Se a instru c ao atual tiver resultados pendentes ou n ao lidos, esta fun c ao os cancela para que a pr oxima consulta possa ser executada.
Valor Retornado
Zero se a instru c ao for liberada com sucesso. Diferente de zero se ocorrer um erro.
850
Erros
CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_UNKNOWN_ERROR Ocorreu um erro desconhecido.
Exemplo
Para utilizar mysql_stmt_close() consulte o exemplo de Se c ao 12.1.7.5 [mysql_ execute()], P agina 833.
12.1.7.16 mysql_stmt_errno()
unsigned int mysql_stmt_errno(MYSQL_STMT *stmt)
Descri c ao
Para a instru c ao especicada por stmt, mysql_stmt_errno() retorna o c odigo de erro para a fun c ao de instru c oes da API chamada mais recentemente. Um valor de retorno de zero signica que n ao ocorreu nenhum erro. N umeros de mensagens de erro do cliente est ao listadas no arquivo cabe clho errmsg.h do MySQL. N umeros de mensagens de erro do servidor est ao listado no arquivo mysqld_error.h. Na distribui c ao fonte do MySQL voc e pode encontrar uma lista completa de mensagens de erros e n umero de erros no arquivo Docs/mysqld_error.txt. Os c odigos de erros do servidor tamb em est ao listados em Se c ao 13.1 [Error-returns], P agina 885.
Valor Retornado
Um valor de c odigo de erro. Zero se n ao ocorreu erro.
Erros
Nenhum
12.1.7.17 mysql_stmt_error()
const char *mysql_stmt_error(MYSQL_STMT *stmt)
Descri c ao
Para a instru c ao especicada por stmt, mysql_stmt_error() retorna uma string terminada em null contendo a mensagem de erro para a fun c ao de instru c ao da API chamada mais recentemente. Um string vazia ("") e retornado se n ao ocorreu nenhum erro. Isto signica que os seguintes comandos s ao equivalentes:
851
if (mysql_stmt_errno(stmt)) { // an error occured } if (mysql_stmt_error(stmt)[0]) { // an error occured } A linguagem da mensagem de erro do cliente pode ser alterada recompilando a biblioteca cliente do MySQL. Atualmente voc e pode escolher mensagem de erros em diversas linguagens.
Valor Retornado
Um string contendo a descri c ao do erro. Uma string vazia se n ao ocorrer erros.
Erros
Nenhum
12.1.7.18 mysql_stmt_sqlstate()
const char *mysql_stmt_sqlstate(MYSQL_STMT *stmt)
Descri c ao
Para a intru c ao especicada por stmt, mysql_stmt_sqlstate(), retorna uma string terminada em null contendo o c odigo de erro SQLSTATE para fun c ao API de instru c oes preparadas mais recentemente chamada que tenha obtido sucesso ou falhado. O c odigo de erro consiste de cinco caracteres. "00000" signica sem erros. Os valores s ao especicados pelo ANSI SQL e ODBC. Para uma lista de valores poss iveis, veja Se c ao 13.1 [Error-returns], P agina 885. Note que nem todos os erros j a est ao mapeados para SQLSTATE. O valor "HY000" (erro geral) e usado para erros n ao mapeados.
Valores Retornados
Uma string terminada em null contendo o c odigo de erro SQLSTATE.
852
op c ao CLIENT_MULTI_STATEMENTS no par ametro do mysql_real_connect() quando abrir a conex ao. Voc e tamb em pode congur a-la para uma conex ao chamando mysql_set_server_ option(MYSQL_OPTION_MULTI_STATEMENTS_ON) Por padr ao mysql_query() ou mysql_real_query() retornam apenas o status da primeira consulta e o status das consultas subsequentes podem ser processados usando mysql_more_ results() e mysql_next_result(). /* Connect to server with option CLIENT_MULTI_STATEMENTS */ mysql_real_connect(..., CLIENT_MULTI_STATEMENTS); /* Now execute multiple queries */ mysql_query(mysql,"DROP TABLE IF EXISTS test_table;\ CREATE TABLE test_table(id INT);\ INSERT INTO test_table VALUES(10);\ UPDATE test_table SET id=20 WHERE id=10;\ SELECT * FROM test_table;\ DROP TABLE test_table"; do { /* Process all results */ ... printf("total affected rows: %lld", mysql_affected_rows(mysql)); ... if (!(result= mysql_store_result(mysql))) { printf(stderr, "Got fatal error processing query\n"); exit(1); } process_result_set(result); /* client function */ mysql_free_result(mysql); }while (!mysql_more_results(mysql))
853
valores DATE, TIME, DATETIME, ou TIMESTAMP congure buffer_type para MYSQL_TYPE_ DATE, MYSQL_TYPE_TIME, MYSQL_TYPE_DATETIME, ou MYSQL_TYPE_TIMESTAMP repectivamente. 2. Congure o membro buffer da estrutura MYSQL_BIND com o endere co da estrutura MYSQL_TIME na qual voc e passr a o valor temporal. 3. Preencha os membros da estrutura MYSQL_TIME que s ao apropriadas para o tipo de valor temporal que voc e est a passando. Use mysql_bind_param() para ligar os dados do par ametro a instru c ao. Ent ao chame mysql_execute(). Para recuperar valores temporais, o procedimento e similar, exceto pelo fato de que voc e congura o membro buffer_type com o valor que voc e espera receber e o membro buffer com o endere co de uma estrutura MYSQL_TIME na qual o valor retornado deve ser colocado. Use mysql_bind_results() para ligar o buer a instru c ao depois da chamada de mysql_ execute() e antes de buscar os resultados. Aqui est a um exemplo simples que insere dados DATE, TIME e TIMESTAMP. A vari avel mysql e considerada como um handle de conex ao v alido. MYSQL_TIME MYSQL_BIND MYSQL_STMT ts; bind[3]; *stmt;
strmov(query, "INSERT INTO test_table(date_field, time_field, timestamp_field) VALUES(?,?,?"); stmt= mysql_prepare(mysql, query, strlen(query))); /* define a entrada do buffer com 3 par^ ametros */ bind[0].buffer_type= MYSQL_TYPE_DATE; bind[0].buffer= (char *)&ts; bind[0].is_null= 0; bind[0].length= 0; .. bind[1]= bind[2]= bind[0]; .. mysql_bind_param(stmt, bind); /* fornece os dados a serme enviados na estrutura ts */ ts.year= 2002; ts.month= 02; ts.day= 03; ts.hour= 10; ts.minute= 45; ts.second= 20;
854
mysql_execute(stmt); ..
12.1.10.1 my_init()
void my_init(void)
Descri c ao
Esta fun c ao precisa ser chamada uma vez pelo programa antes de se chamar qualquer fun c ao do MySQL. Ela inicializa algumas var aveis globais que o MySQL precisa. se voc e est a usando uma biblioteca cliente de thread segura, tamb em ser a feita uma chamada a mysql_thread_init() para esta thread. Ela e chamada automaticamente por mysql_init(), mysql_server_init() e mysql_connect().
Valor Retornado
Nenhum
12.1.10.2 mysql_thread_init()
my_bool mysql_thread_init(void)
Descri c ao
Esta fun c ao preisa aser chamada para cada thread criada para inicializar vari aveis espec icas de threads. Ela e automaticamente chamada por my_init() e mysql_connect().
Valor Retornado
Zero se obtver sucesso. Diferente de zero se ocorrer um erro.
12.1.10.3 mysql_thread_end()
void mysql_thread_end(void)
855
Descri c ao
Esta fun c ao precisa ser chamada antes da chamada de pthread_exit() para liberar a mem oria alocada por mysql_thread_init(). Note que a fun c ao n ao e chamada automaticamente pela biblioteca cliente. Deve ser chamada explicitamente para evitar perda de mem oria.
Valor Retornado
Nenhum.
12.1.10.4 mysql_thread_safe()
unsigned int mysql_thread_safe(void)
Descri c ao
Esta fun c ao indica se o cliente e compilado como uma thread segura.
Valor Retornado
1 se o cliente possui thread segura, 0 em outro caso.
12.1.11.1 mysql_server_init()
int mysql_server_init(int argc, char **argv, char **groups)
Descri c ao
Esta fun c ao deve ser chamada uma vez no program usando o servidor embutido antes de se chamar qualquer iutra fun c ao do MySQL. Ela inicia o servidor e inicializa qualquer subsistema (mysys, InnoDB, etc.) que o servidor utilize. Se esta fun c ao n ao for chamada, o programa ir a falhar. Se voc e estiver usando o pacote DBUG que vem com o MySQL, voc e deve chamar esta fun c ao depois de ter chamado MY_INIT(). Os argumentos argc e argv s ao an alogos ao argumentos para o main(). O primeiro elemento de argv e ignorado (ele cont em normalmente, o nome do programa). por conveni encia, argc
856
pode ser 0 (zero) se n ao houver argumentos de linha de comando para o servidor. mysql_ server_init() faz uma copia dos argumentos, assim e seguro destruir argv ou groups depois da chamada. A lista de strings terminadas em NULL em groups seleciona qual grupo no arquivo de op c oes ser a ativado. Veja Se c ao 4.1.2 [Arquivos de op c oes], P agina 217. Por conveni encia, groups deve ser NULL, caso no qual os grupos [server] d [emedded] estar ao ativos.
Exemplo
#include <mysql.h> #include <stdlib.h> static char *server_args[] = { "this_program", /* this string is not used */ "--datadir=.", "--key_buffer_size=32M" }; static char *server_groups[] = { "embedded", "server", "this_program_SERVER", (char *)NULL }; int main(void) { mysql_server_init(sizeof(server_args) / sizeof(char *), server_args, server_groups); /* Use any MySQL API functions here */ mysql_server_end(); return EXIT_SUCCESS; }
Valor Retornado
0 se okay, 1 se ocorrer um erro.
12.1.11.2 mysql_server_end()
void mysql_server_end(void)
Descri c ao
Esta fun c ao deve ser chamada no programa depois de todas outra fun c oes MySQL. Ela naliza o srvidor embutido.
857
Valor Retornado
Nenhum.
12.1.12 D uvidas e problemas comuns ao utilzar a API C 12.1.12.1 Porque Algumas Vezes mysql_store_result() Retorna NULL Ap os mysql_query() Returnar com Sucesso?
poss E ivel para mysql_store_result() retornar NULL seguida de uma chamda com sucesso ao mysql_query(). Quando isto acontece, signica que uma da seguintes condi c oes ocorreu: Existe um falha no malloc() (por exemplo, se o resultado for muito grande). Os dados n ao podem ser lidos (ocorreu um erro na conex ao). A consulta n ao retornou dados (por exemplo, ela era um INSERT, UPDATE, ou DELETE). Voc e sempre pode vericar se a instru c ao devia produzir um resultado n ao vazio chamando mysql_field_count(). Se mysql_field_count() retornar zero, o resultado est a vazio e a u ltima consulta era uma instru c ao que n ao devia retorbar valor (por exemplo, um INSERT ou um DELETE). Se mysql_field_count() retorna um valor diferente se zero, a instru c ao devia ter produzido um resultado n ao vazio. Veja a descri c ao da fun c ao mysql_field_count() para um exemplo. Voc e pode testar um erro chamando mysql_error() ou mysql_errno().
858
859
Para clientes que utilizam arquivos de cabe calho do MySQL, pode ser necess ario especicar a op c ao -I ao compil a-los, (por exemplo, -I/usr/local/mysql/include), assim o compilador pode encontrar o arquivo de cabe calho. Para o mostrado acima de forma simples no Unix, fornecemos o script mysql_config para voc e. Veja Se c ao 4.9.11 [mysql_config], P agina 371. Voc e pode utiliz a-lo para compila o cliente MySQL como a seguir: CFG=/usr/local/mysql/bin/mysql_config sh -c "gcc -o progname $CFG --cflags progname.c $CFG --libs" sh -c e necess ario para fazer com que a sheel n ao trate a sa ida de mysql_config como uma palavra.
860
Duas threads n ao podem enviar uma consaulta ao servidor MySQL ao mesmo tempo na mesma conex ao. Em particular, voc e deve assegurar que entre um mysql_query() e mysql_store_result() nenhuma outra thread est a usando a mesma conex ao. V arias threads podem acess ar resultados diferentes que s ao recuperados com mysql_ store_result(). Se voc e utilizar mysql_use_result, voc e ter a que assegurar que nenhuma outra thread est a usando a mesma conex ao at e que o resultado seja fechado. No entanto, e melhor para clientes em threads que compartilham a mesma conex ao utilizar mysql_store_ result(). Se voc e quiser utilizar m ultiplas threads na mesma conex ao, voc e deve ter uma trava mutex na combina c ao das chamadas mysql_query() e mysql_store_result(). Uma vez que mysql_store_result() esteja pronto, a trva pode ser liberada e outras threads podem utilizar a mesma conex ao. Se voc e programa com threads POSIX, voc e pode utilizar pthread_mutex_lock() e pthread_mutex_unlock() para estabelecer e liberar uma trava mutex. Voc e precisa saber o seguinte se voc e tiver uma thread que estiver chamando fun c oes MySQL que n ao criaram a conex ao ao banco de dados MySQL: Quando voc e chamar mysql_init() ou mysql_connect(), MySQL ir a criar um vari avel especica da thread para a thread que e utilizada pela bibklioteca de depura c ao (entre outra coisas). Se voc e chamar uma fun c ao MySQL, antes da thread chamar mysql_init() ou mysql_ connect(), a thread n ao ter a as vari aveis espec icas de thread necess arias alocadas e voc e acabar a nalizando com uma descarga de mem oria mais cedo ou mais tarde. Para fazer que as coisas funcionem suavemente voc e tem que fazer o seguinte: 1. Chama my_init() no inicio do seu programa se for chamar qualquer outra fun c ao MySQL antes de chamar mysql_real_connect(). 2. Chame mysql_thread_init() no manipulador de thread antes de chamar qualquer outra fun c ao MySQL. 3. Na thread, chame mysql_thread_end() antes de chamar pthread_exit(). Isto ir a liberar a mem oria usada pelas vari aveis espec icas da thread do MySQL. Voc e pode obter alguns erros devido a s imbolos indenidos ao ligar seu cliente com libmysqlclient_r. Na maioria dos casos isto ocorre por n ao estar inclu ida a biblioteca de threads na linha de liga c ao/compila c ao.
12.1.15 libmysqld, a Biblioteca do Servidor Embutido MySQL 12.1.15.1 Vis ao Geral da Biblioteca do Servidor MySQL Embutido
A biblioteca do servidor MySQL embutido torna poss ivel executar um servidor MySQL com todos os recursos dentro de uma aplica c ao cliente. Os principais benef icios s ao o aumento de velocidade e o gerenciamento mais simples de aplica c oes embutidas.
861
A biblioteca do servidor embutido e baseada na vers ao cliente/servidor do MySQL, que e escrita em C/C++. Consequentemente, o servidor embutido tamb em e escrito em C/C++. N ao h a nenhum servidor embutido dispon ivel em outra linguagem. A API e id entica para a vers ao embutida do MySQL e a vers ao cliente/servidor. Para alterar uma aplica c ao em thread antiga para utilizar a biblioteca embutida, voc e normalmente s o precisa adicionar chamadas as seguintes fun c oes: Fun c ao mysql_server_ init() mysql_server_end() mysql_thread_ init() mysql_thread_end() Quando chamar Deve ser chamada antes de qualquer outra fun c ao MySQL, de prefer encia no inicio da fun c ao main(). Deve ser chamada antes da sa ida do programa. Deve ser chamada em cada thread que voc e criar que acessar a o MySQL. Deve ser chamada antes de se chamar pthread_exit()
Voc e deve ligar seu c odigo com libmysqld.a em vez de libmysqlclient.a. As fun c oes acima mysql_server_xxx tamb em est ao inclu idas em libmysqlclient.a para permitir a troca entre a vers ao embutida e a clienete/servidor apenas ligando sua aplica c ao na biblioteca certa. Veja Se c ao 12.1.11.1 [mysql_server_init()], P agina 855.
862
MYSQL *db_connect(const char *dbname); void db_disconnect(MYSQL *db); void db_do_query(MYSQL *db, const char *query);
863
const char *server_groups[] = { "test_libmysqld_SERVER", "embedded", "server", NULL }; int main(int argc, char **argv) { MYSQL *one, *two; /* * * * * * * * * mysql_server_init() devve ser chamado antes de qualquer fun c~ ao mysql. Voc^ e pode usar mysql_server_init(0, NULL, NULL), e iniciar o servidor usando os grupos = { "server", "embedded", NULL }. Em seu arquivo $HOME/.my.cnf file, voc^ e provavelmente deseja colocar:
[test_libmysqld_SERVER] language = /path/to/source/of/mysql/sql/share/english * E claro que voc^ e poderia modifcar argc e argv antes de pass a-los * a esta fun c~ ao. Ou poder a criar novos do modo que preferir. Mas * todos os argumentos em argv (exceto argv[0], que e o nome do * programa) devem ser op c~ oes v alidas para o servidor MySQL. * * Se voc^ e ligar este cliente em um biblioteca mysqlclient * normal, esta fun c~ ao n~ ao far a nada. */ mysql_server_init(argc, argv, (char **)server_groups); one = db_connect("test"); two = db_connect(NULL); db_do_query(one, "SHOW TABLE STATUS"); db_do_query(two, "SHOW DATABASES"); mysql_close(two); mysql_close(one); /* Isto deve ser chamado depois de todas outras fun c~ oes mysql*/ mysql_server_end(); exit(EXIT_SUCCESS); }
864
static void die(MYSQL *db, char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); (void)putc(\n, stderr); if (db) db_disconnect(db); exit(EXIT_FAILURE); } MYSQL * db_connect(const char *dbname) { MYSQL *db = mysql_init(NULL); if (!db) die(db, "mysql_init failed: no memory"); /* * Certifique-se que o cliente e o servidor utilizam grupos diferentes. * Isto e critico pois o servidor n~ ao aceitar a as op c~ oes do * cliente e vice versa. */ mysql_options(db, MYSQL_READ_DEFAULT_GROUP, "test_libmysqld_CLIENT"); if (!mysql_real_connect(db, NULL, NULL, NULL, dbname, 0, NULL, 0)) die(db, "mysql_real_connect failed: %s", mysql_error(db)); return db; } void db_disconnect(MYSQL *db) { mysql_close(db); } void db_do_query(MYSQL *db, const char *query) { if (mysql_query(db, query) != 0) goto err; if (mysql_field_count(db) > 0) { MYSQL_RES *res; MYSQL_ROW row, end_row;
865
int num_fields; if (!(res = mysql_store_result(db))) goto err; num_fields = mysql_num_fields(res); while ((row = mysql_fetch_row(res))) { (void)fputs(">> ", stdout); for (end_row = row + num_fields; row < end_row; ++row) (void)printf("%s\t", row ? (char*)*row : "NULL"); (void)fputc(\n, stdout); } (void)fputc(\n, stdout); mysql_free_result(res); } else (void)printf("Affected rows: %lld\n", mysql_affected_rows(db));
return; err: die(db, "db_do_query failed: %s [%s]", mysql_error(db), query); } GNUmakefile # This assumes the MySQL software is installed in /usr/local/mysql inc := /usr/local/mysql/include/mysql lib := /usr/local/mysql/lib # If you have not installed the MySQL software yet, try this instead #inc := $(HOME)/mysql-4.0/include #lib := $(HOME)/mysql-4.0/libmysqld CC := gcc CPPFLAGS := -I$(inc) -D_THREAD_SAFE -D_REENTRANT CFLAGS := -g -W -Wall LDFLAGS := -static # You can change -lmysqld to -lmysqlclient to use the # client/server library LDLIBS = -L$(lib) -lmysqld -lz -lm -lcrypt ifneq (,$(shell grep FreeBSD /COPYRIGHT 2>/dev/null)) # FreeBSD LDFLAGS += -pthread else # Assume Linux
866
LDLIBS += -lpthread endif # This works for simple one-file test programs sources := $(wildcard *.c) objects := $(patsubst %c,%o,$(sources)) targets := $(basename $(sources)) all: $(targets) clean: rm -f $(targets) $(objects) *.core
867
Se voc e quiser instalar MyODBC em um Unix, voc e precisar a de um gerenciador ODBC. MyODBC funciona com a maioria dos gerenciadores ODBC para Unix. Para instalar MyODBC no Windows, voc e deve baixar o arquivo MyODBC .zip apropriado, descompact a-lo com WinZip ou algum programa parecido e executar o arquivo SETUP.EXE. No Windows/NT/XP voc e pode obter o seguinte erro ao tentar instalar o MyODBC: An error occurred while copying C:\WINDOWS\SYSTEM\MFC30.DLL. Restart Windows and try installing again (before running any applications which use ODBC) O problema neste caso e que algum outro progrma est a utilizando ODBC e pela forma que como o Windows e feito, voc e pode, neste caso, n ao estar apto a instalar um novo driver ODBC com programa de insta c ao do ODBC da Microsoft. Neste caso voc e pode continuar selecionando Ignore para copiar o resto dos aerquivos ODBC e a instala c ao nal deve funcionar. Se n ao funcionar, a solu c ao e reinicializar seu computador em modo seguro (Escolhendo-o ao pressionar F8 assim que seu computador iniciar o Windows durante a reinicializa c ao), instalar MyODBC, e reiniciar em modo normal. Para conectar a uma m aquina Unix de uma m aquina Windows, com uma aplica c ao ODBC (uma que n ao tenha suporte nativo as MySQL), voc e deve primeiro instalar MyODBC em uma m aquina Windows. O usu ario e m aquina Windows devem ter privil egios para acessar o servidor MySQL na m aquina Unix. Isto pode ser feito om o comando GRANT. Veja Se c ao 4.4.1 [GRANT], P agina 255. Voc e deve criar uma entrada ODBC DSN como a seguir: Abra o painel de controle na m aquina Windows. D e um duplo clique no icone Fonte de Dados ODBC 32-bit. Clique na se c ao Usu ario DSN. Clique no bot ao Adicionar. Selecione MySQL na tela Criar Nova Fonte de Dados e clique no bot ao Finalizar. A tela de congura c ao padr ao do Driver MySQL e mostrada. Veja Se c ao 12.2.2 [Administrador ODBC], P agina 867. Agora inicie a sua aplica c ao e selcione o driver ODBC com o DSN que voc e especicou no adminitrador ODBC. Verique se h a outra op c ao de congura c ao na tela do MySQL (trace, n ao pergunta ao conectar, etc) que voc e possa tentar se ocorrerem problemas.
868
194.216.84.21 meu_nome_maquina Congure o PC para utilizar DNS. Exemplo de como preencher a configura c~ ao do ODBC. Windows DSN name: test Description: This is my test database MySQL Database: test Server: 194.216.84.21 User: monty Password: my_password Port: O valor para o campo Windows DSN name e qualquer nome que seja u nico em sua congura c ao ODBC Windows. Voc e n ao precisa especicar valores para os campos Server, User, Password, ou Port ina tela de congura c ao do ODBC. No entanto, se voc e o zer, os valores ser ao utilizados como padr ao posteriormente ao se tentar fazer uma nova conex ao. Voc e tem a op c ao de alterar os valores neste momento. Se o n umero da porta n ao e dado, a porta padr ao (3306) e utilizada. Se voc e especicar a op c ao Read options from C:\my.cnf, os grupos client e odbc ser ao lidos do arquivo C:\my.cnf. Voc e pode utilizar todas as op c oes que s ao u teis a mysql_ options(). Veja Se c ao 12.1.3.39 [mysql_options()], P agina 805.
869
O cliente n ao pode aceitar que MyODBC retorne a largura real de uma coluna. O clinete n a pode aceitr que MySQL retorne o valor real de colunas afetadas. Se este par ametro for denido o MySQL retornar a registros encontrados. E necess ariop o MySQL 3.21.14 ou posterior para funcionar. o mesmo que colocar MYSQL_ 4 Faz um log de depura c ao em c:\myodbc.log. E DEBUG=d:t:O,c::\myodbc.log no AUTOEXEC.BAT 8 N ao dene nenhum limite de pacote para resultados e par ametros. 16 N ao faz perguntas mesmo se o driver quisesse. 32 Simula um driver ODBC 1.0 em alguns contextos. 64 Ignora o uso do nome de banco de dados bancodedados.tabela.coluna 128 For ca o usa de cursores de gerenciadores ODBC (experimental). 256 Disabilita o uso de busca estendida (experimental). 512 Completa campos CHAR para tamanho de coluna cheias. 1024 SQLDescribeCol() retrnar a nome de colunas totalmente qualicados. 2048 Usa o protocolo cliente/servidor comprimido. 4096 Diz ao seridor para ignorar espa cos ap os nome de fun c oes e antes de ( (necess ario para PowerBuilder). Torna todos os nomes de fun c oes palavraschaves! 8192 Conecta com named pipes ao servidor mysqld executando no NT. 16384 Altera colunas LONGLONG para colunas INT (algumas aplica c oes n ao podem tratar LONGLONG). 32768 Retorna user como Table qualier e Table owner para SQLTables (experimental) 65536 L e para ametros dos grupos client e odbc no my.cnf 131072 Adiciona algumas verica c oes extras de seguran ca (n ao deve ser necess ario, mas...) Se voc e quiser ter muitas op c oes, voc e deve somar os par ametros acima! Por exemplo, denir a op c ao como 12 (4+8) lhe permite debugar sem limite de pacotes. O MYODBC.DLL padr ao e compilado para um rendimento otimizado. Se voc e quiser depurar o MyODBC (por exemplo, habiliatr o trace), voc e deve utilizar MYODBCD.DLL. Para instalar este arquivo copie MYODBCD.DLL sobre o arquivo MYODBC.DLL instalado.
1 2
870
S o utilize campos double oat. Alguns programa podem falhar quando comparam oats simples. Se o exposto acima n ao ajudar, voc e deve fazer um arquivo de rastreamento do MyODBC e tentar encontrar o que est a dando errado.
871
Delete o link a tabela e o recrie. Ele ainda mostra o registro anterior como #DELETADO#, mas novos registros adicionados/atualizados ser ao mostrados apropriadamente. Se voc e ainda obter o erro Another user has changed your data depois de adicionar uma coluna TIMESTAMP, o seguinte truque pode lhe ajudar: N` ao utilize visualizar planilha de dados da tabela. Crie um formulario com os campos que voc e quer, e use visulizar planilha de dados de formul ario. Voc e deve denir a propriedade DefaultValue para a coluna TIMESTAMP com NOW(). Esta pode ser uma boa id eia para oculta a coluna TIMESTAMP da visualiza c ao para que seus usu arios n ao quem confusos. Em alguns casos, o Access pode gerar consultas SQL inv alidas que o MySQL n ao entende. Voc e pode arrumar isto selecionando "Query|SQLSpecific|Pass-Through" no menu do Access. No NT o Access ir a mostrar colunas BLOB como OLE OBJECTS. Se voc e quiser colunas MEMO, voc e deve alterar a coluna para TEXT com ALTER TABLE. O Access n ao pode sempre tratar colunas DATE apropriadamente. Se voc e tiver um problema com isto, mude as colunas para DATETIME. Se voc e tiver no Acces um coluna denida como BYTE, o Access tentar a export a-la como TINYINT em vez de TINYINT UNSIGNED. Isto lhe tar a problemas se voc e tiver valores > 127 na coluna!
ADO
Quando voc e est a codicando com a API ADO e MyODBC voc e precisa ter aten c ao com algumas propriedades padr oes que n ao s ao suportadas pelo servidor MySQL. Por exemplo, usando CursorLocation Property como adUseServer retornar a de RecordCount Property um resultado de -1. Para ter o valor correto, voc e precisa denir esta propriedade a adUseClient, como mostrado no c odigo VB abaixo: Dim myconn As New ADODB.Connection Dim myrs As New Recordset Dim mySQL As String Dim myrows As Long myconn.Open "DSN=MyODBCsample" mySQL = "SELECT * from user" myrs.Source = mySQL Set myrs.ActiveConnection = myconn myrs.CursorLocation = adUseClient myrs.Open myrows = myrs.RecordCount myrs.Close myconn.Close Outro modo de contornar o problea e utilizar uma instru c ao SELECT COUNT(*) para uma consulta parecida para obter a contagem de registros correta.
872
Active server pages (ASP) Voc e deve usar a op c ao Return matching rows. Aplica c oes BDE Para faze-las funcionar, voc e deve denir os seguintes par ametros: Dont optimize column widths e Return matching rows. Borland Builder 4 Qaundo voc e inicia uma consulta, voc e pode utilizar a propriedade Active ou utilizar o m etodo Open. Note que Active ir a iniciar automaticamente executando uma consulta SELECT * FROM ... que pode nao ser algo bom se suas tabelas forem grandes. ColdFusion (No Unix) A seguinte informa c oes e tirada da documenta c ao do ColdFusion: Utilize a seguinte informa c ao para congurar o ColdFusion Server para Linux para utilizar o driver unixODBC driver com MyODBC para fonte de dados MySQL. Allaire vericou que o MyODBC Vers ao 2.50.26 funciona com MySQL Vers ao 3.22.27 e ColdFusion para Linux. (Quqlquer vers ao mais nova tamb em deve funcionar.) Voc e pode fazer o download do MyODBC em http://www.mysql.com/downloads/api-myodbc.html ColdFusion Vers ao 4.5.1 lhe permite utilizar o Administrador ColdFusion para adicionar a fonte de dados MySQL. No entanto o driver n ao est a inclu ido com o ColdFusion Vers ao 4.5.1. Antes que o driver MySQL aparecer na lista dropdown de fonte de dados ODBC, voc e deve construir e copiar o driver MyODBC para /opt/coldfusion/lib/libmyodbc.so. O diret orio Contrib cont em o programa mydsn-xxx.zip que lhe permite construir e remover o arquivo de registro DSN para o driver MyODBC em aplica c oes Coldfusion. DataJunction Voc e tem que alter a-lo para uma sa ida VARCHAR em vez de ENUM, ja que ele exporta o u ltimo de uma maneira que cause um grief no MySQL. Excel Funciona. Algumas dicas: Se voc e tiver problema com datas, tente selecion a-las como strings utilizando a fun c ao CONCAT(). Por exemplo: select CONCAT(rise_time), CONCAT(set_time) from sunrise_sunset; Valores retornados deste modo como strings devem ser reconhecidos corretamente como valores time pelo Excel97. O prop osito de CONCAT() neste exemplo e enganar o ODBC fazendo-o pensar que a coluna e do tipo string. Sem o CONCAT(), ODBC sabe que a coluna e do tipo time e o Excel n ao entende isto. Note que este e um bug do Excel, pois ele converte automaticamente uma string para um time. Isto seria otimo se a fonte fosse um arquivo texto, mas se torna um erro quando a fonte e uma conex ao ODBC que relata tipos exatos para cada coluna.
873
Word Para recuperar os dados do MySQL para documentos Word/Excel, voc e precisa utilizar o driver MyODBC e a ajuda do Add-in Microsoft Query. Por exemplo, crie um bd com uma tabela contendo 2 colunas de texto: Insira registros utilizando a ferramente cliente de linha de comando mysql. Crie um arquivo DSN usando o gerenciador ODBC, my, por exemplo, para o bd acima. Abra o aplicativo Word. Crie um novo documento vazio. Utilizando a barra de ferramentas chamada Banco de Dados, pressione o bot ao insira banco de dados. Pressione o bot ao Obter Dados. No moemnto certo, pressione o bot ao Ms Query na tela Obter Dados. No Ms Query crie uma Nova Fonte de Dados utilizando o arquivo DSN my. Selecione a nova consulta. Selecione as colunas que voc e deseja. Crie um ltro de desejar. Fa ca um Ordena c ao se quiser. Selecione Enviar Dados para o Microsoft Word. Clique em Finalizar. Clique em Inserir dados e selecione os registros. Clique OK e voc e ver a os registros no seu documento Word. odbcadmin Pograma teste para ODBC. Delphi Voc e deve utilizar o BDE Vers ao 3.2 ou mais atual. Veja a op c ao i Dont optimize column width ao conectar no MySQL. Aqui est a um c odigo de Delphi potencialmente u til que congura uma entrada ODBC e uma entrada BDE para para MyODBC (a entrada BDE exige de um Editor de Alias BDE que e gratuito em um site Delphi Super Page. (Obrigado a Bryan Brunton bryan@flesherfab.com por isto): fReg:= TRegistry.Create; fReg.OpenKey(\Software\ODBC\ODBC.INI\DocumentsFab, True); fReg.WriteString(Database, Documents); fReg.WriteString(Description, ); fReg.WriteString(Driver, C:\WINNT\System32\myodbc.dll); fReg.WriteString(Flag, 1); fReg.WriteString(Password, ); fReg.WriteString(Port, ); fReg.WriteString(Server, xmark); fReg.WriteString(User, winuser); fReg.OpenKey(\Software\ODBC\ODBC.INI\ODBC Data Sources, True);
874
fReg.WriteString(DocumentsFab, MySQL); fReg.CloseKey; fReg.Free; Memo1.Lines.Add(DATABASE NAME=); Memo1.Lines.Add(USER NAME=); Memo1.Lines.Add(ODBC DSN=DocumentsFab); Memo1.Lines.Add(OPEN MODE=READ/WRITE); Memo1.Lines.Add(BATCH COUNT=200); Memo1.Lines.Add(LANGDRIVER=); Memo1.Lines.Add(MAX ROWS=-1); Memo1.Lines.Add(SCHEMA CACHE DIR=); Memo1.Lines.Add(SCHEMA CACHE SIZE=8); Memo1.Lines.Add(SCHEMA CACHE TIME=-1); Memo1.Lines.Add(SQLPASSTHRU MODE=SHARED AUTOCOMMIT); Memo1.Lines.Add(SQLQRYMODE=); Memo1.Lines.Add(ENABLE SCHEMA CACHE=FALSE); Memo1.Lines.Add(ENABLE BCD=FALSE); Memo1.Lines.Add(ROWSET SIZE=20); Memo1.Lines.Add(BLOBS TO CACHE=64); Memo1.Lines.Add(BLOB SIZE=32); AliasEditor.Add(DocumentsFab,MySQL,Memo1.Lines); C++ Builder Testado com BDE vers ao 3.0. O u nico problema conhecido e que quando o esquema de tabelas e alterado, os campos da consulta n ao s ao atualizados. O BDE, no entanto, parece n ao reconhecer chaves prim arias, apenas o indice PRIMARY, mas isto ser a um problema. Vision Voc e deve utilizar a opc ao Return matching rows.
Visual Basic Para estar apto para habilitar uma tabela, voc e deve denir uma chave prim aria para a tabela. Visual Basic com ADO n ao pode manipular inteiros grandes. Isto signica que algumas consultas como SHOW PROCESSLIST n ao ir ao funcionar apropriadamente. A corre c ao e deinir a op c ao OPTION=16384 na string de conex ao ODBC ou congurar a op c ao Change BIGINT columns to INT na tela de conex ao do MyODBC. Voc e pode desejar denir a op c ao Return matching rows. VisualInterDev Se voc e obtem o erro [Microsoft][ODBC Driver Manager] Driver does not support this parameter a raz ao pode ser que voc e tem um BIGINT em seu resultado. Tente denir a op c ao Change BIGINT columns to INT na tela de conex ao do MyODBC. Visual Objects Voc e deve utilizar a op c ao Dont optimize column widths.
875
876
ftp://support.mysql.com/pub/mysql/secret/. Somente n os da MySQL AB teremos acesso ao arquivo que voc e enviar, a seremos bem discretos com os dados! Se voc e pode criar um programa que tamb em mostre este problema, nos envie ele tamb em. Se o programa funciona com algum outro servidor MySQL, voc e deve fazer um arquivo de log do MyODBC onde voc e faz exatamente a mesma coisa no ouuto servidor SQL. Lembre-se que quanto mais informa c oes voc e nos fornecer, mais satisfat oria ser a a solu c ao encontrada para o problema!
O driver Resin JDBC, que pode ser encontrado em http://www.caucho.com/projects/jdbc-mysql/in Para informa c ao, consulte qualquer documenta c ao JDBC, al em das documenta c ao dos propriet arios de cada driver para recursos espec icos do MySQL.
877
878
ChopBlanks
Controla de o m etodo fetchrow_* elimina os espa cos em branco. NUM_OF_PARAMS O n umero de colchetes em uma instru c ao preparada. NULLABLE Quais colunas podem ser NULL. trace Realiza rastreamento para depura c ao. M etodos e Atributos especicos do MySQL Descri c ao Ou ltimo valor AUTO_INCREMENT. Quais colunas s ao valores BLOB. Quais colunas s ao chaves. Quais colunas s ao num ericas. Quais colunas s ao chaves prim arias. Quais colunas NAO PODEM ser NULL. Veja NULLABLE. O tamanho m aximo das colunas. O tamanho m aximo das colunas presentes no resultado. Nomes de colunas. N umero de campos retornados. Nome de tabelas no resultado. Todos os tipos de colunas
M etodo/Atributos mysql_insertid is_blob is_key is_num is_pri_key is_not_null length max_length NAME NUM_OF_FIELDS table type
Os m etodos Perl s ao descritos em maiores detalhes nas se c oes seguintes. Vari aveis usadas em m etodos que retornam valor tem estes signicados: $dbh $sth $rc $rv Manipulador do Banco de Dados Manipulador da Instru c ao C odigo de Retorno (geralmente um status) Valor de Retorno (geralmente um contador de linhas)
M etodos e Atributos DBI Port ateis connect($data_source, $username, $password) Usa o m etodo connect para fazer uma conex ao do banco de dados a fonte de dados. O valor $data_source deve come car com DBI:driver_name:. Exemplo de uso de connect com o driver DBD::mysql: $dbh = DBI->connect("DBI:mysql:$database", $user, $password); $dbh = DBI->connect("DBI:mysql:$database:$hostname", $user, $password); $dbh = DBI->connect("DBI:mysql:$database:$hostname:$port", $user, $password); Se o nome do usu ario e/ou senha n ao s ao denidos, DBI usa os valores das vari aveis de anbiente DBI_USER e DBI_PASS, respctivamente. Se voc e n ao especicar um nome de m aquina, ele utiliza o padr ao localhost. Se voc e n ao especicar um n umero de porta, ele utiliza a porta padr ao do MySQL(3306). At a o Msql-Mysql-modules Vers ao 1.2009, o valor $data_source permitia alguns modicadores:
879
mysql_read_default_file=file_name L e file_name como um arquivo de op c ao. Para informa c ao sobre arquivo de op c oes veja Se c ao 4.1.2 [Option les], P agina 217. mysql_read_default_group=group_name O grupo padr ao ao se ler uma arquivo de op c oes e, normalamente, o grupo [client]. Especicando a aop c ao mysql_read_default_ group, o grupo padr ao se torna o grupo [group_name]. mysql_compression=1 Utiliza comunica c ao compactada enter o cliente e o servidor (MySQL Vers ao 3.22.3 ou posterior). mysql_socket=/path/to/socket Especica o caminho do socket Unix que e utilizado para se conectar ao servidor (MySQL Vers ao 3.21.15 ou posterior). M uliplos modicadores podem ser dados. Cada um deve ser precedido de ponto e v irgula. Por exemplo, se voc e quiser evitar colocar o nome de usu ario e senha em um script DBI, voc e pode busc a-los em um arquivo de op c ao ~/.my.cnf do usu ario ao inv es de escrever a sua chamada connect desta forma: $dbh = DBI->connect("DBI:mysql:$database" . ";mysql_read_default_file=$ENV{HOME}/.my.cnf", $user, $password); Esta chamado ir a ler op c oes dinidas pelo grupo [client] no arquivo de op c oes. Se voc e quiser fazer a mesma coisa mas utilizar op c oes especicadas no grupo [perl], voc e pode fazer: $dbh = DBI->connect("DBI:mysql:$database" . ";mysql_read_default_file=$ENV{HOME}/.my.cnf" . ";mysql_read_default_group=perl", $user, $password); disconnect O m etodo disconnect disconecta o manipulador de banco de dados do banco de dados. Ele e normalmente chamado pouco antes de voc e sair do programa. Exemplo: $rc = $dbh->disconnect; prepare($statement) Prepara uma instru c ao SQL para execu c ao pelo mecanismo de banco de dados e retorna um manipulador de instru c ao ($sth), que voc e pode utilizar para chamar o m etodo execute. Normalmente voc e manipula a instru c ao SELECT (e instru c oes do tipo SELECT tais como SHOW, DESCRIBE, e EXPLAIN) atrav es de prepare e execute. Exemplo: $sth = $dbh->prepare($statement) or die "Cant prepare $statement: $dbh->errstr\n"; Se vo e quiser ler grandes resultados em seu cliente, voc e pode dizer ao Perl para utilizar mysql_use_result() com:
880
my $sth = $dbh->prepare($statement { "mysql_use_result" => 1}); execute O m etodo execute executa um instru c ao preparada. Para instru c ao n aoSELECT, execute retorna o n umero de linha afetadas. Se nenhuma linha foi afetada, execute retorna "0E0", que o Perl trata como zero mas considera com true. Se um erro ocorrer, execute retorna undef. Para instru c oes SELECT, execute apenas inicia a consulta SQL no banco de dados; voc e precisa utilizar um dos m etodos de fetch_* descritos aqui para recuperar dados. Exemplo: $rv = $sth->execute or die "cant execute the query: " . $sth->errstr;
do($statement) O m etodo do prepara e executa uma instru c ao SQL e retorna o n umero linhas afetadas. Se nenhuma lina for afetada, do retorna "0E0", que o Perl trata como zero mas considera como true (verdadeiro). Este m etodo e geralmente usado por instru c oes n ao-SELECT que n ao podem ser preparadas previamente (devida a limita c oes do driver) ou que n ao precisa ser esecutada mais que uma vez (inserts, deletes, etc.). Exemplo: $rv = $dbh->do($statement) or die "Cant execute $statement: $dbh- >errstr\n"; Geralamente a instru c ao do e mais r apida (e prefer ivel) que prepare/execute para instru c oes que n ao cont em par ametros. quote($string) O m etodo quote e usada para "escapar" qualquer caracter especial contido na string e para adcionar as aspas necess arias na sa ida. Exemplo: $sql = $dbh->quote($string) fetchrow_array Este m atodo busca a pr oxima linha de dados e a retorna como um vetor de valores de campo. Exemplo: while(@row = $sth->fetchrow_array) { print qw($row[0]\t$row[1]\t$row[2]\n); } fetchrow_arrayref Este m etodo busca a pr oxima linha de dados e a retorna como uma refer encia a um vetor de valores de campos. Exemplo: while($row_ref = $sth->fetchrow_arrayref) { print qw($row_ref->[0]\t$row_ref->[1]\t$row_ref->[2]\n); } fetchrow_hashref Este m etodo busca uma linha de dados e retorna uma refer encia a uma tabela hash contendo pares nome de campos/valores. Este m etodo n ao e t ao eciente quanto utilizar refer encias a vetor como demostrado acima. Exemplo: while($hash_ref = $sth->fetchrow_hashref) { print qw($hash_ref->{firstname}\t$hash_ref->{lastname}\t\ $hash_ref->{title}\n);
881
} fetchall_arrayref Este m etodo e usado para obter todos os dados (linhas) a serem retornados de uma instru c ao SQL. Ele retorna uma refer encia a um vetor de refer encias a vetores para cada linha. Voc e acessa ou imprime dados utilizando um loop aninhado. Exemplo: my $table = $sth->fetchall_arrayref or die "$sth->errstr\n"; my($i, $j); for $i ( 0 .. $#{$table} ) { for $j ( 0 .. $#{$table->[$i]} ) { print "$table->[$i][$j]\t"; } print "\n"; } finish Indica que mais nenhum dado ser a buscado para este manipulador de instru c ao. Voc e chama este m etodo para liberar o manipulador de instru c ao e qualquer recuros de sistema associado a ele. Exemplo: $rc = $sth->finish; Retorna o n umero de linhas alteradas (atualiadas, deletadas, etc.) pelo u ltimo comando. Ele e normalmente utilizado ap os uma instru c ao execute n aoSELECT. Exemplo: $rv = $sth->rows; Retorna uma refer encia a um vetor de valores que indicam se colunas podem conter valores NULL. Os valores poss iveis para cada element do vetor e 0 ou uma string vazia se a coluna n ao puder ser NULL, 1 se puder e 2 se a o estado NULL da coluna e desconhecido. Exemplo: $null_possible = $sth->{NULLABLE};
rows
NULLABLE
NUM_OF_FIELDS este atributi indica o n umero de campos retornados pela instru c ao SELECT ou SHOW FIELDS. Voc e pode us a-la para vericar se uma instru c ao retornou um resultado: Um valor zero indica uma intru c ao n ao-SELECT como INSERT, DELETE, ou UPDATE. Exemplo: $nr_of_fields = $sth->{NUM_OF_FIELDS}; data_sources($driver_name) Este m etodo retorna um vetor contendo o nome dos bancos de dados dispon iveis no servidor MySQL na m aquina localhost. Exemplo: @dbs = DBI->data_sources("mysql"); ChopBlanks Este atributo determina se o m etodo fetchrow_* ir a apagar espa cos em branco no inicio ou no m dos valores retornados. Exemplo: $sth->{ChopBlanks} =1;
882
trace($trace_level) trace($trace_level, $trace_filename) O m etodo trace habilita ou disabilita o rastreamento. Quando chamado como um m etodo da classe DBI, ele afeta o rastreamento em todos os manipuladores. Quando chamado como um m etodo do manipulador de banco de dados ou de instru c ao, ele afeta o rastreamento para o manipulador dado (e qualquer lho futuro do manipulador). Denir $trace_level com 2 fornece detalhes da informa c ao do rastreamento. Denir $trace_level com 0 desabilita o rastreamento. A sa ida do rastreamento vai para a sa ida padr ao de erros por padr ao. Se $trace_filename for esecicado, o arquivo e aberto no modo append e a sa ida para todos manipuladores rastreados traced handles e escrita neste arquivo. Exemplo:
DBI->trace(2); # rastreia tudo DBI->trace(2,"/tmp/dbi.out"); # rastreia tudo para # /tmp/dbi.out $dth->trace(2); # rastreia este manipulador de banco de dado $sth->trace(2); # rastreia este manipulador de instru c~ oes Voc e tamb em pode habilitar o rastreamento DBI congurando a vari avel de ambiente DBI_TRACE. Congur a-la com um valor num erico e o mesmo que chamar DBI->(value). Congur a-la com um caminhao e o mesmo que chamar DBI->(2,value). M etodos e Atributos Especicos do MySQL Os m etodos mostrados aqui s ao espec icso do MySQL e n ao s ao parte do padr ao DBI. Diversos m etodos j a est ao obsoletos: is_blob, is_key, is_num, is_pri_key, is_not_null, length, max_length, e table. Quando existir uma alternativa no padr ao DBI, ela ser a listada aqui: mysql_insertid Se voc e utilizar o recurso AUTO_INCREMENT do MySQL, os novos valores autoincrement ser ao armazenados aqui. Exemplo: $new_id = $sth->{mysql_insertid}; Com vers oes antigas da interface DBI, voc e pode usar $sth->{insertid}. is_blob Retorna uma refer encia a um vetor de valores booleanos; para cada elemento do vetor, um valor TRUE indica que a respectiva coluna e um BLOB. Exemplo: $keys = $sth->{is_blob}; is_key Retorna um refer encia a um vetor de valores booleanos; para cada elemento do vetor, um valor de TRUE indica que a coluna respectiva e uma chave. Exemplo: $keys = $sth->{is_key}; is_num Retorna uma refer encia a um vetor de valores booleanos; para cada elemento do vetor, um valor de TRUE indica que a coluna respectiva cont em valores num ericos. Exemplo: $nums = $sth->{is_num};
883
is_pri_key Retorna uma refer encia a um vetor de valores booleanos; para cada elemento do vetor, um valor de TRUE indica que a respectiva coluna e uma chave prim aria. Exemplo: $pri_keys = $sth->{is_pri_key}; is_not_null Retorna uma refer encia para um vetor de valores booleanos; para cada elemento do vetor, um valor de FALSE indica que esta coluna pode conter valores NULL Exemplo: $not_nulls = $sth->{is_not_null}; is_not_null est a obsoleto; e prefer ivel utilizar o atributo NULLABLE (descrito acima), porque ele e um padr ao DBI. length max_length Cada um destes m etodos retornam uma refer ecia a um vetor com tamanho de colunas. O vetor length indica a tamanho m aximo que cada coluna pode ter (como declarado na descri c ao da tabela). O vetor max_length indica o tamanho m aximo presente atualmente no resultado. Exemplo: $lengths = $sth->{length}; $max_lengths = $sth->{max_length}; NAME table type Retorna um refer encia a um vetor de nomes de colunas. Exemplo: $names = $sth->{NAME}; Retorna um refer encia a um vetor de nomes de tabelas. Exemplo: $tables = $sth->{table}; Retorna uma refer encia a um vetor com tipos de colunas. Exemplo: $types = $sth->{type};
884
885
886
ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER
ERROR ON CLOSE ERROR ON READ ERROR ON RENAME ERROR ON WRITE FILE USED FILSORT ABORT FORM NOT FOUND GET ERRNO ILLEGAL HA KEY NOT FOUND NOT FORM FILE NOT KEYFILE OLD KEYFILE OPEN AS READONLY OUTOFMEMORY OUT OF SORTMEMORY UNEXPECTED EOF CON COUNT ERROR OUT OF RESOURCES BAD HOST ERROR HANDSHAKE ERROR DBACCESS DENIED ERROR ACCESS DENIED ERROR NO DB ERROR UNKNOWN COM ERROR BAD NULL ERROR BAD DB ERROR TABLE EXISTS ERROR BAD TABLE ERROR NON UNIQ ERROR SERVER SHUTDOWN BAD FIELD ERROR WRONG FIELD WITH GROUP WRONG GROUP FIELD WRONG SUM SELECT WRONG VALUE COUNT TOO LONG IDENT DUP FIELDNAME DUP KEYNAME DUP ENTRY WRONG FIELD SPEC PARSE ERROR EMPTY QUERY NONUNIQ TABLE INVALID DEFAULT MULTIPLE PRI KEY TOO MANY KEYS
1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY001 HY001 HY000 08004 08004 08S01 08S01 42000 42000 42000 08S01 23000 42000 42S01 42S02 23000 08S01 42S22 42000 42000 42000 21S01 42000 42S21 42000 23000 42000 42000 42000 42000 42000 42000 42000
887
ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER
TOO MANY KEY PARTS 1070 TOO LONG KEY 1071 KEY COLUMN DOES NOT EXITS 1072 BLOB USED AS KEY 1073 TOO BIG FIELDLENGTH 1074 WRONG AUTO KEY 1075 READY 1076 NORMAL SHUTDOWN 1077 GOT SIGNAL 1078 SHUTDOWN COMPLETE 1079 FORCING CLOSE 1080 IPSOCK ERROR 1081 NO SUCH INDEX 1082 WRONG FIELD TERMINATORS 1083 BLOBS AND NO TERMINATED 1084 TEXTFILE NOT READABLE 1085 FILE EXISTS ERROR 1086 LOAD INFO 1087 ALTER INFO 1088 WRONG SUB KEY 1089 CANT REMOVE ALL FIELDS 1090 CANT DROP FIELD OR KEY 1091 INSERT INFO 1092 UPDATE TABLE USED 1093 NO SUCH THREAD 1094 KILL DENIED ERROR 1095 NO TABLES USED 1096 TOO BIG SET 1097 NO UNIQUE LOGFILE 1098 TABLE NOT LOCKED FOR WRITE 1099 TABLE NOT LOCKED 1100 BLOB CANT HAVE DEFAULT 1101 WRONG DB NAME 1102 WRONG TABLE NAME 1103 TOO BIG SELECT 1104 UNKNOWN ERROR 1105 UNKNOWN PROCEDURE 1106 WRONG PARAMCOUNT TO PROCEDURE 1107 WRONG PARAMETERS TO PROCEDURE 1108 UNKNOWN TABLE 1109 FIELD SPECIFIED TWICE 1110 INVALID GROUP FUNC USE 1111 UNSUPPORTED EXTENSION 1112 TABLE MUST HAVE COLUMNS 1113 RECORD FILE FULL 1114 UNKNOWN CHARACTER SET 1115 TOO MANY TABLES 1116
42000 42000 42000 42000 42000 42000 00000 00000 00000 00000 08S01 08S01 42S12 42000 42000 HY000 HY000 HY000 HY000 HY000 42000 42000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 42000 42000 42000 42000 HY000 42000 42000 HY000 42S02 42000 42000 42000 42000 HY000 42000 HY000
888
ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER
TOO MANY FIELDS TOO BIG ROWSIZE STACK OVERRUN WRONG OUTER JOIN NULL COLUMN IN INDEX CANT FIND UDF CANT INITIALIZE UDF UDF NO PATHS UDF EXISTS CANT OPEN LIBRARY CANT FIND DL ENTRY FUNCTION NOT DEFINED HOST IS BLOCKED HOST NOT PRIVILEGED PASSWORD ANONYMOUS USER PASSWORD NOT ALLOWED PASSWORD NO MATCH UPDATE INFO CANT CREATE THREAD WRONG VALUE COUNT ON ROW CANT REOPEN TABLE INVALID USE OF NULL REGEXP ERROR MIX OF GROUP FUNC AND FIELDS NONEXISTING GRANT TABLEACCESS DENIED ERROR COLUMNACCESS DENIED ERROR ILLEGAL GRANT FOR TABLE GRANT WRONG HOST OR USER NO SUCH TABLE NONEXISTING TABLE GRANT NOT ALLOWED COMMAND SYNTAX ERROR DELAYED CANT CHANGE LOCK TOO MANY DELAYED THREADS ABORTING CONNECTION NET PACKET TOO LARGE NET READ ERROR FROM PIPE NET FCNTL ERROR NET PACKETS OUT OF ORDER NET UNCOMPRESS ERROR NET READ ERROR NET READ INTERRUPTED NET ERROR ON WRITE NET WRITE INTERRUPTED TOO LONG STRING TABLE CANT HANDLE BLOB
1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163
HY000 42000 HY000 42000 42000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 42000 42000 42000 HY000 HY000 21S01 HY000 42000 42000 42000 42000 42000 42000 42000 42000 42S02 42000 42000 42000 HY000 HY000 08S01 08S01 08S01 08S01 08S01 08S01 08S01 08S01 08S01 08S01 42000 42000
889
ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER
TABLE CANT HANDLE AUTO INCREMENT 1164 DELAYED INSERT TABLE LOCKED 1165 WRONG COLUMN NAME 1166 WRONG KEY COLUMN 1167 WRONG MRG TABLE 1168 DUP UNIQUE 1169 BLOB KEY WITHOUT LENGTH 1170 PRIMARY CANT HAVE NULL 1171 TOO MANY ROWS 1172 REQUIRES PRIMARY KEY 1173 NO RAID COMPILED 1174 UPDATE WITHOUT KEY IN SAFE MODE 1175 KEY DOES NOT EXITS 1176 CHECK NO SUCH TABLE 1177 CHECK NOT IMPLEMENTED 1178 CANT DO THIS DURING AN TRANSACTION 1179 ERROR DURING COMMIT 1180 ERROR DURING ROLLBACK 1181 ERROR DURING FLUSH LOGS 1182 ERROR DURING CHECKPOINT 1183 NEW ABORTING CONNECTION 1184 DUMP NOT IMPLEMENTED 1185 FLUSH MASTER BINLOG CLOSED 1186 INDEX REBUILD 1187 MASTER 1188 MASTER NET READ 1189 MASTER NET WRITE 1190 FT MATCHING KEY NOT FOUND 1191 LOCK OR ACTIVE TRANSACTION 1192 UNKNOWN SYSTEM VARIABLE 1193 CRASHED ON USAGE 1194 CRASHED ON REPAIR 1195 WARNING NOT COMPLETE ROLLBACK 1196 TRANS CACHE FULL 1197 SLAVE MUST STOP 1198 SLAVE NOT RUNNING 1199 BAD SLAVE 1200 MASTER INFO 1201 SLAVE THREAD 1202 TOO MANY USER CONNECTIONS 1203 SET CONSTANTS ONLY 1204 LOCK WAIT TIMEOUT 1205 LOCK TABLE FULL 1206 READ ONLY TRANSACTION 1207 DROP DB WITH READ LOCK 1208 CREATE DB WITH READ LOCK 1209 WRONG ARGUMENTS 1210
42000 HY000 42000 42000 HY000 23000 42000 42000 42000 42000 HY000 HY000 HY000 42000 42000 25000 HY000 HY000 HY000 HY000 08S01 HY000 HY000 HY000 HY000 08S01 08S01 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 42000 HY000 HY000 HY000 25000 HY000 HY000 HY000
890
ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER
NO PERMISSION TO CREATE USER 1211 UNION TABLES IN DIFFERENT DIR 1212 LOCK DEADLOCK 1213 TABLE CANT HANDLE FULLTEXT 1214 CANNOT ADD FOREIGN 1215 NO REFERENCED ROW 1216 ROW IS REFERENCED 1217 CONNECT TO MASTER 1218 QUERY ON MASTER 1219 ERROR WHEN EXECUTING COMMAND 1220 WRONG USAGE 1221 WRONG NUMBER OF COLUMNS IN SELECT 1222 CANT UPDATE WITH READLOCK 1223 MIXING NOT ALLOWED 1224 DUP ARGUMENT 1225 USER LIMIT REACHED 1226 SPECIFIC ACCESS DENIED ERROR 1227 LOCAL VARIABLE 1228 GLOBAL VARIABLE 1229 NO DEFAULT 1230 WRONG VALUE FOR VAR 1231 WRONG TYPE FOR VAR 1232 VAR CANT BE READ 1233 CANT USE OPTION HERE 1234 NOT SUPPORTED YET 1235 MASTER FATAL ERROR READING BINLOG 1236 SLAVE IGNORED TABLE 1237 WRONG FK DEF 1238 KEY REF DO NOT MATCH TABLE REF 1239 CARDINALITY COL 1240 SUBSELECT NO 1 ROW 1241 UNKNOWN STMT HANDLER 1242 CORRUPT HELP DB 1243 CYCLIC REFERENCE 1244 AUTO CONVERT 1245 ILLEGAL REFERENCE 1246 DERIVED MUST HAVE ALIAS 1247 SELECT REDUCED 1248 TABLENAME NOT ALLOWED HERE 1249 NOT SUPPORTED AUTH MODE 1250 SPATIAL CANT HAVE NULL 1251 COLLATION CHARSET MISMATCH 1252 SLAVE WAS RUNNING 1253 SLAVE WAS NOT RUNNING 1254 TOO BIG FOR UNCOMPRESS 1255 ZLIB Z MEM ERROR 1256 ZLIB Z BUF ERROR 1257
42000 HY000 40001 HY000 HY000 23000 23000 08S01 HY000 HY000 HY000 21000 HY000 HY000 HY000 42000 HY000 HY000 HY000 42000 42000 42000 HY000 42000 42000 HY000 HY000 42000 HY000 21000 21000 HY000 HY000 HY000 HY000 42S22 42000 01000 42000 08004 42000 42000 HY000 HY000 HY000 HY000 HY000
891
ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER ER
ZLIB Z DATA ERROR CUT VALUE GROUP CONCAT WARN TOO FEW RECORDS WARN TOO MANY RECORDS WARN NULL TO NOTNULL WARN DATA OUT OF RANGE WARN DATA TRUNCATED WARN USING OTHER HANDLER CANT AGGREGATE COLLATIONS DROP USER REVOKE GRANTS CANT AGGREGATE 3COLLATIONS CANT AGGREGATE NCOLLATIONS VARIABLE IS NOT STRUCT UNKNOWN COLLATION SLAVE IGNORED SSL PARAMS SERVER IS IN SECURE AUTH MODE WARN FIELD RESOLVED BAD SLAVE UNTIL COND MISSING SKIP SLAVE UNTIL COND IGNORED
1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278
HY000 HY000 01000 01000 01000 01000 01000 01000 42000 42000 42000 42000 42000 HY000 HY000 HY000 HY000 HY000 HY000 HY000 HY000
892
14 Estendendo o MySQL
14.1 MySQL Internals
Este cap itulo descreve v arias coisas que voc e precisa saber ao trabalhar no c odigo do MySQL. Se voc e planeja contribuir com o desenvolvimento do MySQL, quiser ter acesso ao c odigo entre vers oes, ou apenas deseja acompanhar o desenvolvimento, siga as instru c oes em Se c ao 2.3.4 [Instalando a arvore de fontes], P agina 100. Se voc e est a interessada nos MySQL internals, voc e tamb em deve se inscrever na nossa lista de emails internals. Esta lista e relativamente de baixo tr aco. Para detalhes de como se inscrever, por favor veja Se c ao 1.7.1.1 [Mailing-list], P agina 33. Todos os desenvolvedores na MySQL AB est ao na lista internals e n os ajudamos outras pessoal que est ao trabalhando no c odigo MySQL. Esteja a vontade de utilizar esta tanto para perguntas sobre o c odigo qunato para enviar patches com os auqis voc e gostaria de contribui no projeto MySQL!
893
parte dispon ivel publicamente de nosso processo de teste consistia de um teste crashme, um benchamrk Perl DBI/DBD encontrado no diret orio sql-bench e testes variadaos localizadaos no diret orio tests. A falta de um um pacote de teste padronizado dispon ivel publicamente tem criado diculdade para nosso usu arios e para nossos desenvolvedores de fazer teste de regress ao no c odigo do MySQL. Para resolver este problema, n os criamos um novo sistema de teste que e inclu ido nas distribui c oes fonte e bin aria a partir da vers ao 3.23.29. O conjunto de testes de atual n ao testa tudo no MySQL, mas deve pegar os bugs mais obvios no c odigo de processamento SQL, detalhes de SO/biblioteca, e e bem compleo em teste de replica c oes. Nosso objetivo eventual e ter os testes cobrindo 100% do c odigo. Contibui c oes para o nosso pacote de teste s ao benvindas. Voc e pode desejar contribuir com testes que examinam a funcionalidade critica ao seu sistema, o que ir a assegurar que todas as futuras vers oes do MySQL ir ao funcionar bem com suas aplica c oes.
894
Todas as consultas que produzem resultadosex., SELECT, SHOW, EXPLAIN, etc., devem ser precedidas com @/path/to/result/file. O arquivo deve conter os resultados esperados. Um modo f acil de gerar o arquivo resultante e executar mysqltest -r < t/test-case-name.test do diret orio mysql-test, e ent ao editar o arquivo resultante gerado e, se necess ario, ajust a-los a sa ida esperada. Neste caso, tenha cuidado de n ao adicionar ou deletar quaisquer caracteres invis iveis - tenha certeza de apenas alterar o texto e/ou adicionar linhas deletadas. Se voc e tiver que inserir uma linha, esteja certo que os campos s ao separados com tabula c ao e que h a uma tabula c ao no nal. Voc e pode querer utilizar od -c para ter certeza que seu editor de texto n ao bagun c ou nada durante a edi c ao. N os, e claro, esperamos que voc e nunca tenha que editar a sa ida de mysqltest -r j a que voc e s o dever a faz e-lo quando encontra um bug. Para estar consistente com a nossa congura c ao, voc e deve colocar seus arquivos de resultados no diret orio mysql-test/r e o nomeie como test_name.result. Se o teste produzir mais de um resultado, voc e deve usar test_name.a.result, test_ name.b.result, etc. Se uma instru c ao retornar um erro, voc e eve espacicar na linha anterior a instru c ao com --error error-number. O n umero do erro pode ser uma lista de n umeros de erros poss iveis separados com ,. Se voc e estiver escrevendo em teste de replica c ao, voc e deve coloca source include/master-slave.inc; na primeira linha do arquivo. Para trocar entre master e slave, utilize connection master; e connection slave;. se voc e precisar fazer alguma coisa em uma conex ao alternativa, voc e pode fazer connection master1; para o master e connection slave1; para o slave. Se voc e precisar fazer alguma coisa em um loop, voc e pode usar algo assim: let $1=1000; while ($1) { # do your queries here dec $1; } Para dormir entre consultas, use o comando sleep. Ele suporta fra c oes de um segundo, assim voc e pode fazer sleep 1.3;, por exemplo, para dormir 1.3 segundos. Para executar o slave com op c oes adicionais para o seu caso de teste, coloque-os na formato de linha de comando mysql-test/t/test_name-slave.opt. Para o master, coloque-os em mysql-test/t/test_name-master.opt. Se voc e tiver uma quest ao sobre o pacote de testes, ou tiver um caso de teste para contribuir, envie um e-mail para lista de email internals do MySQL. Veja Se c ao 1.7.1.1 [Mailing-list], P agina 33. Como a lista n ao aceita anexos, voc e deve utilizar o ftp para enviar os arquivos relevantes: ftp://support.mysql.com/pub/mysql/Incoming/
895
informa c oes sobre o seu sistema e a vers ao do MySQL. Veja Se c ao 1.7.1.3 [Relato de Erros], P agina 36. Esteja certo de inluir a sa ida de mysql-test-run, assim como o conte udoi de todos os arquivos .reject no diret orio mysql-test/r. Se um pacote de teste falhar, verique se o teste tamb em falha quando executado sozinho: cd mysql-test mysql-test-run --local test-name Se falhar, voc e deve congurar o MySQL com --with-debug e executar mysql-testrun com a op c ao --debug. Se into tamb em falhar envie o arquivo de rastreamento var/tmp/master.trace para ftp://support.mysql.com/pub/mysql/secret assim n os podemos examin a-los. Por favor, se lembre de tamb em incluir uma descri c ao completa do seu sistema, a vers ao do bin ario do mysqld e como voc e o compilou. Tente tamb em executar mysql-test-run com a op c ao --force para ver se h a qualquer outro teste que tenha falhado. Se voc e pr oprio compilou o MySQL, verique nosso manual sobre como compilar o MySQL na sua platforma ou, de prefer encia, use um dos bin arios que n os compilamos para voc e no http://www.mysql.com/downloads/. Todos os seus bin arios padr oes devem passar no pacote de teste! Se voc e obter um erro, como Result length mismatch ou Result content mismatch, signica que a sa ida do teste n ao e igual a sa ida esperada. Este pode ser um bug no MySQL ou que o seu vers ao do mysqld produz resultados um pouco diferentes sobre certas circunt ancias. Resultado de testes que falharam s ao colocados em um arquivo com o mesmo nome base que o arquivo de resultado com a extens ao .reject. Se o seu caso de teste est a falhando, voc e deve fazer um di nos dois arquivos. Se voc e n ao puder ver como els s ao diferentes, examine ambos com od -c e tamb e verique os seus tamanhos. Se um teste falhar totalmente, voc e deve vericar os arquivos de log no diret orio mysqltest/var/log para avisos sobre o que deu errado. Se voc e tiver compilado o MySQL com depura c ao voc e pode tentar depur a-lo executando mysql-test-run com a op c oes --gdb e/ou --debug. Veja Se c ao D.1.2 [Criando arquivos de rastreamento], P agina 1071. Se voc e n ao tiver compilado o MySQL com depura c ao voc e deve, provavelmente, faz e-lo. Apenas especique a op c ao --with-debug no configure! Veja Se c ao 2.3 [Instalando o Fonte], P agina 94.
896
Voc e pode adicionar as fun c oes como uma fun c ao nativa do MySQL. Fun c oes nativas s ao compiladas no servidor mysqld e cam dispon iveis em uma base permanente. Cada m etodo tem suas vantagens e desvantagens: Se voc e escreve uma fun c ao denida pelo usu ario, voc e deve instalar o arquivo objeto no seu servidor. Se voc e compilou a sua fun c ao dentro do servidor voc e n ao precisar a fazer isto. Voc e pode adicionar UDFs para um distribui c ao bin aria MySQL. Fun c oes nativas exigem que voc e modique a sua distribui c ao fonte. Se voc e atualizar a sua ditribui c ao MySQL, voc e pode continuar a usar a sua UDF previamente instalada. Para fun c oes nativas, voc e deve repetir as suas modica c oes a cada vez que voc e atualizar. Seja qual for o m etodo que voc e utilizou para adicionar novas fun c oes, eles podem ser usados como fun c oes nativas tais como ABS() ou SOUNDEX().
897
arquivo sql/udf_example.cc que denem 5 novas fun c oes. Consulte este arquivo para ver como a conven c ao de chamadas UDF funciona. Para o mysqld estar apto a usar fun c oes UDF, voc e deve congurar o MySQL com --withmysqld-ldflags=-rdynamic. A raz ao e que para muitas plataformas (incluindo Linux) voc e pode carregar uma biblioteca (com dlopen()) de um programa ligado estaticamente, que voc e teria se estivesse usando --with-mysqld-ldflags=-all-static. Se voc e quiser usar uma UDF que precisa acessar s imbolos do mysqld (como o exemplo metaphone em sql/udf_example.cc que usa default_charset_info), voc e deve ligar o programa com -rdynamic (veja man dlopen). Se voc e estiver usando uma vers ao precompilada do servidor, use o MySQL-Max, que suporta carregamento din amico. Para cada fun c ao que voc e deseja usar nas instru c oes SQL, voc e deve denir fun c oes C (ou C++) correspondente. Na discuss ao abaixo, o nome xxx e usado um nome de fun c ao exemplo. Para distinguir entre o uso de SQL e C/C++, XXX() (mai uscula) indica a chamada da fun c ao SQL e xxx() (min uscula) indica da chamada da fun c ao C/C++. Aa fun c oes C/C++ que voc e escreve para implemmentar a interface para XXX() s ao: xxx() (exigido) onde o resultado da fun A fun c ao principal. E c ao e computado. A correspond encia entre o tipo SQL e o tipo retornado da sua fun c ao C/C++ e mostrada aqui: Tipo SQL Tipo C/C++ STRING char * INTEGER long long REAL double xxx_init() (opcional) A fun c ao de inicializa c ao para xxx(). Ela pode ser usada para: Verica o n umero de argumentos para XXX(). Verica se os argumentos s ao de um tipo exigido ou, alternativamente, diga ao MySQL para converter os argumentos para o tipo desejado quando a fun c ao principal e chamada. Aloca a mem oria exigida pela fun c ao principal. Especica o tamanho m aximo do resultado. Especica (para fun c oes REAL) o n umero m aximo de decimais. Especica se o resultado pode ser NULL. xxx_deinit() (opicional) A fun c ao de naliza c ao para xxx(). Ela deve liberar qualquer mem oria alocada pela fun c ao de inicializa c ao. Quando uma instru c ao SQL invoka XXX(), o MySQL chama a fun c ao de inicializa c ao xxx_ init() para realizar qualquer congura c ao necess aria, tais como verica c ao de argumentos e aloca c ao de mem oria. Se xxx_init() retorna um erro, a instru c ao SQL e abortada com uma mensagem e as fun c oes principais e de naliza c ao n ao s ao chamadas. Sen ao, a fun c ao principal xxx() e chamada uma vez para cada linha. Depois de todas as linhas tiverem
898
sido processadas, a fun c ao de naliza c ao xxx_deinit() e chamada, podendo assim realizar qualquer limpeza. Para fun c oes agregadas (como SUM()), voc e tamb em deve fornecer as seguintes fun c oes: xxx_reset() (exigida) Zera a soma e insere um argumento como o valor inicial para um novo grupo. xxx_add() (exigida) Adiciona o argumento a soma antiga. Quando se usa UDFs agregadas o MySQL funciona da seguinte maneira: 1. Chama xxx_init() para deixar fun c oes agregadas alocarem a mem oria necess aria para armazenar os resultados. 2. Ordena a tabela de acordo com a express ao GROUP BY. 3. Para a primeira linha em um novo grupo, chama a fun c ao xxx_reset(). 4. Para cada nova linha que pertence ao mesmo grupo, chame a fun c ao xxx_add(). 5. Quando o grupo muda ou depois da u ltima linha ter sido processada, chame xxx() para obter o resultado para o conjunto. 6. Repita 3-5 at e que todas as linhas tenham sido processada. 7. Chame xxx_deinit() para deixar a UDF liberar a mem oria alocada. Todas as fun c oes devem ser seguras com thread (n ao apenas a fun c ao principal, mas tamb em as fun c oes de inicializa c ao e naliza c ao). Isto signica que voc e n ao tem permiss ao para alocar qualquer vari avel global ou est atica que alterou! Se voc e precisa de mem oria, voc e deve aloc a-la em xxx_init() e liber a-la em xxx_deinit().
899
O par ametro initid e passado para todas as tr es fun c oes. Ela aponta para uma estrutura UDF_INIT que e usada para passar informa c oes entre as fun c oes. Os membros da estrutura UDF_INIT s ao listados abaixo. A fun c ao de inicializa c ao deve estar em todos os menbros que desejam ser alterados. (Para utilizar o padr ao para um membro, deixe-o inalterado.): my_bool maybe_null xxx_init() deve denir maybe_null com 1 se xxx() pode retornar NULL. O valor padr ao e 1 se qualquer um dos argumentos s ao declarados como maybe_ null. unsigned int decimals N umero de decimais. O valor padr ao e o n umero m aximo de deciamis no argumento passado na fun c ao principal. (Por exemplo, se a fun c ao e passada function is passed 1.34, 1.345 e 1.3, o padr ao seria 3, pois 1.345 tem 3 decimais. unsigned int max_length O tamanho m aximo de um resultado string. O valor padr ao difere dependendo do tipo de resultado da fun c ao. Para fun c oes strings, o padr ao e o temanho do maior argumento. Para fun c oes do tipo inteiro, o padr ao e 21 digitos. Para fun c oes do tipo real, o padr ao e 13 mais o n umero de decimais indicados por initid->decimals. (Para fun c oes num ericas, o tamanho inclui qualquer caracter de sinal ou ponto decimal.) Se voc e quiser retornar um blon, voc e pode den i-lo com 65K ou 16M; esta mem oria n ao e alocada, mas usada para decidir qual tipo de coluna utilizar se houver necessidade dese armazenar dados tempor arios. char *ptr Um ponteiro que a fun c ao pode usar para o seus prop ositos. Por exemplo, fun c oes pode usar initid->ptr para comunicar mem orias alocadas entre fun c oes. Na xxx_init(), aloca a mem oria e a atribui a este ponteiro: initid->ptr = allocated_memory; Em xxx() e xxx_deinit(), se rera a initid->ptr para usar ou liberar a mem oria.
900
A seguinte fun c ao s o e exigida pelo MySQL 4.1.1 e acima: char *xxx_clear(UDF_INIT *initid, char *is_null, char *error); Esta fun c ao e chamada quando o MySQL precisa de zerar o resumo dos resultados. Ele ser a chamado no come co de cada grupo novo mas tamb em pode ser chamado para zerar os valores para uma consulta que n ao tiver registros coincidentes. is_null ser a denido para apontar para CHAR(0) antes de chamar xxx_clear(). Voc e pode usar o ponteiro error para armazenar um byte se alguma coisa der errado. char *xxx_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error); Esta fun c ao e chamada por todas as linhas que pertencem ao mesmo grupo, exceto na primeira linha. Nesta voc e deve adicionar o valor em UDF ARGS a sua variavel sum aria interna. A fun c ao xxx() deve ser declarada da mesma forma que voc e dene uam fun c ao UDF simples. Veja Se c ao 14.2.2.1 [Chamando UDF], P agina 898. A fun c ao e chamada quando todas as linhas no grupo tem sido processada. Normamente voc e nunca deve acessar a vari avel args aqui mas retornar o seu valor baseado em sua vari avel sum aria interna. Todos os argumentos processados em xxx_reset() e xxx_add() devem ser feito de forma id entica as UDFs normais. Veja Se c ao 14.2.2.3 [Argumentos UDF], P agina 900. O tratamento do valor de retorno em xxx() deve ser feito de forma id entica a uma UDF normal. Veja Se c ao 14.2.2.4 [Valores de retorno UDF], P agina 902. O argumento ponteiro para is_null e error e o mesmo para todas as chamadas xxx_ reset(), xxx_clear(), xxx_add() e xxx(). Voc e pode utilizar isto para lembrar que voc e obteve um erro ou se a fun c ao xxx() deve retornar NULL. Note que voc e n ao deve armazenar uma string em *error! Ela e um par ametro de apenas 1 byte! is_null e zerado para cada grupo (antes de chamar xxx_clear()). error nunca e zerado. Se isnull ou error s ao denidos depois de xxx() ent ao o MySQL retornar a NULL como o rsultado para a fun ca o do grupo.
901
enum Item_result *arg_type Os tipos para cada argumento. Os valores de tipos poss iveis s ao STRING_ RESULT, INT_RESULT, e REAL_RESULT. Para ter certeza que os argumentos s ao de um tipo dado e retornar um erro se n ao forem, verique o vetor arg_type na fun c ao de inicializa c ao. Por exemplo: if (args->arg_type[0] != STRING_RESULT || args->arg_type[1] != INT_RESULT) { strcpy(message,"XXX() requires a string and an integer"); return 1; } Como uma alternativa para exigir que os argumentos de sua fun c ao sejam de um tipo espec ico, voc e pode usar a fun c ao de inicializa c ao para denir o elemento arg_type com o tipo que voc e quiser. Isto faz com que o MySQL converta argumentos para aqueles tipo a cada chamada de xxx(). Por exemplo, para fazer convers ao dos dois primeiros argumentos para string e integer, fa ca isto com xxx_init(): args->arg_type[0] = STRING_RESULT; args->arg_type[1] = INT_RESULT; char **args args->args informa a fun c ao de inicializa c ao sobre a natureza geral dos argumentos chamados com sua fun c ao. Para um argumento constante i, args>args[i] aponta para o valor do argumento. (Veja abaixo sobre instru c oes de como acessar o valor de forma apropriada). Para um argumento n ao constante, args->args[i] e 0. Um argumento constante e uma express ao e uma express ao que utiliza apenas constante, tais como 3 ou 4*7-2 ou SIN(3.14). Um argumento n ao constante e uma express ao que refere a valores que podem alterar a cada linha, tais como nomes de coluna ou fun c oes que s ao chamadas com argumentos n ao contantes. Para cada chamada da fun c ao principal, args->args cont em os argumentos atuais que s ao passados pela linhas sendo processadas atualmente. As fun c oes podem se referir a um argumento i como a seguir: Um argumento do tipo STRING_RESULT e dado como um apontador string mais um tamanho, para permitir o tratamento de dados bin arios de tamanho arbitr ario. Os conte udo da string est ao dispon iveis como args->args[i] e o tamanho da string e args->lengths[i]. Voc e n ao deve assumir aue as strings s ao terminadas em null. Para um argumnto do tipo INT_RESULT, voc e deve converter args->args[i] para um valor long long: long long int_val; int_val = *((long long*) args->args[i]); Para um argumento do tipo REAL_RESULT, voc e deve converter args>args[i] para um valor double: double real_val;
902
real_val = *((double*) args->args[i]); unsigned long *lengths Para a fun c ao de inicializa c ao, o vetor lengths indica o tamanho m aximo da string para cada argumento. Voc e n ao deve alter a-los. Para cada chamada da fun c ao principal, lengths cont em o tamanho atual de quaisquer argumentos string que s ao passados para a linha sendo processada atualmente. Para argumentos do tipo INT_RESULT ou REAL_RESULT, lengths ainda cont em o tamanho m aximo do argumento (como para a fun c ao de inicializa c ao).
903
udf_example.cc que e inclu ido na distribui c ao fonte do MySQL. Este arquivo cont em as seguintes fun c oes: metaphon() retorna uma string metafonica do argumento string. Ela e algo como uma string soundex, mas e mais voltada para o ingl es. myfunc_double() retorna a soma de valores ASCII de caracteres e seus argumentos, dividido pela soma de tamanho de seus argumentos. myfunc_int() retorna a soma do tamanho de seus argumentos. sequence([const int]) retorna uma sequ encia iniciando a partir de um n umero dado ou 1 se nenhum n umero for fornecido. lookup() retorna o IP de um nome de m aquina. reverse_lookup() retorna o nome de mauina para um n umero IP. A fun c ao pode ser chamada com uma string "xxx.xxx.xxx.xxx" ou quatro n umeros. A arquivo carreg avel dinamicamente deve ser compilado como um arquivo objeto compartilh avel usando um comando como este: shell> gcc -shared -o udf_example.so myfunc.cc Voc e pode encontrar facilmente as op c oes de compilador corretas para seu sistema executando este comando no diret orio sql da sua arvore de fonte MySQL: shell> make udf_example.o Voc e deve executar comando de compilador similar ` aquele que o make mostra, exceto que voc e deve remover a op c ao -c pr oxima ao m da linha e adicionar -o udf_example.so. (Em alguns sistemas voc e pode precisar deixar o comando -c.) Uma vez que voc e tenha compilado um objeto compartilhado contendo UDFs, voc e deve instal a-lo e avisar o MySQL sobre ele. Compilar um objeto compartilhado de udf_example.cc produz um arquivo com nome parecido com udf_example.so (o nome exato pode variar de plataforma para plataforma). Copie este arquivo para algum diret orio procurado com o ligador din amico ld, tal como /usr/lib ou adicione o diret orio no qual voc e colocou o objeto compartilhado ao arquivo de congura c ao do ligador (e.g. /etc/ld.so.conf). Em muitos sistemas voc e pode as vari aveis de ambiente LD_LIBRARY ou LD_LIBRARY_PATH para apontar para o diret orio onde se encontra os seus arquivos de fun c oes UDF. A p agina dlopen do manual diz a voc e quais vari aveis voc e deve utilizar em seu sistema. Voc e deve congurar isto nos scripts de inicializa c ao mysql.server ou mysqld_safe e reiniciar o mysqld. Depois da biblioteca ser instalada, notique mysqld sobre as novas fun c oes com estes comandos: mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "udf_example.so"; mysql> CREATE FUNCTION myfunc_double RETURNS REAL SONAME "udf_example.so"; mysql> CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "udf_example.so"; mysql> CREATE FUNCTION lookup RETURNS STRING SONAME "udf_example.so"; mysql> CREATE FUNCTION reverse_lookup -> RETURNS STRING SONAME "udf_example.so"; mysql> CREATE AGGREGATE FUNCTION avgcost -> RETURNS REAL SONAME "udf_example.so"; Fun c oes podem ser deletadas utilizando-se DROP FUNCTION:
904
As instru c oes CREATE FUNCTION e DROP FUNCTION atualizam a tabela de sistema func no banco de dados mysql. O nome da fun c ao, tipo e biblioteca compartilhada s ao salvas na tabela. Voc e deve ter os privil egios INSERT e DELETE para o banco de dados mysql para criar e deletar fun c oes. Voc e n ao deve usar CREATE FUNCTION para adicionar uma fun c ao que j a tenha sido criada. Se voc e precisar reinstalar uma fun c ao, voc e deve remov e-la com DROP FUNCTION e ent ao reinstal a-la com CREATE FUNCTION. Voc e precisaria fazer isto, por exemplo, se voc e recompilar uma nova vers ao da sua fun c ao, assim o mysqld obtem a nova vers ao. Por outro lado, o servidor continuar a a utilizar a vers ao antiga. Fun c oes ativas s ao recarregadas a cada vez que o servidor inicia, a menos que voc e inicie mysqld com a op c ao --skip-grant-tables. Neste caso, a a inicializa c ao de UDF e ignorada e as UDFs cam indispon iveis. Uma fun c ao ativa e aquela que carregada com CREATE FUNCTION e n ao removida com DROP FUNCTION.)
905
double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str) Se voc e herdar seu objeto de qualquer um dos itens padr oes (como Item_num_func), voc e provavelmente s o dever a denir uma das fun c oes acima e deixar os objetos pais cuidar das outras fun c oes. Por exemplo, a classe Item_str_func dene uma fun c ao val() que executa atof() no valor retornado por ::str(). 5. Voc e tamb em deve, provavelmente, denir a seguinte fun c ao objeto: void Item_func_newname::fix_length_and_dec() Esta fun c ao deve pelo menos calcular max_length baseado nos argumentos dados. max_ length e o n umero m aximo de caracteres que a fun c ao pode retornar. Esta fun c ao tamb em deve denir maybe_null = 0 se a fun c ao principal n ao puder retornar um valor NULL. A fun c ao pode vericar se algum dos argumentos da fun c ao pode retornar NULL vericando a vari avel de argumentos maybe_null. Voc e pode dar uma olhada em Item_func_mod::fix_length_and_dec para um exemplo t ipico de como fazer isto. Todas as fun c oes devem ser seguras com thread (em outras palavras, n ao utilize qualquer vari avel global ou est atica nas fun c oes sem protege-las com mutexes). Se voc e retornar NULL, de ::val(), ::val_int() ou ::str() voc e deve denir null_value com 1 e retornar 0. Para fun c oes objetos ::str(), existem algumas considera c oes adicionais das quais voc e deve estar ciente: O arguemto String *str fornece um buer string que pode ser utilizado para guardar o resultado. (Para mais informa c oes sobre o tipo String, d e uma olhada no arquivo sql_string.h.) A fun c ao ::str() deve retornar a string que guarda o resultado ou (char*) 0 se o resultado e NULL. Todas as fun c oes string atuais tentam evitar a aloca c ao de mem oria a menos que seja absolutamente necess ario!
906
max elements (padr ao 256) e o n umero m aximo de valores distintos que analyse noticar a por coluna. Isto e utilizado por analyse para vericar se o tipo otimo da coluna deve ser do tipo ENUM. max memory (padr ao 8192) e a mem oria m axima que analyse deve alocar por coluna enquanto tenta encontrar todos os valores distintos. SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]])
907
908
Se depois de voc e examinar todas as outras possibilidades e voc e tiver conclu ido que eo cliente MySQL ou o servidor MySQL que est a causando problemas, e hora de fazer um relat orio de erro para a nossa lista de emails ou nossa equipe de suporte. No relat orio de erro, tente dar uma descri c ao bem detalhada de como o sistema se comporta e o que voc e acha que est a acontecendo. Voc e tamb em deve dizer porque voc e acha que e o MySQL que esta causando problemas. Lev em considera c ao todas as situa c oes neste cap itulo. Indique qualquer problema exatamente como ele aparece quando voc e examina o seu sistema. Use o m etodo cortar e colar para qualquer sa ida e/ou mensagem de erro do programa e/ou arquivos de log! Tente descrever em detalhes qual programa n ao est a funcionando e todos os sintomas que voc e v e! N os recebemos muitos relat orios de erros que apenas indicavam "o sistema n ao funciona". Isto n ao nos fornece qualquer informa c ao sobre o que poderia ser o problema. Se um programa falhar, sempre eu til saber: O programa em quest ao realizou um opera c ao de segmentation fault (core dumped)? O program aesta consumindo toda a CPU? Verique com top. Deixe o programa rodar por um tempo. Ele pode estar avaliando algo pesado. Se e o servidor mysqld que est a causando problemas, voc e pode fazer um mysqladmin -u root ping ou mysqladmin -u root processlist? O que o progrma cliente diz (tente com mysql, por exemplo) quando voc e tenta conectar ao servidor MySQL? O cliente travou? Voc e obteve qualquer sa ida do programa? Quando enviar um relat orio de erro, voc e deve seguir o que e descrito neste manual. Veja Se c ao 1.7.1.2 [Fazendo perguntas], P agina 35.
909
Se voc e tiver um script, voc e s o tem que executar a consulta novamente para o cliente reconectar autometicamente. Voc e normalmente pode obter os seguintes c odigos de erros neste caso (qual voc e obter a depender a do SO): C odigo de erro Descri c ao CR_SERVER_GONE_ERROR O cliente n ao pode enviar um pedido ao servidor. CR_SERVER_LOST O cliente n ao obteve um erro ao escrever no servidor, mas n ao obteve uma resposta completa (ou nenhuma resposta) a seu pedido. Voc e tamb em ir a obter este erro se algu em tiver matado a thread em execu c ao com kill #threadid#. Voc e pode vericar que o MySQL n ao morreu executando mysqladmin version e examinando o tempo em execu c ao. Se o problema e que o mysqld falhou voc e deve descobrir a raz ao da falha. Voc e deve neste caso iniciar vericando se executar a consulta novamente ir a nalizar o MySQL novamente. Veja Se c ao A.4.1 [Falhas], P agina 921. Voc e tamb em pode obter estes erros se voc e enviar uma consulta incorreta ou muito grande ao servidor. Se mysqld recebe um pacote muito grande ou fora de ordem. ele assume que alguma coisa saiu errado com o cliente e fecha a conex ao. Se voc e precisa de grandes consultas (por exemplo, se voc e est a trabalhando com grandes colunas BLOB), voc e pode aumentar o limite da consulta iniciando o mysqld com a op c ao -O max_allowed_packet=# (padr ao 1M). A mem oria extra e alocada sobre demanda, assim o mysqld alocar a mais mem oria apenas quando voc e executar uma grande consulta ou quando o mysqld deve retornar um grande registro de resultado! Voc e tamb em obter a uma conex ao perdida se voc e estiver enviando um pacote >= 16M e se seu cliente for mais antigo que a vers ao 4.0.8 e a vers ao do seu servidor e 4.0.8 e acima ou vice versa. Se voc e quiser fazer um relat orio de erros descreendo este prolema, esteja certo de ter inclu ido as seguintes informa c oes: Informe se o MySQL morreu ou n ao. (Voc e pode encontrar into no arquivo hostname.err). Veja Se c ao A.4.1 [Falhas], P agina 921. Se uma cosulta espec ica matar o mysqld e as tabelas envolvidas foram vericadas com CHECK TABLE antes que voc e zesse a consulta, voc e pode fazer um caso de teste para isto? Veja Se c ao D.1.6 [Caso de testes reproduz iveis], P agina 1075. Qual e o valor da vari avel wait_timeout no servidor MySQL? mysqladmin variables lhe d a o valor destas vari aveis. Voc e tentou executar mysqld com --log e vericou se a consulta executada apareceu no log? Veja Se c ao 1.7.1.2 [Fazendo perguntas], P agina 35.
910
s ao mais r apidos que TCP/IP mas s o podem ser usados quando conectados ao servidor no mesmo computador. Sockets Unix s ao usados se voc e n ao especicar um nome de m aquina ou se voc e especicar o nome de m aquina especial localhost. No Windows, se o servidor mysqld est a rodando no 9x/Me, voc e s o pode conectar via TCP/IP. Se o servidor estiver rodando no NT/2000/XP e o mysqld e iniciado com -enable-named-pipe, voc e tamb em pode conectar com named pipes. O nome do named pipes e MySQL. Se voc e n ao der um nome de m aquina quando conectar ao mysqld, um cliente MySQL tentar a conectar primeiro ao named pipe, e se isto n ao funcionar ele ir a conectar a porta TCP/IP. Voc e pode for car o uso de named pipes no Windows usando . como nome de m aquina. O erro (2002) Cant connect to ... normalmente signica que n ao h a um servidor MySQL rodando no sistema ou que voc e est a usando um arquivo socket ou porta TCP/IP errado ao tentar conectar so servidor mysqld. Inicie vericando (usando ps ou gerenciador de tarefas do Windows) que h a um processo chamado mysqld executando em seu sistema! Se n ao houver nenhum processo mysqld, voc e deve iniciar um. Veja Se c ao 2.4.2 [Iniciando o servidor], P agina 116. Se um processo mysqld estiver em execu c ao, voc e pode vericar o servidor tentando estas diferentes conex oes (o n umero da porta e o caminho do socket devem ser diferente em sua consigura c ao, e claro): shell> mysqladmin version shell> mysqladmin variables shell> mysqladmin -h hostname version variables shell> mysqladmin -h hostname --port=3306 version shell> mysqladmin -h ip for your host version shell> mysqladmin --protocol=socket --socket=/tmp/mysql.sock version Note o uso de aspas para traz em vez de aspas para frente com o comando hostname; isto provoca a sa ida de hostname (que e, o nome de m aquina atual) para ser substitu ido no comando mysqladmin. Aqui est ao algumas raz oes pela quais o erro Cant connect to local MySQL server pode ocorrer: mysqld n ao est a rodando. Voc e est a rodando em um sistema que usa MIT-pthreads. Se voc e estiver executando em um sistema que n ao possui threads nativas, o mysqld usa o pacote MIT-pthreads. Veja Se c ao 2.2.3 [Qual SO], P agina 78. No entanto, nem todas as vers oes de MITpthreads suportam sockets Unix. Em um sistema sem suporte a sockets voc e sempre deve especicar o nome de m aquina explicitamente ao conectar ao servidor. Tente usar este comando para vericar a conex ao com o servidor: shell> mysqladmin -h hostname version Algu em removeu o socket Unix que o mysqld utiliza (por padr ao /tmp/mysqld.sock). Voc e deve ter um trabalho cron que remove o socket MySQL (por exemplo, um trbalhoque remove arquivos antigos do diret orio /tmp). Voc e sempre pode executar mysqladmin version e vericar que o socket que o mysqladmin est a tentando usar realmente existe. A corre c ao neste caso e alterar o trabalho cron para n ao remover mysqld.sock ou para colocar o socket em outro local. Veja Se c ao A.4.5 [Problemas com mysql.sock], P agina 925.
911
Voc e iniciou o servidor mysqld com a op c ao --socket=/path/to/socket. Se voc e alterar o caminho do socket para o servidor, voc e tamb em deve noticar o cliente MySQL sobre o novo caminho. Voc e pode fazer isto fornecendo o caminho do socket como um argumento para o cliente. Veja Se c ao A.4.5 [Problemas com mysql.sock], P agina 925. Voc e est a usando Linux e uma thread nalizou (core dumped). Neste caso voc e deve matar as outras threads mysqld (por exemplo, com o script mysql_zap antes de voc e poder iniciar um novo servidor MySQL. Veja Se c ao A.4.1 [Falhas], P agina 921. Voc e pode n ao ter privil egios de leitura e escrita tanto no diret orio que guarda o arquivo de socket quanto no pr oprio arquivo de socket. Neste caso voc e deve mudar o privil egio do diret orio/arquivo ou reiniciar mysqld para que ele use um diretorio que voc e possa utilizar. Se voc e obter a mensagem de erro Cant connect to MySQL server on alguma_maquina, voc e pode tentar o seguinte para descobrir qual e o problema: Verique se o servidor est a funcionando fazendo telnet seu-servidor num-portatcp-ip e pressione Enter algumas vezes. Se houver um servidor MySQL em execu c ao nesta porta voc e deve obter uma resposta que inclui o n umero da vers ao do servidor MySQL em execu c ao. Se voc e obter um erro como telnet: Unable to connect to remote host: Connection refused, ent ao n ao h a nenhum servidor rodando na porta dada. Tente conectar ao daemon mysqld na m aquina local e verique a porta TCP/IP que o mysqld est a congurado para usar (vari avel port) com mysqladmin variables. Verique se o seu servidor mysqld n ao foi iniciado com a op c ao --skip-networking.
912
SELECT * FROM mysql.user WHERE LEN(password) > 16; Para mais informa c oes sobre hash de senha e autentica c ao, veja Se c ao 4.3.11 [Password hashing], P agina 246.
913
O caso mais comum em que isto acontece e quando voc e tenta criar uma tabela de um tipo que n ao e suportado por seu bin ario mysqld. Se o mysqld n ao suporta um tipo de tabela (ou se o tipo de tabela est a disabilitado por uma op c ao de inicializa c ao), ele criar a a tabela com o tipo mais comumente usado em suas outras tabelas, que e provavelmente o MyISAM. Voc e pode vericar o tipo de uma tabela fazendo: SHOW TABLE STATUS LIKE nome_tabela. Veja Se c ao 4.6.8.2 [SHOW TABLE STATUS], P agina 305. Voc e pode vericar as extens ao que seu bin ario mysqld suporta com: show variables like have_%. Veja Se c ao 4.6.8.4 [SHOW VARIABLES], P agina 310.
914
m etodos diferentes de congurar esta vari avel. Por favor, note que --set-variable est a obsoleta desde o MySQL 4.0, em seu lugar utilize --max-allowed-packet=8M. Voc e pode utilizar o arquivo de op c ao para denir max_allowed_packet com um tamanho maior no mysqld. Por exemplo, se voc e est a esperando armazenar o tamanho total de um MEDIUMBLOB em uma tabela, voc e precisar a iniciar o servidor com a op c ao set-variable=max_allowed_packet=16M. Voc e tamb em pode obter problemas estranhos com pacotes grandes se voc e estiver usando blobs grandes, mas voc e n ao deu para mysqld accesso a mem oria suciente para tratar a consulta. Se voc e suspeita que este e o caso, tente adicionar ulimit -d 256000 no inicio do script mysqld_safe e reinicie o mysqld.
915
TCP/IP mal congurado. Defeitos na rede, hub, switch, cabos, ... Isto pode ser diagnosticado de forma apropriada aomente atrav es de reposi c ao de hardware. max_allowed_packet e muito pequeno ou a consulta exige mem oria livre que voc e alocou para mysqld. Veja Se c ao A.2.9 [Packet too large], P agina 913.
916
[mysqld] tmpdir=C:/temp assumindo que o diret orioe c:\\temp existe. P agina 217. Veja Se c ao 4.1.2 [Arquivos de op c ao],
Verique tamb em o c odigo de erro que voc e obteve com perror. Outra raz ao pode ser um erro de disco cheio; shell> perror 28 Error code 28: No space left on device
917
Note que como o MySQL utiliza diret orios e arquivos para armazenar banco de dados e tabelas, o nome de banco de dados e tabelas s ao caso-sensitive! (No Windows o nome de banco de dados e tabelas n ao s ao caso-sensitivo mas todas as refer encias a uma dada tabela dentro de uma consulta devem utilizar o mesmo caso!) Voc e pode vericar quais tabelas existem no banco de dados atual com SHOW TABLES. Veja Se c ao 4.6.8 [SHOW], P agina 303.
918
O problema aqui e que mysqld est a tentando manter aberto muitos arquivos simultanemanete. Voc e pode tamb em dizer para o mysqld n ao abrir muitos arquivos de uma vez ou aumentar o n umero de descritores de arquivos dispon iveis para o mysqld. Para dizer para o mysqld manter aberto poucos arquivos por vez, voc e pode tornar a cache de tabela menor usando a op c ao -O table_cache=32 para mysqld_safe (o valor padr ao e 64). Reduzindo o valor de max_connections tamb em reduzir a o n umero de arquivos abertos (o valor padr ao e 90). Para alterar o n umero de descritores de arquivos dispon iveis para mysqld, voc e pode usar a op c ao --open-files-limit=# para mysqld_safe ou -O open-files-limit=# para mysqld. Veja Se c ao 4.6.8.4 [open_files_limit], P agina 310. O modo mais f acil de fazer isto e adicioar a op c ao ao seu arquivo de op c ao. Veja Se c ao 4.1.2 [Arquivos abertos], P agina 217. Se voc e tiver um vers ao antiga do mysqld que n ao suporte isto, voc e pode editar o script mysqld_safe. Existe uma linha ulimit -n 256 comentada no script. Voc e pode remover o caracter # para descomentar esta linha, e altere o n umero 256 para afetar o n umero de descritores de arquivos dispon iveis para mysqld. ulimit (e open-files-limit) podem aumentar o n umero de descritorese de arquivo, mas apenas at e o limite imposto pelo sistema operacional. Tamb em h a um limite maior que s o pode ser sobrescrito se voc e iniciar o mysqld_safe ou mysqld como root (apenas se lembre que voc e tamb em precisa usar a op c ao --user=... neste caso). Se voc e precisa aumentar o limite do SO no n umero dos descritores de arquivo disponiveis para cada processo, cosulte a documentac ao para ser sistema operacional. Note que se voc e rodar o shell tcsh, ulimit n ao funcioar a! tcsh tamb em relatar a o valor incorreto quando voc e pergunta pelo limite atual! Neste caso voc e deve iniciar mysqld_safe com sh!
Se voc e obter erros de undefined reference (refer^ encia indefinida) para as fun c oes descompactadas ou compactadas, adicione -lz no nal sa sua linha de liga c ao e tente novamente!
919
Se voc e obter erros de undefined reference (refer^ encia indefinida) para fun c oes que devem existir em seu sistema, como connect, verique a p agina do man sobre a fun c ao em quest ao para saber quais bibiotecas voc e deve adicionar a sua linha de liga c ao! Se voc e obter erros de undefined reference (refer^ encia indefinida) para fun c oes que n ao existem em seu sistema, como o seguinte mf_format.o(.text+0x201): undefined reference to __lxstat normalmente signica que sua biblioteca e compilada em um sistema que n ao e 100% compat ivel com o seu. Neste caso voc e de fazer o download da u ltima distribui c ao fonte do MySQL e compil a-la voc e mesmo. Veja Se c ao 2.3 [Instala c ao da distribui c ao fonte], P agina 94. Se voc e estiver tentando executar um programa e ent ao obter erros de s imbolos sem refer encia que come cam com mysql_ ou que a biblioteca do mysqlclient n ao pode encontrar, signica que seu sistema n ao pode encontrar a biblioteca compartilhada libmysqlclient.so. A corre c ao deste problema e dizer ao seu sistema para buscar onde a biblioteca esta lacolizada usando um dos seguintes m etodos: Adicione o caminho ao diret orio onde est a o libmysqlclient.so ` a vari avel de ambiente LD_LIBRARY_PATH. Adicione o caminho ao diret orio onde est a o libmysqlclient.so ` a vari avel de ambiente LD_LIBRARY. Copie libmysqlclient.so a algum local que e pesquisado pelo seu sistema, como /lib, e atualize a informa c ao da biblioteca compartilhada executando ldconfig. OUtro modo de resolver este problema e ligar o seu programa estaticamente, com -static, ou removendo as bibliotecas din amicas do MySQL antes de ligar o seu c odigo. Na pr oxima vez voc e deve estar certo que nenhum outro programa esta usando bibliotecas din amicas!
920
do arquivo de op c oes /etc/my.cnf ou o arquivo de op c oes my.cnf no diret orio de dados do servidor. Por exemplo: [mysqld] user=nome_usuario Neste ponto, seu processo mysqld deve estar executando bem e redondo como usu ario nome_ usuario do Unix. No entanto algo n ao altera: o conte udo da tabela de permiss oes. Por padr ao (logo depois de executar o script de instala c ao das tabelas de permiss oes mysql_ install_db), o usu ario MySQL root e o u nico com permiss ao para acessar o banco de dados mysql ou para criar ou apagar banco de dados. A menos que voc e tenha alterado estas permiss oes, elas ainda valem. Isto n ao deve imped i-lo de de acessar o MySQL como usu ario root do MySQL quando voc e est a logado como outro usu ario Unix deiferente de root; apenas especique a op c ao -u root ao programa cliente. Note que acessar o MySQL como root, fornecendo -u root na linha de comando e diferente de de executar o MySQL como o usu ario root do Unix,or como outro Usu ario Unix. A permiss ao de acesso e nome de usu arios do MySQL est ao completamente separados dos nomes de usu ario do Unix. A u nica conex ao com os nomes de usu ario do Unix e que se voc e n ao utilizar a op c ao -u quando chamr o seu programa cliene, o cliente tentar a conectar usando seu nome de login do Unix como o seu nome de usu ario do MySQL Se a sua conta Unix n ao esta segura, voc e deve pelo menos colocar uma senha no usu ario root do MySQL na tabela de acesso. Sen ao qualquer usu ario com uma conta nesta m aquina poder a executar mysql -u root nome_bd e fazer o que quiser.
921
922
Finalize o daemon mysqld com mysqladmin shutdown, execute myisamchk --silent --force */*.MYI em todas as tabelas e reinicie o daemon mysqld. Isto ir a assegurar que voc e est a executando de um estado limpo. Veja Cap ptexi tulo 4 [Administrador de Banco de Dados MySQL], P agina 208. Use mysqld --log e tente determinar a partir da informa c ao no log se alguma consulta especica nalizou o servidor. Aproximadamente 95% de todos os erros s ao relacionados com um consulta em particular! Normalmente ela e uma das u ltimas consultas no arquivo de log antes do MySQL reiniciar Veja Se c ao 4.10.2 [Registro de consultas], P agina 373. Se voc e puder nalizar o MySQL repetidamente com uma das consultas, mesmo quando voc e tiver vericado todas as tabelas logo antes de realiz a-la, ent ao voc e estar a apto a localizar o bug e deve fazer um relat orio de bug para isto! Veja Se c ao 1.7.1.3 [Relat orio de bugs], P agina 36. Tente fazer um caso de teste que possamos utilizar para reproduzir o problema. Veja Se c ao D.1.6 [Caso de testes reproduz iveis], P agina 1075. Tente executar o teste incluso mysql-test e o benchmark do MySQL. Veja Se c ao 14.1.2 [Pacote de testes do MySQL], P agina 892. Eles devem testar o MySQL bem. Voc e tamb em pode adicionar ao benchmark um c odigo que simule a sua aplica c ao! O benchmark pode ser encontrado no diret orio bench na distribui c ao fonte ou, em uma distribui c ao bin aria, no diret orio sql-bench sob o diret orio de instala c ao do seu MySQL. Experimente fork_test.pl e fork2_test.pl. Se voc e congurar o MySQL para depura ca o, ser a muito mais f acil para obter in forma c oes sobre possiveis erros se alguma coisa der errado. Recongure o MySQL com a op c ao --with-debug ou --with-debug=full no configure e ent ao recompile-o. Veja Se c ao D.1 [Depurando o servidor], P agina 1070. Congurar o MySQL para depura c ao faz com que um alocador de mem oria seja inclu ido para que se possa encontrar alguns erros. Ele tamb em fornece muita informa c ao sobre o que est a acontecendo. Voc e aplicou todas as u ltimas corre c oes para o seu sistema operacional? Use a op c ao --skip-external-locking com o mysqld. Em alguns sistemas, o gerenciador de bloqueios lockd n ao funciona de forma apropriada; a op c ao --skip-externallocking faz com que mysqld n ao utilize bloqueio externo. (Isto signica que voc e n ao pode executar 2 servidores mysqld sobre o memo dado e que voc e deve ser cuidadoso ao utilizar myisamchk, mas pode ser instrutivo tentar a op c ao como teste). Voc e tentou mysqladmin -u root processlist quando o mysqld parecia estar rodando mas n ao respondia? Algumas vezes o mysqld n ao est a <<comatose>> mesmo quando voc e acha que n ao. O problema pode ser que todas as conex oes est ao em uso, o pode haver algum problema interno de bloqueio. mysqladmin processlist normalmente estar a apto a fazer uma conex ao mesmo nestes casos e pode fornecer informa c ao u til sobre o n umero conex oes atuais e os seus estados. Execute o comando mysqladmin -i 5 status ou mysqladmin -i 5 -r status ou em uma janela separada para produzir estat isticas enquanto voc e executa outras consultas. Experimente o seguinte: 1. Inicie o mysqld a partir do gdb (ou em outro depurador). Veja Se c ao D.1.3 [Usando gdb no mysql], P agina 1072.
923
2. Execute o seu script de testes. 3. Imprima o <<backtrace>> e as var aveis locais nos 3 n iveis mais baixos. No gdb voc e pode faz e-lo com o seguinte comando quando o mysqld falhar dentro do gdb: backtrace info local up info local up info local Com gdb voc e tamb em pode examinar quais threads existem com info threads e troca para uma thread espec ica com thread #, onde # e a ID da thread. Tente simular a sua aplica c ao com um script Perl para for car o MySQL a falhar o mudar o seu comportamento. Envie um relat orio de bug normal. Veja Se c ao 1.7.1.3 [Relat orio de erros], P agina 36. Seja mais detalhista que o normal. Como o MySQL funciona para muitas pessoas, pode ser que as falhas resultem de algo que exista apenas em seu computador (por exemplo, um erro que e relacionado a suas bibliotecas de sistemas em particular). Se voc e tiver um problema em tabelas com registros do tamanho din amico e voc e n ao est a usando colunas BLOB/TEXT (mas apenas colunas VARCHAR, voc e pode tentar alterar todas as colunas VARCHAR para CHAR com ALTER TABLE. Isto for cara o MySQL a usar linhas de tamanho xo. Linhas de tamanho xo utilizam um pouco mais de espa co extra, mas s ao muito mais tolerante a corrompimento. O c odigo de registro din amico atual foi usado pela MySQL AB por pelo menos 3 anos em qualquer problema, mas por natureza os registro de tamanho din amico s ao mais propensos a erros, assim pode ser uma boa id eia tentar o exposto acima para ver se ajuda.
924
4. Agora voc e tamb em pode parar o mysqld e reinici a-lo normalmente, ou apenas carregue a tabela de privil egios com: shell> mysqladmin -h hostname flush-privileges 5. Depois disto, voc e deve estar apto para conectar usando a nova senha. De forma alternativa, voc e pode denir a nova senha usando o cliente mysql: 1. Finalize e reinicie o mysqld com a op c ao --skip-grant-tables com descrito acima. 2. Conecte ao servidor mysqld com: shell> mysql -u root mysql 3. Dispare os seguintes comandos no cliente mysql: mysql> UPDATE user SET Password=PASSWORD(minhanovasenha) -> WHERE User=root; mysql> FLUSH PRIVILEGES; 4. Depois disto, voc e deve estar apto a conectar usando a nova senha. 5. Voc e agora pode parar o mysqld e reinici a-lo normalmente.
925
A.4.5 Como Proteger ou AlterarHow to Protect or Change the MySQL Socket File /tmp/mysql.sock
Se voc e tiver problemas com o fato que de que qualquer um pode deletar o socket de comunica c ao /tmp/mysql.sock do MySQL, voc e pode, na maioria das vers oes Unix, protejer o seu sistema de arquivos /tmp denindo o bit sticky. Conecte como root e fa ca o seguinte: shell> chmod +t /tmp Isto protejer a o seu sistema de arquivos /tmp para que os arquivos s o possam ser deletados pelo seus donos ou pelo superusu ario (root). Voc e pode vericar se o bit sticky est a setado executando ls -ld /tmp. Se o u ltimo bit de permiss ao e t, o bit est a congurado Voc e pode alterar o local onde o MySQL usa/coloca o arquivo de socket da seguinte maneira: Especique o caminho em uma arquivo de op c ao local ou global. Por exemplo, coloque em /etc/my.cnf:
926
[client] socket=path-for-socket-file [mysqld] socket=path-for-socket-file Veja Se c ao 4.1.2 [Arquivo de op c oes], P agina 217. Especicando isto na linha de comando para o mysqld_safe e na maioria dos clientes com a op c ao --socket=path-for-socket-file. Especique o caminho para o socket na vari avel de ambiente MYSQL_UNIX_PORT. Denindo o caminho com a op c ao --with-unix-socket-path=path-for-socket-file do configure. Veja Se c ao 2.3.3 [congure options], P agina 97. Voc e pode testar se o socket funciona com o seguinte comando: shell> mysqladmin --socket=/path/to/socket version
927
928
O campo do dia ou m es pode ser zero. Isto e conveniente se voc e quiser armazenar uma data de anivers ario em uma coluna DATE e voc e n ao sabea parte da data. Se a data n ao pode ser convertida para qualquer valor razo avel, um 0 e armazenado no campo DATE, o qual ser a recuperado como 0000-00-00. Isto e uma quest ao tanto de velocidade quanto de conveni encia j a que acreditamos que a responsabilidade do banco de dados e recuperar a mesma data que voc e armazenou (mesmo se a data n ao era logicamente correta em todos os casos). N os pensamos que e papel da aplica c ao vericar as datas, e n ao do servidor.
929
Ao usar ORDER BY, valores NULL s ao apresentados primeiro, ou por u ltimo se voc e especicar DESC para armazenar em ordem decrescente. Exce c ao: Nos MySQL 4.0.2 at e 4.0.10, se voc e armazenar em ordem decrescente usando DESC, valores NULL s ao apresentados por u ltimo. Ao usar GROUP BY, todos os valores NULL s ao considerados iguais. Fun c oes de agrupamento (resumo) como COUNT(), MIN() e SUM() ignoram valores NULL. A exce c ao a isto e COUNT(*), que conta linhas e n ao colunas individuais. Por exemplo, a seguinte instru c ao deve produzir duas contagens. A primeira e a contagem do n umero de linhas na tabela e a segunda e a contagem do n umero de valores diferentes de NULL na coluna age: mysql> SELECT COUNT(*), COUNT(age) FROM person; Para ajudar com o tratamento de NULL, voc e pode usar os operadores IS NULL e IS NOT NULL e a fun c ao IFNULL(). Para alguns tipos de colunas, valores NULL s ao tratados de forma especial, Se voc e inserir NULL na primeira coluna TIMESTAMP de uma tabela, a data e hora atual ser ao inseridos. Se voc e isere NULL em uma coluna AUTO_INCREMENT, o pr oximo n umero na sequ encia e inserida.
930
r apido apenas delatando 100-1000 ids de colunas_relacionadas por consulta se colunas_ relacionadas e um indice. Se colunas_relacionadas n ao e um indice, a velocidadi e independente do n umero de argumentos na cl ausula IN.
931
mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b -> FROM t1 GROUP BY i HAVING a <> b; +------+--------+-------+ | i | a | b | +------+--------+-------+ | 1 | 21.40 | 21.40 | | 2 | 76.80 | 76.80 | | 3 | 7.40 | 7.40 | | 4 | 15.40 | 15.40 | | 5 | 7.20 | 7.20 | | 6 | -51.40 | 0.00 | +------+--------+-------+ O resultado est a correto. Embora pare ca que os primeiros cinco registros n ao devessem passar no teste de compara c ao, eles deviam porque a diferen ca entre o n umero mostrado est a na d ecima casa decimal ou depende da arquitetura do computador. O problema n ao pode ser resolvido usando ROUND() (ou fun c ao similar), porque o resultado ainda e um n umero de ponto utuante. Exemplo: mysql> SELECT i, ROUND(SUM(d1), 2) AS a, ROUND(SUM(d2), 2) AS b -> FROM t1 GROUP BY i HAVING a <> b; +------+--------+-------+ | i | a | b | +------+--------+-------+ | 1 | 21.40 | 21.40 | | 2 | 76.80 | 76.80 | | 3 | 7.40 | 7.40 | | 4 | 15.40 | 15.40 | | 5 | 7.20 | 7.20 | | 6 | -51.40 | 0.00 | +------+--------+-------+ assim que o n E umero da coluna a se parece: mysql> SELECT i, ROUND(SUM(d1), 2)*1.0000000000000000 AS a, -> ROUND(SUM(d2), 2) AS b FROM t1 GROUP BY i HAVING a <> b; +------+----------------------+-------+ | i | a | b | +------+----------------------+-------+ | 1 | 21.3999999999999986 | 21.40 | | 2 | 76.7999999999999972 | 76.80 | | 3 | 7.4000000000000004 | 7.40 | | 4 | 15.4000000000000004 | 15.40 | | 5 | 7.2000000000000002 | 7.20 | | 6 | -51.3999999999999986 | 0.00 | +------+----------------------+-------+ Dependendo da arquitetura do computador voc e pode ou n ao ver resultados similares. Cada CPU pode avaliar um n umere de ponto utuante de forma diferente. Por exemplo, em
932
alguma m aquinas voc e pode obter resultados corretos multiplicando ambos argumentos por 1, como no exemplo a seguir. UM AVISO: NUNCA CONFIE NESTE METODO EM SUAS APLICAC OES, ESTE E EXEMPLO DE UM METODO ERRADO!!! mysql> SELECT i, ROUND(SUM(d1), 2)*1 AS a, ROUND(SUM(d2), 2)*1 AS b -> FROM t1 GROUP BY i HAVING a <> b; +------+--------+------+ | i | a | b | +------+--------+------+ | 6 | -51.40 | 0.00 | +------+--------+------+ A raz ao pela qual o m etodo acima parece funcionar e que na m aquina onde o teste foi realizado, a CPU de aritim etica de ponto utuante e realizada arredondando n umeros para serem iguais, mas n ao h a nenhuma regra que qualquer CPU deva fazer assim, ent ao isto n ao e con avel. O modo correto de fazermos compara c oes de ponto utuante e primeiro decidir qual e a toler ancia desejada entre os n umeros e ent ao fazer a compara c ao com o n umero tolerado. Por exemplo, se n os concordarmos que n umeros de ponto utuante devem ser considerados o mesmo, se eles forem o mesmo com precis ao de quatro casas deciamis (0.0001), a compara c ao deve ser feita assim: mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1 -> GROUP BY i HAVING ABS(a - b) > 0.0001; +------+--------+------+ | i | a | b | +------+--------+------+ | 6 | -51.40 | 0.00 | +------+--------+------+ 1 row in set (0.00 sec) E vice-versa, se n os quisermos obter registros onde os n umeros s ao o mesmo, o teste seria: mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1 -> GROUP BY i HAVING ABS(a - b) < 0.0001; +------+-------+-------+ | i | a | b | +------+-------+-------+ | 1 | 21.40 | 21.40 | | 2 | 76.80 | 76.80 | | 3 | 7.40 | 7.40 | | 4 | 15.40 | 15.40 | | 5 | 7.20 | 7.20 | +------+-------+-------+
933
alguns casos o MySQL n ao tem informa c ao suciente sobre os dados e precisa fazer alguns palpites sobre os dados. Esta se c ao do manual e direcionada para os casos nos quais o MySQL n ao faz isto corretamente. A ferramenta que se tem dispon ivel para ajudar o MySQL a fazer as coisas certas s ao: EXPLAIN. Veja Se c ao 5.2.1 [EXPLAIN], P agina 425. ANALYZE TABLE. Veja Se c ao 4.6.2 [ANALYZE TABLE], P agina 299. USE INDEX, FORCE INDEX and IGNORE INDEX. Veja Se c ao 6.4.1 [SELECT], P agina 562. STRAIGHT JOIN a n ivel de tabela e global. Veja Se c ao 6.4.1 [SELECT], P agina 562. Congurar vari aveis espec icas de threads. Veja Se c ao 4.6.8.4 [SHOW VARIABLES], P agina 310.
934
935
936
937
Algu em para o Monty chamar no meio da noite que ele percebe que aquele novo recurso funciona. Chefe "Open Sourcerer" (rela c oes na comunidade MySQL). Jani Tolonen mysqlimport Diversas extens oes dos clientes de linha de comando. PROCEDURE ANALYSE() Sinisa Milivojevic Compacta c ao (com zlib) no protocolo cliente/servidor. Hashing perfeito para fase do analisador lexicogr aco. INSERT multi-linhas Op c ao -e domysqldump LOAD DATA LOCAL INFILE Op c ao SQL_CALC_FOUND_ROWS do SELECT Op c ao --max-user-connections=... net_read e net_write_timeout GRANT/REVOKE e SHOW GRANTS FOR Novo protocolo cliente/servidor para 4.0 UNION na vers ao 4.0 DELETE/UPDATE multi-tabelas Tabelas derivadas na vers ao 4.1 Ger enciamento de recursos do usu ario Desenvolvedor inicial da APC C++ MySQL++ e do cliente MySQLGUI. Tonu Samuel (past developer) interface VIO (a funda c ao para o protocolo cliente/servidor criptografado). Sistema de arquivos do MySQL (um modo de usar banco de dados MySQL como arquivos e diret orios). A express ao CASE. As fun c oes MD5() e COALESCE(). Suporte RAID para tabelas MyISAM. Sasha Pachev Implementa c ao inicial da replica c ao (at e vers ao 4.0). SHOW CREATE TABLE. mysql-bench Matt Wagner Pacote de teste do MySQL Webmaster (at e 2002). Coordena cdor do desenvolvimento.
938
Miguel Solorzano Desenvolvimento e contru c ao das distribui c oes Win32 C odigo do servidor Windows NT. WinMySQLAdmin Timothy Smith (past developer) Suporte a conjunto de caracteres din amicos. congure, RPMs e outra partes dos sistemas constru idos. Desenvolvedor inicial do libmysqld, o servidor embutido.
Sergei Golubchik Pesquisa Full-text. Adio c ao de chaves ` a biblioteca MERGE. Jeremy Cole Indrek Siitan Design/programa c ao de nossa interface web. Autor do nosso sistema de gerenciamento de newsletter. Jorge del Conde MySQLCC (MySQL Control Center) Desenvolvento do Win32 Implanta c ao inicial do portal na web. Venu Anuganti Connector/ODBC (MyODBC) 3.51 Novo protocolo cliente/servidor para a vers ao 4.1 (para instru c oes preparadas). Arjen Lentz Respons avel pelo Manual de Refer encia do MySQL Prepara c ao da edi c ao impressa do Manual. Alexander (Bar) Barkov, Alexey (Holyfoot) Botchkov, and Ramil Kalimullin Dados espaciais (GIS) e implementa c ao de Arvores-R para vers ao 4.1 Unicode e conjunto de caracteres para vers ao 4.1; documenta c ao para os mesmos. Oleksandr (Sanja) Byelkin Cache de consultas na vers ao 4.0 Implementa c ao de subconsultas (4.1). Aleksey (Walrus) Kishkin and Alexey (Ranger) Stroganov An alise e desenho dos benchmarks. Aprova c ao e edi c ao deste manual. ALTER TABLE ... ORDER BY .... UPDATE ... ORDER BY .... DELETE ... ORDER BY ....
939
Manuten c ao do pacote de teste do MySQL. Zak Greant Advogado do Open Source, rela c oes da comunidade MySQL Carsten Pedersen O programa de certica c ao do MySQL. Lenz Grimmer Engenharia de produ c ao (contru c ao e distribui c ao) Peter Zaitsev Fun c oes SHA1(), AES_ENCRYPT() e AES_DECRYPT(). Depura c ao, pondo em ordem v arios recursos. Alexander (Salle) Keremidarski Suporte. Depura c ao. Per-Erik Martin Desenvolvedor respons avel por stored procedures (5.0) e triggers. Jim Winstead Lidera o desenvolvimento web Mark Matthews Driver do Connector/J (Java). Peter Gulutzan Adequa c ao aos padr oes SQL-99, SQL:2003. Documenta c ao do algoritmo/c odigo existente do MySQL. Documenta c ao do conjunto de caracteres. Guilhem Bichot Replcia c ao, a partir do MySQL vers ao 4.0. Corre c ao do tratamento de expoentes para DECIMAL. Autor do mysql_tableinfo. Antony T. Curtis MySQL Database para OS/2.
940
Irena Pancirov irena@mail.yacc.it Portabilidade para Win32 com compilador Borland. mysqlshutdown.exe e mysqlwatch.exe David J. Hughes Pelo esfor co para fazer um banco de dados SQL shareware. Na TcX, a predecessora da MySQL AB, iniciamos com mSQL, mas achamos que ele n ao podia satisfazer os nossos propositos assim escrevemos uma interface SQL para nossa aplica c ao Unireg. Os clientes mysqladmin e mysql s ao programas que foram largamente inuenciados pelo mSQL. Nos esfor camos muito tentando fazer da sintaxe do MySQL um superconjunto do mSQL. Muitas das id eias de API eram emprestadas do mSQL para tornar f acil de se portar programas livres para o mSQL para a API do MySQL. O programa MySQL n ao cont em nenhum c odigo do mSQL. Dois arquivos na distribui c ao (client/insert_test.c e client/select_test.c) s ao baseados nos arquivos correspondentes (sem direitos autorais) na distribui c ao do mSQL, mas s ao modicados como exemplo mostrando as altera c oes necess arias para converter um c odigo do mSQL para o servidor MySQL.. (mSQL e de direito autora de David J. Hughes.) Patrick Lynch Por ajudar-nos a adquirir o http://www.mysql.com/. Fred Lindberg Por congurar o qmail para tratar a lista de email do MySQL e pela incr ivel ajuda que obtemos gerenciando a lista de emails do MySQL. Igor Romanenko igor@frog.kiev.ua mysqldump (antigo msqldump, mas portado e aprimorado por Monty). Yuri Dario Por manter e expandir a portabilidade do MySQL para OS/2. Tim Bunce Autor do mysqlhotcopy. Zarko Mocnik zarko.mocnik@dem.si Ordena c ao em esloveno. "TAMITO" tommy@valley.ne.jp O macro do conjunto de caracteres _MB e os conjuntos de caracteres ujis e sjis. Joshua Chamas joshua@chamas.com Base para inser c oes concorrentes, sintaxe da data estendida, depura c ao no NT resposta na lista de email do MySQL. Yves Carlier Yves.Carlier@rug.ac.be mysqlaccess, um progrma para mostrar os direitos de acesso do usu ario. Rhys Jones rhys@wales.com (e GWE Technologies Limited) Por um dos primeiros drives JDBC. Dr Xiaokun Kelvin ZHU X.Zhu@brad.ac.uk Desenvolvimento de um dos primeiros drivers JDBC e outras ferramentas Java relacionadas ao MySQL.
941
James Cooper pixel@organic.com Por congurar um arquivo de lista de email com busca em seu site. Rick Mehalick Rick_Mehalick@i-o.com Pelo xmysql, um cliente gr aco X para o servidor MySQL. Doug Sisk sisk@wix.com Por fornecer pacotes RPM do MySQL para Linux Red Hat Diemand Alexander V. axeld@vial.ethz.ch Por fornecer pacotes RPM do MySQL para Linux Red Hat-Alpha. Antoni Pamies Olive toni@readysoft.es Por fornecer vers oes RPM de v arios clientes MySQL para Intel e SPARC. Jay Bloodworth jay@pathways.sde.state.sc.us Por forncer vers oes RPM do MySQL vers ao 3.21. David Sacerdote davids@secnet.com Ideias para verica c ao segura de nomes de m aquinas DNS. Wei-Jou Chen jou@nematic.ieo.nctu.edu.tw Algum suporte para caracteres chineses (BIG5). Wei He hewei@mail.ied.ac.cn Diversas funcionalidades para o conjunto de casracteres chineses(GBK). Jan Pazdziora adelton@fi.muni.cz Oredena c ao em Tcheco Zeev Suraski bourbon@netvision.net.il Formata c ao de tempo FROM_UNIXTIME(), fun c oes ENCRYPT() e conseleheiro do bison. Membro ativo da lista de email. Luuk de Boer luuk@wxs.nl Portado (e extendido) o pacote de benchmark para DBI/DBD. Tem sido de grande ajuda com o crash-me e benchmarks em execu c ao. Algumas novas fun c oes de data. O script mysql_setpermissions. Alexis Mikhailov root@medinf.chuvashia.su fun c oes denidas por usu arios (UDFs); CREATE FUNCTION e DROP FUNCTION. Andreas F. Bobak bobak@relog.ch UDF. A extens ao AGGREGATE para fun cOes Ross Wakelin R.Wakelin@march.co.uk Ajuda na congura c ao do InstallDhield para o MySQL-Win32. Jethro Wright III jetman@li.net A biblioteca libmysql.dll. James Pereria jpereira@iafrica.com Mysqlmanager, uma ferramenta Win32 GUI para administra c ao do servidor MySQL. Curt Sampson cjs@portal.ca Potabilidade de MIT-pthreads para NetBSD/Alpha e NetBSD 1.3/i386.
942
Martin Ramsch m.ramsch@computer.org Exemplos no Tutorial MySQL. Steve Harvey Por fazer mysqlaccess mais seguro. Konark IA-64 Centre of Persistent Systems Private Limited http://www.pspl.co.in/konark/. Ajuda com a portabilidade do servidor MySQL para Win64. Albert Chin-A-Young. Atuliza c ao do congure para Tru64, suporte a arquivos grandes e suporte a melhores wrappers TCP. John Birrell Emulacao do pthread_mutex() para OS/2. Benjamin Pugmann Exetns ao de tabelas MERGE para tratar INSERTS. Membro ativo na lista de emails do MySQL. Jocelyn Fournier Excelente ao mostrar e relatar inumer aveis bugs. (especialmente no c odigo da subconsulta no MySQL 4.1) Marc Liyanage Manuten c ao dos pacotes do Mac OS X e fornecimento de feedbacks sobre como criar pacotes para Mac OS X. Robert Rutherford Por fornecer informa c oes e feedback sobre o port QNX. Outros colaboradores, pesquisadores de bug e responsaveis por testes: James H. Thompson, Maurizio Menghini, Wojciech Tryc, Luca Berra, Zarko Mocnik, Wim Bonis, Elmar Haneke, jehamby@lightside, psmith@BayNetworks.com, duane@connect.com.au, Ted Deppner ted@psyber.com, Mike Simons, Jaakko Hyvatti. E v arios relatos/corre c oes de bugs do pessoal da lista de email. Um grande tributo vai ` aqueles que nos ajudaram a responder d uvidas na lista de email do MySQL. Daniel Koch dkoch@amcity.com Congura c ao do Irix. Luuk de Boer luuk@wxs.nl D uvidas de benchmark. Tim Sailer tps@users.buoy.com Quest oes do DBD-mysql. Boyd Lynn Gerber gerberb@zenez.com Quest oes relacionadas ao SCO. Richard Mehalick RM186061@shellus.com Quest oes relacionadas ao xmysql e quest oes b asicas de instala c ao.
943
Zeev Suraski bourbon@netvision.net.il Quest oes de congura c ao do m odulo Apache (log & autent) e quest oes relacionadas ao PHP, quest oes relacionadas a sintaxe SQL e outras quest oes gerais. Francesc Guasch frankie@citel.upc.es Quest oes gerais. Jonathan J Smith jsmith@wtp.net Quest oes espec icas do SO Linux, sintaxe SQL e outra coisas que podem precisar de algum trabalho. David Sklar sklar@student.net Usando o MySQL a partir de PHP e Perl. Alistair MacDonald A.MacDonald@uel.ac.uk Ainda n ao especicado, mas e ex ivel e pode lidar com Linux e, talvez, HP-UX. Tentar a conseguir usu arios para utilizar mysqlbug. John Lyon jlyon@imag.net Quest oes sobre instala c ao do MySQL em sistemas Linux, usando ou arquivos .rpm ou compilando o fonter. Lorvid Ltd. lorvid@WOLFENET.com Assuntos simples de contas/licen ca/suporte/direitos autorais Patrick Sherrill patrick@coconet.com Quest oes sobre interfaces ODBC e VisualC++. Randy Harmon rjharmon@uptimecomputers.com Quest oes sobre DBD, Linux, e algumas sintxe SQL.
944
Jay Flaherty fty@mediapulse.com Grande parte da se c ao Perl DBI/DBD no manual. Paul Southworth pauls@etext.org, Ray Loyzaga yar@cs.su.oz.au Aprova c ao do Manual de Refer encia. Therrien Gilbert gilbert@ican.net, Jean-Marc Pouyot jmp@scalaire.fr Mensagens de erro em Franc es. Petr Snajdr, snajdr@pvt.net Mensagens de erro em Tcheco. Jaroslaw Lewandowski jotel@itnet.com.pl Mensagens de erro em Polon es Miguel Angel Fernandez Roiz Mensagens de erro em Espanhol Roy-Magne Mo rmo@www.hivolda.no Mensagens de erro em noruegu es e teste da vers ao 3.21.#. Timur I. Bakeyev root@timur.tatarstan.ru Mensagens de erro em russo. brenno@dewinter.com & Filippo Grassilli phil@hyppo.com Mensagens de erro em italiano. Dirk Munzinger dirk@trinity.saar.de Mensagens de erro em alem ao. Billik Stefan billik@sun.uniag.sk Mensagens de erro en eslovaco. Stefan Saroiu tzoompy@cs.washington.edu Mensagens de erro em romeno. Peter Feher Mensagens de erro em hungaro. Roberto M. Serqueira Mensagens de erro em portugu es. Carsten H. Pedersen Mensgens de erro em dinamarqu es. Arjen G. Lentz Mensagens de erro em holand es, completando a tradu c ao parcial mais cedo. (tamb em trabalhou na consistencia e graa).
945
Fred Fish
Pela sua excelente depura c ao de C e biblioteca trace. Monty fez pequenas melhoras nesta biblioteca (velocidade e op c oes adicionais).
Richard A. OKeefe Por sua biblioteca string de dom inio p ublico. Henry Spencer Pela sua biblioteca regex, usada em WHERE column REGEXP regexp. Chris Provenzano Pthreads port aveis no n ivel de usu ario. Do direito de uso: Este produto inclui software desenvolvido por Chris Provenzano, pela Univesidade da Calif ornia, Berkeley e colaboradores. Atualmente estamos usando a vers ao 1 60 beta6 corrigida pelo Monty (veja mit-pthreads/Changes-mysql). Jean-loup Gailly and Mark Adler Pela biblioteca zlib (usada no MySQL para Windows). Bjorn Benson Por seu pacote safe malloc (vericador de mem oria) que e usado quando voc e congura o MySQL com --debug. Free Software Foundation A biblioteca readline (para o cliente mysql). The NetBSD fondation O pacote libedit (usado opcionalmente pelo cliente de linha de comando mysql).
946
Giovanni Maruzzelli maruzz@matrice.it Por portar iODBC (ODBC para Unix). Xavier Leroy Xavier.Leroy@inria.fr O autor da LinuxThreads (usada pelo servidor MySQL no Linux).
947
FutureQuest --skip-show-database
948
949
Sintaxe INSERT ... ON DUPLICATE KEY UPDATE .... Ela lhe permite fazer um UPDATE de um registro existente se a inser c ao criasse um valor duplicado em uma chave PRIMARY ou UNIQUE. (REPLACE lhe permite sobrescrever um registro existente, o que e totalmente diferente). Veja Se c ao 6.4.3 [INSERT], P agina 578. Uma nova fun c ao de agrupamento GROUP_CONCAT(). Veja Se c ao 6.3.7 [Group by functions and modiers], P agina 555. Suporte a Unicode Extensivo (UTF8). Os conjuntos de caracteres podem ser denidos por colunas, tabelas e bancos de dados. Nova cache de chaves para tabelas MyISAM com v arios par ametros de ajustes. Voc e pode tem multiplas caches de cahves, indices precarregados em caches para batches ... Indices BTREE em tabelas HEAP. Suporte a OpenGIS (Dados Geogr acos). Veja Cap ptexi tulo 10 [Spatial extensions in MySQL], P agina 730. SHOW WARNINGS exibe avisos para o u ltimo comando. WARNINGS], P agina 323. Veja Se c ao 4.6.8.9 [SHOW
Protocolo bin ario mais r apido com instru c oes prepardas e liga c ao de par ametros. Veja Se c ao 12.1.4 [C API Prepared statements], P agina 824. Agora voc e pode executar v arias instru c oes com uma u nica chamada a API C e de uma vez e ent ao ler o resultado Veja Se c ao 12.1.8 [C API multiple queries], P agina 851. Create Table: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tabela LIKE tabela. Comando HELP baseado no servidor que pode ser usado no cliente mysql de linha de comando (e outros clientes) para obter ajuda para comandos SQL. Para uma lista completa das atualiza c oes, veja a se c ao de altera c oes para cada distribui c ao 4.1.x individual.
950
Packaging: Added missing le mysql_create_system_tables to the server RPM package. This bug was xed for the 4.1.1 RPMs by updating the MySQL-server RPM from MySQL-server-4.1.1-0 to MySQL-server-4.1.1-1. The other RPMs were not aected by this change. Fixed a bug in myisamchk and CHECK TABLE that sometimes resulted in a spurious error Found key at page ..... that points to record outside datafile for a table with a FULLTEXT index. (Bug #1977) Fixed a hang in full-text indexing of strings in multi-byte (all besides utf8) charsets. (Bug #2065) Fixed a crash in full-text indexing of UTF-8 data. (Bug #2033) Replication: a rare race condition in the slave SQL thread that could lead to an incorrect complaint that the relay log is corrupted. (Bug #2011) Replication: if an administrative command on a table (OPTIMIZE TABLE, REPAIR TABLE etc) was run on the slave, this could sometimes stop the slave SQL thread (this did not lead to any corruption; one just had to type START SLAVE to get replication going again). (Bug #1858) Replication: in the slave SQL thread, a multi-table UPDATE could produce an incorrect complaint that some record was not found in one table, if the UPDATE was preceded by a INSERT ... SELECT. (Bug #1701)
951
Added aggregate function BIT_XOR() for bitwise XOR operations. Replication over SSL now works. The START SLAVE statement now supports an UNTIL clause for specifying that the slave SQL thread should be started but run only until it reaches a given position in the masters binary logs or in the slaves relay logs. Produce warnings even for single-row INSERT statements, not just for multiple-row INSERT statements. Previously, it was necessary to set SQL_WARNINGS=1 to generate warnings for single-row statements. Added delimiter (\d) command to the mysql command-line client for changing the statement delimiter (terminator). The default delimiter is semicolon. CHAR, VARCHAR, and TEXT columns now have lengths measured in characters rather than in bytes. The character size depends on the columns character set. This means, for example, that a CHAR(n) column for a multi-byte character set will take more storage than before. Similarly, index values on such columns are measured in characters, not bytes. The DATABASE() function now returns NULL rather than the empty string if there is no database selected. Added --sql-mode=NO_AUTO_VALUE_ON_ZERO option to suppress the usual behaviour of generating the next sequence number when zero is stored in an AUTO_INCREMENT column. With this mode enabled, zero is stored as zero; only storing NULL generates a sequence number. Warning: Incompatible change! Client authentication now is based on 41-byte passwords in the user table, not 45-byte passwords as in 4.1.0. Any 45-byte passwords created for 4.1.0 must be reset after running the mysql_fix_privilege_tables script. Added MySQL Server option and global variable secure-auth that disallows authentication for accounts that have old (pre-4.1.1) passwords. Added MySQL command line client option secure-auth. If this option is set, client will refuse to send password in old (pre-4.1.1) format. Warning: Incompatible change! Renamed the C API mysql_prepare_result() function to mysql_get_metadata() as the old name was confusing. Added DROP USER username@hostname statement to drop an account that has no privileges. The interface to aggregated UDF functions has changed a bit. You must now declare a xxx_clear() function for each aggregate function XXX(). The CONCAT_WS() function no longer skips empty strings. Added new ADDTIME(), DATE(), DATEDIFF(), LAST_DAY(), MAKEDATE(), MAKETIME(), MICROSECOND(), SUBTIME(), TIME(), TIMEDIFF(), TIMESTAMP(), UTC_DATE(), UTC_ TIME(), UTC_TIMESTAMP(), and WEEKOFYEAR() functions. Added new syntax for ADDDATE() and SUBDATE(). The second argument now may be a number representing the number of days to be added to or subtracted from the rst date argument. Added new type values DAY_MICROSECOND, HOUR_MICROSECOND, MINUTE_MICROSECOND, SECOND_MICROSECOND, and MICROSECOND for DATE_ADD(), DATE_SUB(), and EXTRACT().
952
Added new %f microseconds format specier for DATE_FORMAT() and TIME_FORMAT(). All queries in which at least one SELECT does not use indexes properly now are written to the slow query log when long log format is used. It is now possible to create a MERGE table from MyISAM tables in dierent databases. Formerly, all the MyISAM tables had to be in the same database, and the MERGE table had to be created in that database as well. Adicionada as novas fun c oes COMPRESS(), UNCOMPRESS() e UNCOMPRESSED_LENGTH(). Ao fazer SQL SQL_MODE=#, para um modo complexo (como ANSI) agora atualizamos a vari avel SQL_MODE para incluir todas as op c oes que o modo exige. Adicionada a fun c ao ROLLUP OLAP (Online Analytical Processing - Processamento Anal itico Online), que lhe d a um resumo para cada n ivel GROUP BY. Adicionado os c odigos SQLSTATE para todos os erros do servidor. Adicionado mysql_sqlstate() e mysql_stmt_sqlstate() que retornam o c odigo de erro SQLSTATE para o u ltimo erro. --lower-case-table-names=1 agora tamb em faz a aliases caso insensitivo. #534) (Bug
Colunas TIME com valor de horas maior do que 24 eram retornadas incorretamente para o cliente. As instru c oes ANALYZE, OPTIMIZE, REPAIR e FLUSH s ao agora armazenados no log bin ario e assim replicados para o slave. Este registro n ao ocorre se a palavra chave opcional NO_WRITE_TO_BINLOG (ou seu alias LOCAL) for usada. As exce c oes s ao que FLUSH LOGS, FLUSH MASTER, FLUSH SLAVE e FLUSH TABLES WITH READ LOCK, n ao s ao registrados no log em qualquer caso. Para uma sintaxe completa, veja Se c ao 4.6.4 [FLUSH], P agina 300. Nova vari avel global RELAY_LOG_PURGE para habilitar ou desabilitar automaticamente a remo c ao de relay logs. LOAD DATA agora produz avisos que podem ser buscados com SHOW WARNINGS. Adicionado o suporte a sintaxe CREATE TABLE nome_tabela (LIKE nome_tabela2). CREATE TABLE nome_tabela (...) TYPE=storage_engine agora gera um aviso se o mecanismo de armazenamento n ao for respeitado. A tabela ainda e criada como MyISAM, como antes. Muitas sub selectas s ao muito mais r apidas que antes. Disabled the PURGE LOGS statement that was added in in version 4.1.0. The statement now should be issued as PURGE MASTER LOGS or PURGE BINARY LOGS. Added SHOW BDB LOGS as an alias for SHOW LOGS. Added SHOW MASTER LOGS (which had been deleted in version 4.1.0) as an alias for SHOW BINARY LOGS. Added Slave_IO_State and Seconds_Behind_Master columns to the output of SHOW SLAVE STATUS. Slave_IO_State indicates the state of the slave I/O thread, and Seconds_Behind_Master indicates the number of seconds by which the slave is late compared to the master.
953
--lower-case-table-names=1 now also makes aliases case insensitive. (Bug #534) Bugs corrigidos: Fixed a bug in privilege handling that caused connections from certain IP addresses to be assigned incorrect database-level privileges. A connection could be assigned the database privileges of the previous successful authentication from one of those IP addresses, even if the IP address username and database name were dierent. (Bug #1636) Error-handling functions were not called properly when an error resulted from [CREATE | REPLACE| INSERT] ... SELECT statements. HASH, BTREE, RTREE, ERRORS, and WARNINGS no longer are reserved words. (Bug #724) Fix for bug in ROLLUP when all tables were const tables. (Bug #714) Fixed a bug in UNION that prohibited NULL values from being inserted into result set columns where the rst SELECT of the UNION retrieved NOT NULL columns. Fixed name resolution of columns of reduced subqueries in unions. (Bug #745) Fixed memory overrun in subqueries in select list with WHERE clause bigger than outer query WHERE clause. (Bug #726) Fixed a bug that caused MyISAM tables with FULLTEXT indexes created in 4.0.x to be unreadable in 4.1.x. Fixed a data loss bug in REPAIR TABLE ... USE_FRM when used with tables that contained TIMESTAMP columns and were created in 4.0.x. Fixed reduced subquery processing in ORDER BY/GROUP BY clauses. (Bug #442) Fixed name resolution of outer columns of subquery in INSERT/REPLACE statements. (Bug #446) Fixed bug in marking columns of reduced subqueries. (Bug #679) Fixed a bug that made CREATE FULLTEXT INDEX syntax illegal. Fixed a crash when a SELECT that required a temporary table (marked by Using temporary in EXPLAIN output) was used as a derived table in EXPLAIN command. (Bug #251) Fixed a rare table corruption bug in DELETE from a big table with a new (created by MySQL-4.1) fulltext index. LAST_INSERT_ID() now returns 0 if the last INSERT statement didnt insert any rows. Corrigido a perda dos u ltimos caracteres na sa ida da fun c ao (bug #447) Corrigido um erro de replica c ao raro quando um transa c ao extendia em dois ou mais relay logs e o escravo era parada enquanto ele estava executando a parte da transa c ao que estava no segundo relay log ou em um adicional. Ent ao a replica c ao parava no inicio do segundo relay log ou adicional, o que estava incorreto. (ele deve parar no BEGIN, no primeiro relay log). (Bug #53) Agora CONNECTION_ID() e replicado apropriadamente (bug #177). A nova fun c ao PASSWORD() na vers ao 4.1 e replicada apropriadamente (bug #344). Corrigida a dupla libera c ao de mem oria Corrigido um erro em UNION envolvendo tabelas tempor arias.
954
Corrigido um erro de falha em DERIVED TABLES quando EXPLAIN e usado em um DERIVED TABLES com um join Corrigido um erro de falha no DELETE com ORDER BY e LIMIT causado pala inicializa c ao do vetor do ponteiro de refer encias. Corrigido um erro na fun c ao USER() causado pelo erro no tamanho da string alocada Corrigido um erro de falha quando se tentava criar uma tabela com coluna do tipo GEOMETRY com um mecanismo de armazenamenti que n ao a suporta. Corrigido um erro de falha no UNION causado pela lista de select vazia e um campo n ao existente sendo usado em algumas das instru c oes SELECTs individuais. Corrigido um erro de replica c ao com um master na vers ao 3.23 e um slave na 4.0: o slave perdia a replica c ao de tabelas tempor arias se FLUSH LOGS era executado no master (Bug #254). Corrigido um bug de seguran ca: Um servidor compilado ser suporte a SSL ainda permitia conex oes de usu arios que possuiam a op c ao REQUIRE SSL especicado para as suas contas. Quando um usu ario indenido era usado em uma atualiza c ao de consulta no master (como INSERT INTO t VALUES(@a) onde @a nunca havia sido denido por esta conex ao), ent ao o slave podia replicar a consulta de forma incorreta se uma transa c ao anterior no master usava uma vari avel de usu ario de mesmo nome. (Bug #1331) Corrigido um erro com instru c oes preparadas: O uso do par ametro ? de instru c oes preparadas como argumento de certas fun c oes e cl ausulas fazia com que o servidor falhasse durante chamadas mysql_prepare(). (Bug #1500) Corrigido um erro com instru c oes preparadas: depois da chamada de mysql stmt prepare, colchetes s ao permitidos em todas as instru c oes consequentes, mesmo se eles n ao forem preparados (bug #1946)
955
Adionada a nova fun c ao da API C mysql_get_server_version(). Corrigido um buh na libmysqlclient que buscava campos padr oes. Corrigido um bug no cliente mysql.cc ao ignorar coment arios Adicionado o m etodo record_in_range() para tabelas MERGE poderem escolher o indice certo quando houverem muitos para serem escolhidos. A replica c ao agora funciona com RAND() e vari aveis de usu arios @var. Permite-se alterar o modo para ANSI_QUOTES com o servidor no ar. Agora pode se matar EXPLAIN SELECT. Veja Se c ao 4.6.7 [KILL], P agina 302. Agora pode se matar REPAIR TABLE. Veja Se c ao 4.6.7 [KILL], P agina 302. Permiti-se especicar lista de chaves vazias para USE INDEX, IGNORE INDEX e FORCE INDEX. Agora DROP TEMPORARY TABLE apenas apaga tabelas tempor arias e n ao naliza transa c oes. Adicionado suporte para UNION em tabelas derivadas. Warning: Altera c ao imcompat ivel! TIMESTAMP agora e retornado comi uma string do tipo YYYY-MM-DD HH:MM:SS e tamanhos de timestamp diferentes n ao s ao suportados. Esta altera c ao era necess aria para compatibilidade com o padr ao SQL. Em uma vers ao futura, uma altera c ao adicional ser a feita (compat ivel co esta altera c ao), permitindo que o tamanho do timestamp indique o n umero de d igitos desejado para a fra c ao de segundos. Novo protocolo cliente/servidor mais r apido que suporta instru c oes preparadas, limitar par ametros e colunas de resultados, transfer ancia binaria de dados, avisos. Adicionado nome de banco de dados e de nomes reais de tabela (no caso de alias) ` a estrutura MYSQL_FIELD. Consultas multi linhas: Agora voc e pode executar diversas consultas de uma vez e ent ao ler o resultados. Em CREATE TABLE foo (a INT not null primary key) a palavra PRIMARY agora e opcional. Em CREATE TABLE o atributo SERIAL agora e um alias para BIGINT NOT NULL AUTO_ INCREMENT UNIQUE. SELECT ... FROM DUAL e um alias para SELECT .... (Para ser compat ivel com alguns outros bancos de dados). Se e criado um CHAR/VARCHAR muito grande, ele a alterado automaticamente para TEXT ou BLOB; Ser a exibido um aviso neste caso. POde-se especicar os tipos BLOB/TEXT diferentes com a sintaxe BLOB(tamanho) e TEXT(tamanho). O MySQL ir a alter a-los automaticamente para um dos tipos internos BLOB/TEXT. CHAR BYTE e um alias para CHAR BINARY. VARCHARACTER e um alias para VARCHAR. Novos operadores inteiro MOD inteiro e inteiro DIV inteiro. Adicionado SERIAL DEFAULT VALUE como um alias para AUTO_INCREMENT.
956
Adicionado TRUE e FALSE como alias para 1 e 0, respectivamente. Agora aliases s ao for cados em tabelas dferivadas, como no SQL-99. orrigido SELECT .. LIMIT 0 para retornar a contagem aproriada de linhas para SQL_ CALC_FOUND_ROWS. Pode-se especicar muitos diret orios tempor arios para serem usados de modo roundrobin com: --tmpdir=nomedir1:nomedir2:nomedir3. Subqueries: SELECT * from t1 where t1.a=(SELECT t2.b FROM t2). Tabelas derivadas: SELECT a.col1, b.col2 FROM (SELECT MAX(col1) AS col1 FROM root_table) a, other_table b WHERE a.col1=b.col1; Conjuntos de caracteres a serem denidos por colunas, tabelas e banco de dados. Suporte a Unicode (UTF8). Nova sintaxe CONVERT(... USING ...) para convers ao de valores strings entre conjunto de caracteres. Indices BTREE em tabelas HEAP. Servidor embutido mais r apido (novo protocolo de comunica c ao interno). Pode-se adicionar um coment ario por coluna em CREATE TABLE. SHOW FULL COLUMNS FROM nome_tabela exibe os coment arios das colunas. ALTER DATABASE. Suporte a GIS (dados geometricos). Veja Cap ptexi tulo 10 [Spatial extensions in MySQL], P agina 730. SHOW [COUNT(*)] WARNINGS exibe avisos sobre o u ltimo comnado. Pode se especicar um tipo de coluna para em um CREATE TABLE ... SELECT denindo a coluna na parte CREATE. CREATE TABLE foo (um tinyint n~ ao nulo) SELECT b+1 AS a FROM bar; expr SOUNDS LIKE expr e o mesmo que SOUNDEX(expr)=SOUNDEX(expr). Adicionada nova fun c ao VARIANCE(expr) que retorna a vari ancia de expr Pode se criar um tabela a partir de uma existente usando CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tabela (LIKE tabela). A tabela tamb em pode ser normal ou tempor aria. Novas op c oes --reconnect e --disable-reconnect para o cliente mysql, para reconectar automaticamente ou n ao se a conex ao for perdida. START SLAVE (STOP SLAVE) n ao retorna mais um erro se o slave j a est a iniciado (parado); ele retorns um aviso. SLAVE START e SLAVE STOP n ao e mais aceitada pelo analisador de consulta; use START SLAVE e STOP SLAVE em seu lugar.
957
958
Fixed a crash in an open HANDLER when an ALTER TABLE was executed in a dierent connection. (Bug #1826) Fixed a bug in trunc* operator of full-text search which sometimes caused MySQL not to nd all matched rows. Fixed bug in zero prepending to DECIMAL column type. Fixed optimiser bug, introduced in 4.0.16, when REF access plan was preferred to more ecient RANGE on another column. Fixed problem when installing a MySQL server as a Windows service using a command of the form mysqld --install mysql --defaults-file=path-to-file. Fixed an incorrect result from a query that uses only const tables (such as one-row tables) and non-constant expression (such as RAND()). (Bug #1271) Fixed bug when the optimiser did not take SQL_CALC_FOUND_ROWS into account if LIMIT clause was present. (Bug #1274) mysqlbinlog now asks for a password at the console when the -p or --password option is used with no argument. This is consistent with the way that other clients such mysqladmin and mysqldump already behave. Note: A consequence of this change is that it is no longer possible to invoke mysqlbinlog as mysqlbinlog -p pass_val (with a space between the -p option and the following password value). (Bug #1595) Bug accidentally introduced in 4.0.16 where the slave SQL thread deleted its replicated temporary tables when STOP SLAVE was issued. In a chain replication setup A->B->C, if 2 sessions on A updated temporary tables of the same name at the same time, the binary log of B became incorrect, resulting in C becoming confused. (Bug #1686) In a chain replication setup A->B->C, if STOP SLAVE was issued on B while it was replicating a temporary table from A, then when START SLAVE was issued on B, the binary log of B became incorrect, resulting in C becoming confused. (Bug #1240) When MASTER_LOG_FILE and MASTER_LOG_POS were not specied, CHANGE MASTER used the coordinates of the slave I/O thread to set up replication, which broke replication if the slave SQL thread lagged behind the slave I/O thread. This caused the slave SQL thread to lose some events. The new behaviour is to use the coordinates of the slave SQL thread instead. Veja Se c ao 4.11.8.1 [CHANGE MASTER TO], P agina 402. (Bug #1870) Now if integer is stored or converted to TIMESTAMP or DATETIME value checks of year, month, day, hour, minute and second ranges are performed and numbers representing illegal timestamps are converted to 0 value. This behaviour is consistent with manual and with behaviour of string to TIMESTAMP/DATETIME conversion. (Bug #1448) Fixed bug when BIT_AND() and BIT_OR() group functions returned incorrect value if SELECT used a temporary table and no rows were found. (Bug #1790). BIT_AND() is now unsigned in all contexts. This means that it will now return 18446744073709551615 (= 0x) instead of -1 if there were no rows in the result. Fixed bug with BIT_AND() still returning signed value for an empty set in some cases. (Bug #1972)
959
Fixed bug with ^ (XOR) and >> (bit shift) still returning signed value in some cases. (Bug #1993) Replication: a rare race condition in the slave SQL thread, which could lead to a wrong complain that the relay log is corrupted. (Bug #2011) Replication: if an administrative command on a table (OPTIMIZE TABLE, REPAIR TABLE etc) was run on the slave, this could sometimes stop the slave SQL thread (this did not led to any corruption; one just had to type START SLAVE to get replication going again). (Bug #1858) Replication: in the slave SQL thread, a multi-table UPDATE could produce a wrong complain that some record was not found in one table, if the UPDATE was preceded by a INSERT ... SELECT. (Bug #1701)
960
Fixed a bug that resulted in thr_alarm queue is full warnings after increasing the max_connections variable with SET GLOBAL. (Bug #1435) Made LOCK TABLES to work when Lock_tables_priv is granted on the database level and Select_priv is granted on the table level. Fixed crash of FLUSH QUERY CACHE on queries that use same table several times (Bug #988). Fixed core dump bug when setting an enum system variable (such as SQL_WARNINGS) to NULL. Extended the default timeout value for Windows clients from 30 seconds to 1 year. (The timeout that was added in MySQL 4.0.15 was way too short). This xes a bug that caused ERROR 2013: Lost connection to MySQL server during query for queries that lasted longer than 30 seconds, if the client didnt specify a limit with mysql_options(). Users of 4.0.15 on Windows should upgrade to avoid this problem. More out of memory checking in range optimiser. Fixed and documented a problem when setting and using a user variable within the same SELECT statement. (Bug #1194). Fixed bug in overrun check for BLOB values with compressed tables. This was a bug introduced in 4.0.14. It caused MySQL to regard some correct tables containing BLOB values as corrupted. (Bug #770, Bug #1304, and maybe Bug #1295) SHOW GRANTS showed USAGE instead of the real column-level privileges when no tablelevel privileges were given. When copying a database from the master, LOAD DATA FROM MASTER dropped the corresponding database on the slave, thus erroneously dropping tables that had no counterpart on the master and tables that may have been excluded from replication using replicate-*-table rules. Now LOAD DATA FROM MASTER no longer drops the database. Instead, it drops only the tables that have a counterpart on the master and that match the replicate-*-table rules. replicate-*-db rules can still be used to include or exclude a database as a whole from LOAD DATA FROM MASTER. A database will also be included or excluded as a whole if there are some rules like replicate-wilddo-table=db1.% or replicate-wild-ignore-table=db1.%, as is already the case for CREATE DATABASE and DROP DATABASE in replication. (Bug #1248) Fixed a bug where mysqlbinlog crashed with a segmentation fault when used with the -h or --host option. (Bug #1258) Fixed a bug where mysqlbinlog crashed with a segmentation fault when used on a binary log containing only nal events for LOAD DATA. (Bug #1340) Fixed compilation problem when compiling with OpenSSL 0.9.7 with disabled old DES support (If OPENSSL_DISABLE_OLD_DES_SUPPORT option was enabled). Fixed a bug when two (or more) MySQL servers were running on the same machine, and they were both slaves, and at least one of them was replicating some LOAD DATA INFILE command from its master. The bug was that one slave MySQL server sometimes deleted the SQL_LOAD-* les (used for replication of LOAD DATA INFILE and located in the slave-load-tmpdir directory, which defaults to tmpdir) belonging to the other slave MySQL server of this machine, if these slaves had the same slave-load-tmpdir directory. When that happened, the other slave could not replicate LOAD DATA INFILE and complained about not being able to open some SQL_LOAD-* le. (Bug #1357)
961
If LOAD DATA INFILE failed for a small le, the master forgot to write a marker (a Delete_file event) in its binary log, so the slave could not delete 2 les (SQL_LOAD-*.info and SQL_LOAD-*.data from its tmpdir. (Bug #1391) On Windows, the slave forgot to delete a SQL_LOAD-*.info le from tmpdir after successfully replicating a LOAD DATA INFILE command. (Bug #1392) When a connection terminates, MySQL writes DROP TEMPORARY TABLE statements to the binary log for all temporary tables which the connection had not explicitely dropped. MySQL forgot to backquote the database and table names in the statement. (Bug #1345) On some 64-bit machines (some HP-UX and Solaris machines), a slave installed with the 64-bit MySQL binary could not connect to its master (it connected to itself instead). (Bug #1256, Bug #1381) Code was introduced in MySQL 4.0.15 for the slave to detect that the master had died while writing a transaction to its binary log. This code reported an error in a legal situation: When the slave I/O thread was stopped while copying a transaction to the relay log, the slave SQL thread would later pretend that it found an unnished transaction. (Bug #1475)
962
SHOW CREATE TABLE agora exibe as op c oes INDEX DIRECTORY e DATA DIRECTORY, se eles fossem especicados quando a tabela era criada. A vari avel do servidor open_files_limit agora exibe o limite de arquivos abertos real. MATCH ... AGAINST() em modo de linguagem natural agora tratam de palavra presentes em mais de 2,000,000 linhas como stopwords. As imagens do disco de instala c ao do Mac OS X agora incluem um pacote MySQLStartupItem.pkg adicional que habilita a inicializa c ao autom atica do MySQL no boot do sistema. Veja Se c ao 2.1.3 [Mac OS X installation], P agina 71. A maioria da documenta c ao incluida na distribui c ao tar do bin ario (.tar.gz) foi movida para o subdiret orio docs. Veja Se c ao 2.2.5 [Installation layouts], P agina 83. O manual agora est a incluido com um arquivo info tradicional na distribui c ao bin aria. (Bug #1019) A distribui c ao bin aria agora incluem a biblioteca do servidor embutido (libmysqld) por padr ao. Devido a problemas de liga c ao com compiladores diferentes do gcc, ele n ao estava incluido em todos os pacotes da distribui c ao inicial da vers ao 4.0.15. Os pacotes afetados forma reconstruidos e distribuidos como 4.0.15a. Veja Se c ao 1.5.1.2 [Nutshell Embedded MySQL], P agina 24. O MySQL agora pode usar o otimizador de faixa para BETWEEN com limites n ao constantes. (Bug #991) Mensagens de erro de replica c ao agora incluem o banco de dados padr ao, assim os usu arios podem vericar em qual banco de dados a consulta com erro est a rodando. Uma altera c ao da documenta c ao: Adicionado um par agrafo sobre como as op c oes binlog-do-db e binlog-ignore-db s ao testadas em um banco de dados no master (veja Se c ao 4.10.4 [Binary log], P agina 375), e um par agrafo sobre como replicatedo-db, replicate-do-table e op c oes an alogas s ao testadas em bancos de dados e tabelas no slave (veja Se c ao 4.11.6 [Replication Options], P agina 393). Agora o slave n ao replica SET PASSWORD se estiver congurado para excluir o banco de dados mysql da replica c ao (usando, por exemplo, replicate-wild-ignoretable=mysql.%). Este j a era o caso para GRANT e REVOKE desde a vers ao 4.0.13 (embora houvesse o Bug #980 nas vers oes 4.0.13 & 4.0.14, que foi corrigido na vers ao 4.0.15). Rewrote the information shown in the State column of SHOW PROCESSLIST for replication threads and for MASTER_POS_WAIT() and added the most common states for these threads to the documentation, veja Se c ao 4.11.3 [Replication Implementation Details], P agina 381. Adiciona um teste na replica c ao para detectar o caso no qual o master morre no meio da grava c ao de uma transa c ao no log bin ario; tal transa c ao inacabada agora dispara uma mensagem de erro no slave. Um comando GRANT que cria um usu ario an onimo (isto e, uma conta com nome de usu ario vazio) n ao exige mais FLUSH PRIVILEGES para a conta ser conhecida no servidor. (Bug #473) CHANGE MASTER agora descarrega o relay-log.info. Anteriormente isto era feito na pr oxima execu c ao de START SLAVE, assim se o mysqld fosse desligado no slave depois de CHANGE MASTER sem executar START SLAVE, o nome e posi c ao do relay log
963
eram perdidos. Na reinicializa c ao eles eram carregados a partir do relay-log.info, revertendo-os para seus valores antigos (incorretos) de antes do CHANGE MASTER, exibindo mensagens de erro (j a que o relay log antigo n ao existia mais) e as threads slaves se recusavam a iniciar. (Bug #858) Bugs corrigidos: Corrigido o overow do buer no tratamewnto de senhas, que podia potencialmente ser explorardo pelo usu ario MySQL com privil egios na tabela mysql.user para executar c odigo aleat orios para obter acessi com o UID do processo mysqld (obrgado a Jedi/Sector One por detectar e reportar este erro.) Corrigido um falha do servidor com FORCE INDEX em uma consulta contendo "Range checked for each record" na sa ida do EXPLAIN. (Bug #1172) Corrigido o tratamento de permiss ao de tabelas/colunas - a ordena c ao apropriada (do mais especico para o menos especico, veja Se c ao 4.3.10 [Request access], P agina 243) n ao era respeitada (Bug #928) Corrigido um bug raro no MYISAM introduzido na vers ao 4.0.3 onde o handler do arquivo de indice n ao era diretamente atualizado depois de um UPDATE de registros dinamicos separados. Corrigido o erro Cant unlock file ao executar myisamchk --sort-index no Windows. (Bug #1119) Corrigido um poss ivel deadlock ao alterar key_buffer_size enquanto a cache de chaves era ativamente usada. (Bug #1088) Corrigido um bug de overow em MyISAM e ISAM quando um registro era atualiado na tabela com um grande n umero de colunas e pelo meno uma coluna BLOB/TEXT. Corrigido um resultado incorreto ao fazer UNION e LIMIT #,# quando n ao era usado parenteses na parte SELECT. Corrigido um resultado incorreto ao fazer UNION e ORDER BY .. LIMIT # quando n ao usado parenteses na parte SELECT. Corrigido um problema com SELECT SQL_CALC_FOUND_ROWS ... UNION ALL ... LIMIT # onde FOUND_ROWS() retornava o n umero incorreto de linhas. Corrigidos um erro de pilha indesejado quando tinhamos uma grande express ao do tipo 1+1-1+1-1... de uma ceta combina c ao. (Bug #871) Corrigido o erro que algumas vezes fazia uma tabela com um indice FULLTEXT estar marcada como "analyzed". Corrigido o MySQL para que o tamanho do campo (na API C) para a segunda coluna em SHOW CREATE TABLE seja sempre maior que o tamanho do dado. A u nica aplica c ao conhecida que era afetada pelo comportamento anterior era o Borland dbExpress, que truncava a sa ida do comando. (Bug #1064) Corrigida a falha na compara c ao de strings usando o conjunto de caracteres tis620. (Bug #1116) Corrigido um bug do ISAM na otimiza c ao de MAX(). myisamchk --sort-records=N n ao marca mais a tabela como danicada se a ordena c ao falhar devido a uma chave inapropriada. (Bug #892)
964
Corrigido um erro no tratamento de tabelas MyISAM compactadas que algumas vezes torna imposs ivel se reparar tabelas compactadas no modo "Repair by sort". "Repair with keycache" (myisamchk --safe-recover) funcionad. (Bug #1015) Corre c ao de um erro na propaga c ao do n umero da vers ao do manual inclu ido no arquivo de distribui c ao. (Bug #1020) Corrigida um problema de ordenacao da chave (uma chave prim aria - PRIMARY declarada em uma coluna que n ao e explicitamente marcada como NOT NULL era ordenada depois de uma chave UNIQUE para uma coluna NOT NULL). Corrigido o resultado de INTERVAL qaundo aplicado a um valor DATE. (Bug #792) Corrida a compila c ao da biblioteca do servidor embutido da arquivo de especica c ao do RPM. (Bug #959) Adicionado alguns arquivos que faltavam na arquivo de especica c ao do RPM e corrigido alguns erros de cria c ao do RPM que ocorriam no Red Hat Linux 9. (Bug #998) Corrigida a avalia c ao incorreta de XOR na cl ausula WHERE. (Bug #992) Corrigido um erro com processamento na cache de consultas com tabelas unidas a partir de mais de 255 tabelas. (Bug #930) Corre c ao dos resultados incorretos da consulta outer join (ex. LEFT JOIN) quando a condi c ao ON e sempre falsa, e a faixa de busca e usada. (Bug #926) Corrigido um erro causando resultados incorretos de MATCH ... AGAINST() em algumas joins. (Bug #942) Tabelas MERGE n ao ignoram mais "Using index" (da sa ida de EXPLAIN). Corrigido um erro que fazia uma tabela vazia ser marcada como "analyzed". (Bug #937) Corrigida a falha em myisamchk --sort-records quando usada em tabelas compactadas. Corrigido o ALTER TABLE lento (quando comparado a vers ao 3.23) e comandos relacionados tais como CREATE INDEX. (Bug #712) Corre c ao de segmentation fault resultante de LOAD DATA FROM MASTER quando o mestre estava executando sem a op c ao --log-bin. (Bug #934) Corrigido um erro de seguran ca: Um servidor compilado com suporte a SSL ainda permitia conex oes por usu arios que tinham a op c ao REQUIRE SSL especicadas por suas contas. Corrigido um erro aleat orio: Algumas vezes o slave replicava consultas GRANT ou REVOKE mesmo se estivesse congurado para excluir o banco de dados mysql da replica c ao (por exemplo, usando replicate-wild-ignore-table=mysql.%). (Bug #980) Os campos Last_Errno e Last_Error na sa ida de SHOW SLAVE STATUS agora s ao limpadas por CHANGE MASTER e quando a thread slave de SQL inicia. (Bug #986) Um erro de documenta c ao: ela dizia que RESET SLAVE n ao altera a informa c ao de conex ao (master host, port, user e password), embora ela o zesse. A instru c ao retorna estes valores para a op c ao de inicializa c ao (master-host etc) se houvesse alguma. (Bug #985) SHOW SLAVE STATUS agora exibe a informa c ao correta (master host, port, user e password) depois de RESET SLAVE (isto e, ela mostra os novos valores, que s ao copiados das op c oes de inicializa c ao se houver alguma). (Bug #985)
965
Disabilitada a propaga c ao da posi c ao original do log do master para eventos porque isto gerava valores inesperados para Exec_Master_Log_Pos e problemas com MASTER_ POS_WAIT() em congura c oes de replica c ao A->B->C. (Bug #1086) Corrigido uma segmentation fault no mysqlbinlog quando --position=x era usado com x estando entre um evento Create_file e o evento Append_block, Exec_load ou Delete_file. (Bug #1091) mysqlbinlog exibia avisos superuos quando se usava --database, o que causava erro de sintaxe quando enviado para mysql. (Bug #1092) O mysqlbinlog --database tamb em ltra LOAD DATA INFILE (anteriormente, ele ltrava todas as consultas exceto LOAD DATA INFILE). (Bug #1093) O mysqlbinlog em alguns casos esquece de colocar um # em frente do LOAD DATA INFILE original (este comando e exibido apenas para informa c ao, n ao para ser executado; mais tarde ele funcionava como LOAD DATA LOCAL com um nome de arquivo diferente, para execu c ao pelo mysql). (Bug #1096) binlog-do-db e binlog-ignore-db ltravam LOAD DATA INFILE incorretamente (ele era escrito parcialmente para o log bin ario). Isto resultava em um corrompimento do log bin ario, que podia fazer o slave parar com um erro. (Bug #1100) Quando, em uma transa c ao, um tabela transacional (como uma tabela InnoDB) era atualizada, e posteriormente na mesma transa c ao um tabela n ao transacional (como um tabela MyISAM) era atualizada usando o conte udo atualizado da tabela transacional (com INSERT ... SELECT por exemplo), as consultas eram escritas no log bin ario em uma ordem incorreta. (Bug #873) Quando em uma transa c ao, INSERT ... SELECT atualizava uma tabela n ao transacional, e um ROLLBACK era executado, nenhum erro era atualizado para o cliente. Agora o cliente e avisado que n ao se pode fazer roll back de algumas altera c oes, como j a era o caso para um INSERT normal. (Bug #1113) Corrigido um erro portencial: Quando STOP SLAVE era executado enquanto a thread slave de SQL estava no meio de uma transa c ao, e ent ao CHANGE MASTER era usado para direcionar para o slave para alguma instru c ao n ao transacional, a thread slave de SQL cava confusa (porque ela ainda podia achar que estava em uma transa c ao).
966
Removida a op c ao --table de mysqlbinlog para evitar repetir a funcionalidade mysqldump. Alterado levemente o otimizador para preferir busca de indice sobre busca em toda a tabela em alguns casos limites. Adicionado uma vari avel especica da thread, max_seeks_for_key, que pode ser usada para for car a otimiza c ao para usar chaves em vez de varrer a tabela, mesmo se a cardinalidade do indice for baixa. Adicionada a otimiza c ao que converte LEFT JOIN para joins normais em alguns casos. Uma altera c ao da documenta c ao: adicionado um par agrafo sobre falhas em replica c ao (como usar um slave sobrevivente como um novo master, como resumir a congura c ao original). Veja Se c ao 4.11.9 [Replication FAQ], P agina 411. Uma altera c ao de documenta c ao: adicionado avisos sobre uso seguro do comando CHANGE MASTER. Veja Se c ao 4.11.8.1 [CHANGE MASTER TO], P agina 402. O MySQL agora envia um aviso (e n ao um erro, como na vers ao 4.0.13) quando ele abre uma tabela que foi criada com o MySQL 4.1. Adicionada a op c ao --nice para mysqld_safe para permitir congurar a exatid ao do processo mysqld. (Obrigado a Christian Hammers por fornecer o patch inicial.) (Bug #627) Adicionada a op c ao --read-only para que o mysqld n ao permita atualiza c oes, exceto da thread escrava ou de usu arios com o privil egio SUPER. (Pacth original de Markus Benning). SHOW BINLOG EVENTS FROM x onde x e menor que 4, agora converte silenciosamente x para 4 em vez de exibir um erro. A mesma altera c ao foi feita para CHANGE MASTER TO MASTER_LOG_POS=x e CHANGE MASTER TO RELAY_LOG_POS=x. mysqld agora s o adiciona um tratamento de interrup c ao para o sinal SIGINT se voc e come c a-lo com a nova op c ao --gdb. Isto e porque alguns usu arios MySQL encontraram alguns problemas estranhos quando acidentalmente enviavam SIGINT para a threads mysqld. RESET SLAVE agora limpa os campos Last_Errno e Last_Error na sa ida de SHOW SLAVE STATUS. Adicionada a vari avel max_relay_log_size; o relay log ser a rotacionao automaticamente quando seu tamanho exceder max_relay_log_size. Mas se max_relay_log_ size for 0 (o padr ao), max_binlog_size ser a usado (como em vers oes mais antigas). max_binlog_size ainda se aplica a logs bin arios em qualquer caso de uso. FLUSH LOGS agora rotaciona os relay logs em adi c ao aos outros tipos de logs que ele j a rotacionava. Bugs corrigidos: Compara c ao/ordena c ao para o conjunto de caracteres latin1_de foi reescrita. O algoritmo antigo n ao podia tratar casos como "s a" > "a". Veja Se c ao 4.7.1.1 [German character set], P agina 327. Em casos raros ela resultava em tabela corrompida. Corrigido um problema com a prompt de senha no Windows. (Bug #683) ALTER TABLE ... UNION=(...) para uma tabela MERGE agora e permitida mesmo que alguma tabela MyISAM seja somente leitura. (Bug #702)
967
Corrigido um problema com CREATE TABLE t1 SELECT x41. (Bug #801) Removido alguns avisos de lock incorretos do log de erro. Corrigida um estouro de mem oria ao se fazer REPAIR em uma tabela com uma chave auto incremento multi-partes onde uma parte era um pacote CHAR. Corrigida uma prov avel condi c ao de corrida no c odigo da replica c ao que podia levar potencialmente a instru c oes INSERT n ao sendo replicadas no evento de um comando FLUSH LOGS ou quando o log bin ario excede max_binlog_size. (Bug #791) Corrigido um bug que pode levar a falha em INTERVAL e GROUP BY ou DISTINCT. (Bug #807) Corrigido um bug no mysqlhotcopy, assim ele agora aborta em opera c oes de c opia de tabelas sem sucesso. Corrigido outro bug, assim ele obtem sucesso quando houver milhares de tabelas para copiar. (Bug #812) Corrigido o problema com mysqlhotcopy que falhava ao ler op c oes do arquivo de op c ao. (Bug #808) Corrigido um bug no otimizador que algumas vezes prevenia o MySQL de usar indices FULLTEXT mesmo se fosse poss ivel (por exemplo, em SELECT * FROM t1 WHERE MATCH a,b AGAINST("index") > 0). Corrigido um bug com table is full em opera c oes UNION. Corrigido um problema de seguran ca no qual usu arios habilitados sem privil egios obtinham informa c oes na lista de banco de dados existentes usando SHOW TABLES e comandos parecidos. Corrigido um problema de pilha no UnixWare/OpenUnix. Corrigido um problema de congura c ao UnixWare/OpenUNIX e OpenServer. Corrigido um problema de pilha cheia na verica c ao da senha. Corrigido um problema com max_user_connections. HANDLER sem um indice agora funciona apropriadamente quando uma tabela tem registros deletados. (Bug #787) Corrigido um erro com LOAD DATA em mysqlbinlog. (Bug #670) Corre c ao: SET CHARACTER SET DEFAULT fucniona. (Bug #462) Corrigido o comportamento de tabelas MERGE em consultas ORDER BY ... DESC. (Bug #515) Corrigida a falha do servidor em PURGE MASTER LOGS ou SHOW MASTER LOGS quando o log bin ario estava desligado. (Bug #733) Corrigido o problema de verica c ao de senha no Windows. (Bug #464) Corrigido um erro na compara c ao de uma coluna DATETIME e uma constante inteira. (Bug #504) Corrigido o modo remoto de mysqlbinlog. (Bug #672) Corrigido ERROR 1105: Unknown error que ocorria para algumas consultas SELECT, onde uma coluna declarada como NOT NULL era comparada com uma express ao que podia tomar o valor NULL. Alterado o timeout em mysql_real_connect() para usar poll() em vez de select() para contornar problemas cmo muitos outros arquivos abertos no cliente.
968
Corrigido resultados incorretos de MATCH ... AGAINST usado com uma consulta LEFT JOIN. Corrigido um bug que limitava o valor m aximo para vari aveis mysqld em 4294967295 quando eles eram especicados na linha de comando. Corrigido um bug que algumas vezes causavam falsos erros de Access denied nas instru c oes HANDLER ... READ, quando uma tabela e referenciada via um alias. Corrigido um problema de portabilidade com safe_malloc, o qual fazia com que o MySQL para enviar erros de "Freeing wrong aligned pointer" no SCO 3.2. ALTER TABLE ... ENABLE/DISABLE KEYS podia causar um core dump quando feito depois de uma instru c ao INSERT DELAYED na mesma tabela. Corrigido um problema com convers ao da hora local para GMT onde algumas vezes resultava em diferentes (mas corretos) timestamps. Agora o MySQL deve usar o menor valor de poss ivel neste caso. (Bug #316) Uma cache de consultas muito pequena podia fazer o mysqld falhar. (Bug #549) Corrigido um bug (acidentalemnte introduzida por n os mas presente apenas na vers ao 4.0.13) que faz INSERT ... SELECT em uma coluna AUTO_INCREMENT que n ao replica bem. Este bug est a no master, n ao no slave. (Bug #490) Corrigido um bug: Quando uma instru c ao INSERT ... SELECT inseria linhas em uma tabela n ao transacional, mas falhava no mesmo ponto (por exemplo, devido a erros de Duplicate key), a consulta n ao era escrita no log bin ario. Agora ela e escrita no log bin ario, com seus c odigos de erros, como todas as outras cosultas s ao. Sobre a op c ao slave-skip-errors para como tratar consultas completadas parcialmente no slave, veja Se c ao 4.11.6 [Replication Options], P agina 393. (Bug #491) SET FOREIGN_KEY_CHECKS=0 n ao era replicado apropriadamente. A corre c ao provavelmente n ao ser a feita para 3.23. Em um slave, LOAD DATA INFILE sem cl ausulas IGNORE ou REPLACE no master, era replicada com IGNORE. Enquanto isto n ao for um problemase os dados do master e slave s ao identicos (em LOAD que n ao produz conitos de duplica c ao no master n ao produzir a nada no slave de qualquer forma), o que e verdade em opera c oes normais, para depura c ao e melhor n ao adicionar silenciosamente o IGNORE. Deste modo, voc e pode obter uma mensagem de erro no slave e descobrir que por alguma raz ao, os dados no master e slave s ao diferentes e investigar o porque. (Bug #571) Em um slave, LOAD DATA INFILE exibia uma mensagem incomplete Duplicate entry %-.64s for key %d (o nome e valor da chave n ao eram mencionados) no caso de conito de duplica c ao (o que n ao acontece em opera c oes normais). (Bug #573) Quando usado um slave compilado com --debug, CHANGE MASTER TO RELAY_LOG_POS podia causar um falha de declara c ao da depura c ao. (Bug #576) Ao fazer um LOCK TABLES WRITE em uma tabela InnoDB, o commit podia n ao acontecer, se a consulta n ao era escrita no log bin ario (por exemplo, se --log-bin n ao era usado, ou binlog-ignore-db era usado). (Bug #578) Se um master na vers ao 3.23 tivesse aberto tabelas tempor arias que tinham sido replicadas para um slave na vers ao 4.0, e o log bin ario rotacionado, estas tabelas tempor arias eram automaticamente removidas pelo slave (o que causa problemas se o master os utiliza subsequecialmente). Este erro foi corrigido na vers ao 4.0.13, mas de um modo
969
que cria um incoveni encia indesejada: se o master na vers ao 3.23 morrer brutalmente. (queda de for ca), sem tempo suciente para escrever automaticamente instru c oes DROP TABLE em seu log bin ario. ent ao o slave na vers ao 4.0.13 n ao noticaria que as tabelas tempor arias tinham sido removidas, at e o servidor mysqld slave ter sido reiniciado. Este pequeno incoveniente est a corrigido na vers ao 3.23.57 e 4.0.14 (signicando que o master deve ser atualizado para a vers ao 3.23.57 e o slave para a 4.0.14 para remover o incoveniente). (Bug #254) Se MASTER_POS_WAIT() estava espereando e o slave estava inativo, e thread slave de SQL terminada, MASTER_POS_WAIT() esperaria para sempre. Agora quando a thread slave de SQL termina, MASTER_POS_WAIT() retorna NULL imediatamente (slave stopped). (Bug #651) Depois de RESET SLAVE; START SLAVE;, o valor de Relay_Log_Space exibido por SHOW SLAVE STATUS era muito grande para 4 bytes. (Bug #763) Se uma consulta era ignorada no slave (devido a replicate-ignore-table e outras regras similares), o escravo ainda verica se a consulta consegue o mesmo c odigo de erro (0, sem erro) como no master. Assim se o master tiver um erro na consulta (por exemplo, Duplicate entry em uma inser c ao de m ultiplas linhas), ent ao o slave parava e avisava que c odigo de erro n ao coincidia. (Bug #797)
970
com conjunto de caracteres onde e conveniente colocar a string como um item bin ario. Depois destas altera c oes voc e deve converter a string bin aria para INTEGER com um CAST se voc e quiser comparar dois itens bin arios, um com o outro, e saber qual e maior. SELECT CAST(0xfeff AS UNSIGNED) < CAST(0xff AS UNSIGNED). Este ser a o comportamento padr ao no MySQL 4.1. (Bug #152) Habilitado delayed_insert_timeout no Linux (as bibliotecas glibc mais modernas tem um pthread_cond_timedwait corrigido). (Bug #211) N ao cria mais threads de insert delayed que o dado por max_insert_delayed_threads. (Bug #211) Alterado o UPDATE ... LIMIT para aplicar o limite as linhas encontradas, independente de terem sido alteradas. Anteriormente o limite era aplicado como uma restri c ao no n umero de linhas alteradas. Ajustado o otimizador para favorecer ind ices em cluster em ver de busca na tabela. BIT_AND() e BIT_OR() agora retornam um valor de 64 bits sem sinal. Adicionado avisos ao log de erro do porqu e de um falha em uma conex ao segura (quando executando com --log-warnings). As op c oes --skip-symlink e --use-symbolic-links est ao obsoletas e forma substitu idas com --symbolic-links. A op c ao padr ao para innodb_flush_log_at_trx_commit foi alterada de 0 para 1 para tornar tabelas InnoDB como ACID por padr ao. Veja Se c ao 7.5.3 [InnoDB start], P agina 643. Adicionado o recurso para SHOW KEYS para mostrar chaves que est ao disabilitadas pelo comando ALTER TABLE DISABLE KEYS. Ao usar um tipo de tabela n ao existente com CREATE TABLE, primeiro v e se o tipo de tabela padr ao existe antes de utilizar MyISAM. Adicionado MEMORY como um alias para HEAP. Renomeada a fun c ao rnd para my_rnd j a que o nome era muito gen erico e e um s imbolo exportado no libmysqlclient (obrigado a Dennis Haney pelo patch inicial). Corre c ao de portabilidade: renomeado include/dbug.h para include/my_debug.h. mysqldump n ao deleta mais o log bin ario sem aviso quando chamado com --masterdata ou --first-slave; enquanto este comportamento era conveniente para alguns usu arios, outros podia sofrer com ele. Agora deve perguntar explicitamente pela sua dele c ao com a nova op c ao --delete-master-logs. Se o slave e congurado (usando, por exemplo, replicate-wild-ignoretable=mysql.%) para ecluir mysql.user, mysql.host, mysql.db, mysql.tables_priv e mysql.columns_priv da replica c ao, ent ao GRANT e REVOKE n ao ser ao replicados. Bugs corrigidos: A mensagem de erro Access denied ao logar tinha um valor Using password incorreto. (Bug #398) Corrigido um bug com NATURAL LEFT JOIN, NATURAL RIGHT JOIN e RIGHT JOIN quando usadas muitas tabelas em joins. O problema era que o m etodo JOIN n ao era sempre associoado com as tabelas envolvida no m etodo JOIN. Se voc e tiver uma consulta que
971
usa muitos RIGHT JOIN ou NATURAL ... JOINS voc e deve vericar se eles funcionam como voc e espera depois de atualizar o MySQL para esta vers oa. (Bug #291) O cliente de linha de comando mysql n ao olha mais os comnados \* dentro de stringd com aspas invertidas. Corrigido Unknown error ao usar UPDATE ... LIMIT. (Bug #373) Corrigido o problema com o modo ANSI e GROUP BY com constantes. (Bug #387) Corrigido o erro com UNION e OUTER JOIN. (Bug #386) Corrigido o erro se e usado um UPDATE multi-tabelas e a consulta exige um tabela tempor aria maior que tmp_table_size. (Bug #286) Executa mysql_install_db com a op c ao -IN-RPM para a instala c ao do Mac OS X n ao falhar em sistemas com a congura c ao de nome de m aquina feita de forma inapropriada. LOAD DATA INFILE agora ir a ler 000000 como uma data zerada em vez de "2000-0000". Corrigido um erro que fazia que DELETE FROM table WHERE const_expression sempre deletasse toda a tabela (mesmo se o resultado da express ao fosse falso). (Bug #355) Corrigido um bug de core dump ao usar FORMAT(nan,#). (Bug #284) Corrigido um erro na resolu c ao do nome com HAVING ... COUNT(DISTINCT ...). Corrigido resultados incorretos da opera ca o de truncamento (*) em MATCH ... AGAINST() em alguns joins complexos. Fixed a crash in REPAIR ... USE_FRM command, when used on read-only, nonexisting table or a table with a crashed index le. Fixed a crashing bug in mysql monitor program. It occurred if program was started with --no-defaults, with a prompt that contained hostname and connection to nonexisting db was requested Fixed problem when comparing a key for a multi-byte-character set. (Bug #152) Fixed bug in LEFT, RIGHT and MID when used with multi-byte character sets and some GROUP BY queries. (Bug #314) Fix problem with ORDER BY being discarded for some DISTINCT queries. (Bug #275) Fixed that SET SQL_BIG_SELECTS=1 works as documented (This corrects a new bug introduced in 4.0) Fixed some serious bugs in UPDATE ... ORDER BY. (Bug #241) Fixed unlikely problem in optimising WHERE clause with constant expression like in WHERE 1 AND (a=1 AND b=1). Fixed that SET SQL_BIG_SELECTS=1 works again. Introduced proper backtick quoting for db.table in SHOW GRANTS. FULLTEXT index stopped working after ALTER TABLE that converts TEXT column to CHAR. (Bug #283) Fixed a security problem with SELECT and wildcarded select list, when user only had partial column SELECT privileges on the table. Mark a MyISAM table as "analyzed" only when all the keys are indeed analyzed. Only ignore world-writeable my.cnf les that are regular les (and not, for example, named pipes or character devices).
972
Fixed few smaller issues with SET PASSWORD. Fixed error message which contained deprecated text. Fixed a bug with two NATURAL JOINs in the query. SUM() didnt return NULL when there was no rows in result or when all values was NULL. On Unix symbolic links handling was not enabled by default and there was no way to turn this on. Added missing dashes to parameter --open-files-limit in mysqld_safe. #264) Fixed a bug with NAN in FORMAT(...) function ... Fixed a bug with improperly cached database privileges. Fixed a bug in ALTER TABLE ENABLE / DISABLE KEYS which failed to force a refresh of table data in the cache. Fixed bugs in replication of LOAD DATA INFILE for custom parameters (ENCLOSED, TERMINATED and so on) and temporary tables. (Bug #183, Bug #222) Fixed a replication bug when the master is 3.23 and the slave 4.0: the slave lost the replicated temporary tables if FLUSH LOGS was issued on the master. (Bug #254) Fixed a bug when doing LOAD DATA INFILE IGNORE: When reading the binary log, mysqlbinlog and the replication code read REPLACE instead of IGNORE. This could make the slaves table become dierent from the masters table. (Bug #218) Fixed a deadlock when relay_log_space_limit was set to a too small value. (Bug #79) Fixed a bug in HAVING clause when an alias is used from the select list. Fixed overow bug in MyISAM when a row is inserted into a table with a large number of columns and at least one BLOB/TEXT column. Bug was caused by incorrect calculation of the needed buer to pack data. Fixed a bug when SELECT @nonexistent variable caused the error in client - server protocol due to net printf() being sent to the client twice. Fixed a bug in setting SQL_BIG_SELECTS option. Fixed a bug in SHOW PROCESSLIST which only displayed a localhost in the "Host" column. This was caused by a glitch that only used current thread information instead of information from the linked list of threads. Removed unnecessary Mac OS X helper les from server RPM. (Bug #144) Allow optimization of multiple-table update for InnoDB tables as well. Fixed a bug in multiple-table updates that caused some rows to be updated several times. Fixed a bug in mysqldump when it was called with --master-data: the CHANGE MASTER TO commands appended to the SQL dump had incorrect coordinates. (Bug #159) Fixed a bug when an updating query using USER() was replicated on the slave; this caused segfault on the slave. (Bug #178). USER() is still badly replicated on the slave (it is replicated to ""). (Bug
973
974
After RESET SLAVE, the coordinates displayed by SHOW SLAVE STATUS looked un-reset (though they were, but only internally). (Bug #70) Fixed query cache invalidation on LOAD DATA. Fixed memory leak on ANALYZE procedure with error. Fixed a bug in handling CHAR(0) columns that could cause incorrect results from the query. Fixed rare bug with incorrect initialisation of AUTO_INCREMENT column, as a secondary column in a multi-column key (veja Se c ao 3.6.9 [AUTO_INCREMENT on secondary column in a multi-column key], P agina 202), when data was inserted with INSERT ... SELECT or LOAD DATA into an empty table. On Windows, STOP SLAVE didnt stop the slave until the slave got one new command from the master (this bug has been xed for MySQL 4.0.11 by releasing updated 4.0.11a Windows packages, which include this individual x on top of the 4.0.11 sources). (Bug #69) Fixed a crash when no database was selected and LOAD DATA command was issued with full table name specied, including database prex. Fixed a crash when shutting down replication on some platforms (for example, Mac OS X). Fixed a portability bug with pthread_attr_getstacksize on HP-UX 10.20 (Patch was also included in 4.0.11a sources). Fixed the bigint test to not fail on some platforms (for example, HP-UX and Tru64) due to dierent return values of the atof() function. Fixed the rpl_rotate_logs test to not fail on certain platforms (e.g. Mac OS X) due to a too long le name (changed slave-master-info.opt to .slave-mi).
975
Fixed a problem with BLOB NOT NULL columns used with IS NULL. Re-added missing pre- and post(un)install scripts to the Linux RPM packages (they were missing after the renaming of the server subpackage). Fixed that table locks are not released with multi-table updates and deletes with InnoDB storage engine. Fixed bug in updating BLOB columns with long strings. Fixed integer-wraparound when giving big integer (>= 10 digits) to function that requires an unsigned argument, like CREATE TABLE (...) AUTO_INCREMENT=#. MIN(key_column) could in some cases return NULL on a column with NULL and other values. MIN(key_column) and MAX(key_column) could in some cases return incorrect values when used in OUTER JOIN. MIN(key_column) and MAX(key_column) could return incorrect values if one of the tables was empty. Fixed rare crash in compressed MyISAM tables with blobs. Fixed bug in using aggregate functions as argument for INTERVAL, CASE, FIELD, CONCAT_WS, ELT and MAKE_SET functions. When running with --lower-case-table-names (default on Windows) and you had tables or databases with mixed case on disk, then executing SHOW TABLE STATUS followed with DROP DATABASE or DROP TABLE could fail with Errcode 13.
976
If a slave is congured with replicate_wild_do_table=db.% or replicate_wild_ ignore_table=db.%, these rules will be applied to CREATE/DROP DATABASE too. Added timeout value for MASTER_POS_WAIT(). Bugs xed: Fixed initialisation of the random seed for newly created threads to give a better rand() distribution from the rst call. Fixed a bug that caused mysqld to hang when a table was opened with the HANDLER command and then dropped without being closed. Fixed bug in logging to binary log (which aects replication) a query that inserts a NULL in an AUTO_INCREMENT column and also uses LAST_INSERT_ID(). Fixed an unlikely bug that could cause a memory overrun when using ORDER BY constant_expression. Fixed a table corruption in myisamchks parallel repair mode. Fixed bug in query cache invalidation on simple table renaming. Fixed bug in mysqladmin --relative. On some 64 bit systems, show status reported a strange number for Open_files and Open_streams. Fixed incorrect number of columns in EXPLAIN on empty table. Fixed bug in LEFT JOIN that caused zero rows to be returned in the case the WHERE condition was evaluated as FALSE after reading const tables. (Unlikely condition). FLUSH PRIVILEGES didnt correctly ush table/column privileges when mysql.tables_ priv is empty. Fixed bug in replication when using LOAD DATA INFILE one a le that updated an AUTO_INCREMENT column with NULL or 0. This bug only aected MySQL 4.0 masters (not slaves or MySQL 3.23 masters). Note: If you have a slave that has replicated a le with generated AUTO_INCREMENT columns then the slave data is corrupted and you should reinitialise the aected tables from the master. Fixed possible memory overrun when sending a BLOB value larger than 16M to the client. Fixed incorrect error message when setting a NOT NULL column to an expression that returned NULL. Fixed core dump bug in str LIKE "%other_str%" where str or other_str contained characters >= 128. Fixed bug: When executing on master LOAD DATA and InnoDB failed with table full error the binary log was corrupted.
977
SELECT * from t1,t2 where t1.a=t2.key_with_a_lot_of_null; Added join operator FORCE INDEX (key_list). This acts likes USE INDEX (key_list) but with the addition that a table scan is assumed to be VERY expensive. One bad thing with this is that it makes FORCE a reserved word. Reset internal row buer in MyISAM after each query. This will reduce memory in the case you have a lot of big blobs in a table. Bugs xed: A security patch in 4.0.8 causes the mysqld server to die if the remote hostname cant be resolved. This is now xed. Fixed crash when replication big LOAD DATA INFILE statement that caused log rotation.
978
Bugs xed: Fixed compilation problems on OpenUnix and HPUX 10.20. Fixed some optimization problems when compiling MySQL with -DBIG_TABLES on a 32 bit system. mysql_drop_db() didnt check permissions properly so anyone could drop another users database. DROP DATABASE is checked properly.
979
CHANGE MASTER and RESET SLAVE now require that slave threads be both already stopped; these commands will return an error if at least one of these two threads is running. Bugs xed: Fixed number of found rows returned in multi table updates Make --lower-case-table-names default on Mac OS X as the default le system (HFS+) is case insensitive. Veja Se c ao 6.1.3 [Name case sensitivity], P agina 473. Transactions in AUTOCOMMIT=0 mode didnt rotate binary log. A x for the bug in a SELECT with joined tables with ORDER BY and LIMIT clause when lesort had to be used. In that case LIMIT was applied to lesort of one of the tables, although it could not be. This x also solved problems with LEFT JOIN. mysql_server_init() now makes a copy of all arguments. This xes a problem when using the embedded server in C# program. Fixed buer overrun in libmysqlclient library that allowed a malicious MySQL server to crash the client application. Fixed security-related bug in mysql_change_user() handling. All users are strongly recommended to upgrade to version 4.0.6. Fixed bug that prevented --chroot command-line option of mysqld from working. Fixed bug in phrase operator "..." in boolean full-text search. Fixed bug that caused OPTIMIZE TABLE to corrupt the table under some rare circumstances. Part rewrite of multi-table-update to optimise it, make it safer and more bug free. LOCK TABLES now works together with multi-table-update and multi-table-delete. --replicate-do=xxx didnt work for UPDATE commands. (Bug introduced in 4.0.0) Fixed shutdown problem on Mac OS X. Major InnoDB bugs in REPLACE, AUTO_INCREMENT, INSERT INTO ... SELECT ... were xed. See the InnoDB changelog in the InnoDB section of the manual. RESET SLAVE caused a crash if the slave threads were running.
980
mysqld will now resolve basedir to its full path (with realpath()). This enables one to use relative symlinks to the MySQL installation directory. This will however cause show variables to report dierent directories on systems where there is a symbolic link in the path. Fixed that MySQL will not use index scan on index disabled with IGNORE INDEX or USE INDEX. to be ignored. Added --use-frm option to mysqlcheck. When used with REPAIR, it gets the table structure from the .frm le, so the table can be repaired even if the .MYI header is corrupted. Fixed bug in MAX() optimization when used with JOIN and ON expressions. Added support for reading of MySQL 4.1 table denition les. BETWEEN behaviour changed (veja Se c ao 6.3.1.2 [Comparison Operators], P agina 504). Now datetime_col BETWEEN timestamp AND timestamp should work as expected. One can create TEMPORARY MERGE tables now. DELETE FROM myisam_table now shrinks not only the .MYD le but also the .MYI le. When one uses the --open-files-limit=# option to mysqld_safe its now passed on to mysqld. Changed output from EXPLAIN from where used to Using where to make it more in line with other output. Removed variable safe_show_database as it was no longer used. Updated source tree to be built using automake 1.5 and libtool 1.4. Fixed an inadvertently changed option (--ignore-space) back to the original -ignore-spaces in mysqlclient. (Both syntaxes will work). Dont require UPDATE privilege when using REPLACE. Added support for DROP TEMPORARY TABLE ..., to be used to make replication safer. When transactions are enabled, all commands that update temporary tables inside a BEGIN/COMMIT are now stored in the binary log on COMMIT and not stored if one does ROLLBACK. This xes some problems with non-transactional temporary tables used inside transactions. Allow braces in joins in all positions. Formerly, things like SELECT * FROM (t2 LEFT JOIN t3 USING (a)), t1 worked, but not SELECT * FROM t1, (t2 LEFT JOIN t3 USING (a)). Note that braces are simply removed, they do not change the way the join is executed. InnoDB now supports also isolation levels READ UNCOMMITTED and READ COMMITTED. For a detailed InnoDB changelog, see Se c ao 7.5.16 [InnoDB change history], P agina 677 in this manual. Bugs xed: Fixed bug in MAX() optimization when used with JOIN and ON expressions. Fixed that INSERT DELAY threads dont hang on Waiting for INSERT when one sends a SIGHUP to mysqld. Fixed that MySQL will not use an index scan on an index that has been disabled with IGNORE INDEX or USE INDEX.
981
Corrected test for root user in mysqld_safe. Fixed error message issued when storage engine cannot do CHECK or REPAIR. Fixed rare core dump problem in complicated GROUP BY queries that didnt return any result. Fixed mysqlshow to work properly with wildcarded database names and with database names that contain underscores. Portability xes to get MySQL to compile cleanly with Sun Forte 5.0. Fixed MyISAM crash when using dynamic-row tables with huge numbers of packed elds. Fixed query cache behaviour with BDB transactions. Fixed possible oating point exception in MATCH relevance calculations. Fixed bug in full-text search IN BOOLEAN MODE that made MATCH to return incorrect relevance value in some complex joins. Fixed a bug that limited MyISAM key length to a value slightly less that 500. It is exactly 500 now. Fixed that GROUP BY on columns that may have a NULL value doesnt always use disk based temporary tables. The lename argument for the --des-key-file argument to mysqld is interpreted relative to the data directory if given as a relative pathname. Removed a condition that temp table with index on column that can be NULL has to be MyISAM. This was okay for 3.23, but not needed in 4.*. This resulted in slowdown in many queries since 4.0.2. Small code improvement in multi-table updates. Fixed a newly introduced bug that caused ORDER BY ... LIMIT row_count to not return all rows. Fixed a bug in multi-table deletes when outer join is used on an empty table, which gets rst to be deleted. Fixed a bug in multi-table updates when a single table is updated. Fixed bug that caused REPAIR TABLE and myisamchk to corrupt FULLTEXT indexes. Fixed bug with caching the mysql grant table database. Now queries in this database are not cached in the query cache. Small x in mysqld_safe for some shells. Give error if a MyISAM MERGE table has more than 2 ^ 32 rows and MySQL was not compiled with -DBIG_TABLES. Fixed some ORDER BY ... DESC problems with InnoDB tables.
982
Fixed bug in ORDER BY when there is a constant in the SELECT statement. One didnt get an error message if mysqld couldnt open the privilege tables. SET PASSWORD FOR ... closed the connection in case of errors (bug from 4.0.3). Increased max possible max_allowed_packet in mysqld to 1 GB. Fixed bug when doing a multi-line INSERT on a table with an AUTO_INCREMENT key which was not in the rst part of the key. Changed LOAD DATA INFILE to not recreate index if the table had rows from before. Fixed overrun bug when calling AES_DECRYPT() with incorrect arguments. --skip-ssl can now be used to disable SSL in the MySQL clients, even if one is using other SSL options in an option le or previously on the command line. Fixed bug in MATCH ... AGAINST( ... IN BOOLEAN MODE) used with ORDER BY. Added LOCK TABLES and CREATE TEMPORARY TABLES privilege on the database level. One must run the mysql_fix_privilege_tables script on old installations to activate these. In SHOW TABLE ... STATUS, compressed tables sometimes showed up as dynamic. SELECT @@[global|session].var_name didnt report global | session in the result column name. Fixed problem in replication that FLUSH LOGS in a circular replication setup created an innite number of binary log les. Now a rotate-binary-log command in the binary log will not cause slaves to rotate logs. Removed STOP EVENT from binary log when doing FLUSH LOGS. Disable the use of SHOW NEW MASTER FOR SLAVE as this needs to be completely reworked in a future release. Fixed a bug with constant expression (for example, eld of a one-row table, or eld from a table, referenced by a UNIQUE key) appeared in ORDER BY part of SELECT DISTINCT. --log-binary=a.b.c now properly strips o .b.c. FLUSH LOGS removed numerical extension for all future update logs. GRANT ... REQUIRE didnt store the SSL information in the mysql.user table if SSL was not enabled in the server. GRANT ... REQUIRE NONE can now be used to remove SSL information. AND is now optional between REQUIRE options. REQUIRE option was not properly saved, which could cause strange output in SHOW GRANTS. Fixed that mysqld --help reports correct values for --datadir and --bind-address. Fixed that one can drop UDFs that didnt exist when mysqld was started. Fixed core dump problem with SHOW VARIABLES on some 64 bit systems (like Solaris sparc). Fixed a bug in my_getopt(); --set-variable syntax didnt work for those options that didnt have a valid variable in the my_option struct. This aected at least the default-table-type option. Fixed a bug from 4.0.2 that caused REPAIR TABLE and myisamchk --recover to fail on tables with duplicates in a unique key.
983
Fixed a bug from 4.0.3 in calculating the default datatype for some functions. This aected queries of type CREATE TABLE table_name SELECT expression(),... Fixed bug in queries of type SELECT * FROM table-list GROUP BY ... and SELECT DISTINCT * FROM .... Fixed bug with the --slow-log when logging an administrator command (like FLUSH TABLES). Fixed a bug that OPTIMIZE of locked and modied table, reported table corruption. Fixed a bug in my_getopt() in handling of special prexes (--skip-, --enable-). --skip-external-locking didnt work and the bug may have aected other similar options. Fixed bug in checking for output le name of the tee option. Added some more optimization to use index for SELECT ... FROM many_tables .. ORDER BY key limit # Fixed problem in SHOW OPEN TABLES when a user didnt have access permissions to one of the opened tables.
984
Made safe_mysqld a symlink to mysqld_safe in binary distribution. Fixed security bug when having an empty database name in the user.db table. Fixed some problems with CREATE TABLE ... SELECT function(). mysqld now has the option --temp-pool enabled by default as this gives better performance with some operating systems. Fixed problem with too many allocated alarms on slave when connecting to master many times (normally not a very critical error). Fixed hang in CHANGE MASTER TO if the slave thread died very quickly. Big cleanup in replication code (less logging, better error messages, etc..) If the --code-file option is specied, the server calls setrlimit() to set the maximum allowed core le size to unlimited, so core les can be generated. Fixed bug in query cache after temporary table creation. Added --count=N (-c) option to mysqladmin, to make the program do only N iterations. To be used with --sleep (-i). Useful in scripts. Fixed bug in multi-table UPDATE: when updating a table, do_select() became confused about reading records from a cache. Fixed bug in multi-table UPDATE when several elds were referenced from a single table Fixed bug in truncating nonexisting table. Fixed bug in REVOKE that caused user resources to be randomly set. Fixed bug in GRANT for the new CREATE TEMPORARY TABLE privilege. Fixed bug in multi-table DELETE when tables are re-ordered in the table initialisation method and ref lengths are of dierent sizes. Fixed two bugs in SELECT DISTINCT with large tables. Fixed bug in query cache initialisation with very small query cache size. Allow DEFAULT with INSERT statement. The startup parameters myisam_max_sort_file_size and myisam_max_extra_sort_ file_size are now given in bytes, not megabytes. External system locking of MyISAM/ISAM les is now turned o by default. One can turn this on with --external-locking. (For most users this is never needed). Fixed core dump bug with INSERT ... SET db_name.table_name.colname=. Fixed client hangup bug when using some SQL commands with incorrect syntax. Fixed a timing bug in DROP DATABASE New SET [GLOBAL | SESSION] syntax to change thread-specic and global server variables at runtime. Added variable slave_compressed_protocol. Renamed variable query_cache_startup_type to query_cache_type, myisam_bulk_ insert_tree_size to bulk_insert_buffer_size, record_buffer to read_buffer_ size and record_rnd_buffer to read_rnd_buffer_size. Renamed some SQL variables, but old names will still work until 5.0. Veja Se c ao 2.5.2 [Upgrading-from-3.23], P agina 123. Renamed --skip-locking to --skip-external-locking.
985
Removed unused variable query_buffer_size. Fixed a bug that made the pager option in the mysql client non-functional. Added full AUTO_INCREMENT support to MERGE tables. Extended LOG() function to accept an optional arbitrary base parameter. Se c ao 6.3.3.2 [Mathematical functions], P agina 523. Veja
Added LOG2() function (useful for nding out how many bits a number would require for storage). Added LN() natural logarithm function for compatibility with other databases. It is synonymous with LOG(X).
986
Added missing mutex in TRUNCATE TABLE; This xes some core dump/hangup problems when using TRUNCATE TABLE. Fixed bug in multiple-table DELETE when optimiser uses only indexes. Fixed that ALTER TABLE table_name RENAME new_table_name is as fast as RENAME TABLE. Fixed bug in GROUP BY with two or more elds, where at least one eld can contain NULL values. Use Turbo Boyer-Moore algorithm to speed up LIKE "%keyword%" searches. Fixed bug in DROP DATABASE with symlink. Fixed crash in REPAIR ... USE_FRM. Fixed bug in EXPLAIN with LIMIT offset != 0. Fixed bug in phrase operator "..." in boolean full-text search. Fixed bug that caused duplicated rows when using truncation operator * in boolean full-text search. Fixed bug in truncation operator of boolean full-text search (incorrect results when there are only +word*s in the query). Fixed bug in boolean full-text search that caused a crash when an identical MATCH expression that did not use an index appeared twice. Query cache is now automatically disabled in mysqldump. Fixed problem on Windows 98 that made sending of results very slow. Boolean full-text search weighting scheme changed to something more reasonable. Fixed bug in boolean full-text search that caused MySQL to ignore queries of ft_min_ word_len characters. Boolean full-text search now supports phrase searches. New congure option --without-query-cache. Memory allocation strategy for root memory changed. Block size now grows with number of allocated blocks. INET_NTOA() now returns NULL if you give it an argument that is too large (greater than the value corresponding to 255.255.255.255). Fix SQL_CALC_FOUND_ROWS to work with UNIONs. It will work only if the rst SELECT has this option and if there is global LIMIT for the entire statement. For the moment, this requires using parentheses for individual SELECT queries within the statement. Fixed bug in SQL_CALC_FOUND_ROWS and LIMIT. Dont give an error for CREATE TABLE ...(... VARCHAR(0)). Fixed SIGINT and SIGQUIT problems in mysql.cc on Linux with some glibc versions. Fixed bug in convert.cc, which is caused by having an incorrect net_store_ length() linked in the CONVERT::store() method. DOUBLE and FLOAT columns now honor the UNSIGNED ag on storage. InnoDB now retains foreign key constraints through ALTER TABLE and CREATE/DROP INDEX. InnoDB now allows foreign key constraints to be added through the ALTER TABLE syntax.
987
InnoDB tables can now be set to automatically grow in size (autoextend). Added --ignore-lines=n option to mysqlimport. This has the same eect as the IGNORE n LINES clause for LOAD DATA. Fixed bug in UNION with last oset being transposed to total result set. REPAIR ... USE_FRM added. Fixed that DEFAULT_SELECT_LIMIT is always imposed on UNION result set. Fixed that some SELECT options can appear only in the rst SELECT. Fixed bug with LIMIT with UNION, where last select is in the braces. Fixed that full-text works ne with UNION operations. Fixed bug with indexless boolean full-text search. Fixed bug that sometimes appeared when full-text search was used with const tables. Fixed incorrect error value when doing a SELECT with an empty HEAP table. Use ORDER BY column DESC now sorts NULL values rst. (In other words, NULL values sort rst in all cases, whether or not DESC is specied.) This is changed back in 4.0.10. Fixed bug in WHERE key_name=constant ORDER BY key_name DESC. Fixed bug in SELECT DISTINCT ... ORDER BY DESC optimization. Fixed bug in ... HAVING GROUP_FUNCTION(xxx) IS [NOT] NULL. Fixed bug in truncation operator for boolean full-text search. Allow value of --user=# option for mysqld to be specied as a numeric user ID. Fixed a bug where SQL_CALC_ROWS returned an incorrect value when used with one table and ORDER BY and with InnoDB tables. Fixed that SELECT 0 LIMIT 0 doesnt hang thread. Fixed some problems with USE/IGNORE INDEX when using many keys with the same start column. Dont use table scan with BerkeleyDB and InnoDB tables when we can use an index that covers the whole row. Optimized InnoDB sort-buer handling to take less memory. Fixed bug in multi-table DELETE and InnoDB tables. Fixed problem with TRUNCATE and InnoDB tables that produced the error Cant execute the given command because you have active locked tables or an active transaction. Added NO_UNSIGNED_SUBTRACTION to the set of ags that may be specied with the --sql-mode option for mysqld. It disables unsigned arithmetic rules when it comes to subtraction. (This will make MySQL 4.0 behave more like 3.23 with UNSIGNED columns). The result returned for all bit functions (|, <<, ...) is now of type unsigned integer. Added detection of nan values in MyISAM to make it possible to repair tables with nan in oat or double columns. Fixed new bug in myisamchk where it didnt correctly update number of parts in the MyISAM index le. Changed to use autoconf 2.52 (from autoconf 2.13).
988
Fixed optimization problem where the MySQL Server was in preparing state for a long time when selecting from an empty table which had contained a lot of rows. Fixed bug in complicated join with const tables. This x also improves performance a bit when referring to another table from a const table. First pre-version of multi-table UPDATE statement. Fixed bug in multi-table DELETE. Fixed bug in SELECT CONCAT(argument_list) ... GROUP BY 1. INSERT ... SELECT did a full rollback in case of an error. Fixed so that we only roll back the last statement in the current transaction. Fixed bug with empty expression for boolean full-text search. Fixed core dump bug in updating full-text key from/to NULL. ODBC compatibility: Added BIT_LENGTH() function. Fixed core dump bug in GROUP BY BINARY column. Added support for NULL keys in HEAP tables. Use index for ORDER BY in queries of type: SELECT * FROM t WHERE key_part1=1 ORDER BY key_part1 DESC,key_part2 DESC Fixed bug in FLUSH QUERY CACHE. Added CAST() and CONVERT() functions. The CAST and CONVERT functions are nearly identical and mainly useful when you want to create a column with a specic type in a CREATE ... SELECT statement. For more information, read Se c ao 6.3.5 [Cast Functions], P agina 543. CREATE ... SELECT on DATE and TIME functions now create columns of the expected type. Changed order in which keys are created in tables. Added new columns Null and Index_type to SHOW INDEX output. Added --no-beep and --prompt options to mysql command-line client. New feature: management of user resources. GRANT ... WITH MAX_QUERIES_PER_HOUR N1 MAX_UPDATES_PER_HOUR N2 MAX_CONNECTIONS_PER_HOUR N3; Veja Se c ao 4.4.7 [User resources], P agina 266. Added mysql_secure_installation to the scripts/ directory.
ALTER TABLE
989
Fixed shutdown problem on HP-UX. Added DES_ENCRYPT() and DES_DECRYPT() functions. Added FLUSH DES_KEY_FILE statement. Added --des-key-file option to mysqld. HEX(string) now returns the characters in string converted to hexadecimal. Fixed problem with GRANT when using lower_case_table_names=1. Changed SELECT ... IN SHARE MODE to SELECT ... LOCK IN SHARE MODE (as in MySQL 3.23). A new query cache to cache results from identical SELECT queries. Fixed core dump bug on 64-bit machines when it got an incorrect communication packet. MATCH ... AGAINST(... IN BOOLEAN MODE) can now work without FULLTEXT index. Fixed slave to replicate from 3.23 master. Miscellaneous replication xes/cleanup. Got shutdown to work on Mac OS X. Added myisam/ft_dump utility for low-level inspection of FULLTEXT indexes. Fixed bug in DELETE ... WHERE ... MATCH .... Added support for MATCH ... AGAINST(... IN BOOLEAN MODE). Note: you must rebuild your tables with ALTER TABLE tablename TYPE=MyISAM to be able to use boolean full-text search. LOCATE() and INSTR() are now case-sensitive if either argument is a binary string. Changed RAND() initialisation so that RAND(N) and RAND(N+1) are more distinct. Fixed core dump bug in UPDATE ... ORDER BY. In 3.23, INSERT INTO ... SELECT always had IGNORE enabled. Now MySQL will stop (and possibly roll back) by default in case of an error unless you specify IGNORE. Ignore DATA DIRECTORY and INDEX DIRECTORY directives on Windows. Added boolean full-text search code. It should be considered early alpha. Extended MODIFY and CHANGE in ALTER TABLE to accept the FIRST and AFTER keywords. Indexes are now used with ORDER BY on a whole InnoDB table.
990
Support for communication packets > 16M. In 4.0.1 we will extend MyISAM to be able to handle these. Secure connections (with SSL). Unsigned BIGINT constants now work. MIN() and MAX() now handle signed and unsigned BIGINT numbers correctly. New character set latin1_de which provides correct German sorting. STRCMP() now uses the current character set when doing comparisons, which means that the default comparison behaviour now is case-insensitive. TRUNCATE TABLE and DELETE FROM tbl_name are now separate functions. One bonus is that DELETE FROM tbl_name now returns the number of deleted rows, rather than zero. DROP DATABASE now executes a DROP TABLE on all tables in the database, which xes a problem with InnoDB tables. Added support for UNION. Added support for multi-table DELETE operations. A new HANDLER interface to MyISAM tables. Added support for INSERT on MERGE tables. Patch from Benjamin Pugmann. Changed WEEK(date,0) to match the calendar in the USA. COUNT(DISTINCT) is about 30% faster. Speed up all internal list handling. Speed up IS NULL, ISNULL() and some other internal primitives. Full-text index creation now is much faster. Tree-like cache to speed up bulk inserts and myisam_bulk_insert_tree_size variable. Searching on packed (CHAR/VARCHAR) keys is now much faster. Optimized queries of type: SELECT DISTINCT * from tbl_name ORDER by key_part1 LIMIT row_count. SHOW CREATE TABLE now shows all table attributes. ORDER BY ... DESC can now use keys. LOAD DATA FROM MASTER automatically sets up a slave. Renamed safe_mysqld to mysqld_safe to make this name more in line with other MySQL scripts/commands. Added support for symbolic links to MyISAM tables. Symlink handling is now enabled by default for Windows. Added SQL_CALC_FOUND_ROWS and FOUND_ROWS(). This makes it possible to know how many rows a query would have returned without a LIMIT clause. Changed output format of SHOW OPEN TABLES. Allow SELECT expression LIMIT .... Added ORDER BY syntax to UPDATE and DELETE. SHOW INDEXES is now a synonym for SHOW INDEX. Added ALTER TABLE tbl_name DISABLE KEYS and ALTER TABLE tbl_name ENABLE KEYS commands.
991
Allow use of IN as a synonym for FROM in SHOW commands. Implemented repair by sort for FULLTEXT indexes. REPAIR TABLE, ALTER TABLE, and OPTIMIZE TABLE for tables with FULLTEXT indexes are now up to 100 times faster. Allow SQL-99 syntax Xhexadecimal-number. Cleaned up global lock handling for FLUSH TABLES WITH READ LOCK. Fixed problem with DATETIME = constant in WHERE optimization. Added --master-data and --no-autocommit options to mysqldump. (Thanks to Brian Aker for this.) Added script mysql_explain_log.sh to distribution. (Thanks to mobile.de).
BerkeleyDB or BDB Uses the Berkeley DB library from Sleepycat Software to implement transaction-safe tables. Note that only MyISAM is available in the standard binary distribution. The 3.23 release also includes support for database replication between a master and many slaves, full-text indexing, and much more. All new features are being developed in the 4.x version. Only bug xes and minor enhancements to existing features will be added to 3.23. The replication code and BerkeleyDB code is still not as tested and as the rest of the code, so we will probably need to do a couple of future releases of 3.23 with small xes for this part of the code. As long as you dont use these features, you should be quite safe with MySQL 3.23! Note that the above doesnt mean that replication or Berkeley DB dont work. We have done a lot of testing of all code, including replication and BDB without nding any problems. It only means that not as many users use this code as the rest of the code and because of this we are not yet 100% condent in this code.
992
as on the master. So if the master had an error on the query (for example, Duplicate entry in a multiple-row insert), then the slave stopped and warned that the error codes didnt match. This is a backport of the x for MySQL 4.0. (Bug #797) mysqlbinlog now asks for a password at console when the -p/--password option is used with no argument. This is how the other clients (mysqladmin, mysqldump..) already behave. Note that one now has to use mysqlbinlog -p<my_password>; mysqlbinlog -p <my_password> will not work anymore (in other words, put no space after -p). (Bug #1595) On some 64-bit machines (some HP-UX and Solaris machines), a slave installed with the 64-bit MySQL binary could not connect to its master (it connected to itself instead). (Bug #1256, #1381) Fixed a Windows-specic bug present since MySQL version 3.23.57 and 3.23.58, which caused Windows slaves to crash when they started replication if a master.info le existed. (Bug #1720)
993
SHOW TABLE STATUS displayed incorrect Row_format value for tables that have been compressed with myisampack. (Bug #427) SHOW VARIABLES LIKE innodb_data_file_path displayed only the name of the rst datale. (Bug #468) Fixed security problem where mysqld didnt allow one to UPDATE rows in a table even if one had a global UPDATE privilege and a database SELECT privilege. Fixed a security problem with SELECT and wildcarded select list, when user only had partial column SELECT privileges on the table. Fixed unlikely problem in optimising WHERE clause with a constant expression such as in WHERE 1 AND (a=1 AND b=1). Fixed problem on IA-64 with timestamps that caused mysqlbinlog to fail. The default option for innodb_flush_log_at_trx_commit was changed from 0 to 1 to make InnoDB tables ACID by default. Veja Se c ao 7.5.3 [InnoDB start], P agina 643. Fixed problem with too many allocated alarms on slave when connecting to master many times (normally not a very critical error). Fixed a bug in replication of temporary tables. (Bug #183) Fixed 64 bit bug that aected at least AMD hammer systems. Fixed a bug when doing LOAD DATA INFILE IGNORE: When reading the binary log, mysqlbinlog and the replication code read REPLACE instead of IGNORE. This could make the slaves table become dierent from the masters table. (Bug #218) Fixed overow bug in MyISAM when a row is inserted into a table with a large number of columns and at least one BLOB/TEXT column. Bug was caused by incorrect calculation of the needed buer to pack data. The binary log was not locked during TRUNCATE table_name or DELETE FROM table_ name statements, which could cause an INSERT to table_name to be written to the log before the TRUNCATE or DELETE statements. Fixed rare bug in UPDATE of InnoDB tables where one row could be updated multiple times. Produce an error for empty table and column names. Changed PROCEDURE ANALYSE() to report DATE instead of NEWDATE. Changed PROCEDURE ANALYSE(#) to restrict the number of values in an ENUM column to # also for string values. mysqldump no longer silently deletes the binary logs when invoked with the --masterdata or --first-slave option; while this behaviour was convenient for some users, others may suer from it. Now one has to explicitly ask for binary logs to be deleted by using the new --delete-master-logs option. Fixed a bug in mysqldump when it was invoked with the --master-data option: The CHANGE MASTER TO statements that were appended to the SQL dump had incorrect coordinates. (Bug #159)
994
Fixed a bug in privilege system for GRANT UPDATE on column level. Fixed a rare bug when using a date in HAVING with GROUP BY. Fixed checking of random part of WHERE clause. (Bug #142) Fixed MySQL (and myisamchk) crash on articially corrupted .MYI les. Security enhancement: mysqld no longer reads options from world-writeable cong les. Security enhancement: mysqld and safe_mysqld now only use the rst --user option specied on the command line. (Normally this comes from /etc/my.cnf) Security enhancement: Dont allow BACKUP TABLE to overwrite existing les. Fixed unlikely deadlock bug when one thread did a LOCK TABLE and another thread did a DROP TABLE. In this case one could do a KILL on one of the threads to resolve the deadlock. LOAD DATA INFILE was not replicated by slave if replicate_*_table was set on the slave. Fixed a bug in handling CHAR(0) columns that could cause incorrect results from the query. Fixed a bug in SHOW VARIABLES on 64-bit platforms. The bug was caused by incorrect declaration of variable server_id. The Comment column in SHOW TABLE STATUS now reports that it can contain NULL values (which is the case for a crashed .frm le). Fixed the rpl_rotate_logs test to not fail on certain platforms (e.g. Mac OS X) due to a too long le name (changed slave-master-info.opt to .slave-mi). Fixed a problem with BLOB NOT NULL columns used with IS NULL. Fixed bug in MAX() optimization in MERGE tables. Better RAND() initialisation for new connections. Fixed bug with connect timeout. This bug was manifested on OSs with poll() system call, which resulted in timeout the value specied as it was executed in both select() and poll(). Fixed bug in SELECT * FROM table WHERE datetime1 IS NULL OR datetime2 IS NULL. Fixed bug in using aggregate functions as argument for INTERVAL, CASE, FIELD, CONCAT_WS, ELT and MAKE_SET functions. When running with --lower-case-table-names (default on Windows) and you had tables or databases with mixed case on disk, then executing SHOW TABLE STATUS followed with DROP DATABASE or DROP TABLE could fail with Errcode 13. Fixed bug in logging to binary log (which aects replication) a query that inserts a NULL in an auto_increment eld and also uses LAST_INSERT_ID(). Fixed bug in mysqladmin --relative. On some 64 bit systems, show status reported a strange number for Open_files and Open_streams.
995
996
Fixed a bug where MATCH ... AGAINST () >=0 was treated as if it was >. Fixed core dump in SHOW PROCESSLIST when running with an active slave (unlikely timing bug). Make it possible to use multiple MySQL servers on Windows (code backported from 4.0.2). One can create TEMPORARY MERGE tables now. Fixed that --core-file works on Linux (at least on kernel 2.4.18). Fixed a problem with BDB and ALTER TABLE. Fixed reference to freed memory when doing complicated GROUP BY ... ORDER BY queries. Symptom was that mysqld died in function send_fields. Allocate heap rows in smaller blocks to get better memory usage. Fixed memory allocation bug when storing BLOB values in internal temporary tables used for some (unlikely) GROUP BY queries. Fixed a bug in key optimising handling where the expression WHERE column_name = key_column_name was calculated as true for NULL values. Fixed core dump bug when doing LEFT JOIN ... WHERE key_column=NULL. Fixed MyISAM crash when using dynamic-row tables with huge numbers of packed elds. Updated source tree to be built using automake 1.5 and libtool 1.4.
997
Fixed problem with configure ... --localstatedir=.... Fixed problem with UNSIGNED BIGINT on AIX (again). Fixed bug in pthread mutex trylock() on HPUX 11.0. Multi-threaded stress tests for InnoDB.
998
Changed name of server variables Com_show_master_stat to Com_show_master_ status and Com_show_slave_stat to Com_show_slave_status. Changed handling of gethostbyname() to make the client library thread-safe even if gethostbyname_r doesnt exist. Fixed core-dump problem when giving a wrong password string to GRANT. Fixed bug in DROP DATABASE with symlinked directory. Fixed optimization problem with DATETIME and value outside DATETIME range. Removed Sleepycats BDB doc les from the source tree, as theyre not needed (MySQL covers BDB in its own documentation). Fixed MIT-pthreads to compile with glibc 2.2 (needed for make dist). Fixed the FLOAT(X+1,X) is not converted to FLOAT(X+2,X). (This also aected DECIMAL, DOUBLE and REAL types) Fixed the result from IF() is case in-sensitive if the second and third arguments are case sensitive. Fixed core dump problem on OSF/1 in gethostbyname_r. Fixed that underowed decimal elds are not zero lled. If we get an overow when inserting +11111 for DECIMAL(5,0) UNSIGNED columns, we will just drop the sign. Fixed optimization bug with ISNULL(expression_which_cannot_be_null) and ISNULL(constant_expression). Fixed host lookup bug in the glibc library that we used with the 3.23.50 Linux-x86 binaries.
999
Our Linux RPMS and binaries are now compiled with gcc 3.0.4, which should make them a bit faster. Fixed some buer overow problems when reading startup parameters. Because of problems on shutdown we have now disabled named pipes on Windows by default. One can enable named pipes by starting mysqld with --enable-named-pipe. Fixed bug when using WHERE key_column = J or key_column=j. Fixed core-dump bug when using --log-bin with LOAD DATA INFILE without an active database. Fixed bug in RENAME TABLE when used with lower_case_table_names=1 (default on Windows). Fixed unlikely core-dump bug when using DROP TABLE on a table that was in use by a thread that also used queries on only temporary tables. Fixed problem with SHOW CREATE TABLE and PRIMARY KEY when using 32 indexes. Fixed that one can use SET PASSWORD for the anonymous user. Fixed core dump bug when reading client groups from option les using mysql_options(). Memory leak (16 bytes per every corrupted table) closed. Fixed binary builds to use --enable-local-infile. Update source to work with new version of bison. Updated shell scripts to now agree with new POSIX standard. Fixed bug where DATE_FORMAT() returned empty string when used with GROUP BY.
1000
Fixed problem with one thread using an InnoDB table and another thread doing an ALTER TABLE on the same table. Before that, mysqld could crash with an assertion failure in row0row.c, line 474. Tuned the InnoDB SQL optimiser to favor index searches more often over table scans. Fixed a performance problem with InnoDB tables when several large SELECT queries are run concurrently on a multiprocessor Linux computer. Large CPU-bound SELECT queries will now also generally run faster on all platforms. If MySQL binlogging is used, InnoDB now prints after crash recovery the latest MySQL binlog name and the oset InnoDB was able to recover to. This is useful, for example, when resynchronising a master and a slave database in replication. Added better error messages to help in installation problems of InnoDB tables. It is now possible to recover MySQL temporary tables that have become orphaned inside the InnoDB tablespace. InnoDB now prevents a FOREIGN KEY declaration where the signedness is not the same in the referencing and referenced integer columns. Calling SHOW CREATE TABLE or SHOW TABLE STATUS could cause memory corruption and make mysqld crash. Especially at risk was mysqldump, because it frequently calls SHOW CREATE TABLE. If inserts to several tables containing an AUTO_INCREMENT column were wrapped inside one LOCK TABLES, InnoDB asserted in lock0lock.c. In 3.23.47 we allowed several NULL values in a UNIQUE secondary index for an InnoDB table. But CHECK TABLE was not relaxed: it reports the table as corrupt. CHECK TABLE no longer complains in this situation. SHOW GRANTS now shows REFERENCES instead of REFERENCE.
1001
1002
Fixed bug that caused error message Cant write, because of unique constraint with some GROUP BY queries. Fixed problem with sjis character strings used within quoted table names. Fixed core dump when using CREATE ... FULLTEXT keys with other storage engines than MyISAM. Dont use signal() on Windows because this appears to not be 100% reliable. Fixed bug when doing WHERE col_name=NULL on an indexed column that had NULL values. Fixed bug when doing LEFT JOIN ... ON (col_name = constant) WHERE col_name = constant. When using replications, aborted queries that contained % could cause a core dump. TCP_NODELAY was not used on some systems. (Speed problem.) Applied portability xes for OS/2. (Patch by Yuri Dario.) The following changes are for InnoDB tables: Add missing InnoDB variables to SHOW VARIABLES. Foreign keys checking is now done for InnoDB tables. DROP DATABASE now works also for InnoDB tables. InnoDB now supports datales and raw disk partitions bigger than 4 GB on those operating systems that have big les. InnoDB calculates better table cardinality estimates for the MySQL optimiser. Accent characters in the default character set latin1 are ordered according to the MySQL ordering. Note: if you are using latin1 and have inserted characters whose code is greater than 127 into an indexed CHAR column, you should run CHECK TABLE on your table when you upgrade to 3.23.44, and drop and reimport the table if CHECK TABLE reports an error! A new my.cnf parameter, innodb_thread_concurrency, helps in performance tuning in heavily concurrent environments. A new my.cnf parameter, innodb_fast_shutdown, speeds up server shutdown. A new my.cnf parameter, innodb_force_recovery, helps to save your data in case the disk image of the database becomes corrupt. innodb_monitor has been improved and a new innodb_table_monitor added. Increased maximum key length from 500 to 7000 bytes. Fixed a bug in replication of AUTO_INCREMENT columns with multiple-line inserts. Fixed a bug when the case of letters changes in an update of an indexed secondary column. Fixed a hang when there are > 24 datales. Fixed a crash when MAX(col) is selected from an empty table, and col is not the rst column in a multi-column index. Fixed a bug in purge which could cause crashes.
1003
1004
Dont force everything to lowercase on Windows. (To x problem with Windows and ALTER TABLE). Now --lower_case_names also works on Unix. Fixed that automatic rollback is done when thread end doesnt lock other threads.
1005
Added option --warnings to mysqld. Now mysqld prints the error Aborted connection only if this option is used. Fixed problem with SHOW CREATE TABLE when you didnt have a PRIMARY KEY. Properly xed the rename of innodb_unix_file_flush_method variable to innodb_ flush_method. Fixed bug when converting BIGINT UNSIGNED to DOUBLE. This caused a problem when doing comparisons with BIGINT values outside of the signed range. Fixed bug in BDB tables when querying empty tables. Fixed a bug when using COUNT(DISTINCT) with LEFT JOIN and there werent any matching rows. Removed all documentation referring to the GEMINI table type. GEMINI is not released under an Open Source license.
1006
InnoDB now promotes sub keys to whole keys. Added option CONCURRENT to LOAD DATA. Better error message when slave max_allowed_packet is too low to read a very long log event from the master. Fixed bug when too many rows where removed when using SELECT DISTINCT ... HAVING. SHOW CREATE TABLE now returns TEMPORARY for temporary tables. Added Rows_examined to slow query log. Fixed problems with function returning empty string when used together with a group function and a WHERE that didnt match any rows. New program mysqlcheck. Added database name to output for administrative commands like CHECK, REPAIR, OPTIMIZE. Lots of portability xes for InnoDB. Changed optimiser so that queries like SELECT * FROM tbl_name,tbl_name2 ... ORDER BY key_part1 LIMIT row_count will use index on key_part1 instead of filesort. Fixed bug when doing LOCK TABLE to_table WRITE,...; INSERT INTO to_table... SELECT ... when to_table was empty. Fixed bug with LOCK TABLE and BDB tables.
1007
Fixed bug when using date functions on TEXT/BLOB column with wrong date format. UDFs now also work on Windows. (Patch by Ralph Mason.) Fixed bug in ALTER TABLE and LOAD DATA INFILE that disabled key-sorting. These commands should now be faster in most cases. Fixed performance bug where reopened tables (tables that had been waiting for FLUSH or REPAIR) would not use indexes for the next query. Fixed problem with ALTER TABLE to InnoDB tables on FreeBSD. Added mysqld variables myisam_max_sort_file_size and myisam_max_extra_sort_ file_size. Initialise signals early to avoid problem with signals in InnoDB. Applied patch for the tis620 character set to make comparisons case-independent and to x a bug in LIKE for this character set. Note: All tables that uses the tis620 character set must be xed with myisamchk -r or REPAIR TABLE ! Added --skip-safemalloc option to mysqld.
1008
Fixed bug in SHOW VARIABLES when using INNOBASE tables. Setting and using user variables in SELECT DISTINCT didnt work. Tuned SHOW ANALYZE for small tables. Fixed handling of arguments in the benchmark script run-all-tests.
1009
Fixed that mysqlbinlog writes the timestamp value for each query. This ensures that one gets same values for date functions like NOW() when using mysqlbinlog to pipe the queries to another server. Allow --skip-gemini, --skip-bdb, and --skip-innodb options to be specied when invoking mysqld, even if these storage engines are not compiled in to mysqld. One can now do GROUP BY ... DESC. Fixed a deadlock in the SET code, when one ran SET @foo=bar, where bar is a column reference, an error was not properly generated.
1010
Fixed bug in MASTER_POS_WAIT() function. Execute core dump handler on SIGILL, and SIGBUS in addition to SIGSEGV. On x86 Linux, print the current query and thread (connection) id, if available, in the core dump handler. Fixed several timing bugs in the test suite. Extended mysqltest to take care of the timing issues in the test suite. ALTER TABLE can now be used to change the denition for a MERGE table. Fixed creation of MERGE tables on Windows. Portability xes for OpenBSD and OS/2. Added --temp-pool option to mysqld. Using this option will cause most temporary les created to use a small set of names, rather than a unique name for each new le. This is to work around a problem in the Linux kernel dealing with creating a bunch of new les with dierent names. With the old behaviour, Linux seems to "leak" memory, as its being allocated to the directory entry cache instead of the disk cache.
1011
Fixed the MySQL RPM so it no longer depends on Perl5. Fixed some problems with HEAP tables on Windows. SHOW TABLE STATUS didnt show correct average row length for tables larger than 4G. CHECK TABLE ... EXTENDED didnt check row links for xed size tables. Added option MEDIUM to CHECK TABLE. Fixed problem when using DECIMAL() keys on negative numbers. HOUR() (and some other TIME functions) on a CHAR column always returned NULL. Fixed security bug in something (please upgrade if you are using an earlier MySQL 3.23 version). Fixed buer overow bug when writing a certain error message. Added usage of setrlimit() on Linux to get -O --open-files-limit=# to work on Linux. Added bdb_version variable to mysqld. Fixed bug when using expression of type: SELECT ... FROM t1 LEFT JOIN t2 ON (t1.a=t2.a) WHERE t1.a=t2.a In this case the test in the WHERE clause was wrongly optimised away. Fixed bug in MyISAM when deleting keys with possible NULL values, but the rst keycolumn was not a prex-compressed text column. Fixed mysql.server to read the [mysql.server] option le group rather than the [mysql_server] group. Fixed safe_mysqld and mysql.server to also read the server option section. Added Threads_created status variable to mysqld.
1012
Fixed a bug where some rows were not found with HEAP tables that had many keys. Fixed that --bdb-no-sync works. Changed --bdb-recover to --bdb-no-recover as recover should be on by default. Changed the default number of BDB locks to 10000. Fixed a bug from 3.23.29 when allocating the shared structure needed for BDB tables. Changed mysqld_multi.sh to use congure variables. Patch by Christopher McCrory. Added xing of include les for Solaris 2.8. Fixed bug with --skip-networking on Debian Linux. Fixed problem that some temporary les where reported as having the name UNOPENED in error messages. Fixed bug when running two simultaneous SHOW LOGS queries.
1013
Added --bdb-shared-data option to mysqld. Added Slave_open_temp_tables status variable to mysqld Added binlog_cache_size and max_binlog_cache_size variables to mysqld. DROP TABLE, RENAME TABLE, CREATE INDEX and DROP INDEX are now transaction endpoints. If you do a DROP DATABASE on a symbolically linked database, both the link and the original database is deleted. Fixed DROP DATABASE to work on OS/2. Fixed bug when doing a SELECT DISTINCT ... table1 LEFT JOIN table2 ... when table2 was empty. Added --abort-slave-event-count and --disconnect-slave-event-count options to mysqld for debugging and testing of replication. Fixed replication of temporary tables. Handles everything except slave server restart. SHOW KEYS now shows whether key is FULLTEXT. New script mysqld_multi. Veja Se c ao 4.8.3 [mysqld_multi], P agina 334. Added new script, mysql-multi.server.sh. Thanks to Tim Bunce Tim.Bunce@ig.co.uk for modifying mysql.server to easily handle hosts running many mysqld processes. safe_mysqld, mysql.server, and mysql_install_db have been modied to use mysql_print_defaults instead of various hacks to read the my.cnf les. In addition, the handling of various paths has been made more consistent with how mysqld handles them by default. Automatically remove Berkeley DB transaction logs that no longer are in use. Fixed bug with several FULLTEXT indexes in one table. Added a warning if number of rows changes on REPAIR/OPTIMIZE. Applied patches for OS/2 by Yuri Dario. FLUSH TABLES tbl_name didnt always ush the index tree to disk properly. --bootstrap is now run in a separate thread. This xes a problem that caused mysql_ install_db to core dump on some Linux machines. Changed mi_create() to use less stack space. Fixed bug with optimiser trying to over-optimise MATCH() when used with UNIQUE key. Changed crash-me and the MySQL benchmarks to also work with FrontBase. Allow RESTRICT and CASCADE after DROP TABLE to make porting easier. Reset status variable which could cause problem if one used --slow-log. Added connect_timeout variable to mysql and mysqladmin. Added connect-timeout as an alias for timeout for option les read by mysql_ options().
1014
and notee. Veja Se c ao 4.9.2 [mysql], P agina 347, mysql --help and the interactive help for more information. Fixed crash when automatic repair of MyISAM table failed. Fixed a major performance bug in the table locking code when one constantly had a lot of SELECT, UPDATE and INSERT statements running. The symptom was that the UPDATE and INSERT queries were locked for a long time while new SELECT statements were executed before the updates. When reading options_files with mysql_options() the return-found-rows option was ignored. One can now specify interactive-timeout in the option le that is read by mysql_ options(). This makes it possible to force programs that run for a long time (like mysqlhotcopy) to use the interactive_timeout time instead of the wait_timeout time. Added to the slow query log the time and the user name for each logged query. If you are using --log-long-format then also queries that do not use an index are logged, even if the query takes less than long_query_time seconds. Fixed a problem in LEFT JOIN which caused all columns in a reference table to be NULL. Fixed a problem when using NATURAL JOIN without keys. Fixed a bug when using a multi-part keys where the rst part was of type TEXT or BLOB. DROP of temporary tables wasnt stored in the update/binary log. Fixed a bug where SELECT DISTINCT * ... LIMIT row_count only returned one row. Fixed a bug in the assembler code in strstr() for SPARC and cleaned up the global.h header le to avoid a problem with bad aliasing with the compiler submitted with Red Hat 7.0. (Reported by Trond Eivind Glomsrd) The --skip-networking option now works properly on NT. Fixed a long outstanding bug in the ISAM tables when a row with a length of more than 65K was shortened by a single byte. Fixed a bug in MyISAM when running multiple updating processes on the same table. Allow one to use FLUSH TABLE tbl_name. Added --replicate-ignore-table, --replicate-do-table, --replicate-wildignore-table, and --replicate-wild-do-table options to mysqld. Changed all log les to use our own IO_CACHE mechanism instead of FILE to avoid OS problems when there are many les open. Added --open-files and --timezone options to safe_mysqld. Fixed a fatal bug in CREATE TEMPORARY TABLE ... SELECT .... Fixed a problem with CREATE TABLE ... SELECT NULL. Added variables large_file_support,net_read_timeout, net_write_timeout and query_buffer_size to SHOW VARIABLES. Added status variables created_tmp_files and sort_merge_passes to SHOW STATUS. Fixed a bug where we didnt allow an index name after the FOREIGN KEY denition. Added TRUNCATE table_name as a synonym for DELETE FROM table_name.
1015
Fixed a bug in a BDB key compare function when comparing part keys. Added bdb_lock_max variable to mysqld. Added more tests to the benchmark suite. Fixed an overow bug in the client code when using overly long database names. mysql_connect() now aborts on Linux if the server doesnt answer in timeout seconds. SLAVE START did not work if you started with --skip-slave-start and had not explicitly run CHANGE MASTER TO. Fixed the output of SHOW MASTER STATUS to be consistent with SHOW SLAVE STATUS. (It now has no directory in the log name.) Added PURGE MASTER LOGS TO. Added SHOW MASTER LOGS. Added --safemalloc-mem-limit option to mysqld to simulate memory shortage when compiled with the --with-debug=full option. Fixed several core dumps in out-of-memory conditions. SHOW SLAVE STATUS was using an uninitialised mutex if the slave had not been started yet. Fixed bug in ELT() and MAKE_SET() when the query used a temporary table. CHANGE MASTER TO without specifying MASTER_LOG_POS would set it to 0 instead of 4 and hit the magic number in the master binlog. ALTER TABLE ... ORDER BY ... syntax added. This will create the new table with the rows in a specic order.
1016
LEFT JOIN in some cases preferred a full table scan when there was no WHERE clause. When using --log-slow-queries, dont count the time waiting for a lock. Fixed bug in lock code on Windows which could cause the key cache to report that the key le was crashed even if it was okay. Automatic repair of MyISAM tables if you start mysqld with --myisam-recover. Removed the TYPE= keyword from CHECK and REPAIR. Allow CHECK options to be combined. (You can still use TYPE=, but this usage is deprecated.) Fixed mutex bug in the binary replication log long update queries could be read only in part by the slave if it did it at the wrong time, which was not fatal, but resulted in a performance-degrading reconnect and a scary message in the error log. Changed the format of the binary log added magic number, server version, binlog version. Added server ID and query error code for each query event. Replication thread from the slave now will kill all the stale threads from the same server. Long replication user names were not being handled properly. Added --replicate-rewrite-db option to mysqld. Added --skip-slave-start option to mysqld. Updates that generated an error code (such as INSERT INTO foo(some_key) values (1),(1)) erroneously terminated the slave thread. Added optimization of queries where DISTINCT is only used on columns from some of the tables. Allow oating-point numbers where there is no sign after the exponent (like 1e1). SHOW GRANTS didnt always show all column grants. Added --default-extra-file=# option to all MySQL clients. Columns referenced in INSERT statements now are initialised properly. UPDATE didnt always work when used with a range on a timestamp that was part of the key that was used to nd rows. Fixed a bug in FULLTEXT index when inserting a NULL column. Changed to use mkstemp() instead of tempnam(). Based on a patch from John Jones.
1017
Fixed a bug in MyISAM with packed multi-part keys. Fixed crash when using CHECK TABLE on Windows. Fixed a bug where FULLTEXT index always used the koi8_ukr character set. Fixed privilege checking for CHECK TABLE. The MyISAM repair/reindex code didnt use the --tmpdir option for its temporary les. Added BACKUP TABLE and RESTORE TABLE. Fixed core dump on CHANGE MASTER TO when the slave did not have the master to start with. Fixed incorrect Time in the processlist for Connect of the slave thread. The slave now logs when it connects to the master. Fixed a core dump bug when doing FLUSH MASTER if you didnt specify a lename argument to --log-bin. Added missing ha_berkeley.x les to the MySQL Windows distribution. Fixed some mutex bugs in the log code that could cause thread blocks if new log les couldnt be created. Added lock time and number of selected processed rows to slow query log. Added --memlock option to mysqld to lock mysqld in memory on systems with the mlockall() call (as in Solaris). HEAP tables didnt use keys properly. (Bug from 3.23.23.) Added better support for MERGE tables (keys, mapping, creation, documentation...). Veja Se c ao 7.2 [MERGE], P agina 637. Fixed bug in mysqldump from 3.23 which caused some CHAR columns not to be quoted. Merged analyze, check, optimize and repair code. OPTIMIZE TABLE is now mapped to REPAIR with statistics and sorting of the index tree. This means that for the moment it only works on MyISAM tables. Added a pre-alloced block to root malloc to get fewer mallocs. Added a lot of new statistics variables. Fixed ORDER BY bug with BDB tables. Removed warning that mysqld couldnt remove the .pid le under Windows. Changed --log-isam to log MyISAM tables instead of isam tables. Fixed CHECK TABLE to work on Windows. Added le mutexes to make pwrite() safe on Windows.
1018
Fixed small memory leak introduced from 3.23.22 when creating a temporary table. Fixed problem with BDB tables and reading on a unique (not primary) key. Restored the win1251 character set (its now only marked deprecated).
1019
Fixed bug in range optimiser for HEAP tables for searches on a part index. Fixed SELECT on part keys to work with BDB tables. Fixed INSERT INTO bdb_table ... SELECT to work with BDB tables. CHECK TABLE now updates key statistics for the table. ANALYZE TABLE will now only update tables that have been changed since the last ANALYZE. Note that this is a new feature and tables will not be marked to be analysed until they are updated in any way with 3.23.23 or newer. For older tables, you have to do CHECK TABLE to update the key distribution. Fixed some minor privilege problems with CHECK, ANALYZE, REPAIR and SHOW CREATE commands. Added CHANGE MASTER TO statement. Added FAST, QUICK EXTENDED check types to CHECK TABLES. Changed myisamchk so that --fast and --check-only-changed are also honored with --sort-index and --analyze. Fixed fatal bug in LOAD TABLE FROM MASTER that did not lock the table during index re-build. LOAD DATA INFILE broke replication if the database was excluded from replication. More variables in SHOW SLAVE STATUS and SHOW MASTER STATUS. SLAVE STOP now will not return until the slave thread actually exits. Full-text search via the MATCH() function and FULLTEXT index type (for MyISAM les). This makes FULLTEXT a reserved word.
1020
1021
Added pack_isam and myisampack to the standard MySQL distribution. Added the syntax BEGIN WORK (the same as BEGIN). Fixed core dump bug when using ORDER BY on a CONV() expression. Added LOAD TABLE FROM MASTER. Added FLUSH MASTER and FLUSH SLAVE. Fixed big/little endian problem in the replication.
1022
Fixed memory leak in the replication slave thread. Added new log-slave-updates option to mysqld, to allow daisy-chaining the slaves. Fixed compile error on FreeBSD and other systems where pthread_t is not the same as int. Fixed master shutdown aborting the slave thread. Fixed a race condition in INSERT DELAYED code when doing ALTER TABLE. Added deadlock detection sanity checks to INSERT DELAYED.
1023
Added possible character sets and time zone to SHOW VARIABLES output. Fixed bug in locking code that could result in locking problems with concurrent inserts under high load. Fixed a problem with DELETE of many rows on a table with compressed keys where MySQL scanned the index to nd the rows. Fixed problem with CHECK on table with deleted keyblocks. Fixed a bug in reconnect (at the client side) where it didnt free memory properly in some contexts. Fixed problems in update log when using LAST_INSERT_ID() to update a table with an AUTO_INCREMENT key. Added NULLIF() function. Fixed bug when using LOAD DATA INFILE on a table with BLOB/TEXT columns. Optimized MyISAM to be faster when inserting keys in sorted order. EXPLAIN SELECT ... now also prints out whether MySQL needs to create a temporary table or use le sorting when resolving the SELECT. Added optimization to skip ORDER BY parts where the part is a constant expression in the WHERE part. Indexes can now be used even if the ORDER BY doesnt match the index exactly, as long as all the unused index parts and all the extra ORDER BY columns are constants in the WHERE clause. Veja Se c ao 5.4.3 [MySQL indexes], P agina 448. UPDATE and DELETE on a whole unique key in the WHERE part are now faster than before. Changed RAID_CHUNKSIZE to be in 1024-byte increments. Fixed core dump in LOAD_FILE(NULL).
1024
Added mysql_thread_safe() function to the MySQL C API. Added the UMASK_DIR environment variable. Added CONNECTION_ID() function to return the client connection thread ID. When using = on BLOB or VARCHAR BINARY keys, where only a part of the column was indexed, the whole column of the result row wasnt compared. Fix for sjis character set and ORDER BY. When running in ANSI mode, dont allow columns to be used that arent in the GROUP BY part.
1025
Fixed core dump with some COUNT(DISTINCT ...) queries. Fixed that myisamchk works properly with RAID tables. Fixed problem with LEFT JOIN and key_field IS NULL. Fixed bug in net_clear() which could give the error Aborted connection in the MySQL clients. Added options USE INDEX (key_list) and IGNORE INDEX (key_list) as parameters in SELECT. DELETE and RENAME should now work on RAID tables.
1026
Fixed problem when only changing a 0 to NULL in a table with BLOB/TEXT columns. Fixed bug in range optimiser when using many key parts and or on the middle key parts: WHERE K1=1 and K3=2 and (K2=2 and K4=4 or K2=3 and K4=5) Added source command to mysql to allow reading of batch les inside the mysql client. Original patch by Matthew Vanecek. Fixed critical problem with the WITH GRANT OPTION option. Dont give an unnecessary GRANT error when using tables from many databases in the same query. Added VIO wrapper (needed for SSL support; by Andrei Errapart and T onu Samuel). Fixed optimiser problem on SELECT when using many overlapping indexes. MySQL should now be able to choose keys even better when there are many keys to choose from. Changed optimiser to prefer a range key instead of a ref key when the range key can uses more columns than the ref key (which only can use columns with =). For example, the following type of queries should now be faster: SELECT * from key_part_1=const and key_part_2 > const2 Fixed bug that a change of all VARCHAR columns to CHAR columns didnt change row type from dynamic to xed. Disabled oating-point exceptions for FreeBSD to x core dump when doing SELECT FLOOR(POW(2,63)). Renamed mysqld startup option from --delay-key-write to --delay-key-writefor-all-tables. Added read-next-on-key to HEAP tables. This should x all problems with HEAP tables when using non-UNIQUE keys. Added option to print default arguments to all clients. Added --log-slow-queries option to mysqld to log all queries that take a long time to a separate log le with a time indicating how long the query took. Fixed core dump when doing WHERE key_col=RAND(...). Fixed optimization bug in SELECT ... LEFT JOIN ... key_col IS NULL, when key_ col could contain NULL values. Fixed problem with 8-bit characters as separators in LOAD DATA INFILE.
1027
Fixed that INSERT DELAYED doesnt update timestamps that are given. Added function YEARWEEK() and options x, X, v and V to DATE_FORMAT(). Fixed problem with MAX(indexed_column) and HEAP tables. Fixed problem with BLOB NULL keys and LIKE "prefix%". Fixed problem with MyISAM and xed-length rows < 5 bytes. Fixed problem that could cause MySQL to touch freed memory when doing very complicated GROUP BY queries. Fixed core dump if you got a crashed table where an ENUM eld value was too big.
1028
1029
With MyISAM, you now can have an AUTO_INCREMENT column as a key sub part: CREATE TABLE foo (a INT NOT NULL AUTO_INCREMENT, b CHAR(5), PRIMARY KEY (b,a)) Fixed bug in MyISAM with packed char keys that could be NULL. AS on eld name with CREATE TABLE table_name SELECT ... didnt work. Allow use of NATIONAL and NCHAR when dening character columns. This is the same as not using BINARY. Dont allow NULL columns in a PRIMARY KEY (only in UNIQUE keys). Clear LAST_INSERT_ID() if one uses this in ODBC: WHERE auto_increment_column IS NULL. This seems to x some problems with Access. SET SQL_AUTO_IS_NULL=0|1 now turns on/o the handling of searching after the last inserted row with WHERE auto_increment_column IS NULL. Added new variable concurrency to mysqld for Solaris. Added --relative option to mysqladmin to make extended-status more useful to monitor changes. Fixed bug when using COUNT(DISTINCT ...) on an empty table. Added support for the Chinese character set GBK. Fixed problem with LOAD DATA INFILE and BLOB columns. Added bit operator ~ (negation). Fixed problem with UDF functions.
1030
1031
Changed handling of const item to allow handling of ORDER BY RAND(). Indexes are now used for WHERE key_column = function. Indexes are now used for WHERE key_column = col_name even if the columns are not identically packed. Indexes are now used for WHERE col_name IS NULL. Changed heap tables to be stored in low byte rst order (to make it easy to convert to MyISAM tables) Automatic change of HEAP temporary tables to MyISAM tables in case of table is full errors. Added --init-file=file_name option to mysqld. Added COUNT(DISTINCT value, [value, ...]). CREATE TEMPORARY TABLE now creates a temporary table, in its own namespace, that is automatically deleted if connection is dropped. New reserved words (required for CASE): CASE, THEN, WHEN, ELSE and END. New functions EXPORT_SET() and MD5(). Support for the GB2312 Chinese character set.
1032
Added UNIQUE, as in CREATE TABLE table_name (col INT not null UNIQUE) New create syntax: CREATE TABLE table_name SELECT ... New create syntax: CREATE TABLE IF NOT EXISTS ... Allow creation of CHAR(0) columns. DATE_FORMAT() now requires % before any format character. DELAYED is now a reserved word (sorry about that :( ). An example procedure is added: analyse, le: sql_analyse.c. This will describe the data in your query. Try the following: SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]]) This procedure is extremely useful when you want to check the data in your table! BINARY cast to force a string to be compared in case-sensitive fashion. Added --skip-show-database option to mysqld. Check whether a row has changed in an UPDATE now also works with BLOB/TEXT columns. Added the INNER join syntax. NOTE: This made INNER a reserved word! Added support for netmasks to the hostname in the MySQL grant tables. You can specify a netmask using the IP/NETMASK syntax. If you compare a NOT NULL DATE/DATETIME column with IS NULL, this is changed to a compare against 0 to satisfy some ODBC applications. (By shreeve@uci.edu.) NULL IN (...) now returns NULL instead of 0. This will ensure that null_column NOT IN (...) doesnt match NULL values. Fix storage of oating-point values in TIME columns. Changed parsing of TIME strings to be more strict. Now the fractional second part is detected (and currently skipped). The following formats are supported: [[DAYS] [H]H:]MM:]SS[.fraction] [[[[[H]H]H]H]MM]SS[.fraction] Detect (and ignore) fractional second part from DATETIME. Added the LOW_PRIORITY attribute to LOAD DATA INFILE. The default index name now uses the same case as the column name on which the index name is based. Changed default number of connections to 100. Use bigger buers when using LOAD DATA INFILE. DECIMAL(x,y) now works according to SQL-99. Added aggregate UDF functions. Thanks to Andreas F. Bobak (bobak@relog.ch) for this! LAST_INSERT_ID() is now updated for INSERT INTO ... SELECT. Some small changes to the join table optimiser to make some joins faster. SELECT DISTINCT is much faster; it uses the new UNIQUE functionality in MyISAM. One dierence compared to MySQL Version 3.22 is that the output of DISTINCT is no longer sorted.
1033
All C client API macros are now functions to make shared libraries more reliable. Because of this, you can no longer call mysql_num_fields() on a MYSQL object, you must use mysql_field_count() instead. Added use of LIBWRAP; patch by Henning P. Schmiedehausen. Dont allow AUTO_INCREMENT for other than numerical columns. Using AUTO_INCREMENT will now automatically make the column NOT NULL. Show NULL as the default value for AUTO_INCREMENT columns. Added SQL_BIG_RESULT; SQL_SMALL_RESULT is now default. Added a shared library RPM. This enhancement was contributed by David Fox (dsfox@cogsci.ucsd.edu). Added --enable-large-files and --disable-large-files switches to configure. See configure.in for some systems where this is automatically turned o because of broken implementations. Upgraded readline to 4.0. New CREATE TABLE options: PACK_KEYS and CHECKSUM. Added --default-table-type option to mysqld.
1034
1035
1036
Fixed deadlock problem when using INSERT DELAYED on a table locked with LOCK TABLES. Fixed deadlock problem when using DROP TABLE on a table that was locked by another thread. Add logging of GRANT/REVOKE commands in the update log. Fixed isamchk to detect a new error condition. Fixed bug in NATURAL LEFT JOIN.
1037
1038
When you did a GRANT on a new host, mysqld could die on the rst connect from this host. Fixed bug when one used ORDER BY on column name that was the same name as an alias. Added BENCHMARK(loop_count,expression) function to time expressions.
1039
The hostname in user@hostname can now include . and - without quotes in the context of the GRANT, REVOKE and SET PASSWORD FOR ... statements. Fix for isamchk for tables which need big temporary les.
1040
Most errors in the .err log are now prexed with a time stamp. Added option MYSQL_INIT_COMMAND to mysql_options() to make a query on connect or reconnect. Added option MYSQL_READ_DEFAULT_FILE and MYSQL_READ_DEFAULT_GROUP to mysql_options() to read the following parameters from the MySQL option les: port, socket, compress, password, pipe, timeout, user, init-command, host and database. Added maybe_null to the UDF structure. Added option IGNORE to INSERT statements with many rows. Fixed some problems with sorting of the koi8 character sets; users of koi8 must run isamchk -rq on each table that has an index on a CHAR or VARCHAR column. New script mysql_setpermission, by Luuk de Boer. It allows easy creation of new users with permissions for specic databases. Allow use of hexadecimal strings (0x...) when specifying a constant string (like in the column separators with LOAD DATA INFILE). Ported to OS/2 (thanks to Antony T. Curtis antony.curtis@olcs.net). Added more variables to SHOW STATUS and changed format of output to be like SHOW VARIABLES. Added extended-status command to mysqladmin which will show the new status variables.
1041
DATE_ADD() and DATE_SUB() didnt work with group functions. mysql will now also try to reconnect on USE database commands. Fix problem with ORDER BY and LEFT JOIN and const tables. Fixed problem with ORDER BY if the rst ORDER BY column was a key and the rest of the ORDER BY columns wasnt part of the key. Fixed a big problem with OPTIMIZE TABLE. MySQL clients on NT will now by default rst try to connect with named pipes and after this with TCP/IP. Fixed a problem with DROP TABLE and mysqladmin shutdown on Windows (a fatal bug from 3.22.6). Fixed problems with TIME columns and negative strings. Added an extra thread signal loop on shutdown to avoid some error messages from the client. MySQL now uses the next available number as extension for the update log le. Added patches for UNIXWARE 7.
1042
1043
Added -O max_connect_errors=# option to mysqld. Connect errors are now reset for each correct connection. Increased the default value of max_allowed_packet to 1M in mysqld. Added --low-priority-updates option to mysqld, to give table-modifying operations (INSERT, REPLACE, UPDATE, DELETE) lower priority than retrievals. You can now use {INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... You can also use SET SQL_LOW_PRIORITY_UPDATES={0|1} to change the priority for one thread. One side eect is that LOW_PRIORITY is now a reserved word. :( Add support for INSERT INTO table ... VALUES(...),(...),(...), to allow inserting multiple rows with a single statement. INSERT INTO tbl_name is now also cached when used with LOCK TABLES. (Previously only INSERT ... SELECT and LOAD DATA INFILE were cached.) Allow GROUP BY functions with HAVING: mysql> SELECT col FROM table GROUP BY col HAVING COUNT(*)>0; mysqld will now ignore trailing ; characters in queries. This is to make it easier to migrate from some other SQL servers that require the trailing ;. Fix for corrupted xed-format output generated by SELECT INTO OUTFILE. Warning: incompatible change! Added Oracle GREATEST() and LEAST() functions. You must now use these instead of the MAX() and MIN() functions to get the largest/smallest value from a list of values. These can now handle REAL, BIGINT and string (CHAR or VARCHAR) values. Warning: incompatible change! DAYOFWEEK() had oset 0 for Sunday. Changed the oset to 1. Give an error for queries that mix GROUP BY columns and elds when there is no GROUP BY specication. Added --vertical option to mysql, for printing results in vertical mode. Index-only optimization; some queries are now resolved using only indexes. Until MySQL 4.0, this works only for numeric columns. Veja Se c ao 5.4.3 [MySQL indexes], P agina 448. Lots of new benchmarks. A new C API chapter and lots of other improvements in the manual.
1044
DROP TABLE now waits for all users to free a table before deleting it. Fixed small memory leak in the new connect protocol. New functions BIN(), OCT(), HEX() and CONV() for converting between dierent number bases. Added function SUBSTRING() with 2 arguments. If you created a table with a record length smaller than 5, you couldnt delete rows from the table. Added optimization to remove const reference tables from ORDER BY and GROUP BY. mysqld now automatically disables system locking on Linux and Windows, and for systems that use MIT-pthreads. You can force the use of locking with the --enableexternal-locking option. Added --console option to mysqld, to force a console window (for error messages) when using Windows. Fixed table locks for Windows. Allow $ in identiers. Changed name of user-specic conguration le from my.cnf to .my.cnf (Unix only). Added DATE_ADD() and DATE_SUB() functions.
1045
IF and EXISTS are now reserved words (they would have to be sooner or later). Added lots of new options to mysqldump. Server error messages are now in mysqld_error.h. The server/client protocol now supports compression. All bug xes from MySQL Version 3.21.32.
1046
A site automatically will be blocked from future connections if someone repeatedly connects with an improper header (like when one uses telnet). You can now refer to tables in dierent databases with references of the form tbl_ name@db_name or db_name.tbl_name. This makes it possible to give a user read access to some tables and write access to others simply by keeping them in dierent databases! Added --user option to mysqld, to allow it to run as another Unix user (if it is started as the Unix root user). Added caching of users and access rights (for faster access rights checking) Normal users (not anonymous ones) can change their password with mysqladmin password new_password. This uses encrypted passwords that are not logged in the normal MySQL log! All important string functions are now coded in assembler for x86 Linux machines. This gives a speedup of 10% in many cases. For tables that have many columns, the column names are now hashed for much faster column name lookup (this will speed up some benchmark tests a lot!) Some benchmarks are changed to get better individual timing. (Some loops were so short that a specic test took < 2 seconds. The loops have been changed to take about 20 seconds to make it easier to compare dierent databases. A test that took 1-2 seconds before now takes 11-24 seconds, which is much better) Re-arranged SELECT code to handle some very specic queries involving group functions (like COUNT(*)) without a GROUP BY but with HAVING. The following now works: mysql> SELECT COUNT(*) as C FROM table HAVING C > 1; Changed the protocol for eld functions to be faster and avoid some calls to malloc(). Added -T32 option to mysqld, for running all queries under the main thread. This makes it possible to debug mysqld under Linux with gdb! Added optimization of not_null_column IS NULL (needed for some Access queries). Allow STRAIGHT_JOIN to be used between two tables to force the optimiser to join them in a specic order. String functions now return VARCHAR rather than CHAR and the column type is now VARCHAR for elds saved as VARCHAR. This should make the MyODBC driver better, but may break some old MySQL clients that dont handle FIELD_TYPE_VARCHAR the same way as FIELD_TYPE_CHAR. CREATE INDEX and DROP INDEX are now implemented through ALTER TABLE. CREATE TABLE is still the recommended (fast) way to create indexes. Added --set-variable option wait_timeout to mysqld. Added time column to mysqladmin processlist to show how long a query has taken or how long a thread has slept. Added lots of new variables to show variables and some new to show status. Added new type YEAR. YEAR is stored in 1 byte with allowable values of 0, and 1901 to 2155. Added new DATE type that is stored in 3 bytes rather than 4 bytes. All new tables are created with the new date type if you dont use the --old-protocol option to mysqld.
1047
Fixed bug in record caches; for some queries, you could get Error from table handler: # on some operating systems. Added --enable-assembler option to configure, for x86 machines (tested on Linux + gcc). This will enable assembler functions for the most important string functions for more speed!
1048
LEFT JOIN core dumped if the second table is used with a constant WHERE/ON expression that uniquely identies one record. Fixed problems with DATE_FORMAT() and incorrect dates. DATE_FORMAT() now ignores % to make it possible to extend it more easily in the future.
1049
1050
You can now kill threads that are waiting on a disk-full condition. Fixed some problems with UDF functions. Added long options to isamchk. Try isamchk --help. Fixed a bug when using 8 bytes long (alpha); filesort() didnt work. DISTINCT, ORDER BY and GROUP BY on 64-bit processors.
Aects
1051
1052
Changed protocol (downward compatible) to mark if a column has the AUTO_INCREMENT attribute or is a TIMESTAMP. This is needed for the new Java driver. Added Hebrew sorting order by Zeev Suraski. Solaris 2.6: Fixed configure bugs and increased maximum table size from 2G to 4G.
1053
LIMIT offset,count didnt work in INSERT ... SELECT. Optimized key block caching. This will be quicker than the old algorithm when using bigger key caches.
1054
Added RENAME option to ALTER TABLE: ALTER TABLE name RENAME TO new_name. make_binary_distribution now includes libgcc.a in libmysqlclient.a. This should make linking work for people who dont have gcc. Changed net_write() to my_net_write() because of a name conict with Sybase. New function DAYOFWEEK() compatible with ODBC. Stack checking and bison memory overrun checking to make MySQL safer with weird queries.
1055
Fixed bug with LIKE on number key. New error message so you can check whether the connection was lost while the command was running or whether the connection was down from the start. Added --table option to mysql to print in table format. Moved time and row information after query result. Added automatic reconnect of lost connections. Added != as a synonym for <>. Added function VERSION() to make easier logs. New multi-user test tests/fork_test.pl to put some strain on the thread library.
1056
1057
1058
Added new -O tmp_table_size=# option to mysqld. New function FROM_UNIXTIME(timestamp) which returns a date string in YYYY-MM-DD HH:MM:SS format. New function SEC_TO_TIME(seconds) which returns a string in HH:MM:SS format. New function SUBSTRING_INDEX(), originally by Zeev Suraski.
1059
mysql now shows the thread ID when starting or doing a reconnect. Changed the default sort buer size from 2M to 1M.
1060
New operator IN. This uses a binary search to nd a match. New command LOCK TABLES tbl_name [AS alias] {READ|WRITE} ... Added --log-update option to mysqld, to get a log suitable for incremental updates. New command EXPLAIN SELECT ... to get information about how the optimiser will do the join. For easier client code, the client should no longer use FIELD_TYPE_TINY_BLOB, FIELD_ TYPE_MEDIUM_BLOB, FIELD_TYPE_LONG_BLOB or FIELD_TYPE_VAR_STRING (as previously returned by mysql_list_fields). You should instead only use FIELD_TYPE_ BLOB or FIELD_TYPE_STRING. If you want exact types, you should use the command SHOW FIELDS. Added varbinary syntax: 0x###### which can be used as a string (default) or a number. FIELD_TYPE_CHAR is renamed to FIELD_TYPE_TINY. Changed all elds to C++ classes. Removed FORM struct. Fields with DEFAULT values no longer need to be NOT NULL. New eld types: ENUM A string which can take only a couple of dened values. The value is stored as a 1-3 byte number that is mapped automatically to a string. This is sorted according to string positions!
A string which may have one or many string values separated with ,. The string is stored as a 1-, 2-, 3-, 4- or 8-byte number where each bit stands for a specic set member. This is sorted according to the unsigned value of the stored packed number. Now all function calculation is done with double or long long. This will provide the full 64-bit range with bit functions and x some conversions that previously could result in precision losses. One should avoid using unsigned long long columns with full 64-bit range (numbers bigger than 9223372036854775807) because calculations are done with signed long long. ORDER BY will now put NULL eld values rst. GROUP BY will also work with NULL values. Full WHERE with expressions. New range optimiser that can resolve ranges when some keypart prex is constant. Example: mysql> SELECT * FROM tbl_name -> WHERE key_part_1="customer" -> AND key_part_2>=10 AND key_part_2<=10;
SET
1061
1062
If hostname isnt found by get_hostname, only the IP is checked. Previously, you got Access denied. Inserts of timestamps with values didnt always work. INSERT INTO ... SELECT ... WHERE could give the error Duplicated field. Added some tests to safe_mysqld to make it safer. LIKE was case-sensitive in some places and case-insensitive in others. Now LIKE is always case-insensitive. mysql.cc: Allow # anywhere on the line. New command SET SQL_SELECT_LIMIT=#. See the FAQ for more details. New version of the mysqlaccess script. Change FROM_DAYS() and WEEKDAY() to also take a full TIMESTAMP or DATETIME as argument. Before they only took a number of type YYYYMMDD or YYMMDD. Added new function UNIX_TIMESTAMP(timestamp_column).
1063
1064
1065
mysql now outputs \0, \t, \n and \\ when encountering ASCII 0, tab, newline or \ while writing tab-separated output. This is to allow printing of binary data in a portable format. To get the old behaviour, use -r (or --raw). Added german error messages (60 of 80 error messages translated). Added new API function mysql_fetch_lengths(MYSQL_RES *), which returns an array of column lengths (of type uint).
1066
Fixed bug with IS NULL in WHERE clause. Changed the optimiser a little to get better results when searching on a key part. Added SELECT option STRAIGHT_JOIN to tell the optimiser that it should join tables in the given order. Added support for comments starting with -- in mysql.cc (Postgres syntax). You can have SELECT expressions and table columns in a SELECT which are not used in the group part. This makes it ecient to implement lookups. The column that is used should be a constant for each group because the value is calculated only once for the rst row that is found for a group. mysql> SELECT id,lookup.text,SUM(*) FROM test,lookup -> WHERE test.id=lookup.id GROUP BY id; Fixed bug in SUM(function) (could cause a core dump). Changed AUTO_INCREMENT placement in the SQL query: INSERT INTO table (auto_field) VALUES (0); inserted 0, but it should insert an AUTO_INCREMENT value. mysqlshow.c: Added number of records in table. Had to change the client code a little to x this. mysql now allows doubled or "" within strings for embedded or ". New math functions: EXP(), LOG(), SQRT(), ROUND(), CEILING().
1067
mysqladmin.c: added client version to version information. Fixed core dump bug in sql_acl (core on new connection). Removed host, user and db tables from database test in the distribution. FIELD_TYPE_CHAR can now be signed (-128 to 127) or unsigned (0 to 255) Previously, it was always unsigned. Bug xes in CONCAT() and WEEKDAY(). Changed a lot of source to get mysqld to be compiled with SunPro compiler. SQL functions must now have a ( immediately after the function name (no intervening space). For example, USER( is regarded as beginning a function call, and USER ( is regarded as an identier USER followed by a (, not as a function call.
1068
Added functions DATABASE(), USER(), POW(), LOG10() (needed for ODBC). In a WHERE with an ORDER BY on elds from only one table, the table is now preferred as rst table in a multi-join. HAVING and IS NULL or IS NOT NULL now works. A group on one column and a sort on a group function (SUM(), AVG()...) didnt work together. Fixed. mysqldump: Didnt send password to server.
1069
1070
./configure --with-debug=full --prefix=your installation directory # O makefile gerado acima precsa do GNU make 3.75 ou mais novo. # (chamado gmake abaixo) gmake clean all install init-db Se voc e encontrar problemas com uma nova portabilidade, voc e ter que fazer alguma depura c ao do MySQL! Veja Se c ao D.1 [Depurando o servidor], P agina 1070. Nota: antes de iniciar a depura c ao do mysqld, obtenha primeiro os programas de teste mysys/thr_alarm e mysys/thr_lock para funcionar. Isto asegurar a que sus instala c ao da thread tem pelo menos uma chance remota de funcionar.
1071
se voc e estiver usando gcc ou egcs, a congura c ao recomendada e: CC=gcc CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors \ -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql \ --with-debug --with-extra-charsets=complex Isto evitar a problemas com a biblioteca libstdc++ e com exce c oes C++ (muitos compiladores t em problemas com exce c oes C++ no c odigo da thread) e compila uma vers ao MySQL com suporte para todos os conjuntos caracter. Se voc e suspeita de um erro despejo de mem oria, voc e pode congurar o o MySQL com --with-debug=full, que ir a instalar vericar de aloca c ao de mem oria (SAFEMALLOC). No entanto, a execu c ao com SAFEMALLOC e um pouco lenta, assim se voc e tiver problemas de desempenho voc e deve iniciar o mysqld com a op c ao --skip-safemalloc. Isto disabilitar a a verica c ao de despejo de mom oria para cada chamada a malloc() e free(). Se o mysqld parar de falhar quando voc e compilar com --with-debug, voc e provavelmente encontrou um erro de compila c ao ou erro de tempo dentro do MySQL. Neste caso voc e pode tentar adicionar -g ` as vari aveis CFLAGS e CXXFLAGS acima e n ao usar --with-debug. Se agora o mysqld morre, voc e pode pelo menos execut a-lo com gdb ou usar o gdb no arquivo core para descobrir que aconteceu. Quando voc e congura o MySQL para depura c ao voc e habilita automaticamente diversas fun c oes de verica c ao de seguran ca extra que monitora a sa ude do mysqld. Se eles encontrarem algo inesperado, uma entrada ser a encrita no stderr, que mysqld_safe direciona para o log de erros! Isto tamb em signica que se voc e estiver tendo alguns problemas inexperados com o MySQL e estiver usando uma distribui c ao fonte, a primeira coisa que voc e deve fazer e congurar o MySQL para depura c ao! (A segunda coisa e enviar uma mensagem para a lista de email do MySQL e pedir ajuda. Veja Se c ao 1.7.1.1 [Mailing-list], P agina 33. Por favor, use o script mysqlbug para todos os relatos de bug e quest oes referentes a vers ao do MySQL que voc e est a usando! Na distribui c ao do MySQL para Windows, mysqld.exe e, por padr ao, compilado com suporte a arquivos trace.
1072
Depois disso voc e pode usar a ferramenta de linha de comando mysql.exe em uma segunda janela de console para reproduzir o problema. Voc e pode nalizar o servidor mysqld acima com mysqladmin shutdown. Note que o arquivo trace ser a muito grande! Se voc e quiser ter um arquivo trace menor, voc e pode usar algo como: mysqld --debug=d,info,error,query,general,where:O,/tmp/mysqld.trace que apenas exibe informa c oes com a maioria das tags interrassants em /tmp/mysqld.trace. Se voc e zer um relat orio de bug sobre isto, por favor s o envie as linhas do trace para a lista de email apropriada quando algo parecee estar errado! Se voc e n ao puder localizar o local errado, voc e pode fazer um ftp do arquivo trace, junto com um relat orio de bug completo, para ftp://support.mysql.com/pub/mysql/secret/ para que assim um desenvolvedor do MySQL possa dar uma olhada nele. O arquivo trace e feito com o pacote DBUG de Fred Fish. Veja Se c ao D.3 [O pacote DBUG], P agina 1076.
1073
handle SIGLWP nostop noprint handle SIGPIPE nostop handle SIGALRM nostop handle SIGHUP nostop handle SIGTERM nostop noprint Se voc e tiver problemas depurando threads com gdb, voc e deve fazer o download do gdb 5.x e experiment a-lo. A nova vers ao do gdb tem um tratamento de threads bem melhorado. Aqui est a um exemplo de como depurar o mysqld: shell> gdb /usr/local/libexec/mysqld gdb> run ... backtrace full # Fa ca isto quando o mysqld falhar Inclua a saida acima e uma email gerado com mysqlbug e envie-o para lista de email do MySQL. Veja Se c ao 1.7.1.1 [Mailing-list], P agina 33. Se o mysqld travar voc e pode usar algumas ferramentas de sistema como strace ou /usr/proc/bin/pstack para exeminar onde mysqld travou. strace /tmp/log libexec/mysqld Se voc e estiver usando a interface Perl DBI, voc e pode habilitar a informa c ao de depua c ao usando o m etodo trace ou denindo a vari avel de ambiente DBI_TRACE. Veja Se c ao 12.5.2 [Classe Perl DBI], P agina 877.
1074
0x80ee4bc 0x80c3c91 0x80c6b43 0x80c1fd9 0x80c1686 voc e pode descobrir onde o mysqld nalizou fazendo o seguinte: 1. Copie os n umeros acima em um arquivo, por exemplo mysqld.stack. 2. Fa ca um arquivo de s imbolos para o servidor mysqld: nm -n libexec/mysqld > /tmp/mysqld.sym Note que a maioria das distribui c oes bin arias do MySQL (exceto para o pacotes de "depura c ao" onde as informa c oes s ao inclu idas dentro dos bin arios) j a possuem o arquivo acima, chamado mysqld.sym.gz. Neste caso voc e pode simplesmente desempacot a-lo fazendo: gunzip < bin/mysqld.sym.gz > /tmp/mysqld.sym 3. Execute resolve_stack_dump -s /tmp/mysqld.sym -n mysqld.stack. Isto exibir a a onde o mysqld nalizou. Se isto n ao lhe ajuda a descobrir o porque o mysqld morreu, voc e deve fazer um relato de erro e incluir a sa ida do comando acima no relat orio. Note no entanto que na maioria dos casos, termos apenas um stack trace, n ao nos ajudar a a encontrar a raz ao do problema. Para estarmos apto a localizar o erro ou fornecer um modo de contorn a-lo, precisariamos, na maioria dos casos, conhecer a consulta que matou o mysqld e de prefer encia um caso de teste para que possamos repetir o problema! Veja Se c ao 1.7.1.3 [Relato de erros], P agina 36.
D.1.5 Usando Arquivos de Log para Encontrar a Causa dos Erros no mysqld
Note que antes de iniciarmos o mysqld com --log voc e deve vericar todas as suas tabelas com myisamchk. Veja Capptexi tulo 4 [Administra c ao do Banco de Dados MySQL], P agina 208. Se o mysqld morre ou trava, voc e deve iniciar o mysqld com --log. Quando o mysqld morre de novo, voc e pode examinar o m do arquivo de log para a consulta que matou o mysqld. Se voc e estiver usando --log sem um nome de arquivo, o log e armazenado no diret orio do banco de dados como nomemaquina.log. Na maioria dos casos eau ltima consulta no arquivo de log que matou mysqld, mas se poss ivel voc e deve vericar isto reiniciando o mysqld e executando a consulta encontrada por meio da ferramenta de linha de comando mysql. Se isto funcionar, voc e tamb em deve testar todas as consultas complicadas que n ao completaram. Voc e tamb em pode tentar o comando EXPLAIN em todas as instru c oes SELECT que levam muito tempo para assegurar que o mysqld est a usando indices apropriados. Veja Se c ao 5.2.1 [EXPLAIN], P agina 425. Voc e pode encontrar as consultas que levam muito twempo para executar iniciando o mysqld com --log-slow-queries. Veja Se c ao 4.10.5 [Log de consultas lentas], P agina 378.
1075
Se voc e encontrar o texto mysqld restarted no arquivo de registro de erro (normalmente chamado hostname.err) voc e provavelmente encontrou uma consulta que provocou a falha no mysqld. Se isto acontecer voc e deve vericar todas as suas tabelas com myisamchk (veja Cap ptexi tulo 4 [Administra c ao do Banco de Dados MySQL], P agina 208) e testar a consulta no arquivo de log do MySQL para ver se ela n ao funcionou. Se voc e encontrar tal consulta, tente primeiro atualizar para uma vers ao mais nova do MySQL. Se isto n ao ajudar e voc e n ao puder encontrar nada no arquivo de mensagem mysql, voc e deve relatar o erro para uma lista de email do MySQL. As listas de email est ao descritas em http://lists.mysql.com/, que tamb em possui os links para as listas de arquivos online. Se voc e iniciou o mysqld com myisam-recover, o MySQL vericar a automaticamente e tentar a reparar as tabelas MyISAM se elas estiverem marcadas como n ao fechadas apropriadamente ou com falha. Se isto acontecer, o MySQL ir a escrever uma entrada Warning: Checking table ... no arquivo nomemaquina.err, a qual e seguida por Warning: Repairing table se a tabela precisar ser reparada. Se voc e obter v arios desses erros, sem que o mysqld nalize inesperadamente um pouco antes, ent ao algo est a errado e precisa ser investigado melhor. Veja Se c ao 4.1.1 [Op c oes de linha de comando], P agina 208. E claro que n ao e um bom sinal se o mysqld morreu inesperadamente, mas neste caso n ao se deve invwestigar as mensagens Checking table... e sim tentar descobrir por que o mysqld morreu.
1076
erros em http://bugs.mysql.com/. Se voc e e um consumidor com suporte, voc e tamb em pode enviar um email para support@mysql.com para alertar a equipe do MySQL sobre o problema e t e-lo corr igido o mais r apido poss ivel.. Voc e tamb em pode usar o script mysql_find_rows para executar algumas das instru c oes de atualiza c ao se voc e quiser estreitar o problema.
1077
flag[,modifier,modifier,...,modifier] Os carcteres de par ametros atualmente reconhecidos s ao: Par ametro Descri c ao d Habilita a sa ida de macros DBUG <N> para o estado atual. Pode ser seguido por uma lista de palavras chaves que selecionam a sa ida apenas para as macros DBUG com aquela palavra chave. Uma lista de palavras chaves vazia indica a sa ida para todas as macros. D Atraso depois de cada linha de sa ida do depurados. O argumento e o n umero de d ecimos de segundo do atraso, sujeito ` as capacidades da m aquina. Por exemplo, -#D,20 atrasa em dois segundos f Limita a depura c ao e/ou rastreamento, e perlemento da lista de fun c oes listadas. Note que uma lista nula disabilitar a todas as fun c oes. O par ametro "d" ou "t" apropriado ainda deve ser dado, este par ametro s o limita as suas a c oesse eles estiverem habilitados. F Identica o nome do arquivo fonte para cada linha de sa ida da depura c ao ou rastreamento. i Identica o processo com o PID ou a ID da thread para cada linha de sa ida da depura c ao ou rastreamento. g Habilita a modelagem. Cria um arquivo chamado dbugmon.out contendo informa c oes que poder ser usadas para moldar o programa. Pode ser seguida por uma lista de palavras chaves que selecionam a modelagem apenas para as fun c oes naquela lista. Uma lista nula indica que todas as fun c oes ser ao consideradas. L Identica o n umero da linha do arquivo fonte para cada linha de sa ida da depura c ao ou rastreamento. n Exibe a profundidade de aninhamento da fun c ao atual para cada linha de sa ida da depura c ao ou rastreamento. N N umero de cada linha de sa ida do dbug. o Redireciona o uxo de sa ida do depurador para um arquivo espec ico. A sa ida padr ao e stderr. O Igual a o, mas o arquivo e realmente descarregado entre cada escrita. Quando necess ario o arquivo e fechado e reaberto entre cada escrita. p Limita as a c oes do depurador para um processo espec ico. Um processo deve ser indenticado com a macro DBUG PROCESS e corresponder a um dos itens especicados na lista de a c oes do depurador que devem ocorrer. P Exibe o nome do processo atual para cada linha de sa ida da depura c ao ou rastreamento. r Quando recebe um novo estado, n ao herda o n ivel de aninhamento da fun c ao do estado anterior. Util quando a sa ida e iniciada na margem esquerda. S Executa a fun c ao sanity( le , line ) a cada fun c ao depurada at e que sanity() retorne algo diferente de 0. (Geralmente usada com safemalloc para encontrar falhas de mem oria). t Habilita a linhas do trace de chamada/sa ida de fun c oes. Pode ser seguido por uma lista (contendo apenas um modicador) dando um o n ivel num erico m aximo de rastreamento, al em do que nenhuma saida ser a exibida, tanto para a depura c ao quanto para macros trace. O padr ao e uma op c ao de tempo de compila c ao.
1078
Alguns exemplos de strings de controle do depurador que podem aparecer em uma linha de comando do shell (o "-#" e normalmente usado para introduzir uma string de controle a um aplicativo) s ao: -#d:t -#d:f,main,subr1:F:L:t,20 -#d,input,output,files:n -#d:t:i:O,\\mysqld.trace No MySQL, tags comuns de serem usadas (com a op c ao d) s ao: enter,exit,error,warning,info e loop.
1079
SELECT combinado com INSERT (e muito poucas instru c oes UPDATEs e DELETEs). Muitas varreduras / GROUP BY em toda a tabela sem nenhuma escrita. Outra op c oes al em de bloqueios a n ivel de p agina / registro: Versioning (como usamos no MySQL para inser c oes concorrentes) onde voc e pode ter um escrita e v arias leituras ao mesmo tempo. Isto signica que o banco de dados/tabelas suporta diferentes viiews para os dados dependendo de quando se come ca a acess a-lo. Outros nomes deste recurso s ao time travel, c oia na escrita ou c opia por demanda. C opia por demanda e em muitos casos muito melhor que bloqueio a n ivel de registro ou p agina; o piro caso, no entanto, usa muito mais mem oria que a usada em travamentos normais. Em vez de se usar bloqueio de registro pode-se usar bloqueios no aplicativo (como o funciona em aplicaticos bem comportados. get lock/release lock no MySQL). Isto s Em muitos casos pode se fazer um palpite sobre qual tipo de bloqueio e melhor para a aplica c ao. mas geralmente e muito dif icil dizer que um dado tipo de bloqueio e melhor que outro; tudo depende da aplica c ao e diferentes partes da aplica c ao podem exigir diferentes tipos de bloqueios. Aqui est ao algumas dicas sobre travamento no MySQL: A maioria das aplica c oes web fazem diversos selects, muito poucas dele c oes, atualizaoes principalmente nas chaves e inser c oes em tabelas espec icas. A congura c ao base do MySQL e bem sitonizada para esta nalidade. Usu arios concorrentes n ao s ao um problema se eles n ao misturam atualiza c oes com sele c oes que precisam examinar muitas linhas na mesma tabela. Se e misturado inser c oes e exclus oes na mesma tabela ent ao INSERT DELAYED pode ser de grande ajuda. Pode se tamb em usar LOCK TABLES para aumentar a velocidade (muitas atualiza c oes com um travamento simples e muito mais r apida que atualiza c oes sem travamento). Separar as coisas em tabelas diferentes tamb em ajudar a. Se voc e tiver problemas de velocidade com travamento de tabelas no MySQL, voc e pode estar apto a resolver isto convertendo alguma de suas tabelas para tipos InnoDB ou BDB. Veja Se c ao 7.5 [InnoDB], P agina 642. Veja Se c ao 7.6 [BDB], P agina 695. A se c ao de otimiza c ao no manual cobre diversos aspectos de como sintonizar a sua aplica c ao. Veja Se c ao 5.2.13 [Dicas], P agina 441.
1080
pthread_get_specific deve usar um argumento. sigwait deve usar dois argumentos. Diversas fun c oes (pelo menos pthread_cond_wait, pthread_cond_timedwait) deve retornar o c odigo do erro. Agora eles retornam -1 e conguram errno. Outro problema e que threads a nivel do usuario usam o sinal ALRM e isto aborta diversas das fun c oes (read, write, open...). O MySQL deve fazer uma nova tentativa de interrup c ao em todos mas n ao e facil de se verica isto. O maior problema n ao solucionado e o seguinte: Para conseguir alarmes de threads alteramos mysys/thr_alarm.c para esperar entre alarmes com pthread_cond_timedwait(), mas isto aborta com o erro EINTR. Tentamos depurar a biblioteca thread para descobrirmos porque isto acontece, mas n ao podemos encontrar nenhuma solu c ao f acil. Se algu em quiser experimentar o MySQL com RTS threads sugerimos o seguinte: Altere as fun c oes que o MySQL usa da biblioteca de threads para POSIX. Isto n ao deve levar tanto tempo. Compile todas as bibliotecas com -DHAVE_rts_threads. Compile thr_alarm. Se houver alguma pequena diferen ca na implementa c ao, elas devem ser corrigidas alterando my_pthread.h e my_pthread.c. Execute thr_alarm. Se ele executar sem mensagens de aviso, erro ou aborto, voc e est a na trilha certa. Aqui est a uma execu c ao bem sucedidad no Solaris: Main thread: 1 Thread 0 (5) started Thread: 5 Waiting process_alarm Thread 1 (6) started Thread: 6 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 1 (1) sec Thread: 6 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 2 (2) sec Thread: 6 Simulation of no alarm needed Thread: 6 Slept for 0 (3) sec Thread: 6 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 4 (4) sec Thread: 6 Waiting process_alarm thread_alarm
1081
Thread: 5 Slept for 10 (10) sec Thread: 5 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 5 (5) sec Thread: 6 Waiting process_alarm process_alarm ... thread_alarm Thread: 5 Slept for 0 (1) sec end
1082
Em alguns sistemas, threads do kernel s ao gerenciadas threads de usu ario integrads em bibkliotecas de sistemas. Nestes casos a troca de thread pode ser feita pela biblioteca de threads e o kernel n ao t em real conhecimento da thread.
1083
1084
1085
"pi" REGEXP "pi|apa"; "axe" REGEXP "pi|apa"; "apa" REGEXP "pi|apa"; "apa" REGEXP "^(pi|apa)$"; "pi" REGEXP "^(pi|apa)$"; "pix" REGEXP "^(pi|apa)$";
1 0 1 1 1 0
Combina com zero ou mais inst ancias da sequ encia abc. mysql> SELECT "pi" REGEXP "^(pi)*$"; mysql> SELECT "pip" REGEXP "^(pi)*$"; mysql> SELECT "pipi" REGEXP "^(pi)*$"; -> 1 -> 0 -> 1
{1} {2,3}
Existe um modo mais geral de se escrever regexp que combinam com muitas ocorr encias de um atomo anterior. a* a+ a? Pode ser escrito como a{0,}. Pode ser escrito como a{1,}. Pode ser escrito como a{0,1}.
Para ser mais preciso, um atomo seguido por um limite contendo um inteiro i e nenhuma virgula casa com uma sequ encia de exatamente i combina c oes do atomo. Um atomo seguido por um limite contendo i e uma virgula casa com uma sequ encia de i ou mais combina c oes do atomo. Um atomo seguido por um limite contendo dois inteiros i e j casa com uma seqqu encia de i at e j (inclusive) combina c oes de atomos. Ambos os argumentos devem estar na faixa de 0 ate RE_DUP_MAX (padr ao e 255), inclusive. Se houver dois argumentos, o segundo deve ser maior ou igual ao primeiro. [a-dX] [^a-dX] Combina com qualquer caracter que seja (ou n ao, se ^ e usado) a, b, c, d ou X. Para incluir um caracter literal ], ele deve ser imediatamente seguido pelo colchete de abertura [. Para incluir um caracter literal -, ele deve ser escrito primeiro ou por ultimo. Assim o [0-9] encontra qualquer d igito decimal. Qualquer caracter que n ao tenha um signicado denido dentro de um para [] n ao tem nenhum signicado especial e combina apenas com ele mesmo. mysql> mysql> mysql> mysql> mysql> mysql> SELECT SELECT SELECT SELECT SELECT SELECT "aXbc" REGEXP "[a-dXYZ]"; "aXbc" REGEXP "^[a-dXYZ]$"; "aXbc" REGEXP "^[a-dXYZ]+$"; "aXbc" REGEXP "^[^a-dXYZ]+$"; "gheis" REGEXP "^[^a-dXYZ]+$"; "gheisa" REGEXP "^[^a-dXYZ]+$"; -> -> -> -> -> -> 1 0 1 0 1 0
[[.caracter.]] A sequ encia de caracteres daquele elemento ordenado. A sequ encia e um u nico elemento da lista de express oes entre colchetes. Um express ao entre colchetes contendo um elemento ordenado multi-caracter pode ent ao combinar com mais
1086
de um caracter, por exemplo, se a sequ encia ordenada inclui um elemento ordenado ch, ent ao a expres ao regular [[.ch.]]*c casa com os primeiros cinco caracteres de chchcc. [=classe_caracter=] Uma classe equivalente, procura pela sequ encia de caracteres de todos elementos ordenados equivalentes ` aquele, incluindo ele mesmo. Por exemplo, se o e (+) s ao os membros de uma classe equivalente, ent ao [[=o=]], [[=(+)=]] e [o(+)] s ao todos sin onimos. Uma classe equivalente n ao pode ser o nal de uma escala. [:character_class:] Dentro de colchets, o nome de uma classe de caracter entre [: e :] procura pela lista de todos os caracteres pertencentes a esta classe. Os nomes de classes de caracteres padr oes s ao: Nome Nome Nome alnum digit punct alpha graph space blank lower upper cntrl print xdigit Ele procura pelas classes de caracteres denidas na p agina ctype(3) do manual. Um local pode forncer outros. Uma classe de caracter n ao pode ser usada como o nal de uma escala. mysql> SELECT "justalnums" REGEXP "[[:alnum:]]+"; -> 1 mysql> SELECT "!!" REGEXP "[[:alnum:]]+"; -> 0 [[:<:]] [[:>:]] Combina com a string null no inicio e no m de uma palavra, respectivamente. Uma palavra e denida como uma sequencia de caracteres de palavra os quais n ao s ao nem precedido e nem seguidos por caracteres de palavras. Um caracter de palavra e um caracter alfa num erico (como denido por ctype(3)) ou um underscore (_). mysql> SELECT "a word a" REGEXP "[[:<:]]word[[:>:]]"; -> 1 mysql> SELECT "a xword a" REGEXP "[[:<:]]word[[:>:]]"; -> 0 mysql> SELECT "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1
1087
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free softwareto make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundations software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) oer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each authors protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modied by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reect on the original authors reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in eect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyones free use or not licensed at all. The precise terms and conditions for copying, distribution and modication follow.
1088
1089
for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a. Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b. Accompany it with a written oer, valid for at least three years, to give any thirdparty, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c. Accompany it with the information you received as to the oer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an oer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface denition les, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by oering access to copy from a designated place, then oering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you
1090
indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may dier in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program species a version number of this License which applies to it and any later version, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
1091
10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are dierent, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
1092
Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type show w. This is free software, and you are welcome to redistribute it under certain conditions; type show c for details.
The hypothetical commands show w and show c should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than show w and show c; they could even be mouse-clicks or menu itemswhatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a copyright disclaimer for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program Gnomovision (which makes passes at compilers) written by James Hacker. signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
1093
<
< (menor que) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . << . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . << (deslocamento a esquerda) . . . . . . . . . . . . . . <= (menor que ou igual) . . . . . . . . . . . . . . . . . . . . <=> (Igual a) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . <> (diferente) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 202 546 506 506 506
"
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
%
% (meta caracter) . . . . . . . . . . . . . . . . . . . . . . . . . . 469 % (modulo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
=
= (igual) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
> &
& (operado bin ario AND) . . . . . . . . . . . . . . . . . . . 545 && (AND l ogico) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 > (maior que) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 >= (maior que ou igual) . . . . . . . . . . . . . . . . . . . . 506 >> (deslocamento a direita) . . . . . . . . . . . . . . . 546
(
() (parenteses) . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 (Control-Z) \z . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
^
^ (operado bin ario XOR) . . . . . . . . . . . . . . . . . . . 545
*
* (multiplica c~ ao) . . . . . . . . . . . . . . . . . . . . . . . . . 523
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
+
+ (adi c~ ao) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
\
\" \ \\ \0 \b \n \r \t \z (aspas duplas) . . . . . . . . . . . . . . . . . . . . . . . . . . (aspas simples) . . . . . . . . . . . . . . . . . . . . . . . . (escape) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (ASCII 0) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (backspace) . . . . . . . . . . . . . . . . . . . . . . . . . . . . (nova linha) . . . . . . . . . . . . . . . . . . . . . . . . . . . . (retorno de carro) . . . . . . . . . . . . . . . . . . . . . . (tab) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (Control-Z) ASCII(26) . . . . . . . . . . . . . . . . . . 469 469 469 469 469 469 469 469 469
- (menos un ario) . . . . . . . . . . . . . . . . . . . . . . . . . . . - (subtra ca ~o) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -p op c~ oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -password op c~ oes . . . . . . . . . . . . . . . . . . . . . . . . . . 523 522 268 268
.
.my.cnf file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 .mysql_history, arquivo . . . . . . . . . . . . . . . . . . . 346 .pid (process ID), arquivo . . . . . . . . . . . . . . . . 293
|
| (operador bin ario OR) . . . . . . . . . . . . . . . . . . . 545 || (OR l ogico) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
/
/ (divis~ ao) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 /etc/passwd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 /etc/passwd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
~
~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
1094
A
ABS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ACOS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ADDDATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ADDTIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . adi c~ ao (+) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AES_DECRYPT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AES_ENCRYPT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ALTER COLUMN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ALTER FUNCTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . ALTER PROCEDURE . . . . . . . . . . . . . . . . . . . . . . . . . . . ALTER TABLE . . . . . . . . . . . . . . . . . . . . . . . 607, 609, ANALYZE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AND l ogico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AND, operado bin ario . . . . . . . . . . . . . . . . . . . . . . Area() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750, aritim eticas, fun c~ oes . . . . . . . . . . . . . . . . . . . . . ARQUIVO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . arquivo .my.cnf . . . . . 136, 217, 219, 240, 254, AS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563, AsBinary() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ASCII() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ASIN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . aspas duplas (\") . . . . . . . . . . . . . . . . . . . . . . . . . . aspas em identificadores . . . . . . . . . . . . . . . . . . aspas simples (\) . . . . . . . . . . . . . . . . . . . . . . . . AsText() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ATAN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ATAN2() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AUTO_INCREMENT, usando com DBI . . . . . . . . . . . . AVG() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 526 536 536 522 548 548 929 609 763 763 934 299 509 545 751 545 515 268 567 745 512 526 469 472 469 745 527 527 882 556
C
C:\my.cnf file . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 CALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764 CASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510, 769 CAST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 CC vari aveis de ambiente . . . . . . . . . . . . . . . . . . . 98 CC, vari avel de ambiente . . . . . . . . . . . . . 105, 1083 CEILING() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 Centroid() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751 CFLAGS, vari avel de ambiente . . . . . . . . 105, 1083 CHANGE MASTER TO . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 CHAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485, 496 CHAR VARYING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 CHAR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 CHAR_LENGTH() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 CHARACTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485 CHARACTER VARYING . . . . . . . . . . . . . . . . . . . . . . . . . 486 CHARACTER_LENGTH() . . . . . . . . . . . . . . . . . . . . . . . . 516 CHECK TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 CHECKSUM TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 ChopBlanks, m etodo DBI . . . . . . . . . . . . . . . . . . . . 881 CLOSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768 COALESCE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508 coer c~ ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522 Coment ario sintaxe . . . . . . . . . . . . . . . . . . . . . . . . 479 COMMIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46, 614 compara c~ ao, operadores de . . . . . . . . . . . . . . . . . 504 COMPRESS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 CONCAT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 CONCAT_WS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 connect(), m etodo DBI . . . . . . . . . . . . . . . . . . . . . 878 CONNECTION_ID() . . . . . . . . . . . . . . . . . . . . . . . . . . . 552 Contains() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754 CONV() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513 CONVERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 ConvexHull() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752 COS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 COT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 COUNT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 COUNT(DISTINCT) . . . . . . . . . . . . . . . . . . . . . . . . . . . 556 CRC32() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 CREATE DATABASE . . . . . . . . . . . . . . . . . . . . . . . . . . . 596 CREATE FUNCTION . . . . . . . . . . . . . . . . . . . . . . . 761, 896 CREATE INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 CREATE PROCEDURE . . . . . . . . . . . . . . . . . . . . . . . . . . 761 CREATE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 CROSS JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 Crosses() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754 CSS, variavel de ambiente . . . . . . . . . . . . . . . . . 104 CURDATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 CURRENT_DATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 CURRENT_TIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 CURRENT_TIMESTAMP . . . . . . . . . . . . . . . . . . . . . . . . . 541
B
backspace (\b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . BACKUP TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BdMPolyFromText() . . . . . . . . . . . . . . . . . . . . . . . . . BdMPolyFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . . BdPolyFromText() . . . . . . . . . . . . . . . . . . . . . . . . . . BdPolyFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . . . BEGIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614, BENCHMARK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BETWEEN ... AND . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIGINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . bin arias, fun c~ oes . . . . . . . . . . . . . . . . . . . . . . . . . BINARY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482, BIT_AND() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT_COUNT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT_COUNT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT_LENGTH() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT_OR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT_OR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT_XOR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BLOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486, BOOL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482, 469 278 740 741 740 741 764 553 507 482 512 545 522 486 558 202 546 512 202 557 557 498 486
1095
CURRENT_USER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 CURTIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 CXX var aveis de ambiente . . . . . . . . . . . . . . . . . . . 98 CXX, vari avel de ambiente . . . . . . . . . . . . 105, 1083 CXXFLAGS environment variable . . . . . . . . . . . . . . 99 CXXFLAGS, var aveis de ambiente . . . . . . . . . . . . . 99 CXXFLAGS, variavel de ambiente . . . . . . . . . . . . 105 CXXFLAGS, vari avel de ambiente . . . . . . . . . . . 1083
D
data e hora, fun c~ oes de . . . . . . . . . . . . . . . . . . . . 529 data_sources(), m etodo DBI . . . . . . . . . . . . . . . . 881 Database information, obtaining . . . . . . . . . . 303 DATABASE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546 DATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484, 491, 927 DATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 DATE_ADD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 DATE_FORMAT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538 DATE_SUB() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 DATEDIFF() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537 DATETIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484, 491 DAY() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 DAYNAME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 DAYOFMONTH() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 DAYOFWEEK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 DAYOFYEAR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 DBI->{ChopBlanks} . . . . . . . . . . . . . . . . . . . . . . . . . 881 DBI->{is_blob} . . . . . . . . . . . . . . . . . . . . . . . . . . . . 882 DBI->{is_key} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 882 DBI->{is_not_null} . . . . . . . . . . . . . . . . . . . . . . . . 883 DBI->{is_num} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 882 DBI->{is_pri_key} . . . . . . . . . . . . . . . . . . . . . . . . . 882 DBI->{length} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 DBI->{max_length} . . . . . . . . . . . . . . . . . . . . . . . . . 883 DBI->{mysql_insertid} . . . . . . . . . . . . . . . . . . . . 882 DBI->{NAME} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 DBI->{NULLABLE} . . . . . . . . . . . . . . . . . . . . . . . . . . . 881 DBI->{NUM_OF_FIELDS} . . . . . . . . . . . . . . . . . . . . . . 881 DBI->{table} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 DBI->{type} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 DBI->connect() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878 DBI->data_sources() . . . . . . . . . . . . . . . . . . . . . . . 881 DBI->disconnect . . . . . . . . . . . . . . . . . . . . . . . . . . . 879 DBI->do() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880 DBI->execute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880 DBI->fetchall_arrayref . . . . . . . . . . . . . . . . . . . 881 DBI->fetchrow_array . . . . . . . . . . . . . . . . . . . . . . . 880 DBI->fetchrow_arrayref . . . . . . . . . . . . . . . . . . . 880 DBI->fetchrow_hashref . . . . . . . . . . . . . . . . . . . . 880 DBI->finish . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881 DBI->prepare() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879 DBI->quote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 DBI->quote() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880 DBI->rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881 DBI->trace . . . . . . . . . . . . . . . . . . . . . . . . . . . 881, 1073 DBI_TRACE, vari avel de ambiente . . . . . . . . . . . 882 DBI_TRACE, vari avel de ambiente . . . . 1073, 1083
DBI_USER, vari avel de ambiente . . . . . . . . . . . 1083 DEC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 DECIMAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 DECLARE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764 DECODE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 DEGREES() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 DELAYED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581 DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584 DES_DECRYPT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 DES_ENCRYPT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549 DESC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 DESCRIBE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193, 613 diferente (!=) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 diferente (<>) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 Difference() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752 Dimension() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746 disconnect, m etodo DBI . . . . . . . . . . . . . . . . . . . . 879 Disjoint() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754 Distance() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755 DISTINCT . . . . . . . . . . . . . . . . . . . . . . . . . . 181, 435, 556 DIV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 diversas, fun c~ oes . . . . . . . . . . . . . . . . . . . . . . . . . 546 divis~ ao (/) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 DO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596 do(), m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . 880 DOUBLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 DOUBLE PRECISION . . . . . . . . . . . . . . . . . . . . . . . . . . 484 DROP DATABASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596 DROP FUNCTION . . . . . . . . . . . . . . . . . . . . . . . . . 763, 896 DROP INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609, 613 DROP PRIMARY KEY . . . . . . . . . . . . . . . . . . . . . . . . . . . 609 DROP PROCEDURE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763 DROP TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611 DROP USER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 DUMPFILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
E
ELT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513 ENCODE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 ENCRYPT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764 EndPoint() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748 ENUM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487, 499 Envelope() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746 environment variable, CXXFLAGS . . . . . . . . . . . . . 99 Environment variable, LD_RUN_PATH . . . . . . . . 166 Equals() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754 escape (\\) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 execute, m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . 880 EXP() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 EXPLAIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425 EXPORT_SET() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513 ExteriorRing() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750 EXTRACT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
1096
F
FALSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FETCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . fetchall_arrayref, m etodo DBI . . . . . . . . . . . . . fetchrow_array, m etodo DBI . . . . . . . . . . . . . . . . fetchrow_arrayref, m etodo DBI . . . . . . . . . . . . . fetchrow_hashref, m etodo DBI . . . . . . . . . . . . . . FIELD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FIND_IN_SET() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . finish, m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . . FIXED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FLOAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FLOAT(M,D) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FLOAT(precis~ ao) . . . . . . . . . . . . . . . . . . . . . . 483, FLOOR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FLUSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . fluxo de controle, fun c~ oes . . . . . . . . . . . . . . . . FORCE INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . 563, FORMAT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FOUND_ROWS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FROM_DAYS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FROM_UNIXTIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . fun c~ oes de data e hora . . . . . . . . . . . . . . . . . . . . . fun c~ oes de fluxo de controle . . . . . . . . . . . . . . fun c~ oes definidas pelo usu ario . . . . . . . . . . . . fun c~ oes matematicas . . . . . . . . . . . . . . . . . . . . . . . fun c~ oes string . . . . . . . . . . . . . . . . . . . . . . . . . . . . fun c~ oes, aritim eticas . . . . . . . . . . . . . . . . . . . . . fun c~ oes, bin arias . . . . . . . . . . . . . . . . . . . . . . . . . fun c~ oes, diversas . . . . . . . . . . . . . . . . . . . . . . . . . fun c~ oes, GROUP BY . . . . . . . . . . . . . . . . . . . . . . . . . . functions de compara c~ ao de string . . . . . . . . . 471 768 881 880 880 880 513 515 514 881 484 483 483 484 524 300 510 568 552 554 563 537 542 529 510 896 523 512 545 545 546 555 519
H
HANDLER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595 HEX() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 HOME vari avel de ambiente . . . . . . . . . . . . . . . . . 346 HOME, vari avel de ambiente . . . . . . . . . . . . . . . 1083 host.frm, problemas encontrando . . . . . . . . . . 112 HOUR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
I
identificadores, aspas . . . . . . . . . . . . . . . . . . . . IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IF() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IFNULL() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IGNORE INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . 563, IGNORE KEY . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563, igual (=) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INET_ATON() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INET_NTOA() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INNER JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439, INSERT ... SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . INSERT DELAYED . . . . . . . . . . . . . . . . . . . . . . . . . . . . INSERT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INSERT, cooncess~ ao de privil egios com instru c~ oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . INSTR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . instru c~ oes GRANT . . . . . . . . . . . . . . . . . . . . . . . . . . instru c~ oes INSERT . . . . . . . . . . . . . . . . . . . . . . . . . INT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INTEGER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . InteriorRingN() . . . . . . . . . . . . . . . . . . . . . . . . . . . Intersection() . . . . . . . . . . . . . . . . . . . . . . . . . . . . Intersects() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INTERVAL() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IS NOT NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IS NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435, IS NULL, e indices . . . . . . . . . . . . . . . . . . . . . . . . . is_blob, m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . IS_FREE_LOCK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . is_key, m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . . is_not_null, m etodo DBI . . . . . . . . . . . . . . . . . . . is_num, m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . . is_pri_key, m etodo DBI . . . . . . . . . . . . . . . . . . . . IsClosed() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748, IsEmpty() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ISNULL() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ISOLATION LEVEL . . . . . . . . . . . . . . . . . . . . . . . . . . . IsRing() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IsSimple() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ITERATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 768 510 511 568 568 505 507 554 553 567 578 581 581 514 263 514 262 263 482 482 750 752 754 508 506 506 450 882 553 882 883 882 882 749 747 507 618 749 747 769
G
GeomCollFromText() . . . . . . . . . . . . . . . . . . . . . . . . GeomCollFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . GEOMETRY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GEOMETRYCOLLECTION . . . . . . . . . . . . . . . . . . . . . . . . GeometryCollection() . . . . . . . . . . . . . . . . . . . . . . GeometryCollectionFromText() . . . . . . . . . . . . . GeometryCollectionFromWKB() . . . . . . . . . . . . . . GeometryFromText() . . . . . . . . . . . . . . . . . . . . . . . . GeometryFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . GeometryN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GeometryType() . . . . . . . . . . . . . . . . . . . . . . . . . . . . GeomFromText() . . . . . . . . . . . . . . . . . . . . . . . . 739, GeomFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . 740, GET_FORMAT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GET_LOCK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GLength() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748, GRANT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GRANT, instru c~ ao . . . . . . . . . . . . . . . . . . . . . . . . . . GRANT, instru c~ oes . . . . . . . . . . . . . . . . . . . . . . . . . GRANTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GREATEST() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740 741 739 739 742 740 741 739 740 751 746 745 745 539 552 749 255 274 262 323 528
1097
J
JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
M
maior que (>) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . maior que ou igual (>=) . . . . . . . . . . . . . . . . . . . . MAKE_SET() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MAKEDATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MAKETIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MASTER_POS_WAIT() . . . . . . . . . . . . . . . . . . . . 406, MATCH ... AGAINST() . . . . . . . . . . . . . . . . . . . . . . . matematicas, fun c~ oes . . . . . . . . . . . . . . . . . . . . . . MAX() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . max_length, m etodo DBI . . . . . . . . . . . . . . . . . . . . MBRContains() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MBRDisjoint() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MBREqual() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MBRIntersects() . . . . . . . . . . . . . . . . . . . . . . . . . . . MBROverlaps() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MBRTouches() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MBRWithin() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MD5() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MEDIUMBLOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MEDIUMINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MEDIUMTEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . menor que (<) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . menor que ou igual (<=) . . . . . . . . . . . . . . . . . . . . menos un ario (-) . . . . . . . . . . . . . . . . . . . . . . . . . . . Meta caracter (%) . . . . . . . . . . . . . . . . . . . . . . . . . . Meta caracter (_) . . . . . . . . . . . . . . . . . . . . . . . . . . MICROSECOND() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MID() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MIN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MINUTE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MLineFromText() . . . . . . . . . . . . . . . . . . . . . . . . . . . MOD (modulo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MOD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . modulo (%) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . modulo (MOD) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MONTH() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MONTHNAME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MPointFromText() . . . . . . . . . . . . . . . . . . . . . . . . . . MPointFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . . . MPolyFromText() . . . . . . . . . . . . . . . . . . . . . . . . . . . MPolyFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . . . . MULTILINESTRING . . . . . . . . . . . . . . . . . . . . . . . . . . . MultiLineString() . . . . . . . . . . . . . . . . . . . . . . . . . MultiLineStringFromText() . . . . . . . . . . . . . . . . multiplica c~ ao (*) . . . . . . . . . . . . . . . . . . . . . . . . . MULTIPOINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MultiPoint() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MultiPointFromText() . . . . . . . . . . . . . . . . . . . . . . MultiPointFromWKB() . . . . . . . . . . . . . . . . . . . . . . . MULTIPOLYGON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MultiPolygon() . . . . . . . . . . . . . . . . . . . . . . . . . . . . MultiPolygonFromText() . . . . . . . . . . . . . . . . . . . MultiPolygonFromWKB() . . . . . . . . . . . . . . . . . . . . my_init() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . my_ulonglong, imprimindo valores . . . . . . . . . my_ulonglong, tipo C . . . . . . . . . . . . . . . . . . . . . . MySQL C type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 506 515 540 541 554 521 523 556 883 753 753 753 753 754 754 753 548 486 482 486 506 506 523 469 469 533 518 556 533 740 523 523 523 523 531 531 740 741 740 741 739 742 740 523 739 742 740 741 739 742 740 741 854 773 773 826
K
KILL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
L
LAST_DAY() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 LAST_INSERT_ID() . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 LAST_INSERT_ID([expr]) . . . . . . . . . . . . . . . . . . . 551 LCASE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 LD_RUN_PATH environment variable . . . . . . . . . 166 LD_RUN_PATH vari aveis de ambiente . . . . . . . . . 147 LD_RUN_PATH, vari avel de ambiente . . . 140, 1083 LEAST() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 LEAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769 LEFT JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436, 567 LEFT OUTER JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 LEFT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 LENGTH() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 length, m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . . 883 LIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520 LIKE, e indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 LIKE, e meta caracteres . . . . . . . . . . . . . . . . . . . 449 LIMIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438, 554 LineFromText() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740 LineFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741 LINESTRING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739 LineString() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742 LineStringFromText() . . . . . . . . . . . . . . . . . . . . . . 740 LineStringFromWKB() . . . . . . . . . . . . . . . . . . . . . . . 741 LN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 LOAD DATA FROM MASTER . . . . . . . . . . . . . . . . . . . . . . 405 LOAD DATA INFILE . . . . . . . . . . . . . . . . . . . . . . 587, 928 LOAD TABLE FROM MASTER . . . . . . . . . . . . . . . . . . . . 405 LOAD_FILE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 LOCALTIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 LOCALTIMESTAMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 LOCATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516, 517 LOCK TABLES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616 LOG() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 LOG10() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 LOG2() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 logico, operadores . . . . . . . . . . . . . . . . . . . . . . . . 508 LONG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498 LONGBLOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 LONGTEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 LOOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769 LOWER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 LPAD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 LTRIM() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
1098
MYSQL, tipo C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773 mysql_affected_rows() . . . . . . . . . . . . . . . . . . . . 780 mysql_autocommit(). . . . . . . . . . . . . . . . . . . . . . . . 822 MYSQL_BIND, tipo C . . . . . . . . . . . . . . . . . . . . . . . . 824 mysql_bind_param() . . . . . . . . . . . . . . . . . . . . . . . . 832 mysql_bind_result() . . . . . . . . . . . . . . . . . . . . . . . 838 mysql_change_user() . . . . . . . . . . . . . . . . . . . . . . . 781 mysql_character_set_name() . . . . . . . . . . . . . . . 782 mysql_close() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782 mysql_commit(). . . . . . . . . . . . . . . . . . . . . . . . . . . . 821 mysql_connect() . . . . . . . . . . . . . . . . . . . . . . . . . . . 783 mysql_create_db() . . . . . . . . . . . . . . . . . . . . . . . . . 783 mysql_data_seek() . . . . . . . . . . . . . . . . . . . . . . . . . 784 MYSQL_DEBUG vari avel de ambiente . . . . . . . . . . 346 MYSQL_DEBUG vari avel de ambiente . . . . . . . . . 1076 mysql_debug() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785 MYSQL_DEBUG, vari avel de ambiente . . . . . . . . 1083 mysql_drop_db() . . . . . . . . . . . . . . . . . . . . . . . . . . . 785 mysql_dump_debug_info() . . . . . . . . . . . . . . . . . . 786 mysql_eof() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786 mysql_errno() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788 mysql_error() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788 mysql_escape_string() . . . . . . . . . . . . . . . . . . . . 470 mysql_escape_string() . . . . . . . . . . . . . . . . . . . . 789 mysql_execute() . . . . . . . . . . . . . . . . . . . . . . . . . . . 833 mysql_fetch() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 842 mysql_fetch_field() . . . . . . . . . . . . . . . . . . . . . . . 789 mysql_fetch_field_direct() . . . . . . . . . . . . . . . 791 mysql_fetch_fields() . . . . . . . . . . . . . . . . . . . . . . 790 mysql_fetch_lengths() . . . . . . . . . . . . . . . . . . . . 792 mysql_fetch_row() . . . . . . . . . . . . . . . . . . . . . . . . . 793 MYSQL_FIELD, tipo C . . . . . . . . . . . . . . . . . . . . . . . 773 mysql_field_count() . . . . . . . . . . . . . . . . . . 794, 803 MYSQL_FIELD_OFFSET, tipo C . . . . . . . . . . . . . . . . 773 mysql_field_seek() . . . . . . . . . . . . . . . . . . . . . . . . 795 mysql_field_tell() . . . . . . . . . . . . . . . . . . . . . . . . 795 mysql_free_result() . . . . . . . . . . . . . . . . . . . . . . . 796 mysql_get_client_info() . . . . . . . . . . . . . . . . . . 796 mysql_get_host_info() . . . . . . . . . . . . . . . . . . . . 797 mysql_get_metadata. . . . . . . . . . . . . . . . . . . . . . . . 831 mysql_get_proto_info() . . . . . . . . . . . . . . . . . . . 797 mysql_get_server_info() . . . . . . . . . . . . . . . . . . 797 mysql_get_server_version() . . . . . . . . . . . . . . . 798 MYSQL_HISTFILE vari avel de ambiente . . . . . . 346 MYSQL_HISTFILE, vari avel de ambiente . . . . 1083 MYSQL_HOST, vari avel de ambiemte . . . . . . . . . . 240 MYSQL_HOST, vari avel de ambiente . . . . . . . . . 1083 mysql_info() . . . . . . . . . . . . . . . . . 580, 584, 594, 610 mysql_info() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798 mysql_init() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 799 mysql_insert_id() . . . . . . . . . . . . . . . . . . . . . . . . . . 49 mysql_insert_id() . . . . . . . . . . . . . . . . . . . . . . . . . 799 mysql_insertid DBI, atrinuto . . . . . . . . . . . . . . 882 mysql_kill() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 800 mysql_list_dbs() . . . . . . . . . . . . . . . . . . . . . . . . . . 801 mysql_list_fields() . . . . . . . . . . . . . . . . . . . . . . . 801 mysql_list_processes() . . . . . . . . . . . . . . . . . . . 802 mysql_list_tables() . . . . . . . . . . . . . . . . . . . . . . . 803
mysql_more_results(). . . . . . . . . . . . . . . . . . . . . 822 mysql_next_result(). . . . . . . . . . . . . . . . . . . . . . . 823 mysql_num_fields() . . . . . . . . . . . . . . . . . . . . . . . . 803 mysql_num_rows() . . . . . . . . . . . . . . . . . . . . . . . . . . 805 mysql_options() . . . . . . . . . . . . . . . . . . . . . . . . . . . 805 mysql_param_count() . . . . . . . . . . . . . . . . . . . . . . . 831 mysql_ping() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808 mysql_prepare() . . . . . . . . . . . . . . . . . . . . . . . . . . . 830 MYSQL_PS1, vari avel de ambiente . . . . . . . . . . 1083 MYSQL_PWD vari avel de ambiente . . . . . . . . . . . . 346 MYSQL_PWD, vari avel de ambiente . . . . . . . . . . . 240 MYSQL_PWD, vari avel de ambiente . . . . . . . . . . 1083 mysql_query() . . . . . . . . . . . . . . . . . . . . . . . . . 808, 857 mysql_real_connect() . . . . . . . . . . . . . . . . . . . . . . 809 mysql_real_escape_string() . . . . . . . . . . . . . . . 812 mysql_real_query() . . . . . . . . . . . . . . . . . . . . . . . . 813 mysql_reload() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813 MYSQL_RES, tipo C . . . . . . . . . . . . . . . . . . . . . . . . . . 773 mysql_rollback(). . . . . . . . . . . . . . . . . . . . . . . . . . 822 MYSQL_ROW, tipo C . . . . . . . . . . . . . . . . . . . . . . . . . . 773 mysql_row_seek() . . . . . . . . . . . . . . . . . . . . . . . . . . 814 mysql_row_tell() . . . . . . . . . . . . . . . . . . . . . . . . . . 815 mysql_select_db() . . . . . . . . . . . . . . . . . . . . . . . . . 815 mysql_send_long_data(). . . . . . . . . . . . . . . . . . . 847 mysql_server_end() . . . . . . . . . . . . . . . . . . . . . . . . 856 mysql_server_init() . . . . . . . . . . . . . . . . . . . . . . . 855 mysql_set_sever_option() . . . . . . . . . . . . . . . . . 816 mysql_shutdown() . . . . . . . . . . . . . . . . . . . . . . . . . . 816 mysql_sqlstate() . . . . . . . . . . . . . . . . . . . . . . . . . . 817 mysql_ssl_set() . . . . . . . . . . . . . . . . . . . . . . . . . . . 817 mysql_stat() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818 MYSQL_STMT, tipo C . . . . . . . . . . . . . . . . . . . . . . . . 824 mysql_stmt_affected_rows() . . . . . . . . . . . . . . . 838 mysql_stmt_close() . . . . . . . . . . . . . . . . . . . . . . . . 849 mysql_stmt_data_seek() . . . . . . . . . . . . . . . . . . . 840 mysql_stmt_errno() . . . . . . . . . . . . . . . . . . . . . . . . 850 mysql_stmt_error(). . . . . . . . . . . . . . . . . . . . . . . . 850 mysql_stmt_num_rows() . . . . . . . . . . . . . . . . . . . . 841 mysql_stmt_row_seek() . . . . . . . . . . . . . . . . . . . . 840 mysql_stmt_row_tell() . . . . . . . . . . . . . . . . . . . . 841 mysql_stmt_sqlstate() . . . . . . . . . . . . . . . . . . . . 851 mysql_stmt_store_result() . . . . . . . . . . . . . . . . 839 mysql_store_result() . . . . . . . . . . . . . . . . . 819, 857 MYSQL_TCP_PORT vari avel de ambiente . . . . . . 346 MYSQL_TCP_PORT, variavel de ambiente . . . . . 226 MYSQL_TCP_PORT, vari avel de ambiente . . . . 1083 mysql_thread_end() . . . . . . . . . . . . . . . . . . . . . . . . 854 mysql_thread_id() . . . . . . . . . . . . . . . . . . . . . . . . . 820 mysql_thread_init() . . . . . . . . . . . . . . . . . . . . . . . 854 mysql_thread_safe() . . . . . . . . . . . . . . . . . . . . . . . 855 MYSQL_UNIX_PORT vari avel de ambiente . . . . . 346 MYSQL_UNIX_PORT, vari avel de ambiente . . . . 116 MYSQL_UNIX_PORT, variavel de ambiente . . . . 226 MYSQL_UNIX_PORT, vari avel de ambiente . . . 1083 mysql_use_result() . . . . . . . . . . . . . . . . . . . . . . . . 820
1099
N
NAME, m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . NATIONAL CHAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NATURAL LEFT JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . NATURAL LEFT OUTER JOIN . . . . . . . . . . . . . . . . . . . NATURAL RIGHT JOIN . . . . . . . . . . . . . . . . . . . . . . . . NATURAL RIGHT OUTER JOIN . . . . . . . . . . . . . . . . . . NCHAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NOT BETWEEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NOT IN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NOT LIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NOT logico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NOT REGEXP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . nova linha (\n) . . . . . . . . . . . . . . . . . . . . . . . . . . . . NOW() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NUL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186, NULL, valor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NULLABLE, m etodo DBI . . . . . . . . . . . . . . . . . . . . . . NULLIF() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NUM_OF_FIELDS, m etodo DBI . . . . . . . . . . . . . . . . . NUMERIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NumGeometries() . . . . . . . . . . . . . . . . . . . . . . . . . . . NumInteriorRings() . . . . . . . . . . . . . . . . . . . . . . . . NumPoints() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 485 567 567 567 567 485 507 507 521 508 521 469 541 469 928 472 881 511 881 484 751 750 748
PointOnSurface() . . . . . . . . . . . . . . . . . . . . . . . . . . PolyFromText() . . . . . . . . . . . . . . . . . . . . . . . . . . . . PolyFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . POLYGON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Polygon() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PolygonFromText() . . . . . . . . . . . . . . . . . . . . . . . . . PolygonFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . . POSITION() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . POW() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . POWER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . prepare(), m etodo DBI . . . . . . . . . . . . . . . . . . . . . PRIMARY KEY . . . . . . . . . . . . . . . . . . . . . . . . . . . 601, PROCESSLIST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PURGE MASTER LOGS . . . . . . . . . . . . . . . . . . . . . . . . . .
751 740 741 739 742 740 741 516 526 526 879 609 321 401
Q
QUARTER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 QUOTE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 quote(), m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . 880
R
RADIANS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529 RAND() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 REAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 ref_or_null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435 REGEXP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 Related() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755 RELEASE_LOCK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 RENAME TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611 REPAIR TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 REPEAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770 REPEAT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 REPLACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587 REPLACE ... SELECT . . . . . . . . . . . . . . . . . . . . . . . . 581 REPLACE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 REQUIRE GRANT, op c~ oes . . . . . . . . . . . . . . . . . . . . . 274 RESET MASTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 RESET SLAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406 RESTORE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 restri c~ oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 retorno (\r) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 retorno de carro (\r) . . . . . . . . . . . . . . . . . . . . . . 469 REVERSE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 REVOKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 RIGHT JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 RIGHT OUTER JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 RIGHT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 RLIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 ROLLBACK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46, 614 ROLLBACK TO SAVEPOINT . . . . . . . . . . . . . . . . . . . . . 615 ROLLUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 ROUND() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 rows, m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . 881 RPAD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518 RTRIM() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
O
OCT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 OCTET_LENGTH() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 OLD_PASSWORD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 op c~ oes de configura c~ ao, --with-charset . . . . 99 op c~ oes de configura c~ ao, --with-extra-charset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 op c~ oes de linha de comando . . . . . . . . . . . . . . . . . 208 OPEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768 operadores logicos . . . . . . . . . . . . . . . . . . . . . . . . 508 OPTIMIZE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 OR logico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 OR, operador bin ario . . . . . . . . . . . . . . . . . . . . . . 545 ORD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 ORDER BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609 Overlaps() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754
P
parenteses ( e ) . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 PASSWORD() . . . . . . . . . . . . . . . . . . . 241, 267, 547, 916 PATH, variavel de ambiente . . . . . . . . . . . . . . . . . 92 PATH, vari avel de ambiente . . . . . . . . . . . . . . . 1083 PERIOD_ADD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533 PERIOD_DIFF() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533 PI() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 POINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739 Point() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742 PointFromText() . . . . . . . . . . . . . . . . . . . . . . . . . . . 739 PointFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741 PointN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
1100
S
SAVEPOINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615 SEC_TO_TIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542 SECOND() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533 SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 SELECT INTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765 SELECT INTO TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 SELECT, otimizando . . . . . . . . . . . . . . . . . . . . . . . . 425 SELECT, velocidade do . . . . . . . . . . . . . . . . . . . . . 432 SESSION_USER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546 SET . . . . . . . . . . . . . . . . . . . . . . . . . . 461, 487, 500, 765 SET GLOBAL SQL_SLAVE_SKIP_COUNTER . . . . . . . . 406 SET OPTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 SET PASSWORD, instru c~ oes . . . . . . . . . . . . . . . . . . 267 SET SQL_LOG_BIN . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 SET TRANSACTION . . . . . . . . . . . . . . . . . . . . . . . . . . . 618 SHA() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 SHA1() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 SHOW BINLOG EVENTS . . . . . . . . . . . . . . . . . . . . . . . . 402 SHOW COLUMNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 SHOW CREATE FUNCTION . . . . . . . . . . . . . . . . . . . . . . 764 SHOW CREATE PROCEDURE . . . . . . . . . . . . . . . . . . . . . 764 SHOW CREATE TABLE . . . . . . . . . . . . . . . . . . . . . 303, 323 SHOW DATABASES . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 SHOW FIELDS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 SHOW FUNCTION STATUS . . . . . . . . . . . . . . . . . . . . . . 764 SHOW GRANTS . . . . . . . . . . . . . . . . . . . . . . . . . . . 303, 323 SHOW INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 SHOW KEYS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 SHOW MASTER LOGS . . . . . . . . . . . . . . . . . . . . . . 303, 402 SHOW MASTER STATUS . . . . . . . . . . . . . . . . . . . . 303, 402 SHOW PRIVILEGES . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 SHOW PROCEDURE STATUS . . . . . . . . . . . . . . . . . . . . . 764 SHOW PROCESSLIST . . . . . . . . . . . . . . . . . . . . . . 303, 321 SHOW SLAVE HOSTS . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 SHOW SLAVE STATUS . . . . . . . . . . . . . . . . . . . . . 303, 406 SHOW STATUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 SHOW TABLE STATUS . . . . . . . . . . . . . . . . . . . . . . . . . . 303 SHOW TABLE TYPES . . . . . . . . . . . . . . . . . . . . . . 303, 325 SHOW TABLES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 SHOW VARIABLES . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 SHOW WARNINGS . . . . . . . . . . . . . . . . . . . . . . . . . 303, 323 SIGN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 SIN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 SMALLINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 SOUNDEX() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518 SOUNDS LIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 SPACE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518 SQL_CACHE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627 SQL_NO_CACHE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627 SQRT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 SRID() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746 START SLAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 START TRANSACTION . . . . . . . . . . . . . . . . . . . . . . . . . 614 StartPoint() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749 STD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557 STDDEV() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557 STOP SLAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
STR_TO_DATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . STRAIGHT_JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . STRCMP() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . string, fun c~ oes . . . . . . . . . . . . . . . . . . . . . . . . . . . string, fun c~ oes de compara c~ ao de . . . . . . . . . . SUBDATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SUBSTRING() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SUBSTRING_INDEX() . . . . . . . . . . . . . . . . . . . . . . . . . SUBTIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . subtra c~ ao (-) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SUM() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SymDifference() . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSDATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTEM_USER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
539 567 521 512 519 536 518 519 536 522 556 752 541 546
T
tab (\t) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 Table scan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933 table, m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . . . . 883 table_cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 TAN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 TEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486, 498 threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 TIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485, 495 TIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 TIME_FORMAT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 TIME_TO_SEC() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542 TIMEDIFF() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537 TIMESTAMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484, 491 TIMESTAMP() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 TINYBLOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 TINYINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 TINYTEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 TMPDIR, vari avel de ambiente . . . . . . . . 116, 1083 TO_DAYS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537 Touches() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754 trace DBI, m etodo . . . . . . . . . . . . . . . . . . . . . . . . . . 881 trace, m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . . 1073 TRIM() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 TRUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 TRUNCATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586 TRUNCATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529 type, m etodo DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 TZ, vari avel de ambiente . . . . . . . . . . . . . 926, 1083
U
UCASE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 UDF, fun c~ oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896 ulimit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918 UMASK, variavel de ambiente . . . . . . . . . . . . . . . 920 UMASK, vari avel de ambiente . . . . . . . . . . . . . . 1083 UMASK_DIR, vari avel de ambiente . . . . . 920, 1083 un ario, menos (-) . . . . . . . . . . . . . . . . . . . . . . . . . . 523 UNCOMPRESS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551 UNCOMPRESSED_LENGTH() . . . . . . . . . . . . . . . . . . . . 551
1101
uni~ ao (UNION) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 UNION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 Union() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752 UNIQUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609 UNIX_TIMESTAMP() . . . . . . . . . . . . . . . . . . . . . . . . . . 541 UNLOCK TABLES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616 UNTIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770 UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583 UPPER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 USE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 USE INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563, 568 USE KEY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563, 568 USER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546 USER, vari avel de ambiente . . . . . . . . . . . . . . . . 240 USER, vari avel de ambiente . . . . . . . . . . . . . . . 1083 usu ario, fun c~ oes definidas por . . . . . . . . . . . . 896 UTC_DATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 UTC_TIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 UTC_TIMESTAMP() . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
V
vairaveis de ambiente CXXFLAGS . . . . . . . . . . . . . 99 valores hexadecimais . . . . . . . . . . . . . . . . . . . . . . 471 VARCHAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486, 496 VARCHARACTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 VARIANCE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557 vari aveis de ambiente, CC . . . . . . . . . . . . . . . . . . 98 vari aveis de ambiente, CXX . . . . . . . . . . . . . . . . . 98 Vari aveis de ambiente, LD_RUN_PATH . . . . . . . . 147 vari avel de ambiente CC . . . . . . . . . . . . . . . . . . . 105 Vari avel de ambiente CC . . . . . . . . . . . . . . . . . . 1083 vari avel de ambiente CFLAGS . . . . . . . . . . . . . . . 105 Vari avel de ambiente CFLAGS . . . . . . . . . . . . . . 1083 variavel de ambiente CXX . . . . . . . . . . . . . . . . . . 104 vari avel de ambiente CXX . . . . . . . . . . . . . . . . . . 105 Vari avel de ambiente CXX . . . . . . . . . . . . . . . . . 1083 vari avel de ambiente CXXFLAGS . . . . . . . . . . . . . 105 Vari avel de ambiente CXXFLAGS . . . . . . . . . . . . 1083 vari avel de ambiente DBI_TRACE . . . . . . . . . . . . 882 Vari avel de ambiente DBI_TRACE . . . . . . . . . . . 1083 Vari avel de ambiente DBI_USER . . . . . . . . . . . . 1083 Vari avel de ambiente HOME . . . . . . . . . . . . . . . . 1083 vari avel de ambiente LD_RUN_PATH . . . . . . . . . . 140 Vari avel de ambiente LD_RUN_PATH . . . . . . . . . 1083 Vari avel de ambiente MYSQL_DEBUG . . . . . . . . . 1083 Vari avel de ambiente MYSQL_HISTFILE . . . . . 1083 vari avel de ambiente MYSQL_HOST . . . . . . . . . . . 240 Vari avel de ambiente MYSQL_HOST . . . . . . . . . . 1083
Vari avel de ambiente MYSQL_PS1 . . . . . . . . . . . 1083 vari avel de ambiente MYSQL_PWD . . . . . . . . . . . . 240 Vari avel de ambiente MYSQL_PWD . . . . . . . . . . . 1083 vari avel de ambiente MYSQL_TCP_PORT . . . . . . 226 Vari avel de ambiente MYSQL_TCP_PORT . . . . . 1083 vari avel de ambiente MYSQL_UNIX_PORT . . . . . 226 Vari avel de ambiente MYSQL_UNIX_PORT . . . . . 116, 1083 Vari avel de ambiente PATH . . . . . . . . . . . . . . . . 1083 Vari avel de ambiente TMPDIR . . . . . . . . . . 116, 1083 Vari avel de ambiente TZ . . . . . . . . . . . . . . 926, 1083 Vari avel de ambiente UMASK . . . . . . . . . . . 920, 1083 Vari avel de ambiente UMASK_DIR . . . . . . 920, 1083 vari avel de ambiente USER . . . . . . . . . . . . . . . . . 240 Vari avel de ambiente USER . . . . . . . . . . . . . . . . 1083 vari avel de ambiente, DBI_TRACE . . . . . . . . . . 1073 vari avel de ambiente, HOME . . . . . . . . . . . . . . . . 346 vari avel de ambiente, MYSQL_DEBUG . . . . . . . . . 346 vari avel de ambiente, MYSQL_DEBUG . . . . . . . . 1076 vari avel de ambiente, MYSQL_HISTFILE . . . . . 346 vari avel de ambiente, MYSQL_PWD . . . . . . . . . . . 346 variavel de ambiente, MYSQL_TCP_PORT . . . . . 226 vari avel de ambiente, MYSQL_TCP_PORT . . . . . 346 variavel de ambiente, MYSQL_UNIX_PORT . . . . 226 vari avel de ambiente, MYSQL_UNIX_PORT . . . . 346 vari avel de ambiente, PATH . . . . . . . . . . . . . . . . . 92 VERSION() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
W
WEEK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 WEEKDAY() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 WEEKOFYEAR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532 WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770 Within() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755 without-server op c~ ao . . . . . . . . . . . . . . . . . . . . . . . 97
X
X() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747 XOR, logical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 XOR, operado bin ario . . . . . . . . . . . . . . . . . . . . . . 545
Y
Y() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747 YEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485, 496 YEAR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
1102
Concept Index
--with-raid, erros de liga ca o . . . . . . . . . . . . . . . . 104 APIs, lista de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 945 APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772 APIs, Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877 aplicando, patches . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 argumentos, processando . . . . . . . . . . . . . . . . . . . . 900 aritim eticas, express oes . . . . . . . . . . . . . . . . . . . . . . 522 armazenamento de dados . . . . . . . . . . . . . . . . . . . . 447 armazenamento dos tipos de colunas, exig encias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 arquivo config.cache . . . . . . . . . . . . . . . . . . . . . . . 103 arquivo de op co es . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 arquivo n ao encontrado, mensagem . . . . . . . . . . . 920 arquivo RPM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 arquivo tempor ario, direito de escrita . . . . . . . . . 116 arquivo texto, importando . . . . . . . . . . . . . . . . . . . 368 arquivo, log de atuliaza c ao . . . . . . . . . . . . . . . . . . 374 arquivos de congura ca o . . . . . . . . . . . . . . . . . . . . 254 arquivos de log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 arquivos de log, nomes . . . . . . . . . . . . . . . . . . . . . . 277 arquivos de script . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 arquivos log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Arquivos Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 arquivos my.cnf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 arquivos tmp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 arquivos, config.cache . . . . . . . . . . . . . . . . . . . . . 103 arquivos, limites de tamanho . . . . . . . . . . . . . . . . . 10 arquivos, log binario . . . . . . . . . . . . . . . . . . . . . . . . 375 arquivos, log de consultas . . . . . . . . . . . . . . . . . . . 373 arquivos, log de consultas lentas . . . . . . . . . . . . . 378 arquivos, mensagem de erros . . . . . . . . . . . . . . . . . 328 arquivos, permiss oes . . . . . . . . . . . . . . . . . . . . . . . . 920 arquivos, reparando . . . . . . . . . . . . . . . . . . . . . . . . . 285 arredondamento, erros . . . . . . . . . . . . . . . . . . . . . . 529 arredondamento, erros de . . . . . . . . . . . . . . . . . . . . 483 arvores fonte de desenvolvimento . . . . . . . . . . . . . 100 aspas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 aspas, em string . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 atualiza ca o, log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 atualizando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 atualizando da 4.0 para 4.1 . . . . . . . . . . . . . . . . . . 120 atualizando da vers ao 3.20 para 3.21 . . . . . . . . . 129 atualizando da vers ao 3.21 para 3.22 . . . . . . . . . 128 atualizando da vers ao 3.22 para 3.23 . . . . . . . . . 127 atualizando para uma arquitetura diferente . . . 130 atualizando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . 46 atualizando, 3.23 para 4.0 . . . . . . . . . . . . . . . . . . . 123 atualizando, releases do MySQL . . . . . . . . . . . . . . 84 atualizando, tabela de permiss oes . . . . . . . . . . . . 130 aumentando a performance . . . . . . . . . . . . . . . . . . 413 aumentando a velocidade . . . . . . . . . . . . . . . . . . . . 379 AUTO-INCREMENT, ODBC . . . . . . . . . . . . . . . 875 AUTO INCREMENT . . . . . . . . . . . . . . . . . . . . . . . 202 AUTO_INCREMENT e valores NULL . . . . . . . . . . . . . . 929
A
abertas, tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 abortados, clientes . . . . . . . . . . . . . . . . . . . . . . . . . . 914 abortados, conex ao . . . . . . . . . . . . . . . . . . . . . . . . . 914 abrindo tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 access denied . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 908 accesso negado, erro . . . . . . . . . . . . . . . . . . . . . . . . 908 acesso, controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 acesso, privil egio . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 ACID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 ACID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642 ACLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 ActiveState Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 adicionando conjunto de caracteres . . . . . . . . . . . 328 adicionando fun co es nativas . . . . . . . . . . . . . . . . . 904 adicionando novas fun co es . . . . . . . . . . . . . . . . . . . 895 adicionando novos privil egios de usu arios . . . . . 262 adicionando novos usu arios . . . . . . . . . . . . . . . . . . . 91 adicionando, fun co es denidas por usu ario . . . . 896 adicionando, procedimentos . . . . . . . . . . . . . . . . . 905 administra ca o de servidor . . . . . . . . . . . . . . . . . . . 357 ADO program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 871 agrupando, express oes . . . . . . . . . . . . . . . . . . . . . . . 504 aliases, em cl ausulas GROUP BY . . . . . . . . . . . . . . . 561 aliases, em cl ausulas ORDER BY . . . . . . . . . . . . . . . 561 aliases, em express oes . . . . . . . . . . . . . . . . . . . . . . . 562 aliases, nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 aliases, para express oes . . . . . . . . . . . . . . . . . . . . . . 561 aliases, para tabelas . . . . . . . . . . . . . . . . . . . . . . . . . 563 altera co es de colunas sem aviso . . . . . . . . . . . . . . 606 altera co es na vers ao 4.0 . . . . . . . . . . . . . . . . . . . . . 957 altera co es na vers ao 4.1 . . . . . . . . . . . . . . . . . . . . . 948 altera co es, log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948 altera co es, vers ao 5.0 . . . . . . . . . . . . . . . . . . . . . . . . 948 alterando a localiza ca o do socket . . . . . . . . 119, 925 alterando a ordem das colunas . . . . . . . . . . . . . . . 934 alterando a tabela . . . . . . . . . . . . . . . . . . . . . . . . . . 609 alterando campos . . . . . . . . . . . . . . . . . . . . . . . . . . . 609 alterando localiza c ao do socket . . . . . . . . . . . . . . . . 98 alterando tabelas . . . . . . . . . . . . . . . . . . . . . . . 607, 934 alterando, colunas . . . . . . . . . . . . . . . . . . . . . . . . . . 609 Ano 2000, assuntos referentes ao . . . . . . . . . . . . . 490 an onimo, usu ario . . . . . . . . . . . . . . . . . . . . . . . 241, 261 anonymous user . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 ano onimo, usu ario . . . . . . . . . . . . . . . . . . . . . . . . . . 244 ANSI modo, executando . . . . . . . . . . . . . . . . . . . . . . 42 Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 apagando, usu ario . . . . . . . . . . . . . . . . . . . . . . . . . . 265 API C, fun c oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 API C, problemas com liga ca o . . . . . . . . . . . . . . . 858
Concept Index
1103
B
backup de banco de dados . . . . . . . . . . . . . . 362, 366 backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 backups, banco de dados . . . . . . . . . . . . . . . . . . . . 278 banco de dados, backups . . . . . . . . . . . . . . . . . . . . 276 banco de dados, criando . . . . . . . . . . . . . . . . . . . . . 173 banco de dados, deletando . . . . . . . . . . . . . . . . . . . 596 banco de dados, descarregando . . . . . . . . . . 362, 366 banco de dados, exibindo . . . . . . . . . . . . . . . . . . . . 370 banco de dados, informa co es sobre . . . . . . . . . . . 193 banco de dados, links simb olicos . . . . . . . . . . . . . 467 banco de dados, projetos . . . . . . . . . . . . . . . . . . . . 447 banco de dados, replicando . . . . . . . . . . . . . . . . . . 379 banco de dados, selecionando . . . . . . . . . . . . . . . . 174 banco de dados, usando . . . . . . . . . . . . . . . . . . . . . 173 bancos de dados relacionais, deni ca o . . . . . . . . . . 4 bancos de dados, nomes . . . . . . . . . . . . . . . . . . . . . 472 barra invertida, caracter de escape . . . . . . . . . . . 469 batch, modo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 batch, mysql option . . . . . . . . . . . . . . . . . . . . . . . . 348 BDB, tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 BDB, tipo de tabela . . . . . . . . . . . . . . . . . . . . . . . . . . 629 benchmark, pacote . . . . . . . . . . . . . . . . . . . . . . . . . . 422 benchmarks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 BerkeleyDB, tipo de tabela . . . . . . . . . . . . . . . . . . 629 biblioteca do servidor embutido MySQL . . . . . . 860 biblioteca mysqlclient . . . . . . . . . . . . . . . . . . . . . . 772 bibliotecas, lista de . . . . . . . . . . . . . . . . . . . . . . . . . 944 Big5 Chinese, codica ca o de caracteres . . . . . . . 926 binario, log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 BitKeeper, arvores . . . . . . . . . . . . . . . . . . . . . . . . . . 100 BLOB , valores padr oes em campos . . . . . . . . . . . . 498 BLOB, indexando colunas . . . . . . . . . . . . . . . . . . . . . 602 BLOB, inserindo dados bin arios . . . . . . . . . . . . . . . 470 BLOB, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 blocking_queries, op ca o do mysqlcc option . . 355 Borland Builder 4 . . . . . . . . . . . . . . . . . . . . . . . . . . 872 Borland C++, compilador . . . . . . . . . . . . . . . . . . . . 884 buer de cliente, tamanho . . . . . . . . . . . . . . . . . . . 772 bugs, banco de dados . . . . . . . . . . . . . . . . . . . . . . . . 36 bugs, conhecidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 bugs, relatando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 bugs.mysql.com . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
C
C API, tipos de dados . . . . . . . . . . . . . . . . . . . . . . 772 C++ Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 874 C++, APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 C++, compilador gcc . . . . . . . . . . . . . . . . . . . . . . . . . 98 C, fun co es de instru co es preparadas da API . . . 827 cache de tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 caches, limpando . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 c alculo de datas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 campos, alterando . . . . . . . . . . . . . . . . . . . . . . . . . . 609 campos, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 caracteres de escape . . . . . . . . . . . . . . . . . . . . . . . . 469 caracteres multi-byte . . . . . . . . . . . . . . . . . . . . . . . . 331
caracteres, conjunto de . . . . . . . . . . . . . . . . . . 99, 326 carregando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . 177 case sensitivo, em verica ca o de acesso . . . . . . . 235 caso sensitivo nos nomes . . . . . . . . . . . . . . . . . . . . 473 caso sensitivo, de nomes de bancos de dados . . . 44 caso sensitivo, de nomes de tabelas . . . . . . . . . . . . 44 caso-sensitivito, em pesquisas . . . . . . . . . . . . . . . . 926 caso-sensitivo, em compara ca o de string . . . . . . 520 cast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522 casts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 certica ca o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 ChangeLog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948 changes, version 3.19 . . . . . . . . . . . . . . . . . . . . . . . 1067 changes, version 3.20 . . . . . . . . . . . . . . . . . . . . . . . 1060 changes, version 3.21 . . . . . . . . . . . . . . . . . . . . . . . 1047 changes, version 3.22 . . . . . . . . . . . . . . . . . . . . . . . 1033 changes, version 3.23 . . . . . . . . . . . . . . . . . . . . . . . . 991 character-sets-dir, op ca o mysql . . . . . . . . . . . 348 chaves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450 chaves estrangeiras . . . . . . . . . . . . . . . . . . 50, 199, 610 chaves multi-column . . . . . . . . . . . . . . . . . . . . . . . . 451 chaves prim arias, deletando . . . . . . . . . . . . . . . . . . 609 chaves, pesquisando em duas . . . . . . . . . . . . . . . . 201 cheio, disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 924 Chinese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926 citando dados bin arios . . . . . . . . . . . . . . . . . . . . . . 470 cliente, depurando . . . . . . . . . . . . . . . . . . . . . . . . . 1076 clientes em threads . . . . . . . . . . . . . . . . . . . . . . . . . 859 clientes, construindo clientes . . . . . . . . . . . . . . . . . 858 coer ca o, operadores . . . . . . . . . . . . . . . . . . . . . . . . . 522 colchetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 ColdFusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872 colunas alterando . . . . . . . . . . . . . . . . . . . . . . . . . . . 609 colunas, alterando . . . . . . . . . . . . . . . . . . . . . . . . . . 934 colunas, exibindo . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 colunas, exig encias de armazenamento . . . . . . . . 502 colunas, indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450 colunas, nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 colunas, outros tipos . . . . . . . . . . . . . . . . . . . . . . . . 502 colunas, selecionado . . . . . . . . . . . . . . . . . . . . . . . . . 180 comandos fora de sincronia . . . . . . . . . . . . . . . . . . 916 comandos SQL, replica ca o do master . . . . . . . . . 401 comandos SQL, replica ca o do slave . . . . . . . . . . . 402 comandos, lista de . . . . . . . . . . . . . . . . . . . . . . . . . . 351 comandos, para a distribui ca o bin aria . . . . . . . . . 91 comandos, replica ca o do master . . . . . . . . . . . . . . 401 comandos, replica ca o do slave . . . . . . . . . . . . . . . . 402 comandos, sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 combina ca o de padr oes . . . . . . . . . . . . . . . . . . . . . . 186 coment arios de colunas . . . . . . . . . . . . . . . . . . . . . . 601 coment arios, adicionando . . . . . . . . . . . . . . . . . . . . 479 coment arios, iniciando . . . . . . . . . . . . . . . . . . . . . . . . 51 comercial, tipos de suporte . . . . . . . . . . . . . . . . . . . 17 compactadas, tabelas . . . . . . . . . . . . . . . . . . . 337, 634 companias colaboradoras, lista de . . . . . . . . . . . . 946 compara ca o de string, case-sensitivo . . . . . . . . . . 520 Compatibilidade com o Ano 2000 . . . . . . . . . . . . . 11 compatibilidade com ODBC . . . . . . . . . . . . . 505, 506
1104
compatibilidade com Oracle . . . . . . . . . . . . . . . . . 614 Compatibilidade com Oracle . . . . . . . . . . . . . . . . . . 44 compatibilidade com Sybase . . . . . . . . . . . . . . . . . 613 compatibilidade entre as vers oes do MySQL . . 120, 123 compatibilidade entre vers oes do MySQL . . . . 127, 128 compatibilidade padr oes . . . . . . . . . . . . . . . . . . . . . . 41 compatibilidade, com ODBC . . . 473, 483, 567, 600 compatibilidade, com Oracle . . . . . . . . . . . . . 44, 557 compatibilidade, com padr ao SQL . . . . . . . . . . . . . 41 compatibilidade, com PostgreSQL . . . . . . . . . . . . . 45 compatibilidade, with mSQL . . . . . . . . . . . . . . . . 521 compatibilidade, Y2K . . . . . . . . . . . . . . . . . . . . . . . . 11 compatibility, with ODBC . . . . . . . . . . . . . . . . . . 1054 compila ca o, otimizando . . . . . . . . . . . . . . . . . . . . . 454 compila ca o, velocidade . . . . . . . . . . . . . . . . . . . . . . 457 compilador C++ n ao pode criar execut aveis . . . 104 compilador, C++ gcc . . . . . . . . . . . . . . . . . . . . . . . . . 98 compilando fun co es denidas por usu arios . . . . 902 compilando no Windows . . . . . . . . . . . . . . . . . . . . 134 compilando, estaticamente . . . . . . . . . . . . . . . . . . . . 98 compilando, problemas . . . . . . . . . . . . . . . . . . . . . . 103 compress, op ca o do mysqlcc . . . . . . . . . . . . . . . . . 356 compress, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . 348 concedendo privl egios . . . . . . . . . . . . . . . . . . . . . . . 255 Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765 conectando ao servidor . . . . . . . . . . . . . . . . . 169, 239 conectando remotamente com SSH . . . . . . . . . . . 133 conectando, verica ca o . . . . . . . . . . . . . . . . . . . . . . 240 Conector/ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . 866 conex ao abortada . . . . . . . . . . . . . . . . . . . . . . . . . . . 914 confgurando senhas . . . . . . . . . . . . . . . . . . . . . . . . . 267 cong.cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 congura ca o p os-instala ca o . . . . . . . . . . . . . . . . . . 111 congura ca o, op co es de . . . . . . . . . . . . . . . . . . . . . . . 97 configure, executando depois da invoca ca o anterior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 configure, script . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Conjunto de caracteres . . . . . . . . . . . . . . . . . . . . . . 707 conjunto de caracteres, adicionando . . . . . . . . . . 328 connect_timeout variable . . . . . . . . . . . . . . . . . . . 357 connect_timeout, vari avel . . . . . . . . . . . . . . . . . . . 350 connection_name, op ca o do mysqlcc . . . . . . . . . 356 Connector/J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876 constante, tabela . . . . . . . . . . . . . . . . . . . . . . . 426, 433 construindo programs clientes . . . . . . . . . . . . . . . . 858 consultas lentas, log . . . . . . . . . . . . . . . . . . . . . . . . . 378 consultas, estimando performance . . . . . . . . . . . . 432 consultas, exemplos . . . . . . . . . . . . . . . . . . . . . . . . . 196 consultas, fazendo . . . . . . . . . . . . . . . . . . . . . . . . . . 170 consultas, log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 consultas, projeto de Estudo de G emeos . . . . . . 203 consultas, velocidade . . . . . . . . . . . . . . . . . . . . . . . . 424 consultoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 contando registros em uma tabela . . . . . . . . . . . . 189 contatos, informa ca o . . . . . . . . . . . . . . . . . . . . . . . . . 15 controle de acesso . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
conven co es tipogr acas . . . . . . . . . . . . . . . . . . . . . . . . 2 conven co es, tipogr acas . . . . . . . . . . . . . . . . . . . . . . . 2 copiando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599 copyrights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 crackers, seguran ca contra . . . . . . . . . . . . . . . . . . . 230 crash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1070 crash-me . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 crash-me, programa . . . . . . . . . . . . . . . . . . . . 420, 422 criando banco de dados . . . . . . . . . . . . . . . . . . . . . 173 criando op co es de inicializa ca o padr ao . . . . . . . . 217 criando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 criando, relat orios de bug . . . . . . . . . . . . . . . . . . . . . 36 criptograa de senha, reversibilidade . . . . . . . . . 547 Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 custos de suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 cvs, arvore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
D
dados, carregando em tabelas . . . . . . . . . . . . . . . . 177 dados, conjunto de caracteres . . . . . . . . . . . . . . . . 326 dados, importando . . . . . . . . . . . . . . . . . . . . . . . . . . 368 dados, recuperando . . . . . . . . . . . . . . . . . . . . . . . . . 178 dados, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 Data e Hora, Tipos . . . . . . . . . . . . . . . . . . . . . . . . . 489 data, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 database, op ca o do mysqlcc . . . . . . . . . . . . . . . . . 356 database, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . 348 DataJunction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872 datas, calculando . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 date values, problems . . . . . . . . . . . . . . . . . . . . . . . 495 DATE, problemas com coluna . . . . . . . . . . . . . . . 927 DBI Perl, modulo . . . . . . . . . . . . . . . . . . . . . . . . . . . 877 DBI, interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877 DBI/DBD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 DBUG, pacote . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1076 debug, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . . 348 debug-info, op ca o mysql . . . . . . . . . . . . . . . . . . . . 350 default-character-set, op ca o mysql . . . . . . . . 348 deni ca o, bancos de dados . . . . . . . . . . . . . . . . . . . . . 4 delayed insert limit . . . . . . . . . . . . . . . . . . . . . . . . . 582 dele ca o, mysql.sock . . . . . . . . . . . . . . . . . . . . . . . . 925 deletando chaves prim arias . . . . . . . . . . . . . . . . . . 609 deletando fun co es . . . . . . . . . . . . . . . . . . . . . . . . . . . 896 deletando indices . . . . . . . . . . . . . . . . . . . . . . . 609, 613 deletando linhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 929 deletando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . 611 deletando usu ario . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 deletando usu arios . . . . . . . . . . . . . . . . . . . . . . . . . . 265 deletando, banco de dados . . . . . . . . . . . . . . . . . . . 596 Delphi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 873 depurando o cliente . . . . . . . . . . . . . . . . . . . . . . . . 1076 depurando o servidor . . . . . . . . . . . . . . . . . . . . . . 1070 derived tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574 desatualizando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 descarregando banco de dados . . . . . . . . . . . 362, 366 descarregando tabelas . . . . . . . . . . . . . . . . . . . . . . . 178 desconectando do servidor . . . . . . . . . . . . . . . . . . . 169
Concept Index
1105
desenvolvedores, lista de . . . . . . . . . . . . . . . . . . . . . 936 desligando o server . . . . . . . . . . . . . . . . . . . . . . . . . . 113 dicas, otimiza ca o . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 digitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 din amicas, tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . 634 direito de escrita no tmp . . . . . . . . . . . . . . . . . . . . 116 disco cheio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 924 disco, detalhes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 discos, dividindo dados entre . . . . . . . . . . . . . . . . 133 display, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 distribui ca o bin aria do MySQL . . . . . . . . . . . . . . . 80 distribui ca o bin aria, instalando . . . . . . . . . . . . . . . 91 distribui ca o binaria, on HP-UX . . . . . . . . . . . . . . 153 distribui ca o fontes do MySQL . . . . . . . . . . . . . . . . 80 distribui co es bin arias . . . . . . . . . . . . . . . . . . . . . . . . . 86 distribui co es bin arias no Linux . . . . . . . . . . . . . . . 141 distribui co es fontes, instalando . . . . . . . . . . . . . . . . 94 DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460 download, fazendo . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
E
Eiel Wrapper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884 emprego com MySQL . . . . . . . . . . . . . . . . . . . . . . . . 15 emprego, informa ca o para contatos . . . . . . . . . . . . 15 enable-named-commands, op c ao mysql . . . . . . . . 349 endere co da mailing list . . . . . . . . . . . . . . . . . . . . . . . 2 endere co eletr onico, para suporte ` a clientes . . . . 40 entre aspas, string . . . . . . . . . . . . . . . . . . . . . . . . . . 880 ENUM, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 Errcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 errno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 erro de aceeso negado . . . . . . . . . . . . . . . . . . . . . . . 908 erros comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907 erros conhecidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 erros de arredondamento; . . . . . . . . . . . . . . . . . . . . 529 erros de liga c ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918 erros internos de compila c ao . . . . . . . . . . . . . . . . . 103 erros, checksum error . . . . . . . . . . . . . . . . . . . . . . . 145 erros, conhecidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 erros, directory checksum error . . . . . . . . . . . . . . 145 erros, linguagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 erros, lista de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 908 erros, relatando . . . . . . . . . . . . . . . . . . . . . . . . . . . 2, 36 erros, relat orios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 erros, tartamento para UDFs . . . . . . . . . . . . . . . . 902 erros, vericando tabelas . . . . . . . . . . . . . . . . . . . . 289 escolhendo tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 escolhendo, uma vers ao do MySQL . . . . . . . . . . . . 80 espa co de armazenamento, minimizando . . . . . . 447 Espa co, Exten cao no MySQL . . . . . . . . . . . . . . . . 730 estabilidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 estaticamente, compilando . . . . . . . . . . . . . . . . . . . . 98 estimando performance de consultas . . . . . . . . . . 432 estrangeiras, chaves . . . . . . . . . . . . . . . . . . . . . . 50, 199 estrutura de diret orio, padr ao . . . . . . . . . . . . . . . . . 83 Estudos de G emeos, consultas . . . . . . . . . . . . . . . 203 etiqueta para a rede . . . . . . . . . . . . . . . . . . . . . . 35, 41
Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872 executando configure depois da invoca ca o priorit aria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 executando consultas . . . . . . . . . . . . . . . . . . . . . . . . 170 executando m ultiplos servidores . . . . . . . . . . . . . . 220 executando um servidor web . . . . . . . . . . . . . . . . . . 19 executando, modo ANSI . . . . . . . . . . . . . . . . . . . . . . 42 executando, modo batch . . . . . . . . . . . . . . . . . . . . . 194 execute, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . 348 exemplos de consultas . . . . . . . . . . . . . . . . . . . . . . . 196 exemplos de saida do myisamchk . . . . . . . . . . . . . 294 exemplos, tabelas compactadas . . . . . . . . . . . . . . 339 exibindo informa ca o de banco de dados . . . . . . . 370 express ao, aliases . . . . . . . . . . . . . . . . . . . . . . . . . . . 561 express oes extendidas . . . . . . . . . . . . . . . . . . . . . . . 186 express oes regulares, sintaxe . . . . . . . . . . . . . . . . 1084 express oes, aliases . . . . . . . . . . . . . . . . . . . . . . . . . . 562 extens oes ao, padr ao SQL . . . . . . . . . . . . . . . . . . . . 41 extraindo datas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
F
falhas repetidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 921 falhas, recupera ca o . . . . . . . . . . . . . . . . . . . . . . . . . 288 fatal signal 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 fazendo consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 fazendo parceria com a MySQL AB . . . . . . . . . . . 15 fechando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 ferramenta de clientes . . . . . . . . . . . . . . . . . . . . . . . 772 ferramenta de linha de comando . . . . . . . . . . . . . 347 ferramentas, mysqld multi . . . . . . . . . . . . . . . . . . . 334 ferramentas, mysqld safe . . . . . . . . . . . . . . . . . . . . 332 ferramentas, safe mysqld . . . . . . . . . . . . . . . . . . . . 332 ush tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 force, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . . 348 foreign key, restri ca o . . . . . . . . . . . . . . . . . . . . . . . . . 52 foreign keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 FreeBSD, resolvendo problemas . . . . . . . . . . . . . . 105 full-text, pesquisa . . . . . . . . . . . . . . . . . . . . . . . . . . . 618 FULLTEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618 fun co es bin arias, exemplos . . . . . . . . . . . . . . . . . . . 202 fun co es de data, compatibilidade Y2K . . . . . . . . . 11 fun co es denidas por usu ario, adicionando . . . . 895 fun co es denidas por usu arios, adicionado . . . . 896 fun co es nativas, adicionando . . . . . . . . . . . . . . . . . 904 fun co es para cl ausulas SELECT e WHERE . . . . . . . . 504 fun co es, agrupando . . . . . . . . . . . . . . . . . . . . . . . . . 504 fun co es, API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 fun co es, deletando . . . . . . . . . . . . . . . . . . . . . . . . . . 896 fun co es, instru co es preparadas da API C . . . . . 827 fun co es, novas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 895 fuso hor ario, problemas . . . . . . . . . . . . . . . . . . . . . 926
1106
G
gcc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 gdb, usando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1072 General Public License . . . . . . . . . . . . . . . . . . . . . . . . 4 General Public License, MySQL . . . . . . . . . . . . . . 18 geoespacial, recurso . . . . . . . . . . . . . . . . . . . . . . . . . 730 geogr acos, reucursos . . . . . . . . . . . . . . . . . . . . . . . 730 geometria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 730 GIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 730 globais, privil egios . . . . . . . . . . . . . . . . . . . . . . . . . . 255 GPL, Licen ca Publica Geral . . . . . . . . . . . . . . . . 1087 GPL, Licen ca P ublica Geral do GNU . . . . . . . 1087 GPL, MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 graphical tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 gratis, licensiamento . . . . . . . . . . . . . . . . . . . . . . . . . 19 GROUP BY, aliases em . . . . . . . . . . . . . . . . . . . . . . . . 561 GROUP BY, extens oes ao padr ao SQL . . . . . . . . . . 565 GROUP BY, extens oes para o padr ao SQL . . . . . . 561 GUI tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
H
Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766 HEAP, tipo de tabela . . . . . . . . . . . . . . . . . . . . . . . . . 629 help, op ca o do mysqlcc . . . . . . . . . . . . . . . . . . . . . 355 help, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . . . 348 hints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43, 564 hist oria do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 hist orico, arquivo de . . . . . . . . . . . . . . . . . . . . . . . . 346 history_size, op ca o do mysqlcc . . . . . . . . . . . . 356 hora, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 host, op ca o do mysql . . . . . . . . . . . . . . . . . . . . . . . 356 host, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . . . 349 host, tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 HP-UX, distribui ca o binaria . . . . . . . . . . . . . . . . . 153 html, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . . . 349
inicializa ca o, par ametros . . . . . . . . . . . . . . . . . . . . 455 inicializando o servidor automaticamente . . . . . 118 iniciando o mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . 919 iniciando o servidor . . . . . . . . . . . . . . . . . . . . . . . . . 111 iniciando v arios servidores . . . . . . . . . . . . . . . . . . . 220 iniciando, coment arios . . . . . . . . . . . . . . . . . . . . . . . . 51 InnoDB, tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 InnoDB, tipo de tabela . . . . . . . . . . . . . . . . . . . . . . 629 inser ca o, velocidade . . . . . . . . . . . . . . . . . . . . . . . . . 439 INSERT DELAYED . . . . . . . . . . . . . . . . . . . . . . . . 581 instala ca o de pacotes, Mac OS X PKG . . . . . . . . 71 instala ca o, layouts de . . . . . . . . . . . . . . . . . . . . . . . . 83 instala ca o, vis ao geral . . . . . . . . . . . . . . . . . . . . . . . . 60 instalando o Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 instalando, distribui ca o bin aria . . . . . . . . . . . . . . . 91 instalando, distribui co es fontes . . . . . . . . . . . . . . . . 94 instalando, pacotes RPM do Linux . . . . . . . . . . . . 69 instalando, Perl no Windows . . . . . . . . . . . . . . . . 166 installing, fun co es denidas por usu arios . . . . . . 902 inteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 internals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 892 Internet Relay Chat . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Internet Service Providers . . . . . . . . . . . . . . . . . . . . 19 interno, travamento . . . . . . . . . . . . . . . . . . . . . . . . . 444 IRC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 ISAM, tipo de tabela . . . . . . . . . . . . . . . . . . . . . . . . . 629 ISP servi cos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
J
Java, conectividade . . . . . . . . . . . . . . . . . . . . . . . . . 876 JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
K
key space, MyISAM . . . . . . . . . . . . . . . . . . . . . . . . . 632 keys, foreign . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
I
ID u nico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858 idade, calculando . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 ignore-space, mysql option . . . . . . . . . . . . . . . . . 349 importando dados . . . . . . . . . . . . . . . . . . . . . . . . . . 368 indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 indices e colunas BLOB . . . . . . . . . . . . . . . . . . . . . . . 602 ind ices e colunas TEXT . . . . . . . . . . . . . . . . . . . . . . . 602 ind ices e IS NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . 450 indices e valores NULL . . . . . . . . . . . . . . . . . . . . . . . 602 indices multi-coluna . . . . . . . . . . . . . . . . . . . . . . . . . 451 indices multi-parte . . . . . . . . . . . . . . . . . . . . . . . . . . 612 indices, colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450 indices, deletando . . . . . . . . . . . . . . . . . . . . . . 609, 613 indices, e LIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 indices, nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 indices, prexo mais a esquerda de . . . . . . . . . . . 449 indices, tamanho de blocos . . . . . . . . . . . . . . . . . . 315 ind ices, uso de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 informa co es gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
L
layouts de instala ca o . . . . . . . . . . . . . . . . . . . . . . . . . 83 libmysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860 Licen ca P ublica Geral (GPL) . . . . . . . . . . . . . . . . . . 4 licen cas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 licenciamento, custo . . . . . . . . . . . . . . . . . . . . . . . . . . 17 licenciamento, exemplos . . . . . . . . . . . . . . . . . . . . . . 18 licenciamento, gratis . . . . . . . . . . . . . . . . . . . . . . . . . 19 licenciamento, informa ca o para contatos . . . . . . . 15 licenciamento, pol iticas . . . . . . . . . . . . . . . . . . . . . . . 18 licenciamento, termos . . . . . . . . . . . . . . . . . . . . . . . . 16 liga ca o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858 liga ca o, erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918 liga ca o, velocidade . . . . . . . . . . . . . . . . . . . . . . . . . . 457 limita co es de projeto . . . . . . . . . . . . . . . . . . . . . . . . 419 limites, tamanho de arquivo . . . . . . . . . . . . . . . . . . 10 limpando caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 linga ca o, problemas com . . . . . . . . . . . . . . . . . . . . 858 l inguas, suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Concept Index
1107
linha de comando, ferramentas . . . . . . . . . . . . . . . 347 linha de comando, hist orico . . . . . . . . . . . . . . . . . . 346 linha de comando, op ca o mysql . . . . . . . . . . . . . . 348 linha de comando, op co es . . . . . . . . . . . . . . . . . . . 208 linha de comando, op co es, mysqlcc . . . . . . . . . . . 355 linhas, deletando . . . . . . . . . . . . . . . . . . . . . . . . . . . 929 links simb olicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 links symbolicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Linux, distribui ca o bin arias . . . . . . . . . . . . . . . . . . 141 lista de colaboradores . . . . . . . . . . . . . . . . . . . . . . . 939 lista de discuss ao MySQL . . . . . . . . . . . . . . . . . . . . 33 listas de discuss ao . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 listas de email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 listas de mensagens, guias . . . . . . . . . . . . . . . . . . . . 41 listas de mensagens, localiza ca o dos arquivos . . . 35 literais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 local-infile . . . . . . . . . . . . . . . . . . . . . . . . . . 350, 357 localiza ca o padr ao da instala ca o . . . . . . . . . . . . . . 83 lock de tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 lock de, registro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454 log, altera co es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948 log, arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97, 378 logomarcas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
M
Mac OS X, instala ca o . . . . . . . . . . . . . . . . . . . . . . . . 71 make_binary_distribution . . . . . . . . . . . . . . . . . 332 mantendo, arquivos de log . . . . . . . . . . . . . . . . . . . 378 manual, conven co es tipogr acas . . . . . . . . . . . . . . . . 2 manual, formatos dispon iveis . . . . . . . . . . . . . . . . . . 2 manual, online location . . . . . . . . . . . . . . . . . . . . . . . . 2 manuten ca o, tabelas . . . . . . . . . . . . . . . . . . . . . . . . 293 marcas registradas . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 master/slave, congura ca o . . . . . . . . . . . . . . . . . . . 380 max memory used . . . . . . . . . . . . . . . . . . . . . . . . . . 358 max_allowed_packet . . . . . . . . . . . . . . . . . . . 350, 357 max_join_size . . . . . . . . . . . . . . . . . . . . . . . . . 350, 357 MBR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753 mem oria virtual, problemas quando compilando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 memoria, uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458 memory use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 mensagem de erro, exibindo . . . . . . . . . . . . . . . . . 372 mensagem de erro, linguagem . . . . . . . . . . . . . . . . 328 mensagens de erro, arquivo n ao encontrado . . . 920 MERGE, deni ca o de tabelas . . . . . . . . . . . . . . . . 637 MERGE, tipo de tabela . . . . . . . . . . . . . . . . . . . . . . . . 629 meta caracteres, e LIKE . . . . . . . . . . . . . . . . . . . . . 449 meta caracteres, na tabela mysql.columns_priv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 meta caracteres, na tabela mysql.db . . . . . . . . . 244 meta caracteres, na tabela mysql.host . . . . . . . 244 meta caracteres, na tabela mysql.tables_priv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 metacaracteres, na tabela mysql.user . . . . . . . . 240 m etodos, travamento . . . . . . . . . . . . . . . . . . . . . . . 1078
Minimum Bounding Rectangle . . . . . . . . . . . . . . . 753 MIT-pthreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 modo ANSI, executando . . . . . . . . . . . . . . . . . . . . . . 42 modo batch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 m odulos, lista dos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 monitor, terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 mostrando informa co es de banco de dados . . . . 370 mostrando, informa co es, SHOW . . . . . . . . . . . . . . . . 304 mostrando, status da tabela . . . . . . . . . . . . . . . . . 305 mSQL compatibilidade . . . . . . . . . . . . . . . . . . . . . . 521 msql2mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 mudan ca de privil egios . . . . . . . . . . . . . . . . . . . . . . 246 multi mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 multi-byte, caracteres . . . . . . . . . . . . . . . . . . . . . . . 331 multi-byte, conjunto de caracteres . . . . . . . . . . . . 917 multi-colunas, indices . . . . . . . . . . . . . . . . . . . . . . . 451 multi-parte, indice . . . . . . . . . . . . . . . . . . . . . . . . . . 612 m ultiplos servidores . . . . . . . . . . . . . . . . . . . . . . . . . 220 My, deriva ca o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 my.cnf, arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 MyISAM, tabelas compactadas . . . . . . . . . . 337, 634 MyISAM, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . 503 MyISAM, tipo de tabela . . . . . . . . . . . . . . . . . . . . . . 629 myisamchk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100, 332 myisamchk, exemplos de sa ida . . . . . . . . . . . . . . . 294 myisamchk, op co es . . . . . . . . . . . . . . . . . . . . . . . . . . 283 myisampack . . . . . . . . . . . . . . . . . . . . . . . 337, 607, 634 MyODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866 MyODBC, relatando problemas . . . . . . . . . . . . . . 875 mysladmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346, 347 MySQL AB, deni ca o . . . . . . . . . . . . . . . . . . . . . . . . 12 MySQL, certica ca o . . . . . . . . . . . . . . . . . . . . . . . . . 14 MySQL, consultoria . . . . . . . . . . . . . . . . . . . . . . . . . . 14 MySQL, deni co es . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 MySQL, hist oria do . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 MySQL, introdu ca o . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 mysql, op ca o de linha de comando . . . . . . . . . . . 348 MySQL, pron uncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 MySQL, tipo de tabelas . . . . . . . . . . . . . . . . . . . . . 629 MySQL, treinamento . . . . . . . . . . . . . . . . . . . . . . . . . 14 MYSQL, vers ao do . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 mysql.sock, alterando localiza ca o do . . . . . . . . . . . 98 mysql.sock, prote ca o . . . . . . . . . . . . . . . . . . . . . . . 925 mysql_fix_privilege_tables . . . . . . . . . . . . . . . 251 mysql_install_db . . . . . . . . . . . . . . . . . . . . . . . . . . 332 mysql_install_db, script . . . . . . . . . . . . . . . . . . . 115 mysqlaccess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 mysqladmin . . . . . . . . . . 300, 302, 306, 347, 596, 597 mysqlbinlog . . . . . . . . . . . . . . . . . . . . . . . . . . . 347, 359 mysqlbug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 mysqlcc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347, 355 mysqlcc, op co es de linha de comando . . . . . . . . 355 mysqlclient, biblioteca . . . . . . . . . . . . . . . . . . . . . 772 mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 mysqld , tamanho de buer do servidor . . . . . . . 455 mysqld, iniciando . . . . . . . . . . . . . . . . . . . . . . . . . . . 919 mysqld, op co es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
1108
mysqld-max . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mysqld_multi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mysqld_safe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mysqldump . . . . . . . . . . . . . . . . . . . . . . . . 131, 347, mysqlimport . . . . . . . . . . . . . . . . . . 131, 347, 368, mysqlshow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mysqltest, Programa de Tste do MySQL . . . . .
O
O que e criptograa? . . . . . . . . . . . . . . . . . . . . . . . . 269 O que e um X509/Certicado? . . . . . . . . . . . . . . . 269 objetivos do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . 5 obtendo o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866 ODBC compatibilidade . . . . . . . . . . . . . . . . . . . . . 567 ODBC compatibility . . . . . . . . . . . . . . . . . . . . . . . 1054 ODBC, administrador . . . . . . . . . . . . . . . . . . . . . . . 867 ODBC, compatibilidade . . . . . . . . . . . . 473, 483, 600 ODBC, compatibilidade com . . . . . . . . . . . . 505, 506 odbcadmin program . . . . . . . . . . . . . . . . . . . . . . . . 873 one-database, mysql option . . . . . . . . . . . . . . . . . 349 online location of manual . . . . . . . . . . . . . . . . . . . . . . 2 op ca o cong-le . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 op ca o congure, with-low-memory . . . . . . . . . . 103 op ca o de linha de comando mysql . . . . . . . . . . . . 348 op ca o example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 op ca o help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 op ca o log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 op ca o mysqladmin . . . . . . . . . . . . . . . . . . . . . . . . . . 335 op ca o mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 op ca o no-log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 op ca o password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 op ca o tcp-ip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 op ca o user . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 op ca o version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 op ca oes de inicializa ca o, padr ao . . . . . . . . . . . . . . 217 op co es de linha de comando, mysqlcc . . . . . . . . 355 op co es de reparo, myisamchk . . . . . . . . . . . . . . . . 285 op co es de verica ca , myisamchk . . . . . . . . . . . . . 284 op coes frornecidas pelo MySQL . . . . . . . . . . . . . . 169 op co es mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 op co es padr oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 op co es, congura ca o . . . . . . . . . . . . . . . . . . . . . . . . . 97 op co es, myisamchk . . . . . . . . . . . . . . . . . . . . . . . . . . 283 op co es, replica ca o . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 Open Source, deni ca o . . . . . . . . . . . . . . . . . . . . . . . . 4 open tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 OpenGIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 730 opens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 OpenSSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 opera co es aritim eticas . . . . . . . . . . . . . . . . . . . . . . . 522 operadores de coer c ao . . . . . . . . . . . . . . . . . . . . . . . 522 optimiza co es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 optimizando, tabelas . . . . . . . . . . . . . . . . . . . . . . . . 292 Oracle, compatibilidade . . . . . . . . . . . . . . . . . 557, 614 ordena ca o, conjunto de caracteres . . . . . . . . . . . . 326 ordenando dados . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 ordenando registros de tabelas . . . . . . . . . . . . . . . 181 ordenando strings . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 ordenando tabela de permiss oes . . . . . . . . . 242, 244 ORDER BY, aliases em . . . . . . . . . . . . . . . . . . . . . . . . 561 otimiza ca o, dicas . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 otimizando DISTINCT . . . . . . . . . . . . . . . . . . . . . . 435 otimizando, LEFT JOIN . . . . . . . . . . . . . . . . . . . . 436 otimizando, LIMIT . . . . . . . . . . . . . . . . . . . . . . . . . 438
N
named pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 n ao delimitadas, strings . . . . . . . . . . . . . . . . . . . . . 494 n ao encontrados, regitros . . . . . . . . . . . . . . . . . . . . 930 n ao pode criar/gravar arquivos . . . . . . . . . . . . . . 915 n ao transacionais, tabelas . . . . . . . . . . . . . . . . . . . 912 nativa, suporte de thread . . . . . . . . . . . . . . . . . . . . . 78 nativas, adicionando fun co es . . . . . . . . . . . . . . . . . 904 net_buffer_length . . . . . . . . . . . . . . . . . . . . 350, 357 NetWare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74, 164 no-auto-rehash, op ca o mysql . . . . . . . . . . . . . . . 348 no-beep, mysql option . . . . . . . . . . . . . . . . . . . . . . 348 no-named-commands, op ca o mysql . . . . . . . . . . . . 348 no-pager, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . 349 no-tee, op c ao mysql . . . . . . . . . . . . . . . . . . . . . . . . 349 nome de m aquina, armazenando em cache . . . . 460 nome de maquinas padrao . . . . . . . . . . . . . . . . . . . 239 nome de usu arios e senhas . . . . . . . . . . . . . . . . . . . 260 Nome do Golnho do MySQL . . . . . . . . . . . . . . . . . . 5 Nome do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 nomeando, releases do MySQL . . . . . . . . . . . . . . . . 81 nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 nomes alias, caso sensitivo . . . . . . . . . . . . . . . . . . . 473 nomes de banco de dados, caso sensitivo . . . . . . . 44 nomes de bancos de dados, caso sensitivo . . . . . 473 nomes de colunas, caso sensitivo . . . . . . . . . . . . . 473 nomes de tabelas, caso sensitivo . . . . . . . . . . 44, 473 nomes validos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 nomes, caso sensitivo . . . . . . . . . . . . . . . . . . . . . . . . 473 nomes, vari aveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474 NOT NULL, restri c oes . . . . . . . . . . . . . . . . . . . . . . . 53 nota ca o de m ascara de rede, na tabela mysql.user . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 Novell NetWare . . . . . . . . . . . . . . . . . . . . . . . . . 74, 164 novos procedimentos, adcionado . . . . . . . . . . . . . 905 novos usu arios, adicionando . . . . . . . . . . . . . . . . . . 91 NULL e colunas AUTO_INCREMENT . . . . . . . . . . . . . . 929 NULL e colunas TIMESTAMP . . . . . . . . . . . . . . . . . . . 929 NULL vs. valores vazios . . . . . . . . . . . . . . . . . . . . . . 928 NULL, teste para nulo . . . . . . . . . . . . . . . . . . . 508, 511 NULL, testes para nulo . . . . . . . . . . . . . . . . . . . . . . . 506 NULL, valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 NULL, valores e indices . . . . . . . . . . . . . . . . . . . . . . . 602 numericos, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 n umero de ponto utuante . . . . . . . . . . . . . . . . . . 483 n umeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 n umeros de release . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 n umeros v alidos, exemplos . . . . . . . . . . . . . . . . . . . 471
Concept Index
1109
P
pack_isam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 pacotes, lista de . . . . . . . . . . . . . . . . . . . . . . . . . . . . 945 padrao do nome de maquinas . . . . . . . . . . . . . . . . 239 padr ao, privil egios . . . . . . . . . . . . . . . . . . . . . . . . . . 261 Padr aos SQL, diferen cas do . . . . . . . . . . . . . . . . . . 259 padr oes, combina c ao . . . . . . . . . . . . . . . . . . . . . . . . 186 padr oes, embutico . . . . . . . . . . . . . . . . . . . . . . . . . . 862 pager, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . . 349 palavras reservadas, exce co es de . . . . . . . . . . . . . 479 palavras-chave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 par6ametros de inicializa c ao, mysqlcc . . . . . . . . 355 paramentros de inicializa ca o, sintonia . . . . . . . . 454 par ametros de inicialiaza ca o, mysql . . . . . . . . . . 348 par ametros, servidor . . . . . . . . . . . . . . . . . . . . . . . . 455 parando o servidor . . . . . . . . . . . . . . . . . . . . . . . . . . 118 password, op ca o do mysqlcc . . . . . . . . . . . . . . . . . 356 password, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . 349 patches, aplicando . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 performance, aumentando . . . . . . . . . . . . . . . 413, 447 performance, benchmarks . . . . . . . . . . . . . . . . . . . 424 performance, detalhes de disco . . . . . . . . . . . . . . . 465 performance, estimando . . . . . . . . . . . . . . . . . . . . . 432 Perl API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877 Perl DBI/DBD, problemas de instala ca o . . . . . . 166 Perl, instalando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Perl, instalando no Windows . . . . . . . . . . . . . . . . 166 permiss oes de tabelas . . . . . . . . . . . . . . . . . . . . . . . 246 perror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 pesquisa full-text . . . . . . . . . . . . . . . . . . . . . . . . . . . 618 pesquisando em duas chaves . . . . . . . . . . . . . . . . . 201 pesquisas e caso-sensitivito . . . . . . . . . . . . . . . . . . 926 PHP API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876 plugins_path, op ca o do mysqlcc . . . . . . . . . . . . 356 ponto decimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 ponto utuante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 port, op ca o do mysqlcc . . . . . . . . . . . . . . . . . . . . . 356 port, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . . . 350 portabilidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 portabilidade, tipos . . . . . . . . . . . . . . . . . . . . . . . . . 502 portando para outros sistemas . . . . . . . . . . . . . . 1069 p os-instala c ao, congura ca o e testes . . . . . . . . . . 111 p os-instala c ao, multiplos servidores . . . . . . . . . . . 220 PostgreSQL, compatibilidade . . . . . . . . . . . . . . . . . 45 pre co do suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 prexo mais a esquerda de indices . . . . . . . . . . . . 449 PRIMARY KEY, restri ca o . . . . . . . . . . . . . . . . . . . 52 privil egio de acesso . . . . . . . . . . . . . . . . . . . . . . . . . 227 privil egio, mudan ca . . . . . . . . . . . . . . . . . . . . . . . . . 246 privil egio, sistemas de . . . . . . . . . . . . . . . . . . . . . . . 233 privil egios de usu ario, apagando . . . . . . . . . . . . . 265 privil egios de usu ario, deletando . . . . . . . . . . . . . 265 privil egios globais . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 privil egios, adicionando . . . . . . . . . . . . . . . . . . . . . 262 privil egios, apagando . . . . . . . . . . . . . . . . . . . . . . . . 265 privil egios, concedendo . . . . . . . . . . . . . . . . . . . . . . 255 privil egios, deletando . . . . . . . . . . . . . . . . . . . . . . . . 265 privil egios, exibir . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
privilegios, localiza ca o de informa co es . . . . . . . . 237 privil egios, padr ao . . . . . . . . . . . . . . . . . . . . . . . . . . 261 privil egios, revogando . . . . . . . . . . . . . . . . . . . . . . . 255 problemas cc1plus . . . . . . . . . . . . . . . . . . . . . . . . . 103 problemas com bloqueios de tabela . . . . . . . . . . . 445 problemas com fuso hor ario . . . . . . . . . . . . . . . . . . 926 problemas de liga ca o . . . . . . . . . . . . . . . . . . . . . . . . 918 problemas e erros comuns . . . . . . . . . . . . . . . . . . . 907 problemas inicializando o servidor . . . . . . . . . . . . 116 problemas instalando no Solaris . . . . . . . . . . . . . . 145 problemas, colunas DATE . . . . . . . . . . . . . . . . . . . . . 927 problemas, compilando . . . . . . . . . . . . . . . . . . . . . . 103 problemas, erros de acesso negado . . . . . . . . . . . . 908 problemas, instalando no IBM-AIX . . . . . . . . . . 155 problemas, instalando Perl . . . . . . . . . . . . . . . . . . 166 problemas, ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . 875 problemas, relatando . . . . . . . . . . . . . . . . . . . . . . . . . 36 problems, date values . . . . . . . . . . . . . . . . . . . . . . . 495 procedimentos, adicionando . . . . . . . . . . . . . . . . . 905 procedures, stored . . . . . . . . . . . . . . . . . . . . . . . 49, 760 processando, argumentos . . . . . . . . . . . . . . . . . . . . 900 processos, exibindo . . . . . . . . . . . . . . . . . . . . . . . . . 321 processos, suporte de . . . . . . . . . . . . . . . . . . . . . . . . . 78 procurando, p aginas web MySQL . . . . . . . . . . . . . 35 produtos, vendendo . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Programa Access . . . . . . . . . . . . . . . . . . . . . . . . . . . 870 programa, crash-me . . . . . . . . . . . . . . . . . . . . . . . . . 420 programas clientes . . . . . . . . . . . . . . . . . . . . . . . . . . 858 programas, lista de . . . . . . . . . . . . . . . . . . . . . 331, 346 projeto, limita co es . . . . . . . . . . . . . . . . . . . . . . . . . . 419 projetos, detalhes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 projetos, escolhas . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 prompt de comando . . . . . . . . . . . . . . . . . . . . . . . . . 354 prompt, mysql option . . . . . . . . . . . . . . . . . . . . . . . 348 prompts, signicados . . . . . . . . . . . . . . . . . . . . . . . . 172 pron uncia, MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Protocol mismatch . . . . . . . . . . . . . . . . . . . . . . . . . . 129 protocol, mysql option . . . . . . . . . . . . . . . . . . . . . 350 protocol, mysql, op ca o . . . . . . . . . . . . . . . . . . . . . 369 Protocolos n ao correspondetes . . . . . . . . . . . . . . . 129 Provedores de Servi cos de Internet . . . . . . . . . . . . 19 Python, API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884
Q
queries, exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 Query Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624 query, op ca o do mysqlcc . . . . . . . . . . . . . . . . . . . . 356 questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 quest oes, respondendo . . . . . . . . . . . . . . . . . . . . . . . . 41 quick, mysql option . . . . . . . . . . . . . . . . . . . . . . . . 350
1110
R
RAID, erros de compila ca o . . . . . . . . . . . . . . . . . . 104 RAID, table type . . . . . . . . . . . . . . . . . . . . . . . . . . . 605 raw, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 recongurando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 reconnect, mysql option . . . . . . . . . . . . . . . . . . . . 350 recriando tabelas de permiss oes . . . . . . . . . . . . . . 262 recuperando dados de tabelas . . . . . . . . . . . . . . . . 178 recupra ca o em caso de falhas . . . . . . . . . . . . . . . . 288 recursos do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 recursos principais do MySQL . . . . . . . . . . . . . . . . . 6 RedHat Package Manager . . . . . . . . . . . . . . . . . . . . 69 reduzindo o tamanho dos dados . . . . . . . . . . . . . . 447 refer encias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610 regex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1084 register, op ca o do mysqlcc . . . . . . . . . . . . . . . . . 356 registro, lock de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 registro, ordenando . . . . . . . . . . . . . . . . . . . . . . . . . 181 registros n ao encontrados . . . . . . . . . . . . . . . . . . . . 930 registros, contando . . . . . . . . . . . . . . . . . . . . . . . . . . 189 registros, secionando . . . . . . . . . . . . . . . . . . . . . . . . 179 relatando problemas com MyODBC . . . . . . . . . . 875 relatando, bugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 relatando, erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 relat orio de bug, crit erio para . . . . . . . . . . . . . . . . . 37 relat orio, erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 releases, atualizando . . . . . . . . . . . . . . . . . . . . . . . . . 84 releases, esquema de nomenclatura . . . . . . . . . . . . 81 releases, testando . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 reordenando colunas . . . . . . . . . . . . . . . . . . . . . . . . 934 repairando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . 290 replace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 replica ca o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 replica ca o do master, comandos . . . . . . . . . . . . . . 401 replica ca o do slave, comandos . . . . . . . . . . . . . . . . 402 Resolvendo problemas no FreeBSD . . . . . . . . . . . 105 Resolvendo problemas no Solaris . . . . . . . . . . . . . 105 respondendo ` as quest oes, etiqueta . . . . . . . . . . . . . 41 Respons aveis pela Documenta ca o, lista dos . . . 943 Ret angulo de Limite M inimo . . . . . . . . . . . . . . . . 753 revogando privl egios . . . . . . . . . . . . . . . . . . . . . . . . 255 root, recuperando senha do . . . . . . . . . . . . . . . . . . 923 root, senha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 RTS-threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1079
S
safe-mode, comando . . . . . . . . . . . . . . . . . . . . . . . . 352 safe-updates, op ca o mysql . . . . . . . . . . . . . . . . . 350 safe_mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 Sakila . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 script mysqlbug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 script mysqlbug, localiza c ao . . . . . . . . . . . . . . . . . . . 2 script, arquivos de . . . . . . . . . . . . . . . . . . . . . . . . . . 194 scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332, 334, 347 scripts mysql_install_db . . . . . . . . . . . . . . . . . . . 115 scripts, mysqlbug . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 seguran ca com transa ca o, tabelas . . . . . . . . . . . . 642
seguran ca contra crackers . . . . . . . . . . . . . . . . . . . 230 seguran ca de sistema . . . . . . . . . . . . . . . . . . . . . . . . 227 selecionando banco de dados . . . . . . . . . . . . . . . . . 174 SELECT, Query Cache . . . . . . . . . . . . . . . . . . . . . . . 624 select_limit . . . . . . . . . . . . . . . . . . . . . . . . . . 350, 357 senha, congura ca o . . . . . . . . . . . . . . . . . . . . . . . . . 463 senha, usu ario root . . . . . . . . . . . . . . . . . . . . . . . . . 261 senhas esquecidas . . . . . . . . . . . . . . . . . . . . . . . . . . . 923 senhas seguras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 senhas, congurando . . . . . . . . . . . . . . . . . . . 258, 267 senhas, para usu arios . . . . . . . . . . . . . . . . . . . . . . . 260 senhas, recuperando . . . . . . . . . . . . . . . . . . . . . . . . 923 sequ encia de chamadas para fun co es agregadas, UDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899 sequ encia de chamadas para fun co es simples, UDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 898 sequencia de emula ca o . . . . . . . . . . . . . . . . . . . . . . 551 server, op ca o do mysqlcc . . . . . . . . . . . . . . . . . . . 356 servi cos, ISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 servi cos, web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 servidor web, executando . . . . . . . . . . . . . . . . . . . . . 19 servidor, administra ca o . . . . . . . . . . . . . . . . . . . . . . 357 servidor, conectando . . . . . . . . . . . . . . . . . . . . 169, 239 servidor, depurando . . . . . . . . . . . . . . . . . . . . . . . . 1070 servidor, desligar o . . . . . . . . . . . . . . . . . . . . . . . . . . 113 servidor, disconectando . . . . . . . . . . . . . . . . . . . . . . 169 servidor, inicializando e parando . . . . . . . . . . . . . 118 servidor, iniciando o . . . . . . . . . . . . . . . . . . . . . . . . 111 servidor, problemas inicializando o . . . . . . . . . . . 116 servidores, m ultiplos . . . . . . . . . . . . . . . . . . . . . . . . 220 SET, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 set-variable, op ca o mysql . . . . . . . . . . . . . . . . . 349 shell, sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 silent, mysql option . . . . . . . . . . . . . . . . . . . . . . . 350 simb olicos, links . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 sintaxe de express oes regulares, descri ca o . . . . 1084 sistema de privil egios . . . . . . . . . . . . . . . . . . . . . . . 233 sistema de privil egios, dexcri ca . . . . . . . . . . . . . . . 233 sistema, otimiza ca o . . . . . . . . . . . . . . . . . . . . . . . . . 454 sistema, seguran ca . . . . . . . . . . . . . . . . . . . . . . . . . . 227 sistema, tabela de . . . . . . . . . . . . . . . . . . . . . . . . . . 426 sistema, vari aveis . . . . . . . . . . . . . . . . . . . . . . . . . . . 475 sistemas operacionais, limites de tamanho de arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 sistemas operacionais, suportados . . . . . . . . . . . . . 78 sistemas operacionais, Windows versus Unix . . 134 sites de espelhos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 skip-column-names, op ca o mysql . . . . . . . . . . . . 349 skip-line-numbers, mysql option . . . . . . . . . . . 349 slow queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 socket, altera ca o localiza ca o dos . . . . . . . . . . . . . . 98 socket, op ca o do mysqlcc . . . . . . . . . . . . . . . . . . . 356 socket, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . 350 Solaris, problemas de instala ca o . . . . . . . . . . . . . . 145 Solaris, resolvendo problemas . . . . . . . . . . . . . . . . 105 SQL, deni ca o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 SQL-92, extens oes ao . . . . . . . . . . . . . . . . . . . . . . . . 41 sql_yacc.cc problemas . . . . . . . . . . . . . . . . . . . . . 103
Concept Index
1111
SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 SSL e X509 Basicos . . . . . . . . . . . . . . . . . . . . . . . . . 269 SSL, op co es de linha de comando . . . . . . . . . . . . 275 SSL, op co es relacionadas . . . . . . . . . . . . . . . . . . . . 274 status, comando . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 status, resultado do comando . . . . . . . . . . . . . . . . 358 status, tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 stored procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . 760 stored procedures e triggers, deni ca o . . . . . . . . . 49 string entre aspas . . . . . . . . . . . . . . . . . . . . . . . . . . . 880 string tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 string, ordena ca o . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 string, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 strings n ao delimitadas . . . . . . . . . . . . . . . . . . . . . . 494 strings, caracteres de escape . . . . . . . . . . . . . . . . . 469 strings, deni ca o . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 striping, deni ca o . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 subqueries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 subquery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 subselects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 sugest oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568 superusu ario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 suporte a clientes, endere co eletr onico . . . . . . . . . 40 suporte ` a thread n ao-nativa . . . . . . . . . . . . . . . . . 106 suporte t ecnico, endere co eletr onico . . . . . . . . . . . 40 suporte t ecnico, licenciamento . . . . . . . . . . . . . . . . 18 suporte, custo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 suporte, endere co eletr onico . . . . . . . . . . . . . . . . . . 40 suporte, licenciamento . . . . . . . . . . . . . . . . . . . . . . . 18 suporte, para sistemas operacionais . . . . . . . . . . . 78 suporte, termos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 suporte, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 supress ao, valores padr ao . . . . . . . . . . . . . . . . . . . . . 99 supress ao, valores padr oes . . . . . . . . . . . . . . . . . . . . 53 Sybase, compatibilidade . . . . . . . . . . . . . . . . . . . . . 613 syntax, op c ao do mysqlcc . . . . . . . . . . . . . . . . . . . 356 syntax_file, op c ao do mysqlcc . . . . . . . . . . . . . 356
T
tabela db, ordenando . . . . . . . . . . . . . . . . . . . . . . . . tabela de permiss oes, ordenando . . . . . . . . . 242, tabela de sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . tabela est a cheia . . . . . . . . . . . . . . . . . . . . . . . . . . . . tabela host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tabela host table, ordenando . . . . . . . . . . . . . . . . tabela user, ordenando . . . . . . . . . . . . . . . . . . . . . tabela, alterando . . . . . . . . . . . . . . . . . . . . . . . . . . . tabela, aumnetando performance . . . . . . . . . . . . . tabela, permiss oes . . . . . . . . . . . . . . . . . . . . . . . . . . tabelas abertas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tabelas BDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tabelas Berkeley DB . . . . . . . . . . . . . . . . . . . . . . . . tabelas compactadas . . . . . . . . . . . . . . . . . . . . . . . . tabelas compactadas, formato . . . . . . . . . . . . . . . tabelas constantes . . . . . . . . . . . . . . . . . . . . . . . . . . tabelas de permiss oes, recriando . . . . . . . . . . . . . tabelas din amicas, caracter isticas . . . . . . . . . . . . 244 244 426 915 245 244 242 609 447 246 452 695 695 337 634 433 262 634
tabelas HEAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641 tabelas ISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640 tabelas tempor arias, problemas . . . . . . . . . . . . . . 935 tabelas transacionais . . . . . . . . . . . . . . . . . . . . . . . . . 46 tabelas, abrindo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 tabelas, aliases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563 tabelas, alterando . . . . . . . . . . . . . . . . . . . . . . . . . . . 934 tabelas, alterando a ordem das colunas . . . . . . . 934 tabelas, atualizando . . . . . . . . . . . . . . . . . . . . . . . . . . 46 tabelas, carregando dados . . . . . . . . . . . . . . . . . . . 177 tabelas, constante . . . . . . . . . . . . . . . . . . . . . . . . . . . 426 tabelas, contando regitros . . . . . . . . . . . . . . . . . . . 189 tabelas, copiando . . . . . . . . . . . . . . . . . . . . . . . . . . . 599 tabelas, criando . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 tabelas, deletando . . . . . . . . . . . . . . . . . . . . . . . . . . 611 tabelas, deletando linhas . . . . . . . . . . . . . . . . . . . . 929 tabelas, descarregando . . . . . . . . . . . . . . . . . . 362, 366 tabelas, desfragmenta ca o . . . . . . . . . . . . . . . . . . . . 634 tabelas, desfragmentar . . . . . . . . . . . . . . . . . . . . . . 293 tabelas, exibindo . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 tabelas, fechando . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 tabelas, fus ao de . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 tabelas, ID u nico para o u ltimo registro . . . . . . 858 tabelas, informa co es . . . . . . . . . . . . . . . . . . . . . . . . 294 tabelas, informa co es sobre . . . . . . . . . . . . . . . . . . . 193 tabelas, laterando . . . . . . . . . . . . . . . . . . . . . . . . . . . 607 tabelas, mostrando status . . . . . . . . . . . . . . . . . . . 305 tabelas, muitas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454 tabelas, nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 tabelas, optimizando . . . . . . . . . . . . . . . . . . . . . . . . 292 tabelas, ordenando registros . . . . . . . . . . . . . . . . . 181 tabelas, recuperando dados . . . . . . . . . . . . . . . . . . 178 tabelas, regime de manuten ca o . . . . . . . . . . . . . . . 293 tabelas, reparando . . . . . . . . . . . . . . . . . . . . . . . . . . 290 tabelas, selecinando colunas . . . . . . . . . . . . . . . . . 180 tabelas, selecionado registros . . . . . . . . . . . . . . . . 179 tabelas, tamanho m aximo . . . . . . . . . . . . . . . . . . . . 10 tabelas, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629 tabelas, travamento . . . . . . . . . . . . . . . . . . . . . . . . . 444 tabelas, verica ca o . . . . . . . . . . . . . . . . . . . . . . . . . . 284 tabelas, vericando erros . . . . . . . . . . . . . . . . . . . . 289 table is full . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462 table, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . . 350 tables, desfragmenta ca o . . . . . . . . . . . . . . . . . . . . . 299 tables, ush . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 tables, fragmenta ca o . . . . . . . . . . . . . . . . . . . . . . . . 299 tables, multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 tables, RAID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605 tamanho das tabelas . . . . . . . . . . . . . . . . . . . . . . . . . 10 tamanho de buer do servidor mysqld . . . . . . . . 455 tamanho, display . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 tar, problemas no Solaris . . . . . . . . . . . . . . . . . . . . 145 Tcl, API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884 TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 tebela de permiss oes, atualizando . . . . . . . . . . . . 130 tee, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 tempo esgotado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 tempo excedido, connect_timeout vari avel . . . 350
1112
tempo limite . . . . . . . . . . . . . . . . . . . . . . . . . . . 552, 582 terminal monitor, deni c ao . . . . . . . . . . . . . . . . . . 169 testando a instala c ao . . . . . . . . . . . . . . . . . . . . . . . . 112 testando mysqld, mysqltest . . . . . . . . . . . . . . . . . . 892 testando o servidor . . . . . . . . . . . . . . . . . . . . . . . . . 111 testando, conectando ao servidor . . . . . . . . . . . . . 240 testando, releases do MySQL . . . . . . . . . . . . . . . . . 82 testes p os-instala ca o . . . . . . . . . . . . . . . . . . . . . . . . 111 testing, installation . . . . . . . . . . . . . . . . . . . . . . . . . 112 Texinfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 TEXT , valores padr oes em campos . . . . . . . . . . . . 498 TEXT, indexando colunas . . . . . . . . . . . . . . . . . . . . . 602 TEXT, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 texto, arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 thread, suporte de . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358, 892 threads, clientes em . . . . . . . . . . . . . . . . . . . . . . . . . 859 threads, diferen cas entre pacotes . . . . . . . . . . . . 1081 threads, exibindo . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 threads, RTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1079 timeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 timeout, connect_timeout variable . . . . . . . . . . . 357 TIMESTAMP e valores NULL . . . . . . . . . . . . . . . . . . . . 929 tipo, convers ao de . . . . . . . . . . . . . . . . . . . . . . . . . . 504 tipos de campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 tipos de dados, C API . . . . . . . . . . . . . . . . . . . . . . 772 Tipos de data e hora . . . . . . . . . . . . . . . . . . . . . . . . 489 tipos de data, Y2K assuntos . . . . . . . . . . . . . . . . . 490 tipos de suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 tipos de tabela, escolhedo . . . . . . . . . . . . . . . . . . . 629 tipos string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 tipos strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 tipos, campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 tipos, data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 tipos, hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 tipos, num ericos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 tipos, portabilidade . . . . . . . . . . . . . . . . . . . . . . . . . 502 ToDo list for MySQL . . . . . . . . . . . . . . . . . . . . . . . . 26 TODO, servidor embutido . . . . . . . . . . . . . . . . . . . 862 TODO, symlinks . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 tools, graphical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 tools, GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 tools, list of . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 946 trabalhos no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 15 Tradutores, lista de . . . . . . . . . . . . . . . . . . . . . . . . . 943 transa co es, suporte . . . . . . . . . . . . . . . . . . . . . . 46, 642 translations_path, op ca o do mysqlcc . . . . . . . 356 tratando erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902 travamento, m etodos . . . . . . . . . . . . . . . . . . . . . . . 1078 treinamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 tutorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
U
UCS-2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707 UDFs, compilando . . . . . . . . . . . . . . . . . . . . . . . . . . 902 UDFs, deni ca o . . . . . . . . . . . . . . . . . . . . . . . . . . . . 895 UDFs, valor de retorno . . . . . . . . . . . . . . . . . . . . . . 902 u ltimo registro, ID u nico . . . . . . . . . . . . . . . . . . . . 858 unbuffered, op ca o mysql . . . . . . . . . . . . . . . . . . . . 349 u nico, ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858 Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707 UNIQUE, restri ca o . . . . . . . . . . . . . . . . . . . . . . . . . . 52 unnamed views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574 uptime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 URLS para download do MySQL . . . . . . . . . . . . . 75 usando multiplos discos para guardar dados . . . 133 user, op ca o do mysqlcc . . . . . . . . . . . . . . . . . . . . . 356 user, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . . . 350 uso de mem oria, myisamchk . . . . . . . . . . . . . . . . . 287 uso, do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 usu ario, fun co es de nidas, adicionando . . . . . . 896 usu arios, adicionando . . . . . . . . . . . . . . . . . . . . . . . . 91 usu arios, adicionando privil egios . . . . . . . . . . . . . 262 usu arios, deletando . . . . . . . . . . . . . . . . . . . . . . . . . 265 usu arios, do MySQL . . . . . . . . . . . . . . . . . . . . . . . . 421 usu arios, fun co es denidas por . . . . . . . . . . . . . . . 895 usuarios, root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 usu arios, vari aveis . . . . . . . . . . . . . . . . . . . . . . . . . . 474 UTF-8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
V
valor de retorno, UDFs . . . . . . . . . . . . . . . . . . . . . . 902 valores negativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 valores padr ao, supress ao . . . . . . . . . . . . . . . . . . . . . 99 valores padr oes . . . . . . . . . . . . . . . . . . . . 419, 579, 601 valores padr oes em campos BLOB e TEXT . . . . . . 498 valores padr oes, supress ao . . . . . . . . . . . . . . . . . . . . 53 var aveis de ambiente . . . . . . . . . . . . . . . . . . . . . . . . 217 VARCHAR, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . 503 vari aveis de ambiente . . . . . . . . . . . . . . 254, 331, 346 vari aveis de ambientes, lista . . . . . . . . . . . . . . . . 1083 vari aveis de sistema . . . . . . . . . . . . . . . . . . . . . . . . . 475 vari aveis de usu arios . . . . . . . . . . . . . . . . . . . . . . . . 474 variaveis, mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 vari aveis, status . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 vari aveis, valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 velocidade da inser ca o . . . . . . . . . . . . . . . . . . . . . . 439 velocidade das consultas . . . . . . . . . . . . . . . . 424, 432 velocidade de compila ca o . . . . . . . . . . . . . . . . . . . . 457 velocidade de liga ca o . . . . . . . . . . . . . . . . . . . . . . . . 457 velocidade, aumentado . . . . . . . . . . . . . . . . . . . . . . 379 vendendo produtos . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 verbose, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . 350 verica ca o de permiss oes, efeito na velocidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 vericando erros em tabelas . . . . . . . . . . . . . . . . . 289 vers ao, escolhendo . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 vers ao, u ltima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 version, op ca o do mysqlcc . . . . . . . . . . . . . . . . . . 356
Concept Index
1113
version, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . 350 vertical, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . 348 views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 vis ao geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 vis ao geral da instala ca o . . . . . . . . . . . . . . . . . . . . . . 94 Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 874
W
wait, op ca o mysql . . . . . . . . . . . . . . . . . . . . . . . . . . Well-Known Binary, formato . . . . . . . . . . . . . . . . Well-Known Text, formato . . . . . . . . . . . . . . . . . . Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 738 737 866
Windows, assuntos em aberto . . . . . . . . . . . . . . . . Windows, atualizando . . . . . . . . . . . . . . . . . . . . . . . Windows, compilando no . . . . . . . . . . . . . . . . . . . . Windows, versus Unix . . . . . . . . . . . . . . . . . . . . . . . WKB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WKT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . wrappers, Eiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
X
xml, mysql option . . . . . . . . . . . . . . . . . . . . . . . . . . . 349