Manual Completo de MySQL
Manual Completo de MySQL
Sumrio a
1 Informaes Gerais . . . . . . . . . . . . . . . . . . . . . . . . 1 co
1.1 1.2 Sobre Este Manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.1.1 Convenes Usadas Neste Manual . . . . . . . . . . . . . . . . 2 co Viso Geral do Sistema de Gerenciamento de Banco de Dados a MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.1 Histria do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 o 1.2.2 As Principais Caracter isticas do MySQL . . . . . . . . . . 6 1.2.3 Estabilidade do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.2.4 Qual o Tamanho Que as Tabelas do MySQL Podem Ter? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.2.5 Compatibilidade Com o Ano 2000 (Y2K) . . . . . . . . 11 Viso Geral da MySQL AB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 a 1.3.1 O Modelo de Negcio e Servios da MySQL AB . . 13 o c 1.3.1.1 Suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.3.1.2 Treinamento e Certicao. . . . . . . . . . . . . 14 ca 1.3.1.3 Consultoria . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.3.1.4 Licenas Comerciais . . . . . . . . . . . . . . . . . . . 15 c 1.3.1.5 Parcerias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.3.2 Informaes para Contato . . . . . . . . . . . . . . . . . . . . . . 15 co Suporte e Licenciamento do MySQL . . . . . . . . . . . . . . . . . . . . . 17 1.4.1 Suporte Oferecido pela MySQL AB . . . . . . . . . . . . . 17 1.4.2 Copyrights e Licenas Usadas pelo MySQL . . . . . . 17 c 1.4.3 Licenas do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 c 1.4.3.1 Usando o Programa MySQL Sob uma Licena Comercial . . . . . . . . . . . . . . . . . . . . . . . . 18 c 1.4.3.2 Usando o Programa MySQL Sem Custo Sob GPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.4.4 Logomarcas e Marcas Registradas da MySQL AB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.4.4.1 O Logo Original do MySQL. . . . . . . . . . . . 20 1.4.4.2 Logomarcas da MySQL que Podem Ser Usadas Sem Permisso de Alterao . . . . . . . . 20 a ca 1.4.4.3 Quando Voc Precisa de Permisso de e a Alterao para Usar as Logomarcas do MySQL? ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.4.4.4 Logomarcas dos Parceiros da MySQL AB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.4.4.5 Usando a Palavra MySQL em Texto Impresso ou Apresentao . . . . . . . . . . . . . . . . . . . . . . . . . . 21 ca 1.4.4.6 Usando a Palavra MySQL em Nomes de Companhias e Produtos . . . . . . . . . . . . . . . . . . . 21 Mapa de Desenvolvimento do MySQL. . . . . . . . . . . . . . . . . . . . 22 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 . . . . . . . . . . . . 24 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 Prxima Distribuio de o ca Desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.6 MySQL e o Futuro (o TODO). . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.6.1 Novos Recursos Planejados Para a Verso 4.1 . . . . 27 a 1.6.2 Novos Recursos Planejados Para a Verso 5.0 . . . . 27 a 1.6.3 Novos Recursos Planejados Para a Verso 5.1 . . . . 28 a 1.6.4 Novos Recursos Planejados Para a Verso em um a Futuro Prximo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 o 1.6.5 Novos Recursos Planejados Para a Verso em um a Futuro a Mdio Prazo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 e 1.6.6 Novos Recursos que No Planejamos Fazer . . . . . . 33 a 1.7 Fontes de Informaes do MySQL . . . . . . . . . . . . . . . . . . . . . . . 33 co 1.7.1 Listas de Discusso MySQL . . . . . . . . . . . . . . . . . . . . 33 a 1.7.1.1 As Listas de Discusso do MySQL . . . . . . 33 a 1.7.1.2 Fazendo perguntas ou relatando erros . . . 35 1.7.1.3 Como relatar erros ou problemas . . . . . . . 36 1.7.1.4 Guia para responder questes na lista de o discusso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 a 1.7.2 Suporte a Comunidade MySQL Atrvs do IRC e (Internet Relay Chat) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 1.8 Qual compatibilidade aos padres o MySQL oferece ? . . . . . 41 o 1.8.1 Qual Padro o MySQL Segue? . . . . . . . . . . . . . . . . . . 42 a 1.8.2 Executando o MySQL no modo ANSI . . . . . . . . . . . 42 1.8.3 Extenses do MySQL para o Padro SQL-92. . . . . 43 o a 1.8.4 Diferenas do MySQL em Comparao com o c ca SQL-92 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 1.8.4.1 Subqueries . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 1.8.4.2 SELECT INTO TABLE . . . . . . . . . . . . . . . . . . . 46 1.8.4.3 Transaes e Operaes Atmicas . . . . . . 46 co co o 1.8.4.4 Stored Procedures e Triggers . . . . . . . . . . . 49 1.8.4.5 Chaves Estrangeiras . . . . . . . . . . . . . . . . . . . 50 1.8.4.6 Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 1.8.4.7 -- como In de Comentrio . . . . . . . . 51 icio a 1.8.5 Como o MySQL Lida com Restries . . . . . . . . . . . . 52 co 1.8.5.1 Restries de PRIMARY KEY / UNIQUE co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 1.8.5.2 Restries de NOT NULL . . . . . . . . . . . . . . . . 53 co 1.8.5.3 Restries de ENUM e SET. . . . . . . . . . . . . . . 53 co 1.8.6 Erros Conhecidos e Decincias de Projetos no e MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
iii 1.8.6.1 Erros da Verso 3.23 Corrigidos em Verses a o Posteriores do MySQL . . . . . . . . . . . . . . . . . . . . 54 1.8.6.2 Open Bugs / Decincias de Projeto no e MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Instalao do MySQL . . . . . . . . . . . . . . . . . . . . . 60 ca
2.1 Instalao rpida padro do MySQL . . . . . . . . . . . . . . . . . . . . . 60 ca a a 2.1.1 Instalando o MySQL no Windows . . . . . . . . . . . . . . . 60 2.1.1.1 Exigncias do Sistema Windows . . . . . . . . 61 e 2.1.1.2 Instalando uma Distribuio Binria do ca a Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 2.1.1.3 Preparando o Ambiente MySQL do Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 2.1.1.4 Selecionando um Servidor Windows . . . . 63 2.1.1.5 Iniciando o Servidor pela Primeira Vez . . 64 2.1.1.6 Iniciando o MySQL no Windows 95, 98, ou Me . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 2.1.1.7 Iniciando o MySQL no Windows NT, 2000, ou XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 2.1.1.8 Executando o MySQL no Windows . . . . . 68 2.1.2 Instalando o MySQL no Linux . . . . . . . . . . . . . . . . . . 69 2.1.3 Instalando o MySQL no Mac OS X . . . . . . . . . . . . . 71 2.1.4 Instalando o MySQL no NetWare . . . . . . . . . . . . . . . 74 2.1.4.1 Instalando o MySQL para Binrios do a NetWare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 2.2 Detalhes Gerais de Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 ca 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 verso do MySQL deve ser usada . . . . . . . . . . 80 a 2.2.5 Layouts de Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . 83 ca 2.2.6 Como e quando as atualizaes so lanadas? . . . . 84 co a c 2.2.7 Filosoa das Distribuies - Nenhum Bug co Conhecidos nas Distribuies . . . . . . . . . . . . . . . . . . . . . 85 co 2.2.8 Binrios MySQL compilados pela MySQL AB . . . 86 a 2.2.9 Instalando uma Distribuio Binria do MySQL . . 91 ca a 2.3 Instalando uma distribuio com fontes do MySQL . . . . . . . 94 ca 2.3.1 Viso geral da instalao rpida . . . . . . . . . . . . . . . . 95 a ca a 2.3.2 Aplicando patches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 2.3.3 Opes t co ipicas do configure . . . . . . . . . . . . . . . . . . . 97 2.3.4 Instalando pela rvore de fontes do desenvolvimento a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 2.3.5 Lidando com Problemas de Compilao . . . . . . . . 103 ca 2.3.6 Notas MIT-pthreads . . . . . . . . . . . . . . . . . . . . . . . . . . 106 2.3.7 Instalando o MySQL a partir do Fonte no Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 2.3.7.1 Construindo o MySQL Usando VC++ . . 108
iv 2.3.7.2 Criando um Pacote Fonte do Windows a partir da Ultima Fonte de Desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 2.4 Conguraes e Testes Ps-instalao . . . . . . . . . . . . . . . . . . . 111 co o ca 2.4.1 Problemas Executando o mysql_install_db. . . . 115 2.4.2 Problemas Inicializando o Servidor MySQL . . . . . 116 2.4.3 Inicializando e parando o MySQL automaticamente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 2.5 Atualizando/Desatualizando o MySQL . . . . . . . . . . . . . . . . . . 120 2.5.1 Atualizando da Verso 4.0 para 4.1 . . . . . . . . . . . . 120 a 2.5.2 Atualizando da Verso 3.23 para 4.0 . . . . . . . . . . . 123 a 2.5.3 Atualizando da verso 3.22 para 3.23 . . . . . . . . . . . 127 a 2.5.4 Atualizando da verso 3.21 para 3.22 . . . . . . . . . . . 128 a 2.5.5 Atualizando da verso 3.20 para 3.21 . . . . . . . . . . . 129 a 2.5.6 Atualizando a Tabela de Permisses . . . . . . . . . . . . 130 o 2.5.7 Atualizando para outra arquitetura . . . . . . . . . . . . 131 2.5.8 Atualizando o MySQL no Windows . . . . . . . . . . . . 132 2.6 Notas espec icas para os Sistemas Operacionais . . . . . . . . . 133 2.6.1 Notas Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 2.6.1.1 Conectando em um MySQL Rematamente a Windows Utilizando SSH . . . . . . . . . . . . . . . 133 2.6.1.2 Compilando clientes MySQL no Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 2.6.1.3 MySQL para Windows Comparado com o MySQL para Unix . . . . . . . . . . . . . . . . . . . . . . . 134 2.6.2 Notas Linux (Todas as verses) . . . . . . . . . . . . . . . . 136 o 2.6.2.1 Notas Linux para distribuies binrias co a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 2.6.4.1 Notas FreeBSD . . . . . . . . . . . . . . . . . . . . . . 148 2.6.4.2 Notas NetBSD . . . . . . . . . . . . . . . . . . . . . . . 150 2.6.4.3 Notas OpenBSD . . . . . . . . . . . . . . . . . . . . . 150 2.6.4.4 Notas OpenBSD 2.8 . . . . . . . . . . . . . . . . . . 150 2.6.4.5 Notas BSDI Verso 2.x . . . . . . . . . . . . . . . 150 a 2.6.4.6 Notas BSD/OS Verso 3.x . . . . . . . . . . . . 151 a 2.6.4.7 Notas BSD/OS Verso 4.x . . . . . . . . . . . . 151 a 2.6.5 Notas Mac OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 2.6.5.1 Mac OS X 10.x . . . . . . . . . . . . . . . . . . . . . . 152 2.6.5.2 Mac OS X Server 1.2 (Rhapsody) . . . . . 152
v 2.6.6 Notas de Outros Unix . . . . . . . . . . . . . . . . . . . . . . . . . 152 2.6.6.1 Notas HP-UX para distribuies binrias co a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 2.6.6.2 Notas HP-UX Verso 10.20 . . . . . . . . . . . 153 a 2.6.6.3 Notas HP-UX Verso 11.x . . . . . . . . . . . . 154 a 2.6.6.4 Notas IBM-AIX. . . . . . . . . . . . . . . . . . . . . . 155 2.6.6.5 Notas SunOS 4 . . . . . . . . . . . . . . . . . . . . . . 157 2.6.6.6 Notas Alpha-DEC-UNIX (Tru64) . . . . . 157 2.6.6.7 Notas Alpha-DEC-OSF1. . . . . . . . . . . . . . 158 2.6.6.8 Notas SGI Irix . . . . . . . . . . . . . . . . . . . . . . . 159 2.6.6.9 Notas SCO . . . . . . . . . . . . . . . . . . . . . . . . . . 160 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 Comentrios de Instalao do Perl . . . . . . . . . . . . . . . . . . . . . . 164 a ca 2.7.1 Instalando Perl no Unix . . . . . . . . . . . . . . . . . . . . . . . 164 2.7.2 Instalaando ActiveState Perl no Windows . . . . . . 165 2.7.3 Problemas Usando a Interface Perl DBI/DBD . . . . 166
2.7
vi 3.6.6 Utilizando Chaves Estrangeiras . . . . . . . . . . . . . . . . 198 3.6.7 Pesquisando em Duas Chaves . . . . . . . . . . . . . . . . . . 200 3.6.8 Calculando Visitas Dirias . . . . . . . . . . . . . . . . . . . . 200 a 3.6.9 Usando AUTO_INCREMENT . . . . . . . . . . . . . . . . . . . . . . 201 3.7 Consultas de Projetos Gmeos . . . . . . . . . . . . . . . . . . . . . . . . . 202 e 3.7.1 Encontrando Todos Gmeos No-distribu e a idos . . . 203 3.7.2 Mostrando uma Tabela sobre a Situao dos Pares ca Gmeos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 e 3.8 Utilizando MySQL com Apache . . . . . . . . . . . . . . . . . . . . . . . . 206
vii Congurando os Privilgios Iniciais do MySQL . . 260 e Adicionando Novos Usurios ao MySQL . . . . . . . . 261 a Deletando Usurios do MySQL . . . . . . . . . . . . . . . . 264 a Limitando os Recursos dos Usurios. . . . . . . . . . . . 265 a Congurando Senhas . . . . . . . . . . . . . . . . . . . . . . . . . 266 Mantendo Sua Senha Segura . . . . . . . . . . . . . . . . . . 267 Usando Conexes Seguras . . . . . . . . . . . . . . . . . . . . 268 o 4.4.10.1 Conceitos Basicos . . . . . . . . . . . . . . . . . . . 268 4.4.10.2 Exigncias . . . . . . . . . . . . . . . . . . . . . . . . . . 268 e 4.4.10.3 Congurando Certicados SSL para o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 4.4.10.4 Opes SSL do GRANT . . . . . . . . . . . . . . . 273 co 4.4.10.5 Opes SSL de Linha de Comando . . . 274 co 4.5 Preveno de Disastres e Recuperao . . . . . . . . . . . . . . . . . . 275 ca ca 4.5.1 Backups dos Bancos de Dados . . . . . . . . . . . . . . . . . 275 4.5.2 Sintaxe de BACKUP TABLE . . . . . . . . . . . . . . . . . . . . . . 277 4.5.3 Sintaxe de RESTORE TABLE . . . . . . . . . . . . . . . . . . . . . 277 4.5.4 Sintaxe de CHECK TABLE . . . . . . . . . . . . . . . . . . . . . . . 278 4.5.5 Sintaxe do REPAIR TABLE . . . . . . . . . . . . . . . . . . . . . . 279 4.5.6 Utilizando myisamchk para Manuteno de Tabelas e ca Recuperao em Caso de Falhas. . . . . . . . . . . . . . . . . . 280 ca 4.5.6.1 Sintaxe do myisamchk . . . . . . . . . . . . . . . . 281 4.5.6.2 Opes Gerais do myisamchk . . . . . . . . . . 282 co 4.5.6.3 Opes de Vericao do myisamchk . . . 283 co ca 4.5.6.4 Opes de Reparos do myisamchk . . . . . 284 co 4.5.6.5 Outras Opes do myisamchk . . . . . . . . . 286 co 4.5.6.6 Uso de Memria do myisamchk . . . . . . . . 286 o 4.5.6.7 Uso do myisamchk para Recuperao em ca Caso de Falhas . . . . . . . . . . . . . . . . . . . . . . . . . . 287 4.5.6.8 Como Vericar Erros em Tabelas . . . . . . 288 4.5.6.9 Como Reparar Tabelas . . . . . . . . . . . . . . . 289 4.5.6.10 Otimizao de Tabelas . . . . . . . . . . . . . . 291 ca 4.5.7 Congurando um Regime de Manuteno das ca Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 4.5.8 Obtendo Informaes sobre as Tabelas . . . . . . . . . 292 co 4.6 Adiministrao do Banco de Dados e Referncia de Linguagem ca e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 4.6.1 Sintaxe de OPTIMIZE TABLE. . . . . . . . . . . . . . . . . . . . 298 4.6.2 Sintaxe de ANALYZE TABLE . . . . . . . . . . . . . . . . . . . . . 298 4.6.3 Sintaxe de CHECKSUM TABLE. . . . . . . . . . . . . . . . . . . . 299 4.6.4 Sintaxe de FLUSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 4.6.5 Sintaxe de RESET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 4.6.6 Sintaxe de PURGE MASTER LOGS . . . . . . . . . . . . . . . . . 301 4.6.7 Sintaxe de KILL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 4.6.8 Sintaxe de SHOW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 4.6.8.1 Recuperando Informaes sobre Bancos de co Dados, Tabelas, Colunas e Indices . . . . . . . . . 303 4.6.8.2 SHOW TABLE STATUS . . . . . . . . . . . . . . . . . . 304 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.4.9 4.4.10
viii 4.6.8.3 SHOW STATUS . . . . . . . . . . . . . . . . . . . . . . . . . 305 4.6.8.4 SHOW VARIABLES . . . . . . . . . . . . . . . . . . . . . 308 4.6.8.5 SHOW [BDB] LOGS . . . . . . . . . . . . . . . . . . . . . 320 4.6.8.6 SHOW PROCESSLIST . . . . . . . . . . . . . . . . . . . 320 4.6.8.7 SHOW GRANTS . . . . . . . . . . . . . . . . . . . . . . . . . 322 4.6.8.8 SHOW CREATE TABLE . . . . . . . . . . . . . . . . . . 322 4.6.8.9 SHOW WARNINGS | ERRORS . . . . . . . . . . . . . 322 4.6.8.10 SHOW TABLE TYPES . . . . . . . . . . . . . . . . . . 324 4.6.8.11 SHOW PRIVILEGES . . . . . . . . . . . . . . . . . . . 325 4.7 Localizao do MySQL e Utilizao Internacional . . . . . . . . 325 ca ca 4.7.1 O Conjunto de Caracteres Utilizado para Dados e Ordenao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 ca 4.7.1.1 German character set . . . . . . . . . . . . . . . . 326 4.7.2 Mensagens de Erros em Outras L inguas . . . . . . . . 327 4.7.3 Adicionando um Novo Conjunto de Caracteres . . 327 4.7.4 Os Vetores de Denies de Caracteres . . . . . . . . . 329 co 4.7.5 Suporte ` Ordenao de Strings . . . . . . . . . . . . . . . 329 a ca 4.7.6 Suporte ` Caracteres Multi-byte . . . . . . . . . . . . . . . 330 a 4.7.7 Problemas com Conjuntos de Caracteres . . . . . . . 330 4.8 Utilitrios e Scripts do Lado do Servidor MySQL . . . . . . . . 330 a 4.8.1 Viso Geral dos Scripts e Utilitrios do Lado a a Servidor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 4.8.2 mysqld-safe, o wrapper do mysqld . . . . . . . . . . . . 331 4.8.3 mysqld_multi, programa para gerenciar mltiplos u servidores MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 4.8.4 myisampack, O Gerador de Tabelas Compactadas de Somente Leitura do MySQL . . . . . . . . . . . . . . . . . . . . . 336 4.8.5 mysqld-max, om servidor mysqld extendido . . . . . 343 4.9 Utilitrios e Scripts do Lado do Cliente MySQL . . . . . . . . . 345 a 4.9.1 Viso Geral dos Utilitrios e Scripts do Lado do a a Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345 4.9.2 mysql, A Ferramenta de Linha de Comando . . . . 346 4.9.3 mysqlcc, The MySQL Control Center . . . . . . . . . . 354 4.9.4 mysqladmin, Administrando um Servidor MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 4.9.5 mysqlbinlog, Executando as Consultas a Partir de um Log Binrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 a 4.9.6 Usando mysqlcheck para Manuteno de Tabelas e ca Recuperao em Caso de Falhas. . . . . . . . . . . . . . . . . . 359 ca 4.9.7 mysqldump, Descarregando a Estrutura de Tabelas e Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 4.9.8 mysqlhotcopy, Copiando Bancos de Dados e Tabelas do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 4.9.9 mysqlimport, Importando Dados de Arquivos Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 4.9.10 mysqlshow, Exibindo Bancos de Dados, Tabelas e Colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
ix 4.9.11 mysql_config, Opes para compilao do cliente co ca MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 4.9.12 perror, Explicando Cdigos de Erros . . . . . . . . . 371 o 4.9.13 Como Executar Comandos SQL a Partir de um Arquivo Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 Os Arquivos de Log do MySQL . . . . . . . . . . . . . . . . . . . . . . . 372 4.10.1 O Log de Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 4.10.2 O Log de Consultas. . . . . . . . . . . . . . . . . . . . . . . . . . 373 4.10.3 O Log de Atualizaes . . . . . . . . . . . . . . . . . . . . . . . 373 co 4.10.4 O Log Binrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 a 4.10.5 O Log para Consultas Lentas . . . . . . . . . . . . . . . . . 377 4.10.6 Manuteno do Log de Arquivo . . . . . . . . . . . . . . . 377 ca Replicao no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 ca 4.11.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 ca 4.11.2 Viso Geral da Implementao da Replicao . . 379 a ca ca 4.11.3 Detalhes de Implementao da Replicao . . . . . 380 ca ca 4.11.4 Como Congurar a Replicao . . . . . . . . . . . . . . . . 385 ca 4.11.5 Recursos de Replicao e Problemas Conhecidos ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 4.11.6 Opes de Inicializao da Replicao . . . . . . . . . 392 co ca ca 4.11.7 Instrues SQL para Controle do Servidor Master co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 4.11.7.1 PURGE MASTER LOGS . . . . . . . . . . . . . . . . . 400 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 . . . . . . . . . . . . . . . . 401 4.11.7.6 SHOW MASTER LOGS . . . . . . . . . . . . . . . . . . 401 4.11.7.7 SHOW SLAVE HOSTS . . . . . . . . . . . . . . . . . . 401 4.11.8 Instrues SQL para Controle do Servidor Slave co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 4.11.8.1 CHANGE MASTER TO . . . . . . . . . . . . . . . . . . 402 4.11.8.2 LOAD DATA FROM MASTER . . . . . . . . . . . . . 404 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. . . . . . . . . . . . . . . . . . . . . . . . 405 4.11.8.6 SET GLOBAL SQL_SLAVE_SKIP_COUNTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405 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 Replicao . . . . . . . . . . . . . . . . . . . . . . . . . . 410 ca 4.11.10 Problemas com Replicao . . . . . . . . . . . . . . . . . . 416 ca 4.11.11 Relatando Problemas de Replicao . . . . . . . . . . 417 ca
4.10
4.11
5.2
5.3
5.4
5.5
xi 5.6 5.5.6 Sintaxe de SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 Detalhes de Disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464 5.6.1 Utilizando Links Simblicos . . . . . . . . . . . . . . . . . . . 465 o 5.6.1.1 Utilizando Links Simblicos para Bancos de o Dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 5.6.1.2 Utilizando Links Simblicos para Tabelas o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 5.6.1.3 Usando Links Simblicos para Bancos de o Dados no Windows . . . . . . . . . . . . . . . . . . . . . . 467
xii 6.3.1.2 Operadores de Comparao . . . . . . . . . . . 504 ca 6.3.1.3 Operadores Logicos . . . . . . . . . . . . . . . . . . 508 6.3.1.4 Funes de Fluxo de Controle . . . . . . . . . 510 co 6.3.2 Funes String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511 co 6.3.2.1 Funes de Comparao de Strings . . . . 519 co ca 6.3.2.2 Caso Sensitivo . . . . . . . . . . . . . . . . . . . . . . . 521 6.3.3 Funes Numricas . . . . . . . . . . . . . . . . . . . . . . . . . . . 522 co e 6.3.3.1 Operaes Aritimticas . . . . . . . . . . . . . . . 522 co e 6.3.3.2 Funes Matematicas. . . . . . . . . . . . . . . . . 523 co 6.3.4 Funes de Data e Hora . . . . . . . . . . . . . . . . . . . . . . . 529 co 6.3.5 Funes de Converso . . . . . . . . . . . . . . . . . . . . . . . . . 543 co a 6.3.6 Outras Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545 co 6.3.6.1 Funes Binrias . . . . . . . . . . . . . . . . . . . . . 546 co a 6.3.6.2 Funes Diversas . . . . . . . . . . . . . . . . . . . . . 546 co 6.3.7 Funes e Modicadores para Usar com Clusulas co a GROUP BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 6.3.7.1 Funes GROUP BY . . . . . . . . . . . . . . . . . . . . 555 co 6.3.7.2 Modicadores GROUP BY . . . . . . . . . . . . . . 558 6.3.7.3 GROUP BY com Campos Escondidos . . . . 561 6.4 Manipulao de Dados: SELECT, INSERT, UPDATE e DELETE ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 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 Operando Escalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570 6.4.2.2 Comparaes Usando Subquery . . . . . . . 571 co 6.4.2.3 Subqueries with ANY, IN, and SOME . . . . 572 6.4.2.4 Subqueries with ALL. . . . . . . . . . . . . . . . . . 572 6.4.2.5 Correlated Subqueries . . . . . . . . . . . . . . . . 573 6.4.2.6 EXISTS and NOT EXISTS . . . . . . . . . . . . . . 573 6.4.2.7 Row Subqueries . . . . . . . . . . . . . . . . . . . . . . 574 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578 6.4.3 Sintaxe INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579 6.4.3.1 Sintaxe INSERT ... SELECT . . . . . . . . . . . 581 6.4.3.2 Sintaxe INSERT DELAYED . . . . . . . . . . . . . . 582 6.4.4 Sintaxe UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584 6.4.5 Sintaxe DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585 6.4.6 Sintaxe TRUNCATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587 6.4.7 Sintaxe REPLACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587 6.4.8 Sintaxe LOAD DATA INFILE. . . . . . . . . . . . . . . . . . . . . 588 6.4.9 Sintaxe HANDLER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595 6.4.10 Sintaxe DO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
xiii 6.5 Denio de Dados: CREATE, DROP e ALTER . . . . . . . . . . . . . . 597 ca 6.5.1 Sintaxe CREATE DATABASE . . . . . . . . . . . . . . . . . . . . . 597 6.5.2 Sintaxe DROP DATABASE . . . . . . . . . . . . . . . . . . . . . . . 597 6.5.3 Sintaxe CREATE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . 598 6.5.3.1 Alterao de Especicaes de Colunas ca co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607 6.5.4 Sintaxe ALTER TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . 608 6.5.5 Sintaxe RENAME TABLE . . . . . . . . . . . . . . . . . . . . . . . . . 612 6.5.6 Sintaxe DROP TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 6.5.7 Sintaxe CREATE INDEX . . . . . . . . . . . . . . . . . . . . . . . . . 613 6.5.8 Sintaxe DROP INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . 614 Comandos Utilitrios Bsicos do Usurio MySQL . . . . . . . . 614 a a a 6.6.1 Sintaxe USE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614 6.6.2 Sintaxe DESCRIBE (Obtem Informaes Sobre co Colunas) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614 Comandos Transacionais e de Lock do MySQL . . . . . . . . . . 615 6.7.1 Sintaxe de START TRANSACTION, COMMIT e ROLLBACK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615 6.7.2 Instrues que No Podem Ser Desfeitas . . . . . . . . 615 co a 6.7.3 Instrues que Fazem um Commit Implicito . . . . 616 co 6.7.4 Sintaxe de SAVEPOINT e ROLLBACK TO SAVEPOINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616 6.7.5 Sintaxe LOCK TABLES e UNLOCK TABLES . . . . . . . . . 617 6.7.6 Sintaxe SET TRANSACTION . . . . . . . . . . . . . . . . . . . . . 619 Pesquisa Full-text no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . 619 6.8.1 Restries Full-text . . . . . . . . . . . . . . . . . . . . . . . . . . . 623 co 6.8.2 Ajuste Fino de Pesquisas Full-text no MySQL . . 624 6.8.3 TODO de Pesquisas Full-text . . . . . . . . . . . . . . . . . . 625 Cache de Consultas do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 625 6.9.1 Como a Cache de Consultas Opera. . . . . . . . . . . . . 626 6.9.2 Congurao da Cache de Consultas . . . . . . . . . . . 627 ca 6.9.3 Opes da Cache de Consultas na SELECT . . . . . . 628 co 6.9.4 Estado e Manuteno da Cache de Consultas . . . 628 ca
6.6
6.7
6.8
6.9
7.2
xiv 7.3 7.4 7.5 7.2.1 Tabelas Tabelas Tabelas 7.5.1 7.5.2 7.5.3 7.5.4 Problemas com Tabelas MERGE . . . . . . . . . . . . . . . . . 640 ISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641 HEAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641 InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643 Viso Geral de Tabelas InnoDB. . . . . . . . . . . . . . . . 643 a InnoDB no MySQL Verso 3.23 . . . . . . . . . . . . . . . . 643 a Opes de Inicializao do InnoDB . . . . . . . . . . . . . 644 co ca Criando Tablespaces no InnoDB . . . . . . . . . . . . . . . 651 7.5.4.1 Se Alguma Coisa Der Errado Na Criao ca Do Banco de Dados . . . . . . . . . . . . . . . . . . . . . . 652 7.5.5 Criando Tabelas InnoDB . . . . . . . . . . . . . . . . . . . . . . 653 7.5.5.1 Convertendo Tabelas MyISAM para InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653 7.5.5.2 Restries FOREIGN KEY . . . . . . . . . . . . . . . 654 co 7.5.5.3 Multiplos tablespaces - colocando cada tabela em seu prprio arquivo .ibd . . . . . . . . 656 o 7.5.6 Adicionando e Removendo Arquivos de Dados e Log do InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658 7.5.7 Fazendo Backup e Recuperando um Banco de Dados InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658 7.5.7.1 Forando a recuperao . . . . . . . . . . . . . . 660 c ca 7.5.7.2 Ponto de Vericaao . . . . . . . . . . . . . . . . . 661 c 7.5.8 Movendo um Banco de Dados InnoDB para Outra Mquina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661 a 7.5.9 Modelo Transacional do InnoDB . . . . . . . . . . . . . . . 662 7.5.9.1 InnoDB e SET ... TRANSACTION ISOLATION LEVEL ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662 7.5.9.2 Leitura Consistente sem Lock . . . . . . . . . 663 7.5.9.3 Lock de Leitura SELECT ... FOR UPDATE e SELECT ... LOCK IN SHARE MODE . . . . . . . . . . 664 7.5.9.4 Lock da Chave Seguinte: Evitando Problemas com Fantasmas . . . . . . . . . . . . . . . . 665 7.5.9.5 Locks Denidos por Diferentes Instrues co SQL no InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . 665 7.5.9.6 Deteco de Deadlock e Rollback . . . . . . 666 ca 7.5.9.7 Um Exemplo de Como a Leitura Consistente Funciona no InnoDB . . . . . . . . . . 667 7.5.9.8 Como lidar com deadlocks? . . . . . . . . . . . 668 7.5.10 Dicas de Ajuste de Desempenho . . . . . . . . . . . . . . 669 7.5.10.1 SHOW INNODB STATUS e o Monitor InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670 7.5.11 Implementao de Multi-versioning . . . . . . . . . . . 672 ca 7.5.12 Estrutura de Tabelas e Indices . . . . . . . . . . . . . . . . 673 7.5.12.1 Estrutura F isica do Indice . . . . . . . . . . . 674 7.5.12.2 Buer de Insero. . . . . . . . . . . . . . . . . . . 674 ca 7.5.12.3 Indices Hash Adaptativos . . . . . . . . . . . . 675 7.5.12.4 Estrutura dos Registros F isicos . . . . . . 675
xv 7.5.12.5 Como Funciona uma Coluna AUTO_INCREMENT no InnoDB . . . . . . . . . . . . . . 675 7.5.13 Gerenciamento do Espao de Arquivos e E/S de c Disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676 7.5.13.1 E/S de Disco . . . . . . . . . . . . . . . . . . . . . . . 676 7.5.13.2 Gerenciamento do Espao de Arquivo c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677 7.5.13.3 Desfragmentando uma Tabela . . . . . . . . 678 7.5.14 Tratando Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678 7.5.15 Restries em Tabelas InnoDB . . . . . . . . . . . . . . . 678 co 7.5.16 Histrico de Alteraes do InnoDB . . . . . . . . . . . . 680 o co 7.5.16.1 MySQL/InnoDB-4.1.1, December 4, 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680 7.5.16.2 MySQL/InnoDB-4.0.16, October 22, 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680 7.5.16.3 MySQL/InnoDB-3.23.58, September 15, 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680 7.5.16.4 MySQL/InnoDB-4.0.15, September 10, 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680 7.5.16.5 MySQL/InnoDB-4.0.14, Junho de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681 7.5.16.6 MySQL/InnoDB-3.23.57, June 20, 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682 7.5.16.7 MySQL/InnoDB-4.0.13, 20 de Maio de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682 7.5.16.8 MySQL/InnoDB-4.1.0, 03 de Abril de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683 7.5.16.9 MySQL/InnoDB-3.23.56, 17 de Maro de c 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683 7.5.16.10 MySQL/InnoDB-4.0.12, 18 Maro de c 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684 7.5.16.11 MySQL/InnoDB-4.0.11, 25 de Fevereiro de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684 7.5.16.12 MySQL/InnoDB-4.0.10, 04 de Fevereiro de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684 7.5.16.13 MySQL/InnoDB-3.23.55, 24 de Janeiro de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685 7.5.16.14 MySQL/InnoDB-4.0.9, 14 de Janeiro de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685 7.5.16.15 MySQL/InnoDB-4.0.8, 07 de Janeiro de 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686 7.5.16.16 MySQL/InnoDB-4.0.7, 26 de Dezembro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686 7.5.16.17 MySQL/InnoDB-4.0.6, 19 de Dezembro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686 7.5.16.18 MySQL/InnoDB-3.23.54, 12 de Dezembro de 2002 . . . . . . . . . . . . . . . . . . . . . . . 687
xvi 7.5.16.19 MySQL/InnoDB-4.0.5, 18 de Novembro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687 7.5.16.20 MySQL/InnoDB-3.23.53, 09 de Outubro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688 7.5.16.21 MySQL/InnoDB-4.0.4, 02 de Outubro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689 7.5.16.22 MySQL/InnoDB-4.0.3, 28 de Agosto de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690 7.5.16.23 MySQL/InnoDB-3.23.52, 16 de Agosto de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690 7.5.16.24 MySQL/InnoDB-4.0.2, 10 de Julho de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692 7.5.16.25 MySQL/InnoDB-3.23.51, 12 de Junho de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692 7.5.16.26 MySQL/InnoDB-3.23.50, 23 de Abril de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692 7.5.16.27 MySQL/InnoDB-3.23.49, 17 de Fevereiro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693 7.5.16.28 MySQL/InnoDB-3.23.48, 09 de Fevereiro de 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693 7.5.16.29 MySQL/InnoDB-3.23.47, 28 de Dezembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . 694 7.5.16.30 MySQL/InnoDB-4.0.1, 23 de Dezembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695 7.5.16.31 MySQL/InnoDB-3.23.46, 30 de Novembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . 695 7.5.16.32 MySQL/InnoDB-3.23.45, 23 de Novembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . 695 7.5.16.33 MySQL/InnoDB-3.23.44, 02 de Novembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . 696 7.5.16.34 MySQL/InnoDB-3.23.43, 04 de Outubro de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696 7.5.16.35 MySQL/InnoDB-3.23.42, 09 de Setembro de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697 7.5.16.36 MySQL/InnoDB-3.23.41, 13 de Agosto de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697 7.5.16.37 MySQL/InnoDB-3.23.40, 16 de Julho de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697 7.5.16.38 MySQL/InnoDB-3.23.39, 13 de Junho de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697 7.5.16.39 MySQL/InnoDB-3.23.38, 12 de Maio de 2001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697 7.5.17 Informaes de Contato do InnoDB . . . . . . . . . . . . 697 co Tabelas BDB ou BerkeleyDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698 7.6.1 Viso Geral de Tabelas BDB. . . . . . . . . . . . . . . . . . . . 698 a 7.6.2 Instalando BDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698 7.6.3 Opes de Inicializao do BDB . . . . . . . . . . . . . . . . . 699 co ca 7.6.4 Caracteristicas de Tabelas BDB: . . . . . . . . . . . . . . . . 700
7.6
xvii 7.6.5 Itens a serem corrigidos no BDB num futuro prximo: o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701 7.6.6 Sistemas operacionais suportados pelo BDB . . . . . . 701 7.6.7 Restries em Tabelas BDB . . . . . . . . . . . . . . . . . . . . 702 co 7.6.8 Erros Que Podem Ocorrer Usando Tabelas BDB . . 702
xviii 9.4.1 Strings de Resultados . . . . . . . . . . . . . . . . . . . . . . . . . 720 9.4.2 CONVERT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720 9.4.3 CAST() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720 9.4.4 SHOW CHARACTER SET . . . . . . . . . . . . . . . . . . . . . . . . . . 721 9.4.5 SHOW COLLATION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721 9.4.6 SHOW CREATE DATABASE . . . . . . . . . . . . . . . . . . . . . . . . 722 9.4.7 SHOW FULL COLUMNS . . . . . . . . . . . . . . . . . . . . . . . . . . . 722 9.5 Suporte Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 722 9.6 UTF8 para Metdados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723 9.7 Compatibilidade com Outros SGBDs . . . . . . . . . . . . . . . . . . . 724 9.8 Novo Formato do Arquivo de Congurao do Conjunto de ca Caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724 9.9 Conjunto de Caracteres Nacional . . . . . . . . . . . . . . . . . . . . . . . 724 9.10 Atualizando para o MySQL 4.0. . . . . . . . . . . . . . . . . . . . . . . . 725 9.10.1 Conjunto de Caracteres do MySQL e o Par/Conjunto de Caracter/Collation Correspondente do MySQL 4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726 9.11 Os conjuntos de Caracteres e Collations que o MySQL Suporta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726 9.11.1 O Conjunto de Caracteres Unicode. . . . . . . . . . . . 728 9.11.2 Conjunto de Caracteres para Plataformas Espec icas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728 9.11.3 Conjunto de Caracteres do Sul da Europa e Oriente Mdio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728 e 9.11.4 Os Conjuntos de Caracteres Asiticos . . . . . . . . . 728 a 9.11.5 Os Conjuntos de Caracteres Blticos . . . . . . . . . . 729 a 9.11.6 Os Conjuntos de Caracteres Cir ilicos . . . . . . . . . . 729 9.11.7 O Conjunto de Caracteres da Europa Central . . 730 9.11.8 Os Conjuntos de Caracteres da Europa Ocidental . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
10
xix 10.3.1 Formato Well-Known Text (WKT). . . . . . . . . . . . 740 10.3.2 Formato Well-Known Binary (WKB). . . . . . . . . . 741 10.4 Criando um Banco de Dados MySQL Habilitado Espacialmente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741 10.4.1 Tipos de Dados Espaciais do MySQL . . . . . . . . . 742 10.4.2 Criando Valores Espaciais . . . . . . . . . . . . . . . . . . . . 742 10.4.2.1 Criando Valores Geometry Usando Funes WKT . . . . . . . . . . . . . . . . . . . . . . . . . . . 742 co 10.4.2.2 Criando Valores Geometry Usando Funes WKB . . . . . . . . . . . . . . . . . . . . . . . . . . . 743 co 10.4.2.3 Criando uma Valor de Geometira Usando Funes Espec co icas do MySQL . . . . . . . . . . . 744 10.4.3 Criando Colunas Espaciais . . . . . . . . . . . . . . . . . . . 745 10.4.4 Entrando com Dados em Colunas Espaciais . . . . 746 10.4.5 Buscando Dados Espaciais . . . . . . . . . . . . . . . . . . . 747 10.4.5.1 Buscando Dados Espaciais em um Formato Interno . . . . . . . . . . . . . . . . . . . . . . . . . 747 10.4.5.2 Buscando Dados Espaciais no Formato WKT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747 10.4.5.3 Buscando Dados Espaciais no Formato WKB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747 10.5 Analisando Informao Espacial . . . . . . . . . . . . . . . . . . . . . . . 747 ca 10.5.1 Funes Para Converter Geometrias Entre Formatos co Diferentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748 10.5.2 Funes de Anlise das Propriedades de Geometry co a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748 10.5.2.1 Funes de Anlise das Propriedades de co a Geometry em Geral . . . . . . . . . . . . . . . . . . . . . . 749 10.5.2.2 Funes de Anlise das Propriedades de co a Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750 10.5.2.3 Funes de Anlise das Propriedades de co a LineString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751 10.5.2.4 Funes de Anlise das Propriedades de co a MultiLineString . . . . . . . . . . . . . . . . . . . . . . . . 752 10.5.2.5 Funes de Anlise das Propriedades de co a Polygon. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753 10.5.2.6 Funes de Anlise das Propriedades de co a MultiPolygon . . . . . . . . . . . . . . . . . . . . . . . . . . . 754 10.5.2.7 Funes de Anlise das Propriedades de co a GeometryCollection . . . . . . . . . . . . . . . . . . . . 754 10.5.3 Funes Que Criam Novas Geometrias de Outras co Existentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755 10.5.3.1 Funes de Geometria Que Produzem co Novas Geometrias . . . . . . . . . . . . . . . . . . . . . . . . 755 10.5.3.2 Operadores Espaciais . . . . . . . . . . . . . . . . 755 10.5.4 Funes Para Testar Relaes Espaciais Entre co co Objetos Geomtricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 756 e
xx 10.5.5 Relaes de Retngulo de Limite M co a inimo (Minimal Bounding Rectangles - MBR) em Geometrias . . . . . 756 10.5.6 Funes que Testam Relacionamentos Espaciais co Entre Geometrias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757 Otimizando Anlises Espaciais . . . . . . . . . . . . . . . . . . . . . . . . 758 a 10.6.1 Criando Indices Espaciais . . . . . . . . . . . . . . . . . . . . 758 10.6.2 Usando Indice Espacial . . . . . . . . . . . . . . . . . . . . . . 759 Compatibilidade e Conformidade com o MySQL . . . . . . . . 761 10.7.1 Recursos GIS Que Ainda No Esto Implementados a a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
10.6
10.7
11
xxi
12
xxii 12.1.3.43 mysql_real_connect() . . . . . . . . . . . . 812 12.1.3.44 mysql_real_escape_string() . . . . . 815 12.1.3.45 mysql_real_query() . . . . . . . . . . . . . . 816 12.1.3.46 mysql_reload() . . . . . . . . . . . . . . . . . . . 817 12.1.3.47 mysql_row_seek(). . . . . . . . . . . . . . . . . 818 12.1.3.48 mysql_row_tell(). . . . . . . . . . . . . . . . . 818 12.1.3.49 mysql_select_db() . . . . . . . . . . . . . . . 819 12.1.3.50 mysql_set_server_option(). . . . . . . 819 12.1.3.51 mysql_shutdown(). . . . . . . . . . . . . . . . . 820 12.1.3.52 mysql_sqlstate(). . . . . . . . . . . . . . . . . 820 12.1.3.53 mysql_ssl_set() . . . . . . . . . . . . . . . . . . 821 12.1.3.54 mysql_stat() . . . . . . . . . . . . . . . . . . . . . 821 12.1.3.55 mysql_store_result() . . . . . . . . . . . . 822 12.1.3.56 mysql_thread_id() . . . . . . . . . . . . . . . 823 12.1.3.57 mysql_use_result() . . . . . . . . . . . . . . 824 12.1.3.58 mysql_warning_count() . . . . . . . . . . . 825 12.1.3.59 mysql_commit() . . . . . . . . . . . . . . . . . . . 825 12.1.3.60 mysql_rollback(). . . . . . . . . . . . . . . . . 826 12.1.3.61 mysql_autocommit() . . . . . . . . . . . . . . 826 12.1.3.62 mysql_more_results() . . . . . . . . . . . . 826 12.1.3.63 mysql_next_result() . . . . . . . . . . . . . 827 12.1.4 Instrues Preparadas da API C . . . . . . . . . . . . . . 828 co 12.1.5 Tipos de Dados de Instruoes Preparadas da API C c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828 12.1.6 Viso Geral das Funes de Instrues Preparadas a co co da API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831 12.1.7 Descrio das Funes de Instruo Preparada da ca co ca API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833 12.1.7.1 mysql_prepare() . . . . . . . . . . . . . . . . . . . 833 12.1.7.2 mysql_param_count() . . . . . . . . . . . . . . 835 12.1.7.3 mysql_get_metadata() . . . . . . . . . . . . . 835 12.1.7.4 mysql_bind_param() . . . . . . . . . . . . . . . 836 12.1.7.5 mysql_execute() . . . . . . . . . . . . . . . . . . . 837 12.1.7.6 mysql_stmt_affected_rows(). . . . . . . 841 12.1.7.7 mysql_bind_result() . . . . . . . . . . . . . . 842 12.1.7.8 mysql_stmt_store_result() . . . . . . . . 843 12.1.7.9 mysql_stmt_data_seek() . . . . . . . . . . . 844 12.1.7.10 mysql_stmt_row_seek() . . . . . . . . . . . 844 12.1.7.11 mysql_stmt_row_tell() . . . . . . . . . . . 845 12.1.7.12 mysql_stmt_num_rows() . . . . . . . . . . . 845 12.1.7.13 mysql_fetch() . . . . . . . . . . . . . . . . . . . . 846 12.1.7.14 mysql_send_long_data() . . . . . . . . . . 851 12.1.7.15 mysql_stmt_close() . . . . . . . . . . . . . . 853 12.1.7.16 mysql_stmt_errno() . . . . . . . . . . . . . . 854 12.1.7.17 mysql_stmt_error() . . . . . . . . . . . . . . 854 12.1.7.18 mysql_stmt_sqlstate() . . . . . . . . . . . 855 12.1.8 Tratando a Execuo de Mltiplas Consultas na ca u API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
xxiii 12.1.9 Manipulando Valores de Data e Hora na API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 856 12.1.10 Descrio das Funes de Threads da API C . . 858 ca co 12.1.10.1 my_init() . . . . . . . . . . . . . . . . . . . . . . . . 858 12.1.10.2 mysql_thread_init() . . . . . . . . . . . . . 858 12.1.10.3 mysql_thread_end() . . . . . . . . . . . . . . 858 12.1.10.4 mysql_thread_safe() . . . . . . . . . . . . . 859 12.1.11 Descrio das Funes do Servidor Embutido da ca co API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859 12.1.11.1 mysql_server_init() . . . . . . . . . . . . . 859 12.1.11.2 mysql_server_end() . . . . . . . . . . . . . . 860 12.1.12 Dvidas e problemas comuns ao utilzar a API C u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 861 12.1.12.1 Porque Algumas Vezes mysql_store_result() Retorna NULL Aps o mysql_query() Returnar com Sucesso? . . . . 861 12.1.12.2 Que Resultados Posso Onbetr de uma Consulta? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 861 12.1.12.3 Como Posso Obter a ID Unica para a Ultima Linha Inserida? . . . . . . . . . . . . . . . . . . . 861 12.1.12.4 Problemas com Ligao na API C . . . 862 ca 12.1.13 Construindo Programas Clientes . . . . . . . . . . . . . 862 12.1.14 Como Fazer um Cliente em Threads . . . . . . . . . 863 12.1.15 libmysqld, a Biblioteca do Servidor Embutido MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864 12.1.15.1 Viso Geral da Biblioteca do Servidor a MySQL Embutido . . . . . . . . . . . . . . . . . . . . . . . 864 12.1.15.2 Compilando Programas com libmysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865 12.1.15.3 Restries no Uso de um Servidor co MySQL Embutido . . . . . . . . . . . . . . . . . . . . . . . 865 12.1.15.4 Usando Arquivo de Opes com o co Servidor Embutido . . . . . . . . . . . . . . . . . . . . . . . 865 12.1.15.5 Itens a Fazer no Servidor Embutido (TODO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866 12.1.15.6 Um Exemplo Simples de Servidor Embutido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866 12.1.15.7 Licensiando o Servidor Embutido . . . 870 12.2 Suporte ODBC ao MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 870 12.2.1 Como Instalar o MyODBC . . . . . . . . . . . . . . . . . . . 870 12.2.2 Como Preencher os Vrios Campos no Programa de a Administrao do ODBC . . . . . . . . . . . . . . . . . . . . . . . . 871 ca 12.2.3 Parmetros de Conexo do MyODBC . . . . . . . . . 872 a a 12.2.4 Como Relatar Problemas com o MyODBC . . . . 873 12.2.5 Programas que Funcionam com MyODBC . . . . . 874 12.2.6 Como Obter o Valor de uma Coluna AUTO_INCREMENT no ODBC . . . . . . . . . . . . . . . . . . . . . . 878 12.2.7 Relatando Problemas com MyODBC . . . . . . . . . . 879
xxiv 12.3 Conectividade Java (JDBC) ao MySQL . . . . . . . . . . . . . . . . 12.4 API PHP do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Informaes DBI/DBD . . . . . . . . . . . . . . . . . . . co 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880 880 880 880 881 881 887 887 887 888 888 888
13 14
xxv
xxvi A.5.7 Problemas com Comparao de Ponto Flutuante ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934 Assuntos Relacionados ao Otimizador . . . . . . . . . . . . . . . . . . 936 A.6.1 Camo evitar o varredura da tabela,,,. . . . . . . . . . . 937 Assuntos Relacionados a Denies de Tabelas . . . . . . . . . . 937 co A.7.1 Problemas com ALTER TABLE. . . . . . . . . . . . . . . . . . 937 A.7.2 Como Alterar a Ordem das Colunas em Uma Tabela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 938 A.7.3 Problemas com TEMPORARY TABLE . . . . . . . . 938
A.6 A.7
xxvii D.3.7 Alteraes na distribuio 4.0.11 (20 Feb 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 983 D.3.8 Alteraes na distribuio 4.0.10 (29 Jan 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 984 D.3.9 Alteraes na distribuio 4.0.9 (09 Jan 2003) . . 985 co ca D.3.10 Alteraes na distribuio 4.0.8 (07 Jan 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 986 D.3.11 Alteraes na distribuio 4.0.7 (20 Dec 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 986 D.3.12 Alteraes na distribuio 4.0.6 (14 Dec 2002: co ca Gamma) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 987 D.3.13 Alteraes na distribuio 4.0.5 (13 Nov 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 988 D.3.14 Alteraes na distribuio 4.0.4 (29 Sep 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 990 D.3.15 Alteraes na distribuio 4.0.3 (26 Aug 2002: co ca Beta) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 992 D.3.16 Alteraes na distribuio 4.0.2 (01 Jul 2002) . . 994 co ca D.3.17 Alteraes na distribuio 4.0.1 (23 Dec 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997 D.3.18 Alteraes na distribuio 4.0.0 (Oct 2001: Alpha) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 998 D.4 Alteraes na distribuio 3.23.x (Recent; still supported) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000 D.4.1 Alteraes na distribuio 3.23.59 (not released yet) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000 D.4.2 Alteraes na distribuio 3.23.58 (11 Sep 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001 D.4.3 Alteraes na distribuio 3.23.57 (06 Jun 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001 D.4.4 Alteraes na distribuio 3.23.56 (13 Mar 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002 D.4.5 Alteraes na distribuio 3.23.55 (23 Jan 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1003 D.4.6 Alteraes na distribuio 3.23.54 (05 Dec 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1004 D.4.7 Alteraes na distribuio 3.23.53 (09 Oct 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1005 D.4.8 Alteraes na distribuio 3.23.52 (14 Aug 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006 D.4.9 Alteraes na distribuio 3.23.51 (31 May 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006 D.4.10 Alteraes na distribuio 3.23.50 (21 Apr 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1007 D.4.11 Alteraes na distribuio 3.23.49 . . . . . . . . . . . 1008 co ca D.4.12 Alteraes na distribuio 3.23.48 (07 Feb 2002) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1008
xxviii D.4.13 Alteraes na distribuio 3.23.47 (27 Dec 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009 D.4.14 Alteraes na distribuio 3.23.46 (29 Nov 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009 D.4.15 Alteraes na distribuio 3.23.45 (22 Nov 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010 D.4.16 Alteraes na distribuio 3.23.44 (31 Oct 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010 D.4.17 Alteraes na distribuio 3.23.43 (04 Oct 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011 D.4.18 Alteraes na distribuio 3.23.42 (08 Sep 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012 D.4.19 Alteraes na distribuio 3.23.41 (11 Aug 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1013 D.4.20 Alteraes na distribuio 3.23.40 . . . . . . . . . . . 1013 co ca D.4.21 Alteraes na distribuio 3.23.39 (12 Jun 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1014 D.4.22 Alteraes na distribuio 3.23.38 (09 May 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1014 D.4.23 Alteraes na distribuio 3.23.37 (17 Apr 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015 D.4.24 Alteraes na distribuio 3.23.36 (27 Mar 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016 D.4.25 Alteraes na distribuio 3.23.35 (15 Mar 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016 D.4.26 Alteraes na distribuio 3.23.34a . . . . . . . . . . 1017 co ca D.4.27 Alteraes na distribuio 3.23.34 (10 Mar 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017 D.4.28 Alteraes na distribuio 3.23.33 (09 Feb 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1018 D.4.29 Alteraes na distribuio 3.23.32 (22 Jan 2001: co ca Production) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1019 D.4.30 Alteraes na distribuio 3.23.31 (17 Jan 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1019 D.4.31 Alteraes na distribuio 3.23.30 (04 Jan 2001) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1020 D.4.32 Alteraes na distribuio 3.23.29 (16 Dec 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1021 D.4.33 Alteraes na distribuio 3.23.28 (22 Nov 2000: co ca Gamma) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1022 D.4.34 Alteraes na distribuio 3.23.27 (24 Oct 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024 D.4.35 Alteraes na distribuio 3.23.26 (18 Oct 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024 D.4.36 Alteraes na distribuio 3.23.25 (29 Sep 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1025 D.4.37 Alteraes na distribuio 3.23.24 (08 Sep 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026
xxix D.4.38 Alteraes na distribuio 3.23.23 (01 Sep 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1027 D.4.39 Alteraes na distribuio 3.23.22 (31 Jul 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1028 D.4.40 Alteraes na distribuio 3.23.21 . . . . . . . . . . . 1028 co ca D.4.41 Alteraes na distribuio 3.23.20 . . . . . . . . . . . 1029 co ca D.4.42 Alteraes na distribuio 3.23.19 . . . . . . . . . . . 1029 co ca D.4.43 Alteraes na distribuio 3.23.18 . . . . . . . . . . . 1030 co ca D.4.44 Alteraes na distribuio 3.23.17 . . . . . . . . . . . 1030 co ca D.4.45 Alteraes na distribuio 3.23.16 . . . . . . . . . . . 1031 co ca D.4.46 Alteraes na distribuio 3.23.15 (May 2000: co ca Beta) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1031 D.4.47 Alteraes na distribuio 3.23.14 . . . . . . . . . . . 1032 co ca D.4.48 Alteraes na distribuio 3.23.13 . . . . . . . . . . . 1033 co ca D.4.49 Alteraes na distribuio 3.23.12 (07 Mar 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1033 D.4.50 Alteraes na distribuio 3.23.11 . . . . . . . . . . . 1034 co ca D.4.51 Alteraes na distribuio 3.23.10 . . . . . . . . . . . 1034 co ca D.4.52 Alteraes na distribuio 3.23.9 . . . . . . . . . . . . 1034 co ca D.4.53 Alteraes na distribuio 3.23.8 (02 Jan 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035 D.4.54 Alteraes na distribuio 3.23.7 (10 Dec 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036 D.4.55 Alteraes na distribuio 3.23.6 . . . . . . . . . . . . 1036 co ca D.4.56 Alteraes na distribuio 3.23.5 (20 Oct 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1037 D.4.57 Alteraes na distribuio 3.23.4 (28 Sep 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1038 D.4.58 Alteraes na distribuio 3.23.3 . . . . . . . . . . . . 1038 co ca D.4.59 Alteraes na distribuio 3.23.2 (09 Aug 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1039 D.4.60 Alteraes na distribuio 3.23.1 . . . . . . . . . . . . 1040 co ca D.4.61 Alteraes na distribuio 3.23.0 (05 Aug 1999: co ca Alpha) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1040 D.5 Alteraes na distribuio 3.22.x (Old; discontinued) . . . 1042 co ca D.5.1 Alteraes na distribuio 3.22.35 . . . . . . . . . . . . 1042 co ca D.5.2 Alteraes na distribuio 3.22.34 . . . . . . . . . . . . 1042 co ca D.5.3 Alteraes na distribuio 3.22.33 . . . . . . . . . . . . 1042 co ca D.5.4 Alteraes na distribuio 3.22.32 (14 Feb 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1042 D.5.5 Alteraes na distribuio 3.22.31 . . . . . . . . . . . . 1043 co ca D.5.6 Alteraes na distribuio 3.22.30 . . . . . . . . . . . . 1043 co ca D.5.7 Alteraes na distribuio 3.22.29 (02 Jan 2000) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1043 D.5.8 Alteraes na distribuio 3.22.28 (20 Oct 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1043 D.5.9 Alteraes na distribuio 3.22.27 . . . . . . . . . . . . 1043 co ca
xxx D.5.10 Alteraes na distribuio 3.22.26 (16 Sep 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1044 D.5.11 Alteraes na distribuio 3.22.25 . . . . . . . . . . . 1044 co ca D.5.12 Alteraes na distribuio 3.22.24 (05 Jul 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1044 D.5.13 Alteraes na distribuio 3.22.23 (08 Jun 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1044 D.5.14 Alteraes na distribuio 3.22.22 (30 Apr 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1045 D.5.15 Alteraes na distribuio 3.22.21 . . . . . . . . . . . 1045 co ca D.5.16 Alteraes na distribuio 3.22.20 (18 Mar 1999) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1045 D.5.17 Alteraes na distribuio 3.22.19 (Mar 1999: co ca Production) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1045 D.5.18 Alteraes na distribuio 3.22.18 . . . . . . . . . . . 1045 co ca D.5.19 Alteraes na distribuio 3.22.17 . . . . . . . . . . . 1046 co ca D.5.20 Alteraes na distribuio 3.22.16 (Feb 1999: co ca Gamma) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1046 D.5.21 Alteraes na distribuio 3.22.15 . . . . . . . . . . . 1046 co ca D.5.22 Alteraes na distribuio 3.22.14 . . . . . . . . . . . 1047 co ca D.5.23 Alteraes na distribuio 3.22.13 . . . . . . . . . . . 1047 co ca D.5.24 Alteraes na distribuio 3.22.12 . . . . . . . . . . . 1047 co ca D.5.25 Alteraes na distribuio 3.22.11 . . . . . . . . . . . 1048 co ca D.5.26 Alteraes na distribuio 3.22.10 . . . . . . . . . . . 1048 co ca D.5.27 Alteraes na distribuio 3.22.9 . . . . . . . . . . . . 1049 co ca D.5.28 Alteraes na distribuio 3.22.8 . . . . . . . . . . . . 1049 co ca D.5.29 Alteraes na distribuio 3.22.7 (Sep 1998: Beta) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1050 D.5.30 Alteraes na distribuio 3.22.6 . . . . . . . . . . . . 1050 co ca D.5.31 Alteraes na distribuio 3.22.5 . . . . . . . . . . . . 1051 co ca D.5.32 Alteraes na distribuio 3.22.4 . . . . . . . . . . . . 1052 co ca D.5.33 Alteraes na distribuio 3.22.3 . . . . . . . . . . . . 1053 co ca D.5.34 Alteraes na distribuio 3.22.2 . . . . . . . . . . . . 1053 co ca D.5.35 Alteraes na distribuio 3.22.1 (Jun 1998: Alpha) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1054 D.5.36 Alteraes na distribuio 3.22.0 . . . . . . . . . . . . 1054 co ca D.6 Alteraes na distribuio 3.21.x . . . . . . . . . . . . . . . . . . . . . . 1056 co ca D.6.1 Alteraes na distribuio 3.21.33 . . . . . . . . . . . . 1056 co ca D.6.2 Alteraes na distribuio 3.21.32 . . . . . . . . . . . . 1056 co ca D.6.3 Alteraes na distribuio 3.21.31 . . . . . . . . . . . . 1056 co ca D.6.4 Alteraes na distribuio 3.21.30 . . . . . . . . . . . . 1057 co ca D.6.5 Alteraes na distribuio 3.21.29 . . . . . . . . . . . . 1057 co ca D.6.6 Alteraes na distribuio 3.21.28 . . . . . . . . . . . . 1057 co ca D.6.7 Alteraes na distribuio 3.21.27 . . . . . . . . . . . . 1058 co ca D.6.8 Alteraes na distribuio 3.21.26 . . . . . . . . . . . . 1058 co ca D.6.9 Alteraes na distribuio 3.21.25 . . . . . . . . . . . . 1058 co ca D.6.10 Alteraes na distribuio 3.21.24 . . . . . . . . . . . 1059 co ca D.6.11 Alteraes na distribuio 3.21.23 . . . . . . . . . . . 1059 co ca
xxxi D.6.12 Alteraes na distribuio 3.21.22 . . . . . . . . . . . co ca D.6.13 Alteraes na distribuio 3.21.21a . . . . . . . . . . co ca D.6.14 Alteraes na distribuio 3.21.21 . . . . . . . . . . . co ca D.6.15 Alteraes na distribuio 3.21.20 . . . . . . . . . . . co ca D.6.16 Alteraes na distribuio 3.21.19 . . . . . . . . . . . co ca D.6.17 Alteraes na distribuio 3.21.18 . . . . . . . . . . . co ca D.6.18 Alteraes na distribuio 3.21.17 . . . . . . . . . . . co ca D.6.19 Alteraes na distribuio 3.21.16 . . . . . . . . . . . co ca D.6.20 Alteraes na distribuio 3.21.15 . . . . . . . . . . . co ca D.6.21 Alteraes na distribuio 3.21.14b . . . . . . . . . . co ca D.6.22 Alteraes na distribuio 3.21.14a . . . . . . . . . . co ca D.6.23 Alteraes na distribuio 3.21.13 . . . . . . . . . . . co ca D.6.24 Alteraes na distribuio 3.21.12 . . . . . . . . . . . co ca D.6.25 Alteraes na distribuio 3.21.11 . . . . . . . . . . . co ca D.6.26 Alteraes na distribuio 3.21.10 . . . . . . . . . . . co ca D.6.27 Alteraes na distribuio 3.21.9 . . . . . . . . . . . . co ca D.6.28 Alteraes na distribuio 3.21.8 . . . . . . . . . . . . co ca D.6.29 Alteraes na distribuio 3.21.7 . . . . . . . . . . . . co ca D.6.30 Alteraes na distribuio 3.21.6 . . . . . . . . . . . . co ca D.6.31 Alteraes na distribuio 3.21.5 . . . . . . . . . . . . co ca D.6.32 Alteraes na distribuio 3.21.4 . . . . . . . . . . . . co ca D.6.33 Alteraes na distribuio 3.21.3 . . . . . . . . . . . . co ca D.6.34 Alteraes na distribuio 3.21.2 . . . . . . . . . . . . co ca D.6.35 Alteraes na distribuio 3.21.0 . . . . . . . . . . . . co ca D.7 Alteraes na distribuio 3.20.x . . . . . . . . . . . . . . . . . . . . . . co ca D.7.1 Alteraes na distribuio 3.20.18 . . . . . . . . . . . . co ca D.7.2 Alteraes na distribuio 3.20.17 . . . . . . . . . . . . co ca D.7.3 Alteraes na distribuio 3.20.16 . . . . . . . . . . . . co ca D.7.4 Alteraes na distribuio 3.20.15 . . . . . . . . . . . . co ca D.7.5 Alteraes na distribuio 3.20.14 . . . . . . . . . . . . co ca D.7.6 Alteraes na distribuio 3.20.13 . . . . . . . . . . . . co ca D.7.7 Alteraes na distribuio 3.20.11 . . . . . . . . . . . . co ca D.7.8 Alteraes na distribuio 3.20.10 . . . . . . . . . . . . co ca D.7.9 Alteraes na distribuio 3.20.9 . . . . . . . . . . . . . co ca D.7.10 Alteraes na distribuio 3.20.8 . . . . . . . . . . . . co ca D.7.11 Alteraes na distribuio 3.20.7 . . . . . . . . . . . . co ca D.7.12 Alteraes na distribuio 3.20.6 . . . . . . . . . . . . co ca D.7.13 Alteraes na distribuio 3.20.3 . . . . . . . . . . . . co ca D.7.14 Alteraes na distribuio 3.20.0 . . . . . . . . . . . . co ca D.8 Alteraes na distribuio 3.19.x . . . . . . . . . . . . . . . . . . . . . . co ca D.8.1 Alteraes na distribuio 3.19.5 . . . . . . . . . . . . . co ca D.8.2 Alteraes na distribuio 3.19.4 . . . . . . . . . . . . . co ca D.8.3 Alteraes na distribuio 3.19.3 . . . . . . . . . . . . . co ca 1059 1060 1060 1060 1061 1061 1061 1062 1062 1063 1063 1063 1064 1064 1065 1065 1065 1066 1066 1066 1067 1067 1068 1068 1069 1069 1070 1071 1071 1071 1072 1072 1073 1073 1073 1073 1074 1075 1076 1076 1076 1077 1077
xxxii
Apndice F Variveis de Ambientes do MySQL e a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1092 Apndice G Sintaxe de Expresses Regulares do e o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1093 Apndice H GPL - Licena P blica Geral do e c u GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1096 Indices dos Comandos, Tipos e Funoes SQL c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1102 Concept Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1111
1 Informaes Gerais co
O programa MySQL R um servidor robusto de bancos de dados SQL (Structured Query e Language - Linguagem Estruturada para Pesquisas) muito rpido, multi-tarefa e multia usurio. O Servidor MySQL pode ser usado em sistemas de produo com alta carga e a ca misso critica bem como pode ser embutido em programa de uso em massa. MySQL uma a e marca registrada da MySQL AB. O programa MySQL de Licena Dupla. Os usurios podem escolher entre usar o proe c a grama MySQL como um produto Open Source/Free Software sob os termos da GNU General Public License (http://www.fsf.org/licenses/) ou podem comprar uma licena comc ercial padro da MySQL AB. Veja Seo 1.4 [Licensing and Support], Pgina 17. a ca a O site web do MySQL (http://www.mysql.com/) dispe das ultimas informaes sobre o o co programa MySQL. A seguinte lista descreve algumas sees de particular interesse neste manual: co Para informaes sobre a empresa por trs do Servidor do Banco de Dados MySQL, co a veja Seo 1.3 [What is MySQL AB], Pgina 12. ca a Para discusses das capacidades do Servidor do Banco de Dados MySQL, veja o Seo 1.2.2 [Features], Pgina 6. ca a Para instrues de instalao, veja Cap co ca ptexi tulo 2 [Installing], Pgina 60. a Para dicas sobre a portabilidade do Servidor do Banco de Dados MySQL para novas arquiteturas ou sistemas operacionais, veja Apndice E [Porting], Pgina 1078. e a Para informaes sobre a atualizao da verso 4.0, veja Seo 2.5.1 [Upgrading-fromco ca a ca 4.0], Pgina 121. a Para informaes sobre a atualizao da verso 3.23, veja Seo 2.5.2 [Upgrading-fromco ca a ca 3.23], Pgina 123. a Para informaes sobre a atualizao da verso 3.22, veja Seo 2.5.3 [Upgrading-fromco ca a ca 3.22], Pgina 127. a Para um tutorial de introduo ao Servidor do Banco de Dados MySQL, veja Capptexi ca tulo 3 [Tutorial], Pgina 168. a Para exemplos de SQL e informaes sobre benchmarks, veja o diretrio de benchmarks co o (sql-bench na distribuio). ca Para o histrico de novos recursos e correes de erros, veja Apndice D [News], o co e Pgina 957. a Para uma lista de erros atualmente conhecidos e mal-funcionamento, veja Seo 1.8.6 ca [Bugs], Pgina 54. a Para projetos futuros, veja Seo 1.6 [TODO], Pgina 27. ca a Para ver a lista de todos os colaboradores deste projeto, veja Apndice C [Credits], e Pgina 945. a Importante: Relatrios de erros (tambm chamados bugs), bem como dvidas e comentrios, devem ser o e u a enviados para a lista de email geral do MySQL. Veja Seo 1.7.1.1 [Mailing-list], Pgina 33. ca a Veja Seo 1.7.1.3 [Bug reports], Pgina 36. ca a
O script mysqlbug deve ser usado para gerar comunicados de erros no Unix. (A distribuio ca do Windows contm um arquivo mysqlbug.txt no diretrio base que pode ser usado como e o um template para um relatrio de erro. o Em distribuies fonte, o script mysqlbug pode ser encontrado no diretrio scripts. Para co o distribuies binrias, o mysqlbug pode ser encontrado no diretrio bin (/usr/bin para co a o o pacote RMP do servidor MySQL. Se voc encontrou um erro de segurana no Servidor MySQL, voc deve enviar um email e c e para [email protected].
de ambiente. Exemplo: Para ver como o mysqladmin funciona, execute-o com a opo --help. ca filename Fonte de largura xa com aspas usada para nomes e caminhos de arquivos. e Exemplo: A distribuio instalada sobre o diretrio /usr/local. ca e o c Fonte de largura constante com aspas tambm usada para indicar sequncias e e e de caracteres. Exemplo: Para especicar um meta caracter, use o caractere %. Fonte Itlica usada para dar nfase, como aqui. a e e Fonte em negrito usada em cabealhos de tabela e indicar nfase especial. e c e
italic boldface
Quando um comando deve ser executado por um programa, ele indicado por um prompt e antes do comando. Por exemplo, shell> indica um comando que executado do seu shell e atual e mysql> indica um comando que executado no programa cliente mysql; e shell> digite um comando shell aqui mysql> digite um comando mysql aqui A shell seu interpretador de comando. No Unix, ele normalmente um programa e e como sh ou csh. No Windows, o equivalente o command.com ou cmd.exe, normalmente e executado como um console do Windows. Comandos Shell so mostrados usando a sintaxe do Shell Bourne. Se voc usa um shell do a e estilo csh, pode ser necessrio alterar algum de seus comandos. Por exemplo, a sequncia a e para congurar uma varivel de ambiente e executar um comando se parece com o listado a abaixo na sintaxe Bourne Shell: shell> NOMEVAR=valor algum_comando Para csh ou tcsh, execute a sequncia desta forma: e shell> setenv NOMEVAR valor shell> algum_comando Frequentemente, nomes de bancos de dados, tabelas e colunas devem ser substitu idos nos comandos. Para indicar que as substituies so necessrias, este manual usa nome_db, co a a nome_tbl e nome_col. Por exemplo, voc pode encontrar uma expresso assim: e a mysql> SELECT nome_col FROM nome_bd.nome_tbl; Isso signica que se voc estiver trabalhando numa expresso similar, forneceria seu prprio e a o nome de banco de dados, tabela e colunas, talvez assim: mysql> SELECT nome_autor FROM biblio_bd.lista_autor; SQL keywords no caso sensitivas e podem ser escritas em maiscula ou minscula. Este a u u manual utiliza letras maisculas. u Em descries de sintaxe, colchetes ([ e ]) so usados para indicar palavras ou clusulas co a a opcionais. Por exemplo, na seguinte instruo, IF EXISTS opcional: ca e DROP TABLE [IF EXISTS] nome_tbl Quando elementos da sintaxe possuem mais de uma alternativa, elas so separados por a barras verticais (|). Quando um menbro de um conjunto de opes pode ser escolhido, as co alternativas so listadas em colchetes ([ e ]): a
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) Quando um membro de um conjunto de opes deve ser selecionado, as alternativas so co a listadas dentro de chaves ({ e }): {DESCRIBE | DESC} nome_tbl {nome_col | metacar}
em uma aplicao comercial voc pode adquirir a verso comercial licenciada ca e a conosco. Veja Seo 1.4.3 [Licenas MySQL], Pgina 18. ca c a Por que usar o Banco de Dados MySQL? O servidor de banco de dados MySQL extremamente rpido, convel, e fcil e a a a de usar. Se isto o que voc est procurando, voc deveria experiment-lo. O e e a e a Servidor MySQL tambm tem um conjunto de recursos muito prticos desene a volvidos com a cooperao de nossos usurios. Voc pode encontrar comparaca a e tivos de performance do Servidor MySQL com outros gerenciadores de bancos de dados na nossa pgina de benchmark Veja Seo 5.1.4 [MySQL Benchmarks], a ca Pgina 421. a O Servidor MySQL foi desenvolvido originalmente para lidar com bancos de dados muito grandes de maneira muito mais rpida que as solues existentes a co e tem sido usado em ambientes de produo de alta demanda por diversos ca anos de maneira bem sucedida. Apesar de estar em constante desenvolvimento, o Servidor MySQL oferece hoje um rico e proveitoso conjunto de funes. A co conectividade, velocidade, e segurana fazem com que o MySQL seja altamente c adaptvel para acessar bancos de dados na Internet. a As caracter isticas tcnicas do MySQL e Para informaes tcnicas avanadas, veja Cap co e c ptexi tulo 6 [Reference], Pgina 469. a O Programa de Banco de Dados MySQL um sistema e cliente/servidor que consiste de um servidor SQL multi-tarefa que suporta acessos diferentes, diversos programas clientes e bibliotecas, ferramentas administrativas e diversas interfaces de programao (APIs). ca Tambm concedemos o Servidor MySQL como uma biblioteca multi-tarefa que e voc pode ligar ` sua aplicao para chegar a um produto mais rpido, menor e a ca a e mais fcilmente gerencivel. a a MySQL tem muitos softwares de colaboradores dispon ivel. E bem provvel que sua aplicao ou linguagem favorita j suporte o Servidor a ca a de Banco de Dados MySQL. A pronncia ocial do MySQL Mai Ess Que Ell (e no MAI-SEQUEL). Mas ns no u e a o a ligamos se voc pronunciar MAI-SEQUEL ou de outra forma qualquer. e
O nome do golnho do MySQL (nosso logo) Sakila. Sakila foi escolhido pelos fune dadores da MySQL AB de uma enorme lista de nomes sugeridos pelos usurios em nosso a concurso "Name the Dolphin". O nome vencedor foi enviado por Ambrose Twebaze, um desenvolvedor de programas open source de Swaziland, Africa. De acordo com Ambrose, o nome Sakila tem as suas ra em SiSwati, a l izes ingua local de Swaziland. Sakila tambm o e e nome de uma cidade em Arusha, Tanzania, prxima ao pa de or o is igem de Ambrose, Uganda.
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 Seo 6.2 [Tipos de Coluna], ca Pgina 482. a Registros de tamanhos xos ou variveis. a
Comandos e Funes co Completo suporte a operadores e funes nas partes SELECT e WHERE das co consultas. Por exemplo: mysql> SELECT CONCAT(first_name, " ", last_name) -> FROM nome_tbl -> WHERE income/dependents > 10000 AND age > 30; Suporte pleno `s clusulas SQL GROUP BY e ORDER BY. Suporte para funes a a co de agrupamento (COUNT(), COUNT(DISTINCT ...), AVG(), STD(), SUM(), MAX() e MIN()). Suporte para LEFT OUTER JOIN e RIGHT OUTER JOIN com as sintaxes SQL e ODBC. Alias em tabelas e colunas so dispon a iveis como denidos no padro SQL92. a DELETE, INSERT, REPLACE, e UPDATE retornam o nmero de linhas que u foram alteradas (afetadas). E poss ivel retornar o nmero de linhas com u padro coincidentes congurando um parmetro quando estiver conectando a a ao servidor. O comando espec ico do MySQL SHOW pode ser usado para devolver informaes sobre bancos de dados, tabelas e co indices. O comando EXPLAIN pode ser usado para determinar como o otimizador resolve a consulta. Nomes de funes no conitam com nomes de tabelas ou colunas. Por co a exemplo, ABS um nome de campo vlido. A unica restrio que para uma e a ca e chamada de funo, espaos no so permitidos entre o nome da funo e ca c a a ca o ( que o segue. Veja Seo 6.1.7 [Palavras reservadas], Pgina 479. ca a Voc pode misturar tabelas de bancos de dados diferentes na mesma e pesquisa (como na verso 3.22). a Segurana c Um sistema de privilgios e senhas que muito ex e e ivel, seguro e que permite vericao baseada em estaes/mquinas. Senhas so seguras porque ca co a a todo o trco de senhas criptografado quando voc se conecta ao servidor. a e e Escalabilidade e limites Lida com bancos de dados enormes. Usamos o Servidor MySQL com bancos de dados que contm 50.000.000 registros e sabemos de usurios que usam e a o Servidor MySQL com 60.000 tabelas e aproximadamente 5.000.000.000 de linhas. So permitidos at 32 a e indices por tabela. Cada indice pode ser composto de 1 a 16 colunas ou partes de colunas. O tamanho mximo do a indice e de 500 bytes (isto pode ser alterado na compilao do MySQL). Um ca 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 NT (NT, 2000 ilia ou XP), os clientes podem se conectar usando named pipes. No sistema Unix, os clientes podem se conectar usando arquivos sockets.
A interface Connector/ODBC fornece ao MySQL suporte a progras clientes que usam conexo ODBC (Open-DataBase-Connectivity). Por exemplo, a voc pode usar o MS Access para conectar ao seu servidor MySQL. Os e clientes podem ser executados no Windows ou Unix. O fonte do Connector/ODBC est dispon a ivel. Todas as funes ODBC so suportadas, assim co a como muitas outras. Veja Seo 12.2 [ODBC], Pgina 870. ca a Localizao ca O servidor pode apresentar mensagem de erros aos clientes em vrias a l inguas. Veja Seo 4.7.2 [Languages], Pgina 327. ca a Suporte total para vrios conjuntos de caracteres, que incluem ISO-8859-1 a (Latin1), big5, ujis e mais. Por exemplo, os caracteres Escandinavos ^, a , so permitidos em nomes de tabelas e colunas. a o a Todos os dados so armazenados no conjunto de caracteres escolhido. Toa das as comparaes em colunas de seqncias caso-insensitivo. co ue A ordenao feita de acordo com o conjunto de caracteres escolhido (o ca e modo sueco por padro). E poss alterar isso quando o servidor MySQL a ivel iniciado. Para ver um exemplo de vrias ordenaes avanadas, procure e a co c pelo cdigo de ordenao Tcheca. O Servidor MySQL suporta diversos cono ca juntos de caracteres que podem ser especicados em tempo de compilao ca e execuo. ca Clientes e Ferramentas O servidor MySQL foi constru com suporte para instrues SQL que ido co vericam, otimizam e reparam tabelas. Estas instrues esto dispon co a iveis a partir da linha de comando por meio do cliente myisamcheck, O MySQL inclui tambm o myisamchk, um utilitrio muito rpido para realizar estas e a a operaes em tabelas MyISAM. Veja Cap co ptexi tulo 4 [MySQL Database Administration], Pgina 207. a Todos os programas MySQL podem ser chamados com as opes --help ou co -? para obter ajuda online.
Cada distribuio do Servidor MySQL foi sendo usado, e os problemas tem ocorrido somente ca quando os usurios comeam a usar o cdigo das reas cinzentas. Naturalmente, novos a c o a usurios no sabem o que so as reas cinzentas; esta seo tenta indicar aquelas que so a a a a ca a conhecidas atualmente. As descries lidam com a Verso 3.23 e 4.0 do Servidor MySQL. co a Todos os erros conhecidos e relatados so corrigidos na ultima verso, com a exceo dos a a ca bugs listados na seo de erros, os quais so relacionados ao desenho. Veja Seo 1.8.6 ca a ca [Bugs], Pgina 54. a O Servidor MySQL escrito em mltiplas camadas com mdulos independentes. Alguns e u o dos novos mdulos esto listados abaixo com indicaes de quo bem-testado foi cada um o a co a deles. Replicao Gamma ca Grandes grupos de servidores usando replicao esto em uso, com bom resulca a tados. O trabalho no aprimoramento dos recursos de replicao continua no ca MySQL 4.x. Tabelas InnoDB Estvel (na 3.23, 3.23.49) a O mecanismo de armazenamento transacional InnoDB foi declarado estvel na a a rvore do MySQL 3.23, a partir da verso 3.23.49. InnoDB tem sido usado em a sistema de produo grandes e com carga pesada. ca Tabelas BDB Gamma O cdigo do Berkeley DB muito estvel, mas ainda estamos melhorando a o e a interface do mecanismo de armazenamento transacional do BDB no Servidor MySQL, assim levar algum tempo at que ele esteja to bem testado quanto os a e a outro tipos de tabela. Pesquisas Full-text Beta Pesquisa full-text funcionam mas ainda no so largamente usadas. Melhoraa a mentos importantes forma implementados no MySQL 4.0. MyODBC 3.51 (usa ODBC SDK 3.51) Estvel a Em grande uso na produo. Alguns problemas apresentados parecem ser relaca cionados a aplicao e independente do driver ODBC ou do servidor de banco ca de dados. Recuperao automtica de tabelas MyISAM Gamma ca a Este status se aplica apenas ao novo cdigo que confere no mecanismo de aro mazenamento MyISAM que verica, na inicializao, se a tabela foi fechada corca retamente e executa uma conferncia/reparo automtico da tabela em caso e a negativo. Bulk-insert Alpha Novo recurso nas tabelas MyISAM no MySQL 4.0 para inseres mais rpidas de co a vrios registros. a Locking Gamma Esse mdulo muito dependente do sistema. Em alguns sistemas existem certos o e problemas por utilizar o locking padro do SO (fcntl(). Nestes casos, voc a e deve executar o mysqld com o parmetro --skip-external-locking. So a a conhecidos alguns problemas ocorridos em alguns sistemas Linux e no SunOS quando utiliza-se sistemas de arquivos montados em NFS.
10
Clientes que pagam recebem suporte direto e de alta qualidade da MySQL AB. A MySQL AB tambm fornece uma lista de discusso como um recurso da comunidade onde qualquer e a pessoa pode tirar suas dvidas. u Erros so normalmente corrigidos com um patch; para erros srios, normalmente lanada a e e c uma nova distribuio. ca
No Linux 2.2 voc pode ter tabelas maiores que 2 GB usando o patch LFS para o sistema e de arquivos ext2. No Linux 2.4 j existem patches para o sistema de arquivos ReiserFS para a ter suporte a arquivos maiores. A maioria das distribuies atuais so baseadas no kernel co a 2.4 e j incluem todos os patches Suporte a Arquivos Grandes (Large File Support - LFS) a exigidos. No entanto, o tamanho mximo dispon a ivel ainda depende de diversos fatores, sendo um deles o sistema de arquivos usado para armazenar as tabelas MySQL. Para um viso mais detalhada sobre LFS no Linux, d uma olha na pgina Andreas Jaegers a e a "Large File Support in Linux" em http://www.suse.de/~aj/linux_lfs.html. Por padro, o MySQL cria tabelas MyISAM com uma estrutura interna que permite um a tamanho mximo em torno de 4G. Voc pode vericar o tamanho mximo da tabela com a e a o comando SHOW TABLE STATUS ou com o myisamchk -dv nome_tabela Veja Seo 4.6.8 ca [SHOW], Pgina 302. a Se voc precisa de tabelas maiores que 4G (e seu sistema operacional suporta arquivos e grandes), a instruo CREATE TABLE permite as opes AVG_ROW_LENGHT e MAX_ROWS. Use ca co estas opes para criar uma tabela que possa ter mais de 4GB. Veja Seo 6.5.3 [CREATE co ca TABLE], Pgina 598. Voc pode tambm alterar isso mais tarde com ALTER TABLE. Veja a e e Seo 6.5.4 [ALTER TABLE], Pgina 608. ca a Outros modos se contornar o limite do tamanho do arquivo das tabelas MyISAM so os a seguintes: Se sua tabela grande ser somente leitura, voc poder usar o myisampack para unir a e a e comprimir vrias tabelas em uma. mysisampack normalmente comprime uma tabela a
11
em pelo menos 50%, portanto voc pode obter, com isso, tabelas muito maiores. Veja e Seo 4.8.4 [myisampack], Pgina 336. ca a Outra opo para contornar o limite de tamanho de arquivos do sistema operacional ca para arquivos de dados MyISAM usando a opo RAID. Veja Seo 6.5.3 [CREATE TABLE], ca ca Pgina 598. a O MySQL inclu uma biblioteca MERGE que permite acessar uma coleo de tabelas i ca idnticas como se fosse apenas uma. Veja Seo 7.2 [MERGE], Pgina 638. e ca a
12
mysql> SELECT * FROM y2k; +------------+---------------------+----------------+ | date | date_time | time_stamp | +------------+---------------------+----------------+ | 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 | | 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 | | 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 | | 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 | | 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 | | 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 | | 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 | | 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 | | 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 | | 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 | | 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 | | 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 | | 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 | +------------+---------------------+----------------+ 13 rows in set (0.00 sec) O valor da coluna TIMESTAMP nal zero porque o ano nal (2050) excede o TIMESTAMP e maximo. O tipo de dados TIMESTAMP, que usado para armazenar a hora atual, suporta e valores na faixa de 19700101000000 a 20300101000000 em mquinas 32 bits (valor com a sinal). Em mquinas de 64 bits, TIMESTAMP trata valores at 2106 (valores sem sinal). a e O exemplo mostra que os tipos DATE e DATETIME no tem problemas com as datas usadas. a Eles iro conseguir trabalhar com datas at o ano 9999. a e Embora o MySQL Server seja seguro em relao ao ano 2000, voc pode ter problemas se voc ca e e us-lo com aplicaes que no so seguras com o ano 2000. Por exemplo, muitas aplicaes a co a a co antigas armazenam ou manipulam anos usando valores de 2 digitos (que so amb a iguos) em vez de 4 d igitos. Este problema pode ser aumentado por aplicaes que usam valores como co 00 ou 99 como indicadores de valores perdidos. Infelizmente, estes problemas pode ser dif iceis de corrigir, cada um deles pode usar um conjunto diferente de convenes e funes co co de tratamento de datas. Assim, apesar do Servidor MySQL no ter problemas com o ano 2000, de responsabilidade a e de sua aplicao fornecer datas que no sejam amb ca a iguas. Veja Seo 6.2.2.1 [Y2K issues], ca Pgina 490 para as regras do Servidor MySQL para lidar com entrada de datas amb a iguas que contenham valores de ano com 2 d igitos.
13
Os desenvolvedores do servidor MySQL so todos empregados pela companhia. ny Ns somo a o uma organizao virtual com pessoas em uma dzia de pa ca u ises. Nos comunicamos extensivamente na internet todos os dias uns com os outros e com nossos usurios, agentes de a suporte e parceiros. Ns nos dedicamos a desenvolver o programa MySQL e propagar nosso banco de dados a o novos usurios.A MySQL AB detm os direitos autorais do cdigo fonte do MySQL, do logo e a e o da marca MySQL e deste manual. Veja Seo 1.2 [What-is], Pgina 4. ca a A ideologia do MySQL mostra nossa dedicao ao MySQL e ao Open Source. ca Ns desejamos que o Programa de Banco de Dados MySQL seja: o O melhor e o mais usado banco de dados no mundo. Acess e dispon para todos. ivel ivel Fcil de usar. a Melhorado continuamente, permanecendo rpido e seguro. a Divertido de se usar e aprimorar. Livre de erros (bugs). A MySQL AB e sua equipe: Promovem a losoa Open Source e suporte ` comunidade Open Source. a Tem como objetivo serem bons cidados. a Tem preferncia por parceiros que compartilhem nossos valores e idias. e e Respondem e-mails e do suporte. a So uma empresa virtual, conectada com outras. a Trabalha contra patentes de sistemas. O site do MySQL (http://www.mysql.com/) fornece as ultimas informaes sobre o MySQL co e a MySQL AB. A propsito, a parte AB do nome da companhia o acrnimo para a palavra suca o e o e aktiebolag, ou sociedade annima. Ela traduzida para MySQL, Inc. De fato, o e MySQL Inc. e MySQL GmbH so exemplos de subsidirias da MySQL AB. Elas esto a a a localizadas nos EUA e Alemanha, respectivamente.
14
1.3.1.1 Suporte
A MySQL AB gerenciada pelos fundadores e principais desenvolvedores do banco de dados e MySQL. Os desenvolvedores tem o compromisso de dar suporte aos clientes e outros usurios a com objetivo de manterem contato com as suas necessiades e problemas. Todo o nosso suporte dado por desenvolvedores qualicado. Dvidas mais complicadas so respondidas e u a por Michael Monty Widenius, principal autor do MySQL Server. Veja Seo 1.4.1 [Suporte], ca Pgina 17. a Para maiores informaes e pedido de suporte de diversos n co iveis, veja http://www.mysql.com/support/ ou contate nossos vendedores em [email protected].
1.3.1.3 Consultoria
A MySQL AB e seus Parceiros Autorizados oferecem servios de consultoria para usurios c a do Servidor MySQL e `queles que utilizam o Servisdor MySQL embutido em seus programas, a em qualquer parte do mundo. Nossos consultores podem ajud-lo projetando e ajustando o seu banco de dados, criar a consultas ecientes, ajustar sua plataforma para uma melhor performance, resolver questes o
15
de migrao, congurar replicao, criar aplicaes transacionais robustas, e mais. Tambm ca ca co e ajudamos os nossos clientes com o Servidor MySQL embutido em seus produtos e aplicaes co para desenvolvimento em larga-escala. Nossos consultores trabalham em colaborao com a nossa equipe de desenvolvimento, o ca que assegura a qualidade tcnica de nossos servios prossionais. Os servios de consultoria e c c varia de sesses de 2 dias a projetos que gastam semanas e meses. Nosso peritos no apenas o a cobrem o Servidor MySQLeles tambm conhecem sobre linguagens de programao e scripts e ca tais como PHP, Perl e mais. Se estiver interessado em nossos servios de consultoria ou quiser se tornar nosso parceiro, c visite a seo sobre consultaria em nosso web site em http://www.mysql.com/consulting/ ca ou contate nossa equipe de consultoria em [email protected].
1.3.1.5 Parcerias
A MySQL AB tem um programa de parceria mundial que cobre cursos de treinamento, consultaria e suporte, publicaes, mais a revenda e distribiuio do MySQL e produtos co ca relacionados. Os Parceiros da MySQL AB ganham visibilidade no nosso web site (http://www.mysql.com/) e o direito de usarem verses especiais da marca MySQL para o identicar seus produtos e promoverem os seus negcios. o Se voc est interessado em se tornar um Parceiro da MySQL AB, envie-nos um email para e a [email protected]. A palavra MySQL e o logomarca do golnho da MySQL so marcas registradas da MySQL AB. a Veja Seo 1.4.4 [MySQL AB Logos and Trademarks], Pgina 20. Estas marcas registradas ca a representam um valor signicante que os fundadores do MySQL construiram ao longo dos anos. O web site do MySQL (http://www.mysql.com/) popular entre desenvolvedores e usurios. e a Em Outubro de 2001, obtivemos mais de 10 milhes e views. Nossos visitantes representam o um grupo que tomam decises de compra e fazem recomendes de software e hardware. o co Vinte por cento de nossos vistantes autorizam decises de compra e apenas nove por cento o no esto envolvidos com a rea de compras. Mais de 65% zeram uma ou mais compras a a a online no ultimo semaster e 70% planejam fazer uma compra nos prximos meses. o
16
O web site do MySQL (http://www.mysql.com/) fornece as ultimas informaes sobre MySQL co e MySQL AB. Para servios de imprensa e questes no cobertas por nossas releases de nott c o a icias (http://www.mysql.com/news/), envie-nos um email para [email protected]. Se voc tiver um contrato de suporte vlido com a MySQL AB, voc receber em tempo, e a e a respostas precisas para as suas questes tcnicas sobre o programa MySQL. o e Para mais informaes, veja Seo 1.4.1 [Support], Pgina 17. Em nosso site na web, veja co ca a http://www.mysql.com/support/, ou envie um e-mail para [email protected]. Para informaes sobre treinamento MySQL, visite a seo de treinamento em co ca http://www.mysql.com/training/. Se voc tiver acesso restrito ` Internet, conte a e a equipe de treinamento da MySQL AB via e-mail em [email protected]. Veja Seo 1.3.1.2 ca [Business Services Training], Pgina 14. a Para informaes sobre o Progrma de Certificao MySQL, veja http://www.mysql.com/certification/. co c Veja Seo 1.3.1.2 [Business Services Training], Pgina 14. ca a Se voc estiver interessado em consultoria, visite a seo de consultorias de nosso web e ca site em http://www.mysql.com/consulting/. Se voc tiver restries acesso a internet, e co contate a equipe de consultores da MySQL AB via e-mail em [email protected]. Veja Seo 1.3.1.3 [Business Services Consulting], Pgina 14. ca a Licenas comerciais podem ser compradas online em https://order.mysql.com/. c L voc tambm encontrar informaes de como enviar um fax da sua ordem de a e e a co compra para a MySQL AB. Mais informaes sobre licenas podem ser encontradas em co c http://www.mysql.com/products/pricing.html. Se voc tiver duvidas em relao a e ca licenciamento ou quiser cota para negociao de um alto volume de licenas, preencha o ca c formulrio de contato em nosso site web (http://www.mysql.com/) ou envie um email a para [email protected] (para questes sobre licenciamento) ou para [email protected] o (para pedidos de compra). Veja Seo 1.4.3 [Licenas MySQL], Pgina 18. ca c a Se voc est interessado em fazer parceira com a MySQL AB, envie um e-mail para e a [email protected]. Veja Seo 1.3.1.5 [Business Services Partnering], Pgina 15. ca a Para mais detalhes sobre a politica da marca MySQL, visite http://www.mysql.com/company/trademark.ht ou envie um e-mail para [email protected]. Veja Seo 1.4.4 [MySQL AB Logos and ca Trademarks], Pgina 20. a Se voc est interessado em qualquer um dos trabalhos da MySQL AB lista na seo de trae a ca balhos (http://www.mysql.com/company/jobs/), envie um e-mail para [email protected]. No nos envie o seu CV em anexo, mas como texto no nal de sua mensagem de email. a Para discusses gerais entre nosso muitos usurios, direcione a sua ateno para a lista de o a ca discusso apropriada. Veja Seo 1.7.1 [Dvidas], Pgina 33. a ca u a Relatrios de erros (geralmente chamados bugs), assim como questes e comentrios, deo o a vem ser enviados para a lista de email geral do MySQL. Veja Seo 1.7.1.1 [Mailing-list], ca Pgina 33. Caso voc encontre um bug de segurana importante no MySQL Server, envie-nos a e c um e-mail para [email protected]. Veja Seo 1.7.1.3 [Bug reports], Pgina 36. ca a Se voc tiver resultados de benchmarks que podemos publicar, contate-nos via e-mail em e [email protected].
17
Se voc tiver sugestes a respeito de adies ou conexes para este manual, envie-os para a e o co o equipe do manual via e-mail em [email protected].
Para questes ou comentrios sobre o funcionamento ou cotedo do web site da MySQL o a u (http://www.mysql.com/), envie um e-mail para [email protected]. A MySQL AB tem uma pol itica de privacidade que pode ser lida em http://www.mysql.com/company/privac Para qualquer questes a respeito desta pol o itica, envie um e-mail para [email protected]. Para todos os outros assunto, envie um e-mail para [email protected].
18
3. Algumas partes da fonte (a biblioteca regexp) coberta por um copyright no estilo e Berkeley. 4. Verses mais antiga do MySQL (3.22 e anteriror) esto sujeitos a uma licena estrita o a c (http://www.mysql.com/products/mypl.html). Veja a documentao da verso esca a pec ica para mais informao. ca 5. O manual de referncia do MySQL atualmente no distribu sob uma licecna no e a e ido c estilo da GPL. O uso deste manual est sujeito aos seguintes termos: a A converso para outros formatos permitido, mas o contedo atual no pode ser a e u a alterado ou editado de modo algum. Voc pode criar uma cpia impressa para seu prprio uso pessoal. e o o Para todos os outros usos, como venda de cpias impressas ou uso (de partes) do o manual em outra publicao, necessrios um acordo com a MySQL AB previamente ca e a escrito. Envie-nos email para [email protected] para maiores informaes ou se voc estiver co e interessado em fazer a traduo. ca Para informaes sobre como as licenas do MySQL funcionam na prtica, de uma olhada co c a em Seo 1.4.3 [MySQL licenses], Pgina 18. Veja tambm Seo 1.4.4 [MySQL AB Logos ca a e ca and Trademarks], Pgina 20. a
O programa MySQL distribu e ido sob a GNU General Public License (GPL), que provavelmente a melhor licena Open Source conhecida. e c Os termos formais da licena GPL pode ser encontrado em http://www.fsf.org/licenses/. Veja tambm c e http://www.fsf.org/licenses/gpl-faq.html e http://www.gnu.org/philosophy/enforcing-gpl.htm Como o programa MySQL distribu sob a GPL, ele pode ser usa geralmente de graa, mas e ido c para certos usos voc pode querer ou precisar comprar lincenas comerciais da MySQL AB em e c https://order.mysql.com/. Veja http://www.mysql.com/products/licensing.html para mais informaes. co Verses mais antigas do MySQL (3.22 e anteriores) esto sujeitos a uma licena mais estrita o a c (http://www.mysql.com/products/mypl.html). Veja a documentao da verso espec ca a ica para mais informao. ca Note que o uso do programa MySQL sob uma licena comercial, GPL ou a antiga licena do c c MySQL no d automaticamente o direito de usar as marcas registradas da MySQL AB. Veja a a Seo 1.4.4 [MySQL AB Logos and Trademarks], Pgina 20. ca a
19
Quando voc liga um programa com qualquer cdigo GPL do programa MySQL e no que e o a que o produto resultante seja licenciado sob a GPL, talvez porque voc queira criar um e produto comercial ou manter fechado o cdigo no GPL adicionado por outras razes. o a o Ao comprar a lincena comercial, voc no est usando o programa MySQL sob GPL c e a a embora o cdigo seja o mesmo. o Quando voc distribui uma aplicao no GPL que s funciona com o programa MySQL e ca a o e a entrega com o programa MySQL. Este tipo de soluo considerada mesmo se feita ca e em uma rede. Quando voc distribui cpias do programa MySQL sem fornecer o cdigo fonte como e o o exigido sob a licena GPL. c Quando voc quiser dar suporte adional ao desenvolvimento do banco de dados do e MySQL mesmo se voc no precisar formalmente de uma licena comercial. Comprar e a c o suporte diretamente da MySQL AB outro bom modo de contribuir com o desene volvimento do programa MySQL, com vantagens imediatas para voc. Veja Seo 1.4.1 e ca [Support], Pgina 17. a Se voc requisita uma licecna, voc precisar de uma para cada instalao do programa e c e a ca MySQL. Ela cobre qualquer nmero de CPUs na mquina, e np h nenhum limite articial u a a a no nmero de clientes que conectam aom servidor de qualquer modo. u Para licenas comercias, ,visite o nosso site web em http://www.mysql.com/products/licensing.html. c Para contrato de suporte, veja http://www.mysql.com/support/. Se voc tiver necessie dades especiais ou tiver acesso restrito a Internet, contate a nossa quipe de vendas via email em [email protected].
20
Quando voc usa o banco de dados MySQL em conjunto com um servidor web, voc no e e a precisa de uma licena comercial (uma vez que este no um produto distribu por c a e ido voc). Isto verdade mesmo se voc executar um servidor web comercial que utilize e e e MySQL Server, pois voc no est distribuindo qualquer parte do sistema MySQL. No e a a entanto, neste caso ns gostariamos que voc adquirisse o suporte ao MySQL pois o o e MySQL est ajudandoa sua empresa. a Se o seu uso do banco de dados MySQL no exige uma licena comercial, lhe encorajamos a c a adquirir um suporte da MySQL AB de qualquer forma. Deste modo voc contribui com o e desenvolvimento do MySQL e tambm ganha vantegens imediatas. Veja Seo 1.4.1 [Support], e ca Pgina 17. a Se voc utiliza o bancdo de dados MySQL em um contexto comercial e obtem lucro com e o seu uso, pedimos que voc ajude no desenvolvimento do MySQL adquirindo algum n e ivel de suporte. Sentimos que se banco de dados MySQL ajudou os seus negcios, razovel o e a pedirmos que voc ajude a MySQL AB. (De outra forma, se voc nos pedir suporte, voc no e e e a s estar usando de graa algo em que colocamos muito trabalhom mas tambm pedindo o a c e que lhe forneamos suporte de graa tambm). c c e
1.4.4.2 Logomarcas da MySQL que Podem Ser Usadas Sem Permisso de Alterao a ca
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 permisses de escrita da MySQL AB. O uso destas logomarcas no o a so totalmente irrestritas mas, como o nome indica, sujeitos a nossa politica de marcas a registradasque tambm est dispon e a ivel em nosso site. Voc deve ler a pol e itica de marcas registradas se plabeja us-las. As exigncias so basicamente as apresentadas aqui: a e a Use a logomarca que voc preciisa como mostrado no site http://www.mysql.com/. e Voc pode mudar sua escala para servir as suas necessidades, mas no pode alterar e a cores ou o desenho, ou alterar os gracos de forma alguma.
21
Deixe evidente que voc, e no a MySQL AB, o criado e proprietrio do site que mostra e a e a a logomarca do MySQL. No use a logomarca em detrimento ` MySQL AB ou ao valor das marcas registradas da a a MySQL AB. Nos reservamos o direito de revogar o diretiro de uso da marcas registradas da MySQL AB. Se voc utilizar as maracas em um site da web, faa com que ele contenha um link para e c http://www.mysql.com/. Se voc utilizar o banco de dados MySQL sob GPL em uma aplicao, sua aplicao deve e ca ca ser Open Source deve estar apta a conectar a um servidor MySQL. Contate-nos via e-mail em [email protected] para saber sobre os nosso acordos especiais que sirvam as suas necessidades.
1.4.4.3 Quando Voc Precisa de Permisso de Alterao para Usar e a ca as Logomarcas do MySQL?
Voc precisa de permisso escrita da MySQL AB antes de usar as logomarcas do MySQL nos e a seguintes casos: Quando exibir qualquer logomarca da MySQL AB em qualquer lugar diferente so seu site. Quando exibir qualquer logomarca da MySQL AB exceta as de Uso Condicional mencionadas anteiormente em sites ou outro lugar. Devido a razes comerciais e legais monitoramos o so das marcas registradas do MySQL o em proutos, livros e outros itens. Normalmente exigimos um valor para a exibio das ca logomarcas da MySQL AB em produtos comerciais, j que achamos razovel que parte dos a a rendimentos seja retornado para nanciar o desenvolvimento do banco de dados MySQL.
22
23
24
A maioria dos parmetros mysqld (opes de inicializao) agora podem a co ca ser denidas se nalizar o servidor. Isto um recurso conveniente para e Administradores de Bancos de Dados (DBAs). Veja Seo 5.5.6 [SET OPca TION], Pgina 460. a Instrues DELETE e UPDATE multi-tabelas foram adicionadas. co Foi adicionado suporte ao mecanismo de armazenamento MyISAM para link simblico no n de tabela (e no apenas a n de banco de dados como o ivel a ivel antes) e para habilitar o tratamento de links simblicos no Windows por o padro. a SQL_CALC_FOUND_ROWS e FOUND_ROWS() so novas funes que tornaram a co poss encontrar o nmeros de linhas que uma consulta SELECT que inclui ivel u uma clusula LIMIT teria retornado se a clusula no fosse utilizada. a a a A seo de novidades deste manual inclui uma lista mais aprofundada dos recursos. Veja ca Seo D.3 [News-4.0.x], Pgina 966. ca a
25
A maioria dos novos recursos em codicao, como stored procedures, estaro dispon ca a iveis no MySQL 5.0. Veja Seo 1.6.2 [TODO MySQL 5.0], Pgina 27. ca a Suporte a subqueries e tabelas derivadas Uma subquery uma instruo SELECT aninhada dentro de outras ine ca strues. Uma tabela dericada (unnamed view) uma subquery na clusula co e a FROM de outras instrues. Veja Seo 6.4.2 [Subqueries], Pgina 570. co ca a Aumento na velocidade Protocols binrios mais rpidos com instrues preparadas e parmetros a a co a de ligao. Veja Seo 12.1.4 [C API Prepared statements], Pgina 828. ca ca a Indexao BTREE agora suportado por tabelas HEAP, aumentando de forma ca e signicante o tempo de resposta para busca que no so exatas. a a Nova funcionalidade CREATE TABLE tabela1 LIKE tabela2 lhe permite criar uma nova tabela com a estrutura exatamente igual a de uma tabela existente, usando um unico comando. Suporte aos tipos espaciais OpenGIS (dados geogrcos). Veja Cap a ptexi tulo 10 [Spatial extensions in MySQL], Pgina 733. a A replicao pode ser feita sobre conexo SSL. ca a Compatibilidade aos padres, portabilidade e migrao o ca O novo protocolo cliente/servidor adiciona a possibilidade de se passar mltiplos avisos ao cliente, no lugar se um unico resultado. Isto faz com u que o trabalho como uma grande carga de dados seja muito mais fcil a de rastrear. SHOW WARNINGS exibe avisos para o ultimo comando. Veja Seo 4.6.8.9 [SHOW WARNINGS], Pgina 323. ca a Internacionalizao ca Para suportar nossa base de usurio sempre em expanso usando linguagens a a locais nas aplicaes, o programa MySQL agora oferece suporte Unicode co extensivo por meio dos conjunto de caracteres utf8 e ucs2. Os conjuntos de caracteres agora podem ser denidos por colunas, tabelas e banco de dados. Isto permite um alto grau de exibilidade no desenho das aplicaes, particularmente para sites-web multi-linguagens. co Para documentao sobre este suporte a conjunto de caracters aprimorados, ca veja Capptexi tulo 9 [Charset], Pgina 710. a Aprimoramento da usabilidade Em resposta a demanda popular, adicionamos um comando HELP com base no servidor que pode ser usado para conseguir ajuda para comandos MySQL. A vantagem de se ter esta informao no lado do servidor ca e que a informao sempre aplicvel para aquela verso do servidor em parca e a a ticular. Como esta informao est dispon executando uma instruo ca a ivel ca SQL, outros clientes tambm podero ser escritos para acess-la. Por exe a a emplo, o cliente mysql de linha de comando foi modicado para ter esta capacidade.
26
No novo protocolo cliente/servidor, vrias instrues podem ser feitas a co com uma unica chamada. Veja Seo 12.1.8 [C API multiple queries], ca Pgina 855. a O novo protocolo cliente/servidor tambm suporta retorno de vrios resule a tados. Isto pode ocorrer como resultado de enviar vrias instrues, por a co 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) primria (PRIMARY) ou unica a (UNIQUE) (index) duplicada. Veja Seo 6.4.3 [INSERT], Pgina 579. ca a Projetamos uma nova funo de agrupamento GROUP_CONCAT(), adicioca nando a capacidade de concatenar colunas de registros agrupados em uma unica string de resultado, o que extremamente util. Veja Seo 6.3.7 e ca [Group by functions and modiers], Pgina 555. a A seo de novidades neste manual incluem uma lista mais completa de recursos. Veja ca Seo D.2 [Novidades na verso 4.1.x], Pgina 957. ca a a
27
28
Compatibilidade com o padro, portabilidade e migrao a ca Adiciona suporte real a VARCHAR (tamanho de colunas maiores que 255, e sem corte de espaos em branco extras). (J existe suporte para isto nos c a mecanismos de armazenamento do MyISAM, mas ainda no est dispon a a ivel de usurio). a nivel a Aumento na velocidade SHOW COLUMNS FROM nome_tabela (usado pelo cliente mysql para permitir expanses de nomes de colunas) no deve abrir a tabela, apenas o arquivo o a de denio. ISto exigir menos memria e ser muito mais rpido. ca a o a a 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 memria (HEAP): o Registro de tamanhos dinmoicos. a Tratamento de registro mais rpido (menos cpia). a o Internacionalizao ca Ap usar SET CHARACTER SET devemos traduzir toda a consulta de uma vez e no apenas as strings. Isto permitir que os usurios usem caracteres a a a traduzidos nos nomes de banco de dados, tabelas e colunas. Aprimoramento da usabilidade Resolver a questo de RENAME TABLE em uma tabela usada em uma tabela a MERGE ativa, o que possivelmente corrompe a tabela.
29
Cria um novo banco de dados. Para cada tabelas, renomeie-a para outro banco de dados, o qual fazemos com o comando RENAME. Apagar o banco de dados antigo. Nova alterao da interface de arquivo interno. Isto far todos os manipca a uladores de arquivos mais gerais e tornar mais fcil adicionar extenses a a o tipo RAID.
30
Novas funes para tyrabalhar com tipos de colunas SET: co ADD_TO_SET(valor,conjunto) REMOVE_FROM_SET(valor,conjunto) Se voc abortar o mysql no meio de uma consulta, voc deve abrir outra e e conexo e matar a consulta antiga em execuo. Alternativamente, deve a ca ser feita um tentativa de deteco deste problema no servidor. ca Adicione um interface do mecanismo de armazenamento para informaes co da tabela assim que voc puder us-la como uma tabela de sistema. Isto see a ria um pouco mais lento se voc pedisse informaes sobre todas as tabelas, e co mas muito ex ivel. SHOW INFO FROM tbl_name para informaes bsicas co a das tabelas deve ser implementado. Permite SELECT a FROM crash_me LEFT JOIN crash_me2 USING (a); neste caso considerado que a vem da tabela crash_me. e Opes DELETE e REPLACE para a instruo UPDATE (isto deletar registros co ca a quando se tiver um erro de chave duplicada durante a atualizao). ca Altera o formato de DATETIME para armazenar fraes de segundo. co Possibilitar o uso da nova biblioteca regexp GNU em vez da atual (a biblioteca GNU deve ser muito mais rpida que a antiga). a Compatibilidade com os padres, portabilidade e migrao o ca No adicionar valores DEFAULT automticos as colunas. Enviar um erro ao a a usar um INSERT que no contenha uma coluna que no tenha um DEFAULT. a a Adicionar as funes de agrupamento ANY(), EVERY() e SOME(). No padro co a SQL isto s funciona em colunas booleanas, mas podemos extend-las para o e funcionar em qualquer coluna/expresso tratando valores 0 como FALSE a e valores diferentes de 0 como TRUE. Corrigir para que o tipo de MAX(coluna) seja o mesmo do tipo da coluna: mysql> 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 No permitir mais que um nmero denido de threads faam a recuperao a u c ca do MyISAM ao mesmo tempo. Alterar INSERT ... SELECT opcionalmente. para usar inseres co concorrentes
Adicionar uma opo para descarregar paginas de chaves para tabelas com ca delayed keys se elas no forem usados por um tempo. a Permitir joins em partes de chaves (otimizao). ca Adicionar simulao de pread()/pwrite() no Windows para permitir ca inseres concorrentes. co Um analizador de arquivos de log que possam analizar informaes sobre co quais tabelas so usadas com mais frequncia, a frequncia com que joins a e e
31
multi-tables so executados, etc. Isto deve ajudar os usurios a identia a car reas ou projetos de tabelas que podiam ser otimizados para executar a consultas muito mais ecientes. Internacionalizao ca 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. Ligue o cdigo myisampack no servidor assim ele poder realizar operaes o a co PACK e COMPRESS. Adicionar uma cache de chaves temporria durante INSERT/DELETE/UPDATE a para podermos fazer um recuperao se o ca indice car cheio. Se voc realizar um ALTER TABLE em uma tabela que ligada simbolicae e mente a outro disco, crie tabelas tenporrias neste disco. a Implementar um tipo DATE/DATETIME que trate as informaes de fusos co horrios de forma apropriada e assim lidar com datas em diferentes fusos a horrios ser mais fcil. a a a Corrigir o congure para se poder compilar todas as bibliotecas (como no MyISAM) sem threads. Permitir variveis SQL em LIMIT, como em LIMIT @a,@b. a Sa automtica do mysql para um navegador web. ida a LOCK DATABASES (com diversas opes). co Muito mais variveis para SHOW STATUS. Leitura e atualizao de rega ca istros. Selects em 1 tabela e select com joins. Nmero de tabelas na select. u Nmero de consultas ORDER BY e GROUP BY. u mysqladmin copy database novo-banco_dados; exige que o comando COPY seja adicionado ao mysqld. Lista de processos deve mostar o nmero de consultas/threads. u SHOW HOSTS para xibir informaes sobre a cache de nome de mquina. co a Alterar o nome de tabelas de string vazias para NULL para colunas calculadas. No usar Item_copy_string em valores numricos para evitar a converso a e a number->string->number no casos de: SELECT COUNT(*)*(id+0) FROM nome_tabela GROUP BY id Alterar aqueles ALTER TABLE que no abortam clientes que executam a INSERT DELAYED. Colunas refernciadas em uma clusula UPDATE iro conter os valores antie a a gos antes da atualizao iniciar. ca Novos sistemas operacioais. Portar os clientes MySQL para LynxOS.
32
33
Adicionar suporte pleno para JOIN com parnteses. e Como uma alternativa para uma thread / conexo gerencie uma la de threads para a manipular as pesquisas. Permitir obter mais de um bloqueio com GET_LOCK. Quando isto for feito, sero, a tambm, tratados os poss e iveis deadlocks que essa alterao ir acarretar. ca a O tempo fornecido de acordo com a quantidade de trabalho, e no tempo real. e a
mysql
34
mysql-digest A lista mysql na forma resumida. Isto signica que voc ir receber todas e a mensagens individuais, enviadas na forma de uma grande mensagem uma unica vez ao dia. bugs Esta lista s ser do seu interesse se voc quiser car informado sobre assuntos o a e relatados desde a ultima distribuio do MySQL ou se voc quiser estar ativa ca e mente envolvido no processo de busca e correo de erros. Veja Seo 1.7.1.3 ca ca [Relatrio de erros], Pgina 36. o a
bugs-digest Uma verso resumida da lista bugs. a internals Uma lista para pessoas que trabalham no cdigo do MySQL. Nesta lista pode-se o discutir desenvolvimento do MySQL e pos-patches. internals Uma verso resumida da lista internals. a mysqldoc Esta lista para pessoas que trabalham na documentao do MySQL: pessoas e ca da MySQL AB, tradutores e outros membros da comunidade.
mysqldoc-digest Esta uma verso resumida da lista mysqldoc. e a benchmarks Esta lista para qualquer um interessado em assuntos de desempenho. Dise cusses concentradas em desempenho de banco de dados (no limitado ao o a MySQL) mas tambm inclue categorias ,com desempenho do kernel, sistema e de arquivos, sistema de disco e outros. benchmarks Esta uma verso resumida da lista benchmarks. e a packagers Esta lista para discusses sobre empacotamento e distribuio do MySQL. e o ca Este o frum usado pela pessoas que mantm a distribuio para troca de e o e ca idias de pacotes do MySQL e para assegurar que o MySQL esteja o mais e parecido poss em todas as plataformas e sistemas operacionais suportados. ivel packagers-digest Esta uma verso resumida da lista packagers. e a java Discusso sobre o servidor MySQL e Java. E mais usada para discusses sobre a o o driver JDBC, incluindo MySQL Connector/J. java-digest Uma verso resumida da lista java. a win32 Esta a lista para todos os tpicos relacionados ao MySQL em sistemas operae o cionais Microsoft, como o Win95, Win98, NT e Win2000.
35
myodbc
myodbc-digest Uma verso resumida da lista myodbc. a mysqlcc Esta lista sobre todos os tpicos relativos ao cliente grco MySQL Control e o a Center.
mysqlcc-digest Esta lista uma verso resumida da lista mysqlcc. e a plusplus Lista sobre todos os tpicos relacionados ` programao da API C++ para o o a ca MySQL.
plusplus-digest Uma verso resumida da lista plusplus. a msql-mysql-modules Lista sobre o Suporte MySQL no Perl com o msql-mysql-modules que e chamado DBD-mysql. msql-mysql-modules-digest Lista resumida sobre a verso do msql-mysql-modules. a Se voc no obtiver uma resposta para suas questes na lista de mensagens do MySQL, uma e a o opo pagar pelo suporte da MySQL AB, que ir colocar voc em contato direto com ca e a e desenvolvedores MySQL. Veja Seo 1.4.1 [Suporte], Pgina 17. ca a A seguinte tabela mostra algumas listas de mensagens sobre o MySQL que utilizam linguas diferentes do Ingls. Perceba que elas no so operadas pela MySQL AB, portanto, no e a a a podemos garantir a qualidade destas. [email protected] Lista de mensagens na l ingua francesa. [email protected] Lista de mensagens coreana. Envie subscribe mysql [email protected] para esta lista. [email protected] Lista de mensagens alem~. a Envie subscribe mysql-de [email protected] para esta lista. Voc pode encontrar informaes sobre esta lista de mensagens em e co http://www.4t2.com/mysql. [email protected] Lista de mensagens em portugus Envie subscribe mysql-br [email protected] para esta lista. e [email protected] Lista de mensagens espanhola. Envie subscribe mysql [email protected] para esta lista.
36
Ns tentaremos manter o manual atualizado, frequentemente atualizando-o com o solues para novos problemas encontrados! O apndice de histrico de mudanas co e o c (http://www.mysql.com/doc/en/News.html) pode ser util j que bem poss que a e ivel uma verso mais nova ja tenha a soluo para o seu problema. a ca Procure no banco de dados de bugs em http://bugs.mysql.com/ para ver se o erro j foi relatado/resolvido. a Pesquise os arquivos das listas de mensagens MySQL: http://lists.mysql.com/ Voc pode tambm usar a pgina http://www.mysql.com/search.html para e e a pesquisar todas as pginas Web (incluindo o manual) que esto localizados em a a http://www.mysql.com/. Se voc no puder encontrar uma resposta no manual ou nos arquivos, conra com seu e a expert em MySQL local. Se voc continua no encontrando uma resposta para sua questo, e a a v em frente e leia a prxima seo para saber como enviar email para lista de email do a o ca MySQL.
37
O lugar comum para relatar erros e problemas http://bugs.mysql.com. e Se voc encontrar um erro de segurana no MySQL, envie um email para e c [email protected]. Se voc tiver um relatrio de erro que possa ser repetido, relate-o no banco de dados de bugs e o em http://bugs.mysql.com. Note que mesmo neste caso bom executar o script mysqlbug e primeiro para ter informaes sobre o sistema. Qualquer erro que pudermos repetir tem co uma grande chance de ser corrigido na prxima distribuio do MySQL. o ca Para relatar outros problemas, voc pode usar a lista de email do MySQL. e Lembre-se que poss responder a uma mensagem contendo muita informao, mas no e ivel ca a a uma contendo muito pouca. Frequentemente pessoas omitem fatos porque acreditam que conhecem a causa do problema e assumem que alguns detalhes no importam. Um bom a principio : Se voc est em dvida sobre declarar alguma coisa, declare-a ! E milhares de e e a u vezes mais rpido e menos problemtico escrever um pouco de linhas a mais no seu relatrio a a o do que ser forado a perguntar de novo e esperar pela resposta porque voc no forneceu c e a informao suente da primeira vez. ca Os erros mais comuns acontecem porque as pessoas no indicam o nmero da verso da a u a distribuio do MySQL que esto usando, ou no indicam em qual plataforma elas tem ca a a o MySQL instalado (Incluindo o nmero da verso da plataforma). Essa informao u a ca e muito relevante, e em 99% dos casos o relato de erro intil sem ela! Frequentemente ns e u o recebemos questes como, Por que isto no funciona para mim? ento ns vemos que o a a o aquele recurso requisitado no estava implementado naquela verso do MySQL, ou que o a a erro descrito num relatrio foi resolvido em uma verso do MySQL mais nova. Algumas o a vezes o erro dependente da plataforma; nesses casos, quase imposs corrigir alguma e e ivel coisa sem conhecimento do sistema operacional e o nmero da verso da plataforma. u a Lembre-se tambm de fornecer informaes sobre seu compilador, se isto for relacionado e co ao problema. Frequentemente pessoas encontram erros em compiladores e acreditam que o problema relacionado ao MySQL. A maioria dos compiladores esto sobre desenvolvimento e a todo o tempo e tornam-se melhores a cada verso. Para determinar se o seu problema a depende ou no do compilador, ns precisamos saber qual compilador foi usado. Note que a o todo problema de compilao deve ser estimado como relato de erros e, consequentemente ca publicado. E de grande ajuda quando uma boa descrio do problema inclu no relato do erro. Isto ca e ida , um bom exemplo de todas as coisas que o levou ao problema e a correta descrio do e ca problema. Os melhores relatrios so aqueles que incluem um exemplo completo mostrando o a como reproduzir o erro ou o problema Veja Seo E.1.6 [Casos de teste reproduz ca iveis], Pgina 1084. a Se um programa produz uma mensagem de erro, muito importante incluir essas mensagens e no seu relatrio! Se ns tentarmos procurar por algo dos arquivos usando programas, o o e melhor que as mensagens de erro relatadas sejam exatamente iguais a que o programa produziu. (At o caso deve ser observado!) Voc nunca deve tentar lembrar qual foi a e e mensagem de erro; e sim, copiar e colar a mensagem inteira no seu relatrio! o Se voc tem um problema com o MyODBC, voc deve tentar gerar um arquivo para e e rastremento de erros (trace) do MyODBC. Veja Seo 12.2.7 [MyODBC bug report], ca Pgina 879. a
38
Por favor lembre-se que muitas das pessoas que lero seu relatrio podem usar um v a o ideo de 80 colunas. Quando estiver gerando relatrios ou exemplos usando a ferramenta de linha o de comando mysql, ento dever usar a opo --vertical (ou a instruo terminadora \G) a a ca ca para sa que ir exceder a largura dispon para este tipo de v ida a ivel ideo (por exemplo, com a instruo EXPLAIN SELECT; veja exemplo abaixo). ca Por favor inclua a seguinte informao no seu relatrio: ca o O nmero da verso da distribuio do MySQL que est em uso (por exemplo, MySQL u a ca a Version 3.22.22). Voc poder saber qual verso vocs est executando, usando o e a a e a comando mysqladmin version. mysqladmin pode ser encontrado no diretrio bin o sob sua instalao do MySQL. ca O fabricante e o modelo da mquina na qual voc est trabalhando. a e a O nome do sistema operacional e a verso. Para a maioria dos sistemas operacionais, a voc pode obter esta informao executando o comando Unix uname -a. Se voc trae ca e balho no Windows, voc pode normalmente conseguir o nome e o nmero da verso com e u a um duplo clique sobre o icone Meu Computador e em seguida no menu Ajuda/Sobre o Windows. Algumas vezes a quantidade de memria (real e virtual) relevante. Se estiver em o e dvida, inclua esses valores. u Se voc estiver usando uma distribuio fonte do MySQL, necessrio o nome e nmero e ca e a u da verso do compilador usado. Se voc estiver usando uma distribuio binria, a e ca a e necessrio o nome da distribuio. a ca Se o problema ocorre durante a compilao, inclua a(s) exata(s) mensagem(s) de erro(s) ca e tambm algumas linhas do contexto envolvendo o cdigo no arquivo onde o erro e o ocorreu. Se o mysqld nalizou, voc dever relatar tambm a consulta que travou o mysqld. e a e Normalmente voc pode encontrar isto executando mysqld com o log habilitado. Veja e Seo E.1.5 [Using log les], Pgina 1083. ca a Se alguma tabela do banco de dados estiver relacionado ao problema, inclua a sa de ida mysqldump --nodata nome_db nome_tbl1 nome_tbl2.... Isto muito fcil de fazer e a e um modo poderoso de obter informaes sobre qualquer tabela em um banco de e co dados que ir ajudar-nos a criar uma situao parecida da que voc tem. a ca e Para problemas relacionados ` velocidade ou problemas com instrues SELECT, voc a co e sempre deve incluir a sa de EXPLAIN SELECT ... e ao menos o nmero de linhas que ida u a instruo SELECT produz. Voc tambm deve incluir a sa de SHOW CREATE TABLE ca e e ida nome_tabela para cada tabela envolvida. Quanto mais informao voc fornecer sobre ca e a sua situao, mais fcil ser para algum ajudar-lo! A seguir um exemplo de um ca a a e relatrio de erros muito bom (ele deve ser postado com o script mysqlbug): o Exemplo de execuo usando a ferramenta de linha de comando mysql (perceba o uso ca do instruo terminadora \G para instrues cuja largura de sa deva ultrapassar 80 ca co ida colunas): mysql> SHOW VARIABLES; mysql> SHOW COLUMNS FROM ...\G <saida para SHOW COLUMNS> mysql> EXPLAIN SELECT ...\G
39
<saida para EXPLAIN> mysql> FLUSH STATUS; mysql> SELECT ...; <Uma pequena vers~o da sada do SELECT, a i incluindo a hora em que a consulta foi executada> mysql> SHOW STATUS; <saida do SHOW STATUS> Se um erro ou problema ocorrer quando estiver executando o mysqld, tente fornecer um script de entrada que ir reproduzir a anomalia. Este script deve incluir qualquer ara quivo de fonte necessrio. Quanto mais prximo o script puder reproduzir sua situao, a o ca melhor. Se voc puder fazer uma srie de testes repetidos, voc poder post-lo para o e e e a a [email protected] para um tratamento de alta prioridade! Se no puder fornecer o script, voc ao menos deve incluir a sa de mysqladmin a e ida variables extended-status processlist na sua mensagem para fornecer alguma informao da performance do seus sistema. ca Se voc no puder produzir um caso de teste em algumas linhas, ou se a tabela de e a testes for muito grande para ser enviada por email para a lista de mensagens (mais de 10 linhas), voc dever dar um dump de suas tabelas usando o mysqldump e criar um e a arquivo README que descreve seu problema. Crie um arquivo comprimido de seus arquivos usando tar e gzip ou zip, e use o ftp para transferir o arquivo para ftp://support.mysql.com/pub/mysql/secret/. E envie uma pequena descrio do problema para [email protected]. ca Se voc achar que o MySQL produziu um resultado estranho para uma consulta, no e a inclua somente o resultado, mas tambm sua opinio de como o resultado deve ser, e e a uma conta descrevendo o base de sua opinio. a Quando fornecer um exemplo do problema, melhor usar os nomes de variveis, nomes e a de tabelas, etc. utilizados na sua situao atual do que enviar com novos nomes. O ca problema pode ser relacionado ao nome da varivel ou tabela! Esses casos so raros, a a mas melhor prevenir do que remediar. Alm disso, ser mais fcil para voc fornecer e e a a e um exemplo que use sua situao atual, que o que mais importa para ns. No caso ca e o de ter dados que no deseja mostrar para outros, voc pode usar o ftp para transferia e lo para ftp://support.mysql.com/pub/mysql/secret/. Se os dados so realmente a condenciais, e voc no deseja mostr-los nem mesmo para ns, ento v em frente e e a a o a a providencie um exemplo usando outros nome, mas, por favor considere isso como uma unica chance. Inclua, se poss ivel, todas as opes fornecidas aos programas relevantes. Por exemplo, co indique as opes que voc utiliza quando inicializa o daemon mysqld e aquelas que so co e a utilizadas para executar qualquer programa cliente MySQL. As opes para programas co como o mysqld e mysql, e para o script configure, so frequentemente chaves para a respostas e so muito relevantes! Nunca uma m idia inclu a e a e i-las de qualquer forma! Se voc usa algum mdulo, como Perl ou PHP por favor fornea o nmero da verso e o c u a deles tambm. e Se sua questo relacionada ao sistema de privilgios, por favor fornea a sa a e e c ida de mysqladmin reload, e todas as mensagens de erro que de mysqlaccess, a saida
40
voc obteve quando tentava conectar! Quando voc testar seus privilgios, voc deve e e e e primeiramente executar mysqlaccess. Depois, execute mysqladmin reload version e tente conectar com o programa que gerou o problema. mysqlaccess pode ser encontrado no diretrio bin sob seu diretrio de instalao do MySQL. o o ca Se voc tiver um patch para um erro, isso bom, mas no assuma que o patch e e a e tudo que precisamos, ou que iremos us-lo, se voc no fornecer algumas informaes a e a co necessrias, como os casos de testes mostrando o erro que seu patch corrige. Ns a o podemos encontrar problemas com seu patch ou ns podemos no entend-lo ao todo; o a e se for assim, no podemos us-lo. a a Se ns no vericarmos exatamente o que o patch quer dizer, ns no poderemos uso a o a a lo. Casos de testes iro ajudar-nos aqui. Mostre que o patch ir cuidar de todas as a a situaes que possam ocorrer. Se ns encontrarmos um caso (mesmo que raro) onde o co o patch no funcionaria, ele pode ser intil. a u Palpites sobre qual o erro, porque ocorre, ou do que ele depende, geralmente esto e a errados. Mesmo o time MySQL no pode adivinhar antecipadamente tais coisas sem a usar um debugger para determinar a causa real do erro. Indique na sua mensagem de e-mail que voc conferiu o manual de referncia e o arquivo e e de mensagens para que outros saibam que voc tentou solucionar o problema. e Se voc obter um parse error, por favor conra sua sintaxe com ateno! Se e ca voc no conseguiu encontrar nada errado com ela, extremamente provvel e a e a que que sua verso corrente do MySQL no suporte a consulta que voc a a e est utilizando. a Se voc estiver usando a verso recente e o manual em e a http://www.mysql.com/documentation/manual.php no cobrir a sintaxe que a voc estiver usando, o MySQL no suporta sua consulta. Neste caso, suas unicas e a opes so implementar voc mesmo a sintaxe ou enviar uma mensagem para co a e [email protected] e perguntar por uma oferta para implement-lo! a Se o manual cobrir a sintaxe que voc estiver usando, mas voc tiver uma verso mais e e a antiga do MySQL, voc dever conferir o histrico de alteraes do MySQL para ver e a o co quando a sintaxe foi implementada. Neste caso, voc tem a opo de atualizar para e ca uma nova verso do MySQL. Veja Apndice D [News], Pgina 957. a e a Se voc tiver um problema do tipo que seus dados aparecem corrompidos ou voc e e obtem erros quando voc acessa alguma tabela em particular, voc dever primeiro e e a checar depois tentar reparar suas tabelas com myisamchk ou CHECK TABLE e REPAIR TABLE. Veja Cap ptexi tulo 4 [MySQL Database Administration], Pgina 207. a Se voc frequentemente obtm tabelas corrompidas, e e voc deve tene tar encontrar quando e porque isto acontece! Neste caso, o arquivo mysql-data-directory/hostname.err deve conter algumas informaes co sobre o que aconteceu. Veja Seo 4.10.1 [Error log], Pgina 372. Por favor fornea ca a c qualquer informao relevante deste arquivo no seu relatrio de erro! Normalmente ca o o mysqld NUNCA dever danicar uma tabela se nada o nalizou no meio de uma a atualizao! Se voc puder encontrar a causa do m do mysqld, se torna muito mais ca e fcil para ns fornecemos a voc uma soluo para o problema! Veja Seo A.1 [What a o e ca ca is crashing], Pgina 911. a Se poss ivel, faa o download e instale a verso mais recente do MySQL para saber se c a ela resolve ou no o seu problema. Todas verses do MySQL so muito bem testadas a o a
41
e devem funcionar sem problemas! Acreditamos em deixar tudo, o mais comptivel a poss ivel com as verses anteriores, e voc conseguir mudar de verses MySQL em o e a o minutos! Veja Seo 2.2.4 [Which version], Pgina 80. ca a Se voc um cliente de nosso suporte, por favor envio o seu relatrio de erros em e e o [email protected] para tratamento de alta prioritrio, bem como para a lista de a mensagens apropriada para ver se mais algum teve experincias com (e talvez resolveu) o e e problema. Para informaes sobre relatar erros no MyODBC, veja Seo 12.2.4 [ODBC Problems], co ca Pgina 873. a Para solues a alguns problemas comuns, veja Veja Apndice A [Problems], Pgina 911. co e a Quando respostas so enviadas para voc individualmente e no para a lista de mensagens, a e a e considerado boa etiqueta resumir as respostas e enviar o resumo para a lista de mensagens para que outras possam ter o benef icio das respostas que voc recebeu que ajudaram a e resolver seu problema!
42
43
" tratado como um caracter identicados (com o caracter de aspasr do MySQL e Server)e no um caracter de string. Voc ainda pode usar para citar identicadores a e no modo ANSI. Uma implicao disto que voc no pode usar aspas duplas para citar ca e e a um string literal, porque ela ser intepretada como um identicador. a Voc pode ter qualquer nmero de espaos entre um nome de funo e o (. Isto e u c ca faz com que todos nomes de funes sejam tratadas como palavras reservadas. Como co resultado, se voc quiser acessar qualquer banco de dados, tabelas ou coluna que uma e e palavra reservada, voc deve coloc-lo entre aspas. Por exemplo, por haver a funo e a ca USER(), o nome da tabela user no banco de dados mysql e a coluna User nesta tabela se torna reservada, assim voc deve coloc-la entre aspas: e a SELECT "User" FROM mysql."user"; REAL um sinnimo para FLOAT no lugar de um sinnimo de DOUBLE. e o o O n de isolamento padro de um transao SERIALIZABLE. Veja Seo 6.7.6 [SET ivel a ca e ca TRANSACTION], Pgina 619. a Voc pode usar um campo/expresso em GROUP BY que no est na lista de campos. e a a a Executando o servidor em modo ANSI o mesmo que inici-lo com estas opes: e a co --sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES, IGNORE_SPACE,ONLY_FULL_GROUP_BY --transaction-isolation=serializable No MySQL 4.1, voc pode conseguir o mesmo efeito com estas duas instrues: e co SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET GLOBAL sql_mode= "REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY"; No MySQL 4.1.1 a ultima opo sql_mode tambm pode ser dada com: ca e SET GLOBAL sql_mode="ansi"; No caso acima o sql_mode estar congurado com todas as opes que so relevantes para a co a o modo ANSI. Voc pode vericar o resultado fazendo: e
44
CREATE /*!32302 TEMPORARY */ TABLE t (a INT); O exemplo acima signica que se voc tiver uma verso do MySQL 3.23.02 ou mais nova, e a ento o MySQL ir usar a palavra-chave TEMPORARY a a Extenses MySQL so listadas abaixo: o a Os tipos de campo MEDIUMINT, SET, ENUM e os diferentes tipos BLOB e TEXT. Os atributos de campos AUTO_INCREMENT, BINARY, NULL, UNSIGNED e ZEROFILL. Todas comparaes de strings por padro so caso insensitivo, com classicao ordeco a a ca nada determinada pelo conjunto de caracteres corrente (ISO-8859-1 Latin1 por padro). a Se voc no gosta disso voc dever declarar suas colunas com o atributo BINARY ou e a e a usar o operador BINARY, que fazendo com que as comparaes sejam feitas de acordo co com a ordem ASCII usada na mquina servidora do MySQL. a O MySQL mapeia cada banco de dados em um diretrio sob o diretrio de dados do o o MySQL, e tabelas internamente num banco de dados para arquivos no diretrio do o banco de dados. Isto tem algumas implicaes: co Nomes de bancos de dados e tabelas so caso sensitivoo no MySQL em sistemas a operacionais que possuem o sistema de arquivos caso sensitivoo (como na maioria dos sistemas Unix). Veja Seo 6.1.3 [Name case sensitivity], Pgina 473. ca a Nomes de Bancos de dados, tabelas, indices, campos ou apelidos pode comear c com um digito (porm no podem consistir somente de digitos). e a Voc pode usar comandos padro do sistemas para fazer backups, renomear, apagar e a e copiar tabelas. Por exemplo, para renomear uma tabela, renomeie os arquivos .MYD, .MYI e .frm. para o nome da tabela correspondente. co e Em algumas instrues SQL, voc 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 no suporta tablespaces como a em: create table ralph.my_table...IN minha_tablespace. LIKE permitido em campos numricos. e e O uso de INTO OUTFILE e STRAIGHT_JOIN em uma instruo SELECT. Veja Seo 6.4.1 ca ca [SELECT], Pgina 562. a A opo SQL_SMALL_RESULT em uma instruo SELECT. ca ca EXPLAIN SELECT para obter uma descrio de como as tabelas so ligadas. ca a A utilizao de nomes de indices, indices em um prexo de um campo, e uso de INDEX ca ou KEY em uma instruo CREATE TABLE. Veja Seo 6.5.3 [CREATE TABLE], Pgina 598. ca ca a O uso de TEMPORARY ou IF NOT EXISTS com CREATE TABLE. O uso de COUNT(DISTINCT lista) onde lista maior que um elemento. e O uso de CHANGE nome_campo, DROP nome_campo, ou DROP INDEX, IGNORE ou RENAME em uma instruo ALTER TABLE. Veja Seo 6.5.4 [ALTER TABLE], Pgina 608. ca ca a O uso de RENAME TABLE. Veja Seo 6.5.5 [RENAME TABLE], Pgina 612. ca a Utilizao de mltiplas clusulas ADD, ALTER, DROP, ou CHANGE em uma instruo ALTER ca u a ca TABLE. O uso de DROP TABLE com as palavras-chave IF EXISTS.
45
Voc pode remover mltiplas tabelas com uma instruo unica DROP TABLE. e u ca As clusulas ORDER BY e LIMIT das instrues UPDATE e DELETE. a co Sintaxe INSERT INTO ... SET col_name = .... A clusula DELAYED das instrues INSERT e REPLACE. a co A clusula LOW_PRIORITY das instrues INSERT, REPLACE, DELETE e UPDATE. a co O uso de LOAD DATA INFILE. Em alguns casos essa sintaxe compat com o Oracle e ivel LOAD DATA INFILE. Veja Seo 6.4.8 [LOAD DATA], Pgina 588. ca a As intrues ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE, e REPAIR TABLE. co A instruo SHOW. Veja Seo 4.6.8 [SHOW], Pgina 302. ca ca a Strings podem ser fechadas pelo " ou , no apenas pelo . a O uso do meta-caractere de escape \. A instruo SET OPTION. Veja Seo 5.5.6 [SET OPTION], Pgina 460. ca ca a Voc no precisa nomear todos os campos selecionados na parte GROUP BY. Isto fornece e a melhor performance para algumas consultas espec icas, mas muito comuns. Veja Seo 6.3.7 [Group by functions and modiers], Pgina 555. ca a Pode ser especicado ASC e DESC com o GROUP BY. Para tornar mais fcil para usurios que venham de outros ambientes SQL, o MySQL a a suporta apelidos (aliases) para vrias funes. Por exemplo, todas funes de string a co co suportam as sintaxes ANSI SQL e ODBC. O MySQL entende os operadores || e && como ou(OR) e e(AND) logicos, como na linguagem de programao C. No MySQL, || e OR so sinnimos, assim como && e ca a o AND. Devido a esta tima sintaxe, o MySQL no suporta o operador ANSI SQL para o a concatenao de strings ||; em vez disso, use o CONCAT(). Como CONCAT() aceita ca vrios argumentos, fcil converter o uso do operador || para MySQL. a e a CREATE DATABASE or DROP DATABASE. Veja Seo 6.5.1 [CREATE DATABASE], Pgina 597. ca a O operador % um sinnimo para MOD(). Isto , N % M equivalente a MOD(N,M). % e o e e e suportado para programadores C e para compatibilidade com o PostgreSQL. Os operadores =, <>, <= ,<, >=,>, <<, >>, <=>, AND, OR ou LIKE podem ser utilizados em comparaes de campos a esquerda do FROM nas instrues SELECT. Por exemplo: co co mysql> SELECT col1=1 AND col2=2 FROM nome_tabela; A funo LAST_INSERT_ID(). Veja Seo 12.1.3.32 [mysql_insert_id()], Pgina 803. ca ca a Os operadores extendidos REGEXP e NOT REGEXP utilizados em expresses regulares. o CONCAT() ou CHAR() com um ou mais de dois argumentos. (No MySQL, estas funes co receber qualquer nmero de argumentos.) u As funes BIT_COUNT(), CASE, ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(), co ENCRYPT(), MD5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS() ou WEEKDAY(). Uso de TRIM() para cortar substrings. o SQL-99 s suporta remoo de caracteres o ca unicos. As funes do GROUP BY: STD(), BIT_OR(), BIT_AND() e BIT_XOR() e GROUP_CONCAT(). co Veja Seo 6.3.7 [Group by functions and modiers], Pgina 555. ca a
46
Uso de REPLACE no lugar de DELETE + INSERT. Veja Seo 6.4.7 [REPLACE], Pgina 587. ca a As instrues FLUSH, RESET e DO. co A possibilidade de congurar variveis em uma instruo com :=: a ca SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS media FROM tabela_teste; SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
1.8.4.1 Subqueries
MySQL Version 4.1 supports subqueries and derived tables (unnamed views). Veja Seo 6.4.2 [Subqueries], Pgina 570. ca a For MySQL versions prior to 4.1, most subqueries can be successfully rewritten using joins and and other methods. Veja Seo 6.4.2.11 [Rewriting subqueries], Pgina 578. ca a
47
Os outros tipos de tabelas no transacionais (tais como MyISAM) no MySQL Server seguem a um paradigma diferente para integridade de dados chamado Oper~es At^micas. Em co o termos de transao, tabelas MyISAM efetivamente sempre operam em modo AUTOCOMMIT=1. ca Operaes atmicas geralmente oferecem integridade comparvel com a mais alta perforco o a mance. Com o MySQL Server suportando ambos os paradigmas, o usurio pode decidir se precisa a da velocidade das operaes atmicas ou se precisa usar recursos transacionais em seu co o aplicativo. Esta escolha pode ser feita em uma base por tabela. Como notado, a comparao para tabelas transacionais vs. no transacionais As noted, ca a the trade o for transactional vs. non-transactional table se encontra em grande parte no desempenho. Tabelas transacionais tem uma exigncia de memria e espao em disco e o c signicantemente maior e maior sobrecarga da CPU. Tipos de tabelas transacionais como InnoDB oferecem muitos recursos unicos. O projeto modular do MySQL Server permite o uso concorrente de todas estes mecanismos de armazenamento para servir a diferentes exigncias e oferecer um timo desempenho em todas as situaes. e o co Mas como fazer uso dos recursos do MySQL Server para manter uma integridade rigorosa mesmo com tabelas MyISAM no transacionais e como este recurso se compara com os tipos a de tabelas transacionais? 1. No paradigma transacional, se as suas aplicaes so escritas de uma forma que co a e dependente na chamada de ROLLBACK em vez de COMMIT em situaes criticas, ento co a transaes so mais convenientes. Alm disso, transaes asseguram que atualizaes co a e co co inacabadas ou atividades corrompidas no sejam executadas no banco de dados; o a servidor oferece uma oportunidade para fazer um rollback automtico e seu banco de a dados mantido. e O MySQL Server, na maioria dos casos, permite a voc resolver potenciais problemas e incluindo simples conferncias antes das atualizaes e executando scripts simples que e co conferem inconsistncias no banco de dados e, automaticamente, repara ou avisa caso e isto ocorra. Perceba que apenas usando o log do MySQL ou mesmo adicionando um log extra, pode-se corrigir tabelas perfeitamente sem nenhuma perda de integridade. 2. Mais do que nunco, atualizaes transacionais fatais podem ser reescritas para serem co atmicas. De fato podemos dizer que todos problemas de integridade que transaes o co resolvem podem ser feitas com LOCK TABLES ou atualizaes atmicas, assegurando que co o voc nunca ir ter uma nalizao automtica da tabela, o que um problema comum e a ca a e em bancos de dados transacionais. 3. Nem mesmo transaes podem prevenir todas as falhas se o servidor cair. Nestes co casos mesmo um sistema transacional pode perder dados. A diferena entre sistemas c diferentes apenas em quo pequeno o lapso de tempo em que eles podem perder e a e dados. Nenhum sistema 100% seguro, somente seguro o suciente. Mesmo o e Oracle, com reputao de ser o mais seguro bancos de dados transacionais, tem relatos ca de algumas vezes perder dados nestas situaes. co Para estar seguro com o MySQL Server, voc apenas deve fazer backups e ter o log e de atualizaes ligado. Com isto voc pode se recuperar de qualquer situao poss co e ca ivel com bancos de dados transacionais. E sempre bom ter backups, independente de qual banco de dados voc usa. e
48
O paradigma transacional tem seus benef icios e suas desvantagens. Muitos usurios e a desenvolvedores de aplicaes dependem da facilidade com a qual eles podem codicar co contornando problemas onde abortar parece ser, ou necessrio. No entanto, se voc e a e novo no paradigma de operaes atmicas ou tem mais familiaridade ou conforto com e co o transaes, considere o benef co icio da velocidade que as tabelas no transacionais podem a oferece, na ordem de 3 a 5 vezes da velocidade que as tabelas transacionais mais rpidas e a otimizadas. Em situaes onde integridade de grande importncia, as atuais caracter co e a isticas do MySQL permitem niveis transacionais ou melhor conana e integridade. Se voc bloquear tabelas c e com LOCK TABLES todos as atualizaes iro ser adiadas at qualquer vericao de inteco a e ca gridade ser feita. Se voc s obter um bloqueio de leitura (oposto ao bloqueio de escrita), e o ento leituras e inseres podero ocorrer. Os novos registros inseridos no podero ser via co a a a sualizados por nenhum dos clientes que tiverem um bloqueio de LEITURA at eles liberarem e estes bloqueios. Com INSERT DELAYED voc pode enleirar inseres em uma la local, at e co e os bloqueios serem liberados, sem que o cliente precise esperar at a insero completar. a ca Veja Seo 6.4.3.2 [INSERT DELAYED], Pgina 582. ca a Atmico, no sentido em que ns mencionamos, no mgico. Signica apenas que voc o o a e a e pode estar certo que enquanto cada atualizao espec ca ica est sendo executada, nenhum a outro usurio pode interferir com ela, e nunca haver um rollback automtico (que pode a a a acontecer em sistemas baseados em transaes se voc no tiver muito cuidado). O MySQL co e a tambm assegura que nunca ocorrer uma leitura suja. e a A seguir esto algumas tcnicas para trabalhar com tabelas no transacionais: a e a Loops que precisam de transaes normalmente pode ser codicados com a ajuda de co LOCK TABLES, e voc no precisa de cursores para atualizar regitros imeditamente. e a Para evitar o uso do ROLLBACK, voc pode usar as seguintes estratgias: e e 1. Use LOCK TABLES ... para fazer um lock todas as tabelas que voc quer acessar. e 2. Condies de teste. co 3. Atualize se estiver tudo OK. 4. Use UNLOCK TABLES para liberar seus locks. Isto normalmente um mtodo muito mais rpido que usar transaes com poss e e a co iveis ROLLBACKs, mas nem sempre. A unica situao que esta soluo no pode tratar ca ca a e quando algum mata a threads no meio de uma atualizao. Neste caso, todas os locks e ca sero liberados mas algumas das atualizao podem no ter sido execuadas. a ca a Voc tambm pode usar funes para atualizar registros em uma unica operao. Voc e e co ca e pode conseguir uma aplicao muito eciente usando as seguintes tcnicas: ca e Modique campos em relao ao seus valores atuais. ca Atualize apenas aqueles campos que realmente tiveram alteraes. co Por exemplo, quando fazemos atualizaes em alguma informao de cliente, atualco ca izamoa apenas os dados do clientes que alteraram e testamos apenas aqueles com dados alterados ou dados que dependem dos dados alterados, mudaram em comparao com o ca registro original. O teste dos dados alterados feito com a clusula WHERE na instruo e a ca UPDATE. Se o registro no foi atualizado, mandamos ao cliente uma mensagem: Some a of the data you have changed has been changed by another user. Ento mostramos o a
49
registro antigo versus o novo em uma janela, assim o usurio pode decidir qual verso a a do registro de cliente de ser usado. Isto nos d algo similar a lock de colunas mas que, na verdade, melhor porque apenas a e atualizamos algumas das colunas, usando valores relativos ao seu valor atual. Isto signica que instrues UPDATE comuns se parecem com estas: co UPDATE nometabela SET pay_back=pay_back+125; UPDATE customer SET customer_date=current_date, address=new address, phone=new phone, money_he_owes_us=money_he_owes_us-125 WHERE customer_id=id AND address=old address AND phone=old phone; Como voc pode ver, isto muito eciente e funciona mesmo se outro cliente alterar e e os valores nas colunas pay_back ou money_he_owes_us. Em muitos casos, usurios querem fazer ROLLBACK e/ou LOCK TABLES com o propsito a o de gerenciarem identicadores unicos para algumas tabelas. Isto pode ser tratado muito mais ecientemente usando uma coluna AUTO_INCREMENT e tambm uma funo SQL e ca LAST_INSERT_ID() ou a funo da API C mysql_insert_id(). Veja Seo 12.1.3.32 ca ca [mysql_insert_id()], Pgina 803. a Geralmente voc pode codicar evitando lock de registro. Algumas situaes realmente e co 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 nmero de linhas afetadas se as linhas foram encontradas u e row_flag j no era 1 na linha original. a a Voc pode pensar nisto como se o MySQL Server tivesse alterado a consulta anterior e para: UPDATE nome_tbl SET row_flag=1 WHERE id=ID AND row_flag <> 1;
50
n ivel conceitual tendo bibliotecas de funes no servidor. No entanto, stored procedures co aumentam a carga no servidor de banco de dados, j que grande parte do trabalho feito a e do lado do servidor e menos do lado do cliente (aplicao). ca Triggers esto programados para serem implementados no MySQL verso 5.1. Um trigger a a um tipo de stored procedure que chamado quando um evento em particular ocorre. e e Por exemplo, voc poderia congurar uma stored procedure que disparada toda vez que e e um registro for apagado de uma tabela transacional que automaticamente apaga o cliente correspondente de uma tabela de clientes quando todas as transaes forem removidas. co
51
Regras de chaves estrangeiras projetados apropriadamente ajudam ao documentar a relao entre as tabelas. ca Desvantagens: Erros, que so facis de se ter ao projetar a relao das chaves, podem causar graves a e ca problemaspor exemplo, regras circulares ou a combinao errada de uma deleo em ca ca cascata. Vericao adicional no banco de dados afeta o desempenho, por esta razo algumas ca a das principais aplicaes comerciais codicam sua lgica no n da aplicao. co o ivel ca No incomum para um DBA fazer uma topologia complexa de relaes que torna a e co muito dif e em alguns casos imposs icl, ivel, fazer backup ou restaurar tabelas individuais.
1.8.4.6 Views
Views esto senda implementadas atualmente e aparecero na verso 5.0 e 5.1 do MySQL a a a Server. Historicamente o MySQL Server tem sido mais usado em aplicaes e sistemas web onde o co desenvolvedor da aplicao tem total controle sobre o uso do banco de dados. E claro que o ca uso aumentou em vrias vezes e ento descobrimos que um crescente nmeros de usurios a a u a consideram views como um importante aspecto. Unnamed views (derived tables, uma seubquery na clusula FROM de uma SELECT) j esto a a a implementadas na verso 4.1. a Views geralmente so muito uteis para permitir aos usurios acessar uma srie de relaes a a e co (tabelas) como uma tabela, e limitar o acesso a apenas estas relaes. Views tambm co e podem ser usadas para restringir o acesso aos registros (um subconjunto de uma tabela em particular). Mas views no so necessrias para restringir o acesso a registros j que a a a a o MySQL Server tem um sosticado sistema de privilgios. Veja Seo 4.3 [Sistema de e ca privilgios], Pgina 226. e a Muitos SGBD no permitem atualizar nenhum registro em uma view, mas voc tem que a e fazer as atualizaes em tabelas separadas. co Em nosso projeto de implemtao de views, ns buscamos (tanto quanto for poss dentro ca o ivel do SQL) compatibilidade com Codds Rule #6 para sistemas de banco de dados relacionais: todos os views que so teoricamente atualizveis, devem se atualizados tambm na a a e prtica. a
52
com queries SQL geradas automaticamente que usavam algo como o cdigo seguinte, onde o automaticamente er inserido o valor do pagamento para !pagamento!: a UPDATE nome_tabela SET credito=credito-!pagamento! O que voc acha que ir acontecer quando o valor de pagamento for negativo? Como 1--1 e a legal no SQL, ns achamos terr que -- signique in de comentrio. e o ivel icio a Usando a nossa implementao deste mtodo de comentrio no MySQL Server Version ca e a 3.23.3 e posterior, 1-- Isto um comentrio atualmente seguro. e a e Outro recurso seguro que o cliente de linha de comando mysql remove todas as linhas que e iniciam com --. A seguinte discusso somente interessa se voc estiver executando uma verso do MySQL a e a inferior a verso 3.23: a Se voc tem um programa SQL em um arquivo texto que contm comentrios -- voc e e a e dever usar: a shell> replace " --" " #" < arquivo-texto-com-comentrio.sql \ a | mysql banco-de-dados No lugar de: shell> mysql banco-de-dados < arquivo-texto-com-comentario.sql Voc tambm pode editar o prprio arquivo de comandos alterando os comentrios -- e e o a para #: shell> replace " --" " #" -- arquivo-texto-com-comentario.sql Desfaa utilizando este comando: c shell> replace " #" " --" -- arquivo-texto-com-comentario.sql
53
estiver usando um mecanismo de armazenamento transacional, como InnoDB, o MySQL automaticamente far um rollback da transao. Se voc estiver usando mecanismos de a ca e armazenemento no transacionais o MySQL ir para no registro errado e deiar o resto dos a a registros se processamento. Para tornar a vida mais fcil o MySQL adicionou suporte a diretiva IGNORE para a maioria a dos comandos que podem causar uma violao de chave (como INSERT IGNORE ...). Neste ca caso o MySQL ir ignorar qualquer violao de chave e continuar com o processamento do a ca a prximo registro. Voc pode obter informao sobre o que o MySQL fez com a funo da o e ca ca API mysql_info() API function e em verses posteriores do MySQL 4.1 com o comando o SHOW WARNINGS. Veja Seo 12.1.3.30 [mysql info], Pgina 802. Veja Seo 4.6.8.9 [SHOW ca a ca WARNINGS], Pgina 323. a Note que no momento apenas as tabelas InnoDB suportam chaves estrangeiras. Seo 7.5.5.2 [Restries de chaves estrangeiras no InnoDB], Pgina 654. ca co a Veja
O suporte a chaves estrangeiras nas tabelas MyISAM est programado para ser inclu na a ida arvor de fonte do MySQL 5.0. e
54
1.8.6 Erros Conhecidos e Decincias de Projetos no MySQL e 1.8.6.1 Erros da Verso 3.23 Corrigidos em Verses Posteriores do a o MySQL
Os seguintes erros/bugs conhecidos no esto corrigidos no MySQL 3.23 porque corrig a a i-los involveria a mudana de muito cdigo, o que poderia introduzir outros erros, talvez piores. c o Os erros so tambm classicados como no fatal ou tolervel. a e a a Pode se obter um deadlock ao fazer LOCK TABLE em multiplas tabelas e ento na mesma a conexo zer um DROP TABLE em uma delas enquanto outra thread est tentando bloa a quear a tabela. Pode-se no entanto fazer um KILL em qualquer uma das threads envolvidas para resolver isto. Corrigido na verso 4.0.12 a SELECT MAX(campo_chave) FROM t1,t2,t3... onde uma das trs tabelas est vazia e a no retorna NULL, mas sim o valor mximo da coluna. Corrigido na verso 4.0.11. a a a DELETE FROM heap_table sem um WHERE no funcionam em tabelas HEAP com lock. a
55
No execute ALTER TABLE em uma tabela BDB em que voc estiver executando a e transaes multi-instrues no completadas. co co a (A transao provavelmente ser ca a ignorada). ANALYZE TABLE, OPTIMIZE TABLE e REPAIR TABLE podem causar problemas em tabelas para as quais voc estiver usando INSERT DELAYED. e Fazendo um LOCK TABLE .. e FLUSH TABLES .. no garante que no existem transaes a a co no terminadas em progresso na tabela. a Tabelas BDB so um pouco lentas para abrir. Se voc tiver vrias tabelas BDB em um a e a banco de dados, gastar muito tempo para usar o cliente mysql no banco de dados se a voc no estiver usando a opo -A ou se voc estiver usando rehash. Isto percebido e a ca e e principalmente quando voc tiver um cache de tabelas grandes. e A replicao utiliza o log a nivel de consulta: o master grava a consulta no log binrio. ca a Isto um rpido, compacto e eciente mtodo de registro o que funciona perfeitamente e a e na maioria dos casos. Embora nunca tenhamos ouvido sobre um caso ocorrido, h uma a chance terica que o dado no master e slave sejam diferente se uma consulta feita o e de tal modo que a modicao do dado no determin ca e a istica, isto , deixar ao desejo e do otimizador de consultas (o que geralmente no uma boa prtica, mesmo fora da a e a replicao!). Por exemplo: ca CREATE ... SELECT ou INSERT ... SELECT que preenchem com zeros ou NULL uma coluna auto_increment. DELETE se voc estiver apagando registros de uma tabela que tem chaves ese trangeiras com a propriedade ON DELETE CASCADE. REPLACE ... SELECT, INSERT IGNORE ... SELECT se voc tiver valores de chaves e duplicados nos dados inseridos. Se e somente se todos estas consultas NAO tiverem clusulas ORDER BY garantindo uma a ordem deterministica. Na verdade, por exemplo para INSERT ... SELECT sem ORDER BY, o SELECT pode retornar registros em uma ordem diferente (no qual resultar em um registro tendo a diferentes posies, obtendo um nmero diferente na coluna auto_increment), depenco u dendo da escolhe feita pelo otimizador no master e slave. Uma consulta ser otimizada a deiferentemente no master e slave apenas se: Os arquivos usados pelas duas consultas no so exatamente a mesma; por exemplo a a OPTIMIZE TABLE foi executado nas tabelas master e no nas nas tabelas slave (para a corrigir isto, desde o MySQL 4.1.1, OPTIMIZE, ANALYZE e REPAIR so escritos no a log binrio). a A tabela est armazenada em um mecanismo de armazenamento diferente no masa ter e no slave (pode se executar diferentes mecanismos de armazenamento no metre e no slave: por exemplo, InnoDB ne master e MyISAM no slave, se o slave possuir menos espao disppon em disco). c ivel The MySQL buers sizes (key_buffer_size etc) are dierent on the master and slave. O master e slave executam verses diferentes do MySQL, e o cdigo do toimizador o o diferente entre estas verses. e o
56
Este problema tambm pode afetar a restaurao de um banco de dados usando e ca mysqlbinlog|mysql. O modo mais fcil de evitar este problema em todos os casos adicionar uma clusula a e a ORDER BY para tal consulta no determin a istica assegure que os registros so sempre ara mazenados/modicados na mesma ordem. Nas verses futuras do MySQL adicionareo mos automaticamente uma clusula ORDER BY quando necessrio. a a Os seguintes problemas so conhecidos e sero corrigidos na hora certa: a a Ao usar funes RPAD, ou qualquer outra funo string que termina adicionando espaos co ca c em branco a direita, em uma consulta que preisa usar tabelas temporrias para ser a rsolvida, todas as strings resultantes sero cortadas a direita (como em RTRIM). Este a um exemplo de uma consulta: e SELECT RPAD(t1.field1, 50, ) AS f2, RPAD(t2.field2, 50, ) AS f1 FROM table1 as t1 LEFT JOIN table2 AS t2 ON t1.record=t2.joinID ORDER BY t2.record; O resultado nal deste erro que o usurio no conseguira espaos em branco do lado e a a c direito do campo resultante. O comportamento anterior existe em todas as verses do MySQL. o A razo disto devido ao fato de tabelas HEAP, que so usadas primeiro para tabelas a e a temporrias, no so capazes de tratar colunas VARCHAR. a a a Este comportamento ser corrigido em uma das distribuies da srie 4.1. a co e Devido ao modo como os arquvos de denies de tabelas so armazenados no se co a a pode usar 255 caracteres (CHAR(255)) em nomes de tabelas, nomes de colunas e enum. Isto est programado para ser corrigido na verso 5.1 quando temos novos arquivos de a a formatos de denio de tabelas. ca Quando estiver usando SET CHARACTER SET, no permitido usar caracteres especias a e no nome do banco de dados, tabelas ou campos. Pode-se usar _ ou % com ESCAPE em LIKE ... ESCAPE. se voc tiver uma coluna DECIMAL com um nmero armazenado em diferentes formatos e u (+01.00, 1.00, 01.00), GROUP BY pode considerar cada valor como um valor diferente. DELETE FROM merge_table usado sem WHERE ir apenas apagar o mapeamento para a a tabela, no apagando tudo nas tabelas mapeadas. a Voc no pode construir em outro diretrio quando estiver utilizando MIT-pthreads. e a o Como isto necessitaria de alteraes na MIT-pthreads, ns no estamos aptos a corrig co o a ila. BLOB valores no podem ser usados com conana em GROUP BY, ORDER BY ou a c DISTINCT. Somente os primeiros bytes (padro 1024) max_sort_length so usados a a quando estiver comparando BLOBs nestes casos. Isto pode ser alterado com a opo ca -0 max_sort_lenght para mysqld. Uma forma de contornar este problema para a maioria dos casos usar a substring: SELECT DISTINCT LEFT(blob,2048) FROM e nome_tabela. Clculos so feitos com BIGINT ou DOUBLE (normalmente, ambos tem o tamanho de 64 a a bits). Depende da preciso utilizada na funao. A regra geral que funes binrias a c e co a so feitas com preciso BIGINT, IF e ELT() com preciso BIGINT ou DOUBLE e o resto a a a
57
com preciso DOUBLE. Devemos evitar o uso de valores sem sinal maiores que 63 bits a (9223372036854775807) para qualquer outra coisa alm de campos binrios! e a Todas os campos string, exceto campos do tipo BLOB e TEXTO tem, automaticamente, todos os espaos extras removidos quando recuperados. Para tipos CHAR, isto no tem c a problema, e pode ser considerado como um recurso de acordo com o ANSI SQL92. O problema que no MySQL, campos VARCHAR so tratados desta mesma forma. e a Voc s pode ter at 255 colunas ENUM e SET em uma tabela. e o e Em MIN(), MAX() e outras funes de agrupamente, o MySQL atualmente compara as co colunas ENUM e SET pelo valor de suas strings ao invs da posio relativa da string no e ca conjunto. mysqld_safe redireciona todas as mensagens de mysqld para o log mysqld. Um problema com isto que se voc executar o mysqladmin refresh para fechar e reabrir o e e log, a stdout e a stderr continuam redirecionadas para o log antigo. Se voc utiliza e --log extensivamente, dever editar o mysqld_safe para logar em hostname.err a em vez de hostname.log; assim voc pode facilmente utilizar o espao do log antigo e c apagando-o e executando mysqladmin refresh. Em instrues UPDATE, colunas so atualizadas da esquerda para a direita. Se voc co a e referenciar a uma coluna atualizada, voc ir obter o valor atualizado em vez do valor e a original, por exemplo: mysql> UPDATE nome_tabela SET KEY=KEY+1,KEY=KEY+1; Isto atualiza KEY com 2 no lugar de 1. Voc pode se referir a mltiplas tabelas em uma mesma consulta, mas voc no pode se e u e a referir a qualquer tabelas temporrias dada mais de uma vez. Por exemplo, a seguinte a instruo no funciona. ca a mysql> SELECT * FROM temporary_table, temporary_table AS t2; RENAME no funciona com tabelas temporrias (TEMPORARY) ou tabelas usadas em uma a a tabelas MERGE. O otimizador pode lidar com o DISTINCT de forma diferente se voc estiver usando cole unas escondidas em uma join ou no. Em uma join, colunas escondidas so contadas a a como parte do resultado (mesmo se elas no so mostradas) enquanto que em queries a a normais colunas escondidas no participam na comparao DISTINCT. Ns provavela ca o mente iremos alterar isto no futuro para nunca comparar as colunas escondidas quando executando DISTINCT. um exemplo disto : e SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id DESC; and SELECT DISTINCT band_downloads.mp3id FROM band_downloads,band_mp3 WHERE band_downloads.userid = 9 AND band_mp3.id = band_downloads.mp3id ORDER BY band_downloads.id DESC; No segundo caso, voc pode obter duas linhas idnticas no MySQL 3.23.x na srie do e e e resultado (porque o campo escondido id pode variar).
58
Perceba que isto somente acontece em consultas onde voc no tem colunas ORDER e a BY no resultado, algo no permitido no SQL-92. a Como o MySQL permite trabalhar com tipos de tabelas que no suportam transaes a co (e assim no pode fazer rollback em dados) algumas coisas funcionam um pouco a diferentes de outros servidores SQL em MySQL (Isto serve para garantir que o MySQL nunca necessitar de um rollback para um comando SQL). Porm isto pode ser um a e pouco estranho em casos que os valores dos campos devem ser vericados na aplicao, ca mas isto ira fornacer um timo ganho de velocidade assim como permite ao MySQL o fazer algumas otimizaes que de outro modo seriam muito dif co iceis para serem feitas. Se voc informar um valor incorreto em uma coluna, o MySQL, em vez de fazer um e rollback, aramzenar o melhor valor possvel no campo. a i Se tentar armazenar um valor fora da faixa em uma coluna numrico, o MySQL e no campo. ir armazenar o menor ou maior valor possivel a Se tentar armazenar uma string que no comece com um nmero em uma coluna a u numrica, o MySQL ir armazenar 0 na coluna. e a Se voc tentar armazenar NULL em uma coluna que no aceita valores e a nulos, MySQL ir armazenar 0 ou (string vazia) na coluna. a (Este comportamento pode, entretanto, ser alterado com a opo de compilao ca ca -DDONT USE DEFAULT FIELDS). O MySQL permite o armazenamento de alguns valores errados de data em campos do tipo DATE e DATETIME. (Como 2000-02-31 ou 2000-02-00). A idia que no e e a e servio do servidor SQL validar datas. Se o MySQL pode armazenar uma data e c recuperar extamente a mesma data, ento o MySQL armazenar a data. Se a data a a estiver totalmente errada, o MySQL ir armazenar a data 0000-00-00 no campo. a Se voc especicar um valor no suportado para um campo do tipo enum, ele ser e a a alterado para o valor de erro empty string, com valor numrico 0. e Se voc denir uma coluna SET com um valor no suportado, o valor ser ignorado. e a a Se voc executar uma PROCEDURE em uma pesquisa que retorna uma srie vazia, em e e alguns casos a instruo PROCEDURE no ir transformar as colunas. ca a a Criao da tabela do tipo MERGE no veriva se as tabelas envolvidas so de tipos ca a a compativeis. O MySQL ainda no pode lidar com valores NaN, -Inf e Inf em tipos double. Us-los a a causar problemas na exportao e importao de dados. Uma soluo intermediria a ca ca ca a alterar NaN para NULL (se for poss e ivel) e -Inf e Inf para o valor double m inimo ou mximo respectivo poss a ivel. Se voc usar ALTER TABLE para primeiro adicionar um e indice UNIQUE a uma tabela usada em uma tabela MERGE e ento usar ALTER TABLE para adicionar um a indice normal na tabela MERGE, a ordem das chaves ser diferente para as tabelas se existir uma chave a antiga no unica na tabela. Isto porque o ALTER TABLE coloca chaves UNIQUE antes a e de chaves normais para ser poss detectar chaves duplicadas o mais cedo o poss ivel ivel. Os seguintes erros so conhecidos em verses mais antigas do MySQL: a o Voc pode pendurar um processo se voc zer um DROP TABLE em uma tabela entre e e outras que esteja travada com LOCK TABLES.
59
No caso seguinte voc pode obter um descarrego de memria para o arquivo core: e o Tratamento de inseres com atraso tem deixado inseres pendentes na tabela. co co LOCK table com WRITE FLUSH TABLES Antes da verso 3.23.2 do MySQL um UPDATE que atualizava uma chave com um WHERE a na mesma chave podia falhar porque a chave era usada para procurar por registros e a mesma linha poderia ter encontrado vrios itens: a UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY > 100; Um modo de contornar este erro utilizar: e mysql> UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY+0 > 100; Isto funcionar porque MySQL no utilizar indices em expresses com a clusula a a a o a WHERE. Antes da verso 3.23 do MySQL, todos os tipos numricos tratados como campos a e de pontos xos. Isto signica que voc tem que especicar quantas casas decimais um e campo de ponto utuante deve ter. Todos os resultados eram retornados com o nmero u correto de casas decimais. Para erros espec icos na plataforma, vejas as sees sobre compilao e portabilidade. Veja co ca Seo 2.3 [Installing source], Pgina 94. Veja Apndice E [Porting], Pgina 1078. ca a e a
60
2 Instalao do MySQL ca
Este cap itulo descreve como obter e instalar o MySQL: Para uma lista de sites no quais voc pode obter o MySQL, veja Seo 2.2.1 [Getting e ca MySQL], Pgina 75. a Para saber quais so as plataformas suportadas, veja em Seo 2.2.3 [Which OS], a ca Pgina 78. Por favor perceba que nem todas as plataformas suportadas so igualmente a a boas para executar o MySQL. Algumas so mais robustas e ecientes que outras - ver a Seo 2.2.3 [Which OS], Pgina 78 para detalhes. ca a Vrias verses do MySQL esto dispon a o a iveis em distribuies binrias e fonte. Ns co a o tambm fornecemos acesso pblico ` nossa rvore fonte atual para aqueles que desejam e u a a ver nossos desenvolvimentos mais recentes e nos ajudar a testar novos cdigos. Para o determinar que verso e tipo da distribuio voc deve usar, veja Seo 2.2.4 [Which a ca e ca version], Pgina 80. Se ainda restar dvidas, use uma a distribuio binria. a u ca a Instrues de instalao para distribuies binria e fonte so descritos em Seo 2.2.9 co ca co a a ca [Installing binary], Pgina 91 e Seo 2.3 [Installing source], Pgina 94. Cada conjunto a ca a de instrues inclui uma seo sobre problemas espec co ca icos de sistemas que voc pode e precisar. Para procedimentos ps-instalao, veja Seo 2.4 [Post-installation], Pgina 111. Estes o ca ca a procedimentos podem ser aplicados caso voc use uma distribuio binria ou fonte do e ca a MySQL.
61
A distribuio fonte contm todo o cdigo e os arquivos suportados para construir o ca e o executvel usando o compilador VC++ 6.0. Veja Seo 2.3.7 [Construo do fonte para a ca ca Windows], Pgina 107. a Geralmente, a melhor opo a distribuio binria. E mais simples e voc no precisa de ca e ca a e a nenhuma ferramenta adicional para ter o MySQL em execuo. ca
62
C:\mysql\bin> mysqladmin -u root shutdown 4. Finalize o programa WinMySQLAdmin se ele estiver em execuo. ca 5. Descompacte os arquivos de distribuio em um diretrio temporrio. ca o a 6. Execute o programa setup.exe para iniciar o processo de instalao. Se voc quiser ca e instalar em um diretrio diferente do padro (c:\mysql), use o boto Browse para o a a especicar seu diretrio preferido. Se voc no instalar o MySQL no local padro, voc o e a a e precisar epecicar o local onde voc inicia o servidor. O modo mais fcil de se fazer a e a isto usar um arquivo de opo, como descrito em Seo 2.1.1.3 [Windows prepare e ca ca environment], Pgina 62. a 7. Finalize o processo de instalao. ca
63
O MySQL procura pelas opes primeiro no arquivo my.ini, e ento pelo arquivo my.cnf. co a No entanto, para evitar confuso, melhor se voc usar apenas um destes arquivos. Se o a e e seu PC usa um boot loader onde o drive C: no o drive de boot, sua unica opo usar a e ca e o arquivo my.ini. Independente de qual arquivo usar, ele deve ser no formato texto. Um arquivo de opo pode ser criado e modicado com qualquer editor de texto como o ca programa Notepad. Por exemplo, se o MySQL est instalado em D:\mysql e o diretrio a o de dados est localizado em D:\mydata\data, voc pode criar o arquivo de opo e denir a e ca uma seo [mysqld] para especicar valores para os parmetros basedir e datadir: ca a [mysqld] # defina basedir com o seu caminho de instala~o ca basedir=D:/mysql # defina datadir com o local do diretrio de dados, o datadir=D:/mydata/data Note que os nome de caminho do Windows so espec a icados em arquivos de opo usando ca barras normais em ves de barra invertida. Se voc usar barras invertidas, voc deve us-las e e a em dobro. Outro modo de se gerenciar um arquivo de opo usar a ferramenta WinMySQLAdmin. Voc ca e e pode encontrar o WinMySQLAdmin no diretrio bin de sua instalao MySQL, assim como o ca um arquivo de ajuda contendo instrues para us-lo. O WinMySQLAdmin tem a capacidade co a de editar os seus arquivos de opo, mas note o seguinte: ca WinMySQLAdmin usa apenas o arquivo my.ini. Se o WinMySQLAdmin encontra o arquivo C:\my.cnf, ele o renomear para a C:\my_cnf.bak para disabilit-lo. a Agora voc est pronto para testar o servidor. e a
Todos os binrios acima so otimizados para processadores Intel modernos mas deve funa a cionar em qualquer processador Intel i386 ou melhor. Os servidores mysqld-nt e mysqld-max-nt suportam conexes named pipe. Se voc usar o e um destes servidores, o uso de named pipes est sujeito a estas condies: a co
64
Os servidores devem ser executados em uma verso do Windows que suporte named a pipes (NT, 2000, XP). A partir da verso 3.23.50, named pipes s estaro habilitados se voc iniciar estes a o a e servidores com a opo --enable-named-pipe. ca Os servidores podem ser executados no Windows 98 ou Me, mas o TCP/IP deve estar instalado, e as conexes named pipes no podem ser usadas. o a No Windows 95, estes servidores no podem ser usados. a
65
011024 10:58:25
InnoDB: Started
Quando o servidor naliza sua sequncia de inicializao, voc deve ver algo como abaixo, e ca e que indica que o servidor est pronto para o conexo com o cliente: a a port: 3306 O servidor continuar a gravar no console qualquer sa de diagnstico adicional que ele a ida o produza. Voc pode abrir uma nova janela de console na qual se executar os programas e a clientes. Se voc omitir a opo --console, o servidor grava a sa do diagnstico no log de erro e ca ida o no diretrio de dados. O log de erro o arquivo com a extenso .err. o e a mysqld: ready for connections Version: 4.0.14-log socket:
66
67
Nota: Antes do MySQL 4.0.17, um servidor instalado como um servio do Windows tinha c problema na inicializao se o seu caminho ou nome do servio possuisse espaos. Por esta ca c c razo, evite instalar o MySQL em um diretrio como C:\Program Files ou usar um nome a o de servio contendo espao. c c No caso normal que voc instala o servidor com --install mas nenhum nome de servio, e c o servidor instalado com um nome de servio de MySQL. e c 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 servio dado depois de opo --install. Se nenhuma opo -c e ca ca defaults-file for dada, este comando teria o efeito de fazer o servidor ler o grupo [mysql] a partir do arquivo de opes padro. (Isto seria uma m idia, porque aquele grupoo co a a e de opo para ser usado pelo programa cliente mysql.) No entanto, como a opo -ca e ca defaults-file est presente, o servidor l as opes apenas a partir do arquivo indicado, a e co e apenas do grupo de opo [mysqld]. ca Voc tambm pode especicar as opes como Par^metros de inicializa~o no e e co a ca utilitrio de Servios do Windows antes de voc iniciar o servio MySQL. a c e c Uma vez que o servidor MySQL instalado, o Windows ir iniciar o servio automaticamente e a c sempre que o Windows inicia. O servio tambm pode ser iniciado imediatamente a partir c e do utilitrio Servios ou usando o comando NET START MYSQL. O comando NET no caso a c a e sensitivo. Note que quando executado como um servio, o mysqld no tm acesso a um console e c a e ento nenhuma mensagem pode ser vista. Se o mysqld no iniciar, verique o log de erros a a par ver se o servidor gravou alguma mensagem l indicando a causa do problema. O log de a erro est localizado no diretrio c:\mysql\data. E o arquivo com um suxo .err. a o Quando o mysqld est executando como um servio, ele pode ser parado usando o utilitrios a c a Servios, o comando NET STOP MYSQL, ou o comando mysqladmin shutdown. Se o servip c c estiver em execuo quando o Windows desliga, o Windows ir parar o servidor automatica a camente. A partir do MySQL verso 3.23.44, voc pode escolher entre instalar o servidor como um a e servio Manual se voc no deseja que os servios sejam executados automaticamente duc e a c rante o processo de inicializao. Para fazer isto, use a opo --install-manual em vez ca ca da opo --install. ca shell> C:\mysql\bin\mysqld --install-manual Para remover um servio que est instalado como um servio, primeiro pare-o se ele estiver c a c em execuo. Ento use a opo --remove para remov-lo: ca a ca e shell> mysqld --remove Um problema com a nalizao automtica do servio MySQL que, para verses do ca a c e o 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 fazer uma recuperao de falhas na prxima inicializao). A a ca o ca partir do MySQL 3.23.49, o Windows ir esperar mais para que a nalizao do MySQL a ca Server esteja completa. Se voc notar que ainda no o suciente para a sua instalao, e a e ca
68
no seguro executar o MySQL Server como um servio. Em vez disso, execute-o a partir a e c do prompt de comando, e nalize-o com mysqladmin shutdown. A alterao para avisar para o Windows para esperar mais quando parar o servidor MySQL ca funciona apenas com o Windows 2000 e XP, mas no para o Windows NT. No NT, o a Windows espera apenas 20 segundos para que o servio seja nalizado, e depois desso ele c mata o processo do servio. Voc pode aumentar este padro abrindo o Editor de Registro c e a (\winnt\system32\regedt32.exe) e editar o valor de WaitToKillServiceTimeout em HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control na rvore do Registro. Esa pecique o novo valor mais largo em milisegundos (por exemplo 12000 para que o Windows NT espere at 120 segundos). e Se voc no quiser iniciar o mysqld como um servio, voc pode inici-lo a partir da linha e a c e a de comando do mesmo modo que em verses do Windows que no so baseados no NT. o a a Para instrues use Seo 2.1.1.6 [Win95 start], Pgina 65. co ca a
Se o mysqld est lento para responder a suas conexes no Win95/Win98, provavelmente a o existe um problema com seu DNS. Neste caso, inicie o mysqld com a opo --skip-nameca resolve e use somente localhost e nmeros IP na coluna Host das tabelas de permisses u o do MySQL. Existem duas verses da ferramenta de linha de comando MySQL: o Binario mysql mysqlc Descrio ca Compilado em Windows nativo, oferecendo capacidades de edio de ca texto muito limitadas. Compilado com o compilador Cygnus GNU, que oferece edio ca readline.
69
Se voc desejar usar o mysqlc, deve ter uma cpia da biblioteca cygwinb19.dll em ale o gum lugar que o mysqlc possa encontr-la. Se sua distribuio do MySQL no tiver esta a ca a biblioteca instalada no mesmo diretrio que o mysqlc (o diretrio bin sob o diretrio base o o o sa dua instalao do MySQL). Se sua distribuio no tem a biblioteca cygwinb19.dll no ca ca a diretrio bin, olhe no diretrio lib para encontr-lo e copi-lo para o seu diretrio de o o a a o sistema no Windows. (\Windows\system ou um lugar parecido). Os privilgios padres no Windows do a todos usurios locais privilgios totais para todos e o a a e os bancos de dados sem necessidade de especicar uma senha. Para deixar o MySQL mais seguro, voc deve congurar uma senha para todos os usurio e remover a linha na tabela e a mysql.user que tem Host=localhost e User=. Voc tambm deve adicionar uma senha para o usurio root. O exemplo seguinte exemplo e e a inicia removendo o usurio annimo que tem todos os privilgios, e ento congura uma a o e a senha para o usurio root: a 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 desejar desligar o servidor mysqld, voc pode usar o e e seguinte comando: C:\> mysqladmin --user=root --password=sua_senha shutdown Se voc estiver usando o servidor de uma antiga verso shareware do MySQL verso 3.21m e a a o comando mysqladmin para congurar uma senha ir falhar com um erro: parse error a near SET password. A correo para este problema atualizar para uma verso mais ca e a nova do MySQL. Com as verses atuais do MySQL voc pode facilmente adicionar novos usurios e alterar o e a privilgios com os comandos GRANT e REVOKE. Veja Seo 4.4.1 [GRANT], Pgina 254. e ca a
70
o qual inclui ambas as bibliotecas para compatibilidade com verses anteriores o (libmysqlclient.so.12 para MySQL 4.0 e libmysqlclient.so.10 para MySQL 3.23). Muitas distribuies Linux ainda vm com o MySQL 3.23 a elas normalmente ligam as co e aplicaes dinamicamente para economizar espao em disco. Se estas bibliotecas comparco c tilhadas esto em pacotes separados (ex.; MySQL-shared), suciente simplesmente deixar a e estes pacotes instalados e apenas atualizar os pacotes do servidor e cliente MySQL (que so a estaticamente ligados e no dependem de bibliotecas compartilhadas). Para distribuies a co que incluem as bibliotecas compartilhadas no mesmo pacote que o servidor MySQL (ex.: Red Hat Linux), voc tambm pode instalar nosso RPM MySQL-shares 3.23 ou usar o e e pacote compat com MySQL-shared. ivel Os seguintes pacotes RPM esto dispon a iveis: MySQL-server-VERSION.i386.rpm O servidor MySQL. Voc ira precisar dele a no ser que voc apenas queira se conectar a e a e um servidor MySQL executando em outra mquina. Note que este pacote era chamado a MySQL-VERSION.i386.rpm antes do MySQL 4.0.10. MySQL-Max-VERSION.i386.rpm O servidor MySQL Max. Este seridor tem capacidades adicionais que o servidor no ROM MySQL-server no tem. Voc deve instalar o RPM MySQL-server primeiro, a e porque o RPM MySQL-Max depende dele. MySQL-client-VERSION.i386.rpm Os programas clientes padres do MySQL. Provavelmente voc sempre instalar este o e a pacote. MySQL-bench-VERSION.i386.rpm Testes e comparativos de performances (benchmarks). Necessita do Perl e mdulos do o BDB-mysql. MySQL-devel-VERSION.i386.rpm As bibliotecas e arquivos include necessrios se voc precisa para compilar outros a e clientes MySQL, como nos mdulos Perl. o MySQL-shared-VERSION.i386.rpm Este pacote contm as bibliotecas compartilhadas (libmysqlclient.so*) que certas e linguagens e aplicaes nencessrias para carregar dinmicamente e usar o MySQL. co a a MySQL-shared-compat-VERSION.i386.rpm Este pacote inclui o biblioteca compartilhada para MySQL 3.23 e MySQL 4.0. Instale este pacote em vez do MySQL-shared, se voc tiver aplicaes instaladas que so e co a dinmicamente ligadas ao MySQL 3.23 mas voc quer atualizar para o MySQL 4.0 sem a e quebrar as dependncias da biblioteca. Este pacote esta dispon e ivel desde o MySQL 4.0.13. MySQL-embedded-VERSION.i386.rpm A biblioteca do servidor embutido MySQL (MySQL 4.0). MySQL-VERSION.src.rpm Este contm o cdigo fonte para todos os pacotes acima. Ele tambm pode ser usado e o e para tentar construir RPMs para outras arquiteturas (por exemplo, Alpha ou SPARC).
71
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 instalao m ca inima padro, execute: a shell> rpm -i MySQL-server-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm Para instalar somente o pacote cliente, execute: shell> rpm -i MySQL-client-VERSION.i386.rpm O RPM fornece um recurso para vericar a integridade e autenticidade dos pacotes antes de instal-los. Se voc quiser aprender mais sobre este recurso, veja Seo 2.2.2 [Verifying a e ca Package Integrity], Pgina 75. a O RPM coloca dados sob o /var/lib/mysql. O RPM tambm cria as entradas apropriadas e em /etc/rc.d/ para iniciar o servidor automaticamente na hora do boot. (Isto signica que se voc realizou uma instalao anterior e fez alteraes em seu script de inicializao, e ca co ca voc pode desejar criar uma cpia do script para que voc no perca ao instalar um RPM e o e a mais novo). Veja Seo 2.4.3 [Automatic start], Pgina 118 para mais informaes sobre ca a co como o MySQL pode ser iniciado automaticamente na inicializao do sistema. ca Se voc quiser instalar o RPM do MySQL em uma distribuio Linux mais antiga que no e ca a suporte scripts de inicializao no /etc/init.d (diretamente ou via link simblico), voc ca o e deve criar um link simblico que aponte para a localizao onde o seu script de instalao o ca ca est atualmente instalado. Por exemplo, se esta localizao for /etc/rc.d/init.d, use a ca estes comandos antes de intalar o RPM para criar /etc/init.d como um link simblico o que aponte l: a shell> cd /etc; ln -s rc.d/init.d . No entanto, todas as distribuies de Linux atuais j devem suportar este novo layout co a de diretrio que usa /etc/init.d j que ele exigido para compatibilidade LBS (Linux o a e Standard Base). Se o arquivo RPM que voc instalar inclui o MySQL-server, o daemon mysqld deve estar e pronto e em execuo aps a instalao. Agora voc j deve poder iniciar o MySQL. Veja ca o ca e a Seo 2.4 [Ps Instalao], Pgina 111. ca o ca a Se alguma coisa der errado, voc encontrar maiores informaes no cap e co itulo de instalao. ca Veja Seo 2.2.9 [Instalado o binrio], Pgina 91. ca a a
72
Para relamente instalar o MySQL PKG, de um duplo clique na icone do pacote. Isto inicia o Mac OS Package Installer, que ir guia-lo pela instalao do MySQL. a ca O Mac OS X PKG do MySQL ir se instalar em /usr/local/mysql-<version> a e tambm instalr um link simblico /usr/local/mysql, apontando para a nova e a o localizao. Se um diretrio chamado /usr/local/mysql j existe, ele ser renomeado ca o a a para /usr/local/mysql.bak em primeiro lugar. Adicionalmente, ele ir instalar a a tabela de permisses do banco de dados MySQL executando mysql_install_db depois da o instalao. ca O layout de instalao similar a aquele da distribuio binria, todos os binrios do MySQL ca e ca a a esto localizados no diretrio /usr/local/mysql/bin. O socket MySQL ser colocado em a o a /tmp/mysql.sock por padro. Veja Seo 2.2.5 [Installation layouts], Pgina 83. a ca a A instalao do MySQL exige uma conta de usurio do Mac OS X chamada mysql (uma ca a conta de usurio com este nome existe por padro no Mac OS X 10.2 e acima). a a Se voc estiver executando o MAC OS X Server, voc j ter uma verso do MySQL e e a a a instalado: Mac OS X Server 10.2-10.2.2 vem com o MySQL 3.23.51 instalado Mac OS X Server 10.2.3-10.2.6 vem com o MySQL 3.23.53 Mac OS X Server 10.3 vem com o MySQL 4.0.14 Esta seo do manual cobre a instalao apenas do MySQL Mac OS X PKG ocial. Leia o ca ca ajuda da Apple sobre a instalao do MySQL (Execute o aplicativo Help View, selecione ca a ajuda do Mac OS X Server e faa uma busca por MySQL e leia o item entitulado c Installing MySQL). Note especialmente, que a verso pr-instalada do MySQL no Mac OS X Server iniciado a e e com o comando safe_mysqld em vez de mysqld_safe. Se anteriormente voc usava pacotes do MySQL de Marc Liyanage para Mac OS X de e http://www.entropy.ch, voc pode simplesmente seguir as intrues de atualizao para e co ca pacotes usando o layout de instalao dos binrio como dados em suas pginas. ca a a Se voc est atualizado da verso 3.23.xx de Marc ou do verso Mac OS X Server do e a a a MySQL para o MySQL PKG ocial, voc tambm deve converter a tabela de privilgios do e e e MySQL existente para o formato atual, porque alguns novos privilgios de segurana foram e c adicionados. Veja Seo 2.5.6 [Upgrading-grant-tables], Pgina 130. ca a Se voc preferisse iniciar automaticamente o MySQL durante o boot do sistema, voc e e tambn precisa instalar o MySQL Startup Item. A partir do MySQL 4.0.15, ele parte do e e disco de instalao do Mac OS X como um pacote de instalao separado. Simplesmente ca ca de um duplo clique no icone MySQLStartupItem.pkg e siga as instrues para instal-lo. co a Note que isto s precisa ser feito uma vez! No h necessidade de se instalar o Startup Item o a a toda vez que se atualizar o pacote do MySQL. Devido a um erro no instalador de pacotes do Mac OS X, algumas vezes voc pode ver a e mensagem de erro You cannot install this software on this disk. (null) no dilogo a de seleo do disco de destino. Se este erro ocorrer, simplesmente clique no boto Go ca a Back uma vez para retornar a tela anterior. Agora clique em Continue para avanar para a c seleo do disco de destino novamente - agora voc deve estar apto a escolher o disco destino ca e corretamente. Ns informamos este erro a Apple e eles esto investigando este problema. o a
73
O Startup Item ser instalado em /Library/StartupItems/MySQL. Ele adiciona uma a varivel MYSQLCOM=-YES- ao arquivo de congurao do sistema (/etc/hostconfig). Se a ca voc desejasse diasbilitar a inicializao automtica do MySQL, simplesmente altere o valor e ca a desta varivel para MYSQLCOM=-NO-. a No Mac OS X Server, o script de instalao do Startup Item disabilitar automaticaca a mente a inicializao da instalao padro do MySQL alterando a varivel MYSQL em ca ca a a /etc/hostconfig para MYSQL=-NO-. Isto para evitar conitos na inicializao. No e ca entanto, ele no desliga um servidor MySQL aj em execuo. a a ca Depois da instalao, voc pode iniciar o MySQL executando os seguintes comandos em ca e um janela de terminal. Note qye voc preceisa ter privilgios de administrador para realizar e e esta tarefa. Se voc tiver instalado o Startup Item: e shell> sudo /Library/StartupItems/MySQL/MySQL start (Enter your password, if necessary) (Press Control-D or enter "exit" to exit the shell) Se voc no tiver instalado o Startup Item, digite a seguinte sequncia de comandos: e a e 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 instalar o MySQL pela primeira vez, lembre-se de consigurar uma senha para o e usurio root do MySQL! a Isto feito com os seguintes comandos: e /usr/local/mysql/bin/mysqladmin -u root password <password> /usr/local/mysql/bin/mysqladmin -u root -h hostname password <password> Por favor, tenha certeza que o comando hostname na segunda linha est entre crases (), a assim a shell pode substitu com a sa deste comando (o nome da mquina deste i-la ida a sistema)! Voc tambm pode querer adicionar aliases ao seu arquivo de resursos do sheel para acessar e e mysql e mysqladmin da linha de comando: alias mysql /usr/local/mysql/bin/mysql alias mysqladmin /usr/local/mysql/bin/mysqladmin De forma alternativa, voc pode simplesmente adicionar /usr/local/mysql/bin a sua e varivel de ambiente PATH, ex.: adicionando o seguinte ao arquivo $HOME/.tcshrc: a setenv PATH ${PATH}:/usr/local/mysql/bin Note que instalar um novo MySQL PKG no remove o diretrio de uma instalao mais a o ca antiga. Infelizmente o Mac OS X Installer ainda no oferece a funcionalidade exigida para a atualizar apropriadamente pacotes instalados anteriormente.
74
Depois de copiar os arquivos de banco de dados do MySQL sobre os da verso a anterior e inicializar o nova verso com sucesso, voc deve remover os arquivos da a e instalao antiga para economizar espao em disco. Adicionalmente voc tambm ca c e e deve remover verses mais antigas do diretrio do Package Receipt localizados em o o /Library/Receipts/mysql-<version>.pkg.
75
8. Para nalizar a instalao, voc tambm deve adicionar os seguintes comandos ao ca e e autoexec.ncf. Por exemplo, se sua instalao do MySQL est em SYS:MYSQL e voc ca a e quiser que o MySQL inicie automaticamente, voc pode adicionar estas linhas: e #Starts the MySQL 4.0.x database server SEARCH ADD SYS:MYSQL\BIN MYSQLD_SAFE Se voc estiver usando NetWare 6.0, voc deve adicionar o parmetro --skipe e a external-locking: #Starts the MySQL 4.0.x database server SEARCH ADD SYS:MYSQL\BIN MYSQLD_SAFE --skip-external-locking Se houver uma instalao existente do MySQL no servidor, verique a existencia de comanca dos de inicializao do MySQL em autoexec.ncf, e edite ou delete-os se necessrio. ca a
76
pode fazer o download do cdigo fonte em http://www.gnu.org/software/textutils/. o Se voc tiver o OpenSSL instalado, voc tambm pode usar o comando openssl md5 e e e <pacote>. Uma implementao do comando md5 para DOS/Windows est dispon em ca a ivel http://www.fourmilab.ch/md5/. Exemplo: shell> md5sum mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz 155836a7ed8c93aee6728a827a6aa153 mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz Voc deve vericar se o resultado do checksum corresponde a aquele impresso no pgina de e a download logo abaixo do respectivo pacote. A maioria do sites mirrors tambm oferecem um arquivo chamado MD5SUMS, que tambm e e inclui o MD5 checksums para todos os arquivos inclu idos no diretrio Downloads. Note no o entanto que muito fcil de modicar este arquivo e ele no um mtodo muito convel. e a a e e a Caso esteja em dvida, voc deve consultar diferentes sites mirroers e comparar os resultau e dos.
77
hxwR9pRWVArNYJdDRT+rf2RUe3vpquKNQU/hnEIUHJRQqYHo8gTxvxXNQc7fJYLV K2HtkrPbP72vwsEKMYhhr0eKCbtLGfls9krjJ6sBgACyP/Vb7hiPwxh6rDZ7ITnE kYpXBACmWpP8NJTkamEnPCia2ZoOHODANwpUkP43I7jsDmgtobZX9qnrAXw+uNDI QJEXM6FSbi0LLtZciNlYsafwAPEOMDKpMqAK6IyisNtPvaLd8lH0bPAnWqcyefep rv0sxxqUEMcM3o7wwgfN83POkDasDbs3pjwPhxvhz6//62zQJ7Q7TXlTUUwgUGFj a2FnZSBzaWduaW5nIGtleSAod3d3Lm15c3FsLmNvbSkgPGJ1aWxkQG15c3FsLmNv bT6IXQQTEQIAHQUCPj6jDAUJCWYBgAULBwoDBAMVAwIDFgIBAheAAAoJEIxxjTtQ cuH1cY4AnilUwTXn8MatQOiG0a/bPxrvK/gCAJ4oinSNZRYTnblChwFaazt7PF3q zIhMBBMRAgAMBQI+PqPRBYMJZgC7AAoJEElQ4SqycpHyJOEAn1mxHijft00bKXvu cSo/pECUmppiAJ41M9MRVj5VcdH/KN/KjRtW6tHFPYhMBBMRAgAMBQI+QoIDBYMJ YiKJAAoJELb1zU3GuiQ/lpEAoIhpp6BozKI8p6eaabzF5MlJH58pAKCu/ROofK8J Eg2aLos+5zEYrB/LsrkCDQQ+PqMdEAgA7+GJfxbMdY4wslPnjH9rF4N2qfWsEN/l xaZoJYc3a6M02WCnHl6ahT2/tBK2w1QI4YFteR47gCvtgb6O1JHffOo2HfLmRDRi Rjd1DTCHqeyX7CHhcghj/dNRlW2Z0l5QFEcmV9U0Vhp3aFfWC4Ujfs3LU+hkAWzE 7zaD5cH9J7yv/6xuZVw411x0h4UqsTcWMu0iM1BzELqX1DY7LwoPEb/O9Rkbf4fm Le11EzIaCa4PqARXQZc4dhSinMt6K3X4BrRsKTfozBu74F47D8Ilbf5vSYHbuE5p /1oIDznkg/p8kW+3FxuWrycciqFTcNz215yyX39LXFnlLzKUb/F5GwADBQf+Lwqq a8CGrRfsOAJxim63CHfty5mUc5rUSnTslGYEIOCR1BeQauyPZbPDsDD9MZ1ZaSaf anFvwFG6Llx9xkU7tzq+vKLoWkm4u5xf3vn55VjnSd1aQ9eQnUcXiL4cnBGoTbOW I39EcyzgslzBdC++MPjcQTcA7p6JUVsP6oAB3FQWg54tuUo0Ec8bsM8b3Ev42Lmu QT5NdKHGwHsXTPtl0klk4bQk4OajHsiy1BMahpT27jWjJlMiJc+IWJ0mghkKHt92 6s/ymfdf5HkdQ1cyvsz5tryVI3Fx78XeSYfQvuuwqp2H139pXGEkg0n6KdUOetdZ Whe70YGNPw1yjWJT1IhMBBgRAgAMBQI+PqMdBQkJZgGAAAoJEIxxjTtQcuH17p4A n3r1QpVC9yhnW2cSAjq+kr72GX0eAJ4295kl6NxYEuFApmr1+0uUq/SlsQ== =YJkx -----END PGP PUBLIC KEY BLOCK----Voc pode importar esta chave em seu pasta de chaves publicas GPG usando gpg --import. e Veja a documentao de GPG para mais informaes de como trabalhar com chaves pblicas. ca co u Depois de fazer o download e importar a chave publica criada, faa o download c do pacote MySQL desejado e da assinatura correspondente, que tambm est e a dispon ivel na pgina de download. A assinatura tem a extenso .asc. Por exemplo, a a a assinatura de mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz seria mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz.asc. Tenha certeza que ambos os arquivos esto armazenados no mesmo diretrio e ento execute o seguinte comando a o a 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) <[email protected]>"
78
79
SCO UnixWare 7.0.1. Veja Seo 2.6.6.10 [SCO Unixware], Pgina 163. ca a DEC Unix 4.x com threads nativas. Veja Seo 2.6.6.6 [Alpha-DEC-UNIX], Pgina 157. ca a FreeBSD 2.x com o pacote inclu MIT-pthreads. Veja Seo 2.6.4.1 [FreeBSD], ido ca Pgina 148. a FreeBSD 3.x e 4.x com threads nativas. Veja Seo 2.6.4.1 [FreeBSD], Pgina 148. ca a FreeBSD 4.x com Linuxthreads. Veja Seo 2.6.4.1 [FreeBSD], Pgina 148. ca a MIT-pthreads ou DCE threads. Veja Seo 2.6.6.2 HP-UX 10.20 com o pacote incluido ca [HP-UX 10.20], Pgina 153. a HP-UX 11.x com as threads nativas. Veja Seo 2.6.6.3 [HP-UX 11.x], Pgina 154. ca a Linux 2.0+ com LinuxThreads 0.7.1+ ou glibc 2.0.7+. Veja Seo 2.6.2 [Linux], ca Pgina 137. a Mac OS X Server. Veja Seo 2.6.5 [Mac OS X], Pgina 152. ca a NetBSD 1.3/1.4 Intel e NetBSD 1.3 Alpha (Necessita GNU make). Veja Seo 2.6.4.2 ca [NetBSD], Pgina 150. a Novell NetWare 6.0. Veja Seo 2.6.8 [Novell NetWare], Pgina 164. ca a OpenBSD > 2.5 com threads nativas. OpenBSD < 2.5 com o pacote inclu MITido pthreads . Veja Seo 2.6.4.3 [OpenBSD], Pgina 150. ca a OS/2 Warp 3, FixPack 29 e OS/2 Warp 4, FixPack 4. Veja Seo 2.6.7 [OS/2], ca Pgina 163. a SGI Irix 6.x com threads nativas. Veja Seo 2.6.6.8 [SGI-Irix], Pgina 160. ca a Solaris 2.5 e superior com threads nativas nas plataformas SPARC e x86. Veja Seo 2.6.3 [Solaris], Pgina 144. ca a SunOS 4.x com o pacote inclu MIT-pthreads. Veja Seo 2.6.3 [Solaris], Pgina 144. ido ca a Tru64 Unix Windows 9x, Me, NT, 2000 e XP. Veja Seo 2.6.1 [Windows], Pgina 133. ca a Perceba que nem todas as plataformas so apropriadas para executar o MySQL. Os seguintes a fatores determinam se uma certa plataforma apropriada para uma misso cr e a itica pesada: Estabilidade geral da biblioteca thread. Uma plataforma pode ter excelente reputao, ca entretanto, se a biblioteca thread instvel no cdigo que usado pelo MySQL, mesmo e a o e se todo o resto for perfeito, o MySQL ir ser to estvel quanto a biblioteca thread. a a a A habilidade do kernel e/ou a biblioteca thread tirar vantagem do SMP em sistemas multi-processados. Em outras palavras, quando um proceesso cria uma thread, deve ser poss para aquela thread executar em uma CPU diferente que o processo original. ivel A habilidade do kernel e/ou a biblioteca thread executar vrias threads que a adiquire/libera um bloqueio mutex sobre uma pequena regio cr a itica frequentemente sem trocas de contexto excessivos. Em outras palavras, se a implementao de ca pthread_mutex_lock() requisitar a CPU muito rapidamente, isto ir afetar o MySQL a tremendamente. Se esse detalhe no estiver sendo cuidado, adicionar CPUs extras a podem deixar o MySQL mais lento. Estabilidade e performance geral do sistema de arquivos. Habilidade do sistema de arquivos em lidar com arquivos grandes de forma eciente, se suas tabelas forem grandes.
80
Nosso n de experincia aqui na MySQL AB com a plataforma. Se ns conhecemos ivel e o bem uma plataforma, introduzimos otimizaes/correoes espec co c icas para ela habilitadas na hora da compilao. Ns tambm podemos fornecer conselhos sobre como ca o e congurar seu sistema otimizadamente para o MySQL. O volume de testes feitos internamente de conguraes similares. co O nmero de usurios que tem executado o MySQL com sucesso naquela plataforma em u a conguraes similares. Se esse nmero for alto, as chances de se ter alguma surpresa co u espec ica da plataforma ca muito menor. Baseado nos critrios acima, as melhores plataformas para a execuo do MySQL at este e ca e ponto so o x86 com SuSe Linux 8.2, kernel 2.4 e ReiserFS (ou qualquer distribuio Linux a ca similar) e Sparc com Solaris (2.7-9). FreeBSD vem em terceiro, mas realmente temos esperanas que ele ir se unir ao clube dos tops uma vez que a biblioteca thread est c a a melhorando. Ns tambm acreditamos que em certo ponto iremos estar aptos para incluir o e todas as outras plataformas em que o MySQL compila e executa, mas no to bem e com a a o mesmo nivel de estabilidade e performance, na categoria superior. Isto necessitar de a algum esforo da nossa parte em cooperao com os desenvolvedores dos componentes do c ca Sistema Operacional/Biblioteca que o MySQL depende. Se voc tiver interesse em melhorar e algum de nossos componentes, est em uma posio para inuenciar seu desenvolvimento, a ca e precisa de instrues mais detalhadas sobre o que o MySQL necessita para uma melhor co execuo, envie um e-mail para lista de email insternals do MySQL. Veja Seo 1.7.1.1 ca ca [Mailing-list], Pgina 33. a Por favor, perceba que a comparao acima no para dizer que um SO melhor ou pior ca a e e que o outro em geral. Ns estamos falando sobre a escolha de um SO para um propsito o o dedicado: executar o MySQL, e comparamos as plataformas levando isto em considerao. ca Desta forma, o resultado desta comparao seria diferente se ns incluissemos mais detalhes. ca o E em alguns casos, a razo de um SO ser melhor que o outro pode ser simplesmente a porque colocamos mais esforo nos testes e otimizao para aquela plataforma em particular. c ca Estamos apenas colocando nossas observaes para ajud-lo na deciso de qual plataforma co a a usar o MySQL na sua congurao. ca
81
A segunda deciso a ser feita se voc deseja usar uma distribuio fonte ou binria. Na a e e ca a maioria dos casos provavelmente voc dever usar a distribuio binria, se alguma existir e a ca a para sua plataforma, ser normalmente muito mais fcil para instalar do que a distribuio a a ca em cdigo fonte. o Nos seguites casos voc provavelmente ser mais bem servido com uma instalao baseada e a ca em cdigo fonte: o Se voc desejar instalar o MySQL em algum lugar expec e ico. (O padro das disa tribuies binrias estarpronto para rodar em qualquer lugar, mas talvez voc co a e e deseje ainda mais exibilidade). Para estar apto e satisfazer diferentes requisies dos usurios, estaremos fornecendo co a duas verses binrias diferentes; Uma compilada com os manipuladores de tabelas no o a a transacionais (um binrio rpido e pequeno) e um congurado com as mais importantes a a opes extendidas como tabelas transacionais. Ambas verses so compiladas da mesma co o a distribuio fonte. Todos clientes MySQL nativos pode conectar com ambas verses do ca o MySQL. A distribuio binria extendida marcada com o suxo -max e congurada com as ca a e e mesmas opes de mysqld-max. Veja Seo 4.8.5 [mysqld-max], Pgina 343. co ca a Se voc deseja usar o RPM MySQL-Max, primeiramente voc deve instalar o RPM MySQLe e server padro. a Se voc deseja congurar mysqld com alguns recursos extras que NAO esto nas dise a tribuies binrias. Segue abaixo a lista das opes extras mais comuns que voc pode co a co e querer usar: --with-innodb --with-berkeley-db (padro para o MySQL 4.0 e seguintes) a --with-raid (no dispon para todas as plataformas) a ivel --with-libwrap --with-named-z-lib (Isto feito para alguns dos binrios) e a --with-debug[=full] A distribuio binria padro normalmente compilada com suporte para todos conca a a e juntos de caracteres e deve funcionar em uma variedade de processadores para a mesma fam do processador. ilia Se voc precisar de um servidor MySQL mais rpido voc pode querer recompil-lo com e a e a suporte para somente o conjunto de caracteres que voc precisa, usar um compilador e melhor (como pgcc) ou usar opes de compiladores para usar otimizaes para seu co co processador. Se voc encontrar um erro e relat-lo para o time de desenvolvimento do MySQL voc e a e provavelmente receber um patch que ser necessrio aplic-lo para a distribuio fonte a a a a ca para ter o bug corrigido. Se voc deseja ler (e/ou modicar) o cdigo C e C++ que o MySQL, voc pode obter e o e e uma distribuio fonte. O cdigo fonte sempre o manual nal. Distribuies fontes ca o e co tambm contem mais testes e exemplos que as distribuies binrias. e co a O esquema de nomes do MySQL usa nmeros de verses que consistem de tres nmeros e u o u um suxo. Por exemplo, um nome de lanamento como mysql-4.1.0-alpha interpretado c e da seguinte maneira:
82
O primeiro nmero (4) a verso principal e tambm descreve o formato dos arquivos. u e a e Todas releases da Verso 4 tem o mesmo formato de arquivo. a O segundo nmero (1) o n da distribuiao. u e ivel c O terceiro nmero (0 o nmero da verso do n de distribuio. Este incrementado u e u a ivel ca e para cada nova distribuio. Normalmente voc desejar a ultima verso para o n ca e a a ivel de publicao que tiver escolhido. ca O suxo (alpha) indica o n de estabilidade da verso. Os poss ivel a iveis suxo so: a alpha indica que a verso contm grandes sees de novos cdigos que no foram a e co o a 100% testados. Bugs conhecidos (normalmente no tem nenhum) devem estar doca umentados na seo News. Veja Apndice D [News], Pgina 957. Existem tambm ca e a e novos comandos e extenses na maioria das publicaes alpha. Desenvolvimento o co ativo que podem envolver maiores alteraes no cdigo pode ocorrer numa verso co o a alpha, mas tudo ser testado antes de fazer a publicao. No podem existir erros a ca a conhecidos em nenhuma publicao do MySQL. ca beta signica que todo o novo cdigo foi testado. No sero adicionados novos o a a recursos que podem causar algum tipo de corrompimento. No deve existir bugs a conhecidos. Uma alterao de verso de alpha para beta ocorre quando no existir ca a a nenhum relato de erro fatal com uma verso alpha por pelo menos um ms e no a e a planejarmos adicionar nenhum recurso que pode deixar algum antigo comando menos convel. a gamma o beta que j tem sido usado a algum tempo e parece funcionar bem. e a Apenas pequenas correes so adicionadas. Isto o que muitas empresas chamam co a e de release. Se no existir um suxo, signica que esta verso j est sendo executada h a a a a a algum tempo em diferentes locais sem relatos de erros alm dos espec e icos de certas plataformas. Somente correes de erros cr co iticos so adicionados ao release. a Isto o que chamamos de uma distribuio estvel. e ca a No processo de desenvolvimento do MySQL, vrias verses coexistem e esto em um estgio a o a a diferente. Naturalmente, correes de erros relevantes de uma srie anterior so propagados. co e a Para a antiga srie 3.23 estvel/de produo, novas verses s so liberadas para erros e a ca o o a criticos. A srie atual (4.0) de qualidade estvel/produo. Nenhum novo recurso que possa e e a ca inuenciar a estabilidade do cdigo adicionado. o e No ramo alpha 4.1 principal, novos recursos so adicionados. Fontes e binrios esto a a a dispon iveis para uso e teste em sistemas de desenvolvimento. O ramo de desenvolvimento 5.0 s est dispon para a rvore do BitKeeper. o a ivel a Todas as verses do MySQL funcionam sobre nossos testes padres e comparativos para o o garantir que eles so relativamente seguros para o uso. Como os testes padres so extena o a didos ao longo do tempo para conferir por todos os bugs antigos encontrados, o pacote de testes continua melhorando. Perceba que todas publicaes de verses foram testadas pelo menos com: co o Um pacote de testes interna Faz parte de um sistema de produo para um cliente. Ela tem diversas tabelas ca com centenas de megabytes de dados.
83
O diretrio mysql-test contm um conjunto extensivo de casos de teste. Ns o e o executamos estes testes para cada servidor binrio. a O pacote de comparativos da MySQL Este executa uma srie de consultas comuns. E tambm um teste para ver se e e o ultimo conjunto de otimizaes fez o cdigo mais rpido. Veja Seo 5.1.4 co o a ca [MySQL Benchmarks], Pgina 421. a O teste crash-me Este tenta determinar quais recursos o banco de dados suporta e quais so suas a capacidades e limitaes. Veja Seo 5.1.4 [MySQL Benchmarks], Pgina 421. co ca a Outro teste que ns usamos a verso do MySQL mais nova em nosso ambiente de produo e o a ca interna, em pelo menos uma mquina. Ns temos mais de 100 gigabytes de dados com que a o trabalhar.
84
mysql_install_db is installed in the /usr/local/bin directory rather than in /usr/local/mysql/scripts. 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
semanas e que no tenham sido sustitu por uma nova verso. Veja Seo 2.2.4 [Qual a ida a ca verso], Pgina 80. a a
86
Para darmos acesso rapidamente aos nossos usurios dos ultimos recursos a do MySQL, fazemos uma nova distribuio do MySQL a cada 4-8 semanas. ca Instantneos do cdigo nte so contru a o a idos diariamente e esto dispon a iveios em http://downloads.mysql.com/snapshots.php. Se, depois da distribuio estar pronta, recebermos qualquer relatrio que houve (deca o pois de tudo) qualquer coisa criticamente errada com a construo em uma plataforma ca espec ica, corrigiremo-na imediatamente e liberaremos um nova distribuio a para ca aquela plataforma. Graas aos nosso grande base de usurios, problemas so encontrac a a dos rapidamente. Nosso registro para boas distribuies feitas muito boa. Nas ultimas 150 distribuies, co e co tivemos que fazer uma nova contruo para menos de 10 distribuies (em 3 destes ca co casos, o erro era uma biblioteca glibc com problema em uma de nossas mquinas que a levamos um longo tempo para encontrar.
87
-prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --withmysqld-ldflags=-non_shared --with-client-ldflags=-non_shared --disable-shared 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
88
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 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
89
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 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 binrios so contru a a idos em sistemas de terceiros gentilmente cedidos para a MySQL AB pou outros usurios. Pou favor, note que eles s so fornecidos como cortesia. a o a Uma vez que a MySQL AB no tem total controle sobre estes sistemas, ns podemos fornecer a o apenas suporte limitado para os binrios constru a idos nestes sistemas. SCO Unix 3.2v5.0.6 i386 com gcc 2.95.3 CFLAGS="-O3 -mpentium" LDFLAGS=-static CXX=gcc CXXFLAGS="-O3 mpentium -felide-constructors" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-named-z-libs=no --enable-thread-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
90
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 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 opes de compilao foram usadas nos pacotes binrios que a MySQL AB co ca a costumava fornecer no passado. Estes binrios no so mais atualizados, mas as opes de a a a co compilao so mantidas aqui com o propsito de referncia. ca a o e Linux 2.2.xx sparc com egcs 1.1.2 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-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
91
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 opes otimizadas para qualquer das conguraes listadas acima co co pode sempre envi-los para a lista de email internals do MySQL. Veja Seo 1.7.1.1 a ca [Mailing-list], Pgina 33. a Distribuies RPM que anteceda o MySQL verso 3.22 so contribuies dos usurios. Os co a a co a RPMs gerados por ns da MySQL AB s comearam a ser fornecidos a partir da verso o o c a 3.22 do MySQL. Se voc deseja compilar uma verso para depurao do MySQL, voc deve adicionar --withe a ca e debug ou --with-debug=full para as linhas de congurao acima e remover qualquer ca opo -fomit-frame-pointer. ca Para distribuies do Windows, por favor, veja Seo 2.1.1 [Windows installation], co ca Pgina 60. a
92
shell> scripts/mysql_install_db shell> chown -R root . shell> chown -R mysql data shell> chgrp -R mysql . shell> bin/mysqld_safe --user=mysql & Se a sua verso do MySQL mais antiga que a 4.0, substitua bin/safe_mysqld por a e bin/mysqld_safe no comando nal. Voc pode adicionar novos usurios usando o script bin/mysql_setpermission se voc e a e instalar os mdulos Perl DBI e DBD-mysql. o Uma descrio mais detalhada apresentada a seguir. ca e Para instalar uma distribuio binria, siga estes passos, ento proceda com a Seo 2.4 ca a a ca [Ps Instalao], Pgina 111, para a congurao da ps istalao e testes: o ca a ca o ca 1. Escolha o diretrio sob o qual voc deseja descompactar a distribuio e a mova para o e ca dentro dele. No exemplo a seguir, descompactamos a distribuio sob /usr/local e ca criamos um diretrio /usr/local/mysql dentro do qual o MySQL instalado. (As o e seguintes instrues, consequentemente, assumem que voc tem permisso para criar co e a arquivos em /usr/local. Se este diretrio protegido, voc precisar realizar a o e e a instalao como root.) ca 2. Obtenha um arquivo de distribuio de um dos sites listados em Seo 2.2.1 [Getting ca ca MySQL], Pgina 75. a As distribuies binrias do MySQL so fornecidas como arquivos tar compactados e co a a tem nomes como mysql-VERS~O-SO.tar.gz, onde VERS~O um nmero (por exemA A e u plo, 3.21.15) e SO indica o tipo de sistema operacional para o qual a distribuio ca e pretendida (por exemplo, pc-linux-gnu-i586). 3. Se voc ver uma distribuio binria marcada com o suxo -max, signica que o e ca a binrio tem suporte para tabelas transacionais e outros recursos. Veja Seo 4.8.5 a ca [mysqld-max], Pgina 343. Note que todos os binrios so contru a a a idos a partir da mesma distribuio fonte do MySQL. ca 4. Adicione um usurio e grupo para o mysqld ser executado: a shell> groupadd mysql shell> useradd -g mysql mysql Estes comandos adicionam o grupo mysql e o usurio mysql. A sintaxe para useradd a e groupadd podem diferir um pouco nas diversas verses de Unix. Eles tambmpodem o e ser chamado adduser e addgroup. Voc pode desejar criar o grupo e usurio com outro e a nome, diferente de mysql. 5. Chame o diretrio no qual se pretende fazer a instalao: o ca shell> cd /usr/local 6. Descompacte a distribuio, que criar o diretrio de instalao. Ento crie um link ca a o ca a simblico para aquele diretrio: o o shell> gunzip < /path/to/mysql-VERS~O-SO.tar.gz | tar xvf A shell> ln -s full-path-to-mysql-VERS~O-SO mysql A O primeiro comando cria um diretrio chamado mysql-VERS~O-SO. O segundo coo A mando cria um link simblico para o diretrio. Isto torna a referncia ao diretrio de o o e o instalao mais fcil, chamado como /usr/local/mysql. ca a
93
7. Altere para p diretrio de instalao: o ca shell> cd mysql Voc encontrar diversos arquivos e subdiretrios no diretrio mysql. O mais impore a o o tante para propsitos de instalao so os subdiretrios bin e scripts. o ca a o bin Este diretrio contm o programa cliente e o servidor. Voc deve adicionar o e e o caminho completo deste diretrio a sua varivel de ambiente PATH e o a assim a sua shell encontrar o programa MySQL de forma apropriada. a Veja Apndice F [Variveis de ambiente], Pgina 1092. e a a
8.
9.
10.
11. 12.
Este diretrio contm o script mysql_install_db usado para inicializar o o e banco de dados mysql contendo a tabela de permisses que armazenam o o servidor de permisses de acesso. o Caso voc desejasse usar o mysqlaccess e a distribuio do MySQL est em um local e ca a diferente do padro, voc deve alterar a localizao para onde o mysqlaccess espera a e ca encontrar o cliente mysql. Edite o script bin/mysqlaccess aproximadamente na linha 18. Procure pela linha que se parece com a apresentada abaixo: $MYSQL = /usr/local/bin/mysql; # path to mysql executable Altere o caminho para o local onde o mysql atualmente est armazaenado em seu a sistema. Se voc no zer isto receber uma mensagem de erro Broken pipe quando e a a executar o mysqlaccess. Crie as tabelas de permisso do MySQL (necessrio apenas se voc no tiver instalado a a e a o MySQL anteriormente): shell> scripts/mysql_install_db Note que as verses mais antigas que a 3.22.10 iniciam o servidor MySQL quando voc o e executa o mysql_install_db. Isto no ocorre mais. a Altere o proprietrio dos binrios para o root e o proprietrio do diretrio de dados a a a o para o usurio com o quel voc executar o mysqld: a e a shell> chown -R root /usr/local/mysql/. shell> chown -R mysql /usr/local/mysql/data shell> chgrp -R mysql /usr/local/mysql/. O primeiro comando altera o atributo owner dos arquivos para o usurio root, o a segundo altera o atributo owner do diretrio de dados para o usurio mysql e o terceiro o a altera o atributo group para o grupo mysql. Se voc quiser instalar o suporte para a interface Perl DBI/DBD, veja Seo 2.7 [Perl e ca support], Pgina 164. a Se voc desejasse que o MySQL seja iniciado automaticamente quando voc iniciar a e e sua mquina, voc pode copiar support-files/mysql.server para o local onde o seu a e sistema tem os arquivos de inicializao. Mais informaes podem ser encontradas no ca co script support-files/mysql.server e em Seo 2.4.3 [Automatic start], Pgina 118. ca a
scripts
Depois de tudo estar descompactado e instalado, voc deve inicializar e testar a sua dise tribuio. ca Voc pode iniciar o servidor MySQL com o seguinte comando: e shell> bin/mysqld_safe --user=mysql &
94
Se a sua verso do MySQl for mais antiga do que a 4.0, substitua bin/safe_mysqld por a bin/mysqld_safe no comando. Agora prossiga com Seo 4.8.2 [mysqld_safe], Pgina 331 e Veja Seo 2.4 [Ps instalao], ca a ca o ca Pgina 111. a
95
diretrio scripts depois de desempacotar a distribuio. Veja Seo 1.7.1.3 [Bug reports], o ca ca Pgina 36. a
Se a sua verso do MySQL mais antiga que a 4.0, substitua bin/safe_mysqld por a e bin/mysqld_safe no comando nal. Se voc deseja ter suporte para tabelas InnoDB, voc deve editar o arquivo /etc/my.cnf e e e remover o caractere # antes dos parmetros que iniciam com innodb_.... Veja Seo 4.1.2 a ca [Option les], Pgina 216. Veja Seo 7.5.3 [InnoDB start], Pgina 644. a ca a Se voc iniciar de um RPM fonte, ento faa o seguinte: e a c shell> rpm --rebuild --clean MySQL-VERSION.src.rpm Isto ir criar um RPM binrio que voc pode instalar. a a e Voc pode adicionar novos usurios utilizando o script bin/mysql_setpermission se voc e a e instalar os mdulos Perl DBI e DBD-mysql. o Segue uma descrio mais detalhada. ca Para instalar uma distribuio fonte, siga os passos a seguir, ento prossiga para Seo 2.4 ca a ca [Post-installation], Pgina 111, para inicializao do ps-instalao e testes: a ca o ca 1. Escolha o diretrio sobre o qual voc deseja descompactar a distribuio e v para ele. o e ca a 2. Obtenha um arquivo de distribuio de algum dos sites listados em Seo 2.2.1 [Getting ca ca MySQL], Pgina 75. a 3. Se voc esta interessado em usar tabelas Berkeley DB com MySQL, voc precisar obter e e a uma verso com o patch do cdigo fonte do Berkeley DB. Por favor leia o capitulo sobre a o tabelas Berkeley DB antes de continuar. Veja Seo 7.6 [BDB], Pgina 698. ca a Distribuies fontes do MySQL so fornecidas como arquivos tar compactados e tem co a nomes como mysql-VERSION.tar.gz, onde VERSION um nmero como 5.0.0-alpha. e u 4. Adicione um usurio e grupo para o mysql executar assim: a
96
5.
6.
7.
8.
9.
10.
shell> groupadd mysql shell> useradd -g mysql mysql Estes comandos adicionam o grupo mysql e o usurio mysql. A sintaxe para useradd e a groupadd podem mudar um pouco em diferentes verses de Unix. Elas podem tambm o e ser chamadas adduser e addgroup. Voc pode escolher outros nomes para o usurio e e a grupo em vez de mysql. Descompacte a distribuio para o diretrio corrente: ca o shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf Este comando cria um diretrio com o nome mysql-VERSION. o Mude para o diretrio da distribuio descompactada: o ca shell> cd mysql-VERSION Note que agora voc deve congurar e construir o MySQL a partir deste diretrio raiz e o da distribuio. Voc no pode constru em um diretrio diferente. ca e a i-lo o Congure o release e compile tudo: shell> ./configure --prefix=/usr/local/mysql shell> make Quando voc executar configure, voc pode desejar especicar algumas opes. Exee e co cute ./configure --help para uma lista das opes. Seo 2.3.3 [configure options], co ca Pgina 98, discute algumas das opes mais usadas. a co Se o configure falhar, e voc for enviar uma mensagem para lista de email do MySQL e para pedir ajuda, por favor, inclua qualquer linhas de config.log que voc acha e que pode ajudar a resolver o problema. Tambm inclua as ultimas linhas da sa e ida de configure se o configure abortar. Envie o relatrio de erros usando o script o mysqlbug. Veja Seo 1.7.1.3 [Bug reports], Pgina 36. ca a Se a compilao falhar, veja Seo 2.3.5 [Compilation problems], Pgina 103, para uma ca ca a ajuda com um varios problemas comuns. Instalar tudo: shell> make install Voc deve executar este comando como root. e Crie as tabelas de permisses do MySQL (necessrias s se voc no tiver instalado o o a o e a MySQL anteriormente): shell> scripts/mysql_install_db Note que as verses do MySQL anteriores ` verso 3.22.10 iniciam o servidor MySQL o a a quando voc executa mysql_install_db. Isto no acontece mais! e a Altere o dono dos binrios para root e do diretrio dados para o usurio que ir a o a a executar o mysqld: shell> chown -R root /usr/local/mysql shell> chown -R mysql /usr/local/mysql/var shell> chgrp -R mysql /usr/local/mysql O primeiro comando altera o atributo de proriedade dos arquivos para o usurio root, a o segundo altera o atributo de propriedade do diretrio de dados para o usurio mysql, o a e o terceiro altera o atributo de grupo para o grupo mysql.
97
11. Se voc deseja instalar suporte para a interface Perl DBI/DBD, veja Seo 2.7 [Perl e ca support], Pgina 164. a 12. Se voc deseja que o MySQL inicie automaticamente quando voc ligar sua mquina, e e a voc pode copiar support-files/mysql.server para o local onde seu sistema tem seus e arquivos de incializao. Mais informaes podem ser encontradas no prprio script ca co o support-files/mysql.server e em Seo 2.4.3 [Automatic start], Pgina 118. ca a Depois de tudo ter sido instalado, voc deve iniciar e testar sua distribuio usando este e ca comando: shell> /usr/local/mysql/bin/mysqld_safe --user=mysql & Se a sua verso do MySQL for mais antiga do que 4.0, substitua safe_mysqld por mysqld_ a safe no comando: Se o comando falhar imediatamente com mysqld daemon ended ento voc pode achar ala e guma informao no arquivo diretrio-dados-mysql/nome_maquina.err. A razo ca o a pode ser que voc j possua outro servidor mysqld sendo executado. Veja Seo 4.2 [Mule a ca tiple servers], Pgina 219. a Veja Seo 2.4 [Post-installation], Pgina 111. ca a
98
99
Se voc estiver usando gcc e no tem libg++ ou libstdc++ instalados voc pode dizer e a e ao configure para usar o gcc como seu compilador C++: shell> CC=gcc CXX=gcc ./configure Quando voc usar como seu compilador C++, ele no tentar ligar com o libg++ ou e a a libstdc++. Isto pode ser uma boa idia para se fazer se voc tiver as bibliotecas acimas e e instaladas, j que algumas verses destas bibliotecas tem causado problemas estranhos a o para usurios do MySQL no passado. a Segue algumas conguraes de variveis de ambiente comuns, dependendo do compico a lador que voc estiver usando: e Compiler Recommended options gcc 2.7.2.1 CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" egcs 1.0.3a CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors -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 pode obter um binrio MySQL razoavelmente otimizado e a usando as opes acima e adicionar as seguintes opes para a linha de congurao: co co ca --prefix=/usr/local/mysql --enable-assembler \ --with-mysqld-ldflags=-all-static A linha completa de congurao dever ser, em outras palavras, algo como o seguinte ca a para todas as verses recentes do gcc: o CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro \ -felide-constructors -fno-exceptions -fno-rtti" ./configure \ --prefix=/usr/local/mysql --enable-assembler \ --with-mysqld-ldflags=-all-static Os binrios que fornecemos no site Web MySQL em http://www.mysql.com so toa a dos compilados com otimizao plena e deve ser perfeito para a maioria dos usurios. ca a Veja Seo 2.2.8 [Binrios do MySQL], Pgina 86. Existem algumas denies de ca a a co congurao que voc pode alterar para criar um binrio ainda mais rpido, mas ca e a a isto somente para usurios avanados. Veja Seo 5.5.3 [Compile and link options], e a c ca Pgina 456. a Se a construo falhar e produzir erros sobre seu compilador ou linkeditor no ca a estarem aptos para criarem a biblioteca compartilhada libmysqlclient.so.r# (r# um nmero de verso), voc pode evitar este problema fornecendo a opo e u a e ca --disable-share para o configure. Neste caso, configure no construir uma a a biblioteca libmysqlclient.so.* compartilhada. Voc pode congurar o MySQL para no usar valores de campos DEFAULT para campos e a no-NULL (isto , campos que no podem ser NULL). Veja Seo 1.8.5.2 [Restries NOT a e a ca co NULL], Pgina 53. a shell> CXXFLAGS=-DDONT_USE_DEFAULT_FIELDS ./configure Por padro, o MySQL usa o conjunto de caracteres ISO-8859-1 (Latin1). Para alterar a o conjunto padro, use a opo --with-charset: a ca
100
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 Seo 4.7.1 [Conjunto de carca acteres], Pgina 325. a Se voc desja converter os caracteres entre o servidor e o cliente, voc deve dar uma e e olhada no comando SET OPTION CHARACTER SET. Veja Seo 5.5.6 [SET OPTION], ca Pgina 460. a Cuidado: Se voc alterar o conjunto de caracteres depois de ter criado qualquer e tabela, voc deve executar myisamchk -r -q --set-character--set=charset em e cada tabela. Seus indices podem ser ordenados incorretamente. (Isto pode acontecer se voc instalar o MySQL, criar algumas tabelas, depois recongurar o MySQL para e usar um conjunto diferente de caracteres e reinstal-lo). a Com a opo --with-extra-charset=LISTA voc pode denir qual conjunto de carca e acteres adicionais deve ser compilado no servidor. Aqui LISTA uma lista de conjuntos de caracteres separados por espaos, complex e c para incluir todos caracteres que no podem ser carregados dinamicamente ou all a para incluir todos os conjuntos nos binrios. a Para congurar o MySQL com cdigo para depurao, use a opo --with-debug: o ca ca shell> ./configure --with-debug Isto inclui uma alocao segura de memria que pode encontrar alguns erros e ca o fornecer sa sobre o que est acontecendo. Veja Seo E.1 [Depurando o servidor], ida a ca Pgina 1079. a Se seus programas clientes usam threads, voc precisar tambm compilar uma verso e a e a thread-safe da biblioteca cliente do MySQL com as opes do congure --enableco thread-safe-client. Isto ir criar uma biblioteca libmysqlclient_r com o qual a voc dever ligar suas aplicaes que fazem uso de threads. Veja Seo 12.1.14 [Clientes e a co ca em threads], Pgina 863. a Opes que pertenam a sistemas particulares podem ser encontrados na seo com co c ca detalhes espec icos de sistemas neste manual. Veja Seo 2.6 [Notas espec ca icas do Sistema Operacional], Pgina 133. a
101
Para clonar o ramo 3.23 (antigo), use este comando: shell> bk clone bk://mysql.bkbits.net/mysql-3.23 mysql-3.23 Para clonar o ramo 4.0 (estvel/produo), use este comando: a ca shell> bk clone bk://mysql.bkbits.net/mysql-4.0 mysql-4.0 Para clonar o ramo 4.1 alfa, use este comando: shell> bk clone bk://mysql.bkbits.net/mysql-4.1 mysql-4.1 Para clonar o ramo de desenvolvimento 5.0, use este comando: shell> bk clone bk://mysql.bkbits.net/mysql-5.0 mysql-5.0 Nos exemplos anteriores a rvore binria ser congurada no subdiretrio a a a o mysql-3.23/, mysql-4.0/, mysql-4.1/, ou mysql-5.0/ do diretrio atual. o Se voc est atrs de um rewall e s pode iniciar conexes HTTP, voc tambm pode e a a o o e e o BitKeeper via HTTP. Se vocE precisa usar um servidor proxy, simplesmente congure a varivel de ambiente a http_proxy para apontar para o seu proxy: shell> export http_proxy="http://seu.servidor.proxy:8080/" Agora, simplesmente substitua o bk:// com o http:// ao fazer um clone. Exemplo: shell> bk clone http://mysql.bkbits.net/mysql-4.1 mysql-4.1 O download inicial da rvore fonte pode demorar um pouco, dependendo da velocidade a de sua conexo; seja paciente. a 4. Voc precisar do GNU make, autoconf 2.53 (ou posterior), automake 1.5, e a libtool 1.4 e m4 para executar o prximo conjunto de comandos. Embora muitos o sistemas operacionais j venham com suas prprias implementaes do make, as a o co chances de que a sua compilao falhe com mensagens de erros estranhas so altas. ca a Consequentemente altamente recomendado usar o GNU make (algumas vezes e tambm chamado gmake). e Felizmente, um grande nmero de sistemas operacionais j vem com a ferramente GNU u a pr instalada ou so fornecidos pacotes de instalao da mesma. De qualquer forma, e a ca elas podem ser encontradas nos seguintes locais: http://www.gnu.org/software/autoconf/ http://www.gnu.org/software/automake/ http://www.gnu.org/software/libtool/ http://www.gnu.org/software/make/ Se voc estiver tentando congurar o MySQL 4.1 voc tambm precisar do bison e e e a 1.75. Verses mais antigas do bison podem exiobir este erro: sql_yacc.yy:#####: o fatal error: maximum table size (32767) exceeded. Nota: o tamanho mximo da a tabela no realmente excedido, o erro causado por um bug nas verses mais novas a e e o do bison. Verses do MySQL anteriores a 4.1 podem tambm compilar com outras impleo e mentaes yacc (e.g. BSD yacc 91.7.30). Para verses posteriores, GNU bison uma co o e exigncia. e O comando comum para fazer em uma shell : e
102
5.
6. 7.
8. 9.
10. 11.
cd mysql-4.0 bk -r edit aclocal; autoheader; autoconf; automake (cd innobase; aclocal; autoheader; autoconf; automake) # for InnoDB (cd bdb/dist; sh s_all ) # for Berkeley DB ./configure # Adicione suas op~es favoritas aqui co make Caso apaream alguns erros estranhos durantes este estgio, conra se voc realmente c a e tem a libtool instalada! Uma coleo de nossos scripts de congurao padres est localizada no subdiretrio ca ca o a o BUILD/. Se preferir, voc pode usar BUILD/compile-pentium-debug. Para compilar e em uma arquitetura diferente, modique o script removendo opes que so espec co a icas da arquitetura Pentium. Quando a construo estiver pronta, execute make install. Seja cuidadoso com isto ca em uma mquina de produo; o comando pode sobrescrever sua verso atual instaa ca a lada. Se voc tem outra instalao do MySQL, ns recomendamos que voc execute e ca o e ./configure com valores diferentes para as opes prefix, tcp-port e unix-socketco path que as usadas pelo seu servidor em produo. ca Seja rigido com sua nova instalao e tente fazer com que os novos recursos falhem. ca Inicie executando make test. Veja Seo 14.1.2 [MySQL test suite], Pgina 896. ca a Se voc chegar ao estgio make e a distribuio no compilar, por favor relate-o para e a ca a [email protected]. Se voc instalou as ultimas verses das ferramentas GNU e o exigidas, e elas falharam tentando processar nossos arquivos de congurao, por faca vor informe isto tambm. Entretanto, se voc executar aclocal e obtm um erro de e e e command not found no o reporte.Tenha certeza que todas as ferramentas necessrias a a estejam instaladas e que sua varivel PATH esteja corretamente congurada para que a sua shell possa encontr-la. a Depois da operao inicial bk clone para obter a rvore fonte, voc deve executar bk ca a e pull periodicamente para obter as atualizaes. co Voc pode examinar o histrico de alteraes para a rvore com todos os dis usando bk e o co a sccstool. Se voc ver alguns dis estranhos ou cdigo sobre o qual voc tenha alguma e o e dvida, no hesite em enviar um e-mail para lista de email internals do MySQL. Veja u a Seo 1.7.1.1 [Mailing-list], Pgina 33. Alm disso, se voc acha que tem uma idia ca a e e e melhor em como fazer algo, envie um email para o mesmo endereo com um patch. bk c diffs ir produzir um patch para voc aps fazer as alteraes no cdigo fonte. Se a e o co o voc no tiver tempo para codicar sua idia, apenas envie uma descrio. e a e ca BitKeeper tem um timo utilitrio de ajudar que voc pode acessar via bk helptool. o a e Note que qualquer commit (bk ci ou bk citool) ir disparar o envio da mensagem com a as alteraes para nossa lista de email internos, bem como a submisso openlogging.org co a usual apenas com os comentrios da alterao. Geralmente voc no precisar usar a ca e a commit (j que o rvore pblica no permitir bk push), mas prefer usar o mtodo a a u a a e ivel e bk diffs descrito arteriormente.
Voc tambm pode procurar alteraes, comentrios e cdigo fonte online procurando por e e co a o ex. http://mysql.bkbits.net:8080/mysql-4.1 para MySQL 4.1. O manual est em uma rvore separad que pode ser clonada com: a a
103
shell> bk clone bk://mysql.bkbits.net/mysqldoc mysqldoc Existe tambm um rvore pblica do BitKeeper para o MySQL Control Center e Connece a u tor/ODBC. Eles podem ser clonados da seguintes forma, respectivamente: Para clonar o MySQL Control center, use o seguinte comando: 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
shell> ./configure --with-low-memory Esta opo adiciona -fno-inline na a linha de compilao se voc estiver usando ca ca e gcc e -O0 se voc estiver usando outro programa. Voc deve tentar a opo --withe e ca low-memory mesmo se voc tiver muita memria e espao de swap que voc ache ser e o c e sucieente para no ocorrer erros. Este problema tem ocorrido mesmo em sistemas a com boas conguraes de hardware e a opo --with-low-memory geralmente corrige co ca isto. Por padro, configure escolhe c++ como o nome do compilador e GNU c++ liga com a lg++. Se voc estiver usando gcc, este comportamento pode causar problemas durante e a compilao, como o seguinte: ca configure: error: installation or configuration problem: C++ compiler cannot create executables. Voc podem tambm ter problemas durante a compilao relacionados ` g++, libg++ e e ca a ou libstdc++. Uma causa destes problemas que voc pode no ter g++ ou voc pode ter g++ mas no e e a e a ter o libg++ ou o libstdc++. De uma olhada no arquivo config.log. Ele deve conter a razo exata do porque seu compilador C++ no funciona! Para trabalhar evitando a a estes problemas, voc pode usar gcc como seu compilador C++. Tente congurar a e varivel de ambiente CXX para "gcc -O3". Por exemplo: a shell> CXX="gcc -O3" ./configure Isto funciona porque gcc compila cdigo fonte C++ to bem quanto g++ faz, mas no o a a ifaz a ligao em libg++ ou libstdc++ por padro. ca a Outra forma de corrigir estes problemas, com certeza, instalando g++, libg++ e e libstdc++. No entanto gostariamos de lhe recomendar a no usar libg++ ou a libstdc++ com o MySQL j que isto ir aumentar o tamanho do binrio do mysqld a a a sem lhe trazer nenhum benef icio. Algumas verses destas bibliotecas tambm tem o e causado problemas estranhos para os usurios MySQL no passado. a Usar gcc como compilador C++ tambm exigido, se voc quiser compilar o MySQL e e e com a funcionalidade RAID (veja Seo 6.5.3 [CREATE TABLE], Pgina 598 para ca a mais informaes sobre tipos de tabela RAID) e voc estiver usando o GNU gcc verso co e a 3 e acima. Se voc obter erros como estes abaixo durante o estgio de ligao quando e a ca voc congurar o MySQL para compilar com a opo --with-raid, tente usar o gcc e ca como o seu compilador C++ denindo a varivel de ambiente CXX mencionada acima: a gcc -O3 -DDBUG_OFF -rdynamic -o isamchk isamchk.o sort.o libnisam.a ../mysys/libmysys.a ../dbug/libdbug.a ../strings/libmystrings.a -lpthread -lz -lcrypt -lnsl -lm -lpthread ../mysys/libmysys.a(raid.o)(.text+0x79): In function my_raid_create: : undefined reference to operator new(unsigned) ../mysys/libmysys.a(raid.o)(.text+0xdd): In function my_raid_create: : undefined reference to operator delete(void*) ../mysys/libmysys.a(raid.o)(.text+0x129): In function my_raid_open: : undefined reference to operator new(unsigned) ../mysys/libmysys.a(raid.o)(.text+0x189): In function my_raid_open: : undefined reference to operator delete(void*) ../mysys/libmysys.a(raid.o)(.text+0x64b): In function my_raid_close:
105
: undefined reference to operator delete(void*) collect2: ld returned 1 exit status ca e Se sua compilao falhar com erros, como um dos seguintes, voc deve atualizar sua verso de make para GNU make: a making all in mit-pthreads 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 so conhecidos por terem alguns problemas com o make. a O GNU make verso 3.75 ir funcionar. a a Se voc deseja denir algumas opes que devem ser usadas pelo seu compilador C ou e co C++, adicione as opes para as variveis de ambiente CFLAGS e CXXFLAGS. Voc pode co a e tambm especicar os nomes do compilador a ser usado da mesma forma utilizando CC e e CXX. Exemplo: shell> shell> shell> shell> shell> CC=gcc CFLAGS=-O3 CXX=gcc CXXFLAGS=-O3 export CC CFLAGS CXX CXXFLAGS
Olhe em Seo 2.2.8 [MySQL binaries], Pgina 86 para uma lista de denio de opes ca a ca co que tenham sido uteis em vrios sistemas. a Se voc recebeu uma mensagem de erro como esta, necessrio atualizar o compilador e e a gcc: O gcc 2.8.1 funciona, mas recomendamos o uso do gcc 2.95.2 ou egcs 1.0.3a em seu lugar. Se voc obtem erros como estes vistos abaixo enquanto estiver compilando o mysqld, e o configure no detectou corretamente o tipo do ultimo argumento para accept(), a getsockname() ou getpeername(): cxx: Error: mysqld.cc, line 645: In this statement, the referenced type of the pointer value "&length" is "unsigned long", which is not compatible with "int". new_sock = accept(sock, (struct sockaddr *)&cAddr, &length); Para corrigir isto, edite o arquivo config.h (que gerado pelo configure). Procure e por estas linhas: /* Define as the base type of the last arg to accept */ #define SOCKET_SIZE_TYPE XXX Altere XXX para size_t ou int, dependendo de seu sistema operacional. (Perceba que voc dever fazer isto cada vez que voc executar configure, porque configure e a e regenera config.h.)
106
O arquivo sql_yacc.cc gerado pelo sql_yacc.yy. Normalmente o processo de e construo no necessita criar sql_yacc.cc, porque o MySQL j vem com uma cpia ca a a o pr-gerada. Entretanto, se voc necessita recri-lo voc pode encontrar este erro: e e a e "sql_yacc.yy", line xxx fatal: default action causes potential... Isto um ind de que sua verso do yacc deciente. Provavelmente voc precisar e icio a e e a instalar o bison (a verso GNU de yacc) e us-lo no lugar do yacc. a a Se voc necessita depurar mysqld ou um cliente MySQL, execute configure com a e opo --with-debug, ento recompile e ligue seus clientes com a nova biblioteca cliente. ca a Veja Seo E.2 [Debugging client], Pgina 1085. ca a Se voc tem um erro de compilao no Linux (ex. SuSE Linux 8.1 ou Red Hat Linux e ca 7.3) parecido com o seguinte: libmysql.c:1329: warning: passing arg 5 of gethostbyname_r from incompatible p libmysql.c:1329: too few arguments to function gethostbyname_r libmysql.c:1329: warning: assignment makes pointer from integer without a cast make[2]: *** [libmysql.lo] Error 1 Por padro, o script configure tenta determinar o nmero correto de argumentos a u usando o compilador GNU C++ g++. Ele testa os resultados errados permitidos, se o g++ no est instalado. Existem dois modos de contornar este problema: a a Certique-se de que o GNU C++ g++ est instalado. Em algumas distribuies a co Linux, o pacote exigido chamado gpp, em outro ele chamado gcc-c++. e e Use o gcc como o seu compilador C++ congurando a variavel de ambiente CXX a para gcc: export CXX="gcc" Note que voc precisa executar o configure novamente aps isto. e o
107
As vericaes que determinam se MIT-pthreads ser usado ou no, ocorrer somente co a a a durante a parte do processo de congurao que trata com o cdigo do servidor. Se voc ca o e congurou a distribuio usando --without-server para construir somente o cdigo ca o cliente, clientes no iro saber se o MIT-pthreads est sendo usado e ir usar conexes a a a a o socket Unix por padro. Como os sockets Unix no funcionam sob MIT-pthreads, isto a a signica que voc precisar usar -h ou --host quando executar programas clientes. e a Quando o MySQL compilado usando MIT-pthreads, travas de sistema so desabile a itadas por padro por razes de performance. Voc pode dizer ao servidor para usar a o e travas de sistema com a opo --external-locking. Isto s necessrio se voc ca o e a e quiser executar dois servidores MySQL no mesmo diretrio de dados (no que no o a e recomendado) Algumas vezes o comando pthread bind() falha ao ligar a um socket sem nenhuma mensagem de erro (pelo menos no Solaris). O resultado que todas conexes ao servidor e o falham. Por exemplo: shell> mysqladmin version mysqladmin: connect to server at failed; error: Cant connect to mysql server on localhost (146) A soluo para isto matar o servidor mysqld e reinici-lo. Isto s aconteceu conosco ca e a o quando foramos uma queda do servidor e zemos uma reinicializao imediata. c ca Com MIT-pthreads, a chamada de sistema sleep() no interromp com SIGINT a e ivel (break). Isto s percebido quando voc executa mysqladmin --sleep. Voc deve esoe e e perar pela chamada sleep() para terminar, antes da interruo ser servida e o processo ca parar. Na ligao, voc pode receber mensagens de alerta como estes (pelo menos no Solaris); ca e elas podem ser ignoradas: ld: warning: symbol _iob has differing sizes: (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4; file /usr/lib/libc.so value=0x140); /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken ld: warning: symbol __iob has differing sizes: (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4; file /usr/lib/libc.so value=0x140); /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken Alguns outros alertas tambm podem ser ignorados: e implicit declaration of function int strtoll(...) implicit declaration of function int strtoul(...) No colocamos readline para funcionar com MIT-pthreads. (Isto no necessrio, a a e a mas pode ser interessante para alguns.)
108
Nota: As instrues neste documento esto restritas aos usurios que queiram testar o co a a MySQL no Windows a partir da ultima distribuio fonte ou da rvore do BitKeeper. ca a Para uso em produo, a MySQL AB no aconselha que voc utilize um servidor MySQL ca a e constru por voc mesmo a partir de um fonte. Normalmente melhor usar uma disido e e especicamente para desemtribuio binria precompilada do MySQL que construida ca a e penho otimizado no Windows pela MySQL AB. Instrues para instalar uma distribuio co ca binria est dispon em Seo 2.1.1 [Windows installation], Pgina 60. a a ivel ca a Para construir o MySQL no Windows a partir do fonte, voc precisa dos seguintes compie ladores e recursos dison iveis em seu sistema Windows: Compilador VC++ 6.0 (atualizado com o SP 4 ou 5 e pacote Pre-processador) O pacote Pre-processador necessrio para a macro assembler. Mais detalhes em: e a http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp5/faq.aspx. Aproximadamente 45 MB de espao em disco. c 64 MB de RAM Voc tambm precisar de um distribuio fonte para o Windows. Existem dois modos de e e a ca conseguir uma distribuio fonte do MySQL verso 4.1 e acima: ca a 1. Obtenha um pacote de uma distribuio fonte pela MySQL AB para a verso do ca a MySQL que voc est particularmente interessado. Distribuies fontes empacotadas e a co esto dispon a iveis para verses distribu o idas do MySQ e podem ser obtidas em http://www.mysql.com/downloads/. 2. Voc pode empacotar um distribuio fonte voc mesmo a partir da ultima rvore fonte e ca e a de desenvolvimento do BitKeeper. Se voc planeja fazer isto, voc deve criar o pacote e e em um sistema Unix e ento transfr para seu sistema Windows. (A razo para isto a i-lo a e que alguns dos passos de congurao e construo exigem ferramentas que funcionam ca ca apenas no Unix.) A abordagem do BitKeeper, exige: Um sistema executando Unix ou um sistema tipo Unix, como o Linux BitKeeper 3.0 instalado neste sistema. Voc pode obter o BitKeeper em e http://www.bitkeeper.com/. Se voc estiver usando uma distribuio fonte do Windows, voc pode ir diretamente para e ca e Seo 2.3.7.1 [Windows VC++ Build], Pgina 108. Para contruir a partir da rvore do ca a a BitKeeper, v para Seo 2.3.7.2 [Windows BitKeeper Build], Pgina 110. a ca a Se voc encontrar alguma coisa que no est funcionando como esperado, ou tiver sugestes e a a o sobre o mode de melhorar o processo de construo atual no Windows, envie uma mensagem ca para a lista de email win32. Veja Seo 1.7.1.1 [Mailing-list], Pgina 33. ca a
109
3. Inicie o compilador VC++ 6.0. 4. No menu File, selecione Open Workspace. 5. Abra o workspace mysql.dsw que voc encontrar no diretrio de trabalho. e o 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 construo da depurao do servidor, bibliotecas e alguns ca ca aplicativos clientes. 9. Compile as verses distribu o idas que voc desejar, do mesmo modo. e 10. Verses depuradas dos programas e bibliotecas so colocados nos diretrios o a o client_debug e lib_debug. Verses liberadas dos programas e bibliotecas so o a colocados nos diretrios client_release e lib_release. Note que se voc quiser o e construir tanto verses liberadas quanto depuradas voc pode selecionar a opo o e ca build all do menu Build. 11. Teste o servidor. O servidor constru usando as instrues anteriores ir esperar que ido co a o diretrio base e de dados do MySQL seja C:\mysql e C:\mysql\data por padro. o a Se voc quiser testar o seu servidor usando o diretrio raiz de uma rvore fonte e seu e o a diretrio de dados como o diretrio base e o diretrio de dados, voc precisar dizer ao o o o e a servidor os seus caminhos. Voc tambm pode fazer into na linha de comando com as e e opes --basedir e --datadir, ou colocar opes apropriadas no arquivo de opes (o co co co arquivo C:\my.cnf ou my.ini no diretrio do Windows). Se voc tiver um diretrio o e o de dados existente em qualquer lugar que voc queira usar, voc pode especic-lo no e e a se caminho. 12. Inicie o ser servidor a partir do diretrio client_release ou client_debug, depeno dendo de qual servidor voc queira usar. O instrues gerais de inicializao do servidor e co a esto em Seo 2.1.1 [Windows installation], Pgina 60. Voc precisar adaptar as a ca a e a instrues de forma apropriada se voc quiser usar um diretrio base ou diretrio de co e o o dados diferente. 13. Quando o servidor est em execuo de modo independente ou como um servio daseado a ca c em sua congurao, tente se conectar a ele pelo utilitrio interativo mysql de linha de ca a comando que existe em seu diretrio client_release ou client_debug. o Quando voc estiver certo de que os programas que voc construiu esto funcionando core e a retamente, pare o servidor. Ento instale o MySQL da seguinte forma: a 1. Crie o diretrio para instalar os arquivos do MySQL. Por exemplo, para instalar dentro o de C:\mysql), use estes comandos: C: mkdir mkdir mkdir mkdir mkdir \mysql \mysql\bin \mysql\data \mysql\share \mysql\scripts
Se voc quiser compilar outros clientes e lig-los ao MySQL, voc tambm deve criar e a e e diversos diretrios adicionais: o mkdir \mysql\include
110
mkdir \mysql\lib mkdir \mysql\lib\debug mkdir \mysql\lib\opt Se voc quiser fazer um benchamrk do MySQL, crie este diretrio: e o mkdir \mysql\sql-bench Benchmark exigem suporte Perl. 2. Copie do diretrio workdir para o diretrio c:\mysql os seguintes diretrios: o o o 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 quiser compilar outros clientes e lig-los ao MySQL, voc tambm deve fazer e a e e 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 quiser fazer um benchmark do MySQL, voc tambm deve fazer isto: e e e xcopy sql-bench\*.* C:\mysql\bench /E Congure e inicie o servidor da mesma forma que a distribuio binria do Windows. Veja ca a Seo 2.1.1.3 [Windows prepare environment], Pgina 62. ca a
111
shell> ./scripts/make_win_src_distribution Este script cria um pacote fonte Windows. para ser usado em seu sistema Windows. Voc pode fornecer diferentes opes para o script baseado em suas necessidades. Ele e co aceita as seguintes opes: co --debug --tmp --suffix --dirname --silent --tar --help Depura, sem criar o pacote Especifica a localiza~o temporria ca a Nome de sufixo para o pacote Nome do diretrio onde os arquivos s~o copiados (intermediario) o a N~o apresenta uma lista dos arquivos processados a Cria um pacote tar.gz em vez de .zip Mostra esta mensagem de ajuda
Por padro, make_win_src_distribution cria um arquivo zipado com o nome a mysql-VERSION-win-src.zip, onde VERSION representa a verso de sua rvore fonte a a do MySQL. 4. Faa uma copia ou upload para a sua mquina o pacote fonte Windows que voc tiver c a e criado. Para compil-lo use as instrues em Seo 2.3.7.1 [Windows VC++ Build], a co ca Pgina 108. a
112
/usr/local/mysql). Para uma distrubuio fonte, este o diretrio principal da sua ca e o rvore fonte do MySQL. a Nos comandos mostrados abaixo nesta seo e nas seguintes subsees, BINDIR o caminho ca co e para a localizao na qual os programas como mysqladmin e mysqld_safe esto instalados. ca a Para uma distribuio binria este o diretrio bin. Para uma distribuio fonte, BINDIR ca a e o ca provavelmente /usr/local/bin, a menos que voc especique um diretrio de instalao e e o ca diferente de /usr/local quando voc executa configure. EXECDIR a localizao na qual e e ca o servidor mysqld est instalado. Para uma distribuio binria, isto o mesmo que BINDIR. a ca a e Para uma distribuio fonte, EXECDIR provavelmente /usr/local/libexec. ca e Os testes so descritos em detalhes abaixo: a 1. Se necessrio, inicie o servidor mysqld e congure as tabelas de concesses iniciais a o contendo os privilgios que determinam como os usurios esto permitidos a conectar e a a ao servidor. Isto feito normalmente com o script mysql_install_db: e shell> scripts/mysql_install_db Normalmente, mysql_install_db precisa ser executado somente na primeira vez que voc instala o MySQL. Portanto, se voc estiver atualizando uma instalao existente, e e ca voc pode pular este passo. (entretanto, mysql_install_db realmente seguro de usar e e e no ir atualizar nenhuma tabela que j exista, ento se voc no tem certeza do que a a a a e a fazer, voc pode sempre executar mysql_install_db.) e mysql_install_db cria seis tabelas (user, db, host, tables_priv, columns_priv e func) no banco de dados mysql. Uma descrio dos privilgios iniciais fornecido ca e e em Seo 4.4.4 [Default privileges], Pgina 260. De forma resumidao, estes privilgios ca a e permitem que o usurio root faa qualquer coisa no MySQL, e permitem a qualquer a c um a criar ou usar bancos de dados com o nome de test ou iniciando com test_ . Se voc no congurar as tabelas de concesses, o seguinte erro ir aparecer no arquivo e a o a log quando voc no iniciar o servidor: e a mysqld: Cant find file: host.frm O erro acima pode tambm ocorrer com uma distribuio binria do MySQL se voc e ca a e no iniciar o MySQL executando o ./bin/mysqld_safe! Veja Seo 4.8.2 [mysqld_ a ca safe], Pgina 331. a Voc deve precisar executar mysql_install_db como root. Entretanto, se voc e e preferir, pode executar o servidor MySQL como um usurio (no-root) sem a a privilgios, desde que o usurio possa ler e escrever arquivos no diretrio de banco e a o de dados. Instrues para executar o MySQL como um usurio sem privilgios co a e e detalhado em Seo A.3.2 [Alterando usurios MySQL], Pgina 923 ca a a Se voc tiver problemas com o mysql_install_db, veja Seo 2.4.1 [mysql_install_ e ca db], Pgina 115. a Existem algumas alternativas para executar o script mysql_install_db como ele e fornecido na distribuio MySQL: ca Voc pode querer editar o mysql_install_db antes de execut-lo, para alterar os e a privilgios iniciais que so instalados nas tabelas de concesses. Isto util se voc e a o e e deseja instalar o MySQL em vrias mquinas com os mesmos privilgios. Neste a a e caso, provvel que voc s precise adicionar algumas instrues INSERT extras e a e o co para as tabelas mysql.user e mysql.db.
113
Se voc deseja alterar o contedo da tabelas de concesses depois de instale u o a las, voc pode executar mysql_install_db, ento usar mysql -u root mysql para e a conectar `s tabelas de concesses como o usurio root e usar instrues SQL para a o a co modic-las diretamente. a E poss recriar as tabelas de permisses completamente depois delas j terem ivel o a sido criadas. Voc pode querer fazer isto se voc j instalou as tabelas mas deseja e e a recri-las depois das edies mysql_install_db. a co Para maiores informaes sobre estas alternativas, veja Seo 4.4.4 [Default privileges], co ca Pgina 260. a 2. Inicie o servidor MySQL assim: shell> cd diretorio_instalacao_mysql shell> bin/mysqld_safe & Se a sua verso do MySQL for mais antiga do que 4.0, substitua bin/safe_mysqld por a bin/mysqld_safe no comando: Se voc tiver problemas iniciando o servidor, veja Seo 2.4.2 [Starting server], e ca Pgina 116. a 3. Use mysqladmin para vericar se o servidor est em execuo. Os seguintes comana ca dos fornecem um teste simples para conferir se o servidor est em funcionamento e a respondendo `s conexes: a o shell> BINDIR/mysqladmin version shell> BINDIR/mysqladmin variables de mysqladmin version varia muito pouco dependendo de sua plataforma e A saida verso do MySQL, mas deve ser similar a esta mostrada abaixo: a shell> BINDIR/mysqladmin version mysqladmin Ver 8.14 Distrib 3.23.32, for linux on i586 Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license. Server version 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 idia do que voc pode fazer com BINDIR/mysqladmin, invoque-o com a e e opo --help. ca 4. Verique se voc pode desligar o servidor: e shell> BINDIR/mysqladmin -u root shutdown
114
5. Verique que voc possa reiniciar o servidor. e chamado o mysqld diretamente. Por exemplo: shell> BINDIR/mysqld_safe --log &
Se o mysqld_safe falhar, tente execut-lo do diretrio de instalao do MySQL (se a o ca voc j no estiver l). Se no funcionar, veja Seo 2.4.2 [Starting server], Pgina 116. e a a a a ca a 6. Execute alguns testes bsicos para vericar se o servidor est funcionando. A sa a a ida deve ser similar ao mostrado abaixo: shell> BINDIR/mysqlshow +-----------+ | Databases | +-----------+ | mysql | +-----------+ shell> BINDIR/mysqlshow mysql Database: mysql +--------------+ | Tables | +--------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +--------------+ shell> BINDIR/mysql -e "SELECT host,db,user FROM db" mysql +------+--------+------+ | host | db | user | +------+--------+------+ | % | test | | | % | test_% | | +------+--------+------+ Tambm existe uma suite de benchmark no diretrio sql-bench (sob o diretrio de e o o instalao do MySQL) que voc pode usar para comparar como o MySQL se comporta ca e em diferentes plataformas. O diretrio sql-bench/Results contm os resultados de o e vrias execues em diferentes bancos de dados e plataformas. Os seguintes mdulos a co o Perl adicionais so necessrios para executar o pacote de benchamrk: a a DBI DBD-mysql Data-Dumper Data-ShowTable Estes mdulos podem ser obtidos em CPAN http://www.cpan.org/. Veja Seo 2.7.1 o ca [Instalao Perl], Pgina 164. ca a
115
O diretrio sql-bench/Results contm os resultados de vrias execues em difero e a co entes bancos de dados e plataformas. Para executar todos testes, execute estes comandos: shell> cd sql-bench shell> run-all-tests Se voc no possui o diretrio sql-bench, voc provavelmente est usando uma dise a o e a tribuio binria RPM. (Distribuies fontes RPMs incluem o diretrio com os benchca a co o marks.) Neste caso, voc deve primeiramente instalar a suite de benchmark antes e de poder us-lo. A partir da verso 3.22 do MySQL, comearam a existir arquivos a a c RPMs de benchmark chamados mysql-bench-VERSION-i386.rpm que contm cdigo e o ie dados de benchmark. Se voc tem uma distribuio fonte, voc tambm pode executar os testes no subdie ca e e retrio tests. Por exemplo, para executar auto_increment.tst, faa isto: o c shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst Os resultados esperados so mostrados no arquivo ./tests/auto_imcrement.res. a
116
Isto pode acontecer quando voc j tiver uma instalao do MySQL existente, e a ca mas deseja colocar uma nova instalao em um diferente lugar (por exemplo, ca para testes, ou talvez voc simplesmente deseja executar duas instalaes ao e co mesmo tempo). Geralmente o problema que ocorre quando voc tenta executar e o segundo servidor que ele tenta usar o mesmo socket e porta que o outro. e Neste caso voc ir obter a mensagem de erro: Cant start server: Bind e a on TCP/IP port: Address already in use ou Cant start server: Bind on unix socket.... Veja Seo 4.2 [Mltiplos servidores], Pgina 219. ca u a Voc no tem direito de escrita no diretrio /tmp e a o Se voc no tem direito de escrita para criar um arquivo socket no local padro e a a (em /tmp) ou permisso para criar arquivos temporris em /tmp, voc ir a a e a obter um erro quando executar mysql_install_db ou quando iniciar ou usar mysqld. Voc pode especicar socket e diretrio temporrio diferentes, como segue: e o a shell> TMPDIR=/algum_dir_tmp/ shell> MYSQL_UNIX_PORT=/algum_dir_tmp/mysqld.sock shell> export TMPDIR MYSQL_UNIX_PORT Veja Seo A.4.5 [Problems with mysql.sock], Pgina 929. ca a algum_dir_tmp deve ser o caminho para o mesmo diretrio no qual voc tem o e permisso de escrita. Veja Apndice F [Environment variables], Pgina 1092. a e a Depois disto voc deve estar apto para executar mysql_install_db e iniciar o e servidor com estes comandos: shell> scripts/mysql_install_db shell> BINDIR/mysqld_safe & mysqld falha imediatamente Se voc estiver executando RedHat Verso 5.0 com uma verso de glibc ane a a terior a 2.0.7-5 voc deve ter certeza que voc instalou todos os patches para e e a glibc! Existe muita informao sobre isto nos arquivos das listas de menca sagens do MySQL. Links para os arquivos de correio esto dispon a iveis online em http://lists.mysql.com/. Veja tambm Seo 2.6.2 [Linux], Pgina 137. e ca a Voc pode tambm iniciar o mysqld manualmente usando a opo --skipe e ca grant-tables e adicionar a informaao de privilgios usando o mysql: c e shell> BINDIR/mysqld_safe --skip-grant-tables & shell> BINDIR/mysql -u root mysql Do mysql, execute manualmente os comandos SQL em mysql_install_db. Tenha certeza de executar mysqladmin flush_privileges ou mysqladmin reload aps dizer ao servidor para recarregar as tabelas de permisses. o o
117
Invocando mysql.server. Este script usado primariamente na inicializao e nale ca izao do sistema, e descrito de forma mais completa em Seo 2.4.3 [Automatic ca e ca start], Pgina 118. a Invocando mysqld_safe, que tenta determinar as opes apropriadas para mysqld e co ento execut-lo com estas opes. Veja Seo 4.8.2 [mysqld_safe], Pgina 331. a a co ca a Para o Windows NT/2000/XP, veja Seo 2.1.1.7 [NT start], Pgina 66. ca a Invocando o mysqld diretamente. Quando o daemon mysqld inicia, ele altera o diretrio para o diretrio de dados. E neste o o diretrio que ele espera gravar arquivos de log e o arquivo pid (com o ID do processo) e o onde ele espera encontrar os bancos de dados. A localizao do diretrio de dados especicada quando a distribuio compilada. Enca o e ca e tretanto, se o mysqld espera encontrar o diretrio de dados em lugar diferente de onde ele o realmente est no seu sistema, ele no funcionar corretamente. Se voc tiver problemas a a a e com caminhos incorretos voc pode encontrar quais opes o mysqld permite e quais so e co a as conguraes do caminho padro chamando o mysqld com a opo --help. Voc pode co a ca e sobrescrever os padres especicando os caminhos corretos como argumentos de linha de o comando ao mysqld. (Estas opes tambm podem ser usadas com o mysqld_safe). co e Normalmente voc precisaria indicar ao mysqld somente o diretrio base sob o qual o e o MySQL instalado. Voc pode fazer isso usando a opo --basedir. Voc pode tambm e e ca e e usar --help para conferir o efeito das opees para se alterar o caminho (perceba que co --help deve ser a opo nal do comando mysqld. Por exemplo: ca shell> EXECDIR/mysqld --basedir=/usr/local --help Uma vez que voc determina as conguraes de caminho que voc deseja, inicie o servidor e co e sem a opo --help. ca Qualquer que tenha sido o mtodo utilizado para iniciar o servidor, se houver falha e na inicializao, conra o arquivo de log para ver se voc pode entender o porqu. ca e e Arquivos log esto localizados no diretrio dados (normalmente /usr/local/mysql/data a o para uma distribuio binria, /usr/local/var para uma distribuio fonte, ca a ca \mysql\data\mysql.err no Windows.) Procure no diretrio de dados por arquivos com o nomes no formato nome_maquina.err e nome_maquina.log onde nome_maquina o e nome do servidor. Ento conra as ultimas linhas destes arquivos: a shell> tail nome_maquina.err shell> tail nome_maquina.log Se voc encontrar algo como o seguinte no arquivo log: e 000729 14:50:10 bdb: Recovery function for LSN 1 27595 failed 000729 14:50:10 bdb: warning: ./test/t1.db: No such file or directory 000729 14:50:10 Cant init databases Signica que voc no inicializou o mysqld com --bdb-no-recover e o Berkeley DB encone a trou algo errado com seus arquivos log quando ele tentou recuperar seus bancos de dados. Para poder continuar, voc deve mover o antigo arquivo log Berkeley DB do diretrio do e o banco de dados para outro lugar, onde poder examin-los posteriormente. Os arquivos log a a so nomeados log.0000000001, onde o nmero ir incrementar com o tempo. a u a Se voc estiver executando o mysqld com suporte a tabelas BDB e o mysqld falhar no e in icio, pode ser devido a alguns problemas com o arquivo de recuperao BDB. Neste caso ca
118
voc pode tentar iniciar o mysqld com --bdb-no-recover. Se isto ajudar, ento voc pode e a e remover todos os arquivos log.* do diretrio de dados e tentar iniciar o mysqld novamente. o Se voc obter o seguinte erro, signica que algum outro programa (ou outro servidor mysqld) e j est usando a porta TCP/IP ou socket mysqld est tentando usar: a a a 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 no tem outro servidor mysqld em execuo. Se voc e a ca e no consegue encontrar outro servidor, voc pode tentar executar o comando telnet sua_ a e maquina numero_porta_tcp-ip e apertar ENTER vrias vezes. Se voc no obter uma a e a mensagem como telnet: Unable to connect to remote host: Connection refused, algo est usando a mesma porta TCP/IP que o mysqld est tentando usar. Veja Seo 2.4.1 a a ca [mysql install db], Pgina 115 e Seo 4.2 [Multiple servers], Pgina 219. a ca a Se o mysqld est atualmente em execuo, voc pode vericar as conguraes que ele est a ca e co a usando executando este comando: shell> mysqladmin variables ou shell> mysqladmin -h your-host-name variables Se voc obter o Errcode 13, que signica Permission denied, ao iniciar o mysqld isto e signica que voc no pode ter o direito de leitura/criao de arquivos no diretrio do e a ca o banco de dados ou log. Neste caso voc tambm deve iniciar o mysqld como usurio root e e a ou alterar a permisso para os arquivos e diretrios envolvidos para uqe voc tenha o direito a o e de us-los. a Se o mysqld_safe inicia o servidor mas voc no consegue se conectar a ele, tenha certeza e a que voc tem uma entrada no arquivo /etc/hosts que parece com isto: e 127.0.0.1 localhost Este problema s ocorre em sistemas que no possuem uma biblioteca thread funcional e o a para o qual o MySQL deve estar congurado para usar MIT-pthreads. Se voc no consegue iniciar o mysqld voc pode tentar criar um arquivo para rastreae a e mento de erros (trace) para encontrar o problema. Veja Seo E.1.2 [Making trace les], ca Pgina 1080. a Se voc estiver utilizando tabelas InnoDB, procure pelas opes especicas de inicializao e co ca do InnoDB. Veja Seo 7.5.3 [InnoDB start], Pgina 644. ca a Se voc estiver usando tabelas BDB (Berkeley DB), voc deve se familiarizar com as difere e entes opes especicas de inicializao do BDB. Seo 7.6.3 [BDB start], Pgina 699. co ca ca a
119
shell> mysql.server start shell> mysql.server stop mysql.server pode ser encontrado no diretrio share/mysql sob o diretrio de instalao o o ca do MySQL ou no diretrio support-files da rvore fonte do MySQL. o a Note que se voc usa o pacote RPM do Linux (MySQL-server-VERS~O.rpm), o script e A mysql.server j estar instalada como /etc/init.d/mysql - voc no precisa instala a e a a lo manualmente. Veja Seo 2.1.2 [Linux-RPM], Pgina 69 para mais informaes sobre ca a co pacotes RPM Linux. No Mac OS X, voc pode instalar um pacote do MySQL Startup Item separado para e habilitar a inicializao automtica do MySQL no boot so sistema. Veja Seo 2.1.3 [Mac ca a ca OS X installation], Pgina 71 para maiores detalhes. a Antes do mysql.server iniciar o servidor, ele vai para o diretrio de instalao do MySQL, o ca e ento chama o mysqld_safe. Voc pode precisar editar o mysql.server se tiver uma disa e tribuio binria instalada em um local no-padro. Modique-o para chamar o diretrio ca a a a o (cd) apropriado antes de executar o safe_mysql. Se voc deseja que o servidor seja exe ecutado com um usurio espec a ico, adicione uma linha user apropriada para o arquivo /etc/my.cnf, como ser visto posteriormente nesta seo. a ca mysql.server stop desliga o servidor MySQL enviando um sinal para ele. Voc pode e desligar o servidor manualmente executando mysqladmin shutdown. Voc precisa adicionar estes comandos start e stop nos lugares apropriados de seus arquivos e /etc/rc.* quando voc quiser iniciar o MySQL automaticamente no seu servidor. e On most current Linux distributions, it is 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 inicializao normalmente deve ir no diretrio ca o /usr/local/etc/rc.d/. A pgina do manual rc(8) tambm diz que os scripts a e neste diretrio s so executados, se o seu nome de base corresponder padro global o o a a da sheel *.sh. Qualquer outro arquivo ou diretrio presente dentro do diretrio so o o a silenciosamente ignorados. Em outra palavras, no FreeBSD voc deve instalar o arquivo e mysql.server como /usr/local/etc/rc.d/mysql.server.sh para habilitar a inicializao automtica. ca a Como uma alternativa para o exposto acima, alguns sistemas operacionais tambm usam e /etc/rc.local ou /etc/init.d/boot.local para inicializar servios adicionais durante c o boot. Para iniciar o MySQL usando este mtodo, voc poderia poderia adicionar algo e e como o seguinte a ele: /bin/sh -c cd /usr/local/mysql; ./bin/mysqld_safe --user=mysql & Voc tambm pode adicionar opes para mysql.server em um arquivo global e e co /etc/my.cnf. Um tipico arquivo /etc/my.cnf pode parecer com isto: [mysqld] datadir=/usr/local/mysql/var socket=/var/tmp/mysql.sock port=3306 user=mysql
120
[mysql.server] basedir=/usr/local/mysql O script mysql.server entende as seguintes opes: datadir, basedir e pid-file. co A seguinte tabela mostra quais grupos de opes cada script de inicializao l dos arquivos co ca e de opes: co Script mysqld mysql.server mysqld_safe Grupos de opes co [mysqld], [server] e [mysqld-major-version] [mysql.server], [mysqld], e [server] [mysql.server], [mysqld], e [server]
Para compatibilidade com verses anteriores, o mysql.server tambm l o grupo [mysql_ o e e server] e mysqld_safe tambm l o grupo [safe_mysqld]. No entanto, voc deve atue e e alizar os seus arquivos de opes para usar os grupos [mysql.server] e [mysqld_safe]. co Veja Seo 4.1.2 [Arquivos de Opes], Pgina 216. ca co a
121
122
Para funes que produzem um valor DATE, DATETIME, ou TIME, o resultado retornado co para o cliente agora est corrigido para ter um tipo temporal. Por exemplo, no MySQL a 4.1, voc tem este resultado: e mysql> SELECT CAST("2001-1-1" as DATETIME); -> 2001-01-01 00:00:00 No MySQL 4.0, o resultado diferente: e mysql> SELECT CAST("2001-1-1" as DATETIME); -> 2001-01-01 Valores DEFAULT no podem mais ser especicado para colunas AUTO_INCREMENT (Na a verso 4.0, um valor DEFAULT ignorado sem aviso, na 4.1 ocorre um erro). a e LIMIT no aceita mais argumentos negativos. Use 18446744073709551615 em vez de a -1. SERIALIZE no mais uma opo vlida para sql_mode. a e ca a Deve-se usar SET TRANSACTION ISOLATION LEVEL SERIALIZABLE. SERIALIZE tambm no mais vlido e a e a para a opo --sql-mode do mysqld. Use --transaction-isolation=SERIALIZABLE ca Todas tabelas e colunas strings agora tm um conjunto de caracter. Veja Cap e ptexi tulo 9 [Charset], Pgina 710. A informao do conjunto de caracteres mostrada por a ca e SHOW CREATE TABLE e mysqldump. (O MySQL verso 4.0.6 e acima pode ler o novo a arquivo dump; verses mais antigas no podem.) o a O formato de denio de tabela usado nos arquivos .frm mudaram um pouco na ca verso 4.1. O MySQL 4.0.11 e adiante lem o novo formato .frm diretamente, mas a e verses mais antigas no podem. Se voc precisa mover tabelas da verso 4.1. para o a e a uma mais nova que a 4.0.11, voc de usar mysqldump. Veja Seo 4.9.7 [mysqldump], e ca Pgina 361. a Se voc estiver executando vrios servidores na mesma mquina Windows, voc deve e a a e usar uma opo --shared_memory_base_name diferentes para cada mquina ca a A interface para agrupar funes UDF alterou um pouco. Voc deve agora declarar co e uma funo xxx_clear() para cada funo de agrupamento. ca ca Em geral, atualizar para o MySQL 4.1 a partir de uma verso mais nova do MySQL envolve a os serguintes passos: Verique na seo de alteraes se houve alguma mudana que pode afetar a sua ca co c aplicao. ca Leia os novos itens da verso 4.1 para ver quais itens interessantes que voc pode usar a e na verso 4.1. Veja Seo D.2 [Novidades na verso 4.1.x], Pgina 957. a ca a a Se voc estiver executando o MySQL Server no Windows, veja tambm Seo 2.5.8 e e ca [Windows upgrading], Pgina 132. a Aps o upgrade, atualize a tabela de permisses para gerar uma nova coluna Password o o maior que necessria para tratamento seguro de senhas. O procedimento usa mysql_ e a fix_privilege_tables e est descrito em Seo 2.5.6 [Upgrading-grant-tables], a ca Pgina 130. Estratgias alternativas para tratamento de senhas depois de uma a e atualizao esto descritos posteriormente nesta seo. ca a ca O mecanismo de hashing da senha foi alterado na verso 4.1 para fornecer maior segurana, a c mas ele pode causar problemas de compatibilidade se voc ainda tiver clientes que usam a e
123
biblioteca cliente 4.0 ou anterior. (E bastante indesejvel que voc tenha clientes 4.0 em a e situaes onde o cliente conecta de uma mquina remota que ainda no tenha sido atualizada co a a para a verso 4.1). A seguinte lista indica algumas estratgias poss a e iveis de atualizao. Elas ca representam o que se deve fazer para escolher se ter compatibilidade com clientes antigos e ter maior segurana. c No atualizar para a verso 4.1. Nenhum comportamento ser alterado, mas claro a a a e que voc no poder usar qualquer um dos novos recursos fornecido pelo protocolo e a a cliente/servidor da verso 4.1. (O MySQL 4.1 tem um protocolo cliente/servidor exa tendido que oferece tais recursos como instrues preparadas e conjuntos de mltiplos co u resultados.) Veja Seo 12.1.4 [C API Prepared statements], Pgina 828. ca a Atualizar para a verso 4.1 e executar o script mysql_fix_privilege_tables para a aumentar a coluna Password na tabela user e assim poder guardar hashes de senhas longos. Mas execute o servidor com a opo --old-passwords para fornecer compatica bilidade com verses anteriores que premitem que clientes pre-4.1 continuem a conectar o em suas contas de hash curto. Eventualmente, quando todos os seus clientes estiverem atualizados para a verso 4.1, voc pode parar de usar a opo do servidor --olda e ca passwords. Voc tambm pode alterar as senhas em sua conta MySQL para usar o e e novo formato que mais seguro. e Atualizar para verso 4.1 e executar o script mysql_fix_privilege_tables para aua mentar a coluna Password na tabela user. Se voc sabe que todos os clientes tambm e e foram atualizados para a verso 4.1, no execute o servidor com a opo --olda a ca passwords. Em vez disso, altere a senha em todas as contas existentes para que elas tenham o novo formato. Uma instalao pura da verso 4.1 o mais seguro. ca a e Informaes adicionais sobre hashing de senha em relao a autenticao no cliente e co ca ca operaes de alterao de senha podem ser encontrados em Seo 4.3.11 [Password hashing], co ca ca Pgina 245. a
124
ALTER TABLE table_name TYPE=MyISAM para cada tabela ISAM para convert-la para e MyISAM. Para descobir o tipo de uma determinada tabela, use esta instruo: ca mysql> SHOW TABLE STATUS LIKE tbl_name; Certique-se de que voc no tem nenhum cliente MySQL que utiliza bibliotecas come a partilhadas (com o Perl DBD-mysql). Se voc tiver, voc deve recompil-las j que e e a a as estruturas usadas em libmysqlclient.so foram alteradas. O mesmo se aplica a outras interfaces MySQL, como Python MySQLdb. O MySQL 4.0 funcionar mesmo se voc no zer o acima, mas voc no poder usar os a e a e a a novos privilgios de segurana pois o MySQL 4.0 e voc podem encontrar problemas ao e c e atualizar o MySQL para a verso 4.1 ou mais nova. O formato do arquivo ISAM ainda a funciona no MySQL 4.0 mas est obsoleto e ser disabilitado (no compilado por padro) a a a a no MySQL 4.1. Em vez disso deve se usar tabelas MyISAM. Clientes antigos devem funcionar com um servidor verso 4.0 sem nenhum problema. a Mesmo se voc zer o indicado acima, voc ainda pode voltar para o MySQL 3.23.52 ou e e mais novo se voc encontrar problemas com o MySQL da srie 4.0. Neste caso voc deve e e e usar o mysqldump para fazer um dump de qualquer tabela que use um indice full-text e recarregar o arquivo de dump no servidor 3.23 (pois o 4.0 usa um novo formato para indices full-text). A seguir est uma lista mais completa com o que deve ser observado para atualizar para a a verso 4.0; a O MySQL 4.0 tem vrios novos privilgios na tabela mysql.user. Veja Seo 4.4.1 a e ca [GRANT], Pgina 254. a Para fazer estes novos privilgios funcionarem, deve se atualizar a tabela de permisses. e o O procedimento est descrito em Seo 2.5.6 [Upgrading-grant-tables], Pgina 130. At a ca a e que este script esteja executando todos os usurios tm os privilgios SHOW DATABASES, a e e CREATE TEMPORARY TABLES e LOCK TABLES. Os privilgios SUPER e EXECUTE tiram o seu e valor de PROCESS. REPLICATION SLAVE e REPLICATION CLIENT tiram o seu valor de FILE. Se voc tiver qualquer script que crie novos usurios, voc pode querer alter-los para e a e a usar os novos privilgios. Se voc no est usando o comando GRANT nos scripts, este e e a a um bom momento para alterar os seus scripts e usar GRANT em vez de modicar a e tabela de permisses diretamente. o A partir da verso 4.0.2 a opo --safe-show-database est obsoleta (e no faz mais a ca a a nada). Veja Seo 4.3.3 [Opes de privilgio], Pgina 230. ca co e a Se voc receber um erro Access denied para novos usurios na verso 4.0.2, voc deve e a a e vericar se voc precisa de alguma das novas concesses que voc no precisava antes. e o e a Em particular, voc precisar REPLICATION SLAVE (em vez de FILE) para novos slaves. e a safe_mysqld renomeado para mysqld_safe. Para compatibilidade com verses e o anteriores, as distribuies binrias, iro, por algum tempo, incluir safe_mysqld como co a a um link simblico para mysqld_safe. o Suporte para InnoDB agora est inclu na distribuio binria. Se voc contruir o a ido ca a e MySQL a partir de um fonte, o InnoDB est congurado por padro, Se voc no usar a a e a o InnoDB e quiser economizar memria ao executar o servidor que possui suorte a o
125
InnoDB habilitado, use a opo de inicializao do servidor. Para compilar o MySQL ca ca sem suporte ao InnoDB, execute configure com a opo --without-innodb. ca O parmetro de inicializao myisam_max_extra_sort_file_size e myisam_max_ a ca extra_sort_file_size so dados agora em bytes. (eram dados em megabytes antes a da verso 4.0.3). a O lock de sistema externo dos arquivos MyISAM/ISAM agora est desligado por a padro. Pode se lig-los fazendo --external-locking. (Para a maioria dos usurios a a a isto nunca necessrio). e a A seguintes variveis/opes de inicializaao foram renomeadas: a co c Nome Antigo myisam_bulk_insert_tree_size query_cache_startup_type record_buffer record_rnd_buffer sort_buffer warnings --err-log Novo Nome. bulk_insert_buffer_size query_cache_type read_buffer_size read_rnd_buffer_size sort_buffer_size log-warnings --log-error (para mysqld_safe)
As opes de inicializao record_buffer, sort_buffer e warnings ainda funcionaro co ca a no MySQL 4.0 mas estp obsoletas. a As seguintes veriveis SQL mudaram o nome. a Nome Antigo SQL_BIG_TABLES SQL_LOW_PRIORITY_UPDATES SQL_MAX_JOIN_SIZE SQL_QUERY_CACHE_TYPE Novo Nome. BIG_TABLES LOW_PRIORITY_UPDATES MAX_JOIN_SIZE QUERY_CACHE_TYPE
Os nomes antigos ainda funcionam no MySQL 4.0 mas esto obsoletos. a Voc deve usar SET GLOBAL SQL_SLAVE_SKIP_COUNTER=# em vez de SET SQL_SLAVE_ e SKIP_COUNTER=#. As opes de inicializao --skip-locking e --enable-locking foram renomeadas co ca para --skip-external-locking e --external-locking. SHOW MASTER STATUS agora retorna um conjunto vazio se o log binrio no estiver haa a bilitado. SHOW SLAVE STATUS agora retorna um conjunto vazio se o slave no est inicializado. a a O mysqld agora tem a opo --temp-pool habilitada por padro j que isto da melhor ca a a rendimento com alguns SO (Principalmente no Linux). Colunas DOUBLE e FLOAT agora respeitam o parmetro UNSIGNED no armazenamento a (antes, UNSIGNED era ignortado por estas colunas). ORDER BY coluna DESC ordena valores NULL por ultimo, como no MySQL 4.0.11. Na verso 3.23 e anteriores da verso 4.0, isto nem sempre era consistente. a a SHOW INDEX tem duas colunas a mais (Null e Index_type) que ele tinha nas verses o 3.23. CHECK, SIGNED, LOCALTIME e LOCALTIMESTAMP so agora palavras reservadas. a
126
O resultado de todos os operadores bitwise (|, &, <<, >> e ~) agora so unsigned. Isto a pode causar problemas se voc estiver usando-as em um contexto onde voc quer um e e resultado com sinal. Veja Seo 6.3.5 [Funes de Converso], Pgina 544. ca co a a Nota: quando voc usa subtrao entre valores inteiros onde um deles do tipo e ca e UNSIGNED, o resultado ser sem sinal. Em oyras palavras, antes de atualizar para o a MySQL 4.0, voc deve vericar sua aplicao para os casos onde voc est subtraindo e ca e a um valor de uma entidade sem sinal e quer um nmero negativo como resposta ou subu traindo um valor sem sinal de uma coluna do tipo inteiro. Voc pode disabilitar este e comportamento usando a opo --sql-mode=NO_UNSIGNED_SUBTRACTION ao iniciar o ca mysqld. Veja Seo 6.3.5 [Funes de converso], Pgina 544. ca co a a Para usar MATCH ... AGAINST (... IN BOOLEAN MODE) com suas tabelas, voc precisa e recontru i-las com REPAIR TABLE nome_tabela USE_FRM. LOCATE() e INSTR() so caso sensitivo se um dos argumentos uma string binria. De a e a outra forma elas so caso-insensitivo. a STRCMP() agora usa o conjunto de caracteres atual ao fazer comparaes, o que signica co que o comportamento padro das comparaes agora caso-insensitivo. a co e HEX(string) agora retorna os caracteres na string convertidos para hexadecimal. Se voc quiser converter um nmero para hexadecimal, voc deve se assugurar que voc e u e e chama HEX() com um argumento numrico. e Na verso 3.23, INSERT INTO ... SELECT sempre tem o IGNORE habilitado. Na verso a a 4.0.1, o MySQL ir parar (e poss a ivelmente fazer um roll back) por padro no caso de a mysqld_safe ser renomeado para mysqld_safe. Por algum tempo incluiremos em nossa distribuio binria o mysqld_safe como um link simblico para mysqld_safe. ca a o um erro se voc no especicar IGNORE. e a As funes antigas da API C mysql_drop_db(), mysql_create_db() e mysql_ co connect() no s mais suportadas a menos que voc compile o MySQL com a a e alterar o cliente para utilizar CFLAGS=-DUSE_OLD_FUNCTIONS. No entanto, preferivel e a nova API 4.0. Na estrutura MYSQL_FIELD, length e max_length foram alterados de unsigned int para unsigned long. Isto no deve causar problemas, exceto que eles podem gerar a mensagens de avisos quando quando usado como argumento em uma classe printf() de funes. co Voc deve usar TRUNCATE TABLE quando quiser deletar todos os registros de uma tabela e e voc no precisa obter uma contagen de quantas colunas forma deletadas. (DELETE e a FROM table_name retorna a contagem de linhas na verso 4.0, e TRUNCATE TABLE mais a e rpido.) a Voc receber um erro se tiver um LOCK TABLES ativo ou transaes ao tentar executar e a co TRUNCATE TABLE ou DROP DATABASE. Voc deve usar inteiros para armazenar valores em colunas BIGINT (em vez de usar e strings, como voc fez no MySQL 3.23). Usar strings ainda funicona, mas usar inteiros e mais eciente. e O formato de SHOW OPEN TABLE alterou. Clientes multi-thread devem usar mysql_thread_init() e mysql_thread_end(). Veja Seo 12.1.14 [Clientes em threads], Pgina 863. ca a
127
Se voc quiser recompilar o mdulo Perl DBD::mysql, voc deve conseguir o DBD-mysql e o e verso 1.2218 ou mais novo porque os mdulos DBD mais antigos usam a chamada a o obsoleta mysql_drop_db(). A verso 2.1022 ou mais nova recomendada. a e Na verso RAND(seed) retorna uma srie de nmero randmicas diferente que na 3.23; a e u o isto foi feito para uma diferenciao maior de RAND(seed) e RAND(seed+1). ca O tipo padro retornado por IFNULL(A,B) agora est congurado para ser o mais geral a a string, REAL ou INTEGER). dos tipos de A e B. (A ordem geral-para-especifco e Se voc estiver executando o MySQL Server no Windows, veja Seo 2.5.8 [Atualizando o e ca Windows], Pgina 132. Se voc estiver usando replicao, veja Seo 4.11.2 [Replication a e ca ca Implementation], Pgina 379. a
128
Voc no deve armazenar 0 em uma coluna AUTO_INCREMENT tambm; CHECK TABLE ir e a e a reclamar sobre valores 0 porque eles podem alterar se voc zer um dump e restaurar a e tabela. AUTO_INCREMENT , agora, tratado em um n mais baixo para tabelas MyISAM e ivel e muito mais rpido que antes. Para tabelas MyISAM nmeros antigos tambm no e a u e a so mais reusados, mesmo se voc apagar algumas linhas da tabela. a e CASE, DELAYED, ELSE, END, FULLTEXT, INNER, RIGHT, THEN e WHEN agora so palavras a reservadas. FLOAT(X) agora um tipo de ponto utuante verdadeiro e no um valor com um e a nmero xo de decimais. u Quando estiver declarando colunas usando o tipo DECIMAL(tamanho,dec, o argumento tamanho no inclui mais um lugar para o s a imbolo do ponto decimal. Uma string TIME agora deve estar em um dos seguintes formatos: [H]H:]MM:]SS[.fraction] ou [[[[[H]H]H]H]MM]SS[.fraction] [[[DAYS]
LIKE agora compara strings usando as mesmas regras de comparao de caracteres ca que o operador =. Se voc precisa do antigo compartamento, voc pdoe compilar o e e MySQL com a opo CXXFLGAS=-DLIKE_CMP_TOUPPER. ca REGEXP agora caso insensitivo se nenhuma das strings forem binrias. e a Quando for necessrio dar manuteno ou reparar tabelas MyISAM .MYI deve ser usado a ca a instruo CHECK TABLE ou o comando myisamchk. Para tabelas ISAM (.ISM), use o ca comando isamchk Se desejar que os arquivos mysqldump sejam compat iveis entre as verses 3.22 e 3.23 o do MySQL, no deve ser usados as opes --opt ou --full com o mysqldump. a co Conra todas suas chamadas ` DATE_FORMAT() para ter certeza que exista um % antes a de cada caractere formatador. (Verses mais antigas que o MySQL 3.22 aceitaivam esta o sintaxe.) mysql_fetch_fields_direct() agora uma funo (era uma macro) e ela retorna um e ca ponteiro para um MYSQL_FIELD no lugar de um MYSQL_FIELD. mysql_num_fields() no pode mais ser usada em um objeto MYSQL* (agora uma a e funo que obtem valores MYSQL_RES* como um argumento). Com um objeto MYSQL* ca agora voce deve usar mysql_field_count(). No MySQL Verso 3.22, a sa de SELECT DISTINCT ... era na maioria das vezes a ida ordenada. Na Verso 3.23, voc deve usar GROUP BY ou ORDER BY para obter a sa a e ida ordenada. SUM() agora retorna NULL, em vez de 0 se no existir registros coincidentes. Isto de a e acordo com o ANSI SQL. Um AND ou OR com valores NULL agora retornam NULL no lugar de 0. Isto afetar, em a grande parte, pesquisas que usam NOT em uma expresso AND/OR como NOT NULL = a NULL. LPAD() e RPAD() reduziro a string resultante se ela for maior que o tamanho do a argumento.
129
130
O novo cdigo cliente trabalha com um servidor mysqld 3.20.x, portanto se houver probleo mas com 3.21.x voc deve usar o antigo servidor 3.20.x sem a necessidade de recompilar os e clientes novamente. Se voc no est usando a opo --old-protocol para o mysqld, antigos clientes no e a a ca a podero se conectar e exibiro a seguinte mensagem de erro: a a ERROR: Protocol mismatch. Server Version = 10 Client Version = 9 A nova interface PERL DBI/DBD tambm suporta a antiga interface mysqlperl. A unica e alterao que deve ser feita se voc usa o mysqlperl alterar os argumentos para a funo ca e e ca connect(). Os novos argumentos so: host, database, user, password (note que os a argumentos user e password foram alterados de lugar). Veja Seo 12.5.2 [Perl DBI Class], ca Pgina 881. a As seguintes alteraes podem afetar consultas em antigas aplicaes: co co HAVING deve ser especicada antes de qualquer clusula ORDER BY. a Os parmetros para LOCATE() foram trocados. a Agora existem algumas palavras reservadasi novas. As mais notveis so DATE TIME e a a TIMESTAMP.
131
Se sua instalao est localizada em algum outro diretrio, ajuste o caminha apropriadaca a o mente. O comando ir lhe pedir a senha do root; digite-a quando pedido. a Como no procedimento com o Unix, voc pode ver alguns avisos Duplicate column name e enquanto o mysql processa as instrues no script mysql_fix_privilege_tables.sql; eles co podem ser ignorados. Depois de executar o script, para o servidor e reinicie-o.
132
shell> mysqladmin create nome_bd shell> gunzip < nome_bd.contents.gz | mysql nome_bd Tambm pode ser usado mysqldump e mysqlimport para ajudar na transferncia do banco de e e dados. Para grandes tabelas, isto muito mais rpido do que usar simplesmente mysqldump. e a Nos comandos abaixo, DUMPDIR representa o caminho completo do diretrio que voc utiliza o e para armazenar a sa de mysqldump. ida Primeiro, crie o diretrio para os arquivos de sa e descarregue o banco de dados: o ida shell> mkdir DUMPDIR shell> mysqldump --tab=DUMPDIR nome_bd Depois transra os arquivo no diretrio DUMPDIR para algum diretrio correspondente na o o mquina destino e carregue os arquivos no MySQL assim: a shell> mysqladmin create nome_bd shell> cat DUMPDIR/*.sql | mysql nome_bd shell> mysqlimport nome_bd DUMPDIR/*.txt # cria o banco de dados # cria tabelas no banco de dados # carrega dados nas tabelas
No se esquea de copiar o banco de dados mysql tambm, porque nele que as tabelas a c e e de permisses (user, db e host) so armazenadas. Voc pode ter que executar comandos o a e como o usurio root do MySQL na nova mquina at que voc tenha o banco de dados a a e e mysql no lugar. Depois de importar o banco de dados mysql para a nova mquina, execute mysqladmin a flush-privileges para que o servidor recarregue as informaes das tabelas de permisses. co o
133
A system error has occurred. System error 1067 has occurred. The process terminated unexpectedly. Este erro signica que seu arquivo my.cnf (por padro C:\my.cnf) contm uma opo a e ca que no pode ser reconhecido pela MySQL. Voc pode vericar que este o caso tentando a e e reiniciar o MySQL com o arquivo my.cnf renomeado, por exemplo, para my_cnf.old para prevenirt o servidor de us-lo. Uma vez vericado isto, voc precisa identicar qual a e parmetro o culpado. Crie um novo arquivo my.cnf e mova as partes do arquivo antigo a e para ele (reiniciando o servidor depois de mover cada parte) at que voc determine qual e e opo est fazendo a inicializao do servidor falhar. ca a ca
134
135
DROP DATABASE Voc no pode remover um banco de dados que est em uso por alguma thread. e a a Matando o MySQL do gerenciador de tarefas Voc no pode matar o MySQL do gerenciador de tarefas ou com o utilitrio e a a shutdown no Win95. Voc deve deslig-lo com mysqladmin shutdown. e a Nomes case-insensitivo Nomes de arquivos no so caso sensitivo no Windows, portanto, nomes de a a bancos de dados e tabelas do MySQL tambm no so caso sensitivo no Wine a a dows. A unica restrio que os nomes de bancos de dados e tabelas devem ca e usar o mesmo caso em uma sentena fornecida. Veja Seo 6.1.3 [Name case c ca sensitivity], Pgina 473. a O caracter de diretrio \ o Componentes de nomes de caminho no Win95 so separados pelo caracter \ o a qual tambm o caractere de escape no MySQL. Se voc estiver usando LOAD e e e DATA INFILE ou SELECT ... INTO OUTFILE, use nomes de arquivo no estilo Unix com caracteres /: mysql> LOAD DATA INFILE "C:/tmp/skr.txt" INTO TABLE skr; mysql> SELECT * INTO OUTFILE C:/tmp/skr.txt FROM skr; Uma alternativa dobrar o caracter /: e mysql> LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr; mysql> SELECT * INTO OUTFILE C:\\tmp\\skr.txt FROM skr; Problems with pipes. Pipes no funcionam com conana na linha de comando do Windows. Se o a c pipe incluir o caracter ^Z / CHAR(24), o Windows achar que ele encontrou o a m de um arquivo e abortar o programa. a Isto um problma principalmente quando se tenta aplicar um log binrio como e a a seguir: mysqlbinlog binary-log-name | mysql --user=root Se voc obter um problema aplicando o log e suspeitar que seja devido a um e caracter ^Z/CHAR(24) voc pode usar a seguinte alternativa: e mysqlbinlog binary-log-file --result-file=/tmp/bin.sql mysql --user=root --eexecute "source /tmp/bin.sql" O ultimo comando pode tambm ser usado para leitura em qualquer arquivo e sql que contenha dados binrios. a erro: Cant open named pipe Se voc utiliza um servidor MySQL verso 3.22 no NT com o os programas e a clientes MySQL mais novos, ser apresentado o seguinte erro: a error 2017: cant open named pipe to host: . pipe... Isto ocorre porque a verso do MySQL usa named pipes no NT por padro. a a Voc pode evitar este erro usando a opo --host=localhost para os novos e ca clientes MySQL ou criar um arquivo de opes c:\my.cnf que contenha a co seguinte informao: ca
136
[client] host = localhost A partir da verso 3.23.50, named pipes so habilitados somente se o mysqld-nt a a ou mysqld-nt-max for iniciado com a opo --enable-name-pipe. ca Erro Access denied for user Se voc tenta executar um programa cliente MySQL para conectar a um servie dor em execuo na mesma mquina, nas obtem o erro Access denied for ca a user: some-user@unknown to database mysql quando acessar um servidor MySQL na mesma mquina, signifca que o MySQL no pode resolver seu a a nome de mquina corretamente. a Para corrigir isto, voc deve criar um arquivo \Windows\hosts com a seguinte e informao: ca 127.0.0.1 localhost ALTER TABLE Enquanto voc est executando uma instruo ALTER TABLE, a tabela est bloe a ca a queada para ser usado por outras threads. Isto ocorre devido ao fato de que no Windows, voc no pode deletar um aruivo que est em uso por outra threads. e a a No futuro, podemos encontrar algum modo de contornarmos este problema. DROP TABLE DROP TABLE em uma tabela que est em uso por uma tabela MERGE no funa a cionar no Windows porque o manipulador do MERGE faz o mapeamento da a tabela escondido da camada superior do MySQL. Como o Windows no pera mite que voc delete arquivos que esto abertos, voc primeiro deve descarregar e a e todas as tabelas MERGE (com FLUSH TABLES) ou apagar a tabela MERGE antes de deletar a tabela. Corrigiremos isto assim que introduzirmos views. DATA DIRECTORY e INDEX DIRECTORY As opes DATA DIRECTORY e INDEX DIRECTORY para CREATE TABLE so ignoco a radas no Windows, porque ele no suporta links simblicos. a o Aqui esto alguns assuntos em aberto para qualquer um que queira melhorar o MySQL no a Windows: Adicionar alguns icones agradveis para o start e shutdown na instalao do MySQL. a ca 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. Verses GUI dos clientes MySQL padres (mysql, mysqlshow, mysqladmin e o o mysqldump) seria timo. o Seria muito bom se as funes de leitura e escrita no socket em net.c fosse interco romp iveis. Isto tornaria poss ivel matar threads abertas com mysqladmin kill no Windows. Adicionar macros para usar os mtodos mais rpidos de incremento/decremento de e a threads seguras fornecidos pelo Windows.
137
138
De forma alternativa, voc pode congurar estes parmteros durante a inicializao usando a e a ca ferramenta sysctl, que usada por muitas distribuies Linux (No SuSE a partir da verso e co a 8.0). Apenas grave os seguintes valores em um arquivo chamado /etc/sysctl.conf: # Aumente alguns valores para o MySQL fs.file-max = 65536 fs.dquot-max = 8192 fs.super-max = 1024 You should also add the following to /etc/my.cnf: [mysqld_safe] open-files-limit=8192 Os parmetros acima permitem o MySQL criar at 8192 conexes + arquivos. a e o A constante STACK_SIZE na LinuxThreads controla o espaamento das pilhas threads no c espao de endereamento. Ela necessita ser grande o bastante para que tenha espao o c c c 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 implementao Linux de ca mmap(), como descobrimos em experincias, ir desmapear uma regio j mapeada se voc e a a a e solicitar o mapeamento de um endereo j em uso, zerando os dados de toda a pgina ao c a a invs de retoernar. um erro. Portanto a segurana do mysqld ou qualquer outra aplicao e c ca baseada em threads depende do comportamento gentil do cdigo que cria as threads. O o usurio deve tomar medidas para certircar-se que o nmero de threads em funcionamento a u em qualquer hora seja sucientemente baixo para que as pilhas das threads permaneam c longe do monte global. Com mysqld voc deve reforar este comportamento "gentil" cone c gurando um valor razovel para a varivel max_connections. a a Se voc mesmo construiu o MySQL e no deseja confuses corrigindo LinuxThreads, voc e a o e deve congurar max_connections para um valor mximo de 500. Ele ainda deve ser menor a se voc tiver uma chave grande para o buer, grandes tabelas heap, ou outras coisas que e fazem o mysqld alocar muita memria ou se voc estiver executando um kernel 2.2 com o o e patch de 2GB. Se voc estiver usando nosso binrio ou RPM verso 3.23.25 ou posterior, e a a voc pode seguramente congurar max_connections para 1500, assumindo que no h e a a uma grande chave de buer ou tabelas heap com grande quantidade de dados. Quanto mais voc reduz STACK_SIZE em LinuxThreads mais threads voc pode criar seguramente. e e Recomendamos os valores entre 128K e 256K. Se voc usa vrias conexes simultneas, voc pode sofrer com um "recurso" do kernel e a o a e 2.2 que penaliza um processo por bifurcar-se ou clonar um lho na tentativa de prevenir um ataque de separao. Isto faz com que o MySQL no consiga fazer uma bom ca a escalonamento, quando o nmero de clientes simultneos cresce. Em sistemas com CPU u a unica, temos visto isto se manifestar em uma criao muito lenta das threads, tornando ca a conexo ao MySQL muito lenta. Em sistemas de mltiplas CPUs, temos observado a u uma queda gradual na velocidade das consultas quando o nmero de clientes aumenta. u No processo de tentar encontrar uma soluo, recebemos um patch do kernel de um de ca nossos usurios, que alega fazer muita diferena para seu site. O patch est dispon a c a ivel aqui (http://www.mysql.com/Downloads/Patches/linux-fork.patch). Atualmente temos feito testes extensivos deste patch nos sistemas de desenvolvimento e produo. ca A performance do MySQL obtem uma melhora signicativa, sem causar problemas e atualmente o recomendamos para nossos usurios que continuando trabalhando com a
139
servidores muito carregados em kernels 2.2. Este detalhe foi corrigido no kernel 2.4, portanto, se voc no est satisfeito com a performance atual do seu sistema, melhor do e a a que aplicar um patch ao seu kernel 2.2, pode ser mais fcil simplesmente atualizar para o a 2.4, que lhe dar tambm uma melhora em seu sistemas SMP em adio ` correo do bug a e ca a ca discutido aqui. Estamos testando o MySQL no kernel 2.4 em uma mquina com 2 processadores e descoa brimos que o MySQL escalona muito melhor - virtualmente, no h nenhuma perda de a a desempenho no throughput das consultas at cerca de 1000 clientes, e o fator da escala do e MySQL (computado com a razo do throughput mximo para o thoughput de cada cliente.) a a foi de 180%. Temos observado resultados similares em sistemas com 4 processadores - virtualmente no h perda de desempenho quando o nmero de clientes incrementado at a a u e e 1000 e o fator da escala foi de 300%. Portanto para um servidor SMP muito carregado ns o denitivamente recomendamos o kernel 2.4. Ns descobrimos que essencial executar o o e processo mysqld com a mais alta prioridade poss no kernel 2.4 para obter performance ivel mxima. Isto pode ser feito adicionando o comando renice -20 $$ ao mysqld_safe. Nos a nossos testes em uma mquina com 4 processadores, o aumento da prioridade nos deu 60% a de aumento no throughput com 400 clientes. Atualmente estamos tentando coletar mais informaes sobre como o MySQL atua no kernel co 2.4 em sistemas com 4 e 8 processadores. Se voc tem acesso a um sistema deste porte e tem e feito alguns benchmarks, por favor envie um email para [email protected] 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 implementao de mutex em LinuxThreads na ca glibc-2.1 muito ruim para programas com vrias threads que travam o mutex e a por um tempo curto. Em um sistema SMP, ironicamente, se voc liga o MySQL e com LinuxThreads sem modicaes, removendo processadores da mquina, a co a performance do MySQL melhorada em alguns casos. Para corrigir este compore tamento, disponibilizamos um patch para glibc 2.1.3, em linuxthreads-2.1-patch ( http://www.mysql.com/Downloads/Linux/linuxthreads-2.1-patch) Com a glibc-2.2.2, o MySQL verso 3.23.36 ir usar o mutex adaptativo, que muito a a e melhor,mesmo que o patch na glibc-2.1.3. Avisamos, entretando, que sobre algumas condies, o cdigo mutex no glibc-2.2.2 overspins, que prejudica a performance do MySQL. co o A chance desta condio pode ser reduzida mudando a prioridade do processo mysqld para ca a prioridade mais alta. Ns tambm corrigimos o comportamento overspin com um patch, o e dispon ivel em http://www.mysql.com/Downloads/Linux/linuxthreads-2.2.2.patch. Ele combina a correo do overspin, nmero mximo de threads e espaamento das pilhas ca u a c em um unico patch. Voc precisar aplic-lo no diretrio linuxthreads com patch -p0 e a a o </tmp/linuxthreads-2.2.2.patch. Esperamos que seja inclu de alguma forma nos ido futuros lanamentos da glibc-2.2. De qualquer forma, se voc ligar com glibc-2.2.2, c e ainda ser necessrio corrigir STACK_SIZE e PTHREAD_THREADS_MAX. Temos esperanas que a a c os padres sero corrigidos para valores mais aceitveis para conguraes pesadasa do o a a co MySQL no futuro, ento sua construo poder ser reduzida a ./configure; make; make a ca a install. Recomendamos que voc use os patches acima para construir uma verso esttica especial e a a de libpthread.a e use-a somente para ligaes estticas com o MySQL. Sabemos que os co a patches so seguros para o MySQL e pode melhorar signicamente sua performance, mas no a a
140
podemos dizer nada sobre outras aplicaes. Se voc ligar outras aplicaes coma a verso co e co a modicada da biblioteca ou construir uma verso alterada compartilhada e instal-la no seu a a sistema, voc estar fazendo por sua conta e risco e tenha ateno com outras aplicaes e a ca co que dependem de LinuxThreads. Se voc passar por problemas estranhos durante a instalao do MySQL ou com travamentos e ca de alguns utilitrios comuns, muito provvel que eles so relacionados a problemas de a e a a bibliotecas ou compilador. Se for este o caso, o uso de nosso binrio ser a soluo. a a ca Um problema conhecido com a distribuio binria que com antigos sistemas Linux que ca a e usam libc (como o RedHat 4.x ou Slackware), voc obter alguns problemas no fatais e a a com resoluo de nomes. Veja Seo 2.6.2.1 [Binary notes-Linux], Pgina 141. ca ca a Quando estiver usando LinuxThreads voc ver um m e a inimo de trs processos em execuo. e ca Estes so de fato, threads. Existir uma thread para o gerenciador LinuxThreads, uma a a thread para lidar com conexes e uma thread para tartar de alarmes e sinais. o Perceba que o kernel Linux e a biblioteca LinuxThread pode por padro ter apenas 1024 a threads. Isto signica que voc pode ter at 1021 conexes ao MySQL em um sistema sem e e o correo. A pgina http://www.volano.com/linuxnotes.html contm informaes sobre ca a e co como contornar este limite. Se voc ver um processo mysqld daemon nalizado com ps, isto normalmente signica que e voc encontrou um bug no MySQL ou que tenha uma tabela corrompida. Veja Seo A.4.1 e ca [Crashing], Pgina 925. a Para obter um descarga do core no Linux se o mysqld nalizar com um sinal SIGSEGV, voc e pode iniciar o mysqld com a opo --core-file. Perceba que provavelmente voc tambm ca e e precisar aumentar o core file size adicionando ulimit -c 1000000 para mysqld_safe a ou iniciar mysqld_safe com --core-file-sizes=1000000, Veja Seo 4.8.2 [safe_mysqld], ca Pgina 331. a Se voc estiver ligando seu prprio cliente MySQL e obter o erro: e o ld.so.1: ./my: fatal: libmysqlclient.so.4: open failed: No such file or directory Quando execut-los, o problema pode ser evitado com um dos seguintes mtodos: a e Ligue o cliente com a seguinte opo (no lugar de -Lpath): -Wl,r/pathca libmysqlclient.so. Copie libmysqclient.so para /usr/lib. Adicione o caminho do diretrio onde libmysqlclient.so est localizado para a o a varivel de ambiente LD_RUN_PATH antes de executar seu cliente. a Se voc estiver usando o compilador Fujitsu (fcc / FCC) voc ter alguns problemas come e a pilando o MySQL porque os arquivos de cabealho Linux so muito orientados ao gcc. c a A seguinte linha configure deve funcionar com fcc/FCC: CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE \ -DCONST=const -DNO_STRTOLL_PROTO" CXX=FCC CXXFLAGS="-O -K fast -K lib \ -K omitfp -K preex --no_exceptions --no_rtti -D_GNU_SOURCE -DCONST=const \ -Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO \ -D_EXTERN_INLINE=static __inline" ./configure --prefix=/usr/local/mysql \ --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared \ --with-low-memory
141
142
conexes TCP/IP durante um pequeno tempo, como quando voc executa o benchmark do o e MySQL test-connect sobre TCP/IP. Ns enviamos emails sobre este problema vrias vezes para diferentes listas de discusso o a a Linux mas nunca conseguimos resolver este problema apropriadamente. A unica correo conhecida , para este problema usar conexes persistentes nos seus ca e o clientes ou usar sockets, se voc estiver executando o servidor de banco de dados e clientes e na mesma mquina. Ns experamos que o kernel Linux 2.4 corrija este problema no futuro. a o
143
/usr/lib/libc.a(putc.o): In function _IO_putc: putc.o(.text+0x0): multiple definition of _IO_putc Voc pode evitar o uso de libg++.a executando configure desta forma: e shell> CXX=gcc ./configure
144
Se voc tentar ligar o mysqld estaticamente quando usar o gcc, a imagem resultante ir e a descarregar um arquivo core no in icio. Em outras palavras, NAO use --with-mysqldldflags=-all-static com gcc.
No Solaris, voc deve ter problemas mesmo antes de descompactar a distribuio MySQL! e ca O tar do Solaris no pode tratar grandes nomes de arquivos, portanto voc pode ver um a e erro deste tipo quando descompactar o MySQL: x mysql-3.22.12-beta/bench/Results/ATIS-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,my tar: directory checksum error Neste caso, voc deve usar o GNU tar (gtar) para desempacotar a dise tribuio. ca Voc pode encontrar uma cpia pr-compilada para Solaris em e o e http://www.mysql.com/downloads/os-solaris.html. As threads nativas da Sun funcionam somente no Solaris 2.5 e superior. Para a verso 2.4 a e anteriores, o MySQL ir automaticamente usar MIT-pthreads. Veja Seo 2.3.6 [MITa ca pthreads], Pgina 106. a Se voc obter o seguinte erro de congure: e
145
checking for restartable system calls... configure: error can not run test programs while cross compiling Isto signica que alguma coisa est errada com a instalao de seu compilador! Neste caso a ca voc deve atualizar seu compilador para uma verso mais nova. Voc tambm pode resolver e a e e este problema inserindo a seguinte linha no arquivo config.cache: ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls=no} Se voc est usando Solaris em um SPARC, o compilador recomendado o gcc 2.95.2. Voc e a e e pode encontr-lo em http://gcc.gnu.org/. Perceba que egcs 1.1.1 e gcc 2.8.1 no so a a a estveis no SPARC! a A linha do configure recomendado quando usando gcc 2.95.2 : e CC=gcc CFLAGS="-O3" \ CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql --with-low-memory --enable-assembler Se voc possui um ultra sparc, voc pode obter 4% a mais de performance adicionando e e "-mcpu=v8 -Wa,-xarch=v8plusa" para a CFLAGS e CXXFLAGS. Se voc possui o compilador Sun Workshop (Fortre) 5.3 (ou mais novo), voc pode executar e e configure da seguinte forma: CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt" \ CXX=CC CXXFLAGS="-noex -mt" \ ./configure --prefix=/usr/local/mysql --enable-assembler Voc pode criar um binrio de 64 bits usando o compilador Forte da Sun com os seguintes e a parmetros de compilao: a ca CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v9" \ CXX=CC CXXFLAGS="-noex -mt -xarch=v9" ASFLAGS="-xarch=v9" \ ./configure --prefix=/usr/local/mysql --enable-assembler Para criar um binrio de 64 bits do Solaris usando gcc, e -m64 para CFLAGS e CXXFLAGS. a Note que isto s funciona com o MySQL 4.0 e acima - o MySQL 3.23 no inclui as modio a caes exigidas para suportar isto. co No benchmark do MySQL, conseguimos um aumento de velocidade de 4% em um UltraSPARC usando o Forte 5.0 no modo 32 bit em comparao com o uso do gcc 3.2 com o ca parametro -mcpu. Se voc criar um binrio de 64 bits, ele ser 4$ mais lento que o binrio de 32 bits, mas o e a a a mysqld poder tratar mais threads e memria. a o Se voc tiver um problema com fdatasync ou sched_yield, voc pode corrigir isto adicioe e nando LIBS=-lrt para a linha de congurao ca O seguinte paragrfo relevante somente para compiladores mais antigos que o WorkShop a e 5.3: Voc tambm pode ter que editar o script configure para alterar esta linha: e e #if !defined(__STDC__) || __STDC__ != 1 para isto: #if !defined(__STDC__)
146
Se voc ligar __STDC__ com a opo -Xc, o compilador Sun no pode compilar com o arquivo e ca a de cabealho pthread.h do Solaris. Isto um bug da Sun (compilador corrompido ou c e arquivo include corrompido). Se o mysqld emitir a mensagem de erro mostrada abaixo quando voc execut-lo, voc deve e a e tentar compilar o MySQL com o compilador Sun sem habilitar a opo multi-thread (-mt): ca libc internal error: _rmutex_unlock: rmutex not held Adicione -mt a CFLAGS e CXXFLAGS e tente novamente. Se voc estiver usando a verso SFW do gcc (que vem com o Solaris 8), voc deve adicionar e a e /opt/sfw/lib a varivel de ambiente LD_LIBRARY_PATH antes de executar a congurao. a ca Se voc estiver usando o gcc dispon em sunfreeware.com, voc pode ter muitos probe ivel e lemas. Voc deve recompilar o gcc e GNU binutils na mquina que voc o executar para e a e a evitar qualquer problema. Se voc obter o seguinte erro quando estiver compilando o MySQL com gcc, signica que e seu gcc no est congurado para sua verso de Solaris: a a a shell> gcc -O3 -g -O2 -DDBUG_OFF -o thr_alarm ... ./thr_alarm.c: In function signal_hand: ./thr_alarm.c:556: too many arguments to function sigwait A coisa apropriada para fazer neste caso obter a verso mais nova do gcc e compil-lo e a a com seu compilador gcc atual! Ao menos para o Solaris 2.5, a maioria das verses binrias o a de gcc tem arquivos inteis e antigos que iro quebrar todos programas que usam threads u a (e possivelmente outros programas)! O Solaris no fornece verses estticas de todas bibliotecas de sistema (libpthreads) e a o a libdl), portanto voc no pode compilar o MySQL com --static. Se voc tentar fazer e a e isto, receber o erro: a ld: fatal: library -ldl: not found ou undefined reference to dlopen ou cannot find -lrt Se vrios processos tentar conectar muito rapidamente ao mysqld, voc ver este erro no a e a log do MySQL: Error in accept: Protocol error Voc deve tentar iniciar o servidor com a opo --set-variable back_log=50 como uma e ca soluo para esta situao. Note que --set-variable=nome=valor e -O nome=valor est ca ca a obsoleto desde o MySQL 4.0. Use apenas --back_log=50. Veja Seo 4.1.1 [Opes da ca co linha de comando], Pgina 207. a Se voc est ligando seu prprio cliente MySQL, voc deve obter o seguinte erro quando e a o e tentar execut-lo: a ld.so.1: ./my: fatal: libmysqlclient.so.#:
147
open failed: No such file or directory O problema pode ser evitado por um dos seguintes mtodos: e Ligue o cliente com a seguinte opo (em vez de -Lpath): -Wl,r/full-path-toca libmysqlclient.so. Copie o arquivo libmysqclient.so para /usr/lib. Adicione o caminho do diretrio onde libmysqlclient.so est localizado ` varivel o a a a de ambiente LD_RUN_PATH antes de executar seu cliente. Se voc tiver problemas com o congure tentando ligar com -lz e voc no tem a zlib e e a instalada, voc ter duas opes: e a co Se voc deseja usar o protocol de comunio de compactado voc precisar obter e e ca e a instalar a zlib from ftp.gnu.org. Congure com --with-named-z-libs=no. Se voc estiver usando o gcc e tiver problemas carregando funes UDF no MySQL, tente e co adicionar -lgcc para a linha de ligao para a funo UDF. ca ca Se voc deseja que o MySQL inicie automaticamente, e support-files/mysql.server para /etc/init.d e criar para ele, chamado /etc/rc.3.d/S99mysql.server. voc pode copiar e um link simblico o
Como o Solaris no suporta core les para aplicaes setuid(), voc no pode obter um a co e a core le do mysqld se voc estiver usando a opo --user. e ca
Uma alternativa editar o /usr/include/widec.h diretamente. Desta forma, depois de e fazer a correo, voc deve remover o config.cache e executar o configure novamente ! ca e
148
Se voc obter erros como estes quando voc executar o make, porque o configure e e e no encontrou o arquivo curses.h (provavelmente devido ao erro no arquivo a /usr/include/widec.h): In file included from mysql.cc:50: /usr/include/term.h:1060: syntax error before , /usr/include/term.h:1081: syntax error before ; A soluo para isto fazer uma das seguintes opoes: ca e c 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 que seu arquivo libz.so est instalado em /usr/local/lib. e a Voc pode corrigir isto usando um dos seguintes mtodos: e e Adicione /usr/local/lib ao LD_LIBRARY_PATH. Adicione um link para libz.so a partir de /lib. Se voc estiver usando o Solaris 8, voc pode instalar a zlib opcional do CD de dise e tribuio do Solaris 8. ca Congure o MySQL com a opo --with-named-z-libs=no. ca
No Solaris 8 no x86, mysqld ir descarregar um core se voc executar um strip no mesmo. a e Se voc estiver usando gcc ou egcs no Solaris X86 e voc tiver problemas com descarregos e e de core, voc deve utilizar o seguinte comando configure: e CC=gcc CFLAGS="-O3 -fomit-frame-pointer -DHAVE_CURSES_H" \ CXX=gcc \ CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -D ./configure --prefix=/usr/local/mysql Isto ir evitar problemas com a biblioteca libstdc++ e com excees C++. a co Se isto no ajudar, voc pode compilar uma verso com debug e execut-lo com um arquivo a e a a de ratreamento (trace) ou sob gdb. Veja Seo E.1.3 [Using gdb on mysqld], Pgina 1081. ca a
149
Um MySQL funcional, com todas as otimizaes conhecidas para trabalhar na sua co verso habilitada do FreeBSD. a Congurao e construo automtica. ca ca a Scripts de inicializao instalados em /usr/local/etc/rc.d. ca Habilidade para ver quais arquivos esto instalados com pkg info -L. E para remover a e a a todos com pkg delete se voc no quiser mais o MySQL na mquina. E recomendado que voc utilize MIT-pthreads no FreeBSD 2.x e threads nativas nas Verses e o 3 e superiores. E poss executar com threads nativas em algumas verses antigas (2.2.x) ivel o mas voc pode encontrar problemas ao nalizar o mysqld. e Infelizmente algumas chamadas de funes no FreeBSD ainda no so totalmente seguras co a a com threads, principalmente a funo gethostbyname(), que usada pelo MySQL para ca e converter nomes de mquinas em endereos IPs. Sob certas circunstncias, o processo a c a mysqld ir criar repentinamente um carga de CPU de 100% e car sem resposta. Se voc a a e se deparar com isto, tente iniciar o MySQL usando a opo --skip-name-resolve. ca Alternativamente, voc pode ligar o MySQL no FreeBSD 4.x com a biblioteca Linuxe Threads, que evita uns poucos problemas que a implementao da thread nativa do FreeBSD ca tem. Para uma comparao muito boa do LinuxThreads vs. threads nativas d uma olca e hada no artigo "FreeBSD or Linux for your MySQL Server?" de Jeremy Zawodny em http://jeremy.zawodny.com/blog/archives/000697.html Os problemas conhecidos usando LinuxThreads na FreeBSD so: a wait_timeout no est funcionando (provavemente problema de manipulao do signal a a ca em FreeBSD/LinuxThreads). Isto deveria ter sido corrigido no FreeBSD 5.0. O sintome a que conexes persistentes podem se manter por um longo tempo sem serem fechadas. o O Makefile do MySQL necessita o GNU make (gmake) para funcionar. Se voc deseja e compilar o MySQL, antes voc precisar instalar o GNU make. e a Tenha certeza que sua congurao de resoluo de nomes esteja correta. De outra forma ca ca voc vai ter atrasos na resoluo ou falhas quando conectar ao mysqld. e ca Tenha certeza que a entrada localhost no arquivo /etc/hosts esteja correta (de outra forma voc ir ter problemas conectando ao banco de dados). O arquivo /etc/hosts deve e a iniciar com a linha: 127.0.0.1 localhost localhost.seu.dominio O modo recomendado de compilar e instalar o MySQL no FreeBSD com gcc (2.95.2 e acima) : e CC=gcc CFLAGS="-O2 -fno-strength-reduce" \ CXX=gcc CXXFLAGS="-O2 -fno-rtti -fno-exceptions -felide-constructors \ -fno-strength-reduce" \ ./configure --prefix=/usr/local/mysql --enable-assembler gmake gmake install ./scripts/mysql_install_db cd /usr/local/mysql ./bin/mysqld_safe &
150
Se voc percber que o configure usar MIT-pthreads, voc de ler as notas sobre MITe a e pthreads. Veja Seo 2.3.6 [MIT-pthreads], Pgina 106. ca a Se o make install no puder encontrar /usr/include/pthreads, porque o configure a e no detectou que voc precisava de MIT-pthreads. Isto corrigido executando estes comana e e dos: shell> rm config.cache shell> ./configure --with-mit-threads O FreeBSD tambm conhecido por ter um limite muito baixo para o manipulador de e e arquivos. Veja Seo A.2.17 [Not enough le handles], Pgina 921. Descomente a seo ca a ca ulimit -n no mysqld safe ou aumente os limites para o usurio mysqld no /etc/login.conf (e a e e reconstrua-o com cap mkdb /etc/login.conf). Tambm tenha certeza que voc congurou a classe apropriada para este usurio no arquivo de senhas (password) se voc no estiver a e a usando o padro (use: chpass nome usuario mysqld). Veja Seo 4.8.2 [mysqld_safe], a ca Pgina 331. a Se voc tiver muita memria voc deve considerar em reconstruir o Kernel para permitir o e o e MySQL de usar mais de 512M de RAM. D uma olhada na op~o MAXDSIZ na arquivo de e ca congurao LINT para maiores informaes. ca co Se voc tiver problemas com a data atual no MySQL, congurar a varivel TZ provavelmente e a ajudar. Veja Apndice F [Environment variables], Pgina 1092. a e a Para obter um sistema seguro e estvel voc deve usar somente kernels FreeBSD que estejam a e marcados com -STABLE.
151
152
153
2.6.6 Notas de Outros Unix 2.6.6.1 Notas HP-UX para distribuies binrias co a
Alguma das distribuies binrias do MySQL para HP-UX distribuida como um arquivo co a e depot da HP e como um arquivo tar. Para usar o arquivo depot voc deve estar executando e pelo menos o HP-UX 10.x para ter acesso `s ferramentas de arquivos depot da HP. a A verso HP do MySQL foi compilada em um servidor HP 9000/8xx sob HP-UX 10.20, a usando MIT-pthreads. Sob esta congurao o MySQL funciona bem. O MySQL Verso ca a 3.22.26 e mais novas tambm podem ser construidas com o pacote thread nativo da HP. e Outras conguraes que podem funcionar: co HP 9000/7xx executando HP-UX 10.20+ HP 9000/8xx executando HP-UX 10.30 As seguintes conguraes denitivamente no funcionaro: co a a HP 9000/7xx ou 8xx executando HP-UX 10.x where x < 2 HP 9000/7xx ou 8xx executando HP-UX 9.x Para instalar a distribuio, utilze um dos comandos abaixo, onde /path/to/depot o ca e caminho completo do arquivo depot: Para instalar tudo, incluindo o servidor, cliente e ferramentas de desenvolvimento: shell> /usr/sbin/swinstall -s /path/to/depot mysql.full Para instalar somente o servidor: shell> /usr/sbin/swinstall -s /path/to/depot mysql.server Para instalar somente o pacote cliente: shell> /usr/sbin/swinstall -s /path/to/depot mysql.client Para instalar somente as ferramentas de desenvolvimento: shell> /usr/sbin/swinstall -s /path/to/depot mysql.developer O depot copia os binrios e bibliotecas em /opt/mysql e dados em /var/opt/mysql. O a depot tambm cria as entradas apropriadas em /etc/init.d e /etc/rc2.d para iniciar e o servidor automaticamente na hora do boot. Obviamente, para instalar o usurio deve ser a o root. Para instalar a distribuio HP-UX tar.gz, voc deve ter uma cpia do GNU tar. ca e o
154
CFLAGS="-I/opt/dce/include -fpic" \ CXXFLAGS="-I/opt/dce/include -felide-constructors -fno-exceptions \ -fno-rtti" CXX=gcc ./configure --with-pthread \ --with-named-thread-libs=-ldce --prefix=/usr/local/mysql --disable-shared A seguinte linha do configure deve funcionar com o gcc 3.1: CFLAGS="-DHPUX -I/opt/dce/include -O3 -fPIC" CXX=gcc \ CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions \ -fno-rtti -O3 -fPIC" ./configure --prefix=/usr/local/mysql \ --with-extra-charsets=complex --enable-thread-safe-client \ --enable-local-infile --with-pthread \ --with-named-thread-libs=-ldce --with-lib-ccflags=-fPIC --disable-shared
155
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 inforamaes que um usurio do HP-UX Verso 11.x nos enviou sobre comco a a pilao do MySQL com o compilador HP-UX: ca CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure --with-extra-character-set=com Voc pode ignorar qualquer erro do tipo: e aCC: warning 901: unknown option: -3: use +help for online documentation Se voc obter o seguinte erro do configure e checking for cc option to accept ANSI C... no configure: error: MySQL requires a ANSI C compiler (and a C++ compiler). Try gcc. See the Installation chapter in the Reference Manual. Conra se voc no tem o caminho para o compilador K&R antes do caminho para o e a compilador C e C++ do HP-UX. Outra razo para no estar compilando voc no denir o parmetro +DD64 acima. a a e e a a Outra possibilidade para o HP-UX 11 usar o binrio MySQL para HP-UX 10.20. Recebee a mos relatos de alguns usurios de que esses binrios funcionam bem no HP-UX 11.00. Se a a voc encontrar problemas, verique o n do pacth de seu HP-UX. e ivel
156
foi testado com egcs 1.1). Existem tambm alguns problemas conhecidos com o assembler e da IBM que pode gerar cdigo errado quando usado com gcc. o Ns recomendamos a seguinte linha do configure com egcs e gcc 2.95 no AIX: o CC="gcc -pipe -mcpu=power -Wa,-many" \ CXX="gcc -pipe -mcpu=power -Wa,-many" \ CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql --with-low-memory O -Wa,-many necessrio para o compilador ser bem sucedido. IBM est ciente deste e a a problema mas no est com pressa de corrig devido ao fato do problema poder ser a a i-lo contornado. Ns no sabemos se o -fno-exceptions necessrio com gcc 2.9.5, mas o a e a como o MySQL no utiliza excees e a opo acima gera cdigo mais rpido, recomendamos a co ca o a que voc sempre use esta opo com o egcs/gcc. e ca Se voc tiver algum problema com cdigo assembler tente alterar o -mcpu=xxx para o seu e o processador. Normalmente power2, power ou powerpc podem ser usados, de uma maneira alternativa voc pode precisar usar 604 ou 604e. No tenho certeza mas acredito que usar e a "power" deve satisfazer a maioria dos casos, mesmo em uma mquina power2. a Se voc no sabe qual o seu processador, utilize o comando "uname -m", isto ir fornecer a e a e a voc uma string que parece com "000514676700", com um formato de xxyyyyyymmss onde e xx e ss so sempre 0s, yyyyyy o ID unico do sistema e mm o ID da CPU Planar. Uma a e e tabela destes valores podem ser encontrados em http://publib.boulder.ibm.com/doc_ link/en_US/a_doc_lib/cmds/aixcmds5/uname.htm. Isto ir lhe fornecer um tipo de a mquina e um modelo de mquina que voc pode usar para determinar que tipo de cpu a a e voc tem. e Se voc tiver problemas com sinais (MySQL naliza sem noticao sob alta carga) voc e ca e pode ter encontrado um bug de SO com threads e sinais. Neste caso voc pode dizer ao e MySQL para no usar sinais congurando-o com: a 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 no afeta a performance do MySQL, mas tem o efeito colateral que voc no pode a e a matar clientes que esto dormindo em uma conexo com mysqladmin kill ou mysqladmin a a shutdown. Neste caso, o cliente morrer quando ele chegar no prximo comando. a o Em algumas verses do AIX, ligando com libbind.a faz o getservbyname descarregar core. o Isto erro no AIX e deve ser relatado para a IBM. e Para o AIX 4.2.1 e gcc voc tem que fazer as seguintes alteraes. e co 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 precisa adicionar um prottipo para initgroups. e o #ifdef _AIX41 extern "C" int initgroups(const char *,int);
157
#endif Se voc precisar se alocar muita memria para o processo mysqld, no suciente apenas e o a e denir ulimit -d unlimited. Voc tambm deve congurar no mysqld_safe algo do tipo: e e export LDR_CNTRL=MAXDATA=0x80000000 Voc pode encontrar mais sobre o uso de muita memria em: http://publib16.boulder.ibm.com/pseries e o US/aixprggd/genprogc/lrg_prg_support.htm.
158
Se voc estiver utilizando o compilador CC da Compac, a seguinte linha de congurao e ca dever funcionar: a CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host" CXX="cxx -pthread" CXXFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host \ -noexceptions -nortti" export CC CFLAGS CXX CXXFLAGS ./configure \ --prefix=/usr/local/mysql \ --with-low-memory \ --enable-large-files \ --enable-shared=yes \ --with-named-thread-libs="-lpthread -lmach -lexc -lc" gnumake Se voc tiver problemas com a libtool, ao compilar com bibliotecas compartilhadas como e no exemplo acima, quando estiver ligando ao mysqld, voc deve conseguir contornar este e problema usando: cd mysql /bin/sh ../libtool --mode=link cxx -pthread -O3 -DDBUG_OFF \ -O4 -ansi_alias -ansi_args -fast -inline speed \ -speculate all \ -arch host -DUNDEF_HAVE_GETHOSTBYNAME_R \ -o mysql mysql.o readline.o sql_string.o completion_hash.o \ ../readline/libreadline.a -lcurses \ ../libmysql/.libs/libmysqlclient.so -lm cd .. gnumake gnumake install scripts/mysql_install_db
159
Com o OSF1 V4.0D e o compilador "DEC C V5.6-071 no Digital Unix V4.0 (Rev. 878)" o compilador tem alguns comportamentos estranhos (simbolos asm indenidos). /bin/ld tambm aparece estar quebrado (problemas com erros _exit undefined ocorrendo ao ligar e no mysqld). Neste sistema, temos compilado o MySQL com a seguinte linha configure, depois de substituir /bin/ld com a verso do OSF 4.0C: a CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql Com o compilador da Digital "C++ V6.1-029", o seguinte deve funcionar: CC=cc -pthread CFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all \ -arch host CXX=cxx -pthread CXXFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all \ -arch host -noexceptions -nortti export CC CFLAGS CXX CXXFLAGS ./configure --prefix=/usr/mysql/mysql --with-mysqld-ldflags=-all-static \ --disable-shared --with-named-thread-libs="-lmach -lexc -lc" Em algumas verses do OSF1, a funo alloca() est quebrada. Corrija isto removendo a o ca a linha no config.h que dene HAVE_ALLOCA. A funo alloca() pode tambm ter um prottipo incorreto em /usr/include/alloca.h. ca e o O alerta resultante deste erro pode ser ignorado. configure ir usar a seguinte biblioteca thread automaticamente: --with-named-threada libs="-lpthread -lmach -lexc -lc". Quando usar o gcc, voc tambm pode tentar executar configure desta forma: e e shell> CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure .... Se voc tiver problemas com sinais (MySQL nalzar inesperadamente sobre alta carga), e voc pode ter encontrado um erro com threads e sinais no SO. Neste caso voc pode dizer e e ao MySQL para no usar sinais congurando-o com: a shell> CFLAGS=-DDONT_USE_THR_ALARM \ CXXFLAGS=-DDONT_USE_THR_ALARM \ ./configure ... Isto no afeta a performance do MySQL, mas tem efeitos colaterais que no permitem a a nalizar clientes que esto dormindo em uma conexo com mysqladmin kill ou a a mysqladmin shutdown. Neste caso o cliente ir morrer quando ele receber o prximo a o comando. Com gcc 2.95.2, voc provavelmente encontrar o seguinte erro de compilao: e a ca sql_acl.cc:1456: Internal compiler error in scan_region, at except.c:2566 Please submit a full bug report. Para corrigir isto voc deve alterar para o diretrio sql e fazer um corta e cola da ultima e o linha gcc, mas altere -O3 para -O0 (ou adicione -O0 imediatamente depois de gcc se voc e no tiver algumas opo -O na sua linha de compilao.) Depois disto feito voc deve apenas a ca ca e voltar ao diretrio superior e executar make novamente. o
160
A SGI recomenda que voc instale todos os patches desta pgina: http://support.sgi.com/surfzone/patches/ e a No m inimo, voc deve instalar o ultimo rollup do kernel, o ultimo rollup rld, e o ultimo e rollup libc. Denitivamente voc precisar de todos patches POSIX nesta pgina, para suporte e a a pthreads: http://support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html Se voc obter o seguinte erro quando estiver compilando o mysql.cc: e "/usr/include/curses.h", line 82: error(1084): invalid combination of type Digite o seguinte no diretrio topo da sua rvore fonte do MySQL: o a shell> extra/replace bool curses_bool < /usr/include/curses.h \ > include/curses.h shell> make Existem relatos de problemas com organizao de threads. Se somente uma thread estiver ca 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 execuo para a outra ca thread. Isto um problema no compreendido com threads Irix; voc deve improvisar para e a e encontrar solues at que isto seja resolvido. co e Se voc estiver compilando com gcc, voc pode usar o seguinte comando configure: e e CC=gcc CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql --enable-thread-safe-client \ --with-named-thread-libs=-lpthread No Irix 6.5.11 com Irix C nativo e compiladores C++ ver. 7.3.1.2, o seguinte ir funcionar a CC=cc CXX=CC CFLAGS=-O3 -n32 -TARG:platform=IP22 -I/usr/local/include \ -L/usr/local/lib CXXFLAGS=-O3 -n32 -TARG:platform=IP22 \ -I/usr/local/include -L/usr/local/lib ./configure \ --prefix=/usr/local/mysql --with-innodb --with-berkeley-db \ --with-libwrap=/usr/local \ --with-named-curses-libs=/usr/local/lib/libncurses.a
161
A verso atual foi testado somente nos sistemas sco3.2v5.0.4 e sco3.2v5.0.5. A versoo a a para o sco 3.2v4.2 tambm tem tido muito progresso. e At o momento o compilador recomendado no OpenServer o gcc 2.95.2. Com isto voc e e e deve estar apto a compilar o MySQL apenas com: CC=gcc CXX=gcc ./configure ... (op~es) co 1. Para o OpenServer 5.0.X voc precisa usar gcc-2.95.2p1 ou mais novo da Skunkware. e http://www.SCO.com/skunkware/ e ecolher o pacote OpenServer browser ou por ftp em ftp to ftp2.SCO.com no diretrio pub/skunkware/osr5/devtools/gcc. o 2. Voc precisa do GCC verso 2.5.x para este produto e do sistema de desenvolvimento. e a Eles so necessrios nesta verso do SCO Unix. Voc no pode usar apenas o sistema a a a e a GCC Dev. 3. Voc deve obter o pacote FSU Pthreads e instal-lo primeiro. Pode ser obtido em e a http://www.cs.wustl.edu/~schmidt/ACE_wrappers/FSU-threads.tar.gz. Voc e pode tambm obter um pacote precompilado de http://www.mysql.com/Downloads/SCO/FSU-threads e 4. FSU Pthreads pode ser compilado com SCO Unix 4.2 com tcpip, ou OpenServer 3.0 ou OpenDesktop 3.0 (OS 3.0 ODT 3.0), com o Sistema de Desenvolvimento da SCO instalado usando uma boa verso do GCC 2.5.x ODT ou OS 3.0, no qual voc necessia e tar de uma boa verso do GCC 2.5.x. Existem vrios problemas sem uma boa verso. a a a a Esta verso do produto necessita do sistema de Desenvolvimento SCO Unix. Sem ele, a voc estar perdendo as bibliotecas e o editor de ligao necessrio. e a ca a 5. Para construir a FSU Pthreads no seu sistema, faa o seguinte: c 1. Execute ./configure no diretrio threads/src e selecione a opo SCO o ca OpenServer. Este comando copia Makefile.SCO5 para Makefile. 2. Execute make. 3. Para instalar no diretrio padro /usr/include, use o usurio root, depois mude o a a para o diretrio thread/src e execute make install o 6. Lembre de usar o GNU make quando estiver construindo o MySQL. 7. Se voc no iniciou o mysqld_safe como root, voc provavelmente s ir obter, por e a e o a padro, os 110 arquivos abertos por processo. O mysqld ir gravar uma nota sobre isto a a no arquivo log. 8. Com o SCO 3.2V5.0.5, voc deve usar o FSU Pthreads verso 3.5c ou mais nova. Voc e a e deve tambm usar o gcc 2.95.2 ou mais novo. e O seguinte comando configure deve funcionar: shell> ./configure --prefix=/usr/local/mysql --disable-shared 9. Com SCO 3.2V4.2, voc deve usar FSU Pthreads verso 3.5c ou mais nova. O seguinte e a comando configure deve funcionar: shell> CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \ ./configure \ --prefix=/usr/local/mysql \ --with-named-thread-libs="-lgthreads -lsocket -lgen -lgthreads" \ --with-named-curses-libs="-lcurses"
162
Voc pode ter alguns problemas com alguns arquivos de incluso. e a Neste caso, voc pode encontrar novos arquivos de incluso espec e a icos do SCO em http://www.mysql.com/Downloads/SCO/SCO-3.2v4.2-includes.tar.gz. Voc deve e descompactar este arquivo no diretrio include da sua rvore fonte do MySQL. o a
Notas de desenvolvimento SCO: O MySQL deve detectar automaticamente FSU Pthreads e ligar o mysqld com lgthreads -lsocket -lgthreads. As bibliotecas de desenvolvimento SCO so re-entrantes nas FSU Pthreads. A SCO a diz que suas bibliotecas de funes so re-entrantes, ento elas devem ser re-entrantes co a a com as FSU-Pthreads. FSU Pthreads no OpenServer tentam usar o esquema SCO para criar bibliotecas re-entrantes. FSU Pthreads (ao menos a verso em http://www.mysql.com) vem ligada com GNU a malloc. Se voc encontrar problemas com uso de memria, tenha certeza que o e o em libgthreads.a e libgthreads.so. gmalloc.o esteja incluido Na FSU Pthreads, as seguintes chamadas de sistema so compat a iveis com pthreads: read(), write(), getmsg(), connect(), accept(), select() e wait(). O CSSA-2001-SCO.35.2 (O patch listado de costume como patch de segurana e c erg711905-dscr remap ver 2.0.0) quebra FSU threads e deixa o mysqld instvel. Voc a e deve remove-lo se voc deseja executar o mysqld em uma mquina OpenServer 5.0.6. e a A SCO fornece Patches do Sistema Operacional em ftp://ftp.sco.com/pub/openserver5 para OpenServer 5.0.x A SCO fornece correes de segurana e libsocket.so.2 em ftp://ftp.sco.com/pub/security/OpenSer co c e ftp://ftp.sco.com/pub/security/sse para OpenServer 5.0.x Correes de segurana pre-OSR506. co c Tamb a correo do telnetd em e ca ftp://stage.caldera.com/pub/security/openserver/ ou ftp://stage.caldera.com/pub/securi com a libsocket.so.2 e libresolv.so.1 com instrues para instalar em sistemas preco OSR506. E provavelmente uma boa idia para instalar os patches acima tentando compilar/usar e o MySQL. Se voc deseja instalar o DBI no SCO, voc deve e e subdiretrio. o Note que o exemplo abaixo considera o gcc 2.95.2 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 editar o Makefile em DBI-xxx e cada ou mais novo: 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
163
OLD: CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include NEW: CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include Isto porque o carregador dinmico Perl no ir carregar os mdulos DBI se elas foram e a a a o compiladas com icc ou cc. Perl trabalha melhor quando compilado com cc.
164
gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \ -o example udf_example.cc -L../lib -lmysqlclient udf_example.def mv example.dll example.udf Nota: Devido a limitaes no OS/2, o nome do mdulo UDF no deve esceder 8 caracteres. co o a Mdulos so armazenados no diretrio /mysql2/udf; o script safe-mysqld.cmd ir coloo a o a car este diretrio na varivel de ambiente BEGINLIBPATH. Quando usando mdulos UDF, o a o extenses espec o icas so ignoradas consuidera-se que seja .udf. Por exemplo, no Unix, a o mdulo compartilhado deve ser nomeado example.so e voc deve carregar uma funo o e ca dele desta forma: mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example.so"; No OS/2, o mdulo deve ter o nome de example.udf, mas voc no deve especicar a o e a extenso do mdulo: a o mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example";
165
Na Verso 3.22.8, o suporte Perl distribu separadamente do dsitribuio principal do a e ido ca MySQL. Se voc quiser instalar o suporte Perl, os arquivos que voc precisr pode ser e e a obtidos em http://www.mysql.com/downloads/api-dbi.html. As distribuies Perl so fornecidas como arquios tar compactados e so chamados co a a MODULE-VERSION.tar.gz, onde MODULE o nome do modulo e VERSION o nmero da e e u verso. Voc deve conseguir as distribuies Data-Dumper, DBI, e DBD-mysql e instal-las a e co a nesta ordem. O procedimento de instalao mostrado aqui. O exemplo mostrado para ca e e o mdulo Data-Dumper, mas o procedimento o mesmo para todas as distribuies: o e co 1. Descompacte as distribuies no diretrio atual: co o shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf Este comando cria um diretrio chamado Data-Dumper-VERSION. o 2. Entre no diretrio principal da distribuio descompactada: o ca shell> cd Data-Dumper-VERSION 3. Contrua a dsitribuio e compile tudo: ca shell> perl Makefile.PL shell> make shell> make test shell> make install O comando make test importante porque verica que o mdulo est funcionando. Note e o a que ao executar este comando durante a instalaao do DBD-mysql para exercitar o cdigo c o da interface, o servidor MySQL deve estar em execuo ou teste ir falhar. ca a uma boa idia reconstruir e reinstalar a distribuio DBD-mysql mesmo se voc instalar E e ca e uma nova distribuio do MySQL, particularmente se voc notar simntomas como se todos ca e os seus scripts DBI realizarem dump core depois de voc atualizar o MySQL. e Se voc no tem o direito para instalar os mdulos Perl no diretrio de sistema ou se voc e a o o e quiser instalar mdulos Perl locais, a seguinte referncia pode ajud-lo: o e a http://servers.digitaldaze.com/extensions/perl/modules.html#modules Procure sob o t itulo Installing New Modules that Require Locally Installed Modules.
166
ppm> install DBI Se der tudo certo, execute o seguinte comando: install \ ftp://ftp.de.uu.net/pub/CPAN/authors/id/JWIED/DBD-mysql-1.2212.x86.ppd O acima deve funcionar pelo menos com o ActiveState Perl Verso 5.6. a Se voc no puder fazer o mostrado acima funcionar, voc deve instalar o driver MyODBC e e a e conectar ao servidor MySQL atravs do ODBC: e use DBI; $dbh= DBI->connect("DBI:ODBC:$dsn",$user,$password) || die "Got error $DBI::errstr when connecting to $dsn\n";
167
$sysliblist .= " -lm"; Altere esta linha para: $sysliblist .= " -lm -lz"; Depois disto, voc deve executar make realclean e proceder com o instalao desde o in e ca icio. Se voc quiser usar o mdulo Perl em um sistema que no suporta ligao dinmica (como e o a ca a SCO) voc pode gerar uma verso esttica do Perl que inclui DBI e DBD-mysql. O modo e a a que isto funciona que voc gera uma verso do Perl com o odigo DBI ligado e instalado e e a c no topo do seu Perl atual. Entao voc o utiliza para construir uma verso do Perl que e a adicionalmente tem o cdigo DBD ligado em si, e instale-o. o No SCO, voc deve ter as seguintes variveis de ambiente conguradas: e a shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib ou shell> LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\ /usr/progressive/lib:/usr/skunk/lib shell> LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\ /usr/progressive/lib:/usr/skunk/lib shell> MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:\ /usr/skunk/man: Primeiro crie um Perl que inclui um mdulo DBI ligado estaticamente executando estes o comandos no diretrio onde a sua distribuio DBI est localiada: o ca a shell> perl Makefile.PL -static -config shell> make shell> make install shell> make perl Ento voc deve intalar o novo Perl. A sa de make perl indicar o comando make a e ida a exato que voc precisar executar para realizar a instalao. No SCO, isto make -f e a ca e Makefile.aperl inst_perl MAP_TARGET=perl. A seguir use o Perl rcem criado para criar outro Perl que tambm inclui uma DBD::mysql e e estaticamente ligado rodando estes comandos no diretrio onde sua distribuio DBD-mysql o ca est localizada: a shell> perl Makefile.PL -static -config shell> make shell> make install shell> make perl Finalmente voc deve instalar este novo Perl. Novamente, a sa de make perl indica o e ida comando a usar.
168
169
Algumas instalaes MySQL permitem aos usurios de se conectarem como usurios co a a annimos ao servidor executando na mquina local. Se isto o caso na sua mquina, voc o a e a e deve conseguir conectar ao servidor chamando o mysql sem qualquer opo: ca shell> mysql Depois de voc conectar com sucesso, voc pode disconectar a qualquer hora digitando QUIT e e (ou \q) no prompt mysql>: mysql> QUIT Bye No Unix, voc tambm pode desconectar pressionando Control-D. e e A maioria dos exemplos nas sees seguintes assumem que voc j est conectado ao servidor. co e a a Isto indicado pelo prompt mysql>. e
170
O mysql mostra quantas linhas foram retornadas e quanto tempo a consulta levou para executar, o que lhe d uma vaga idia da performance do servidor. Estes valores a e so impreciso porque eles representam tempo de relgio (No tempo de CPU ou de a o a mquina), e porque eles so afetados pelos fatores como a carga do servidor e latncia a a e de rede. (Para resumir, a linha rows in set no mostrada nos exemplos seguintes a e deste cap itulo.) Palavras Chave podem ser entradas em qualquer caso de letra. As seguintes consultas so a equivalentes: mysql> SELECT VERSION(), CURRENT_DATE; mysql> select version(), current_date; mysql> SeLeCt vErSiOn(), current_DATE; Aqui est outra consulta. Ela demonstra que voc pode usar o mysql como uma calculadora a e simples: mysql> SELECT SIN(PI()/4), (4+1)*5; +-------------+---------+ | SIN(PI()/4) | (4+1)*5 | +-------------+---------+ | 0.707107 | 25 | +-------------+---------+ As consultas mostradas at agora tm sido instrues relativamente pequenas, de uma linha. e e co Voc pode tambm entrar com mltiplas instrues em uma unica linha. Basta nalizar e e u co cada uma com um ponto e v irgula: mysql> SELECT VERSION(); SELECT NOW(); +--------------+ | VERSION() | +--------------+ | 3.22.20a-log | +--------------+ +---------------------+ | NOW() | +---------------------+ | 1999-03-19 00:15:33 | +---------------------+ Um comando no necessita estar todo em uma unica linha, ento comandos extensos que a a necessitam de vrias linhas no so um problema. O mysql determina onde sua instruo a a a ca termina atravs do ponto e v e irgula terminador, e no pelo nal da linha de entrada. (Em a outras palavras, o myqsl aceita entradas de livre formato: Ele coleta linhas de entrada mas no as executa at chegar o ponto e v a e irgula.) Aqui est uma instruo simples usando mltiplas linhas: a ca u mysql> SELECT -> USER() -> , -> CURRENT_DATE; +--------------------+--------------+
171
| USER() | CURRENT_DATE | +--------------------+--------------+ | joesmith@localhost | 1999-03-18 | +--------------------+--------------+ Neste exemplo, note como o prompt altera de mysql> para -> depois de voc entrar a e primeira linha de uma consulta com mltiplas linhas. Isto como o mysql indica que ainda u e no achou uma instruo completa e est esperando pelo resto. O prompt seu amigo, a ca a e porque ele fornece um retorno valioso. Se voc usa este retorno, voc sempre estar ciente e e a do que o mysql est esperando. a Se voc decidir que no deseja executar um comando que est no meio do processo de e a a entrada, cancele-o digitando \c: mysql> SELECT -> USER() -> \c mysql> Note o prompt aqui tambm. Ele troca para o mysql> depois de voc digitar \c, fornecendo e e retorno para indicar que o mysql est pronto para um novo comando. a A seguinte tabela mostra cada dos prompts que voc pode ver e resume o que ele signica e sobre o estado em que o mysql se encontra: Prompt Signicado mysql> Pronto para novo comando. -> Esperando pela prxima linha de comando com mltiplas linhas. o u > Esperando pela prxima linha, coletando uma string que comece com o uma aspas simples (). "> Esperando pela prxima linha, coletando uma string que comece com o aspas duplas ("). > Esperando pela prxima linha, coletando uma string que comece com o crase (). muito comum instrues multi-linhas ocorrerem por acidente quando voc pretende pubE co e licar um comando em uma unica linha, mas esquece o ponto e v irgula terminador. Neste caso,o mysql espera por mais entrada: mysql> SELECT USER() -> Se isto ocorrer com voc (acha que entrou uma instruo mas a unica resposta um prompt e ca e ->), o mais provvel que o mysql est esperando pelo ponto e v a e a irgula. Se voc no e a perceber o que o prompt est lhe dizendo, voc pode parar por um tempo antes de entender a e o que precisa fazer. Entre com um ponto e v irgula para completar a instruo, e o mysql ca ir execut-la: a a mysql> SELECT USER() -> ; +--------------------+ | USER() | +--------------------+ | joesmith@localhost | +--------------------+
172
O prompt > e "> ocorrem durante a coleta de strings. No MySQL, voc pode escrever e strings utilizando os caracteres ou " (por exemplo, hello ou "goodbye"), e o mysql permite a entrada de strings que consomem mltiplas linhas. Quando voc ver um prompt u e > ou ">, signica que voc digitou uma linha contendo uma string que comea com um e c caracter de aspas ou " mas ainda no entrou com a aspas que termina a string. Isto a bom se voc realmente est entrando com uma string com mltiplas linhas, mas qual e e a u e a probalidade disto acontecer ? No muita. Geralmente, os prompts > e "> indicam que a voc, por algum descuido, esqueceu algum caracter de aspas. Por exemplo: e mysql> SELECT * FROM minha_tabela WHERE nome = "Smith AND idade < 30; "> Se voc entrar esta sentena SELECT, apertar ENTER e esperar pelo resultado, nada ir e c a acontecer. Em vez de se perguntar o porqu desta query demorar tanto tempo, perceba a e pista fornecida pelo prompt ">. Ele lhe diz que o mysql espera pelo resto de uma string no terminada. (Voc ve o erro na declarao? Falta a segunda aspas na string "Smith.) a e ca O que fazer neste ponto ? A coisa mais simples cancelar o comando. Entretanto, voc e e no pode simplesmente digitar \c neste caso, porque o mysql o intrerpreta como parte da a string que est coletando! Digite o caracter de aspas para fechar (ento o mysql sabe que a a voc fechou a string), ento digite \c: e a mysql> SELECT * FROM minha_tabela WHERE nome = "Smith AND idade < 30; "> "\c mysql> O prompt volta para mysql>, indicando que o mysql est pronto para um novo comando. a O prompt > similar aos prompts > e ">, mas indica que voc comeou mas no completou e e c a um identicados citado com o sinal de crase. E importante saber o que os prompts >, "> e > signicam, porque se voc entrar sem e querer com uma string sem terminao, quaisquer linhas seguintes que forem digitadas ca sero ignoradas pelo mysql incluindo uma linha contendo QUIT! Isto pode ser um pouco a confuso, especialmente se voc no sabe que voc precisa fornecer as aspas nais antes poder e a e cancelar o comando atual.
173
O banco de dados menagerie ser simples (deliberadamente), mas no dif a a e icil pensar em situaes na vida real em que um tipo similar de banco de dados pode co ser usado. Por exemplo, um banco de dados deste tipo pode ser usado por um fazendeiro para gerenciar seu estoque de animais, ou por um veterinrio para a gerenciar registros de seus pacientes. Uma distribuio do menagerie contendo ca algumas das consultas e dados de exemplos usados nas sees seguintes podem ser co obtidas do site Web do MySQL. Esto dispon a iveis tanto no formato tar comprimido (http://www.mysql.com/Downloads/Contrib/Examples/menagerie.tar.gz) como no formato Zip (http://www.mysql.com/Downloads/Contrib/Examples/menagerie.zip). Utilize a instruo SHOW para saber quais bancos de dados existem atualmente no servidor: ca mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | | tmp | +----------+ A lista de bancos de dados provavelmente ser diferente na sua mquina, mas os bancos de a a dados mysql e test provavelmente estaro entre eles. O banco de dados mysql necessrio a e a porque ele descreve privilgios de acessos de usurios. O banco de dados test geralamente e a e fornecido como um espao para que os usurios possam fazer testes. c a Note que voc no pode ver todos os banco de dados se voc ni tiver o privilgio SHOW e a e a e DATABASES. Veja Seo 4.4.1 [GRANT], Pgina 254. ca a Se o banco de dados test existir, tente acess-lo: a mysql> USE test Database changed Perceba que o USE, como o QUIT, no necessitam de um ponto e v a irgula. (Voc pode e terminar tais declaraes com uma ponto e v co irgula se gostar; isto no importa) A instruo a ca USE especial em outra maneira, tambm: Ela deve ser usada em uma unica linha. e e Voc opde usar o banco de dados test (Se voc tiver acesso a ele) para os exemplos que e e seguem mas qualquer coisa que voc criar neste banco de dados pode ser removido por e qualquer um com acesso a ele. Por esta razo, voc provavelmente deve pedir permisso a e a ao seu administrador MySQL para usar um banco de dados prprio. Suponha que voc o o e chame de menagerie. O administrador precisar executar um comando como este: mysql> GRANT ALL ON menagerie.* TO your_mysql_name@your_client_host; onde seu_usurio_mysql o nome do usurio MySQL atribuido a voc e your_client_ a e a e host a mquina da qual voc se conecta ao servidor. e a e
174
mysql> CREATE DATABASE menagerie; No Unix, nomes de bancos de dados so caso sensitivo (ao contrrio das palavras chave a a SQL), portanto voc deve sempre fazer referncia ao seu banco de dados como menagerie e e e no Menagerie, MENAGERIE ou outra variao. Isto tambm verdade para nomes de a ca e e tabelas. (No Windows, esta restrio no se aplica, entiretanto voc deve referenciar os ca a e bancos de dados e tabelas usando o mesmo caso em toda a parte da consulta.) Criar um bancos de dados no o seleciona para o uso; voc deve fazer isso de forma expl a e icita. Para fazer o menagerie o banco de dados atual, use o comando: mysql> USE menagerie Database changed Seu banco de dados necessita ser criado somente uma unica vez, mas voc deve selecion-lo e a para o uso cada vez que voc iniciar uma seo mysql. Voc pode fazer isso usando a e ca e instruo USE como visto no exemplo. Uma forma alternativa selecionar o banco de dados ca e na linha de comando quando voc chamar o mysql. Apenas especique seu nome depois de e qualquer parmetro de conexo que voc pode precisar fornecer. Por exemplo: a a e shell> mysql -h servidor -u usuario -p menagerie Enter password: ******** Perceba que menagerie no sua senha no comando mostrado. Se voc precisar passar sua a e e senha na linha de comando depois da opo -p, voc deve faz-lo sem usar espaos (por ca e e c exemplo, -pminhasenha e no como em -p minhasenha). Entretando, colocando sua senha a na linha de comando no recomendado, porque isto expe sua senha permitindo que outro a e o usurio utilize a sua mquina. a a
175
Voc pode usar o banco de dados para tarefas como gerar lembretes para aniversrios e a que esto chegando. (Se voc pensa que este tipo de query algo bobo, perceba que a e e a mesma questo que voc perguntar no contexto de um banco de dados comercial e a e para identicar clientes para quais voc precisar enviar carto de aniversrio, para um e a a a toque pessoal assistido pelo computador.) Voc pode calcular a idade em relao a outras datas diferente da data atual. Por e ca exemplo, se voc armazenar a data da morte no banco de dados, voc poder facilmente e e a calcular qual a idade que o bicho tinha quando morreu. Voc provavelmente pode pensar em outros tipos de informaes que podero ser uteis e co a na tabela pet, mas as identicadas at o momento so sucientes por agora: nome(name), e a dono(owner), espcie(species), sexo(sex), data de nascimento(birth) e data da morte(death). e Utilize a sentea CREATE TABLE para especicar o layout de sua tabela: c mysql> CREATE TABLE pet (nome VARCHAR(20), owner VARCHAR(20), -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE); VARCHAR uma boa escolha para os campos name, owner, e species porque os valores da e coluna so de tamanho varivel. Os tamanhos destas colunas no precisam necessriamente a a a a de ser os mesmos e no precisam ser 20. Voc pode escolher qualquer tamanho de 1 a 255, a e o que voc achar melhor. (Se voc no zer uma boa escolha e depois precisar de um campo e e a maior, o MySQL fornece o comando ALTER TABLE.) O sexo dos animais podem ser representados em vrias formas, por exemplo, "m" e "f" ou a mesmo "macho" e "f^mea". E mais simples usar os caracteres "m" e "f". e O uso do tipo de dados DATE para as colunas birth e death so obviamente a melhor a escolha. Agora que voc criou uma tabela, a instruo SHOW TABLES deve produzir alguma sa e ca ida: mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | pet | +---------------------+ Para vericar se sua tabela foi criada da forma que voc esperava, utilize a instruo e ca DESCRIBE: mysql> DESCRIBE pet; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ Voc pode usar DESCRIBE a qualquer hora, por exemplo, se voc esquecer os nomes das e e colunas na sua tabela ou de que tipos elas tm. e
176
1995-07-29
Como voc est comeando com uma tabela vazia, uma forma simples de povo-la criar e a c a e um arquivo texto contendo uma linha para cada um de seus animais, e depois carregar o contedo do arquivo para a tabela com uma simples instruo. u ca Voc pode criar um arquivo texto pet.txt contendo um registro por linha, com valores e separado por tabulaes e na mesma ordem em que as colunas foram listadas na instruo co ca CREATE TABLE. Para valores em falta (como sexo desconhecido ou data da morte para animais que ainda esto vivos), voc pode usar valores NULL. Para represent-lo em seu a e a arquivo texto, use \N (barra invertidam N maiusculo). Por exemplo, o registro para Whistler the bird podem parecer com isto (onde o espao em branco entre os valores um simples c e caractere de tabulao): ca 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 pode especicar o valor do separador de colunas e o marcador de nal de linha explicie tamente na instruo LOAD DATA se voc desejar. Mas os valores omitidos so sucientes ca e a para a instruo ler o arquivo pet.txt corretamente. ca Se a instruo falhar, desejvel que a sua instalao do MySQL no tenha a capacidade ca e a ca a do arquivo local habilitada por padro. Veja Seo 4.3.4 [LOAD DATA LOCAL], Pgina 231 a ca a para informaes sobre como alterar isto. co Quando voc desejar adicionar novos registros um a um, a instruo INSERT usada. Na e ca e sua forma mais simples, voc fornece valores para cada coluna, na ordem em que as colunas e foram listadas na instruo CREATE TABLE. Suponha que Diane tenha um novo hamster ca chamado Puball. Voc pode adicionar um registro utilizando uma instruo INSERT desta e ca forma: mysql> INSERT INTO pet -> VALUES (Puffball,Diane,hamster,f,1999-03-30,NULL);
177
Perceba que os valores de string e datas so especicados aqui como strings com aspas. a Com o INSERT voc tambm pode inserir NULL diretamente para representar um valor em e e falta. No pode ser usado \N como voc fez com LOAD DATA. a e A partir deste exemplo, voc dever perceber que existem vrias outras formas envolvidas e a a para carregar seus registros inicialmente utilizando diversas instrues INSERT do que uma co simples instruo LOAD DATA. ca
178
Entretanto, se voc zer isto, voc tambm deve refazer a entrada para Puball. e e e Corrigir somente o registro errado com uma instruo UPDATE: ca mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser"; O UPDATE altera apenas o registro em questo e no exige que voc recarregue a tabela. a a e
179
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 precedncia que OR. Se voc usar e e ambos os operadores, uma tima idia usar parnteses para indicar explicitamente quais e o e e condies devem ser agrupadas: co mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m") -> OR (species = "dog" AND sex = "f"); +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
180
| Gwen | | Harold | | Benny | | Diane | | Gwen | | Gwen | | Benny | | Diane | +--------+ Entretanto, perceba que a query simplesmente retornou o campo owner de cada registro, e alguns deles apareceram mais de uma vez. Para minimizar a sa ida, recupere cada registro apenas uma vez, adicionando a palavra chave DISTINCT: mysql> SELECT DISTINCT owner FROM pet; +--------+ | owner | +--------+ | Benny | | Diane | | Gwen | | Harold | +--------+ Voc pode usar uma clusula WHERE para combinar seleo de registros com seleo de e a ca ca colunas. Por exemplo, para obter a data de nascimento somente dos gatos e cachorros, utilize esta query: mysql> SELECT name, species, birth FROM pet -> WHERE species = "dog" OR species = "cat"; +--------+---------+------------+ | name | species | birth | +--------+---------+------------+ | Fluffy | cat | 1993-02-04 | | Claws | cat | 1994-03-17 | | Buffy | dog | 1989-05-13 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 | +--------+---------+------------+
181
| 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, ordenaio como qualquer outra operao de comparao ca ca ca normalmente realizada no modo caso insensitivo. Isto signica que a ordem ser ine a denida para colunas que so idnticas exceto quanto ao caso da letra. Voc pode forar a e e c uma ordenao em caso senitivo para uma coluna usando a coero BINARY: ORDER BY ca ca BINARY(campo). A ordenao padro crescente, com os valores menores em primeiro. Para ordenao na ca a e ca ordem reversa, adicione a palavra chave DESC (descendente) ao nome da coluna que deve ser ordenada: mysql> SELECT name, birth FROM pet ORDER BY birth DESC; +----------+------------+ | name | birth | +----------+------------+ | Puffball | 1999-03-30 | | Chirpy | 1998-09-11 | | Whistler | 1997-12-09 | | Slim | 1996-04-29 | | Claws | 1994-03-17 | | Fluffy | 1993-02-04 | | Fang | 1990-08-27 | | Bowser | 1989-08-31 | | Buffy | 1989-05-13 | +----------+------------+ Voc pode ordenar por mltiplas colunas e voc pode classicar colunas em direes difere u e co entes. Por exemplo, para ordenar o tipo de animal em ordem crescente, depois por dia de nascimento dentro do tipo de animal em ordem decrescente (com os mais novos primeiro), utilize a seguinte consulta: mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC; +----------+---------+------------+ | name | species | birth | +----------+---------+------------+ | Chirpy | bird | 1998-09-11 | | Whistler | bird | 1997-12-09 | | Claws | cat | 1994-03-17 | | Fluffy | cat | 1993-02-04 |
182
| 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 no afeta a ordenao da coluna species. a ca
183
-> (YEAR(CURDATE())-YEAR(birth)) -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) -> AS age -> FROM pet ORDER BY name; +----------+------------+------------+------+ | name | birth | CURDATE() | age | +----------+------------+------------+------+ | Bowser | 1989-08-31 | 2003-08-19 | 13 | | Buffy | 1989-05-13 | 2003-08-19 | 14 | | Chirpy | 1998-09-11 | 2003-08-19 | 4 | | Claws | 1994-03-17 | 2003-08-19 | 9 | | Fang | 1990-08-27 | 2003-08-19 | 12 | | Fluffy | 1993-02-04 | 2003-08-19 | 10 | | Puffball | 1999-03-30 | 2003-08-19 | 4 | | Slim | 1996-04-29 | 2003-08-19 | 7 | | Whistler | 1997-12-09 | 2003-08-19 | 5 | +----------+------------+------------+------+ Para ordenar a sa por age em vez de name, s utilizar uma clusua ORDER BY diferente: ida e o a mysql> SELECT name, birth, CURDATE(), -> (YEAR(CURDATE())-YEAR(birth)) -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) -> AS age -> FROM pet ORDER BY age; +----------+------------+------------+------+ | name | birth | CURDATE() | age | +----------+------------+------------+------+ | Chirpy | 1998-09-11 | 2003-08-19 | 4 | | Puffball | 1999-03-30 | 2003-08-19 | 4 | | Whistler | 1997-12-09 | 2003-08-19 | 5 | | Slim | 1996-04-29 | 2003-08-19 | 7 | | Claws | 1994-03-17 | 2003-08-19 | 9 | | Fluffy | 1993-02-04 | 2003-08-19 | 10 | | Fang | 1990-08-27 | 2003-08-19 | 12 | | Bowser | 1989-08-31 | 2003-08-19 | 13 | | Buffy | 1989-05-13 | 2003-08-19 | 14 | +----------+------------+------------+------+ Uma consulta similar pode ser usada para determinar a idade na morte para animais que morreram. Para determinar quais so os animais, conra se o valor de death no NULL. a a e Depois para estes com valores no-NULL, compute a diferena entre os valores dos campos a c death e birth: mysql> SELECT name, birth, death, -> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5)) -> AS age -> FROM pet WHERE death IS NOT NULL ORDER BY age; +--------+------------+------------+------+ | name | birth | death | age |
184
+--------+------------+------------+------+ | Bowser | 1989-08-31 | 1995-07-29 | 5 | +--------+------------+------------+------+ A consulta usa death IS NOT NULL em vez de death != NULL porque NULL um valor ese pecial que no pode ser comparada usando operadores comuns de comparao. Isto ser a ca a explicado depois. Veja Seo 3.3.4.6 [Working with NULL], Pgina 185. ca a E se voc desejar saber quais animais fazem aniversrio no prximo ms? Para este tipo e a o e de clculo, ano e dia so irrelevantes; voc simplesmente deseja extrair a parte do ms da a a e e coluna birth. O MySQL fornece diversas funes para extrair partes da data, como em co YEAR(), MONTH() e DAYOFMONTH(). MONTH a funo apropriada aqui. Para ver como ela e ca funciona, execute uma consulta simples que mostre o valor de birth e MONTH(birth): mysql> SELECT name, birth, MONTH(birth) FROM pet; +----------+------------+--------------+ | name | birth | MONTH(birth) | +----------+------------+--------------+ | Fluffy | 1993-02-04 | 2 | | Claws | 1994-03-17 | 3 | | Buffy | 1989-05-13 | 5 | | Fang | 1990-08-27 | 8 | | Bowser | 1989-08-31 | 8 | | Chirpy | 1998-09-11 | 9 | | Whistler | 1997-12-09 | 12 | | Slim | 1996-04-29 | 4 | | Puffball | 1999-03-30 | 3 | +----------+------------+--------------+ Encontrar animais com an iversrio no prximo ms tambm fcil. Suponha que o ms a o e e e a e atual abril. Ento o valor do ms 4 e voc procura por animais nascidos em Maio (ms e a e e e e 5) assim: mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5; +-------+------------+ | name | birth | +-------+------------+ | Buffy | 1989-05-13 | +-------+------------+ Existe uma pequena complicao se o ms atual Dezembro, claro. Voc no pode apenas ca e e e e a adicionar um para o nmero do ms (12) e procurar por animais nascidos no ms 13, porque u e e no existe tal ms. O certo seria procurar por animais nascidos em Janeiro (ms 1). a e e Voc pode tambm escrever uma consulta para que funcione sem importar qual o ms e e e e atual. Assim voc no tm quee usar um nmero de ms em particular na consulta. DATE_ e a e u e ADD() permite adicionar um intervalo de tempo para uma data fornecida. Se voc adicionar e um ms para o valor de CURDATE, ento extrair a parte do ms com MONTH(), o resultado e a e e o ms no qual voc deseja procurar por aniversrios: e e a mysql> SELECT name, birth FROM pet -> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(), INTERVAL 1 MONTH));
185
Uma maneira diferente para realizar a mesma tarefa adicionar 1 para obter o ms seguinte e e ao atual (depois de usar a funo mdulo (MOD) para o valor do ms retornar 0 se ele for ca o e 12): mysql> SELECT name, birth FROM pet -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1; Perceba que MONTH retorna um nmero entre 1 e 12. E MOD(alguma_coisa,12) retorna um u nmero entre 0 e 11. Ento a adio tem que ser feita depois do MOD(), seno ir u a ca a iamos de Novembro (11) para Janeiro (1).
186
A combinao de padres SQL lhe permite voc usar _ para coincidir qualquer caractere ca o e simples e % para coincidir um nmero arbitrrio de caracteres (incluindo zero caracter). u a No MySQL, padres SQL so caso insensitivo por padro. Alguns exemplos so vistos o a a a abaixo. Perceba que voc no usa = ou != quando usar padres SQL; use os operadores de e a o comparao LIKE ou NOT LIKE neste caso. ca Para encontrar nomes comeando com b: c mysql> SELECT * FROM pet WHERE name LIKE "b%"; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+ Para encontrar nomes com o 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 instncias do caraca ter _: mysql> SELECT * FROM pet WHERE name LIKE "_____"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+ O outro tipo de combinao de padres fornecido pelo MySQL usa expresses regulares ca o o extendidas. Quando voc testa por uma combinao para este tipo de padro, utilize os e ca a operadores REGEXP e NOT REGEXP (ou RLIKE e NOT RLIKE, que so sinnimos). a o Algumas caracter isticas das expresses regulares extendidas so: o a . combina qualquer caractere unico
187
Uma classe de caracteres [...] combina qualquer caractere que consta dentro dos colchetes. Por exemplo, [abc] combina com a, b, ou c. Para nomear uma sequncia de caracteres utilize um trao. [a-z] combina com qualquer letra e [0-9] e c combina com qualquer d igito. * combina com nenhuma ou mais instncias de sua precedncia. Por exemplo, x* a e combina com qualquer nmero de caracteres x, [0-9]* combina com qualquer u nmero de d u igitos e .* combina com qualquer nmero de qualquer coisa. u Um padro REGEXP casa com sucesso se ele ocorre em algum lugar no valor sendo a testado. (Ele difere do padro LIKE, que s obtem suceeso se eles combinarem com a o todo o valor.) Para fazer com que um padro deva combinar com o comeo ou o m de um valor a c sendo testado, utilize ^ no comeo ou $ no nal do padro. c a Para demonstrar como expresses regulares extendidas funcionam, as consultas com LIKE o mostradas acima foram reescritas abaixo usando REGEXP. Para encontrar nomes comeando com b, utilize ^ para combinar com o comeo do nome: c c mysql> SELECT * FROM pet WHERE name REGEXP "^b"; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+ Antes da verso 3.23.4 do MySQL, REGEXP era caso sensitivo, e a consulta anterior no iria a a retornar nenhum registro. Neste caso, para combinar letras b maisculas e minsculas, u u utilize esta consulta: mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]"; A partir do MySQL 3.23.4, se voc realmente deseja forar uma comparao REGEXP com e c ca caso sensitivo, utilize a palavra-chave BINARY para tornar uma das strings em uma string binrias. Esta consulta ir combinar somente com bs minsculos no comeo de um nome: a a u c 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 | +----------+-------+---------+------+------------+------------+
188
| 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 expresso regular extendida encontra padres coincidentes se eles ocorrem em a o qualquer lugar no valor comparado, no necessrio utiliar, na consulta anterior, nenhum a e a metacaracter em nenhum dos lados do padro para faz-lo coincidir com todo o valor, como a e seria feito se fosse utilizado o padro SQL. a Para encontrar nomes contendo exatamente cinco caracteres, utilize ^ e $ para combinar com o comeo e m do nome e cinco instncias de . entre eles. c a mysql> SELECT * FROM pet WHERE name REGEXP "^.....$"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+ Voc pode tambm escrever a consulta anterior utilizando o operador {n} repete-n-vezes: e e mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
189
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; +--------+----------+ | owner | COUNT(*) | +--------+----------+ | Benny | 2 | | Diane | 2 | | Gwen | 3 | | Harold | 2 | +--------+----------+ Perceba o uso de GROUP BY para agrupar todos os registros para cada owner (dono). Sem ele, voc teria uma mensagem de erro: e mysql> SELECT owner, COUNT(*) FROM pet; ERROR 1140: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause COUNT() e GROUP BY so uteis para personalizar seus dados de diversas maneiras. Os a seguintes exemplos mostram diferentes maneiras para realizar operaes de censo nos anico mais. Nmero de animais por espcie: u e mysql> SELECT species, COUNT(*) FROM pet GROUP BY species; +---------+----------+ | species | COUNT(*) | +---------+----------+ | bird | 2 | | cat | 2 | | dog | 3 | | hamster | 1 | | snake | 1 | +---------+----------+ Nmero de animais por sexo: u mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex; +------+----------+ | sex | COUNT(*) | +------+----------+ | NULL | 1 | | f | 4 | | m | 4 | +------+----------+ (Nesta sa ida, NULL indica que o sexo desconhecido.) e Nmero de animais combinando espcie e sexo: u e mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | NULL | 1 | | bird | f | 1 |
190
| cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+ No necessrio selecionar uma tabela inteira quando estiver usando COUNT(). Por exemplo, a e a a consulta anterior, quando realizada apenas procurando por cachorros e gatos, se parece com isto: mysql> SELECT species, sex, COUNT(*) FROM pet -> WHERE species = "dog" OR species = "cat" -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | +---------+------+----------+ Ou se voc desejar saber o nmero de animais por sexo somente de animais com sexo e u conhecido: mysql> SELECT species, sex, COUNT(*) FROM pet -> WHERE sex IS NOT NULL -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
191
Um campo para descrever o evento. Um campo com o tipo de evento, se voc desejar classic-los por categoria. e a Dadas estas consideraes, a instruo CREATE TABLE para a tabela event deve se parecer co ca com isto: mysql> CREATE TABLE event (name VARCHAR(20), date DATE, -> type VARCHAR(15), remark VARCHAR(255)); Como na tabela pet, mais fcil carregar os registros iniciais criando um arquivo texto e a delimitado por tabulaes contendo a informao: co ca 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 j aprendeu com as consultas realizadas na tabela pet, voc deve estar e a e apto para realizar pesquisas na tabela event; os princ ipios so o mesmo. Mas quando a a tabela event, sozinha, insuciente para responder `s suas questes? e a o 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 deseje descobrir as idades de cada animal quando eles tiveram cria. Ns e o vemos logo que poss calcular a idade a partir das duas datas. A idade dos lhotes est e ivel a na tabela event, mas para calcular a idade da me, voc precisar da data de nascimento a e a dela, que est armazenado na tabela pet. Isto signica que voc precisar das duas tabelas a e a para a consulta: mysql> SELECT pet.name, -> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age, -> remark -> FROM pet, event -> WHERE pet.name = event.name AND type = "litter"; +--------+------+-----------------------------+ | name | age | remark | +--------+------+-----------------------------+ | Fluffy | 2 | 4 kittens, 3 female, 1 male | | Buffy | 4 | 5 puppies, 2 female, 3 male | | Buffy | 5 | 3 puppies, 3 female |
192
+--------+------+-----------------------------+ Existem vrias coisas que devem ser percebidas sobre esta consulta: a A clusula FROM lista as duas tabelas porque a consulta precisa extrair informao de a ca ambas. Quando combinar (unir) informaes de mltiplas tabelas, voc precisa especicar como co u e registros em uma tabela podem ser coincididas com os registros na outra. Isto simples e porque ambas possuem uma coluna name. A consulta utiliza a clusula WHERE para a coincidir registros nas duas tabelas baseadas nos valores de name. Como a coluna name ocorre em ambas tabelas, voc deve especicar qual a tabela a que e voc est se referindo. Isto feito usando o nome da tabela antes do nome da coluna e a e separados por um ponto (.). Voc no precisa ter duas tabelas diferentes para realizar uma unio. Algumas vezes util e a a e unir uma tabela a ela mesma, se voc deseja comparar registros em uma tabela com outros e registros na mesma tabela. Por exemplo, para encontrar pares entre seus animais, voc e pode unir a tabela pet com ela mesma para produzir pares candidatos de machos e fmeas e de acordo com as espcies: e mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species -> FROM pet AS p1, pet AS p2 -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m"; +--------+------+--------+------+---------+ | name | sex | name | sex | species | +--------+------+--------+------+---------+ | Fluffy | f | Claws | m | cat | | Buffy | f | Fang | m | dog | | Buffy | f | Bowser | m | dog | +--------+------+--------+------+---------+ Nesta consulta, ns especicamos apelidos para os nomes das tabelas para conseguir refo erenciar `s colunas e manter com qual instncia da tabela cada coluna de referncia est a a e a associdada.
193
Se voc ainda no selecionou nenhum banco de dados ainda, o resultado NULL. (ou a e a e string vazia antes do MySQL 4.1.1). Para saber quais tabelas o banco de dados atual contm (por exemplo, quando voc no e e a tem certeza sobre o nome de uma tabela), utilize este comando: mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | event | | pet | +---------------------+ Se voc deseja saber sobre a estrutura de uma tabela, o comando DESCRIBE util; ele mostra e e informaes sobre cada uma das colunas da tabela: co mysql> DESCRIBE pet; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ A coluna Field (campo) indica o nome da coluna, Type o tipo de dados para a coluna, e Null indica se a coluna pode conter valores nulos (NULL), key indica se a coluna indexada e ou no e Default especica o valor padro da coluna. a a Se voc tem indices em uma tabela, SHOW INDEX FROM tbl_nome traz informaes sobre eles. e co
194
Quando voc utilizar o mysql desta forma, voc estar criando um arquivo script, depois e e a executando o script. Se voc quiser que o script continue mesmo se hopuver erros, voc deve usar a opo de e e ca linha de comando --force. Por que usar um script? Existem vrias razes: a o Se voc executa uma query repetidamente (digamos, todos os dias ou todas as semanas), e transform-lo em um script permite que voc no o redigite toda vez que o executa. a e a Voc pode gerar novas consultas a partir das j existentes copiando e editando os e a arquivos de script. O modo batch pode tambm ser util quando voc estiver desenvolvendo uma consulta, e e particularmente para comandos de mltiplas linhas ou sequncias de comandos com u e vrias instrues. Se voc cometer um erro, no ser necessrio redigitar tudo. Apenas a co e a a a edite seu arquivo script e corrija o erro, depois diga ao mysql para execut-lo novamente. a Se voc tem uma query que produz muita saida, voc pode encaminhar a sa atravs e e ida e de um pginador. a shell> mysql < batch-file | more Voc pode capturar a sa em um arquivo para processamento posterior: e ida shell> mysql < batch-file > mysql.out Voc pode distribuir seu script para outras pessoas para que elas possam executar os e comandos tambm. e Algumas situaes no permitem uso interativo, por exemplo, quando voc executa co a e uma consulta atravs de um processo automtico (cron job). Neste caso, voc deve e a e usar o modo batch. A formato padro de sa diferente (mais conciso) quando voc executa o mysql no modo a ida e e batch do que quando voc o usa interativamente. Por exemplo, a sa de SELECT DISTINCT e ida species FROM pet se parece com isto quando voc o executa interativamente: e +---------+ | species | +---------+ | bird | | cat | | dog | | hamster | | snake | +---------+ Mas ca assim quando voc o executa no modo batch: e species bird cat dog hamster snake Se voc desejar obter o formato de sa interativa no modo batch, utilize mysql -t. Para e ida dos comandos que so executados, utilize mysql -vvv. mostrar a saida a
195
Voc tambm pode utilizar scripts no prompt de linha de comando mysql usando o comando e e source: mysql> source filename;
196
+---------+ | 4 | +---------+
3.6.2 O Registro que Armazena o Valor Mximo para uma Coluna a Determinada
Encontre o nmero, fornecedor e preo do u c item mais caro. No SQL ANSI isto feito fcilmente com uma sub-consulta: e a SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop); No MySQL (que ainda no suporta sub-selects), faa isto em dois passos: a c 1. Obtenha o valor do preo mximo da tabela com uma instruo SELECT. c a ca mysql> SELECT MAX(price) FROM shop; +------------+ | MAX(price) | +------------+ | 19.95 | +------------+ 2. Usando o valor 19.95 mostrado pela consulta anterior como o preo mximo do artigo, c a grave uma consulta para localizar e mostrar o registro correspondente: mysql> SELECT article, dealer, price -> FROM shop -> WHERE price=19.95; +---------+--------+-------+ | article | dealer | price | +---------+--------+-------+ | 0004 | D | 19.95 | +---------+--------+-------+ Outra soluo ordenar todos os registros por preo de forma descendente e obtenha soca e c mente o primeiro registro utilizando a clusula espec a 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 preo de 19.95, a soluo c ca LIMIT mostra somente um deles !
197
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 | +---------+-------+
198
SELECT article, SUBSTRING( MAX( CONCAT(LPAD(price,6,0),dealer) ), 7) AS dealer, 0.00+LEFT( MAX( CONCAT(LPAD(price,6,0),dealer) ), 6) AS price FROM shop GROUP BY article; +---------+--------+-------+ | article | dealer | price | +---------+--------+-------+ | 0001 | B | 3.99 | | 0002 | A | 10.99 | | 0003 | C | 1.69 | | 0004 | D | 19.95 | +---------+--------+-------+ O ultimo exemplo pode, claro, ser feito de uma maneira mais eciente fazendo a separao e ca da coluna concatenada no cliente.
199
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 |
200
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 | +----+-------+--------+-------+
201
O seguinte exemplo mostra como voc pode usar as funes binrias de agrupamento para e co a calcular o nmero de dias por ms que um usurio tem visitado uma pgina web. u e a a CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL, day INT(2) UNSIGNED Z INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),(2000,2,23),(2000 A tabela exemplo contm valores ano-ms-dia representando visitas feitas pelos usurios a e e a pgina. Para determinar quantos quantos dias diferentes em cada ms estas visitas ocorriam, a e use esta consulta: SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month; que retornar: a +------+-------+------+ | year | month | days | +------+-------+------+ | 2000 | 01 | 3 | | 2000 | 02 | 2 | +------+-------+------+ O exemplo acima calcula quantos dias diferentes foram usados para uma combinao ca fornecida de ms/ano, com remoo automtica de entradas duplicadas. e ca a
202
linhas LAST_INSERT_ID()/mysql_insert_id() retornar atualmente a AUTO_INCREMENT a chave da primeira linha inserida. Isto permite que inseres multi-linhas sejam reproduzidas co corretamente em outros servidores em uma congrao de replicao. ca ca Para tabelas MyISAM e BDB voc pode especicar AUTO_INCREMENT em uma coluna secundria e a em um indice multi-coluna. Neste caso, o valor gerado para a coluna AUTO_INCREMENT e calculado como MAX(auto_increment_column)+1) WHERE prefix=given-prefix. Isto e util quando voc quer colocar dados em grupos ordenados. e CREATE TABLE animals ( grp ENUM(fish,mammal,bird) NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ); INSERT INTO animals (grp,name) VALUES("mammal","dog"),("mammal","cat"), ("bird","penguin"),("fish","lax"),("mammal","whale"), ("bird","ostrich"); SELECT * FROM animals ORDER BY grp,id; Que retorna: +--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich | +--------+----+---------+ Note que neste caso (quando o valor AUTO_INCREMENT parte de um e indice multi-coluna), o valor de AUTO_INCREMENT ser reutilizado se voc deletar a linha com o maior valor AUTO_ a e INCREMENT em qualquer grupo. Isto caontece mesmo para tabelas MyISAM, para as quais os valores AUTO_INCREMENT normalmente no so reusados.) a a
203
e coletas de histrico familiar. Adicionalmente, dados so coletados em fatores de riscos o a mdicos e ambientais. e Mais informaes sobre o estudos dos gmeos pode ser encontrados em: co e http://www.mep.ki.se/twinreg/index_en.html A parte posterior do projeto administrada com uma interface Web escrita utilizando a e linguagem Perl e o MySQL. Cada noite todos dados das entrevistas so movidos para um banco de dados MySQL. a
204
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
205
OR h.status = Died OR h.status = Other) ORDER BY tvid; Algumas explicaes: co CONCAT(p1.id, p1.tvab) + 0 AS tvid N queremos ordenar o id e o tvab concatenados na ordem numrica. Adicioe nando 0 ao resultado faz o MySQL tratar o resultado como um nmero. u coluna id Esta identica um par de gmeos. Ela uma chave em todas as tabelas. e e column tvab Esta identica um gmeo em um par. Ela pode ter um valor de 1 ou 2. e column ptvab Esta o inverso de tvab. Quando tvab 1 este campo 2 e vice versa. Ela e e e existe para poupar digitao e tornar mais fcil para o MySQL otimizar a query. ca a Esta consulta demonstra, entre outras coisas, como fazer buscas em uma tabela a partir da mesma tabela com uma uniao (p1 e p2). No exemplo, isto usado para conferir se um par e de um gmeo morreu antes de 65 anos. Se for verdade, a linha no retornada. e a e Tudo acima existe em todas as tabelas com informaes relacionada aos gmeos. Ns temos co e o uma chave em ambos id,tvab (todas as tabelas) e id,ptvab (person_data) para tornar as consultas mais rpidas. a Na nossa mquina de produo (Um UltraSPARC 200MHz), esta consulta retorna entre a ca 150-200 linhas e gasta menos que um segundo. O nmero atual de registros nas tabelas usadas acima: u Tabela Registros person_data 71074 lentus 5291 twin_project 5286 twin_data 2012 informant_data 663 harmony 381 postal_groups 100
206
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;
207
-b, --basedir=path Encaminho para o diretrio de instalao. Todos os caminhos normalmente so o ca a resolvidos em relao a este. ca --big-tables Permite grandes conjuntos de resultados salvando todos os conjuntos temporrios em um arquivo. Ele resolve a maioria dos erros table full, mas a tambm abaixa a velocidade das consultas nas quais as tabelas em memria e o seriam sucientes. Desde a Verso 3.23.2, o MySQL capaz de resolver isto aua e tomaticamente usando memria para pequenas tabelas temporrias e trocando o a para o disco as tabelas, quando for necessrio. a --bind-address=IP Endereo IP para ligar. c --console Grava a mensagem de erro no stderr/stdout mesmo se --log-error espee cado. No Windows o mysqld no fechar a tela de console se esta opo a a ca e usada. --character-sets-dir=path Diretrio onde esto os conjuntos de caracteres. Veja Seo 4.7.1 [Conjunto de o a ca caracteres], Pgina 325. a --chroot=path Coloca o daemon mysqld no diretorio chroot durante a inicializao. Medida ca de segurana recomendada desde o MySQL 4.0 (MySQL 3.23 no est apto a c a a fornecer um chroot 100% fechado. Limita os comandos LOAD DATA INFILE e SELECT ... INTO OUTFILE.
208
--core-file Grava um arquivo core se o mysqld morrer. Para alguns sistemas voc deve e tambm especicar --core-file-size para mysqld_safe. Veja Seo 4.8.2 e ca [mysqld_safe], Pgina 331. Note que em alguns sistemas, como Solaris, voc a e no consiguir um arquivo core se voc tambm estiver usando a opo --user. a a e e ca -h, --datadir=caminho Encaminha para o diretrio raiz dos bancos de dados. o --debug[...]= Se o MySQL est congurado com --with-debug, voc pode usar esta opo a e ca para obter um arquivo de rastreamento indicando o que o mysqld est fazendo. a Veja Seo E.1.2 [Criando arquivos trace], Pgina 1080. ca a --default-character-set=conjunto_caracter Congura o conjunto de caracteres padro. Veja Seo 4.7.1 [Conjunto de a ca caracteres], Pgina 325. a --default-table-type=tipo Congura o tipo de tabela padro. Veja Cap a ptexi tulo 7 [Tipos de tabelas], Pgina 630. a --delay-key-write[= OFF | ON | ALL] Como o DELAYED KEYS do MyISAM deve ser usado. [Parmetros do servidor], Pgina 454. a a Veja Seo 5.5.2 ca
--delay-key-write-for-all-tables; No MySQL 4.0.3 voc^ deve usar e --delay-key-write=ALL. No descarrega buers das chaves entre escritas em nenhuma tabela MyISAM. a Veja Seo 5.5.2 [Parmetros do servidor], Pgina 454. ca a a --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 opo em um sistema ca que no possui um lockd() completamente funcional (como no Linux) voc pode a e fazer com que o mysqld entre em deadlock. --enable-named-pipe Habilita suporte para named pipes (somente no NT/Win2000/XP). -T, --exit-info Esta uma mscara binria com diferntes parmetros que pode ser usada para e a a e a depurar o servidor mysqld; Esta opo no deve ser usada por algum que no ca a e a a conhea muito bem! c --flush Atualiza todas as alteraes no disco depois de cada comando SQL. Normalco mente o MySQL s faz a escrita de todas as alteraes no disco depois de cada o co comando SQL e deixa o sistema operacional lidar com a sincronizao com o ca disco. Veja Seo A.4.1 [Falhas], Pgina 925. ca a
209
-?, --help Mostra uma pequena ajuda e sai. --init-file=arquivo L comandos SQL do arquivo especicado na inicializao. e ca -L, --language=... Mensagens de erro do cliente na l ingua especicada. Pode ser fornecido como um caminho completo. Veja Seo 4.7.2 [L ca inguas], Pgina 327. a -l, --log[=arquivo] Log de conexes e consultas ao arquivo. Veja Seo 4.10.2 [Log de consultas], o ca Pgina 373. a --log-bin=[arquivo] Registra todas as consultas que alteram dados em arquivo. Usado para backup e replicao. Veja Seo 4.10.4 [Binary log], Pgina 374. ca ca a --log-bin-index[=arquivo] Arquivo de indice para nomes de arquivos de log binario. Veja Seo 4.10.4 ca [Log binrio], Pgina 374. a a --log-error[=arquivo] Registra mensagens de erro e inicializao neste arquivo. Veja Seo 4.10.1 [Log ca ca de erro], Pgina 372. a --log-isam[=arquivo] Log de todas alteraes ISAM/MyISAM no arquivo (usado somente quando co estiver depurando bancos ISAM/MyISAM). --log-long-format Registra algumas informaes extras nos aruivos de log (log de atualizaes, co co log binrio de atualizaes e log de consultas lentas, independente de qual est a co a ativado). Por exemplo, nome do usurio e timestamp so registrados para a a a consulta. Se voc estiver usando --log-slow-queries e --log-long-format, e ento consultas que no esto usando a a a indices so registradas ao log de cona sultas lentas. Note que --log-long-format est obsoleto a partir do MySQL a verso 4.1, quando --log-short-format foi introduzido (--log-long-format a a congurao padro desde a verso 4.1). Note tambm que a partir do e ca a a e MySQL 4.1, a opo --log-queries-not-using-indexes est dispon para ca a ivel propsito de registro de consultas que no usam o a indices para o log de consultas lentas. --log-queries-not-using-indexes Se voc estiver usando --log-slow-queries, ento consultas que no esto e a a a usando indices esto registradas no log de consultas lentas. Esta opes a co est dispon a ivel a partir do MySQL 4.1. Veja Seo 4.10.5 [Slow query log], ca Pgina 377. a --log-short-format Registra menos informaes extras nos aruivos de log (log de atualizaes, log co co binrio de atualizaes e log de consultas lentas, independente de qual est a co a
210
ativado). Por exemplo, nome do usurio e timestamp so registrados para a a a consulta. Esta opo foi introduzida no MySQL 4.1. ca --log-slow-queries[=arquivo] Log de todas as consultas que levam mais de long_query_time segundos de execuo para um arquivo. Note que o padro para a quantidade de informao ca a ca registrada alterou no MySQL 4.1. Veja as opes --log-long-format e co -log-long-format para mais detalhes. Veja Seo 4.10.5 [Slow query log], ca Pgina 377. a --log-update[=arquivo] Log de atualizaes para file.# onde # um nmero unico se no for fornecido. co e u a Veja Seo 4.10.3 [Log de atualizao], Pgina 373. O log de atualizao ca ca a ca estobsoleto e ser removido no MySQL 5.0; voc deve usar o log binrio em a a e a seu lugar (--log-bin). Veja Seo 4.10.4 [Log binrio], Pgina 374. A partir ca a a da verso 5.0, usar --log-update apenar ligar o log binrio. a a a --low-priority-updates Operaes de alteraes das tabelas (INSERT/DELETE/UPDATE) iro ter priorico co a dade menor do que as selects. Isto tambm pode ser feito usando {INSERT | e REPLACE | UPDATE | DELETE} LOW_PRIORITY ... para baixar a prioridade de somente uma consulta, ou SET OPTION SQL_LOW_PRIORITY_UPDATES=1 para alterar a prioridade em uma unica thread. Veja Seo 5.3.2 [Bloqueio de tabelas], ca Pgina 444. a --memlock Bloqueia o processo mysqld na memria. Isto funciona somente se o seu sistema o suportar a chamada de sistema mklockall() (como no Solaris). Isto pode ajudar se voc tiver um problema no qual o sistema operacional faz com que e o mysqld faa a troca em disco. Note que o uso desta opo exige que voc c ca e execute o servidor como root, que normalmente no uma boa idia por razes a e e o de segurana. c --myisam-recover [=op~o[,op~o...]]] onde op~o qualquer combina~o ca ca ca e ca de DEFAULT, BACKUP, FORCE ou QUICK. Voc tambm pode congurar isto exe e plicitamente para "" se voc deseja desabilitar esta opo. Se esta opo for e ca ca usada, o mysqld ir conferir na abertura se a tabela est marcada como quea a brada ou se a tabela no foi fechada corretamente. (A ultima opo funciona a ca somente se voc estiver executando com --skip-locking). Se este for o caso e mysqld ir executar uma conferncia na tabela. Se a tabela estiver corrompida, a e o mysqld ir tentar repar-la. a a As seguintes opes afetam no funcionamento da reparao. co ca Opo ca Descrio ca DEFAULT O mesmo que no fornecer uma opo para --myisama ca recover. BACKUP Se os dados da tabela foram alterados durante a recuperao, ca salve um backup do arquivo de dados nome_tabela.MYD como nome_tabela_dia_hora.BAK. FORCE Execute a recuperao mesmo se perdermos mais de uma ca linha do arquivo .MYD.
211
QUICK
No conra as linhas na tabela se no existir nenhum bloco a a apagado. Antes da tabela ser reparada automaticamente, o MySQL ir adicionar uma a nota no log de erros. Se voc desejar que a recuperao da maioria dos probe ca lemas no tenha a interveno de algum usurio, devem ser usadas as opes a ca a co BACKUP,FORCE. Isto ir forar um reparo de uma tabela mesmo se alguns rega c istros forem apagados, mas ele manter o arquivo de dados antigo como um a backup para que voc possa examinar posteriormente o que aconteceu. e --new A partir da verso 4.0.12, a opo --new pode ser usada para fazer o servidor a ca se comportar como 4.1 em certos aspectos, facilitando a atualizao da verso ca a 4.0 para 4.1: TIMESTAMP retornado com uma string com o formato YYYY-MM-DD e HH:MM:SSS. Veja Seo 6.2 [Tipos de colunas], Pgina 482. ca a
--pid-file=caminho Encaminha para o arquivo pid usado pelo mysqld_safe. -P, --port=... Nmero da porta para conexes TCP/IP. u o -o, --old-protocol Utilize o protocolo 3.20 para compatibilidade com alguns clientes muito antigos. Veja Seo 2.5.5 [Atualizando a verso 3.20], Pgina 129. ca a a --one-thread Usa somente uma thread (para depurao sobre Linux). Esta opo est ca ca a dispon ivel apenas se o servidor est constru com a depurao habilitada. a ido ca Veja Seo E.1 [Depurando o servidor], Pgina 1079. ca a --open-files-limit= Para alterar o nmero de descritores de arquivos dispon u iveis para o mysqld. Se isto no estiver congurado com 0, ento o mysqld usar este valor para reservar a a a descritores de arquivos para usar com setrlimit(). Se este valor 0 ento o e a mysqld reservar max_connections*5 ou max_connections + table_cache*2 a (que sempre maior) nmero de arquivos. Voc deve tentar aumentar isto se e e u e o mysqld lhe retornar o erro Too many open les. -O, --set-variable=name=value Fornece um valor para uma varivel. --help lista as variveis. Voc a a e pode encontrar uma descrio completa para todas as variveis na seo ca a ca SHOW VARIABLES deste manual. Veja Seo 4.6.8.4 [SHOW VARIABLES], ca Pgina 309. A seo de sintonia dos parmetros do servidor inclui informaes a ca a co sobre como otimiz-los. Por favor, note que --set-variable=name=value e a -O name=value esto obsoletos desde o MySQL 4.0, apenas use --var=op~o. a ca Veja Seo 5.5.2 [Server parameters], Pgina 454. ca a No MySQL 4.0.2 pode-se denir uma varivel diretamente com --variablea name=op~o e set-variable no mais preciso no arquivo de opes. ca a e co Se voc quiser restringir o valor mximo uma opo de inicializao pode ser e a ca ca denida com SET, voc pode den usando a opo de linha de comando e i-la ca --maximum-variable-name. Veja Seao 5.5.6 [SET OPTION], Pgina 460. c a
212
Note que quando um valor atribu a uma varivel, o MySQL pode carrig e ido a i-lo automaticamente para permanecer dentro de uma faixa dada e tambm ajusta e o valor um pouco para corrigir para o algoritmo usado. --safe-mode Salta alguns estgios de otimizao. a ca --safe-show-database Com esta opo, o comando SHOW DATABASES retorna apenas aqueles bancos de ca dados para os quais o usurio tem algum tipo de privilgio. Desde a verso 4.0.2 a e a esta opo esta obsoleta e no faz nada (a opo est habilitada por padro) ca a ca a a j que agora temos o privilgio SHOW DATABASES. Veja Seo 4.4.1 [GRANT], a e ca Pgina 254. a --safe-user-create Se isto estiver ativo, um usurio no pode criar novos usurios com o comando a a a GRANT, se o usurio no ter o privilgio de INSERT na tabela mysql.user ou a a e em alguma coluna desta tabela. --skip-bdb Disabilita o uso de tabelas BDB. Isto economizar memria e pode aumentar a o a velocidade de algumas operaes. co --skip-concurrent-insert Desliga a habilidade de selecionar e inserir ao mesmo tempo em tabelas MyISAM. (Isto s usado se voc achar que encontrou um erro neste recurso). oe e --skip-delay-key-write; No MySQL 4.0.3 voc deve usar delay-key-write=OFF. Ignore a opo DELAY_ e ca KEY_WRITE para todas as tabelas. Veja Seo 5.5.2 [Parmetros do servidor], ca a Pgina 454. a --skip-grant-tables Esta opo faz com que o servidor no use o sistema de privilgio. Isto d a ca a e a todos acesso pleno a todos os bancos de dados! (Voc pode dizer a um servidor e em execuo para iniciar a usar as tabelas de permisso novamente executando ca a mysqladmin flush-privileges ou mysqladmin reload.) --skip-host-cache Nunca utiliza cache para nomes de mquina para resolues de nomes mais a co rpidos, mas pesquisa o servidor DNS em todas conexes. Veja Seo 5.5.5 a o ca [DNS], Pgina 459. a --skip-innodb Disabilita o uso de tabelas Innodb. Isto ir economizar memria, espao em a o c disco e aumentar a velocidade de algumas operaes. co --skip-external-locking (era --skip-locking) No utilizar bloqueio de sistema. Para usar isamchk ou myisamchk voc deve a e desligar o servidor. Veja Seo 1.2.3 [Stability], Pgina 8. Perceba que na ca a Verso 3.23 do MySQL pode ser usado REPAIR e CHECK para reparar/conferir a tabelas MyISAM.
213
--skip-name-resolve Nomes de mquinas no so resolvidos. Todos os valores da coluna Host nas a a a tabelas de permisses devem conter nmeros IP ou localhost. Veja Seo 5.5.5 o u ca [DNS], Pgina 459. a --skip-networking No escutair conexes TCP/IP. Toda interao com mysqld deve ser feito a o ca atravs de named pipes ou sockets Unix. Esta opo altamente recomene ca e dada para sistemas onde requisies locais so permitidas. Veja Seo 5.5.5 co a ca [DNS], Pgina 459. a --skip-new No utilizar rotinas novas, poss a ivelmente erradas.
--skip-symlink Opo obsoleta a partir da 4.0.13; use --skip-symbolic-links em seu lugar. ca --symbolic-links, --skip-symbolic-links Habilita ou desabilita suporte a link simblico. Esta opo tem efeitos diferentes o ca no Windows e Unix. No Windows, habilitar links simb ilicos lhe permite estabelecer um link simblico o a um diretrio de banco de dadosi criando um arquivo directory.sym que o contm o caminho para o diretrio real. Veja Seo 5.6.1.3 [Links simblicos no e o ca o Windows], Pgina 468. a No Unix, habilitar links simblicos, signica que voc pode ligar uma tabela o e MyISAM ou um arquivo de dados em outro dirtrio com as opes INDEX o co DIRECTORY ou DATA DIRECTORY da instruo CREATE TABLE. Se voc deletar ca e ou renomear a tabela, os arquivos para o qual o link simblico aponta tambm o e ser deletado/renomeado. a --skip-safemalloc Se o MySQL congurado com --with-debug=full, todos os programas vere icam a memria por erros para cada operao de alocao e liberao de o ca ca ca memria. Esta consistncia muito lenta, assim para o servidor voc pode o e e e evit-la, quando voc no precisar dela usando a opo --skip-safemalloc. a e a ca --skip-show-database No permite o comando SHOW DATABASE, a menos que o usurio tenha a a privilgio SHOW DATABASES. e --skip-stack-trace No gravar os rastreamentos de pilha. Esta opo util quando voc estiver a ca e e executando o mysqld sob um depurador. El alguns sistemas voc tambm deve e e usar esta opo para conseguir um arquivo core. Veja Seo E.1 [Depurando o ca ca servidor], Pgina 1079. a --skip-thread-priority Desabilita o uso de prioridade das threads para um tempo de resposta mais rpido. a
214
--socket=path No Unix, o arquivo socket para usar em conexes locais no lugar do padro o a /tmp/mysql.sock. No Windows, o nome do pipe para usar em conexes locais o que usam named pipe (padro MySQL). a
--sql-mode=value[,value[,value...]] Os valores de opo pode ser qualquer combinao de: REAL_AS_FLOAT, ca ca 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 tambm e pode car vazio (--sql-mode="") se voc desejar limp-la. e a NO_AUTO_VALUE_ON_ZERO afeta o tratamento de colunas AUTO_INCREMENT. Normalmente, voc gera a prxima sequncia de nmeros da coluna inserindo NULL e o e u ou 0 nela. NO_AUTO_VALUE_ON_ZERO omite este comportamento para 0, assim apenas NULL gera a prxima sequncia de nmeros. Este modo pode ser util se 0 o e u foi armazenado em uma coluna AUTO_INCREMENT da tabela (isto no recomena e dado). Por exemplo, se voc zer um dumpo de uma tabela com mysqldump e e ento recarreg-la, normalmente o MySQL ira gerar uma nova sequncia de a a e nmeros quando encontrar valores 0, resultando em uma tabela com contedo u u 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 do dump para habilitar NO_AUTO_VALUE_ON_ZERO.) automaticamente a saida Diversos dos valores de opo so usados para compatibilidade com outros servica a dores. Se especicado, eles fazer o servidor omitir da sa de SHOW CREATE ida TABLE aquelas partes da instruo que no so entendidas pelas verses anterica a a o ores do MySQL ou outros servidores de banco de dados. Usar estes valores de opes resulta em instrues CREATE TABLE que so mais portveis para usar co co a a com outros servidores: Os valores NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_DIR_IN_CREATE, e NO_KEY_OPTIONS causam a omisso da tabela de opes, ou opes pertena co co centes a denio de colunas ou ca indices. Os valroes MYSQL323 e MYSQL40 so para compatibilidade com o MySQL a 3.23 e MySQL 4.0. O valor usado para compatibilidade com outros servidores so DB2, MAXDB, a MSSQL, ORACLE, e POSTGRESQL. Estas opes tambm afetam a sa do mysqldump, porque este programa usa co e ida SHOW CREATE TABLE para obter a instruo de criao da tabela a qual ele inclue ca ca em sua prpria sa o ida. Diversos valores de opes podem ter um efeito complexo porque eles so atalhos co a para um grupo ou conjunto de valores. Por exemplo, voc pode dizer ao servidor e para executar em modo ANSI usando a opo --sql-mode=ansi (ou --ansi), ca que equivalente a especicar ambas das seguintes opes de linhas de comando: e co --sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FUL --transaction-isolation=SERIALIZABLE
215
Note que especicar o modo ANSI desta forma tambm tem o efeito de conge urar o n de isolao da transao. ivel ca ca Para mais informaes sobre executar o servidor em modo ANSI, veja co Seo 1.8.2 [ANSI mode], Pgina 42. ca a Outros valores de grupos so DB2, MAXDB, MSSQL, ORACLE, e POSTGRESQL. a 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 opo --sql-mode foi adicionada no MySQL 3.23.41. O valor NO_UNSIGNED_ ca SUBTRACTION foi adicionado na verso 4.0.0. NO_DIR_IN_CREATE foi adicionado a na verso 4.0.15. NO_AUTO_VALUE_ON_ZERO, NO_TABLE_OPTIONS, NO_FIELD_ a OPTIONS, NO_KEY_OPTIONS, MYSQL323, MYSQL40, DB2, MAXDB, MSSQL, ORACLE, POSTGRESQL, e ANSI foram adicionados na verso 4.1.1. a --temp-pool Usar esta opo far com que a maioria dos arquivos temporrios criados pelo ca a a servidor para usarem um pequeno conjunto de nomes, em vez de um unico nome para cada novo arquivo. Isto para contornar um problema no kernel do Linux e ao tratar com a criao de muitos arquivos novos com nomes diferentes. Com ca o comportamento antigo, o Linux parece ter perda de memria, j que ela o a e alocada na cache de entrada do diretrio em vez da cache de disco. o --transaction-isolation={ READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE } Congura o n ivel de isolao da transao padro. Veja Seo 6.7.6 [SET ca ca a ca TRANSACTION], Pgina 619. a -t, --tmpdir=path Caminho do diretrio usado para criar os arquivos temporrios. Ele pode ser o a util se o seu diretrio padro /tmp est em uma partio muito pequena para o a a ca armazenar tabelas temporrias. A partir do MySQL 4.1, esta opo aceita a ca diversos caminhos usados do modo round-robin. Os caminhos devem ser separados por dois pontos (:) (ponto e v irgula (;) no Windows). Eles sero usados a de acordo com o mtodo round-robin. e -u, --user=[nome_usurio | id_usurio] a a Executar o servidor mysqld como o usurio nome_usurio ou id_usrio a a a (numrica). (User neste contexto se refere a conta de login do sistema, no e a um usurio MySQL listado na tabela de permisses.) a o Esta opo obrigatria quando o mysqld iniciado como usurio root. O ca e o e a servidor ir alterar o ID do usurio durante sua inicializao, fazendo com que a a ca ele seja executado como este usurio particular em vez de root. Veja Seo 4.3.2 a ca [Security], Pgina 229. a A partir do MySQL 3.23.56 e 4.0.12: Para evitar um poss furo na segurana ivel c onde um usurio adiciona uma opo --user=root a algum arquivo my.cnf a ca (fazendo o servidor executar como root, o mysqld usa apenas a primeira opo ca --user especicada e produz um aviso se houver mltiplas opes --user. u co As opes em /etc/my.cnf e datadir/my.cnf so processadas antes de uma co a opo de linha de comando, assim recomendado que voc coloque uma opo ca e e ca
216
--user em /etc/my.cnf e especique um outro valor diferente de root. A opo em /etc/my.cnf ser encontrada antes de qualques outra opo -ca a ca user, o que assegura que o servidor no execute como root, e que um aviso a seja exibido se qualquer outra opo --user for encontrada. ca -V, --version Mostra a informao da verso e sai. ca a -W, --log-warnings Imprime avisos como Aborted connection... no arquivo .err. E recomendvel habilitar esta opo, por exemplo, se voc estiver usando a ca e replicao (voc obter a mensagem sobre o que est acontecendo como falhas ca e a a de rede e reconexes). Veja Seo A.2.10 [Erros de comunicao], Pgina 918. o ca ca a Esta opo se chamava --warnings. ca Pode se alterar a maioria dos valores de um servidor em execuo com o comnado SET. Veja ca Seo 5.5.6 [SET OPTION], Pgina 460. ca a
Windows-directory a localizao do seu diretrio Windows. e ca o No Unix, o MySQL l opes padres dos seguintes arquivos: e co o Nome do arquivo /etc/my.cnf DATADIR/my.cnf defaults-extra-file ~/.my.cnf Propsito o Opes globais co Opes espec co icas do servidor O arquivo especicado com --defaultsextra-file=# Opes espec co icas do usurio a
DATADIR o diretrio de dados do MySQL (normalmente /usr/local/mysql/data para e o instalaes binrias ou /usr/local/var para instalaes de cdigo fonte). Perceba que este co a co o o diretrio que foi especicado na hora da congurao, no o especicado com --datadir e o ca a quando o mysqld inicia! (--datadir no tem efeito sobre o local onde o servidor procura a por arquivos de opes, porque ele procura pelos arquivos antes de processar qualquer co argumento da linha de comando.) Note que no Windows, voc deve especicar todos os caminhos no arquivo de opo com / e ca no lugar de \. Se for utilizado o \, ser necessrio digit-lo duas vezes, pois o \ o caractere a a a e de escape no MySQL. O MySQL tenta ler os arquivos de opes na ordem listada acima. Se mltiplos arquivos de co u opes existirem, uma opo especicada em um arquivo lido depois recebe a precedncia co ca e sobre a mesma opo especicada em um arquivo lido anteriormente. Opes especicadas ca co
217
na linha de comando recebem a precedncia sobre opes especicadas em qualquer arquivo e co de opes. Algumas opes podem ser especicadas usando variveis de ambiente. Opes co co a co especicadas na linha de comando ou nos arquivos de opo tem precendencia sobre valores ca nas variveis de ambiente. Veja Apndice F [Variveis de ambiente], Pgina 1092. a e a a Os seguintes programas suportam arquivos de opes: mysql, mysqladmin, mysqld, mysqld_ co safe, mysql.server, mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk, e myisampack. Desde a verso 4.0.2, voc pode usar o prexo loose para opes de linha de comando a e co (ou opes no my.cnf). Se uma opo possui o prexo loose, o programa que a ler no co ca a nalizar com um erro se uma opo for desconhecida, mas apenas enviar um aviso: a ca a shell> mysql --loose-no-such-option Voc pode usar arquivos de opes para especicar qualquer opo extendida que o programa e co ca suporte! Execute o programa com --help para obter uma lista das opes dispon co iveis. Um arquivo de opes pode conter linhas na seguinte forma: co #comentario Linhas de comentrio iniciam com o caractere # ou ;. Comentrios podem a a iniciar no meio de uma linha tambm. Linhas vazias so ignoradas. e a [grupo] grupo o nome do programa ou grupo para o qual voc ir congurar as opes. e e a co Depois de uma linha de grupo, qualquer linha de op~o ou set-variable so ca a referentes ao grupo at o nal do arquivo de opes ou outra linha de in de e co icio grupo. Isto equivalente ` --op~o na linha de comando. e a ca
op~o ca
op~o=valor ca Isto equivalente ` --op~o=valor na linha de comando. Por favor, note que e a ca voc deve colocar um argumento entre aspas duplas, se o argumento de uma e opo conter um caracter de comentrio. ca a set-variable = nome=valor Isto equivalente ` --set-variable nome=valor na linha de comando. e a Por favor, notem que --set-variable est obsoleto desde o MySQL 4.0; a a partir desta verso os nomes das variveis de programa podem ser usados como a a nome de opes. Na linha de comando, use apenas --nome=valor. Em um co arquivo de opo, use nome=valor. ca O grupo [client] permite especicar opes para todos clientes MySQL (no o mysqld). co a Este o grupo perfeito de se usar para especar a senha que voc usa para conectar ao e e servidor. (Mas tenha certeza que o arquivo de opes s pode ser lido e gravado por voc) co o e Se voc quiser criar opes que devem ser lidas por uma verso especica do servidor mysqld e co a voc pode fazer isto com [mysqld-4.0], [mysqld-4.1] etc: e [mysqld-4.0] new A nova opo acima s ser usada com o verses 4.0.x do servidor MySQL. ca o a o Perceba que para opes e valores, todos espaos em branco so automaticamente apagados. co c a Voc pode usar a sequencia de escape \b, \t, \n, \r, \\ e \s no valor da string (\s e == espao). c
218
Aqui est um t a ipico arquivo de opes globais. co [client] port=3306 socket=/tmp/mysql.sock [mysqld] port=3306 socket=/tmp/mysql.sock set-variable = key_buffer_size=16M set-variable = max_allowed_packet=1M [mysqldump] quick Aqui est um t a ipico arquivo de opes do usurio co a [client] # A senha seguinte ser enviada para todos clientes MySQL a password="minha_senha" [mysql] no-auto-rehash set-variable = connect_timeout=2 [mysqlhotcopy] interactive-timeout Se voc tem uma distribuio fonte, voc encontrar arquivos de exemplo de congurao e ca e a ca chamados my-xxxx.cnf no diretrio support-files. Se voc tem uma distribuio o e ca binria olhe no diretrio de instalao DIR/support-file, onde DIR o caminho para a o ca e o diretrio de instalao (normalmente C:\mysql ou /usr/local/mysql). Atualmente o ca existem arquivos de congurao para sistemas pequenos, mdios, grandes e enormes. Voc ca e e pode copiar my-xxxx.cnf para seu diretrio home (renomeie a cpia para .my.cnf para o o experimentar. Todos os programas MySQL que suportam arquivos de opes aceitam opes: co co Opo ca Descrio ca --no-defaults No l nenhum arquivo de opes. a e co --print-defaults Imprima o nome do programa e todas opes. co --defaults-file=caminho-paraUtilize somente o arquivo de congurao esca arquivo-padr~o a pec icado. --defaults-extra-file=caminhoLeia este arquivo de congurao depois do arca para-arquivo-padr~o a quivo de congurao global mas antes do arca quivo de congurao do usurio. ca a Perceba que as opes acima devem vir primeiro na linha de comando para funcionar, com co exceo que --print-defaults deve ser usado logo depois dos comandos --defaults-file ca ou --defaults-extra-file. Notas para desenvolvedores: O tratamento de arquivos de opes implementado simplesco e mente processando todos as opes coincidentes (isto , opes no grupo apropriado) antes co e co
219
de qualquer argumento da linha de comando. Isto funciona bem para programas que usam a ultima instncia de uma opo que especicada diversas vezes. Se voc tem um pro a ca e e grama antigo que trata opes especicadas vrias vezes desta forma mas no l arquivos co a a e de opes, voc s precisa adicionar duas linhas para lhe dar esta capacidade. Verique o co e o cdigo fonte de qualquer um dos clientes MySQL padro para ver como fazer isto. o a Nos scripts shell voc pode usar o comando my_print_defaults para analisar os arquivos e de opo. O seguinte exemplo mostar a sa que my_print_defaults pode produzir ca ida quando quando pedido para mostrar as opes encontradas nos grupos [client] e [mysql]: co shell> my_print_defaults client mysql --port=3306 --socket=/tmp/mysql.sock --no-auto-rehash
220
--log-error=path --log-isam=path --bdb-logdir=path Se voc quiser mais desempenho, voc tambm pode especicar as seguinte opes difere e e co entemente para cada servidor para distribuir a carga entre vrios discos f a isicos: --tmpdir=path --bdb-tmpdir=path Normalmente, cada servidor tambm deve usar um diretrio de dados diferentes, que e o e especicado usando a opo --datadir=path. ca AVISO: Normalmente voc nunca deve ter dois servidores que atualizam dados no mesmo e banco de dados! Isto pode levar a supresas inesperadas se seu o seu sistema operacionalno a suporta lock de sistema a prova de falhas, isto pode provocar surpresas indesejveis! Se a (apesar deste aviso) voc executar diversos servidores usando o mesmo diretrio de dados e o e eles tiverem com o log habilitado, voc usar as opes apropriadas para especicar os e co nomes dos arquivos de log que so unicos em cada servidor. Seno, o servidores podem a a tentar gravar no mesmo arquivo de log. Este aviso contra o compartilhamento de arquivos de dados entre servidores tambm se e aplica em um ambeinte NFS. Permitir vrios servidores MySQL acessarem um diretrio de a o dados comum sobre NFS, normalmente uma MA IDEIA! e O primeiro problema que o NFS se tornar um gargalo, tornando o sistema lento. Ele e a no se destina para este tipo de uso. a Outro risco com NFS que voc ter que conseguir um modo de se certicar que dois e e a ou mais servidores no esto interferindo uns com os outros. Normalmente o lock de a a arquivo tratado pelo daemon lockd, mas no momento no existe nenhuma plataforma e a que fara o locck 100% de segurana, em todas as situaes. c co Facilite a sua vida: esquea sobre compartilhar um diretrio de dados entre servidores sobre c o NFS. A soluo melhor ter um computador com um sistema operacional que manipule ca e threads de forma eciente threads e tenha diversas CPUs nele. Se voc tiver mltiplas instalaes do MySQL em diferentes locais, normalemente voc pode e u co e especicar o diretrio de instalao base de cada servidor com a opo --basedir=caminho o ca ca para fazer que cada servidor use diferentes diretrios de dados, arquivos de log e arquivos o PID. (O padro para todos estes valores so determinados em relao ao diretrio base.) a a ca o Neste caso, as unicas outras opes que voc precisa especicar so as opes --socket e - co e a co port. Por exempo, suponha que voc instalou a verso binria do MySQL (arquivos .tar) e a a em diferentes locais, assim voc pode iniciar o servidor usando o comando ./bin/mysqld_ e safe sob o diretrio base correspondente de cada instalao. mysqld_safe determinar a o ca a opo --basedir apropriada para passar para mysqld, e voc precisa especicar apenas as ca e opes --socket e --port para o mysqld_safe. co Como discutido nas sees a seguir, poss co e ivel iniciar servidores adicionais congurando variveis de ambiente ou especicando as opes de linha de comando apropriada. No a co entanto, se voc precisa executar mltiplos servidores em uma base mais permanente, ser e u a mais coonveniente usar os arquivos de opes para especicar, para cada servidor, aquelas co opes que devem ser unicas para ele. Veja Seo 4.1.2 [Option les], Pgina 216. co ca a
221
222
[mysqld] datadir = C:/mydata1 port = 3307 enable-named-pipe socket = mypipe1 Esto inicie o servidor desta forma: a shell> mysqld-nt --defaults-file=C:\my-opts1.cnf C:\my-opts2.cnf seria modicado de forma parecida para uso com o segundo servidor.
223
basedir = C:/mysql-4.0.8 port = 3307 enable-named-pipe socket = mypipe1 # op~es para o servio mysql2 co c [mysqld2] basedir = C:/mysql-4.0.17 port = 3308 enable-named-pipe socket = mypipe2 Instale os servios como a seguir, usando o caminho completo para o servidor para c assegurar que o Windows registra o programa executvel correto para cada servio: a c 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 servios, use o gerenciador de servios, ou use NET START com o nome c c de servio apropriado: c shell> NET START mysqld1 shell> NET START mysqld2 Para parar os servios, use o gerenciador de servios, ou use NET STOP com o mesmo c c nome de servio. c shell> NET STOP mysqld1 shell> NET STOP mysqld2 Nota: Antes do MySQL 4.0.17, apenas um servidor instalado usando o nome de servio c padro (MySQL) ou instalado com um nome de servio de mysqld ir ler o grupo a c a [mysqld] no arquivo de opes padro. A partir da verso 4.0.17, todos os servidores co a a lem o grupo [mysqld] se eles lem o arquivo de opes padro, mesmo de esles esto e e co a a instalados usando outro nome de servio. Isto permite que voc use o grupo [mysqld] c e para opes que devam ser usadas por todos os servios MySQL, e um grupo de opo co c ca com o nome de cada servio para o uso do servidor com aquele nome de servio. c c Especique as opes para cada servidor em arquivos separados e use --defaultsco file quando instalar os servios para dizer para cada servidor que arquivo usar. Neste c caso, cada arquivo deve listar as opes usando um grupo [mysqld]. co Com esta abordagem, para especicar as opes para o mysqld-nt 4.0.8, crie um arco quivo C:\my-opts1.cnf que se parea com: c [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 parea com: c [mysqld] basedir = C:/mysql-4.0.17 port = 3308
224
enable-named-pipe socket = mypipe2 Instale o servio como indicado a seguir (digite cada comando em uma unica linha): c 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 opo --defaults-file quando instalar um servidor MySQL como um ca servio, voc deve anteceder a opo com o nome do servio. c e ca c Depois de instalarm, inicie e para os servios do mesmo modo que no exemplo anterior. c Para remover vrios servios, use mysqld --remove para cada um, especicando um nome a c de servio depois da opo --remove se o servio a ser removido tiver um nome difertente c ca c do padro. a
225
No necessrio compilar um novo servidor MySQL apenas para iniciar com uma arquivo a e a socket ou nmero de porta TCP/IP diferentes. Tambm poss especicar estes valores u e e ivel em tempo de execuo. Um modo de faz-lo usando as opes de linha de comando: ca e e co shell> /path/to/mysqld_safe --socket=file_name --port=port_number Para usar outro diretrio de banco de dados para o segundo servidor, passe uma opo o ca --datadir=caminho para o mysqld_safe. Um outro modo de conseguir este efeito usar as variveis de ambiente para congurar o e a nome do socket e o nmero da porta: u 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 um modo rpido para iniciar um segundo servidor para teste. O bom deste mtodo e a e e que a congurao das variveis de ambiente se aplicaro a qualquer programa cliente que ca a a voc chame da shell acima. Assim, as conexes para estes clientes sero automaticamente e o a direcionadas para o segundo servidor! Apndice F [Variveis de ambiente], Pgina 1092 inclue uma lista de outras variveis de e a a a ambiente que voc pode usar e que afetam o mysqld. e Para a execuo automatica do servidor, seu script de inicializao que executado no ca ca e tempo de boot deve executar o seguinte comando uma vez para cada servidor com um caminmho apropriado do arquivo de opo para cada comando: ca mysqld_safe --defaults-file=path-to-option-file Cada arquivo de opo deve conter valores espec ca icos para um dados servidor. No Unix, o script mysqld_multi outro modo de de iniciar vrios servidores. e a Seo 4.8.3 [mysqld_multi], Pgina 333. ca a Veja
226
No Unix, congure as variveis de ambiente MYSQL_UNIX_PORT e MYSQL_TCP_PORT para a 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 pode colocar os comandos e para congurar as variveis de ambiente no arquivo .login, assim eles sero aplia a cados sempre quer voc logar no sistema. Veja Apndice F [Environment variables], e e Pgina 1092. a Especique o socket e porta TCP/IP padres no grupo [clients] de um arquivo de o opes. Por exemplo, voc pode usar C:\my.cnf no WIndows ou o arquivo .my.cnf co e em seu diretrio home no Unix. Veja Seo 4.1.2 [Option les], Pgina 216. o ca a Em um programa C, voc pode especicar os argumentos de porta ou socket na e chamada de mysql_real_connect(). Voc tambm pode ter o programa lendo de um e e arquivo de opes chamando mysql_options(). Veja Seo 12.1.3 [C API functions], co ca Pgina 783. a Se voc estiver usando o mdulo Perl DBD::mysql voc pode ler as opes dos arquivos e o e co de opes do MySQL. Por exemplo: co $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 Seo 12.5.2 [Perl DBI Class], Pgina 881. ca a
227
Aprenda o sistema de controle de acessos do MySQL. Os comandos GRANT e REVOKE so usados para controlar o acesso ao MySQL. No conceda mais privilgios do que o a a e necessrio. Nunca conceda privilgios para todas as mquinas. a e a Checklist: Tente mysql -u root. Se voc conseguir conectar com sucesso ao servidor sem e a solicitao de uma senha, voc tem problemas. Qualquer um pode conectar ca e ao seu servidor MySQL como o usurio root com privilgios plenos! Revise as a e instrues de instalao do MySQL, prestando ateno particularmente ao item co ca ca sobre congurao da senha do usurio root. ca a Utilize o comando SHOW GRANTS e conra para ver quem tem acesso a o que. Remova aqueles privilgios que no so necessrios utilizando o comando REVOKE. e a a a No mantenha nenhuma senha de texto puro no seu banco de dados. Quando seu a computador ca comprometido, o intruso pode obter a lista completa de senhas e utiliz-las. Utilize a funo MD5(), SHA1() ou qualquer funo de embaralhamento de a ca ca via unica. No escolha senhas de dicionrios. Existem programas especiais para quebr-las. a a a Mesmo senhas como xsh98 no sao boas. Muito melhor seria duag98 que contm a e a mesma palavra sh mas digitada uma letra a esquerda em um teclado QWERTY convencional. Outro mtodo seria usar Mhall que obtido dos primeiros caracteres e e de cada palavra na frase Mary has a litle lamb. Isto fcil de lembrar e digitar, mas e a diculta que algum que no a conhea a advinhe. e a c Invista em um rewall. Ele protege voc de pelo menos 50% de todos os tipos de e exploits em qualquer software. Coloque o MySQL atrs do rewall ou em uma zona a desmilitarizada (DMZ). Checklist: Tente examinar suas portas da Internet utilizando alguma ferramenta como o nmap. O MySQL utiliza a porta 3306 por padro. Esta porta no deve ser acess a a ivel para mquinas no conveis. Outra maneira simples para conferir se sua porta a a a do MySQL est aberta ou no tentar o seguinte comando de alguma mquina a a e a remota, onde nome_mquina o nome da mquina ou o endereo IP de seu servidor a e a c MySQL: shell> telnet nome_mquina 3306 a Se voc obter uma conexo e alguns caracteres, a porta est aberta e deve ser e a a fechada no seu rewall ou roteador, a menos que voc realmente tenha uma boa e razo para mant-la aberta. Se o telnet apenas parar ou a conexo for recusada, a e a tudo est bem; a porta est bloqueada. a a No cone em nenhum dado inclu a idos pelos seus usurios. Eles podem tentar enganar a seu cdigo entrando com caracteres especiais ou sequencias de escape nos formulrios o a Web, URLS ou qualquer aplicao que voc construa. Tenha certeza que sua aplicao ca e ca continua segura se um usurio entrar com algo do tipo ; DROP DATABASE mysql;. a Este um exemplo extremo, mas grandes falhas de segurana ou perda de dados podem e c ocorrer como o resultado de hackers utilizando tcnicas similares, se voc no estiver e e a preparado para eles. Tambm lembre de conferir dados numricos. Um erro comum proteger somente as e e e strings. Em alguns casos as pessoas pensam que se um banco de dados contm somente e
228
dados dispon iveis publicamente, ele no precisa ser protegido. Isto no verdade. No a a e 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 usar apstrofos em torno e o das contantes numricas: SELECT * FROM tabela WHERE ID=234 em vez de SELECT * e FROM table WHERE ID=234. O MySQL automaticamente converte esta string para um nmero e corta todos os s u imbolos no-numricos dela. a e Checklist: Todas aplicaes Web: co Tente inserir e " em todos seus formulrios Web. Se voc obter qualquer a e tipo de erro do MySQL, investigue o problema imediatamente. Tente modicar qualquer URL dinmica adicionando %22 ("), %23 (#) e %27 a () na URL. Tente modicar os tipos de dados nas URLs dinmicas de numrico para a e caractere contendo caracteres dos exemplos anteriores. Sua aplicao deve ser ca segura contra estes ataques e similares. Tente inserir caracteres, espaos e s c imbolos especiais no lugar de nmero nos u campos numricos. Sua aplicao deve remov-los antes de pass-los para o e ca e a MySQL ou sua aplicao deve gerar um erro. Passar valores no vericados ca a ao MySQL extramente perigoso! e Conra o tamanho dos dados antes de pass-los ao MySQL. a Considere ter sua aplicao conectando ao banco de dados utilizando um ca usurio diferente doq ue o que utilizado com propsitos administrativos. a e o No fornea `s suas aplicaes mais privilgios de acesso do que elas necessia c a co e tam. Usurios do PHP: a Conra a funo addslashes(). No PHP 4.0.3, uma funo mysql_escape_ ca ca string() est dispon e baseada na funo com o mesmo nome da API a ivel e ca C do MySQL. Usurios do API C do MySQL: a Conra a chamada API mysql_escape_string(). Usurios do MySQL: a Conra os modicadores escape e quote para consultas streams. Usurios do Perl DBI: a e Conra o mtodo quote() ou utilize aspas simples ou duplas. Usurios do Java JDBC: a Utilize um objeto PreparedStatement e aspas simples ou duplas. No transmita dados sem criptograa na Internet. Estes dados so acess a a iveis para todos que tenham o tempo e habilidade para intercept-lo e us-lo para seu propsito a a o prprio. No lugar, utilize um protocolo de criptograa como o SSL ou SSH. O MySQL o suporta conexes SSL interno desde a verso 3.23.9. O repasse de portas do SSH pode o a ser usado para criar um tunel criptografado (e com compresso) para a comunicao. a ca
229
Aprenda a usar os utilitrios tcpdump e strings. Para a maioria dos casos voc a e pode conferir se o uxo de dados do MySQL est ou no criptografado utilizando um a a 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 modicaes sob outros co sistemas.) Alerta: Se voc no ver dados no signica sempre que esteja criptografado. e a a Se voc necessita de alta segurana, voc deve consultar um especialista em segurana. e c e c
230
de usurios Unix. Para iniciar o mysqld como outro usurio Unix, adicione uma linha a a user que especica o nome de usurio para o grupo [mysqld] do arquivo de opes a co /etc/my.cnf ou o arquivo de opes my.cnf no diretrio de dados do servidor. Por co o exemplo: [mysqld] user=mysql Estas opes conguram o servidor para iniciar como o usurio designado quando voc o co a e inicia manualmente ou usando mysqld_safe ou mysql.server. Para maiores detalhes, veja Seo A.3.2 [Changing MySQL user], Pgina 923. ca a No suportar links simblicos para tabelas (Isto pode ser desabilitado com a opo -a o ca skip-symlink. Isto muito importante caso voc execute o mysqld como root, assim e e qualquer um que tenha acesso ` escrita aos dados do diretrio do mysqld podem apagar a o qualquer arquivo no sistema! Veja Seo 5.6.1.2 [Symbolic links to tables], Pgina 466. ca a Verque se o usurio Unix que executa o mysqld o unico usurio com privilgios de a e a e leitura/escrita nos diretrios de bancos de dados. o No fornea o privilgio PROCESS para todos os usurios. A sa de mysqladmin a c e a ida processlits mostra as consultas atualmente em execuo, portanto qualquer usurio ca a que consiga executar este comando deve ser apto a ver se outro usurio entra com uma a consulta do tipo UPDATE user SET password=PASSWORD(n~o_seguro). a O mysqld reserva uma conexo extra para usurios que tenham o privilgio process, a a e portanto o usurio root do MySQL pode logar e vericar a atividade do servidor mesmo a se todas as conexes normais estiverem em uso. o No conceda o privilgio FILE a todos os usurios. Qualquer usurio que possua a e a a este privilgio pode gravar um arquivo em qualquer lugar no sistema de arquivos com e os privilgios do daemon mysqld! Para tornar isto um pouco mais seguro, todos os e arquivos gerados com SELECT ... INTO OUTFILE so lidos por todos, e no se pode a a sobrescrever arquivos existentes. O privilgio FILE pode tambm ser usado para ler qualquer arquivo acess para o e e ivel usurio Unix com o qual o servidor est sendo executado. Pode ocorrer abusos como, a a por exemplo, usar LOAD DATA para carregar o arquivo /etc/passwd em uma tabela, que pode ento ser lido com SELECT. a Se voc no cona em seu DNS, voc deve utilizar nmeros IP no lugar de nomes de e a e u mquinas nas tabelas de permisso. De qualquer forma, voc deve ter muito cuidado a a e ao criar entradas de concesso utilizando valores de nomes de mquinas que contenham a a metacaractes! Se voc deseja restrigir o nmero de conexes para um unico usurio, voc pode faze-lo e u o a e congurando a varivel max_user_connections no mysqld. a
231
--safe-show-database Com esta opo, SHOW DATABASES retorna somente os bancos de dados nos quais ca o usurio tem algum tipo de privilgio. A partir da verso 4.0.2 esta opo est a e a ca a obsoleta e no faz nada (a opo est habilitada por padro) j que agora temos a ca a a a o privilgio SHOW DATABASES. Veja Seo 4.4.1 [GRANT], Pgina 254. e ca a --safe-user-create Se for habilitado, um usurio no consegue criar novos usurios com o comando a a a GRANT, se o usurio no tiver privilgio de INSERT na tabela mysql.user. Se a a e voc desejar fornecer a um usurio acesso para s criar novos usurios com e a o a privilgios que o usurio tenha direito a conceder, voc deve dar ao usurio o e a e a seguinte privilgio: e mysql> GRANT INSERT(user) ON mysql.user TO user@hostname; Isto ir assegurar que o usurio no poder alterar nenhuma coluna de a a a a privilgios diretamente, mas tem que usar o comando GRANT para conceder e direitos para outros usurios. a --skip-grant-tables Esta opo desabilita no servidor o uso do sistema de privilgios. Isto d a ca e a todos os usurios acesso total a todos os bancos de dados! (Voc pode dizer a a e um servidor em execuo para para uar as tabelas de permisses executando ca o mysqladmin flush-privileges ou mysqladmin reload.) --skip-name-resolve Nomes de mquinas no so resolvidos. Todos os valores da coluna Host nas a a a tabelas de permisses devem ser nmeros IP ou localhost. o u --skip-networking No permitir conexes TCP/IP sobre a rede. Todas as conexes para mysqld a o o em sistemas que devem ser feitas via Sockets Unix. Esta opo no possivel ca a e usam MIT-pthreads, porque o pacote MIT-pthreads no suporta sockets Unix. a --skip-show-database No permite o comando SHOW DATABASES, a menos que o usurio tenha o a a privilgio SHOW DATABASES. A partie da verso 4.0.2 voc no deve mais pree a e a cisar desta opo, j que o aceesso pode agora ser concedido especicamente ca a com o privilgio SHOW DATABASES. e
232
tenha acesso de leitura (assumindo que um usurio poderia executar qualquer comando no a servidor SQL). Existem dois arquivos separados para isto: Se voc no congurar o MySQL com --enable-local-infile, ento LOAD DATA LOCAL e a a ser disabilitado por todos os clientes, a menos que se chame mysql_options(... MYSQL_ a OPT_LOCAL_INFILE, 0) no cliente. Veja Seo 12.1.3.40 [mysql_options()], Pgina 809. ca a Para o cliente de linha de comando mysql, LOAD DATA LOCAL pode ser habilitado especicado a opo --local-infile[=1], ou disabilitando com --local-infile=0. ca Por padro, todos os clientes e bibliotacas MySQL so compilados com --enable-locala a infile, para ser compat com o MySQL 3.23.48 e anterior. ivel 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 disabilitado no servidor ou no cliente, voc a e receber a seguinte mensagem de erro (1148): a The used command is not allowed with this MySQL version
233
apagar uma tabela do banco de dados, o servidor se certica que voc tem o privilgio e e select para a tabela ou o privilgio drop para o banco de dados. e Note que se os seus privilgios so alterados (tanto por voc quanto por outro) enquanto e a e voc est conectado, estas alteraes no iro necessariamente ter efeito com a sus prxima e a co a a o consulta ou consultas. Veja Seo 4.4.3 [Privilege changes], Pgina 260 para maiores detalca a hes. O servidor utiliza as tabelas user, db e host no banco de dados mysql em ambos estgios a do controle de acesso. Os campos nestas tabelas de permisso so detalhados abaixo: a a Nome da Tabela user db host Campos Escopo Campos Privilgio e 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
234
max_updates max_ connections No segundo estgio do controle de acesso (vericao da solicitao), o servidor pode, se a a ca ca solicitao involver tabelas, consultar adicionalmente as tabelas tables_priv e columns_ ca priv. Os campos nestas tabelas so mostrados abaixo: a 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 permisses contm campos de escopo e campos de privilgios. o e e Campos de escopo determinam o escopo de cada entrada nas tabelas, isto , o contexto e 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 conexes feitas o ao servidor por bob da mquina thomas.loc.gov. De maneira similar, uma entrada na a tabela db com campos Host, User e Db de thomas.loc.gov, bob e reports devem ser usados quando bob conecta da mquina thomas.loc.gov para acessar o banco de dados a reports. As tabelas tables_priv e columns_priv contem campos de escopo indicando as combinaes de tabelas ou tabela/coluna para o qual cada entrada se aplica. co Para propsitos de vericao de acessos, comparaes de valores Host so caso insensitivo, o ca co a valores User, Password, Db e Table_name so caso sensitivo. Valores Column_name so caso a a insensitivo no MySQL verso 3.22.12 ou posterior. a Campos de privilgios indicam os privilgios concedidos por uma entrada na tabela, isto , e e e quais operaes podem ser realizadas. O servidor combina as informaes de vrias tabelas co co a de concesso para formar uma descrio completa dos privilgios de um usurio. As regras a ca e a usadas para fazer isto so descritas em Seo 4.3.10 [Request access], Pgina 242. a ca a Campos de escopo so strings, declaradas como mostrado abaixo; os valores padro para a a cada a string vazia: e Nome do Campo Host User Password Db Table_name Column_name Tipo CHAR(60) CHAR(16) CHAR(16) CHAR(64) CHAR(60) CHAR(60)
235
Nas tabelas user, db e host, todos campos de privilgios so declarados como e a ENUM(N,Y) cada um pode ter um valor de N ou Y e o valor padro N. a e Nas tabelas tables_ e columns_priv, os campos de privilgios so declarados como campos e a 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 permisses desta forma: o Os campos de escopo da tabela user determinam quando permitir ou aceitar conexes. o Para conexes permitidas, qualquer privilgio concedido em uma tabela user indica o e o privilgio global (superusurio) do usurio. Estes privilgios se aplicam a todos os e a a e bancos de dados no servidor. As tabelas db e host so usadas juntas: a Os campos de escopo da tabela db determinam quais usurios podem acessar dea terminados bancos de dados de mquinas determinadas. Os campos de privilgios a e determinam quais operaes so permitidas. co a A tabela host usada como uma extenso da tabela db quando voc quer que e a e uma certa entrada na tabela db seja aplicada a diversas mquinas. Por exemplo, a se voc deseja que um usurio esteja apto a usar um banco de dados a partir de e a diversas mquinas em sua rede, deixe o campo Host vazio no registro da tabela a db, ento popule a tabela Host com uma entrada para cada uma das mquinas. a a Este mecanismo descrito com mais detalhes em Seo 4.3.10 [Request access], e ca Pgina 242. a As tabelas tables_priv e columns_priv so similares ` tabela db, porm so mais a a e a nas: Elas se aplicam ao nivel de tabelas e colunas em vez do nivel dos bancos de dados. Perceba que os privilgios administrativos (RELOAD, SHUTDOWN e etc) so especicados soe a mente na tabela user. Isto ocorre porque operaes administrativas so operaes no co a co prprio servidor e no so espec o a a icas e no espec a icas dos bancos de dados, portanto no a existe razo para listar tais privilgios nas outras tabelas de permisso. De fato, somente a e a a tabela user necessita ser consultada para determinar se voc pode ou no realizar uma e a operao administrativa. ca O privilgio FILE tambm s especicado na tabela user. Ele no um privilgio ade e oe a e e ministrativo, mas sua habilidade para ler ou escrever arquivo no servidor independtende e do banco de dados que voc est acessando. e a O servidor mysqld le o contedo das tabelas de permisses uma vez, quando iniciado. u o e Alteraes nas tabelas de permisses tem efeito como indicado em Seo 4.4.3 [Alterao de co o ca c privilgios], Pgina 260. e a
236
Quando voc modica o contedo das tabelas de permisses, uma boa idia ter certeza que e u o e e suas alteraes conguraram os privilgios da forma desejada. Para ajuda no diagnostico de co e problemas, veja Seo 4.3.12 [Access denied], Pgina 250. Para conselhos sobre asssuntos ca a de segurana, Veja Seo 4.3.2 [Security], Pgina 229. c ca a Uma ferramenta de diagnstico util o script mysqlaccess, que Yves Carlier fornece na o e distribuio MySQL. Chame mysqlaccess com a opo --help para descobrir como ele ca ca funciona. Perceba que o mysqlaccess confere o acesso usando somente as tabelas user, db e host. Ele no confere privilgios no n de tabelas ou colunas. a e ivel
237
SHUTDOWN SUPER
Os privilegios SELECT, INSERT, UPDATE e DELETE permitem realizar operaes em registros a co nas tabelas existentes em um banco de dados. Instrues SELECT necessitam do privilgio select somente se ele precisar recuperar registros co e de uma tabela. Voc pode executar certas instrues SELECT mesmo sem permisso para e co a acessar algum dos bancos de dados no servidor. Por exemplo, voc pode usar o cliente e mysql como uma simples calculadora: mysql> SELECT 1+1; mysql> SELECT PI()*2; O privilgio INDEX permite a criao ou remoo de e ca ca indices. O privilgio ALTER permite utilizar ALTER TABLE. e Os privilgios CREATE e DROP permitem a criao de novos bancos de dados e tabelas, ou a e ca remoo de bancos de dados e tabelas existentes. ca Perceba que se for concedido o privilgio DROP no banco de dados mysql para algum usurio, e a este usurio pode remover o banco de dados no qual os privilgios de acesso do MySQL a e esto armazenados! a O privilgio GRANT permite a voc fornecer a outros usurios os privilgios que voc mesmo e e a e e possui. O privilgio FILE fornece permisso para ler e escrever arquivos no servidor usando ine a strues LOAD DATA INFILE e SELECT ... INTO OUTFILE. Qualquer usurio que tenha este co a privilgio pode ler ou gravar qualquer arquivo que o servidor MySQL possa ler ou escrever. e O usurio tambm pode ler qualquer arquivo no diretrio de banco de dados atual. O a e o usurio no pode, no entanto, alterar qualquer arquivo existente. a a Os privilgios restantes so usados para operaes administrativas, que so realizadas utie a co a lizando o programa mysqladmin. A tabela abaixo mostra quais comandos do mysqladmin cada privilgio administrativos permite a execuo: e ca Privilgio e 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 permisses. O comando o refresh descarrega todas as tabelas e abre e fecha os arquivos de log. flush-privileges um sinnimo para reload. Os outros comandos flush-* realizam funes similares ao e o co refresh mas so mais limitados no escopo e podem ser prefer a iveis em alguns casos. Por exemplo, se voc deseja descarregar apenas os arquivos log, flush-logs uma melhor e e escolha do que refresh. O comando shutdown desliga o servidor. O comando processlist mostra informaes sobre as threads em execuo no servidor. co ca O comando kill mata threads no servidor. Voc sempre poder mostrar ou matar suas e a
238
prprias threads, mas voc precisa do privilgio PROCESS para mostrar e privilgio SUPER o e e e para matar threads iniciadas por outros usurios. Veja Seo 4.6.7 [KILL], Pgina 301. a ca a E uma boa idia em geral conceder privilgios somente para aqueles usurios que necessitem e e a deles, mas voc deve ter muito cuidado ao conceder certos privilgios: e e O privilgio grant permite aos usurios repassarem seus privilgios a outros usurios. e a e a Dois usurios com diferentes privilgios e com o privilgio grant conseguem combinar a e e seus privilgios. e O privilgio alter pode ser usado para subverter o sistema de privilgios renomeando e e as tabelas. O privilgio FILE pode ser usado com abuso para ler qualquer arquivo de leitura no e servidor em uma tabela de banco de dados, o contedo pode ser acessando utilizando u SELECT. Isto inclui o contedo de todos os bancos de dados hospedados pelo servidor! u O privilgio SHUTDOWN pode ser utilizado para negar inteiramente servios para oturos e c usurios, terminando o servidor. a O privilgio PROCESS pode ser usado para ver o texto das consultas atualmente em e execuo, incluindo as consultas que conguram ou alteram senhas. ca Privilgios no banco de dados mysql pode ser utilizado para alterar senhas e outras e informaes de privilgio de acesso. (Senhas so armazenadas criptografadas, portanto co e a um usurio malicioso no pode simplesmente l-las para saber as senhas em texto puro). a a e Se fosse poss acessar a coluna password do banco mysql.user, seria poss logar ivel ivel ao servidor MySQL como outro usurio. (Com privilgios sucientes, o mesmo usurio a e a pode trocar a senha por outra diferente.) Existema algumas coisas que voc no pode fazer com o sistem de privilgios do MySQL: e a e Voc no pode especicar explicitamente que um determinado usurio deve ter acesso e a a negado. Voc no pode explicitamente comparar um usurio e depois recusar sua e a a conexo. a Voc no pode especicar que um usurio tenha privilgios para criar ou remover e a a e tabelas em um banco de dados, mas no possa criar ou remover o banco de dados. a
239
O nome padro da mquina (hostname) localhost. a a e O nome de usurio padro o mesmo nome do seu usurio no Unix. a a e a Nenhuma senha fornecida se faltar o parmetro -p. e a Ento, para um usurio Unix joe, os seguintes comandos so equivalentes: a a a 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 pode especicar valores padres diferentes para serem usados e o quendo voc faz uma conexo, assim voc no precisa digit-los na linha de comando sempre e a e a a que chamar o programa cliente. Isto pode ser feito de vrias maneiras: a Podem ser especicados parmetros de conexo na seo [client] do arquivo de cona a ca gurao .my.cnf no seu diretrio home. A seo relevante do arquivo deve se parecer ca o ca com isto: [client] host=nome_mquina a user=nome_usurio a password=senha_usurio a Veja Seo 4.1.2 [Option les], Pgina 216. ca a Voc pode especicar parmetros de conexo utilizando variveis de ambiente. O nome e a a a de mquina pode ser especicado para o mysql utilizando a varivel MYSQL_HOST. O a a nome do usurio MySQL pode ser especicado utilizando USER (isto somente para a e Windows). A senha pode ser especicada utilizando MYSQL_PWD (mas isto no seguro; a e veja a prxima seo). Veja Apndice F [Variveis de ambiente], Pgina 1092. o ca e a a
240
Um valor Host de % coincide com qualquer nome de mquina. a Um valor Host em branco signica que o privilgio deve ser adicionado com a entrada e na tabela host que coincide com o nome de mquina fornecido. Voc pode encontrar a e mais informaes sobre isto no prximo cap co o itulo. Como no MySQL Verso 3.23, para valores Host especicados como nmeros IP, voc a u e pode especicar uma mscara de rede indicando quantos bits de endereo sero usados a c a para o nmero da rede. Por exemplo: u mysql> GRANT ALL PRIVILEGES ON db.* -> TO [email protected]/255.255.255.0; Isto permitir que todos a se conectarem a partir de determinado IP cuja condio a ca seguinte seja verdadeira: IP_usurio & mscara_rede = ip_maquina. a a No exemplo acima todos IPs no Intervalo 192.58.197.0 - 192.58.197.255 podem se conectar ao servidor MySQL. Metacaracteres no so permitidos no campo User, mas voc pode especicar um valor a a e em branco, que combina com qualquer nome. Se a entrada na tabela user que casa com uma nova conexo tem o nome do usurio em branco, o usurio considerado como a a a e um usurio annimo (o usurio sem nome), em vez do nome que o cliente especicou. a o a Isto signica que um nome de usurio em branco usado para todos as vericaes de a e co acessos durante a conexo. (Isto , durante o estgio 2). a e a O campo Password pode car em branco. O que no signica que qualquer senha possa a ser usada, signica que o usurio deve conectar sem especicar uma senha. a Valores de Password que no esto em branco so apresentados como senhas criptografadas. a a a O MySQL no armazena senhas na forma de texto puro para qualquer um ver. Em vez disso, a a senha fornecida por um usurio que est tentando se conectar criptografada (utilizando a a a e funo PASSWORD()). A senha criptografada ento usada quando o cliente/servidor estiver ca e a conferindo se a senha correta (Isto feito sem a senha criptografada sempre trafegando e e sobre a conexo.) Perceba que do ponto de vista do MySQL a senha criptografada a a e senha REAL, portanto voc no deve pass-la para ningum! Em particular, no fornea e a a e a c a usurios normais acesso de leitura para as tabelas no banco de dados mysql! A partir a da verso 4.1, o MySQL emprega um mecanismo de senha e login diferente que seguro a e mesmo se zerem um sni nos pacotes TCP/IP e/ou o banco de dados mysql capturado. e Os exemplos abaixo mostram vrias combinaes de valores de Host e User nos registros a co da tabela user aplicando a novas conexes: o Valor em host thomas.loc.gov % % %.loc.gov Valor user fred fred em Conexes casadas com o registro o Qualquer usurio, a conectando de thomas.loc.gov fred, conectando a partir de qualquer mquina a Qualquer usurio, conectando a partir de a qualquer mquina a fred, conectando de qualquer mquina do a dom inio loc.gov
241
fred, conectando de x.y.net, x.y.com,x.y.edu, etc. (Isto provavelmente no util) a e 144.155.166.177 fred fred, conectando da mquina com ena dereo IP 144.155.166.177 c 144.155.166.% fred fred, conectando de qualquer mquina na a subrede de classe C 144.155.166 144.155.166.0/255.255.255.0 fred o mesmo que no exemplo anterior Como voc pode usar valores coringas de IP no campo Host (por exemplo, 144.155.166.% e combina com todas mquinas em uma subrede), existe a possibilidade que algum possa a e tentar explorar esta capacidade nomeando a mquina como 144.155.166.algumlugar.com. a Para evitar tais tentativas, O MySQL desabilita a combinao com nomes de mquina ca a que iniciam com digitos e um ponto. Portanto se voc possui uma mquina nomeada e a como 1.2.foo.com, este nome nunca ir combinar com uma coluna Host das tabelas de a permisses. Somente um nmero IP pode combinar com um valor coringa de IP. o u Uma conexo de entrada pode coincidir com mais de uma entrada na tabela user. Por a exemplo, uma conexo a partir de thomas.loc.gov pelo usurio fred pode combinar com a a diversas das entradas vistas na tabela anterior. Como o servidor escolhe qual entrada usar se mais de uma coincide? O servidor resolve esta questo ordenando a tabela user no a tempo de inicializao, depois procura pelas entradas na ordem da classicao quando um ca ca usurio tenta se conectar. A primeira entrada que coincidir a que ser usada. a e a A ordenao da tabela user funciona da forma mostrada a seguir. Suponha que a tabela ca user se parea com isto: c +-----------+----------+| Host | User | ... +-----------+----------+| % | root | ... | % | jeffrey | ... | localhost | root | ... | localhost | | ... +-----------+----------+Quando o servidor l a tabela, ele ordena as entradas com os valores mais espec e icos de Host primeiro (% na coluna Host signica qualquer mquina e menos espec a e ico). Entradas com o mesmo valor Host so ordenadas com os valores mais espec a icos de User primeiro (um valor em branco na coluna User signica qualquer usurio e menos espec a e ico). O resultado da tabela user ordenada caria assim: +-----------+----------+| Host | User | ... +-----------+----------+| localhost | root | ... | localhost | | ... | % | jeffrey | ... | % | root | ... +-----------+----------+Quando uma conexo iniciada, o servidor procura entre as entradas ordenadas e utiliza a a e primeira entrada coincidente. Para uma conexo a partir de localhost feito por jeffrey, a
x.y.%
fred
242
as entradas com localhost na coluna Host coincide primeiro. Destas, a entrada com o nome do usurio em branco combina com o nome da mquina e o nome do usurio. (A a a a entrada %/jeffrey tambm casaria, mas ela no a primeira entrada coincidente na e a e tabela. Aqui est outro exemplo. Suponha que a tabela user fosse assim: a +----------------+----------+| Host | User | ... +----------------+----------+| % | jeffrey | ... | thomas.loc.gov | | ... +----------------+----------+A tabela ordenada pareceria com isto: +----------------+----------+| Host | User | ... +----------------+----------+| thomas.loc.gov | | ... | % | jeffrey | ... +----------------+----------+Uma conexo a partir de thomas.loc.gov feita por jeffrey coincide com a primeira ena trada, no entanto, uma conexo de whitehouse.gov fetia por jeffrey coincidiria com a a segunda entrada na tabela. Um erro comum pensar que para um determinado usurio, todas as entradas que citam e a explicitamente este usurio sero usadas primeiro quando o usurio tentar encontrar uma a a a combinao para a conexo. Simplesmente isto no verdade. O exemplo anterior ilustra ca a a e isto, onde uma conexo de thomas.loc.gov feita por jeffrey combina primeiro no com a a a entrada contendo jeffrey no valor do campo user, mas sim pela entrada sem o nome de usurio! a Se voc tiver problemas conectando ao servidor, imprima a tabela user e ordene-a na e manualmente para ver onde se deu o primeiro coincidncia de valores. Se a conexo obtiver e a sucesso mas os seus privilgios no so os esperados, voc pode usar a funo CURRENT_ e a a e ca USER() (nova na verso 4.0.6) para ver com qual combinao usurio/mquina a sua conexo a ca a a a coincide. Veja Seo 6.3.6.2 [CURRENT_USER()], Pgina 547. ca a
243
concede a algum o privilgio delete, este usurio pode apagar linhas de qualquer banco e e a de dados no servidor! Em outras palavras, privilgios na tabela user so privilgios de e a e superusurio. O correto conceder privilgios na tabela user apenas para superusurios a e e a tais como os administradores de servidor ou de bancos de dados. Para outros usurios, a voc deve deixar os privilgios na tabela user congurados para N e conceder privilgios e e e somente em bancos de dados espec icos, utilizando as tabelas db e host. As tabelas db e host concedem privilgios para bancos de dados espec e 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 deseja usar um caracter _ como parte de um nome de banco de dados, especiquee o como \_ no comando GRANT. O valor % em Host na tabela db signica qualquer mquina. Um valor em branco a em Host na tabela db signica consulte a tabela host para informao adicional. ca O valor % ou em branco no campo Host na tabela host signica qualquer mquina. a 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 usurio annimo. a o As tabelas db e host so lidas e ordenadas quando o servidor inicia (ao mesmo tempo que a ele l a tabela user). A tabela db ordenada nos campos de escopo Host, Db e User e a e e tabela host ordenada nos campos de escopo Host e Db. Assim como na tabela user, a e ordenao coloca os valores mais espec ca icos no in e os menos espec icio icos por ultimo, e quando o servidor procura por entradas coincidentes, ele usa a primeira combinao que ca encontrar. As tabelas tables_priv e columns_priv concedem privilgios espec e 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 mquina a Os campos Db, Table_name e Column_name no podem conter meta caracteres ou serem a brancos em ambas tabelas. As tabelas tables_priv e columns_priv so ordenadas nos campos Host, DB e User. Isto a parecido com a ordenao da tabela db, no entanto, a ordenao mais simples porque e ca ca e somente o campo Host pode conter meta caracteres. O processo de vericao da requisio descrito abaixo. (Se voc j est familiarizado ca ca e e a a com o cdigo de vericao de acesso, voc ir perceber que a descrio aqui um pouco o ca e a ca e diferente do algor itimo usado no cdigo. A descrio equivalente ao que o cdigo realmente o ca e o faz; ele s diferente para tornar a explicao mais simples.) oe ca Para requisies administrativas (SHUTDOWN, RELOAD, etc.), o servidor confere somente a co entrada da tabela user, porque ela a unica tabela que especica privilgios administrae e tivos. O acesso concedido se o registro permitir a operao requisitada ou negado caso e ca o contrrio. Por exemplo, se voc deseja executar mysqladmin shutdown mas a entrada a e em sua tabela user no lhe concede o privilgio SHUTDOWN, o acesso negado mesmo sem a e e consultar as tabelas db ou host. (elas no contm o campo Shutdown_priv, portanto no a e a existe esta necessidade.)
244
Para requisies relacionadas aos bancos de dados (insert, udpdate, etc.), o servidor co primeiro confere os privilgios globais do usurio consultando as entradas da tabela user. e a Se a entrada permitir a operao requisitada, o acesso concedido. Se os privilgios globais ca e e na tabela user so insucientes, o servidor determina os privilgios espec a e icos de banco de dados para o usurio consultando as tabelas db e host: a 1. O servidor consulta a tabela db por uma combinao nos campos Host, Db e User. Os ca campos Host e User so comparados com o nome da mquina e o nome do usurio que a a a faz a requisio. O campo Db comparado com o banco de dados que o usurio deseja ca e a acessar. Se no existir entradas coincidentes para o Host e User, o acesso negado. a e 2. Se existir uma combincao com a entrada da tabela db e seu campo Host no estiver ca a em branco, aquela entrada dene os privilgios especicos do banco de dados do usuario. e 3. Se o registro coincidente da tabela db tiver o campo Host em branco, signica que a tabela host enumera quais mquinas so permitidas acessar o banco de dados. Neste a a caso, uma consulta adicional feita na tabela host para encontrar uma valores coincie dentes nos campos Host e Db. Se nenhuma entrada na tabela host coincide, o acesso negado. Se existir uma coincidncia, os privilgios espec e e e icos de bancos de dados para o usurio so computados como a interseo (no a unio!) dos privilgios nas a a ca a a e entradas das tabelas db e host, isto , os privilgios que so Y em ambas entradas. e e a (Desta forma voc pode conceder privilgios gerais em entradas na tabela db e ento e e a restringi-los em uma base de mquina a mquina utilizando as entradas da tabela a a host.) Depois de determinar os privilgios espec e icos do banco de dados concedido pelas entradas nas tabelas db e host, o servidor os adiciona aos privilgios globais concedidos pela tabela e user. Se o resultado permitir a operao requisitada, o acesso ser concedido. De outra ca a forma, o servidor consulta os privilgios de tabelas e campos do usuario nas tabelas tables_ e priv e columns_priv e os adiciona aos privilgios do usurio. O acesso ser permitido ou e a a negado baseado no resultado. Expresso em termos booleanos, a descrio precedente de como os privilgios de um usurio ca e a so calculados podem ser resumido assim: a global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges Ele pode no ser aparente porque, se os privilgios da entrada global de user so inicialmente a e a insucientes para a operao requisitada, o servidor adiciona estes privilgios mais tarde aos ca e privilgios espec e icos de banco de dados, tabelas e colunas. A razo que uma requisio a e ca pode exigir mais que um tipo de privilgio. Por exemplo, se voc executar uma instruo e e ca INSERT ... SELECT, voc precisa dos privilgios INSERT e SELECT. Seu privilgio pode ser e e e tal que a entrada da tabela user concede um privilgio e a entrada da tabela db concede e o outro. Neste caso, voc tem os privilgios necessrios para realizar a requisio, mas o e e a ca servidor no pode obt-los de ambas as tabelas por si prprio; os privilgios concedidos a e o e 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 contm uma lista de todas as mquina na rede local. A elas so e a a concedidos todos os privilgios. e
245
Voc pode tambm usar a tabela host para indicar mquinas que no so seguras. Suponha e e a a a que voc tenha uma mquina public.your.domain que est localizada em uma rea pblica e a a a u que voc no considera segura. Voc pode permitir o acesso a todas as mquinas de sua e a e a rede exceto a esta mquina usando entradas na tabela host desta forma: a +--------------------+----+| Host | Db | ... +--------------------+----+| public.your.domain | % | ... (todos os privilgios configurados para N) e | %.your.domain | % | ... (todos os privilgios configurados para Y) e +--------------------+----+Naturalmente, voc deve sempre testar suas entradas nas tabelas de permisses (por exe o emplo, usar o mysqlaccess para ter certeza que os privilgios de acesso esto atualmente e a congurados da forma que voc imagina. e
246
A seguinte discusso descreve a diferena entre o antigo e o novo mecanismo de senha, e a c o que voc deve fazer se voc atualizar o seu servidor para a verso 4.1 mas precizar de e e a manter compatibilidade com clientes pre-4.1. Nota: Esta discusso contrasta no comportamento da verso 4.1 com o comportamento da a a pre-4.1, mas o da verso 4.1 descrito aqui comea relamente na verso 4.1.1. O MySQL a c a e uma distribuio disferente porque ela tem um mecanismo um pouco diferente daquele ca implementado na 4.1.1 e acima. Diferenas entre a verso 4.1.0 e as verses mais recentes c a o so descritas posteriormente. a Antes do MySQL 4.1, o hash de senha calculado pela funo PASSWORD() tem tamanho de ca 16 bytes. Este hash se parece com: mysql> SELECT PASSWORD(mypass); +--------------------+ | PASSWORD(mypass) | +--------------------+ | 6f8c114b58f2ce9e | +--------------------+ A coluna Password da tabela user (na qual estes hashes so armazenados) tambm tm 16 a e e bytes de tamanho antes do MySQL 4.1. A partir do MySQL 4.1, a funo PASSWORD() foi modicada para produzir um valor hash ca de 41 bytes. mysql> SELECT PASSWORD(mypass); +-----------------------------------------------+ | PASSWORD(mypass) | +-----------------------------------------------+ | *43c8aa34cdc98eddd3de1fe9a9c2c2a9f92bb2098d75 | +-----------------------------------------------+ De acordo com o mostrado, a coluna Password na tabela user tambm deve ter 41 bytes e para armazeanar estes valores. Se voc realiza uma nova instalao do MySQL 4.1, a coluna Password ser convertida e ca a para o tamanho de 41 bytes automaticamente. Se voc atualizar uma instalao mais antiga para a verso 4.1, voc executar o script e ca a e mysql_fix_privilege_tables para atualizar o tamanho da coluna Password de 16 para 41 bytes. (O script no altera valores de senhas existentes, que continuam com a 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 diferena bvia o tamanho (16 bytes versus 41 bytes) c o e A segunda diferena que os hashes de senha no novo formato sempre comeam com c e c um caracter *, que as senhas no formato antigo nunca faziam. O formato maior do hash de senha tetm melhores propriedades criptogrcas, e a autena ticao do cliente baseada em hashs mais longos mais segura que aquela baseada nos ca e antigos hashes menores.
247
A diferena entre os hashs de senhas menores e maiores so relevantes em como o servidor c a usa as senhas durante a autenticao e como ela gera hash de senhas para clientes conectados ca que realizam operaes de alterao de senha. co ca O modo no qual o servidor usa o hash de senha durante a autenticao afetada pela ca e largura da coluna Password: Se a coluna no for larga, apenas a autenticao de hash curto usada. a ca e Se a coluna larga, ela pode guardar tanto hash curtas quanto hashs longas, e o servidor e pode usar ambos os formatos: Clientes pre-4.1 podem conectar, mas como els s conhecem o mecanismo hash o antigo, eles s podem se conectar pelas contas com hashes curtos. o Clientes 4.1 podem autenticar contas com hashes longos ou curtos. Para contas com o hash curto, o processo de autenticao na verdade um pouco mais seguro ca e para clientes 4.1 que para clientes mais antigos. Em termos de segurana, o gradiente do c 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 afetado pela e largura da coluna Password e pela opo --old-passwords. Um servidor 4.1 gera hashes ca longos apenas se certas condices forem encontradas: A coluna Password deve ser grande o o suciente para armazenar valores longos e a opo --old-passwords no deve ser dada. ca a Estas condies se aplicam da seguinte forma: co A coluna Password deve ser grande o suciente para armazenar hashes longos (41 bytes). Se a coluna no foi atualizada e ainda tem a largura de 16 bytes (antes da a 4.1), o servidor avisa que o hash no pode caber nela e gera apenas hashes curtos a quando um cliente realiza a operao de troca de senha usando PASSWORD(), GRANT, ca ou SET PASSWORD. (Este comportamento ocoree se voc tiver atualizado para a verso e a 4.1 mas no executou o script mysql_fix_privilege_tables para aumentar a coluna a Password.) Se a coluna Password for larga, ela poder aramazenar tanto os hashes de senha curtos a quanto os longos. Neste caso, PASSWORD(), GRANT, e SET PASSWORD iro gerar hashes a longos a menos que o servidor tenha sido iniciado com a opo --old-passwords. Esta ca opo fora o servidor a gerar hashes de senha curtos. ca c O propsito da opo --old-passwords permitir que voc mantenha compatibilidade com o ca e e clientes com verses anteriores ` 4.1 sob circunstncias nas quais os servidores gerariam o a a hashes de senha longos. Ele no afeta a autenticao (clientes 4.1 podem ainda usar contas a ca que possuem hash de senha longo), mas ele no previne a criaa de um hash de senha longo a co na tabela user como resultado de uma operao de troca de senha. Onde isto ocorrer, a ca conta no mais poder ser usada por clientes pr-4.1. Se a opo --old-passwords, o a a e ca seguinte cenrio poss a e ivel: Um cliente antigo conecta a uma conta que tm um hash de senha curto. e O cliente altera a senha das contas. Sem --old-passwords, isto resulta na conta que tm um hash de senha longo. e
248
A prxima vez que o cliente antigo tentar se conectar ` conta, ele no conseguir, o a a a porque a conta agora exige o novo mecanismo de hash durante a autenticao. (Uma ca vez que uma conta tem um hash de senha longo na tabela de usurio, apenas os clientes a 4.1 podero ser autenticados, porque clientes de verses anteriores a 4.1 no entendem a o a o hash longo.) Este cenrio mostra que perigoso executar um servidor 4.1 sem usar a opo --olda e ca passwords, operaes de alterao de senha no iro gerar hashes de senha longos e assim co ca a a no faz com que as contas se tornem inacess a iveis para clientes mais antigos. (Estes clientes no podem bloquear eles mesmos inadivertidamente alterando suas senhas e cando com a um hash de senha longo. A desvantagem da opo --old-passwords que qualquer senha que voc criar ou alterar ca e e usar hashes curtos, mesmo para clientes 4.1. Assim, voc perde a segurana adicional a e c fornecida pelos hashes de senha longos. Se voc quiser criar uma conta qye tenha um hash e longo (por exemplom parr uso pelos clientes 4.1), voc deve faz-lo enquanto executa o e e servidor sem a opo --old-passwords. ca Os seguintes cenrios so poss a a iveis para executar um servidor 4.1: Cenario 1) Coluna Password menor na tabela de usurios a Apenas hashes curtos podem ser armazenados na coluna Password. O servidor usa apenas hasghes curtos durante a autenticao do cliente. ca Para clientes conectados, operaes de gerao de hash de senha envolvendo co ca PASSWORD(), GRANT ou SET PASSWORD usa hashes curtos exclusivamebnte. Qualquer alterao a senha de uma conta faz com que a conta tenha um hash de senha curto. ca A opo --old-passwords pode ser usada mas superua porque com uma coluna ca e Password menor, o servidor ir gerar hashes de senha curtos de qualquer forma. a Cenrio 2) Colunas Password longas; servidor no iniciado com a opo --old-passwords a a ca 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 podem autenticar contas com hash curto. o Para clientes conectados, operaes de gerao de hash de senha envolvendo co ca PASSWORD(), GRANT, ou SET PASSWORD usam hashes longos exclusivamente. Qualquer mudana na senha de uma conta far com que ela possua um hash de senha longo. c a 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 cenrio que poss a e e ivel que contas com hashes de senha curtos se tornem inacessiveis para cliente anteriores ao 4.1. Qualquer alterao a senha de uma conta feita via GRANT, SET PASSWORD, ou PASSWORD() faz com que ca a conta tenha um hash de senha longo, e a partir deste ponto, nenhum cliente anterior ao 4.1 poder autenticar esta conta at que ele seja atualizado para a verso 4.1. a e a Cenrio 3) Coluna Password longa; servidor iniciado com a opo --old-passwords a ca
249
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 poss e ivel criar hashes longos apenas quando o servidor iniciado sem --olde passwords). Clientes anteriores ao 4.1 podem autentticar apenas contas com hashes curtos. Para clientes conectados, operaes de gerao de hash de senha envolvendo co ca PASSWORD(), GRANT, ou SET PASSWORD usa hashes curtos exclusivamente. Qualquer alterao em uma senha de conta faz com que a conta tenha um hash de senha curto. ca Neste cenrio, voc no pode criar contas que tenham hashes de senha longo, porque -a e a old-passwords previne a criao de hashes longos. Tambm, se voc criar uma conta com ca e e um hash longo antes de usar a opo --old-passwords, alterar a senha da conta enquanto ca --old-passwords est funcionando faz com que seja dada a conta uma sena curta, fazendo a com que ela perca os benef icios de segurana de um hash longo. c As disvantagens para este cenrio pode ser resumido como a seguir: a Cenrio 1) Voc no pode tirar vantagem do hash longo que fornece mais autenticao a e a ca segura. Cenrio 2) Contas com hashes curtos tornam clientes anteriores ao 4.1 inacess a iveis se voc e alterar a senha deles sem usar OLD_PASSWORD() explicitamente. Cenrio 3) --old-passwords evita que as contas com hashes curtos se tornem inacess a iveis, mas operaes de alterao de senhas fazem com que as contas com hashes longos seja co ca revertida para hashes curtos, e voc no pode alter-las de volta para hashes longos enquanto e a a --old-passwords est em efeito. a
250
251
Se os seus privilgios parecerem alterados no meio de uma sesso, pode ser que o e a superusurio os alterou. A recarga das tabelas de permisses afeta novas conexes a o o dos clientes, mas ela tambm afeta conexes existentes como indicado em Seo 4.4.3 e o ca [Privilege changes], Pgina 260. a Se voc no consegue fazer a sua senha funcionar, lembre-se que voc deve usar a e a e funo PASSWORD() se voc congurar a senha com instrues INSERT, UPDATE ou ca e co SET PASSWORD. A funo PASSWORD() desnecessria se voc especicar a senha usca e a e ando a instruo GRANT ... IDENTIFIED BY ou o comando mysqladmin password. Veja ca Seo 4.4.8 [Senhas], Pgina 266. ca a localhost um sinnimo para seu nome de mquina local, e tambm a mquina e o a e e a padro em que clientes tentam se conectar se voc no especicar explicitamente o a e a nome da mquina. Entretanto, conexes para localhost no funcionam se voc esa o a e tiver executando em um sistema que utilize MIT-pthreads (conexes localhost so o a feitas utilizando sockets Unix, que no so suportadas pelas MIT-pthreads). Para a a evitar este problema nestes sistemas, voc deve utilizar a opo --host para nomear e ca explicitamente o servidor. Isto far uma conexo TCP/IP ao servidor myssqld. Neste a a caso, voc deve ter seu nome de mquina real nos registros da tabela user no servidor. e a (Isto verdadeiro mesmo se voc estiver executando um programa cliente na mesma e e mquina que o servidor.) a Se voc obter o erro Access denied quando tentando conectar ao banco de dados com e mysql -u nome_usurio _nome_bd, voc pode ter um problema com a tabela user. a e Verique isto executando mysql -u root mysql e usando esta sentena SQL: c 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 usurio no MySQL. a A mensagem de erro Access denied ir dizer a voc com qual usurio voc est tena e a e a tando se logar, a mquina que est tentando conectar e se voc est utilizando uma a a e a senha ou no. Normalmente, voc deve ter um registro na tabela user que combine a e exatamente com o nome de mquina e o nome de usurio que forem fornecidos na a a mensagem de erro. Por exemplo, se voc obter uma mensagem de erro que contenha e Using password: NO, isto signica que voc est tentando se conectar sem uma senha. e a Se voc obter o seguinte erro quando estiver tentando conectar de uma mquina difere a ente da que o servidor MySQL estiver executando, ento no deve existir um registro a a na tabela user que combine com esta mquina: a Host ... is not allowed to connect to this MySQL server Voc pode corrigir isto utilizando a ferramenta de linha de comando mysql (no servie dor!) para adicionar um registro ` tabela user, db ou host para coincidir com o usurio a a e nome de mquina de onde voc est tentando conectar, depois execute o comando a e a mysqladmin flush-privileges. Se voc no estiver executando o MySQL Verso 3.22 e a a e voc no sabe o nmero IP ou o nome da mquina da qual estiver conectando, voc e a u a e deve colocar uma entrada com o valor % na coluna Host da tabela user e reiniciar o mysqld com a opo --log na mquina onde executado o servidor. Depois tente ca a e conectar a partir da mquina cliente, a informao no log do MySQL ir indicar como a ca a voc est realmente conectando. (Ento troque o % na tabela user com o nome da e a a mquina mostrado pelo log. De outra forma voc teria um sistema que seria inseguro.) a e
252
Outra razo para este erro no Linux pode ser porque voc est utilizando uma verso a e a a binria do MySQL que compilada com uma verso diferente da glibc que voc est a e a e a usando. Neste caso voc deve atualizar seu SO/Glibc ou fazer o download da verso e a fonte do MySQL e compil-la. Um RPM fonte , normalmente, fcil de compilar e a e a instalar, logo, isto no um grande problema. a e Se voc obter uma mensagem de erro onde o nome da mquina no exibido ou, no e a a e lugar do nome da mquina existir um IP, mesmo se voc tenta a conexo com um nome a e a de mquina: a 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 pode executar mysqladmin flush-hosts para zerar e o cache DNS interno. Veja Seo 5.5.5 [DNS], Pgina 459. ca a Algumas solues permanentes so: co a Tente descobrir o que est errado com seu servidor DNS e corrija os erros. a Especique nmeros IPs no lugar de nomes nas tabelas de privilgios do MySQL. u e Inicie o mysqld com --skip-name-resolve. Inicie o mysqld com --skip-host-cache. Conecte ` localhost se voc estiver executando o servidor e o cliente na mesma a e mquina. a Coloque os nomes das mquinas clientes em /etc/hosts. a Se mysql -u root test funciona mas mysql -h nome_servidor -u root test resultar em Access denied, ento voc pode no ter o nome correto para a sua mquina na a e a a tabela user. Um problema comum quando o valor de Host na entrada da tabela e user especica um nome de mquina no qualicado, mas as rotinas de resoluo de a a ca nomes de seu sistema retornam um nome qualicado completo do dom inio (ou viceversa). Por exemplo, se voc tem uma entrada com o nome tcx na tabela user, mas e seu DNS diz ao MySQL que o nome da mquina tcx.subnet.se, a entrada no a e a ir funcionar. Tente adicionar um registro ` tabela user que contenha o nmero IP a a u de sua mquina como o valor da coluna Host. (Uma alternativa, seria adicionar um a registro ` tabela user com o valor de Host contendo um metacaracter, por exemplo, a tcx.%. Entretanto, o uso de nomes de mquinas terminando com % inseguro e a e no recomendado!) a e Se mysql -u nome_usurio test funciona mas mysql -u nome_usurio outro_bd no a a a funconar, voc no possui uma entrada para outro_bd listado na tabela db. e a Se mysql -u nome_usurio nome_bd funciona quando executado no prprio servidor, a o mas mysql -u nome_mquina -u nome_usurio nome_bd no funciona quando execua a a tado em outra mquina cliente, voc no possui o nome da mquina cliente listado na a e a a tabela user ou na tabela db. Se voc no estiver entendendo porque obtem Access denied, remova da tabela user e a todas as entradas da coluna Host que contenham meta caracteres (entradas que contenham $ ou _). Um erro muito comum inserir uma nova entrada com Host=% e e User=algum usurio, pensando que isto ir permitir a voc especicar localhost a a e para conectar da mesma mquina. A razo disto no funcionar que os privilgios a a a e e
253
padres incluem uma entrada com Host=localhost e User=. Como esta entrada o tem o valor localhost em Host que mais espec e ica que %, ela usada no lugar e da nova entrada quando se conectar de localhost! O procedimento correto inserir e uma segunda entrada com Host=localhost e User=algum_usurio, ou remover a a entrada com Host=localhost e User= . Se voc obter o seguinte erro, voc pode ter um problema com a tabela db ou a tabela e e host: Access to database denied Se a entrada selecionada da tabela db tiver um valor vazio na coluna Host, tenha certeza que exista uma ou mais entradas correspondentes na tabela host especicando quais mquinas aplicam-se ` tabela db. a a Se voc obter o erro quando estiver utilizando comandos SQL SELECT ... INTO e OUTFILE ou LOAD DATA INFILE, a entrada na tabela user provavelmente no tem o a privilgio le habilitado. e Lembre-se que programas clientes iro usar parmetros de conexes especicados em a a o arquivos de congurao ou variveis ambientais. Veja Apndice F [Environment varica a e ables], Pgina 1092. Se parecer que algum cliente est enviando parmetros errados a a a para a conexo e voc no os especicou na linha de comando, verique seu ambiente e a e a o arquivo .my.cnf no seu diretrio home. Voc pode tambm conferir os arquivos de o e e conguraes do servidor MySQL, apesar de no ser interessante gravar conguraes co a co de cliente nestes arquivos. Veja Seo 4.1.2 [Option les], Pgina 216. Se voc obter ca a e a mensagem de acesso negado (Access denied) quando estiver executando um cliente sem opes, tenha certeza que voc no especicou uma senha antiga em nenhum de co e a seus arquivos de opes! Veja Seo 4.1.2 [Option les], Pgina 216. co ca a Se voc zer alteraes para as tabelas de permisses diretamente (utilizando uma ine co o struo INSERT ou UPDATE) e suas alteraes parecem ser ignoradas, lembre que voc ca co e deve usar uma instruo FLUSH PRIVILEGES ou executar um comando mysqladmin ca flush-privileges para o servidor ler novamente as tabelas com os privilgios. De e outra forma, suas alteraes no faro efeito at que o servidor seja reiniciado. Lembreco a a e se que depois de congurar a senha de root com um comando UPDATE, no ser a a necessrio especicar a senha at que voc atualize os privilgios, pois o servidor ainda a e e e no saber que voc alterou a senha! a a e Se voc tiver problemas de acesso com Perl, PHP, Python ou um programa ODBC, e tente conectar ao servidor com mysql -u nome_usurio nome_bd ou mysql -u nome_ a usurio -psua_senha nome_bd. Se voc consegue conectar com o cliente mysql, existe a e algum problema com seu programa e no o acesso aos privilgios (Note que no espao a e a c entre -p e a senha; voc tambm pode utilizar a sintaxe --password=sua_senha para e e especicar a senha. Se voc utilizar a opo -p sozinha, o MySQL ir lhe solicitar a e ca a senha.) Para testar, iniciae o daemon mysqld com a opo --skip-grant-tables. Ento voc ca a e pode alterar as tabelas de permisses do MySQL e utilizar o script mysqlaccess para o conferir se suas modicaes zeram o no o efeito desejado. Quando voc estiver co a e satisfeito com suas alteraes, execute mysqladmin flush-privileges para dizer ao co servidor mysqld para iniciar utilizando as novas tabelas com os privilgios. Nota: e Recarregar as tabelas de permisses sobrescreve a opo --skip-grant-tables. Isto o ca
254
lhe permite dizer ao servidor para comear a utilizar as tabelas de permisses novamente c o sem reinici-lo. a Se tudo mais falhar, inicie o servidor mysqld com uma opo de depurao (por exemca ca plo, --debug=d,general,query). Isto ir imprimir informaes de mquinas e usurios a co a a sobre tentativas de conexes, e tambm informaes sobre cada comando disparado. o e co Veja Seo E.1.2 [Making trace les], Pgina 1080. ca a Se voc tiver outros problemas com as tabelas de permisses do MySQL e sente que e o deve enviar o problema para a lista de discusso, sempre fornea um descarga das a c tabelas de permisses do seu MySQL. Voc pode descarregar as tabelas com o comando o e mysqldump mysql. Como sempre, envie seus problemas utilizando o script mysqlbug. Veja Seo 1.7.1.3 [Bug reports], Pgina 36. Em alguns casos voc pode precisar ca a e reiniciar o mysqld com a opo --skip-grant-tables para executar o mysqldump. ca
255
N dos bancos de dados ivel Privilgios de bancos de dados aplicam-se a todas as tabelas em um determinado e banco de dados. Estes privilgios so armazenados nas tabelas mysql.db e e a mysql.host. GRANT ALL ON db.* e REVOKE ALL ON db.* concedero e revogaro a a apenas privilgios de banco de dados. e N das tabelas ivel Privilgios de tabelas aplicam-se a todas as colunas em uma determinada e tabela. Estes privilgios so armazenados na tabela mysql.tables_priv. e a GRANT ALL ON db.table e REVOKE ALL ON db.table concedero e revogaro a a apenas privilgios de tabelas. e N das colunas ivel Privilgios de colunas aplicam-se a uma unica coluna em uma determinada e tabela. Estes privilgios so armazenados na tabela mysql.columns_priv. e a Para as instrues GRANT e REVOKE, tipo_priv pode ser especicado como um dos seguintes: co 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 privilgios simples exceto WITH GRANT e 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 usurio execute stored procedures (MySQL 5.0) a 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 privilgio SELECT. e Permite o uso de SHOW FULL PROCESSLIST Para o futuro Permite o uso de FLUSH Da o direto ao usurio de perguntar onde o slave/master est. a a Necessrio para a replicao dos slaves (para ler logs binrio a ca a do master). Permite o uso de SELECT SHOW DATABASES exibe todos os banco de dados. Permite o uso de mysqladmin shutdown Permite a conexo (uma vez) mesmo se max connections a tiverem sido alcanados e executa o comando CHANGE MASTER, c KILL thread, mysqladmin debug, PURGE MASTER LOGS e SET GLOBAL Permite o uso de UPDATE Sinnimo para sem privilgios. o e Sinnimo para WITH GRANT OPTION o
USAGE pode ser usado quando voc quer criar um usurio sem privilgios. e a e
256
Os privilgios CREATE TEMPORARY TABLES, EXECUTE, LOCK TABLES, REPLICATION ..., SHOW e DATABASES e SUPER so novos na verso 4.0.2. Para usar estes novos privilgios aps ata a e o ualizar para 4.0.2, voc tem que executar o script mysql_fix_privilege_tables. Veja e Seo 2.5.6 [Upgrading-grant-tables], Pgina 130. ca a Em verses anteriores do MySQL, o privilgio PROCESS d o mesmo direitos que o novo o e a privilgio SUPER. e Para anular o privilgio grant de um usurio, utilize o valor tipo_priv de GRANT OPTION: e a mysql> REVOKE GRANT OPTION ON ... FROM ...; Os unicos valores de tipo_priv que voc pode especicar para uma tabela so SELECT, e a INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX e ALTER. Os unicos valores de tipo_priv que voc pode especicar para uma coluna (isto , quando e e voc usar uma clusula column_list) so SELECT, INSERT e UPDATE. e a a O MySQL permite que voc crie privilgios a n de banco de dados mesmo se o banco de e e ivel dados no existir para tornar fcil de se preparar para o uso do banco de dados. Atualmente, a a no entanto, o MySQL no permite criar permisses de a n a o ivel de tabela se a tabela no a existir. O MySQL no revogar automaticamente qualquer privilgio, mesmo se voc apagar a a e e uma tabela ou banco de dados. Voc pode congurar privilgios globais utilizando a sintaxe ON *.*. Voc pode congurar e e e privilgios de bancos de dados utilizando a sintaxe ON nome_bd.*. Se voc especicar ON e e * e estiver com algum banco de dados aberto, ser congurado os privilgios somente para a e este banco de dados. (AVISO: Se voc especicar ON * e voc no tem possui um banco de e e a dados aberto, ir afetar os privilgios globais!). a e Note por favor Os metacaracteres _ e % so permitidos na especicao dos nomes de a ca bancos de dados em comandos GRANT. Isto signica que se voc deseja usar um caracater e _ como parte de um nome de banco de dados, voc deve especic-lo como \_ no coe a mando GRANT, para prevenir o usurio de poder acessar bancos de dados adicionais que a correspondam ao padro do metacaracter, ex., GRANT ... ON foo\_bar.* TO .... a Para acomodar concesses de direitos para usurios de mquinas arbitrrias, o MySQL suo a a a porta a especicao do valor user_name no formato usurio@mquina. Se voc desejar ca a a e especicar uma string user contendo caracteres especiais (como o -), ou uma string contendo caracteres especiais ou meta caracteres (como o %), voc pode colocar o usurio ou e a o nome de mquina entre aspas (por exemplo, usurio-teste@mquina-teste). a a a Voc pode especicar meta caracteres no nome da mquina. e a Por exemplo, user@"%.loc.gov" se aplica a user para qualquer mquina no dominio loc.gov, e a user@"144.155.166.%" se aplica a user em qualquer mquina na subrede de classe C a 144.155.166. O formato simples user sinnimo de user@"%". e o O MySQL no suporta metacaracteres em nomes de usurios. Usurios annimos so a a a o a denidos inserindo entradas com User= na tabela mysql.user ou criando um usurio a com um nome vazio com o comando GRANT. Nota: Se voc permite o acesso de usurios annimos ao seu servidor MySQL, voc deve e a o e tambm concecder privilgios a todos os usurios locais como user@localhost porque, de e e a outra forma, a entrada de usurio annimo para a mquina local na tabela mysql.user a o a ser usada quando o usurio tentar a conexo ao servidor MySQL da mquina local! a a a a
257
Voc pode vericar se isto se aplica a voc executando a seguinte instruo: e e ca mysql> SELECT Host,User FROM mysql.user WHERE User=; No momento, GRANT suporta somente nomes de mquinas, tabelas bancos de dados e colunas a at 60 caracteres. Um nome de usurio pode ter at 16 caracteres. e a e Os privilgios para uma tabela ou coluna so formados atravs do OU lgico dos privilgios e a e o e em cada um dos quatro niveis de privilgios. Por exemplo, se a tabela mysql.user especica e que um usurio tem um privilgio global select, isto no pode ser negado por uma entrada a e a no n de banco de dados, tabela ou coluna. ivel Os privilgios para uma coluna podem ser calculados da seguinte forma: e privilgios globais e OR (privilgios de banco de dados AND privilgios de mquina) e e a OR privilgios de tabela e OR privilgios de coluna e Na maioria dos casos, os direitos a um usurio so atribu a a idos em apenas um dos n iveis de privilgios, portanto a vida normalmente no to complicada como mostrado acima. e a e a Os detalhes do procedimento de vericao dos privilgios so apresentados em Seo 4.3 ca e a ca [Sistema de privilgios], Pgina 226. e a Se voc concede privilgios para uma combinao de usurio e mquina que no existem e e ca a a a na tabela mysql.user, um registro adicionado e permanece l at ser removido com um e a e comando DELETE. Em outras palavras, GRANT pode criar registros na tabela user, mas REVOKE no as remover; para remov-las voc deve usar a instruo expl a a e e ca icita DELETE. Na Verso 3.22.12 ou posterior do MySQL, se um novo usurio criado ou se voc possui a a e e privilgios de concesso globais, a senha do usurio ser especicada utilizando a clusula e a a a a IDENTIFIED BY, se uma for dada. Se o usurio j possui uma senha, ela trocada pela nova. a a e Se voc no quiser enviar a senha em texto puro voc pode usar a opo PASSWORD seguido e a e ca de uma senha embaralhada da funo SQL PASSWORD() ou da funo da API C make_ ca ca scrambled_password(char *to, const char *password). CUIDADO: Se voc criar um novo usurio mas no especicar uma clusula IDENTIFIED e a a a BY, o usurio no possuir uma senha. Isto no seguro. a a a a e Senhas podem tambm ser conguradas com o comando SET PASSWORD. Veja Seo 5.5.6 e ca [SET OPTION], Pgina 460. a Se voc conceder privilgios para um banco de dados, uma entrada na tabela mysql.db e e e criada se necessrio. Quando todos os privilgios para o banco de dados forem removidos a e com REVOKE, este registro removido. e Se um usurio no tem privilgios em uma tabela, a tabela no mostrada quando o a a e a e usurio solicita uma lista de tabelas (com a instruo SHOW TABLES por exemplo). O mesmo a ca verdade para SHOW DATABASES e A clusula WITH GRANT OPTION d ao usurio habilidade de fornecer ` outros usurios quaisa a a a a espec quer privilgios que ele tenha em um nivel e ico de privilgio. Voc deve ter cuidado e e ao fornecer o privilgio grant, pois dois usurios podem se unir para unir privilgios! e a e MAX_QUERIES_PER_HOUR #, MAX_UPDATES_PER_HOUR # e MAX_CONNECTIONS_PER_HOUR # sp a novos no MySQL verso 4.0.2. Estas opes limitam o nmero de consultas/atualizaes e a co u co logins que o usurios pode fazer durente uma hora. Se # 0 (padro), ento isto signica que a e a a
258
no h limites para aquele usurio. Veja Seo 4.4.7 [Recursos do usurios], Pgina 265. a a a ca a a Nota: para especicar qualquer destas opes para um usurio existente sem adicionar co a outros privilgios adicionais, use GRANT USAGE ON *.* ... WITH MAX_.... e Voc no pode conceder a outro usurio um privilgio que no possua; o privilgio GRANT e a a e a e possibilita fornecer somente os privilgios que possuir. e Esteja ciente que quando conceder a um usurio o privilgio GRANT em um n particular a e ivel de privilgios, qualquer privilgio que o usurio j possua (ou seja fornecido no futuro!) nesse e e a a n tambm pode ser concedido por este usurio. Suponha que voc conceda a um usurio ivel e a e a o privilgio INSERT em um banco de dados. Se voc conceder o privilgio SELECT no banco e e e de dados e especicar WITH GRANT OPTION, o usurio alm de poder repassar o privilgio a e e SELECT poder tambm repassar o insert. Se voc concede o privilgio UPDATE para o a e e e usurio no banco de dados, o usurio poder conceder os privilgios INSERT, SELECT e a a a e UPDATE. Voc no deve conceder privilgios ALTER a um usurio comum. Se voc zer isto, o e a e a e usurio pode tentar enganar o sistema de privilgios renomeando tabelas! a e Perceba que se voc estiver utilizando privilgios de tabelas ou colunas, mesmo que para e e apenas um usurio, o servidor examina os privilgios de tabelas e colunas para todos os a e usurios e isto ir deixar o MySQL um pouco mais lento. a a Quando o mysqld inicia, todos os privilgios so lidos na memria. Privilgios de bancos de e a o e dados, tabelas e colunas so iniciados um vez, e privilgios ao n de usurio fazem efeito na a e ivel a prxima vez que o usurio conectar. Modicaes nas tabelas de permisses que voc realiza o a co o e utilizando GRANT ou REVOKE so percebidas pelo servidor imediatamente. Se voc modicar a e as tabelas de permisses manualmente (utilizando INSERT, UPDATE, etc), voc deve executar o e uma instruo FLUSH PRIVILEGES ou executar mysqladmin flush-privileges para dizer ca ao servidor para recarregar as tabelas de permisses. Veja Seo 4.4.3 [Privilege changes], o ca Pgina 260. a As maiores diferenas entre o padro SQL e verses MySQL de GRANT so: c a o a No MySQL privilgios so fornecidos para uma combinao de usurio e mquina e e a ca a a no somente para um usurio. a a O SQL-99 no possui privilgios no n global ou de bancos de dados, e no suporta a e ivel a todos os tipos de privilgios que o MySQL suporta. O MySQL no suporta os privilgios e a e TRIGGER, EXECUTE ou UNDER do SQL-99. Os privilgios do SQL-99 so estruturadados em uma maneira hierrquica. Se voc e a a e remover um usurio, todos os privilgios do usurio so removidos. No MySQL os a e a a privilgios concedidos no so removidos automaticamente, mas voc deve remov-los e a a e e se necessrio. a Se no MySQL voc possuir o privilgio INSERT em somente parte das colunas em uma e e tabela, voc pode executar instrues INSERT na tabela; As colunas em que voc no e co e a tem o privilgio INSERT iro receber seus valores padres. O SQL-99 necessita que voc e a o e tenha o privilgio INSERT em todas as colunas. e Quando voc remove uma tabela no SQL-99, todos os privilgios para a tabela so e e a removidos. Se voc remover um privilgio no SQL-99, todos os privilgios que foram e e e concedidos baseado neste privilgio so tambm removidos. No MySQL, privilgios s e a e e o podem ser removidos com comandos REVOKE expl icitos ou manipulando as tabelas de permisses do MySQL. o
259
Para uma descrio do uso de REQUIRE, veja Seo 4.4.10 [Secure connections], Pgina 268. ca ca a
260
Em alguns sistemas, a chamada da biblioteca que utilizada pelo MySQL para solicitar por e uma senha corta automaticamente a senha para 8 caracteres. Internamente o MySQL no a limita o tamanho limite da senha.
261
Como sua instao inicialmente parcialmente aberta, uma das primeiras coisas que voc ca e e deve fazer especicar uma senha para o usurio root do MySQL. Voc pode fazer isto e a e como a seguir (perceba que a senha foi especicada utilizando a funo PASSWORD()): ca shell> mysql -u root mysql mysql> SET PASSWORD FOR root@localhost=PASSWORD(nova_senha); Substitua nova_senha pela senha que voc deseja usar. e Se voc souber o que esta fazendo, voc tambm pode manipular diretamente a tabela e e e privilgios: e 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 utilizando o comando mysqladmin: e shell> mysqladmin -u root password nova_senha Somente usurios com acesso de escrita/atualizao ao banco de dados mysql podem a ca alterar a senha de outros usurios. Todos os usurios comuns (no os annimos) a a a o podem alterar somente a prpria senha com um dos comandos acima ou com SET o PASSWORD=PASSWORD(nova_senha). Perceba que se voc atualizar a senha na tabela user diretamente utilizando UPDATE, voc e e deve dizer ao servidor para reler as tabelas de permisses (com FLUSH PRIVILEGES), de o outra forma a alterao no seria noticada. ca a Uma vez que a senha de root foi congurada, voc deve informar a senha quando se conectar e ao servidor MySQL como root. Voc pode desejar deixar a senha de root em branco para que voc no precise especic-la e e a a quando realizar conguraes adicionais ou testes. Entretanto, tenha certeza de congur-la co a antes de utilizar sua instalao para qualquer ambiente de produo. ca ca Veja o script scripts/mysql_install_db para ver como so congurados os privilgios a e padres. Voc pode usar isto como uma base para ver como adicionar outros usurios. o e a Se voc deseja que os privilgios iniciais sejam diferentes do descrito acima, poss e e e ivel modicar o script mysql_install_db antes de execut-lo. a Para recriar as tabelas de permisses completamente, remova todos os arquivos .frm .MYI o e .MYD no diretrio contendo o banco de dados mysql. (Este o diretrio chamado mysql o e o sob o diretrio do banco de dados, que listado quando voc executa mysqld --help.) o e e Depois execute o script mysql_install_db, possivelmente depois de edit-lo para criar os a privilgios desejveis. e a NOTA: Para verses do MySQL mais antigas que a verso 3.22.10, voc no deve apagar o a e a os arquivos .frm. Se voc zer isso acidentalmente, voc deve volt-los a partir de sua e e a distribuio MySQL antes de executar mysql_install_db. ca
262
GRANT, porque elas so mais concisas e menos propensas a erros. Veja Seo 4.4.1 [GRANT], a ca Pgina 254. a Existem vrios programas de colaboradores (como o phpMyAdmin) que podem ser utilizados a para criar e administrar usurios. Veja Apndice B [Contrib], Pgina 940. a e a Os exemplos abaixo mostram como usar o cliente mysql para congurar novos usurios. a Estes exemplos assumem que privilgios so congurados de acordo com os padres descritos e a o na seo anterior. Isto signica que para fazer alteraes, voc deve se conectar na mesma ca co e mquina em que o mysqld est executando, voc deve se conectar com o usurio root, e a a e a o usurio root deve ter os privilgios inster ao banco de dados mysql e o administrativo a e reload. Tambm, se voc alterou a senha do usurio root, voc deve especic-la para os e e a e a comandos mysql abaixo. Primeiro, use o programa mysql para se conectar ao servidor como o usurio root do a MySQL: shell> mysql --user=root mysql Voc pode adicionar novos usurios utilizando instrues GRANT: e a co 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 instrues GRANT conguram trs novos usurios: co e a monty Um superusurio completo que pode conectar ao servidor de qualquer lugar, a mas deve utilizar uma senha alguma_senha para fazer isto. Perceba que devemos utilizar instrues GRANT para monty@localhost e monty@"%". Se ns co o no adicionarmos a entrada com localhost, a entrada para o usurio annimo a a o para localhost que criada por mysql_install_db toma precedncia quando e e nos conectarmos da mquina local, porque ele contem um campo Host com um a valor mais espec ico e tambm vem antes na ordenao da tabela user. e ca Um usurio que possa conectar de localhost sem uma senha e que concedido a e os privilgios administrativos reload e process. Isto permite ao usurio a exe a ecuo dos comandos mysqladmin reload, mysqladmin refresh e mysqladmin ca flush-*, bem como o mysqladmin processlist. Nenhum privilgio a n de e ivel bancos de dados concedido. (Depois eles podem ser adicionados utilizando e instrues GRANT adicionais.) co Um usurio que pode conectar sem uma senha, mas somente na mquina loa a cal. No so concedidos nenhum privilgioo tipo de privilgio USAGE permite a a e e a criao de um usurio sem privilgios. Ele tem o efeito de criar todos os ca a e privilgios globais com N. Considera-se que voc ir conceder privilgios ese e a e pec icos a conta posteriormente.
admin
dummy
Tambm poss e e ivel adicionar a mesma informao de acesso do usurio diretamente, utica a lizando instrues INSERT e depois dizendo ao servidor para recarregar as tabelas de perco misses: o
263
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 verso do MySQL, voc pode precisar utilizar um nmero diferente de a e u valores Y acima. (Verses anteriores ` verso 3.22.11 tem menos campos de privilgios, o a a e e posteriores a 4.02 tm mais). Para o usurio admin, a maior sintaxe legivel de INSERT e a usando SET que est dispon a partir da verso 3.22.11 a utilizada. a ivel a e Note que para congurar um superusurio, voc s precisar criar uma entrada na tabela a e o user com os campos de privilgios congurados para Y. No necessrio gerar entradas e a e a nas tabelas db ou host. Na ultima instruo INSERT (para o usurio dummy), apenas as colunas Host, User e ca a Password nos registros da tabela user tem valores atribu idos. Nenhuma das colunas de privilgios so denidas explicitamente, assim o MySQL atribui a todas o valor padro de e a a N. Isto a mesma coisa que o GRANT USAGE faz. e O seguinte exemplo adiciona um usurio custom que pode acessar o banco de a 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 trs mquinas. e a Para congurar os privilgios deste usurio utilizando instrues GRANT, execute estes coe a co mandos: 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 [email protected] IDENTIFIED BY obscure; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO [email protected] IDENTIFIED BY obscure;
Para congurar os privilgios do usurio modiciando as tabelas de permisses diretamente, e a o 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));
264
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 instrues INSERT, voc pode precisar de usar co e um nmero diferentes de valores Y, dependendo de sua verso do MySQL. u a As primeiras trs instrues INSERT adicionam entradas na tabela user que permite ao e co usurio custom conectar a partir de vrias mquinas com a senha determinada, mas no a a a a concede permisses ao mesmo (todos os privilgios so congurados com o valor padro de o e a a N). As prximas trs instrues INSERT adicionam entradas na tabela db que concedem o e co privilgios ` custom para os bancos de dados bankaccount, expenses e customer, mas s e a o quando acessados ` partir das mquinas apropriadas. Normalmente, depois de modicar a a as tabelas de permisses diretamente, voc deve dizer ao servidor para recarreg-las (com o e a FLUSH PRIVILEGES) para que as alteraes nos privilgios tenham efeito. co e Se voc deseja fornecer a um usurio espec e a ico acesso de qualquer mquina em um detera minado dom inio (por exemplo, meudomnio.com), voc pode utilizar uma instruo GRANT i e ca como a seguir: mysql> GRANT ... -> ON *.* -> TO myusername@%.mydomain.com -> IDENTIFIED BY mypassword; Para realizar a mesma coisa modicando diretamente as tabelas de permisses, faa isto: o c mysql> INSERT INTO user VALUES (%.meudominio, meunomedeusuario PASSWORD(minhasenha),...); mysql> FLUSH PRIVILEGES;
265
Ele apaga um usurio que no possua nenhum privilgio. a a a Para deletar um usurio do MySQL voc usar o seguinte procedimento, realizando os passos a e na ordem mostrada. 1. Verique quais privilgios o usurio tem com SHOW PRIVILEGES. Veja Seo 4.6.8.11 e a ca [SHOW PRIVILEGES], Pgina 325. a 2. Delete todos os privilgios do usurio com REVOKE. e a Pgina 254. a 3. Delete o usurio com DROP USER. a Se voc estiver usando uma verso mais antiga do MySQL voc deve primeiro revogar os e a e privilgios e ento deletar o usurio com: e a a DELETE FROM mysql.user WHERE user=username and host=hostname; FLUSH PRIVILEGES; Veja Seo 4.4.1 [GRANT], ca
266
Os valores atualmente usados por um usurio em particular pode ser descarregados (zerados) a enviando uma instruo GRANT com qualquer das clusulas acima, inclu ca a indo uma instruo ca GRANT com os valores atuais. Os valores atuais para todos os usurios para todos os usurios sero descarregados se os a a a privilgios forem recarregados (no servidor ou usando mysqladmin reload) ou se o comando e FLUSH USER_RESOURCES executado. e O resurso est habilitado assim que e concedido a um unico usurio qualquer das clusulas a a a GRANT de limitao. ca Como um prerequisito para a habilitao deste recurso, a tabela user no banco de dados ca mysql deve conter as colunas adicionais, como denido no script de criao de tabelas ca mysql_install_db e mysql_install_db.sh no subdiretrio scripts. o
267
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY biscuit; ou shell> mysqladmin -u jeffrey password biscuit NOTA: PASSWORD() diferente da senha criptografada do Unix. e
268
esta verso do ps, seria imprudncia assumir que no existe outro mtodo para observar a e a e o ambiente de processos. Veja Apndice F [Variveis de ambiente], Pgina 1092. e a a Em resumo, os mtodos mais seguros seriam que o programa cliente solicitasse a senha ou e especicar a senha em um arquivo .my.cnf corretamente protegido.
269
4.4.10.2 Exigncias e
Para conseguir conexes seguras para trabalhar com o MySQL voc deve fazer o seguinte: o e 1. Insatale o biblioteca OpenSSL. Testamos o MySQL com OpenSSL 0.9.6. http://www.openssl.org/. 2. Congure o MySQL com --with-vio --with-openssl. 3. Se voc estiver usando um instalao antiga do MySQL, voc tem que atualizar a sua e ca e tabela mysql.user com algumas novas colunas relacionadas a SSL. Isto necessrio se e a suas tabelas de permisses so de uma verso anterior ao MySQL 4.0.0. O procedimento o a a est descrito em Seo 2.5.6 [Upgrading-grant-tables], Pgina 130. a ca a 4. Voc pode vericar se um servidor mysqld em execuo suporta OpenSSL examinando e ca se SHOW VARIABLES LIKE have_openssl retorna YES.
270
# # # # # # # # # # # # # #
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 # # # # # # # # # # # # # # # # # # # # # # # # # # Sada exemplo: i 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
271
# 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 # # # # # # # # # # # # # # # # Sada exemplo: i 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 # # # # # # # # # Saida exemplo: 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: -----
272
# # # # # # # # # # # # # # # # # # #
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 # # # # # # # # # # # # # # # Sada exemplo: i 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
273
# 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 tambm pode testar sua congurao modicando o arquivo my.cnf acima para fazer e e ca referncia aos certicados de demonstrao no diretrio mysql-dist-fonte/SSL. e ca o
274
-> IDENTIFIED BY goodsecret REQUIRE X509; REQUIRE ISSUER emissor coloca uma restrio na tentativa de conexo: O cliente ca a deve apresentar um certicado X509 vlido emitido pelo CA emissor. Usar o certia cado X509 sempre implica em criptograa, assim a opo SSL desnecessria. ca e a 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 protected];
REQUIRE SUBJECT assunto exige que o cliente tenha um certicado X509 com o assunto assunto. Se o cliente apresenta um certicado que valido mas tem um e assunto diferente, a conexo disabilitada. a e 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 protected];
REQUIRE CIPHER mtodo necessrio para assegurar que uma criptograa forte ser e e a a usada. O SSL pode ser fraco se algoritmos antigos com chaves de criptograas curtas so usados. Usando esta opo, podemos pedir por algum mtodo de criptograa exato a ca e para permitir a conexo. a mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost -> IDENTIFIED BY goodsecret -> REQUIRE CIPHER EDH-RSA-DES-CBC3-SHA; As opes SUBJECT, ISSUER e CIPHER podem ser combinadas na clusula REQUIRE desta co a 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 protected] AND ISSUER C=FI, ST=Some-State, L=Helsinki, O=MySQL Finland AB, CN=Tonu Samuel/[email protected] AND CIPHER EDH-RSA-DES-CBC3-SHA;
A partir do MySQL 4.0 a palavra chave AND opcional entre opes REQUIRE. e co A ordem das opes no importa, mas nenhuma opo pode ser especicada duas vezes. co a ca
275
opo por si s no suciente para fazer uma conexo SSL ser usada. Voc ca o a e a e tambm deve especicar as opes --ssl-ca, --ssl-cert, e --ssl-key. e co Note que esta opo no exige uma conexo SSL. Por exemplo, se o servidor ou ca a a clienteest compilado sem suporte SSL, uma conexo no criptografada normal a a a ser usada. a O modo seguro de de se certicar que uma conexo SSL ser usada criar uma a a e conta no servidor que inclua uma clusula REQUIRE SSL na instruo GRANT. a ca Ento use esta conta para se conectar ao servidor, com um servidor e cliente a que tenham suporte a SSL habilitado. Voc pode usar esta opo para indicar que a conexo no deve usar SSL. Faa e ca a a c isto especicando a opo como --skip-ssl ou --ssl=0. ca --ssl-ca=file_name O caminho para um arquivo vom uma lista de Certifcados SSL conveis. a --ssl-capath=directory_name O caminho para um diretrio que contm certicados SSL conveis no formato o e a pem. --ssl-cert=file_name O nome do arquivo de certicado SSL usado para estabelecer uma conexo a 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 conexo a segura.
276
Outra maneira de efetuar um backup de um banco de dados utilizar o programa mysqldump e ou o script mysqlhotcopy. Veja Seo 4.9.7 [mysqldump], Pgina 361. Veja Seo 4.9.8 ca a ca [mysqlhotcopy], Pgina 366. a 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 tambm pode simplesmente copiar os arquivos das tabelas (*.frm, *.MYD) e e e os arquivos *.MYI) quando o servidor no estiver atualizando nada. O script a mysqlhotcopy utiliza este mtodo. (Mas nopte que estes mtodos no funcionaro e e a a se seu banco de dados contm tabelas InnoDB. InnoDB no armazena o contedo das e a u tabelas em diretrios de banco de dados, e o mysqlhotcopy funciona apenas para o tabelas MyISAM e ISAM.) 2. Interrompa o mysqld caso ele esteja em execuo, depois inicie-o com a opo --logca ca bin[=nome_arquivo]. Veja Seo 4.10.4 [Log binrio], Pgina 374. Os arquivos de log ca a a binrio fornecem a informao necessria para replicar alteraes ao banco de dados a ca a co que forem feitas depois do ponto em que voc executou mysqldump. e Se o seu servidor MySQL um slave, seja qual for o mtodo de backup que voc escolha, e e e quando voc faz backup dos dados do slave, voc deve tambm fazer backup dos arquivos e e e master.info e relay-log.info que so necessrios para continuar a replicao depois a a ca que voc restaurar os dados do slave. Se seu slave est sujeito a replicao de comandos e a ca LOAD DATA INFILE, voc tambm deve fazer backup dos arquivos SQL_LOAD-* que podem e e existir no diretrio especicado pela opo slave-load-tmpdir. (A localizao padro o ca ca a desta opo o valor da varivel tmpdirse no especicado.) O slave precisar destes ca e a a a arquivos para continuar a replicao de qualquer LOAD DATA INFILE interrompido. ca Se voc necessita restaurar alguma coisa, tente primeiro recuperar suas tabelas utilizando e 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 ir funcionar se voc iniciou o o a e MySQL com --log-update, veja Seo 4.10.4 [Binary log], Pgina 374,): ca a 1. Restaure o backup original feito com o mysqldump ou backup binrio. a 2. Execute o seguinte comando para re-executar as atualizaes armazenadas no log co binrio: a shell> mysqlbinlog hostname-bin.[0-9]* | mysql Em seu caso voc pode querer re-executar apenas alguns log binrios, a partir de certas e a posis (normalmente voc quer re-executar todos os log binrios a partir da data de co e a restaurao do backup, co exceo de algumas consultas erradas). Veja Seo 4.9.5 ca ca ca [mysqlbinlog], Pgina 358 fpara mais informaes sobre o utilitrio mysqlbinlog e a co a como us-lo. a Se voc estiver utilizando o log atualizado, voc pode executar o contedo do log de e e u atualizao desta forma: ca shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
277
O comando ls usado para obter todos os arquivos de log na ordem correta. e Voc pode tambm fazer backups seletivos com SELECT * INTO OUTFILE nome_arquivo e e FROM nome_tabela e restaurar com LOAD DATA INFILE nome_arquivo REPLACE.... Para evitar registros duplicados, voc precisar de um chave PRIMARY KEY ou uma UNIQUE na e a tabela. A palavra chave REPLACE substitui os antigos registros com os novos quando um novo registro duplica um antigo registro em uma chave de valores unicos. Se voc tiver problemas de performance realizando backups no seu sistema, voc pode e e resolver isto congurando uma replicao e fazendo os backups na mquina slave no lugar ca a da master. Veja Seo 4.11.1 [Introduo a Replicao], Pgina 378. ca ca ca a Se voc estiver utilizando um sistema de arquivos Veritas, voc pode fazer: e e 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
278
indice. Quanto mais chaves tiver, mais demorado ser. Como no comando BACKUP TABLE, a atualmente s funciona com tabelas MyISAM. o 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 instruo pode produzir vrias linhas de informaes para cada tabela conferida. ca a co A ultima linha ir ser do tipo Msg_type status e normalmente deve estar OK. Se voc no a e a obteve OK ou Not checked, deve ser executado, normalmente, um reparo da tabela. Veja Seo 4.5.6 [Table maintenance], Pgina 280. Table is already up to date signica que o ca a gerenciador de armazenamento para a tabela indica que no h necessidade de vericar a a a tabela. Os diferentes tipos de consistncias so as seguintes: e a Tipo QUICK FAST CHANGED MEDIUM EXTENDED Signicado No busca os registros vericando ligaes incorretas. a co S confere tabelas que no foram fechadas corretamente. o a S verica as tabelas que foram alteradas desde a ultima conferncia ou que o e no foram fechadas corretamente. a Busca os registros para vericanado que ligaes removidas esto ok. Isto co a tambm calcula uma chave de conferncia para os registros e verica isto e e 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 100% consistente, mas pode demorar muito a tempo para executar!
279
Para tabelas MyISAM de tamanho dinmico, uma vericao iniciada sempre far uma veria ca a cao MEDIUM. Para registros de tamanho esttico ns saltamos a busca de registros para ca a o QUICK e FAST j que os registros esto raramente corrompidos. a a Voc pode combinar opes de consistncia como no exemplo a seguir que faz uma vericao e co e ca rpida na tabela para ve se ela foi fechada corretamente: a CHECK TABLE test_table FAST QUICK; NOTA: em alguns casos CHECK TABLE ir alterar a tabela! Isto acontece se a tabela estiver a marcada como corrupted (corrompida) ou not closed properly (no foi fechada corretaa mente) mas o CHECK TABLE no encontrar no encontrar nenhum problema na tabela. Neste a a caso, CHECK TABLE ir marcar a tabela como ok. a Se uma tabela estiver corrompida, prefer que seja um problema nos e ivel indices e no na a parte de dados. Todos os tipos de consistncia acima sempre confere os indices e deve ento e a encontrar a maioria dos erros. Se voc s quiser conferir uma tabela que acredita estar ok, voc no deve utilizar nenhuma e o e a opo para o comando check ou utilizar a opo QUICK. O ultimo deve ser utilizado quando ca ca voc estiver com pressa e o r e isco do QUICK no encontrar um erro no arquivo de dados for a m inimo (Na maioria dos casos o MySQL pode encontrar, sob utilizao normal, qualquer ca erro no arquivo de dados. Se isto ocorrer, ento a tabela ser marcada como corrupted, a a neste caso a tabela no poder ser utilizada at ser reparada). a a e FAST e CHANGED so normalmente chamados a partir de um script (um exemplo ser exea e cutado a partir do cron) Se voc desejar conferir suas tabelas de tempos em tempos. Na e maioria dos casos, o FAT uma opo melhor que CHANGED. (O unico caso em que isto no e ca a acontece quando voc suspeita que encontrou um bug no cdigo do MyISAM.). e e o EXTENDED deve ser utilizado somente depois de ter executado um check normalmente, mas continuar obtendo erros de uma tabela quando o MySQL tenta atualizar um registro ou encontrar um registro pela chave (isto seria muito dif ocorrer caso uma conferncia normal icil e tenha executado com sucesso!). Alguns problemas relatados por CHECK TABLE, no podem ser corrigidas automaticamente: a Found row where the auto_increment column has the value 0. Isto signica que voc possui um registro na tabela onde o campo e indice que utiliza o poss criar um registro onde a coluna recurso auto_increment contem o valor 0. (E ivel de auto incremento seja 0 denindo explicitamente 0 em uma instruo UPDATE). ca Isto no exatamente um erro, mas pode causar problemas se voc decidir descarregar a e e a tabela e restaur-la ou executar um ALTER TABLE na tabela. Neste caso a coluna a de auto incremento ir alterar seu valor, de acordo com as regras das colunas de auto a incremento, que pode causar problemas como um erro de chave duplicada. Para se livrar do alerta, basta executar uma instruo UPDATE para congurar a coluna ca para algum outro valor diferente de 0.
280
Normalmente voc nunca deve executar este comando, mas se um disastre ocorrer voc e e vai precisar recuperar seus dados de uma tabela MyISAM utilizando REPAIR TABLE. Se as suas tabelas estiverem muito corrompidas, voc deve encontrar a razo, para eleiminar e a a necessidade de se usar REPAIR TABLE! Veja Seo A.4.1 [Crashing], Pgina 925. Veja ca a Seo 7.1.3 [MyISAM table problems], Pgina 636. ca a 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 instruo pode produzir vrias linhas de informaes para cada tabela recuperca a co ada. A ultima linha ser de Msg_type status e normalmente deve exibir OK. Se o retorno a no for OK, voc pode tentar reparar a tabela com myisamchk -o, j que REPAIR TABLE a e a ainda no implementa todas as opes de myisamchk. Futuramente iremos torn-lo mais a co a ex ivel. Se o parmetro QUICK for especicado, REPAIR tenta reparar somente a rvore de a a indices. Se voc utilizar EXTENTED, o MySQL criar o indice, registro a registro em vez de criar e a um indice de uma vez com ordenao; Isto pode ser melhor que a ordenao em chaves de ca ca tamanho xo se voc tiver grandes chaves do tipo char() que compactam muito bem. e No MySQL 4.0.2, existe um modo USE_FRM para REPAIR. Use-o se o arquivo .MYI estiver faltando ou o seu cabealho estiver corrompido. Neste modo o MySQL recriar a c a tabela, usando a informao do arquivo .frm. Este tipo de reparo no pode ser feito com ca a myisamchk. Aviso: Se o mysqld morre durante um REPAIR TABLE, essencial que voc faa imediatae e c mente outro REPAIR na tabela antes de executar qualquer outro comando nela. (Claro que sempre bom inciar com um backup). No pior caso voc pode ter um novo arquivo de e e indice limpo sem informao sobre o arquivo de dados e quando voc executar o prximo ca e o comando o arquivo de dados pode ser sobreescrito. Isto no um cenrio desejvel, mas a e a a poss ivel. Antes do MySQL 4.1.1, o comando REPAIR no era gravado no log binrio. Desde o MySQL a a 4.1.1. eles so escritos no log binrio a menos que a palavra chave opcional NO_WRITE_TO_ a a BINLOG (ou seu alias LOCAL) seja usada.
281
No texto a seguir iremos comentar sobre o myisamchk, mas tudo tambm se aplica ao antigo e isamchk. Voc pode utilizar o utilitrio myisamchk para obter informaes sobre suas tabelas de e a co bancos de dados, verc-las, repar-las ou otimiz-las. As seguintes sees descrevem como a a a co executar myisamchk (incluindo uma descrio de suas opes), como montar um calendrio ca co a de manuteno, e como utilizar o myisamchk para executar suas vrias funes. ca a co Voc pode, na maioria dos casos, utilizar o comando OPTIMIZE TABLES para otimizar e e reparar tabelas, mas no to rpido e convel (no caso real de erros fatais) como o a e a a a mysisamchk. Por outro lado, OPTIMIZE TABLE mais fcil de usar e voc no tem que se e a e a preocupar com a recarrega das tabelas. Veja Seo 4.6.1 [OPTIMIZE TABLE], Pgina 298. ca a Embora os reparos realizados pelo myisamchk sejam bastante seguros, porm sempre uma e e boa idia fazer um backup dos dados ANTES de realizar um reparo (ou qualquer coisa que e far grandes alteraes em alguma tabela) a co
282
myisamchk --silent --fast /caminho/para/diretrio_dados/*/*.MYI o isamchk --silent /caminho/para/diretrio_dados/*/*.ISM o Se voc quiser conferir todas as tabelas e reparar todas que estiverem corrompidas, pode e 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/diretrio_dados/*/*.MYI o isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M \ -O read_buffer=1M -O write_buffer=1M /caminho/para/diretrio_dados/*/*.ISM o A linha acima assume que voc tem mais de 64 MB de memria livre. e o Perceba que se voc obter um erro do tipo: e myisamchk: warning: 1 clients is using or hasnt closed the table properly Isto signica que voc est tentando vericar uma tabela que est sendo atualizada por e a a outro programa (como o servidor mysqld) que ainda no fechou o arquivo ou que nalizou a sem fechar o arquivo corretamente. Se o mysqld est em execuo, voc deve forar o sincronimo e fechamento de todas tabelas a ca e c com FLUSH TABLES e assegurar que ningum mais esteja utilizando as tabelas quando for e executar o myisamchk. No MySQL verso 3.23 a forma mais simples de evitar este problema a utilizar CHECK TABLE no lugar de myisamchk para vericar as tabelas. e
-? ou --help Exibe uma mensagem de ajuda e sai. -O nome=op~o, --set-variable=nome=op~o ca ca Congura o valor de uma varivel. Por favor note que as sintaxes --seta variable=nome=valor e -O name=value esto obsoletas desde o MySQL 4.0. a Use --nome=valor. As variveis poss a iveis e seus valores padres para o myo isamchk podem ser examinados com myisamchk --help Varivel a 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 utilizado quando as chaves so reparadas pela ordenao e a ca das chaves, que o caso normal quando voc utiliza --recover. e e key_buffer_size utilizando quando voc estiver conferindo a tabela com e e -extended-check ou quando as chaves so reparadas inserindo-as registro a a
283
registro na tabela (como com inserts normais). O reparo atravs de buer de e chaves (key buer) utilizado nos seguintes casos: e Se voc utilizar --safe-recover. e Se os arquivos temporrios necessrios para ordenar as chaves forem maior a a que o dobro do tamanho de quando se criasse o arquivo de chaves diretamente. Isto o caso quando se tem chaves CHAR, VARCHAR ou TEXT tao e grandes quanto necessrio pela ordenao para armazenar todas as chaves a ca durante o processo. Se voc tiver muito espao temporrio e puder forar e c a c o myisamchk a reparar por ordenao voc pode utilizar a opo --sortca e ca recover. Reparao atravs do buer de chaves (key buer) economiza muito mais espao ca e c em disco do que utilizando ordenao, mas muito mais lenta. ca e Se voc deseja uma reparao mais rpida, congure as variveis acima para e ca a a cerca de 1/4 da sua memria dispon o ivel. Voc pode congurar as variveis para e a valores altos, pois somente um dos buers acima ser utilizado a cada vez. a -s ou --silent Modo discreto ou silencioso. Escreve a sa somente quando um erro ocorre. ida Voc pode utilizar -s duas vezes (-ss) para deixar o mysisamchk mais silene cioso. -v ou --verbose Modo prolixo. Gera mais informao de sa ca ida. Ele pode ser utilizado com -d e -e. Utilize -v mltiplas vezes -vv, -vvv) para gerar mais sa u ida! -V ou --version Exibe a verso do myisamchk e sai. a -w ou, --wait No lugar de gerar um erro se a tabela estiver bloqueada, espere at que a tabela e que livre antes de continuar. Perceba que se voc estiver utilizando mysqld e na tabela com --skip-external-locking, a tabela s pode ser trancada por o outro comadno myisamchk.
284
-F ou --fast Verica apenas tabelas que no foram fechadas corretamente. a -C ou --check-only-changed Verica apenas tabelas que foram alteradas desde a ultima vericao. ca -f ou --force Reinicia o myisamchk com -r (reparos) na tabela, se myisamchk encontrar quaisquer erros na tabela. -i ou --information Exibe informaes e estat co isticas sobre a tabela que estiver sendo vericada. -m ou --medium-check Mais rpido que extended-check, mas encontra somente 99.99% de todos os a 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 integral da opo --check-onlyicio ca changed, mas voc no deve utilizar esta opo se o servidor mysqld esta usando e a ca a tabela e o mysqld esta sendo executado com --skip-external-locking. -T ou --read-only No marca as tabelas como vericadas. Isto util se voc utiliza o myisamchk a e e para vericar uma tabela que esteja em uso por alguma outra aplicao que ca no utiliza bloqueios (como no mysqld --skip-external-locking). a
285
informa quais chaves usar, onde cada bit seleciona uma chave (a primeira chave possui o bit 0). Isto pode ser utilizado para inseres mais rpidas! co a Indices desativados podem ser reativados utilizando myisamchk -r. -l ou --no-symlinks No segue links simblicos. Normalmente o myisamchk repara a tabela para a o qual um link simblico aponta. Esta opo no existe no MySQL 4.0 pois o o ca a MySQL 4.0 no ir remover links simblicos durante os reparos. a a o -p or --parallel-recover Usa a mesma tcnica que -r e -n, mas cria todas as chaves em paralelo, em e threads diferentes. A opo foi adicionada no MySQL 4.0.2. Este cdigo alfa. ca o e Use por sua conta e risco! -r ou --recover Pode concertar quase tudo excetos chaves unicas que no so unicas (Que um a a e erro extremamente indesejvel com tabelas ISAM/MyISAM). Se voc deseja recua e perar uma tabela, esta primeira opo a ser tentada. Somente se o myisamchk e ca relatar que a tabela no pode ser recuperada pelo -r voc deve tentar ento a e a a opo -o. (Perceba que no caso indesejvel de -r falhar, o arquivo de daca a dos continuar intacto.) Se voc possui muita memria, voc deve aumentar o a e o e tamanho de sort_buffer_size! -o ou --safe-recover Utiliza um antigo mtodo de recuperao (le atravs de todos registros na ordem e ca e e atualiza todas as rvores de a indices baseado nos registros encontrados); esta opo muito mais lenta que -r, mas pode tratar vrios casos indesejveis que ca e a a o -r no consegue tratar. Este mtodo de recuperao tambm utiliza muito a e ca e menos espao em disco que -r. Normalmente sempre se deve tentar, primeiro, c um reparo com -r, e somente se ele falhar, usar -o. Se voc possuir muita memria, voc deve aumentar o tamanho de sort_ e o e buffer_size! -n ou --sort-recover Fora o uso de ordenao do myisamchk para resolver as chaves mesmo se os c ca arquivos temporrios forem muito grandes. a --character-sets-dir=... Diretrio onde conjuntos de caracteres so armazenados. o a --set-character-set=name Altere o conjunto de caracteres usado pelo indice .t ou --tmpdir=path Caminho para armazenar arquivos temporrios. Se isto no for congurado, a a myisamchk ir usar a varivel de ambiente TMPDIR para isto. A partir do MySQL a a 4.1, tmpdir pode ser congurado com uma lista de caminhos separados por dois pontos : (ponto e virgula ; no Windows). Eles sero usado da forma robina round.
286
-q ou --quick Reparo rpido sem modicar o arquivo de dados. Pode ser fornecido um sea gundo -q para forar o myisamchk para modicar o arquivo de dados original c no caso de chaves duplicadas. -u ou --unpack Descompacta arquivo empacotado com o myisampack.
287
Certique-se que o myisamchk utiliza arquivos temporrios em TMPDIR. Se TMPDIR aponta a para um sistema de arquivos em memria, voc pode facilmente obter erros de memria. o e o Se isto acontecer, congure TMPDIR para apontar para algum diretrio com mais espao e o c reinicie o myisamchk. Quando reparando, o myisamchk tambm precisar de bastante espao em disco: e a c Dobra-se o tamanho do arquivo de registros (o original e uma cpia). Este espao no o c a necessrio se for feito um reparo com --quick, j que neste caso somente o arquivo e a a de indices ser recriado. Este espao necessrio no mesmo disco que se encontra o a c e a arquivo de registros original! Espao para o novo arquivo de c indice que substitui o antigo. O arquivo de indices antigo truncando no inicio, portanto, normalmente este espao ignorado. Este espao e c e c e necessrio no mesmo disco que o arquivo de a indice original! Quando utilizando --recover ou --sort-recover (mas no quando usando --safea recover, ser necessrio espao para um buer de ordenao de: (maior_chave a a c ca + tamanho_do_ponteiro_de_registro)*nmero_de_registros * 2. u Voc pode e conferir o tamanho das chaves e o tamanho do ponteiro de registro com myisamchk -dv tabela. Este espao alocado no disco temporrio (especicado por TMPDIR ou c e a --tmpdir=#). Se voc tiver um problema com espao em disco durante o reparo, pode-se tentar usar e c --safe-recover em vez de --recover.
288
Quando se realizar recuperao devido a falhas, importante entender que cada tabela ca e nome_tabela em um banco de dados corresponde a tres arquivos no diretrio do banco de o dados: Arquivo Propsito o nome_tabela.frm Arquivo com denies co da tabela (form) nome_tabela.MYD Arquivo de dados nome_tabela.MYI Arquivo de indices Cada um destes trs tipos de arquivos est sujeito a corrupo de vrias formas, mas e a ca a problemas ocorrem mais frequentemente em arquivos de dados e indices. O myisamchk trabalha criando uma cpia do arquivo de dados .MYD linha a linha. Ele o termina o estgio de reparos removendo o antigo arquivo .MYD e renomeando o novo arquivo a com nome original. Se for utilizada a opo --quick, myisamchk no cria um arquivo ca a .MYD temporrio, mas assume que o arquivo .MYD est correto e somente gera um novo a a arquivo indice sem mexer no arquivo de dados. Isto seguro, pois o myisamchk detecta e automaticamente se o arquivo .MYD est corrompido e aborda o reparo neste caso. Voc a e pode tambm fornecer duas opes --quick para o myisamchk. Neste caso, o myisamchk e co no aborta em alguns erros (como chaves duplicadas) mas tenta resolv-los modicando o a e arquivo .MYD. Normalmente o uso de duas opoes --quick util somente se voc tiver c e e muito pouco espao em disco para realizer um reparo normal. Neste caso voc deve pelo c e menos fazer um backup antes de executar o myisamchk.
289
myisamchk -e -i nome_tabela Como o comando anterior, mas a opo -i diz ao myisamchk para exibir algumas ca informaes estat co isticas tambm. e
290
Se voc estiver utilizando o MySQL verso 3.23.16 e superior, voc pode (e deve) usar os e a e comandos CHECK e REPAIR para conferir e corrigir tabelas MyISAM. Veja Seo 4.5.4 [CHECK ca TABLE], Pgina 278. Veja Seo 4.5.5 [REPAIR TABLE], Pgina 279. a ca a A seo do manual sobre manuteno de tabelas inclui as opes para isamchk/myisamchk. ca ca co Veja Seo 4.5.6 [Table maintenance], Pgina 280. ca a A seguinte seo so para os casos onde o comando acima falhar ou se voc desejar usar os ca a e recursos extendidos que o isamchk e myisamchk fornecem. Se voc for reparar uma tabela da linha de comandos, deve primeiro desligar o servidor e mysqld. Perceba que quando voc executa mysqladmin shutdown em um servidor remoto, e o servidor mysqld ir continuar funcionando por um tempo depois do mysqladmin retornar, a at que todas as queries parem e todas as chaves sejam descarregadas no disco. e Estgio 1: Vericando suas tabelas a Execute myisamchk *.MYI ou myisamchk -e *.MYI se voc tiver tempo dispon e ivel. Utilize a opo -s (silencioso) para suprimir informaes desnecessrias. ca co a Se o servidor mysqld parar, deve ser utilizada a opo update para dizer ao myisamchk ca marcar a tabela como checada. Voc deve reparar somente as tabelas em que o myisamchk indicar um erro. Para tais e tabelas, v para o estgio 2. a a Se voc obter erros estranhos na vercao (como nos erros out of memory), ou se o e ca myisamchk quebrar, v para o estgio 3. a a Estgio 2: Reparo simples e seguro a NOTA: Se voc deseja que os reparos sejam mais rpidos, devem ser usadas as opes: -O e a co sorf_buffer=# -O key_buffer=# (onde # seria 1/4 da memria disponivel) para todos o comandos isamchk/myisamchk. Primeiro, tente usar myisamchk -r -q nome_tabela (-r -q signica modo de recuperao ca rpida). Ele tentar reparar o arquivo de a a indice sem mexer no arquivo de dados. Se o arquivo de dados estiver normal e os links apagados apontam nas localizaes corretas co dentro do arquivo de dados, isto deve funcionar e a tabela ser corrigida. Inicie o reparo da a prxima tabela. Outra maneira seria utilizar os seguintes procedimentos: o 1. Faa um backup do arquivo de dados antes de continuar. c 2. Utilize myisamchk -r nome_tabela (-r signica modo de recuperao). Isto reca mover registros incorretos e deletados do arquivo de dados e reconstroi o arquivo a de indices. 3. Se o passo anterior falhar, utilize myisamchk --safe-recover nome_tabela. O modo de recuperao segura utiliza um metdo de recuperao antiga que trata de alguns ca o ca casos que o modo de recuperao comum no consegue (porm mais lento). ca a e e Se voc obter erros estranhos no reparo (como em erros out of memory), ou se o myisamchk e falhar, v para o estgio 3. a a Estgio 3: Reparo dif a icil Voc s deve atingir este estgio se o primeiro bloco de 16K do arquivo de e o a indice estiver destru ou conter informaes incorretas, ou se o arquivo de ido co indice no existir. Neste a caso, necessrio criar um novo arquivo de e a indice. Faa como a seguir: c 1. Mova o arquivo de dados para algum lugar seguro.
291
2. Use o arquivo de descrio de tabelas para criar novos arquivos (vazios) de dados e ca indices: shell> mysql nome_bd mysql> SET AUTOCOMMIT=1; mysql> TRUNCATE TABLE nome_tabela; mysql> quit Se sua verso do MySQL no possuir TRUNCATE TABLE, utilize DELETE FROM nome_ a a tabela. 3. Copie o antigo arquivo de dados de volta para o novo arquivo de dados criado. (No a s mova o antigo arquivo de volta para o novo arquivo; voc deve uma cpia no caso o e o de algo der errado.) Volte ao estgio 2. myisamchk -r -q deve funcionar agora. (Isto no deve ser um loop a a eterno.) No MySQL 4.0.2 voc tambm pode utilizar REPAIR ... USE_FRM o qual realiza todo o proe e cedimento automaticamente. Estgio 4: Reparo muito dif a icil Voc deve atingir este estgio somente se o arquivo de descrio tambm falhar. Isto nunca e a ca e deve acontecer, porque o arquivo de descrio no alterado depois da tabela ser criada: ca a e 1. Restaure o arquivo de descrio de um backup e volte ao estgio 3. Voc pode tambm ca a e e restaurar o arquivo de indice e voltar ao estgio 2. No ultimo caso, voc deve iniciar a e com myisamchk -r. 2. Se voc no tem um backup mas sabe exatamente como a tabela foi criada, crie uma e a cpia da tabela em outro banco de dados. Remova o novo arquivo de dados, e ento o a mova a descrio e arquivos de indice do outro banco de dados para o banco de dados ca com problemas. Isto lhe fornece um novo arquivos indice e descrio, mas mantm o ca e arquivo de dados da mesma forma. Volte ao estgio 2 e tente reconstruir o arquivo de a indices.
292
293
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 de myisamchk -d -v : ida 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
294
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 de myisamchk -eis: ida 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 de myisamchk -eiv: ida Checking MyISAM file: company Data records: 1403698 Deleted blocks: - check file-size - check delete-chain block_size 1024: 0
295
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
296
Aqui esto os tamanhos dos arquivos de dados e a 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 Explicaes para os tipos de informaes que o myisamchk produz so fornecidas abaixo. O co co a keyle o arquivo de e indices. Registro e linha so sinnimos: a o ISAM le Nome do arquivo ( indice) ISAM. Isam-version Verso do formato ISAM. Atualmente sempre 2. a Creation time Quando o arquivo de dados foi criado. Recover time Quando foi a ultima vez que o arquivo de indices/dados foi reconstru ido. Data records Quantos registros existem na tabela. Deleted blocks Quantos blocos apagados continuam alocando espao. Voc pode c e otimizar sua tabela para minimizar este espao. Veja Seo 4.5.6.10 [Otimizao], c ca ca Pgina 291. a Datale: Parts Para formato de registros dinmicos, isto indica quantos blocos de dados a existem. Para uma tabela otimizada sem registros fragmentados, isto o mesmo que e Data records. Deleted data Quantos bytes de dados deletados no recuperados existem. Voc pode a e otimizar sua tabela para minimizar este espao. Veja Seo 4.5.6.10 [Otimizao], c ca ca Pgina 291. a 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 no pode ser controlado pelo MySQL ainda. Para tabelas xas, isto um a e endereo de registro. Para tabelas dinmicas, isto um endereo de byte. c a e c 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 calculado automaticamente pelo MySQL. Ele sempre um endereo de bloco. e e c 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 espao cada registro ocupa, em bytes. c Record format O formato utilizado para armazenar as linhas da tabelas. Os exemplos anteriores abaixo utilizam Fixed length (tamanho xo). Outros valores poss iveis so a Compressed(compactado) e Packed(empacotado). table description Uma lista de todas as chaves na tabela. Para cada chave, alguma informao de baixo n apresentada: ca ivel e Key Start Len O Nmero desta chave. u Onde, no registro, esta parte do indice inicia. Qual o tamanho desta parte do indice. Para nmeros empacotados, isto u deve sempre ser o tamanho total da coluna. Para strings, deve ser mais curto que o tamanho total da coluna indexada, porque voc pode indexar e um prexo de uma coluna string.
297
unique ou multip. (multiplos). Indica se um valor pode ou no exisitir a vrias vezes neste a indice. Que tipo de dados esta parte do indice tem. Isto um tipo de dados ISAM e com as opes packed, stripped ou empty. co Endereo do bloco de c indice raiz. O tamanho de cada bloco de indice. O tamanho padro 1024, mas o valor a e pode ser alterado na compilao. ca Este um valor estat e istico utilizado pelo otimizador. Ele diz quantos registros existem por valor para esta chave. Uma chave unica sempre tem um valor de 1. Ele pode ser atualizado depois que uma tabela carregada e (ou muito alterada) com myisamchk -a. Se isto no for completamente a atualizado, um valor padro de 30 fornecido. a e
Rec/key
No primeiro exemplo acima, a nona chave uma chave multi partes com duas partes. e Keyblocks used Qual o percentual de bloco de chaves so usados. Como a tabela a usada nos exemplos foi reorganizada com myisamchk, os valores so muito altos (muito a prximos do mximo terico). o a o 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 espao utilizado. No terceiro exemplo acima, a quarta c chave possui 10 caracteres e uma reduo de 60% no espao obtida. ca c e Max levels Qual a profundidade da rvore-B para esta chave. Grandes tabelas com a chaves longas resultam em valores altos. Records Quantos registros existem na tabela. M.recordlength A mdia de tamanho do registro. e tamanho xo, isto o tamanho exato do registro. e Para tabelas com registros de
Packed O MySQL corta espaos do nal de strings. O valor Packed indica o percentual c de economia alcanado fazendo isto. c Recordspace used Qual percentual do arquivo de dados usado. e Empty space Qual percetual do arquivo de dados no usado. a e Blocks/Record Nmero mdio de blocos por registro (isto , de quantos links um regu e e istro fragmentado composto). Sempre ser 1 para tabelas de formato xo. Este e a valor deve permanecer o mais prximo poss o ivel de 1.0. Se ele aumentar, voc pode e reorganizar a tabela com myisamchk. Veja Seo 4.5.6.10 [Otimizao], Pgina 291. ca ca a Recordblocks Quantos blocos (links) so utilizados. Para formatos xos, este o mesmo a e que o nmero de registros. u Deleteblocks Quantos blocos (links) foram exclu idos. Recorddata Quantos bytes no arquivo de dados so usados. a Deleted data Quantos bytes no arquivo de dados foram apagados (sem uso). Lost space Se um registro atualizado para um tamanho menor, algum espao pere c e dido. Isto a soma de todas estas perdas, em bytes. e
298
Linkdata Quando o formato de tabela dinmica utilizado, fragmentos de registros a e so ligados com ponteiros (4 a 7 bytes cada). Linkdata a soma do montante de a e armazenamento utilizado por todos estes ponteiros. Se uma tabela foi compactada com myisampack, mysiamchk -d exibe informaes adicionais co sobre cada coluna da tabela. Veja Seo 4.8.4 [myisampack], Pgina 336, para um exemplo ca a desta informao e uma descrio do que ela signica. ca ca
299
Analisa e armazena a distribuio de chaves para a tabela. Durante a anlise a tabela ca a 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 distribuio de chaves armazenadas para decidir em que ordem tabelas ca devem ser unidas quando algum faz um join em alguma coisa diferente de uma constante. e 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 pode vericar a distribuio de chaves armazenadas com o comando SHOW INDEX. Veja e ca Seo 4.6.8.1 [Show database info], Pgina 303. ca a Se a tabela no foi alterada deste o ultimo comando ANALYZE TABLE, a tabela no ser a a a analisada novamente. Antes do MySQL 4.1.1, o ANALYZE comnado no gravava no log binrio. Desde o MySQL a a 4.1.1 eles so escritos no log binrio a menos que a palavra chave opcional NO_WRITE_TO_ a a BINLOG (ou se alias LOCAL) seja usada.
300
HOSTS
Esvazia as tabelas de cache de nomes de mquinas. Voc deve a e descarregar as tabelas de nomes de mquinas se alguma de suas a mquinas receber um nmero IP diferente ou se voc obter a a u e mensagem de erro Host ... is blocked. Quando mais de max_ connect_erros erros occorrer em um registro para uma determinada mquina enquanto se conecta ao servidor MySQL, o MySQL a assume que algo est errado e bloqueia futuras requisies desta a co mquina. A descarga na tabela de nomes de mquinas permite a a a a ` mquina se conectar novamente. Veja Seo A.2.5 [Mquina ca a bloqueada], Pgina 916.) Voc pode iniciar o mysqld com -O a e max_connection_errors=999999999 para evitar esta mensagem de erro. Recarrega a chave DES do arquivo que foi especicado com a opo ca --des-key-file durante inicializao do servidor. ca Fecha e reabre todos os arquivos de log. Se voc tiver especicado e o arquivo de logs de atualizaes ou um arquivo de log binrio sem co a uma extenso, o nmero de extenso do arquivo log ser sempre a u a a incrementado de um em relao ao arquivo anterior. Se voc usou ca e uma extenso no nome do arquivo, o MySQL ir fechar e reabrir a a o arquivo de log de atualizaes. Veja Seo 4.10.3 [Log de atco ca ualizao], Pgina 373. Isto a mesma coisa que enviar o sinal ca a e SIGHUP para o servidor mysqld. Recarrega os privilgios das tabelas de permisses no banco de e o dados mysql. Defragmenta a cache de consulta par utilizar melhor a sua memria. Este comando no remove qualquer consulta da cache, o a ao contrrio de RESET QUERY CACHE. a Fecha todas as tabelas abertas e fora o fechamento de todas as c 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 que algum execute UNLOCK e e TABLES. Isto uma maneira muito conveniente para fazer backups e se voc possui um sistema de arquivos, como Veritas, que pode e fazer uma imagem instantnea (snapshot) de um certo momento. a Reinicia a maioria das variveis de status para zero. Isto algo a e que deve ser usado somente para depurar uma consulta. Zera todos os recirsos dos usurios. Isto permitir que usurios a a a bloqueados faam login novamente. Veja Seo 4.4.7 [Recursos de c ca usurios], Pgina 265. a a
DES_KEY_FILE LOGS
STATUS USER_RESOURCES
301
Antes do MySQL 4.1.1, o FLUSH comnado no gravava no log binrio. Desde o MySQL a a 4.1.1 eles so escritos no log binrio a menos que a palavra chave opcional NO_WRITE_TO_ a a 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 pode tambm acessar cada um dos comandos vistos acima com o utilitrio mysqladmin, e e a utilizando os comandos flush-hosts, flush-logs, reload ou flush-tables. Tambm de uma olhada no comando RESET usado com a replicao. Veja Seo 4.6.5 e ca ca [RESET], Pgina 301. a
SLAVE
QUERY CACHE
302
Voc tambm pode usar os comandos mysqladmin processlist e mysqladmin kill para e e examinar e matar threads. Nota: Atualmente voc no pode utilizar KILL com a biblioteca do servidor MySQL embue a tido, porque o servidor embutido apenas roda dentro das threads da aplicao, ela no cria ca a threads de conexes por si prpria. o o Quando voc utiliza um KILL, um sinal (ag) kill especico congurado para a thread. e e Na maioria dos casos pode levar algum tempo para a thread morrer pois o sinal kill s oe checado em intervalos especicos. Nos loops SELECT, ORDER BY e GROUP BY, o sinal checado depois de ler um bloco de e registros. Se o sinal kill est habilitado a instruo abortada. a ca e Na execuo de um ALTER TABLE o sinal kill conferido antes de cada bloco de registros ca e ser lido da tabela original. Se o sinal kill foi habilitado, o comando abortado e a tabela e temporria apagada. a Ao fazer um UPDATE TABLE and DELETE TABLE, o sinal de kill conferido depois de e que cada bloco lido e depois de cada atualizao ou remoo de registro. Se o sinal e ca ca kill est habilitado, a instruo abortada. Note que se voc no estiver utilizando a ca e e a transaes, as alteraes no iro ser desfeitas! co co a a GET_LOCK() ir aborar com NULL. a Uma thread INSERT DELAYED ir rapidamente descarregar todos registros que estiverem a em memria e morrer. o Se a thread estiver no manipulador de bloqueio de tabelas (status: Locked), o bloqueio de tabela ser abortado rapidamente. a Se a thread estiver esperando por espao livre em disco numa chamada write, a escrita c abortada com uma mensagem de espao em disco insuciente. e c
303
SHOW fornece informaes sobre bancos de dados, tabelas, colunas ou informaes do estado co co do servidor. Se a parte LIKE wild usada, a string wild pode ser uma string que usa os e meta caracteres % e _ do SQL.
SHOW FIELDS um sinnimo para SHOW COLUMNS e SHOW KEYS um sinnimo para SHOW INDEX. e o o Voc tambm pode listar as colunas ou e e indices de uma tabela com mysqlshow nome_db nome_tabela ou mysqlshow -k nome_bd nome_tabela. SHOW INDEX retorna a informao de ca indice em um formato que lembra bem a chamada SQLStatistics do ODBC. As seguintes colunas so retornadas: a Coluna Table Non_unique Key_name Seq_in_ index Column_name Signicado Nome da tabela. 0 se o indice no puder conter duplicidades, 1 se a puder Nome do indice. Nmero da sequncia da coluna no u e indice, ` para tir de 1. Nome da coluna.
304
Collation
Como a coluna ordenada no e indice. No MySQL, pode ter valores A (Ascendente) ou NULL (Not sorted). Nmero de valores unicos no u indice. Isto atue alizado executando isamchk -a. Nmero de caracteres indexados se a coluna s u oe a indexada parcialmente. NULL se a chave inteira for indexada. Contm YES se a coluna puder conter NULL. e Mtodo de e indice utilizado. Vrios comentrios. No momento, ele diz no a a MySQL < 4.0.2 se o indice FULLTEXT ou no. e a
Perceba que como o Cardinality contado baseado nas estat e isticas armazenadas como inteiros, ele pode no ser exato para tabelas pequenas. a As colunas Null e Index_type foram adicionadas no MySQL 4.0.2.
305
Comment
O Comentrio utilizado quando a tabela criada (ou alguma a e informao do porqu do MySQL no poder acessar a inca e a formao da tabela). ca Tabelas InnoDB iro relatar o espao livre no tablespace no comentrio da tabela. a c a
306
| 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 variveis de estado listadas acima tem o seguinte signicado: a Varivel a 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 Nmero de conexes abortadas porque o cliente morreu sem u o fechar a conexo corretamente. Veja Seo A.2.10 [Erros de a ca Comunicao], Pgina 918. ca a Nmero de tentativas que falharam ao tentar a conexo ao u a servidor MySQL. Veja Seo A.2.10 [Erros de Comunicao], ca ca Pgina 918. a Nmero de bytes recebidos por todos os clientes. u Nmero de bytes enviados para todos os clientes.. u Nmero de vezes que os comandos xxx foram executados. u Nmero de tentativas de conexo ao servidor MySQL. u a Nmero de tabelas temporrias implicitas em disco criadas u a durante a execuo de instrues. ca co Nmero de tabelas temporrias implicitas na memria criadas u a o durante execues de instrues. co co Quantos arquivos temporrios o mysqld criou. a Nmero de threads para tratamento de insertdelayed que u esto em uso. a Nmero de registros escritos com INSERT DELAYED. u Nmero de registros escritos com INSERT DELAYED onde algum u erro ocorreu (provavelmente duplicate key). Nmero de comandos FLUSH executados. u Nmero de vezes que um registro foi apagado da tabela. u
307
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
Nmero de vezes que a primeira entrada foi lida de um u indice. Se este valor for alto, sugere que o servidor est fazendo vrias a a leituras de indices, por exemplo, SELECT col1 FROM foo, assumindo que col1 indexado. e Nmero de requisioes para ler um registro baseado em uma u c chave. Se este valor for alto, uma boa indicao que suas e ca pesquisas e tabelas esto indexadas corretamente. a Nmero de requisies para ler o prximo registro na ordem u co o da chave. Este valor ser aumentado se voc consultar uma a e coluna de indice com uma faixa restrita. Ele tambm aumene tar se forem feitas busca nos a indices. Nmro de requisies ao registros anterior na ordem da chave. e co Ele principalmente usado para otimizar ORDER BY ... DESC. e Nmero de requisies para ler um registro baseado em uma u co posio xa. O valor ser alto se voc estiver executando ca a e vrias pesquisas que exigem ordenao do resultado. a ca Nmero de requises para ler o prximo registro no arquivo u o o de dados. Ser alto se voc estiver fazendo vrias buscas na a e a tabela. Geralmente sugere que suas tabelas no esto correa a tamente indexadas ou que suas pesquisas no foram escritas a para tirar vantagem dos indices existentes. Nmeros de comandos ROLLBACK internos. u Nmero de requisies para atualizar um registro em uma u co tabela. Nmero de requisies para inserir um registro em uma u co tabela. O nmero de blocos utilizados no cache das chaves. u O nmero de requisies para ler um bloco de chaves do cache. u co O nmero de leituras f u isicas de blocos de chaves do disco. O nmero de requisies para gravar um bloco de chaves no u co cache. O nmero de escritas f u isicas de um bloco de chaves para o disco. O nmero mximo de conexes simultneas que foram usadas. u a o a Blocos de chaves no cache de chaves que foi alterado mas ainda no foi descarregado para o disco. a Nmero de registros esperando para serem escritos em las u INSERT DELAY. Nmero de tabelas abertas. u Nmero de arquivos abertos. u Nmero de uxos abertos (usado principalmente para logs). u Nmero de tabelas que foram abertas. u Status de replicao segura. (Ainda no est em uso). ca a a Nmero de joins sem chaves (Se for 0, voc deve conferir com u e cuidado o indice de suas tabelas). Nmero de joins onde foram usadas pesquisas segmentadas u na tabela de referencia. Nmero de joins onde foram usadas faixas da primeira tabela. u (Normalmente no cr a e itica mesmo se o valor estiver alto.)
308
Nmero de joins onde zemos uma busca completa na u primeira tabela. Select_range_check Nmero de joins sem chaves onde o uso de chave foi conferido u aps cada registro (Se for 0, o o indice de suas tabelas deve ser conferido com cuidado) Questions Nmero de consultas enviadas para o servidor. u Slave_open_temp_tables Nmero de tabelas temporrias atualmente abertas pela u a thread slave. Slave_running E ON se este slave est conectado a um master. a Slow_launch_threads Nmero de threads que levaram mais tempo do que slow_ u lauch_time para serem criadas. Slow_queries Nmero de consultas que levaram mais tempo que long_ u query_time segundos. Veja Seo 4.10.5 [Log de consultas ca lentas], Pgina 377. a Sort_merge_passes Nmero de ifuses feitas pelo algor u o itmo de ordenao. Se ca este valor for alto voc deve considerar o aumento de sort_ e buffer. Sort_range Nmero de ordenaoes que foram feitas com limites. u c Sort_rows Nmero de registros ordenados. u Sort_scan Nmero de ordenaoes que foram feitas lendo a tabela. u c ssl_xxx Variveis usadas por SSL; Ainda no implementado. a a Table_locks_immediate Nmero de vezes que um travamento de tabela foi obtido de u maneira automtica. a Table_locks_waited Nmero de vezes que um bloqueio de tabela no pde ser u a o obtido imediatamente e foi preciso esperar. Se o valor for alto, e voc tiver problemas de performance, suas consultas e devem ser otimizadas e depois dividir sua tabela ou tabelas ou usar replicao. Dispon ` partir da verso 3.23.33 ca ivel a a Threads_cached Nmero de threads no cache de threads. u Threads_connected Nmero de conexes atuais abertas. u o Threads_created Nmero de threads criadas para lidar com conexes. u o Threads_running Nmero de threads que no esto dormindo. u a a Uptime Quantos segundos o servidor est funcionando. a Alguns comentrios sobre a tabela acima: a Se Opened_tables for grande, provavelmente sua varivel table_cache est muito a a pequena. Se key_reads for grande, provavelmente sua varivel key_buffer_size provavelmente a est muito pequena. O indice de acertos do cache pode ser calculaldo com key_ a reads/key_read_requests. Se Handler_read_rnd for grande, provavelmente voc possui vrias consultas que exe a igem do MySQL fazer busca em tabelas inteiras ou voc tem joins que no utilizam e a chaves corretamente. Se Threads_created for grande voc pode desejar aumentar a varivel e a thread_cache_size. A taxa de acerto da cache pode ser calculada com Threads_created/Connections. Se Created_tmp_disk_tables for grande, voc pode querer aumentar a varivel tmp_ e a table_size par obter tabelas temporrias em memrias em vez de tabelas em disco. a o
Select_scan
309
310
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
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
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
311
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
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
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
312
| wait_timeout | 28800 | +---------------------------------+------------------------------+ Cada opo descrita abaixo. Valores para tamanhos de buer, comprimento e tamanho ca e de pilha so fornecidos em bytes. Voc pode especicar valores com suxos K ou M para a e indicar o valor em kilobytes ou megabytes. Por exemplo, 16M indica 16 Megabytes. No a importa se os suxos esto em letras maisuculas ou minsculas; 16M e 16m so equivalentes: a u u a ansi_mode. Est ligado (ON) se o mysqld foi iniciado com --ansi. Veja Seo 1.8.2 a ca [Modo ANSI], Pgina 42. a back_log O nmero de requisies de conexes que o MySQL pode suportar. Isto entra u co o em cena quando a thread principal do MySQL recebe MUITAS solicitaes de conexes co o em um espao curto de tempo. Eles tomam algum tempo (porm muito pouco) da a c e thread principal para conferir a conexo e iniciar uma nova thread. O valor back_log a indica quantas requisies podem ser empilhadas durante este breve tempo antes do co MySQL parar de responder a novas requisies. Voc is precisa aument-lo se espera co e o a um nmero alto de conexes em um curto periodo de tempo u o Em outras palavras, este valor o tamanho da la de escuta para novas conexes e o TCP/IP. Seu sistema operacional tem o prprio limite para o tamanho desta la. o A pgina do manual Unix da chamada de sistema listen(2) deve fornecer maiores a detalhes. Conra a documentao do seus SO para saber o valor mximo para esta ca a varivel. Tentativas de congurar back_log maior do que o limite de seu sistema a operacional sero inecazes. a basedir O valor da opo --basedir. ca bdb_cache_size O buer que alocado para o cache de e indice e registros de tabelas BDB. Se voc no utiliza tabelas BDB, deve iniciar o mysqld com a opo --skip-bdb e a ca de memria para este cache. para evitar desperdicio o bdb_log_buffer_size O buer que alocado para o cache de e indice e registros de tabelas BDB. Se voc no utiliza tabelas BDB, deve congur-la com 0 ou iniciar o e a a mysqld com a opo --skip-bdb para evitar desperd de memria para este cache. ca icio o bdb_home O valor para a opo --bdb-home. ca bdb_max_lock O nmero mximo de bloqueios (1000 por padro) que podem ser feitas u a a em uma tabela BDB. Voc deve ser aument-la se obter erros do tipo: bdb: Lock e a table is out of available locks ou Got error 12 from ... quando so necessrias a a longas transaes ou quando o mysqld precisar examinar vrios registros para calcular co a a pesquisa. bdb_logdir O valor da opo --bdb-logdir. ca bdb_shared_data Est ligada (ON) se voc estiver utilizando --bdb-shared-data. a e bdb_tmpdir O valor da opo --bdb-tmpdir. ca binlog_cache_size. O tamanho do cache para armazenar instrues SQL para o co log binrio durante uma transao. Se voc geralmente utiliza transaes grandes, a ca e co multi-instrues, voc pode aumentar este valor para obter mais performance. Veja co e Seo 6.7.1 [COMMIT], Pgina 615. ca a bulk_insert_buffer_size (era myisam_bulk_insert_tree_size) MyISAM usa uma cache especial em rvore para fazer inseres em bloco (isto , INSERT ... a co e SELECT, INSERT ... VALUES (...), (...), ..., e LOAD DATA INFILE) mais rpidos. a
313
Esta varivel limita o tamanho da rvore cache em bytes por thread. Den com 0 a a i-la desabilitar esta otimizao Nota: esta cache s usada quando adicionado dados a a ca oe e uma tabela no vazia. O valor padro 8 MB. a a e character_set O conjunto de caracteres padro. a character_sets Os conjuntos de caracteres suportados. concurrent_inserts Se ON (ligado, por padro), o MySQL permitir o uso de INSERT a a em tabelas MyISAM ao mesmo tempo em que so executadas consultas SELECT. Voc a e pode desligar esta opo iniciando mysqld com --safe ou --skip-new. ca connect_timeout O nmero de segundos que o servidor mysqld espera para um pacote u de conexo antes de responder com Bad handshake. a datadir O valor da opo --datadir. ca delay_key_write Option for MyISAM tables. Can have one of the following values: OFF All CREATE TABLE ... DELAYED_KEY_WRITE so ignorados. a ON (padro) MySQL seguir a opo DELAY_KEY_WRITE para a a ca CREATE TABLE. ALL Todas as novas tabelas abertas so tratadas como se fossem a criadas com a opo DELAY_KEY_WRITE. ca Se DELAY_KEY_WRITE estiver habilitado, isto siginica que o buer de chaves das tabelas com esta opo no sero descarregadas a cada atualizao do ca a a ca indice, mas somente quando a tabela fechada. Isto ir aumentar bem a velocidade de escrita em chaves, e a mas voc deve adicionar vericao automtica de todas as tabelas com myisamchk e ca a --fast --force se voc us-lo. e a delayed_insert_limit Depois de inserir delayed_insert_limit registros, o agente que cuida de INSERT DELAYED ira conferir se exitem instrues SELECT pendentes. Se co sim, ele permite a execuo destas antes de continuar. ca delayed_insert_timeout Quanto tempo uma thread INSERT DELAYED deve esperar por instrues INSERT antes de terminar. co 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 existir espao na la novamente. e c habilitado (ON) se voc iniciar o MySQL com a opo --flush. flush E e ca flush_time Se esta varivel for congurada com um valor diferente de zero, ento a a a cada flush_time segundos todas tabelas sero fechadas (para economizar recursos e a sincronizar dados com o disco). Recomendamos esta opo somente em sistemas com ca Win95, Win98 ou outros sistemas com poucos recursos. ft_boolean_syntax Lista de operadores suportados por MATCH ... AGAINST(... IN BOOLEAN MODE). Veja Seo 6.8 [Pesquisa Fulltext], Pgina 619. ca a ft_min_word_len O tamanho minimo da palavra a ser inclu em um ida indice FULLTEXT. Nota: indices FULLTEXT devem ser reconstru idos depois de alterar esta varivel. (Esta a opo nova para o MySQL 4.0.) ca e ft_max_word_len O tamanho mximo da palavra a ser inclu a ida em um indice FULLTEXT. Nota: indices FULLTEXT devem ser reconstru idos depois de alterar esta varivel. (Esta opo nova para o MySQL 4.0.) a ca e
314
ft_query_expansion_limit Nnero de correspondncias a usar para consulta de exu e panso (em MATCH ... AGAINST (... WITH QUERY EXPANSION). (Esta opo nova no a ca e MySQL 4.1.1) ft_max_word_len_for_sort O tamanho mximo da palavra a ser inclu em um a ida indice FULLTEXT a ser usado no mtodo rpido de recriao do e a ca indice em REPAIR, CREATE INDEX, ou ALTER TABLE. Palavras mais longas so inseridas de modo lento. A a regra do dedo a seguinte: com ft_max_word_len_for_sort aumentando, MySQL a e criar arquivos temporrios maiores (tornando o processo lente, devido a E/S de a a disco), e colocar poucas chaves em um bloco ordenado (diminuindo a ecincia noa e vamente). Quando ft_max_word_len_for_sort muito pequeno, MySQL ir inserir e a vrias palavras no a indice de modo lento, mas pequenas palavras sero inseridas muito a rapidamente. ft_stopword_file O arquivo do qual se l a lista de palavras de parada para pesquisa e fulltext. Todas as palavras do arquivo sero usadas; comentrios no so seguidos. a a a a de palavras de parada a usada (como denido em Por padro, a lista j incluida a a e myisam/ft_static.c). Denir este parmetro com uma string vazia ("") disabilitaa a o ltro de palavras de parada. Nota: indices FULLTEXT devem ser reconstru idos depois de alterar esta varivel. (Esta opo nova para o MySQL 4.0.) a ca e 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 opo --skipca bdb for usada. have_raid YES se o mysqld suportar a opo RAID. ca have_openssl YES se o mysqld suportar SSL (criptograa) no protocolo cliente/ servidor. init_file O nome do arquivo especicado com a opo --init-file quando voc ca e iniciar o servidor. Este um arquivo das instrues SQL que voc deseja que o servidor e co e execute quando iniciado. e interactive_timeout O nmero de segundos que o servidor espera por atividade u em uma conexo antes de fech-la. Um cliente interativo denido como um cliente a a e que utiliza a opo CLIENT_INTERACTIVE para mysql_real_connect(). Veja tambm ca e wait_timeout. join_buffer_size O tamanho do buer que utilizado para full joins (joins que no e a utilizam indices). O buer alocado uma vez para cada full join entre duas tabelas. e Aumente este valor para obter um full join mais rpido quando a adio de a ca indices no a for poss ivel. (Normalmente a melhor forma de obter joins rpidas adicionar a e indices.) key_buffer_size Blocos de indices so buferizados e compartilhados por todas as a threads. key_buffer_size o tamanho do buer utilizado para indexar blocos. e Aumente-o para lidar melhor com os indices (para todas as leituras e escritas mltiplas) u para o mximo poss 64M em uma mquina com 256M que executa, principalmente, a ivel a o MySQL bastante comum. Entretanto, se voc deixar este valor muito grande e e (mais que 50% da sua memria total?) seu sistema pode iniciar a paginar e se tornar o MUITO lento. Lembre-se que como o MySQL no utiliza cache de leitura de dados, a ser necessrio deixar algum espao para o cache do sistema de arquivos para o Sistema a a c Operacional.
315
Voc pode vericar a performance do buer de chaves executando SHOW STATUS e examie nar as variveis Key_read_requests, Key_reads, Key_write_requests e Key_writes. a A razo de Key_reads/Key_read_request deve normalmente ser < 0.01. O Key_ a write/Key_write_requests normalmnte prximo de 1 se voc estiver utilizando na e o e maioria updates/deletes mas deve ser bem menor se voc tender a fazer atualizaes que e co afetam vrias outras ao mesmo tempo ou se voc estiver utilizando DELAY_KEY_WRITE. a e Veja Seo 4.6.8 [SHOW], Pgina 302. ca a Para obter ainda mais velocidade quando estiver gravando vrios registros ao mesmo a tempo, utilize LOCK TABLES. Veja Seo 6.7.5 [LOCK TABLES], Pgina 617. ca a language A linguagem utilizada para mensagens de erro. large_file_support Se o mysqld foi compilado com opes para suporte a grandes co arquivos. locked_in_memory Se o mysqld foi travado na memria com --memlock o log Se o log de todas as consultas est habilitado. a log_update Se o log de atualizaes est habilitado. co a log_bin Se o log binrios est habilitado. a a log_slave_updates Se as atualizaes do slave devem ser logadas. co long_query_time Se uma consulta demorar mais que isto (em segundos), o contador Slow_queries ser incrementado. Se voc estiver utilizando --log-slow-queries, a e consulta ser logada ao arquivo de consultas lentas. Veja Seo 4.10.5 [Slow query a ca log], Pgina 377. Este valor medido em tempo real, no em tempo de CPU, assim a e a 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 Seo 4.10.5 [Log de ca consultas lentas], Pgina 377. a lower_case_nome_tabelas Se estiver congurado para 1, nomes de tabelas so ara mazenados em letras minsculas no disco e nomes de tabelas sero caso-insensitivo. u a Na verso .0.2, esta opo tambm se aplica aos nomes de banco de dados. Na verso a ca e a 4.1.1 esta opo tambm se aplcia a alias de tabelas. Veja Seo 6.1.3 [Caso sensitivo ca e ca nos nomes], Pgina 473. a max_allowed_packet O valor mximo de um pacote. O buer de mensagens inicia e ado por net_buffer_length bytes, mas pode crescer at max_allowed_packet bytes e quando for necessrio. Este valor por padro pequeno, para obter pacotes maiores a a e (possivelmente errados). Voc deve incrementar este valor se voc estiver usando colue e nas BLOB grandes. Ele deve to grande quanto o maior BLOB que voc deseja utilizar. O a e protocol atual limita o max_allowed_packet ` 16M no MySQL 3.23 e 1G no MySQL a 4.0. max_binlog_cache_size Se uma transao multi-instrues necessitar de mais que este ca co montante de memria, ser obtido o erro "Multi-statement transaction required more o a than max binlog cache size bytes of storage" ("Transao multi-instrues necessita ca co 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 binrio a (replicao) exceder o valor fornecido, rotacione os logs. Voc no pode congur-lo ca e a a para menos de 4096 bytes (1024 na verso do MySQL anteriores a 4.0.14), ou mais que a 1 GB. O valor padro 1 GB. Nota se voc estiver usando transaes: uma transao a e e co ca
316
escrita em um bloco no arquivo de log binrio, j que ele nunca separado entre e a a e diversos logs binrios. Desta forma, se voc tiver grandes transaes, voc pode ter a e co e logs binrios maioores que max_binlog_size. Se max_relay_log_size (dispon a a ivel partir do MySQL 4.0.14) 0, ento max_binlog_size se aplicar bem aos relay logs. e a a max_connections O Nmero de clientes simultneos permitidos. Aumentar este valor u a aumenta o nmero de descritores de arquivos que o mysqld necessita. Veja abaixo u os comentrios sobre os limites de descritores de arquivos. Veja Seo A.2.6 [Muitas a ca conexes], Pgina 916. o a max_connect_errors Se houver mais que este nmero de conexes interrompidas a u o partir de uma mquina est mquina ter as prximas conexes bloqueadas. Voc a a a a o o e pode desbloquar uma mquina com o comadno FLUSH HOSTS. a max_delayed_threads No inicie mais do que este nmero de threads para lidar com a u instrues INSERT DELAYED. Se voc tentar inserir dados em uma nova tabela depois co e que todas as threads INSERT DELAYED estiverem em uso, o registro ser inserido como a se o atributo DELAYED no fosse especicado. Se voc congur-lo com 0, o MySQL a e a nunca criar uma thread max delayed. a max_heap_table_size Esta varivel dene o tamanho mximo que uma tabela HEAP a a criada pode ter. O valor da varivel usado para calcular um valor MAX_ROWS da tabela a e HEAP. A denio desta varivel no tem nenhum efeito sobre qualquet tabela HEAP ca a a existente, a memos que a tabela seja recriada com uma instruo como CREATE TABLE ca ou TRUNCATE TABLE, ou alterada com ALTER TABLE. max_join_size Joins que provavelmente forem ler mais que max_join_size registros retornam um erro. Congure este valor se os seus usurios tendem a realizar joins que a no possuem uma clusula WHERE, que tomam muito tempo, e retornam milhes de a a o registros. max_relay_log_size Dispon a partir da verso 4.0.14. Se uma escrita ao relay log ivel a (um tipo de log usado por slaves de replicao, veja Seo 4.11.3 [Replication Implemenca ca tation Details], Pgina 381) exceder o valor dado, rotacione o relay log. Esta varivel a a lhe permite colocar diferentes restries de tamanho no relay logs e logs binrios. No co a entanto, congurar a varivel com 0 far o MySQL usar max_binlog_size tanto para a a o log binrio quanto para o relay logs. Voc tem que congurar max_relay_log_size a e com 0 ou mais de 4096, e menos que 1 GB. O padro 0. a e max_seeks_for_key Limite do nmero mximo de buscas ao procurar linhas com base u a em uma chave. O otimizador MySQL assumir que quando pesquisar por linhas correa spondentes em uma tabela atravs da varredura da chave, no faremos mais que este e a nmero de busca de chave independente da cardinalidade da chave. Congurando este u parmetro com um valor baixo (100 ?) voc pode forar o MySQL a preferir chaves a e c em vez de varrer a tabela. max_sort_length O nmero de bytes utilizados para ordenar valores BLOB ou TEXT u (somente os primeiros max_sort_lenght bytes de cada valor so usados; o resto a e ignorado). max_user_connections O valor mximo de conexes ativas para um unico usurio (0 a o a = sem limite). max_tmp_tables (Esta opo ainda no faz nada.) Nmero mximo de tabelas temca a u a porrias que um cliente pode manter abertas ao mesmo tempo. a
317
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 opo --myisam-recover. ca myisam_sort_buffer_size O buer que alocado ao ordenar o e indice quando estiver fazendo um REPAIR ou estiver criando indices com CREATE INDEX ou ALTER TABLE. myisam_max_extra_sort_file_size. Se a criao do arquivo temporrio para criao ca a ca rpida de a indices fosse este valor maior que quando for usado o cache de chaves, de preferncia ao mtodo de cache de chaves. Isto usado principalmente para forar que e e e c longas chaves de caracteres em tabelas grandes usem o mtodo de cache de chaves mais e lenta para criar o indice. NOTE que este parmetro fornecido em megabytes! a e myisam_repair_threads. Se este valor maior que um, durante o processo reparo e por ordena~o os ca indices de tabels MyISAM sero criados em paralelo - cada a indice em sua prpria thread. Nota reparos com multi-threads est ainda sob cdigo de qualidade o a o alpha. myisam_max_sort_file_size O tamanho mximo do arquivo temporrio que pera a e mitido 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 criado a atravs do cache de chaves (que mais lento). NOTE que este parmetro fornecido e e a e em megabytes antes da verso 4.0.3 e em bytes a partir desta verso. a a net_buffer_length O buer de comunicaes congurado para este tamanho enco e tre queries. Isto no deve ser alterado normalmente, mas se voc tem muito pouca a e memria, pode congur-lo para o tamanho esperado de uma consulta. (Isto , o o a e tamanho experado das instrues SQL enviadas pelos clientes. Se as instrues exco co cederem este valor, o buer aumentado automaticamente, at max_allowed_packet e e bytes.) net_read_timeout Nmero de segundos para esperar por mais dados de uma conexo u a antes de abortar a leitura. Perceba que quando ns no esperamos dados de uma o a conexo, o tempo mximo de espera denido pelo write_timeout. Veja tambm a a e e slave_read_timeout. net_retry_count Se uma leitura na porta de comunicaes for interrompida, tente co novamente net_retry_count vezes antes de parar. Este valor deve ser bem alto no FreeBSD j que interrupes internas so enviadas para todas as threads. a co a net_write_timeout Nmero de segundos para esperar pela escrita de um bloco em u uma conexo antes de abortar a escrita. a open_files_limit Nmero de arquivos que o sistema permite que o mysqld abra. u Este o valor real dado para o sistema e pode ser diferente do valor que voc passa ao e e mysqld como parmetro de inicializao. Ele 0 em sistemas onde o MySQL no pode a ca e a alterar o nmero de arquivos abertos. u pid_file O valor da opo --pid-file. ca port O valor da opcao --port. protocol_version A verso do protocolo usada pelo servidor MySQL. a range_alloc_block_size Tamanho dos blocos que so alocados ao se fazer uma a otimizao da faixa. ca
318
read_buffer_size (era record_buffer) Cada thread que faz uma leitura sequencial aloca um buer deste tamanho para cada tabela lida. Se voc zer vrias leituras e a sequenciais, voc pode desejar aumentar este valor. e read_rnd_buffer_ae (era record_rnd_buffer) Ao ler registros na ordem depois de uma ordenao, os registros so lidos atravs deste buer para evitar pesquisas em ca a e disco. Pode melhorar bastante o ORDER BY se congurado com um valor alto. Como esta uma varivel espec e a ica da thread, no se pode den globalmente, mas apenas a i-la alter-la ao executar alguma consulta espec a ica grande. query_alloc_block_size Tamanho dos blocos de alocao de memria que so aloca o a cados para objetos criados durante a anlise e execuo da consulta. Se voc tiver a ca e problemas com fragmentao de memria ele pode ajudar a aumentar isto um pouco. ca o query_cache_limit No armazena resultados que so maiores que esta varivel. a a a (Padro 1M). a query_cache_size A memria alocada para armazenar resultados de consultas antigas. o Se 0, a cache de consulta desabilitada (padrot). e a query_cache_type Pode ser congurado com (somente numrico) e Valor 0 1 2 Comentrio a No armazena ou recupera resultados a Armazena todos os resultados exceto consultas SELECT SQL_NO_ CACHE .... DEMAND Armazena apenas consultas SELECT SQL_CACHE .... Alias OFF ON
query_prealloc_size Buer persistente para anlise e execuo da consulta. No a ca a e liberado entre consultas. Em teoria, tornando-o grande o suciente voc pode fazer e o MySQL executar consultas sem ter que fazer uma unica chamada malloc. safe_show_database No exibe bancos de dados nos quais o usurio no tem nenhum a a a privilgios. Isto pode melhorar a segurana se voc se preocupa com o fato das pessoas e c e estarem aptas a ver quais bancos de dados outros usurios possuem. Veja tambm a e skip_show_databases. server_id O valor da opo --server-id. ca skip_locking Est desligado (OFF) se o mysqld usar bloqueio externo. a skip_networking Est ligado (ON) se somente permitimos conexes locais (socket). a o skip_show_databases Isto previne usurios de fazerem SHOW DATABASES se eles no a a possuirem o privilgio PROCESS_PRIV. Isto pode aumentar a segurana se voc se e c e preocupa com o fato das pessoas poderem ver quais bancos de dados outros usurios a possuem. Veja tambm safe_show_databases. e slave_net_timeout Nmero de segundos para esperar por mais dados de uma conexo u a de master/slave antes de abortar a leitura. slow_launch_time Se a criao de threads demorar mais que este valor (em segundos), ca o contador Slow_launch_threads ser incrementado. a socket O socket Unix utilizado pelo servidor. sort_buffer Cada thread que precisar fazer uma ordenao aloca um buer deste ca tamanho. Aumente este valor para operaoes ORDER BY ou GROUP BY mais rpidas. c a Veja Seo A.4.4 [Arquivos temporrios], Pgina 929. ca a a
319
table_cache O nmero de tabelas abertas para todas as threads. Aumentar este u valor aumenta o nmero de descritores de arquivos que o mysql necessita. O MySQL u precisa de dois descritores de arquivos para cada tabela unica aberta. Veja abaixo os comentarios sobre os limites do descritor de arquivos. Voc pode conferir se necessita a e aumentar o cache de tabela conferindo a varivel Opened_tables. Veja Seo 4.6.8.3 a ca [Tabelas Abertas], Pgina 305. Se esta varivel for grande e voc no faz muitos a a e a FLUSH TABLES (que apenas fora todas as tabelas a serem fechadas e reabertas), ento c a voc deve aumentar o valor desta varivel. e a Para informaes sobre como o cache de tabelas funciona, veja Seo 5.4.7 [Table cache], co ca Pgina 451. a table_type O tipo padro de tabelas. a thread_cache_size Quantas threads devem ser mantidas em cache para reutilizao. ca Quando um cliente desconecta, as threads dos clientes so colocadas no cache se no a a existir mais de thread_cache_size threads que antes. Todas novas threads sero a obtidas primeiramente do cache, e s quando o cache estiver vazio uma nova thread o e criada. Esta varivel pode ser aumentada para melhorar a performance se voc tiver a e vrias conexes novas. (Normalmente isto no d uma melhora de performance notvel a o a a a se voc possuir uma boa implementao de threads.) Examinando as diferenas entre e ca c Connections e Threads_create (veja Seo 4.6.8.3 [SHOW STATUS], Pgina 305 para ca a maiores detalhes) pode ser visto o quo ecente o cache de threads atual. a e thread_concurrency No Solaris, mysqld ir chamar thr_setconcurrency() com este a valor. thdr_setconcurrency() permite que a aplicao fornea ao sistema de threads ca c uma dica com o nmero desejado de threads que devem ser executados ao mesmo u tempo. thread_stack O tamanho da pilha para cada thread. Vrios dos limites detectados a pelo teste crash-me so dependentes deste valor. O padro grande o suciente para a a e operaes normais. Veja Seo 5.1.4 [Benchmarks do MySQL], Pgina 421. co ca a timezone O fuzo horrio para este servidor. a tmp_table_size Se uma tabela temporria em memria exceder este tamanho, o a o MySQL ir a convert-la automaticamente para uma tabela MyISAM em disco. Aua e mente o valor de tmp_table_size se voc zer vrias consultas GROUP BY avanadas e e a c voc tiver muita memria. e o tmpdir O diretrio utilizado para arquivos temporrios e tabelas temporrias. A partir o a a do MySQL 4.1, ele pode ser denido com uma lista de caminhos separados por dois pontos (:) (ponto e v irgula (; no Windows). Eles sero usados de modo robin-round. a Este recurso pode ser usado para dividir a craga entre diversos discos f isicos. transaction_alloc_block_size Tamanho dos blocos de alocao de memria que so ca o a alocados para consultas de armazenamento que so parte de uma transao que est a ca a para ser armazenada no log binrio ao se fazer um commit. a transaction_prealloc_block_size Buer persistente para transaction_alloc_ blocks que no liberado entre as consultas. Tornando-o grande o suciente para a e caber todas as consulta em uma transao comum voc pode evitar muitas chamadas ca e malloc. version O nmero da verso do servidor. u a
320
wait_timeout O nmero de segundos que o servidor espera pela atividade em uma u conexo antes de fech-la. Veja tambm interactive_timeout. a a e Na inicializao da thread, SESSION.WAIT_TIMEOUT inicializado por GLOBAL.WAIT_ ca e TIMEOUT ou GLOBAL.INTERACTIVE_TIMEOUT dependendo do tipo do cliente (como denido pela opo de conexo CLIENT_INTERACTIVE). ca a Veja tambm e interactive_timeout. A seo do manual que descreve o ajuste do MySQL contm algumas informaes de como ca e co sintonizar as variveis acima. Veja Seo 5.5.2 [Parmetros do servidor], Pgina 454. a ca a a
321
deleting from main table Ao executar a primeira parte de um delete multi-tabela e estamos deletando apenas da primeira tabela. 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 executando FLUSH TABLES e est esperando que todas a a as threads fechem as suas tabelas. Killed Algum enviou um sinal para matar a thread e ela deve abortar a prxima vez e o que ele vericar o parmetro kill. O parmetro vericado em cada loop maior no a a e MySQL, mas em alguns casos ainda pode levar um tempo curto para a thread morrer. Se a thread est bloqueada par outra thread, a nalizao ter efeito assim que as a ca a outras threads liberarem o bloqueio. Sending data A thread est processando registros para uma instruo SELECT e a ca tambm est enviando dados ao cliente. e a Sorting for group A thread est fazendo uma ordenao para satisfazer a um GROUP a ca BY. Sorting for order A thread est fazendo uma ordenao para satisfazer a um ORDER a ca BY. Opening tables Isto simplesmente signica que a thread est tentando abrir uma a tabela. Este deve ser um procedimento muito rpido, a menos que algo previna da a abertura. Por exemplo um ALTER TABLE ou um LOCK TABLE pode prvenir a abertura de uma tabela at que o comando esteja nalizado. e Removing duplicates A consulta estava usando SELECT DISTINCT de tal modo que o MySQL no podia otimizar o distinct em um estagio anterior. Por isto o MySQL fez a um estgio extra para remover todos os registros duplicados antes de enviar o resultado a ao cliente. Reopen table A thread obteve um lock para a tabela, mas noticou aps o lock que a o estrutura da tabela alterou. Ela liberou o lock, fechou a tabela e agora est tentando a reabr i-la. Repair by sorting O cdigo de reparao est utilizando ordenamento para recriar os o ca a indices. Repair with keycache O cdigo de reparao est usando a criao de chaves uma a o ca a ca uma atravs da cache de chaves. Isto muito mais lento que Repair by sorting. e e Searching rows for update A thread esta fazendo uma primeira fase pra encontrar todos os registros coincidentes antes de atualiz-los. Isto deve ser feito se o UPDATE a est alterando o indice usado para encontrar os registros envolvidos. a Sleeping A thread est esperando que o cliente envie um novo comando a ela. a System lock A thread est esperando um lock de sistema externo para a tabela. Se a voc no est usando mltiplos servidores mysqld que esto acessando a mesma tabela, e a a u a voc pode desabilitar o lock de sistema com a opo --skip-external-locking. e ca Upgrading lock O manipulador de INSERT DELAYED est tentando obter um lock para a inserir registros na tabela. Updating A thread est procurando por registros para atualiz-los. a a User Lock A thread est esperando um GET_LOCK(). a
322
Waiting for tables A thread recebeu uma noticao que a estrutura de uma tabela ca foi alterada e ela precisa reabrir a tabela para receber a nova estrutura. Para poder reabrir a tabela ela deve esperar at que todas a outras threads tenham fechado a e tabela em questo. a A noticao acontece se outra thread usou FLUSH TABLES ou um dos seguintes ca comando na tabela em questo: FLUSH TABLES nome_tabela, ALTER TABLE, RENAME a TABLE, REPAIR TABLE, ANALYZE TABLE ou OPTIMIZE TABLE. waiting for handler insert O manipulador do INSERT DELAYED processou todas as inseres e est esperado por outras. co a A maioria dos estados so operaes muito rpidas. Se a thread permanecer em qualquer a co a destes estados por muitos segundos, pode haver um problema que precisa ser investigado. Existem outros estados que no so mencionados anteriormente, mas a maioia deles s so a a o a uteis para encontrar erros no mysqld.
323
324
O nmero mximo de avisos pode ser espec u a icado usando a varivel do servidor max_ a error_count, SET max_error_count=[count]; Por padro 64. No caso de avisos desabila e itados, simplesmente zere esta varivel. No caso de max_error_count ser 0, ento o contaa a dor de avisos ainda representa quantos avisos ocorreram, mas nenhuma das mensagens so a armazenadas. Por exemplo, considere o seguinte instruo de tabela ALTER para o exemplo acima, o ca 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>
325
| HEAP | YES | Hash based, stored in memory, useful for temporary tables | | MERGE | YES | Collection of identical MyISAM tables | | ISAM | YES | Obsolete table type; Is replaced by MyISAM | | 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 opo Support DEFAULT indica se um tipo de tabela particular suportado, e qual o ca ee e tipo padro. Se o servidor iniciado com --default-table-type=InnoDB, ento o campo a e a Support do InnoDB ter o valor DEFAULT. a
SHOW PRIVILEGES Este comando implementado no MySQL 4.1.0. e SHOW PRIVILEGES mostra a lista de privilgios de sistema o servidor MySQL suporta. e 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)
326
Todos os binrios padres do MySQL so compilados com --with-extraa o a charsets=complex. Isto adicionar cdigo a todos os programas padres para estarem a o o aptos a lidar com o conjuntos de caracteres latin1 e todos os multi-byte no binrio. a Outros conjuntos de caracteres sero carregados de um arquivo de denies de conjuntos a co de caracteres quando necessrios. a O conjunto de caracteres determina quais so os caracteres permitidos em nomes e qual a a forma de ordenao por clusulas ORDER BY e GROUP BY da instruo SELECT. ca a ca Voc pode alterar o conjunto de caracteres com a opo --default-character-set e ca na inicializao do servidor. Os conjuntos de caracteres dispon ca iveis dependem dos parmetros --with-charset=charset e --with-extra-charset= list-of-charset | a complex | all | none e os arquivos de conguraes de conjuntos de caracteres listados co em SHAREDIR/charsets/ Index. Veja Seo 2.3.3 [Opes de conguraes], Pgina 98. ca co co a Se o conjunto de caracteres for alterado durante a execuo do MySQL (que tambm pode alca e terar a ordenao), deve-se executar o 0myisamchk -r -q --set-character-set=charset ca em todas as tabelas. De outra forma seus indices podem no ser ordenados corretamente. a Quando um cliente conecta a um servidor MySQL, o servidor envia o conjunto de caracteres padro em uso ao cliente. O cliente ir alternar para o uso deste conjunto de caracteres a a nesta conexo. a Deve ser utilizado mysql_real_escape_string() quando desejar ignorar seguncias de e caracteres em uma consulta SQL. mysql_real_escape_string() identico ` antiga funo e a ca mysql_espace_string(), exceto pelo fato de usar a manipulador de conexo MySQL como a o primeiro parmetro. a Se o cliente for compilado com o caminho diferente daquele onde o servidor est instalado e a o usurio que congurou o MySQL no incluiu todos os conjuntos de caracteres no binrios a a a do MySQL, deve ser especicado para o cliente onde ele pode encontrar os conjuntos de caracteres adcicionais que sero necessrios se o servidor executar com um conjunto de a a caracteres diferente do cliente. Isto pode ser especicado colocando em um arquivo de opes do MySQL: co [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets onde o caminho aponta para onde os conjuntos de caracteres dinmicos do MySQL so a a armazenados. Pode-se forar o cliente a usar conjuntos de caracteres espec c icos especicando: [client] default-character-set=nome-conjunto-caracteres mas normalmente isto nunca ser necessrio. a a
327
a -> ae o -> oe u -> ue -> ss Todos os caracteres acentuados, so convertidos para suas contra partes sem acentos e em a letras maisculas. Todas as letras so convertidas para maisculas. u a u Ao compara strings com LIKE o mapeamento de caracteres de um -> dois no feito. Todas a e as letras so convertidas para maisculas. Acentos so removidos para todas as letras a u a exceto: , , , , e . U u O o A a
328
2. Crie o arquivo sql/share/charsets/MYSET.conf. (O arquivo sql/share/charsets/latin1.conf pode ser utilizado como base para isto). A sintaxe para o arquivo muito simples: e Comentrios iniciam com um caractere # e continuam at o m da linha. a e Palavras so separadas por quantidades arbitrrias de espaos em brancos. a a c Ao denir o conjunto de caracteres, cada palavra deve ser um nmero no formato u hexadecimal O vetor ctype obtm as primeiras 257 palavras. Os vetores to_lower, to_upper e e sort_order obtm, cada um, as 256 palavras seguintes. e Veja Seo 4.7.4 [Vetor de caracteres], Pgina 329. ca a 3. Adicione o nome do conjunto de caracteres `s listas CHARSETS_AVAILABLE e COMPILED_ a CHARSETS no configure.in. 4. Recongure, recompile e teste. Para um conjunto de caracteres complexo faa o seguinte: c 1. Crie o arquivo strings/ctype-MYSET.c na distribuio fonte do MYSQL. ca 2. Adicione MYSET ao nal do arquivo sql/share/charsets/Index. Associe um nmero unico a ele. u 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 - Seo 4.7.4 [Vetor de caracteres], Pgina 329 - para ca a um conjunto de caracteres complexo. 4. Prximo ao topo do arquivo, coloque um comentrio especial como este: o a /* * 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 comentrio para incluir o conjunto de caracteres a na biblioteca MySQL automaticamente. As linhas strxfrm multiply e mbmaxlen sero explicadas nas prximas sees. S as a o co o inclua se voc precisar de funes de ordenao de strings ou das funes de conjuntos e co ca co de caracteres multi-byte, respectivamente. 5. Voc deve ento criar algumas das seguintes funes: e a co my_strncoll_MYSET() my_strcoll_MYSET() my_strxfrm_MYSET() my_like_range_MYSET() Veja Seo 4.7.5 [Ordenao de caracteres], Pgina 329. ca ca a
329
6. Adicione o nome do conjunto de caracteres `s listas CHARSETS_AVAILABLE e COMPILED_ a CHARSETS no configure.in. 7. Recongure, recompile e teste. O arquivo sql/share/charsets/README fornece algumas instrues a mais. co Se voc desejar ter o seu conjunto de caracteres inclu na distribuio MySQL, envie e ido ca um email com um patch para a lista de email internals do MySQL. Veja Seo 1.7.1.1 ca [Mailing-list], Pgina 33. a
330
No momento, a melhor documentao sobre isto so os conjuntos de caracteres que j esto ca a a a implementados. Conra os conjuntos de caracteres big5, czech, gbk, sjis e tis160 para exemplos. Voc deve especicar o valor strxfrm_multiply_MYSET=N no comentrio especial no topo e a do arquivo. N deve ser congurado para a razo mxima que as strings podem crescer a a durante my_strxfrm_MYSET (ele deve ser um inteiro positivo).
331
mysql_install_db Cria as tabelas de permisses do MySQL com os privilgios padres. Este o e o comando normalmente executado somente na primeira vez quando o MySQL e instalado em um sistema. e
332
A maioria das opes para mysqld_safe so as mesmas que as do mysqld. Veja Seo 4.1.1 co a ca [Opes de linha de comando], Pgina 207. co a mysqld_safe suporta as seguintes opes: co --basedir=caminho --core-file-size=# Tamanho do arquivo core que o mysqld poder criar. Passado para ulimit -c. a --datadir=caminho --defaults-extra-file=caminho --defaults-file=caminho --err-log=caminho --log-error=caminho Gava o log de erro no caminho acima. Pgina 372. a --ledir=caminho Caminho para mysqld --log=caminho --mysqld=vers~o_do_mysqld a Nome da verso do mysqld no diretrio ledir que voc deseja iniciar. a o e --mysqld-version=vers~o a Similar ao --mysqld= mas aqui voc s fornece o suxo para o mysqld. Por e o exemplo, se voc utiliza --mysqld-version=max, o mysqld_safe ir iniciar a e a verso ledir/mysqld-max. Se o argumento para --mysqld-version estiver a vazio, ledir/mysqld ser usado. a --nice=# (adicionado no MySQL 4.0.14) --no-defaults --open-files-limit=# Nmero de arquivos que o mysqld poder abrir. Passado para ulimit -n. u a Perceba que ser necessrio iniciar mysqld_safe como root para isto funcionar a a corretamente! --pid-file=caminho --port=# --socket=caminho --timezone=# Congura a varivel de fuso horrio (TZ) para o valor deste parmetro. a a a --user=# O script mysqld_safe gravvel, portanto ele deve estar apto para iniciar um servidor que e a foi instalado de uma fonte ou uma verso binria do MySQL, mesmo se o servidor estiver a a instalado em localizaes um pouco diferentes. mysqld_safe espera uma destas condies co co ser verdadeira: O servidor e o banco de dados pode ser encontrado relativo ao diretrio de onde o o mysqld_safe foi chamado. mysqld_safe procura dentro de seu diretrio de trabalho o pelos diretrios bin e data (para distribuioes binrias) ou pelos diretrios libexec o c a o
333
e var (para distribuies baseadas em cdigo fonte). Esta condio deve ser satisfeita co o ca se voc executar o mysqld_safe a partir do seu diretrio da instalao do MySQL (por e o ca exemplo, /usr/local/mysql para uma distribuio binria). ca a Se o servidor e os bancos de dados no forem encontrados relativos ao diretrio de a o trabalho, mysqld_safe tenta localiz-lo utilizando caminhos absolutos. Localizaes a co t ipicas so /usr/local/libexec e /usr/local/var. As localizaes atuais foram a co determinadas quando a distribuio foi constru da qual vem o mysqld_safe. Eles ca ida dever estar corretas se o MySQL foi instalado na localizao padro. ca a Como o mysqld_safe tentar encontrar o servidor e o banco de dados relativo a seu diretrio a o de trabalho, voc pode instalar uma distribuio binria do MySQL em qualquer lugar, e ca a desde de que o mysqld_safe seja iniciado a partir do diretrio da instalao: o ca shell> cd diretrio_instala~o_mysql o ca shell> bin/mysqld_safe & Se o mysqld_safe falhar, mesmo se invocado a partir do diretrio de instalao do MySQL, o ca voc pode modic-lo para usar o caminho para o mysqld e as opes de caminho que e a co seriam corretas para seu sistema. Perceba que se voc atualizar o MySQL no futuro, sua e verso modicada de mysqld_safe ser sobrescrita, portanto, voc deve fazer uma cpia de a a e o sua verso editada para que voc a possa reinstalar. a e
334
--config-file=... Arquivo de congurao alternativo. NOTA: Isto no ir afetar as prprias ca a a o opes do programa (grupo [mysqld_multi]), mas somente grupos [mysqld#]. co Sem esta opo tudo ser procurado a partir do arquivo my.cnf. ca a --example Fornece um exemplo de um arquivo de congurao. ca --help --log=... Arquivo Log. Deve ser informado o caminho completo e o nome do arquivo log. NOTA: se o arquivo existir, tudo ser anexado. a --mysqladmin=... Binrio mysqladmin a ser usado para o desligamento do servidor. a --mysqld=... Binrio mysqld a ser usado. Lembre-se que voc tambm pode fornecer mysqld_ a e e safe a esta opo. As opes so passadas ao mysqld. Apenas tenha certeza ca co a que o mysqld est localizado na sua varivel de ambiente PATH ou corrija o a a mysqld_safe. --no-log Imprime na sa padro em vez do arquivo log. Por padro o arquivo log ida a a sempre ca ligado. Exibe esta ajuda e sai.
--password=... Senha do usurio para o mysqladmin. a --tcp-ip Conecta ao(s) servidor(es) MySQL atravs de porta TCP/IP no lugar de socket e UNIX. Isto afeta a ao de desligar e relatar. Se um arquivo socket estiver ca faltando, o servidor pode ainda estar executando, mas s pode ser acessado o atravs da porta TCP/IP. Por padro a conexo feita atravs de socket UNIX. e a a e e
--user=... Usurio MySQL para o mysqladmin. a --version Exibe o nmero da verso e sai. u a Algumas notas sobre mysqld_multi: Tenha certeza que o usurio MySQL, que nalizar os servios mysqld (e.g. utilizando o a c mysqladmin) tem a mesma senha e usurio para todos os diretrios de dados acessados a o (para o banco de dados mysql). E tenha certeza que o usurio tem o privilgio a e Shutdown priv ! Se voc possui diversos diretrios de dados e vrios bancos de dados e o a mysql com diferentes senhas para o usurio root do MySQL, voc pode desejar a e criar um usurio comum multi-admin para cada um que utilize a mesma senha (veja a 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~o 4.3.6 [Privilgios], Pgina 232. ca e a
335
Voc deve fazer isto para cada servidor mysqld executando em cada diretrio de dados, e o que voc tem (Apenas altere o socket, -S=...) e pid-file muito importante, se voc estiver utilizando mysqld_safe para iniciar e e o mysqld (ex. mysqld=mysqld safe) Todos os mysqld devem ter seus prprios pido file. A vantagem de utilizar o mysqld_safe no lugar de executar diretamente o mysqld que mysqld_safe guarda todos os processos e ir reinici-los, se um processo do e a a mysqld falhar devido a um sinal kill -9, ou similar. (Como um falha de segmentao, que ca nunca pode acontecer com o MySQL.) Por favor note que pode ser necessrio executar o a script mysqld_safe de um lugar espec ico. Isto signica que voc pode ter que alterar e o diretrio atual para um diretrio espec o o ico 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 Seo 4.8.2 [mysqld_safe], Pgina 331. O teste acima deve ser bem sucedido, ou ca a voc pode encontrar problemas. e Esteja certo do perigoso de iniciar mltiplos mysqlds no mesmo diretrio de dados. u o Utilize diretrios de dados diferentes, a menos que voc realmente SAIBA o que est o e 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 pode ter lacunas no arquivo de congurao. Isto lhe permite mais exibilidade. e ca A ordem na qual os mysqlds so iniciados ou desligados depende da ordem em que eles a aparecem no arquivo de congurao. ca Quando voc desejar referenciar a um grupo espec e ico utilizando GNR com este programa, basta utilizar o nmero no m do nome do grupo ([mysqld# <==). u Voc pode desejar utilizar a opo user para o mysqld, mas para isto voc precisa ser e ca e o usurio root quando iniciar o script mysqld_multi. No importa se a opo existe no a a ca arquivo de congurao; voc receber apenas um alerta se voc no for o superusurio ca e a e a a e o mysqlds for iniciado com a SUA conta no Unix. IMPORTANTE: Tenha certeza que o pid-file e o diretrio de dados acess para leitura e escrita (+execuo para o e ivel ca o diretrio) para ESTE usurio UNIX que iniciar o processo mysqld. NAO utilize a o a a conta de root para isto, a menos que voc SAIBA o que est fazendo! e a MAIS IMPORTANTE: Tenha certeza que voc entendeu os signicados das opes que e co so passadas para os mysqlds e porque VOCE PRECISARIA ter processos mysqld a separados. Iniciando mltiplos mysqlds em um diretrio de dados NAO IRA melhorar u o a performance em um sistema baseado em threads.
Veja Seo 4.2 [Servidores mltiplos], Pgina 219. ca u a Este um exemplo do arquivo de congurao para o funcionamento do mysqld_multi. e ca # Este arquivo provavelmente deve estar em seu diretrio home (~/.my.cnf) ou /etc/my o # Version 2.1 by Jani Tolonen
336
[mysqld_multi] mysqld = /usr/local/bin/mysqld_safe mysqladmin = /usr/local/bin/mysqladmin user = multi_admin password = multipass [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
= = = = = =
= = = = = =
= = = = = =
= = = = = =
337
sobre o myisampack, mas tudo dito sobre myisampack tambm pode ser verdadeiro para o e pack_isam. myisampack trabalha compactando cada coluna na tabela separadamente. A informao ca necessria para descompactar colunas lida em memria quando a tabela aberta. Isto a e o e resulta em uma performance muito melhor quando estiver acessando registros individuais, porque voc precisar descompactar somente um registro, no um bloco muito maior do e a a disco como faz o Stacker no MS-DOS. Normalmente, myisampack compacta o arquivo de dados 40%-70%. O MySQL utiliza mapeamento de memria (nmap()) em tabelas compactadas e retorna ao o uso normal de leitura e escrita se nmap() no funcionar. a Por favor, note o seguinte: Depois de comapctada, a tabela somente-leitura. Isto , normalmente, pretendido e e (como quando acessamos tabelas compactadas em um CD). Permitir que se faa c gravao em uma tabela compactada tambm est em nossa lista TODO, mas com ca e a baixa prioridade. myisampack tambm pode compactar colunas BLOB ou TEXT. O antigo pack_isam (para e tabelas ISAM) no pode fazer isto. a myisampack chamado desta forma: e shell> myisampack [op~es] nome_arquivo ... co Cada nome arquivo deve ter o nome de um arquivo de indice (.MYI). Se voc no se e a encontra em um diretrio de bancos de dados, voc deve especicar o caminho completo o e para o arquivo. Pode-se omitir a extenso .MYI. a myisampack suporta as seguintes opes: co -b, --backup Realiza um backup da tabela como nome_tabela.OLD. -#, --debug=debug_options Log da sa ida de depurao. ca d:t:o,nome_arquivo. A string debug_options geralmante e
-f, --force Fora a compactao da tabela mesmo se ela se tornar maior ou se o c ca arquivo temporrio existir. a myisampack cria um arquivo temporrio a chamado nome_tabela.TMD enquanto ele compacta a tabela. Se voc e matar o myisampack o arquivo .TMD no pode ser removido. Normalmente, a 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 unica tabela nome_ tabela_grande. Todas tabelas que forem combinadas DEVEM ser idnticas e (mesmos nomes de colunas e tipos, alguns indices, etc.).
338
-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 comear a compactar o arquivo, c mas ele pode noticar durante o processo de compactao que ele pode ter usado ca um tamanho menor. Neste caso myisampack ir exibir uma nota dizendo que a a prxima vez que voc compactar o mesmo arquivo voc pode utilizar um o e e registro de tamanho menor.) -s, --silent Modo silencioso. Escreve a sa somente quando algum erro ocorrer. ida -t, --test No compacta realmente a tabela, apenas testa a sua compactao. a ca -T dir_name, --tmp_dir=dir_name Utiliza o diretrio especicado como a localizao em que sero gravadas as o ca a tabelas temporrias. a -v, --verbose Modo verbose. Escreve informao sobre o prograsso e resultado da comca pactao. ca -V, --version Exibe informao de verso e sai. ca a -w, --wait Espera e tenta novamente se a tabela estiver em uso. Se o servidor mysqld foi iniciado com a opo --skip-locking, no uma boa idia chamar myisampack ca a e e se a tabela puder ser atualizada durante o processo de compactao. ca A seqncia de comandos mostrados abaixo ilustra uma t ue ipica seo de compactao de ca ca 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
339
table description: Key Start Len Index Type 1 2 4 unique unsigned long 2 32 30 multip. text Field 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 Start 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 Length Type 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
Rec/key 1 1
340
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
417 421 425 429 449 479 480 481 560 639 718 797 805 806 807 827 831
4 4 4 20 30 1 1 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:
341
Key Start Len Index Type 1 2 4 unique unsigned long 2 32 30 multip. text Field 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 Start 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 Length 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 Type constant zerofill(1) 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 not_always not_always, no not_always, no not_always, no not_always, no not_always, no not_always no empty no empty no empty
Rec/key 1 1
342
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 normal
425 429 449 479 480 481 560 639 718 797 805 806 807 827 831
4 20 30 1 1 79 79 79 79 8 1 1 20 4 4
no no no no no
2 3 3 14 14 15 2 2 16 2 17 3 3 2 2
9 9 9 4 4 9 9 9 9 9 1 9 9 9 9
A informao exibida pelo myisampack descrita abaixo: ca e O nmero de colunas para qual nenhum empacotamento extra utilizado. u e
empty-space O nmero de colunas contendo valores que so somente espaos; estes ocuparo u a c a apenas 1 bit. empty-zero O nmero de colunas contendo valores que so somente 0s binrios; ocuparo u a a a 1 bit. empty-fill O nmero de colunas inteiras que no ocupam a faixa completa de bytes de u a seu tipo; estes so alteradas para um tipo menor (por exemplo, uma coluna a INTEGER pode ser alterada para MEDIUMINT). pre-space O nmero de colunas decimais que so armazenadas com espaos a esquerda. u a c Neste caso, cada valor ir conter uma contagem para o nmero de espaos. a u c end-space O nmero de colunas que tem muitos espaos espaos extras. Neste caso, cada u c c valor conter uma contagem para o nmero de espaos sobrando. a u c table-lookup A coluna tem somente um pequeno nmero de valores diferentes, que so conu a vertidos para um ENUM antes da compresso Human. a zero O nmero de colunas em que todos os valores esto zerados. u a
Original trees O nmero inicial de rvores Human. u a After join O nmero de rvores Human distintas que sobram depois de unir rvores para u a a poupar espao de cabealho. c c
343
Depois que uma tabela foi compactada, myisamchk -dvv exibe informaes adicionais sobre co cada campo: Type O tipo de campo deve conter as seguites descries: co constant Todas linhas tem o mesmo valor. no endspace No armazena espaos no m. a c no endspace, not_always No armazena espaos no m e no faz compactao de espaos a c a ca c nais para todos os valores. no endspace, no empty No armazena espaos no m. No armazena valores vazios. a c a table-lookup A coluna foi convertida para um ENUM. zerofill(n) Os n bytes mais signicativos no valor so sempre 0 e no so a a a armazenados. no zeros No armazena zeros. a always zero Valores zero so armazenados em 1 bit. a Huff tree A rvore Human associada com o campo. a Bits O nmero de bits usado na rvore Human. u a
Depois de ter executado pack_isam/myisampack voc deve executar o isamchk/myisamchk e para recriar o indice. Neste momento voc pode tambm ordenar os blocos de e e indices para criar estat isticas necessrias para o otimizador do MySQL trabalhar de maneira mais a eciente. myisamchk -rq --analyze --sort-index nome_tabela.MYI isamchk -rq --analyze --sort-index nome_tabela.ISM Depois de instalar a tabela compactada no diretrio de banco de dados MySQL voc deve o e fazer mysqladmin flush-tables para forar o mysqld a iniciar usando a nova tabela. c Se voc desejar descompactar uma tabela compactada, voc pode fazer isto com a opo e e ca --unpack para o isamchk ou myisamchk.
344
CFLAGS=Suporte a links simblicos para Windows o DUSE SYMDIR A opo para habilitar o suporte ao InnoDB necessrio apenas no MySQL 3.23. No ca e a MySQL 4 e acima, o InnoDB j inclu por padro. ae ido a Voc pode encontrar os binrios do MySQL-max em http://www.mysql.com/downloads/mysql-max-4.0.h e a A distribuio binria Windows MySQL 3.23 inclui tanto o binrio mysqld.exe padro ca a a a e o binrio mysqld-max.exe. http://www.mysql.com/downloads/mysql-4.0.html. Veja a Seo 2.1.1 [Instalao no Windows], Pgina 60. ca ca a Note que como o Berkeley DB (BDB) no est dispon para todas plataformas, alguns a a ivel dos binrios Max podem no ter suporte para ela. Voc pode conferir quais tipos de tabelas a a e so suportadas executando a seguinte consulta: a 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 so: a Valor Signicado. YES A opo est ativa e utilizada. ca a e NO O MySQL no est compilado com suporte a esta opo. a a ca DISABLED A opo xxx est desabilitada porque o mysqld foi iniciado com --skipca a xxxx ou porque no foi iniciado com todas as opes necessrias para habila co a itar esta opo. Neste caso o arquivo hostname.err deve conter uma razo ca a indicando o porque da opo estar desabilitada. ca NOTA: Para conseguir criar tabelas InnoDB voc DEVE editar suas opes de inicializao e co ca para incluir ao menos a opo innodb_data_file_path. Veja Seo 7.5.2 [InnoDB no ca ca MySQL 3.23], Pgina 643. a Para obter melhor performance para tabelas BDB, voc deve adicionar algumas opes de e co congurao para elas tambm .Veja Seo 7.6.3 [Iniciando BDB], Pgina 699. ca e ca a mysqld_safe tenta iniciar automaticamente qualquer binrio mysqld com o prexo -max. a Isto faz com que seja fcil testar um outro binrio mysqld em uma instalao existente. a a ca Apenas execute o configure com as opes deseejadas e, ento, instale o novo binrio co a a mysqld como mysqld-max no mesmo diretrio onde seu antigo binrio mysqld est. Veja o a a Seo 4.8.2 [mysqld_safe], Pgina 331. ca a No Linux, o RPM mysqld-max utiliza o recurso mysqld_safe j mencionado. (Ele apenas a instala o executvel mysqld-max e o mysqld_safe usar automaticamente este executvel a a a quando o mysqld_safe for reiniciado).
345
A tabela a seguir mostra quais tipos de tabelas nossos binrios MySQL-Max incluem: a Sistema Windows/NT AIX 4.3 HP-UX 11.0 Linux-Alpha Linux-Intel Linux-IA-64 Solaris-Intel SolarisSPARC SCO OSR5 UnixWare Mac OS X BDB S N N N S N N S S S N InnoDB S S S S S S S S S S S
Note que a partir do MySQL 4, voc no precisa de um servidos MySQL Max para o InnoDB e a porque ele inclu por padro. e ido a
A utilizao de MYSQL_PWD insegura. Veja Seo 4.3.8 [Connecting], Pgina 238. ca e ca a No Unix, o cliente mysql utiliza o arquivo nomeado na varivel de ambiente MYSQL_ a HISTFILE para salvar o histrico da linha de comando. O valor padro para o arquivo de o a histrico $HOME/.mysql_history, onde $HOME o valor da varivel de ambiente HOME. o e e a Veja Apndice F [Environment variables], Pgina 1092. e a Se voc no quiser manter um arquivo que contenh um registro de suas consultas, primeiro e a remova .mysql_history se ele existir, ento use uma das seguintes tcnicas: a e Dena a varivel MYSQL_HISTFILE para /dev/null. Para que esta congurao tenha a ca efeito a cada vez que voc logar, coloque-a em um dos arquivos de inicializao da sua e ca shell. Crie .mysql_histfile como um link simblico para /dev/null: o shell> ln -s /dev/null $HOME/.mysql_history Voc s precisa de fazer isto uma vez. e o
346
Todos os programas MySQL podem receber vrias opes diferentes. Entretanto, todo a co programa MySQL fornece a opo --help que voc pode utilizar para obter uma descrio ca e ca completa das diferentes opes do programa. Por exemplo, experimente mysql --help co Voc pode sobrepor todas as opes padres para programas cliente padres com um arquivo e co o o de opes. Seo 4.1.2 [Option les], Pgina 216 co ca a A lista abaixo descreve resumidamente os programas MySQL: msql2mysql Um script shell que converte programas mSQL para MySQL. Ele no lida com a todos os casos, mas ele fornece um bom inicio para a converso. a mysql A ferramenta de linha de comando para a entrada de consultas interativamente ou a execuo de consultas a partir de um arquivo no modo batch. Veja ca Seo 4.9.2 [mysql], Pgina 347. ca a Este programa fornece uma interface grca para interagir com o servidor. a server. Veja Seo 4.9.3 [mysqlcc], Pgina 354. ca a
mysqlcc
mysqlaccess Um script que verica os privilgios de acesso para uma combinao de nome e ca de mquina, usurio e banco de dados. a a mysqladmin Utilitrio para realizar operaes administrativas, tais como criao ou remoo a co ca ca de bancos de dados, recarga das tabelas de permisses, descarga de tabelas em o disco e reabertura dos arquivos log. mysqladmin tambm pode ser usado para e exibir informaes de verso, processos e estado do servidor. Veja Seo 4.9.4 co a ca [mysqladmin], Pgina 356. a mysqlbinlog Utilitrio para leitura das consultas de um log binrio. Pode ser usado para a a recuperao de falhas com um backup antigo. Veja Seo 4.9.5 [mysqlbinlog], ca ca Pgina 358. a mysqldump Descarrega um banco de dados MySQL em um arquivo como instrues SQL co ou como arquivo texto separado por tabulao. Verso aprimorada do freeca a ware escrito originalmente por Igor Romanenko. Veja Seo 4.9.7 [mysqldump], ca Pgina 361. a mysqlimport Importa arquivos texto em suas tabelas respectivas utilizando LOAD DATA INFILE. Veja Seo 4.9.9 [mysqlimport], Pgina 367. ca a mysqlshow replace Exibe informaes sobre bancos de dados, tabelas, colunas e co indices. Um programa utilitrio que usado pelo msql2mysql, mas que tambm pode ser a e e aplicvel mais genericamente. replace altera conjuntos de caracteres. Utiliza a uma mquina de estado nito para comparar strings maiores primeiro. Pode a 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 ...
347
348
-E, --vertical Exibe a sa de uma consulta (linhas) verticalmente. Sem esta opo voc ida ca e tambm pode forar esta sa terminando suas instrues com \G. e c ida co -f, --force Continue mesmo se for obtido um erro SQL. -g, --no-named-commands Comandos nomeados sero desabilitados. Utilize somente a forma \*, ou use a comandos nomeados apenas no comeo da linha terminada com um ponto-ec virgula (;). Desde a verso 10.9, o cliente agora inicia com esta opo habilitada a ca por padro! Com a opo -g, entretando, comandos de formato longo contina ca uaro funcionando na primeira linha. a -G, --enable-named-commands Comandos nomeados so habilitados. Comandos de formato longo so aceitos a a assim como os comandos reduzidos \*. -i, --ignore-space Ignore caractere de espao depois de nomes de funes. c co -h, --host=... Conectar ` mquina especicada. a a -H, --html Produz sa HTML. ida
-X, --xml Produz sa XML. ida -L, --skip-line-numbers No escreve o nmero da linha para os erros. Util quando se deseja comparar a u arquivos com resultados que incluem mensagens de erro. --no-pager Desabilita paginao e impresso na sa padro. Veja tambm a ajuda interca a ida a e ativa (\h). Desabilita arquivo de sa ida. Veja tambm a ajuda interativa (\h). e
--no-tee
-n, --unbuffered Descarrega e atualiza o buer depois de cada pesquisa. -N, --skip-column-names No escrever nomes de colunas nos resultados. a -O, --set-variable nome=op~o ca Fornece um valor a uma varivel. --help lista as variveis. Por favor, note a a que as sintaxes --set-variable=name=value e -O name=value esto obsoletas a desde o MySQL 4.0, use --nome=valor. -o, --one-database Atualiza somente o banco de dados padro. Isto util para evitar atualizao a e ca em outros bancos de dados no log de atualizaes. co
349
--pager[=...] Tipo de sa ida. O padro sua varivel de ambiente PAGER. Paginadores vlidos a e a a so: less, more, cat [>nome arquivo], etc. Veja tambm a ajuda interativa (\h). a e Esta opo no funciona no modo batch. A opo pager funciona somente no ca a ca UNIX. -p[password], --password[=...] Senha a ser usada ao conectar ao servidor. Se uma senha no fornecida a e na linha de comando, lhe ser solicitado uma. Perceba que se voc utilizar o a e formato curto -p voc no pode ter um espao entre a opo e a senha. e a c ca -P --port=... Nmero da porta TCP/IP para usar na conexo. u a --protocol=(TCP | SOCKET | PIPE | MEMORY) Especica o protocolo de conexo usado. Novo no MySQL 4.1. a -q, --quick No faz cache do resultado, imprime linha a linha. Isto pode deixar o servidor a mais lento se a sa for suspendida. No usa arquivo de histrico. ida a o -r, --raw Exibe valores de colunas sem converso de escapes. Utilizado com --batch a --reconnect Se a conexo perdida, tentar reconectar ao servidor automaticamente (mas a e apenas uma vez). -s, --silent Opo para ser mais silencioso. ca -S --socket=... Arquivo socket para ser utilizado na conexo. a -t --table Sa no formato de tabela. Isto padro no modo no-batch. ida e a a
-T, --debug-info Exibe alguma informao de depurao na sa ca ca ida. --tee=... Anexa tudo no arquivo de sa ida. Veja tambm a ajuda interativa (\h). No e a funciona no modo batch.
-u, --user=# Usurio para login diferente do usurio atual do sistema. a a -U, --safe-updates[=#], --i-am-a-dummy[=#] Permite somente que UPDATE e DELETE utilizem chaves. Veja abaixo para maiores informaes sobre esta opo. Voc pode zerar esta opo se possui-la co ca e ca no arquivo my.cnf utilizando --safe-updates=0. -v, --verbose Modo verbose (-v -v -v fornece o formato de sa da tabela). ida -V, --version Gera sa com informao de verso e sai. ida ca a
350
-w, --wait
Voc tambm pode congurar as seguntes variveis com -O ou --set-variable. Por favor, e e a note que as sintaxes --set-variable=nome=valor e -O name=value esto obsoletas desde a o MySQL 4.0, use --var=option: Nome Varivel a Padro Descrio a ca connect timeout 0 Nmero de seguntos antes de esgotar o tempo da conexo u a local-inle 0 Disabilita (0) ou habilita (1) capacidade LOCAL para LOAD DATA INFILE max allowed packet 16777216Tamanho mximo do pacote para enviar/receber do a servidor net buer length 16384 Tamanho do buer para comunicao TCP/IP e socket ca select limit 1000 Limite automtico para SELECT quando utilizar --safea updtaes max join size 1000000 Limite automtico para registros em uma join quando a utilizar --safe-updtaes. Se o cliente mysql perder a conex`o com o servidor enquanto envia uma consulta, ele tentar a a se reconectar imediatamente e automaticamente uma vez e enviar a consulta novamente. Note que mesmo se ele obter sucesso na reconexo, como sua primeira conexo foi nalizada, a a todas seus objetos da sesso anteriores foram perdidos: tabelas temporrias, e variveis de a a a sesso e de usurio. Desta forma, o comportamento acima pode ser perigoso para voc, a a e como neste exemplo onde o servidor foi desligado e reiniciado sem voc saber: e 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 varivel de usurio @a foi perdida com a conexo e depois da reconexo ela indenida. a a a a e Para se proteger deste risco, voc pode iniciar o cliente mysql com a opo --disablee ca reconnect. Se voc digitar help na linha de comando, mysql ir exibir os comandos que ele suporta: e a mysql> help
351
Display this text. Synonym for help. Clear command. Reconnect to the server. Optional arguments are db and host. 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 informaes sobre a conexo e o servidor que est co a a utilizando. Se voc estiver executando no modo --safe-updates, status ir tambm e a e imprimir os valores para as variveis mysql que afetam suas consultas. a Uma opo util para iniciantes (introduzido no MySQL verso 3.23.11) o --safe-updates ca a e (ou --i-am-a-dummy para usurios que uma vez possam ter feito um DELETE FROM nome_ a tabela mas esqueceram da clusula WHERE). Quando utilizar esta opo, o mysql envia o a ca seguinte comando ao servidor MySQL quando abrir a conexo. a SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#, SQL_MAX_JOIN_SIZE=#max_join_size#" onde #select_limit# e #max_join size# so variveis que podem ser conguradas da a a linha de comando mysql. Veja Seo 5.5.6 [SET OPTION], Pgina 460. ca a O efeito da opo acima : ca e Voc no tem permisso de utilizar uma instruo UPDATE ou DELETE se voc no possuir e a a ca e a uma chave na parte WHERE. Pode-se, entretanto, forar um UPDATE/DELETE utilizando c LIMIT:
352
UPDATE nome_tabela SET campo_nao_chave=# WHERE campo_nao_chave=# LIMIT 1; Todos resultados maiores so limitados automaticamente a #select_limit# linhas. a SELECTs que provavelmente precisaro examinar mais que #max_join_size a combinaoes de linhas sero abortadas. c a Algumas dicas uteis sobre o cliente mysql: Alguns dados so muito mais leg a iveis quando exibido verticalmente, em vez da sa do ida tipo caixa horizontal comum. Por exemplo: Textos longos, que incluem vrias linhas, so a a vertical. muito mais fceis de serem lidos com saida a 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: [email protected] mail_to: "Thimble Smith" <[email protected]> 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 pode utilizar a opo tee. O tee pode ser iniciado com a opo --tee=..., e ca ca ou pela linha de comando de maneira interativa com o comando tee. Todos os dados exibidos na tela sero anexados no arquivo fornecido. Isto tambm pode ser muito util para a e propsitos de depurao. O tee pode ser desabilitado da linha de comando com o comando o ca notee. Executando tee novamente o log reiniciado. Sem um parmetro o arquivo anterior e a ser usado. Perceba que tee ir atualizar os resultados dentro do arquivo depois de cada a a comando, pouco antes da linha de comando reaparecer esperando pelo prximo comando. o Navegar ou pesquisar os resultados no modo interativo em algum programa do UNIX como o less, more ou outro similar, agora poss com a opo --pager[=...]. Sem argumento, e ivel ca o cliente mysql ir procurar pela varivel de ambiente PAGER e congurar pager para este a a 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 congurado com ele. O comando pager pode ser chamado com um a argumento, mas isto requer que a opo --pager seja usada, ou o pager ser usado com a ca a padro. pager funciona somente no UNIX, uma vez que utilizado a funo popen(), saida a e ca
353
que no existe no Windows. No Windows a opo tee pode ser utilizada, entretanto ela a ca pode no ser cmoda como pager pode ser em algumas situaes. a o co Algumas dicas sobre pager: Voc pode us-lo para gravar em um arquivo: e a mysql> pager cat > /tmp/log.txt e os resultados iro somente para um arquivo. Voc tambm pode passar qualquer a e e opes para os programas que voc deseja utilizar com pager: co e mysql> pager less -n -i -S Note a opo -S exibida acima. Voc pode ach-la muito util quando navegar pelos ca e a a horizontal (nalize os comandos resultados; experimente com a opo com saida ca com \g, ou ;) e com sa vertical (nal dos comandos com \G). Algumas vezes um ida resultado com um conjunto muito largo dif ser lido na tela, com a opo -S para e icil ca less, voc pode navegar nos resultados com o less interativo da esquerda para a e direita, evitando que linhas maiores que sua tela continuem na prxima linha. Isto o pode tornar o conjunto do resultado muito mais leg ivel. voc pode alterar o modo e entre ligado e desligado com o less interativo com -S. Veja o h(help) para mais ajuda sobre o less. Voc pode combinar maneiras muito complexas para lidar com os resultados, por exeme plo, o seguinte enviaria os resultados para dois arquivos em dois diferentes diretrios, o 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 tambm pode combinar as duas funes acima; tenha o tee habilitado, o pager e e co congurado para less e voc estar apto a navegar nos resultados no less do Unix e ainda e a ter tudo anexado em um arquivo ao mesmo tempo. A diferena entre UNIX tee usado com o c pager e o tee embutido no cliente mysql que o tee embutido funciona mesmo se voc no e e a tiver o comando UNIX tee dispon ivel. O tee embutido tambm loga tudo que exibido na e e tela, e o UNIX tee usado com pager no loga completamente. Por ultimo o tee interativo a mais cmodo para trocar entre os modos on e o, quando voc desejar logar alguma coisa e o e em um arquivo, mas deseja estar apto para desligar o recurso quando necessrio. a alterar o prompt no cliente de linha de comando mysql. A partir da verso 4.0.2 possivel a e Voc pode usar as seguintes opes do prompt: e co Opo ca Descrio ca \v verso mysqld a \d banco de dados em uso \h mquina na qual est conectado a a \p porta na qual est conectado a \u nome do usurio a \U nome usurio@maquina a \\ \ \n nova quebra de linha \t tab \ espao c
354
\ \R \r \m \y \Y \D \s \w
espao c hora no formato 24h (0-23) hora no formato 12h (1-12) minutos ano com dois digitos ano com quatro digitos formato completo da data segundos dia da semana no formato com 3 letras (Mon, Tue, ...) \P am/pm \o ms no formato de nmero e u \O ms no formato com 3 letras (Jan, Feb, ...) e \c contador que cresce a cada comando \ seguido por qualquer outra letra apenas retorna aquela letra. Voc pode denir o prompt nos seguintes lugares: e Varivel de Ambiente a Voc pode congurar o prompt em qualquer arquivo de congurao do MySQL, e ca no grupo mysql. Por exemplo: [mysql] prompt=(\u@\h) [\d]>\_ Linha de Comando Voc pode denir a opo --prompt na linha de comando para mysql. Por e ca exemplo: shell> mysql --prompt="(\u@\h) [\d]> " (usurio@maquina) [banco de dados]> a Interativamente Voc tambm pode usar o comando prompt (ou \R) para alterar o seu prompt e e 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>
355
mysqlcc no est inclu com a distribuio MySQL, mas pode ser feito o download a a ido ca separadamente em http://www.mysql.com/downloads/. mysqlcc suporta as seguintes opes: co -?, --help Exibe esta ajuda e sai. -b, --blocking_queries Usa consultas em bloco. -C, --compress Usa o protocolo servidor/cliente compactado. -c, --connection_name=name Este um sinnimo para --server. e o -d, --database=... Banco de dados a ser usado. Isto util principalmente no arquivo my.cnf. e -H, --history_size=# Tamanho do histrico para a janiela de consultas. o -h, --host=... Conecta a uma determinda mquina. a -p[password], --password[=...] Senha usada ao se conectar ao servidor. Se uma senha no for especicada a na linha de comando, voc dever inform-la. Note que se voc usar a forma e a a e simplicada -p no permitido um espao entre a opa e a senha. a e c co -g, --plugins_path=name Caminho para o diretrio onde os plugins do MySQL Control Center estao o lacalizados. -P port_num, --port=port_num Nmero da porta TCP/IP para uso na conexo. u a -q, --query Abre uma janela de consulta na inicializao. ca -r, --register Abre a caixa de dilogo Register Server na inicializao. a ca -s, --server=name Nome da conexo do MySQL Control Center. a -S --socket=... Arquivo socket usado na conexo. a -y, --syntax Habilita destque da sintaxe e complementao ca -Y, --syntax_file=name Arquivo de sintaxe para complementao. ca
356
-T, --translations_path=name Caminho para o diretrio onde as tradues do MySQL Control Center esto o co a localizados. -u, --user=# Usurio para login se diferente do usurio atual. a a -V, --version Exibe a verso e sai. a Voc tambm pode congurar as seguntes variveis com -O ou --set-variable. Por favor, e e a note que as sintaxes --set-variable=nome=valor e -O name=value esto obsoletas desde a o MySQL 4.0, use --var=option: Variable Name connect timeout local-inle max allowed packet net buer length select limit max join size Default Description 0 Number of seconds before connection timeout. 0 Disable (0) or enable (1) LOCAL capability for LOAD DATA INFILE 16777216Max packet length to send to/receive from server 16384 Buer for TCP/IP and socket communication 1000 Automatic limit for SELECT when using --safe-updtaes 1000000 Automatic limit for rows in a join when using --safeupdates
357
kill id,id,... Mata threads do MySQL. password ping Congura uma nova senha. Altera a antiga senha para nova senha. Checa se o mysqld est ativo. a
processlist Exibe lista de threads ativas no servidor, com a instruo SHOW PROCESSLIST. ca Se a opo --verbose passada, a sa ca e ida como aquela de SHOW FULL e PROCESSLIST. reload refresh shutdown Recarrega tabelas de permisso. a Atualiza todas as tabelas e fecha e abre arquivos de log. Desliga o servidor.
slave-start Inicia thread de replicao no slave. ca slave-stop Termina a thread de replicao no slave. ca status variables version Fornece uma mensagem curta sobre o estado do servidor. Exibe variveis dispon a iveis. Obtm informao de verso do servidor. e ca a
Todos comandos podem ser reduzidos para seu prexo unico. 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 Nmero de segundos que o servidor MySQL est funciou a nando. Nmero de threads ativas (clientes). u Nmero de solicitaes dos clientes desde que o mysqld u co foi iniciado. Consultas que demoram mais que long_query_time segundos. Veja Seo 4.10.5 [Log de consultas lentas], ca Pgina 377. a Quantas tabelas foram abertas pelo mysqld. Nmero de comandos flush..., refresh e reload. u Nmero de tabelas abertas atualmente. u
358
Memory in use
Memria alocada diretamente pelo cdigo do mysqld o o (dispon somente quando o MySQL compilado com ivel e with-debug=full). Max memory used Memria mxima alocada diretamente pelo cdigo do o a o mysqld (dispon somente quando o MySQL compiivel e lado com with-debug=full). Se voc executa um mysqladmin shutdown em um socket (em outras palavras, em um e computador onde o mysqld est executando), mysqladmin ir esperar at que o arquivoa a e pid do MySQL seja removido para garantir que o servidor mysqld parou corretamente.
359
A partir do MySQL 4.0.14, mysqlbinlog pode preparar uma entrada para o mysql executar um LOAD DATA INFILE a partir de um log binrio. Como o log binrio contm os dados para a a e carregar (isto verdade para o MySQL 4.0; o MySQL 3.23 no grava o dado carregado em e a um log binrio, assim o arquivo original era necessrio quando se queria executar o contedo a a u do log binrio), mysqlbinlog copiar este data para um arquivo temporrio e imprime um a a a comando LOAD DATA INFILE para o mysql carregar este arquivo temporrio. O local onde o a arquivo temorrio criado o diretrio temporrio por padro; ele pode ser alterado com a e e o a a a opo local-load do mysqlbinlog. ca Antes do MySQL 4.1, mysqlbinlog no podia preaparar sa cab a ida iveis para mysql quando o log binrio continha consultas de diferentes threads usando tabelas temporrias de mesmo a a nome, se estas consultas eram entrelaadas. Isto est resolvido no MySQL 4.1. c a Voc tambm pode usar o mysqlbinlog --read-from-remote-server para ler o log binrio e e a diretamente de um servidor MySQL remoto. No entanto, isto algo que est obsoleto j e a a que queremos tornar fcil de se aplicar os logs binrios em servidores MySQL em execuo. a a ca mysqlbinlog --help lhe dar mais informaes a co
360
-A, --all-databases Verica todos os bancos de dados. Isto o mesmo que databases com todos e os bancos de dados selecionados. -1, --all-in-1 Em vez de fazer uma consulta para cada tabela, execute todas as consultas separadamente para cada banco de dados. Nomes de tabelas estaro em uma a lista separada por v irgula. -a, --analyze Anlise as tabelas fornecidas. a --auto-repair Se uma tabela checada est corrompida, ela corrigida automaticamente. O a e reparo ser feito depois que todas as tabelas tiverem sido checadas e forem a detectadas tabelas corrompidas. -#, --debug=... Log de sa de depurao. Normalmente d:t:o,lename ida ca e --character-sets-dir=... Diretrio onde esto os conjuntos de caracteres. o a -c, --check Verifca erros em tabelas -C, --check-only-changed Verica somente tabelas que foram alteradas desde a ultima conferncia ou que e no foram fechada corretamente. a --compress Utilize compresso no protocolo server/cliente. a -?, --help Exibe esta mensagem de ajuda e sai. -B, --databases Para vericar diversos bancos de dados. Perceba a diferena no uso; Neste caso c nenhuma tabela ser fornecida. Todos os argumentos so tratados como nomes a a de bancos de dados. --default-character-set=... Congura o conjunto de caracteres padro. a -F, --fast Verica somente as tabelas que no foram fechadas corretamente a -f, --force Continue mesmo se ns obtermos um erro de sql. o -e, --extended Se voc estiver utilizando esta opo com CHECK TABLE, ir garantir que a e ca a tabela est 100 por cento consistente, mas leva bastante tempo. a Se voc utilizar esta opo com REPAIR TABLE, ele ir executar um comando e ca a de reparos na tabela, que no s ir demorar muito tempo para executar, mas a o a tambm pode produzir muitas linhas de lixo. e
361
-h, --host=... Conecta ` mquina. a a -m, --medium-check Mais rpido que vericao extendida, mas encontra somente 99.99 de todos os a ca erros. Deve resolver a maioria dos casos. -o, --optimize Otimizador de tabelas -p, --password[=...] Senha para usar ao conectar ao servidor. Se a senha no for fornecida ser a a solicitada no terminal. -P, --port=... Nmero de porta para usar para conexo. u a -q, --quick Se esta opo for utilizada com CHECK TABLE, evita a busca de registros ca vericando links errados. Esta a conferncia mais rpida. e e a Se voc estiver utilizando esta opo com REPAIR TABLE, ela tentar reparar e ca a somente a rvore de a indices. Este o mtodo de reparo mais rpido para uma e e a tabela. -r, --repair Pode corrigir quase tudo exceto chaves unicas que no so unicas. a a -s, --silent Exibe somente mensagens de erro. -S, --socket=... Arquivo socket para usar na conexo. a --tables Sobrepe a opo databases (-B). o ca
-u, --user=# Usurio para o login, se no for o usurio atual. a a a -v, --verbose Exibe informao sobre os vrios estgios. ca a a -V, --version Exibe informao sobre a verso e sai. ca a
362
shell> mysqldump [OPC~ES] banco_de_dados [tabelas] O OR mysqldump [OPC~ES] --databases [OPC~ES] BD1 [BD2 BD3...] O O OR mysqldump [OPC~ES] --all-databases [OPC~ES] O O Se voc no fornecer nenhuma tabela ou utilizar o --databases ou --all-databases, e a todo(s) o(s) banco(s) de dados ser(o) descarregado(s). aa Voc pode obter uma lista das opes que sua verso do mysqldump suporta executando e co a mysqldump --help. Perceba que se voc executar o mysqldump sem a opo --quick ou --opt, o mysqldump ir e ca a carregar todo o conjunto do resultado na memria antes de descarregar o resultado. Isto o provavelmente ser um problema se voc est descarregando um banco de dados grande. a e a Note que se voc estiver utilizando uma cpia nova do programa mysqldump e se voc for e o e fazer uma descarga que ser lida em um servidor MySQL muito antigo, voc no deve a e a utilizar as opes --opt ou -e. co mysqldump suporta as seguintes opes: co --add-locks Adicione LOCK TABLES antes de UNLOCK TABLE depois de cada descarga de tabelas. (Para obter inseres mais rpidas no MySQL.) co a --add-drop-table Adicione um drop table antes de cada instruo create. ca -A, --all-databases Descarrega todos os bancos de dados. Isto ir ser o mesmo que --databases a com todos os bancos de dados selecionados. -a, --all Inclui todas as opes do create espec co icas do MySQL. --allow-keywords Permite criao de nomes que colunas que so palavras chaves. Isto funciona ca a utilizando o nome da tabela como prexo em cada nome de coluna. -c, --complete-insert Utilize instrues de insert completas (com nomes de colunas). co -C, --compress Compacta todas as informaes entre o cliente e o servidor se ambos suportarem co a compactao. ca -B, --databases Para descarregar diversos bancos de dados. Perceba a diferena no uso. Neste c caso nenhuma tabela fornecida. Todos argumentos so estimados como nomes e a de bancos de dados. USE nome_bd; ser inclu na sa antes de cada banco a ido ida de dados novo. --delayed Insere registros com o comando INSERT DELAYED. -e, --extended-insert Utiliza a nova sintaxe multilinhas INSERT. (Fornece instrues de insero mais co ca compactas e mais rpidas.) a
363
-#, --debug[=option_string] Rastreia a utilizao do programa (para depurao). ca ca --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 opes so usadas com a opo -T e tem o mesmo signicado que as co a ca clusulas correspondentes em LOAD DATA INFILE Veja Seo 6.4.8 [LOAD DATA], a ca Pgina 588. a -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 mquina especicada. A mquina a a padro localhost. a e -l, --lock-tables. Bloqueia todas as tabelas antes de iniciar a descarga. As tabelas so bloqueadas a com READ LOCAL para permitir inseres concorrentes no caso de tabelas MyISAM. co Por favor, note que ao descarregar multiplas tabelas, --lock-tables bloquear a as tabelas de cada banco de dados separadamente. Assim, usar esta opo no ca a garantir que suas tabelas sejam logicamente consistentes entre os banco de a 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 colocado na sa a ida. Isto far com que a carga a de dados no MySQL 4.0 server seja mais rpida j que os a a indices so criados a depois que todos os dados so inseridos. a -n, --no-create-db CREATE DATABASE /*!32312 IF NOT EXISTS*/ nome_bd; no ser colocado a a na saida. A linha acima ser adicionada se a opo --databases ou a ca --all-databases for fornecida. -t, --no-create-info No grava informaes de criao de tabelas (A instruo CREATE TABLE.) a co ca ca -d, --no-data No grava nenhuma informao de registros para a tabela. Isto muito util se a ca e voc desejar apenas um dump da estrutura da tabela! e --opt O mesmo que --quick --add-drop-table --add-locks --extended-insert --lock-tables. Fornece a descarga mais rpida para leitura em um servidor a MySQL.
364
-pyour_pass, --password[=sua_senha] A senha para usar quando conectando ao servidor. Se no for especicado a a parte =sua_senha, o mysqldump ir perguntar por uma senha. a -P port_num, --port=porta_num O nmero da porta TCP/IP usado para conectar a uma mquina. (Isto usado u a e para conexes a mquinas diferentes de localhost, na qual sockets Unix so o a a utilizados.) -q, --quick No utiliza buers para as consultas, descarrega diretamente para sa padro. a ida a Utilize mysql_use_result() para fazer isto. -Q, --quote-names Coloca os nomes de colunas e tabelas entre . -r, --result-file=... Direcione a sa para um determinado arquivo. Esta opo deve ser usada no ida ca MSDOS porque previne a converso de nova linha \n para \n\r (nova linha a + retorno de carro). --single-transaction Esta opo envia um comando SQL BEGIN antes de carregar os dados do servica dor. Ele mais util com tabelas InnoDB e n READ_COMMITTED de isolao da e ivel ca transao, j que neste modo ela far um dump do estado de consistncia do ca a a e banco de dados no momento que o BEGIN for enviado sem bloquear qualquer aplicao. ca Ao usar esta opo voc deve manter em mente que ser feito um dump no ca e a estado consistente apenas das tabelas transacionais, ex., qualquer tabela MyISAM ou HEAP na qual for feito um dump durante est p[o pode ainda mudar de a ca estado. A opo --single-transaction foi adicionada na verso 4.0.2. Esta opo ca a ca e mutualmente exclusiva com a opo --lock-tables j que LOCK TABLES j faz ca a a um commit da transao anterior internamente. ca -S /path/to/socket, --socket=/path/to/socket O arquivo socket que ser utilizado quando conectar ` localhost (que a a a e mquina padro). a a --tables Sobrepe a opo databases (-B). o ca
-T, --tab=path-to-some-directory Cria um arquivo nome_tabela.sql, que contm os comandos SQL CREATE e e um arquivo nome_tabela.txt, que contm os dados, para cada tabela dada. O e formato do arquivo .txt feito de acordo com as opes --fields-xxx e -e co lines--xxx. Nota: Esta opo s funciona se mysqldump est sendo executado ca o a na mesma mquina que o daemon mysqld. Voc deve usar uma conta MySQL a e que tem o privilgio FILE, e o login de usurio/grupo com o qual o mysqld e a est sendo executado (normalmente usurio mysql, grupo mysql) precisa ter a a permisso para criar/gravar um arquivo no local especicado. a
365
-u user_name, --user=user_name O nome do usurio do MySQL para usar ao conectar ao servidor. O valor a padro seu nome de usurio no Unix. a e a -O nome=valor, --set-variable=nome=valor Conrgura o valor de uma varivel. As variveis poss a a iveis so listadas abaixo. a Note que a sintaxe --set-variable=nome=valor e -O nome=valor est obsoa leto desde o MySQL 4.0. Use --nome=valor. -v, --verbose Modo verbose. Exibe mais informaes sobre o que o programa realiza. co -V, --version Exibe informaes de verso e sai. co a -w, --where=where-condition Faz um dump apenas dos registros selecionados. Note que as aspas so obria gatrias: o "--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 tambm exibe algum comando CHANGE MASTER TO e o qual, mais tarde, far o seu slave iniciar a partir da posio certa no log a ca binrio do master, se voc tiver congurado o seu slave usando este dump SQL a e do master. -O net_buffer_length=#, where # < 16M Quando estiver criando instrues de inseres em mltiplas linhas (com a opo co co u ca --extended-insert ou --opt), mysqldump ir criar linhas at o tamanho de a e net_buffer_length. Se voc aumentar esta varivel, voc tambm deve se e a e e assegurar que a varivel max_allowed_packet no servidor MySQL maior que a e a net_buffer_length. O uso mais comum do mysqldump provavelmente para fazer backups de bancos de dados e inteiros. Veja Seo 4.5.1 [Backup], Pgina 275. ca a mysqldump --opt banco_dados > arquivo-backup.sql Voc pode ler de volta no MySQL com: e mysql banco_dados < arquivo-backup.sql ou mysql -e "source /path-to-backup/backup-file.sql" database Entretanto, muito util tambm popular outro servidor MySQL com informaes de um e e co banco de dados: mysqldump --opt banco_dados | mysql ---host=mquina-remota -C banco_dados a poss descarregar vrios bancos de dados com um comando: E ivel a
366
mysqldump --databases banco_dados1 [banco_dados2 banco_dados3...] > meus_bancosdedad Se desejar descarregar todos os bancos de dados, pode-se utilizar: mysqldump --all-databases > todos_bancos_dados.sql
367
-n, --dryrun Relata aes sem realiz-las co a --regexp=# Copia todos bancos de dados com nomes que coincidem com a expresso regular a --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=# Diretrio Temporrio (em vez de /tmp). o a Voc pode utilizar perldoc mysqlhotcopy para obter uma documentao mais completa e ca de mysqlhotcopy. mysqlhotcopy l os grupos [client] e [mysqlhotcopy] dos arquivos de opes. e co Para poder executar mysqlhotcopy necessrio acesso de escrita ao diretrio de backup, e a o privilgio SELECT nas tabelas que desejar copiar e o privilgio Reload no MySQL (para e e poder executar FLUSH TABLES).
368
-d, --delete Esvazie a tabela antes de importar o arquivo texto. --fields-terminated-by=... --fields-enclosed-by=... --fields-optionally-enclosed-by=... --fields-escaped-by=... --lines-terminated-by=... Estas opes tem o mesmo signicado que as clusulas correspondentes para co a LOAD DATA INFILE. Veja Seo 6.4.8 [LOAD DATA], Pgina 588. ca a -f, --force Ignorar erros. Por exemplo, se uma tabela para um arquivo texto no existir, a continue processando quaisquer arquivos restantes. Sem --force, mysqlimport sai se uma tabela no existir. a --help Exibe uma mensagem de ajuda e sai. -h host_name, --host=host_name Importa dados para o servidor MySQL na mquina referida. A mquina padro a a a localhost. e -i, --ignore Veja a descrio para a opo --replace. ca ca --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 so sincronizadas no servidor. a -L, --local L arquivos de entrada do cliente. Por padro, assumido que os arquivos texto e a e esto no servidor se voc conectar ` localhost (mquina padro). a e a a a -pyour_pass, --password[=sua_senha] Senha para conectar ao servidor. Se voc no especicar a parte =sua_senha, e a o mysqlimport ir pedir por uma senha. a -P port_num, --port=port_num O nmero da porta TCP/IP para usar quando conectar a uma mquina. u a --protocol=(TCP | SOCKET | PIPE | MEMORY) Para especicar o protocolo de conexo. Novo no MySQL 4.1. a -r, --replace As opes --replace e --ignore controlam o tratamento de registros de enco trada que duplicam registros existentes em valores de chaves unicas. Se voc es e pecicar --replace, novos registros substituiro registros que tiverem o mesmo a valor na chave unica. Se voc especicar --ignore, registros de entrada que e duplicariam um registro existente em um valor de chave unica so saltados. Se a voc no especicar nenhuma das duas opes, um erro ocorrer quando um e a co a valor de chave duplicado for encontrado e o resto do arquivo texto ser ignorado. a
369
-s, --silent Modo silencioso. Gera sa somente quando ocorrer algum erro. ida -S /path/to/socket, --socket=/path/to/socket O arquivo socket para usar ao conectar ` localhost (mquina padro). a a a -u user_name, --user=user_name O nome de usurio MySQL para usar ao conectar ao servidor. O valor padro a a seu nome de usurio atual no Unix. e a -v, --verbose Modo verbose. Gera mais informaes na sa co ida. -V, --version Exibe informao sobre a verso e sai. ca a Abaixo um exemblo da utilizao de mysqlimport: ca $ 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
370
mysqlshow chamado assim: e shell> mysqlshow [OPC~ES] [banco_dados [tabela [coluna]]] O Se nenhum banco de dados fornecido, todos os bancos de dados encontrados so e a exibidos. Se nenhuma tabela fornecida, todas as tabelas encontradas no banco de dados so e a exibidas. Se nenhuma coluna for fornecida, todas colunas e tipos de colunas encontrados na tabela so exibidos. a Note que em verses mais novas do MySQL, voc s visualiza as tabelas/bancos de dao e o dos/colunas para quais voc tem algum privilgio. e e Se o ultimo argumento conter uma shell ou um meta-caracter do SQL, (*, ?, % ou _) somente o que coincidir com o meta-caracter exibido. Se um banco de dados conter e underscore (_), eles devem ser precedidos por uma barra invertida (algumas shells de Unix iro exigir duas), para se obter tabelas/colunas apropriadamente. * so convertidos em a a metacaracteres % do SQL e ? em metacaracteres do SQL. Isto pode causar alguma confuso quando algum tentar exibir as colunas para uma tabela com um _, neste caso o a e mysqlshow exibe somente os nomes de tabelas que casarem com o padro. Isto facilmente a e corrigido adicionando um % extra na linha de comando (como um argumento separador).
--include
371
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 pode us-lo para compilar o cliente MySQL como a seguir: e a CFG=/usr/local/mysql/bin/mysql_config sh -c "gcc -o progname $CFG --cflags progname.c $CFG --libs"
372
shell> mysql banco_dados < arquivo_texto Voc tambm pode iniciar seu arquivo texto com uma instruo USER nome_bd. Neste caso, e e ca no necessrio especicar o nome do banco de dados na linha de comando: a e a shell> mysql < arquivo_texto Se voc j est executando o mysql, voc pode executar um arquivo de script SQL usando e a a e o comando source: mysql> source filename; Para mais informaes sobre o modo batch, Seo 3.5 [Modo batch], Pgina 193. co ca a
Armazena todas as instrues que alteram qualquer coisa. Usada co tambm para replicao. e ca O log para consul- Armazena todas queries que levaram mais de long_query_time seguntas lentas dos para executar ou que no usaram a indices. Todos logs podem ser encontrados no diretrio de dados do mysqld. Voc pode forar o o e c mysqld a reabrir os arquivos de log (ou em alguns casos trocar para um novo log) executando FLUSH LOGS. Veja Seo 4.6.4 [FLUSH], Pgina 299. ca a
373
Em verses mais antigas do MySQL o tratamento do log de erro era feito pelo mysqld_safe o o qual redirecionava o arquivo de erro para maquina.err. Pode se alterar este nome de arquivo com a opo --err-log=nome_arq. ca Se voc no especicar --log-error ou se voc utilizar a opo --console, o erro ser e a e ca a escrito em stderr (o terminal). No Windows a sa sempre feita no arquivo .err se --console no for utilizado. ida e a
374
Se forem utilizadas as opes --log ou -l, o mysqld escreve um log geral com o nome de co arquivo nome_mquina.log, e o reinicio e a recarga no geram um novo arquivo de log a a (embora ele seja fechado e reaberto). Neste caso voc pode copi-lo (no Unix) usando: e a mv nome_mquina.log nome_mquina-antigo.log a a mysqladmin flush-logs cp nome_mquina-antigo.log para-diretrio-backup a o rm nome_mquina-antigo.log a O log de atualizao inteligente pois registra somente instrues que realmente alteram ca e co dados. Portanto, um UPDATE ou um DELETE com uma clusula WHERE que no encontre a a nenhum registro no escrito no log. Ele salta at instrues UPDATE que atribui a uma a e e co coluna o mesmo valor que ela possuia. O registro da atualizao feito imediatamente aps uma consulta estar completa mas antes ca e o que as bloqueios sejam liberados ou que algum commit seja feito. Isto garante que o log seja escrito na ordem de execuo. ca Se voc desejar atualizar um banco de dados a partir de arquivos de logs de atualizao, e ca voc pode fazer o seguinte (assumindo que seus logs de atualizao estejam nomeados na e ca forma nome_arquivo.###): shell> ls -1 -t -r nome_arquivo.[0-9]* | xargs cat | mysql ls utilizado para obter todos os arquivos de log na ordem correta. e Isto pode ser util se voc tiver que recorrer a arquivos de backup depois de uma falha e e desejar refazer as atualizaes que ocorreram entre a hora do backup e a falha. co
375
Se voc fornecer uma extenso ` --log-bin=nome_arquivo.extens~o, a extenso ser e a a a a a removida sem aviso. O mysqld ir acrescentar uma extenso ao nome de arquivo do log binrio que um nmero a a a e u que incrementado cada vez que mysqladmin refresh, mysqladmin flush-logs, a ine struo FLUSH LOGS forem executados ou o servidor for reiniciado. Um novo log binrio ca a tambm ser automaticamente criado quando o tamanho do log atual alcanar max_binlog_ e a c size. Nota se voc estiver usando transaes: uma transao escrita em um bloco no e co ca e arquivo de log binrio, j que ele nunca separado entre diversos logs binrios. Desta forma, a a e a se voc tiver grnades transaes, voc pode ter logs binrios maiores que max_binlog_size. e co e a Voc pode deletar todos os arquivos de log binrio com o comando RESET MASTER (veja e a Seo 4.6.5 [RESET], Pgina 301), ou apenas alguns deles com PURGE MASTER LOGS (veja ca a Seo 4.11.7 [Replicao SQL], Pgina 400). ca ca a Voc pode utilizar as seguintes opes ao mysqld para afetar o que documentado pelo log e co e binrio (tenha certeza de ler as notas que seguem esta tabela): a Opo ca binlog-do-db=nome_banco_ dados Descrio ca Diz ao master que ele deve registrar atualizaes no co log binrio se o banco de dado atual (ex.: aquele sea lecionado por USE) nome banco dados. Todos os e outros bancos de dados que no forem explicitamente a mencionados so ignorados. Note que se voc utia e liz-lo voc deve se assegurar que voc s faz atuala e e o izaes no banco de dados atual. (Exemplo: binlogco do-db=algum_bancodados) Exemplo do que no funciona como voc podea e ria esperar: se o servidor iniciado com binloge do-db=sales, e voc zer USE prices; UPDATE e sales.january SET amount=amount+1000;, esta consulta no ser gravada no log binrio. a a a Diz ao master que atualizaes onde o banco de co dados atual (ex.: aquele selecionado com USE) e nome banco dados no deve ser gravado no log a binrio. Note que se voc usar esta opo voc deve a e ca e ter certeza que voc s faz atualizaes no banco de e o co dados atual. (Exemplo: binlog-ignore-db=algum_ banco_dados) Exemplo do que no funciona como voc podea e ria esperar: se o servidor iniciado com binloge do-db=sales, e voc zer USE prices; UPDATE e sales.january SET amount=amount+1000;, esta consulta ser gravada no log binrio. a a
binlog-ignore-db=nome_banco_ dados
As regras esto avaliadas na seguinte ordem, para decidir se a consulta deve ser escrita no a log binrio ou no: a a 1. Existem as regras binlog-do-db ou binlog-ignore-db? No: grave a consulta no log binrio e saia. a a
376
Sim: V para o passo abaixo. a 2. Ento existe algumas regras (binlog-do-db ou binlog-ignore-db ou ambos). Existe a um banco de dados atual (algum banco de dados foi selecionado com USE?)? No: NAO grave a consulta e saia. a Sim: v para o passo abaixo. a 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. No: NAO grave a consulta e saia. a No: V para o passo abaixo. a a 4. Existem algumas regras binlog-ignore-db. O banco de dados atual se encaixa em qualquer uma das regras binlog-ignore-db? Sim: no grave a consulta e saia. a No: grave a consulta e saia. a Ento, por exemplo, um slave em execuo com apenas binlog-do-db=sales no gravar a ca a a no log binrio qualquer consulta em que o banco de dados atual diferente de sales (em a e outras palavras, binlog-do-db pode, signicar algumas vezes, ignore outros bancos de dados). Para saber quais arquivos binrios foram usados, o mysqld ir criar tambm um arquivo a a e de indice para o log binrio que contm o nome de todos os arquivos de log binrio usados. a e a Por padro este arquivo tem o mesmo nome que o arquivo de log binrio, com a extenso a a a .index. Voc pode alterar o nome do arquivo de e indice do log binrio com a opo --loga ca bin-index=[nome_arquivo]. Voc no deve eduitar este arquivo manualmente enquanto e a o mysqld estiver em execuo; fazer isto confundiria o mysqld. ca Se estiver sendo usado replicao, os arquivos de log binrio antigos no devem ser apagados ca a a at ter certeza que nenhum slave ir mais precisar deles. Uma forma de fazer isto o utilizar e a e mysqladmin flush-logs uma vez por dia e ento remover qualquer log com mais de 3 dias. a Voc pode remov-los manualmente, ou de preferncia usando PURGE MASTER LOGS (veja e e e Seo 4.11.7 [Replicao SQL], Pgina 400) o qual atualizar de forma segura o arquivo de ca ca a a indice do log binrio para voc (e que pode ter um argumento de data desde o MySQL 4.1) a e Uma conexo com o privilgio SUPER pode desabilitar o registro no log binrio de suas a e a consultas usando SET SQL_LOG_BIN=0. Veja Seo 4.11.7 [Replicao SQL], Pgina 400. ca ca a Voc pode examinar o arquivo de log binrio com o utilitrio mysqlbinlog. Por exemplo, e a a voc pode atualizar um servidor MySQL a partir de um log binrio como mostrado a seguir: e a mysqlbinlog arquivo-log | mysql -h nome_servidor Veja Seo 4.9.5 [mysqlbinlog], Pgina 358 para mais informaes sobre o utilitrio ca a co a mysqlbinlog e como utiliz-lo. a mysqlbinlog --help ir lhe fornecer mais informaes de como usar este programa! a co Se voc estiver utilizando BEGIN [WORK] ou SET AUTOCOMMIT=0, voc deve utilizar o log e e binrio do MySQL para backups no lugar do antigo log de atualizao. a ca
377
O Log binrio feito imedatamente depois que uma consulta terminar mas antes que os a e bloqueios sejam liberados ou algum commit seja feito. Isto garante que o log seja feito na ordem de execuo. ca Atualizaes em tabelas no transacionais so armazenadas o log binrio imediatamentco a a a edepois da execuo. Para tabelas tranascionais como BDB ou InnoDB, Todas atualizaes ca co (UPDATE, DELETE ou INSERT) que alteram uma tabela transacional so armazenadas no cache a at um COMMIT. Quaisquer atualizaes a uma tabela no transacional so armazenadas e co a a no log binrio de uma vez. Todas as threads iro, no inicio, alocar um buer de binlog_ a a cache_size para registrar consultas. Se uma conaulta maior que o registro, a thread ir e a criar um arquivo temporrio para lidar com a mesma. O arquivo temporrio ser apagado a a a quando a thread terminar. O max_binlog_cache_size (padro 4G) pode ser usado para restringir o tamanho total a usado para armazenar uma consulta multi-transacional. Se uma transao maior que isto ca e ela falhar e far um roll back. a a Se voc estiver utilizando o log de atualizao ou o binrio, inseres concorrentes no e ca a co a funcionaro juntas com CREATE ... INSERT e INSERT ... SELECT. Isto para garantir que a e voc possa recriar uma cpia exata de suas tabelas aplicando o log em um backup. e o
378
Ao utilizar o MySQL com arquivos log, voc necessitar de tempos em tempos remover e a antigos arquivos de log e dizer ao MySQL para logar com novos arquivos. Veja Seo 4.5.1 ca [Backup], Pgina 275. a Em uma instalao Linux RedHat), voc pode usar o script mysql-log-rotate para isto. ca e Se voc instalou o MySQL de uma distribuio RPM, o script deve ter sido instalado autoe ca maticamente. Perceba que voc deve ter cuidado com este script se voc estiver utilizando e e o log binrio para replicao! a ca Em outros sistemas voc deve instalar um pequeno script que ser executado pelo cron e a para lidar com os arquivos de log. Voc pode forar o MySQL a iniciar utilizando novos arquivos de log usando mysqladmin e c flush-logs ou utlizando o comando SQL FLUSH LOGS. Se voc usa o MySQL Verso 3.21 e a deve utilizar o comando mysqladmin refresh. O comando acima faz o seguinte: Se o log padro (--log) ou log de consultas lentas (--log-slow-queries) forem utia lizados, fecha e reabre o arquivo de log. (mysql.log e hostname-slow.log como padro). a Se o log de atualizao (--log-update) usado, fecha o log de atualizao e abre um ca e ca novo arquivo log com uma sequncia numrica mais alta. e e Se voc s estiver utilizando o log de atualizao, voc tem apenas que atualizar os logs e e o ca e ento mover os arquivos de log antigos para um backup. Se voc estiver utilizando o log a e normal, voc pode fazer algo assim: e shell> cd diretrio-dados-mysql o shell> mv mysql.log mysql.old shell> mysqladmin flush-logs e ento fazer um backup e remover o mysql.old. a
4.11.1 Introduo ca
A partir da verso 3.23.15, o MySQL suporta replicao de uma via internamente. Um a ca servidor atua como o master, enquando o outro atua como slave. O servidor master mantm e um log binrio de atualizaes (veja Seo 4.10.4 [Log binrio], Pgina 374). E mantido a co ca a a tambm um arquivo de e indices dos logs binrios para manter os registro da rotatividade a
379
dos logs. Cada slave, na conexo, informa ao master onde parou desde a ultima atualizao a ca propagada com sucesso, realiza a atualizao e ento para e espera o master informar sobre ca a novas atualizaes. co Um slave tambm pode ser um master se voc condigurar uma cadeia de servidores em e e replicao. ca Note que se voc estiver usando replicao, todas atualizaes nas tabelas replicadas devem e ca co ser realizadas no servidor master. Seno, voc sempre deve ter cuidados para evitar conitos a e entre as atualizaes que os usurios enviam ao master e aquelas que os usurios enviam ao co a a slave. Replicao de uma via trazem benef ca icios de robustez, velocidade e administrao do sistema: ca A robustez aumentada com uma conguraao master/slave. No evento de problemas e c com o master, voc pode trocar para o slave como um backup. e A velocidade extra alcanada dividindo a carga das consultas dos clientes em proe c cessamento 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 ser enviados para o master e slave para no carem fora de sincronia. Esta estratgia de a e balancemento de carga efetiva se consultas que no sejam de atualizao dominarem, e a ca mas este o caso normal. e Outro benef de utilizar replicao que pode-se obter backups intantneos do sisicio ca e a tema fazendo backups no slave em vez de faz-los no master. Veja Seo 4.5.1 [Backup], e ca Pgina 275. a
380
Como regra geral, sempre recomendado usar verses MySQL recentes, porque as capacie o dades de replicao esto sendo continuamente melhoradas. Com relao a verso 4.0, ca a ca a recomendamos usar a mesma verso para o master e o slave, com exceo de que o 4.0.2 a ca no recomandado para replicao. a e ca Note qye quando voc atualiza um mestre do MySQL 3.23 para o MySQL 4.0 (ou 4.1) e voc no deve reiniciar a replicao usando o log binrio antigo da verso 3.23, porque isto e a ca a a infelizmente deixa o slave 4.0 confuso. A atualizao pode seguramente feita deste modo, ca assumindo que voc tenha uma mestre 3.23 para atualizar e voc tenha slaves 4.0: e e 1. Bloqueie todas as atualizaes no mestre (FLUSH TABLES WITH READ LOCK). co 2. Espere at que todos os slaves tenham buscados todas as alteraes pelo master (use e co SHOW MASTER STATUS no master, e SELECT MASTER_POS_WAIT() nos slaves). Ento exa ecute STOP SLAVE nos slaves. 3. Finalize o MySQL no master e atualize o master para o MySQL 4.0. 4. Reinicie o MySQL no master. Grave o nome <name> do log binrio mais recentemente a criado do master. Voc pode obter o nome dos arquivos executando SHOW MASTER e STATUS no master. Ento envie estes comando em cada slave: a mysql> CHANGE MASTER TO MASTER_LOG_FILE=<name>, MASTER_LOG_POS=4; mysql> START SLAVE; Se voc tambm deve atualizar seus slaves da verso 3.23 para 4.0, voc deve primeiro e e a e atualizar seus slaves: Desligue cada um, atualize-os e os reinicie. Ento atualize o master a como descrito. A partir da verso 4.0.0, pode se usar LOAD DATA FROM MASTER para congurar um escrao. a Esteja certo que LOAD DATA FROM MASTER funciona atualmente apenas se todas as tabelas no master so do tipo MyISAM. Alm disso, estas instruo iro adquirir lock global de leitura, a e ca a assim nenhuma escrita ser poss enquanto as tabelas esto sendo transferidas do master. a ivel a Quando implementarmos hot backup de tabelas sem lock (no MySQL 5.0), este lock global de leitura no ser mais necessrio. a a a Devido a estas limitaes, recomendamos que voc s use LOAD DATA FROM MASTER se o conco e o junto de dados de master for relativamente pequeno, ou se um lock de leitura prolongado no master aceitvel. Enquanto a velocidade atual do LOAD DATA FROM MASTER pode variar de e a sistema para sistema, uma boa regra do dedo de quanto tempo ser necessrio considerar a a a e 1 segundo por 1 MB do arquivo de dados. Voc car prximo da estimativa se tanto o e a o master quanto o slave forem equivalentes a um Pentium 700 Mhz e estiverem conectado a uma rede de 100 MBits/s. E claro, esta apenas uma estimativa grosseira da ordem de e magnitude. Uma vez que o slave foi congurado corretamente e est em execuo, ele simplesmente a ca conectar ao master e esperar por atualizaes nos processos. Se o master for desligado a a co ou o slave perder conectividade com seu master, ele tentar conectar periodicamente at a e conseguir reconectar e constinuar as atualizaes. O intervalo de tentativa controlado pela co e opo --master-connect-retry. O padro 60 segundos. ca a e Cada slave mantm registro de onde parou. O servidor master no tem conhecimento de e a quandos slaves existem ou quais esto atualizados em um determinado momento. a
381
382
State: Has read all relay log; waiting for the slave I/O thread to update it Info: NULL Aqui a thread 2 est no master. A thread 10 a thread de E/S no slave. A thread 11 a e 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 Seo 4.11.9 [FAQ da Replicao], Pgina 410). ca ca a A lista a seguir mostra os estados mais comuns que voc ver na coluna State para a thread e a Binlog Dump do master. Se voc no ver estas threads em um servidor master, a replicao e a ca no est sendo executada. a a Sending binlog event to slave Logs binrios consistem de eventos, onde um evento normamente uma consulta a e mais alguma informao. A thread l um evento do log binrio e ele enviado ca e a e para o slave. Finished reading one binlog; switching to next binlog A thread nalizou a leitura de um log binrio e est abrindo o seguinte a ser a a enviado para o slave. Has sent all binlog to slave; waiting for binlog to be updated A thread leu todos os log binrios e est inativa. Ela est esperando por a a a conexes no master para gravar mais dados no log binrio, se ele quiser. o a Waiting to finalize termination Estado muito breve que ocorre quando a thread para. Aqui esto os estados mais comuns que voc ver na coluna State para a thread de E/S a e a de um servidor slave. A partir do MySQL 4.1.1, este estado tambm aparece na coluna e de SHOW SLAVE STATUS. Isso signica que voc pode ter uma boa Slave_IO_State da saida e viso do que est acontecendo apenas com SHOW STATUS SLAVE. a a Connecting to master. Conectando ao master. Checking master version. Estado muito breve que ocorre um pouco depois da conexo ser estabelecida. a Registering slave on master. Estado muito breve que ocorre um pouco depois da conexo ser estabelecida. a Requesting binlog dump. Estado muito breve que ocorre um pouco depois da conexo com o master ser a estabelecida. A thread envia ao master um pedido para envio do contedo de u seu log binrio, iniciando a partir do log binrio requisitado e sua posio. a a ca Waiting to reconnect after a failed binlog dump request. Se o pedido de dump do log binrio falhar (devido a desconexo), a thread ca a a neste estado enquanto est inativa. A thread ca inativa por master-connecta retry segundos antes de uma nova tentativa. Reconnecting after a failed binlog dump request. Ento a thread tenta se conectar com o master. a
383
Waiting for master to send event. A thread conectou e est esperando que os eventos do log binrio cheguem. a a Isto pode demorar se o master estiver inativo. Se a espera for maior que slave_read_timeout segundos, o tempo se esgotar. Neste ponto, a thread a ir considerar a conexo quebrada e far uma nova tentativa de conexo. a a a a Queueing master event to the relay log. A thread leu o evento e o est copiando para o ser relay log para que a thread a SQL possa process-lo a Waiting to reconnect after a failed master event read. Um erro ocorreu durante a leitura (devido a desconexo); inativo por mastera connect-retry segundos antes de tentar se reconectar. Reconnecting after a failed master event read. Ento a thread tenta se reconectar. Quando a conexo estabelecida novaa a e mente, o estado se tornar Waiting for master to send event. a Waiting for the slave SQL thread to free enough relay log space Voc est usando um valor relay_log_space_limit diferente de zero e os relay e a logs tem crescido tanto que o seu tamanho combinado excedem este valor. A thread E/S ento espera at que a thread SQL libere espao suciente deletando a e c o contedo dos relay logs e assim poder deletar alguns arquivos de relay logs. u Waiting for slave mutex on exit. Estado muito breve que ocorre quando a thread esta parando. Aqui esto os estado mais comuns que voc ver na coluna State para a thread de SQL de a e a um servidor slave: Reading event from the relay log A thread leu um evento do relay log para poder process-lo. a 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 esperando a 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 parada. e A coluna State para a thread de E/S tambm podem mostrar um string de consulta. e Isto indica que a thread leu um evento do relay log, extraiu a conulta dele e est a est a a executando. Antes do MySQL 4.0.2, as threads de E/S e SQL eram combinadas em uma s e nenhum o relay log era usado. A vantagem do uso de duas threads que elas separam a leitura e e a execuo da consulta em duas tarefas independentes, e assim o trabalho de leitura da ca consulta no se torna lento se a execuo da consulta for lento. Por exemplo, se o servidor a ca slave no estiver em execuo por um instante, a sua thread de E/S pode rapidamente buscar a ca todos o contedo dos logs binrios do master quando o slave iniciar, mesmo se a thread u a 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 nalmente buscado tudo e assim a um cpia segura das consultas estar armazenada localmente nos relay logs do slave para o a
384
execuo na prxima execuo do slave. Isto permite que os log binrios sejam apagados ca o ca a no master, j que no h mais necessidade de esperar que o slave busque o contedo deles. a a a u Por padro, relay logs so nomeados usando nome de arquivos da forma a a host_name-relay-bin.nnn, onde host_name o nome da mquina servidora e a slave e nnn uma sequncia numrica. Arquivos de relay logs sucvessivos so criados e e e a usando uma sequncia de nmeros sucessiva, comeando com 001. O slave mantm e u c e registro dos relay logs em uso atualmente em um arquivo de indice. O nome de arquivo padro dos relay logs host_name-relay-bin.index. Por padro estes arquivos so a e a a criados no diretrio de dados do slave. O nome de arquivo padro pode ser sobrescrito o a com as opes --relay-log e --relay-log-index do servidor. co Relay logs tm o mesmo formato dos logs binrios, assim ele podem ser lidos com e a mysqlbinlog. Um relay log automaticamente deletado pela thread de SQL to logo e a no seja mais necessria (ex.: assim que tiver sido executado todos os seus eventos). a a No existem comandos para deletar relay logs j que a thread SQL cuida de faz-lo. a a e 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-los. a Um novo relay log criado sob as seguintes condies: e co 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 criado a cada vez que a thread de E/S inicia, no apenas a a pela primeira vez.) Uma instruo FLUSH LOGS executada (a partir da verso 4.0.14). ca e a O tamanho do relay log atual se torna muito grande. O signicado de muito grande determinado da seguinte forma: e max_relay_log_size, se max_relay_log_size > 0 max_binlog_size, se max_relay_log_size = 0 ou o MySQL mais velho que e 4.0.14 Um servidor de replicao slave cria dois arquivos pequenos no diretrio de dados. Estes ca o arquivos so chamados master.info e relay-log.info por padro. Eles possuem ina a formao como aquela mostrada na sa da instruo SHOW SLAVE STATUS (veja Seo 4.11.8 ca ida ca ca [Replicao], Pgina 402 para uma descrio deste comando). Como imagem de discos, eles ca a ca sobrevivem ao desligamento do slave. A prxima vez que o slave reiniciado, ele pode ler o e estes arquivos para saber o quanto ele processou do log binrio do master e do seus prprios a o relay logs. O arquivo master.info atualizado pela thread de E/S. e A correspondncia entre as linhas do arquivo e as colunas mostradas por SHOW SLAVE STATUS e aparece a seguir: Linha Descrio ca 1 Master_Log_File 2 Read_Master_Log_Pos 3 Master_Host 4 Master_User 5 Senha (no mostrado por SHOW SLAVE STATUS) a 6 Master_Port 7 Connect_Retry
385
O arquivo relay-log.info atualizada pela thread de SQL. A correspondncia entre as e e linhas do arquivo e as colunas mostradas por SHOW SLAVE STATUS apaerece a seguir: Linha Descrio ca 1 Relay_Log_File 2 Relay_Log_Pos 3 Relay_Master_Log_File 4 Exec_Master_Log_Pos Quando voc faz backup dos dados de seu slave, voc deve fazer backup destes 2 pequenos e e arquivos, junto com seus relay logs pois eles so necessrios para continuar a replicao a a ca depois que voc restaurar os dados do slave. Se voc perder os seus relay logs mas ainda e e tiver o arquivo relay-log.info, voc pode verifclos para determinar por quanto tempo e a thread de SQL executou no log binrio do master. Ento voc pode usar CHANGE MASTER a a e TO com as opes MASTER_RELAY_LOG e MASTER_RELAY_POS para dizer ao slave para reler co os log binrios a partir deste ponto. Isto exige que o log binrio ainda exista no servidor a a master. claro. e Se seu slave est sujeito a replicao de instrues LOAD DATA INFILE, voc tambm deve a ca co e e fazer backup dos arquivos SQL_L0AD-* que podem existir no diretrio que o slave utio liza para este propsito. O slave precisar destes arquivos para continuar a replicao de o a ca qualquer instruo LOAD DATA INFILE interrompido. ca A localizao do diretrio especicada usando a opo --slave-load-tmpdir. Seu valor ca o e ca padro, se no especicado, o valor da varivel tmpdir. a a e a
386
Por favor no relate os erros at que voc tenha vericado que o problema est presente a e e a na ultima distribuio. ca 2. Congure uma conta no servidor master com o com a qual o slave possa se conectar. Deve ser dada a esta conta o privilgio REPLICATION SLAVE. (Se a verso do MySQL for e a anterior a 4.0.2, de ` conta o privilgio FILE.) Se a conta somente para a replicao a e e ca (o que recomendvel), ento voc no precisar fornecer nenhum privilgio adicional e a a e a a e para ele. O nome de mquina no nome da conta deve ser aquele usado por cada um dos servidores a slaves para conectar ao master. Por exemplo, para criar um usurio chamado repl que a pode acessar seu master de qualquer mquina, voc deve utilizar este comando: a e mysql> GRANT REPLICATION SLAVE ON *.* TO repl@% IDENTIFIED BY <password>; Para verses do MySQL anteriores a 4.0.2, use este comando: o mysql> GRANT FILE ON *.* TO repl@% IDENTIFIED BY <password>; Se voc planeja usar as instrues LOAD TABLE FROM MASTER ou LOAD DATA FROM MASTER e co a partir da mquina slave, voc precisar de permisso para esta conta adicional. a e a a Conceda a conta os privilgios globais SUPER e RELOAD. e Conceda o privilgio SELECT em todas as tabelas que voc deseja carregar. Quale e quer das tabelas master nas quais a conta no possa fazer um SELECT sero ignoa a radas por LOAD DATA FROM MASTER. 3. Se voc estiver usando tabelas MyISAM, descarregue todas as tabelas e bloqueie as e consultas de escrita executando o comando FLUSH TABLES WITH READ LOCK mysql> FLUSH TABLES WITH READ LOCK; e faa uma cpia de todos os dados existentes em seu servidor master. c o A maneira mais fcil de fazer isto simplesmente usar um programa (tar no Unix, a e PowerArchiver, WinRAR, WinZip ou qualquer outro software similar no Windows) para produzir um arquivo de banco de dados no diretrio de dados do seu master. Por o exemplo, para usar tar que cria um arquivo que inclui todos os bancos de dados, altere a localizao no diretrio de dados do servidor master, e ento execute este comando: ca o a shell> tar -cvf /tmp/mysql-snapshot.tar . Se voc quiser que o arquivo inclua apenas um banco de dados chamado estebd, utilize e este comando: shell> tar -cvf /tmp/mysql-snapshot.tar ./this_db Ento copie o arquivo para o diretrio /tmp na mquina servidora slave. Naquela a o a mquina, altere a localizao em um diretrio de dados do slave e desempacote o a ca o arquivo usando este comando: shell> tar -xvf /tmp/mysql-snapshot.tar Voc pode no desejar replicar o banco de dados mysql. Se no, voc pode exclu e a a e ilo do arquivo. Voc tambm no precisa incluir qualqer arquivo de log nos arquivos e e a 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 binrio e oset no master: a mysql > SHOW MASTER STATUS;
387
+---------------+----------+--------------+------------------+ | 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 binrio mysql-bin.003 e o oset 73. Grave os valores. Voc a e e e precisar us-los mais tarde quando estiver congurando o slave. a a Uma vez realizada a cpia e gravado o nome do log e oset, voc pode reabilitar a o e atividade de escrita no master: mysql> UNLOCK TABLES; Se voc estiver usando tabelas InnoDB, voc deve usar a ferramente InnoDB Hot e e Backup que est dispon a ivel para aqueles que compraram as licenas comerciais do c MySQL, suporte ou a prpria ferramenta de backup. Ele faz uma cpia consistente o o 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 informaes sobre co esta ferramenta esta dispon em http://www.innodb.com/order.php. ivel Sem a ferramenta Hot Backup, o modo mais rpido para tirar uma cpia das tabelas a o InnoDB desligar o servidor master e copiar os arquivos e logs de dados do InnoDB e e os arquivos de denio de tabela (.frm). Para gravar o nome e oset do arquivo de ca log atual voc deve fazer o seguinte antes de desligar o servidor: e mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS; E ento grave o nome e oset do log da sa de SHOW MASTER STATUS como mostrado a ida anteriormente. Uma vez gravado o nome e o oset do log, desligue o servidor sem destravar as tabelas para se certicar que ele nalizar com a cpia correspondente ao a o arquivo de log e oset: shell> mysqladmin -uroot shutdown Uma alternativa para tabelas MyISAM e InnoDB fazer um dump SQL do master em e vez de uma cpia binria como acima; para isso voc pode usar mysqldump --mastero a e data em seu master e mais tarde executar o dump SQL em seu slave. No entanto, isto mais lento que fazer a cpia binria. e o a Se o master foi executado anteriormente sem o --log-bin habilitado, os valores do nome do log e da posio mostrados por SHOW MASTER STATUS ou mysqldump estaro ca a vazios. Neste caso, grave a string vazia () para o nome do log e 4 para o oset. 4. Assegure-se que a seo [mysqld] do arquivo my.cnf no master inclui a opo logca ca bin. Esta seo tambm deve conter a opo server-id=unique number, onde master_ ca e ca id deve ser um valor inteiro entre 1 e 2^32 - 1. Por exemplo: [mysqld] log-bin server-id=1 Se estas opes no esto presentes, adicione-as e reinicie o servidor. co a a 5. Pare o servidor que ser usado como slave e adicione o seguinte ao arquivo my.cnf: a
388
6.
7.
8.
9.
10.
[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, muito importante que o ID do slave seja diferente do ID do master. e Por exemplo: [mysqld] server-id=2 Se voc estiver usando vrios servidores, cada um deve ter um valor server-id que seja e a diferente daquele do master e de cada um dos slaves. Pense nos valores de server-id como algo similar ao endereo IP: Estes IDs identicam de forma unica cada instncia c a de servidor na comunidade dos parceiros de replicao. ca Se voc no quiser especicar um server-id, ele ser congurado com 1 se voc no e a a e a tiver denido master-host, seno ele ser denido com 2. Note que no caso de omisso a a a do server-id, um master ir recusar conexes de todos os slaves e um slave ir recusar a o a se conectar a um master. Assim, omitir server-id s bom para backups com um log oe binrio. a Se voc zer um backup birio dos dados do servidor master, copie-o para o diretrio de e a o dados do servidor slave antes de inici-lo. Certique-se que os privilgios nos arquivos a e e diretrios esto corretos. O usurio com o qual o MySQL executa precisa estar apto o a a a l-los e alter-los, assim como no master. e a Se voc zer um backup usando mysqldump, inicie o slave primeiro (veja o prximo e o passo). Inicie o servidor slave. Se ele tiver sido replicado previamente, inicie o servidor slave com a opo --skip-slave-start. Voc tambm pode querer iniciar o servidor slave com ca e e a opo --log-warnings. Deste modo voc ir obter mais mensagens sobre problemas ca e a (por exemplo, problemas de rede, ou conexo). a Se voc fez um backup dos dados do servidor master usando mysqldump, carregue o e 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 mximo da string para as variveis: a a MASTER_HOST 60 MASTER_USER 16 MASTER_PASSWORD 32 MASTER_LOG_FILE 255 Inicie a thread slave: mysql> START SLAVE;
389
Depois de realizado este procedimento, o slave deve se conectar ao master e pegar todas as atualizaes que ocorreram desde que o backup foi restaurado. co Se voc esqueceu de congurar o server-id no master, os slaves no podero se conectar e a a a eles: Se voc esqueceu de congurar o server-id no slave, voc ir obter o seguinte erro no e e a 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 tambm encontrar mensagens de erro no log de erro do slave se ele no puder replicar e e a a por qualquer motivo. Uma vez que um slave est replicando, voc encontrar um arquivo chamado master.info a e a e um chamado relay-log.info no diretrio de dados. Estes dois arquivos so usados pelo o a slave para manter o registro de quanto foi processado do log binrio do master. No remova a a ou edite o arquivo, a menos que voc realmente saiba o que est fazendo e entenda as e a implicaes. Mesmo neste caso, mais aconselhvel usar o comando CHANGE MASTER TO. co e a NOTA: o contedo de master.info sobrepe algumas opes especicadas na lina de u o co comando ou no my.cnf veja Seo 4.11.6 [Opes de Replicao], Pgina 392 para mais ca co ca a detalhes. Agora que voc tem uma cpia instantnea, voc pode us-la para congurar outros slaves. e o a e a Para isso siga a poro referente ao slave descrita acima. Voc no precisa ter outra cpia ca e a o do master.
390
Consultas de atualizao que usam variveis de usurios so mal replicadas nas verses ca a a a o 3.23 e 4.0. Isto corrigido no MySQL 4.1. Note que nomes de variveis de usurios e a a so caso insensitivo a partir da verso 5.0, assim voc deve levar isto em conta quando a a e congurar uma replicao entre um servidor com verso 5.0 e outro com uma verso ca a a anterior. O slave pode se conectar ao master usando SSL, se o master e o slave forem ambos 4.1.1 ou mais novos. Embora nunca tenhamos tido casos de ocorrnciar reais, teoricamente poss e e ivel de que o dado no master e no slave podem estar diferentes se uma consulta projetada e de modo que a modicao do dado seja no determin ca a istica, p.ex. deixar a vontade do otimizados de consultas (o que geralmente no uma boa prtica, mesmo fora da a e a replicao!). Para uma explicao detalhada Seo 1.8.6.2 [Open bugs], Pgina 54. ca ca ca a Antes do MySQL 4.1.1, os comandos FLUSH, ANALYZE, OPTIMIZE e REPAIR no so a a armazenados no log binrio e por isto no so replicados para o slave. Isto normala a a mente no um problema j que estes comandos no alteram nada. Isto signica, a e a a no entanto, que se voc atualizar a tabela de privilgio do MySQL diretamente sem e e usar a instruo GRANT e replicar o banco de dados de privilgios mysql, voc deve ca e e fazer um FLUSH PRIVILEGES em seu slave para que os novos privilgios tenham efeito. e Tambm, se voc utilizar FLUSH TABLES ao renomear uma tabela MyISAM envolvida e e em uma tabela MERGE, voc ter uqe executar FLUSH TABLES manualmente no servie a dor. Desde o MySQL 4.1.1, estes comandos so escritos no log binrio (exceto FLUSH a a 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 Seo 4.6.4 [FLUSH], Pgina 299. ca a O MySQL suporta somente um master e vrios slaves. Posteriormente adicionaremos a um algoritimo de votao para trocar automaticamente o master se alguma coisa estiver ca errada com o master atual. Iremos tambm introduzir processos agentes para ajudar e a fazer o balanceamento de carga enviando consultas SELECT para diferentes slaves. Tabelas temporrias so replicadas, exceto no caso em que voc desliga o servidor slave a a e (e no apenas a thread slave), e voc tem alguns tabelas temporrias replicadas e so a e a a usadas em instrues UPDATES que ainda no foram executadas no slave. (Se voc co a e desligar o slave, as tabelas temporrias necessrias por estas atualizaes no estaro a a co a a mais dispon iveis quando o slave iniciar novamente.) Para evitar este problema, no a desligue o servidor enquanto ele tiver tabelas temporrias abertas. Em vez disto, use a este procedimento: 1. Envie uma instruo STOP SLAVE. ca 2. Use SHOW STATUS para vericar o valor da varivel Slave_open_temp_tables. a 3. Se o valor 0, envie um comando mysqladmin shutdown para desligar o slave. e 4. Se o valor diferente de 0, reinicie as threads slaves com START SLAVE. e 5. Repita o procedimento anterior para ver se voc ter melhor sorte na prxima vez. e a o Planejamoc corrigir este problema em um futuro prximo. o seguro conectar servidores em um relacionamento master/slave circular com log E slave-updates habilitado. Note, entretanto, que vrias consultas no iro funcionar a a a corretamente neste tipo de congurao a menos que o cdigo do cliente seja escrito para ca o
391
tomar cuidado dos potenciais problemas que podem ocorrer em diferentes sequncias e em servidores diferentes. Isto signica que voc pode fazer uma congurao parecida com o seguinte: e ca A -> B -> C -> A As IDs do servidor so codicadas nos eventos do log binrio. A saber quando o a a a evento que ele l foi originalmente criado por A, assim A no o executar no haver ee a a a a loop innito. Mas esta congurao circular s funcionar se voc realizar atualizaes ca o a e co no conitantes entre as tabelas. Em outras palavras, se voc insere dados em A e C, a e voc nunca deve inserir um registro em A que pode ter uma chave conltante com um e registro em C. Voc tambm no deve atualizar os mesmos registros em dois servidores e e a se a ordem que a atualizao aplicada importa. ca e Se houver um erro em uma consulta no slave, a thread slave ir terminar e uma mena sagem ir aparecer no log de erro do slave. Voc deve ento conectar a um slave a e a manualmente, corrigir a causa do erro (por exemplo, tabela no existente), e ento a a executar o comando sql SLAVE START. Se a conexo para o master for perdida, o slave ir tentar se reconectar imediatamente. a a Se ele falhar, o slave ir tenatr a cada master-connect-retry segundos (padro 60). a a Por causa disto, seguro desligar o master, e ento reinici-lo depois de um tempo. e a a O slave tambm est apto para lidar com interrupes de rede. No entanto o slave e a co noticar a a perda da rede apenas aps no ter recebido dados do master por slave_ a o a net_timeout segundos. Assim se sua perda for pequena, voc pode querer diminuir e slave_net_timeout. Veja Seo 4.6.8.4 [SHOW VARIABLES], Pgina 309. ca a Desligar o slave (corretamente) tambm seguro, pois mantm sinais de onde parou. e e e Desligamentos incorretos podem produzir problemas, especialmente se o cache de disco no foi sincronizado antes do sistema morrer. Seu sistema de tolerncia a falhas ser a a a melhorado se voc possuir um bom No-Break ou UPS. e Devido a natureza no trabnsacional das tabelas MyISAM, poss ter uma consulta a e ivel que atulizar apenas parcialmente uma taela e retornar um cdigo de erro. Isto a a o pode acontecer, por exemplo, em uma insero multi-registro que tem uma violao da ca ca restrio da chave o use uma consulta de atualizao nalizada aps atualizar alguns ca ca e o dos registros. Se isto acontecer no master, a thread slave sair e ir esperar o DBA a a decidir o que fazer com isto a menos que seja autenticado e a execuo da consulta ca resulte no mesmo cdigo de erro. Se este comportamento da validao do cdigo de o ca o erro no for desejvel, algum (ou todos) os erros podem ser ignorados com a opo a a ca --slave-skip-errors. Ela est dispon a partir da verso 3.23.47. a ivel a Se voc atualiza tabelas transacionais a partir de tabelas no-transacioanis dentro de e a um segmento BEGIN/COMMIT, a atualizao no log binrio pode estar fora de sincronia ca a se algumas threads alterarem a tabela no transacional antes do commit da transao. a ca Isto porque a transao escrita no log binrio apenas quando feito o commit. e ca e a e Antes da verso 4.0.15, qualquer atualizao de uma tabela no transacional gravada a ca a e no log binrio imeditamente quando a atualizao feita enquanto atualizaes transaa ca e co cionais so gravadas no COMMIT ou no gravadas se voc utilizar um ROLLBACK. Voc a a e e deve levar isto em conta quando atualizar tabelas transacionais e no transacionais na a mesma transao e voc estiver usando o log binrio para backup ou replicao. Na ca e a ca verso 4.0.15 ns alteramos o comportamento do registro de transaes que misturam a o co
392
atualizaes de tabelas transacionais e no transacionais, que soluciona o problema (orco a dem das consultas boas no log binrio, e todas as consultas necessrias so gravadas no a a a log binrio mesmo no caso de um ROLLBACK). O problema que permanece quando uma a e segunda conexo atualiza uma tabela no transacional enquanto a primeira transao a a ca da conexo ainda no est nalizada (ordenao errada ainda pode ocorrer, porque a a a ca a atualizao da segunda conexo ser gravada imediatamente depois de ela ter sido ca a a feita). A seguinte tabela lista problemas na verso 3.23 que esto corrigidas na verso 4.0: a a a LOAD DATA INFILE tratado apropriadamente desde que o arquivo ainda esteja no e servidor master no momento da propagao da atualizao. ca ca LOAD LOCAL DATA INFILE ser ignorado. a Na verso 3.23 RAND() em atualizaes no replicado apropriadamente. Use a co a e RAND(alguma_expr_nao_rand) se voc estiver replicando atualizes com RAND(). e co Voc pode, por exemplo, utilizar UNIX_TIMESTAMP() para o argumento de RAND(). e Isto corrigido na verso 4.0. e a
393
A prxima vez que voc iniciar o servidor, ele ir ler o valor da mquina master a partir do o e a a arquivo master.info. Se voc modicar o arquivo my.cnf para especicar uma mquina e a master diferente, ele no ter efeito. Voc deve usar CHANGE MASTER TO. a a e A partir do MySQL 4.1.1, as seguintes opes tambm tratada de forma especial: co e e --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 opes. Adicionalmente, co o formato do arquivo na verso 4.1.1 inclui na sua primeira linha o nmero de linhas no a u arquivo. Se voc atualizar um servidor mais antigo para a verso 4.1.1, o master.info e a ser atualizado para o novo formato automaticamente quando o novo servidor iniciar. (Se a voc substituir um MySQL 4.1.1 ou mais novo por uma verso mais antiga que a 4.1.1, voc e a e deve remover a primeira linha manualmente antes de iniciar o servidor mais antigo pela primeira vez.) Como o servidor da precedncia a uma arquivo master.info existente sobre as opes de e co inicializao acima descrito, voc pode preferir usar as opes de inicializao para estes ca e co ca valores, e especique-os usando a instruo CHANGE MASTER TO. See Seo 4.11.8.1 [CHANGE ca ca MASTER TO], Pgina 402. a Este exemplo mostra um uso mais extensivo das opes de inicializao para congurar um co ca 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 atualizaes feitas pela thread da SQL do slave co no log binrio do slave. E desligado por padro. E claro que ele exige que ele a a exige que o slave seja iniciado com o log binrio habilitado (opo --log-bin). a ca --log-slave-updates usado quando voc deseja colocar diversos servidores e e em cadeia. Por exemplo, voc pode querer uma congurao como esta: e ca A -> B -> C Isto , A o servidor master do slave B, e B o servidor master do slave C. e e e Para isto funcionar, onde B tanto uma master quanto um slave, voc deve e e iniciar B com a opo --log-slave-updates. A e B devem ser iniciados com ca o log binrio habilitado. a
394
--log-warnings Fazer slave exibir mais mensagens sobre o que est sendo feito. Por exema plo, ele avisar que ele obteve sucesso em reconectar depois de uma falha de a conexo/rede, o avisr sobre cada thread slave iniciada. a a Esta opo no est limitada apenas ao uso da replicao. Ela produz avisos ca a a ca atravs de um espectro de servidores ativos. e --master-host=host Especica o nome de mquina ou endereo de IP do master para replicao. a c ca Se esta opo no for dada, a thread slave no ser iniciada. O valor em ca a a a master.info tem precedncia se ele puder ser lido. Provavelmemte um nome e nelhor para est opo seria algo do tipo --bootstrap-master-host, mas a ca e muito tarde para alter-la agora. a --master-user=nome_usurio a O usurio da conta que a thread slave usar para autenticar ao conectar ao a a master. A conrta deve ter o privilgio REPLICATION SLAVE (Em verses ane o teriores a 4.0.2 ele devia ter o privilgio FILE). Se o usurio do master no e a a for congurado, assume-se o usurio teste. O valor em master.info toma a precedncia se puder ser lida. e --master-password=password A senha da conta com a qual a thread slave autenticar quando conectar ao masa ter. Se no denida, um senha vazia considerada. O valor em master.info a e toma precedncia se puder ser lido. e --master-port=portnumber A porta que o master est escutando. Se no denifa, a congurao de a a ca compilao do MYSQL_PORT consierada. Se voc no alterou as opes do ca e e a co configure , ela deve ser 3306. O valor em master.info toma precedncia se e ele puder ser lido. --master-connect-retry=seconds O nmero de segundos que a thread slave espera antes de tentar se conectar ao u master no caso do master ter ca ou a conexo for perdida. O padro 60. ido a a e O valor em master.info toma precedncia se puder ser lido. e --master-info-file=filename Especica o nome a ser usado no arquivo que o slave grava a informao sobre ca o master. O nome padro master.info no diretrio de dados. a e o --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 opes so usadas para congurar um conexo de replicao segura para co a a ca o servidor master usando SSL. Os seus signicados so os mesmos das opes a co correspondentes --ssl, --ssl-ca, --ssl-capath, --ssl-cert, --ssl-cipher, --ssl-key descritas em Seo 4.4.10.5 [SSL options], Pgina 274. ca a
395
Estas opes esto operacionais a partir do MySQL 4.1.1. co a --max-relay-log-size=# Para rotacionar o relay log automaticamente. VARIABLES], Pgina 309. a Veja Seo 4.6.8.4 [SHOW ca
--relay-log=filename Para especicar a localizao e nome que deve ser usado os relay logs. Voc ca e pode us-lo para ter nomes de relay logs independentes do nome de mquina, a a ou se o seu relay log tend a ser grande (e voc no que diminuir max_relay_ e a log_size) e voc precisa coloc-los em alguma rea diferente do diretrio de e a a o dados, ou se voc quiser aumentar a velocidade balanceando as cargas entre os e discos. --relay-log-index=filename Para especicar a localizao e nome que deve ser usado para arquivo de ca indice dos relay logs. --relay-log-info-file=filename Para dar outro nome a relay-log.info e/ou coloc-lo em outro diretrio, a o diferente do diretrio de dados. o --relay-log-purge=0|1 Disabilita/habilita a remoo automtica dos relay logs assim que ele no ca a a so mais necessrios. Esta uma varivel global que ode ser alterada a a e a dinmicamente com SET GLOBAL RELAY_LOG_PURGE=0|1. o valor padro 1. a a e Esta opo est dispon a partir do MySQL 4.1.1. ca a ivel --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 util se voc tiver um disco r e e igido pequeno em. sua mquina slave. Quando o limite alcanado, a thread de E/S a e c ca em pausa (no l o log binrio do master) at que a thread de SQL tenha a e a e buscado e deletado alguns dos relay logs no utilizados. Note que este limite no a a absoluto: existem casos onde a thread SQL precisa de mais eventos para poder e deletar, neste caso a thread de E/S ir superar o limite at que a deleo seja a e ca possivel. Se isto no for feito ela entra em deadlock (o que acontecia antes do a MySQL 4.0.13). Os usurios no devem congurar --relay-log-space-limit a a 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 chance de que a quando a thread de E/S espera por espao livre porque --relay-log-spacec limit excedido, a thread de SQL no tem relay log para apagar e assim e a no pode satisfazer a thread de E/S, forando-a a ignorar temporariamente a c --relay-log-space-limit. --replicate-do-table=db_name.nome_tabela Diz para thread slave restrigir a replicao a uma tabela espec ca ica. Para especicar mais de uma tabela, use a diretiva mltiplas vezes, uma para cada tabela. u Isto funcionar para atualizaes atravs de bancos de dados, em contraste com a co e --replicate-do-db. Por favor, leia as notas que seguem esta lista de opes co
396
--replicate-ignore-table=db_name.nome_tabela Diz a thread slave para no replicar qualquer comando que atualiza a tabela a especicada (mesmo se qualquer outra tabela puder ser atualizada pelo mesmo comando). Para especicar mais de uma tabela a ser ignorada, use a diretiva vrias vezes, para cada tabela. Isto funcionar para atualizaes atravs de a a co e bancos de dados, em contraste com --replicate-ignore-db. Por favor, leia as notas que seguem esta lista de opoes c --replicate-wild-do-table=db_name.nome_tabela Diz a thread slave para restringir a replicao a consultas onde qualquer das ca tabelas atualizadas correspondam a padro de meta caracteres especicado. a Para especicar mais de uma tabela, use a diretiva vria vezes, uma para cada a tabela, Isto funciona para atualizaes atravs de banco de dados. Por favor, co e leia as notas que seguem esta lista de opes co Exemplo: --replicate-wild-do-table=foo%.bar% replicar apenas a atualizaes que usam uma tabela em qualquer banco de dadis que comece co com foo e cujos nomes de tabelas comecem com bar. Note que se voc zer --replicate-wild-do-table=foo%.% ento a regra ser e a a propagada para CREATE DATABASE e DROP DATABASE, ex.: estas duas instrues co sero replicadas se o nome de banco de dados corresponder ao padro do banco a a de dados (foo% aqui) (testa mgica poss por % ser o padro da tabela). a e ivel a Caracteres curingas _ e % escapados: se voc quiser replicar, por exemplo, toe das as tableas do banco de dados my_own%db (este o nome exato do banco de e dados), e no replicar tabelas do banco de dados my1ownAABCdb, voc deve esa e capar o _ e %: voc deve usar algo como isto: replicate-wild-do-table=my\_ e own\%db. E se voc estiver especicando esta opo para a linha de comando, e ca dependendo do seu sistema, voc precisar escapar o \ (por exemplo, com e a uma shell bash, voc precisaria digitar --replicate-wild-do-table=my\\_ e own\\%db). --replicate-wild-ignore-table=db_name.nome_tabela Diz a thread slave pra no replicar um consulta onde qualquer tabela cora responda ao padro de meta caracteres dado. Para especicar mais de uma a tabela, use a diretiva vrias vezes, uma vez para cada tabela. Isto funcionar a a para atualizaes atravs de banco de dados. Por favor, leia as notas que seguem co e esta lista de opes co Exemplo: --replicate-wild-ignore-table=foo%.bar% no atualizar a a tabelas no banco de dados que iniciar com foo e cujo os nomes de tabela iniciem com bar. Note que se voc zer --replicate-wild-ignore-table=foo%.% ento a ree a gra ser propagada para CREATE DATABASE e DROP DATABASE, ex. estas duas a instrues no sero replciadas se o nome do banco de dados no corresponder co a a a ao padro (foo% aqui) (esta mgica ocorre devido ao % como padro da a a a tabela). Caracteres curingas _ e % escapados: replicate-wild-do-table logo acima. veja as anotaes na descrio de co ca
397
--replicate-do-db=nome_bd Diz ao slave para restringir a replicao a comandos onde o banco de dados ca atual (p.ex., aquele selecionado por USE) nome_bd. Para especicar mais de e uym banco de dadosm use a diretiva vrias vezes, uma vez por tabela. Note a que isto no replicar consultas entre bancos de dados tais como UPDATE algum_ a a bd.alguma_tabela SET foo=bar se for selecionado outro banco de dados ou nenhum banco de dados. Se voc precisa que atualizaes entre bancos de dados e co funcionem, certique-se de que voc tem o MySQL 3.23.28 ou posterior, e use e --replicate-wild-do-table=db_name.%. Por favor, leia as notas que seguem esta lista de opes co Exemplo do que no funciona como voc espera: se o slave iniciado com -a e e replicate-do-db=sales, e voc faz USE prices; UPDATE sales.january SET e amount=amount+1000;, esta consulta no ser replicada. a a Se voc precisar que atualizaes entre bancos de dados funcionem, use -e co replicate-wild-do-table=db_name.%. A principal razo para este comportamento de apenas vericar o banco de dados a atual que dif para um comando sozinho saber se deve ser replicado ou e e icil no; por exemplo se voc est usando comandos delete ou update multi-tabelas a e a que continuam entre mltiplos bancos de dados. Tambm muito mais rpido u e e a vericar apenas o banco de dados atual. --replicate-ignore-db=nome_bd Diz ao slave para no replicar qualquer comando onde o banco de dados atual a (p.ex. o selecionado por USE) nome_bd. Para especicar mais bancos de daods e use a diretiva diversas vezes, uma para cada banco de dados. Voc no deve e a utilizar esta diretiva se voc est usando atualizao atravs de tabelas e voc e a ca e e no quer que estas atualizaes sejam replicadas. Por favor, leia as notas que a co seguem esta lista de opes co Exemplo do que no funcionaria como esperado: se o slave iniciado com -a e replicate-ignore-db=sales, e voc faz USE prices; UPDATE sales.january e SET amount=amount+1000;, esta consulta ser replicada. a Se voc precisar de atualizaes entre banco de dados funcione, use e co --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 instrues co envolvendo a tabela podem ser afetadas (CREATE DATABASE, DROP DATABASE no a podero), e apenas se de_nome era o banco de dados atual no master. Isto no a a funcionar para atualizaes entre banco de dados. Note que a translao a co ca 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 mquina ou nmero IP do slave a ser relatado ao master durante o a u registro do slave. Aparecer na sa de SHOW SLAVE HOSTS. Deixe indenido se a ida voc no quiser que o slave se registre no master. Note que ele no suciente e a a e
398
para o master simplesmente ler o nmero IP do slave fora dos sockets uma vez u que o slave se conecte. Devido ao NAT e outros assuntos de roteamento,a quele IP pode no ser vlido para se conectar ao slave a partir do master ou outras a a mquinas. a Esta opo est dispon a partir do MySQL 4.0.0. ca a ivel --report-port=portnumber Porta para conexo do slave relatado ao master durante o registro do slave. a Dena-o apenas se o slave est escutando por uma porta diferente da padro a a ou se voc tiver um tunel especial do master ou outros clientes para o slave. Se e no tiver certeza, deixe esta opo indenida. a ca Esta opo est dispon a partir do MySQL 4.0.0. ca a ivel --skip-slave-start Diz ao servidor slave para no iniciar a thread slave na iicializao do servidor. a ca O usurio pode inici-las mais tarde com START SLAVE. a a --slave_compressed_protocol=# Se 1, usa compactao no protocolo cliente/servidor se tanto o slave quanto o ca mester suport-la. a --slave-load-tmpdir=filename Esta opo igual ao valor da varivel tmpdir por padro. Quando a thread ca e a a SQL do slave replica um comando LOAD DATA INFILE, ele extrai os arquivos a serem carregados do relay logs em arquivos temporrios, e ento os carrega a a dentro da tabela. Se o arquivo carregado no master era enorme, os arquivos temporrios no slave tambm sero enormes; embora voc possa desejar que o a e a e slave coloque o arquivo temporrio em algum disco grande diferente de tmpdir, a usando esta opo. Nestes caso, voc tambm pode usar a opo --relay-log, ca e e ca j que os relay logs sero grandes tambm. --slave-load-tmpdir deve apontar a a e para o sistema de arquivo baseado em disco; no em um baseado em memria. a o Como o slave precisa de arquivos temporrios usados para replicar LOAD DATA a INFILE) para sobreviver a uma reinicializao da mquina. ca a --slave-net-timeout=# Nmero de segundos a esperer por mais dados do master antes de abortar a u leitura, considerando o quebra de conexo e as tentativas de reconectar. A a primeira vez ocorre imediatamente depois do tempo limite. O intervalo entre tentativas controlado pela opo --master-connect-retry. e ca --slave-skip-errors= [err_code1,err_code2,... | all] Diz ao a thread SQL do slave para continuar a replicao quando uma consulta ca retornar um erro de uma lista fornecida. Normalmente, a replicao ir parar ao ca a encontrar um erro, dando ao usurio a chance de resolver a inconsistncian nos a e dados manualmente. No use esta opo a menos que voc saiba exetamente a ca e o motivo dos erros. Se no houver erros em sua congurao da replicao e a ca ca programas clientes, e no houver erros no MySQL, voc nunca deve ter uma a e replicao abortada com erro. O uso indiscriminado desta opo resultar em ca ca a slaves fora de sincronia com o master e voc no ter idia de como o problema e a a e aconteceu.
399
Para cdigos de erros, voc deve usar o nmero fornecido pela mensagem de o e u erron no seu log de erros do slave e na sa de SHOW SLAVE STATUS. Uma lista ida completa de mensagens de erro podem ser encontradas na distribuio fonte ca em Docs/mysqld_error.txt. Os cdigos de erros do servidor tambm so o e a listados em Seo 13.1 [Error-returns], Pgina 889. ca a Voc tambm pode (mas no deve) usar um valor no recomendado de all o que e e a a ir ignorar todas as mensagens de erro e continua em frente indiferentemente. a No preciso dizer, que se voc usar isto, no podemos garantir a integridade a e e a dos seus dados. Por favor, no reclame se seus dados no slave no estiver nem a a prximo daqueles em seu master neste caso voc foi avisado. o e Exemplos: --slave-skip-errors=1062,1053 --slave-skip-errors=all Algumas destas opes, como todas as opes --replicate-*, s podem ser denidas na co co o inicializao do servidor slave, e no com ele ligado. Planejamos corrigir isto. ca a Aqui est a ordem de avaliao das regras --replicate-*, para decidir se a consulta ser a ca a executada pelo slave ou ignorada por ele: 1. Existe alguma regra --replicate-do-db ou --replicate-ignore-db? Sim: teste-as como para --binlog-do-db e --binlog-ignore-db (veja Seo 4.10.4 [Binary log], Pgina 374). Qual o resultado do teste? ca a e ignore a consulta: ignore-a e saia. execute a consulta: no execute-a imediatamente, adie a deciso, v para o a a a passo abaixo. No: v para o passo abaixo. a a 2. Existe alguma regra --replicate-*-table? No: execute a consulta e saia. a Sim: v para o passo abaixo. Apenas tabela que sero atualizadas sero coma a a paradas `s regras (INSERT INTO sales SELECT * from prices: apenas sales ser a a comparada `s regras). Se vrias tabelas forem ser atualizadas (instrues multia a co tabelas) a primeira a corresponder a regra (com do ou ignore) vence (isto , e a primeira tabela comparada a regra. se nenhuma deciso pode ser tomada a e a segunda tabela compara `s regras, etc). e a 3. Existe alguma regra --replicate-do-table? Sim: o tabela encaixa em alguma delas? Sim: execute a consulta e saia. No: v para o passo abaixo. a a No: v para o passo abaixo. a a 4. Existe alguma regra --replicate-ignore-table? Sim: a tabela encaixa em alguma delas? Sim: ignore a consulta e saia. No: v para o passo abaixo. a a No: v para o passo abaixo. a a
400
5. Existe alguma regra --replicate-wild-do-table? Sim: a tabela se encaixa em qualquer uma delas? Sim: execute a consulta e saia. No: v para o passo abaixo. a a No: v para o passo abaixo. a a 6. Existe alguma regra --replicate-wild-ignore-table? Sim: a tabela se encaixa em qualquer uma delas? Sim: ignore a consulta e saia. No: v para o passo abaixo. a a No: v para o passo abaixo. a a 7. Nenhuma regra --replicate-*-table foi correspondida. Existe outra tabela para se testar com estas regras? Sim: loop. No: testamos todas as tabelas a serem atualizadas, nenhuma regra foi obedecida. a Existem regras --replicate-do-table ou --replicate-wild-do-table? Sim: ignore a consulta e saia. No: execute a consulta e saia. a
401
Voc deve primeiro vericar todos os slaves com SHOW SLAVE STATUS para ver qual log eles e esto lendo, e ento voc deve fazer uma lista dos logs no master com SHOW MASTER LOGS, a a e encontrar o log mais novo entre todos os slaves (se todos os slaves esto atualizados, ele a ser o ultimo log da lista), tirar backup de todos os logs que voc est prestes a deletar a e a (opcional) e deletar at o log alvo. e
402
403
-> ->
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 especicar MASTER_HOST ou MASTER_PORT, o slave assumir que o mestre diferente e a e do anterior (mesmo se voc especicar um valor de nost ou porta iguais ao do valor atual.) e Neste caso Assim, os valores antigos do nome e posio do log binrio do mestre no so mais ca a a a aplicveis, assim se voc no especicar MASTER_LOG_FILE e MASTER_LOG_POS no comando, a e a MASTER_LOG_FILE= e MASTER_LOG_POS=4 so silenciosamente adicionados a ele. a MASTER_LOG_FILE e MASTER_LOG_POS so as coordenadas das quais a thread de E/S do a slave comeara a ler do master na prxima vez em que ele for iniciado. If you specify any of c o 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 especie que RELAY_LOG_FILE ou RELAY_LOG_POS (neste caso os relay logs sero mantidos; desde o a MySQL 4.1.1 a varivel global RELAY_LOG_PURGE ser denida com zero sem aviso prvio). a a e CHANGE MASTER TO atualiza master.info e relay-log.info. CHANGE MASTER util para congurar um slave quando voc tem a cpia do master e e e o gravou o registro e oset no master que corresponde a cpia tirada. Voc pode execuo e tar CHANGE MASTER TO MASTER_LOG_FILE=log_name_on_master, MASTER_LOG_POS=log_ offset_on_master no slave depois de restaurar a cpia. o O primeiro exemplo acima (CHANGE MASTER TO MASTER_HOST=master2.mycompany.com etc) altera as coordenadas do master e do seu log binrio. Isto quando voc deseja que o a e e slave replique o master. O segundo exemplo, usado com menos frequncia, quando o slave e e possui relay logs que, por alguma razo, voc deseja que o slave execute novamente; para a e fazer isto o master no precisa estar alcanavel, voc s precisa fazer CHANGE MASTER TO e a c e o iniciar a thread de SQL (START SLAVE SQL_THREAD). Voc pode usar isto mesmo fora da e
404
consigurao de replicao, em um servidor standalone, slave-de-ningum, para recuperao ca ca e ca depois de uma falha. Suponha que o seu servidor tenha falhado e voc tenha restaurado um backup. Voc deseja e e reexecutar o prprio log binrio do servidor (no os relay logs, mas logs binrios regulares), o a a a supostamente chamado myhost-bin.*. Primeiro faa uma cpia destes logs binrios em c o a alguns lugares seguros, no caso de voc no seguir exatamente o procedimento abaixo e e a acidentalmente apagar os logs binrios de servidor. Se voc estiver usando o MySQL 4.1.1 a e ou mais novos, dena SET GLOBAL RELAY_LOG_PURGE=0 para segurana adicional. Ento c a 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 binrios regulares a so relay logs) e skip-slave-start, ento execute estas instrues: a a co mysql> CHANGE MASTER TO -> RELAY_LOG_FILE=myhost-bin.153, -> RELAY_LOG_POS=410, -> MASTER_HOST=some_dummy_string; mysql> START SLAVE SQL_THREAD; Ento o servidor ir ler e executar seus prprios logs binrios, e assim conseguindo a recua a o a perao de falhas. Uma vez que a recuperao est nalizada, execute STOP SLAVE, desligue ca ca a o servidor, delete master.info e relay-log.info, e reinicie o servidor com suas opes co originais. No momento, especicar MASTER_HOST (mesmo com um valor modelo) come pulsrio para fazer o servidor pensar que ele um slave, e dar ao servidor um novo ID, o e diferente do anterior compulsrio seno o servidor ver os eventos com seus IDs e pene o a a sar que ele est em uma congurao de replicao circular e ignora os eventos, o que a a ca ca e indesejado. No futuro planejamos adicionar opes para lidar com estas pequenas restries. co co
405
que voc queira carregar. Todas as tabelas do master nas quais os usurios no tenham e a a privilgio SELETC sero ignoradas pelo LOAD DATA FROM MASTER; isto ocorre porque o mase a ter ir esconde-los do usurio: LOAD DATA FROM MASTER chama SHOW DATABASES para saber a a qual banco de dados do master carregar, mas SHOW DATABASES retorna apenas o banco de dados nos quais o usurio tem algum privilgio. Veja Seo 4.6.8.1 [Show database info], a e ca Pgina 303. No lado do slave, o usurio que executa LOAD DATA FROM MASTER deve ter a a permisso para apagar e criar o banco de dados e tabelas envolvidos. a
4.11.8.4 MASTER_POS_WAIT()
SELECT MASTER_POS_WAIT(master_log_file, master_log_pos) Esta uma funo, no um comando. E usada para assegurar que o slave tenha alcanado e ca a c (lido e executado) uma dada posio no log binrio do master. Veja Seo 6.3.6.2 [Miscelca a ca laneous functions], Pgina 547 para uma descrio completa. a ca
406
Salta os prximos n eventos do master. Util para recuperao de paradas da replicao o ca ca causada por um erro. Esta instruo s vlida quando a thread slave no est em execuo, em caso contrrio, ca o e a a a ca a retorna um erro. Antes do MySQL 4.0, omite a palavra chave GLOBAL da instruo. ca
407
Os campos mostrados por SHOW SLAVE STATUS tem o seguinte signicado: Slave_IO_State Uma cpia da coluna State da sa de SHOW PROCESSLIST para a thread de E/S o ida do slave; lhe dir se est thread est tentando se conectar ao master, esperando a a a por eventos do master, reconectando ao master, etc. Os estados poss iveis esto a listados em Seo 4.11.2 [Replication Implementation], Pgina 379. Olhar est ca a a coluna necessrio porque, por exemplo, a thread pode estar em execuo mas e a ca no tem sucesso ao tentar se conectar ao master: apenas esta coluna lhe deixar a a ciente do problema de conexo. Por outro lado, o estado da thread SQL no a a copiada, porque as coisas so mais simples para esta thread: se ela estiver e a em execuo, no haver problema; se no, voc encontrar o erro na coluna ca a a a e a Last_Error (descrita abaixo). Este campo est presente a partir do MySQL 4.1.1. a Master_Host A mquina master atual. a Master_User O usurio usado para conectar ao master. a 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 binrio do master no qual a thread de E/S est lendo a a atualmente. Read_Master_Log_Pos A posio at a qual a thread de E/S leu no log binrio do master. ca e a Relay_Log_File O nome do arquivo de relay log na qual a thread SQL est lendo e executando a atualmente. Relay_Log_Pos A posio at a qual a thread de SQL leu e executou neste relay log. ca e Relay_Master_Log_File O nome do arquivo de log binrio do master no qual contm o ultimo evento a e executado pela thread de SQL. Slave_IO_Running Diz se a thread de E/S foi iniciada ou no. a Slave_SQL_Running Diz se a thread de SQL est iniciada ou no. a a Replicate_Do_DB, Replicate_Ignore_DB A lista de banco de dados que foi especicado com as opes --replicate-doco db e --replicate-ignore-db.
408
Replicate_Do_Table, Replicate_Ignore_Table, Replicate_Wild_Do_Table, Replicate_Wild_Ignore_Table As tabelas que foram especicadas com as opes --replicate-do-table, co --replicate-ignore-table, --replicate-wild-do-table, e --replicatewild-ignore_table. Estes campos esto presentes a partir do MySQL 4.1.1. a Last_Errno O nmero de erro retornado pela consulta executada mais recentemente. Um u 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, mas ela a no existe no slave, assim DROP TABLE falhou no servidor. (Isto pode ocorrer se a o usurio esqueceu de copi-la no slave ao congur-lo). a a a A string vazia signica sem erro. Se o valor Last_Error no for vazio, ele a tambm apareceria como uma mensagem no log de erro do slave. Por exemplo: e Skip_Counter O ultimo valor usado por SQL_SLAVE_SKIP_COUNTER. Exec_Master_Log_Pos A posio no log binrio do master (Relay_Master_Log_File) do ultimo evento ca a executado pela thread de SQL. ((Relay_Master_Log_File,Exec_Master_Log_ Pos) no log binrio do master corresponde a (Relay_Log_File, Relay_Log_ a 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 clusula UNTIL da instruo START SLAVE. a ca Until_Condition possui estes valores estes valorer: None se nenhuma clusula UNTIL foi especicada a Master se o slave estiver lendo at uma dada posio no log binrio do e ca a master. Relay se o slave estiver lendo at uma dada posio em seus relay logs e ca Until_Log_File e Until_Log_Pos indicam o nome do arquivo de log e e posio ca que dene o ponto no qual a thread SQL ir parar a execuo. a ca Estes campos esto presentes a partir do MySQL 4.1.1. a Master_SSL_Allowed, Master_SSL_CA_File, Master_SSL_CA_Path, Master_SSL_Cert, Master_SSL_Cipher, Master_SSL_Key Estes campos mostram os parmetros SSL usado pelo slave para se conectar os a master, se existirem.
409
Master_SSL_Allowed possui estes valores: Yes se uma conexo SSL ao master permitida a e No se uma conexo SSL ao master no permitida a a e Ignored se uma conexo SSL permitida pelo servidor slave no tem suporte a a a SSL habilitado. Os valores dos outros campos correspodem ao valor das opes --master-ca, co --master-capath, --master-cert, --master-cipher, e --master-key. Estes campos esto presentes a partir do MySQL 4.1.1. a Seconds_Behind_Master O nmero de segundos passados desde o ultimo evento do master executado u pela thread salve SQL. Ser NULL quando nenhum evento foi executado ainda, a ou depois de CHANGE MASTER e RESET SLAVE. Esta coluna pode ser usada para saber "quo atrasado est o seu slave". Funcionar mesmo se o seu master e a a a slave no tiverem clocks idnticos. a e Estes campos esto presentes a partir do MySQL 4.1.1. a
410
Qualquer condio UNTIL restaurada por uma instruo STOP SLAVE subsequente, ou uma ca e ca instruo START SLAVE que no incluir a clusula UNTIL, ou um servidor reinicie. ca a a A clusula UNTIL pode ser util para depurar a replicao, ou para fazer com que a replicao a ca ca proceda at um pouco antes do ponto que voc deseja evitar que o slave replique uma e e instruo. Por exemplo, se uma instruo DROP TABLE foi executada no master, voc pode ca ca e usar UNTIL para dizer ao slave para executar at aquele ponto, mas no depois. Para e a encontrar qual o evento, use mysqlbinlog com o log do master ou o relay logs, ou usando e uma instruo SHOW BINLOG EVENTS. ca Se voc estiver usando UNTIL para ter o processo slave replicando consultas nas sees, e co e recomendado que voc inicie o slave com a opo --skip-slave-start para evitar que a e ca thread de SQL execute quando o slave iniciar. E provavelmente melhor usar esta opo ca em um arquivo de opo em vez de us-la na linha de comando, assim uma reinicializao ca a ca inesperada do servidor no faz com que isso seja esquecido. a A instruo SHOW SLAVE STATUS inclui campos na sa que mostram o valor atual da ca ida condio UNTIL. ca Este comando chamado SLAVE START antes do MySQL 4.0.5. No momento, SLAVE START e ainda aceito para compatibilidade com verses anteriores, mas est obsoleto. e o a
411
Se voc j no tiver um backup do master, aqui est um modo rpido de faz-lo de forma e a a a a e consistente: 1. 2. 3. 4. FLUSH TABLES WITH READ LOCK gtar zcf /tmp/backup.tar.gz /var/lib/mysql ( ou uma variao disto) ca - voc precisar dela mais tarde SHOW MASTER STATUS - esteja certo de gravar a saida e a UNLOCK TABLES
Uma alternativa tirar um dump do SQL do master em vez de uma cpia binria como e o a acima; para isto voc podee usar mysqldump --master-data em seu master e posteriore mente executar este dump SQL em seu slave. Isto , no entanto, mais lento que fazer uma e cpia binria. o a No importa qual dos dois mtodos voc usa, mais tarde siga as instrues para o caso em a e e co que voc tem uma cpia e gravou o nome e oset dos logs Voc pode usar a mesma cpia e o e o para congurar diversos slaves. Uma vez que os logs binrios do master esto intctos, voc a a a e pode esperar por dias ou meses para congurar um slave uma vez que voc possui a cpia e o do master. Em teoria a lacuna de espera pode ser innita. As duas limitaes prticas o co a e espao em disco do master sendo preenchido com logs antigos e a quantidade de tempo que c o slave gastar para busc-los. a a Voc tambm pode usar LOAD DATA FROM MASTER. Este um comando conveniente que tira e e e uma cpia, a restaur no slave e ajustar o nome e oset do log no slave, todos de uma o a vez. No futuro, LOAD DATA FROM MASTER ser o modo recomendado de congurar um slave. a Esteja avisado, no entanto, que o lock de leitura pode ser mantido por um longo tempo se voc usar este comando. Ele ainda no est implementado de forma to eciente quanto e a a a gostariamos. Se voc tiver tabelas grandes, o mtodo prefer neste momento ainda com e e ivel e uma cpia tar local depois de executar FLUSH TABLES WITH READ LOCK. o P: O slave precisa estar conectado ao master o tempo todo? R: No, ele no precisa. O slave pode ser desligado ou permanecer desconectado por horas a a ou mesmo dias, ento reconecta e busca as atualizaes. Por exemplo, voc pode usar uma a co e relao master/slave sobre uma conexo dial-up que est ligada espordicamente apenas por ca a a a um curto per iodo de tempo. A implicao disto que a uma hora dada qualquer no temos ca e a garantias de que o slave est sincronizado com o master a menos que voc tire algumas a e medidas especiais. No futuro, teremos a opo de bloquear o master at que pelo menos ca e um slave esteja sincronizado. P: Como posso saber se um slave est atrasado comparado ao master? Em outra palavras, a como eu sei que o dado da ultima 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 verso mais antigas o seguinte se aplica. Isto s poss se a thread salve de a oe ivel SQL existir (p.ex. se ele for exibida em SHOW PROCESSLIST, veja Seo 4.11.3 [Replication ca Implementation Details], Pgina 381) (no MySQL 3.23: se a thread slave existir, p.ex. a 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 prprio tempo do timestamp do evento ( por isto que TIMESTAMP bem o e e replicado). Assim indicado na coluna Time na sa de SHOW PROCESSLIST, o nmero de e ida u segundos entre o timestamp do ultimo evento replicado e o tempo real da mquina slave. a Vopc podee usar isto para determinar a data do ultimo evento replicado. Note que se o e
412
seu slave foi desconectado do master por uma hora e ento reconectado, voc poder ver a e a uma vlaor de 3600 na coluna Time para a thread slave de SQL em SHOW PROCESSLIST... Isto ocorreria porque o slave est executando consultas de uma hora atrs. a a P: Como eu foro o master a bloquear as atualizaes at que o slave as busque? c co e 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 da instuo SHOW. ida ca 2. No slave, execute este comando, onde as coordenadas da replicao que so os arguca a mentos da funo MASTER_POS_WAIT() so os valores gravados nos passos anteriores: ca a mysql> SELECT MASTER_POS_WAIT(log_name, log_offset); A instruo SELECT ser bloqueada at que o slave alcance o arquivo de log e oset ca a e especicados. Neste ponto, o slave estar em sincronia com o master e a instruo ir a ca a retornar. 3. No master, execute a seguinte instruo para permitir que o master comece a processar ca atualizaes novamente: co mysql> UNLOCK TABLES; P: Sobre quais assuntos eu devo estar ciente ao congurar uma replicao de duas vias? ca R: Atualmente a replicao do MySQL no suporta nenhum protocolo de locking entre ca a master e slave para garantir a atomicidade de uma atualizao distribu (entre servidores). ca ida para um cliente A fazer uma atualizao para um co-master 1, Em outras palavras, possivel e ca e neste tempo, antes de propagar para o co-master 2, o cliente B pode fazer uma atualizao ca para o co-master 2 que far a atualizao do cliente A funcionar diferentemente da que ele a ca fez no co-master 1. Assim, quando a atualizao do cliente A zer a atualizao para o ca ca co-master, ele produzir tabelas que so diferentes daquelas que voc tem no co-master 1, a a e mesmo depois de todas as atualizaes do co-master2 tambm terem sido propagadas. Por co e isso voc no deve co-encadear dois servidores em uma replicao de duas vias, a menos e a ca que voc possa assegurar que suas atualizaes possem seguramente ocorrer em qualquer e co ordem, ou que de alguma forma voc cuide de alguma forma a atualizao fora de ordem e ca no cdigo do cliente. o Voc tambm deve perceber que replicao de duas vias no melhorar em muito o deseme e ca a penho, j que temos atualizaes envolvidas. Ambos os servidores precisam fazer a mesma a co quantidade de atualizaes cada, como se tivesse um servidor. A unica diferena que co c e haver uma pouco menos de conteno de lock, porque as atualizaes originando em outro a ca co servidor sero serializadas em uma thread slave. mesmo assim, este benef pode ser por a icio atrasos de rede. P: Como eu posso usar replicao para melhorar a performance do meu sistema? ca R: Voc devev congurar um servidor como master e direcionar todas as escritas para ele. e Ento congure tantos slaves quantos voc pode comprar e instalar, e distribua as leituras a e entre o master e os slaves. Voc tambm pode iniciar os slaves com --skip-bdb, --lowe e priority-updates e --delay-key-write=ALL para conseguir aumento de velocidade para o slave. Neste caso o slave usar tabelas MyISAM no transacionais em vez de tabelas BDB a a para conseguir mais velocidade.
413
Q: O que eu devo fazer para preparar o cdigo do cliente em minhas prprias aplicaes o o co para usar replicao para melhora de performance? ca A: Se a parte do seu cdigo que for responsvel pela acesso ao banco de dados tiver sido o a absta ido/modularizado apropriadamente, converte-lo para executar com uma congurao ca de replicao deve ser bem fcil. Apenas altere a implementao de seu acesso a banco de ca a ca dados para enviar todas as escritas para o master e todas as leituras para o master e o slave. Se o seu cdigo no tiver este n de abstrao, congurar um sistema de replicao lhe o a ivel ca ca dar a oportunidade e motivao de limp-lo. Voc deve iniciar criando uma biblioteca ou a ca a e mdulo wrapper com as seguites funes: o co safe_writer_connect() safe_reader_connect() safe_reader_query() safe_writer_query() safe_ no nome de cada funo signica que a funo cuidar do tratamento de todas as ca ca a condies de erro. co Voc pode, claro, usar diferentes nomes para as funes. O importante ter uma interface e e co e unicada para conexo para leitura, conexo para escrita, fazer uma leitura e fazer uma a a escrita. Voc deve ento converter o cdigo do seu cliente para usar a biblioteca wrapper. Este pode e a o ser um processo doloroso e assustador a princ ipio, mas ser graticante a longo prazo. Todas a as aplicaes que usam a abordagem descrita podero tirar vantagem de uma congurao co a ca master/slave, mesmo envolvendo vrios slaves. O cdigo ser muito mais fcil de manter, e a o a a adicionar opes para solues de problemas ser trivial. Voc s precisar modicar uma co co a e o a ou duas funes, por exemplo, para registrar quanto tempo uma consulta gastou ou qual co consulta, entre todas elas, retornou um erro. Se voc j tiver escrito muito cdigo, voc pode querer automatizar a converso de tarefas e a o e a usando o utilitrio replace, que vem com a distribuio padro do MySQL, ou simplesa ca a mente escrever seu prprio script Perl. Provavelmente, o seu cdigo segue algum padro o o a de reconhecimento. Se no, ento talvez sej melhor reescrev-lo ou pelo menos coloc-lo a a a e a dentro de um padro. a Q: Quando e em quanto a replicao do MySQL pode aumentar a performance do meu ca sistema? A: A replicao do MySQL mais benca para um sistema com leituras frequentes e ca e e escritas infrequentes. Em teoria, usando uma congurao um mastre/vrios slaves voc ca a e pode escalar o sistema adicionando mais slaves at que voc que sem largura de banda na e e rede, ou a sua carga de atualizaes cresa ao ponto que o master no possa trat-la. co c a a Para determinar quantos slaves voc pode ter antes dos beneficios adicionados comearem e c a estabilzar e quanto voc pode melhorar o desempenho do seu site, voc precisa saber o e e padro de suas consultas e determinar empiricamente (pelo benchmark) a ralao entre a a ca 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 um calculo simplicado do que a voc pode obter com replicao para o nosso sistema hipottico. e ca e 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
414
pode fazer 1200 leituras por segundo sem nenhuma escrita, a escrita mdia duas vezes e e mais lenta que a leitura mdia e a realao linear. Vamos supor que o master e cada slave e ca e possuem a mesma capacidade, e temos 1 master e N slaves. Ento temos para cada servidor a (master ou slave): leituras = 1200 - 2 * escritas (a partir do benchmark) leituras = 9* escritas / (N + 1) (as leituras so separadas, mas a escrita deve ir para a todos os servidores) 9*escritas/(N+1) + 2 * escritas = 1200 escritas = 1200/(2 + 9/(N+1) Esta anlise leva as seguintes concluses: a o Se N = 0 (que signica que no temos replicao) nosso sistema pode tratar 1200/11, a ca cerca de 109, escritas por segundos (o que signica que teremos 9 vezes mais leituras devidos a natureza de nossa aplicao) ca Se N = 1, podemos aumentar para 184 escritas por segundos. Se N = 8, conseguimos 400. Se N = 17, 480 escritas. Eventualmente, a medida que N se aproxima de innito (e seu oramento de menos c innito), podemos chegar prximo a 600 escritas por segundo, aumentando o througho put do sistema em cerca de 5,5 vezes. No entanto, com apenas 8 servidores, j o a aumentamos em quase 4 vezes. Note que nossos calculos assumem uma largura de banda de rede innita, e negligencia vrios outros fatores que podiam se tornar signicante em seu sistema. Em muitos casos, a voc pode no conseguir fazer um clculo similar ao acima que ir predizer exatamente o que e a a a acontecer em seus sistema se voc adicionar N slaves de replicao. No entanto, responder a e ca as seguintes questes deve ajud-lo a decidir quando e quanto a replicao aumentar a o a ca a performance do seu sistema: Qual a razo da leitura/escrita no seu sistema? a Quanto mais de carga de escrita um servidor pode tratar se voc reduzir a leitura? e Para quantos slaves voc tem largura de banda disponiovel em sua rede? e ca a P: Como eu posso usar replicao para fornecer redundncia/alta disponibilidade? R: Com os recursos disponiveis atualmente, voc teria que congurar um master e um slave e (ou diversos slaves) e escrever um script que monitoraria o master para ver se ele est no a ar e instruir as suas aplicaes e os slaves do master a alterar no caso de falha. Sugestes: co o Para dizer para um slave para alterar o master, use o comando CHANGE MASTER TO. Um bom modo de manter sua aplicao informadas sobre a localizao do master ca ca e tendo uma entrada DNS dinmica para o master. Com bind voc pode usar nsupdate a e para atualizar dinamicamente o seu DNS. Voc deve executar seus escravos com a opo --log-bin e sem --log-slave-updates. e ca Deste modo o slave estar pronto para se tornar um master assim que voc executar a e STOP SLAVE; RESET MASTER, e CHANGE MASTER TO em outros slaves. Por exemplo, considere que voce tenha a seguinte congurao (M representa o e ca master, S o slave, WC o cliente que faz a leitura e escrita do banco de dados;
415
clientes que fazem apenas a leitura do banco de dados bo so representadas j que a a a elas no precisam trocar): a WC \ v WC----> M / | \ / | \ v v v S1 S2 S3 S1 (como S2 e S3) um slave executando com --log-bin e sem --log-slave-updates. e Como as unicas escritas executada em S1 so aquelas replicadas de M, o log binrio em a a S1 empty (lembre-se, que S1 executado sem --log-slave-updates). Ento, por e e a alguma razo, M se torna indispon a ivel, e voc quer que o S1 se torne o novo master e (isto , direciona todos os WC para S1 e faa S2 e S3 replicar em S1). e c Certique-se que todos os slaves processaram aqulquer consulta em seus relay log. Em cada slave, execute STOP SLAVE IO_THREAD, ento verique a sa a ida de SHOW PROCESSLIST at voc ver Has read all relay log. Quando isto ocorrer para todos e e os slaves, eles podem ser recongurados para a nova congurao. Envie STOP SLAVE ca 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 so escritas no log a binrio de S1. O log binrio de S1 contm exatamente todas as consultas de escrita a a e enviada para S1 desde que M foi nalizado. Em S2 (e S3) faa STOP SLAVE, CHANGE c MASTER TO MASTER_HOST=S1 (onde S1 substituido pelo nome de mquina real de e a S1). Para CHANGE MASTER, adicione todas as informaes sobre como conectar a S1 de co S2 ou S3 (usurio, senha, porta). Em CHANGE MASTER, no necessrio especicar o a a e a nome do log binrio de S1 ou a sua posio: ns sabemos que ele o primeiro log a ca o e binrio, na posio 4, e estes so os padres de CHANGE MASTER. Finalmente faa START a ca a o c SLAVE em S2 e S3, e agora voc ter isto: e a WC / | WC | M(indisponvel) i \ | \ | v v S1<--S2 S3 ^ | +-------+ Quando M estiver ativo novamente, voc s precisa enviar a ele o mesmo CHANGE MASTER e o 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 a melhor mquina), siga os procedimentos como se S1 estivesse e a indisponivel e M fosse o novo master; ento durante o procedimento no esquea d a a c
416
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 integrao de um sistema de eleio de master autca ca motico dentro do MySQL, mas at que ele esteja pronto, voc ter que criar suas prprias e e a o ferramentas de monitoramento.
417
O valor de n deve ser 1 se a consulta no usa AUTO_INCREMENT ou LAST_INSERT_ a ID(). Seno, o valor de ser 2. A razo para usarem um valor de 2 para consultas a a que usam AUTO_INCREMENT ou LAST_INSERT_ID() que elas gastam dois eventos e no log binrio do master. a Tenha certeza de que voc no est tendo problemas com um erro antigo atuale a a izando para a verso mais recente. a Se voc tem certeza que o slave iniciou perfeitamente em sincronia com o master, e e que as tabelas envolvidas no foram atualizadas fora da thread slave, relate o a erro.
418
5 Otimizao do MySQL ca
Otimizao uma tarefa complicada porque necessita um entendimento do sistema como ca e um todo. Enquanto for poss fazer algumas otimizaes com pequeno conhecimento de ivel co seu sistema ou aplicao, quanto mais otimizado voc desejar que o seu sistema esteja, mais ca e ter que saber sobre ele. a Este cap itulo tentar explicar e fornecer alguns exemplos de diferentes formas de otimizar a o MySQL. Lembre-se, no entanto, que sempre existiro (cada vez mais dif a iceis) formas adicionais de deixar seu sistema mais rpido. a
419
Todas as colunas possuem valor padro. a Se voc inserir um valor errado em uma coluna, como um NULL em uma coluna NOT e NULL ou um valor numrico muito grande em uma coluna numrica, o MySQL denir e e a coluna com o melhor valor poss ivel em vez de dar um erro. Para valores numricos e ou o maior valor poss isto 0, o menor valor possivel e ivel. Para strings into tanto uma e string vazia quanto a maior string poss que possa estar na coluna. ivel Todas as expresses calculadas retornam um valor que pode ser usado em vez de apreo sentar uma condio de erro. Por exemplo, 1/0 retorna NULL ca Para mais informaes sobre isto, veja Veja Seo 1.8.5 [Constraints], Pgina 52. co ca a O mostrado acima quer dizer que no se deve usar o MySQL para vericar o contedo dos a u campos, mas deve se fazer isto no aplicativo.
5.1.2 Portabilidade
Como todos os servidores SQL implementam diferentes partes de SQL, trabalhoso escrever e aplicativos SQL portveis. Para selects/inserts muito simples muito fcil, mas quanto mais a e a recursos voc precisa, mais dif se torna. Se voc quiser uma aplicao quue rpida com e icil e ca e a muitos bancos de dados ela se torna ainda mais dificil. Para fazer um aplicativo portvel complexo voc precisa escolher um nmero de servidores a e u SQL com o qual ele deve trabalhar.
Voc pode utilizar o MySQL programa/web-page crash-me - http://www.mysql.com/information/crashe - para encontrar funes, tipos e limites que voc pode utilizar com uma seleo de co e ca servidores de bancos de dados. O Crash-me agora testa quase tudo poss ivel, mas continua compreens com aproximadamente 450 itens testados. ivel Por exemplo, voc no deve ter nomes de colunas maior do que 18 caracteres se desejar e a utilizar o Informix ou DB2. Os programas de benchmarks e crash-me do MySQL so bastante independentes do bancos a de dados. Dando uma olhada em como ns os tratamos, voc pode sentir o que necessrio o e e a para escrever sua aplicao independente do banco de dados. Os benchmarks podem ser ca encontrados no diretrio sql-bench na distribuio fonte do MySQL. Eles so escritos em o ca a 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 , eles possuem diferentes compromissos de projeto que levam a comportamentos e diferentes. Se voc procura por independencia de banco de dados, precisar ter uma boa idia dos e a e gargalos de cada servidor SQL. O MySQL muito rpido para recuperao e atualizao e a ca ca de dados, mas ter problemas em misturar leituras/escritas lentas na mesma tabela. O a Oracle, por outro lado, possui um grande problema quando voc tentar acessar registros e que foram recentemente atualizados (at eles serem atualizados no disco). Bancos de dados e transacionais geralmente no so muito bons gerando tabelas de resumo das tabelas log, a a nestes casos o travamento de registros praticamente intil. e u
420
Para fazer sua aplicao realmente independente de banco de dados, voc precisar denir ca e a uma interface que possa ser expandida, por meio da qual voc far a manipulao dos dados. e a ca Como o C++ est dispon na maioria dos sistemas, faz sentido utilizar classes C++ para a ivel fazer a interface ao banco de dados. Se voc utilizar algum recurso espec e ico para algum banco de dados (como o comando REPLACE no MySQL), voc deve codicar um mtodo para os outros serviodores SQL para e e implementar o mesmo recurso (mas mais lento). Com o MySQL voc pode utilizar a sintaxe e /*! */ para adicionar palavras chave especicas do MySQL para uma query. O cdigo o dentro de /**/ ser tratado como um comentrio (ignorado) pela maioria dos servidores a a SQL. Se alta performance REAL mais importante que exatido, como em algumas aplicaes e a co WEB, uma possibilidade criar uma camada de aplicao que armazena todos os resultados e ca para lhe fornecer uma performance ainda mais alta. Deixando resultados antigos expirar depois de um tempo, voc pode manter o cache razoavelmente atual. Isto muito bom e e no caso de uma carga extremamente pesada, pois neste caso voc pode aumentar o cache e dinamicamente e congurar o tempo de expirao maior at que as coisas voltem ao normal. ca e Neste caso a informao de criao de tabelas devem conter informaes do tamanho inicial ca ca co do cache e com qual frequncia a tabela, normalmente, deve ser renovada. e
421
simples, pois mantemos todas as tabelas com as transas no disco. (Atualmente possuimos co pelo menos 50G de tabelas com transaes e 200G de outos dados do cliente.) co Ns tambm deixamos nossos clientes acessarem as tabelas sumrias diretamente com o e a ODBC para que os usurios avanados possam tambm fazer experimentar com os dados. a c e Ns no tivemos nenhum problema lidando com isso em um servidor Sun Ultra SPARCo a station (2x200 Mhz) bem modesto. Atualmente atualizamos um de nossos servidores para um UltraSPARC com 2 CPUs de 400 Mhz, e planejamos lidar com transaes no n co 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. Tambm estamos experimentando com Intel-Linux para obter mais poder de CPU por um e melhor preo. Agora que possuimos o formato binrios do bancos de dados portveis (a c a a partir da verso 3.23), comearemos a utiliz-lo para partes da aplicao. a c a ca Nossa sensao inicial que o Linux ir atuar muito melhor em cargas baixas e mdias e o ca e a e Solaris ir atuar melhor quando voc comear a ter uma carga alta pelo uso extremo de IO a e c de disco, mas ainda no temos nada conclusivo sobre isto. Depois de algumas discusses com a o 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 mquina muito lenta e sem resposta enquanto grandes batches a estiverem em execuo. Esperamos que isto tenha um tratamento melhor em futuras verses ca o do kernel Linux.
422
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 no est inclu porque eles solicitaram a remoo. Todos bencha a ida ca marks Oracle devem ser aprovados pela Oracle! Acreditamos que os benchmarks da Oracle so MUITO tendecioso pois os benchmarks acima devem ser executados supostamente para a uma instalao padro para um unico cliente. ca a Para executar a suite de benchmarks, as seguintes exigncias devem ser satisfeitas: e O pacote de benchamark fornecido com a distribuio fonte do MySQL, assim voc e ca e deve ter uma distribuio fonte. Voc tambm pode fazer um download de uma disca e e tribuio em http://www.mysql.com/downloads/, ou usar a rvore fonte de desenca a volvimento atual. (veja Seo 2.3.4 [Installing source tree], Pgina 100). ca a Os scripts do benchmark so escritos em Perl e usam o mdulo Perl DBI para acessar o a o servidor de banco de dados, assim o DBI deve estar instalado. Voc tambm precisar e e a do driver DBD espercico do servidor para cada um dos servidores que voc quer testar. e Por exemplo, para testar o MySQL, PostgreSQL, e DB2, os mdulos DBD::mysql, o DBD::Pg e DBD::DB2 devem estar instalados. O pacote de benchmark est localizado no diretrio sql-bench da distribio fonte do a o ca MySQL. Para executar o teste de benchmark, altera a localizao dentro daquele diretrio ca o e execute o script run-all-tests: shell> cd sql-bench shell> perl run-all-tests --server=server_name server_name um dos servidores suportados. Voc pode obter uma lista de todos e e parmetros e servidores suportados executando run-all-tests --help. a crash-me tenta determinar quais recursos um banco de dados suporta e quais suas capacidades e limitaes atuais para a execuo de consultas. Por exemplo, ele determina: co ca Quais tipos de colunas so suportados a Quantos indices so suportados a Quais funes so suportadas co a Qual o tamanho mximo de uma query a Qual o tamanho mximo de um registro do tipo VARCHAR a Podemos encontrar o resultado do crash-me para diversos bancos de dados em http://www.mysql.com/information/crash-me.php.
423
424
O exemplo acima demonstra que o MySQL pode excutar 1.000.000 expresses + em 0.32 o segundos em um PentiumII 400MHz. Todas funes MySQL devem ser bem otimizadas, mas existem algumas excesses e o co o benchmark(loop_count,expression) uma tima ferramenta para saber se existe um e o problema com sua query.
EXPLAIN nome_tabela um sinnimo para DESCRIBE nome_tabela ou SHOW COLUMNS FROM e o nome_tabela. Quando uma instruo SELECT for precedida da palavra chave EXPLAIN, o MySQL explicar ca a como ele deve processar a SELECT, fornecendo informao sobre como as tabelas esto sendo ca a unidas e em qual ordem. Com a ajuda de EXPLAIN, voc pode ver quando devem ser adicionados e indices ` tabelas a para obter uma SELECT mais rpida que utiliza a 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 Seo 4.6.2 [ANALYZE TABLE], Pgina 298. ca a Voc tambm pode ver se o otimizador une as tabelas em uma melhor ordem. Para forar e e c o otimizador a utilizar uma ordem espec ica de join para uma instruo SELECT, adicione ca uma clusula STRAIGHT_JOIN. a Para ligaes mais complexas, EXPLAIN retorna uma linha de informao para cada tabela co ca utilizada na instruo SELECT. As tabelas so listadas na ordem que seriam lidas. O MySQL ca a soluciona todas as joins utilizando um mtodo multi-join de varedura simples. Isto signica e que o MySQL l uma linha da primeira tabela, depois encontra uma linha que combina na e segunda tabela, depois na terceira tabela e continua. Quando todas tabelas so processadas, a ele exibe as colunas selecionadas e recua atravs da lista de tabelas at uma tabela na qual e e existem registros coincidentes for encontrada. O prximo registro lido desta tabela e o o e processo continua com a prxima tabela. o No MySQL verso 4.1 a sa do EXPLAIN foi alterada para funcionar melhor com cona ida strues como UNIONs, subqueries e tabelas derivadas. A mais notvel a adio de duas co a e ca novas colunas: id e select_type. A sa de EXPLAIN inclui as seguintes colunas: ida id Identicador SELECT, o nmero sequncial desta SELECT dentro da consulta. u e
select_type Tipo de clusula SELECT, que pode ser uma das seguintes: a SIMPLE PRIMARY UNION SELECT simples (sem UNIONs ou subqueries). SELECT mais externa. Segunda SELECT e as SELECTs posteriores do UNION
425
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 clusula FROM). a A tabela para a qual a linha de sa se refere. ida O tipo de join. Os diferentes tipos de joins so listados aqui, ordenados do a melhor para o pior tipo: system const A tabela s tem uma linha (= tabela de sistema). Este um caso o e especial do tipo de join const. A tabela tm no mximo um registro coincidente, o qual ser lido e a a na inicializao da consulta. Como s h um registro, os valores da ca o a coluna neste registro podem ser considerados constantes pelo resto do otimizador. Tabelas const so muito rpidas e so lidas apenas a a a uma vez! const usado quando voc compara todas as partes de uma chave e e PRIMARY/UNIQUE com restries: co 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 lida desta tabela para cada combinao de linhas a ca da tabela anterior. Este o melhor tipo de join depois dos tipos e const. E usado quando todas as partes do indice so usados pela a join e o indice unico (UNIQUE) ou uma chave primria (PRIMARY ee a KEY). eq_ref pode ser usado para coluna indexadas que comparada e com o\ operador =. O item comparado pode ser uma constante ou uma expresso que usa colunas de tabelas que so lidas antes desta a a tabela. Nos seguintes examplos, ref_table poder usar eq_ref a 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 sero lidos a desta tabela para cada combinao de registros da tabela anterior. ca ref usado se o join usa apenas o prexo mais a esquerda da e
ref
426
chave, ou se a chave no unica (UNIQUE) ou uma chave primria a e a (PRIMARY KEY) (em outras palavras, se a join no puder selecionar a um unico registro baseado no valor da chave). Se a chave que e usada coincide apenas em alguns registros, este tipo de join bom. e ref pode ser usado para colunas indexadas que so comparadas a com o operador =. Nos seguintes exemplos, ref_table poder usar ref a 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 Seo 5.2.5 [IS NULL optimization], ca Pgina 434. a Esta otimizao do tipo join nova para o MySQL 4.1.1 e mais ca e e usada na resoluo de sub queries. ca range Apenas registros que esto numa dada faixa sero retornados, usa a ando um indice para selecionar os registros. A coluna key indica qual indice usado. key_len contm a maior parte da chave que e e foi usada. A coluna ref ser NULL para este tipo. a range pode ser usado para quando uma coluna de chave come parada 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 o mesmo que ALL, exceto que apenas a rvore de e a indice e varrida. Isto normalmente mais rpido que ALL, j que o arquivo e a a de indice normalmente menor que o arquivo de dados. e Ele pode ser usado quando a consulta s usa colunas que so parte o a de um indice. ALL Ser feita uma varredura completa da tabela para cada combinao a ca de registros da tabela anterior. Isto normalmente no bom se a a e
427
tabela a primeiro tabela no marcada como const, e normalmente e a muito ruim em todos os casos ordenados. Voc normalmente pode e 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 totalmente indepene dente da ordem das tabelas. Isto signica que algumas das chaves em possible_ keys podem no ser usadas na prtica com a ordem de tabela gerada. a a Se esta coluna for NULL, no existem a indices relevantes. Neste caso, voc poder e a melhora a performance de sua query examinando a clusula WHERE para ver se a 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 Seo 6.5.4 [ALTER TABLE], Pgina 608. ca a 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 NULL se nenhum indice for escolhido. Para forar o MySQL a usar um a c indice listado na coluna possible_keys, use USE INDEX/IGNORE INDEX em sua consulta. Veja Seo 6.4.1 [SELECT], Pgina 562. ca a Executando myisamchk --analyze (veja Seo 4.5.6.1 [sintaxe do myisamchk], ca Pgina 281) ou ANALYSE TABLE (veja Seo 4.6.2 [ANALYZE TABLE], Pgina 298) a ca a na tabela tambm ajudar o otimizador a escolher indices melhores. e a key_len A coluna key_len indica o tamanho da chave que o MySQL decidiu utilizar. O tamanho ser NULL se key for NULL. Note que isto nos diz quantas partes de a uma chave multi-partes o MySQL realmente est utilizando. a A coluna ref exibe quais colunas ou contantes so usadas com a key para a selecionar registros da tabela. A coluna rows informa o nmero de linhas que o MySQL deve examinar para u executar a consulta. Esta coluna contem informaes adicionais de como o MySQL ir resolver a co a consulta. A seguir uma explicao das diferentes strings de texto que podem ca ser encontradas nesta coluna: Distinct O MySQL no continuar a procurar por mais registros para a a a combinao de registro atual depois de ter encontrado o primeiro ca registro coincidente. O MySQL estava apto a fazer uma otimizao LEFT JOIN na conca sulta e no examinar mais registros nesta tabela para a coma a binao do registro anterior depois que encontrar um registro que ca satisfaa o critrio do LEFT JOIN. c e Exemplo:
Not exists
428
SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL; Assume que t2.id denido com NOT NULL. Neste caso o MySQL e ir percorrer t1 e procurar pelos registros em t2 atravs de t1.id. a e Se o MySQL encontrar um registro combinando em t2, ele sabe que t2.id nunca poder ser NULL e no ir percorrer at o resto dos rega a e istros em t2 que possuirem o mesmo id. Em outras palavras, para cada registro em t1 o MySQL s precisa fazer uma unica pesquisa o em t2, independente de quantos registros coincidentes existirem em t2. range checked for each record (index map: #) O MySQL no encontrou um bom a indice para usar. No lugar, ele ir fazer uma vericao sobre qual a ca indice usar (se existir) para cada combinao das tabelas precedentes, e usar este ca a indice para recuperar os registros da tabela. Isto no muito rpido mas a e a e mais rpido que fazer um join sem um a indice. Using filesort O MySQL precisar fazer uma passada extra para descobrir como a recuperar os registros na ordem de classicao. A classicao ca ca e feita indo atravs de todos os registros de acordo com join type e e armazenar a chave de ordenao mais o ponteiro para o registro ca para todos os registros que combinarem com o WHERE. Ento as a chaves so classicadas. Finalmente os registros so recuperados a a na ordem de classicao. ca Using index A informao da coluna recuperada da tabela utilizando somente ca e informaes na rvore de co a 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 criar uma tabela tema porria para armazenar o resultado. Isto acontece normalmente se a voc zer um ORDER BY em um conjunto de colunas diferentes das e quais voc fez um GROUP BY. e Using where Uma clusula WHERE ser utilizada para restringir quais registros a a sero combinados com a prxima tabela ou enviar para o cliente. a o se voc no possui esta informao e a tabela do tipo ALL ou e a ca e index, pode existir alguma coisa errada na sua query (Se voc no e a pretender examinar todos os registros da tabela). Se voc desejar deixar suas consultas o mais rpido poss e a ivel, voc deve dar uma e olhada em Using filesort e Using temporary. Voc pode ter uma boa indicao de quo boa sua join multiplicando todos os valores e ca a e de EXPLAIN. Isto deve dizer a grosso modo quantos registros o na coluna rows na saida
429
MySQL deve examinar para executar a consulta. Este nmero tambm usado quando u e e voc restringe consultas com a varivel max_join_size. Veja Seo 5.5.2 [Parmetros de e a ca a servidor], Pgina 454. a O exemplo a seguir mostra como um JOIN pode ser otimizado progressivamente utilizando a informao fornecida por EXPLAIN. ca Suponha que voc tem a instruo SELECT exibida abaixo, que voc est examinando utie ca e a lizando 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 primria) a do CUSTNMBR (chave primria) a 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
430
range checked for each record (key map: 35) Como o tipo ALL em todas tabelas, esta sa indica que o MySQL est gerando um e ida a produto Cartesiano de todas as tabelas! Isto levar muito tempo para ser executado, pois a o produto do nmero de registros em cada tabela deve ser examinado ! Neste caso, existem u 74 * 2135 * 74 * 3872 registros. Se as tabelas forem maiores, imagine quanto tempo este tipo de consulta pode demorar. Um dos problemas aqui que o MySQL no pode (ainda) utilizar e a indices em colunas de maneira eciente se elas foram declaras ide forma diferente. Neste contexto, VARCHAR e CHAR so o mesmo a menos que tenham sido declarados com tamanhos diferentes. Como a tt.ActualPC declarado como CHAR(10) e et.EMPLOYID declarado como CHAR(15), existe e e aqui uma diferena de tamanho. c Para corrigir esta diferena entre tamanhos de registros, utilize ALTER TABLE para alterar o c tamanho de ActualPC de 10 para 15 caracteres: mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15); Agora ambos campos tt.ActualPC e et.EMPLOYID so VARCHAR(15). Executando a ina struo EXPLAIN novamente produzir este resultado: ca a 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 no est perfeito, mas est bem melhor ( o produto dos valores de rows agora menor a a a por um fator de 74 ). Esta verso executada em vrios segundos. a e a Uma segunda alterao pode ser feita para eliminar as diferenas de tamanho das colunas ca c para as comparaes tt.AssignedPC = et_1.EMPLOYID e tt.ClientID = do.CUSTNMBR : co mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15), -> MODIFY ClientID VARCHAR(15); Agora EXPLAIN produz a sa mostrada abaixo: ida 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 quase o melhor que se pode obter. e O problema restante que, por padro, o MySQL assume que valores na coluna e a tt.ActualPC esto distribu a idos igualmente, e este no o caso para a tabela tt. a e Felizmente, fcil informar ao MySQL sobre isto: e a shell> myisamchk --analyze PATH_TO_MYSQL_DATABASE/tt shell> mysqladmin refresh Agora a join est perfeita, e EXPLAIN produz esta sa a ida:
431
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 de EXPLAIN uma boa ajuda para otimizador de joins ida e do MySQL. Para otimizar uma consulta, voc deve conferir se os nmeros esto perto da e u a realidade. Se no, voc pode obter melhor desempenho utilizando STRAIGHT_JOIN em sua a e instruo SELECT e tentar listar as tabelas em uma ordem diferente na clusula FROM. ca a
432
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 nmero mdio de registros que tem o u e mesmo valor. (Para indices unicos, isto sempre 1, claro). O MySQL usar isto e e a para decidir qual indice escolher quando voc conectar duas tabelas utilizando uma e expresso no constante. Os resultados de analyze podem ser conferidos utilizando a a 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 deseja ordenar pelo e indice 1). Se voc possui um e indice unico no qual deseja ler todos registros na ordem do indice, esta uma boa forma e para torn-lo mais rpido. Perceba entretanto, que esta ordenao no foi escrita de a a ca a maneira otimizada e levar muito tempo em tabelas grandes! a
433
Uma tabela vazia ou uma tabela com 1 registro. Uma tabela que usada com uma clusula WHERE em um e a indice UNIQUE, ou uma PRIMARY KEY, onde todas as partes do indice so usadas com expresses constantes a o e as partes do indice so denidas como NOT NULL. a Todas as tabelas seguintes so usadas como tabelas constantes: a 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 combinao de join para unir as tabelas encontrada tentando todas as ca e possibilidades. Se todas colunas em ORDER BY e em GROUP BY vierem da mesma tabela, ento esta tabela ser preferencialmente a primeira na unio. a a a Se existerem uma clusula ORDER BY e uma GROUP BY diferente, ou se a ORDER BY ou a GROUP BY conterem colunas de tabelas diferentes da primeira tabela na la de join, uma tabela temporria ser criada. a a Se voc utilizar SQL_SMALL_RESULT, o MySQL usar a tabela temporria em memria. e a a o Cada indice de tabela consultado e o melhor e indice que cobrir menos de 30% dos registros usado. Se nenhum e indice for encontrado, uma varredura rpida feita pela a e tabela. Em alguns casos, o MySQL pode ler registros do indice mesmo sem consultar o arquivo de dados. Se todas colunas usadas do indice so numricas, ento somente a rvore de a e a a indice usada para resolver a consulta. e Antes de dar sa em cada registro, aqueles que no combinam com a clusula HAVING ida a a so ignorados. a
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 so resolvidas utilizando somente a rvore de a a indices (assumindo que as colunas indexadas so numricas): a e 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 indexao para recuperar os registros na ordem de classica cao sem um passo de ordenao separado: ca ca mysql> SELECT ... FROM tbl_name -> ORDER BY key_part1,key_part2,... ; mysql> SELECT ... FROM tbl_name -> ORDER BY key_part1 DESC,key_part2 DESC,... ;
434
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 otimizao s pode tratar um n IS NULL. ca o ivel 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 usar busca de chave na parte (t1.a=t2.a AND t2.a IS NULL) o a e no poder usar a parte da chave em b. a a
435
SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a; Neste caso, assumindo que t1 usando antes de t2 (conra com EXPLAIN), MySQL ir e a parar de ler de t2 (para aquele registro particular em t1) quandoo primeiro registro em t2 for encontrado.
436
Isto pode ser feito mais rpido j que o MySQL pode agora usar a tabela t2 antes da tabela a a t1 se resultasse consulta melhor. Para forar uma ordem de tabela espec c ica, use STRAIGHT JOIN. O MySQL ir fazer uma pesquisa completa em b j que o LEFT JOIN ir fora-lo a ser lido a a a c antes de d. A correo neste caso alterar a consulta para: ca e SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
437
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 temposrrio. Salve um ponteiro para o bloco ordenado. (No caso de todos os regitros a caberem no buer ordenado, nenhum arquivo temporrio criado). a e Repete o armazenamento acima at todas as linhas tenham sido lidos. e Faz um multi-merge at MERGEBUFF (7) regies para um bloco em outro arquivo teme o porrio. Repete at que todos os blocos do primeiro arquivo estejam no segundo ara e quivo. Repete o seguinte at que restem menos que MERGEBUFF2 (15) blocos. e No ultimo multi-merge, s o ponteiro para o registro (ltima parte de chave ordenada) o u escrito em um arquivo de resultado. e Agora o cdigo em sql/records.cc ser usado para ler atravs deles ordenadamente o a e usando os ponteiros de registro no arquivo resultante. Para otimizao , lemos em um ca grande bloco de ponteiros de registros, ordena-os ento lemos o registros ordenadamente a de de um buer de registro. (read_rnd_buffer_size) . Voc pode vericar com EXPLAIN SELECT ... ORDER BY se o MySQL pode usar e indices para resolver a consulta. Se voc obtiver Using filesort na coluna extra, ento o MySQL no e a a pode usar indices para resolver o ORDER BY. Veja Seo 5.2.1 [EXPLAIN], Pgina 424. ca a Se voc quiser ter uma velocidade ORDER BY maior, primeiro voc deve ver se voc pode e e e fazer que o MySQL use indices em vez de fazer um fase de ordenao extra. Se no for ca a poss ivel, ento voc pode fazer: a e Aumente o tamanho da varivel sort_buffer_size. a Aumente o temenho da varivel read_rnd_buffer_size. a Altere tmpdir para apontar para um disco dedicado com muito espao vazio. Se voc c e usa o MySQL 4.1 ou posterior voc pode distribuir a carga entre diversos discos fisicos e denindo tmpdir com uma lista de caminhos separados por dois pontos : (ponto e v irgula ; no Windows). Eles sero usados de acordo com o mtodo round-robin. Nota: a e Estes caminho devem estar em diferentes discos f isicos, e no em diferentes parties a co do mesmo disco. Por padro, o MySQL ordena todas as consultas GROUP BY x,y[,...] como se voc tivesse a e especicado ORDER BY x,y[,...]. Se voc incluir a clusula ORDER BY explicitamente, o e a MySQL a otimizar sem qualquer penalidade na velocidade, embora a ordenacao ainda a ocorra. Se a consulta inclui um GROUP BY mas voc deseja evitar a sobrecarga da ordenar o e resultado, voc pode suprimir a ordenacao especicando ORDER BY NULL: e INSERT INTO foo SELECT a,COUNT(*) FROM bar GROUP BY a ORDER BY NULL;
438
Se voc utilizar LIMIT row_count com ORDER BY, O MySQL ir terminar a ordenao e a ca 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 parar logo que ele encona trar row_count registros unicos. Em alguns casos um GROUP BY pode ser resolvido lendo a chave em ordem (ou fazer uma classicao na chave) e ento calcular resumos at o valor da chave alterar. Neste ca a e caso, LIMIT row_count no ir calcular nenhum GROUP BY desnecessrio. a a a Logo que o MySQL enviar os primeiros # registros para o cliente, ele ir abortar a a consulta. LIMIT 0 ir sempre retornar rapidamente um conjunto vazio. Isto util para conferir a e a consulta e obter os tipos de campos do resultado. Quando o servidor utiliza tabelas temporrias para resolver a consulta, o LIMIT row_ a count usado para calcular a quantidade de espao necessrio. e c a
439
E poss ivel com algum trabalho extra fazer o LOAD DATA INFILE executar ainda mais rpido quando a tabela tiver vrios a a indices. Utilize o seguinte procedimento: 1. Opcionalmente crie a tabela com CREATE TABLE. Por exemplo, utilizando mysql ou Perl-DBI. 2. Execute a instruo FLUSH TABLES ou o comando shell mysqladmin flush-tables. ca 3. Utilize myisamchk --keys-used=0 -rq /path/to/db/nome_tabela. Isto remover o uso de todos os indices da tabela. a 4. Insira dados na tabela com LOAD DATA INFILE. Isto no atualizar a a indices e ser a muito mais rpido. a 5. Se no futuro voc precisar da tabela somente para leitura, execute myisampack na e mesma para torn-la menor. Veja Seo 7.1.2.3 [Formato compactado], Pgina 635. a ca a 6. Recrie os indices com myisamchk -r -q /caminho/para/bd/nome_tabela. Isto criar a rvore de a a indices em memria antes de escrev-la para o disco, que o e e muito mais rpido porque evita que seja feita muita busca disco. A rvore de a a indices resultante tambm balanceada perfeitamente. e e 7. Execute uma instruo FLUSH TABLES ou o comando shell mysqladmin flushca tables. Note que LOAD DATA INFILE tamb faz a otimizao acima se voc a insero for em e ca e ca uma tabela vazia; a principal diferena com o procedimento acima qeu voc pode c e e deixar o myisamchk alocar muita mais memria temporria para a criao do o a ca indice que voc deseje que o MySQL alocasse para todas as recriaes de indice. e co Desde o MySQL 4.0 voc tambm pode usar ALTER TABLE nome_tbl DISABLE KEYS em e e 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 tambm pode saltar os passos FLUSH TABLES. e e Voc pode acelerar inseres feitas usando vrias instrues bloqueando suas tabelas: e co a co 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 diferena na velocidade que o buer de c e indices descarregado no disco e somente uma vez, depois de todas instrues INSERT term sido completadas. Normalco mente existiria tantas descargas do buer de indices quanto instrues INSERT diferco entes. O bloqueio no necessrio se voc pode inserir todos registros com uma simples a e a e instruo. ca Para tabelas transacionais, voc deve usar BEGIN/COMMIT em vez de LOCK TABLES para e conseguir um aumento na velocidade. O bloqueio ir tambm diminuir o tempo total de testes de multi-conexes, mas o a e o tempo mximo de espera para algumas threads ir aumentar (porque eles esperam a a pelos bloqueios). Por exemplo: thread 1 faz 1000 inser~es co thread 2, 3 e 4 faz 1 inser~o ca thread 5 faz 1000 inser~es co mysql> mysql> mysql> mysql>
440
Se voc no estiver usando travas, 2, 3 e 4 iro terminar antes de 1 e 5, Se estiver e a a utilizando travas, 2, 3 e 4 provavelmente no iro terminar antes de 1 ou 5, mas o a a tempo total deve ser cerca de 40% mais rpido. a Como as operaes INSERT, UPDATE e DELETE so muito rpidas no MySQL, voc obter co a a e a melhor perfomance geral adicionando travas em tudo que zer mais que cerca de 5 inseres ou atualizaes em um registro. Se voc zer vrias inseres em um registro, co co e a co voc pode utilizar LOCK TABLES seguido de um UNLOCK TABLES de vez em quando (em e torno de 1000 registro) para permitr que outras threads acessem a tabela. Isto tambm e continua mostrando um bom ganho de performance. Com certeza, LOAD DATA INFILE muito mais rpido para carregar dados. e a Para obter mais velocidade para LOAD DATA INFILE e INSERT, aumente o tamanho do buer de chaves. Veja Seo 5.5.2 [Parmetros de servidor], Pgina 454. ca a a
441
Tente evitar consultas SELECT complexas em tabelas que so muito atualizadas. Isto a evita problemas com travamento de tabelas. Com tabelas MyISAM que no tenham linhas deletadas, voc pode inserir registros ao a e mesmo tempo que outra tabela a estiver lendo. Se este recurso importante para voc, e e deve considerar mtodos onde voc no tem que apagar registrou ou executar OPTIMIZE e e a TABLE depois de ter apagado vrios registros. a Utilize ALTER TABLE ... ORDER BY expr1,expr2... se voc na maioria das vezes ree cupera registros na ordem expr1,expr2... Utilizando esta opo depois de grandes ca alteraes para a tabela, pode lhe dar um ganho de performance. co Em alguns casos pode fazer sentido introduzir uma coluna hash baseada nas informaes das outras colunas. Se esta coluna for curta e razoavelmente unica co pode ser muito mais rpido do que ter um grande indice em vrias colunas. No a a MySQL muito fcil usar esta coluna extra: SELECT * FROM nome_tabela WHERE e a hash=MD5(concat(col1,col2)) AND col_1=constante AND col_2=constante Para tabelas que alteram muito voc deve tentar evitar todas colunas VARCHAR ou BLOB. e Voc ter tamanho de registro dinmico assim que usar um simples campo VARCHAR ou e a a BLOB. Veja Cap ptexi tulo 7 [Tipos de tabelas], Pgina 630. a Normalmente no muito util cortar uma tabela em diferentes tabelas apenas porque a e os registros esto grandes. Para acessar um registro, o maior problema para a pera formance a busca em disco para encontra o primeiro byte do registro. Depois de e encontrar os dados a maioria dos novos discos podem ler o registro inteiro rpido o a bastante para a maioria das aplicaes. Os unicos caos onde realmente faz sentido co dividir uma tabela se ela uma tabela de registros com tamanho dinmico (veja e e a acima) que voc pode alterar para um tamanho xo, ou se voc frequentemente precisa e e examinar a tabela e no precisa da maioria das colunas. Veja Cap a ptexi tulo 7 [Tipos de tabela], Pgina 630. a Se frequentemente voc precisar calcular alguma coisa baseada em informao de vrios e ca a registros (ex: contagem de registros), provavlmente melhor introduzir uma nova e tabela e atualizar o contador em tempo real. Uma atualizao do tipo UPDATE table ca set count=count+1 where index_column=constante muito rapida! e Isto realmente importante quando voc usa bancos de dados como o MySQL que s e e o tem travamento de tabelas (multiplos leituras/escrita unica). Isto tambm dar melhor e a performance com a maioria dos banco de dados, j que o gerenciador de bloqueio de a registro ter menos a fazer neste caso. a Se voc precisar colerar estatisicas de tabelas maiores, utilize tabelas resumo em vez e de buscar em toda a tabela. Manter os resumos deve ser mais rpido que tentar criar a estatit iscas instantaneamente. E muito mais rpido criar novas tabelas atravs dos logs a e quando as coisas mudam (dependendo das descises de negcio) que ter que alterar a o o aplicao em execuo. ca ca Se possivel, deve-se classicar relatrios como instantneo ou estat o a isticos onde os dados necessrios para relatrios estai a o isticos so gerados apenas com base nas tabelas a resumo que so geradas a partir dos dados atuais. a Tire vantagem do fato de que a coluna tem valores padres. Insira valores explicitao mente apenas quando os valores a serem inseridos diferem do padro. Isto reduz a a analise que o MySQL precisa fazer e aumenta a velocidade de insero. ca
442
Em alguns casos conveniente empacotar e armazenar os dados em um campo e blob. Neste caso voc deve adicionar algum cdigo em sua aplicao para e o ca empacotar/desempacotar as coisas no campo blob, mas isto pode poupar vrios a acessos a algum estgio. Isto prtico quando voc possui dados que no conformam a e a e a com uma estrutura esttica de tabela. a Normalmente, voc deve tentar manter todos dados no-redundantes (o que chamado e a e de 3a forma normal na teoria de bancos de dados), mas voc no deve ter medo de e a duplicar alguns itens ou criar tabelas de resumo se voc precisar delas para ganhar e mais velocidade. Stored Procedures ou UDF (funes denidas pelo usurios) pode ser uma boa forma co a para obter mais performance. Neste caso voc deve, entretanto, sempre ter uma e maneira de fazer isso de outra maneira (mais lenta) se voc utilizar algum banco de e dados que no suporta isto. a Voc sempr pode ganhar velocidade fazendo cache de perguntas/respostas na sua e aplicao e tentando fazer vrias inseres/atualizaes ao mesmo tempo. Se seu banco ca a co co de dados suporta travamento de tabelas (como o MySQL e Oracle), isto deve ajudar a garantir que o cache de indices descarregado somente uma vez depois de todas e atualizaes. co Use INSERT /*! DELAYED */ quando no precisar saber quando os dados so gravados. a a Isto melhora a velocidade porque vrios registros podem ser gravados com uma simples a escrita em disco. Use INSERT /*! LOW_PRIORITY */ quando voc desejar que suas consultas sejam mais e importantes. Use SELECT /*! HIGH_PRIORITY */ para obter consultas que ignoram a la. Isto , a e consulta feita mesmo se alguem estiver esperando para fazer uma escrita. e Use a instruo INSERT multi-linhas para armazenar vrios registros com um comando ca a SQL (vrios servidores SQL suportam isto). a Use LOAD DATA INFILE para carregar volumes maiores de dados. Isto mais rpido que e a as inseres normais e mais rpido at quando o myisamchk for integrado no mysqld. co a e Use colunas AUTO_INCREMENT para garantir valores unicos. Use OPTIMIZE TABLE de vez em quando para evitar fragmentao quando estiver usando ca formatos de tabela dinmica. Veja Seo 4.6.1 [OPTIMIZE TABLE], Pgina 298. a ca a Use tabelas HEAP para obter mais velocidade sempre que poss ivel. Veja Cap ptexi tulo 7 [Tipos de tabelas], Pgina 630. a Quando estiver usando uma congurao de servidor Web normal, imagens devem ser ca armazenadas como arquivos. Isto , armazene apenas uma referncia para o arquivo e e no banco de dados. A principal razo para isto que um servidor Web normal muito a e e melhor trabalhando com cache de arquivos do que com contedo de banco de dados. u Portanto ser muito mais fcil obter um sistema rpido se voc utilizar arquivos. a a a e Use tabelas em memria para dados no-criticos que so acessados frequentemente o a a (como informaes sobre o ultimo banner visto para usurios que no possuem cookies). co a a Colunas com informaes identicas em diferentes tabelas devem ser declaradas idnticas co e e ter nomes idnticos. No entanto, antes da verso 3.23, voc pode obter ligaes mais e a e co lentas.
443
Tente manter os nomes mais simples (use nome em vez de nome_cliente na tabela cliente). Para deixar seus nomes portveis para outros servidores SQL voc deve manta e e los menores que 18 caracteres. Se voc realmente precisa de alta velocidade, voc deve vericar as interfaces de baixo e e n para armazenagem de dados que os diferentes servidores SQL suportam! Por exivel emplo, para acessar tabelas MySQL MyISAM diretamente, voc pode obter um aumento e de velocidade de 2-5 vezes comparado ao uso da interface SQL. Para conseguir essa faanha, os dados devem estar no mesmo servidor que sua aplicao, e normalmente c ca devem ser acessados por apenas um processo (porque travamento de arquivos externo so muito lentos). Os problemas acima podem ser eliminados introduzindo comandos a MyISAM de baixo n no servidor MySQL (isto pode ser a maneira mais fcil para auivel a mentar a performance). Tenha cuidado em projetar a interface com o banco de dados, ela deve ser bem facil para suportar estes tipos de otimizaes. co Em vrios casos mais rpido acessar dados de um banco de dados (utilizando uma a e a conexo ativa) do que acessar um arquivo texto, apenas pelo fato do banco de dados a ser mais compacto do que o arquivo texto (se voc estiver utilizando dados numricos), e e e isto ir envolver menos acessos ` disco. Voc tambm ir poupar cdigo porque a a e e a o no ser necessrio analisar seus arquivos texto para encontrar limites de registros e a a a campos. Voc pode tambm usar replicao para conseguir ainda mais performance nas suas e e ca aplicaes. Veja Seo 4.11 [Replicao], Pgina 378. co ca ca a Declarando uma tabela com DELAY_KEY_WRITE=1 ir tornar a atualizao de a ca indices mais rpida, pois as mesmas no sero escritas em disco at o arquivo ser fechado. a a a e O lado ruim que voc deve executar myisamchk nestas tabelas antes de iniciar o e e mysqld para garantir que os dados esto corretos se o mysqld for nalizado no meio a da execuo. Como a informao de chave pode sempre ser gerada a partir dos dados, ca ca voc no deve perder nada usando DELAY_KEY_WRITE. e a
444
O mtodo de bloqueio que o MySQL utilizado para LEITURA funciona da seguinte maneira: e Se no existirem tarvas na tabela, coloca um bloqueio de leitura na mesma. a Caso contrrio, coloca a requisio de trava na la de bloqueios para leitura. a ca Quando um bloqueio liberado, a trava ca dispon para as threads na la de bloqueios e ivel de escrita, e ento para as threads na la de bloqueios de leitura. a Isto signica que se voc possui vrias atualizaes em uma tabela, instrues SELECT iro e a co co a esperar at que no existam mais atualizaes. e a co Para contornar este problema no caso onde voc precisa fazer vrias operaes de INSERT e a co e SELECT em uma tabela, voc pode inserir registros em uma tabela temporria e atualizar e a a tabela real com os registros da tabela temporria de uma s vez. a o Isto pode ser feito usando o cdigo a seguir: o 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 pode utilizar as opes LOW_PRIORITY com INSERT, UPDATE ou DELETE ou HIGH_ e co PRIORITY com SELECT se voc desejar priorizar a recuperao em alguns casos espec e ca icos. Tambm podei-se iniciar o mysqld com --low-priority-updates para obter o mesmo e comportamento. Utilizar SQL_BUFFER_RESULT pode tambm tornar a criao de locks de tabelas mais cure ca tos.Veja Seo 6.4.1 [SELECT], Pgina 562. ca a Voc tambm pode alterar o cdigo de bloqueioss no mysys/thr_lock.c para usar uma e e o la simples. Neste caso, bloqueios de escrita e leitura devem ter a mesma prioridade, o que pode ajudar em algumas aplicaes. co
445
exclusivo. Durante a atualizao, todas outras threads que desejarem acessar esta tabela ca em particular iro esperar at que a atualizao acabe. a e ca Como atualizaes em tabelas normalmente so consideradas mais importantes que SELECT, co a todas as instrues que atualizam uma tabela tem maior prioridade que instrues que co co simplesmente recuperam informaes. Isto deve garantir que atualizaes no quem na co co a la por terem sido passadas vrias consultas pesadas em uma tabela espec a ica. (Voc e ca ca pode alterar isto utilizando LOW PRIORITY com a instruo que faz a atualizao ou HIGH_PRIORITY com a instruo SELECT.) ca A partir do MySQL verso 3.23.7 pode-se utilizadar a varivel max_write_lock_count para a a forar o MySQL a fornecer temporariamente a todas as instrues SELECT, que esperam por c co uma tabela, uma prioridade mais alta depois de um nmero espec u ico de inseres em uma co tabela. O bloqueio de tabela no , no entanto, muito bom sobre os seguintes cenrios: a e a Um cliente emite uma SELECT que exige muito tempo para ser executada. Outro cliente ento executa um UPDATE na tabela usada. Este cliente ter que esperar a a at que a SELECT seja terminada. e Outro cliente executa outra instruo SELECT na mesma tabela. Como UPDATE tem ca maior prioridade que SELECT, esta SELECT ir esperar pelo trmino da UPDATE. Ela a e tambm ir esperar pelo trmino da primeira SELECT! e a e Uma thread est esperando por algo do tipo disco cheio, caso em que todas as threads a que desejam acessar a tabela com problema iro ser colocadas em estado de espera at a e que mais espao em disco seja dispon c ivel. Algumas solues poss co iveis para este problema so: a Tente deixar suas instrues SELECT sempre rpidas. Voc pode ter que criar algumas co a e tabelas de resumo para fazer isto. Inicie o mysqld com --low-priority-updates. Isto ir fornecer a todas instrues a co que atualizam (modicam) uma tabela prioridade menor que uma instruo SELECT. ca Neste caso a ultima instruo SELECT no cenrio anterior deveria executar antes da ca a instruo INSERT. ca Voc pode fornecer a uma instruo INSERT, UPDATE ou DELETE espec e ca 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 nmero de bloqueios de ESCRITA. u Voc pode especicar que todas as atualizaes de uma thread espec e co ica deve ser feita utilizando prioridade baixa com o comando SQL: SET SQL_LOW_PRIORITY_UPDATES=1. Veja Seo 5.5.6 [SET OPTION], Pgina 460. ca a Voc pode especicar que uma SELECT espec e ica muito importante com o atributo e HIGH_PRIORITY. Veja Seo 6.4.1 [SELECT], Pgina 562. ca a Se voc tiver problemas com INSERT combinado com SELECT, utilize as novas tabelas e MyISAM, pois elas suportam SELECTs e INSERTs concorrentes. Se voc utiliza principalmente instrues INSERT e SELECT misturadas, o atributo e co DELAYED no INSERT provavelmente ir resolver seus problemas. Veja Seo 6.4.3 a ca [INSERT], Pgina 579. a
446
Se voc tiver problemas com SELECT e DELETE, a opo LIMIT para DELETE pode ajudar. e ca Veja Seo 6.4.5 [DELETE], Pgina 585. ca a
447
Utilize tipos inteiros menores se poss ivel para obter tabelas menores. Por exemplo, MEDIUMINT normalmente melhor que INT. e Declare colunas para serem NOT NULL se poss ivel. Isto deixa tudo mais rpido e voc a e economiza um bit por coluna. Perceba que se voc realmente precisa de NULL nas suas e aplicaes, podem ser usados. Tente simplesmente no us-la em todas as colunas por co a a padro. a Se voc no possui nenhuma coluna de tamanho varivel (VARCHAR, TEXT ou BLOB), e a a um formato de registro de tamanho xo para utilizado. Isto mais rpido mas e e a infelizmente pode ocupar mais espao. Veja Seo 7.1.2 [Formatos de tabelas MyISAM], c ca Pgina 634. a O indice primrio de uma tabela deve ser o mais curto poss a ivel. Isto torna a identicao de um registro fcil e eciente. ca a Para cada tabela, voc deve decidir qual metdo de armazenamento/ e o indice utilizar. Veja Cap ptexi tulo 7 [Tipos de tabelas], Pgina 630. a Crie somente os indices necessrios. a Indices so bons para recuperao mas ruins a ca quando voc precisa armazenar os dados rapidamente. Se na maioria das vezes voc e e acessa uma tabela pesquisando em uma combinao de colunas, crie um ca indice para elas. A primeira parte do indice deve ser a coluna mais utilizada. Se voc SEMPRE e utiliza vrias colunas, deve usar a coluna com mais duplicaes em primeiro lugar para a co obter melhor compactao do ca indice. Se for melhor que uma coluna tenha um prexo unico nos primeiros caracteres, e melhor indexar somente este prexo. O MySQL suporta um indice em uma parte de uma coluna de caracteres. Indices menores so mais rpidos no somente porque a a a eles exigem menos espao em disco mas tambm porque eles iro fornecer a voc mais c e a e acerto no cache de indice e isto diminui acessos a disco. Veja Seo 5.5.2 [Parmetros ca a de servidor], Pgina 454. a Em algumas circunstncias pode ser benco dividir uma tabela que varrida frea e e quentemente em duas. Isto verdade especicamente se a tabela tiver um formato e dinmico e for poss utilizar um formato de tabela esttico que possa ser usada para a ivel a encontrar os registros relevantes quando se zer uma varredura da tabela.
448
Indices so utilizados nos seguintes modos: a Para encontrar rapidamente os registros que coincidam com uma clusula WHERE. a Para recuperar registros de outras tabelas ao realizar joins. Para encontrar o valor MAX() ou MIN() para uma coluna indexada espeica. Isto otimizado por um preprocessador que confere se voc est utilizando WHERE e e a key part #=constante em todas as partes da chave < N. Neste caso o MySQL ir fazer uma simples procura na chave e trocar a expresso MIN() com uma a a constante. Se todas as expresses forem trocadas por constantes, a consulta retornar o a imediatamente: SELECT MIN(key_part2),MAX(key_part2) FROM nome_tabela where key_part1=10 Para ordenar ou agrupar uma tabela se a ordenao ou agrupamento for feito em um ca prexo mais ` esquerda de uma chave util (por exemplo, ORDER BY key_part_1, key_ a part_2 ). A chave lida na ordem invertida se todas as partes da chave forem seguidas e por DESC. Veja Seo 5.2.8 [Otimizao ORDER BY], Pgina 436. ca ca a Em alguns casos uma consulta pode ser otimizada para recuperar valores sem consultar o arquivo de dados. Se todas colunas utilizadas para alguma tabela so numricas e fora e mam um prexo mais ` esquerda para alguma chave, os valores podem ser recuperados a da rvore de a indices para aumentar a velocidade: SELECT key_part3 FROM nome_tabela WHERE key_part1=1 Suponha que voc utilize a seguinte instruo SELECT: e ca mysql> SELECT * FROM nome_tabela WHERE col1=val1 AND col2=val2; Se um indice de colunas mltiplas existir em col1 e col2, os registros apropriados podem u ser recuperados diretamente. Se indices separados de unicas colunas existirem em col1 e col2, o otimizador tentar encontrar o a indice mais restritivo decidindo qual indice ir a encontrar menos registros e usar este indice para recuperar os registros. a Se a tabela possuir um indice de mltiplas colunas, qualquer prexo mais ` esquerda do u a indice pode ser usado pelo otimizador para encontrar registros. Por exemplo, se voc possui e um indice de trs colunas em (col1, col2, col3), voc tem capacidades de busca indexada e e em (col1), (col1, col2) e (col1, col2, col3). O MySQL no pode utilizar um a indice parcial se as colunas no formarem um prexo mais a ` esquerda do a indice. Suponha que voc tenha as instrues SELECT mostradas abaixo: e co 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) no so os prexos mais ` esquerda de (col1, col2, col3). a a a O MySQL tambm utiliza e indices para comparaes do tipo LIKE se o argumento para LIKE co for uma string constante que no inicie com um meta caracter Por exemplo as seguintes a instrues SELECT utilizam co indices: mysql> SELECT * FROM nome_tbl WHERE key_col LIKE "Patrick%"; mysql> SELECT * FROM nome_tbl WHERE key_col LIKE "Pat%_ck%";
449
Na primeira instruo, somente os registros com "Patrick" <= key_col < "Patricl" so ca a considerados. Na segunda instruo, somente registros com "Pat" <= key_col < "Pau" so ca a considerados. As seguintes instrues SELECT no usaro co a a indices: mysql> SELECT * FROM nome_tbl WHERE key_col LIKE "%Patrick%"; mysql> SELECT * FROM nome_tbl WHERE key_col LIKE other_col; Na primeira instruo, o valor LIKE inicia com um meta caracter. Na segunda instruo, o ca ca valor LIKE no uma constante. a e O MySQL 4.0 faz outra otimizao em LIKE. Se voc usar ... LIKE "%string%" e string ca e tiver mais de 3 caracteres, o MySQL usar o algor a itmo Turbo Boyer-Moore para inicializar o padro para a string e ento usar este padro para realizar a pesquisa mais rpido. a a a a Buscas usando nome_coluna IS NULL usa indices se nome_coluna um e indice. O MySQL normalmente utiliza o indice que encontra o menor nmero de registros. Um u indice usado para colunas que voc compara com os seguintes operadores: =, >, >=, <, e e <=, BETWEEN ou um LIKE com um padro que comea com um prexo sem meta caracteres a c como algo%. Qualquer indice que no cobrem todos os n a iveis de AND na clusula WHERE no utilizado a a e 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 clusula WHERE utilizar a 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 clusulas WHERE no utilizam a a 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 no utilizar um a a indice, mesmo se algum estiver dispon ivel. Um exemplo deste caso quando o uso do e indice necessita que o MySQL acesse mais de 30% dos registros na tabela. (Neste caso uma varredura da tabela provavelmente e mais rpido, j que ela necessitar de menos pesquisas em discos). No entanto, se uma a a a consulta utiliza LIMIT para recuperar somente parte dos registros, o MySQL ir utilizar um a 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
450
O nmero mximo de u a indices por tabelas e o tamanho mximo de um a indice denido pelo e mecanismo de armazenamento. Veja Cap ptexi tulo 7 [Table types], Pgina 630. Todos os a 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 pode indexar um prexo da coluna. Isto muito mais e e rpido e necessita de menos espao em disco do que indexar a coluna inteira. A sintaxe a c para utilizar na instruo CREATE TABLE para indexar um prexo de uma coluna se parece ca 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 deve indexar um prexo da coluna. O e indice pode ter at e 255 bytes. No MySQL Verso 3.23.23 ou posterior, voc pode tambm criar a e e indices FULLTEXT especiais. Eles so utilizados para pesquisas textuais. Somente o tipo de tabela MyISAM suporta a indices FULLTEXT e apenas para colunas CHAR, VARCHAR e TEXT. Indexao sempre acontece ca sobre toda a coluna e indexao parcial (prexo) no suportada. Veja Seo 6.8 [Fulltext ca a e ca Search], Pgina 619 para detalhes. a
451
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 no ser usado nas seguintes consultas: a a mysql> SELECT * FROM teste WHERE primeiro_nome="Michael"; mysql> SELECT * FROM teste WHERE ultimo_nome="Widenius" OR primeiro_nome="Michael"; Para maiores informaes sobre a maneira que o MySQL utiliza co indices para melhorar o desempenho das consultas, veja Seo 5.4.3 [ ca indices do MySQL], Pgina 447. a
452
Esteja certo de que o seu sistema operacional pode tratar o nmero de descritores de u arquivos abertos denido pelo valor de table_cache. Se table_cache for muito alto, o MySQL pode esgotar os descritores de arquivo e recusar conexes, falhar na execuo de o ca consultas e ser muito instavel. Voc tambm tm que levar em conta que o mecanismo e e e de armazenamento MyISAM precisa de dois descritores de arquivos para cada tabela aberta. Voc pode aumentar o nmero de descritores de arquivo dispon e u iveis para o MySQL com a opo de inicializao --open-files-limit=#. Veja Seo A.2.17 [Tratamento de arquivos ca ca ca insucientes], Pgina 921. a A cache de tabelas abertas ser mantido em um n de table_cache entradas. O valor a ivel padro 64; isto pode ser alterado com a opo -O table_cache=# do mysqld. Note que o a e ca MySQL pode temporariamente abrir mais tabelas para poder se executar consultas. Um tabela no usada fechada e removida da cache de tabelas sob as seguintes cira e cuntncias: a Quando a cache est cheia e um thread tenta abrir uma tabela que no est na cache. a a a Quando a cache contm mais que table_cache entradas e uma thread no est mais e a a usando uma tabela. Quando algum executa mysqladmin refresh ou mysqladmin flush-tables. e Quando algum executa uma instruo FLUSH TABLES. e ca Quando o cache de tabela encher, o servidor usa o seguinte procedimento para encontrar uma entrada de cache para usar: Tabelas que no estiverem em uso so liberadas, na ordem LRU (least-recently-used), a a 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 extendido temporariamente quando necessrio. e a Se o cache estiver no estado temporariamente extendido e uma tabela vai do estado em-uso para o fora-de-uso, a tabela fechada e liberada do cache. e 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 aberta para cada acesso simultneo. Isto signica a tabela precisa ser aberta e a 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 para o e arquivo de indice: este descritor compartilhado entre todas as threads. e Se voc est abrindo uma tabela com a instruo HANDLER nome_tabela OPEN, uma tabela e a ca dedicada alocada para a thread. Este objeto da tabela no compartilhado por outras e a e threads e no ser fechado at que a thread chame HANDLER nome_tabela CLOSE ou seja a a e nalizada. Veja Seo 6.4.9 [HANDLER], Pgina 595. Quando isto acontece, a tabela ca a e colocada de volta na cache de tabela (se a cache no estiver cheia). a Voc pode conferir se o seu cache de tabela est muito pequeno conferindo a varivel opened_ e a a tables do mysqld. Se este valor for muito grande, mesmo se voc no fez vrios FLUSH e a a TABLES, voc deve aumentar o tamanho da sua cache de tabelas. Veja Seo 4.6.8.3 [Opened_ e ca tables], Pgina 305. a
453
454
455
mysql> SHOW VARIABLES; Voc tambm pode ver algumas estat e e isticas e indicadores de status para um servidor em execuo executando este comando: ca mysql> SHOW STATUS; Para encontrar uma descrio completa de todas as variveis na seo SHOW VARIABLES ca a ca neste manual. Veja Seo 4.6.8.4 [SHOW VARIABLES], Pgina 309. ca a Para informao sobre variveis de estado, veja Seo 4.6.8.3 [SHOW STATUS], Pgina 305. ca a ca a Variveis de servidor e informao de status tambm pode ser obtido usando mysqladmin: a ca e shell> mysqladmin variables shell> mysqladmin extended-status O MySQL utiliza algor itmos que so muito escalveis, portanto, normalmente voc pode a a e trabalhar com pouca memria. Entretanto, se voc fornecer ao MySQL mais memria, o e o obter um desempenho melhor. a Quando estiver ajustando um servidor MySQL, as duas variveis mais importantes que a devem ser usadas so key_buffer_size e table_cache. Voc deve se sentir conante que a e as duas estejam corretas antes de tentar alterar qualquer outra varivel. a Os seguintes exemplos indicam alguns valores t ipicos de variveis para diferentes cona guraes de tempo de execuo. Os exemplos usam o script mysqld_safe e usam a sintaxe co ca --name=value para denir a varivel name com o valor value. Esta sintaxe est dispon a a ivel a partir do MySQL 4.0. Para verses mais antigas do MySQL, tome as seguintes diferenas o c nas contas: Use safe_mysqld em vez de mysqld_safe. Congure as variveis usando a sintaxe --set-variable=name=value ou -O a name=value Para nomes de variveis que nalizam em _size, voc pode precisar especic-las sem a e a _size. Por exemplo, o nome antigo para sort_buffer_size sort_buffer. O nome e antigo para read_buffer_size record_buffer. Para ver quais variveis a verso do e a a seu servidor reconhece, use mysqld --help. Se voc possui pelo menos 256M de memria e vrias tabelas e deseja obter o melhor e o a desempenho com um nmero moderado de clientes, deve utilizar algo como: u shell> mysqld_safe --key_buffer_size=64M --table_cache=256 \ --sort_buffer_size=4M --read_buffer_size=1M & Se possui apenas 128M de memria e apenas algumas poucas tabelas, mas ainda deseja o realizar vrias ordenaes, voc pode utilizar: a co e shell> mysqld_safe --key_buffer_size=16M --sort_buffer_size=1M Se voc possuir pouca memria e tiver muitas conexes, utilize algo como: e o o 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 &
456
Se voc estiver executando um GROUP BY ou ORDER BY em tabelas que so muito maiores e a que sua memria dispon voc deve aumentar o valor de record_rnd_buffer_size para o ivel e acelerar a leitura de registros aps a operao de ordenao. o ca ca Quando voc tiver instalado o MySQL, o diretrio support-files ir conter alguns e o a arquivos exemplos do my.cnf, my-huge.cnf, my-large.cnf, my-medium.cnf e my-small.cnf, voc pode us-los como base para otimizar seu sistema. e a Se voc possui vrias conexes simultneas, problemas de trocas podem ocorrer a menos e a o a que o mysqld tenha sido congurado para usar muito pouca memria para cada conexo. o a O mysqld tem melhor performance se voc tiver memria suciente para todas as conexes, e o o claro. e Perceba que se voc especica uma opo na linha de comando para o mysqld, ou mysqld_ e ca safe ele permanece em efeito somente para aquela chamada do servidor. Para usar a opo ca toda vez que o servidor executa, coloque-o em um arquivo de opo. ca Para ver os efeitos de uma alterao de parmetro, faa algo como: ca a c shell> mysqld --key_buffer_size=32m --help Tenha certeza que a opo --help seja a ultima do comando; de outra forma o efeito de ca qualquer opes listadas depois na linha de comando no sero reetidas na sa co a a ida.
457
Se voc liga dinamicamente (sem -static), o resultado 13% mais lento no Linux. e e Note que voc ainda pode utilizar uma biblioteca do MySQL dinamicamente ligada ` e a o sua aplicao cliente. E s o servidor que cr ca e itico para performance. Se voc corta seu binrio mysqld com strip libexec/mysqld, o binrio gerado pode e a a car at 4% mais rpido. e a Para uma conexo de um cliente para um servidor em execuo na mesma mquina, se a ca a voc conecta utilizando TCP/IP em vez de utilizar um arquivo socket Unix, o rendie mento 7.5% mais lento no mesmo computador. (Se voc zer conexo ` localhost, e e a a o MySQL ir, por padro, utilizar sockets). a a Para conexes TCP/IP de um cliente para um servidor, conectando a um servidor o remoto em outra mquina ser 8-11% mais lento que conectando ao servidor local na a a mesma mquina, mesmo para conexes Ethernet de 100M. a o Quando executar o nosso teste de benchamrk usando conexes seguras (todos os dados o crptografados com suporte interno SSL) ele se torna 55% mais lento. Se voc compilar com --with-debug=full, a maioria das consultas ser 20% mais e a 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 verso do mysqld compilada com --with-debug=full, voc a e pode desabilitar a vericao de memria em tempo de execuo iniciando-o com a ca o ca opo --skip-safemalloc. O resultado nal neste caso deve estar prximo de quando ca o compilado com --with-debug. Em um Sun UltraSPARC-IIe, Forte 5.0 4% mais rpido que gcc 3.2. e a Em um Sun UltraSPARC-IIe, Forte 5.0 4% mais rpido em modo de 32 bits que em e a modo de 64 bits. Compilando com gcc 2.95.2 para o ultrasparc com a opo -mcpu=v8 -Wa,ca xarch=v8plusa melhora a performance em 4%. No Solaris 2.5.1, a MIT-pthreads 8-12% mais lenta do que as threads nativas do e Solaris em um unico processador. Com mais carga/CPUs a diferena deve aumentar. c 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 rpido. a A distribuio MySQL-Linux fornecida pela MySQL AB normalmente compilada com ca e pgcc, mas vamos retornar ao uso do gcc pelo fato de um bug no pgcc que gera o cdigo o que no executa no AMD. Continuaremos a usar o gcc at que o bug seja resolvido. Neste a e meio tempo, se voc possui uma mquina que no seja AMD, voc pode ter um binrio e a a e a mais rpido compilando com o pgcc. O binrio padro do MySQL para Linux ligado a a a e estaticamente para conseguir mais desempenho e ser mais portvel. a
458
O buer de chave (varivel key_buffer_size) compartilhado por todas as threads; a e Outros buers usados pelo servido so alocados quando necessrios. Veja Seo 5.5.2 a a ca [Parmetros de servidor], Pgina 454. a a Cada conexo utiliza algum espao espec a c ico da thread: Uma de pilha (padro de 64K, a varivel thread_stack), um buer de conexo (varivel net_buffer_lenght), e um a a a buer de resultados (varivel net_buffer_lenght). Os buers de conexes e resultados a o so aumentados dinamicamente para max_allowed_packet quando necessrio. Quando a a uma consulta est sendo executada, uma cpia da string da consulta atual tambm a o e e alocada. Todas as threads compartilhas a mesma memria base. o Somente as tabelas ISAM e MyISAM compactadas so mapeadas em memria. Isto a o e porque o espao de memria de 32-bits de 4GB no grande o bastante para a maioria c o a e das grandes tabelas. Quando sistemas com endereamento de 64-bits se tornarem c comuns poderemos adicionar um suporte gieral para o mapeamento de memria. o Cada requisio fazendo uma varredura sequencial em uma tabela aloca um buer de ca leitura (varivel read_buffer_size). a Ao ler registros na ordem randmica (por exemplo, depois de uma ordenao) um o ca buer de leitura randmico alocado para evitar pesquisas em disco. (varivel read_ o e a rnd_buffer_size). Todas as joins so feitas em um unico passo, e a maioria delas podem ser feitas mesmo a sem usar uma tabela temporria. A maioria das tabelas temporrias so tabelas a a a baseadas em memria (HEAP). Tabelas temporrias com uma grande extenso de o a a registros (calculada como a soma do tamanho de todas as colunas) ou que contenham colunas BLOB so armazenadas em disco. a Um problema nas verses do MySQL anteriores a 3.23.2 que se uma tabela HEAP o e excede o tamanho de tmp_table_size, voc recebe o erro The table nome_tabela is e full. A partir da verso 3.23.2, isto tratado alterando automaticamente a tabela a e em memria HEAP para uma tabela baseada em disco MyISAM quando necessrio. Para o a contornar este problema, voc pode aumentar o tamanho da tabela temporria cone a gurando a opo tmp_table_size do mysqld, ou congurando a opo do SQL SQL_ ca ca BIG_TABLES no progrma cliente. Veja Seo 5.5.6 [SET OPTION], Pgina 460. Na verso ca a a 3.20 do MySQL, o nmero mximo da tabela temporria record_buffer*16; se voc u a a e e estiver utilizando esta verso, voc ter que aumentar o valor record_buffer. Voc a e a e tambm pode iniciar o mysqld com a opo --big-tables para sempre armazenar as e ca tabelas temporrias em disco. Entretanto isto afetar a velocidade de vrias consultas a a a complicadas. A maioria das requisies que realizam ordenao alocam um bufer de ordenao e 0-2 co ca ca arquivos temporrios dependendo do tamanho do resultado. Veja Seo A.4.4 [Arquivos a ca temporrio], Pgina 929. a a Quase todas as anlises e clculos so feitos em um armazenamento de memria local. a a a o Nenhuma sobrecarga de memria necessrio para o e a itens pequenos e a alocao e libca erao normal de memria lenta evitada. A memria alocada somente para grandes ca o e o e strings inesperadas; isto feito com malloc() e free(). e Cada arquivo de indice aberto uma vez e o arquivo de dados aberto uma vez e e para cada thread concorrente. Uma estrutura de tabela, estrutura de coluna para
459
cada coluna e um buer de tamanho 3 * n alocado para cada thread concorrente. e (onde n o maior tamanho do registro, sem levar em considerao colunas BLOB. Uma e ca coluna BLOB utiliza de 5 a 8 bytes mais o tamanho dos dados contidos na mesma. O manipulador de tabelas ISAM/MyISAM iro usar um registro extra no buer para uso a interno. Para cada tabela com colunas BLOB, um buer aumentado dinamicamente para ler e grandes valores BLOB. Se voc ler uma tabela, um buer do tamanho do maior registro e BLOB alocado. e Estruturas de manipulaco para todas tabelas em uso so salvos em um cache e gerena a ciado como FIFO. Normalmente o cache possui 64 entradas. Se uma tabela foi usada por duas threads ao mesmo tempo, o cache ter duas entredas para a tabela. Veja a Seo 5.4.7 [Cache de tabela], Pgina 451. ca a Um comando mysqladmin flush-tables fecha (ou instrues FLUSH TABLES) todas co tabelas que no esto em uso e marca todas tabelas em uso para serem fechadas quando a a a thread atualmente em execuo terminar. Isto ir liberar efetivamente a maioria da ca a memria em uso. o ps e outros programas de informaes do sistema podem relatar que o mysqld usa muita co memria. Isto pode ser causado pelas pilhas de threads em diferentes endereos de memria. o c o Por exemplo, a verso do ps do Solaris conta a memria no usada entre as pilhas como a o a memria usada. Voc pode vericar isto conferindo a memria dispon o e o ivel com swap -s. Temos testado o mysqld com detectores comerciais de perda de memria, portanto tais o perdas no devem existir. a
460
461
SHOW VARIABLES like "max_join_size"; SHOW GLOBAL VARIABLES like "max_join_size"; SELECT @@max_join_size, @@global.max_join_size; Segue aqui a descrio das variveis que usam uma sintaxe SET no padro e algumas ca a a a das outras variveis. A denio das outras variveis podem ser encontrados na seo a ca a ca variveis de sistema, entre as opes de inicializao ou na descrio de SHOW VARIABLES. a co ca ca Veja Seo 6.1.5 [Variveis de sistema], Pgina 475. Veja Seo 4.1.1 [Opes de linha de ca a a ca co comando], Pgina 207. Veja Seo 4.6.8.4 [SHOW VARIABLES], Pgina 309. a ca a AUTOCOMMIT= 0 | 1 Se congurado com 1 todas alteraes em uma tabela ser feita de uma vez. co a Para iniciar uma transao de vrios comandos, deve ser usada a instruo ca a ca BEGIN. Veja Seo 6.7.1 [COMMIT], Pgina 615. Se congurado com 0 deve ca a ser usado COMMIT/ROLLBACK para aceitar/recusar aquela transao. Veja ca Seo 6.7.1 [COMMIT], Pgina 615. Note que quando voc altera do modo ca a e no-AUTOCOMMIT para AUTOCOMMIT, o MySQL ir fazer um COMMIT automtico a a a em quaisquer transaes abertas. co BIG_TABLES = 0 | 1 Se denido com 1, todas as tabelas temporrias so armazenadas no disco em a a vez de o ser na meria. Isto ser um pouco mais lento, mas voc no ter o erro o a e a a The table tbl_name is full para grandes operaes SELECT que exigem uma co tabela temporria maior. O valor padro para uma nova conexo 0 (isto , usa a a a e e tabelas temporrias em memria) Esta opo era chamada SQL_BIG_TABLES. a o ca No MySQL 4.0 voc normalmente nunca deve precisar deste parmetro j que e a a o MySQL converter automaticamente tabelas em memria para tabelas em a o disco se isto for necessrio. a CHARACTER SET nome_conjunto_caracteres | DEFAULT Mapeia todas as strings do e para o cliente com o mapa especicado. Atualmente a unica opo para character_set_name cp1251_koi8, mas voc pode ca e e adicionar novos mapas editando o arquivo sql/convert.cc na distribuio ca fonte do MySQL. O mapeamento padro pode ser restaurado utilizando o valor a DEFAULT para character_set_name. Perceba que a sintaxe para congurar a opo CHARACTER SET diferente da ca e sintaxe para congurar as outras opoes. c DATE_FORMAT = format_str Determina como o servidor converte valores DATE para strings. Esta varivel a como uma opo global, local ou de linha de comando. format_ est disponivel a ca str pode ser especicado convenientemente usando a funo GET_FORMAT(). ca Veja Veja Seo 6.3.4 [Date and time functions], Pgina 529. ca a DATETIME_FORMAT = format_str Determina como o servidor converte valores DATETIME para string. Esta varivel est dispon como uma opo global, local ou de linha de comando. a a ivel ca format_str pode ser especicada convenientemente usando a funo ca GET_FORMAT(). Veja Veja Seo 6.3.4 [Date and time functions], Pgina 529. ca a
462
INSERT_ID = # Congura o valor que ser usado pelo comando INSERT ou ALTER TABLE seguinte a ao inserir um valor AUTO_INCREMENT. Isto usado principalmente com o log de e atualizaes. co LAST_INSERT_ID = # Congura o valor a ser retornado de LAST_INSERT_ID(). Ele armazenado e no log de atualizaes quando voc utiliza LAST_INSERT_ID() em um comando co e que atualiza uma tabela. LOW_PRIORITY_UPDATES = 0 | 1 Se congurado com 1, todas instrues INSERT, UPDATE, DELETE e LOCK TABLE co WRITE iro esperar at que no existam SELECT ou LOCK TABLE READ pendentes a e a na tabela afetada. Esta opo era chamada SQL_LOW_PRIORITY_UPDATES. ca MAX_JOIN_SIZE = value | DEFAULT No permite que SELECTs que provavelmente necessitem examinar mais que a valor combinaes de registros. Congurando este valor, voc pode obter co e SELECTs onde chaves no so usadas corretamente e que provavelmente gastaro a a a um bom tempo. Congurando-o para um valor diferente do DEFAULT ir denir a o atributo SQL_BIG_SELECTS com o padro. Se voc congurar o atributo SQL_ a e BIG_SELECTS novamente, a varivel SQL_MAX_JOIN_SIZE ser ignorada. Voc a a e pode congurar um valor padro para esta varivel iniciando o mysqld com -O a a max_join_size=#. Esta opo era chamada SQL_MAX_JOIN_SIZE ca Note que se o resultado da consulta ja estiver na cache de consultas, o vericaio acima no ser feita. O MySQL ir enviar o resultado ao cliente. Uma ca a a a vez que o resultado da consulta j foi consultado e no ser responsabilidade a a a do servidor enviar o resultado ao cliente. PASSWORD = PASSWORD(alguma senha) Congura a senha para o usurio atual. Qualquer usurio que no seja annimo a a a o pode alterar sua prpria senha! o PASSWORD FOR user = PASSWORD(alguma senha) Congura a senha para um usurio espec a ico no servidor atual. Somente um usurio com acesso ao banco de dados mysql pode fazer isto. O usurio a a deve ser fornecido no formato usurio@home_maquina, onde usurio e nome_ a a mquina so exatamente o que esto listados nas colunas User e Host da tabela a a a mysql.user. Por exemplo, se voc possui uma entrada com os campos User e e Host com bob e %.loc.gov, voc escreveria: e mysql> SET PASSWORD FOR bob@%.loc.gov = PASSWORD(newpass); Que equivalente a: e 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 congurao da cache de consultas para esta thread. Set query cache ca setting for this thread.
463
Descrio ca No armazena ou recupera resultados. a 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 (padro) o ultimo registro inserido em uma tabela com um a regitro auto incremnto pode ser encontrado com a seguinte construo: WHERE ca auto_increment_column IS NULL. Isto usado por alguns programas ODBC e como o Access. SQL_BIG_SELECTS = 0 | 1 Se congurado com 0, o MySQL aborta as instrues SELECTs que provavelco mente levam muito tempo (isto , instrues para as quais o otimizador estima e co que o nmero de registros examinados provavelmente ir exceder o valor de u a MAX_JOIN_SIZE. Isto util quando uma instruo WHERE no aconselhada for e ca a utilizado. O valor padro para uma nova conexo 1 (que permitir qualquer a a e a instruo SELECT). ca Se voc denir MAX_JOIN_SIZE com um valor diferente de DEFAULT, SQL_BIG_ e SELECTS ser denida com 0. a SQL_BUFFER_RESULT = 0 | 1 SQL_BUFFER_RESULT fora para que o resultado das SELECTs seja colocado em c tabelas temporrias. Isto ir ajudar o MySQL a liberar mais cedos bloqueios a a de tabela e ajudaro em casos onde elas ocupam muito tempo para enviar o a conjunto de resultados para o cliente. SQL_SAFE_UPDATES = 0 | 1 Se congurado com 1, o MySQL ir aborar se tentarmos fazer um UPDATE a ou DELETE sem utilizar uma chave ou LIMIT na clusula WHERE. Desta forma a possivel capturar atualizaes erradas ao criarmos comandos SQL manuale co mente. SQL_SELECT_LIMIT = valor | DEFAULT O nmero mximo de registros para retornar de instrues SELECT. Se uma u a co SELECT tem uma clusula LIMIT, o LIMIT tem precedencia sobre o valor de a e SQL_SELECT_LIMIT. O valor padro para uma nova conexo unlimited (ilima a e itado). Se voc alterou o limite, o valor padro pode ser restaurado atribuindo e a o valor DEFAULT a SQL_SELECT_LIMIT. SQL_LOG_OFF = 0 | 1 Se congurado com 1, nenhum registro ser feito no log padro para este cliente, a a se o cliente tiver o privilgio SUPER. e SQL_LOG_BIN = 0 | 1 Se congurada com 0, nenhum registro feito no log binrio para o cliente, se e a o cliente tiver o privilgio SUPER. e
464
SQL_LOG_UPDATE = 0 | 1 Se congurado com 0, nenhum registro ser feito no log de atualizaes para a co o cliente, se o cliente tiver o privilgio SUPPER. Esta varivel est obsoleta a e a a partir da verso 5.0. a SQL_QUOTE_SHOW_CREATE = 0 | 1 Se congurado com 1, SHOW CREATE TABLE ir colocar os nomes de tabela e a colunas entre aspas. Est ligado por padro, para que replicao de tabelas a a ca com nomes de colunas estranhos funcione. Seo 4.6.8.8 [SHOW CREATE TABLE], ca Pgina 322. a TIMESTAMP = valor_timestamp | DEFAULT Congura a hora/data para este cliente. E usado para obter a hora e data original se voc utiliza o log de atualizaes para restaurar registros. valor_ e co timestamp deve ser um timestamp UNIX Epoch, no um timestamp MySQL. a TIME_FORMAT = format_str Determina como o servidor converte valores TIME para string. Esta varivel est a a dispon como uma opo global, local ou de linha de comando. format_str ivel ca pode ser especicada convenientemente usando a funo GET_FORMAT(). Veja ca Veja Seo 6.3.4 [Date and time functions], Pgina 529. ca a
465
Perceba que a diferena de velocidade para striping muito dependente c e dos parmetros. Dependendo de como voc congura os parmetros do a e a striping e do nmero de discos voc pode obter uma diferena de vrias u e c a ordens de grandeza. Note que voc deve escolher a otimizao randmica e ca o ou pelo acesso sequencial. Para conabilidade voc pode desejar utilizar RAID 0+1 (striping + espelhamento) e mas neste caso voc ir precisar de 2*N discos para armazenar N discos de dados. e a Isto provavelmente a melhor opo se voc possuir dinheiro! Voc pode tambm, e ca e e e entretanto, ter que investir em algum software gerenciador de volumes para lidar com isto ecientemente. Uma boa opo variar os n ca e iveis de RAID de acordo com a importncia do dado. a a Por exemplo, ter dados com alguma importncia que podem ser regenerados em um a armazenamento RAID 0 enquanto os dados realemtente importantes como informaes co de mquinas e logs em um sistema RAID 0+1 ou RAID de N discos. RAID N pode a ser um problema se voc tem vrias escritas devido ao tempo para atualizar os bits de e a paridade. No Linux, voc pode obter um desempenho muito melhor (cerca de 100% sobre carga e pode ser comum) utilizando hdparm para congurar sua interface de disco! O exemplo a seguir deve ser muito util para o MySQL (e provavelmente vrias outras aplicaes): a co hdparm -m 16 -d 1 Perceba que o desempenho e conana ao utilizar o exemplo acima depende de seu c hardware, portanto ns sugerimos que voc teste bem seu sistema depois de utilizar o e hdparm! Por favor consulte a pgina do manual (man) do hdparm para maiores ina formaes! Se o hdparm no for usado corretamente, poder resultar em corrupo do co a a ca sistema de arquivos, assim realize backups de tudo antes de experimentar! Voc pode tambm congurar os parmetros para o sistema de arquivos que o banco e e a de dados usa: Se voc no precisa saber quando os arquivos foram acessados pela ultima vez e a (o que realmente util em um servidor de banco de dados), voc pode montar e e o seu sistema de arquivos com a opo -o noatime. Isto faz com que ele evite a ca atualizao do ultimo tempo de acesso no inode e com isto tambm evita algumas ca e buscas em disco. Em vrios sistemas operacionais os discos podem ser montados com a opo async a ca para congurar o sistema de arquivos a ser atualizado de modo ass incrono. Se o seu computador razoavelmente estvel, isto deve fornecer mais desempenho sem e a sacricar a segurana. (Esta opo ligada por padro no Linux.) c ca e a
466
A maneira recomendada de se fazer isto ligar simbolicamente bancos de dados a discos e diferentes e s ligar tabelas como ultimo recurso. o
467
No diretrio de dados voc sempre ter o arquivo de denies das tabelas e os arquivos o e a co de indice e o arquivo de dados. O arquivo de dados e o arquivo de indice podem ser movidos para qualquer lugar e substituidos no diretorio de dados pelos links simblicos. o O arquivo de denio no pode. ca a Voc pode ligar simbolicamente o arquivo e indice e o arquivo de dados para diretrios o diferentes, independente do outro arquivo. A ligao pode ser feita partir do sistema operacional (se o mysqld no estiver em exca a ecuo) ou usando as opes DATA DIRECTORY ou INDEX DIRECTORY em CREATE TABLE. ca co Veja Seo 6.5.3 [CREATE TABLE], Pgina 598. ca a myisamchk no ir substituir um link simblico pelo a a o indice/arquivo. Ele funciona diretamente nos arquivos apontados pelos links simblicos. Qualquer arquivo temporrio o a ser criado no mesmo diretrio que o arquivo de dados/indice est. a o a Quando voc remove uma tabela que est usando links simblicos, o link e o arquivo e a o para o qual ela aponta so apagados. Esta uma boa razo pela qual voc n~o deve a e a e a executar mysqld como root e no deve permitir que pessoas tenham acesso de escrita a ao diretrios de bancos de dados do MySQL. o Se voc renomear uma tabela com ALTER TABLE RENAME e no deseja alterar o banco de e a dados, o link simblico para o diretrio de banco de dados ser renomeada corretamente. o o a Se voc utiliza ALTER TABLE RENAME para mover uma tabela para outro banco de dados, e ento a tabela ser movida para outro diretrio de banco de dados e os links simblicos a a o o antigos e os arquivos para os quais eles apontam sero removidos. a Se voc no utiliza links simblicos, voc deve usar a opo --skip-symlink do mysqld e a o e ca para garantir que ningum pode usar mysqld para apagar ou renomear um arquivo fora e do diretrio de dados. o O que ainda no suportado: a e ALTER TABLE ignora todas as opes de tabela DATA DIRECTORY e INDEX DIRECTORY. co SHOW CREATE TABLE no relata se a tabela possui links simblicos antes do MySQL a o 4.0.15. Isto tambm verdade para mysqldump que usa SHOW CREATE TABLE para gerar e e instrues CREATE TABLE. co BACKUP TABLE e RESTORE TABLE no respeitam links simblicos. a o O arquivo frm nunca deve ser um link simblico (como dito anteriormente, apenas o os dados e indices podem ser links simblicos). Fazer isto (por exemplo para fazer o sinnimos), produzir resultados errados. Suponha que voc tenha um banco de dados o a e db1 sob o diretrio de dados do MySQL, uma tabela tbl1 neste banco de dados e voc o e faa um link simblico tbl2 no diretrio db1 que aponmta para tbl1: c o o shell> shell> shell> shell> cd ln ln ln /path/to/datadir/db1 -s tbl1.frm tbl2.frm -s tbl1.MYD tbl2.MYD -s tbl1.MYI tbl2.MYI
Agora se uma thread l db1.tbl1 e outra thread atualiza db1.tbl2, haver problee a mas: a cache de consultas ser enganada (ela acreditar que tbl1 no foi atualizado e a a a retornar resultados desatualizados), o comando ALTER em tbl2 tambm ir falhar. a e a
468
469
6.1.1.1 Strings
Uma string uma sequncia de caracteres, cercada por caracteres de aspas simples () e e ou duplas (") (Se voc utiliza o modo ANSI deve utilizar somente as aspas simples). e Exemplos: uma string "outra string" Em uma string, certas sequncias tem um signicado especial. Cada uma destas sequncias e e comeam com uma barra invertida (\), conhecida como caracter de escape. O MySQL c reconhece a seguinte sequncia de escape: e \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 tabulao. ca 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 causar problemas se voc tentar usar a e mysql banco_dados < nome_arquivo). O caracter de barra invertida (\) character. Um caracter %. Ele pode ser usado para pesquisar por instncias literais de % a em contextos onde % deve, de outra maneira, ser interpretado como um meta caracter. Veja Seo 6.3.2.1 [Funes de comparaes de string], Pgina 519. ca co co a
\\ \%
470
\_
Um caracter _. Ele usado para pesquisar por instncias literais de _ em e a contextos onde _ deve, de outra maneira, ser intrerpretado como um meta caracter. Veja Seo 6.3.2.1 [Funes de comparaes de string], Pgina 519. ca co co a
Note que se voc utilizar \% ou \_ em alguns contextos de strings, eles retornaro as e a strings \% e \_ e no % e _. a Estas so as vrias maneiras de incluir aspas com uma string: a a Um dentro de uma string com pode ser escrita como . Um " dentro de uma string com " pode ser escrita como "". Voc pode preceder o caracter de aspas com um caracter de escape (\). e Um dentro de uma string com " no precisa de tratamento especial e no precisa a a ser duplicada ou utilizada com caracter de escape. Da mesma maneira, " dentro de uma string com no necessita de tratamento especial. a As instrues SELECT exibidas abaixo demonstram como citaes e escapes funcionam: co co 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 deseja inserir dados binrios em uma coluna BLOB, os caracteres a seguir devem ser e a representados por sequncias de espace: e NUL \ " ASCII 0. Voc deve represent-lo como \0 (uma barra invertida e um caractere e a 0). ASCII 92, barra invertida. Representado como \\. ASCII 39, aspas simples. Representado como \. ASCII 34, aspas duplas. Representado como \".
Se voc escreve cdigo C, voc pode utilizar a funo da API C mysql_escape_string() e o e ca para caracteres de escape para a instruo INSERT. Veja Seo 12.1.2 [Viso geral da ca ca a funo API C], Pgina 778. No Perl, pode ser utilizado o mtodo quote do pacote DBI ca a e para converter caracteres especiais para as sequncias de escape corretas. Veja Seo 12.5.2 e ca [Classe DBI do Perl], Pgina 881. a
471
Deve ser utilizada uma funo de escape em qualquer string que contm qualquer um dos ca e caracteres especiais listados acima! Alternativamente, muitas APIs do MySQL fornecem algumas da capacidades de placeholder que permitem que voc insira marcadores especiais em um string de consulta e ento ligar e a os valores dos dados a eles quando voc executa a consulta. Neste caso, a API inclui, e automaticamente, os caracteres especiais de escape nos valores para voc. e
6.1.1.2 N meros u
Inteiros so representados como uma sequncia de d a e igitos. Nmeros de ponto utuante u utilizam . como um separador decimal. Ambos os tipos devem ser precedidos por - para indicar um valor negativo. Exemplos de inteiros vlidos: a 1221 0 -32 Exemplo de nmeros de ponto utuante vlidos: u a 294.42 -32032.6809e+10 148.00 Um inteiro pode ser usado em um contexto de ponto utuante; ele interpretado como o e de ponto utuante equivalente. A partir da verso 4.1.0, a constante TRUE avaliada com 1 e FALSE avaliada com 0. a e e
472
Note que em adio ao mostrado acima, voc no pode ter ASCII(0) ou ASCII(255) ou o ca e a caracter de citao (aspas) em um identicador. ca Se o identicador uma palavra restrita ou contm caracteres especiais voc deve sempre e e e coloc-lo entre ao us-lo: a a mysql> SELECT * FROM select WHERE select.id > 100; Veja Seo 6.1.7 [Reserved words], Pgina 479. ca a Se voc estiver executando o MySQL no modo MAXDB ou ANSI_QUOTES, ele tambm pode e e 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 Seo 4.1.1 [Command-line options], Pgina 207. ca a Em verses do MySQL anteriores a 3.23.6, as regras se nomes eram as seguintes: o Um nome pode consistir de caracteres alfanumricos do conjunto atual de caractres e e tambm _ e $. O conjunto de caracteres padro o ISO-8859-1 Latin1; e pode e a e ser alterado com a opo --default-character-set no mysqld. Veja Seo 4.7.1 ca ca [Conjunto de caracteres], Pgina 325. a
473
Um nome pode iniciar com qualquer caractere que legal no nome. Em particular, e pode iniciar com um nmero (isto difere de vrios outros sistemas de bancos de dados!). u a Entretanto um nome no pode consistir somente de nmeros. a u O caractere . no pode ser utilizado em nomes porque ele usado para extender o a e formato pelo qual voc pode fazer referncias a colunas (veja abaixo). e e E recomendado que voc no utilize nomes como 1e, porque uma expresso como 1e+1 e a a e ambigua. Ela pode ser interpretada como a expresso 1e + 1 ou como o nmero 1e+1. a u No MySQL voc pode se referir a uma coluna utilizando uma das formas seguintes: e 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 dispon e ivel no MySQL Verso 3.22 ou posterior. a nome_coluna Uma coluna que uma palavra chave ou contem carace teres especiais. Voc no precisa especicar um prexo de nome_tabela ou nome_bd.nome_tabela para e a uma referncia de coluna em uma instruo, a menos que a referncia seja amb e ca e igua. Por exemplo, suponha que cada tabela t1 e t2 contenham uma coluna c, e voc deve recuperar e c em uma instruo SELECT que utiliza ambas tabelas t1 e t2. Neste caso, c amb ca e iguo porque ele no unico entre as tabelas usadas na instruo, portanto deve ser indicado qual a e ca a tabela que se deseja escrever, t1.c ou t2.c. De mesma forma, se voc for recuperar de e e uma tabela t em um banco de dados db1 e uma tabela t em um banco de dados db2, voc e deve se refererir `s colunas nestas tabelas como db1.t.nome_campo e db2.t.nome_campo. a A sintaxe .nome_tabela indica a tabela nome_tabela no banco de dados atual. Esta sintaxe aceitada para compatibilidade ODBC, porque alguns programas ODBC prexam e os nomes das tabelas com um caracter .. Coluna de referncia e nome_campo
474
Aliases nas tabelas so caso sensitivo. A consulta seguinte no deve funcionar porque ela a a faz referncia ao alias como a e como A. e mysql> SELECT nome_campo FROM nome_tabela AS a WHERE a.nome_campo = 1 OR A.nome_campo = 2; Se voc tem um problema para lembrar o caso usado para os nomes de tabelas, adote uma e conveno consistente, como sempre criar bancos de dados e tabelas utilizando nomes em ca minsculas. u Uma maneira para evitar este problema iniciar o mysqld com -O lower_case_nome_ e tabelas=1. Por padro esta opo 1 no Windows e 0 no Unix. a ca e Se lower_case_nome_tabelas for 1, o MySQL ir converte todos os nomes de tabelas para a minsculo no armazenamento e pesquisa. (A partir da verso 4.0.2, esta opo tambm u a ca e se aplica ao nome do banco de dados. A partir da 4.1.1 isto tambm se aplica a alias de e tabelas). Perceba que se voc alterar esta opo, ser necessrio converter primeiramente e ca a a seus nomes de tabelas antigos para minsculo antes de iniciar o mysqld. u Se voc mover os arquivos MyISAM do Windows pare o Unix, voc pode, em alguns casos, e e precisar usar a ferramenta mysql_fix_extensions para corrigir o caso ad extenso do a arquivo em cada diretrio de banco de dados espec o ico (.frm em letra minscula, .MYI e u .MYD em letras maisculas). mysql_fix_extensions pode ser encontado no subdiretrio u o scripts.
475
Variveis de usurios devem ser utilizadas em expresses onde so permitidas. Isto no a a o a a inclui utiliza-las em contextos onde um nmero explicitamente necessrio, assim como u e a na clusula LIMIT de uma instruo SELECT ou a clausula IGNORE number LINES de uma a ca instruo LOAD DATA. ca NOTE: Em uma instruo SELECT , cada expresso s avaliada quando enviada ao cliente. ca a oe Isto signica que nas clusula HAVING, GROUP BY, ou ORDER BY, voc no pode fazer referncia a e a e a uma expreeso que envolve variveis que so conguradas na instruo SELECT. Por a a a ca examplo, a seguinte instruo NAO funcionar como o esperado: ca a SELECT (@aa:=id) AS a, (@aa+3) AS b FROM nome_tabela HAVING b=5; A razo que o @aa no ir conter o valor da linha atual, mas o valor da id da linha a e a a previamente aceita. A regra geral nunca atribuir e usar a mesma varivel na mesma instruo. e a ca Outra questo com congurar uma varivel e us-la na mesma instruo que o tipo do a a a ca e resultado padro de uma varivel baseada no tipo da varivel no in a a e a icio da instruo. ca (Assume-se que uma varivel no atribu possui o valor NULL e do tipo STRING). O a a ida e seguitne exemplo ilustra isto: mysql> SET @a="test"; mysql> SELECT @a,(@a:=20) FROM table_name; Neste caso o MySQL relatar ao cliente que a coluna 1 uma string e converte todos os a e acessos de @a a strings, mesmo que @a seja congurada com um nmero para a segunda u linha. Depois que a instruo executada @a ser considerado como um nmero. ca e a u Se voc tiver qualquer problema com isto, evite tanto congurar e usar a mesma varivel e a na mesma instruo ou congurar a varivel com 0, 0.0 ou "" antes de us-la. ca a a
476
SET SESSION sort_buffer_size=valor; SET @@session.sort_buffer_size=valor; SET sort_buffer_size=valor; Se voc no especicar GLOBAL ou SESSION ento ser usado SESSION. Veja Seo 5.5.6 e a a a ca [SET OPTION], Pgina 460. a LOCAL um sinnimo para SESSION. e o Para recuperar o valor de uma varivel GLOBAL voc pode usar um dos seguintes comandos: a e SELECT @@global.sort_buffer_size; SHOW GLOBAL VARIABLES like sort_buffer_size; Para retornar o valor de uma varivel SESSION voc pode usar um dos seguintes comandos: a e SELECT @@session.sort_buffer_size; SHOW SESSION VARIABLES like sort_buffer_size; Quando voc retorna o valor de uma carivel com a sintaxe @@nome_varivel e voc e a a e no especicar GLOBAL ou SESSION ento o MySQL retornar o valor espec a a a ico da thread (SESSION), se ele existir. Se no, o MySQL retornar o valor global. a a A razo da exigncia de GLOBAL apenas para denir a varivel GLOBAL, mas no para recua e a a per-la e assegurar que no criemos problemas posteriormente ao introduzirmos um varivel a a a especica da thread com o mesmo nome ou remover uma varivel especica da thread. Neste a caso, voc pode acidentalmente alterar o estado do servidor como um todo, e no apenas e a em sua conexo. a A seguir apresentamos uma lista completa de todas as variveis que altera e recupera se a voc pode usar GLOBAL ou SESSION com elas. e Nome Varivel a 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
| |
| | |
Variveis marcadas com num podem ter um valor numrico. Variveis marcadas com bool a e a podem ser denidas com 0, 1, ON ou OFF. Variveis do tipo enum devem, normalmente, ser a atribu idas com um dos valores dispon iveis para a varivel, mas podem tambm ser denidas a e com o nmero correspondente ao valor enum. (O primeiro valor enum 0). u e Aqui est uma descrio de algumas das variveis: a ca a Variveis a identity sql low priority updates sql max join size version Descrio ca 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 descrio da outra denio de tabela pode ser encontrada na seo de opes de ca ca ca co inicializao, na descrio de SHOW VARIABLES e na seo SET. Veja Seo 4.1.1 [Opes de ca ca ca ca co linha de comando], Pgina 207. Veja Seo 4.6.8.4 [SHOW VARIABLES], Pgina 309. Veja a ca a Seo 5.5.6 [SET OPTION], Pgina 460. ca a
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) no so permitidos pelo SQL-99 mas permitidos a a pelo MySQL como nome de campos/tabelas. Isto ocorre porque alguns destes nomes so a muito naturais e vrios pessoas j o utilizaram. a a ACTION BIT DATE ENUM NO TEXT TIME TIMESTAMP
482
Colchetes ([ and ]) indicam partes de tipos espec icos que so opicionais a Note que se voc especicar ZEROFILL para um campo MySQL automaticamente ir adie a cionar o atributo UNSIGNED ao campo. Aviso: voc deve estar ciente de que quando zer uma subtrao entre valores inteiros, e ca onde um deles do tipo UNSIGNED, o resultado ser sem sinal! Veja Seo 6.3.5 [Funes de e a ca co coero], Pgina 544. ca a TINYINT[(M)] [UNSIGNED] [ZEROFILL] Um inteiro muito pequeno. A faixa deste inteiro com sinal de -128 at 127. e e A faixa sem sinal de 0 at 255. e e BIT BOOL BOOLEAN
Estes so sinnimos para TINYINT(1). a o O sinnimo BOOLEAN foi adicionado na verso 4.1.0. o a Um tipo boolean verdadeiro ser introduzido de acordo com o SQL-99. a
SMALLINT[(M)] [UNSIGNED] [ZEROFILL] Um inteiro pequeno. A faixa do inteiro com sinal de -32768 at 32767. A e e faixa sem sinal de 0 a 65535. e MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] Um inteiro de tamanho mdio. A faica com sinal de -8388608 a 8388607. A e e faixa sem sinal de 0 to 16777215. e INT[(M)] [UNSIGNED] [ZEROFILL] Um inteiro de tamanho normal. A faixa com sinal de -2147483648 a e 2147483647. A faixa sem sinal de 0 a 4294967295. e INTEGER[(M)] [UNSIGNED] [ZEROFILL] Este um sinnimo para INT. e o
483
BIGINT[(M)] [UNSIGNED] [ZEROFILL] Um inteiro grande. A faixa com sinal de -9223372036854775808 a e 9223372036854775807. A faixa sem sinal de 0 a 18446744073709551615. e Existem algumas coisas sobre campos BIGINT sobre as quias voc deve estar e ciente: Todas as operaes aritimticas so feitas usando valores BIGINT ou co e a DOUBLE com sinal, no devemos utilizar inteiros sem sinal maiores que a c 9223372036854775807 (63 bits) exceto com funes ded bit! Se voc zer co e isto, alguns dos ultimos digitos no resultado podem estar errados por causa de erros de arredondamento na converso de BIGINT para DOUBLE. a 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 so a inteiros. Voc pode armazenar valores inteiro exatos em um campo BIGINT e aramzenando-os como string, como ocorre nestes casos no haver a a nenhuma representao intermediaria dupla. ca -, +, e * sero utilizados em clculos aritimticos BIGINT quando ambos a a e os argumentos forem valores do tipo INTEGER! Isto signica que se voc e multilicar dois inteiros grandes (ou obter resultados de funes que retorco nam inteiros) voc pode obter resultados inesperados quando o resultado e for maior que 9223372036854775807. FLOAT(precis~o) [UNSIGNED] [ZEROFILL] a Um nmero de ponto utuante. No pode ser sem sinal. precis~o pode ser u a a <=24 para um nmero de ponto utuante de preciso simples e entre 25 e 53 u a para um nmero de ponto utuante de dupla-preciso. Estes tipos so como os u a a 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 nmero u de casas decimais indenido. e Na verso 3.23 do MySQL, este um verdadeiro valor de ponto utuante. Em a e verses anteriores , FLOAT(precis~o) sempre tem 2 casas decimais. o a Note que o uso de FLOAT pode trazer alguns problemas inesperados como nos clculos j que em MySQL todos so feitos com dupla-preciso. Veja a a a a Seo A.5.6 [Registros sem correspondentes], Pgina 934. ca a Esta sintaxe fornecida para comptibilidade com ODBC. e FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] Um nmero de ponto utuante pequeno (preciso simples). Os valores u a permitidos esto entre -3.402823466E+38 e -1.175494351E-38, 0 e entre a 1.175494351E-38 e 3.402823466E+38. Se UNSIGNED for especicado, valores negativos no so permitidos O M a largura do display e o D o nmero de a a e e u
484
casas decimais. FLOAT sem um argumento ou FLOAT(X) onde X <=24 tende a um nmero de ponto utuante de preciso simples. u a DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] Um nmero de ponto utuante de tamanho normal (dupla-preciso). u a Valores permitidos esto a entre -1.7976931348623157E+308 e -2.2250738585072014E-308, 0 e entre 2.2250738585072014E-308 e 1.7976931348623157E+308. Se UNSIGNED for especicado, valores negativos no so permitidos. O M a largura do display e o D nmero de casa a a e e u decimais. DOUBLE sem argumento ou FLOAT(X) onde 25 <= X <= 53 so a nmeros de ponto utuante de dupla-preciso. u a DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL] REAL[(M,D)] [UNSIGNED] [ZEROFILL] Estes so sinnimos para DOUBLE. a o DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL] Um nmero de ponto utuante no empacotado. Se comporta como um campo u a CHAR: no empacotado signica que o nmero armazenado como uma string, a u e usando um caracter para cada digito do valor. O ponto decimal e, para nmeros u negativos, o sinal de menos (-), no so contados em M (mas reservado espao a a e c para isto). Se D for 0, os valores no tero ponto decimal ou parte fracionria. a a a A faixa mxima do valor DECIMAL a mesma do DOUBLE, mas a faixa atual para a e um campo DECIMAL dado pode ser limitado pela escolha de M e D. Se UNSIGNED especicado, valores negativos no so permitidos. e a a Se D no for denido ser considerado como 0. Se M no for denido consida a a e erado como 10. Note que antes da verso 3.23 do MySQL o argumento M deve incluir o espao a c necessrio para o sinal o ponto decimal. a e DEC[(M[,D])] [UNSIGNED] [ZEROFILL] NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL] FIXED[(M[,D])] [UNSIGNED] [ZEROFILL] Este um sinnimo para DECIMAL. e o O alias FIXED foi adicionado na verso 4.1.0 para compatibilidade com outros a servidores. DATE Uma data. A faixa suportada entre 1000-01-01 e 9999-12-31. e MySQL mostra valores DATE no formato AAAA-MM-DD, mas permite a voc a e atribuir valores a campos DATE utilizando tanto strings quanto nmeros. Veja u Seo 6.2.2.2 [DATETIME], Pgina 491. ca a DATETIME Um combinao de hora e data. A faixa suportada entre 1000-01-01 ca e 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 que atribuir valores a e campos DATETIME utilizado strings ou nmeros. Veja Seo 6.2.2.2 [DATEu ca TIME], Pgina 491. a
485
TIMESTAMP[(M)] Um timestamp. A faixa entre 1970-01-01 00:00:00 e algum momento no e ano 2037. No MySQL 4.0 ou anteriores, os valores TIMESTAMP so exibidos nos formatos a YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, ou YYMMDD, dependendo se M 14 e (ou no denido), 12, 8 ou 6, mas permite a voc atribuir valores ao campo a e TIMESTAMP usando strings ou nmeros. u Um campo TIMESTAMP util para gravar a data e a hora em uma operao e ca de INSERT or UPDATE porque automaticamente denido a data e a hora da e operao mais recente se voc prprio no especicar um valor. Voc tambm ca e o a e e pode denir a data e a hora atual atribuindo ao campo um valor NULL. Veja Seo 6.2.2 [Tipos de hora e data], Pgina 489. ca a Desde o MySQL 4.1, TIMESTAMP retornado com um string com o formato e YYYY-MM-DD HH:MM:SS. Se voc deseja t-lo como um nmero voc deve e e u e adcionar +0 a coluna timestamp. Teimestamp de tamanhos diferentes no so a a supoortados. Desde a verso 4.0.12, a opo --new pode ser usada para fazer a ca o servidor se comportar como na vers`o 4.1. a Um TIMESTAMP sempre armazenado em 4 bytes. O argumento M s afeta como e o a coluna TIMESTAMP exibida. e Note que colunas do tipo TIMESTAMP(M) columns onde M 8 ou 14 so apree a sentadas como nmeros enquanto as outras colunas TIMESTAMP(M) so strings. u a Isto apenas para assegurar que podemos eliminar e restaurar com segurana e c tabelas com estes tipos! Veja Seo 6.2.2.2 [DATETIME], Pgina 491. ca a TIME Uma hora. A faixa entre -838:59:59 e 838:59:59. MySQL mostra e valores TIME no formato HH:MM:SS, mas permite a voc atribuir valores e para as colunas TIME usando strings ou nmeros. Veja Seo 6.2.2.3 [TIME], u ca Pgina 495. a YEAR[(2|4)] Um ano no formato de 2 ou 4 digitos (padro so 4 digitos). Os valores pera a mitidos esto entre 1901 e 2155, 0000 no formato de 4 digitos, e 1970-2069 a se voc estiver usando o formato de 2 digitos (70-69). MySQL mostra valores e YEAR no formato YYYY, mas permie atribuir valores aos campos do tipo YEAR usando strings ou nmeros. (O tipo YEAR novo na verso 3.22 do MySL). Veja u e a Seo 6.2.2.4 [YEAR], Pgina 496. ca a [NATIONAL] CHAR(M) [BINARY | ASCII | UNICODE] Uma string de tamanho xo que sempre preenchida a direita com espaos at o e c e tamanho especicado quando armazenado. A faixa de M de 1 a 255 caracteres. e Espaos extras so removidos quando o valor recuperado. Valores CHAR so c a e a ordenados e comparados no modo caso insensitivo de acordo com o conjunto de caracteres padro, a menos que a palavra chave BINARY seja utilizada. a A partir da verso 4.1.0, se o valor M especicado maio que 255, o tipo de a e coluna convertido para TEXT. Este um recurso de compatibilidade. e e
486
NATIONAL CHAR (ou em sua forma reduzida NCHAR) o modo SQL-99 de denir e que um campo CHAR deve usar o conjunto CHARACTER padro. Este o a e padro no MySQL. a CHAR uma simplicao para CHARACTER. e ca A partir da verso 4.1.0, o atributo ASCII pode ser especicado o que atribui o a conjunto de caracteres latin1 a coluna CHAR. A partir da verso 4.1.1, o atributo UNICODE pode ser especicado o que atribui a o conjunto de caracteres ucs2 a coluna CHAR. O MySQL lhe permite criar um campo do tipo CHAR(0).Isto muito util quando e voc precisa de comptibilidade com aplicativos antigos que dependem da exe istncia de uma coluna, mas que, na verdade, no utiliza um valor. Isto tambm e a e muito bom quando voc precisa de uma coluna que s pode receber 2 valores. e e o Um CHAR(0), que no denido como um NOT NULL, s ir ocupar um bit e a e o a pode assumir 2 valores: NULL or "". Veja Seo 6.2.3.1 [CHAR], Pgina 497. ca a BIT BOOL CHAR This is a synonym for CHAR(1).
[NATIONAL] VARCHAR(M) [BINARY] Uma string de tamanho varivel. NOTA: Espaos extras so removidos quando a c a o caracter armazenado (o que difere da especicao ANSI SQL). A faixa de e ca M de 1 a 255 characters. Valores VARCHAR so ordenados e comparados no e a modo caso insensitivo a menos que a palavra chave BINARY seja utilizada. Veja Seo 6.5.3.1 [Silent column changes], Pgina 607. ca a A partir da verso 4.1.0, se o valor M especicado maio que 255, o tipo de a e coluna convertido para TEXT. Este um recurso de compatibilidade. e e VARCHAR uma simplicao para CHARACTER VARYING. Veja Seo 6.2.3.1 e ca ca [CHAR], Pgina 497. a TINYBLOB TINYTEXT Um campo BLOB ou TEXT com tamanho mximo de 255 (2^8 - 1) caracteres. a Veja Seo 6.5.3.1 [Silent column changes], Pgina 607. Veja Seo 6.2.3.2 ca a ca [BLOB], Pgina 498. a BLOB TEXT Um campo BLOB ou TEXT com tamanho mximo de 65535 (2^16 - 1) caracteres. a Veja Seo 6.5.3.1 [Silent column changes], Pgina 607. Veja Seo 6.2.3.2 ca a ca [BLOB], Pgina 498. a MEDIUMBLOB MEDIUMTEXT Um campo BLOB ou TEXT com tamanho mximo de 16777215 (2^24 - 1) caraca teres. Veja Seo 6.5.3.1 [Silent column changes], Pgina 607. Veja Seo 6.2.3.2 ca a ca [BLOB], Pgina 498. a
487
LONGBLOB LONGTEXT Um campo BLOB ou TEXT com tamanho mximo de 4294967295 ou 4G (2^32 a - 1) caracteres. Veja Seo 6.5.3.1 [Silent column changes], Pgina 607. Veja ca a Seo 6.2.3.2 [BLOB], Pgina 498. At a verso 3.23 o protocolo cliente/servidor ca a e a e tabelas MyISAM tinham um limite de 16M por pacote de transmisso/registro a de tabela, a partir da verso 4.x o tamanho mximo permitido das colunas a a LONGTEXT ou LONGBLOB depende do tamanho mximo congurado para o paa cote no protocolo cliente/servidor e da memria dispon o ivel. Veja Seo 6.2.3.2 ca [BLOB], Pgina 498. a ENUM(valor1,valor2,...) Uma enumerao. Um objeto string que s pode ter um valor, selecionado da ca o lista de valores valor1, valor2, ..., NULL ou valor especial de erro "". Um ENUM pode ter um mximo de 65535 valores diferentes. Veja Seo 6.2.3.3 a ca [ENUM], Pgina 499. a 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 64 membros. Veja Seo 6.2.3.4 [SET], Pgina 500. e ca a
488
Valores DECIMAL e NUMERIC so armazenados como strings, ao invs de um nmero de pontoa e u utuante binrio, para preservar o preciso decimal destes valores. Um caracter usado a a e para cada digito, para o ponto decimal (se escala > 0), e para o sinal - (para nmeros u negativos). Se escala 0, valores DECIMAL e NUMERIC no contm ponto decimal ou parte e a e fracionria. a A faixa mxima dos valores DECIMAL e NUMERIC o mesmo do DOUBLE, mas a faixa real para a e um campo DECIMAL or NUMERIC pode ser limitado pela precis~o ou pela escala para uma a dada coluna. Quando atribu a uma coluna um valor com mais digitos aps o ponto e ido o decimal do que o permitido especicado na escala, o valor arredondado para aquela e escala. Quando atribuido um valor a uma coluna DECIMAL ou NUMERIC o qual excede a e faixa determinada pelas precis~o e escala especicada (ou padro), MySQL armazena o a a valor correspondente ao nal daquela faixa. Como uma extenso do padro ANSI/ISO SQL92, MySQL tambm suporta os tipos ina a e tegrais TINYINT, MEDIUMINT, e BIGINT como listado nas tabelas abaixo. Outra extenso a suportada pelo MySQL especicar, opcionalmente, o tamanho do display de um valor e inteiro entre parenteses seguindo o nome do tipo (por exemplo, INT(4)). Esta especicao ca opcional do tamanho usada para preenchimento a esquerda do display de valores cujo e tamanho menor que o especicado para a coluna, mas no limita a faixa de valores que e a podem ser armazendos na coluna, nem o nmero de d u igitos que sero mostrados para vala ores que excederem o tamanho especicado na coluna. Quando usados em conjunto com o atributo opcional de extenso ZEROFILL, o padro do preenchimento de espaos a substia a c e tuio por zeros. Por exemplo, para uma coluna declarada com INT(5) ZEROFILL, o valor ca 4 retornado como 00004. Note que se voc armazenar valores maiores que a largura do e e display em um coluna do tipo inteiro, voc pode ter problemas quando o MySQL gerar e tabelas temporrias para algum join complicado, j que nestes casos o MySQL acredita que a a os dados cabem na largura original da coluna. Todos os tipos inteiros podem ter um atributo opcional (no-padro) UNSIGNED. Valores a a sem sinal podem ser usados quando voc permite apenas nmeros positivos em uma coluna e u e voc precisa de uma faixa de valores um pouco maior para a coluna. e Desde o MySQL 4.0.2, tipos de ponto utuante tambm podem ser sem sinal (UNSIGNED). e Como no tipos inteiros, este atributoprevine que valores negativos sejam armazenados na coluna. Ao contrrio dos tipos negativos, o valor mximo da faixa permitida permanece o a a mesmo. O tipo FLOAT usado para representar tipos de dados numricos aproximados. O padro e e a SQL-92 permite uma especicao opcional da preciso (mas no da faixa do expoente) em ca a a bits, aps a a palavra FLOAT e entre parenteses. A implementao MySQL tambm suporta o ca e esta especicao opcional de preciso. Quando FLOAT usada para uma tipo de coluna ca a e sem especicao de preciso, MySQL utiliza quatro bytes para armazenar os valores. Uma ca a sintaxe variante tambm suportada, com dois numeros entre parenteses aps a palavra e e o FLOAT. Com esta opo, o primeiro nmero continua a representar a quantidade de bytes ca u necessria para armazenar o valor, e o segundo nmero especica o nmero de d a u u igitos a serem armazenados e mostrados aps o ponto decimal (como com DECIMAL e NUMERIC). o Quando pedido ao MySQL para armazenar um nmero em uma coluna com mais digitos e u decimais aps o ponto decimal que o especicado para esta coluna, o valor arredondado o e eliminando os digitos extras quando armazenado.
489
Os tipos REAL e DOUBLE PRECISION no aceitam especicaes de preciso. Como uma a co a extenso do padro SQL-92, o MySQL reconhece DOUBLE como um sinnimo para o tipo a a o DOUBLE PRECISION. Em constraste com a exigencia do padro de que a preciso do tipo a a REAL seja menor que aquele usado pelo DOUBLE PRECISION, MySQL implementa ambos como valores de ponto utuante de 8 bits de dupla preciso (quando no estiver executando a a em modo ANSI). Para uma portabilidade mxima, cdigos que requerem armazenamento a o de valores de dados numricos aproximados usam FLOAT ou DOUBLE PRECISION sem especie cao de preciso ou de numeros decimais. ca a Quando solicitado a armazenar um valor em uma coluna numrica que est fora da faixa e a 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 de -2147483648 a 2147483647. Se voc tentar e e inserir -9999999999 em uma coluna INT, o valor ajustado para o limite mais baixo da e faixa de valores e -2147483648 armazenado. Da mesma forma, se voc tentar inserir e e 9999999999, 2147483647 ser armazenado. a Se o campo INT UNSIGNED, o tamanho da faixa do campo o mesmo mas o limite passa e e a ser de 0 a 4294967295. Se voc tentar armazenar -9999999999 e 9999999999, os valores e armazenados na coluna sero 0 e 4294967296. a Converses que ocorrem devido a ajustes so relatados como avisos para ALTER TABLE, o a LOAD DATA INFILE, UPDATE, e instrues INSERT multi-registros. co 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 especica um valor a ser atribuido ou comparado a um tipo de e data ou hora). No entanto, s os formatos descritos na seo seguinte so suportados. E o ca a esperado que voc fornea valores permitidos. Resultados imprevisiveis podem ocorrer e c se voc usar outros formatos. e 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-ms-dia (por exemplo, 98-09-04), ao invs das ordens mais e e usadas ms-dia-ano ou dia-ms-ano (por exemplo: 09-04-98, 04-09-98). e e MySQL converte automaticamente um tipo de data ou hora em um nmero se o valor u usado em um contexto numrico, e vice-versa. e e Quando o MySQL encontra um valor para um tipo de data ou hora que est fora da a desta seo), ele converte o valor faixa permitida ou ilegal neste tipo (veja o inicio e ca para zero. (A exceo ocorre no campo TIME, onde o valor fora da faixa ajustado ca e 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 so especiais, mas voc pode armazenar ou fazer referncia a eles a e e explicitamente usando os valores mostrados na tabela. Voc tambm pode fazer into e e usando 0 ou 0, o que mais fcil de escrever. e a Valores zero para data ou hora usados em MyODBC so convertidos automaticaa mente para NULL na verso 2.50.12 MyODBC e acima, porque ODBC no pode tratar a a tais valores.
491
Note tembm que algumas funes com MIN() e MAX() iro converter TIMESTAMP/DATE e co a para um nmero. Isto signica que um timestamp com ano de 2 digitos no ir funcionar u a a corretamente com estas funes. A soluo neste caso converter o TIMESTAMP/DATE para co ca e um formato de ano de 4 digitos ou usar algo como MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS)).
492
Outras colunas TIMESTAMP, alm da primeira podem ser denidas com a data e hora atuais. e Basta deni-las com NULL ou NOW() Voc pode denir colunas TIMESTAMP com um valor diferente da data e hora atuais colocando e explicitamente o valor desejado. Isto verdade mesmo para a primeira coluna TIMESTAMP. e Voc pode usar esta propriedade se, por exemplo, voc quiser que um TIMESTAMP tenha seu e e valor denido como a data e hora atuais na criao de registros, mas no quer alter-los ca a a quando o registro for atualizado mais tarde: Deixe o MySQL denir a coluna quando o registro criado. Isto ir inicializa-la com e a a data e hora atuais. Quando voc realizar subsequentes atualizaoes em outras colunas do registro, dena e c explicitamente a coluna TIMESTAMP com o valor atual. Por outro lado, voc pode achar que mais fcil usar uma coluan DATETIME que voc iniciale e a e iza com NOW() quando o registro for criado e deixa como est em atualizaes subsequentes. a co
493
Todas as colunas TIMESTAMP tem o mesmo tamanho de armazenamento, independente do tamanho de display. Os tamanhos de display mais comuns so 6, 8, 12, e 14. Voc pode a e especicar um tamanho de display arbitrario na hora da criao da tabela, mas valores de ca 0 ou maiores que 14 so mudados para 14. Valores a impares de tamanho na faixa de 1 a 13 so mudados para o maior nmero par mais prximo. a u o Nota: Na verso 4.1, TIMESTAMP retornado com uma string com o formato YYYY-MM-DD a e HH:MM:SS, e timestamp de diferentes tamamnhos no so mais suportados. a a Voc pode especicar calores DATETIME, DATE e TIMESTAMP usando qualquer conjunto de e formatos comum: Como uma string nos formatos YYYY-MM-DD HH:MM:SS ou YY-MM-DD HH:MM:SS. Uma sintaxe relaxada permitidanenhum caracter de pontuao pode ser usado e ca 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 so equivaa lentes. Como uma string nos formatos YYYY-MM-DD ou YY-MM-DD. Uma sintaxe relaxada permitida aqui tambm. Por exemplo, 98-12-31, 98.12.31, 98/12/31, e e e 98@12@31 so equivalentes. a Como uma string sem delimitadores nos formatos YYYYMMDDHHMMSS ou YYMMDDHHMMSS, desde que a string faa sentido como data. c Por example, 19970523091528 e 970523091528 so interpretadas com 1997-05-23 a 09:15:28, mas 971122129015 ilegal (tem uma parte de minutos sem sentido) e 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 so ina terpretedas como 1997-05-23, mas 971332 ilegal (tem uma parte de ms sem e e sentido) e se torna 0000-00-00. Como um nmero nos formatos YYYYMMDDHHMMSS ou YYMMDDHHMMSS, desde que o u nmero faa sentido como uma data. Por exemplo, 19830905132800 e 830905132800 u c so interpretedos como 1983-09-05 13:28:00. a Como um nmero nos formatos YYYYMMDD ou YYMMDD, desde que o nmero faa sentido u u c como data. Por exemplo, 19830905 e 830905 so interpretedos como 1983-09-05. a Como o resultado de uma funo que retorne uma valor aceitavel em um contexto ca DATETIME, DATE ou TIMESTAMP, tal como NOW() ou CURRENT_DATE. Valores DATETIME, DATE, ou TIMESTAMP ilegais so convertidos para o valor zero do tipo a apropriado (0000-00-00 00:00:00, 0000-00-00, ou 00000000000000). Para valores especicados com strings que incluem delimitadores de data, no necessrio a e a especicar dois digitos para valores de ms ou dia qua so menores que 10. 1979-6-9 e a o mesmo que 1979-06-09. Similarmente, para valores especicados como strings que e incluem delimitadores de hora, no necessrio especicar dois digitos para valores de a e a hora, minutos ou segundo que so menores que 10. 1979-10-30 1:2:3 R o mesmo que a e 1979-10-30 01:02:03. Valores especicados como nmeros devem ter 6, 8, 12, ou 14 digitos. Se o nmero de u u e 8 ou 14 digitos, ele assume estar no formato YYYYMMDD ou YYYYMMDDHHMMSS e que o ano dado pelos 4 primeiros d e igitos. Se o de 6 ou 12 d e igitos, ele assume estar no formato
494
YYMMDD or YYMMDDHHMMSS e que o ano dado pelos 2 primeiros digitos. Nmeros que no e u a possua estes tamanho so interpretados como calores preenchidos com zero at o tamanho a e mais prximo. o Valores especicados como strings no delimitadas so interpretados usando o seu tamanho a a como dado. Se a string possui 8 ou 14 caracteres, o ano assumido como os 4 primeiros e caracteres. De outra forma o assume-se que o ano so os 2 primeiros caracteres. A string a interpretadada esquerda para direita para encontrar os valores do ano, ms, dia, hora, e e minute e segundo, para as partes da string. Isto signica que voc no deve utilizar strings e a com menos de 6 caracteres. Por exemplo, se voc especicar 9903, pensando em repree sentar Maro de 1999, voc perceber que o MySQL insere uma data zero em sua tabela. c e a Isto ocorre porque os valores do ano e ms so 99 e 03, mas a parte contendo o dia no e a a existe (zero), ento o valor no uma data legal. No entanto, a partir do MySQL 3.23, voc a a e e pode especicar explicitamente um valor de zero para representar dia ou ms faltantes. Por e exemplo, voc pode usar 990300 para inserir o valor 1999-03-00. e Colunas TIMESTAMP armazena valores legais utilizando preciso total com a qual os valores a foram especicados, independente do tamanho do display. Isto tem diversas implicaes: co Sempre especique o ano, ms e dia, mesmo se seus tipos de coluna so TIMESTAMP(4) e a ou TIMESTAMP(2). De outra forma, os valores no sero datas legais date e um 0 ser a a a armazenado. Se voc usa ALTER TABLE para aumentar uma coluna TIMESTAMP, informaes sero e co a mostradas como se antes estivessem escondidas. De forma similar, reduzindo o tamanho de uma coluna TIMESTAMP no causa perda de a informao, exceto no sentido de que menos informao aparece quando os valores so ca ca a mostrados. Embora os valores TIMESTAMP sejam armazenados com preciso total, a unica funo a ca que opera diretamente com o valor armazenado UNIX_TIMESTAMP(). OUtras funes e co operam com o formato do valor recuperado Isto signica que no se pode usar funes a co como HOUR() or SECOND() a menos que a parte relevante do valor TIMESTAMP esteja inclu no valor formatado. POr exemplo, a parte HH de uma coluna TIMESTAMP no ido a mostrada a menos que o tamanho do display seja de pelo menos 10, logo tentar usar e HOUR() em um valor TIMESTAMP menor produz um resultado sem signicado. Voc pode, algumas vezes, atribuir valores de um tipo de data para um objeto de um e diferente tipo de data. No entanto pode haver algumas alteraes de valores ou perda de co informao ca Se voc atribuir um valor de DATE value a um objeto DATETIME ou TIMESTAMP, a parte e da hora do valor resultante denido como 00:00:00, porque o vlaor DATE no e a contm informaes de hora. e co Se voc atribuir um valor DATETIME ou TIMESTAMP para um objeto DATE, a parte da e hora do valor resultante deletado, pois o tipo DATE no armazena informaes de e a co hora. Lembre-se de que embora todos os valores DATETIME, DATE, e TIMESTAMP possam ser especicados usando o mesmo conjunto de formatos, os tipos no tem a mesa faixa de a valores. Por exemplo, valores TIMESTAMP no podem ser anteriores a 1970 ou posteriores a a 2037. Isto signicia que datas como 1968-01-01, so permitidas como valores a
495
DATETIME ou DATE, mas no so vlidas para valores TIMESTAMP e sero covertidas para a a a a 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 confuses. Por exemplo, um valor como 10:11:12 pode parecer com um valor de o hora devido ao limitador :, mas se usado em um contexto de data ser interpretado a como o ano 2010-11-12. O valor 10:45:15 ser convertido para 0000-00-00 a pois 45 no um valor de ms permitido. a e e O servidor MySQL funciona basicamente checando a validade da data: dias entre 0031, ms entre 00-12, anos entre 1000-9999. Qualquer data que no esteja nesta faixa e a ser revetida para 0000-00-00. Por favor, note que isto ainda lhe permite armazenar a datas invalidas tais como 2002-04-31. Isto permite a aplicaes web armazenar dados co de um formulrio sem vericaes adicionais. Para assegurar que a data valida, faa a co e c a checagem em sua aplicao. ca Valores de anos especicados com 2 digitos so amb a iguos, pois o sculo no conhecido. e a e MySQL interpreta valores de anos com dois digitos usando as seguintes regras: Valores de ano na faixa de 00-69 so convertidos para 2000-2069. a Valores de ano na faixa de 70-99 so convertidos para 1970-1999. a
496
Para valores TIME especicados como uma string que incluem delimitadores de hora, no a necessrio especicar dois d e a igitos para valores de hora, minutos ou segundos que sejam menores que 10. 8:3:2 o mesmo que 08:03:02. e 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 invs de hora do dia.) Por e exemplo, voc poderia pensar em 1112 e 1112 signicam 11:12:00 (11 horas e 12 e minutos), mas o MySQL o intepreta como 00:11:12 (onze minutos e 12 segundos). De forma similar, 12 e 12 so interpretados como 00:00:12. Valores TIME com dois pontos, a em contrapartida, so tratados como hora do dia. Isto , 11:12 signicar 11:12:00, a e a no 00:11:12. a Valores que so legais mas que esto fora da faixa permitidas so ajustados para o valor a a a limita da faixa mais apropriado. Por exemplo, -850:00:00 e 850:00:00 so convera tidos para -838:59:59 e 838:59:59, respectivmente. Valores TIME ilegais so convertidos para 00:00:00. Note que como 00:00:00 um a e valor TIME, no temos com dizer, a partir de um valor 00:00:00 armazenado na tabela, a 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) sero os mesmos em cada a caso, j que espaos ectras so removidos das colunas CHAR quando recuperados. a c a Valores nas colunas CHAR e VARCHAR so ordenados e comparadaos no modo caso-insensitivo, a a menos que o atributo BINARY seja especicado quando a tabela for criada. O atributo BINARY signica que os valores das colunas so ordenados e comparados no modo casoa sensitivo de acordo com a ordem ASCII da maquina onde o servidor MySQL est sesndo a executado. BINARY no afeta como as colunas so armazenadas e recuperadas. a a A partir da verso 4.1.0, o tipo de coluna CHAR BYTE um alias para CHAR BINARY. Thite a e e um recurso para compatibilidade. O atributo BINARY pegajoso. Isto signica que se uma coluna denida com BINARY e e usada na expresso, toda a expresso comparada como um valor BINARY. a a e MySQL pode alterar sem aviso o tipo de uma coluna CHAR ou VARCHAR na hora de criar a tabela. Veja Seo 6.5.3.1 [Silent column changes], Pgina 607. ca a
498
499
Note que cada valor BLOB ou TEXT representado internamente por um objeto alocado e searadamente. Est uma diferena com todos os outros tipos de colunas, para o qual o ae c armazenamento alocado um por coluna quando a tabela aberta. e e
Uma enumerao pode ter um mximo de 65535 elementos. ca a A partir da verso 3.23.51 espaos extras so automaticamente deletados dos valores ENUM a c a quando a tabela criada. e O caso da letra irrelevante quando voc atribui valores a um coluna ENUM. No entanto, e e valores recuperados posteriormente da coluna ter o caso de letras de acordo com os valores a que foram usados para especicar os valores permitidos na criao da tabela. ca Se voc recupera um ENUM em um contexto numrico, o indice do valor da coluna retornado. e e e Por exemplo, voc pode recuperar valores numricos de uma coluna ENUM desta forma: e e mysql> SELECT col_enum+0 FROM nome_tabela;
500
Se voc armazena um nmero em um ENUM, o nmero tratado como um e u u e indice, e o valor armazenado o membro da enumerao com este e ca indice. (No entanto, este no ir funcionar a a com LOAD DATA, o qual trata todas as entradas como strings.) No aconselhvel armazenar a e a nmeros em uma string ENUM pois pode tornar as coisas um pouco confusas. u Valores ENUM so armazenados de acordo com a ordem na qual os membros da enumerao a ca foram listados na especicao da coluna. (Em outras palavras, valores ENUM so ordenaca a dos de acordo com o seus nmeros de u 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 no-vazias, e valores NULL vem antes de todos os outros valores de enua merao. Para evitar resultados inesperados, especique a lista ENUM em ordem alfabtica. ca e Voc tambm pode usar GROUP BY CONCAT(col) para ter certeza de que as colunas esto e e a ordenadas alfabeticamente e no pelo indice numrico. a e Se voc quiser obter todos os valores possiveis para uma coluna ENUM, voc deve usar: e e SHOW COLUMNS FROM nome_tabela LIKE nome_coluna_enum e analizar a denio de ENUM ca na segunda coluna.
501
b c d
2 4 8
Se voc atribuir um valor 9 a esta coluna, que 1001 em binrio, o primeiro e o quarto e e a valores membros do SET "a" e "d" so selecionados e o valor resultante "a,d". a e Para um valor contendo mais que um elemento de SET, no importa em qual ordem os a elementos so listados quando foram inseridos seus valores. Tambm no importa quana e a tas vezes um dado elemento e listado no valor. Quando o valor recuperado posteriore mente, cada elemento aparecer uma vez, listados de acordo com a ordem em que eles a foram especicados na crio da tabela. Por exemplo, se uma coluna especicada como ca e SET("a","b","c","d"), ento "a,d", "d,a" e "d,a,a,d,d" iro todos aparecer como a a "a,d" quando recuperados. Se voc dene um valor que no suportado pela coluna SET, o valor ser ignorado. e a e a Valores SET so ordenados numricamente. Valores NULL vm antes de valores SET no a e e a NULL. Normalmente, voc realiza um SELECT em uma coluna SET usando o operador LIKE ou a e funo FIND_IN_SET(): ca 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 tambm funciona: e mysql> SELECT * FROM nome_tabela 2 WHERE col_set = val1,val2; mysql> SELECT * FROM nome_tabela 3 WHERE col_set & 1; A primeira desta instrues procura por uma correpondencia exata. A segunda por valores co contendo o primeiro membro. Se voc quer obter todos os valores poss e iveis para uma coluna SET, voc deve usar: SHOW e COLUMNS FROM nome_tabela LIKE nome_coluna_set e analizar a denio do SET na seca gunda coluna.
502
O mapeamento do tipo de campo ocorre na criao da tabela. Se voc cria uma tabela com ca e tipos usador por outras empresas e ento executa uma instruo DESCRIBE nome_tabela, a ca MySQL relaciona a estrutura de tabela utilizando os tipos equivalentes do MySQL.
503
504
505
so convertidas automaticamente para nmeros e nmeros para strings quando necessrio a u u a (como em Perl). MySQL realiza comparaes de acordo com as seguintes regras: co Se um ou ambos os argumentos so NULL, o resultado da comparao NULL, exceto a ca e para o operador <=>. Se ambos os argumentos em uma comparao so strings, eles so comparados como ca a a strings. Se ambos os argumentos so inteiros, eles so comparados como inteiros. a a Valores hexadecimais so tratados como strings binrias se no comparadas a um a a a nmero. u Se uma dos argumentos uma coluna TIMESTAMP ou DATETIME e o outro argumento e e uma constante, a constante convertida para um timestamp antes da comparao ser e ca realizada. Isto ocorre para ser mais amigvel ao ODBC. a Em todos os outros casos, os argumentos so coparados como nmeros de ponto utua u ante (real). Por padro, comparaes de string so feita de modo independente do caso, usando o a co a conjunto de caracteres atual (ISO-8859-1 Latin1 por padro, o qual tambm funciona de a e forma excelente para o Ingls). e Se voc est comparando strings em caso insensitivo com qualquer dos operadores padres e a o (=, <>..., mas no o LIKE) espaos em branco no m da string (espaos, tabs e quebra de a c c linha) sero ignorados. a mysql> SELECT "a" ="A \n"; -> 1 Os seguintes exemplos ilustram a converso de strings para nmeros para operaes de a u co comparao: ca mysql> SELECT -> 0 mysql> SELECT -> 1 mysql> SELECT -> 0 mysql> SELECT -> 1 1 > 6x; 7 > 6x; 0 > x6; 0 = x6;
Note que quando voc est comparando uma coluna string com um nmero, o MySQL no e a u a pode usar indices para encontrar o valor rapidamente: SELECT * FROM table_name WHERE string_key=1 A razo para isto que existem muitas strings diferentes que podem retornar o valor 1: a e "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 ou no NULL: e a 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 pode encontrar o ultimo registro inserido com: e SELECT * FROM nome_tabela WHERE auto_col IS NULL
507
Isto pode ser desabilitado congurando SQL_AUTO_IS_NULL=0. Veja Seo 5.5.6 [SET OPTION], Pgina 460. ca a Para colunas DATE e DATETIME NOT NULL voc pode encontrar a data espee cial 0000-00-00 utilizando: SELECT * FROM nome_tabela WHERE coluna_data IS NULL Isto necessrio para que algums aplicaes ODBC funcionem (j que e a co a ODBC no tem suporte a data 0000-00-00) a expr BETWEEN min AND max Se expr maior que ou igual a min e expr menor que ou igual a max, BETWEEN e e retorna 1, seno retornado 0. Isto equivalente a expresso (min <= expr AND a e e a expr <= max) se todos os argumentos so do mesmo tipo. Seno os tipos so a a a convertidos, conforme as regras acima, e aplicadas a todos os trs argumentos. e Note que antes da verso 4.0.5 argumentos eram convertidos para o tipo da a 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 qualquer dos valores na lista IN, seno retorna 0. Se todos e a os valores so constantes, ento os valores so avaliados de acordo com o tipo da a a a expr e ordenado. A busca do item ento feita usando pesquisa binria. Isto e a a signica que IN muito rpido se os valores da lista IN forem todos contantes. e a Se expr uma expresso strig em caso-sensitivo, a comparao realizadas no e a ca e modo caso-sensitvo: mysql> SELECT 2 IN (0,3,5,wefwf); -> 0 mysql> SELECT wefwf IN (0,3,5,wefwf); -> 1 O nmero de valores na lista IN limitada apenas pelo valor max_allowed_ u e packet. Na verso 4.1 (para se adequar ao padro SQL-99), IN returna NULL no apeans a a a se a expresso a sua esquerda NULL, mas tambm se nenhuma correspondncia a e e e encontrada na lista e uma de suas expresses NULL. e o e A partir do MySQL verso 4.1, uma clusula IN() tambm pode conter uma a a e subquery. Veja Seo 6.4.2.3 [ANY IN SOME subqueries], Pgina 572. ca a expr NOT IN (valor,...) O mesmo que NOT (expr IN (valor,...)).
508
ISNULL(expr) Se expr NULL, ISNULL() retorna 1, seno retorna 0: e a mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1 Note que a comprao de valores NULL usando = sempre ser falso! ca a COALESCE(lista) Retorna o primeiro elemento no NULL na lista: a 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 NULL. Todos e os argumentos so tratados como inteiros. Isto exige que N1 < N2 < N3 < ... < a Nn para que esta funo funcione corretamente. Isto ocorre devido a utilizao ca ca pesquisa binria (muito rpida): a a 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
O ultimo exemplo produz 1 pois a a expresso avaliada como (!1)+1. a e AND && AND lgico. Avalia como 1 se todos os operandos so diferentes de zero e no o a a NULL, como 0 se um ou mais operandos so 0, seno retorna NULL. e a a 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 verses do MySQL anteriores a verso 4.0.5 param a o a avaliao quando um valor NULL encontrado, e no continua o processo busca e a cando por poss iveis 0s. Isto signica que nessa verso, SELECT (NULL AND 0) a retorna NULL ao invs de 0. Na verso 4.0.5 o cdigo tem sido re-elaborado e a o para que o resultado sempre seja como prescrito pelo padro SQL utilizando a a otimizao sempre que poss ca ivel. OR lgico. Avalia como 1 se algum operando diferente de zero e como NULL o e se algum operando for NULL, seno 0 retornado. a e 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 lgico. Retorna NULL se o operando tambm NULL. Para operandos o e e no NULL, avalia como 1 se um nmero impar de operandos diferente de zero, a u e seno 0 retornado. a e 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 matematicamente igual a (a AND (NOT b)) OR ((NOT a) and b). e
OR ||
XOR
510
511
esperava. No segundo caso, a comparao testa se o valor de ponto utuante ca no zero. O resultado da comparaao converte o termo em um interiro. a e c O tipo de retorno padro de IF() (o que pode importar quando ele ara e mazenado em uma tabela temporria) calculado na verso 3.23 do MySQL a e a de seguinte forma: Expresso a 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 so strings, ento o resultado caso-insensitivo se ambas a a e strings so caso insensitivo. (A patir da verso 3.23.51) a a IFNULL(expr1,expr2) Se expr1 no NULL, IFNULL() retorna expr1, seno retorna expr2. IFNULL() a e a retorna um valor numrico ou string, dependendo do contexto no qual usado: e e 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 verso 4.0.6 e acima o valor resultante padro de IFNULL(expr1,expr2) o a a e mais geral das duas expresses, na seguinte ordem: STRING, REAL ou INTEGER. o A diferena das verses anteriores mais notvel quando se cria uma tabela c o e a baseada em uma expresso ou o MySQL tem que armazenar internamente um a valor de IFNULL() em uma tabela temporria. a CREATE TABLE foo SELECT IFNULL(1,"teste") as teste; Na verso 4.0.6 do MySQL o tipo da coluna teste CHAR(4) enquanto nas a e verses anteriores ela seria do tipo BIGINT. o NULLIF(expr1,expr2) Se expr1 = expr2 for verdadeiro, retornado NULL seno retornado expr1. e a e Isto o mesmo que CASE WHEN x = y THEN NULL ELSE x END: e mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1 Note que expr1 avaliada duas vezes no MySQL se os argumentos no so e a a 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 cdigo ASCII referentes a estes inteiros. Valores o NULL so desconsiderados: a 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 concatenao dos argumentos. Retorna NULL ca se qualquer dos argumentos for NULL. Pode ter mais de 2 argumentos. Um argumento numrico convertido para sua forma string equivalente: e e 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 uma forma especial do CONCAT(). O primeiro argumento o separador para os e e outros argumentos. O separador adicionado entre as strings a serem concatee nadas: O separador pode ser uma string assim como os outros argumentos. Se o separador NULL, o resultado ser NULL. A funo ir desconsiderar qualquer e a ca a 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 nmeros entre diferentes bases. Retorna uma representao string do u ca nmero N, convertido da base da_base para base para_base. Retorna NULL se u qualquer argumento NULL. O argumento N interpretado como um inteiro, e e mas pode ser especicado como um inteiro ou uma string. A base m inima 2 e e a mxima 36. Se para_base um nmero negativo, N considerado como a e e u e um nmero com sinal. Caso contrrio, N tratado como um nmero sem sinal. u a e u CONV funciona com preciso de 64-bit: a 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 menor que 1 ou maior que o nmero de argumentos. ELT() o complemento e u e 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 obtm uma string on e e e para cada bit 0 voc obtem uma string o, Cada string separada com e e separador (padro,,) e s nmero de bits (padro 64) de bits usado: a o u a e 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 no a for encontrada. FIELD() o complemento de ELT(): e 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 na lista strlist contendo N a substrings. A lista de string composta de substrings separadas pelo carace ter ,. Se o primeiro argumento uma string constante e o segundo uma e e coluna do tipo SET, a funo FIND_IN_SET() otimizada para usar aritmtica ca e e binria! Retorna 0 se str no est na strlista ou se strlista uma string a a a e vazia. Retorna NULL se os argumentos so NULL. Esta funo no ir funcionar a ca a a adequadamente se o primeiro argumento contm uma virgula (,): e mysql> SELECT FIND_IN_SET(b,a,b,c,d); -> 2 HEX(N_ou_S) Se N OU S um nmero, retornado um representao string do valor hexe u e ca adecimal de N, onde N um nmero muito grande (BIGINT). Isto equivalente e u e a CONV(N,10,16). Se N OU S uma string, retornado uma string hexadecimal de N OU S onde e e cada caracter de N OU S convertido para 2 d e igitos hexadecimais. Isto o e inverso da string 0xff. mysql> SELECT HEX(255); -> FF mysql> SELECT HEX("abc"); -> 616263 mysql> SELECT 0x616263; -> "abc" INSTR(str,substr) Retorna a posio da primeira ocorrncia da substring substr na string str. ca e o mesmo que as o LOCATE() com dois argumentos, exceto pelo fato de que os E argumentos esto tracados: a mysql> SELECT INSTR(foobarbar, bar); -> 4 mysql> SELECT INSTR(xbar, foobar); -> 0 Esta funo multi-byte. Na verso 3.23 do MySQL esta funo caso sensitivo, ca e a ca e enquanto na verso 4.0 ela s caso-sensitivo se os argumentos so uma string a oe a binria. a INSERT(str,pos,tam,novastr) Retorna a string str, com a a substring comeando na posio pos e contendo c ca tam caracteres substituida pela string novastr:
515
mysql> SELECT INSERT(Quadratico, 3, 4, Onde); -> QuOndetico Esta funo multi-byte. ca e LCASE(str) LOWER(str) Retorna a string str com todos caracteres alterados para letra minsculas de u acordo com o conjunto de caracteres atual (o padro ISO-8859-1 Latin1): a e mysql> SELECT LCASE(MYSQL); -> mysql Esta uma funo multi-byte. e ca LEFT(str,tam) Retorna os tam caracteres mais a esquerda da string str: mysql> SELECT LEFT(foobarbar, 5); -> fooba Esta funo multi-byte. ca e LOAD_FILE(nome_arquivo) Lb o arquivo e retona o conteudo do arquivo como uma string. O arquivo beve e estar no servidor, voc deve especicar o caminho completo para o arquivo, e e voc deve ter o privilgio FILE. O arquivo deve ser leg e e ivel para todos e ser menor que o especicado em max_allowed_packet. Se o arquivo no existe ou no pode ser lido devido a alguma das razes acima, a a o a funo retornar NULL: ca a mysql> UPDATE nome_tabela SET coluna_blob=LOAD_FILE("/tmp/picture") WHERE id=1; Se voc no est usando a verso 3.23 MySQL, voc tem que fazer a leitura e a a a e do arquivo dentro do seu aplicativo e criar uma instruo INSERT para atuca alizar o banco de dados com a informao do arquivo. Um modo de se fazer ca isto, se voc estiver usando a biblioteca MySQL++, pode ser encontrada em e http://www.mysql.com/documentation/mysql++/mysql++-examples.html. LOCATE(substr,str) LOCATE(substr,str,pos) A primeira sintaxe retorna a posio da primeira ocorrncia da substring substr ca e na string str. A segunda sintaxe retorna a posio da primeira ocorrncia da ca e substring substr na string str, iniciando na posio pos. Retornam 0 se ca substr no est em str: a a mysql> SELECT LOCATE(bar, foobarbar); -> 4 mysql> SELECT LOCATE(xbar, foobar); -> 0 mysql> SELECT LPAD(hi,4,??); -> ??hi
516
LTRIM(str) Retorna a string str com caracteres de espaos extras iniciais removidos: c 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 corresponde ao bit 1, str2 ao bit 2, etc. Strings NULL em str1, str2, ... no so a a 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 representao string do valor octal de N, onde N um nmero ca e u muito grande. Isto equivalente a CONV(N,10,8). Retorna NULL se N NULL: e e mysql> SELECT OCT(12); -> 14 ORD(str) Se o caracter mais a esquerda da string str um caracter multi-byte, e retornado o cdigo para este caracter, calculado a partir dos valores e o do cdigo ASCII dos seus caracteres contituintes utizando-se a seguinte o frmula: ((primeiro byte do cdigo ASCII)*256+(segundo byte do cdigo o o o ASCII))[*256+terceiro byte do cdigo ASCII...]. Se o caracter mais a o esquerda no multi-byte, retornado o mesmo valor que a funo ASCII() a e e ca 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() so sinnimos e medem o tamanho da length em a o bytes (octets). Um caracter multi-byte conta considerado vrios bytes. CHAR_ e a LENGTH() e CHARACTER_LENGTH() so sinnimos e medem o tamanho da string a o em caracteres. Um caracter multi-byte conta como um unico caracter. Isto signica que para uma string contendo cinco caracteres de dois bytes, LENGTH() retorna 10, enquanto CHAR_LENGTH() retorna 5.
517
MID(str,pos,len) MID(str,pos,len) um sinnimo para SUBSTRING(str,pos,len). e o POSITION(substr IN str) POSITION(substr IN str) um sinnimo para LOCATE(substr,str). e o QUOTE(str) Coloca uma string entre aspas para produzir um resultado que possa ser usada em uma intruo SQL como um valor de dados com o caracter de escape correto. ca A string retornada entre aspas simples e cada instqncia de aspas simples e a (), barra invertida (\), ASCII NUL, e Control-Z precedida por uma barra e invertida. Se o argumento NULL, o valor retornado a palavra NULL sem e e aspas simples. A funo QUOTE() foi adicionada na verso 4.0.3 do MySQL. ca a 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 <= 0, retornado uma string vazia. E retornado NULL se str ou cont so NULL: e a mysql> SELECT REPEAT(MySQL, 3); -> MySQLMySQLMySQL REPLACE(str,da_str,para_str) Retorna a string str com todas ocorrncias da string da_str substituida pela e string para_str: mysql> SELECT REPLACE(www.mysql.com, w, Ww); -> WwWwWw.mysql.com Esta funo multi-byte. ca e REVERSE(str) Returns the string str with the order of the characters reversed: mysql> SELECT REVERSE(abc); -> cba Esta funo multi-byte. ca e RIGHT(str,tem) mysql> SELECT RIGHT(foobarbar, 4); -> rbar Esta funo multi-byte. ca e RPAD(str,tam,strpreech) Retorna a string str, preenchida a direita com a string strpreench para um tamanho de tam caracteres. Se str maior que tam, o valor retornado reduzido e e para tam caracteres. mysql> SELECT RPAD(hi,5,?); -> hi???
518
RTRIM(str) Retourna a string str com caracteres de espaos extras nais removidos: c mysql> SELECT RTRIM(barbar ); -> barbar Esta funo multi-byte. ca e SOUNDEX(str) Retorna uma string soundex de str. Duas strings que parecidas fonticamentea devem ter strings soundex iguais. Uma string soundex padro e a possui 4 caracteres, mas a funo SOUNDEX() retorna uma string de tamanho ca arbitrrio. Voc posde usar SUBSTRING() no resultado para obter uma string a e soundex padro. Todos os caracteres no alfanumricos so ignorados na a a e a string dada. Todas caracteres internacionais fora da faixa A-Z so tratados a como vogais: mysql> SELECT SOUNDEX(Hello); -> H400 mysql> SELECT SOUNDEX(Quadratically); -> Q36324 SPACE(N) Retorna uma string contendo N caracteres de espao: c mysql> SELECT SPACE(6); ->
SUBSTRING(str,pos) SUBSTRING(str FROM pos) SUBSTRING(str,pos,tam) SUBSTRING(str FROM pos FOR tam) A forma sem um argumento tam retorna uma substring da string str iniciando na posio pos. A forma com um argumento tam retorna a substring com tam ca caracteres da string str, iniciando da posio pos. A forma variante que utiliza ca FROM a sintaxe SQL-92: e mysql> SELECT SUBSTRING(Quadratically,5); -> ratically mysql> SELECT SUBSTRING(foobarbar FROM 4); -> barbar mysql> SELECT SUBSTRING(Quadratically,5,6); -> ratica Esta funo multi-byte. ca e SUBSTRING_INDEX(str,delim,cont) Retorna a substring da string str antes de cont ocorrencias do delimitador delim. Se cont positivo, tudo a esquerda do delimitador nal (contando a e partir da esquerda) retornado. Se cont negativo, tudo a direita do delimie e tador nal (contando a partir da direita) retornado. e mysql> SELECT SUBSTRING_INDEX(www.mysql.com, ., 2); -> www.mysql mysql> SELECT SUBSTRING_INDEX(www.mysql.com, ., -2); -> mysql.com
519
Esta funo multi-byte. ca e 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 so dados, considerado a e BOTH. Se remstr no especicada, espaos so removidos: a e c a 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 funo multi-byte. ca e UCASE(str) UPPER(str) Retorna a string str com todos caracteres alterados para letra maisculas de u acordo com o conjunto de caracteres atual (o padro ISO-8859-1 Latin1): a e mysql> SELECT UCASE(Hej); -> HEJ Esta uma funo multi-byte. e ca
520
mysql> SELECT David! LIKE David_; -> 1 mysql> SELECT David! LIKE %D%v%; -> 1 Para testar instncias literais de um meta caracter, preceda o caracter com o a carcter de escape. Se voc no especicar o caracter de ESCAPE, assume-se \: e a 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 clusula ESCAPE: a mysql> SELECT David_ LIKE David|_ ESCAPE |; -> 1 As seguintes instrues mostram que a comparao de strings so co ca a caso-insensitivo, a menos que um dos operandos seja uma string binria: a mysql> SELECT abc LIKE ABC; -> 1 mysql> SELECT abc LIKE BINARY ABC; -> 0 LIKE permitido em uma expresso numrica! (Esta uma extenso MySQL e a e e a 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 deve dobrar qualquer \ que voc usar em sua string LIKE. Por e e exemplo, para pesquisar por \n, especique-o como \\n. Para buscar por \, especique-o como \\\\ (as barras invertidas so eliminadas uma vez pelo a analizador e outra vez quando a correspondncia de padres feita, deixando e o e uma unicas barra invertida para ser vericada). Note: O LIKE atual no um caracter multi-byte. Comparaoes so feitas a e ca a 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 apenas na verso 4.1 ivel a ou posterior). expr REGEXP pad expr RLIKE pad Realiza a busca de padres em uma express string com base no padro pad. O o a a padro pode ser uma expresso regular extendida. Veja Apndice G [Regexp], a a e
521
Pgina 1093. Retorna 1 se expr conincide com pad, seno retorna 0. RLIKE a a um sinnimo para REGEXP, fornecido para compatibilidade com mSQL. Nota: e o Como MySQL usa a sintaxe de escape do C em strings (por exemplo, \n), voc deve dobrar qualquer \ que voc use em sua string REGEXP. Como na e e verso 3.23.4 do MySQL, REGEXP caso- insensitivo para strings normais (no a e a binrias). a mysql> SELECT Monty! REGEXP m%y%%; -> 0 mysql> SELECT Monty! REGEXP .*; -> 1 mysql> SELECT new*\n*line REGEXP new\\*.\\*line; -> 1 mysql> SELECT "a" REGEXP "A", "a" REGEXP BINARY "A"; -> 1 0 mysql> SELECT "a" REGEXP "^[a-d]"; -> 1 REGEXP e RLIKE usam o conjunto de caracteres atual (ISO-8859-1 Latin1 por padro) para decidir o tipo de caracter. a expr NOT REGEXP pad expr NOT RLIKE pad O mesmo que NOT (expr REGEXP pad). STRCMP(expr1,expr2) STRCMP() retorna 0 se as string so a mesma, -1 se o primeiro argumento a e menor que o segundo de acordo com a ordenao atual e 1 em caso contrrio: ca a mysql> SELECT STRCMP(texto, texto2); -> -1 mysql> SELECT STRCMP(texto2, texto); -> 1 mysql> SELECT STRCMP(texto, texto); -> 0 MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION] ) MATCH ... AGAINST() usado para busca de textos completos e retorna a e relvncia - similaridade medidad entre o texto nas colunas (col1,col2,...) a e a consulta expr. Relevncia um nmero de ponto utuante. Relevncia a e u a zero signica que no houve nenhuma similaridade. MATCH ... AGAINST() est a a na verso 3.23.23 ou posterior do MySQL. A extenso IN BOOLEAN disponivel a a MODE foi adicionada na verso 4.0.1, WITH QUERY EXPANSION foi adicionado na a verso 4.1.1. Para detalhes e exemplos de uso, veja Seo 6.8 [Fulltext Search], a ca Pgina 619. a
522
mysql> SELECT "a" = "A"; -> 1 mysql> SELECT BINARY "a" = "A"; -> 0 BINARY string um atalho para CAST(string AS BINARY). Veja Seo 6.3.5 e ca [Cast Functions], Pgina 544. BINARY foi introduzida na verso 3.23.0 do a a MySQL. Note que em alguns contextos MySQL no estar apto a usar o a a indice de forma eciente quando se transformar uma coluna indice em BINARY. Se voc quiser compara um blob caso-insensitivo voc pode sempre convert-lo para letras e e e maisculas antes de faer a comparao: u ca SELECT A LIKE UPPER(col_blobl) FROM nome_tabela; No planejamos introduzir em breve coero (casting) entre diferentes conjuntos de caraca ca teres para tornar compares de strings mais ex co ivel.
523
mysql> SELECT 102/(1-1); -> NULL Uma diviso ser calculada com aritimtica BIGINT somente se executada em a a e um contexto no qual o resultado convertido para um interiro! e
O uso desta funo seguro com valores BIGINT. O ultimo exemplo s funciona ca e o no MySQL 4.1 FLOOR(X) Retorna o maior valor inteiro no maior que X: a
524
mysql> SELECT FLOOR(1.23); -> 1 mysql> SELECT FLOOR(-1.23); -> -2 Note que o valor retornado convertido para um BIGINT! e CEILING(X) CEIL(X) Retorna o menor valor inteiro no menor que X: a mysql> SELECT CEILING(1.23); -> 2 mysql> SELECT CEIL(-1.23); -> -1 O alias CEIL() foi adicionado verso 4.0.6. a Note que o valor retornado convertido para um BIGINT! e ROUND(X) ROUND(X,D) Retorna o argumeto X, arredondado para o inteiro mais prximo. Com dois o argumentos o arredandamento feito para um nmero com D decimais. e u 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 no meio do a caminho entre dois inteiros depende da implementao da biblioteca C. Alguns ca arredondamentos para o nmero mais prximo, so sempre para baixo, para u o a cima ou so zero. Se voc precisa de um tipo de arredondamento, voc deve a e e usar uma funo bem denida como TRUNCATE() ou FLOOR(). ca DIV Diviso de inteiros. Similar ao FLOOR() mas seguro com valores BIGINT. a mysql> SELECT 5 DIV 2 -> 2 DIV novo no MySQL 4.1.0. e 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
EXP(X)
525
LN(X)
Retorna o logaritmo natural de X: mysql> SELECT LN(2); -> 0.693147 mysql> SELECT LN(-2); -> NULL Esta funo foi adicionada na verso 4.0.3 do MySQL. E sinnimo de LOG(X) ca a o no MySQL. Se chamado com um parmetro, esta funo retorna o logar a ca itmo natural de X: mysql> SELECT LOG(2); -> 0.693147 mysql> SELECT LOG(-2); -> NULL Se chamado com dois parmetros, esta funo retorna o logar a ca itmo natural de X para uma base arbitraria B: mysql> SELECT LOG(2,65536); -> 16.000000 mysql> SELECT LOG(1,100); -> NULL A opo de base arbitrria foi adicionada na verso 4.0.3 do MySQL. LOG(B,X) ca a a equivalente a LOG(X)/LOG(B). e Returna o logar itmo na base 2 de X: mysql> SELECT LOG2(65536); -> 16.000000 mysql> SELECT LOG2(-100); -> NULL LOG2() util para descobrir quantos bits um nmero necessitaria para ser e u armazenado. Esta funo foi adicionada na verso 4.0.3 do MySQL. Em verses ca a o anteriores, voc pode usar LOG(X)/LOG(2). e Returna o logar itmo na base 10 de X: mysql> SELECT LOG10(2); -> 0.301030 mysql> SELECT LOG10(100); -> 2.000000 mysql> SELECT LOG10(-100); -> NULL
LOG(X) LOG(B,X)
LOG2(X)
LOG10(X)
POW(X,Y) POWER(X,Y) Retorna o valor de X elevado a potncia de Y: e mysql> SELECT POW(2,2); -> 4.000000 mysql> SELECT POW(2,-2); -> 0.250000
526
SQRT(X)
Retorna o a raiz quadrada no negativa de X: a mysql> SELECT SQRT(4); -> 2.000000 mysql> SELECT SQRT(20); -> 4.472136
PI()
Retorna o valor de PI. A quantidade de nmeros decimais padro 5, mas o u a e MySQL usa internamente a preciso dupla completa para PI. a mysql> SELECT PI(); -> 3.141593 mysql> SELECT PI()+0.000000000000000000; -> 3.141592653589793116
COS(X)
Retorna o cosseno de X, onde X dado em radianos: e mysql> SELECT COS(PI()); -> -1.000000
SIN(X)
Retorna o seno de X, onde X dado em radianos: e mysql> SELECT SIN(PI()); -> 0.000000
TAN(X)
Retorna a tangente de X, onde X dado em radianos: e mysql> SELECT TAN(PI()+1); -> 1.557408
ACOS(X)
Retorna o arco cosseno X, isto , o valor cujo cosseno X. Retorna NULL se X e e no est na faixa de -1 a 1: a a mysql> SELECT ACOS(1); -> 0.000000 mysql> SELECT ACOS(1.0001); -> NULL mysql> SELECT ACOS(0); -> 1.570796
ASIN(X)
Retorna o arco seno X, isto , o valor cujo seno X. Retorna NULL se X no est e e a a na faixa de -1 a 1: mysql> SELECT ASIN(0.2); -> 0.201358 mysql> SELECT ASIN(foo); -> 0.000000
ATAN(X)
Retorna o arco tangente X, isto , o valor cuja tangente X. X: e e mysql> SELECT ATAN(2); -> 1.107149 mysql> SELECT ATAN(-2); -> -1.107149
527
ATAN(Y,X) ATAN2(Y,X)
Retorna o arco tangente de duas variaveis X e Y. E similar ao caclculo do arco tengente de Y / X, exceto que os sinais de ambos argumentos so usados para a 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 vericao de redundncia c ca a iclica e retorna um valor unsigned de 32 bits. O resultado NULL se o argumento NULL. O argumento e e esperado uma string e ser tratado como tal se no for. e a a mysql> SELECT CRC32(MySQL); -> 3259397556 CRC32() est dispon a partir do MySQL 4.1.0. a ivel RAND() RAND(N) Retorna um valor de ponto utuante aleatrio na faixa de 0 a 1.0. Se um o argumento inteiro N especicado, ele usado como uma semente (produzindo e e uma sequncia repetitiva): e 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(); -> 0.70100469486881 Voc no pode usar uma coluna com valores RAND() em uma clusula ORDER e a a BY, pois ORDER BY avaliaria a coluna mltiplas vezes. Na verso 3.23 voc pode u a e fazer: SELECT * FROM nome_tabela ORDER BY RAND() Isto util para obter um amostra aleatria de um conjunto SELECT * FROM e o tabela1,tabela2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000. Note que um RAND() em uma clusula WHERE ser reavliado toda vez que WHERE a a executado. e
528
RAND() no um gerador de nmeros aletatrios perfeito, mas um modo a e u o e rpido de se gerar nmeros aleatrios ad hoc que sero portveis entre platafora u o a a mas para a mesma verso do MySQL. a LEAST(X,Y,...) Com dois ou mais argumentos, retorna o menor (valor-m inimo) argumento. Os argumentos so comparados usando as seguintes regras: a Se o valor de retorno usado em um contexto INTEGER, ou todos argumene tos so valores inteiro, eles so comparados como inteiros. a a Se o valor de retorno usado em um contexto REAL, ou todos argumentos e so valores reais, eles so comparados como inteiros. a a Se qualquer um dos argumento for uma string caso-sensitivo, os argumentos so comparados como strings caso-sensitivo. a Nos outros casos, caso-insensitivo: os argumentos so comparados como strings a
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 verses do MySQL anteriores a verso 3.22.5, voc pode usar MIN() no o a e lugar de LEAST. GREATEST(X,Y,...) Retorna o maior (valor mximo) argumento. Os argumentos so comparados a a 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 verses do MySQL anteriores a verso 3.22.5, voc pode usar MAX() no o a e lugar de GRATEST. DEGREES(X) Retorna o argumento X, convertido de radianos para graus: mysql> SELECT DEGREES(PI()); -> 180.000000 RADIANS(X) Retorna o argumento X, convertido de graus para radianos: mysql> SELECT RADIANS(90); -> 1.570796
529
TRUNCATE(X,D) Retiorna o nmero X, truncado para D casas decimais. Se D 0, o resultado no u e a ter ponto deciaml ou prate fracionria: a a 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 nmeros so arredondados para zero. u a Se D negativo, ento D numeros da parte inteira so zerados: e a a mysql> SELECT TRUNCATE(122,-2); -> 100 Note que como os nmeros decimais no so normalmente armazenados como u a a nmeros exatos, mas como valores de dupla preciso, voc pode obter o seguinte u a e resultado: mysql> SELECT TRUNCATE(10.28*100,0); -> 1027 O resultado acima acontece porque 10.28 , na verdade, armazenado como e 10.2799999999999999.
530
extraem parte de uma data podem retornam 0. Por exemplo, DAYOFMONTH(2001-11-00) retorna 0. DATE(expr) Extrai a parte da data da expresso date ou datetime em expr. a mysql> SELECT DATE(2003-12-31 01:02:03); -> 2003-12-31 DATE() est dispon a partir do MySQL 4.1.1. a ivel TIME(expr) Extrai a parte da hora da expresso time ou datetime em expr. a 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 dispon a partir do MySQL 4.1.1. a ivel TIMESTAMP(expr) TIMESTAMP(expr,expr2) Com um argumento, retorna a expresso date ou datetime em expr como um a valor datetime. Com dois argumentos, adiciona a expresso time e expr2 ` a a expresso date ou datetime em expr e retorna um valor datetime. a 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 dispon a partir do MySQL 4.1.1. a ivel DAYOFWEEK(data) Retorna o indice do dia da semana para data (1 = Domingo, 2 = Segunda, ... 7 = Sbado). Estes valores de a indices correspondem ao padro ODBC. a mysql> SELECT DAYOFWEEK(1998-02-03); -> 3 WEEKDAY(data) Retorna o indice do dia das semana para data (0 = Segunda, 1 = Tera, ... 6 c = Domingo): mysql> SELECT WEEKDAY(1998-02-03 22:23:00); -> 1 mysql> SELECT WEEKDAY(1997-11-05); -> 2 DAYOFMONTH(data) Retorna o dia do ms para data, na faixa de 1 at 31: e e mysql> SELECT DAYOFMONTH(1998-02-03); -> 3 DAY(date) DAY() um sinnimo para DAYOFMONTH(). Est dispon a partir do MySQL e o a ivel 4.1.1.
531
DAYOFYEAR(data) Retorna o dia do ano para data, na faixa de 1 at 366: e mysql> SELECT DAYOFYEAR(1998-02-03); -> 34 MONTH(data) Retorna o ms para data, na faixa de 1 at 12: e e 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 ms para data: e mysql> SELECT MONTHNAME(1998-02-05); -> February QUARTER(data) Retorna o trimaster para data, na faixa de 1 at 4: e mysql> SELECT QUARTER(98-04-01); -> 2 WEEK(data [,modo]) A funo retorna o nmero da semana para date. A forma de dois argumentos ca u de WEEK() permite que voc especique se a semana comea no Domingo ou na e c Segunda e se o valor de retorno deve estar na faixa de 0-53 ou 1-5. Quando o argumento modo omitido, o valor de uma varivel de servidor default_week_ e a format (ou 0 no MySQL 4.0 e mais novo) assumido. Veja Seo 5.5.6 [SET e ca OPTION], Pgina 460. a A seguinte tabela demonstra como o argumento modo funciona: Valor Signicado 0 Semana comea no Domingo; retorna o valor na faixa de 0 a 53; semana c 1 a primeira semana neste ano. e 1 Semana comea na Segunda; retorna o valor na faixa de 0 a 53; semana c 1 a primeira semana com mais de 3 dias neste ano e 2 Semana comea no Domingo; retorna o valor na faixa de 1 a 53; semana c 1 a primeira semana neste ano. e 3 Semana comea na Segunda; retorna o valor na faixa de 1 a 53; semana c 1 a primeira semana com mais de 3 dias neste ano. e 4 Semana comea no Domingo; retorna o valor na faixa de 0 a 53; semana c 1 a primeira semana com mais de 3 dias neste ano. e 5 Semana comea na Segunda; retorna o valor na faixa de 0 a 53; semana c 1 a primeira semana neste ano. e 6 Semana comea no Domingo; retorna o valor na faixa de 0 a 53; semana c 1 a primeira semana que tenha mais de 3 dias neste ano. e 7 Semana comea na Segunda; retorna o valor na faixa de 1 a 53; semana c 1 a primeira semana neste ano. e
532
O valor mode de 3 pode ser usado a partir do MySQL 4.0.5. O valor mode de 4 e acima pode ser usado a partir do MySQL 4.0.17. mysql> SELECT -> 7 mysql> SELECT -> 7 mysql> SELECT -> 8 mysql> SELECT -> 53 WEEK(1998-02-20); WEEK(1998-02-20,0); WEEK(1998-02-20,1); WEEK(1998-12-31,1);
Nota: Na verso 4.0, WEEK(#,0) foi alterado para corresponder ao calendrio a a 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 ultima semana do ano anterior, o MySQL retornar 0 a se voc no usar 2, 3, 6 ou 7 como argumento opcional modo: e a mysql> SELECT YEAR(2000-01-01), WEEK(2000-01-01,0); -> 2000, 0 Pode-se questionar que o MySQL deveria retornar 52 para a funo WEEK() ja ca que a data dada ocorre, na verdade, ma 52a. semana de 1999. Ns decidimos o retornar 0 j que queremos que funao retorne o nmero da semana do ano a c u dado. Isto faz com que o uso da funao WEEK() seja seguro quando combinado c com outras funes que extraiam um parte de uma data. co Se voc prefere que o resultado seja avaliado em relaco ao ano que aontm o e a e primeiro dia da semana de uma data dada, ento voc deve usar o 2, 3, 6 ou 7 a e como argumento opcional modo: mysql> SELECT WEEK(2000-01-01,2); -> 52 Alternativamente voc pode usar a funo YEARWEEK(): e ca 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 nmero na faixa de 1 a 53. u mysql> SELECT WEEKOFYEAR(1998-02-20); -> 8 WEEKOFYEAR() esta dispon a partir do MySQL 4.1.1. ivel 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 ultima semana do ano: mysql> SELECT YEARWEEK(1987-01-01); -> 198653 Note que o nmero da semana diferente do que seria retornado pela funo u e ca WEEK() (0) para os argumentos opcionais 0 ou 1, j que WEEK() retorna a a semana no centexto de um ano dado. HOUR(hora) Retorna a hora para hora. A faixa do valor retornado ser de 0 a 23 para o a valor hora do dia. mysql> SELECT HOUR(10:05:03); -> 10 No entanto, a faixa dos valores TIME atualmente so muito grandes, assim HOUR a 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 expresso time ou datetime em expr como um a nmero na faixa de 0 a 999999. u mysql> SELECT MICROSECOND(12:00:00.123456); -> 123456 mysql> SELECT MICROSECOND(1997-12-31 23:59:59.000010); -> 10 MICROSECOND() est dispon a partir do MySQL 4.1.1. a ivel 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 no um valor de data: a e mysql> SELECT PERIOD_ADD(9801,2); -> 199803
534
PERIOD_DIFF(P1,P2) Retorna o nmero de meses entre os per u iodos P1 e P2. P1 e P2 devem estar no formato AAMM ou AAAAMM. Note que os argumentos de per iodo P1 e P2 no so valores de data: a a mysql> SELECT PERIOD_DIFF(9802,199703); -> 11 DATE_ADD(data,INTERVAL tipo expr) DATE_SUB(data,INTERVAL tipo expr) Estas funes realizam operaes aritmticas em datas. co co e A partir do MySQL 3.23, INTERVAL expr tipo permitido nos dois lados do e operador + se a expressao em ambos os lados um valor date ou datetime. e Para o operador -, INTERVAL expr tipoe permitido apenas no lado direito, e porque no faz sentido subtrair um valor date ou datetime de um intervalo. a (Veja exemplo abaixo.) data um valor DATETIME ou DATE especicando a data de in e icio. expr is an expresso especicando o intervala a ser adicionado ou subtraido da data de a in icio. expr uma string; ela pode iniciar com um - para intervalos negativos. e type uma palavra chave indicando como a expresso deve ser interpretada. e a 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 so permitidos aps o a o MySQL 4.1.1. O MySQL permite qualquer delimitador de pontuao no formato de expr. Os ca delimitadores mostrados na tabela so apenas sugeridos. Se o argumento date a um valor de DATA e seus clculos envolvem apenas as partes ANO, M^S, e DIA e a E
535
(into , nenhuma parte de hora), o resultado um valor do tipo DATE. Seno, e e a o resultado um valor do tipo DATETIME: e 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 especicado um intervalo muito curto (no inclue todas as partes que e a seriam esperadas pelo intervalo para aquele tipo), MySQL assume que voc e no especicou a parte mais a esquerda do valor do intervalo. Por exemplo, se a voc especica um tipo DAY_SECOND, o valor esperado de expr dever ter as e a partes de dias, horas, minutos e segundos. Se voc especica um valor como e 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 interpretado de forma equivalente a 1:10 MINUTE_SECOND. Isto anlogo a e e a forma que o MySQL interpreta valores TIME representado tempo decorrido no lugar de hora do dia. Note que se voc adicionar ou subtrair de uma data algo contendo uma parte e de hora, o resultado automaticamente convertido para um valor datetime: e 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 utilizar datas mal formadas, o valor retornado NULL. S voc adicionar e e e MONTH, YEAR_MONTH, ou YEAR e a data resultante tiver um dia maior que o dia mximo para aquele ms, o dia ajustado para o dia mximo no ms. a e e a e 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 no so caso sensitivo. a a ADDDATE(data,INTERVAL expr type) ADDDATE(expr,dias) Quando chamada com a forma INTERVAL do segundo argumento, ADDDATE() e um sinnimo para DATE_ADD(). A funo relcionada SUBDATE() um sinnimo o ca e o para 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 A partir do MySQL 4.1.1, a segunda sintaxe permitida, onde expr uma e e expreso date ou datetime e dias o nmero de dias a ser adicionado a expr. a e u mysql> SELECT ADDDATE(1998-01-02, 31); -> 1998-02-02 ADDTIME(expr,expr2) ADDTIME() adiciona expr2 a expr e retorna o resultado. expr uma expresso e a date ou datetime, e expr2 uma expresso time. e a mysql> SELECT ADDTIME("1997-12-31 23:59:59.999999", "1 1:1:1.000002"); -> 1998-01-02 01:01:01.000001 mysql> SELECT ADDTIME("01:00:00.999999", "02:00:00.999998"); -> 03:00:01.999997 ADDTIME() foi adicionado no MySQL 4.1.1. EXTRACT(tipo FROM data) A funo EXTRACT() usa o mesmo tipo de intervalo especicado como DATE_ ca ADD() ou DATE_SUB(), mas extrai partes da da data em vez de realizar aritimtica de data. e 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
537
DATEDIFF(expr,expr2) TIMEDIFF(expr,expr2) DATEDIFF() retorna o nmero de dias entre a data inicial expr e a data nal u expr2. expr e expr2 so expresses de datas ou data e hora. Apenas a parte a o da data dos valores s usados no clculo. a a TIMEDIFF() retorna o tempo entre a hora inicial expr e a hora nal expr2. expr e expr2 so expresses de hora ou data e hora, mas ambas devem ser do a o 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 nmero do dia (o nmero de dias desde o ano u u 0); mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS(1997-10-07); -> 729669 TO_DAYS() no pode ser usado com valores que orecedem o advento do calena dario Gregoriano (1582), porque ele no leva em conta os dias perdidos quando a o calendrio foi mudado. a FROM_DAYS(N) Dado um nmero de dia N, retorna um valor DATE: u mysql> SELECT FROM_DAYS(729669); -> 1997-10-07 FROM_DAYS() no pode ser usado com valores que orecedem o advento do calena dario Gregoriano (1582), porque ele no leva em conta os dias perdidos quando a o calendrio foi mudado. a 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 Description Nome do ms (January..December) e Nome da semana (Sunday..Saturday) Dia do ms com suxo Ingls (0th, 1st, 2nd, 3rd, etc.) e e Ano, numerico, 4 digitos Ano, numerico, 2 digitos
538
Ano para a semana onde o Domingo o primeiro dia da e semana, numerico, 4 digitos; usado com %V %x Ano para a semana onde a segunda o primeiro dia da e semana, numerico, 4 digitos; usado com %v %a Nome da semana abreviado (Sun..Sat) %d Dia do ms, numerico (00..31) e %e Dia do ms, numerico (0..31) e %m Ms, numerico (00..12) e %c Ms, numerico (0..12) e %b Nome do ms abreviado (Jan..Dec) e %j Dia do ano (001..366) %H Hora (00..23) %k Hora (0..23) %h Hora (01..12) %I Hora (01..12) %l Hora (1..12) %i Minutos, numerico (00..59) %r Tempo, 12-horas (hh:mm:ss seguido por AM ou PM) %T Tempo, 24-horas (hh:mm:ss) %S Segundos (00..59) %s Segundos (00..59) %f Microsegundos (000000..999999) %p AM ou PM %w Dia da semana (0=Domingo..6=Sabado) %U Semana(00..53), onde o Domingo o primeiro dia da e semana. %u Semana(00..53), onde a Segunda o primeiro dia da e semana. %V Semana(01..53), onde o Domingo o primeiro dia da see mana; usado com %X %v Semana(01..53), onde a Segunda o primeiro dia da see mana; usado com %x %% Um literal %. Todos os outros caracteres so apenas copiados para o resultado, sem intera pretao. ca O especicador dr formato %f est dispon a partir do MySQL 4.1.1. a ivel Como na verso 3.23 do MySQL, o caracter % exigido antes dos caracteres a e de especicao de formato. Em verses anteriores do MySQL % era opcional. ca o A razo para a faixa de valores do ms e do dia comearem com zero a e c 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);
%X
539
-> 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 a funo reversa da funo DATE_FORMAT(). Ela pega uma string str, e e ca ca 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 descrio da funo DATE_FORMAT(). Todos os outros caracteres sero apenas ca ca a exibidos, no sendo interpretados. Se str contm um valor date, time, ou a e 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 dispon a partir do MySQL 4.1.1. a ivel GET_FORMAT(DATE | TIME | TIMESTAMP, EUR | USA | JIS | ISO | INTERNAL) Retorna uma string de formato. Esta funo util combinado com as funes ca e co DATE_FORMAT() e STR_TO_DATE(), e quando congurarmos as variveis do servia dor DATE_FORMAT, TIME_FORMAT e DATETIME_FORMAT. Os trs valores poss e 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 descrio da funo DATE_FORMAT()): ca ca Chamada da Funo ca GET_FORMAT(DATE,USA) GET_FORMAT(DATE,JIS) GET_FORMAT(DATE,ISO) GET_FORMAT(DATE,EUR) GET_FORMAT(DATE,INTERNAL) GET_FORMAT(TIMESTAMP,USA) GET_FORMAT(TIMESTAMP,JIS) GET_FORMAT(TIMESTAMP,ISO) GET_FORMAT(TIMESTAMP,EUR) GET_FORMAT(TIMESTAMP,INTERNAL) GET_FORMAT(TIME,USA) GET_FORMAT(TIME,JIS) GET_FORMAT(TIME,ISO) GET_FORMAT(TIME,EUR) GET_FORMAT(TIME,INTERNAL) Resultado %m.%d.%Y %Y-%m-%d %Y-%m-%d %d.%m.%Y %Y%m%d %Y-%m-%d-%H.%i.%s %Y-%m-%d %H:%i:%s %Y-%m-%d %H:%i:%s %Y-%m-%d-%H.%i.%s %Y%m%d%H%i%s %h:%i:%s %p %H:%i:%s %H:%i:%s %H.%i.%S %H%i%s
540
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 dispon a partir do MySQL 4.1.1. Veja Veja Seo 5.5.6 a ivel ca [SET OPTION], Pgina 460. a SUBDATE(date,INTERVAL expr type) SUBDATE(expr,days) Quando chamado com a forma INTERVAL do segunto argumento, SUBDATE() e um sinonimo para DATE_SUB(). 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 permitida, onde expr uma e e expresso date ou datetime e days o nmero de dias a ser subtra de expr. a e u ido mysql> SELECT SUBDATE(1998-01-02 12:00:00, 31); -> 1997-12-02 12:00:00 SUBTIME(expr,expr2) SUBTIME() subtrai expr2 de expr e retorna o resultado. expr uma expresso e a date ou datetime, e expr2 uma expresso time. e a mysql> SELECT SUBTIME("1997-12-31 23:59:59.999999", "1 1:1:1.000002"); -> 1997-12-30 22:58:58.999997 mysql> SELECT SUBTIME("01:00:00.999999", "02:00:00.999998"); -> -00:59:59.999999 SUBTIME() foi adicionado no MySQL 4.1.1. TIME_FORMAT(hora,formato) E usado como a funo DATE_FORMAT() acima, mas a string de formato pode ca 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 contm uma hora que maior que 23, os especicadores de e e 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 mdulo 12: o 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 ultimo dia do ms. Retorna NULL se o argumento invalido. e e 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);
541
-> 2004-01-31 mysql> SELECT LAST_DAY(2003-03-32); -> NULL LAST_DAY() est dispon a partir do MySQL 4.1.1. a ivel 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 NULL. a mysql> SELECT MAKEDATE(2001,31), MAKEDATE(2001,32); -> 2001-01-31, 2001-02-01 mysql> SELECT MAKEDATE(2001,365), MAKEDATE(2004,365); -> 2001-12-31, 2004-12-30 mysql> SELECT MAKEDATE(2001,0); -> NULL MAKEDATE() est dispon a partir do MySQL 4.1.1. a ivel 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 dispon a partir do MySQL 4.1.1. a ivel CURDATE() CURRENT_DATE CURRENT_DATE() Retorna a data atual como um valor no formato YYYY-MM-DD ou YYYYMMDD, dependendo se a funo usada num contexto numrico ou de string. ca e e 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 funo usada em um contexto numrico ou como string: ca e e mysql> SELECT CURTIME(); -> 23:50:26 mysql> SELECT CURTIME() + 0; -> 235026
542
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 funo utilizada num contexto numrico ca e e ou de string. mysql> SELECT NOW(); -> 1997-12-15 23:50:26 mysql> SELECT NOW() + 0; -> 19971215235026 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() chamada com um argumento data, retornado o valor do argue e mento como segundo desde 1970-01-01 00:00:00 GMT. data pode ser um string DATE, uma string DATETIME, um TIMESTAMP, ou um nmero no formato u 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 usado em uma coluna TIMESTAMP, a funo retorna e ca o valor timestamp interno diretamente, sem nenhuma converso string-paraa unix-timestamp implicita. Se voc passar uma data fora da faixa para UNIX_ e TIMESTAMP(), a funo ir retornar 0, mas por favor note que s vericaes ca a o co bsicas so realizadas. (ano 1970-2037, ms 01-12, dia 01-31). a a e Se voc subtrair colunas UNIX_TIMESTAMP(), voc pode querer mudar o resule e tado para inteiro com sinal. Veja Seo 6.3.5 [Funes de tipagem], Pgina 544. ca co a FROM_UNIXTIME(unix_timestamp) FROM_UNIXTIME(unix_timestamp,format) Retorna a representao do argumento unix_timestamp como um valor no forca mato YYYY-MM-DD HH:MM:SS ou YYYYMMDDHHMMSS, dependendo de do contexto em que a fun utilizada: co e mysql> SELECT FROM_UNIXTIME(875996580); -> 1997-10-04 22:23:00 mysql> SELECT FROM_UNIXTIME(875996580) + 0; -> 19971004222300
543
Se o formato dado o resultado formatado de acordo com a string formato. e e formato pode conter os especicadores listados acima para a funo DATE_ ca 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 funo utilizada: ca e 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: 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 funo usada emum contexto string ou numrico: ca e e mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> 2003-08-14, 20030814 UTC_DATE() est dispon a partir do MySQL 4.1.1. a ivel UTC_TIME UTC_TIME() Retorna a hora UTC atual como um valor no formato HH:MM:SS ou HHMMSS, dependendo se a funo usada em um contexto string ou numrico: ca e e mysql> SELECT UTC_TIME(), UTC_TIME() + 0; -> 18:07:53, 180753 UTC_TIME() est dispon a partir do MySQL 4.1.1. a ivel 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 funo usada em um conca e texto string ou numrico: e mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0; -> 2003-08-14 18:08:04, 20030814180804 UTC_TIMESTAMP() est dispon a partir do MySQL 4.1.1. a ivel
544
CAST() da sintaxe SQL-99 syntax e CONVERT() da sintaxe ODBC. e e As funes de converso so principalmente uteis quando voc deseja criar uma coluna com co a a e um tipo espec ico em uma CREATE ... SELECT: CREATE TABLE nova_tabela SELECT CAST(2000-01-01 AS DATE); As funes tambm podem ser uteis para ordenar colunas ENUM na ordem lexicogrca. co e a Normalmente a ordenao das colunas ENUM ocorrem usando os valores numricos internos. ca e Converter os valores para CHAR resultam em uma ordenao lexicogrca: ca a SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR); CAST(string AS BINARY) a mesma coisa que BINARY string. CAST(expr AS CHAR) trata e a expresso como uma string com o conjunto de caracteres padro. a a NOTA: No MysQL 4.0 o CAST() para DATE, DATETIME ou TIME s marca a coluna para ser o um tipo espec ico mas no altera o valor da coluna. a No MySQL 4.1.0 o valor ser convertido para a coluna correta quando for enviado para o a usurio (este um recurso de como o novo protocolo na verso 4.1 envia as informaes de a e a co data para o cliente): mysql> SELECT CAST(NOW() AS DATE); -> 2003-05-26 Em verses futuras do MySQL (provavelmente 4.1.2 ou 5.0) iremos corrigir o fato de que o CAST tambm altera o resultado se voc us-lo como parte de uma expresso mais complexa, e e a a como CONCAT("Data: ",CAST(NOW() AS DATE)).
545
Voc no deve utilizar CAST() para extrair dados em formatos diferentes, mas sim para e a usar funes strins como LEFT ou EXTRACT(). Veja Seo 6.3.4 [Funes de data e tempo], co ca co Pgina 529. a Para converter uma string para um valor numrico, normalmente no necessrio se fazer e a e a nada; apenas use a string como se fosse um nmero: u mysql> SELECT 1+1; -> 2 Se voc usar um nmero em um contexto string, o nmero ser convertido automaticamente e u u a para uma string BINARY. mysql> SELECT CONCAT("hello you ",2); -> "hello you 2" O MySQL suporta aritimtico com valores de 64 bits com sinal e sem sinal. Se voc est e e a usando operaes numricas (como +) e um dos operandos unsigned integer (inteiro co e e sem sinal), o resultado tambm ser sem sinal (unsigned). Voc pode forar o tipo usando e a e c os operadores de converso SIGNED e UNSIGNED para converter a operao para um inteiro a ca de 64 bits com sinal e sem sinal, respectivamente. 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 um valor de e ponto utuante e no afetado pela regra acima. (Neste contexto DECIMAL() considerado a e e um valor de ponto utuante). mysql> SELECT CAST(1 AS UNSIGNED) -2.0; -> -1.0 Se voc estiver utilizando uma string em uma operao aritimtica, ela convertida para e ca e e um nmero de ponto utuante. u O tratamento de valores sem sinais foi mudado no MySQL 4.0 para suportar valores BIGINT apropriadamente. Se voc tiver algum cdigo que deseja executar no MySQL 4.0 e 3.23 e o (casos em que voc provavelmente no poder usar a funo CAST()), voc pode utilizar o e a a ca e 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 idia que as colunas sejam convertidas para valores de ponto utuante antes da subtrao e e ca ocorrer. Se voc tiver algum problema com colunas UNSIGNED no seu aplicao MySQL antiga ao e ca portar para o MySQL 4.0, voc pode usar a opo --sql-mode=NO_UNSIGNED_SUBTRACTION e ca ao iniciar mysqld. Note, no entanto, que enquanto voc utilizar esta opo, no ser poss e ca a a ivel conseguir um uso efetivo do tipo de coluna BIGINT UNSIGNED. CONVERT() com USING usado para converter dados entre diferentes conjuntos de caracteres. e No MySQL, nomes trancodicados so o mesmo que o nome do conjunto de caracteres correa spondentes. Por exemplo, esta instruo converte a string abc no conjunto de caracteres ca padro do servidor na string correspondente no conjunto de caracteres utf8: a SELECT CONVERT(abc USING utf8);
546
&
<<
BIT_COUNT(N) Retorna o nmero de bits que so passados no argumento N: u a mysql> SELECT BIT_COUNT(29); -> 4
547
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 usurio a davida (como indicado pelo valor da funo USER()), o servidor autenticou o ca cliente usando uma conta de usurio annimo (como visto pela parte vazia no a o nome de usurio do valor CURRENT_USER()). Um modos de isto ocorrer que a e no haja uma conta listada na tabela de permisses para davida. a o PASSWORD(str) OLD_PASSWORD(str) Calcula a senha a partir de senha str em texto puro. Est a funo que ae ca e utilizada para criptografar a senha do MySQL para armazenamento na coluna Password da tabela de permisses user o mysql> SELECT PASSWORD(badpwd); -> 7f84554057dd964b
548
A criptograa de PASSWORD() no e revers a ivel. PASSWORD() no realiza a criptograa da senha da mesa maneira que as senhas a Unix so criptografadas. Veja ENCRYPT(). a Note: A funo PASSWORD() usada pelo sistema de autenticao no servica e ca dor MySQL, voc N~O deve uitliz-las em suas prprias aplicaes. Para este e A a o co propsito utilize MD5() ou SHA1(). Veja tambm RFC-2195 para maiores ino e formaes sobre o tratamento de senha e autenticao segura em suas aplicaes. co ca co ENCRYPT(str[,salt]) Criptografa str utilizando a chamada de sistema crypt() do Unix. O argumento salt deve ser uma string com dois caracteres. (Na verso 3.22.16 do a MySQL, salt deve ser maior que dois caracteres.) mysql> SELECT ENCRYPT("hello"); -> VxuFAJXVARROc ENCRYPT() ignora tudo depois dos primeiros 8 caracteres de str, pelo menos em alguns sistemas. Este comportamento determinado pela implementao e ca da chamada de sistema crypt(). Se crypt() no estiver dispon a ivel no seu sistema, ENCRYPT() sempre retorna NULL. Devido a isto recomendamos que voc use MD5() ou SHA1() em vez dos e existentes em sua plataforma. ENCODE(str,senha_str) Criptografa str usando senha_str como a senha. Para descriptografar o resultado, utilize DECODE(). O resultado uma string binria do mesmo tamanho de str. Se voc deseja e a e salv-la em uma coluna, use uma coluna do tipo BLOB. a 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 retornado como e um nmero hexadecimal de 32 digitos que pode, por exemplo, ser usado como u uma chave hash: mysql> SELECT MD5("testing"); -> ae2b1fca515949e5d54fb22b8ed95575 Este o "RSA Data Security, Inc. MD5 Message-Digest Algorithm". e SHA1(string) SHA(string) Calcula um checksum SHA1 de 160 bit para a string, como descrito no RFC 3174 (Algoritmo Hash de Segurana). O valor retornado como um nmero c e u hexadecial de 40 digitos, or NULL no caso do argumento ser NULL . Uma das possibilidades para o uso desta funo a chave hash. Voc tambm pode us-lo ca e e e a como uma funo segura de criptograa para armazenar senhas. ca mysql> SELECT SHA1("abc"); -> a9993e364706816aba3e25717850c26c9cd0d89d
549
SHA1() foi adicionado na verso 4.0.2, e pode ser considerada um equivalente a ao MD5() com criptograa mais segura. SHA() um sinnimo para SHA1(). e o AES_ENCRYPT(string,string_chave) AES_DECRYPT(string,string_chave) Estas funes permitem criptograa/descriptograa de dados usando o algoco ritmo ocial AES (Padro Avanado de Criptograa), antes conhecido como a c Rijndael. Criptgraa com uma chave de 128 bits podem ser usadas, mas voc e pode extend-la para 256 bits atravs da fonte. Ns escolhemos 128 bits porque e e o muito mais rpido e bastante seguro. e a e Os argumentos de entrada podem ser de qualquer tamanho. Se ambos argumentos so NULL, o resultado desta funo tam bm ser NULL. a ca e a de bloco, padding usado para codicar Como o AES um algoritimo de nivel e e strings de tamanho impares e ento a string resultante pode ser calculada como a 16*(trunc(tamanho string/16)+1). Se AES_DECRYPT() detectar dados invlidos ou padding incorreto, ela retorna a NULL. No entanto, poss para o AES_DECRYPT() retornar um valor no-NULL e ivel a (possivelmente lixo) se os dados de entrada ou a chave eram invlidos a Voc pode usar as funes AES para armazenar dados de forma criptografada e co modicando as suas consultas: INSERT INTO t VALUES (1,AES_ENCRYPT(text,password)); Voc pode obter mais segurana no transferindo a chave em suas conexes a e c a o cada consulta, o que pode ser conseguido armazenando-o em varveis do lado a do servidor na hora das conexo. a SELECT @password:=my password; INSERT INTO t VALUES (1,AES_ENCRYPT(text,@password)); AES_ENCRYPT() e AES_DECRYPT() foram adicionados na verso 4.0.2, e podem a ser considerados a funo de criptograa mais segura atualmente dispon no ca ivel 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 funo s funciona se o MySQL tiver sido congurado com suporte ca o a SSL. Veja Seo 4.4.10 [Conexes seguras], Pgina 268. ca o a A chave de criptograa utilizada escolhida da seguinte forma: e Argumento Somente um argumento Nmero da chave u string Descrio ca A primeira chave de des-key-file utilizada. e
A chave dada (0-9) de des-key-file utilizada. e A chave_string dada ser utilizada para criptografar a string_para_criptografar. O string retornada ser uma string binria onde o primeiro caracter ser a a a CHAR(128 | nmero_chave). u O 128 adicionado para facilitar o reconhecimento da chave de criptograa. Se e voc usar uma chave string, numro_chave ser 127. e e a
550
Havendo erro, esta funo retorna NULL. ca O tamanho da string para o resultado ser novo_tamanho= tamanho_orig + a (8-(tamanho_orig % 8))+1. O des-key-file ter o seguinte formato: a numero_chave chave_string_des numero_chave chave_string_des Cada numero_chave deve ser um nero na faixa de 0 a 9. As linhas do arquivo u podem estar em qualquer ordem. chave_string_des a string que ser usada e a para criptografar a mensagem. Entre o nmero e a chave deve haver pelo menos u um espao. A primeira chave a chave padro que ser utilizada se no for c e a a a especicada nenhuma chave como argumento para DES_ENCRYPT() Voc pode dizer ao MySQL para ler novos valores de arquivos de chave com o e comando FLUSH DES_KEY_FILE. Isto exige o privilgio Reload_priv. e de ter um conjunto de chaves padres que ele d a aplicao um Um beneficio o e a ca modo de vericar a existncia de valores criptografados em colunas, sem dar ao e usurio nal o direito de descriptografar estes valores. a 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 funo s funciona se o MySQL tiver sido congurado com suporte ca o SSL. Veja Seo 4.4.10 [Conexes seguras], Pgina 268. ca o a Se nenhum argumento chave_string for dado, DES_DECRYPT() examina o primeiro byte da string criptografada para determinar o nmero de chave DES u que foi usado para criptografar a string original, e ento l a chave de des-keya e file para descriptografar a mensagem. Para isto funcionar o usurio deve ter a o privilgio SUPER. e Se voc passar para esta funo um argumento chave_string, aquela string e ca e usada como a chave para descriptografar a mensagem. Se a string_para_descriptografar no se paracer com uma string cripa tografada, o MySQL retornar a string_para_descriptografar dada. a Havendo erro, esta funo retorna NULL. ca 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"));
551
-> 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 compactao como zlib. Seno , o valor de ca a retorno sempre NULL. e O contedo da string compactada armazenada da seguinte forma: u e Strings vazias so armazenadas como strings vazias a Strings que no esto vazias so armazenadas como um string descoma a a pacatada de 4 byte de tamanho (low-byte-rst) seguida pela string compactada com gzip. Se a string naliza com espao, adicionamos um . c extra para evitar problemas com o corte do espao nal o resultado deve c ser armazenado em um campo CHAR ou VARCHAR. O uso de CHAR ou VARCHAR para armazenar strings compactadas no recomendado. E melhor usar a e uma coluna BLOB. UNCOMPRESS(string_para_descompactar) Descompacta uma string compactado pela funo COMPRESS() ca 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 compactao como zlib. Seno , o valor ca a de retorno sempre NULL. e UNCOMPRESSED_LENGTH(string_compactada) Retorna o tamanho da string compactada antes da compactao ca 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 ultimo valor gerado automaticamente que tenha sido inserido em um coluna AUTO_INCREMENT. mysql> SELECT LAST_INSERT_ID(); -> 195 O ultimo ID que foi gerado e mantido no servidor em uma base por conexo. a Isto signica que o valor que a funo retona para um dado cliente o valor ca e AUTO_INCREMENT gerado mais recentemente por aquele cliente. O valor no a pode ser afetado pelos outros clientes, mesmo se eles gerarem um valor AUTO_ INCREMENT deles mesmos. Este comportamento assegura que voc pode recue perar seu prprio ID sem se preocupar com a atividade de outros clientes e sem o precisar de locks ou transaes. co
552
O valor de LAST_INSERT_ID() no alterado se voc atualizar uma coluna a e e AUTO_INCREMENT de uma linha com um valor no-mgico (Isto , um valor que a a e no seja NULL e nem 0). a Se voc inserir muitos registros ao mesmo tempo com uma instruo insert, e ca LAST_INSERT_ID() retorna o valor da primeira linha inserida. A razo para a isto tornar poss reproduzir facilmente a mesma intruo INSERT em algum e ivel ca outro servidor. Se expr dado com um argumento para LAST_INSERT_ID(), ento o valor e a do argumento retornado pela funo e congurado como o prximo valor e ca e o para ser retornado pela LAST_INSERT_ID(). Isto pode ser util para simular sequncias: e Primeiro crie a tabela: mysql> CREATE TABLE sequencia (id INT NOT NULL); mysql> INSERT INTO sequencia VALUES (0); Ento a tabela pode ser usada para gerar sequncia de nmeros como estes: a e u mysql> UPDATE sequencia SET id=LAST_INSERT_ID(id+1); Voc pode gerar sequncias sem chamar LAST_INSERT_ID(), mas a utilidade e e de se usar a funo deste modo que o valor ID mantido no servidor como o ca e e ultimo valor gerado automaticamente (seguro para multi-usurrio). Voc pode a e recuperar a nova ID como voc leria qualquer valor AUTO_INCREMENT normal e no MySQL. Por exemplo, LAST_INSERT_ID() (sem um argmento) retornar a a nova ID. A funo mysql_insert_id() da API C tambm pode ser usada para ca e obter o valor. Note que como mysql_insert_id() s atualizado depois de instrues INSERT oe co e UPDATE, voc no pode utilizar a funo da API C para recuperar o valor para e a ca LAST_INSERT_ID(expr) depois de executar outra instruo SQL como SELECT ca ou SET. Veja Seo 12.1.3.32 [mysql_insert_id()], Pgina 803. ca a FORMAT(X,D) Formata o nmero X com um format como #,###,###.##, arredondado para u D casas decimais, e retorna o resultado como uma string. Se D 0, o resultado e no ter nehum ponto decimal ou parte fracionria: a a a 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 verso do servidro MySQL: a mysql> SELECT VERSION(); -> 3.23.13-log Note que se seu verso nalizar com -log, signica que o log est habilitado. a a
553
CONNECTION_ID() Retorna a identicao (ID da thread) desta conexo. Cada conexo tem seu ca a a prprio ID unico: o 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 memria ou a threado tiver sido o nalizada com mysqladmin kill). Uma trava liberada quando voc executa e e RELEASE_LOCK(), executa uma nova GET_LOCK(), ou a thread termina. (tanto de forma normal quanto anormal) Esta funo pode ser usada para implementar ca bloqueio de aplicao ou para simular registros travados. Nomes so bloqueados ca a 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 no foi bloquada pela thread (caso a onde a trava no liberada), e NULL se o nome da trava no existe. (A trava a e a nunca exitir se ela nunca for obtida pela chamada de GET_LOCK() ou se ela ja a tiver sido liberada). A instruo DO conveniente para ser utilizada com RELEASE_LOCK(). Veja ca e Seo 6.4.10 [DO], Pgina 597. ca a IS_FREE_LOCK(str) Verica se a trava chamada str est livre para ser utilizada (ex. no est a a a bloqueada). Retorna 1 se a trava est liver (ningum a esta usando), 0 se a a e trava est em uso, e NULL caso ocorra erro (como argumentos incorretos). a BENCHMARK(cont,expr) A funo BENCHMARK() executa a expresso expr repetidamente cont vezes. Ela ca a pode ser usada para medir a velocidade em que o MySQL processa a expresso. a
554
O valor resultante sempre 0. A inteno us-la no clientei mysql, relatando e ca e a o tempo de execuo da consulta: ca mysql> SELECT BENCHMARK(1000000,ENCODE("hello","goodbye")); +----------------------------------------------+ | BENCHMARK(1000000,ENCODE("hello","goodbye")) | +----------------------------------------------+ | 0 | +----------------------------------------------+ 1 row in set (4.74 sec) O tempo relatado o tempo decorrido no cliente, no o tempo de CPU no servie a dor. Pode ser aconselhvel executar BENCHMARK() diversas vezes e interpretar a o resultado cosiderado o peso da carga da maquina servidora. INET_NTOA(expr) Dado um endereo numrico de rede (4 ou 8 bytes), retorna a representaco no c e a formato com pontos do endereo como uma string: c mysql> SELECT INET_NTOA(3520061480); -> "209.207.224.40" INET_ATON(expr) Dada a represenao com pontos de um endereo de rede como uma string, ca c retorna um inteiro que representa o valor numrico deste endereo. Endereos e c c podem ter 4 ou 8 bytes de endereamento: c mysql> SELECT INET_ATON("209.207.224.40"); -> 3520061480 O nmero gerado sempre na ordem de bytes da rede; por exemplo o nmero u e u acima calculado como 209*256^3 + 207*256^2 + 224*256 +40. e MASTER_POS_WAIT(nome_log, log_pos [, tempo_limite]) Envia blocos o slave alcanar (ex.: ter lido e aplicado todas as atualizaes) a c co posio especica no log master. Se a informao master no est inicializada, ca ca a a ou se os argumentos esto incorretos, retorna NULL. Se o slave no est em a a a execuo, enviar blocos e ir esperar at que ele seja iniciado e v para (ou ca a a e a passe por) a posio especicada. Se o slave j passou pela posio especicada, ca a ca retorna imediatamente. Se tempo_limite (novo na verso 4.0.10) especicado, ir esperar at que a e a e 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 o nmero de eventos de log que ele tem que esperar para obter a e u posio especicada, NULL no caso de erro, ou -1 se o tempo limite tiver sido ca excedido. O comando util para controle de sincronizao mo master/slave. e ca FOUND_ROWS() Uma instruo SELECT pode incluir uma clusula LIMIT para restringir o ca a nmero de linhas que o servidor retorna para um cliente. Em alguns casos, u e desejvel saber quantas linhas a instruo teria retornado sem o LIMIT, mas a ca sem executar a instruo novamente. Para obter esta contagem de linhas, ca
555
inclua uma opo SQL_CALC_FOUND_ROWS na instruo SELECT, ento chame ca ca a 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 retornar um nmero indicando quantas linhas o primeiro a u SELECT teria retornado se ele fosse escrito sem a clusula LIMIT. (Se o instruo a ca SELECT anterior no inclui a opo SQL_CALC_FOUND_ROWS, ento FOUND_ROWS() a ca a pode retornar um resultado diferente quando LIMIT usado daquele que no e a e usado). Note que se voc estiver usando SELECT SQL_CALC_FOUND_ROWS ..., o MySQL e tem que calcular quantos registros existem em todo o conjunto de resultados. No entanto, isto mais rpido que se voc no utilizar LIMIT, j que o resultado e a e a a precisa ser enviado ao cliente. SQL_CALC_FOUND_ROWS e FOUND_ROWS() podem ser uteis em situaes em que co voc queira restringir o nmero de registros que uma consulta retorna, mas e u tambm determinar o nmero de linhas em todo o resultado sem executar a e u consulta novamente. Um exemplo um script web que apresenta um display e paginado contendo links para as pginas que mostram outras sees de um a co resultado de busca. Usar FOUND_ROWS() lhe permite determinar quantos outras pginas so necessrias para o resto do resultado. a a a O uso de SQL_CALC_FOUND_ROWS e FOUND_ROWS() mais complexa para cone sultas UNION que para instrues SELECT simples, porque LIMIT pode ocorrer co em vrios lugares em um UNION. Ele pode ser aplicado a instrues SELECT a co individuais no UNION, ou globais ao resultado UNION como um todo. A inteno de SQL_CALC_FOUND_ROWS para UNION que ele deve retornar a ca e contagem das linhas que seriam retornadas sem um LIMIT global. As consies co para uso de SQL_CALC_FOUND_ROWS com UNION so: a A palavra chave SQL_CALC_FOUND_ROWS deve aparecer na primeira SELECT do UNION. O valor de FOUND_ROWS() exato apenas se UNION ALL for usado. Se UNION e sem ALL for usado, as duplicatas so removidas e o valor de FOUND_ROWS() a apenas aproximado. e Se nenhum LIMIT est presente no UNION, SQL_CALC_FOUND_ROWS ignoa e rado e retorna o nmero de linhas na tabela temporria que criada para u a e processar o UNION. SQL_CALC_FOUND_ROWS e FOUND_ROWS() esto dispon a iveis a partir da verso a 4.0.0 do MySQL.
556
COUNT(*) difere um pouco ao retornar o nmero de registros recuperados, se u eles possu irem ou no valores NULL. a COUNT(*) otimizado para retornar muito rpido se SELECT recuoperar registros e a de uma tabela, nenhuma outra coluna for retornada, e no houver nenhuma a clusula WHERE. Por exemplo: a mysql> SELECT COUNT(*) FROM estudente; Esta otimizaco se aplica apenas a tabelas MyISAM e ISAM, porque uma contagem a exata de registros armazenada para estes tipos de tabelas e podem ser acese sadas muito rapidamente. Para mecanismos de armazenamentos transacionais (InnodB, BDB), armazenar um contagem de registros exatos mais problemtico e a porque mltiplas transaes podem estar ocorrendo, e cada uma pode afetar a u co contagem. COUNT(DISTINCT expr,[expr...]) Retorna a quantidade de regiastros com valores no-NULL diferentes: a mysql> SELECT COUNT(DISTINCT resultados) FROM estudente; No MySQL voc pode obter o nmero de combinao de expresses distintas e u ca o que no contm NULL fornecendo uma lista de expresses. No SQL-99 voc a e o e teria que concatenar todas as expresso utilizando COUNT(DISTINCT ...). a AVG(expr) Retorna o valor mdio de expr: e mysql> SELECT nome_estudante, AVG(nota_teste) -> FROM estudante -> GROUP BY nome_estudante; MIN(expr) MAX(expr)
Retorna o valor m inimo o u mximo de expr. MIN() e MAX() poder usar uma a string como argumento; nestes casos eles retornam o a string de valor m inimo ou mximo. Veja Seo 5.4.3 [ a ca Indices do MySQL], Pgina 447. a mysql> SELECT nome_estudante, MIN(nota_teste), MAX(nota_teste) -> FROM estudante -> GROUP BY nome_estudante;
557
Em MIN(), MAX() e outras funes de agrupamento o MySQL, atualmente, co compara colunas ENUM e SET pelo seu valor string em vez de faz-lo pela sua e posio relativa de string no conjunto. Isto ser reticado. ca a SUM(expr) Retorna a soma de expr. Note que se o conjunto de retorno no possuir registros a ele retornar NULL! a GROUP_CONCAT(expr) Sintaxe completa: GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {inteiro_sem_sinal | nome_coluna | formula} [ASC | [SEPARATOR valor_str]) Esta funo foi adicionada na verso 4.1 do MySQL. Ele retorna a string resulca a tante contendo valores de um grupo: 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 pode obter valores de combinaes de expresses concatenae co o dos. Voc pode eliminar valores duplicados utilizando DISTINCT. Se voc quiser e e ordenar valores no resultado voc deve utilizar a clusula ORDER BY. Para ore a denar inversamente, adicione a palavra chave DESC (descendente) ao nome da coluna que voc est ordenando na clusula ORDER BY. O padro a ordem crese a a a e cente; pode-se tambm especicla explicitamente usando a palavra chave ASC. e a SEPARATOR o valor string que deve ser inserido entre os valores no resultado. e O padro um virgula (","). Voc pode remover o separador especicando a e e SEPARATOR "". Voc pode denir um tamanho mximo permitido com a varivel group_ e a a concat_max_len em sua congurao. A sintaxe para se fazer isto em tempo ca de execuo : ca e SET [SESSION | GLOBAL] group_concat_max_len = unsigned_integer; Se um tamanho mximo tiver sido atribuido, o resultado truncado no seu a e tamanho mximo. a A funo GROUP_CONCAT() uma implementao aprimorada da funo bsica ca e ca ca a LIST() suportada pelo Sybase SQL Anywhere. GROUP_CONCAT() compat e ivel com a funcionalidade extrwemamente limitada de de LIST(), se utilizada em apenas uma coluna e nenhuma outra opo especicada. LIST() no tem ca e a uma ordem de classicao padro. ca a
558
VARIANCE(expr) Retorna a varincia padro de expr (considerando linha como toda a populao, a a ca no com uma amostra; assim ele tem o nmero de linhas como denominador). a u Esta uma extenso do SQL-99 (dispon somente a partir da verso 4.1). e a ivel a STD(expr) STDDEV(expr) Retorna o desvio padro de expr (a raiz quadrada de VARIANCE()). Esta a e uma extenso do SQL-99. O formato STDDEV() desta funo fornecida para a ca e compatibilidade com Oracle. BIT_OR(expr) Retorna o resultado da operao binria OR de todos os bits em expr. O calca a cululo relizado com preciso de 64 bits (BIGINT). e a A funo retortna 0 se no houver registros coincidentes. ca a BIT_XOR(expr) Retorna o bitwise XOR de todos os bits em expr. O calculo relizado com e preciso de 64-bits (BIGINT). a A funo retorna 0 se no houver linhas coincidentes. ca a Esta funo est dispon a partir do MySQL 4.1.1. ca a ivel BIT_AND(expr) Retorna o resultado da operao binria AND de todos os bits em expr. O ca a calcululo relizado com preciso de 64 bits (BIGINT). e a A funo retortna 1 se no houver registros coincidentes. ca a
559
| year | SUM(profit) | +------+-------------+ | 2000 | 4525 | | 2001 | 3010 | +------+-------------+ Esta sa mostra o lucro total para cada ano, mas se voc tambm quiser determinar o ida e e lucro total somado em todos os anos, voc deve adicionar os valores adicionais ou executar e uma consulta adicional. Ou voc pode usar o ROLLUP, que fornece os dois n e iveis de anlise com uma unica consulta. a Adicionando um modicador WITH ROLLUP a clusula GROUP BY faz com que a consulta a produza outra linha que mostra o total geral de todos os anos: mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP; +------+-------------+ | year | SUM(profit) | +------+-------------+ | 2000 | 4525 | | 2001 | 3010 | | NULL | 7535 | +------+-------------+ A linha de total super-agrupada identicada pelo valor NULL na coluna year. e ROLLUP tem um efeito mais complexo quando h mltiplas colunas GROUP BY. Neste caso, a u cada vez que houver um break (alterao no valor) em qualquer agrupamento, com ca exceo da ultima coluna, a consulta produz um linha resumo super-agrupada extra. ca 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 sa indica os valores resumidos apenas no n ida ivel year/country/product da anlise. a Quando ROLLUP adicionado, a consulta produz diversas linhas extras: e mysql> SELECT year, country, product, SUM(profit)
560
-> 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 | | 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 inclua uma informao resumida ida ca ROLLUP: nos qualtro niveis de anlise, no s em um. Aqui est como interpretar a saida a a o a Seguindo cada conjunto de produtos para um dado ano e pa um linha de resumo is, extra produzida mostrando o total para todos os produtos. Estas linhas tm a coluna e e product atribu com NULL. ida Seguindo cada conjunto de linhas para um dado ano, uma l;inha resumo extra proe e produtos. Estas linhas tm as colunas duzida mostrando o total para todos os paises e country e products atribu idas com NULL. Finalmente, seguindo todas as outras linhas, um linha resumo extra produzida e mostrando o total geral para todos os anos, pa ises e produtos. Esta linha tem as colunas year, country e products atribu idas com NULL. Outras Consideraes ao Usar ROLLUP co O seguinte item lista alguns comportamentos espec icaos para a implementao do ROLLUP ca no MySQL: Quando voc usa ROLLUP, voc no pode usar uma clusula ORDER BY para ordenar os e e a a resultados. (Em outras palavras, ROLLUP e ORDER BY so exclusivos mutualmente.) No a entanto, voc ainda tem algum controle sobre a ordem de ordenao. O GROUP BY no MySQL e ca ordena os resultados, e voc pode usar as palavras chaves ASC e DESC explicitamente com e colunas chamadas na lista GROUP BY para especicar a ordem de classicao para colunas ca individuais. (A linha resumo de n mais alto adicionado por ROLLUP ainda aparece depois ivel da linha para as quais elas so calculadas, considerando a ordenao.) a ca
561
LIMIT pode ser usado para restringir o nmerod e linhas retornadas para o cliente. LIMIT u 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 | | 2000 | India | Computer | 1200 | +------+---------+------------+-------------+ Note que usar LIMIT com ROLLUP pode produzir resultados mais dif iceis de interpretar, porque voc tm menos contexto para entender as linhas super agrupadas. e e O indicador NULL em cada linha super-agrupadas so produzidas quando a linha enviada a e para o cliente. O servidor olha por cada coluna chamada na clusula GROUP BY seguindo a aquela mais a esquerda que tem o valor alterado. Para qualquer coluna no resultado com o nome que uma combinao lxica de qualquer daqueles nomes, seu valor denido com e ca e e NULL. (Se voc especica o agrupamento de colunas pelo nmero da coluna, o servidor e u identica quais colunas denir com NULL pelo nmero.) u Como os valores NULL em linhas super agrupadas so colocadas dentro do resultado como a um estgio posterior no processamento da consulta, voc no pode test-los com valores a e a a NULL dentro da prpria consulta. Por exemplo, voc no pode adicionar HAVING product o e a IS NULL a consulta para eliminar da sa todas as linhas com exceo das agrupadas. ida ca Por outro lado, o valor NULL aparece como NULL no lado do cliente e pode ser testado usando qualquer interface de programao do cliente MySQL. ca
562
No utilize este recurso se as colunas omitidas na parte GROUP BY no so unicas no grupo! a a a Voc obter resultados inexperados. e a Em alguns casos, voc pode utilizar MIN e MAX para obter o valor de uma coluna espec e ica, mesmo que ele no seja unico. O exemplo seguinte fornece o valor de coluna do registro a contendo o menor valor na coluna ordem: SUBSTR(MIN(CONCAT(RPAD(ordem,6, ),coluna)),7) Veja Seo 3.6.4 [example-Maximum-column-group-row], Pgina 197. ca a Note que se voc estiver usando a verso 3.22 do MySQL (ou anterior) ou se estiver tentando e a seguir o SQL-99, voc no pode utilizar expresses nas clusulas GROUP BY or ORDER BY. Voc e a o a e pode contornar esta limitao utilizando um alias para a expresso: ca a mysql> SELECT id,FLOOR(value/100) AS val FROM nome_tabela -> GROUP BY id,val ORDER BY val; Na verso 3.23 do MySQL voc pode fazer: a e mysql> SELECT id,FLOOR(value/100) FROM nome_tabela ORDER BY RAND();
563
Uma expresso SELECT pode utilizar um alias usando AS nome_alias. O alias usado a e como o nome da coluna da expresso e pode ser usado com clusulas ORDER BY ou a a HAVING. Por exemplo: mysql> SELECT CONCAT(primeiro_nome, ,ultimo_nome) AS nome_completo FROM minha_tabela ORDER BY nome_completo; A palavra chave AS opcional quando se utiliza alias em uma expresso SELECT. O e a exemplo anterior poderia ser escrito assim: mysql> SELECT CONCAT(last_name,, ,first_name) full_name FROM mytable ORDER BY full_name; Como AS opcional, pode ocorrer um problema se voc esquecer a v e e irgula entre duas expresses SELECT: O MySQL interpretar o segundo como um nome de alias. Por o a exemplo, na seguinte instruo, columnb tratada como um nome de alias: ca e mysql> SELECT columna columnb FROM mytable; No permitido utilizar um alias de coluna em uma clusula WHERE, pois o valor da a e a coluna pode ainda no ter sido determinado quando a clusula WHERE for executada. a a Veja Seo A.5.4 [Problemas com alias], Pgina 933. ca a A clusula FROM table_references indica a tabela de onde os registros sero retora a nados. Se voc indicar mais de uma tabela, voc estar realizando uma join. Para e e a informaes sobre a sintaxe de join, veja Seo 6.4.1.1 [JOIN], Pgina 567. Para cada co ca a tabela especicada, voc pode, opcionalmente, especicar um alias. e nome_tabela [[AS] alias] [[USE INDEX (lista_indice)] | [IGNORE INDEX (lista_indi Como na verso 3.23.12 do MySQL, voc pode dar sugestes sobre qual a e o indice o MySQL deve usar ao recuperar informaes de uma tabela. Isto util se EXPLAIN mostrar que o co e MySQL esta utilizando o indice errado da lista de indices poss iveis. Especicando USE INDEX (lista_indice) voc pode dizer ao MySQL para usar somente um dos e indices poss iveis para encontrar registros em uma tabela. A sintaxe alternativa IGNORE INDEX (lista_indice) pode ser usada para dizer ao MySQL para no utilizar alguns a indices particulares. Na verso 4.0.9 do MySQL voc tambm pode usar FORCE INDEX. Ele funciona como a e e USE INDEX (lista_indice) mas ele assume que uma varredura em uma tabelas e MUITO cara. Em outras palavras, uma varredura s ser usada se no houver nenhum o a a modo de utilizar um dos indices dados para encontrar registros nas tabelas. USE/IGNORE/FORCE KEY sinnimo de USE/IGNORE/FORCE INDEX. e o Nota: USE/IGNORE/FORCE INDEX afeta apenas os indices usados quando o MySQL decide como encontrar registros na tabela e como fazer a ligao. Ele no tem efeito se ca a um indice ser usado ao resolver um ORDER BY ou GROUP BY. a No MySQL 4.0.14 voc pode usar SET MAX_SEEKS_FOR_KEY=# como um modo alternae tivo de forar o MySQL a preferir a busca em chaves em vez de varrer a tabela. c Voc pode se referir a uma tabela como nome_tabela (dentro do banco de dados e 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 no precisa especicar um prexo e a nome_tabla ou nomebd.nome_tabela para referncia a uma coluna em uma instruo e ca SELECT a menos a referncia seja ambigua. Veja Seo 6.1.2 [Legal names], Pgina 472, e ca a
564
para exemplos de ambiguidade que exigem a forma mais explicita de referncia a e coluna. A partir da verso 4.1.0, voc pode especicar DUAL como um nome de tabela dummy, a e em situaes onde nenhuma tabela for refernciada. Este um recurso puramente para co e e compatibilidade, alguns outros servidores exijem esta sintaxe. mysql> SELECT 1 + 1 FROM DUAL; -> 2 Pode se denir um alias fazendo referncia a uma tabela utilizando nome_tabela [AS] e 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 podem ser referidas em clusulas ORCER BY e GROUP ida a BY usando nomes de colunas, alias de colunas ou posies de colunas. As posies de co co colunas comeam com 1: c 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 clusula ORDER BY na qual voc est ordenando. A ordem padro ascedente; a e a a e ela pode ser especicada explicitamente usando a palavra-chave ASC. Na clusula WHERE, voc pode usar qualquer uma das funes suportadas pelo MySQL. a e co Exceto para funes de agruopamento (resumo) Veja Seo 6.3 [Funes], Pgina 504. co ca co a A clusula HAVING pode se referir a qualquer coluna ou alias denido na express~o_ a a select. Ele aplicado no nal, pouco antes dos itens serem enviados ao cliente, sem e otimizao. LIMIT aplicada depois de HAVING.) estar na clusula WHERE. Por exemplo, ca e a no escreva isto: a 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 verso 3.22.5 ou posterior, voc tambm pode escrever consultar desta forma: a e e mysql> SELECT usuario,MAX(salario) FROM usuarios -> GROUP BY usuario HAVING MAX(salario)>10; Em verses mais antigas, voc pode escrever desta forma: o e mysql> SELECT usuario,MAX(salario) AS soma FROM usuarios -> group by usuario HAVING soma>10; As opes DISTINCT, DISTINCTROW e ALL especicam quando registros duplicados deco vem ser retornados. O padro (ALL), todos os registros coincidentes so retornados. a e a DISTINCT e DISTINCTROW so sinnimos e espcicam que registros duplicados no cona o junto de resultados devem ser remopvidos.
565
STRAIGHT_JOIN, HIGH_PRIORITY e opes comeando com SQL_ so extenses do co c a o MySQL para SQL-99. No MySQL 4.1.1, GROUP BY permite um modicador WITH ROLLUP. Seo 6.3.7.2 [Modicadores GROUP BY], Pgina 558. ca a Veja
HIGH_PRIORITY dar uma prioridade maior ao SELECT do que para uma instruo a ca que atualizam uma tabela. Voc s deve isto para consultas que sejam rpidas e e o a devam ser feitas imediatamente. Uma consulta SELECT HIGH_PRIORITY retornar a se a tabela est bloqueada para leitura memsmo se houver uma instruo de atua ca alizao que estiver esperando a liberao da tabela. ca ca SQL_BIG_RESULT pode ser usado com GROUP BY ou DISTINCT para dizer ao otimizador que o conjunto de resultados ter muitas linhas. Neste caso, o MySQL a usar diretamente tabelas temporarias em disco se necessrio. O MySQL tambm a a e ir, neste caso, preferir ordenar fazendo uma tabela temporria com um cahve a a nos elementos GROUP BY. SQL_BUFFER_RESULT fora para que o resultado seja colocado em uma tabela temc porria. Isto ajuda o MySQL a liberar as travas de tabelas mais cedo e ajudar a a nos casos onde ele lev muito tempo para enviar o conjunto de resultado ao cliente. a SQL_SMALL_RESULT, uma opo especica do MySQL, pode ser usada com GROUP ca BY ou DISTINCT para dizer ao otimizador que o conjunto de resultados ser pea queno. Neste caso, o MySQL usa tabelas temporrias rpidas para armazenar a a a tabela resultante em vez de usar ordenao. Na verso 3.23 do MySQL isto no ca a a e necessrio normalmente. a SQL_CALC_FOUND_ROWS (verso 4.0.0 e acima) diz ao MySQL para calcular quana tas linhas haveriam no conjunto de resultados, desconsiderando qualquer clusula a LIMIT. O nmero de linhas pode ser recuperado com SELECT FOUND_ROWS(). Veja u Seo 6.3.6.2 [Funes diversas], Pgina 547. ca co a Por favor, note que em nverses anteriores a 4.1.0 isto no funciona com LIMIT o a 0, o qual otimizado para retornar instantaneamente (resultando em 0 registros). e Veja Seo 5.2.9 [Otimizao LIMIT], Pgina 437. ca ca a SQL_CACHE diz ao MySQL para armazenar o resultado da consulta em um cache de consultas se voc estiver utilizando QUERY_CACHE_TYPE=2 (DEMAND). Veja Seo 6.9 e ca [Cache de consultas], Pgina 625. No caso da consulta com UNIONs e/ou suba queries esta opo ter efeito se usada em qualquer SELECT da consulta. ca a SQL_NO_CACHE diz ao MySQL para no armazenar o resulado da consulta nesta a cache de consultas. Veja Seo 6.9 [Cache de consultas], Pgina 625. No caso da ca a consulta com UNIONs e/ou subqueries esta opo ter efeito se usada em qualquer ca a SELECT da consulta. Se voc utiliza GROUP BY, os registros de sa sero ordenados de acordo com o GROUP e ida a BY como se voc tivesse um ORDER BY sobre todos os campos no GROUP BY. O MySQL e tem expandido a clusula GROUP BY para que voc tambm possa especicar ASC e DESC a e e depois das colunas chamadas na clusula: a 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 no a esto mencionados na clusula GROUP BY. Se voc no est conseguindo os resultados a a e a a
566
esperados ara a sua consulta, leia a descrio de GROUP BY. Veja Seo 6.3.7 [Group by ca ca functions and modiers], Pgina 555. a A partir do MySQL 4.1.1, GROUP BY permite um modicador WITH ROLLUP. Seo 6.3.7.2 [GROUP BY Modiers], Pgina 558. ca a Veja
A clusula LIMIT pode ser usada para restringir o nmero de linhas retornadas pela a u instruo SELECT. LIMIT utiliza um ou dois agumebntos numricos, que devem ser ca e constants inteiras. Com um argumento. o valor especif o nmero de linhas para retornar do in do ica u icio resultado. Com dois argumentos, o primeiro especica a posio do primeiro registro a ca ser retornado e o segundo especica o nmero mximo de linhas a retornar. A posio u a ca do registro inicial 0 (no 1): e a Para ser compat com o PostgreeSQL, o MySQL suporta a sintaxe: LIMIT row_count ivel OFFSET offset. mysql> SELECT * FROM tabela LIMIT 5,10; # Recupera linhas 6-15 Para recuperar todos os registros de um determinado oset at um m do resultado e voc pode usar um nmero grande como segundo parmetro: e u a Se um dos argumentos dado, ele indica o nmero mximo de linhas a retornar: e u a mysql> SELECT * FROM tabela LIMIT 5; # Recupera as primeiras 5 linhas Em outras palavras, LIMIT n equivalente a LIMIT 0,n. e A forma SELECT ... INTO OUTFILE nome_arquivo do SELECT grava os registros selecionados em um arquivo. O arquivo criado na mquina servidora e no pode j e a a a existir (entre outras coisas, isto previne tabelas de banco de dados e arquivos tais como /etc/passwd de serem destru idos). Voc deve ter o privilgio FILE na mquina e e a servidora para utilizar esta forma de SELECT. A instruo SELECT ... INTO OUTFILE tem como inteno deixar que voc descarregue ca ca e rapidamente um tabela de uma mquina servidora. Se voc quiser criar o arquivo a e resultante em outra mquina, diferente do servidor, voc no deve usar SELECT ... a e a INTO OUTFILE. Neste caso voc deve usar algum programa cliente como mysqldump e --tab ou mysql -e "SELECT..." > outfile para gerar o arquivo. SELECT ... INTO OUTFILE o complemento de LOAD DATA INFILE; a sintaxe para a e parte op~es_exporta~o de uma instruo consiste das mesmas clusulas CAMPOS e co ca ca a LINHAS que so usadas com a instruo LOAD DATA INFILE. Veja Seo 6.4.8 [LOAD a ca ca DATA], Pgina 588. a No arquivo texto resultante, somente os seguintes coracteres so escritos com o caracter a ESCAPE BY: O caracter ESCAPE BY O primeiro caracter em FIELDS TERMINATED BY O primeiro caracter em LINES TERMINATED BY Adicionalmente, ASCII 0 convertido para ESCAPE BY seguido por 0 (ASCII 48). e A razo para o mostrado acima que voc deve escapar qualquer caracter FIELDS a e e TERMINATED BY, ESCAPE BY, or LINES TERMINATED BY para termos a segurana que o c
567
arquivo poder ser lido de volta. E feito escape de ASCII 0 para facilitar a visuzlizao a ca com alguns paginadores. Como o arquivo resultante no tem que estar em conformidade com a sintaxe SQL, a 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 utilizar INTO DUMPFILE em vez de INTO OUTFILE, o MySQL s ir escrever um e o a linha no arquivo, sem nenhum terminador de linha ou colunas e sem realizar nenhum processo de escape. Ele util se voc quiser armazenar um valor BLOB em um arquivo. e e Note que qualuqer arquivo criado por INTO OUTFILE e INTO DUMPFILE sero escritos a por todos os usurios no servidor! A razo que o servidor MySQL no pode criar a a e a um arquivo que pertence a qualquer um alm do usurio que o est executando (voc e a a e nunca deve executar mysqld como root). Assim o arquivo tem que poder ser gravado por todos para que voc possa manipular o seu contedo. e u Uma clusula PROCEDURE chama um procedimento que devia processar os dados em um a resultado. Para um exemplo, veja Seo 14.3.1 [procedure analyse], Pgina 909. ca a Se voc utilizar FOR UPDATE em um mecanismo de armazenamento com locks de pginas e a ou registros, as linhas examinadas sero travadas para escrita at o m da transao a e ca atual.
568
Note que a sintaxe INNER JOIN permite uma condi~o_join apenas a partir da verso ca a 3.23.17. O mesmo acontece para JOIN e CROSS JOIN apenas a partir do MySQL 4.0.11. A ultima sintaxe LEFT OUTER JOIN mostrada na lista anterior s existe para compatibilidade o com ODBC: Pode se usar um alias para referncia a tabelas com nome_tabela AS nome_alias ou e nome_tabela nome_alias: mysql> SELECT t1.nome, t2.salario FROM funcionarios AS t1, info AS t2 -> WHERE t1.nome = t2.nome; A condicional ON qualquer condio da forma que pode ser usada em uma clusula e ca a WHERE. Se no houver registros coincidentes para a tabela a direita da parte ON ou USING em a um LEFT JOIN, uma linha com NULL atribu a todas as colunas usada para a tabela ido e a direita. Voc pode usar este fato para encontrar registro em uma tabela que no e a houver contrapartes em outra tabela mysql> SELECT tabela1.* FROM tabela1 -> LEFT JOIN tabela2 ON tabela1.id=tabela2.id -> WHERE tabela2.id IS NULL; Este exemplo encontra todas as linhas em tabela1 com um valor id que no est a a presente em tabela2 (isto , toda as linhas em tabela1 sem linha correspondente e em tabela2). Assume-se que tabela2.id declarada NOT NULL. Veja Seo 5.2.7 e ca [Otimizao LEFT JOIN], Pgina 435. ca a A clusula USING (lista_colunas) nomeia uma lista de colunas que devem existir em a ambas as tabelas. As seguintes duas clusulas so semanticamente idnticas: a a e 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 denido para ser semanticamente equivae lente a um INNER JOIN ou um LEFT JOIN com uma clusula USING que nomeia todas a as colunas que exitem em ambas as tabelas. INNER JOIN e , (v irgula) so semanticamente equivalentes na ausncia da condio a e ca join: ambos produziro um produto Cartesiano entre as tabelas especicadas. (isto , a e todos os registros na primeira tabela sero ligados com todos os registros na segunda a tabela). RIGHT JOIN funciona de forma anloga a um LEFT JOIN. Para manter o cdigo portvel a o a entre banco de dados, recomendado usar LEFT JOIN em vez de RIGHT JOIN. e STRAIGHT_JOIN 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 e o otimizador join coloca as tabelas na ordem errada. Como na verso 3.23.12, voc pode dar sugestes sobre qual a e o indice o MySQL deve us quando retornar informaes de uma tabela. Isto util se EXPLAIN mostar que co e o MySQL est utilizando o a indice errado da lista de indices poss iveis. Especicando USE INDEX (lista_indice), voc pode dizer ao MySQL para usar somente um dos e indices poss iveis para encontrar registros em uma tabela. A sintaxe alternativa IGNORE INDEX (lista_indice) pode ser usado para dizer ao MySQL para no utilizar a indices particulares.
569
Na verso 4.0.9 do MySQL voc tambm pode utilizar FORCE INDEX. Ele funciona a e e como USE INDEX (key_list) mas com assume que uma varredura na tabela MUITO e cara. Em outras palavras, uma varredura na tabela s ser feita se no houver modo o a a de uitlizar um dos indices fornecidos para se enecontrar registros no tabela. USE/IGNORE KEY so sinnimos de USE/IGNORE INDEX. a o Nota: USE/IGNORE/FORCE INDEX afeta apenas os indices usados quando o MySQL decide como encontrar registros na tabela e como fazer a ligao. Ele no tem efeito se um ca a indice ser usado ao resolver um ORDER BY ou GROUP BY. a Alguns exemplos: mysql> mysql> mysql> mysql> -> mysql> -> mysql> -> FROM tabela1,tabela2 WHERE tabela1.id=tabela2.id; FROM tabela1 LEFT JOIN tabela2 ON tabela1.id=tabela2.id; FROM tabela1 LEFT JOIN tabela2 USING (id); FROM tabela1 LEFT JOIN tabela2 ON tabela1.id=tabela2.id LEFT JOIN tabela3 ON tabela2.id=tabela3.id; SELECT * FROM tabela1 USE INDEX (chave1,chave2) WHERE chave1=1 AND chave2=2 AND chave3=3; SELECT * FROM tabela1 IGNORE INDEX (chave3) WHERE chave1=1 AND chave2=2 AND chave3=3; SELECT SELECT SELECT SELECT * * * *
570
571
The subquery in the above SELECT has a data type of CHAR, a length of 5, a character set and collation equal to the defaults in eect at CREATE TABLE time, and an indication that the value in the column can be NULL. In fact almost all subqueries can be NULL, because if the table is empty as in the example then the value of the subquery will be NULL. There are few restrictions. A subquerys outer statement can be any one of: SELECT, INSERT, UPDATE, DELETE, SET, or DO. A subquery can contain any of the keywords or clauses that an ordinary SELECT can contain: DISTINCT, GROUP BY, ORDER BY, LIMIT, joins, hints, UNIONs, comments, functions, and so on. So, when you see examples in the following sections that contain the rather Spartan construct (SELECT column1 FROM t1), imagine that your own code will contain much more diverse and complex constructions. For example, suppose we make two tables: CREATE TABLE t1 (s1 INT); INSERT INTO t1 VALUES (1); 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
573
SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2); is UNKNOWN when table t2 is empty. In addition, SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2); is UNKNOWN when table t2 is empty. In general, tables with NULLs and empty tables are edge cases when writing subquery code, always consider whether you have taken those two possibilities into account.
574
SELECT DISTINCT store_type FROM Stores WHERE EXISTS (SELECT * FROM Cities_Stores WHERE Cities_Stores.store_type = Stores.store_type); Example: What kind of store is present in no cities? SELECT DISTINCT store_type FROM Stores WHERE NOT EXISTS (SELECT * FROM Cities_Stores WHERE Cities_Stores.store_type = Stores.store_type); Example: What kind of store is present in all cities? SELECT DISTINCT store_type FROM Stores S1 WHERE NOT EXISTS ( SELECT * FROM Cities WHERE NOT EXISTS ( SELECT * FROM Cities_Stores WHERE Cities_Stores.city = Cities.city AND Cities_Stores.store_type = Stores.store_type)); The last example is a double-nested NOT EXISTS query it has a NOT EXISTS clause within a NOT EXISTS clause. Formally, it answers the question does a city exist with a store which is not in Stores?. But its easier to say that a nested NOT EXISTS answers the question is x TRUE for all y?.
575
576
ERROR 1240 (ER_CARDINALITY_COL) SQLSTATE = 21000 Message = "Operand should contain 1 column(s)" This error will occur in cases like this: SELECT (SELECT column1, column2 FROM t2) FROM t1; Its okay to use a subquery that returns multiple columns, if the purpose is comparison. Veja Seo 6.4.2.7 [Row subqueries], Pgina 574. But in other contexts the subquery ca a must be a scalar operand. ERROR 1241 (ER_SUBSELECT_NO_1_ROW) SQLSTATE = 21000 Message = "Subquery returns more than 1 row" This error will occur in cases like this: SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); but only when there is more than one row in t2. That means this error might occur in code that has been working for years, because somebody happened to make a change which aected the number of rows that the subquery can return. Remember that if the object is to nd any number of rows, not just one, then the correct statement would look like this: SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2); 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 t2 LIMIT 1); Replacing a join with a subquery, for example SELECT DISTINCT column1 FROM t1 WHERE t1.column1 IN ( SELECT column1 FROM t2); instead of SELECT DISTINCT t1.column1 FROM t1, t2 WHERE t1.column1 = t2.column1; Moving clauses from outside to inside the subquery, for example: SELECT * FROM t1 WHERE s1 IN (SELECT s1 FROM t1 UNION ALL SELECT s1 FROM t2); instead of SELECT * FROM t1 WHERE s1 IN (SELECT s1 FROM t1) OR s1 IN (SELECT s1 FROM t2); Para outro exemplo: SELECT (SELECT column1 + 5 FROM t1) FROM t2; em vez de: SELECT (SELECT column1 FROM t1) + 5 FROM t2; Using a row subquery instead of a correlated subquery, for example: SELECT * FROM t1 WHERE (column1,column2) IN (SELECT column1,column2 FROM t2); instead of 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
578
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.
579
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
INSERT insere novos registros em uma tabela existente. A forma INSERT ... VALUES da instruo insere registros baseado em valores especicados explicitamente. A forma INSERT ca ... SELECT insere linhas selecionadas de outra(s) tabela(s). A forma INSERT ... VALUES com listas de mltiplos valores suportado a partir da verso 3.22.5. A sintaxe nome_ u e a coluna=express~o suportada a partir da vero 3.22.10 do MySQL. a e a nome_tabela a tabela na qual as linhas sero inseridas. A lista de nome das colunas ou e a a clusula SET indica para quais colunas a instruo especica valor: a ca Se voc no especicar a lista de colunas para INSERT ... VALUES ou INSERT ... e a SELECT, os valores para todas as colunas na tabela devem ser fornecidos na lista VALUES() ou pelo SELECT. Se voc no souber a ordem das colunas nas tabelas, use e a DESCRIBE nome_tabela para descobrir. Qualquer coluna que no tiver o valor fornecido explicitamente assumir o seu valor a a padro. Por exemplo, se voc especicar uma lista de colunas que no denem todas a e a as coolunas na tabela, `s colunas no denidas sero atribu a a a idos o seu valor padro. a Atribuio de valor padro denido em Seo 6.5.3 [CREATE TABLE], Pgina 598. ca a e ca a Voc tambm pode utilizar a palavra-chave DEFAULT para atribuir o valor padro a uma e e a coluna (Novo na verso 4.0.3. do MySQL). Fica mais fcil de se escrever instrues a a co INSERT que atribuem valor a apenas algumas colunas porque ele permite que voc evite e escrever uma lista VALUES() incompleta (uma lista que no inclu um valor para cada a
580
coluna da tabela). De outa forma, voc teria que escrever a lista de nomes de colunas e correspondentes a cada valor na lista VALUES(). MySQL sempre tem uma valor padro para todos os campos. Isto algo imposto pelo a e MySQL para estar apto a funcionar com tabelas transacionais e no transcaionais. a Nossa viso que a vericao do contedo dos campos deve ser feita pela application a e ca u and not in the database server. Uma express~o pode se referir a qualquer coluna que tenha sida denaida anteriora mente na lista de valores. Por exemplo, voc pode dizer: e mysql> INSERT INTO nome_tabela (col1,col2) VALUES(15,col1*2); Mas no: a mysql> INSERT INTO nome_tabela (col1,col2) VALUES(col2*2,15); Se voc especicar a palavra chave DELAYED, o servidor coloca a linha ou linhas a e serem inseridas em um buer, e o cliente que envia a instruo INSERT DELAYED ento ca a pode contiuar. Se a tabela est ocupada, o servidor guarda a linha. Quando a tabela a ca livre, ele comea a inserir linhas, vericando peridicamente para ver se h novos c o a pedidos de leitura para a tabela. Se houver, a la de linhas atrasadas suspensa at e e que a tabela que livre de novo. Se voc especicar a palavra-chave LOW_PRIORITY, a execuo do INSERT atrasada at e ca e e que nenhum outro cliente esteja lendo a tabela. Isto inclui outros clientes que comeam c a ler enquanto clientes existentes j esto lendo e enquanto a instruo INSERT LOW_ a a ca PRIORITY est esperando. E poss a ivel, consequentemente, para um cliente que envia uma instruo INSERT LOW_PRIORITY esperar por um tempo muito longo (ou mesmo para ca sempre) em um ambiente de muita leitura. (E diferente de INSERT DELAYED, que deixa o cliente continuar de uma vez. Veja Seo 6.4.3.2 [INSERT DELAYED], Pgina 582. ca a Note que LOW_PRIORITY no deve normalmente ser usado com tabelas MyISAM ja que a elas disabilitam inseres concorrentes. Veja Seo 7.1 [MyISAM], Pgina 631. co ca a Se voc especicar a palavra-chave IGNORE em um INSERT com muitas linhas, quqlquer e linha que duplicar uma chave PRIMARY ou UNIQUE existente em uma tabela so ignorados a e no so inseridos. Se voc no especicar IGNORE, a insero abortada se houver a a e a ca e quqlquer linhq que duplique um valor de uma chave existente. Voc pode determinar e com funo mysql_info() da API C quantas linhas foram inseridas nas tabelas. ca Se voc especicar se uma clusula ON DUPLICATE KEY UPDATE (noca no MySQL 4.1.0), e a e uma linha que causasse a duplicao de um valor fosse inserida em uma chave PRIMARY ca 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 idntico a e mysql> UPDATE table SET c=c+1 WHERE a=1; Nota: se a coluna b tambm for unica, o comando UPDATE seria escrito como e 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 atualizada! em a geral, deve-se tentar evitar utilizar a clusula ON DUPLICATE KEY em tabelas com a mltiplas chaves UNIQUE. u
581
Desde o MySQL 4.1.1 pode-se utilizar a funao VALUES(nome_coluna) para se referir c ao valor da coluna na parte INSERT do comando INSERT ... UPDATE - que o valor e que seria inserido se no houvesse conitos de chaves duplicadas. Esta funo esa ca e pecialmente util em inseres de mltiplas linhas. Naturalmente a funo VALUES() co u ca s tem sentido em um comando INSERT ... UPDATE e retorna NULL no caso de outros o 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 idntico a e 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 opo DELAYED ignorada. ca e Se MySQL foi congurado usando a opo DONT_USE_DEFAULT_FIELDS, instrues ca co INSERT geram um erro a menos que voc especique valores explicitamete para todas e as colunas que exigem um valor no-NULL. Veja Seo 2.3.3 [Opes do configure], a ca co Pgina 98. a Voc pode encontrar o valor usado por uma coluna AUTO_INCREMENT com a funo e ca mysql_insert_id. Veja Seo 12.1.3.32 [mysql_insert_id()], Pgina 803. ca a Se voc utilizar instrues INSERT ... SELECT ou INSERT ... VALUES com lista de valores e co mltiplos, voc pode utilizar a funo mysql_info() da API C para obter informao sobre u e ca ca a consulta. O formato da string de informao mostrado aqui: ca e Records: 100 Duplicates: 0 Warnings: 0 Duplicates indica o nmero de linhas que no puderam ser inseridas porque duplicariam u a alguns valores de indices unicos existentes. Warnings indica o nmero de tentativas de u insero de um valor em uma coluna que de alguma forma estava problematico. Avisos ca (Warnings) podem ocorrer sob qualquer uma das seguintes condies: co Inserir NULL em uma coluna declarada com NOT NULL. A coluna denida com o seu e valor padro. a Denir uma coluna numrica com um valor que esteja fora da faixa permitida. O valor e revertido para nal apropriado da faixa. e Denir uma coluna numrica com um valor como 10.34 a. O lixo no nal eliminado e e e a parte numrica restante inserida. Se o valor no zer sentido como um nmero, e e a u atribuido 0 a coluna. e Inserir uma string em uma coluna CHAR, VARCHAR, TEXT, ou BLOB e que exceda o tamanho mximo da coluna. O valor truncado para o tamanho mximo da coluna. a e a Inserir um valor em uma coluna date ou time e que seja invlido para o tipo da coluna. a A coluna preenchida com o valor de zero apropriado para o tipo. e
582
Com a instruo INSERT ... SELECT voc pode inserir muitas linhas rapidamente em uma ca e tabela a partir de outras tabelas INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100; As seguintes condies servem para uma instruo INSERT ... SELECT: co ca Antes do MySQL 4.0.1, INSERT ... SELECT operava implicitamente em modo IGNORE. A partir do MySQL 4.0.1, voc deve especicar IGNORE explicitamente para ignorar e registros que causaria violao de chave duplicada. ca Antes do MySQL 4.0.14, a tabela alvo da instruo INSERT no pode aparecer na ca a clusula FROM da parte SELECT da consulta. Esta limitao deixada na verso 4.0.14. a ca e a Colunas AUTO_INCREMENT funcionam da mesma forma. Em programas C, Voc pode usar a funo mysql_info() da API C para obter ine ca formao sobre a consulta. Veja Seo 6.4.3 [INSERT], Pgina 579. ca ca a Para assegurar que o log binrio possa ser usado para re-criar a tabela original, MySQL a no permitir inseres concorrentes em um INSERT ... SELECT. a a co Voc tambm pode utilizar REPLACE em vez de INSERT para sobrescrever linhas antigas. e e REPLACE a contra parte para INSERT IGNORE no tratamento de novas linhas contendo e valores de chave unicos que duplicam linhas antigas: As novas linhas so usadas para a substituir as linhas antigas em vez de descart-las. a
583
comando INSERT DELAYED e handler a thread que trata todas as instrues INSERT e co DELAYED de uma tabela particular. Quando uma thread executa uma instruo DELAYED em uma tabela, uma thread hanca dler criada para processar todas as instruoes DELAYED para a tabela, se tal handler e c ainda no existir. a A thread verica se o handler j adquiriu uma trava DELAYED; se no, ele diz a thread a a handler para faz-lo. A trava DELAYED pode ser obtida mesmo se outras threads tiver e uma trava de LEITURA ou ESCRITA na tabela. De qualquer forma, o handler ir esperar a por todas as travas ALTER TABLE ou FLUSH TABLES para se assegurar que a estrutura da tabela est atualizada. a A thread executa a instruo INSERT, mas em vez de escrever a linha na tabela, ela ca pe uma cpia da linha nal na la que gerenciada pela thread handler. Quaisquer o o e erros de sintaxe so noticados pela thread e relatadas ao programa cliente. a O cliente no pode relatar o nmero de duplicatas ou o valor AUTO_INCREMENT para a u a linha resultante; ele no pode obt-los do servidor, pois o INSERT retorna antes da a e operao de insero ser completada. Se voc utiliza a API C, a funo mysql_info() ca ca e ca no ir retornar nada signicante, pela mesma razo. a a a O log binrio atualizado pela thread handler quando a linha inserida na tabela. No a e e caso de insero de mltiplas linhas, o log binrio atualizado quando a primeira linha ca u a e inserida. e Depois que todas as linhas delayed_insert_limit so escrita, o handle verica se a alguma instruo SELECT est pendente. Se estiver, ele permite que ela seja executada ca a antes de continuar. Quando o handler no tiver mais linhas na la, a tabela destravada. Se nunhum coa e mando INSERT DELAYED novo recebido dentro de delayed_insert_timeout segundos, e o handler termina. Se mais que delayed_queue_size esto pendentes em uma la handler espec a ica, a thread requisitando INSERT DELAYED espera at que haja espa na la. Isto feito e co e para assegurar que o servidor mysqld no utilize toda a memria rea de memria de a o a o atraso. A thread handler ir aparecer na lista de processos do MySQL process list com a delayed_insert na coluna Command. Ela ser nalizada se voc executar um a e comando FLUSH TABLES ou mat-la com KILL thread_id. No entanto, primeiro ela a armazenar todas as linhas enleiradas na tabela antes de sair. Durante este tempo a ela no aceitar nenhum comando INSERT novo da outra thread. Se voc executar um a a e comando INSERT DELAYED depois disto, uma nova thread handler ser criada. a Note que o mostrado acima signica que o comando INSERT DELAYED tem prioridade maior que um comando INSERT normal se j houver um handler INSERT DELAYED em exa ecuo! Outro comando de atualizao ter que esperar at que a la INSERT DELAYED ca ca a e esteja vazia, algum nalize a thread handler (com KILL thread_id), ou algum exee e cute FLUSH TABLES. As seguintes variveis de estado fornecem informo sobre comandos INSERT DELAYED: a ca Varivel a Delayed_insert_threads Signicado Nmero de threads handler u
584
Delayed_writes Nmeros de linhas escrita com INSERT DELAYED u Not_flushed_delayed_ Nmero de linhas esperando para serem escritas u rows Voc pode visualizar estas variveis com a instruo SHOW STATUS ou executando um e a ca comando mysqladmin extended-status. Note que INSERT DELAYED mais lento que um INSERT normal se a tabela no estiver e a em uso. Tambm h uma sobrecarga adicional para o servidor tratar um thread separada e a para cada tabela na qual voc utiliza INSERT DELAYED. Isto signica que voc s deve usar e e o INSERT DELAYED quando voc estiver certo de necessita dele! e
585
A partir do MySQL verso 3.23, voc pode utilizar LIMIT row_count para restringir o a e escopo do UPDATE. Uma clusula LIMIT funciona da seguinte forma: a Antes do MySQL 4.0.13, LIMIT uma restrio que afeta as linhas. A instruo para e ca ca assim que altera row_count linhas que satisfaam a clusula WHERE. c a Da verso 4.0.13 em diante, LIMIT uma restrio de linhas correspondentes. A ina e ca struo para assim que ela encontrar row_count linhas que satisfaam a clusula WHERE, ca c a tendo elas sido alteradas ou no. a Se uma clusula ORDER BY utilizada (dispon no MySQL 4.0.0), as linhas sero atuala e ivel a izadas nesta ordem. Isto s util em conjunto com LIMIT. oe A partir da MySQL Verso 4.0.4, voc tambm pode realizar operaes UPDATE que cobrem a e e co mltiplas tabelas: u 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 instrues UPDATE co multi-tabelas podem usar qualquer tipo de join permitida na instruo SELECT, como LEFT ca JOIN. Nota: voc no pode utilizar ORDER BY ou LIMIT com multi-tabelas UPDATE. e a
586
Se voc realmente quiser saber quantos registros so deletados quando voc deletar todas as e a e linhas mesmo sofrendo uma com a queda da velocidade, voc pode utilizar uma instruo e ca DELETE desta forma: mysql> DELETE FROM nome_tabela WHERE 1>0; Note que isto muito mais lento que DELETE FROM nome_tabela sem clusula WHERE, pois e a ele deleta uma linha de cada vez. Se voc especicar a palavra-chave LOW_PRIORITY, a execuo do DELETE atrasda at que e ca e e nenhum outro cliente esteja lendo da tabela. Para tabelas MyISAM, Se voc especicar a palavra QUICK, o mecanismo de armazenamento e no ir fundir os indices exclu a a idos durante a deleo, o que pode aumentar a velocidade de ca certos tipos de deleo. ca A velocidade das operaes de deleo tambm pode ser afetadas pelos fatores discutidos co ca e em Seo 5.2.12 [Delete speed], Pgina 440. ca a A opo IGNORE faz com que o MySQL ignore todos os erros durente o processo de deleo ca ca dos registros. Erros encontrados durante o estgio de anlise so processados da maneira a a a comum. Erros que so ignorados devido ao uso desta opo so retornados como aviso. a ca a Esta opo aparece pela primeira vez na verso 4.1.1. ca a Em tabelas MyISAM, registros deletados so mantidos em uma lista encadeada e operes a co INSERT subsequentes reutilizam posies de registros antigos. Para recuperar espeos co c no utilizados e reduzir o tamanho do arquivo, utilize a instruo OPTIMIZE TABLE ou a ca o utiliztrio myisamchk para reorganizar as tabelas. OPTIMIZE TABLE mais fcil, mas a e a myisamchk mais rpido. Veja Seo 4.6.1 [OPTIMIZE TABLE], Pgina 298 e Seo 4.5.6.10 e a ca a ca [Optimization], Pgina 291. a O primeiro formato de delo de multi-tabelas suportado a partir do MySQL 4.0.0. O ca e segundo formato de deleo multi-tabelas suportado a partir do MySQL 4.0.2. ca e A idia que apenas linhas coincidentes da tabelas listadas antes de FROM ou antes da e e clusula USING so deletadas. O efeito que voc pode deletar l;inhas de muitas tabelas ao a a e e mesmo tempo e tambm ter tabelas adicionais que so utilizadas para busca. e a O .* depois do nome da tabela existe apenas para ser compat com o Access: ivel 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 ns deletamos linhas coincidente apenas na tabela t1 e t2. o O exemplo mostra um inner join usando o operador de v irgula, mas instrues UPDATE co multi-tabelas podem usar qualquer tipo de join permitida na instruo SELECT, como LEFT ca JOIN. Se uma clusula ORDER BY utilizada (dispon no MySQL 4.0.0), as linhas sero deletadas a e ivel a naquela ordem. Isto s util se usado em conjunto com LIMIT. Por exemplo: oe DELETE FROM somelog WHERE user = jcole ORDER BY timestamp
587
LIMIT 1 Isto ir deletar as entradas antigas (por timestamp) onde as linhas casam com a clusula a a WHERE. A opo espec ca ica do MySQL LIMIT row_count para DELETE diz ao servidor o nmero u mximo de linhas a serem deletadas antes do controle retornar ao cliente. Isto pode ser a usado para assegurar que uma comando DELETE espec ico mo tomar muito tempo, Voc a a e pode simplesmente repetir o comando DELETE at que o nmero de linhas afetadas seja e u menor que o valor LIMIT. No MySQL 4.0, voc pode especicar mltiplas tabelas na instruo DELETE para deletar e u ca linhas de uma ou mais tabelas dependendo de uma condio particular em vrias tabelas. ca a No entanto voc no pode utilizar ORDER BY ou LIMIT em uma multi-tabela DELETE. e a
ou
ou
REPLACE funciona exatamente como o INSERT, exceto que se um registro antigo na tabela tem o mesmo valor que um novo registro em um indice UNIQUE ou PRIMARY KEY, o registro antigo deletado antes que o novo registro seja inserido. Veja Seo 6.4.3 [INSERT], e ca Pgina 579. a
588
Em outras palavras, voc no pode acessar os valores do registro antigo em uma instruo e a ca REPLACE. Em algumas verses antigas do MySQL aparentemente voc podia fazer isto, mas o e era um bug que j foi arrumado. a Par aestar apto a utilizar REPLACE voc deve ter privilgios INSERT e DELETE para a tabela. e e Quando voc utilizar um comando REPLACE, mysql_affected_rows() retornar 2 se a nova e a linha substituir uma linha antiga. Isto porque uma linha foi inserida depois que a linha e duplicada foi deletada. Este fato torna fcil determinar se REPLACE adicionou ou subsitituiu uma linha: verique a se o valor de linhas afetadas 1 (adicionado) ou 2 (substituido). e Note que a menos que a tabela utilize indices UNIQUE ou PRIMARY KEY, utilizar um comando REPLACE replace no faz sentido. Ele se torna equivalente a um INSERT, porque no existe a a indice a ser usado para determinar se uma nova linha duplica outra. Seqgue aqui o algoritmo usado em mais detalhes: (Ele tambm usado com LOAD DATA ... e e REPLACE. - Insere a linha na tabela - Enquanto ocorrer erro de chave duplicada para chaves primria ou nica a u - Reverte as chaves alteradas - Le as linha conflitantes da tabela atravs do valor da chave duplicada e - Deleta as linhas conflitantes - Tenta inserir o chave primria e nica original na rvore a u a
589
DATA INFILE em arquivos do servidor, voc deve ter privilgio FILE na mquina servidora. e e a Veja Seo 4.3.7 [Privilgios fornecidos], Pgina 236. ca e a A partir do MySQL 3.23.49 e MySQL 4.0.2 (4.0.13 no Windows) LOCAL s funcionar se o o a seu servidor e o seu cliente forem habilitados para permitir isto. Por exemplo so o mysqld foi iniciado com --local-infile=0, LOCAL no ir funcionar. Veja Seo 4.3.4 [LOAD a a ca DATA LOCAL], Pgina 231. a Se voc especicar a palavra-chave LOW_PRIORITY, a execuo da instruo LOAD DATA e ca ca e atrasada at nenhum outro cliente estar lendo a tabela. e Se voc especicar a palavra-chave CONCURRENT com uma tabela MyISAM, outras threads e podem retornar dados da tabela enquanto LOAD DATA est executando. Utilizar esta opo a ca ir afetar o desempenho de LOAD DATA um pouco, mesmo se nenhuma outra thread utilizar a a tabela ao mesmo tempo. Utilizar LOCAL ser um pouco mais lento que deixar o servidor acessar os arquivos diretaa mente, pois o contedo do arquivo deve ser enviado pela conexo da mquina cliente at a u a a e mquina servidora. Por outro lado, voc no precisa de ter o privilgio FILE para carregar a e a e arquivos locais. Se voc estiver utilizando uma verso do MySQL anterior a 3.23.24, voc no poder ler de e a e a a um FIFO com LOAD DATA INFILE. Se voc precisar ler de um FIFO (por exemplo a sa e ida de gunzip), utilize LOAD DATA LOCAL INFILE. Voc tambm pode carregar arquivo de dados utilizado o utilitrio mysqlimport; ele opera e e a enviando um comando LOAD DATA INFILE para o servidor. A opo --local faz com que ca mysqlimport leia ao arquivo de dados a partir da mquina cliente. Voc pode especicar a e a opo --compress para conseguir melhor desempenho sobre redes lentas se o cliente e o ca servidor suportar protocolos compactados. Ao localizar arquivos na mquina servidora, o servidor utiliza as segintes regras: a Se um caminho absoluto dado, o servidor utiliza o caminho desta forma. e Se um caminho relativo com um ou mais componentes dados, o servidor busca o e arquivo em relao ao diretrio de dados do servidor. ca o Se um nome de arquivo sem nenhum componente dado, o servidor procura pelo e arquivo no diretorio de banco de dados do banco de dados atual. Note que estas regras signicam que um arquivo chamado ./myfile.txt lido no diretrio e o de dados do servidor, enquanto um arquivo chamado myfile.txt l o diretrio de dados do e o naco de dados atual. Por exemplo, a seguinte instruo LOAD DATA l o arquivo data.txt ca e do diretrio de dados de db1 pois db1 o banco de dados atual, mesmo que a instruo o e ca 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 unica. Se voc especicar REPLACE, as linhas inseridas substituiro as linhas existentes (em outras e a palavras, linhas que tiverem o mesmo valor de um indice primrio ou unico como linhas a existentes). Veja Seo 6.4.7 [REPLACE], Pgina 587. ca a
590
Se voc especicar IGNORE, registros inseridos que duplicam uma linha existente em um e valor de chave unica ser ignorados. Se voc no especicar nenhuma das opes, o com a e a co portamento depende de se a palavra chave LOCAL especicada ou no. Sem LOCAL, um erro e a ocorre quando um valor de chave duplicada encontrado, e o resto do arquivo texto ignoe e rado. Com LOCAL o comportamento padro o mesmo de quando IGNORE for especicado, a e isto porque o servidor no tem como parar no meio da operao. e a ca Se voc quiser ignorar as restries de chaves estrangeiras durante a carga voc pode faze e co e SET FOREIGN_KEY_CHECKS=0 antes de executar LOAD DATA. Se voc utiliza LOAD DATA INFILE em uma tabela MyISAM vazia, todos os e indices no-nicos a u so criados em um batch separado (como em REPAIR). Isto normalmente torna LOAD DATA a INFILE muito mais rpido quando voc tem diversos a e indices. Normalmente isto muito e rpido mas em casos extremos voc pode tornar o a e indice mais rpido ainda desligando-os a com ALTER TABLE .. DISABLE KEYS e usando ALTER TABLE .. ENABLE KEYS para recriar os indices. Veja Seo 4.5.6 [Manuteno de tabelas], Pgina 280. ca ca a LOAD DATA INFILE o complemento de SELECT ... INTO OUTFILE. Veja Seo 6.4.1 e ca [SELECT], Pgina 562. Para gravar dados de uma tabela em um arquivo, use SELECT ... a INTO OUTFILE. Para ler o arquivo de volta em uma tabela, use LOAD DATA INFILE. A sintaxe das clusulas FIELDS e LINES a mesma para ambos os comandos. Ambas as a e clusulas so opicionais, mas FIELDS deve preceder LINES se ambos so especicados. a a a Se voc especicar uma clusula FIELDS, cada uma das subclusulas (TERMINATED BY, e a a [OPTIONALLY] ENCLOSED BY, e ESCAPED BY) tambm so opicionais, exceto pelo fato de e a que voc deve especicar pelo menos uma delas. e Se voc no especicar uma clusula FIELDS, o padro o mesmo que se voc tivesse escrito e a a a e e isto: FIELDS TERMINATED BY \t ENCLOSED BY ESCAPED BY \\ Se voc no especicar uma clusula LINES, o padro o mesmo que se voc tivesse escrito e a a a e e isto: LINES TERMINATED BY \n Nota: Se voc gerou o arquivo texto no Windows, voc deve alterar o mostrado acima para: e e LINES TERMINATED BY \r\n j que o Windows utiliza dois caracteres como um terminador a de linha. Alguns programas como wordpad, pode usar \r como terminador de linha. Se todas as linas que voc deseja ler tem um prexo comum que voc quer saltar, voc pode e e e usar LINES STARTING BY prefix_string. Em outras palavras, o padro faz com que LOAD DATA INFILE funcione da seguinte maneira a ao se ler uma entrada: Procure pelo limite da linha em linhas novas. Se LINES STARTING BY prefix for usado, l at que o prexo seja encontrado e comea e e c a ler o caracter seguinte ao prexo. Se a linha no inclui o preco e;a ser saltada. a a Quebre a linha em campos na tabulaes. co No espere que os campos estejam entre aspas. a Interprete a ocorrncia de tabulaes, novas linhas ou \ precedidos por \ como e co caracteres literias que so parte dos valores dos campos. a
591
Inversamente, os padres fazem SELECT ... INTO OUTFILE funcionar da seguinte forma ao o escrever as sa idas: Escreva tabulaes entre os campos. co No coloque campos entre aspas. a Utilize \ para considerar como parte dos campos instncias de tabulao, nova linha a ca ou \ que estejam dentro dos valores dos campos. Escreva novas linhas no m de cada linha. Note que para escrever FIELDS ESCAPED BY \\, voc deve especicar duas barras invere tidas para que o valor seja lido como uma unica barra invertida. A opo IGNORE nmero LINES pode ser utilizado para ignorar linhas no inicio do arquivo. ca u Por exemplo, voc pode usar IGNORE 1 LINES para saltar uma linha de cabealho contendo e c nomes de colunas: mysql> LOAD DATA INFILE "/tmp/file_name" INTO TABLE test IGNORE 1 LINES; Quando voc utiliza SELECT ... INTO OUTFILE em conjunto com LOAD DATA INFILE para e escrever os dados de um banco de dados em um arquivo e ento ler o arquivo de volta no a banco de dados posteriormente, as opes para tratamento de linhas e campos para ambos co os comandos devem coincidir. Seno, LOAD DATA INFILEno ir interpretar o contedo do a a a u arquivo de forma apropriada. Suponha que voc utilize SELECT ... INTO OUTFILE para e 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 instruo correta seria: ca mysql> LOAD DATA INFILE data.txt INTO TABLE table2 -> FIELDS TERMINATED BY ,; Se voc tentasse ler do arquivo com a instruo abaixo, no iria funcionar pois ela instrui e ca a LOAD DATA INFILE a procurar por tabulaes entre campos: co mysql> LOAD DATA INFILE data.txt INTO TABLE table2 -> FIELDS TERMINATED BY \t; O resultado desejado que cada linha de entrada fosse interpretada como um unico campo. e LOAD DATA INFILE pode ser usado para ler arquivos obtidos de fontes externas. Por exemplo, um arquivo no formato dBASE ter campos separados por v a irgulas e entre aspas duplas. Se as linhas no arquivo so terminadas por com uma nova linha, o comando mostardo aqui a ilustra as opes do tratamento de campos e linhas que voc usaria pra carregar o arquivo. co e the le: mysql> LOAD DATA INFILE data.txt INTO TABLE nome_tabela -> FIELDS TERMINATED BY , ENCLOSED BY " -> LINES TERMINATED BY \n; Qualquer uma das opes de tratamento de campos e linhas podem especicar uma string co vazia (). Se no for vazio, os valores de FIELDS [OPTIONALLY] ENCLOSED BY e FIELDS a ESCAPED BY devem ser um caracter simples. Os valores de FIELDS TERMINATED BY e LINES
592
TERMINATED BY podem ser mais de uma caracter. Por exemplo, para escrever linhas terminadas pelos par retorno de carro/alimentao de linha, ou para ler um arquivo contendo ca tais linhas, especique uma clusula LINES TERMINATED BY \r\n. a Por exemplo, para ler um arquivo de piadas, que so separadas com uma linha de %%, em a uma tabela SQL, voc pode fazer: e 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 citao dos campos. Para saida (SELECT ca ... INTO OUTFILE), se voc omitir a palavra OPTIONALLY, todos os campos estaro entra e a o caracter ENCLOSED BY. Um exemplo de tal sa (usando v ida irgula como delimitador de campo) mostrado abaixo: e "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 especicar OPTIONALLY, o caracter ENCLOSED BY s usados para delimitar campos e oe 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 ocorrncia de caracter ENCLOSED BY dentro do valor do campo indicado coloe e cando um caracter ESCAPED BY antes dele. Note tambm que se voc especicar um valor e e ESCAPED BY vazio, poss e ivel gerar sa idas que no podero ser lidas aprorpiadamente por a a LOAD DATA INFILE. Por exemplo, a sa mostrada seria apareceria como a seguir se o carida acter de escape fosse vazio. Observe que o segundo campo na quarta linha contm uma e v irgula 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
Para entrada, o caracter ENCLOSED BY, se presente, ser eliminado do m dos valores dos a campos. (Isto verdade se OPTIONALLY for especicado; OPTIONALLY no tem efeito na e a interpretao da entrada). A ocorrncia de caracteres ENCLOSED BY precedido pelo caracter ca e ESCAPED BY so interpretados como parte do campo atual. a Se o campo comea com o caracter ENCLOSED BY, instncias daquele caracter so reconhecic a a dos como terminao de um valor do campo apenas se seguido pelo campo ou sequncia de ca e linah TERMINATED BY. Para evitar ambiguidade, ocorrncias do caracter ENCLOSED BY dene tro de um valor de campo pode ser duplicado e ser interpretado como uma unica instncia a a do caracter. Por exemplo, se ENCLOSED BY " for especicado, aspas sero tratadas como a mostrado abaixo: "The ""BIG"" boss" -> The "BIG" boss
593
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 no estivaer vazio, ele ser usado para preceder o seguinte caracter de sa a a 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 escrito seguido de um caracter de escape ASCII 0, no o byte de e e a valor zero). Se o caracter FIELDS ESCAPED BY estiver vazio, nenhum caracter ser escapado. Provavela mente no uma boa idia especicar um caracter de escape vazio, principalmente se os a e e valores dos campos em seus conter qualquer caracter na lista dada. Para entradas, se o caracter FIELDS ESCAPED BY no estiver vazio, as ocorrncias daquele a e caracter so eliminadas e o caracter seguinte tomado como parte do valor do campo. As a e excees so um 0 ou N escapado (por exemplo, \0 ou \N se o caracter de escape for co a \). Estas sequencias so interpretadas como os ASCII 0 (um byte de valor zero) e NULL. a Veja abaixo as regras no tratamento de NULL. Para maiores informaes sobre a sintaxe \-escape, veja Seo 6.1.1 [Literals], Pgina 469. co ca a Em certos casos, as opes de tratamento de campoe e linhas se interagem: co Se LINES TERMINATED BY uma string vazia e FIELDS TERMINATED BY no vazio, as e a e linhas tambm sero terminadas com FIELDS TERMINATED BY. e a Se os valores FIELDS TERMINATED BY e FIELDS ENCLOSED BY so ambos vazios (), um a formato de linha de tamanhos xos (sem delimitadores) utilizada. Com formato de e linhas de tamanho xo, nenhum deliitador usado entre os campos (mas voc ainda e e pode ter um terminador de linha). Valores de colunas so escritos e lidos usando o a tamanho denido das colunas. Por exemplo, se uma coluna declarada como INT(7), e os valores das colunas so escritos utilizando campos de 7 caracteres. Na sa a ida, os valores das colunas so obtidos lendo 7 caracteres. a LINES TERMINATED BY ainda usado para separar linhas. Se uma linha no contm e a e todos os campos, o resto dos campos sero congurados com o seu valor padro. Se a a voc no tiver um terminador de linha, voc deve deni-lo com . Neste caso o arquivo e a e texto deve conter todos os campos para cada linha. O formato de linhas de tamanho xo tambm afetam o tratamento de valores NULL; e veja abixo. Note que este formato no funciona se voc estiver utilizando um conjunto a e de caracteres mulyi-byte. O tratamento do valor NULL varia, dependendo das opes de FIELDS e LINES que voce co usar: Para os valores FIELDS e LINES padres, NULL escrito como \N para sa e \N lido o e ida e como NULL para as entradas (assumindo que o caracter ESCAPED BY \). e Se FIELDS ENCLOSED BY no for vazio, um campo contendo a palavra literal NULL como a seu valor lido como um valor NULL (isto difere da palavra NULL entre os caracteres e FIELDS ENCLOSED BY, a qual lida como a string NULL). e Se FIELDS ESCAPED BY for vazio, NULL escrito como a palavra NULL. e
594
Com os formatos de tamanho xos (que acontecem quando FIELDS TERMINATED BY e FIELDS ENCLOSED BY estiverem ambos vazios), NULL escrito como uma string vazia. e Note que isto faz com que os valores NULL e uma string vazia na tabela sero indista ing uiveis quando escritas no arquivo pois elas so ambas escritas como strings vazias. a Se voc precisar estar saber diferenciar as duas ao ler o arquivo de volta, voc no deve e e a utilizar o formato de tamanho xo. Alguns casos no so suportados por LOAD DATA INFILE: a a Linhas de tamanho xo (FIELDS TERMINATED BY e FIELDS ENCLOSED BY vazios) e colunas BLOB ou TEXT. Se voc especicar um separador que igual ao prexo do outro, LOAD DATA INFILE e e no poder interpretar a entratada apropriadamente. Por exemplo, a seguinte clusula a a a FIELDS causaria problemas: FIELDS TERMINATED BY " ENCLOSED BY " Se FIELDS ESCAPED BY estiver vazio, um valor de campo que contm uma ocorrncia de e e FIELDS ENCLOSED BY ou LINES TERMINATED BY seguido por valores FIELDS TERMINATED BY far com que LOAD DATA INFILE pare de ler um campo ou linha antes do esperado. a Isto ocorre porque LOAD DATA INFILE no pode determinar apropriadamente onde o a 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 especicada, assim LOAD DATA INFILE espera linhas de entradas e que contenha um campo para cada coluna da tabela. Os valores padres de FIELDS e LINES o so usados. a Se voc deseja carregar somente algumas das colunas das tabelas, especique uma lista de e campos: mysql> LOAD DATA INFILE persondata.txt -> INTO TABLE persondata (col1,col2,...); Voc deve especicar uma lista de campos se a ordem dos campos no arquivo de entrada e diferem da ordem das colunas na tabela. Seno o MySQL no poder dizer como combinar a a a os campos da entrada nas colunas da tabela. Se uma linha tiver poucos campos, as colunas para os quais o campo de entrada no esa tiverem presentes sero denidas com o valor padro. Atribuio de valor padro descrito a a ca a e em Seo 6.5.3 [CREATE TABLE], Pgina 598. ca a Um valor de campo vazio interpretado de forma diferente de que se o valor do campo e estiiver faltando: Para tipos string, a coluna denida com uma string vazia. e Para tipos numricos, a coluna denida com 0. e e Para tipos de data e hora, a coluna denida com o valor zero apropriado para o e tipo. Veja Seo 6.2.2 [Tipos date e time], Pgina 489. ca a Note que estes so os mesmos valores que resultam se voc atribuir uma string vazia exa e plicitamente a um tipo string, numrico, de data ou de hora em uma instruo INSERT ou e ca UPDATE.
595
Colunas TIMESTAMP s so denidas com a hora e data atual se houver um valor NULL para o a a coluna (isto , \N), ou (apenas para a primeira coluna TIMESTAMP) se a coluna TIMESTAMP e esta a esquerda da lista de campos quando esta for especicada. Se uma linha de entrada tiver muitos campos, os campos extras sero ignorados e o nmero a u de avisos incrementado. Note que antes do MySQL 4.1.1 o aviso apenas um nmero que e e u indica que alguma coisa deu errado. No MySQL 4.1.1 voc pode fazer SHOW WARNINGS para e obter mais informaes sobre o que deu errado. co LOAD DATA INFILE considera todas as entradas como strings, assim voc no pode utiliar e a valores numricos para colunas ENUM ou SET do mesmo modo que voc pode com instrues e e co INSERT. Todos os valores ENUM e SET devem ser espec icados como strings! Se voc estiver usando a API C, voc pode obter informaes sobre a consulta chamando a e e co funo mysql_info() da API C quando a consulta LOAD DATA INFILE terminar. O formato ca da string de informao mostrado aqui: ca e Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 Avisos ocorrem sob as mesmas circuntncias que quando so inseridos via instruo INSERT a a ca (veja Seo 6.4.3 [INSERT], Pgina 579), exceto que LOAD DATA INFILE tambm gera avisos ca a e quando houver poucos ou muitos campos na linha de entrada. Os avisos no so armazenaa a dos em nenhum local; o nmero de avisos s pode ser utilizado como uma indicao se tudo u o ca correr bem. Se voc obter avisos e quiser saber exatamente porque eles ocorreram, um modo de se e fazer isto utilizar SELECT ... INTO OUTFILE em outro arquivo e campor-lo ao arquivo de e a entrada original. Se voc precisar que LOAD DATA leia de um pipe, voc pode utilizar o seguinte truque: e e 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 estiver usando uma verso do MySQL a anterior a 3.23.25 voc s poder fazer o e a e o a descrito acima com LOAD DATA LOCAL INFILE. No MySQL 4.1.1 voc pode usar SHOW WARNINGS para conseguir a lista do primeiros max_ e error_count avisos. Veja Seo 4.6.8.9 [SHOW WARNINGS], Pgina 323. ca a Para mais informaes sobre a ecincia de INSERT versus LOAD DATA INFILE e a melhora co e na velocidade de LOAD DATA INFILE, Veja Seo 5.2.10 [Velocidade da insero], Pgina 438. ca ca a
596
A instruo HANDLER fornece acesso direto a interface do mecanismo de armazenamento de ca tabelas MyISAM. A primeira forma da instruo HANDLER abre uma tabela, tornando a acess atravs de ca ivel e subsequentes instrues HANDLER ... READ. Este objeto de tabela no copartilhada com co a e outras threads e no sero fechadas at que as chamadas de thread HANDLER nome_tabela a a e CLOSE ou a thread termine. A segunda forma busca um registro (ou mais, especicado pela clusula LIMIT) onde o a indice especicado satisfaz os valores dados e a condio WHERE encontrada. Se voc tiver um ca e e indice multi-coluna, especique as colunas do indice como uma lista separadas por v irgulas. Especique o valor de todas as colunas no indice, ou especique valores para o prexo mais a esquerda das colunas indices. Suponha que um indice inclui trs colunas chamadas col_a, e col_b, e col_c, nesta ordem. A instruo HANDLER pode especicar valores para todas as ca trs colunas no e indice, ou para as colunas no prexo mais a esquerda. Por exemplo: HANDLER ... index_name = (col_a_val,col_b_val,col_c_val) ... HANDLER ... index_name = (col_a_val,col_b_val) ... HANDLER ... index_name = (col_a_val) ... A terceira forma busca uma linha (ou mais, especicado pela clusula LIMIT) da tabela na a ordem do indice, correspondendo a condio WHERE. ca A quarta forma (sem especicao de indice) busca um registro (ou mais, especicado pela ca clusula LIMIT) da tabela na ordem natural da linhas (como armazenado no arquivo de a dados) de acordo com a condio WHERE mais rpido que HANDLER nome_tabela READ ca e a nome_indice quando necessria uma varredura completa da tabela. e a HANDLER ... CLOSE fecha uma tabela que foi aberta com HANDLER ... OPEN. Nota: Se voc estiver utilizando a interface HANDLER para PRIMARY KEY voc deve se lembrar e e de colocar o nome entre aspas: HANDLER tbl READ PRIMARY > (...) HANDLER uma instruo de baixo n e ca ivel. Por exemplo, ela no fornece consitncia. Isto , a e e HANDLER ... OPEN NAO pega uma imagem instntanea da tabela, e NAO trava a tabela. a Isto signica que depois que um HANDLER ... OPEN feito, os dados da tabela podem e ser modicados (por esta ou outra thread) e estas modicaes podem aparecer apenas co parcialmente nas buscas HANDLER ... NEXT ou HANDLER ... PREV. As razes para se utilizar esta interface em vez do SQL normal so: o a Ela mais rpida que SELECT porque: e a Um mecanismo de armazenamento designado alocado pela thread em HANDLER e OPEN. Existe menos anlise envolvida. a N`o existe sobrecaga de otimizao e vericao de consultas. a ca ca A tabela utilizada no precisa estar travada em pedidos de dois handlers. a A interface handler no precisa fornecer uma aprncia consistente dos dados (por a e exemplo, dirty-reads so permitidas), assim o mecanismo de armazenamento pode a fazer otimizaes que o SQL normalmente no permite. co a E muito mais fcil portar aplicaes que usam interface como ISAM para o MySQL. a co Ele permite se fazer uma travessia em um banco de dados de uma maneira que no a e facil (em alguns casos impossivel) de fazer com SQL. A interface handler um modo e
597
mais natural de mostrar dados ao trabalhar com aplicaes que fornecem uma interface co interativa com o usurio para o banco de dados. a
6.4.10 Sintaxe DO
DO express~o, [express~o, ...] a a Executa a expresso mas no retorna nenhum resultado. Este um modo curto de SELECT a a e express~o, express~o, mas tem a vantagem de ser rpida quando voc no se preocupa a a a e a com o resultado. Ele util principalmente com funes que tem efeitos em um dos lados, como RELEASE_LOCK. e co
598
No MySQL Verso 3.22 ou posterior, voc pode utilizar a palavra chave IF EXISTS para a e prevenir da ocorrncia de um erro se o banco de dados no existir. e a Voc tambm pode deletar um banco de dados com mysqladmin. Veja Seo 4.9 [Scripts e e ca do Lado do Servidor], Pgina 345. a
599
| | | | | | |
index_nome_coluna: nome_coluna [(tamanho)] [ASC | DESC] defini~o_refer^ncia: ca e REFERENCES nome_tabela [(index_nome_coluna,...)] [MATCH FULL | MATCH PARTIAL] [ON DELETE op~o_refer^ncia] ca e [ON UPDATE op~o_refer^ncia] ca e op~o_refer^ncia: ca e RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT op~es_tabela: table_option [table_option] ... co op~es_tabela: co 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 | 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 diretrio o | INDEX DIRECTORY = caminho absluto para o diretrio o | DEFAULT CHARACTER SET character_set_name [COLLATE collation_name] instru~o_select: ca [IGNORE | REPLACE] [AS] SELECT ...
CREATE TABLE cria uma tabela com op nome dado no banco de dados atual.
600
As regras para nomes de tabelas permitidos so dados em Seo 6.1.2 [Legal names], a ca Pgina 472. Por padro a tabela criada no banco de dados atual. Um erro ocorre se a a e no houver o banco de dados atual ou se a tabela j existir. a a No MySQL Verso 3.22 ou posterior, o nome de tabela pode ser especicado como nome_ a 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 Verso 3.23, voc pode usar a palavra-chave TEMPORARY qaundo voc a e e criar uma tabela. A tabela temporria vis a e ivel apenas a para a conexo atual, e ser a a automaticamente deletada quando a conexo fechada. Isto signica que duas conexes a e o diferentes podem usar o mesmo nome de tabela temporria sem conitos outras ou com a uma tabela existente com o mesmo nome. (A tabela existente escondida at que a tabela e e temporria seja deletada). A partir do MySQL 4.0.2 voc deve ter o privilgio CREATE a e e TEMPORARY TABLES para poder criar tabelas temporrias. a No MySQL Verso 3.23 ou posterior voc pode utilizar as palavras-chaves IF NOT EXISTS a e para que no ocorra um erro se a tabela j existir. Note que no h vericao de que a a a a a ca tabela existente tem uma estrutura idntica a aquela indicada pela instruo CREATE TABLE e ca A partir da verso 4.1.0, o atributo SERIAL pode ser usado com um alias para BIGINT NOT a NULL AUTO_INCREMENT UNIQUE. Este um recuros para compatibilidade. e Como no MySQL 3.23, voc pode criar uma tabela de autra adicionando uma instruo e ca SELECT no m da instruo CREATE TABLE: ca CREATE TABLE new_tbl SELECT * FROM orig_tbl; Os indices no so transportados para a nova tabela, e algumas converses de tipos de a a o coluna podem ocorrer. Por exemplo, o atributoAUTO_INCREMENT no est preservado e a a colunas VARCHAR podem se tornar colunas CHAR. Quando criar uma tabela com CREATE ... SELECT, de um apelido para qualquer chamada de funo ou expresses em uma consulta. Se voc no o zer, a instruo CREATE pode ca o e a ca falhar ou resultar em nomes de colunas indesejveis. a CREATE TABLE artists_and_works SELECT artist.name, COUNT(work.artist_id) AS number_of_works FROM artist LEFT JOIN work ON artist.id = work.artist_id GROUP BY artist.id; No MySQL 4.1, voc pode especicar explicitamente o tipo para uma coluna gerada: e CREATE TABLE foo (a tinyint not null) SELECT b+1 AS a FROM bar; No MySQL 4.1 voc pode utilizar LIKE para criar uma tabela baseada em uma denio de e ca outra tabela. No MySQL 4.1 voc tambm pode especicar o tipo para uma coluna gerada: e e CREATE TABLE new_tbl LIKE orig_tbl; Cada tabela nome_tabela representada por algum arquivo no diretrio de banco de dados. e o No caso das tabelas tipo MyISAM voc ir obter: e a CREATE TABLE ... LIKE no copia nenhuma opo de tabela DATA DIRECTORY ou INDEX a ca DIRECTORY que foi especicada para a tabela original. Arquivo nome_tabela.frm Proposito Arquivo de formato (denio) da tabela. ca
601
nome_tabela.MYD nome_tabela.MYI
Para mais informaes de propriedades de varios tipo de coluna, veja Seo 6.2 [Column co ca types], Pgina 482: a Se nem NULL nem NOT NULL for especicado, a coluna tratada como se NULL fosse e especicado. Uma coluna integer pode ter o atributo adicional AUTO_INCREMENT. Quando voc insere e um valor de NULL (recomendado) ou 0 em uma coluna AUTO_INCREMENT indexada, a coluna denida com o valor da prxima sequncia. Normalmente ele valor+1, onde e o e e valor o maior valor para a coluna column atualmente na tabela. A sequncia de AUTO_ e e INCREMENT comea com 1. Veja Seo 12.1.3.32 [mysql_insert_id()], Pgina 803. c ca a A partir do MySQL 4.1.1, especicando o parmetro NO_AUTO_VALUE_ON_ZERO para a a opo do servidor --sql-mode ou a varivel do servidor sql_mode permite que voc ca a e aramzene 0 nas colunas AUTO_INCREMENT como 0, em vez de gerar uma nova sequncia e de valores. Veja Seo 4.1.1 [Command-line options], Pgina 207. ca a Se voc deletar a linha contendo o valor mximo para uma coluna AUTO_INCREMENT, e a o valor ser reutilizado por uma tabela ISAM, ou BDB, mas no por tabelas MyISAM a a ou InnoDB. Se voc deletar todas as linhas na sua tabela com DELETE FROM nome_ e tabela (sem um WHERE) no modo AUTOCOMMIT, a sequencia ser reiniciada em todos os a tipos de tabela, exceto InnoDB. Veja Seo 7.5.12.5 [InnoDB auto-increment column], ca Pgina 675. a Nota: S pode haver uma coluna AUTO_INCREMENT por tabela, e ela deve ser indexada e o no pode ter uma valor DEFAULT. No MySQL Verso 3.23, uma coluna AUTO_INCREMENT a a funcionar corretamente apenas se conter apenas valores positivos. Inserir um nmero a u negativo considerado como a insero de um nmero positivo muito grande. Isto e ca u ocorre para evitar problemaa de preciso quando os nmeros vo de positivo para a u a negativo e tambm para assegurar que no se obtenha, acidentalmente, uma coluna e a AUTO_INCREMENT que contenha 0. Em tabelas MyISAM e BDB voc pode especicar colunas AUTO_INCREMENT secundrias em e a uma chave ulti-coluna. Veja Seo 3.6.9 [exemplo-AUTO INCREMENT], Pgina 201. ca a com alguns aplicativos ODBC, voc pode encontrar o Para tornar MySQL compativel e valor AUTO_INCREMENT da ultima linha inserida com a seguinte consulta: SELECT * FROM nome_tabela WHERE auto_col IS NULL Valores NULL so tratados em colunas TIMESTAMP de modo diferente de outros tipos a de colunas. Voc no pode armazenar um NULL literal em uma coluna TIMESTAMP; e a 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 no se aplicam de a modo normal e so ignorados se voc os especicar. a e Por outro lado, tornar o uso de colunas TIMESTAMP mais fcil para os clientes MySQL, o a servidor relata que tal coluna pode ter o valor NULL atribu (a que verdade), mesmo ido e que TIMESTAMP nunca contenham, realmente, um valor NULL. Voc pode ver isto quando e voc utiliza DESCRIBE nome_tabela para obter informaes sobre sua tabela. e co Note que denir uma coluna TIMESTAMP com 0 no o mesmo que den com NULL, a e i-la porque 0 um valor TIMESTAMP vlido. e a
602
Um valor padro (DEFAULT) tem que ser constante, ele no pode ser uma funo ou a a ca uma expresso. a Se nenhum valor DEFAULT especicado para uma coluna, o MySQL atribuir um e a automaticamente, como a seguir. Se a coluna aceitar NULL como um valor, o valor padro NULL. a e Se a coluna declarada como NOT NULL, o valor padro depende do tipo de coluna: e a Para tipos numricos no declarados com o atributo AUTO_INCREMENT, o padro e a a 0. Para uma coluna AUTO_INCREMENT, o valor padro o prximo valor na e a e o sequncia. e Para tipos date e time diferentes de TIMESTAMP, o padro o valor zero apropriado a e para o tipo. Para a primeira coluna TIMESTAMP na tabela, o padro a data e a e hora atuais. Veja Seo 6.2.2 [Tipos date e time], Pgina 489. ca a Para tipos string diferentes de ENUM, o valor padro uma string vazia. Para ENUM, a e o padro o primeiro valor enumerado. a e Valores padres devem ser constantes. Isto signica, por exemplo, que voc no pode o e a denir o padro de uma coluna date como o valor de funes como NOW() or CURRENT_ a co DATE. Um comentrio para uma coluna pode ser especicado com a opo COMMENT. O coa ca mentrio mostrado pela instruo SHOW CREATE TABLE e por SHOW FULL COLUMNS. Esta a e ca opo est dispon a partir do MySQL 4.1. (Ela perimitida mas ignorada em verses ca a ivel e o anteriores.) KEY normalmente um sinnimo para INDEX. A partir da verso 4.1, o atributo de chave e o a PRIMARY KEY tambm pode ser especicado apenas como KEY. Isto foi implementado e para compatibilidade com outros bancos de dados. No MySQL,uam chave UNIQUE s pode ter valores distintos. Um erro ocorre se voc o e tantar adicionar uma nova linha com uma chave que coincida com uma j existente. a PRIMARY KEY uma chave unica (KEY) onde todas as colunas chaves devem ser denidas e como NOT NULL. Se elas no forem explicitamente declaradas como NOT NULL, isto ser a a feito implicitamente e sem aviso. No MySQL a chave chamada PRIMARY. Uma tabela e pode ter apenas uma PRIMARY KEY. Se voc no tiver uma PRIMARY KEY e alguma e a aplicao perguntar pela PRIMARY KEY em sua tabela, o MySQL retornar a primeira ca a chave UNIQUE, que no possui nenhuma coluna NULL, como a PRIMARY KEY. a Uma PRIMARY KEY pode ser um indice multi-coluna. Porm, voc no pode criar um e e a indice multi-coluna usando o atributo de chave PRIMARY KEY em uma especicao de ca coluna. Fazendo assim apenas colunas simples podero ser marcadas como primrias. a a Voc deve utilizar uma clusula PRIMARY KEY(index_nome_coluna, ...) separada. e a Um indice UNIQUE aquele no qual todos os valores no e indice devem ser distintos. A exceo a isto que se for permtido conter valores NULL em uma coluna no ca e indice, ele pode conter mltiplos valores NULL. Este exceo no se aplica a tabelas BDB, que u ca a permitem apenas um unico NULL. Se a chave PRIMARY ou UNIQUE consistir de apenas uma coluna e ela do tipo inteiro, e voc tambm poder se referir a ela como _rowid (novo na verso 3.23.11). e e a a Se voc no atribuir um nome ao e a indice que no um PRIMARY KEY, ele ter o mesmo a e a nome da prmeira index_nome_coluna, com um suxo opicional (_2, _3, ...) para
603
torn-lo unico. Voc pode nome de a e indices para uma tabela usando SHOW INDEX FROM nome_tabela. Veja Seo 4.6.8.1 [Show database info], Pgina 303. ca a Apenas os tipos de tabelas MyISAM, InnoDB, e BDB suportam indices em coluna que possam ter valores NULL. Nos outros casos voc deve declarar tais colunas NOT NULL ou e um erro ser retornado. a Com a sintaxe nome_coluna(length) em uma especicao de ca indice, voc pode criar e 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 Seo 5.4.4 [ ca Indices], Pgina 449. a 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 sempre DEVE especicar o tamanho do e indice, at 255 bytes. Por exemplo: e CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10))); Uma especicao index_col_name pode nalizar com ASC ou DESC. Esta palavras ca chaves so permitidas para estenso futura para especicar o armazenamento do valor a a do indice em crescente ou decrescente. Atualmente elas so analisadas mas ignoradas; a valores de indice so sempre armazenados em ordem crescente. a Quando voc utiliza ORDER BY ou GROUP BY com uma coluna TEXT ou BLOB, o servidor e ardena valores usando apenas o nmero inicial de bytes, indicado pela varivel do u a servidor max_sort_length. Veja Seo 6.2.3.2 [BLOB], Pgina 498. ca a No MySQL Verso 3.23.23 ou posterior, voc tambm pode criar a e e indices FULLTEXT especiais. Eles so usados para busca full-text. Apenas o tipo de tabela MyISAM suporta a indices FULLTEXT. Eles s podem ser criados em colunas CHAR, VARCHAR, e TEXT. A o indexao sempre ocorre sobre toda a coluna; ca indices parciais no so suportados. Veja a a Seo 6.8 [Fulltext Search], Pgina 619 para detalhes de operao. ca a ca No MySQL Verso 3.23.44 ou posterior, tabelas InnoDB suportam vericao de chaves a ca estrangeiras. Veja Seo 7.5 [InnoDB], Pgina 643. Note que a sintaxe FOREIGN KEY no ca a InnoDB mais restrita que a sintaxe apresentada acima. As colunas da tabela indicada e devem ser nomeadas explicitmente. O InnoDB suporta ambas as aes ON DELETE e co ON UPDATE em chaves esrtrangiras nos MySQL 3.23.50 e 4.0.8, respectivamente. Veja a seo InnoDB do manual para a sintaxe precisa. Veja Seo 7.5.5.2 [InnoDB foreign ca ca key constraints], Pgina 654. Para outros tipos de tabelas, MySQL Server analisa as a sinatxes FOREIGN KEY, CHECK e REFERENCES no comando CREATE TABLE, mas sem tal ao ser tomada. Veja Seo 1.8.4.5 [ANSI di Foreign Keys], Pgina 50. ca ca a Para tabelas ISAM e MyISAM, cada coluna NULL tem um bit extra, arredondado para o byte mais prximo. O tamanho mximo de um registro em bytes pode ser calculado o a como a seguir: tamanho da linha = 1 + (soma do tamanho da coluna) + (nmeros de coluna NULL + delete_flag 7)/8 u + (nmero de colunas de tamanho varivel) u a delete_flag 1 para tabelas com formato de registro esttico. Tabelas estticas usam e a a um bit no registro para um parmetro que indica se o linha foi deletada. delete_flag a 0 para tabelas dinmicas porque este parmetro armazenado no cabealho da linha e a a e c dinmica. a
604
Estes clculos no se aplicam ` tabelas InnoDB, para a qual o tamanho do armazenaa a a mento no diferente para colunas NULL comparados a colunas NOT NULL. a e A opao op~o_tabela e SELECT s so implmentadas no MySQL Verso 3.23 e acima. c ca o a a A opo TYPE para especicar o tipo de tabela possui os seguintes valores: ca Tipo de tabela BDB ou BerkeleyDB HEAP ISAM InnoDB MERGE MRG_MyISAM MyISAM Descrio ca Tabelas de transaao segura com bloqueio de pgina. Veja c a Seo 7.6 [BDB], Pgina 698. ca a Os dados desta tabela so armazenados apenas na memria. a o Veja Seo 7.4 [HEAP], Pgina 642. ca a O mecanismo de armazenamento original. Veja Seo 7.3 ca [ISAM], Pgina 641. a Tabelas com transaes eguras com bloqueio de linha. Veja co Seo 7.5 [InnoDB], Pgina 643. ca a Uma coleo de tabelas MyISAM usadas como uma tabela. ca Veja Seo 7.2 [MERGE], Pgina 638. ca a Um apelido para tabelas MERGE O novo mecanismo de armazenamento portvel binrio que a a substitui o ISAM. Veja Seo 7.1 [MyISAM], Pgina 631. ca a
Veja Capptexi tulo 7 [Tipos de tabelas], Pgina 630. a Se um tipo de tabela especicado, e este tipo no est dispon e a a ivel, MySQL ir usar a MyISAM. Por exemplo, se uma denio de tabela inclui a opo TYPE=BDB mas o ca ca MySQL no suporta tabelas BDB, a tabela ser criada como uma tabela MyISAM. Isto a a de se ter uma congurao de replicao onde voc tem tabelas transatorna possivel ca ca e cionaisno master mas as tabelas criadas no slave so no transacionais (para obter mais a a velocidade). No MySQL 4.1.1 voc obtm um aviso se o tipo de tabela especicado e e no aceito. a e Os outros tipos de tabelas so utilizados para otimizar o comportamento da tabela. Na a maioria dos casos, voc no precisa especicar nenhuma delas. As opes funcionam e a co com todos os tipos, a menos que haja indicao: ca Opo ca AUTO_INCREMENT Descrio ca O prximo valor AUTO_INCREMENT que voc quer denir em o e 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 aproximao do tamanho mdio de linha em sua tabela. ca e Voc s precisa den para tabelas grnades com tamanho e o i-la de registros variveis. a Dena com 1 se voc quiser manter um checksum para toe das as linha (deixa a tabela um pouco mais lenta para atualizaes, mas ca mais fcil encontrar tabelas corrompidas) co a (apenas MyISAM). Um comentrio de 60 caracteres para a sua tabela. a Nmero mximo de linhas que voc deseja armazenar na u a e tabela. Nmero m u inimo de linha que voc planeja armazenar na e tabela.
AVG_ROW_LENGTH CHECKSUM
605
Dena com 1 se voc quiser um e indice menor, Normalmente torna a atualizao mais lenta e a leitura mais rpida (apeca a nas MyISAM e ISAM). Denr com 0 ir desabilitar empacotaa mento das chaves. Denir com DEFAULT (MySQL 4.0) dir ao a mecanismo de armazenamento para empacotar apenas colunas CHAR/VARCHAR longas. PASSWORD Criptografa o arquivo .frm com uma senha. Esta opo no ca a fa nada na verso padro do MySQL. a a DELAY_KEY_WRITE Dena com 1 se quiser atrasar a atualizao das chaves da ca tabela at que a tabela seja fechada (apenas MyISAM). e ROW_FORMAT Dene como as linhas devem ser armazenadas. Atualmente esta opo s funciona com tabelas MyISAM, as quais suporca o tam os formatos de linha DYNAMIC e FIXED. Veja Seo 7.1.2 ca [Formatos das tabelas MyISAM], Pgina 634. a Quando voc utiliza uma tabela MyISAM, MySQL usa o produto de MAX_ROWS * AVG_ e ROW_LENGTH para decidir o tamanho da tabela resultante. Se voc no especicar e a qualquer uma das opes acima, o tamanho mximo de uma tabela ser 4G (ou 2G co a a se o seu sistema operacional s suporta tabelas de 2G). A razo para isto apenas o a e manter o tamanho dos ponteiros baixo para tornar o indice menor e mais rpido se a voc realmente no precisa de tabelas grandes. e a Se voc no utilizar PACK_KEYS, o padro s empacotar strings, no nmeros. Se voc e a a e o a u e utilizar PACK_KEYS=1, nmeros tambm sero empacotados. u e a Ao empacotar chaves numricas binrias, o MySQL usar a compactao prexada. e a a ca Isto signica que voc s ter grandes benef e o a icios disto se voc tiver muitos nmeros e u iguais. Compactao prexada signica que toda a chave precisa de um byte extra ca para indicar quantos bytes das caves anteriores so o mesmo da prxima chave (note a o que o ponteiro para a linha armazenado na ordem do byte mais alto em primeiro diree tamente depois da chave, para aumentar compactao). Isto signica que se voc tiver ca e muitas chaves iguais em duas linhas consecutivas, todas os chaves iguais seguintes iro normalmente ter apenas 2 bytes (incluindo o ponteiro para a linha). Compare isto a isto ao caso comum onde as chaves seguintes iro levar tamanho armazenamento chave a + tamanho ponteiro (nomralmente 4). Por outro lado, se todas as chaves so totala mente diferente, voc usar 1 byte por chave, se a chave no puder ter valores NULL. e a a (Neste caso o tamanho da chave empacotada ser armazenado no mesmo byte que a e usado para marcar se a chave NULL.) e No MySQL 3.23, Se voc especicar um SELECT depois de uma instruo CREATE, e ca MySQL criar novos campos para todos os elemento em SELECT. Por exemplo: a mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (a), KEY(b)) -> TYPE=MyISAM SELECT b,c FROM test2; Isto ir criar uma tabela MyISAM com trs colunas, a, b e c. Note que as colunas a e da instruo SELECT so inseridas do lado correto da tabela, n`o sobreposta nela. ca a a Considere o seguinte exemplo: mysql> SELECT * FROM foo; +---+ | n | PACK_KEYS
606
+---+ | 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 inserida em bar com os valores de foo e os e valores padres para a nova coluna. o CREATE TABLE ... SELECT no ir criar automaticamente nenhum a a indice para voc. e Isto feito intencionalmente para deixar o comando o mais ex poss e ivel ivel. Se voc e quiser ter indices em uma tabela criada, voc deve especic-lo antes da instruo e a ca SELECT: mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo; Se ocorrer qualquer erro durante enquanto os dados so copiados para a tabela, ele ser a a automaticamente deletado. Voc pode preceder o SELECT por IGNORE ou REPLACE para indicar como tratar registros e que duplicam valores de chave unica. Com IGNORE, novos registros que duplicam um registro existente em um valor de chave unica so descartados. Com REPLACE, novos a registros substituem registros que tem o mesmo valor de chave unica. Se nem IGNORE nem REPLACE so especicados, valir de chave unica duplicados resultam em erro. a Para assegurar que o log binrio/atualizao pode ser usado para recriar a tabela a ca original, MySQL no permitir inseres concorrentes durante um CREATE TABLE ... a a co SELECT. A opo RAID_TYPE ir ajud-lo a exceder o limite de 2G/4G limit para arquivo de ca a a dados MyISAM (no o arquivo de a indice) em sistemas operacionais que no suportam a arquivos grandes. Note que esta opo no recomendada para sistema de arquivos ca a e que suportam arquivos grandes! Voc pode obter mais velocidade da gargalo de E/S colocando diretorios RAID em e diferentes discos f isicos. RAID_TYPE funcionar em qualquer sistema operacional, desde a que voc tenha congurado o MySQL com --with-raid. Por agora o unico RAID_TYPE e permitido STRIPED (1 e RAID0 so utilizados para isto). e a Se voc especicar RAID_TYPE=STRIPED para tabeals MyISAM, MyISAM criar subdie a retrios RAID_CHUNKS chamados 00, 01, 02 no diretrio de banco de dados. Em cada um o o destes diretrios MyISAM criar uma nome_tabela.MYD. Ao escrever dados no arquivo o a de dados, o manipulador RAID ir mapear o primeiro RAID_CHUNKSIZE *1024 bytes a
607
para o primeiro arquivo e os prximos RAID_CHUNKSIZE *1024 bytes para o prximo o o arquivo. UNION utilizado quando voc quer utilizar uma coleo de tabelas identicas como uma. e e ca Isto s funciona com tabelas MERGE. Veja Seao 7.2 [MERGE], Pgina 638. o c a No momento voc precisa ter privilgios SELECT, UPDATE e DELETE nas tabelas mapeadas e e para uma tabela MERGE. Todas as tabelas mapeadas devem estar no mesmo banco de dados na tabela MERGE. Se voc quiser inserir dados em uma tabela MERGE, voc tem que especicar com e e INSERT_METHOD na tabela onde o registro deve ser inserido. INSERT_METHOD uma e opo util somente para tabelas MERGE. Veja Seo 7.2 [MERGE], Pgina 638. Esta ca ca a opo foi introduzida no MySQL 4.0.0. ca Na tabela criada a chave PRIMARY ser colocado primeiro, seguida de todas a chaves a unicas (UNIQUE) e ento das chaves normais. Isto ajuda o otimizador MySQL para a priorizar qual chave utilizar e tambm a detectaa mais rapidamente chaves unicas e (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 diretrio deve ser um caminho completo para o diretrio o o (no um caminho relativo). a Isto s funciona para tabelas MyISAM no MySQL 4.0, quando no estiver usando a opo o a ca --skip-symlink. Veja Seo 5.6.1.2 [Links simblicos para tabelas], Pgina 466. ca o a
608
especic-los. DESCRIBE nome_tabela sempre indica que a uma coluna TIMESTAMP a pode ser atribu valores NULL. ido MySQL mapeia certos tipos de colunas utilizados por outros produtos de banco de dados para tipos MySQL. Veja Seo 6.2.5 [Tipos de colunas de outros produtos], ca Pgina 502. a Se voc quiser ver se o MySQL utiliza um tipo de coluna diferente do especicado, axecute e uma instruo DESCRIBE nome_tabela depois de criar ou alterar a sua tabela. ca Outras alteraes de tipos de colunas podem ocorrer se voc compactar a tabela utilizando co e myisampack. Veja Seo 7.1.2.3 [Formato compactado], Pgina 635. ca a
609
ALTER TABLE funciona fazendo uma cpia temporria da tabela original. A alterao o a ca e realizada na cpia, assim a tabela original deletada e a nova tabela renomeada. Isto feito o e e e de tal forma que todas as desnecessriaatualizaoes so automaticamente redirecionadas a c a para a nova tabela sem nenhuma atualizao errada. Enquanto o ALTER TABLE executado, ca e a tabela original pode ser lida por outros clientes. Atualizaes e escrita na tabela so co a guardadas at a nova tabela estar pronta. e Note que se voc utilizar qualquer outra opo de ALTER TABLE, exceto RENAME, o MySQL e ca ir sempre criar um a tabela temporria, mesmo se os dados no precisarem realmente a a a serem copiados (como quando voc altera o nome de uma coluna). Planejamos corrigir e isto no futuro, mas como no se faz ALTER TABLE com tanta frequncia, isto no de alta a e a e prioridade em nosso TO DO. Para tabelas MyISAM, vOc pode aumentar a velocidade na e parte da recriao dos ca indices (que a parte mais lenta do processo recriao) atribuindo um ca alto valor ` varivel myisam_sort_buffer_size. a a Para utilizar ALTER TABLE, voc precisa dos privilgios ALTER, INSERT e CREATE na e e tabela. IGNORE uma extenso do MySQL ao SQL-92. Ele controla como o ALTER TABLE e a funciona se houver duplicao em chaves unicas na nova tabela. Se IGNORE no ca a e especicado, a cpia abortada e retornada. Se IGNORE for especicado, para linhas o e com duplicatas em chaves unicas, somente a primera linha usada; as outras so e a deletadas. Voc pode executar mltiplas clusulas ADD, ALTER, DROP e CHANGE em uma unica e u a instruo ALTER TABLE. Esta uma extenso do MySQL ao SQL-92, que permite ca e a paenas uma clusula de cada por instruo ALTER TABLE. a ca CHANGE col_name, DROP col_name, e DROP INDEX so extenses do MySQL ao SQL-92. a o MODIFY uma extenso do Oracle para ALTER TABLE. e a A palavra opcional COLUMN uma palavra puramente desnecessria e pode ser omitida. e a Se voc utilizar ALTER TABLE nome_tbl RENAME TO novo_nome sem nenhuma outra e opo, MySQL simplesmente renomeia os arquivos correspondentes a tabela nome_tbl. ca No h necessidade de se criar uma tabela temporria. Veja Seo 6.5.5 [RENAME a a a ca TABLE], Pgina 612. a Clusulas definiao_create usam a mesma sintaxe para ADD e CHANGE assim como a c~ para CREATE TABLE. Note que a sintaxe inclui o nome da coluna, no apenas o tipo da a coluna. Veja Seo 6.5.3 [CREATE TABLE], Pgina 598. ca a Voc pode renomear ma coluna usando uma clusula CHANGE nome_col_antiga e a defini~es_create. Para tal, especique o nome das colunas antiga e da nome e o co tipo que a coluna atual possui. Por exemplo, para renomear uma coluna INTEGER de a para b, faa assim: c mysql> ALTER TABLE t1 CHANGE a b INTEGER; Se voc quiser mudar um tipo de coluna, mas no o nome, a sintaxe CHANGE ainda exige e a dois nomes de colunas, mesmo que sejam o mesmo. Por exemplo: mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL; No entanto, como no MySQL Verso 3.22.16a, voc tambm pode utilizar MODIFY para a e e alterar um tipo de coluna sem renome-lo: a mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
610
Se voc utilizar CHANGE ou MODIFY para reduzir uma coluna na qual exista um e indice em parte da coluna (por exemplo, se voc tiver um e indice nos primeiros 10 caracteres de uma coluna VARCHAR), voc no poder reduzir a coluna para um tamanho menor e a a que o nmero de caracteres indexados. u Quando voc altera um tipo de coluna usando CHANGE ou MODIFY, erter os dados para e o novo tipo da melhor forma poss ivel. No MySQL Verso 3.22 ou posterior voc pode utilizar FIRST ou ADD ... AFTER nome_ a e col para aadicionar uma coluna em uma posio espec ca ica na linha da tabela. O padro adicionar a coluna no m. A partir do MySQL Verso 4.0.1, voc pode a e a e tambm utilizar as palavras-chave FIRST e AFTER em CHANGE ou MODIFY. e ALTER COLUMN especica um novo valor padro para uma coluna ou remover o valor a padro antigo. Se o padro antigo removido e a coluna pode ser NULL, o novo padro a a e a NULL. Se a coluna no pode ser NULL, MySQL atribui um valor padro, como descrito e a a em Seo 6.5.3 [CREATE TABLE], Pgina 598. ca a DROP INDEX remove um indice. Esta uma extenso do MySQL ao SQL-92. Veja e a Seo 6.5.8 [DROP INDEX], Pgina 614. ca a Se colunas forem removidas de uma tabela, as colunas tambm so removidas de quale a quer indice do qual eles fazem parte. Se todas as colunas que compe um o indice so a exclu idas, o indice tambm exclu e e ido. Se uma tabela contm apenas uma coluna, a coluna no pode ser exclu e a ida. Se o que voc pretende remover a tabela, use DROP TABLE. e e DROP PRIMARY KEY deleta o indice primrio. Se tal a indice no existe, ele apaga o prmeiro a indice unico (UNIQUE) na tabela. (MySQL marca a primeira chave unica (UNIQUE) como PRIMARY KEY se nenhuma PRIMARY KEY foi especicada explicitamente.) Se voc adicionar UNIQUE INDEX ou PRIMARY KEY a uma tabela, elas so armazenadas e a antes de qualquer indice no UNIQUE para que possa detectar cahves duplicadas o mais a rpido poss a ivel. ORDER BY lhe permite criar a nova tabela com as linhas em uma ordem espec ica. Note que a tabela no permanecer nesta ordem depois de insres e delees. Em algunas a a co co casos, isto pode tornar a ordenao mais para o MySQL se a tabela estiver ordenada ca pela coluna que voc escolheu. Esta opo util principalmente quando voc sabe qeu e ca e e na maioria das vezes voc ir inserir os registros em certa ordem; utilizando esta opo e a ca depois de grandes mudanas na tabela, voc obter melhor desempenho. c e a Se voc utilizar ALTER TABLE em uma tabela MyISAM, todos os e indices que no so a a unicos so criados em um grupo separado (como em REPAIR). Isto deve tornar ALTER a TABLE muito mais rpido quando voc tiver vrios a e a 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 no so unicas em tabelas a a MyISAM. ALTER TABLE ... ENABLE KEYS deve ser usado para recriar indices perdidos. Como o MySQL faz isso com um algoritmo especial que muito mais rpido que e a inserir chaves uma a uma, disabilitar chaves podem trazer um aumento de velocidade considervel em inseres volumosas. a co Com a funo mysql_info() da API C, voc pode saber quantos registros foram copiaca e dos, e (quando IGNORE for usado) quantos registros foram deletados devido a duplicao ca de valores de chaves unicas.
611
As clusulas FOREIGN KEY, CHECK e REFERENCES no fazem nada, exceto para tipos a a de tabela InnoDB que suportam ... ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...) e ... DROP FOREIGN KEY .... Veja Seo 7.5.5.2 [InnoDB forca eign key constraints], Pgina 654. A sintaxe para outros tipos de tabela s fornecido a oe para comptibilidade, para tornar fcil portar o cdigo de outro servidor SQL e executar a o aplicaes que criam tabelasd com referncias. Veja Seo 1.8.4 [Diferenas do ANSI], co e ca c Pgina 46. a ALTER TABLE ignora as opes de tabela DATA DIRECTORY e INDEX DIRECTORY. co Se voc quiser alterar todas as colunas CHAR/VARCHAR/TEXT para um novo cone junto de caracteres (por exemplo, depois de atualizar do MySQL 4.0.x para o 4.1.1) voc pode fazer: e ALTER TABLE table_name CHARACTER SET character_set_name; Note que o seguinte comando s ir alterar o default character set para uma tabela: o a ALTER TABLE table_name DEFAULT CHARACTER SET character_set_name; O default character set o conjunto de caracteres que usado se voc no especie e e a car o conjunto de caracteres para uma nova coluna que voc adicionar a tabela (por e exemplo com ALTER TABLE ... ADD coluna). Aqui temos um exemplo que mostra alguns dos usos de ALTER TABLE. Ns comeamos com o c uma tabela t1 que crida como mostrado aqui: e 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-la de b para c: a 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 primria: a 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 ns indexamos c, porque colunas AUTO_INCREMENT devem ser indexadas e tambm o e por isso declaramos c como NOT NULL, pois colunas indexadas no podem ser NULL. a Quando voc adicionar uma coluna AUTO_INCREMENT, valores de coluna so preenchidos com e a sequncia de nmeros automaticamente para voc. Voc pode denir o primeiro nmero da e u e e u sequncia executando SET INSERT_ID=valor antes de ALTER TABLE ou usando a opo de e ca tabela AUTO_INCREMENT=valor. Veja Seo 5.5.6 [SET OPTION], Pgina 460. ca a
612
Com tabelas MyISAM tables, se voc no alterar a coluna AUTO_INCREMENT, a sequncia de e a e nmeros no ser afetada. Se voc excluir uma coluna AUTO_INCREMENT e adicionar outra u a a e coluna AUTO_INCREMENT, a numerao iniciar a partir do 1 novamente. ca a Veja Seo A.7.1 [Problemas com ALTER TABLE], Pgina 938. ca a
613
S apaga tabelas temporrias. o a INo naliza uma transao em execuo. a ca ca Nenhum direito de acesso vericado. e Usar TEMPORARY uma boa maneira de assegurar que voc no apague uma tabela real. e e a
614
Ind ices FULLTEXT s podem indexar colunas CHAR, VARCHAR e TEXT, e apenas em tabelas o MyISAM. Indices FULLTEXT esto dispon a iveis no MySQL Verso 3.23.23 e posterior. Seo 6.8 a ca [Pesquisa Fulltext], Pgina 619. a
615
Esta instruo fornecida para compatibilidade com Oracle. ca e A instruo SHOW fornece informao similar. Veja Seo 4.6.8 [SHOW], Pgina 302. ca ca ca a
616
617
ERROR 1181: Got error 153 during ROLLBACK Todos os savepoints da transao atual so deletados se voc executar um COMMIT ou um ca a e ROLLBACK que no chamou um savepoint. a
618
3. Bloqueie uma tabela por vez at que a thread obtenha todas as travas. e Esta pol itica assegura que as tabelas sejam bloqueadas sem deadlock. H no entanto outra a coisa da qual preciso estar ciente neste esquema: e Se coc estiver usando uma trava de escita LOW_PRIORITY WRITE em uma tabela, signica e apenas que o MySQL ir esperar por esta trava particular at que no haja mais treads a e a fazendo um bloqueio de leitura (READ). Quando a thread tiver obtido a trava de escrita (WRITE) e est esperando ppo obter o trava para a prxima tabela na lista de tabelas a o bloqueadas, todas as outras threads iro esperar que a trva de escrita (WRITE) seja liberada. a Se isto tornar um srio problema com sua aplicao, voc deve converter algumas de suas e ca e tabellas para tabelas com segurana em transaes. c co Voc pode matar com segurana um thread que est esperando por um bloqueio de tabela e c a com KILL. Veja Seo 4.6.7 [KILL], Pgina 301. ca a Note que voc no deve travar nenhuma tabela que voc esteja usando com INSERT DELAYED. e a e Isto porque este o caso que o INSERT feito por uma thread separada. e e e Normalmente, voc no tem que travar tabelas, j que todas as instrues UPDATE so atome a a co a icas; nenhuma outra thread pode interferir com qualquer outra executando uma instruo ca SQL. Existem poucos casos em que voc gostaria de travar as tabelas de qualquer forma: e Se voc for executar operaes em um grupo de tabelas, muito mais rpido travar as e co e a tabelas que voc for utilizar. O lado ruim que nenhuma outra thread pode atualizar e e uma tabela travada para leitura (READ) (incluindo aquela que guarda o lock) e nenhuma outra thread pode ler uma tabela bloqueada para escrita (WRITE) alm daquele que e guarda o lock. A razo de algumas coisas serem rpidas sob LOCK TABLES que o MySQL no ir a a e a a descarregar a cache de tabelas bloqueadas at que UNLOCK TABLES seja chamado (nore malmente a cache de chaves descarregada a cada instruo SQL). Isto aumenta a e ca velocidade de insero, atualizao e deleo) em tabelas MyISAM. ca ca ca Se voc estiver usando um mecanismo de armazenamento no MySQL que no suporte e a transaes, voc deve usar LOCK TABLES se voc quiser se assegurar que nenhuma outra co e e thread venha entre um SELECT e um UPDATE. O exemplo mostrado aqui exige LOCK TABLES para ser executado com segurana: c 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 execuo das instrues SELECT e UPDATE. ca co Utilizando atualizaes incrementais (UPDATE customer SET value=value+new_value) ou co a funo LAST_INSERT_ID()i, voc pode evitar o uso de LOCK TABLES em muitos casos. ca e Voc tambm pode resolver alguns casos usando as funes de bloqueio a n de usurio e e co ivel a GET_LOCK() e RELEASE_LOCK(). Estas travas so salvas em uma tabela hash no servidor e a implementado com pthread_mutex_lock() e pthread_mutex_unlock() para alta velocidade. Veja Seo 6.3.6.2 [Funes diversas], Pgina 547. ca co a
619
Veja Seo 5.3.1 [Internal locking], Pgina 443, para mais informaes sobre pol ca a co itica de bloqueios. Voc pode trocar todas as tabelas em todos os banco de dados com trava de leitura com e o comando FLUSH TABLES WITH READ LOCK. Veja Seo 4.6.4 [FLUSH], Pgina 299. Este ca a e um modo muito conveiente de tirar backups se voc tiver um sistema de arquivos, como e Veritas, que pode tirar snapshots. NOTE: LOCK TABLES mo seguro com transaes e far um commit implicitamente em a e co a qualquer transao ativa antes de tentar travar as tabelas. ca
620
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 funo MATCH() realiza um busca de linguagem natural por uma string contra uma coleo ca ca de texto (um conjunto de uma ou mais colunas incluidas em um indice FULLTEXT). A string pesquisada dada como o argumento de AGAINST(). A busca realizada na forma casoe e insensitivo. Para cada uma das linhas da tabela, MATCH() retorna um valor relevante, isto , uma medida de similaridade entre a string pesquisada e o texto naquela nas colunas e identicadas na lista MATCH(). Quando MATCH() utilizado na clusula WHERE (veja exemplo acima) as linhas retornadas e a so automaticamente ordenadas com a maior relevncia primerio. Valores de relevncia so a a a a nmeros de ponto utuante no negativos. Relevncia zero signica nenhuma similaridade. u a a Relevncia computado baseada no nmero de palavras na linha, o nmero de palavras a e u u unica naquela linha, o nmero de palavras na coleo e o nmero de documentos (linhas) u ca u que contenham uma palavra particular. Tambm poss realizar uma busca no modo booleano. Isto explicado posteriormente e e ivel e nesta seo. ca O exemplo precedente uma ilustro bsica mostrando como usar a funo MATCH(). e ca a ca Linhas so retornodas em ordem decrescente de relevncia. a a O prximo exemplo mostra como retornar o valores de relevncia explicitamente. Como o a nem a clusula WHERE nem a ORDER BY esto presentes, as linhas so retornadas fora de a a a ordem. mysql> SELECT id,MATCH (title,body) AGAINST (Tutorial) FROM articles; +----+-----------------------------------------+ | id | MATCH (title,body) AGAINST (Tutorial) | +----+-----------------------------------------+ | 1 | 0.64840710366884 | | 2 | 0 |
621
| 3 | 0.66266459031789 | | 4 | 0 | | 5 | 0 | | 6 | 0 | +----+-----------------------------------------+ 6 rows in set (0.00 sec) O exemplo seguinte mais complexo. A consulta retorna a relevncia e ainda ordena e a as linhas em ordem decrescente de relevncia. Para conseguir este resultado, voc deve a e especicar MATCH() duas vezes. Isto no ir causar sobrecarga adicional, pois o otimizador a a MySQL ir notar que duas chamadas MATCH() so idnticas e invocam o cdigo da busca a a e o 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 verso 4.1.1, pesquisas full-text suportam expanso de consulta (em particular, a a sua variante blind query expansion). Ela geralmente util quando uma frase pesquisada e muito curta, o que normalmente signica que um usurio est conando em um cone a a hecimento contido, que a pesquisa full-text normalmente perde. Por exemplo, um usuario pesquisanado por database podem realmente signicar que MySQL, Oracle, DB2, RDBMS so todas frases que devem coincidir com databases e devem ser encontrados a tambm. Isto conhecimento contido. Blind query expansion (also known as automatic e e relevance feedback) works by performing the search twice, where the search phrase for the second search is the original search phrase concatenated with the few top found documents from the rst search. Thus, if one of these documents contained 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 books by Georges Simenon 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: because 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 muito simples para separar texto em palavras. Uma palavra uma sequncia de caracteres consistindo de letras, digitos, , e _. Quale e quer palavra presente na lista de palavra de parada ou for muito curta ignorada. O e tamanho padro m a inimo das palavras que sero encontradas pela pesquisa full-text de quaa e tro caracteres. Isto pode ser alterado como descrito em Seo 6.8.2 [Fulltext Fine-tuning], ca Pgina 624. a
622
Toda palavra correta na lista de colees e na consulta pesada de acordo com sua sigco e nicncia na consulta ou coleo. Deste modo, uma palavra que est presente em vrios a ca a a documentos ter peso menor (e poder ter at mesmo um peso zero), j que ele tm um a a e a e valor semntico baixo nesta coleo particular. Por outro lado, se a palavra rara, ela recea ca e ber um peso alto. O peso das palavras so ento combinados para computar a relevncia a a a a das linhas. Tal tcnica funciona melhor com colees grandes (de fato, ela cuidadosamente ajustado e co e deste modo). Para tabelas muito pequenas, a distribuio das palavras no reetem adeca a quadamente seus valores semnticos, e este modelo pode algumas vezes produzir resultados a bizarros. mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST (MySQL); Empty set (0.00 sec) A busca pela palavra MySQL no produz resultados no exemplo acima, porque esta palavra a est presente em mais da metade das linhas. Como tal, ela efetivamente tratada como a e palavra de parada (isto , uma palavra com valor semntico zero). Este o comportamento e a e mais desejvel uma consulta de linguagem natural no deve retornar toda segunda linha a a 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, muito mais provvel encontrar vrios documentos e a a irrelevantes. Todos ns sabemos que isto acontece com muita frequncia quando tentamos o e encontrar alguma coisa na internet com um mecanismo de busca. E com esta razo que estes a registros tem sido atribu com um baixo valor semntico neste banco de dados particular. ido a Na verso 4.0.1, MySQL tambm pode realizar buscas full-text booleanas usando o modia e cador 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% no utilizado), mas que no contenha a palavra YourSQL. Note que a a e a pesquisa em modo booleano no ordena os registros automaticamente em ordem decrescente a de relevncia. Voc pode ver isto no resultado da consulta anterior, onde a linha com a maior a e relevncia (aquela que contm MySQL duas vezes) listada por ultimo, no em primeiro. a e e a Um busca full-text booleana tambm pode funcionar mesmo sem um indice FULLTEXT, no e entanto ela seria lenta. A busca full-text booleana suporte potencialmente as seguintes operaes: co + Um sinal de mais precedente indica que esta palavra deve estar presente em cada linha retornada.
623
Um sinal de menos precedente indice que esta palavra no deve estar presente a em qualquer linha retornada. Por padro (quando nem mais nem menos especicado) a palavra opcional, a e e mas as linhas que a contm sero avaliadas positivamente. Isto dene o come a portamento de MATCH() ... AGAINST() sem o modicados IN BOOLEAN MODE.
<>
Estes dois operadores so usados para alterar a contribuio de uma palvara a ca no valor de relevncia que tribu a um registro. O operador < reduz a a a ido contribuio e o operador > a aumenta. Veja o exemplo abaixo. ca Parenteses so usado para agrupar palavras em subexpresses. a o Um til precedente atua como um operador de negao, tornando a contribuio ca ca da palavra para a relevncia da linha ser negativa. Ele util para marcar a e palavras "ruidosas". Linhas com tais palavras tero uma avaliao mais baixa a ca que outras, mas no ser exclu a a ida, como seria com o operador -. Um asterisco um operador de truncamento. Diferente dos outros operadores, e ele deve ser inserida ao m da palavra, no deve ser precedente. a A frase que colocada entre aspas duplas ", coincidem apenas com linhas que e contenha esta frase literalmente, como foi digitada.
() ~
* "
E aqui esto alguns exeplos: a 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 tambm conter macintosh. e +apple -macintosh ... palavra apple mas no macintosh. a +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 no some noise words. a
624
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 denio ca de indice FULLTEXT para a tabela, a menos que este MATCH() seja IN BOOLEAN MODE. O argumento para AGAINST() deve ser uma string constante.
625
syntax. Veja Seo 4.6.8.4 [ft_boolean_syntax], Pgina 309. Ainda, esta varivel ca a a e somente leitura; este valor est denido em myisam/ft_static.c. a Para mudanas full-text que exigem que voc reconstrua seu c e indice FULLTEXT, o modo mais fcil de faz-lo para uma tabela MyISAM usar a seguinte instruo, a qual reconstroi o a e e ca arquivo de indice: mysql> REPAIR TABLE nome_tabela QUICK;
626
Buscas depois de uma linha em uma tabela de uma linha 238% mais rpido. Isto e a pode ser considerado perto do m inimo de ganho a ser esperado para uma consulta que est armazenada. a Se voc quiser disabilitar o codigo da cache de consulta dena query_cache_size=0. e Disabilitando o cdigo da cache de consultas no haver nenhuma sobrecarga notvel. o a a a do cdigo com ajuda da opo de conigurao (cache de consultas pode ser excluido o ca ca --without-query-cache)
627
GET_LOCK RELEASE_LOCK LOAD_FILE MASTER_POS_WAIT NOW SYSDATE CURRENT_TIMESTAMP CURDATE CURRENT_DATE CURTIME CURRENT_TIME DATABASE ENCRYPT (com um parmetro) LAST_INSERT_ID a RAND UNIX_TIMESTAMP (sem USER BENCHMARK parmetros) a Um consulta no pode ser armazenada em cache se conter variveis, referenciar o a a 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 insero - ODBC contorna ca este problema). No entanto, FOUND_ROWS() retornar o valor correto, mesmo se a consulta precedente foi a buscada da cache. No caso de uma consulta no utilizar qualquer tabela, ou utilizar tabelas temporrias, ou a a se o usurio tiver um privilgio de coluna para qualquer tabela chamada, esta consulta no a e a ser armazenada em cache. a Antes de uma consulta ser trazida da cache de consulta, o MySQL ir vericar se o usurio a a com privilgio SELECT para todos os banco de dados e tabelas envolvidos. Se este no for e a o caso, o resultado em cache no ser usado. a a
628
Se voc tem muitas consultas com resultados grandes (veja Qcache_total_blocks e e Qcache_queries_in_cache),voc pode aumentar a performance aumentadno e query_cache_min_res_unit. No entanto, seja cuidadoso para no torn-lo muito a a grande (veja o ponto anterior). query_cache_size A quantidade de memria (especicada em bytes) alocada para o armazenar resultados de consultas antigas. Se ele for 0, a cache de consultas est a desbilitada (padro). a query_cache_type Pode ser atribuido (apenas numrico) com e Opo ca Descrio ca 0 (OFF, no armazene ou retorne resultados) a 1 (ON, armazene todos os resultados, exceto consultas SELECT SQL_ NO_CACHE ...) 2 (DEMAND, armazene apenas cconsultas SELECT SQL_CACHE ...) Dentro de uma thread (conexo), o comportamento da cache de consulta pode ser alterado a do padro. A sintaxe a seguinte: a e QUERY_CACHE_TYPE = OFF | ON | DEMAND QUERY_CACHE_TYPE = 0 | 1 | 2 Opo ca Descrio ca 0 or OFF No armazene ou recupere resultados a 1 or ON Aramazene todos os resultados exceto consultas SELECT SQL_ NO_CACHE .... 2 or DEMAND Armazene apenas consultas SELECT SQL_CACHE ....
629
| have_query_cache | YES | +------------------+-------+ 1 row in set (0.00 sec) Voc pode monitorar o desempenho da cache de consultas com SHOW STATUS: e Varivel a Descrio ca Qcache_queries_in_ Nmero de consultas registrada na cache. u cache Qcache_inserts Nmero de consultas adicionadas na cache. u Qcache_hits Nmero de acertos da cache. u Qcache_lowmem_prunes Nmero de consultas que foram deletadas u da cache devido a memria baixa. o Qcache_not_cached N;mero de consultas no armazenadas u a em cache (no armazenveis, ou devido a a a QUERY_CACHE_TYPE). Qcache_free_memory Quantidade de memria livre para cache de o consultas. Qcache_free_blocks Nmero de blocos de memria livre na u o cache de consultas Qcache_total_blocks Nmero total de blocos na cache de u consultas. Nmero total de consultas = Qcache_inserts + Qcache_hits + Qcache_not_cached. u A cache de consultas utiliza blocos de tamanhos variveis, assim Qcache_total_blocks a e Qcache_free_blocks podem indicar fragmentao de memria da cache de consultas. ca o Depois de um FLUSH QUERY CACHE apenas um unico (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). Tambm, cada tabela que usada por uma consulta e e precisa de um bloco, mas se duas ou mais consultas usam a mesma tabela, apenas um bloco precisa ser alocado. Voc pode utilizar a varivel de estado Qcache_lowmem_prunes para ajustar o tamanho da e a cache de consultas. Ela conta o nmero de consultas que so removidas da cache para liberar u a memria para armazenar novas consultas. A cache de consultas utiliza uma estratgia least o e recently used (LRU) para decidir quais consultas sero removidas da cache. a
630
631
632
Valores NULL so perimitidos em colunas indexadas. Isto gasta 0-1 bytes/chave. a O tamanho mximo da chave de 500 bytes por padro (pode ser alterado recomopia e a lando). No caso de chaves maiores que 250 bytes, um tamanho de bloco de chave maior que o padro de 1024 bytes usado para esta chave. a e Nmero mximo de chaves/tabelas 32 por padro. Isto pode ser aumentado para 64 u a e a sem ser necessrio recompilar myisamchk. a myisamchk marcar as tabelas como vericadas se algum execut-las sem --updatea e a state. myisamchk --fast s vericar aquelas tabelas que no tenham esta marca. o a a myisamchk -a armazena estat isticas para partes de chaves(e no apenas para toda a a chave como no ISAM). Linhas de tamanho dinmico sero agora muito menos fragmentados quando misturar a a delees com atualizaes e inseres. Isto feito combinando automaticamente blocos co co co e deletados adjacentes e extendendo blocos se o prximo bloco deletado. o e myisampack pode empacotar colunas BLOB e VARCHAR. Voc pode colocar arquivos de dados e e indices em diretrios diferentes para obter o maior velocidade (com a opo DATA/INDEX DIRECTORY="caminho" para CREATE ca TABLE). Veja Seo 6.5.3 [CREATE TABLE], Pgina 598. ca a MyISAM tambm suporta os seguintes itens, os quais o MySQL estar apto a utilizar em um e a futuro prximo: o 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 dinmico. a VARCHAR e CHAR podem ser maior que 64K. Todos os segmentos de chaves tm a sua e prpria denio de linguagem. Isto habilitar o MySQL para ter diferentes denies o ca a co de linguagens por coluna. Um indice computado em hash pode ser usado para UNIQUE. Isto lhe permitir ter a UNIQUE em qualquer combinao de colunas na tabela. (Voc no pode procurar em ca e a um em um indice computado UNIQUE, de qualquer forma.) Note que os arquivos de indice so muito menores com MyISAM que com ISAM. Isto signica a que MyISAM usar normalmente menos recursos do sistema que ISAM, mas precisar de mais a a tempo de CPU quando inserir dados em um indice compactado. As seguintes opes para mysqld podem ser usadas para alterar o comportamento de tabelas co MyISAM. Veja Seo 4.6.8.4 [SHOW VARIABLES], Pgina 309. ca a Opo ca --myisam-recover=# -O myisam_sort_buffer_size=# --delay-key-write=ALL -O myisam_max_extra_sort_file_ size=# Descrio ca Recuperao automtica de tabelas com falhas. ca a Buer utilizado ao recuperar tabelas. No desarrega buers de chaves entre escritas para a qualquer tabela MyISAM Usada paa ajudar o MySQL a decidir quando utilzar o mtodo lento, mas seguro, de criao de e ca indices de cache de chaves. Note este parmetro dado em a e megabytes antes da verso 4.0.3 e em bytes a partir a desta verso. a
633
No utilzia o mtodo rpido de ordenao de a e a ca indice para criar indices se o arquivo temporrio se tornasse a maior que o valor dado. Note que este parmetro a e dado em megabytes antes da verso 4.0.3 e em bytes a a partir desta verso. a -O bulk_insert_buffer_size=# Tamanho da arvore cache utilizado na otimizao de ca inseres em bloco. Note que este um limite por co e thread! A recuperao automtica ativada se voc iniciar o mysqld com --myisam-recover=#. ca a e e Veja Seo 4.1.1 [Opes de linha de comando], Pgina 207. Na abertura, vericado se ca co a e a tabela est marcada como quebrada ou se a variavel de contagem de abertura para esta a tabela no 0 e voc a est executando com --skip-external-locking. Se nenhuma das a e e a vericaes acima forem verdadeiras o seguinte ocorre. co -O myisam_max_sort_file_size=# Verica-se se a tabela possui erros. Se encontrarmos um erro, tente fazer um reparao rpida (com ordenao e sem recriar ca a ca o arquivo de dados) da tabela. Se o reparao falhar devido a um erro no arquivo de dados (por exemplo um erro ca de chave duplicada), feita uma nova tentativa, mas desta vez o arquivo de dados e e recriado. Se a reparao falhar, tente mais uma vez com o antigo mtodo de opo de reparao ca e ca ca (escrever linha a linha sem ordenao) o qual deve estar apto a reparar qualquer tipo ca de erros com pequenas exigncias de disco. e Se a recuperao no estiver apta a recuperar todas as linhas de uma instruo completada ca a ca previamente e voc no especicou FORCE como uma opo para myisam-recover, ento a e a ca a reparao automtica abortar com uma mensagem de erro no arquivo de erros: ca a a Error: Couldnt repair table: test.g00pages Caso voc tenha utilizado a opo FORCE, voc ir obter um aviso no arquivo de erro: e ca e a Warning: Found 344 of 354 rows when repairing ./test/g00pages Note que se voc executar uma recuperao automtica com a opo BACKUP, voc e ca a ca e deve ter um script cron que mova automaticamente arquivos com nome como tablename-datetime.BAK do diretrio de banco de dados para uma media de backup. o Veja Seo 4.1.1 [Opes de linha de comando], Pgina 207. ca co a
634
iniciam com uma string. A Compactao de prexo ajuda se existirem muitas strings com ca o prexo idntico. e Em tabelas MyISAM, voc tambm pode utilizar prexos em nmeros comprimidos especie e u cando PACK_KEYS=1 quando voc cria a tabela. Isto ajuda quando voc tem muitas chaves e e inteiras que tm prexo idntico quando o nmero armazenado com o byte mais alto e e u e primeiro.
635
636
Todas as distribuies MySQL, mesmo aquelas existentes antes do MySQL se tornar co GPL, podem ler tabelas que forma compactadas com myisampack. Tabelas compactadas utilizam muito pouco espao em disco. Isto minimiza o uso de c disco, o que muito bom quando se utiliza discos lentos (com CD-ROMs). e Cada registro compactado separadamente (pouca sobrecarga de acesso). O cabealho e c de um registro xo (1-3 bytes) dependendo do maior registro na tabela. Cada coluna e compactada diferentemente. Alguns dos tipos de compactao so: e ca a Existe, geralmente, uma tabela Human diferente para cada coluna. Compactao de espao de suxos. ca c Compactao de espao de prexos. ca c Nmeros com valor 0 so armazenados usando 1 bit. u a Se os valores em uma coluna inteira tem uma faixa pequena, a coluna armazenada e 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 esto na a faixa de 0 a 255. Se uma coluna tem apenas um pequeno conjunto de valores poss iveis, o tipo de coluna convertido para ENUM. e Uma coluna pode usar uma combinao das compactaes acima. ca co Pode tratar registros de tamanho xo ou dinmico. a Pode ser descompactada com myisamchk.
637
Voc pode vericar se uma tabela est ok com o comando CHECK TABLE. Veja Seo 4.5.4 e a ca [CHECK TABLE], Pgina 278. a Voc pode repara um tabela corrompida com REPAIR TABLE. Veja Seo 4.5.5 [REPAIR e ca TABLE], Pgina 279. Voc tambm pode repar-la, quando o mysqld no estiver em a e e a a execuo com o comando myisamchk. sintaxe myisamchk. ca Se a sua tabela estiver muito corrompida voc deve tentar encontrar o razo! Veja e a Seo A.4.1 [Falhas], Pgina 925. ca a Neste caso, a coisa mais importante de saber se a tabela foi corrompida porque o mysqld foi e nalizado (pode se vericar isto facilmente vericando se h uma linha restarted mysqld a recente no arquivo de erro do mysql. Se este no o caso, ento voc deve tentar fazer um a e a e caso de teste disto. Veja Seo E.1.6 [Caso de teste reproduz ca iveis], Pgina 1084. a
638
639
Contornam o limite de tamanho de arquivos do sistema operacional. Voc pode criar um apelido/sinnimo para uma tabela usando MERGE sobre uma tabela. e o No deve haver nenhum impacto notvel na performance ao se fazer isto (apenas algua a mas chamadas indiretas e chamadas de memcpy() para cada leitura). As desvantagens de tabelas MERGE so: a Voc s pode utilizar tabelas MyISAM idnticas em uma tabela MERGE. e o e REPLACE no funciona. a Tabelas MERGE usam mais descritores de arquivos. Se voc estiver usando uma tabela e MERGE que mapeia mais de 10 tabelas e 10 usurios a esto usando, voc est usando a a e a 10*10 + 10 descritores de arquivos. (10 arquivos de dados para 10 usurios e 10 arquivos a de indices compartilhados). A leitura de chaves lenta. Quando voc faz uma leitura sobre uma chave, o mecane e ismo de armazenamento MERGE precisar fazer uma leitura em todas as tabelas para a vericar qual casa melhor com a chave dada. Se voc ento zer uma "leia prximo", e a o o mecanismo de armazenamento MERGE precisar procurar os buers de leitura para a encontrar a prxima chave. Apenas quando um buer de chaves usado, o mecano e ismo de armazenamento precisar ler o prximo bloco de chaves. Isto torna as chaves a o MERGE mais lentas em pesquisas eq_ref, mas no em pesquisas ref. Veja Seo 5.2.1 a ca [EXPLAIN], Pgina 424. a Voc no pode fazer DROP TABLE, ALTER TABLE, DELETE FROM nome_tabela sem uma e a clusula WHERE, REPAIR TABLE, TRUNCATE TABLE, OPTIMIZE TABLE, ou ANALYZE TABLE a em nenhuma das tabelas que mapeada por uma tabela MERGE que est "aberta". e a Se voc zer isto, a tabela MERGE pode ainda se referir a tabela original e voc obter e e a resultados inexperados. O modo mais fcil de contornar esta decincia e atravs do coa e e mando FLUSH TABLES, assegurando que nenhuma tabela MERGE permanecer "aberta". a Quando voc cria uma tabela MERGE voc deve especicar com UNION=(lista-de-tabelas) e e quais tabelas voc quer usar com uma. Opcionalmente voc pode especicar com INSERT_ e e METHOD se voc quer que inseres em tabelas MERGE ocorram na primeira ou na ultima e co tabela da lista UNION. Se voc no especicar INSERT_METHOD ou especicar NO, entao e a a todos os comandos INSERT na tabela MERGE retornaro um erro. a 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 no criamos uma chave UNIQUE ou PRIMARY KEY na tabela total j que a chave a a no ser unica na tabela total. a a Note que voc tambm pode manipular o arquivo .MRG diretamente de fora do servidor e e MySQL: shell> cd /mysql-data-directory/current-database CREATE CREATE INSERT INSERT CREATE
640
shell> ls -1 t1.MYI t2.MYI > total.MRG shell> mysqladmin flush-tables Agora voc pode fazer coisas como: e 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, no unica, j que tabelas MERGE no a e a a podem forca a unicidade sobre um conjunto de tabelas MyISAM selecionadas. Para remapear uma tabela MERGE voc pode fazer o seguinte: e Fazer um DROP na tabela e recri-la a Usar ALTER TABLE nome_tabela UNION=(...) Alterar o arquivo .MRG e executar um FLUSH TABLE na tabela MERGE e todas as tabelas selecionadas para forar o mecanismo de armazenamento a ler o novo arquivo de c denio. ca
641
antes de chaves normais para estar apto a detectar chaves duplicadas o mais rpido a poss ivel. DROP TABLE em uma tabela que est em uso por uma tabela MERGE no funcionar no a a a Windows porque o mecanismo de armazenamento MERGE faz o mapeamento da tabela escondido da camada mais alta do MySQL. Como o Windows no permite que voc a e apague arquivos que estejam abertos, voc deve primeiro descarregar todas as tabelas e MERGE (com FLUSH TABLES) ou apagar a tabela MERGE antes de apagar a tabela. Ns o consertaremos isto assim que introduzirmos VIEWs.
642
643
SUM_OVER_ALL_KEYS(max_length_of_key + sizeof(char*) * 2) + ALIGN(length_of_row+1, sizeof(char*)) sizeof(char*) 4 em uma mquina de 32 bits e 8 em uma mquina de 64 bits. e a a
644
Se voc tiver feito o download de uma verso binria do MySQL que inclui suporte para e a a InnoDB, simplesmente siga as instrues do manual do MySQL para instalar um vrso co a binria do MySQL. Se voc j tem o MySQL-3.23 instalado, ento o modo mais simples de a e a a instalar MySQL -Max substituir i executvel do servidor mysqld com o executvel corree a a spondente na distribuio -Max. MySQL e MySQL -Max diferem apenas no executvel do ca a servidor. Veja Seo 2.2.9 [Instalando uma distribuio binria], Pgina 91. Veja Seo 4.8.5 ca ca a a ca [mysqld-max], Pgina 343. a Para compilar o MySQL com suoprte a InnoDB, faa o download do MySQL-3.23.34a ou c posterior de http://www.mysql.com/ e congure o MySQL com a opo --with-innodb. ca Veja o manual MySQL sobre como instalar uma distribuio fonte. Veja Seo 2.3 [Instaca ca lando uma distribuio fonte], Pgina 94. ca a cd /caminho/para/fonte/mysql-3.23.37 ./configure --with-innodb Para utiliar tabelas InnoDB no MySQL-Max-3.23 voc deve especicar parmetros de cone a gurao na seo [mysqld] do arquivo de congurao my.cnf, ou no Windows opcionalca ca ca mente em my.ini. No m inimo, na verso 3.23 voc deve especicar innodb_data_file_path onde voc especia e e car o nome e tamanho dos arquivos de dados. Se voc no mencionar innodb_data_home_ e a dir em my.cnf o padro criar estes arquivoas no diretorio_dados do MySQL. Se voc a e e especicar innodb_data_home_dir como uma string vazia, ento voc pode dar caminhos a e absolutos ao seu arquivo de dados em innodb_data_file_path. O modo m inimo de modicar de adicionar a seao [mysqld] a linha e c innodb_data_file_path=ibdata:30M mas para obter melhor desempenho melhor que voc especique as opes como recomene e co dado. Veja Seo 7.5.3 [Inicializao InnoDB], Pgina 644. ca ca a
645
Se voc especicar o ultimo arquivo de dados coma a opo autoextend, InnoDB extender e ca a o ultimo arquivo de dados se ele car sem espao no tablespace. O aumento de 8 MB a c e cada vez. Um exemplo: innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend instrui InnoDB a criar apenas um unico arquivo de dados com tamanho inicial de 100 MB e que extendido em blocos de 8 MB quando o espao acabar. Se o disco car cheio voc e c e pode querer adicionar outro arquivo de dados a outro disco, por exemplo. Ento voc a e tem que olhar o tamanho de ibdata1, arredondar o tamanho para baixo at o mltiplo e u de 1024 * 1024 bytes (= 1 MB) mais prximo, e especicar o tamanho arredondado de o ibdata1 explicitamente em innodb_data_file_path. Depois disto voc pode adicionar e 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 mximo do arquivo 2 GB. O a e InnoDB no est ciente disto. Neste sistemas de arquivos voc pode querer especicar o a a e tamanho mximo para o arquivo de dados: a innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend:max:2000M Um exemplo de my.cnf simples. Suponha que voc tenha um computador com 128 MB e RAM e um disco r igido. Abaixo est o exemplo dos parmetros de congurao poss a a ca iveis para my.cnf ou my.ini para o InnoDB. Ns consideramos que voc est executando o e a MySQL-Max-3.23.50 ou posterior, our MySQL-4.0.2 ou posterior. Este exemplo serve para a maioria dos usurios, tanto em Unix e Windows, que no querem distribuir a a arquivos de dados InnoDB e arquivos de log em vrios discos. Isto cria um arquivo de a 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 tambm ca em datadir. e [mysqld] # Voc^ pode escrever outras op~es do servidor MySQL aqui e co # ... # Arquivos de dados deve estar aptos # a guardar os seus dados e ndices. i # Esteja certo que voc^ tem espao e c # livre suficiente em disco. innodb_data_file_path = ibdata1:10M:autoextend # Defina o tamanho da rea de buffer com a # 50 - 80 % da meria do seu computador o 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 rea de buffer a set-variable = innodb_log_file_size=20M set-variable = innodb_log_buffer_size=8M # Defina ..flush_log_at_trx_commit
646
# com 0 se voc^ puder perder e # algumas das ultimas trnsa~es co 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 combinado do arquivos de log devem ser < 4 GB. O tamanho combinado dos arquivos de dados devem ser >= 10 MB. Quando voc criar um banco de dados pela primeira vez, melhor que voc inicie o servidor e e e MySQL do prompt de comando. Ento InnoDB ir imprimir a informao sobre a criao a a ca ca do banco de dados na tela e voc poder ver o que est acontecendo. Veja abaixo na e a a prxima seo como a sa na tela se parece. Por exemplo, no Windows voc pode iniciar o ca ida e 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 so o seguinte: a Apenas o my.cnf ou my.ini deve ser criado. O arquivo my.cnf deve ser colocado no direttio raiz do drive C:. o O arquivo my.ini deve ser colocado no diretrio WINDIR, e.g, C:\WINDOWS ou o C:\WINNT. Voc pode usar o comando SET do MS-DOS para imprimir o valor de e WINDIR. Se o seu PC utiliza um carrgador de boot onde o drive C: no o drive de boot, ento a e a a sua unica op`o usar o arquivo my.ini. ca e Onde especicar as opes no Unix? No Unix o mysqld l opes dos seguintes arquivos, co e co se eles existirem, na seguinte ordem: /etc/my.cnf Opes globais. co COMPILATION_DATADIR/my.cnf Opes espec co icas do servidor. defaults-extra-file O arquivo especicado com --defaults-extra-file=.... ~/.my.cnf Opes espec co icas do usurio a COMPILATION_DATADIR o dirertrio de dados do MySQL o qual foi especicado e o como uma opo do ./configure quando o mysqld foi compilado. (normalmente ca /usr/local/mysql/data para uma instalao binria ou /usr/local/var para uma ca a instalao fonte). ca Se voc no estiver certo de onde mysqld l o seu my.cnf ou my.ini, voc pode dar o e a e e caminho como a primeira opo de linha de comando para o servidor: mysqld --defaultsca file=your_path_to_my_cnf. O InnoDB forma o caminho do diretrio a um arquivo de dados concatenando textualmente o innodb_data_home_dir a um nome de arquivo de dados ou caminho em innodb_data_ file_path, adicionando uma poss barra ou barra invertida entre eles se for necessrio. ivel a Se a palavra-chave innodb_data_home_dir no mencionada em my.cnf, o padro para a e a ele o diretrio ponto ./ que signica o datadir de MySQL. e o Um exemplo de my.cnf avanado. Suponha que voc tenha um computador Linux com c e 2 GB RAM e trs disco r e igidos de 60 GB (no caminho de diretrios /, /dr2 e /dr3). o Abaixo esta um exemplo de parmetros de congurao poss a ca iveis no arquivo my.cnf para o InnoDB.
647
Note que o InnoDB no cria diretrios: voc mesmo deve cri-los. Use o comando mkdir a o e a do Unix ou MS-DOS para criar o diretrio base do grupo de dados e de log. o [mysqld] # Voc^ pode escrever outras op~es do servidor MySQL aqui e co # ... innodb_data_home_dir = # Os arquivos de devem estar aptos a # guardar seus dados e ndices i innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend # Defina o tamanho da rea de buffer para a # 50 - 80 % da memria do seu computador, o # mas esteja certo, no Linux x86, que o # total de memria usada < 2 GB o e 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 # rea da buffer a set-variable = innodb_log_file_size=150M set-variable = innodb_log_buffer_size=8M # Defina ..flush_log_at_trx_commit com # 0 se voc^ puder permitir a perda de e # algumas das ultimas transa~es. co 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 ns colocamos os dois arquivos de dados em discos diferentes. O InnoDB o preencher o tablespace de tabela formado pelos arquivos de dados de baixo para cima. a Em alguns casos ele aumentar o desempenho do banco de dados se todos os dados no a a forem colocados no mesmo disco f isico. Colocar os arquivos de log em discos diferentes dos de dados geralmente, benco para o desempenho. Voc pode usar parties de discos e e e co raw (dispositivos raw) como arquivos de dados. Em alguns Unixs eles aumentam a E/S. Vejam a seo sobre gerenciamento de espao de arquivos no InnoDB para saber como ca c especic-los no my.cnf. a Aviso: no Linux x86 voc deve ter cuidado par no denir um uso de memria muito alto. e a o glibc permitir que o rea do processo cresa acima da pilha da thread, o que far com que a a c a o seu servidor falhe. Isto um risco se o valor de e innodb_buffer_pool_size + key_buffer + max_connections * (sort_buffer + read_buffer_size) + max_connections * 2 MB
648
prximo de 2 GB ou exceda 2 GB. Cada thread usar uma pilha (geralmente 2 MB, mas e o a no binrio da MySQL AB somente 256 KB) e no pior caso usar tmabm sort_buffer + a e a e read_buffer_size de memria adicional. o
Como sintonizar outros parmetros do servidor mysqld? Valores comuns que servem para a a maioria dos usurios so: a a
= max_connections=200 = read_buffer_size=1M = sort_buffer=1M Defina key_buffer com 5 - 50% de sua RAM dependendo de quanto voc^ usa tabelas MyISAM, mas e mantenha key_buffer + tamanho da rea de buffer do InnoDB < 80% de a sua RAM = key_buffer=...
Note que alguns parmetros so dados usando o formato do parmetro numrico de my.cnf: a a a e set-variable = innodb... = 123, outros (parmetros string e booleanos) com outro fora mato: innodb_... = ... .
Opo ca innodb_file_per_table
innodb_data_home_dir
Descrio ca Dispon ivel a partir da verso 4.1.1. Esta opo faz a ca com que o InnoDB armazene cada tabela criada em seu prprio arquivo .ibd. Veja a seo sobre multiplos o ca tablespaces. A parte comum do caminho do diretrio para todos aro quivos de dados InnoDB. Se voc no mencionar esta e a opo em my.cnf, o padro o datadir do MySQL. ca a e Voc pde especic-lo tambm como uma string vazia, e a e e neste caso voc poder utilizar caminhos de arquivos e a absolutos em innodb_data_file_path.
649
innodb_data_file_path
innodb_log_buffer_size
Caminho para os arquivos de dados individuais e os seus tamanhos. O caminho do diretrio completo para o cada arquivo de dados obtido concatenando inne odb data home dir ao caminho especicado aqui. O tamanho do arquivo especicado em megabytes, adicioe nando o M depois da especicao do tamanho. InnoDB ca tambm entende a abreviao G, 1 G signica 1024 MB. e ca A partir da verso 3.23.44 voc pode denir o tamanho a e 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 no especicar innodb_data_file_path, o e a comportamento padro a partir do verso 4.0 criar um a a e arquivo de dados ibdata1 de 10 MB auto-extens ivel. A soma do tamanho dos arquivos devem ser menores que 10 MB. Nmero de cpias idnticas de grupos de log mantidos u o e para os banco de dados. Atualmente deve ser denido com 1. Caminho do diretrio de arquivos de log do InnoDB. Se o voc no mencionar esta opo no my.cnf o padro o e a ca a e datadir do MySQL. Nmero de arquivos de log no grupo de log. O InnoDB u escreve nos arquivos de modo circular. O valor recomendado aqui 2. O valor padro 2. e a e 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 rea de buer especicado abaixo, onde n a e o nmero de arquivos de log no grupo. Quanto maior o u e valor, menos atividade de descarga necessria na rea e a a de buer, economizando E/S de disco. Mas arquivos de log maiores tambm signica que a recuperao ser lenta e ca a no caso de falhas. O tamanho combinado do arquivo de log deve ser menor que 4GB em comutadores de 32 bits. O padro 5M. a e 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 transaes para executarem sem precisar de escrever o log co em at se fazer um commit da transao. iAlem disso, e ca se voc tiver grande transaes, fazer um buer de log e co maior economiza E/S de disco.
650
innodb_flush_log_at_trx_ commit
innodb_log_arch_dir
innodb_log_archive
innodb_buffer_pool_size
innodb_buffer_pool_awe_ mem_mb
Normalmente atribuido 1, signicando que em um come mit de uma transao o log descarregado para o disco ca e e as modicaoes feitas pela transao se tornam perc ca manentes, sobrevivendo a uma falha no banco de dados. Se voc estiver disposto a comprometer esta segrana e e c est executando transaes pequenas, voc pode den a co e i-lo com 0 ou 2 para reduzir E/S de discos nos logs. O valor 0 signica que o log s escrito no arquivo e este descaroe e regado pro disco aproximadamente uma vez por segundo. O valor 2 signica que o log escrito no arquivo a cada e commit, mas o arquivo de log s descarregado em disco oe aproximadamente uam vez por segundo. O valor padro a 1 a partir do MySQL-4.0.13; antes era 0. e O diretrio onde arquivos de log totalmente escritos seo riam escritos se usarmos arquivamento de log. Atualmente o valor deste parmetro deve ser denido igual a a innodb_log_group_home_dir. Atualmente este valor deve ser denido com 0. Como a recuperao ai partir de um backup deve ser feito pelo ca MySQL usando os seus prprios arquivos de log, no h o a a nenhuma necessidade de se arquivos os arquivos de log do InnoDB. O tamanho do buer de memria que o InnoDB usa o para armazenar dados e indices de suas tabelas. Quanto maior for este valor, menor ser a necessidade de E/S a de disco para acessar dados na tabela. Em um servidor de banco de dados dedicado voc pode denir este e parmetro at 80% do tamanho da memria f a e o isica da mquina. No atribua um valor muito alto, pois a coma a petio da memria f ca o isica pode causar paginao no sisca tema operacional. Tamanho da rea de buer em Mb, se estiver locala izado na memria AWE do Windows 32 bits. Deipon o ivel a partir da verso 4.1.0 e relevante apenas no Wina dows 32 bits. Se o seu Windows suporta mais 4GB de memria, chamado Address Windowing Extensions, o voc pode alolcar a rea de buer do InnoDB em uma e a memria f o isica AWE usando este parmetro. O maior a valor possivel para isto 64000. Se este parmetro for e a especicado, ento innodb buer pool size a janela no a e espao de endereo de 32 bits do mysqld onde o InnoDB c c mapeia aquela memria AWE. Um bom valor para inno odb buer pool size 500M. e
651
innodb_additional_mem_ pool_size
innodb_file_io_threads innodb_lock_wait_timeout
innodb_flush_method innodb_force_recovery
Tamanho do pool da memria que o InnoDB utiliza para o armazenar informaes de dicionrio de dados e outras esco a truturas de dados internas. Um bom valor aqui pode ser 2M, mas quanto mais tabelas voc tiver em sua aplicao, e ca mais voc precisar alocar aqui. Se o InnoDB car sem e a memria neste pool, ele l comeara a alocar memria do o c o sistema operacional e a escrever mensagens de aviso no log de erro do MySQL. Nmero de threads de E/S de arquivos no InnoDB. Noru malmente ele deve ser 4, mas no Windows E/S de disco pode se beneciar de um nmero maior. u Tempo limite em segundos que uma transao InnoDB ca pode esperar por uma trava antes de fazer um roll back. InnodDB detecta automaticamente deadlocks de transaes em sua prpria tabela bloqueada e faz um co o roll back da transao. Se voc utiliza o comando LOCK ca e TABLES, ou outro mecanismo de armazenamento seguro com transaes diferente do InnoDB na mesma transao, co ca ento um deadlock pode crescer, o que no seria notia a cado pelo InnoDB. Nestes casos o tempo limite util para e resolver a situao. ca (Dispon a partir da verso 3.23.40.) O valor padro ivel a a para este parmetro fdatasync. Outra opo O_ a e ca e DSYNC. Aviso: esta opo s deve ser denida em uma situao de ca o ca emergncia quando voc quiser um dump de suas tabelas e e em um banco de dados corropido! Os valores poss iveis so a de 1 - 6. Veja abaixo na seo Forando a recuperao ca c ca sobre o signicado dos valores. Como uma medida segura o InnoDB previne que um usurio modique os dados a quando esta opo > 0. Esta opo est dispon ca e ca a ivel a partir da verso 3.23.44. a
652
InnoDB: Setting file /home/heikki/data/ibdata1 size to 134217728 InnoDB: Database physically writes the file full: wait... InnoDB: datafile /home/heikki/data/ibdata2 did not exist: new to be created InnoDB: Setting file /home/heikki/data/ibdata2 size to 262144000 InnoDB: Database physically writes the file full: wait... InnoDB: Log file /home/heikki/data/logs/ib_logfile0 did not exist: new to be created InnoDB: Setting log file /home/heikki/data/logs/ib_logfile0 size to 5242880 InnoDB: Log file /home/heikki/data/logs/ib_logfile1 did not exist: new to be created InnoDB: Setting log file /home/heikki/data/logs/ib_logfile1 size to 5242880 InnoDB: Log file /home/heikki/data/logs/ib_logfile2 did not exist: new to be created InnoDB: Setting log file /home/heikki/data/logs/ib_logfile2 size to 5242880 InnoDB: Started mysqld: ready for connections Um novo banco de dados InnoDB foi criado. Voc pode se conectar ao servidor MySQL e com o programa cliente MySQL de costume como mysql. Quando voc naliza o servidor e MySQL com mysqladmin shutdown, a sa do InnoDB ser como a seguinte: ida a 010321 18:33:34 010321 18:33:34 InnoDB: Starting InnoDB: Shutdown mysqld: Normal shutdown mysqld: Shutdown Complete shutdown... completed
Agora voc pode ver os diretrios de arquivos de dados e logs e voc ver os e o e a arquivos criados. O diretrio de log tambm ir conter um pequeno arquivo chamado o e a ib_arch_log_0000000000. Este arquivo foi resultado da criao do banco de dados, ca depois do InnoDB desligar o arquivamento de log. Quando o MySQL for iniciado novamente, a sa ser a seguinte: ida a ~/mysqlm/sql > mysqld InnoDB: Started mysqld: ready for connections
653
Existe um erro de sintaxe em innodb_data_home_dir ou innodb_data_file_path. Se ocorrer algum erro na criao de banco de dados InnoDB, voc deve deletar todos os ca e arquivos criados pelo InnoDB. Isto signica todos os arquivos de dados, de log, o pequeno log arquivado e no caso de voc j ter criado algumas tableas InnoDB, delete tambm os e a e arquivos .frm correspondentes a estas tabelas do diretrio de banco de dados do MySQL. o Ento voc pode tentar criar o banco de dados InnoDB novamente. a e
654
Certique-se de que voc no ir ocupar todo o tablespace: tabelas InnoDB gasta muito e a a mais espao que tabelas MyISAM. Se um ALTER TABLE car sem espao, ele ir iniciar um c c a rollback, que pode levar horas se ele estiver no limite de disco. Para inseres, o InnoDB co utiliza o buer de insero para fundir registros de ca indices secundrios a a indices em grupos. Isto economiza muito a E/S de disco. No rollback tal mecanismo no usado e o rollback a e pode demorar 30 vezes mais que a insero. ca No caso de um rollback demorado, se voc no tiver dados valiosos e seu banco de dados, e a melhor que voc mate o processo de banco de dados, delete todos os arquivos de dados e e e de log do InnoDB e todos os arquivos de tabela .frm e inicie o seu trabalho de novo, do que esperar que milhes de E/Ss de disoc de complete. o
655
registro pai como se o mesmo valor de chave no existisse. Por exemplo, se voc tiver a e denido uma restrio de tipo RESTRICT, e existir um registro lho com diversos registros ca pais, o InnoDB no permite a deleo de qualquer um dos registros pais. a ca A partir da verso 3.23.50, voc tambm pode associar a clusula ON DELETE CASCADE ou a e e a ON DELETE SET NULL com a restrio de chave estrangeira. Opes correspondentes do ON ca co UPDATE esto disponiveis a partir da verso 4.0.8. Se ON DELETE CASCADE for especicado, a a e um registro na tabela pai for deletado, ento o InnoDB automaticamente tambm deleta a e todos aqueles registros na tabela lha cujos valores de chaves estrangeiras so iguais ao valor a da chave refernciada no registro pai Se ON DELETE SET NULL for especicado, os registros e lhos so automaticamente atualizados e assim as colunas na chave estrangeira so denidas a a com o valor NULL do SQL. Um desvio dos padres SQL: se ON UPDATE CASCADE ou ON UPDATE SET NULL retornam para o atualizar a MESMA TABELA que ja tenha sido atualizada durante o processo cascata, ele atua como RESTRICT. Isto para prevenirloops innitos resultantes de atualizaes em e co cascata. Um ON DELETE SET NULL auto referncial, por outro lado, funciona desde a verso e a 4.0.13. ON DELETE CASCADE auto referncial j est funcionando. e a a 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: 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 verso 3.23.50 o InnoDB lhe permite adicionar novas restrioes de chaves a c o estrangeiras a uma tabela. ALTER TABLE seunomedetabela ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES anothertablename(...) [on_delete_and_on_update_actions]
656
Lembre-se de criar os indices necessrios primeiro. a A partir da verso 4.0.13, o InnoDB suporta a ALTER TABLE suatabela DROP FOREIGN KEY id_chave_estrangeira_gerada_internamente Voc tem que usar SHOW CREATE TABLE para daterminar as ids de chaves estrangeiras gere adas internamente quando voc apaga uma chave estrangeira. e Na verso anterior a 3.23.50 do InnoDB, ALTER TABLE ou CREATE INDEX no devem ser a a usadas em conexes com tabelas que tm restrioes de chaves estrangeiras ou que so reo e c a fernciadas em restries de chaves estrangeiras: Qualquer ALTER TABLE remove todas as e co restries de chaves estrangeiras denidas na tabela. Voc no deve utilizar ALTER TABLE co e a para tabela referenciadas tambm, mas utilizar DROP TABLE e CREATE TABLE para modifcar e o esquema. Quando o MySQL faz um ALTER TABLE ele pode usar internamente RENAME TABLE, e isto ir confundir a restrio de chave estrangeira que se refere a tabela. Uma a ca instruo CREATE INDEX processada no MySQL como um ALTER TABLE, e estas restries ca e co tambm se aplicam a ele. e Ao fazer a vericao de chaves estrangeiras, o InnoDB dene o bloqueio a nivel de linhas ca compartilhadas em registros lhos e pais que ele precisa vericar. O InnoDB verica a restrio de chaves estrangeiras imediatamente: a vericao no aplicada no commit da ca ca a e transaao. c Se voc quiser ignorar as restries de chaves estrangeiras durante, por exemplo um operao e co ca LOAD DATA, voc pode fazer SET FOREIGN_KEY_CHECKS=0. e O InnoDB lhe permite apagar qualquer tabela mesmo que ela quebre a restrio de chaves ca estrangeira que referencia a tabela. Ao apagar um tabela restrio que denida na inca e struo create tambm apagada. ca e e Se voc recriar uma tabela que foi apagada, ela deve ter uma denio de acordo com a e ca restrio de chaves estrangeiras que faz referncia a ela. Ela deve ter os nomes e tipos de ca e colunas corretor e deve ter os indices na chave referenciada como indicado acima. Se esta condio no for satisfeita, o MySQL retornar o erro de nmero 1005 e se refere ao errno ca a a u 150 na string de mensagem de erro. A partir da verso 3.23.50 o InnoDB retorna da denio de chave estrangeira de uma tabela a ca quando voc chama e SHOW CREATE TABLE seunometabela Assim o mysqldump tambm produz as dinies de tabelas corretas no arquivo dump e e co no se esquece das chaves estrangeiras. a Voc tambm pode listar as restries de chaves estrangeiras de uma tabela T com e e co SHOW TABLE STATUS FROM seubancodedados LIKE T As restries de chaves estrangeiras so listadas no comentrio da tabela impresso na sa co a a ida.
7.5.5.3 Multiplos tablespaces - colocando cada tabela em seu prprio arquivo .ibd o
NOTA IMPORTANTE: se voc atualizar para o InnoDB-4.1.1 ou posterior, ser dif e a icil retornar a verso 4.0 ou 4.1.0! Isto ocorre porque verses anteriores do InnoDB no a o a permitem vrios tablespaces. Se voc precisar retornar para a verso 4.0, voc dever fazer a e a e a
657
um dump das tabelas e recriar todo o tablespace do InnoDB. Se voc no tiver criado e a novas tabelas InnoDB em verses posteriores a 4.1.1, e e precisar retornar a verso anterior o a rapidamente, voc pode fazer um downgrade direto para a verso 4.0.18 do MySQL, ou e a outra da srie 4.0. Antes de fazer o downgrade diretamente para a verso 4.0.xx, voc ter e a e a que nalizar todas as conexes a verses >= 4.1.1 e deixar o mysqld to run purge and o o the insert buer merge to completion, so that SHOW INNODB STATUS shows the Main thread in the state waiting for server activity. Then you can shut down mysqld and start 4.0.18 or later in the 4.0 series. A direct downgrade is not recommended, however, because it is not extensively tested. Starting from MySQL-4.1.1, you can now store each InnoDB table and its indexes into its own le. This feature is called multiple tablespaces, because then each table is stored into its own tablespace. You can enable this feature by putting the line innodb_file_per_table in the [mysqld] section of my.cnf. Then InnoDB stores each table into its own le tablename.ibd in the database directory where the table belongs. This is like MyISAM does, but MyISAM divides the table into a data le tablename.MYD and the index le tablename.MYI. For InnoDB, both the data and the indexes are in the .ibd le. If you remove the line innodb_file_per_table from my.cnf, then InnoDB creates tables inside the ibdata les again. The old tables you had in the ibdata les before an upgrade to >= 4.1.1 remain there, they are not converted into .ibd les. InnoDB always needs the system tablespace, .ibd les are not enough. The system tablespace consists of the familiar ibdata les. InnoDB puts there its internal data dictionary and undo logs. You CANNOT FREELY MOVE .ibd les around, like you can MyISAM tables. This is because the table denition is stored in the InnoDB system tablespace, and also because InnoDB must preserve the consistency of transaction ids and log sequence numbers. You can move an .ibd le and the associated table from a database to another (within the same MySQL/InnoDB installation) with the familiar RENAME command: RENAME TABLE olddatabasename.tablename TO newdatabasename.tablename; If you have a clean backup of an .ibd le taken from the SAME MySQL/InnoDB installation, you can restore it to an InnoDB database with the commands: ALTER TABLE tablename DISCARD TABLESPACE; /* CAUTION: deletes the current .ibd file! <put the backup .ibd file to the proper place> ALTER TABLE tablename IMPORT TABLESPACE; Clean in this context means: There are no uncommitted modications by transactions in the .ibd le. There are no unmerged insert buer entries to the .ibd le. Purge has removed all delete-marked index records from the .ibd le. mysqld has ushed all modied pages of the .ibd le from the buer pool to the le. You can make such a clean backup .ibd le with the following method. Stop all activity from the mysqld server and commit all transactions.
658
Wait that SHOW INNODB STATUS\G shows that there are no active transactions in the database, and the main thread of InnoDB is Waiting for server activity. Then you can take a copy of the .ibd le. Another (non-free) method to make such a clean .ibd le is to Use InnoDB Hot Backup to backup the InnoDB installation. Start a second mysqld server on the backup and let it clean up the .ibd les in the backup. It is in the TODO to allow moving clean .ibd les also to another MySQL/InnoDB installation. That requires resetting of trx ids and log sequence numbers in the .ibd le.
659
Copie todos os seus arquivos de log do InnoDB em um local seguro. Copie o(s) seu(s) arquivo(s) de congurao my.cnf em um local seguro. ca Copie todos os arquivos .frm da suas tabelas InnoDB em um local seguro. Alm de fazer um backup de binrio descrito acima, voc tambm deve fazer um dump da e a e e sua tabela com mysqldump. A razo para se fazer isto que um arquivo binrio pode ser a e a corrompido cem voc perceber. Dumps de tabelas so armazenados em um arquivo texto e a leg e muito mais simples que arquivos binrios de banco de dados. Ver tabelas corropidas ivel a atravs de arquivos de dump mais fcil e, como o seu formato simples, a chance dos e e a e dados se corromperem seriamente so bem menores. a Uma boa idia fazer dumps ao mesmo tempo que voc faz o backup de binrio do seu e e e a banco de dados. Voc tem que fechar todos os bancos de dados nos clientes para ter uma e cpia consistente de todas as suas tabelas em seu dump. Ento voc pode fazer o backup o a e de binrio e voc ter uma cpia consistente de seu banco de dados em dois formatos. a e a o Para se poder recuperar o seu banco de dados InnoDB atravs do backup de binrio descrito e a acima, voc tem que executar o seu banco de dados MySQL com o sistema de log geral e e o arquivamento de log do MySQL ligado. Com sistema de log geral ns queremos dizer o o mecanismo de log do servidor MySQL que independente dos logs do InnoDB. e Para recuperao de falhas do seu processo do servidor MySQL, a unica coisa que voc deve ca e fazer reinici-lo. InnoDB vericar automaticamente os logs e realizar um roll-forward e a a a do banco de dados para o situao atual. O InnoDB far automaticamente um roll back de ca a transaes sem commit existentes no momento da falha. Durante a recuperao, InnoDB co ca ir imprimir algo como o seguinte: a ~/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 0 13739520 InnoDB: Doing recovery: scanned up to log sequence number 0 13805056 InnoDB: Doing recovery: scanned up to log sequence number 0 13870592 InnoDB: Doing recovery: scanned up to log sequence number 0 13936128 ... InnoDB: Doing recovery: scanned up to log sequence number 0 20555264 InnoDB: Doing recovery: scanned up to log sequence number 0 20620800 InnoDB: Doing recovery: scanned up to log sequence number 0 20664692 InnoDB: 1 uncommitted transaction(s) which must be rolled back 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 InnoDB: Starting an apply batch of log records to the database... InnoDB: Apply batch completed InnoDB: Started mysqld: ready for connections
660
Se o seu banco de dados for corrompido ou o seu disco falhar, voc ter que fazer recue a peraes de um backup. no caso de dados corropidos, voc deve primeiro encontrar um co e backup que no est corrompido. A partir de um backup, faa a recuperao a partir do a a c ca arquivo de logs gerais do MySQL de acordo com a instruo no manual do MySQL. ca
661
6 (SRV FORCE NO LOG REDO) no faa o roll-forward no log em em conexo com a c a recuperao. ca
662
os formatos so diferentes e suas tabelas contenham dados de ponto utuante, voc tem a e que utilizar mysqldump e mysqlimport para mover estas tabelas. Uma dica de desempenho desligar o modo auto-commit quando voc importa dados em e e seu banco de dados, assumindo que o seu tablespace tem espao suciente para o grande c segmento de roolback que a transao de importao ira gerar. S faa o commit depois de ca ca o c importar toda a tabela ou um segmento de uma tabela.
663
O comportamento padro denir o n a e ivel de isolamento para a prxima transao (no o ca a iniciada). Se voc especicar a palavra chave GLOBAL na instruo acima, ela determinar o e ca a n de isolamento globalmente para todas as novas conexes criadas a partir deste ponto ivel o (mas no conexo exitentes). Voc precisa do privilgio SUPER para fazer isto. Usar a palavra a a e e chave SESSION dine a transao padro para todas as transaes realizadas futuramente ca a co na conexo atual. Qualquer cliente livre para alterar o n a e ivel de isolamento da sesso a (mesmo no meio de uma transao), ou o n de isolamento para a prxima transao. ca ivel o ca Voc pode consultar o n de isolamento da transao global ou da sesso com: e ivel ca a 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 alm dos registros de e indices, o InnoDB tambm pode bloquear e a lacuna antes de um registro de indice para bloquear inseres por outros usurios co a 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 trava a lacuna antes do registro de o indice. Uma descrio detalhada de cada n de isolamento em InnoDB: ca ivel READ UNCOMMITTED Tambm chamada dirty read: SELECTs sem bloqueio so ree e a verso mais nova de um registro; alizados de forma a no procurar por uma possivel a a assim as leituras no so consistentes sob este n a a ivel de isolamento; de outra forma este n funciona como READ COMMITTED. ivel READ COMMITTED N ivel de isolamento parecido com o Oracle. Todas as instrues co SELECT ... FOR UPDATE e SELECT ... LOCK IN SHARE MODE s travam o registro de o indice, n~o a lacuna antes dele e assim permite livre insero de novos registros prximo a ca o 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 inseres feitas por outros usurios nas co a lacunas cobertas pela faixa. Ist necessrio j que deve se bloquear linhas fantasmas oe a a para a replicao e recuperao no MySQL funcionar. Leituras consistentes (Consistent ca ca reads) comportam como no Oracle: cada leitura consistente, mesmo dentro da mesma transao, congura e l a sua prpria cpia recente. ca e o o REPEATABLE READ Este o n e ivel de isolamento padro do InnoDB. SELECT ... FOR a UPDATE, SELECT ... LOCK IN SHARE MODE, UPDATE, e DELETE que utilizam um indice unico com uma condio de busca unica, travam apenas o registro de ca indice encontrado, e no a lacuna antes dele. De outra forma estas operaes empregam travamento de a co registro seguinte, bloqueando a faixa de indice varrida com trava de chave seguinte ou de lacuna e bloqueando novas inseres feitas por outros usurios. Em leituras co a consistentes (consistent reads) existe uma diferena importante do n de isolmento c ivel todas as leituras consistentes dentro da mesma transao lem o anterior: neste nivel ca e mesma cpia estabelacido pela primeira leitura. Esta converso signica que se voc o a e executa diversas SELECTs dentro da mesma transao, elas tambm so consistentes ca e a entre elas. SERIALIZABLE Este n ivel como o anterior, mas todos os SELECTs so convertidos e a implicitamente para SELECT ... LOCK IN SHARE MODE.
664
7.5.9.3 Lock de Leitura SELECT ... FOR UPDATE e SELECT ... LOCK IN SHARE MODE
Uma leitura consistente no conveniente em alguma circunstncias. Suponha que voc a e a e queira adicionar uma nova linha em sua tabela CHILD, e est certo que ela j possui um pai a a na tabela PARENT. Suponha que voc utilize leitura consistente para ler a tabela PARENT e certamente veja o e pai do lho na tabela. Agora voc pode adiciona com segurana o registro lho na tabela e c CHILD? No, porque pode ter acontecido de outro usurio ter deletado o registro pai da a a tabela PARENT, e voc no estar ciente disto. e a A soluo realizar o SELECT em um modo de travamento, LOCK IN SHARE MODE. ca e SELECT * FROM PARENT WHERE NAME = Jones LOCK IN SHARE MODE; Realizar uma leitura em modo compartilhado signica que lemos o dado dispon ivel por ultimo e conguramos travas de leitura nos registros lidos. Se o este dado pertencer a uma transao de outro usurio que ainda no fez commit, esperaremos at que o commit seja ca a a e realizado. Uma trava em modo compartilhado previne que ocorra atualizaes ou delees co co de registros j lidos. Depois de vermos que a consulta acima retornou o pai Jones, a podemos com segurana adicionar o seu lho a tabela CHILD, e realizar o commit de nossa c transao. Este exemplo mostra como implementar integridade referncial no cdigo de sua ca e o aplicao. ca Deixe-nos mostrar outro exemplo: temos um compo de contador inteiro em uma tabela CHILD_CODES que usamos para atribuir um identicador unico para cada lho que adi cionamos na tabela CHILD. Obviamente, usar uma leitura consistente ou uma leitura em modo compartilhado para ler o valor atual do contador no uma boa idia, j que dois a e e a usurios do banco de dados podem ver o mesmo valor para o contador e, assim, ter a iamos um erro de chave duplicada ao adicionarmos os dois lhos com o mesmo identicador para a tabela.
665
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 depois disto l-lo, ou (2) ler o o e contador primeiro com um modo de bloqueio FOR UPDATE, e increment-lo depois disto: a SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE; UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1; Um SELECT ... FOR UPDATE ir ler o dado dispon por ultimo atribuindo travas exclusivas a ivel a cada linha que ele ler. Assim ele atribui uma mesma trava que um UPDATE SQL pesquisado atribuiria nos registros.
666
667
determinado pelo nmero de linhas que foram inseridas, atualizadas ou deletadas. Antes u da verso 4.0.5, InnoDB sempre fazia roll back da transao cujo pedido de bloqueio fosse o a ca ultimo a criar o deadlock, isto , um ciclo no grafo de espera da transao. e ca O InnoDB no pode detectar deadlocks onde uma trava atribuida por uma instruo MySQL a ca LOCK TABLES est envolvida ou se uma trava denida em outro mecanismo de banco de a dados diferente de InnoDB est envolvida. Voc tem que resolver estas situaes usando a e co innodb_lock_wait_timeout congurado em my.cnf. Quando o InnoDB realiza um rollback completo de uma transao, todos as travas da ca transao so liberadas. No entanto, se feito o rollback de apenas uma unica instruo ca a e ca SQL como um resultado de um erro, algumas das travass denidas pela instruo podem ca ser preservadas. Isto ocorre porque o InnoDB armazena as travas de registro em um formato onde ele no pode saber qual trava foi denida por qual instruo SQL. a ca
668
Assima o usurio A v a linha inserida por B apenas quando B zer um commit da insero a e ca e A tiver feito um commit de sua prpria transao pois assim o ponto no tempo avanado o ca e c para depois do commit de B. Se voc deseja ver o estado mais atual do banco de dados, voc deve utilizar uma trava de e e leitura: SELECT * FROM t LOCK IN SHARE MODE;
O InnoDB utiliza bloqueio automtico de registro. Voc pode obter deadlocks mesmo no caso a e de transaes que inserem ou deletam uma unica linha. Isto ococrre porque estas operaes co co no so realmente atmicas: elas automaticamente atribuem travas aos (possivelmente a a o muitos) registros se indices da linha inserida/deletada. Voc pode lidar com deadlocks e reduz com os seguintes truques: e i-lo Use SHOW INNODB STATUS em verses do MySQL posteriores a 3.23.52 e 4.0.3 para o determinar a causa do ultimo deadlock. Isto pode lhe ajudar a sintonizar a sua aplicao ca a avitar travas. Sempre estar preparado para reexecutar uma transao se ela falhar em um deadlock. ca Deadlocks no sAo perigosos. Apenas tente de novo. a Commit sua transaes com frequncia. Transaes pequenas tm menos chaces de co e co e colidir. Se voc estiver utilizando as travas de leitura SELECT ... FOR UPDATE ou ... LOCK IN e SHARE MODE, tente usar um n de isolamente mais baixo READ COMMITTED. ivel Accesse as suas tabelas e linha em uma ordem xa. Assim as transaes formaro las co a ordenadas e no entraro em deadlock. a a Adicione indices bem escolhidos a sua tabela. Ento a suas consultas precisaro varrer a a menos registros de indice e consequentemente atribuiro menos locks. Use EXPLAIN a SELECT para fazer o MySQL selecione indices apropriados a sua consulta. Use menos locks: se voc pode utilizar um SELECT para retornar dados de uma copia e de banco de dados antiga, no adicione a clusula FOR UPDATE ou LOCK IN SHARE MODE. a a Usar o n de isolamento READ COMMITTED bom aqui, pois cada leitura consistente ivel e dentro da mesma transao l da sua prpria cpia atual. ca e o o Se nada ajudar, serialize suas transaes com bloqueio de tabela: LOCK TABLES t1 co WRITE, t2 READ, ... ; [faz algo com tabelas t1 e t2 aqui]; UNLOCK TABLES. Bloqueio de tabela faz com que suas transaes se enlerem em ordem e deadlocks co sero evitados. Note que LOCK TABLES inicia implictamente uma transao, assim a ca como o comando BEGIN, e UNLOCK TABLES naliza implicitamente uma transao em ca um COMMIT.
669
Outra soluo para colocar transaes em srie criar uma tabela semforo auxiliar ca co e e a onde exista apenas uma unica linha. Cada transao atualiza esta linha antes de ca acessar outra tabela. Deste modo todas as transaes acontecem em srie. Note que co e o algoritmo de deteco automtico de deadlock do InnoDB tambm funciona pois a ca a e trava de srie uma trava de registro. Na trava de tabela do MySQL ns temos que e e o recorrer ao mtodo do tempo limite para resolver um deadlock. e
670
8. Tome cincia dos grandes rollbacks de inseres em massa: o InnoDB utiliza o buer de e co insero para economizar E/S de disco em inseres, mas em um rollback corresponca co dente tal mecanismo no usado. Um rollback no limite de disco pode demorar cerca a e de 30 vezes mais que a inssero correspondente. Matar o processa de banco de dados ca no ir ajudar pois o rollback ir reiniciar ao se entrar no banco de dados. O unico a a a modo de se livrar de um rollback deste tipo aumentar a rea de buer de forma que e a o rollback dependa do limite de CPU e seja executado rpidamente ou deltar todo o a banco de dados InnoDB. 9. Tome cincia tambm de outras grandeas operaes com limite de disco. Use DROP e e co TABLE ou TRUNCATE (a partiir do MySQL-4.0) para esvaziar uma tabela, no DELETE a FROM suatabela. 10. Utilize INSERT multi-line para reduzir a sobrecarga de comunicao entre o cliente e o ca servidro se voc precisar inserir muitas linhas: e INSERT INTO suatabela VALUES (1, 2), (5, 5); Esta dica vlida para inseres em qualquer tipo de tabela, no apenas no InnoDB. e a co a
671
DROP TABLE innodb_monitor; A sintaxe CREATE TABLE s um modo de passar um comando ao mecanismo InnoDB atravs e o e do analisador SQL do MySQL: a tabela criada no relevante para o Monitor InnoDB. Se a e voc fechar o banco de dados quando o manitor estiver em execuo, e voc quiser iniciar e ca e o monitor novamente, voc deve apagar a tabela antes de executar um novo CREATE TABLE e para iniciar o monitor. A sinstaxe pode alterar em distribuio futuras. ca Uma sa padro do Monitor InnoDB: ida a ================================ 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
672
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 seo LOCKS HELD BY TRANSACTIONS relatar espera de bloqueios, ento a ca a sua aplicao pode ter diputa de travas. A saida tambm ajuda a rastrear as razes de ca e o deadlocks nas transaes. co A seo SYNC INFO ir relatar semforos reservados se voc compilar o InnoDB com ca a a e UNIV_SYNC_DEBUG denido em univ.i. A seo SYNC ARRAY INFO relatas as threads que esperam por semforos e esca a tat isticas sobre quantas vezes a thread precisou esperar por um mutex ou por um semforo de trava de leitura/escrita. Um nmero grande de espera da thread pelo a u semforo pode ser um resultado de E/S de disco ou problemas de disputa dentro do a InnoDB. As disoutas pode ser devido a paralelismo pesado de consultas ou problemas na programao das threads no sistema operacional. ca A seo CURRENT PENDING FILE I/OS lista os pedidos de E/S de arquivos que ca esto pendente. Um nmero grande indica que a carga de trabalho esta no limite de a u disco. A seo BUFFER POOL lhe d estat ca a iticas sobre leitura e escrita das pginas. Voc a e pode calcular a partir destes nmeros quanto de E/S em arquivos de dados a sua u consulta esta fazendo atualmente.
673
674
os arquivos .frm e porque DROP DATABASE no funcionava em tabelas do tipo InnoDB em a versOes do MySQL anteriores a 3.23.43. Toda tabela InnoDB tem um indice especial chamado de indice agrupado onde os dados dos registros so armazenados. Se voc denir um chave primaria (PRIMARY KEY) na sua a e tabela, ento o a indice da chave primria ser o a a indice agrupado. Se voc no denir uma chave primria para a sua tabela, o InnoDB ir gerar internamente e a a a um indice agrupado qonde as linhas so ordenadas pela ID da linha que o InnoDB atribui a as linhas nestas tabelas. O ID da linha um campo de 6 bytes que cresce quando novas e linhas so inseridas. Assim as linhas armazenadas pela sua ID estaro sicamente na ordem a a de insero. ca Acessar uma linha pelo indice agrupado rpido porque os dados do registro estaro na e a a mesma pgina que a busca de a indice nos indicar. Em muitos bancos de dados, os dados so armazenados em pgina diferente daquela em que se encontra os registros de a a indices, Se uma tabela grande, a arquitetura do e indice agrupado geralmente economiza E/S de disco se coparado a soluo tradicional. ca O registro em indices no agrupados (tambm os chamamos de a e indices secundrios) em a InnoDB contm o valor da chave primria para a linha. O InnoDB usa este valor de chave e a primria para buscar o registro do a indice agrupado. Note que se a chave primria for grande, a os indices secundrios iro utilizar ainda mais espao. a a c
675
de insero especial. O buer de insero mantido to pequeno que ele cabe totalmente ca ca e a na rea de buer e inseres nele podem ser feitas muito rpido. a co a O buer de insero unido periodicamente ` rvore de indices secundrios no banco de ca e aa a dados. Geralmente ns podemos juntar diversas inseres na mesma pgina na rvore o co a a indice o que economiza E/S de disco. Buers de inseres podem aumentar a velocidade co das inseres em uma tabela em cerca de 15 vezes. co
676
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 inicializao do contador de auto incremento ca para uma tabela recem criada. Note que se o usurio especica em uma insero o valor 0 a coluna auto-increment. o a ca InnoDM trata a linha como se o valor no tivesse sido especicado. a Depois do contador de auto incremento tiver sido inicializado, se um usurio insere uma a linha onde especicamos explicitamente o valor da coluna e o valor maior que o valor e atual do contador, ento o contador congurado com o valor especicado. Se o usurio a e a no especicar um valor explicitamente, o InnoDB incrementa a contador de um e atribui a o seu novo valor a coluna. O mecanismo de auto incremento, ao atribuir valor ao contador, desvia de manipuladores de travas e transaes. De outra forma voc tambm pode obter lacuas na sequncia de co e e e nmeros se voc zer um roll back da transao que tiver obtido nmeros do contador. u e ca u O comportamento do auto incremento no denido se um usurio passar um valor negativo a e a a coluna ou se o valor se tornar maior que o valor inteiro mximo que pode ser armazenado a no tipo inteiro especicado.
677
do arquivo de dados em innodb_data_file_path. A partio deve ter, pelo menos, o ca tamanho que voc especicou. Note que 1M no InnoDB 1024 x 1024 bytes, enquanto na e e especicao de disco 1 MB normalmente signica 1000 000 bytes. ca innodb_data_file_path=/dev/hdd1:5Gnewraw;/dev/hdd2:2Gnewraw Quando voc reinicia o banco de dados voc deve alterar a palavra chave para raw. Seno e e a o InnoDB escrever sobre a sua partio! a ca innodb_data_file_path=/dev/hdd1:5Graw;/dev/hdd2:2Graw Usando um disco raw voc pode ter E/S sem buer em algumas veses de Unix. e o Quando voc usar parties de disco raw, certique-se de que voc tem permisses que e co e o 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 aleatria. Na read-ahead sequencial o InnoDB percebe que o padro de acesso a um o a segmento no tablespace sequencial. ento o InnoDB enviar uma grupo de leitura das e a a paginas do banco de dados para o sistema de E/S. No read-ahead aleatrio o InnoDB o percebe que algumas reas no tablespace parecem estar no processo de serem totalmente a lidas na rea de buer. O InnoDB envia as leituras remanescente para o sistema de E/S. a
678
Quando voc deletar dados de uma tabela, o InnoDB contrair o e a indice de rvore-B cora respondente. Ele depende do padro de delees se isto liberar pginas individuais ou exa co a tenses da tablespace, assim que o espao liberado estiver dispon para outros usurios. o c ivel a Apagar a tabela ou deletar todos os registros dela garante a liberao do espao para outca c ros usurios, mas lembre-se que registros deletados s podem ser sicamente removidos em a o uma operao de remoo (purge), depois que no houver mais necessidades de rollback ca ca a em trasaes ou leituras consistentes. co
679
No Windows o InnoDB armazena os nomes de banco de dados e tabelas internamente sempre em letras minsculas. Para mover bancos de dados em um formato binrio do u a Unix para o Windows ou do Windows para o Unix voc deve ter todas os nomes de e tabelas e banco de dados em letras minscula. u Aviso: NAO converta o sistema de tabelas MySQL de MyISAM PARA InnoDB! Isto no suportado; se voc zer isto o MySQL no reiniciar at que voc restaure o a e e a a e e sistema de tabelas antigo de um backup ou os regenere com o script mysql_install_ db. SHOW TABLE STATUS no d estat a a isticas exatas sobre tabelas InnoDB, exceto sobre o tamanho f isico reservado pela tabela. O contador de linha apenas uma estimativa e rude usada na otimizao SQL. ca Se voc tentar criar um e indice unico em um prexo de coluna voc obter um erro. e a CREATE TABLE T (A CHAR(20), B INT, UNIQUE (A(5))) TYPE = InnoDB; Se voc criar um e indice que no seja unico em um prexo de uma coluna, o InnoDB a criar um a indice sobre toda a coluna. INSERT DELAYED no suportado por tabelas InnoDB. a e As operaes LOCK TABLES do MySQL no tem conhecimento dos bloqueios de resistro co a do InnoDBcongurados em instrues SQL completadas: isto signica que voc pode co e conseguir um bloqueio de tabela mesmo se j existir transaes de outros usurios que a co a tiverem bloqueios de registros na mesma tabela. Assim suas operaes sobre a tabela co poder ter que esperar se eles colidirem com essas travas de outros usurios. Tambm a e pode ocorrer um deadlock. No entanto isto no tarz perigo a instegridade da transao, a ca pois o bloqueio de registro denido pelo InnoDB sempre cuidar da integridade. Um a bloqueio de tabela tambm previne que outras transaes adquiram mais bloqueios de e co registros (em um modo de bloqueio conitante) na tabela. Uma tabela no pode ter mais de 1000 colunas. a DELETE FROM TABLE no gera a tabela novamente, mas, ao invs diato, deleta todas as a e linhas, uma a uma, o que no rpido. Em verses futuras do MySQL voc poder a e a o e a usar TRUNCATE que mais rpido. e a O tamanho de pgina padro utilizado no InnoDB 16KB. Recompilando o cdigo a a e o pode se congur-la com 8 KB a 64 KB. O tamanho mximo de um registro menos a a e da metade da pgina de banco de dados nas verses anteriores a 3.23.40 do InnoDB. A a o partir da distribuio fonte da verso 3.23.41 colunas BLOB e TEXT podem ter at 4 ca a e GB e o tamanho total do registro tambm devem ser menores que 4GB. O InnoDB no e a armazena campos cjo tamanho menor que 128 bytes em pginas separadas. Depois e a do InnoDB modicar o registro armazenando campos grandes em pginas separadas, a o tamanho restante da linha deve ser menor que metade da pgina de banco de dados. a O tamanho mximo da chave de 7000 bytes. a e 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 mximo do tablespace 4 bilhes de pginas de banco de dados. Este a e o a tambm o tamanho mximo da tabela. O tamanho m e e a inimo do tabelspace de 10 e MB. Quando voc reinicia o servidor MySQL, o InnoDB pode reutilizar um valor antigo e para uma coluna AUTO_INCREMENT.
680
Voc no pode denir o primeiro valor de uma coluna AUTO_INCREMENT no InnoDB e a com CREATE TABLE ... AUTO_INCREMENT=... (ou ALTER TABLE ...). Para denir este valor insira uma linha com o valor de menos e delete esta linha.
681
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.
682
bullet Na verso 4.0.13 fazemos SHOW INNODB STATUS exibir informaes detalhadas a co sobre o ultimo erro de UNIQUE KEY, mas armazenar esta informao podia deixar o ca REPLACE bem mais lento. No exibimos nem armazenamos mais a informao. a ca bullet Corrigido um erro: SET FOREIGN KEY CHECKS=0 no era replicado apropriadaa mente na replicao do MySQL. A correo provavelmente no ser feita na srie 3.23. ca ca a a e bullet Corrigido um erro: o parmetro innodb max dirty pages pct no levav em conta a a as pginas livres na rea de buer. Isto podia levar a descargas excessivas mesmo a a se houvesse muitas pginas livres na rea de buer. Soluo: SET GLOBAL inna a ca odb max dirty pages pct = 100.
683
bullet Adicionado uma nova varivel global congurvel de sistema do MySQL (innodb_max_ a a dirty_pages_pct). Ela um interio na faixa de 0 - 100. O padro 90. A thread e a e principal no InnoDB tenta descarregar as pginas da rea de buer j que grande parte a a a deste percetual ainda no foi descarregado em nenhum momento. a bullet Se innodb_force_recovery=6, no deixar o InnoDB fazer reparao de pginas cora ca a rompidas baseadas no buer de dupla escrita. bullet O InnoDB agora inica mais rpido porque ele no dene a memria na rea de buer a a o a para zero. bullet Corrigido um erro: a denio FOREIGN KEY do InnoDB era confudida com as palavras ca chaves foreign key dentro dos comentrios do MySQL. a bullet Corrigido um ero: se voc apagasse um tablea para qual havia uma referncia de e e chave estrangeira, e posteriormente criasse a mesma tabela com tipo de colunas no a correspondentes, o InnoDB podia entrar em dict0load.c, na funo dict_load_table. ca bullet Corrigido um erro: GROUP BY e DISTINCT podia tratar valores NULL como diferentes. O MySQL tambm falahva ao fazer o lock da prxima chave no caso de uma faixa de e o indice vazia. bullet Corrigido um erro: no faz COMMIT da transao atual quando uma tabela MyISAM a ca e atualizada; isto tambm faz com que CREATE TABLE no faa commit de uma transao e a c ca InnoDB, mesmo quando o log binrio estiver habilitado. a bullet Corrigido um erro: no permite que ON DELETE SET NULL modique a mesma tabela a onde o delete foi feito; podemos permit porqeu into no pode produzir loops innitos i-lo a em operaes em cascata. co bullet Corrigido um erro: permitir HANDLER PREV e NEXT tambm depois de posicionar o cursor e com uma busca unica na chave primria a bullet Corrigido um erro: se MIN() ou MAX() resultasse em um deadlock ou em esgotamento do tempo de espera do lock, o MySQL no retornava um erro, mas NULL como o valor a da funo. ca bullet Corrigido um erro: o InnoDB esquecia de chamar pthread_mutex_destroy() quando uma tabela era apagada. Isto podia causar perda de memria no FreeBSD e outros o Unix, exceto o Linux.
684
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.
685
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 100 vezes em intervalos de 1 segundo. e Corrigido um erro: REPLACE INTO t1 SELECT ... no funciona se t1 tiver uma a coluna com auto incremento. a e Um erro proeminente: SET FOREIGN KEY CHECKS=0 no replicado de forma apropriada em replicaes do MySQL. co
686
Isto poderia fazer com que a recuperao em caso de falhas e o InnoDB Hot Backup ca falhassem na varredura do log. Corrigido um erro: restaurao do cursos de ca indice poderia, teoricamente, falhar.
687
Corrigido um erro: TRUNCATE em uma tabela temporria causa erro no InnoDB. a Corrigido um erro introduzido na verso 4.0.5: se o log binrio no estivessem ligado, a a a INSERT INTO ... SELECT ... ou CREATE TABLE ... SELECT ... podiam fazer com que o InnoDB pendurasse em um semforo criado em btr0sea.c, line128. Soluo: a ca ligar o log binrio. a Corrigido um erro: na replicao, executar SLAVE STOP no meio de uma transao ca ca multi-instruo podia fazer com que SLAVE START s realizasse parte da transao. ca o ca Um erro parecido podia ocorrer se o slave nalizasse devido a um erro e fosse reiniciado.
688
Se voc denir innodb force recovery > 0, o InnoDB tenta saltar para os registros e e pginas com a 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 simulao no NT, 95/98/ME. ca 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 rvore de a indice j era um ramo na ra Isto podia causar varreduras de tabela desnecessriaem a iz. a consultas SQL. A correo tambm ser feita na verso 3.23.54. ca e a a Corrigido um erro presente nas verses 3.23.52, 4.0.3, 4.0.4: A inicializao do Inno ca oDB podia levar muito tempo ou at mesmo falhar em alguns computadores Windows e 95/98/ME. Corrigido um erro: o lock AUTO-INC er guardado para o m da transao se ele fosse a ca concedido depois de uma espera de lock. Isto podia causar deadlocks desnecessrios. a Corrigido um erro: se SHOW INNODB STATUS, innodb monitor, ou innodb lock monitor tiver exibido centenas de transaes em um relatrio, e a sa co o 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 mdio e dos arquivos lidos como 0 bytes. Corrigido um erro potencial na verso 4.0.4: o InnoDB agora faz ORDER BY ... DESC a como o MyISAM. Corrigido um erro: DROP TABLE podia causar falhas ou um travamento se houvesse um rollback executando concorrentemente na tabela. A correo ser feita na srie 3.23 ca a e se este for um problema para os usurios. a Corrigido um erro: ORDER BY podia falhar se voc no tivesse criado um chave e a primria para uma tabela, mas tivesse denido diversos a indices nos quais pelo menos um seja um indice unico (UNIQUE) com todas as suas colunas declaradas como NOT NULL. Corrigido um erro: um espera pelo tempo limite na conexo com ON DELETE CASa CADE podia causar corrompimento nos indices. Corrigido um erro: se um SELECT era feito com uma chave unica a partir de um indice primrio e a busca correspondesse a um registro marcado para deleo, o InnoDB podia a ca retornar o prximo registro. o Outstanding bugs: na verso 4.0.4 dois erros foram introduzidos no a 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 sero corrigidos na versao 4.0.6. a
689
Ajustamos a estimativa de faixa para uqe varreduras de indices na faixa tenham preferncia sobre a varredura completa de e indices. Permitir a remoo e criao de tableas mesmo se o innodb force recovery est conguca ca a rado. Pode se usar isto para remover uma tabela que causaria uma falha no rollback ou deleo, ou se uma importao de tabelas com falhas causa um rollback na recuperao. ca ca ca Corrigido um erro presente nas verses 3.23.52, 4.0.3, 4.0.4: A inicializao do InnoDB o ca podia demorar ou mesmo travar em alguns computadores Windows 95/98/ME. Corrigido um ero: a nalizao rpida (que padro), algumas vezes cava lenta pela ca a e a unio do buer de remoo e insero. a ca ca Corrigido um erro: fazer um grande SELECT de uma tabela onde nenhum registro estava vis em uma leitura consistente podia causar uma espera de semforo muito ivel a longo (> 600 segundos) em btr0cur.c line 310. Corrigido um erro: o lock AUTO-INC era guarda para o m da transao se fosse ca concedido depois de uma espera de lock. Isto podia causar um deadlock desnecessrio. a Corrigido um erro: se voc criar uma tabela temporria dentro de LOCK TABLES, e e a usar esta tabela temporria, causar um falha de declarao em ha innobase.cc. a a ca Corrigido um erro: se SHOW INNODB STATUS, innodb monitor, ou innodb lock monitor tiver exibido centenas de transaes em um relatrio, e a sa co o 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 mdio e dos arquivos lidos como 0 bytes.
690
Corrigido um erro: se a cache de consultas do MySQL foi usada, ela no ca invalidada a por uma modicao feita por ON DELETE CASCADE ou ...SET NULL. ca Corrigido um erro: se voc criar uma tabela temporria dentro de LOCK TABLES, e e a usar esta tabela temporria, causar um falha de declarao em ha innobase.cc. a a ca Corrigido um erro: se voc denisse innodb ush log at trx commit com 1, SHOW e VARIABLES mostraria seu valor como 16 milhes. o
691
to rpido quanto congurar innodb ush log at trx commit=0, e congurar com 2 a a tambm tem o recurso no qual em uma falha onde o sistema operacional no teve probe a lemas, nenhuma transao cujo commit foi realizado perdida. Se osistema operacional ca e falhar ou houver um queda de fora,ento a congurar com 2 no mais segura que c a a e congurar com 0. Adicionado campos de checksum ao bloqueio de log. SET FOREIGN KEY CHECKS=0 ajuda na importao de tabelas numa ordem arca bitrria que no respeita as regras de chaves estrangeiras. a a SET UNIQUE CHECKS=0 aumenta a velocidade da importao das tabelas dentro ca do InnoDB se voc tiver restries de chave unica em e co indices secundrios. a SHOW TABLE STATUS agora tambm lista poss e iveis ON DELETE CASCADE ou ON DELETE SET NULL no campo de comentrio da tabela. a Quando CHECK TABLE est executando em qualquer tipo de tabela InnoDB, ela a agora verica tambm o indice hash adaptativo para todas as tabelas. e Se voc deniu ON DELETE CASCADE ou SET NULL e atualizou o chave referencie ada no registro pai, o InnoDB deletava ou atualizava o registro lho. Isto est alterado a conforme o SQL-92: voc recebe o erro Cannot delete parent row. e 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 atualizasse a chave primria de uma tabela, podia ocorrer e a uma falha de declarao em page0page.ic line 515. ca Corrigido um erro: se voc deleta ou atualiza um registro referenciado em uma restrio e ca de chave estrangeira e a vericao de chave estrangeira esperapor um lock, ento ca a a vericao pode relatar um resultado errneo. Isto tambm afeta a operao ON ca o e ca DELETE... Corrigido um erro: Um deadlock ou um erro de tempo esgotado na espera do lock no InnoDB causa um rollback de toda a transao, mas o MySQL ainda podia gravar as ca instrues SQL no log binrio, embora o InnoDB faa um rollback delas. Isto podia, co a c por exemplo, fazer a replicao do banco de dados car fora de sincronia. ca Corrigido um erro: se o banco de dados falha no meio de um commit, ento a recua perao pode perder pginas de tablespace. ca a Corrigido um erro: se voc especicar um conjunto de caracteres no my.cnf, ento, ao e a contrrio do que est no manual, em uma restrio de chave estrangeira uma coluna do a a ca tipo string tinha que ter o mesmo tamanho na tabela que faz a referncia e na tabela e referenciada. Corrigido um erro: DROP TABLE ou DROP DATABASE podiam falhar se houvesse um CREATE TABLE executando simultaneamente. Corrigido um erro: se voc congurasse a rea de buer com mais de 2GB em um e a computador de 32 bits, o InnoDB falharia no buf0buf.ic linha 214.
692
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 exibio de locks para uma pgina. ca a Corrigido um erro: na verso HP-UX-10.20, mutexes perderiam memria e causariam a o condies de corrida e falhariam em alguma parte do cdigo do InnoDB. co o Corrigido um erro: se voc rodou em modo AUTOCOMMIT, executou um SELECT, e e imeditamente depois um RENAME TABLE, ento RENAME falharia e o MySQL a reclamaria com o erro 192. Corrigido um erro: se compilado no Solaris 64 bits, o InnoDB produiria um erro de bus na inicializao. ca
693
Para permitir que a ferramenta de hot backp funcione, no Windows no usaremos mais a E/S sem buer ou E/S ass incrona nativa; usaremos a mesma assincronia simulada como no Unix. Agora voc pode denir as clusulas ON DELETE CASCADE ou ON DELETE SET e a NULL em caves estrangeiras. Restries de chaves estrangeiras agora sobrevivem a ALTER TABLE e e CREATE co INDEX. Suprimimos a vericao de FOREIGN KEY se qualquer um dos valores de coluna na ca chave estrangeira ou chave referenciada a ser vericada SQL NULL. Isto compat e e ivel com Oracle, por exemplo. SHOW CREATE TABLE agora tambm lista todas as restries de chaves estrangeiras. e co O mysqdump tambm no esquece mais sobre sobre chaves estrangeiras na deniode e a ca tabelas. Agora voc pode adicionar uma nova restrio de chave estrangeira com ALTER TAe ca BLE ... ADD CONSTRAINT FOREIGN KEY (...) REFERENCES ... (...). As denies de FOREIGN KEY agora permitem nomes de tabela e colunas entre co aspas invertidas. O comando MySQL SET TRANSACTION ISOLATION LEVEL ... agora tem o seguinte efeito em tabelas InnoDB: se uma transao denida como SERIALIZABLE ca e ento o InnoDB conceitualmente adiciona LOCK IN SHARE MODE para todas as a leituras consistentes. Se uma transao denida com qualquer outro n de isolao, ca e ivel ca ento o InnoDB obedece sua estratgia de lock padro que REPEATABLE READ. a e a e SHOW TABLE STATUS no conguram mais um x-lock no m de um a indice auto incremento se um contador auto incremento j tiver sido inicializado. Isto remove a quase todos os casos de deadlock causados por SHOW TABLE STATUS. Corrigido em erro: em uma instruo CREATE TABLE statement a string foreign ca seguida por caracter que no seja de espao confuder o analizador do FOREIGN KEY a c e faz a criao de tabelas falhar com nmero de erro 150. ca u
694
com mais frequencia. Corrigido um problema de performance quando diversas consultas SELECT grandes esto executando concorrentemente em um computados Linux multiprocessador. a Grandes consultas SELECT no limite da CPU tambe sero executadas mais rap a ido em todas as plataformas de uma maneira geral. Se olog binrio do MySQL usado, o InnoD agora exibe, aps a recuperao de falhas, a e o ca o nome do ultimo arquivo de log binrio do MySQL e a posio neste arquivo (=byte a ca oset) que o InnoDB pode recuperar. Isto util, por exemplo, quando sincronizar um e banco de dados master e um slave na replicao novamente. ca Adicionado uma mensagem de erro melhor para ajudar nos problemas de instalao. ca Pode-se agora recuperar tambm tabelas temporrias do MySQL que se tronaram rfo e a o a dentro do tablespace do InnoDB. O InnoDB agora previne que uma declarao FOREIGN KEY onde o sinal no o ca a e mesmo nas colunas inteiras de referncia e referenciada. e Corrigido um erro: chamar SHOW CREATE TABLE ou SHOW TABLE STATUS poderia causar corrompimento de memria e fazer o mysqld falhar. O mysqldump, o especialmente, corria este risco, j que ele chamava SHOW CREATE TABLE com a frequencia. Corrigido um erro: se no Unix voc fazia um ALTER TABLE em uma tabela e, sie multaneamente, executava consultas nela, o mysqld podia falhar em uma declarao ca 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 verso 3.23.47 permitia diversos NULLS em um a indice secundrio UNIQUE. Mas a CHECK TABLE no era relaxed: ele rporta atabela como corrompida. CHECK TAa BLE no reclama mais nesta situao. a ca Corrigido um erro: no Sparc e outros processadores high-endian, SHOW VARIABLES exibia innodb ush log at trx commit e outros parmetros de inicializao booleanos a ca sempre como OFF mesmo se eles estivessem habiliados. Corrigido um erro: se voc executava mysqld-max-nt como um servio no Windows e c NT/2000, a nalizao do servio noesperava o suciente que o desligamento do Innca c a oDb nalizasse.
695
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 alteraes silenciosas no seguem declaraes co a co de FOREIGN KEY mais. A recuperao era mais sucept ao corrompimento de arquivos de log. ca ivel Clculo de estat a isticas desnecessrias forma removidas das consultas que geravam um a tabea temporria. Algumas consultas ORDER BY e DISTINCT executaro muito a a mais rpido agora. a O MySQL agora sabe que a varredura de uma tabela InnoDB feita atravs de uma e e chave primria. Isto economizar uma ordenao em algumas consultas ORDER BY. a a ca O tamanho mximo da chave de tabelas InnoDB est restrita novamente a 500 bytes. a a O interpretador do MySQL no pode tratar chaves longas. a O valor padro de innodb lock wait timeout foi alterado de innito para 50 segundos, a e o valor padro de innodb le io threads de 9 para 4. a
696
Corrigido um erro: quando voc criava uma tabela temporria de um tipo InnoDB e e a ento usava ALTER TABLE para ela,o servidor MySQL podia falhar. a Previnia a criao das tabeas do sistema do MySQL, mysql.user, mysql.host, ou ca mysql.db, no tipo InnoDB. Corrigido um erro que podia causar um falha de declarao na verso 3.23.44 em ca a srv0srv.c, linha 1728.
697
698
699
cd /path/to/source/of/mysql-3.23.34 ./configure --with-berkeley-db Por favor, de uma olhada no manual fornecido com a distribuio BDB para informaes ca co mais atualizadas. Mesmo sendo o BerkeleyDB muito testado e convel, a interface com o MySQL ainda a e considerada com qualidade gamma. Ns estamos ativamente melhorando e otimizando para o torn-la estvel o mais breve poss a a ivel.
No sincroniza logs descarregados. a No inicia Berkeley DB no modo de recua perao. ca --bdb-shared-data Inicia Berkeley DB no modo de multi-processos (No usa DB_PRIVATE ao inicializar Berkeley a DB) --bdbDiretorio de arquivos temporrios do Berkeley a tmpdir=directory DB. --skip-bdb Disabilita o uso de tabelas BDB. -O bdb_max_ Dene o nmero mximo de travas poss u a iveis. lock=1000 Veja Seo 4.6.8.4 [bdb_max_lock], Pgina 309. ca a Se voc utiliza --skip-bdb, MySQL no ir inicializar o biblioteca Berkeley DB e isto ir e a a a economizar muita memria. E claro que voc no pode utilizar tabelas BDB se voc estiver o e a e usando esta opo. Se voc tentar criar uma tabela BDB, o MySQL criar uma tabela ca e a MyISAM. Normalmente voc deve iniciar mysqld sem --bdb-no-recover se voc pretende usar e e tabelas BDB. Isto pode, no entanto, lhe trazer problemas quando voc tentar iniciar o e mysqld e os arquivos de log do BDB estiverem corrompidos. Veja Seo 2.4.2 [Iniciando o ca servidor], Pgina 116. a
700
Com bdb_max_lock voc pode especicar o nmero mcimo de travas (10000 por padro) e u a a que voc pode tar ativas em uma tabela BDB. Voc deve aument-lo se voc obter um erro do e e a e tipo bdb: Lock table is out of available locks ou Got error 12 from ... quando voc e zer transaes longas ou quando mysqld tiver que examinar muitas linhas para calcular a co consulta. Voc tambm pode desejar alterar binlog_cache_size e max_binlog_cache_size se voc e e e estiver usando transaes multi-linhas. Veja Seo 6.7.1 [COMMIT], Pgina 615. co ca a
701
A aplicao sempre deve estar preparada para tratar casos onde qualquer alterao de ca ca uma tabela BDB pode fazer um rollback automtico e quqlquer leitura pode falhar com a um erro de deadlock. As chaves no so compactadas por prexo ou por suxo como em tabelas MyISAM. Em a a outras palavras, a informao da chave gastar um pouco mais de espao em tabelas ca a c BDB quando comparadas a tabelas MyISAM. Existem buracos frequentemente em tabelas BDB para permitir que voc insira novas e linhas no meio da rvore de chaves. Isto torna tabelas BDB um pouco maiores que a tabelas MyISAM. O otimizador precisa conhecer aproximadamente o nmero de linhas na tabela. O u MySQL resolve isto contando inseres e mantendo isto em um segmento separado em co cada tabela BDB. Se voc no executar vrias instrues DELETE ou ROLLBACK, este e a a co nmero dever estar sucientemente prximo do exato para o otimizador do MySQL, u a o mas como o MySQL s armazerna o nmero ao nalizar, ele pode estar incorreto se o o u MySQL nalizar inesperadamente. Isto no deve ser fatail mesmo se este nmero no a u a for 100% correto. POde se atualizar o nmero de linhas executando ANALYZE TABLE ou u OPTIMIZE TABLE. Veja Seo 4.6.2 [ANALYZE TABLE], Pgina 298 . Veja Seo 4.6.1 ca a ca [OPTIMIZE TABLE], Pgina 298. a Se voc car com o seu disco cheio com uma tabela BDB, voc obter um erro (provavele e a mente erro 28) e deve ser feito um rollback da transao. Isto est em contraste com ca a as tabelas MyISAM e ISAM onde o mysqld ir esperar por espao suciente em disco pra a c continuar.
702
Ele
no funciona com os seguintes sistemas operacionais. a Linux 2.x Alpha Linux 2.x AMD64 Linux 2.x IA64 Linux 2.x s390 Max OS X
Nota: A lista acima no est completa; atualizaremos ela assim que recebermos mais ina a formaes. co Se voc construir o MySQL como suporte a tabelas BDB e obter o seguinte erro no arquivo e de log quando voc iniciar o mysqld: e bdb: architecture lacks fast mutexes: applications cannot be threaded Cant init dtabases Isto signica que as tabelas BDB no so suportadas por sua arquitetura. Neste caso voc a a e deve reconstruir o MySQL sem o suporte a tabelas BDB.
703
Isto no fatal mas no recomendamos deletar tabelas se no estiver no modo autoa e a a commit, at que este problema seja resolvido (a soluo no trivial). e ca a e
704
8 Introduo ao MaxDB ca
MaxDB um banco de dados empresarial. O MaxDB o novo nome de um sistema de e e gerenciamento de banco de dados formalmente chamado SAP DB.
705
706
COSH() COT()
707
CREATE DATABASE DATE() DATEDIFF() DAY() DAYOFWEEK() DISTINCT DROP EBCDIC() EXPAND() EXPLAIN FIXED() FLOAT() HEX() INDEX() INDEX
SQL, data language Funo SQL ca Funo ca Funo ca Funo ca Funo ca SQL SQL SQL SQL
denition
CREATE DATABASE(); DATABASE is used in a dierent context, for example CREATE DATABASE CURRENT_DATE DATEDIFF(); nova no MySQL 4.1.1 Nenhuma correspondencia 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 Nenhuma correspondencia Nenhuma correspondencia EXPLAIN; similar, but not identical usage Nenhuma correspondencia Nenhuma correspondencia 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 Nenhuma correspondencia LENGTH(); identical syntax, but slightly different implementation Nenhuma correspondencia LIKE; but the extended LIKE MaxDB provides rather resembles the MySQL REGEX MySQL supports %, and as wildcards in a LIKE comparison
Funes SQL AVG, MAX, co MIN, SUM inter alia in DROP INDEX Funo SQL ca Funo SQL ca Optimization Funo SQL ca Funo SQL ca Funo SQL ca Funo SQL ca USE INDEX, IGNORE INDEX and similar hints are being used right after SELECT, like SELECT ... USE INDEX Funo SQL ca Funo SQL ca Funo SQL ca Comparisons MaxDB supports %, , ctrl+underline, ctrl+up arrow, *, and ? as wildcards in a LIKE comparison Funo SQL ca Funo SQL ca Funo SQL ca Funo SQL ca Funo SQL ca Funo SQL ca Funo SQL ca Column types; comparisons
LPAD(); slightly dierent implementation LTRIM(); slightly dierent implementation MAKEDATE(); nova no MySQL 4.1.1 MAKETIME(); nova no MySQL 4.1.1 Nenhuma correspondencia MICROSECOND(); nova no MySQL 4.1.1 Nenhuma correspondencia 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
708
PI REF RFILL() ROWNO RPAD() RTRIM() SEQUENCE SINH() SOUNDS() STATISTICS SUBSTR() SUBTIME() SYNONYM
Funo SQL ca Data type Funo SQL ca Predicate in WHERE clause Funo SQL ca Funo SQL ca CREATE SEQUENCE, DROP SEQUENCE Funo SQL ca Funo SQL ca UPDATE STATISTICS Funo SQL ca Funo SQL ca Data denition language: CREATE [PUBLIC] SYNONYM, RENAME SYNONYM, DROP SYNONYM Funo SQL ca Funo SQL ca Funo SQL ca Funo SQL ca Funo SQL ca
PI(); identical syntax and implementation, but parantheses are mandatory Nenhuma correspondencia Nenhuma correspondencia Similar to LIMIT clause RPAD(); slightly dierent implementation RTRIM(); slightly dierent implementation AUTO_INCREMENT; similar concept, but differing implementation Nenhuma correspondencia SOUNDEX(); slightly dierent syntax ANALYZE; similar concept, but diering implementation SUBSTRING(); slightly dierent implementation SUBTIME(); nova no MySQL 4.1.1 Nenhuma correspondencia
TANH() TIME() TIMEDIFF() TIMESTAMP() TIMESTAMP() as argument to DAYOFMONTH() and DAYOFYEAR() TIMEZONE() TRANSACTION() TRANSLATE() TRIM() TRUNC() USE USER UTC_DIFF() VALUE() VARIANCE() WEEKOFYEAR()
Nenhuma correspondencia CURRENT_TIME TIMEDIFF(); nova no MySQL 4.1.1 TIMESTAMP(); nova no MySQL 4.1.1 Nenhuma correspondencia
Funo SQL ca Returns the ID of the current transaction Funo SQL ca Funo SQL ca Funo SQL ca mysql commandline user interface command Funo SQL ca Funo SQL ca Funo SQL, alias for ca COALESCE() Funo SQL ca Funo SQL ca
Nenhuma correspondencia Nenhuma correspondencia 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 Nenhuma correspondencia WEEKOFYEAR(); nova no MySQL 4.1.1
709
710
711
Permite a especicao de conjunto de caracteres e collations em qualquer n ca ivel A este respeito, o MySQL 4.1 no s mais ex que o MySQL 4.0, mas tambm est a oe ivel e a bem a frente de outros SGBDs. No entanto, para usar os novos recursos efetivamente, voc e precisar aprender quais conjuntos de caracteres e collations esto dispon a a iveis, como alterar os seus padres e o que os vrios operadores de string fazem como ele. o a
712
Neste n ivel, a deciso simples. O conjunto de caracteres e collations do servidor a e dependem das opes que voc usa quando voc inicia o mysqld. Voc pode usar co e e e --default-character-set=character_set_name para o conjunto de caracteres, e junto com isto voc pode adcionar --default-collation=collation_name para e a collation. Se voc no especicar um conjunto de caracteres, o mesmo que e a e utilizar --default-character-set=latin1. Se voc especicar apenas um conjunto e de caracteres (por exemplo, latin1) mas no uma collation, o mesmo que usar a e --default-charset=latin1 --collation=latin1_swedish_ci pois latin1_swedish_ci a collation padro para latin1. Desta forma, os trs comando seguintees todos tm o e a e e 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 recompilando. Se voc quiser alterar o conjunto de caracteres e e e collation padres na construo dos fontes, utilize: --with-character-set e --witho ca collation 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 combinao conjunto de ca caracteres/collations vlida. Cada programa exibe um mensagem de erro e termina se a e a combinao no for vlida. ca a a
713
Seno utiliza o conjunto de caracteres e a collation de servidor. a A sintaxe CREATE DATABASE ... DEFAULT CHARACTER SET ... do MySQL anloga a sine a taxe CREATE SCHEMA ... CHARACTER SET ... do padro SQL. Por isto, poss criar bana e ivel cos de dados com com conjunto de caracteres e collations diferentes, no mesmo servidor MySQL. O conjuto de caracteres e collations do banco de dados so usados como valores padres a o se o conjunto de caracteres e a collation de tabela no forem especicados nas instrues a co CREATE TABLE. Eles no possuem nenhum outro propsito. a o
714
); O MySQL escolhe o conjunto de caracteres e collation de coluna desta forma: Se CHARACTER SET X e COLLATE Y forem especicados, ento o conjunto de caracteres a e X e collation Y. e Se CHARACTER SET X foi especicado sem COLLATE, ento o conjunto de caracteres X a e e o collation o padro. e a Seno, o conjunto de caracteres e collation so os padres. a a o As clusulas CHARACTER SET e COLLATE so do padro SQL. a a a
715
716
Quando voc executa SET NAMES ou SET CHARACTER SET, voc tambm est alterando a e e e a collation da conexo. No entanto a collation da conexo existe apenas para consistncia. a a e Normalmente o seu valor no importa. a Com o cliente mysql, no necessrio executar SET NAMES todas as vezes que voc inic-lo. a e a e a Voc pode adicionar a opo --default-character-set-name a sua linha de instruo do e ca ca mysql, ou em seu arquivo de opo. Por exemplo, a seguinte congurao do arquivo de ca ca opo ir alterar o conjunto de caracteres da conexo cada vez que voc executar mysql: ca a a e [mysql] default-character-set-name=character_set_name
717
Uma string com conjunto de caracteres latin1 e e sua collation padro, isto , latin1_ a e swedish_ci: SELECT _latin1Mller; u Uma string com o conjunto de caracteres e a collation da conexo/literal: a SELECT Mller; u Introdutores de conjunto de caracteres e a clusula COLLATE so implementados de acordo a a com as especicaes do padro SQL. co a
718
719
Exemplos: column1 = A column1 = A COLLATE x column1 COLLATE x = A COLLATE y Usa a collation de column1 Usa a collation de A Error
720
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 so o mesmo que o nomes dos conjuntos de caracteres a correspondentes. Exemplos: SELECT CONVERT(_latin1Mller USING utf8); u INSERT INTO utf8table (utf8column) SELECT CONVERT(latin1field USING utf8) FROM latin1table; CONVERT(... USING ...) implementado de acordo com a especicao SQL-99. e ca
721
9.4.3 CAST()
Voc tambm pode usar CAST() para converter uma string para um conjunto de caracteres e e 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 no usar uma clusula COLLATE dentro de um CAST(), mas voc pode us-la fora, isto e a a e a , CAST(... COLLATE ...) ilegal mas CAST(...) COLLATE ... permitido. e e e Exemplo: SELECT CAST(_latin1test AS CHAR CHARACTER SET utf8) COLLATE utf8_bin; Se voc usar CAST() sem especicar CHARACTER SET, ento o conjunto de caracteres e cole a lation resultante so o conjunto de caracteres da conexo/literal e a sua collation padro. a a a Se voc usar CAST() com CHARACTER SET X, ento o conjunto de caracteres resultante X e e a e a collation resultante a collation padro de X. e a
722
| 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 o padro para o seu conjunto de caracteres. e a Compiled indica se o conjunto de caracteres ou no compilado no servidor. Sortlen e a relacionado a quantidade de memria exigida para armazenar strings expressadas no e o 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)
723
724
nome column1 ser retornado do servidor para o cliente no conjunto de caracteres do cliente a como determinado pela instruo SET NAMES.) ca Se voc quizer que o servidor passe o resultado de volta em um conjunto de caracteres noe a UTF8, ento use SET CHARACTER SET para forar o servidor a converter (veja Seo 9.3.6 a c ca [Charset-connection], Pgina 715), ou congurar o cliente para fazer a a converso, mas esta a a para muitos clientes at no nal no ciclo do produto MySQL opo no estar disponivel ca a a e 4.x. Se voc est apenas usando, por exemplo, a funo USER() para comparao ou atribuio e a ca ca ca dentro de uma unica instruo ... no preocupe. O MySQL far alguma converso au ca a a a tomtica para voc. a e SELECT * FROM Table1 WHERE USER() = latin1_column; Isto funcionar, porque o contedo de latin1_column convertido automaticamente para a u e UTF8 antes da comparao. ca INSERT INTO Table1 (latin1_column) SELECT USER(); Isto funcionar, porque o contudo de USER() convertido automaticamente para latin1 a e e antes da atribuio. A converso automtica ainda no est totalmente implementada, mas ca a a a a deve funcionar corretamente em uma verso posterior. a Embora a converso automtica no esteja no padro SQL, o documento do padro SQL diz a a a a a que todo conjunto de caracteres (em termos de caracteres suportados) um subconjunto e 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 comparaes com strings no -Unicode. co a NATA DA VERSAO 4.1.1: Os arquivos errmsg.txt estaro todos em UTF8 depois deste a ponto. Converso o conjunto de caracteres do clientes sero automticos, como para metadaa a a dos. Tambm: Podemos alterar o comportamento padro para passar de volta o metadado e a do resultado em um futuro prximo. o
725
726
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 prxima seo para encontrar o nome do antigo conjunto de o ca caracteres do MySQL 4.0 e o par conjunto de caracteres/collation equivalente no MySQL 4.1.
727
728
NB: TODOS OS CONJUNTO DE CARACTERES TEM UMA COLLATION BINARIA. INCLU NAO IMOS A COLLATION BINARIA EM TODAS AS DESCRICOES A SEGUIR.
729
+----------+-----------------------------+---------------------+--------+ | 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 | +----------+-----------------------------+---------------------+--------+
730
+----------------------+----------+----+---------+----------+---------+ 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 | +----------------------+----------+----+---------+----------+---------+
731
| 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 | +----------------------+----------+----+---------+----------+---------+
732
As collations latin1_german1_ci e latin1_german2_ci so baseadas nos padres a o DIN-1 e DIN-2, onde DIN signica Deutsches Institut fr Normung (isto , a resposta u e Alem ao ANSI). DIN-1 chamada collation de dicionrio e o DIN-2 chamado a a e a e collation de agenda. Regras latin1_german1_ci (dicionrios): a = A, = O, = U, = s A O U Regras latin1_german2_ci (agendas): = AE, = OE, = UE, = ss A O U 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 | +----------------------+----------+----+---------+----------+---------+
733
10.1 Introduo ca
O MySQL implementea extenses espaciais seguindo especicaes do Open GIS o co Consortium (OGC). Este um consrcio internacional com mais de 250 companhias, e o agncias, universidades participando no desenvolvimento de solues conceituais e co dispon iveis publicamente que podem der uteis com todos os tipos de aplicaes que co gerenciam dados espaciais. O OGC mantm um web site em http://www.opengis.org/. e Em 1997, o Open GIS Consortium publicou o OpenGIS R Simple Features Specications For SQL (Especicaes de Recursos OpenGIS R Simples Para SQL), um docuco mento que propos diversos modos conceituais de para extender um SQL RDBMS para suportar dados espaciais. Esta especicao est dispon ca a ivel no web site do OpenGIS em http://www.opengis.org/techno/implementation.htm. Ele contm informaes adie co cionais relevantes a este cap itulo. O MySQL implementa um subconjunto do ambiente SQL com Tipos Geomtricos proposto e pela OGC. Este termo se refere a um ambiente SQL que tem sido extendido com um conjunto de tipos geomrtricos. Uma coluna SQL com valor geomtrico implementada e e e como uma coluna de um tipo geomtrico. As especicaes descrevem um conjunto de tipod e co geomtricos do SQL, bem como funes deste tipo para criar e analisar valores geomtricos. e co e Um recurso geogrco qualquer coisa no mundo que tem uma posio. a e ca Um recurso pode ser: Uma entidade. Por exemplo, uma montanha, uma lagoa, em cidade Um espao. Por exemplo, um rea de cdigo postal, os trpicos c a o o Uma localizao denida. Por exemplo, um cruzamento. como um lugar espec ca ico onde duas ruas se interceptam. Voc tambm pode encontrar documentos que utilizam o termo recurso geoespacial para se e e referir a recursos geogrcos. a Geometria outra palavra que denota um recurso geogrco. O signicado original da e a palavra geometria denota um ramo da matemtica. Outro signicado vindo da cartograa, a se referem aos recursos geomtricos que os cartgrafos usam para mapear o mundo. e o Este cap itulo utiliza todos estes termos como sinnimo: recurso geogrco, recurso geoeso a pacial, recurso ou geometria, O termo normalmente mais usado aqui geometry. e Vamos denir uma geometria como um ponto ou um agregado de pontos representando alguma coisa no mundo que possui uma localizao. ca
734
735
GeometryCollection tem classes de coleo com zero-, uma- e duas-dimenses ca o chamadas MultiPoint, MultiLineString e MultiPolygon para modelagem geomtrica correspondente a colees de Points, LineStrings e Polygons e co respectivamente. MultiCurve e MultiSurface so introduzidas como superclasses a abastratas que generalizam a interface de coleo para tratar Curves e Surfaces. ca Geometry, Curve, Surface, MultiCurve e MultiSurface so denidos como classes no a a instanciveis. Eles denem em conjunto de mtodos comuns para suas subclasses e incluidos a e por razes de extensabilidade. o Point, LineString, Polygon, GeometryCollection, MultiPoint, MultiLineString, MultiPolygon so classses instanciveis. a a
Propriedades de geometria
Um valor geometry tem as seguintes propriedades: E o tipo (type). Cada geometria pertence a uma das classes instanciveis na hierarquia. a Seu SRID ou Identicador de Referncia Espacial. Este valor identica o Sistema de e Referncia Espacial associada da geometria, o qual descreve o coordenada espacial na e qual objeto geomtrico est denido. a Coordenadas (coordinates) em seu Sistema de Referncia Espacial, representado por e um nmero de preciso dupla (8 byte). Todas as geometrias no-vazias incluem pelo u a a menos um par de coordenadas (X,Y). Geometrias vazias no contem cooredenadas. a Coordenadas esto relacionadas ao SRID. Por exemplo, em sistemas de coordenadas a diferentes, a distncia entre dois objetos podem diferir mesmo quando os objetos tm a e as mesmas coordenadas, porque as distncias no sistema de coordenadas planar e a a distncia no sistema geocentrico (coordenadas na superf da Terra) so coisas difera icie a entes. Seu interior (interior), limite (boundary) e exterior (exterior). Todas as geometrias ocupam alguma poro no espao. O exterior de uma geomeca c tria todo espao no ocupado pela geometria. O interiro o espeao ocupado pela e c a e c geometria. O limite a interface entre o interior e o exterior e Seu MBR (Retngulo de Limite M a inimo - Minimum Bounding Rectangle), ou Envelope, da geometria. Este a geometria limitar, formado pelas coordenadas de m e inimo e mximo (X,Y): a ((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY)) A qualidade de ser simple ou non-simple (simples ou no simples). Valores geometricos a alguns tipos (LineString, Multipoint, MultiLineString) podem ser simples ou noa simples. Cada tipo determina sua prrpia armao de ser simples ou no-simples. o ca a
736
A qualidade de ser closed ou not closed (fechado ou no fechado). Valores geomtricos a e de alguns tipos (LineString, MultiString) podem ser fechado ou no fechado. Cada a tipo determina a sua prpria armao de ser fechado ou no fachado. o ca a A qualidade de ser empty ou not empty (vazio ou no vazio). Uma geometria vazia se a e ela no tem nenhum ponto. Exterior, interior e limite de ma geometria vazia no esto a a a denidos. (isto , eles so representados por valores NULL). Uma geometria vazia e a e denida sempre simples e ter um rea de 0. a Sua dimenso (dimension). Uma geometria pode ter uma dimenso de 1, 0, 1 or 2: a a 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 dimensio de zero. LineStrings tem uma dimenso de 1. a a Polygons tem uma dimenso de 2. Dimenses de MultiPoints, MultiLineStrings e a o MultiPolygons so a mesma da dimenso dos elementos dos quais eles consistem. a e a
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 denido como uma geometria de dimenso zero. e a O limite de um Point um conjunto vazio. e
Propriedades de Curve
As coordenadas de seus pontos. Curve deniido como uma geometria unidimensional. e
737
A Curve simples (simple) se ela no passa pelo mesmo ponto duas vezes. e a A Curve fechada (closed) se o ponto inicial igual ao ponto nal. e e O limite (boundary) de uma Curve fechada vazio. e O limite (boundary) de uma Curve no-fachada cociste do seus dois pontos nais. a A Curve que simples (simple) e fechada (closed) uma LinearRing. e e
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 uma Line, se ela consiste de exatamente dois pontos. e A LineString uma LinearRing, se for fechada (closed) e simples (simple). e
Propriedades de Surface
Uma Surface denida com uma geomtria bidimensional. e A especicao OpenGIS dene uma Surface simples como uma geometria que consiste ca de um unico patch que associado com um exterior boundary (limite exterior) e zero e ou mais interior boundaries (limites interiores). O limite (boundary) de uma Surface simples o conjunto de curvas fechadas corree spondente a seus limites exterior e interior.
738
Exemplos de Polygon
Em um mapa de regio, objetos Polygon podem representar orestas, distritos, etc. a As armaes para os polygons (as regras que denem polygons vlidos) so: co a a 1. O limite (boundary) de um Polygon consiste de um conjunto de LinearRings (ex. LineStrings que so simples e fechadas) que fazem os seus limites interior e exterior. a 2. Dois aneis no limite no podem se cruzar. Os aneis no limite de um Polygon podem a se interseptar em um Point, mas apenas como uma tangente. 3. Um Polygon no pode ter linhas cortadas, pontas ou cavidades. a 4. O interior de cada Polygon e um conjunto de pontos conectados. 5. O Exterior de um Polygon com um ou mais buracos no est conectado. Cada buraco a a dene um componenete conectados do exterior. Nas armaes acimas, poligonos so geometrias simples. Estas armaes fazem de um co a co Polygon uma geometria simples.
Exemplos de MultiPoint
Em um mapa mundi, um Multipoint podia representar uma cadeia de pequenas ilhas.
Propriedades de MultiPoint
MultiPoint denido com uma geometria sem dimenso. e a Um MultiPoint simples se no h dois valores de seus Point iguais no MultiPoint e a a (tem valores de coordenadas iguais). O limite (boundary) de um MultiPoint um conjunto vazio. e
739
Propriedades de MultiCurve
A MultiCurve denida como uma geometria de uma dimenso. e a A MultiCurve simples se e somente se todos os seus elementos so simples, a unica e a interseo entre quaisquer dois elementos ocorrem entre pontos que esto nos limites ca a (boundaries) de ambos os elementos. O limite (boundary) de uma MultiCurve obtida aplicando a "mod 2 union rule": e Um ponto est no limite (boundary) de uma MultiCurve se ele est no limite de um a a nmero impar de elementos da MultiCurve. u Um MultiCurve fechado se todos os seus elementos so fechados. e a 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.
Armaoes de MultiSurface c
1. O interior de quaisquer duas superf icies em uma MultiSurface no podem se intera ceptar. 2. O limite de quaiqsquer dois elementos em um MultiSurface podem interceptar em um nmero nito de pontos. u
Exemplos de MultiPolygon
Em um mapa regional, um MultiPolygon pode representar um sistema de lagos.
740
Propriedades de MultiPolygon
MultiPolygon denido como uma geometria bidimensional. e O limite (boundary) de um MultiPolygon um conjunto de curvas fechadas (valores e 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 no limite do MultiPolygon. a
741
Um Polygon (pol igono) com um anel exterior e um anl interior. e 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 trs valores Points. e 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 (Coleo de Geometria) consistindo de dois valores Points ca e um LineString. GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20)) Uma gramtica Backus-Naur que especica as regras de produo formal para gravar valores a ca WKT podem ser encontrados na documentao de especicao OGC indicada prximo ao ca ca o in deste cap icio itulo.
742
743
PointFromText(wkt[,srid]) Controi um valor POINT usando sua representao WKT e SRID. ca LineFromText(wkt[,srid]) LineStringFromText(wkt[,srid]) Constroi um valor LINESTRING usando sua representao WKT e SRID. ca PolyFromText(wkt[,srid]) PolygonFromText(wkt[,srid]) Constroi um valor POLYGON usasdo sua representao WKT e SRID. ca MPointFromText(wkt[,srid]) MultiPointFromText(wkt[,srid]) Contri um valor MULTIPOINT usando sua representao WKT e SRID. o ca MLineFromText(wkt[,srid]) MultiLineStringFromText(wkt[,srid]) Contri um valor MULTILINESTRING usando sua representao WKT e SRID. o ca MPolyFromText(wkt[,srid]) MultiPolygonFromText(wkt[,srid]) Contri um valor MULTIPOLYGON usando sua representao WKT e SRID. o ca GeomCollFromText(wkt[,srid]) GeometryCollectionFromText(wkt[,srid]) Constri um valor GEOMETRYCOLLECTION usando sua representao WKT e o ca SRID. A especicao OpenGIS tambm descreve funes opcionais para construo de valores ca e co ca Polygon ou MultiPolygon baseados na representao WKT de uma coleo de anis ou ca ca e valores LineString fechados. Estes valores podem se interceptar. OMySQL ainda no a implementou estas funes: co BdPolyFromText(wkt,srid) Constri um valor Polygon a partir de um valor MultiLineString no formato o WKT contendo uma coleo arbitrria de valores LineString fechados. ca a BdMPolyFromText(wkt,srid) Constri um valor MultiPolygon a partir de um valor MultiLineString no o formato WKT contendo uma coleo arbitrria de vlaores LineString fechados. ca a
744
GeomFromWKB(wkb,srid) GeometryFromWKB(wkt,srid) Constri um valor geometria de qualquer tipo usando seua representao WKB o ca e SRID. PointFromWKB(wkb[,srid]) Constri um valor POINT usando sua representao WKB e SRID. o ca LineFromWKB(wkb[,srid]) LineStringFromWKB(wkb[,srid]) Constri um valor LINESTRING usando sua representao WKB e SRID. o ca PolyFromWKB(wkb[,srid]) PolygonFromWKB(wkb[,srid]) Constri um valor POLYGON usando sua representao WKB e SRID. o ca MPointFromWKB(wkb[,srid]) MultiPointFromWKB(wkb[,srid]) Constri um valor MULTIPOINT usando sua representao WKB e SRID. o ca MLineFromWKB(wkb[,srid]) MultiLineStringFromWKB(wkb[,srid]) Constri um valor MULTILINESTRING usando sua representao WKB e SRID. o ca MPolyFromWKB(wkb[,srid]) MultiPolygonFromWKB(wkb[,srid]) Constri um valor MULTIPOLYGON usando sua representao WKB e SRID. o ca GeomCollFromWKB(wkb[,srid]) GeometryCollectionFromWKB(wkt[,srid]) Constri um valor GEOMETRYCOLLECTION usando sua representao WKB e o ca SRID. A especicao do OpenGIS tambm descreve funes adicionais para construo de valores ca e co ca Polygon ou MultiPolygon baseados em uma representao WKB de uma coleo de anis ca ca e ou valores de LineString fechadas. Estes valores podem se interceptar. O MySQL ainda no implementou estas funes: a co BdPolyFromWKB(wkb,srid) Constri um valor Polygon a partir de um valor MultiLineString no formato o WKB contendo uma coleo arbitrria de valores LineString fechados. ca a BdMPolyFromWKB(wkb,srid) Constri um valor MultiPolygon a partir de um valor MultiLineString no o formato WKB contendo uma coleo arbitrria de valores LineString fechados. ca a
745
O resultado destas funes so valores BLOBs contendo representaes WKB de valores de co a co geometria sem SRID. Os resultados destas funes podem ser substituidos como primeiro co argumento para a fam de funes GeomFromWKB(). ilia co Point(x,y) Constri um Point WKB usando suas cooerdenadas. o MultiPoint(pt1,pt2,...) Constri um MultiPoint WKB usando WKBPoints. Quando o argumento no o a Point WKB, o valor de retorno NULL. e e LineString(pt1,pt2,...) Constri um LineString WKB de um nmero de Points WKB. Quando o o u argumento no Point WKB, o valor de retorno NULL. Quando o nmero de a e e u Points menor que dois o valor de retorno NULL. e e MultiLineString(WKBLineString,WKBLineString,...,WKBLineString) Constri um MultiLineString WKB usando LineStrings WKB. Quando o o argumento no LineString WKB, o valor de retorno NULL. a e e Polygon(ls1,ls2,...) Constri um Polygon de um nmero de LineStrings WKB. Quando o arguemo u nto no representa o WKB de um LinearRing (ex. LineString no fechada e a a simples) o valor de retorno NULL. e MultiPolygon(poly1,poly2,...) Constri um MultiPolygon WKB de um conjunto de Polygons WKB. Quando o o argumento no um Polygon WKB, o valor de retorno NULL. a e e GeometryCollection(WKBGeometry,WKBGeometry,..,WKBGeometry) Constucts a GeometryCollection WKB. Quando o argumento no uma repa e resentao WKB bem formada de uma geometria, o valor de retorno NULL. ca e
746
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>
747
para o servidor. No entanto, existem diversos modos de satisfazer esta exigncia. Por e exemplo: Inserindo um Point(1,1) com sintaxe literal hexa: Uma aplicao ODBC pode enviar uma representao WKB, ligando como um arguca ca mento do tipo BLOB: INSERT INTO geom VALUES (GeomFromWKB(?)); Outra interfaces de programao podem suportar um mecanimo de placeholder similar. ca Em um programa C, voc pode fazer um escape de um valor binrio usando mysql_ e a real_escape_string() e incluindo o resultado em string de consulta que enviada ao e servidor. Veja Seo 12.1.3.44 [mysql_real_escape_string()], Pgina 815. ca a
748
749
Envelope(geometry g):geometry Retorna o Retngulo de Limite M a inimo (Minimum Bounding Rectangle (MBR)) para o valor de geometria g. O resultado retornado como um e polygon (poligono).
750
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 denido pelos pontos nos cantos da caixa que o limita: e POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY)) A especicao OpenGIS tambm dene as seguintes funes, que o MySQL ainda no ca e co a implementou: Boundary(g) Retorna uma geometria que o fechamento do limite combinacional do valor e da geometria g. IsEmpty(g) Retorna 1 se o valor da geometria g e a geometria vazia, 0 se ela no est vazia a a e 1 se o argumento NULL. Se a geometria est vazia, ela representa um e a conjunto de pontos vazios. IsSimple(g) Atualmewnte esta funo no deve ser usada. Quando implementada, seu comca a portamento ser como descrito no prximo pargrafo. a o a Retorna 1 se o valor da geometria g no tem nenhum ponto geomtrico anora e mal, como a interseo prpria ou tangente prpria. IsSimple retorna 0 se o ca o o argumento no simples, e 1 se NULL. a e e A descrio de cada geomtrica instancivel dada anteriormente neste cap ca e a itulo inclui a condio especica que faz com que uma instncia desta classe seja ca a classicada como no simples. a
751
mysql> SELECT Y(GeomFromText(Point(56.7 53.34))); +--------------------------------------+ | Y(GeomFromText(Point(56.7 53.34))) | +--------------------------------------+ | 53.34 | +--------------------------------------+
752
| 3 | +----------------------------------------------------+ PointN(ls,n) Returna o n-simo ponto no valor Linestring ls. e 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 o ponto inicial do valor LineString ls. e 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 especicao OpenGIS tambm dene as seguintes funes, que o MySQL ainda no ca e co a implementou: IsRing(ls) Retorna 1 se o valor LineString ls fechado (isto , seus valores e e StartPoinnt() e EndPoint() so os mesmos) e simples (no passa pelo a e a mesmo ponto mais de uma vez). Retorna 0 se ls no um anel, 1 se NULL. a e e
GLength(mls) Retorna o tamanho do valor de MultiLineString mls como um nmero e preu ciso dupla. O tamanha de mls igual a soma dos tamanhos de seus elementos. a e 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 fechado (isto , os valores e e StartPoint() e EndPoint() so os mesmos para cada LineString em mls). a Returna 0 se mls no fechada, e 1 se for NULL. a e mysql> SELECT IsClosed(GeomFromText(MultiLineString((1 1,2 2,3 3),(4 4,5 +--------------------------------------------------------------------+
753
Returna como um nmero de dupla preciso a rea do valor Polygon poly, u a a como medido em seu sistema de referncia espacial. e 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 nmero de anis interiores no valor Polygon poly. u e 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-simo anel exterior para o valor Polygon poly como uma e 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 especicao OpenGIS tambm dene as seguintes funes, que o MySQL ainda no ca e co a implementou:
754
Centroid(poly) O centide matemtico para o valor Polygon poly como um Point. O resultado o a no garantido estar neste Polygon. a e PointOnSurface(poly) Returna um valor Point que esta garantidamente no valor Polygon poly.
Area(mpoly) Retorna como um nmero de preciso dupla a rea do valor MultiPolygon u a a mpoly, como medido no sistema de referncia espacial deste MultiPolygon. e 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 especicao OpenGIS tambm dene as seguintes funes, que o MySQL ainda no ca e co a implementou: Centroid(mpoly) O centride matemtico para este MultiPolygon como um Point. O resultado o a no garantido estar neste MultiPolygon. a e PointOnSurface(mpoly) Retorna um valor Point que garantido estar no valor MultiPolygon mpoly. e
NumGeometries(gc) Retorna o nmero de geometrias no valor GeometryCollection gc. u mysql> SELECT NumGeometries(GeomFromText(GeometryCollection(Point(1 1),Li +------------------------------------------------------------------------| NumGeometries(GeomFromText(GeometryCollection(Point(1 1),LineString(2 2 +------------------------------------------------------------------------| +-------------------------------------------------------------------------
GeometryN(gc,n) Retorna o n-sima geometria no valor GeometryCollection gc. O nmero de e u geometrias comea em 1. c mysql> SELECT AsText(GeometryN(GeomFromText(GeometryCollection(Point(1 1) +------------------------------------------------------------------------| AsText(GeometryN(GeomFromText(GeometryCollection(Point(1 1),LineString( +-------------------------------------------------------------------------
755
| POINT(1 1) +------------------------------------------------------------------------Nota: Funes para tipos de geometrias espec co icas retornam NULL se a geomtria passada e do tipo de geometria errado. Por exemplo Area() retorna NULL se o tipo do objeto no a e nem Polygon nem MultiPolygon.
10.5.3 Funoes Que Criam Novas Geometrias de Outras c Existentes 10.5.3.1 Funoes de Geometria Que Produzem Novas Geometrias c
Na seo Seo 10.5.2 [Geometry property functions], Pgina 749 ns j discutimos algumas ca ca a o a funes que podem construir novas geometrias se outras existentes: co Envelope(g) StartPoint(ls) EndPoint(ls) PointN(ls,n) ExteriorRing(poly) InteriorRingN(poly,n) GeometryN(gc,n)
756
ConvexHull(g) Retorna uma geometria que representa a casca convexa de do valor da geometria g.
10.5.5 Relaes de Retngulo de Limite M co a inimo (Minimal Bounding Rectangles - MBR) em Geometrias
O MySQL fornece algumas funes que podem testar relaes entre retngulos de limite co co a m inimo de duas geometrias g1 e g2. Elas incluem: MBRContains(g1,g2) Retorna 1 ou 0 para indicar se o Retngulo de Limite M a inimo de g1 contm o e Retngulo de Limite Minimo de g2. a 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 Retngulo de Limite M a inimo de g1 esta dentro do Retngulo de Limite M a 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 Retngulo de Limite M a inimo de duas geometrias g1 e g2 no fazem interseo. a ca MBREqual(g1,g2) Retorna 1 ou 0 para indicar se o Retngulo de Limite M a inimo de duas geometrias g1 e g2 so o mesmo. a
757
MBRIntersects(g1,g2) Retorna 1 ou 0 para indicar se o Retngulo de Limite M a inimo de duas geometrias g1 e g2 se interseptam. MBROverlaps(g1,g2) Retorna 1 ou 0 para indicar se o Retngulo de Limite M a inimo de duas geometrias g1 e g2 se sobrepe. o MBRTouches(g1,g2) Retorna 1 ou 0 para indicar se o Retngulo de Limite M a inimo de duas geometrias g1 e g2 se tocam.
758
Touches(g1,g2) Retorna 1 ou 0 para indicar se g1 spatially touches g2, ou no. Duas geometrias a se tocam espacialmente se o interiro de ambas geometrias no se interseptam, a 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 espacialmente dentro da g2, ou no. a a Distance(g1,g2) Retorna como um nmero de preciso dupla, a menor distncia entre quaiquer u a a dois pontos nas duas geometrias. Related(g1,g2,pattern_matrix) Retorna 1 ou 0 indicando se o relacionamento espacial especicado por matriz_ padr~o existe entre g1 e g2 ou no. Retorna 1 se os argumentos so NULL. A a a a matriz padro uma string. Sua especicao ser indicada aqui quando esta a e ca a funo estiver implementada. ca
759
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 contm mais de 32000 geometrias, que esto e a armazenadas na coluna g do tipo GEOMETRY. A tabela tambm tem um campo AUTO_ e 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 instruo: ca 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 funo como MBRContains() ou MBRWithin() na clusula WHERE ca a e executada. Por exemplo, suponhamos que queremos encontrar todos os objetos que esto a no retngulo dado: a 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)
760
| 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 executada, usando EXPLAIN: e
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 ns no tivssemos o a e 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)
761
| 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 no usado, o tempo de execuo para esta consulta cresce de 0.00 segundos a e ca para 0.46 segundos. Nas veres futuras, o indices espaciais tambm sero usados para otimizar outras funes. e a co Veja Seo 10.5.4 [Functions for testing spatial relations between geometric objects], ca Pgina 756. a
762
A funo OpenGIS Length() em LineString e MultiLineString ca atualmente devem ser chamadas como GLength() no MySQL. O problema que e ela conita com a funo SQL existente Length() que calcula o tamanho de um ca valor string e algumas vezes no poss distinguir se a funo foi chamada a e ivel ca co contexto textual ou espacial. Ns precisamos resolver isto de algum modo, o ou escolher um outro nome de funo. ca
763
764
Atualmentem o MySQL s preserva o contexto para o banco de dados padro. Isto , se o a e voc usar USE dbname dentro de um procedimento, o banco de dados original restaurado e e depois da sa da rotina. Uma rotina herda o banco de dados padro de quem a chama, ida a assim geralmente as rotinas devem utilizar uma instruo USE dbname, ou especique todas ca as tabelas com uma referncia de banco de dados explicita, ex. dbname.tablename. e O MySQL suporta uma extenso muito util que permite o uso da instruo regular SELECT a ca (isto , sem usar cursores ou variveis locais) dentro de uma stored procedure. O resultado e a de tal consulta simplesmente enviado diretamente para o cliente. Vrias instrues SELECT e a co geram vria resultados, assim o cliente deve usar um biblioteca cliente do MySQL que a suporta vrios resultados. Isto signica que o cliente deve usar uma biblioteca cliente a a partir de uma verso do MySQL mais recente que 4.1, pelo menos. a A seo seguinte descreve a sintaxe usada para criar, alterar, remover e condultar stored ca procedures e funes. co
765
OUT ou INOUT antes do nome do parmetro. Especicar IN, OUT ou INOUT s valido para a oe uma PROCEDURE. A instruo CREATE FUNCTION usada em verso novas do MySQL para suporte a UDFs ca e a (User Dened Functions - Funes Denidas pelo Usurio). Veja Seo 14.2 [Adding funcco a ca tions], Pgina 899. As UDFs continuam a ser suportadas, mesmo com a existencia de stored a functions. Uma UDF pode ser considerada como uma stored function externa. No entanto, note que stored functions compartilham os seus namespace com as UDFs. Um framework para stored procedures externas sero introduzidas em um futuro prxima. a o Isto permitir que voc escreva stored procedures em outras linguagens alm de SQL. a e e Provavelmente, uma das primeiras linguagens a ser suportada sea PHP, j que o mecanismo a do PHP pequeno, seguro com threads e pode facilmente ser embutido. Como o framework e ser publico, esperado que muitas outras linguagens tambm sejam suportadas. a e e Uma funo considerada deterministica se ela sempre retorna o mesmo resultado para ca e os mesmos parmetros de entrada, e no deterministica caso contrrio. O otimizado pode a a a usar este fato. Atualmente, a caracter istica DETERMINISTIC aceita, mas ainda no usada. e a e A caracter istica SQL SECURITY pode ser usada para especicar se a rotina deve ser executada usando as permisses do usurio que criou a rotina, ou o usurio que a chamou. O valor o a a padro DEFINER. Este recurso novo no SQL:2003. a e e O MySQL ainda no usa o privilgio GRANT EXECUTE. Assim ,por enquanto, se um proceda e imento p1() chama a tabela t1,o usurio deve ter privilgios na tabela t1 para chamar o a e procedimento p1() com sucesso. 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. A clusula COMMENT uma extenso do MySQL, e pode ser usada para descrever o stored a e a procedure. Esta informao exibida pelas instrues SHOW CREATE PROCEDURE e SHOW ca e co CREATE FUNCTION. O MySQL permite rotinas contendo instrues DDL (como CREATE e DROP) e instrues de co co transao SQL (como COMMIT). Isto no exigido por padro e depende de especicaes ca a e a co de implementao. ca NOTA: Atualmente, stored FUNCTIONs no podem conter referncias `s tabelas. Note que a e a isto inclui algumas instrues SET, mas exclui algumas instrues SELECT. Esta limitao co co ca ser retirada assim que poss a ivel. A seguir temos um exemplo de uma stored procedure simples que usa um parmetro OUT. O a exemplo usa o comando delimiter do cliente mysql para alterar o delimitador de instruo ca para antes da denio do procedure. Isto permite que o delimitador ; usado no corpo de ca procedure seja passado para o servidor em vez de ser interpretado pelo mysql. 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)
766
mysql> CALL simpleproc(@a)| Query OK, 0 rows affected (0.00 sec) mysql> SELECT @a| +------+ | @a | +------+ | 3 | +------+ 1 row in set (0.00 sec) A seguir esta um exemplo de uma funo que utiliza um parametro, realiza uma operao ca ca usando uma funo SQL e retorna o resultado: ca 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)
767
A clusula IF EXISTS uma extenso do MySQL. Ela previne que um erro ocorra se o a e a procedimento ou funo no existe. Um aviso produzido e pode ser vizualizado com SHOW ca a e WARNINGS.
11.1.3 CALL
CALL sp_name([parameter[,...]]) O comando CALL usado para chamar uma rotina que foi denida anteriormente com e CREATE PROCEDURE.
768
Seo 11.1.7 [Conditions and Handlers], Pgina 768) e cursors (veja Seo 11.1.8 [Cursors], ca a ca Pgina 770). As instrues SIGNAL e RESIGNAL ainda no so suportadas. a co a a DECLARE s pode ser usada dentro de uma instruo composta BEGIN ... END e deve estar o ca no in icio, antes de qualquer outra instruo. ca
769
condition_value: SQLSTATE [VALUE] sqlstate_value | mysql_error_code Esta instruo especica condies que necessitaro de tratamento especial. Ela associa um ca co a nome com uma condio de erro especica. O nome pode ser subsequentemente usado em ca uma instruo DECLARE HANDLER. Veja Seo 11.1.7.2 [DECLARE Handlers], Pgina 769. ca ca a Alm dos valores SQLSTATE, cdigos de erro do MySQL tambm so suportados. e o e a
770
-> INSERT INTO test.t VALUES (1); -> set @x = 2; -> INSERT INTO test.t VALUES (1); -> SET @x = 3; -> END; -> | Query OK, 0 rows affected (0.00 sec) mysql> CALL handlerdemo()| 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
771
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; END
11.1.9.1 IF Statement
IF search_condition THEN statement(s) [ELSEIF search_condition THEN statement(s)] ... [ELSE statement(s)]
772
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 Seo 6.3.1.4 [Control ow functions], ca Pgina 510. a
773
774
775
776
777
enum enum_field_types tipo O tipo do campo. O valor tipo pode ser um dos seguintes: Valou tipo Descrio do tipo ca 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 mximo) a 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 pode utilizar a macro IS_NUM() para testar se uma campo tem um tipo e numrico. Passe o valor tipo para IS_NUM() e ele ir avaliar como VERe a DADEIRO (TRUE) se o campo for numrico: e if (IS_NUM(campo->tipo)) printf("Campo numrico\n"); e e unsigned int length A largura de um campo, como especicado nas denies da tabela. co unsigned int max_length A largura mxima do campo no conjunto de resultados (O tamanho do maior a valor do campo para os registro no resultado atual). Se voc utilizar mysql_ e store_result() ou mysql_list_fields(), ele contem o tamanho mximo a para o campo. Se voc utiliza mysql_use_result(), o valor desta varivel e a zero. e unsigned int param Diferentes parmetros binrios para o campo. O valor de param pode ter zero a a ou mais dos seguintes conjunto de bits: Valor param Descrio param ca NOT_NULL_FLAG Campo no pode ser NULL a PRI_KEY_FLAG Campo parte de uma chave primria e a UNIQUE_KEY_FLAG Campo parte de uma chave unica e MULTIPLE_KEY_FLAG Campo parte de uma chave no unica e a
778
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 um ENUM (obsoleto) e SET_FLAG Campo um SET (obsoleto) e BLOB_FLAG Campo um BLOB ou TEXT (obsoleto) e TIMESTAMP_FLAG Campo um TIMESTAMP (obsoleto) e Uso dos parmetros BLOB_FLAG, ENUM_FLAG, SET_FLAG, e TIMESTAMP_FLAG a foram obsoletos porque eles indicavam o tipo de um campo e no um a atributo do tipo. E prefer 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~o pode ser nulo\n"); a Voc pode usar as seguintes macros para determinar o status dos valores param: e Status param Descrio ca IS_NOT_NULL(param) Verdadeiro se se este campo denido como NOT e NULL IS_PRI_KEY(param) Verdadeiro de este campo uma chave primria e a IS_BLOB(param) Verdadeiro se este campo um BLOB ou TEXT e (obsoleto; teste campo->tipo) unsigned int decimals O nmero de decimais para um campo numrico. u e
779
mysql data seek() mysql debug() mysql drop db() mysql dump debug info() mysql eof()
Busca por uma nmero de linha arbitrrio em um conjunto u a de resultados de uma consulta. Faz um DBUG_PUSH com a string dada. Apaga um banco de dados; Esta funo esta obsoleta; utiliza ca o comando SQL DROP DATABASE. Faz o servidor escrever informaes de depourao no log. co ca Determina quando a ulitma linha de um conjunto de resultados foi lida. Esta funo foi obsoleta; Utilize mysql_ ca errno() ou mysql_error() Retorna o nmero de erro para a funo MySQL chamada u ca mais recentemente. Retorna a mensagem de erro para funo MySQL chamada ca mais recentemente. Escapa caracteres especiais em uma string para ser usada em uma instruo SQL. ca Retorna o tipo do prximo campo na tabela. o Retorna o tipo de um campo da tabela, dado um nmero u do campo. Retorna um vetor de todas as estruturas do campo. Retorna o tamanho de todas as colunas na linha atual. Busca o prximo registro no conjunto de resultados. o Coloca o cursor da coluna em uma coluna espec ica. Retorna o nmero de colunas resultantes da consulta mais u recente. Retorna a posio do cursos de campos usado pelo ultimo ca mysql_fetch_field(). Libera a memria usada por um conjunto de resultados. o Retorna a verso do cliente como uma string. a Returna a verso do cliente como um inteiro. a Retorna uma string descrevendo a conexo. a Retorna o nmero da verso do servidor como um inteiro u a (Novo na verso 4.1) a Retorna a verso do protovolo usado para a conexo. a a
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 client version() mysql get host info() mysql get server version() mysql get proto info()
780
mysql get server info() 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 o nmero da verso do servidor. u a Retorna informao sobre a consulta executada mais recenca temente. 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 expresso regular. a retorna nome de campos coincidindo com uma expresso a regular. Retorna uma lista das threads atuais do servidor. Retorna os nomes de tabelas correspondente a uma expresso regular. a Retorna o nmero de coluans em um conjunto de resultados. u Retorna o nmero de linhas em um conjunto de resultados. u Dene opes de conexo para mysql_connect(). co a Verica se a conexo ao servidor est funcionando, rea a conectando se necessrio. a 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 instruo SQL, olhando na conta o conjunto de ca caracteres atual da conexo a Executa uma consulta SQL especicada como uma string xa. Diz ao servidor pra recarregar a tabela de permisses o Busca por um oset de linha no resultado, usando o valor retornado de mysql_row_tell(). Retorna a posio dio cursor de linhas. ca Seleciona um banco de dados.
mysql real query() mysql reload() mysql row seek() mysql row tell() mysql select db()
781
mysql set server option() mysql sqlstate() mysql shutdown() mysql stat() mysql store result() mysql thread id() mysql thread safe() mysql use result() mysql warning count() mysql commit() mysql rollback() mysql autocommit() mysql more results() mysql next result()
Dene uma opo para a conexo (como multica a statements). Retorna o cdigo de erro SQLSTATE para o ultimo erro. o Desliga o servidor de banco de dados. Retorna o status do servidor como uma string. Recupera um resultado completo para o cliente. Retorna a identicao da thread atual. ca Retorna 1 se o cliente foi compilado como thread-safe. Inicia uma resultado recuperado registro por registro. Retorna a contagem do aviso da instruo SQL anterior. ca Faz um commits na transao (novo na verso 4.1). ca a Faz um roll back na transao (novo na verso 4.1). ca a Muda o modo autocommit em ligado/desligado (novo na verso 4.1). a Verica se no existem mais resultados (novo na verso 4.1). a a Retorna/Inicia o prximo resultado em execues consultas o co mltiplas (inovo na verso 4.1). u a
Para se conectar ao servidor, chame mysql_init() para iniciar um manipulador de conexo, a ento chame mysql_real_connect() com este manipulador (com informaes de nome a co de mquina, usurios e senha). Conectado, mysql_real_connect() dene o parmetro a a a reconnect (parte da estrutura MYSQL) para um valor de 1. Este parmetro indica, no a evento que uma consulta no pode ser realizada por perda de conexo, para tentar reconectar a a ao servidor ao antes de desistir. Quando no precisar mais da conexo, chame mysql_ a a close() para termin-la. a Enquanto a conexo estiver ativa, o cliente pode enviar consultas SQL para o servidor a usando mysql_query() ou mysql_real_query(). A diferena entre os dois que mysql_ c e 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 binrios (a qual pode incluir bytes null), vocdeve usar mysql_real_query(). a e Para cada consulta no-SELECT (por exemplo, INSERT, UPDATE, DELETE), voc pode descoa e brir quantas linhas foram alteradas (afetadas) chamando mysql_affected_rows(). Para consultas SELECT, voc retorna os registros selecionados como um resultado. (Note que e algumas intrues so como a SELECT ao retornar registros. Elas incluem SHOW, DESCRIBE co a e EXPLAIN. elas devem ser tratadas da mesma maneira que instrues SELECT.) co Existem dois modos para um cliente processa o resultado. Um mode recuperar todo o e resultado de uma vez chamando mysql_store_result(). Esta funo busca no servidor ca todas as linhas retornadas pela consulta e as armazena no cliente. O segundo modo o e
782
cliente iniciar um retorno do resultado registro por registro chamando mysql_use_result(). Esta funo inicia o retorno, mas no busca realmente nenhuma linha do servidor. ca a Em ambos os casos, acesse registros chamando mysql_fetch_row(). Com mysql_store_ result(), mysql_fetch_row() acessa registros que j tenham sido buscado do servidor. a Com mysql_use_result(), mysql_fetch_row() recupera, na verdade, o registro do servidor. Informaes sobre o tamanho dos dados em cada registro dispon pela chamada co e ivel mysql_fetch_lengths(). Depois de nalizar o uso do resultado, chame mysql_free_result() para liberar a memria o usada por ele. Os dois mecanismos de recuperao so complementares. Programas clientes devem escolher ca a a abordagem mais apropriada para suas necessidades. Na prtica, clientes tendem a utilizar a mysql_store_result(). Uma vantagem de mysql_store_result() que pelo fato de todos os registros serem e trazidos para o cliente, voc no s pode acessar registros sequencialmente, mas tambm e a o e pode mover para tarz e para frente no resultado utilizando mysql_data_seek() ou mysql_ row_seek() para altera a posio atual do registro no resultado. Voc tambm pode saber ca e e quantas linhas existem chamando mysql_num_rows(). Por outro lado, a necessidade de memria para mysql_store_result() pode ser muito alta para resultados grandes e voc o e encontrar como mais facilidade condies de estouro de memria. a co o Uma vantagem de mysql_use_result() que o clientes exige menos memria para o ree o sultado porque ele mantem apenas um registro por vez (por haver menor sobrecarga de alocao, mysql_use_result() pode ser mais rpido). As desvantagens so que voc deve ca a a e processar cada registro rapidamente para evitar prender o servidor, voc no tem acesso e a aleatrio aos registros no resultado (voc s pode acess-los sequencialmente) e voc no o e o a e a sabe quantos registros existem no resultado at que voc recupere todos eles. Alm disso, e e e voc deve recuperar todos os registros mesmo que voc j tenham encontrado a informao e e a ca que procura antes do nalizar o conjunto de resultados. A API torna poss para os clientes responder apropriadamente as consultas (recuperando ivel somente os regiostros necessrios) sem saber se a consulta uma instruo SELECT ou no. a e ca a Voc pode fazer isto chamando mysql_store_result() depois de cada mysql_query() (ou e mysql_real_query()). Se o resultado for obtido com sucesso, a consulta foi um SELECT e voc pode ler os registros. Se a obteno do resultado falhar, chame mysql_field_count() e ca para determinar se o resultado era o esperado. Se mysql_field_count() retornar zero, a consulta no retornou nenhum dado (indicando que ela era um INSERT, UPDATE, DELETE, a etc.), e no era esperado que retornasse registros. Se mysql_field_count() diferente de a e zero, a consulta deveria retornar registros, mas no o fez. Isto indica que a consulta foi um a SELECT que falhou. Veja a descrio de mysql_field_count() para um exemplo de como ca deve ser feito. mysql_store_result() e mysql_use_result() permitem que voc obtenha informao e ca sobre os campos que montam o resultado (o nmero de campos, os seus nome e tipos, etc.) u Voc pode acessar informaes de campo sequencialmente dentro dos registros chamando e co mysql_fetch_field() repetidamente, ou pelo nmero do campo dentro do registro u chamando mysql_fetch_field_direct(). A posio atual do cursor de campos pode ser ca alterada cahamando mysql_field_seek(). Denir o cursor de campo afeta chamadas
783
subsequentes de mysql_fetch_field(). Voc tambm pode conseguir informaes de e e co todos os campos de uma s vez chamando mysql_fetch_fields(). o Para detectar e relatar problemas, o MySQL fornace acesso a informaes de erro atravs das co e funes mysql_errno() e mysql_error(). Elas retornam o cdigo de erro ou a mensagem co o de erro para a funo chamada mais recentemente que tenha tido sucesso ou que tenha ca falhado, permitindo a voc determinar quando um erro ocorreu e qual foi ele. e
if (result == -1) /* incorrect */ ... error ... Quando uma funo retornar um erro, a subsecao Erros de descrio de funes lista os ca ca co poss iveis tipos de erro. Voc pode descobrir quais deles ocorreu chamando mysql_errno(). e Uma representao string do erro pode ser obtida chamando mysql_error(). ca
12.1.3.1 mysql_affected_rows()
my_ulonglong mysql_affected_rows(MYSQL *mysql)
Descrio ca
Retorna o nmero de registros alterados pelo ultimo UPDATE, deletados elo ultimo DELETE ou u inseridos pelo ultimo INSERT. Pode ser chamado imediatamente aps mysql_query() para o instrues UPDATE, DELETE, ou INSERT. Para instrues SELECT, mysql_affected_rows() co co funciona como mysql_num_rows().
Valor Retornado
Um inteiro maior que zero indica o nmero de registros afetados ou recuperados. Zero indica u que nenhum registro foi atualizado por uma instruo UPDATE, nenhuma linha foi encontrada ca pela clusula WHERE na consulta ou a consulta ainda no foi executada. -1 indica que a a a
784
consulta retornou um erro ou que, para uma consulta SELECT, mysql_affected_rows() foi chamado antes da chamada mysql_store_result().
Erros
Nenhum.
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 parmetro CLIENT_FOUND_ROWS ao conectar no mysqld, mysql_ a affected_rows() retornar o nmero de linhas encontardos pela clusula WHERE para a a u a instruo UPDATE. ca Note que quando for utilizado um comando REPLACE, mysql_affected_rows() retornar a 2 se o novo registro substituir um mais antigo. Isto porque neste caso um registro foi e 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)
Descrio ca
Altera o usurio faz com que o banco de dados especicado por db se torne o banco de a e dados padro (atual) na conexo especicada por mysql. Em consultas subsequentes este a a banco de dados o padro para referncias a tabelas que no especicam o banco de dados e a e a explicitamente. Esta funo foi introduzida na verso do MySQL. ca a mysql_change_user() falha a menos que o usurio conectado possa ser autenticado ou se a ele no tiver permisso para utilizar o banco de dodos. Neste caso o usurio e o banco de a a a dados no so alterados. a a O parmetro db pode ser denido como NULL se voc no dseseja ter um banco de dados a e a padro. a A partir da verso 4.0.6 do MySQL este comando sempre far ROLLBACK de qualquer a a transao ativa, fecha todas as tabelas temporrias, destrava todas as tabelas bloqueadas e ca a volta a um estado como se tivesse feito uma inova conexo. Isto ir acontecer mesmo se o a a usurio no foi alterado. a a
Valor Retornado
Zero se obteve successo. Diferente de zero se ocorreu um erro.
785
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. CR_SERVER_LOST A conexo ao servidor foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu. ER_UNKNOWN_COM_ERROR O servidor MySQL no possui este comando (provavelmente um verso mais a a antiga) ER_ACCESS_DENIED_ERROR O usurio ou a senha estavam errados. a ER_BAD_DB_ERROR O banco de dados no existe. a ER_DBACCESS_DENIED_ERROR O usurio no tem direitos de acessoa este banco de dados. a a ER_WRONG_DB_NAME O nome de banco de dados muito grande. e
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)
Descrio ca
Retorna o conjunto de caracteres padro para a conexo atual. a a
Valor Retornado
O conjunto de carcteres padro a
786
Erros
Nenhum.
12.1.3.4 mysql_close()
void mysql_close(MYSQL *mysql)
Descrio ca
feca uma conexo aberta anteriormente. mysql_close() tambm desaloca o ponteiro do a e manipulador da conexo para o mysql se ele tiver sido alocado automaticamente por mysql_ a 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)
Descrio ca
A funo est obsoleta. E melhor utilizar mysql_real_connect(). ca a mysql_connect() tenta estabelecer uma conexo a um banco de dados MySQL executando a em host. mysql_connect() deve completar com suceso antes que voc podssa executar e qualquer uma das funo da API, com a exceo de mysql_get_client_info(). ca ca O signicado dos parmetros so os mesmos que os parmetros correspondentes para mysql_ a a a real_connect() com a diferena que o parmetro de conexo pode ser NULL. Neste caso a c a a API C aloca memria para a estrutura de conexo automaticamente e a libera quando voc o a e chamar mysql_close(). A disvantagem desta abordagem que voc no pode retornar uma e e a mensagem de erro se a conexo falhar. (Para obter informaes de erro de mysql_errno() a co ou mysql_error(), voc deve fornecer um ponteiro MYSQL vlido.) e a
Valor Retornado
O mesmo de mysql_real_connect().
787
Erros
O mesmo de mysql_real_connect().
12.1.3.6 mysql_create_db()
int mysql_create_db(MYSQL *mysql, const char *db)
Descrio ca
Cria o banco de dados nomeado pelo parmetro db. a Esta funo est obsoleta. E melhor utilizar mysql_query() para comandar uma instruo ca a ca 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 conexo ao servidor MySQL foi perdida durante a consulta. a 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)
788
Descrio ca
Busca um registro arbitrrio em um resultado de uma consulta. O valor do oset um a e nmero de linha e deve estar em uma faixa de 0 at mysql_num_rows(stmt)-1. u e Esta funo exige que a estrutura do resultado contenha todo o resultado da consulta, assim ca mysql_data_seek() s pode ser usado em conjunto com mysql_store_result(), no com o a mysql_use_result().
Valor Retornado
Nenhum.
Erros
Nenhum.
12.1.3.8 mysql_debug()
void mysql_debug(const char *debug)
Descrio ca
Faz um DBUG_PUSH com a string dada. mysql_debug() usa a biblioteca de depurao ca Fred Fish. Para utilizar esta funo voc deve compilar a biblioteca cliente para suportar ca e depurao. Veja Seo E.1 [Depurando o servidor], Pgina 1079. Veja Seo E.2 [Depurando ca ca a ca o cliente], Pgina 1085. a
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 mquina cliente: a mysql_debug("d:t:O,/tmp/client.trace");
12.1.3.9 mysql_drop_db()
int mysql_drop_db(MYSQL *mysql, const char *db)
789
Descrio ca
Apaga o banco de dados nomeado pelo parmetro db. a Esta funo est obsoleta. E melhor utilizar mysql_query() para realizar uma instruo ca a ca SQL DROP DATABASE.
Valor Retornado
Zero se o banco de dados foi apagdo com sucesso. Diferente de zero 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 conexo ao servidor MySQL foi perdida durante a consulta. a 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)
Descrio ca
Instrui o servidor a gravar algumas informaes de depurao no log. Para funcionar, o co ca usurio conectado deve ter pivilgio SUPER. a e
Valor Retornado
Zero se o comando obteve sucesso. Diferete de zero se ocorreu um erro.
790
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 conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.11 mysql_eof()
my_bool mysql_eof(MYSQL_RES *result)
Descrio ca
Esta funo est obsoleta. mysql_errno() ou mysql_error() podem ser usados em seu ca a lugar. mysql_eof() determina se o ultimo registro de um resultado foi lido. Se voc buscar um resultado com um chamada mysql_store_result() bem sucedida, o e cliente recebe todo o resultado em uma operao. Neste caso, um valor NULL retornado de ca e mysql_fetch_row() sempre signica que o m do resultado foi atingido e no necessrio a e a chamar mysql_eof(). Quando usado com mysql_store_result(), mysql_eof() sempre retornar verdadeiro. a Por outro lado, se voc utilizar mysql_use_result() para iniciar um resultado recuperado, e as linhas do conjunto so obtido do servidor uma a uma, chamando mysql_fetch_row() a repetidamente. Como pode ocorrer um erro na conexo durante este processo, um valor NULL a retornado de mysql_fetch_row() no signica, necessriaemente, que o m do resultado a a fo atingido normalmente. Neste caso, voc pode utilizar mysql_eof() para determinar o e 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() preterido pelas funes de erro padro do MySQL mysql_ e co a errno() e mysql_error(). Como estas funes de erro fornecem a mesma informao, co ca o uso das duas ultimas preferido sobre mysql_eof(), a qual est obsoleta. (De fato, e a elas fornecem mais informaes, porque mysql_eof() retorna apenas um valor booleano co enquanto as funes de erro indicam uma razo para a ocorrncia do erro quando ele ocorre). co a e
Valor Retornado
Zero se nenhum erro ocorreu. Diferente de zero o m do resultado foi atingido.
Erros
Nenhum.
791
Exemplo
Os exemplos seguintes mostram como voc deve usar mysql_eof(): e 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 pode conseguir o mesmo efeito com as funes de erro padres do MySQL: e co o 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)
Descrio ca
Para a conexo especicada pelo mysql, mysql_errno() retorna o cdigo de erro para a a o funo API chamada mais recentemente que tenha obtido sucesso ou falhado. Um valor de ca retorno de zero signica que um erro ocorreu. Nmeros de mensagens de erro de clientes u so listados no arquivo de cabealho errmsg.h do MySQL. Nmeros de mensagem de a c u erros do servidor so listados no arquivo mysqld_error.h. Na distribuio fonte do a ca MySQL voc pode encontrar uma lista completa de neros de mensagens de erro no arquivo e u Docs/mysqld_error.txt. Os cdigos de erros do servidor esto listados em Seo 13.1 o a ca [Error-returns], Pgina 889. a Note que algumas funes como mysql_fetch_row() no conguram o mysql_errno() se co a elas obterem sucesso. Uma regra do dedo que todas as funes que precisam perguntar ao servidor por ina e co formao iro zerar mysql_errno() se obterem sucesso. ca a
792
Valor Retornado
Um valor de cdigo de erro para a ultima chamada mysql xxx, se ele falhar, Zero signica o que nenhum erro ocorreu.
Erros
Nenhum.
12.1.3.13 mysql_error()
const char *mysql_error(MYSQL *mysql)
Descrio ca
Para a conexo especicada por mysql, mysql_error() retorna um string terminada em a null contendo a mensagem de erro para a funo de API chamda mais recentemente que ca tenha falhado. Se a funo no falhou, o valor de retorno de mysql_error() pode ser o ca a erro anterior ou uma string vazia para indicar que no ocorreu erro. a Uma regra do dedo que todas as funes que precisam pedir informao ao servidor iro a e co ca a zerar mysql_error() se obterem sucesso. Para todas as funes que zeram mysql_errno, os seguintes dois testes so equivalentes: co a 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 pode escolher mensagens de erro em vrias l e a inguas diferentes. Veja Seo 4.7.2 [Languages], Pgina 327. ca a
Valor Retornado
Uma string terminada em null que descreve um erro. Uma string vazia se nenhum erro ocorrer.
Erros
Nenhum.
793
12.1.3.14 mysql_escape_string()
Voc deve usar mysql_real_escape_string() em seu lugar! e Esta funo identica a mysql_real_escape_string() exceto que mysql_real_escape_ ca e string() pega um manipulador de cnexo como seu primeiro argumento e escapa a string a de acordo com a conjunto de caracteres padro. mysql_escape_string() no utiliza um a a argumento de conexo e no respeita o conjunto de caracteres atual. a a
12.1.3.15 mysql_fetch_field()
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
Descrio ca
Retorna a denio de uma coluna de um resultado como uma estrutura MYSQL_FIELD. ca Chame esta funo repetidamente para retornar informaes sobre todas as colunas no ca co resultado. mysql_fetch_field() retorna NULL quando no existirem mais campos. a mysql_fetch_field() denido para retornar a informao do primeiro campo cada vez e ca que voc executar uma nova consulta SELECT. O campo retornado por mysql_fetch_ e field() tambm afetado pela chamadas mysql_field_seek(). e e Se vov tiver chamado mysql_query() para realizar um SELECT em uma tabela mas no e a tiver chamado mysql_store_result(), MySQL retorna o tamanho padro do blob (8K a bytes) quando chamar mysql_fetch_field() para saber o tamanho de um campo BLOB. (O tamanho de 8 k escolhido porque o MySQL no sabe o tamanho mximo do BLOB. Ele e a a pode ser congurado algumas vezes.) Uma vez retornado o resultado, campo->tamanho_max contm o tamanho da maior valor para esta coluna em uma consulta espec e ica.
Valor Retornado
A estrutura MYSQL_FIELD para a coluna atual. NULL no houver mais colunas. a
Erros
Nenhum.
Exemplo
MYSQL_FIELD *field; while((field = mysql_fetch_field(result))) { printf("field name %s\n", field->name); }
794
12.1.3.16 mysql_fetch_fields()
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
Descrio ca
Retorna um vetor de todas as estruturas MYSQL_FIELD no resultado. Cada estrutura fornece a denio do campo para uma coluna do resultado. ca
Valor Retornado
Um vetor da estrutura MYSQL_FIELD para todas as colunas no resultado.
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)
Descrio ca
Dado um nmero de campo fieldnr para uma colua em resultado, retorna a informao u ca de campo daquela coluna como uma estrutura MYSQL_FIELD Voc pode utilizar esta funo e ca para retornar a denio para uma coluna arbitrria. O valor de fieldnr deve estar na ca a faixa de 0 a mysql_num_fields(result)-1.
Valor Retornado
A estrutura MYSQL_FIELD para uma coluna espec ica.
795
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++) { field = mysql_fetch_field_direct(result, i); printf("Field %u is %s\n", i, field->name); }
12.1.3.18 mysql_fetch_lengths()
unsigned long *mysql_fetch_lengths(MYSQL_RES *result)
Descrio ca
Retorna o tamanho da coluna do registro atual em um resultado. Se voc planeja copiar e calores dos compos, esta informao de tamanho util tambm para a otimizao, ca e e ca porque voc pode evitar a chamada strlen(). Se o resultado contm dados birios, voc e e a e deveutilizar esta funo para determinar o tamanho dos dados, pois strlen() retorna um ca valor incorreto para quaquer campo contendo caracteres nulos. O tamanho para colunas vazias e para colunas contendo valores NULL zero. Para ver como e distnguir este dois casos, veja a descrio de mysql_fetch_row(). ca
Valor Retornado
Um vetor de unsigned long integers (inteiros longos sem sinal) representando o tamanho de cada coluna (no incluindo nenhuma caracter nulo). NULL se ocorrer um erro. a
Erros
mysql_fetch_lengths() s vlido para o registro atual no resultado. Ele retorna NULL oe a se voc cham-lo antes de mysql_fetch_row() ou depois de retornar todos os registros em e a um resultado.
Exemplo
MYSQL_ROW row;
796
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]); } }
12.1.3.19 mysql_fetch_row()
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
Descrio ca
Recuera o prximo registro do resultado. Quando usado depois de mysql_store_result(), o mysql_fetch_row() retorna NULL quando no houver mais registros para retornar. Quando a usado depois de mysql_use_result(), mysql_fetch_row() retorna NULL quando no houa ver mais registros para retornar ou ocorrer um erro. O nmero de valores no registro dado por mysql_num_fields(result). Se row guarda u e o valor retornado de uma chamada mysql_fetch_row(), apontadores para os valores so a acessados como row[0] a row[mysql_num_fields(result)-1]. Valores NULL no registro so indicados por apontadores NULL. a 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 pode distingui-los e vericando o apontador para o valor do campo. Se o apontador NULL, o campo NULL; e e seno o campo est vazio. a a
Valor Retornado
Uma estrutura MYSQL_ROW para o prximo registro. NULL se no houver mais linhas para o a retornar ou ocorrer um erro.
Erros
Note que o erro no zerado entre as chamadas a mysql_fetch_row() a e CR_SERVER_LOST A conexo com o servidor foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
797
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++) { printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL"); } printf("\n"); }
12.1.3.20 mysql_field_count()
unsigned int mysql_field_count(MYSQL *mysql) Se voc estiver utilizando uma verso anterior a verso 3.22.24 do MySQL, voc deve utilizar e a a e unsigned int mysql_num_fields(MYSQL *mysql).
Descrio ca
Retorna o nmero de colunas para a consulta mais recente na conexo. u a Normalmente esta funo utilizada quando mysql_store_result() retorna NULL (ento ca e a voc no possui um apontador para o resultado). Neste caso, voc pode chamar mysql_ e a e field_count() para determinar se mysql_store_result() no produziu um resultado a vazio. Isto permite que o programa cliente tome a ao aprpriada sem saber se a consulta ca foi uma instruo SELECT (ou do mesmo tipo). O exemplo mostrado aqui ilustra como isto ca pode ser feito. Veja Seo 12.1.12.1 [NULL mysql_store_result()], Pgina 861. ca a
Valor Retornado
Um unsigned integer (inteiro sem sinal) representando o nmero de campo em um resultado. u
Erros
Nenhum.
798
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 { 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 substituir a chamada mysql_field_count(&mysql) com e mysql_errno(&mysql). Neste caso, voc est vericando diretamente um erro de e a mysql_store_result() em vez de conferir o valor de mysql_field_count() se a instruo ca foi uma SELECT.
12.1.3.21 mysql_field_seek()
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)
Descrio ca
Dene o cursor campo com o oset dado. A prxima chamada para mysql_fetch_field() o ir recuperar a denio de campo da coluna associada com o oset. a ca
799
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)
Descrio ca
Retorna a posio do cursos do campo usado pelo ultimo mysql_fetch_field(). Este valor ca 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)
Descrio ca
Libera a memria alocada para o resultado por mysql_store_result(), mysql_use_ o result(), mysql_list_dbs(), etc. Quando voc nalizar o uso do resultado, voc deve e e liberar a memria utilizada chamando mysql_free_result(). o
Valor Retornado
Nenhum.
Erros
Nenhum.
800
12.1.3.24 mysql_get_client_info()
char *mysql_get_client_info(void)
Descrio ca
Retorna uam string que representa a verso da biblioteca cliente. a
Valor Retornado
Uma string representando a verso da biblioteca cliente do MySQL. a
Erros
Nenhum.
12.1.3.25 mysql_get_client_version()
unsigned long mysql_get_client_version(void)
Descrio ca
Retorna um inteiro que representa a verso da biblioteca cliente. O valor tem o formato a XYYZZ onde X a verso principal, YY o nivel da distribuico e ZZ o nmero da verso e a e a e u a dentro do n da distribuio. Por exemplo, um valor de 40102 representa uma biblioteca ivel ca cliente na verso 4.1.2. a
Valores de Retorno
Um inteiro que representa a verso da biblioteca clientes do mysql. a
Erros
Nenhum.
12.1.3.26 mysql_get_host_info()
char *mysql_get_host_info(MYSQL *mysql)
Descrio ca
Retorna uma string descrevendo o tipo da conexo em uso, incluindo o nome da maquina a servidora.
801
Valor Retornado
Uma string respresntando o nome da mquina servidora e o tipo de conexo. a a
Erros
Nenhum.
12.1.3.27 mysql_get_proto_info()
unsigned int mysql_get_proto_info(MYSQL *mysql)
Descrio ca
Retorna a verso do protocolo usado pela conexo atual. a a
Valor Retornado
Um unsigned integer (inteiro sem sinal) representando a verso do protocolo usado pela a conexo atual. a
Erros
Nenhum.
12.1.3.28 mysql_get_server_info()
char *mysql_get_server_info(MYSQL *mysql)
Descrio ca
Retorna um string que representa o nmero da verso do servidor. u a
Valor Retornado
Um string representando o nmero da verso do servidor. u a
Erros
Nenhum.
12.1.3.29 mysql_get_server_version()
unsigned long mysql_get_server_version(MYSQL *mysql)
802
Descrio ca
Retorna o nmero de verso do servidor como um inteiro (novo na verso 4.1) u a a
Valor Retornado
Um nmero que representa a verso do servidor MySQL no formato: u a verso principal*10000 + verso menor*100 + sub verso a a a Por exemplo, 4.1.0 retornado como 40100. e Ela util para determinar a verso do servidor rapidamente em um programa cliente para e a saber se algumas capacidades existem.
Erros
Nenhum.
12.1.3.30 mysql_info()
char *mysql_info(MYSQL *mysql)
Descrio ca
Retorna um string fornecendo informao sobre a consulta executada mais recentemente, ca mas apenas para as instrues listadas aqui. Para outras inastrues, mysql_info() retorna co co NULL. O formato da string varia dependendo do tipo de consulta, como descrito aqui. Os nmeros so apenas ilustrativos; a string ir conter valores apropriados para a consulta. u a a INSERT INTO ... SELECT ... Formato da string: Records: 100 Duplicates: 0 Warnings: 0 INSERT INTO ... VALUES (...),(...),(...)... Formato da string: Records: 3 Duplicates: 0 Warnings: 0 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 no-NULL para INSERT ... VALUES somente na a forma de mltiplas linhas da instruo (isto , apenas se uma lista com vrios valores u ca e a e especicada).
Valor Retornado
Uma string represntando informao adicional sobre a consulta executada mais recenteca mente. NULL se no houver nenhuma informao dispon para a consulta. a ca ivel
803
Erros
Nenhum.
12.1.3.31 mysql_init()
MYSQL *mysql_init(MYSQL *mysql)
Descrio ca
Aloca ou inicializa um objeto MYSQL apropriado para mysql_real_connect(). Se mysql e um ponteiro NULL, a funo aloca, inicializa e retorna um novo objeto. Seno o objeto ca a e inicializado e o endereo do objeto retornado. Se mysql_init() aloca um novo objeto, c e ele ser liberado quando mysql_close() for chamado para fechar a conexo. a a
Valor Retornado
Um handle MYSQL* inicializado. NULL se no houver memria suciente para alocar o novo a o objeto.
Erros
Em caso de memria insuciente, NULL retornado. o e
12.1.3.32 mysql_insert_id()
my_ulonglong mysql_insert_id(MYSQL *mysql)
Descrio ca
Retorna o ID gerado para uma coluna AUTO_INCREMENT pela consulta anterior. Use esta funo depois de ter realizado um consulta INSERT em uma tabela que contenha um campo ca AUTO_INCREMENT. Note que mysql_insert_id() retorna 0 se a consulta anterior no gerar um valor AUTO_ a INCREMENT. Se voc desejar salvar o valor para uso posterior, chame mysql_insert_id() e imediatamente depois da consulta que gerou o valor. Se a consulta anterior retornar um erro, o valor de mysql_insert_id() indenido. e mysql_insert_id() atualizado depois de instrues INSERT e UPDATE que geram um valor e co AUTO_INCREMENT ou que denem um valor de coluna com LAST_INSERT_ID(expr). Veja Seo 6.3.6.2 [Funes diversas], Pgina 547. ca co a Note tambm que o valor da funo SQL LAST_INSERT_ID() sempre contm o o valor AUTO_ e ca e INCREMENT gerado mais recentemente e no zerado entre as consultas porque o valor desta a e funo mantido no servidor. ca e
804
Valor Retornado
O valor do campo AUTO_INCREMENT que foi atualizado pela consulta anterior. Retorna zero se no houve consultas anteriores na conexo ou se a consulta no atualizou o valor a a a AUTO_INCREMENT.
Erros
Nenhum.
12.1.3.33 mysql_kill()
int mysql_kill(MYSQL *mysql, unsigned long pid)
Descrio ca
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. CR_SERVER_LOST A conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.34 mysql_list_dbs()
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)
Descrio ca
Retorna um resultado com nome de banco de dados no servidor que correspondem a uma expresso regular especicada pelo parmetro wild. wild pode conter o meta caracteres % a a ou _, ou pode ser um ponteiro NULL para coreesponder a todos os banco de dados. Chamar mysql_list_dbs() o mesmo que executar a consulta SHOW databases [LIKE wild]. e Voc deve liberar o resultado com mysql_free_result(). e
805
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 conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.35 mysql_list_fields()
MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
Descrio ca
Retorna um resultado contendo nomes de campos de uma tabela dada que correspondam a expresso regular especicada pelo parmetro wild. wild pode conter os metacaracteres % a a ou _, ou pode ser um ponteiro NULL para corresponder a todos os campos. Chamar mysql_ list_fields() o mesmo que executar a consulta SHOW COLUMNS FROM nome_tabela [LIKE e wild]. Note que recomendado que voc use SHOW COLUMNS FROM nome_tabela em vez de mysql_ e e list_fields(). Voc deve liberar o resultado com mysql_free_result(). e
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 conexo ao servidor MySQL foi perdida durante a consulta. a
806
12.1.3.36 mysql_list_processes()
MYSQL_RES *mysql_list_processes(MYSQL *mysql)
Descrio ca
Retorna um resultado descrevendo a thread atual do servidor. E o mesmo tipo de informao ca relatado por mysqladmin processlist ou uma consulta SHOW PROCESSLIST. Voc deve liberar o resultado com mysql_free_result(). e
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 conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.37 mysql_list_tables()
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)
Descrio ca
Retorna um resultado contendo nomes de tabelas no banco de dados atual que correspondam a expresso regular especicada pelo parmetro wild. wild pode conter os mets caracteres a a % or _, ou pode ser uma ponteiro NULL para corresponde a todas as tabelas. Chamar mysql_list_tables() o mesmo que executar a consulta SHOW tables [LIKE wild]. e Voc deve liberar o resultado com mysql_free_result(). e
Valor Retornado
Um conjunto de resultados MYSQL_RES em caso de sucesso. NULL se ocorrer um erro.
807
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 conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.38 mysql_num_fields()
unsigned int mysql_num_fields(MYSQL_RES *result) ou unsigned int mysql_num_fields(MYSQL *mysql) A segunda forma no funciona na verso 3.22.24 ou mais novas do MySQL. Para passar um a a argumento MYSQL* voc de utilizar unsigned int mysql_field_count(MYSQL *mysql) em e seu lugar.
Descrio ca
Retorna o nmero de colunas em um resultado. u Note que voc pode obter o nmero de colunas com um ponteiro para o conjunto de resule u tados ou para um manipulador (handle) de conexo. Voc usaria o manipular de conexo a e a se mysql_store_result() ou mysql_use_result() retorna NULL (ento voc no tem um a e a ponteiro para o resultado). Neste caso, voc pode chamar mysql_field_count() para dee terminar se mysql_store_result() no produziu um resultado vazio. Isto permite que o a programa cliente tome a ao apropriada sem saber se a consulta foi uma instruo SELECT ca ca (ou do tipo SELECT). O exemplo mostrado abaixo ilustra como isto pode ser feito. Veja Seo 12.1.12.1 [NULL mysql_store_result()], Pgina 861. ca a
Valor Retornado
Um unsigned integer (inteiro sem sinal) representando o nmero de campos no conjunto de u resultasdos.
Erros
Nenhum.
808
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~o retora dados a // (ela n~o era um SELECT) a num_rows = mysql_affected_rows(&mysql); } } } Uma alternativa (se voc souber qyue a sua consulta retornou um resultado) substituir e e a chamada mysql_errno(&mysql) pela vericao de se mysql_field_count(&mysql) = ca e 0. Isto s acontece se alguma coisa der errado. o
12.1.3.39 mysql_num_rows()
my_ulonglong mysql_num_rows(MYSQL_RES *result)
Descrio ca
Retorna o nmero de linhas em um resultado. u O uso de mysql_num_rows() depende de se voc utiliza mysql_store_result() ou mysql_ e use_result() para retornar o resultado. Se voc usa mysql_store_result(), mysql_num_ e rows() pode ser chamado imediatamente. Se voc usa mysql_use_result(), mysql_num_ e
809
rows() no retornar o valor correto at que todas as linhas no resultado tenham sido a a e recuperadas.
Valor Retornado
O nmero de linhas no resultado. u
Erros
Nenhum.
12.1.3.40 mysql_options()
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)
Descrio ca
Pode ser usado para denir opes extras de conexo e afetar o comportamento de uma co a conexo. Esta funo pode ser chamada vrias vezes para denir diversas opes. a ca a co mysql_options() deve ser chamado depois de mysql_init() e antes de mysql_connect() ou mysql_real_connect(). O argumento option a opo que voc que denir; o argumento arg o valor para a e ca e e opo. Se a opo um inteiro, ento arg deve apontar para o valor do inteiro. ca ca e a Valores poss iveis para as opes: co Opo ca MYSQL_OPT_CONNECT_TIMEOUT MYSQL_OPT_COMPRESS MYSQL_OPT_READ_TIMEOUT Tipo de argumento unsigned int * No usado a unsigned int * unsigned int * ponteiro para unsigned integer opcional No usado a Funo ca Tempo limite de conexo em a segundos. Usa o protocolo cliente/servidor compactado. Limite de tempo para a leitura do servidor (funciona atualmente apenas no Windows em conexes TCP/IP) o Limite de tempo para a escrita no servidor (funciona atualmente apenas no Windows em conexes TCP/IP) o Se nenhum ponteiro for dado ou se apontar para um unsigned int != 0 o comando LOAD LOCAL INFILE est habilitado. a Usa named pipes para conectar ao servidor MySQL no NT.
MYSQL_OPT_WRITE_TIMEOUT
MYSQL_OPT_LOCAL_INFILE
MYSQL_OPT_NAMED_PIPE
810
MYSQL_INIT_COMMAND
char *
MYSQL_READ_DEFAULT_FILE MYSQL_READ_DEFAULT_GROUP
char * char *
MYSQL_OPT_PROTOCOL
MYSQL_SHARED_MEMORY_BASE_NAME
Comando para executar ao conectar ao servidor MySQL. Ser automaticamente execua tado ao se reconectar. L opes do arquivo de opes e co co denido no lugar de my.cnf. L opes do grupo indicado no e co 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 meria para o comunicao com o servidor. ca Deve ser o mesmo que a opo ca shared-memory-base-name usada para o servidor mysqld no qual voc quer se conectar. e
Note que o grupo client sempre lido se voc utiliza MYSQL_READ_DEFAULT_FILE ou MYSQL_ e e READ_DEFAULT_GROUP. O grupo especicado no arquivo de ops pode conter as seguintes opes: co co Opo ca connect-timeout compress database debug disable-localinfile host init-command interactivetimeout localinfile[=(0|1)] max_allowed_packet password pipe Descrio ca Tempo limite de conexo em segundos. No Linux a este tempo limite tambm utilizado para esperar e e 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 conexo. a Opes de depurao. co ca Disabilita o uso de LOAD DATA LOCAL. Nome de mquina padro. a a Comando para executar ao conectar ao servidor MySQL. Ser executado automaticamente ao a reconectar. O mesmo que o especicado em CLIENT_ INTERACTIVE para mysql_real_connect(). Veja Seo 12.1.3.43 [mysql real connect], Pgina 813. ca a Se no houver argumento ou o argumento for difera ente de 0 habilita o uso de LOAD DATA LOCAL. Tamanho mximo dos pacotes que o cliente pode ler a do servidor. Senha padro. a Usa named pipes para conectar ao servidor MySQL no NT.
811
Nmero padro da porta. u a Diz ao mysql_info() para retornar registros encontrados no lugar de registros atualizados ao usar UPDATE. shared-memoryNome da memria comprtilhada utilizada para o base-name=name conectar ao servidor (o padro "MySQL"). Novo a e na verso 4.1. a socket Nmero padro do socket. u a user Usurio padro. a a Note que timeout foi substituido por connect-timeout, mas timeout ainda funcionar a por enquanto. Para maiores informaes sobre arquivos de opes, veja Seo 4.1.2 [Arquivo de opes], co co ca co Pgina 216. a
Valor Retornado
Zero em caso de sucesso. Diferente de zero se voc utilizar uma opo desconhecida. e ca
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 opo adicional da seo odbc no arquivo de opes my.cnf. ca ca co
12.1.3.41 mysql_ping()
int mysql_ping(MYSQL *mysql)
Descrio ca
Verica se a conexo ao servidor est funcionando. Se ela tiver ca feita uma tentativa a a ido e de conexo automaticamente. a Esta funo pode ser usada pelos clientes que se cam inativo por um longo tempo para ca vericar se o servidor fechou a conexo e reconectar se necessrio. a a
812
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.42 mysql_query()
int mysql_query(MYSQL *mysql, const char *query)
Descrio ca
Executa uma consulta SQL apontada pela string terminada em null query. A consulta deve deve consistir de uma unica instruo SQL. Voc no deve adicionar ponto e v ca e a irgula (;) ou \g ao m da instruo. ca mysql_query() no pode ser usadas por consultas que contenham dados binrios; voc deve a a e utilizar mysql_real_query() em seu lugar. (Dados binrios podem conter o caracter \0, a que mysql_query() interpreta como o m a string de consulta.) Se voc quiser saber se a consulta deve retornar um resultado ou no, voc pode utilizar e a e mysql_field_count() para vericar isto. Veja Seo 12.1.3.20 [mysql_field_count()], ca Pgina 797. a
Valor Retornado
Zero se a consulta obteve sucesso. 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 conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
813
12.1.3.43 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)
Descrio ca
mysql_real_connect() tenta estabelecer uma conexo mecanismo MySQL de banco de a dados executando em host. mysql_real_connect() deve completar com suceeso antes que voc possa executar qualquer um das outars funoes da API, com a excesso de mysql_ e ca a get_client_info(). Os parmetros so especicados da seguinte forma: a a O primeiro parmetro deve ser o endereo de uma estrutura MYSQL existente. Antes a c de chamar mysql_real_connect() voc deve chamar mysql_init() para inicializar a e estrutura MYSQL. Voc pode alterar vria opes de conexo com a chamada mysql_ e a co a options(). Veja Seo 12.1.3.40 [mysql options], Pgina 809. ca a O valor de host pode ser tanto um nome de mquivo quanto um endereo IP. Se host a c NULL ou a string "localhost", a conexo feita na mquina local. Se o SO suporta e a e a sockets (Unix) ou named pipes (Windows), eles so utilizados em vez de TCP/IP para a a conexo ao servidor. a O parmetro user contm a indeticao do usurio MySQL. Se user NULL ou a a e ca a e string vazia "", considera-se o usurio padro. Sob Unix, ele o login atual. Sob ODBC a a e no Windows, o usurio atual deve ser especicado explicitamente. Veja Seo 12.2.2 a ca [Administrador ODBC], Pgina 871. a O parmetro passwd contm a senha para user. Se passwd NULL, somente entradas a e e na tabela user para usurios que tenham campo de senha em branco (vazia) sero a a vericados ipor um padro coincidenete. Isto permite que o admistrador do banco a de dados congure o sistema de privilgios do MySQL de tal maneira que usurios e a os usurios conseguiro privileios diferentes, dependendo se ele espcicou ou no uma a a a senha. Nota: No tente criptografar a senha antes de chamar mysql_real_connect(); senhas a criptografadas so tratadas automaticamente pela API cliente. a db o nome de banco de dados. Se db no NULL, a conexo denir o banco de dados e a e a a padro com este valor. a Se port no 0, o valor ser usado como o nmero da porta para as conexes TCP/IP. a e a u o Note que o parmetro host determina o tipo da conexo. a a Se unix_socket no NULL, a string especica o socket ou named pipe que deve ser a e usado. Note que o parmetro host determina o tipo de conexo. a a O valor de client_flag normalmente 0, mas pode ser denido como uma combinao e ca dos parmetro seguintes em circunstncias especiais: a a Nome do parmetro a CLIENT_COMPRESS Descrio do parmetro ca a Usa protocolo compactado.
814
CLIENT_MULTI_RESULTS
CLIENT_NO_SCHEMA
CLIENT_ODBC CLIENT_SSL
Retorna o nmero de linhas encontradas (corresponu dentes a um padro), no o nmero de linha efetivo. a a u Permite espao depois do nome de funes. torna todos c co os nomes de funes palavras reservadas. co Permite interactive_timeout segundos (no lugar de wait_timeout segundos) de inatividade antes de fechar a conexo. a Habilita LOAD DATA LOCAL. Diz ao servidor que o cliente pode enviar consultas multi linhas (separado com ;). Se este parmetro no est a a a denido, consultas de multil linhas est disabilitado. a (Novo na verso 4.1). a Diz ao servidor que o cliente pode tratar mult iplos conjuntos de resultados de um multi consulta ou stored procedures. Isto denido automaticamente se CLIENT_ e MULTI_STATEMENTS est lidado. Novo na verso 4.1. a a No permite a sintaxe db_name.nome_tabela.nome_ a coluna. Isto para o ODBC. Ele faz com que o anale izador gere um erro se voc utilizar aquela sintaxe. E util e para achar erros em alguns programas ODBC. O cliente um cliente ODBC. Torna o mysqld mais e amigvel ao ODBC. a Usa SSL (protocolo criptografado). Esta opo no deve ca a ser congurao pelo aplicativo; ele denida internaca e mente na biblioteca cliente.
Valor Retornado
Um handle de conexo MYSQL* se a conexo foi obtida com sucesso, NULL se a conexo a a a falhou. Para um conexo estabelecida o valor de retorn o mesmo que o valor do primeiro a e parmetro. a
Erros
CR_CONN_HOST_ERROR Falhou ao conectar ao servidor MySQL. CR_CONNECTION_ERROR Falhou ao conectar ao servidor MySQL local. CR_IPSOCK_ERROR Falhou au criar um socket IP. CR_OUT_OF_MEMORY Sem memria. o CR_SOCKET_CREATE_ERROR Falhou ao criar um socket Unix. CR_UNKNOWN_HOST Falhou ao procurar o endereo IP para o nome de maquina. c
815
CR_VERSION_ERROR Um erro de protocolo resultou da tentativa de conexao a um servidor com uma biblioteca cliente que utiliza uma verso de protocolo diferente. Isto pode a acontecer se voc utiliza uma biblioteca cliente muito antiga para se conectar a e um novo servidor qua no foi iniciado com a opo --old-protocol. a ca 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 ler as sees [client] e [seu_programa] a co no arquivo my.cnf o qual ir assegurar que seu programa ir funcionar, mesmo se alguem a a tiver congurado o MySQL de um modo fora do padro. a Note que sob a conexo, mysql_real_connect() dene o parmetro reconnect (parte da a a estrutura MYSQL) para um valor de 1. Este parmetro indica, no evento em que uma consulta a no pode ser realizada devido a perda de conexo, para tentar se reconectar ao servidor a a antes de esgotar as tentativas.
12.1.3.44 mysql_real_escape_string()
unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length)
Descrio ca
A funo usada para criar um string SQL vlida que voc pode usar em uma instruo ca e a e ca SQL. Veja Seo 6.1.1.1 [Sintaxe de string], Pgina 469. ca a
816
A string em from codicada para uma string SQL com escape, levando em conta o conjunto e de caracteres atual da conexon. O resultado colocada em to e uma byte nulo de termino a e ca adcionado. Caracteres codicados so NUL (ASCII 0), \n, \r, \, , " e Control-Z e a (veja Seo 6.1.1 [Literais], Pgina 469). (O MySQL precisa que apenas a barra invertida ca a e as aspas utilizadas para citar a consulta sejam escapadas. Esta funo coloca os outros ca caracteres entre aspas para torn-lo mais fcil de ser lido em arquivos log.) a a A string apontada por from deve ter o tamanho de length bytes. Voc deve alocar o buer e 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 preciria de espao para o e c byte null de terminao.) Quando mysql_real_escape_string() retornar, o contedo de ca u to ser uma string terminada em null. O valor o tamanho da string codicada. no a e a 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 funo strmov() usada no exemplo est inclu na biblioteca mysqlclient e funciona ca a ida como strcpy() mas retorna um ponteiro para null de terminao do primeiro parmetro. ca a
Valor Retornado
O tamanho do valor colocado em to, no incluindo o caracter null de terminao. a ca
Erros
Nenhum.
12.1.3.45 mysql_real_query()
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
817
Descrio ca
Executa a consulta SQL apontada por query, que deve ser uma string de length bytes. A consulta deve consistir de uma instruo SQL simples. Voc no deve adicionar um ponto ca e a e virgula (;) ou \g no m da instruo. ca Voc deve utilizar mysql_real_query() em lugar de mysql_query() para consultas que e contenham dados binrios, pois eles podem conter o caracter \0. Alm disso, mysql_real_ a e query() mais rpido que mysql_query() pois ele no faz chamadas strlen() na string e a a de consulta. Se voc quiser saber se a consulta retornou um resultado ou no, voc pode usar mysql_ e a e a field_count(). Veja Seo 12.1.3.20 [mysql eld count], Pgina 797. ca
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 conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.46 mysql_reload()
int mysql_reload(MYSQL *mysql)
Descrio ca
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.
818
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 conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.47 mysql_row_seek()
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset)
Descrio ca
Atribui ao cursor de linha um registro arbitrrio em resultado de uma consulta. O valor a do offset um oset do registro que deve ser um valor retornado de mysql_row_tell() e ou mysql_row_seek(). Este valor no simplesmente um nmero de linha; se voc quiser a u e buscar um registro em um resultado usando o nmero de linha utilize mysql_data_seek(). u Esta funo exige que a estrutura do resultado contenha todo o resultado da consulta, assim ca mysql_row_seek() pode ser um usado em conjunto apenas com mysql_store_result(), e no com mysql_use_result(). a
Valor Retornado
O valor anterior do cursor de linha. Este valor pode ser passado a uma chamada subsequente mysql_row_seek().
Erros
Nenhum.
12.1.3.48 mysql_row_tell()
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)
Descrio ca
Retorna a posio atual do cursor de linha para a ultima mysql_fetch_row(). Este valor ca pode ser utilizado como argumento para mysql_row_seek(). Voc deve utilizar mysql_row_tell() somente depois de mysql_store_result(), e no e a depois de mysql_use_result().
819
Valor Retornado
O oset atual do cursos de linha.
Erros
Nenhum.
12.1.3.49 mysql_select_db()
int mysql_select_db(MYSQL *mysql, const char *db)
Descrio ca
Faz com que o banco de dados espexcicado por db se torne o padro (atual) na conexo a a especicada por mysql. Nas consultas seguintes este banco de dados o padro para tabelas e a que no incluem uma especicao explicita para o banco de dados. a ca mysql_select_db() falha a menos que o usurio conectado possa ser autenticado com a permisso para utilizar o banco de dados. a
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 conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.50 mysql_set_server_option()
int mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option)
Descrio ca
Habilita ou desabilita uma opo para a conexo. option por ter um dos seguintes valores: ca a MYSQL OPTION MULTI STATEMENTS ON multi instrues. Habilita suporte a co MYSQL OPTION MULTI STATEMENTS OFF multi instrues. Desabilita suporte a co
820
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 conexo ao servidor MySQL foi perdida durante a consulta. a ER_UNKNOWN_COM_ERROR O servidor no suportou mysql_set_server_option() (que o caso no qual o a servidor mais antigo que 4.1.1) ou o servidor no suportou a opo que se e a ca tentou denir.
12.1.3.51 mysql_shutdown()
int mysql_shutdown(MYSQL *mysql)
Descrio ca
Diz ao servidor de banco de dados para nalizar. O usurio conectado deve ter privilgio a e SHUTDOWN.
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 conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.52 mysql_sqlstate()
const char *mysql_sqlstate(MYSQL *mysql)
821
Descrio ca
Retorna uma string terminada em null contendo o cdigo de erro SQLSTATE para o ultimo o erro. O cdigo de erro consiste de cinco caracteres. 00000 signica sem erros. Os o valores so especicados pelo ANSI SQL e ODBC. Para uma lista de valores poss a iveis, veja Seo 13.1 [Error-returns], Pgina 889. ca a Note que nem todos os erros j esto mapeados para SQLSTATE. O valor HY000 (erro a a geral) usado para erros no mapeados. e a Esta funo foi adicionada ao MySQL 4.1.1. ca
Valores Retornados
Uma string terminada em null contendo o cdigo de erro SQLSTATE. o
Veja Tambm e
a ca Veja Seo 12.1.3.12 [mysql errno], Pgina 791. Veja Seo 12.1.3.13 [mysql error], ca Pgina 792. Veja Seo 12.1.7.18 [mysql stmt sqlstate], Pgina 855. a ca a
12.1.3.53 mysql_ssl_set()
int mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher)
Descrio ca
mysql_ssl_set() usado para estabelecer conexo segura usando SSL. Ela deve ser e a chamada antes de mysql_real_connect(). mysql_ssl_set() no faz nada a mesno que o suporte OpenSSL esteja habilitado na biba lioteca cliente. mysql e o handler da conexo retornado de mysql_init(). Os outros parmetros so a a a especicados como a seguir: key o caminho para o arquivo de chave. e cert o caminho para o arquivo do certicado. e ca o caminho para o arquivo de autoridade do certicado. e capath o caminho para um diretrio que contm certicados SSL CA conveis no e o e a formato pem. cipher a lista de cifras permitidas para uso para criptograa SSL. e Qualquer parmetro SSL no utilizado pode ser dado com NULL. a a
Valores Retornados
Esta funo sempre retorna 0. Se a congurao SSL est incorreta, mysql_real_connect() ca ca a retornar um erro quando voc tentar se conectar. a e
822
12.1.3.54 mysql_stat()
char *mysql_stat(MYSQL *mysql)
Descrio ca
Retorna uma string contendo informaes sinmilares a aquelas fornecidas pelo comando co mysqladmin status. Isto inclui o tempo de conexo em segundos e o nmero de threads a u em execuo, recargas e tabelas abertas. ca
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 conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.55 mysql_store_result()
MYSQL_RES *mysql_store_result(MYSQL *mysql)
Descrio ca
Voc deve chamar mysql_store_result() ou mysql_use_result() para cada consulta que e retorne dados com sucesso (SELECT, SHOW, DESCRIBE, EXPLAIN). Voc no precisa chamar mysql_store_result() ou mysql_use_result() para outras cone a sultas, mas ele no causar nenhum dano ou nenhuma queda notel de desempenho se voc a a e chamar mysql_store_result() em todos os casos. Voc pode detectar se a consulta no e a obteve resultado vericando se mysql_store_result() retornou 0. Se voc quiser saber se a consulta devia retornar algum resultado, voc pode utilizar e e mysql_field_count() para fazer a vericao. Veja Seo 12.1.3.20 [mysql eld count], ca ca Pgina 797. a mysql_store_result() l todo o resultado de uma consulta para um cliente, aloca uma e estrutura MYSQL_RES e coloca o resultado nesta estrutura. mysql_store_result() retorna um ponteiro para null se a consulta no retornar um rea sultado (se a consulta foi, por exemplo, uma instruo INSERT). ca
823
mysql_store_result() tambm retorna um ponterio para null se a leitura do resultado e falhar. Voc pode vercar se voc obteve um erro vericando se mysql_error() no ree e a tornou um ponterio para null, se mysql_errno() retorna <> 0, ou se mysql_field_count() retorna <> 0. Um resultado vazio retornado se no houver registros a retornar. (Um resultado vazio e a e diferente de um ponteiro para null em um valor de retorno). Uma vez que voc tenha chamado mysql_store_result() e tenha retornado um resultado e que no uma apontador para null, voc pode chamar mysql_num_rows() para descobrir a e e quantas linhas existem no resultado. Voc pode chamar mysql_fetch_row() para buscar registros no resultado ou mysql_row_ e seek() e mysql_row_tell() para obter ou denir a poio atual do registro dentro do ca resultado. Voc deve chamar mysql_free_result() quando tiver terminado com o resultado. e Veja Seo 12.1.12.1 [NULL mysql_store_result()], Pgina 861. ca a
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. CR_OUT_OF_MEMORY Sem memoria. CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.56 mysql_thread_id()
unsigned long mysql_thread_id(MYSQL *mysql)
Descrio ca
Retorna a ID da thread da conexo atual. Este valor pode ser usado como um argumento a para mysql_kill() para nalizar a thread. Se a conexo for perdida e voc reconectar com mysql_ping(), a ID da thread ir alterar. a e a Isto signica que voc deve obter a ID da thread e guard-la para uso posterior. Voc deve e a e obt-la quando precisar dela. e
824
Valor Retornado
A ID da thread da conexo atual. a
Erros
Nenhum.
12.1.3.57 mysql_use_result()
MYSQL_RES *mysql_use_result(MYSQL *mysql)
Descrio ca
Voc deve chamar mysql_store_result() ou mysql_use_result() para cada consulta que e retornar data com sucesso (SELECT, SHOW, DESCRIBE, EXPLAIN). mysql_use_result() inicicia a recuperao de um resultado mas no l realmente o reca a e sultado no cliente como mysql_store_result() faz. Cada regiostro deve ser recuperado individualmente fazendo chamadas a mysql_fetch_row(). Ele l o resultado de uma cone sulta diretamente do servidor sem armazenar em uma tabela temporria ou em um buer a local, o o que mais rpido e utiliza menos memria que mysql_store_result(). O cliente e a o s ir alocar memria para o registro atual para o buer de comunicao que pode crescer io a o ca para max_allowed_packet bytes. Por outro lado , voc no deve utilizar mysql_use_result() se voc estiver fazendo vrios e a e a processamentos para cada registros no lado do cliente, ou se a sa enviada para a tela, ida e na qual o usurio de digitar um ^S (parada de tela). Isto ir prender o servidor e impedir a a outras threads de atualizar qualquer tabela na qual o dados esteja sendo buascado. Ao usar mysql_use_result(), voc deve executar mysql_fetch_row() at um valor NULL e e ser retornado, seno, os registros no buscados retornaro como part do resultado de sua a a a prxima consulta. A API C fornecer o erro Commands out of sync; you cant run this o a command now se voc esquecer de faz-lo. e e Voc no pode utilizar mysql_data_seek(), mysql_row_seek(), mysql_row_tell(), e a mysql_num_rows(), ou mysql_affected_rows() com m resultado retornado de mysql_use_result(), nem pode executar outras consultas at que mysql_use_result() e tenha nalizado. (No entanto, depois de buscar todos os regitros, mysql_num_rows() retornar corretamente o nmero de regiostros buscados). a u Voc deve chamar mysql_free_result() aps terminar de utilizar o resultado. e o
Valor Retornado
Uma estrutura de resultado MYSQL_RES. NULL se ocorrer um erro.
825
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 memria. o CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
12.1.3.58 mysql_warning_count()
unsigned int mysql_warning_count(MYSQL *mysql)
Descrio ca
Retorna o nmero de avisos gerados durante a execuo da instruo SQL anterior. u ca ca Dispon a partir do MySQL 4.1. ivel
Valores de Retorno
A contagem de avisos.
Errors
Nenhum.
12.1.3.59 mysql_commit()
my_bool mysql_commit(MYSQL *mysql)
Descrio ca
Faz um commits na transao atual. Dispon no MySQL 4.1 ca ivel
Valor Retornado
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
826
Erros
Nenhum.
12.1.3.60 mysql_rollback()
my_bool mysql_rollback(MYSQL *mysql)
Descrio ca
Faz um rollback na transao atual. Dispon no MySQL 4.1 ca ivel
Valor Retornado
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
Erros
Nenhum.
12.1.3.61 mysql_autocommit()
my_bool mysql_autocommit(MYSQL *mysql, my_bool mode)
Descrio ca
Dene o modo autocommit como ligado se mode 1, desligado se mode 0. e e
Valor Retornado
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
Erros
Nenhum.
12.1.3.62 mysql_more_results()
my_bool mysql_more_results(MYSQL *mysql)
Descrio ca
Retorna verdade se mais resultados da consulta atualmente em execuo existem, e a ca aplicao deve chamar mysql_next_result() para buscar os resultados. Dispon ca ivel no MySQL 4.1
827
Valor Retornado
TRUE (1) se existem mais resultados. FALSE (0) se no existem mais resultados. a Note que na maioria dos casos chama-se mysql_next_result() para se mais de um resultado existe e inicia o prximo resultado se ele existir. o Veja Seo 12.1.8 [C API multiple queries], Pgina 855. ca a Veja Seo 12.1.3.63 ca [mysql next result], Pgina 827. a
Erros
Nenhum.
12.1.3.63 mysql_next_result()
int mysql_next_result(MYSQL *mysql)
Descrio ca
Se existem mais resultados da consulta, mysql_next_result() l o prximo resultado da e o no MySQL 4.1 consulta e retorna o status a aplicao. Disponivel ca Note que voc deve chamar mysql_free_result() para a consulta anterior se ela retornar e um resultado. Depois de chamar mysql_next_result() o estado da conexo como se tivesse chamado a e mysql_real_query() para a prima consulta. Isto signica que voc agora pode chamar e mysql_store_result(), mysql_warning_count(), mysql_affected_rows() ... na conexo. a Se mysql_next_result() retorna um erro, nenhuma outra instruo ser executada e no ca a a haver mais resultado para buscar. a Veja Seo 12.1.8 [C API multiple queries], Pgina 855. ca a
Valor Retornado
0 em caso de sucesso e haver mais resultados. -1 se no houver mais resultados. > 0 se a ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. Por exemplo se voc no chamar mysql_use_result() para um resulatdo anterior. e a CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conexo ao servidor MySQL foi perdida durante a consulta. a
828
829
A estrutura MYSQL_BIND contm os seguintes membros para uso em aplicativos. e Cada um deles utiliza tanto a entrada quanto a sa ida, embora algumas vezes sejam para diferentes propsitos dependendo da direo da transfer6encia de o ca dados: enum enum_field_types buffer_type O tipo do buer. Os valores de buffer_type esto listados postea riormente nesta seo. Para entrada, buffer_type indica que tipo ca de valor voc est ligando a um parmetro de uma consulta. Para a e a a sa ida, ele indica que tipo de valor voc espera receber em um buer e de resultado. void *buffer Para entrada, este um ponteiro para o buer no qual os dados e de parmetros de uma consulta, esto armazenados. Para sa a a ida, ele um ponteiro para o buer no qual se deve retornar o valor e de uma coluna do resultado. Para tipos numricos, o buffer deve e apontar para uma varivel do tipo C apropriado. (Se voc estiver a e associando a varivel com uma coluna que tem o atributo UNSIGNED, a a varivel deve ser um tipo C unsigned.) Para colunas de tipo data a e hora, o buffer deve apontar para uma estrutura MYSQL_TIME. Para colunas do tipo caracter e string binria, o buffer aponta a para um buer de caracter. unsigned long buffer_length O tamanho atual de *buffer em bytes. Ele indica a quantidade mxima de dados que pode ser armazenado no buer. Para cara acteres e dados C binrios, o valor buffer_length especica o a tamanho do *buffer quando utilizado com mysql_bind_param(), ou o nmero mximo de bytes de dados que pode ser buscado em u a um buer quando usado com mysql_bind_result(). unsigned long *length Um ponteiro para uma varivel unsigned long que indica o nmero a u atual de bytes de dados armazenado em *buffer. length usado e usado para caracteres e dados C binrios. Para a ligao dos e a ca dados do parmetro de entrada, length aponta para uma varivel a a unsigned long que indica o tamanho do valor do parmetro ara mazenado em *buffer; isto usado pelo mysql_execute(). Se e o tamanho um ponteiro nulo, o protocolo assume que todos os e caracteres e dados binrios so terminados com null. a a Para ligao dos valores de sa mysql_fetch() coloca o tamanho ca ida, dos valores de coluna retornados na varivel para onde o *length a aponta. length ignorado por tipos de dados numricos e trmporais porque e e o tamanho do valord dos dados determinado pelo valor buffer_ e type.
830
bool *is_null Este membro aponta para uma varivel my_bool que verdadeiro a e se um valor NULL, falso se ele no NULL. Para entrada, dena e a e *IS_NULL como verdadeiro para indicar que voc est passando um e a valor NULL como um parmetro. Para saida, este valor verdadeiro a e se o valor de um resultado retornado de uma consulta NULL. e MYSQL_TIME Esta estrutura utilizada para enviar e receber dados DATE, TIME, DATETIME e e TIMESTAMP diretamente de e para o servidor. Isto feito congurando o membro e 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 contm os seguintes membros: e unsigned int year O ano. unsigned int month O ms do ano. e unsigned int day O dia do ms. e unsigned int hour A hora do dia. unsigned int minute O minuto da hora. unsigned int second Os segundos. my_bool neg Um parmetrio booleano para indicar se o tempo negativo. a e unsigned long second_part A parte fracionria do segundo. Este membro no atualmente a a e usado. Apenas aquelas partes de uma estrutura MYSQL_TIME que se aplica a um dado tipo de valor temporal so usados: Os elementos year, month e day so usados a a para valores DATE, DATETIME e TIMESTAMP. Os elementos hour, minute e second so usados para valores TIME, DATETIME e TIMESTAMP. Veja Seo 12.1.9 [C API a ca date handling], Pgina 856. a A seguinte tabela mostra os valores permitidos que podem ser especicados no membro buffer_type da estrutura MYSQL_BIND. A tabela tambm mostra aqueles tipos SQL que e correspondem mais proximamente a cada valor buffer_type, e, para tipos numricos e e temporais, o tipo C correspondente. buffer_type Valor MYSQL_TYPE_TINY MYSQL_TYPE_SHORT Tipo SQL TINYINT SMALLINT Tipo C char short int
831
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 converso de tipo implcita pode ser realizada em ambas a
long int long long int float double MYSQL_TIME MYSQL_TIME MYSQL_TIME MYSQL_TIME
as direes. co
832
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 posio do cursor de registro. ca Retorna o total de registros do resultado de uma instruo ca armazenada. Busca o prximo conjunto de dados do resultado e retorna o os dados para todas as colunas limites. Libera a memria usada pela instruo preparada. o ca Retorna o nmero de erro para a ultima instruo execuu ca tada. Retorna a mensagem de erro para a ultima instruo exe ca cutada. Retorna o cdigo de erro SQLSTATE para a execuo da o ca ultima instruo. ca Envia dados longos em blocos para o servidor.
Chama mysql_prepare() para preparar e iniciar o manipulador de instrues, mysql_bind_ co param() para fornecer os dados do parmetro e mysql_execute() para executar a consulta. a Voc pode repetir o mysql_execute() alterando o valor do parmetro no buer respectivo e a fornecido por mysql_bind_param(). Se a consulta uma instruo SELECT ou qualquer outra consulta que produz um resultado, e ca mysql_prepare() tambm retornar a informao dos meta dados do resultado na forma e a ca de um resultado MYSQL_RES atravs de um mysql_get_metadata(). e Voc pode forncer o buer de resultado usando mysql_bind_result(), assim mysql_ e fetch() retornar automaticamente os dados para este buer. Esta busca feita registro a e a registro. Voc tambm pode enviar o texto ou dado binrio em blocos para o servidor utilizando e e a mysql_send_long_data(), especcando a opo is_long_data=1 ou length=MYSQL_LONG_ ca DATA ou -2 na estrutura MYSQL_BIND fornecida com mysql_bind_param(). Quando a execuo for completada, o handler da instruo deve ser fechado usando mysql_ ca ca stmt_close() para que todos os recursos associados a ele sejam liberados. Se voc obteve os metadados de um resultado de uma instruo SELECT chamando mysql_ e ca get_metadata(), voc tambm deve liber-lo usando mysql_free_result(). e e a
Execution Steps:
Para prepara e executar uma instruo, uma aplicao: ca ca 1. Chama mysql_prepare() e passa uma string contendo uma instruo SQL. Em uma ca operao de preparo bem sucedida, o mysql_prepare retorna o manipulador de inca struo vlido para a aplicao. ca a ca
833
2. Se a consulta produz um resultado, chama mysql_get_metadata para obter o conjunto de resultado de metadados. Este metadado est na forma de um resultado, embora a um separado daqueles que contm as linhas retornadas pela consulta. O resultado de e metadados indica quantos colunas esto no resultado e contm informaes sobre cada a e co coluna. 3. Dene o valor de qualquer parmetro usando mysql_bind_param. Todos os parmetros a a devem ser denidos. De outra forma a execuo da consulta retornar um erro ou ca a produzir resultados inesperados. a 4. Chama mysql_execute() para executar a instruo. ca 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 no haver mais registros. e a 7. Repete os passos de 3 a 6 como necessrio, alterando o valor dos parmetros e rea a executando a instruo. ca Quando mysql_prepare() chamado, o protocolo cliente/servidor do MySQL realiza as e seguintes aes: co O servidor analiza a consulta e envia o status de OK de volta para o cliente atribuindo uma identicao de instruo. Ele tambm envia um nmero total de parmetros, uma ca ca e u a contagem de colunas e sua meta informao se for um resultado orientado a consulta. ca Toda a sintaxe e semntica da consulta vericada pelo servidor durante a chamada. a e O cliente utiliza esta identicao da instruo para as operaes adicionais, assim o ca ca co servidor pode identicar a instruo dentre outras existentes. O cliente tambm aloca ca e um manipulador de instrues com esta identicao e o retorna para a aplicao. co ca ca Quando o mysql execute() chamado, no protocolo cliente/servidor do MySQL realiza as e seguintes operaes: co O cliente utiliza o manipulador de instrues e envia o dado do parmetro para o co a servidor. O servidor identica a instruo usando a identicao fornecida pelo cliente, substitui ca ca o marcador do parmetro com o dado fornecido mais recente e executa a consulta. Se a a consulta produz um resultado, o servidor envia o dado de volta para o cliente. Seno a envia o status de OK como nmero total de registros alterados, deletados ou inseridos. u Quando mysql_fetch() chamado, no protocolo cliente/servidor do MySQL realiza as e seguintes aes: co O cliente l os dados do pacote registro por registro e o coloca no buer de dados da e aplicao fazendo as converses necessrias. Se o tipo do buer de aplicao o mesmo ca o a ca e do tipo do campo retornado do servidor, as converses so diretas. o a Voc pode obter o cdigo de erro, mensagens e o valor SQLSTATE da instruo utilizando e o ca mysql_stmt_errno(), mysql_stmt_error() e mysql_stmt_sqlstate() respectivamente.
834
12.1.7.1 mysql_prepare()
MYSQL_STMT * mysql_prepare(MYSQL *mysql, const char *query, unsigned long length)
Descrio ca
Prepara a consulta SQL apontada pela string com terminao em nulo query, e retorna um ca handle da instruo para ser usado por operaes adicionais na instruo. A consulta deve ca co ca consistir de uma unica instruo SQL. Voc no deve adicionar ponto e virgula (;) ou \g ca e a a instruo. ca A aplicao pode incluir um ou mais marcadores de parmetro na instruo SQL, embutindo ca a ca interrogaes (?) na string SQL na posio aprpriada. co ca Os marcadores s so vlidos em certos lugares na instruo SQL. Por exemplo, eles no o a a ca a so permitidos em lista VALUES() de uma instruo INSERT (para especicar valores para a ca uma linha ou em uma comparao com uma coluna em uma clusula WHERE para especicar ca a uma valor de comparao. No entanto, eles no so permitidos como identicadores (tais ca a a como nomes de colunas ou tabelas), na lista select que indica as colunas a serem retornadas por uma instruo SELECT), ou para especicar ambos operandos de um operador binrio ca a determinar como o sinal de igual =. A ultima restrio necessria porque seria impossivel ca e a o tipo do parmetro. Em geral, parmetros so vlidos somente em instruo de Linguagem a a a a ca de Manipulao de Dados (Data Manipulation Languange-DML), e no em instrues de ca a co Linguagem de Denio de Dados (Data Denation Language-DDL). ca Os marcadores de parmetro devem limitar variveis de aplicaes utilizando mysql_bind_ a a co param() antes de executar a instruo. ca
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 memria o CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
835
Se o preparo no obteve sucesso (isto , mysql_prepare() retorna um ponteiro NULL), as a e mensagens de erros podem ser obtidas chamando mysql_error().
Exemplo
Para o uso de mysql_prepare() consulte o exemplo de Seo 12.1.7.5 [mysql_execute()], ca Pgina 837. a
12.1.7.2 mysql_param_count()
unsigned long mysql_param_count(MYSQL_STMT *stmt)
Descrio ca
Retorna o nmero de marcadores de parmetros presentes na consulta preparada. u a
Valor Retornado
Um unsigned long (inteiro sem sinal) representando o nmero de parmetros em uma inu a struo. ca
Erros
Nenhum.
Exemplo
Para utilizar mysql_param_count() consulte o exemplo de Seo 12.1.7.5 [mysql_ ca execute()], Pgina 837. a
12.1.7.3 mysql_get_metadata()
MYSQL_RES *mysql_get_metadata(MYSQL_STMT *stmt)
Descrio ca
Se uma instruo passada para mysql_prepare() rproduziu um resultado, mysql_get_ ca metadata() retorna o resultado dos meta dados na forma de um ponteiro para uma estrutura MYSQL_RES que tambm pode ser usada para processar a meta informao como o nmero e ca u total de campos e informao de campos indiv ca 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()
836
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 acabar de us-lo. Voc pode e a e faz-lo passando para mysql_free_result(). E semelhante ao modo que voc libera um e e resulatdo chamado com mysql_store_result(). O resultado retornado por mysql_get_metadata() contm apenas metadados. Ele no e a contm qualquer resultado de registro. As linhas so obtidas usando o handle de instruo e a ca com mysql_fetch().
Valor Retornado
Uma estrutura de resultado MYSQL_RES. NULL se nenhuma meta informao existe para a ca consulta preparada.
Erros
CR_OUT_OF_MEMORY Falta de memria o CR_UNKNOWN_ERROR Ocorreu um erro desconhecido
Exemplo
Para utilizar mysql_get_metadata() [mysql_fetch()], Pgina 846 a consulte o exemplo de Seo ca 12.1.7.13
12.1.7.4 mysql_bind_param()
my_bool mysql_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind)
Descrio ca
mysql_bind_param() utilizado para ligar dados para os marcadores de parmetros na e a instruo SQL que foi passada para mysql_prepare(). Ele utiliza a estrutura MYSQL_BIND ca para fornecer os dados. bind o endereo de um vetor de estruturas MYSQL_BIND. A e c biblioteca cliente espera que o vetor deve contenha um elemento para cada marcador de parmetro ? que est presente na consulta. a a Suponha que voc prepare a seguinte instruo: e ca
837
INSERT INTO mytbl VALUES(?,?,?) Quando voc ligar os parmetros, o vetor da estrutura MYSQL_BIND deve conter trs elee a e mentos e pode estar declarado assim: MYSQL_BIND bind[3]; O membro de cada elemento MYSQL_BIND que deve estar congurado est descrito em a Seo 12.1.5 [C API Prepared statement datatypes], Pgina 828. ca a
Valor Retornado
Zeros se a ligao foi obtida com sucesso. Diferente de zero se ocorrer um erro. ca
Erros
CR_NO_PREPARE_STMT No existem instrues preparadas a co CR_NO_PARAMETERS_EXISTS No existem parmetros para ligar a a CR_INVALID_BUFFER_USE Indica se a ligao forncer dados longos em bolcos e se o tipo de buer binrio ca a e a ou no uma string. a e CR_UNSUPPORTED_PARAM_TYPE A converso no suportada. Possivelmente o valor de buffer_type invlido a a e e a ou no um dos tipos suportados listados acima. a e CR_OUT_OF_MEMORY Falta de memria o CR_UNKNOWN_ERROR Um erro desconhecido ocorreu.
Exemplo
Para utilizar mysql_bind_param() consulte o exemplo de Seo 12.1.7.5 [mysql_ ca execute()], Pgina 837. a
12.1.7.5 mysql_execute()
int mysql_execute(MYSQL_STMT *stmt).
Descrio ca
mysql_execute() executa a consulta preparada associada ao controlador de instrues. O co valor atual do marcador de parmetros enviado para o servidor durante esta chamada, e a e o servidor substituir marcadores com os novos dados fornecidos.
838
Se a instruo um UPDATE, DELETE ou INSERT, o nmero total de registros altrados, deleca e u tados ou inseridos pode ser encontrado chamando mysql_stmt_affected_rows(). Se este um resultado de uma consulta como SELECT, deve se chamar mysql_fetch() para buscar e dados previamente para fazer qualquer outra funo que resulte em um processamento de ca consulta. Para mais informaes sobre como buscar os resultados, consulte Seo 12.1.7.13 co ca [mysql_fetch()], Pgina 846 a
Valor Retornado
Zero se a execuo obteve sicesso. Diferente de zero se ocorreu um erro. O cdigo de erro e ca o a mensagem podem ser obtidas chamando mysql_stmt_errno() e mysql_stmt_error().
Erros
CR_NO_PREPARE_QUERY Nenhuma consulta preprada previamente para execuo ca CR_ALL_PARAMS_NOT_BOUND No forma fornecidos todos os dados de parmetros. a a CR_COMMANDS_OUT_OF_SYNC Os comando foram executados em uma ordem inpropriada. CR_OUT_OF_MEMORY Falta de memria o CR_SERVER_GONE_ERROR O servidor MySQL foi nalizado. CR_SERVER_LOST A conexo ao servidor MySQL foi perdida durante a consulta. a 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 varivel mysql considerada como um controlador de a e conexo vlido. a a #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(?,?,?)"
839
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); }
840
/* 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 */
*/
841
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 funes de instrues preparadas, veja co co tests/client_test.c. Este arquivo pode ser obtido em uma distribuio fonte ou do ca repositrio do Bitkeeper. o
842
12.1.7.6 mysql_stmt_affected_rows()
my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt)
Descrio ca
Retorna o nmero total de registros alterados, deletados ou inseridos pela ultima instruo u ca executada. Pode ser chamada imediatamente depois de mysql_execute() para instrues co UPDATE, DELETE ou INSERT. Para instrues SELECT, mysql_stmt_affected_rows() funco ciona como mysql_num_rows().
Valor Retornado
Um integer (inteiro) maior que zero indica o nmero de registros afetados ou retornados. u Zero indica que nenhum registro foi atualizado em uma instruo UPDATE, nenhum regitro ca coincidiu com a clusula WHERE na consulta ou que nenhuma consulta foi exeutada ainda. a 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 Seo 12.1.7.5 [mysql_ ca execute()], Pgina 837. a
12.1.7.7 mysql_bind_result()
my_bool mysql_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind)
Descrio ca
mysql_bind_result() usado para associar (ligar) colunas no resultados ao buer de dados e e buer de tamanho. Quando mysql_fetch() chamado para buscar dados, o protocolo e 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 o endereo de um vetor de estruturas MYSQL_BIND. A biblioteca cliente e c espera que o vetor contenha um elemento para cada coluna no resultado. Seno mysql_ a fetch() simplesmente ignorado os dados trazidos; os buers devem se sucientemente grande para guardar os dados, porque o protocolo no retorna dados em blocos. a Uma coluna pode ser limitada a qualquer hora, mesmo depois do resultado ter sido parcialmente recuperado. A nova ligao tem efeito ba prxima vez em que mysql_fetch() ca o
843
chamado. Suponha que uma aplicao liga a coluna em um resultado e chama mysql_ e ca fetch(). O protocolo cliente/servidor retorna dados em buers limitados. Agora suponha que a aplicao ligue a coluna a um diferente cojunto de buers, ento o protocolo no ca a a coloca os dados em um novo buer limitado at que a prxima chamada mysql_fetch() e o ocorra. Para ligar uma coluna, uma aplicao chama mysql_bind_result() e passa o tipo, o enca dereo e o endereo do buer do tamanho. Os membros de cada elemento MYSQL_BIND que c c deve ser congurado esto descritos em Seo 12.1.5 [C API Prepared statement datatypes], a ca Pgina 828. a
Valor Retornado
Zero se a ligao obteve sucesso. Diferente de zero se ocorreu um erro. ca
Erros
CR_NO_PREPARE_STMT No existe instrues preparadas a co CR_UNSUPPORTED_PARAM_TYPE A converso no suportada. Possivelmente o buffer_type invlido ou no a a e e a a na lista dos tipos de buers suportados CR_OUT_OF_MEMORY Falta de memria o CR_UNKNOWN_ERROR Ocorreu um erro desconhecido
Exemplo
Para utilizar mysql_bind_result() consulta o exemplo de Seo 12.1.7.13 [mysql_ ca fetch()], Pgina 846 a
12.1.7.8 mysql_stmt_store_result()
int mysql_stmt_store_result(MYSQL_STMT *stmt)
Descrio ca
Voc deve chamar mysql_stmt_store_result() para cada consulta que produz um resule tado com sucesso (SELECT,SHOW,DESCRIBE, EXPLAIN), e s se voc quiser armazenar todo o o e resultado no buer no cliente, assim que a chamada mysql_fetch() subsequente retornar os dados em buers. Voc necessrio chamar mysql_stmt_store_result() para outras consultas, mas se voc ee a e o zer, no causar nenhum dano ou queda de performance em todo caso. Voc pode a a e detectar se a consulta produziu um resultado vericado se mysql_get_metadata() retorna NULL. Para mais informaes consulte Seo 12.1.7.3 [mysql_get_metadata()], Pgina 835. co ca a
844
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 conexo ao servidor MySQL foi perdida durante a consulta. a 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)
Descrio ca
Busca um registro arbitrrio no resultado de uma instruo. O valor do offset um a ca e nmero de registro e deve estar na faixa de 0 a mysql_stmt_num_rows(stmt)-1. u Esta funo exige que a estrutura do resultado da instruo contenha todo o resultado da ca ca ultima 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)
845
Descrio ca
Dene o cursor de linha com um registro arbitrrio em um resultado de instruo. O valor a ca do offset um oset de registro e deve ser um valor retornado de mysql_stmt_row_tell() e ou mysql_stmt_row_seek(). Este valor no um nmero de linha; se voc quiser buscar um a e u e registro em um resultado usando um nmero de linha, utilize mysql_stmt_data_seek(). u Esta funo exige que a estrutura do resultado contenha todo o resultado da consulta, assim ca 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)
Descrio ca
Retorna a posio corrente do cursor de linha para o ultimo mysql_fetch(). Este valor ca pode ser usado como um argumento para mysql_stmt_row_seek(). Voc deve usar mysql_stmt_row_tell() somente depois de mysql_stmt_store_result(). e
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)
846
Descrio ca
Rertorna o nmero de registros no resultado. u O uso de mysql_stmt_num_rows() depende de se voc utilizou ou no mysql_stmt_store_ e a result() para armazenar todo o resultado no manipulador de instrues. co Se voc utilizou mysql_stmt_store_result(), mysql_stmt_num_rows() pode ser chamado e imediatamente.
Valor Retornado
O nmero de linhas no resultado. u
Erros
Nenhum.
12.1.7.13 mysql_fetch()
int mysql_fetch(MYSQL_STMT *stmt)
Descrio ca
mysql_fetch() retorna o prximo registro no resultado. Ele pode ser chamado apenas o 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 chamado e 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 so retornados para o apontador length. a Note que, todas as colunas devem ser limitadas pela aplicao antes de chamar mysql_ ca fetch(). Se um valor do dado buscado um valor NULL, o valor *is_null da estrutura MYSQL_BIND e correspondente contm VERDADEIRO (1). Seno, o dado e seu tamanho retornado nos e a e elementos *buffer e *length baseados no tipo de buer especicado pela aplicao. Cada ca tipo numrico e temporal tem um tamanho xo como mostrado na tabela a seguir. O e 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
847
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 Descrio ca Sucesso, o dado foi buscado para o buers de dados da aplicao. ca Ocorreu um erro. O cdigo e a mensagem de erro podem o ser obtidos chamando mysql_stmt_errno() e mysql_ stmt_error(). No existem mais registros/dados a
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 conexo ao servidor MySQL foi perdida durante a consulta. a CR_UNKNOWN_ERROR Um erro desconhecido ocorreu. CR_UNSUPPORTED_PARAM_TYPE O tipo de buer MYSQL_TYPE_DATE, MYSQL_TYPE_TIME, MYSQL_TYPE_ e DATETIME, ou MYSQL_TYPE_TIMESTAMP, mas o tipo de dado no DATE, TIME, a e DATETIME ou TIMESTAMP. Todos os outros erros de converso no suportada so retornados de mysql_ a a a 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
848
as duas linahs inseridas pelo exemplo mostrado em Seo 12.1.7.5 [mysql_execute()], ca Pgina 837.) A varivel mysql onsiderada como um handle de conexo vlido handle. a a c a a #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) {
849
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;
850
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]);
851
/* 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)
Descrio ca
Permite que um aplicao envie os dados dos parmetros para o servidor em partes (ou ca a blocos). Esta funo pode ser chamada vrias vezes parar enviar partes de valores de ca a dados binrios e caracteres para uma coluna, que deve do tipo TEXT ou BLOB. a parameter_number indica a qual parmetro o dado associado. Os parmetros so nua e a a merados comeando com 0. data um ponteiro para um buer contendo dados a serem c e enviados, e length indica a quantidade de bytes no buer.
852
Valor Retornado
Zero se os dados so enviados com sucesso para o servidir. Diferente de zero se ocorrer um a erro.
Erros
CR_INVALID_PARAMETER_NO Nmero de parmetro invlido u a a 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 varivel mysql considerada como um handle de conexo vlido. a e a a #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;
853
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 *)
Descrio ca
Fecha a instruo preparada. mysql_stmt_close() tambm desaloca o manipulador de ca e instrues apontado por stmt. co Se a instruo atual tiver resultados pendentes ou no lidos, esta funo os cancela para ca a ca que a prxima consulta possa ser executada. o
Valor Retornado
Zero se a instruo for liberada com sucesso. Diferente de zero se ocorrer um erro. ca
854
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 Seo 12.1.7.5 [mysql_ ca execute()], Pgina 837. a
12.1.7.16 mysql_stmt_errno()
unsigned int mysql_stmt_errno(MYSQL_STMT *stmt)
Descrio ca
Para a instruo especicada por stmt, mysql_stmt_errno() retorna o cdigo de erro para ca o a funo de instrues da API chamada mais recentemente. Um valor de retorno de zero ca co signica que no ocorreu nenhum erro. Nmeros de mensagens de erro do cliente esto a u a listadas no arquivo cabelho errmsg.h do MySQL. Nmeros de mensagens de erro do c u servidor esto listado no arquivo mysqld_error.h. Na distribuio fonte do MySQL voc a ca e pode encontrar uma lista completa de mensagens de erros e nmero de erros no arquivo u Docs/mysqld_error.txt. Os cdigos de erros do servidor tambm esto listados em o e a Seo 13.1 [Error-returns], Pgina 889. ca a
Valor Retornado
Um valor de cdigo de erro. Zero se no ocorreu erro. o a
Erros
Nenhum
12.1.7.17 mysql_stmt_error()
const char *mysql_stmt_error(MYSQL_STMT *stmt)
Descrio ca
Para a instruo especicada por stmt, mysql_stmt_error() retorna uma string terminada ca em null contendo a mensagem de erro para a funo de instruo da API chamada mais ca ca recentemente. Um string vazia ("") retornado se no ocorreu nenhum erro. Isto signica e a que os seguintes comandos so equivalentes: a
855
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 pode escolher mensagem de erros em diversas linguae gens.
Valor Retornado
Um string contendo a descrio do erro. Uma string vazia se no ocorrer erros. ca a
Erros
Nenhum
12.1.7.18 mysql_stmt_sqlstate()
const char *mysql_stmt_sqlstate(MYSQL_STMT *stmt)
Descrio ca
Para a intruo especicada por stmt, mysql_stmt_sqlstate(), retorna uma string terca minada em null contendo o cdigo de erro SQLSTATE para funo API de instrues o ca co preparadas mais recentemente chamada que tenha obtido sucesso ou falhado. O cdigo o de erro consiste de cinco caracteres. "00000" signica sem erros. Os valores so esa pecicados pelo ANSI SQL e ODBC. Para uma lista de valores poss iveis, veja Seo 13.1 ca [Error-returns], Pgina 889. a Note que nem todos os erros j esto mapeados para SQLSTATE. O valor "HY000" (erro a a geral) usado para erros no mapeados. e a
Valores Retornados
Uma string terminada em null contendo o cdigo de erro SQLSTATE. o
856
opo CLIENT_MULTI_STATEMENTS no parmetro do mysql_real_connect() quando abrir a ca a conexo. Voc tambm pode congur-la para uma conexo chamando mysql_set_server_ a e e a a option(MYSQL_OPTION_MULTI_STATEMENTS_ON) Por padro mysql_query() ou mysql_real_query() retornam apenas o status da primeira a 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))
857
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 endereo da estrutura c MYSQL_TIME na qual voc passr o valor temporal. e a 3. Preencha os membros da estrutura MYSQL_TIME que so apropriadas para o tipo de a valor temporal que voc est passando. e a Use mysql_bind_param() para ligar os dados do parmetro a instruo. Ento chame a ca a mysql_execute(). Para recuperar valores temporais, o procedimento similar, exceto pelo fato de que voc e e congura o membro buffer_type com o valor que voc espera receber e o membro buffer e com o endereo de uma estrutura MYSQL_TIME na qual o valor retornado deve ser colocado. c Use mysql_bind_results() para ligar o buer a instruo depois da chamada de mysql_ ca execute() e antes de buscar os resultados. Aqui est um exemplo simples que insere dados DATE, TIME e TIMESTAMP. A varivel mysql a a considerada como um handle de conexo vlido. e a a 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^metros */ a 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;
858
mysql_execute(stmt); ..
12.1.10.1 my_init()
void my_init(void)
Descrio ca
Esta funo precisa ser chamada uma vez pelo programa antes de se chamar qualquer ca funo do MySQL. Ela inicializa algumas varveis globais que o MySQL precisa. se voc ca a e est usando uma biblioteca cliente de thread segura, tambm ser feita uma chamada a a e a mysql_thread_init() para esta thread. Ela chamada automaticamente por mysql_init(), mysql_server_init() e e mysql_connect().
Valor Retornado
Nenhum
12.1.10.2 mysql_thread_init()
my_bool mysql_thread_init(void)
Descrio ca
Esta funo preisa aser chamada para cada thread criada para inicializar variveis espec ca a icas de threads. Ela automaticamente chamada por my_init() e mysql_connect(). e
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)
859
Descrio ca
Esta funo precisa ser chamada antes da chamada de pthread_exit() para liberar a ca memria alocada por mysql_thread_init(). o Note que a funo no chamada automaticamente pela biblioteca cliente. Deve ser ca a e chamada explicitamente para evitar perda de memria. o
Valor Retornado
Nenhum.
12.1.10.4 mysql_thread_safe()
unsigned int mysql_thread_safe(void)
Descrio ca
Esta funo indica se o cliente compilado como uma thread segura. ca e
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)
Descrio ca
Esta funo deve ser chamada uma vez no program usando o servidor embutido antes de ca se chamar qualquer iutra funo do MySQL. Ela inicia o servidor e inicializa qualquer ca subsistema (mysys, InnoDB, etc.) que o servidor utilize. Se esta funo no for chamada, o ca a programa ir falhar. Se voc estiver usando o pacote DBUG que vem com o MySQL, voc a e e deve chamar esta funo depois de ter chamado MY_INIT(). ca Os argumentos argc e argv so anlogos ao argumentos para o main(). O primeiro elemento a a de argv ignorado (ele contm normalmente, o nome do programa). por convenincia, argc e e e
860
pode ser 0 (zero) se no houver argumentos de linha de comando para o servidor. mysql_ a server_init() faz uma copia dos argumentos, assim seguro destruir argv ou groups e depois da chamada. A lista de strings terminadas em NULL em groups seleciona qual grupo no arquivo de opes co ser ativado. Veja Seo 4.1.2 [Arquivos de opes], Pgina 216. Por convenincia, groups a ca co a e deve ser NULL, caso no qual os grupos [server] d [emedded] estaro ativos. a
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)
Descrio ca
Esta funo deve ser chamada no programa depois de todas outra funes MySQL. Ela ca co naliza o srvidor embutido.
861
Valor Retornado
Nenhum.
12.1.12 D vidas e problemas comuns ao utilzar a API C u 12.1.12.1 Porque Algumas Vezes mysql_store_result() Retorna NULL Aps mysql_query() Returnar com Sucesso? o
E poss para mysql_store_result() retornar NULL seguida de uma chamda com sucesso ivel ao mysql_query(). Quando isto acontece, signica que uma da seguintes condies ocorreu: co Existe um falha no malloc() (por exemplo, se o resultado for muito grande). Os dados no podem ser lidos (ocorreu um erro na conexo). a a A consulta no retornou dados (por exemplo, ela era um INSERT, UPDATE, ou DELETE). a Voc sempre pode vericar se a instruo devia produzir um resultado no vazio chamando e ca a mysql_field_count(). Se mysql_field_count() retornar zero, o resultado est vazio e a a ultima consulta era uma instruo que no devia retorbar valor (por exemplo, um INSERT ou ca a um DELETE). Se mysql_field_count() retorna um valor diferente se zero, a instruo devia ca ter produzido um resultado no vazio. Veja a descrio da funo mysql_field_count() a ca ca para um exemplo. Voc pode testar um erro chamando mysql_error() ou mysql_errno(). e
862
863
Para clientes que utilizam arquivos de cabealho do MySQL, pode ser necessrio especicar a c a opo -I ao compil-los, (por exemplo, -I/usr/local/mysql/include), assim o compilador ca a pode encontrar o arquivo de cabealho. c Para o mostrado acima de forma simples no Unix, fornecemos o script mysql_config para voc. Veja Seo 4.9.11 [mysql_config], Pgina 370. e ca a Voc pode utiliz-lo para compila o cliente MySQL como a seguir: e a CFG=/usr/local/mysql/bin/mysql_config sh -c "gcc -o progname $CFG --cflags progname.c $CFG --libs" sh -c necessrio para fazer com que a sheel no trate a sa de mysql_config como uma e a a ida palavra.
864
Duas threads no podem enviar uma consaulta ao servidor MySQL ao mesmo tempo a na mesma conexo. Em particular, voc deve assegurar que entre um mysql_query() a e e mysql_store_result() nenhuma outra thread est usando a mesma conexo. a a Vrias threads podem acessr resultados diferentes que so recuperados com mysql_ a a a store_result(). Se voc utilizar mysql_use_result, voc ter que assegurar que nenhuma outra thread e e a est usando a mesma conexo at que o resultado seja fechado. No entanto, melhor a a e e para clientes em threads que compartilham a mesma conexo utilizar mysql_store_ a result(). Se voc quiser utilizar mltiplas threads na mesma conexo, voc deve ter uma trava e u a e mutex na combinao das chamadas mysql_query() e mysql_store_result(). Uma ca vez que mysql_store_result() esteja pronto, a trva pode ser liberada e outras threads podem utilizar a mesma conexo. a Se voc programa com threads POSIX, voc pode utilizar pthread_mutex_lock() e e e pthread_mutex_unlock() para estabelecer e liberar uma trava mutex. Voc precisa saber o seguinte se voc tiver uma thread que estiver chamando funes MySQL e e co que no criaram a conexo ao banco de dados MySQL: a a Quando voc chamar mysql_init() ou mysql_connect(), MySQL ir criar um varivel e a a especica da thread para a thread que utilizada pela bibklioteca de depurao (entre outra e ca coisas). Se voc chamar uma funo MySQL, antes da thread chamar mysql_init() ou mysql_ e ca connect(), a thread no ter as variveis espec a a a icas de thread necessrias alocadas e voc a e acabar nalizando com uma descarga de memria mais cedo ou mais tarde. a o Para fazer que as coisas funcionem suavemente voc tem que fazer o seguinte: e 1. Chama my_init() no inicio do seu programa se for chamar qualquer outra funo ca MySQL antes de chamar mysql_real_connect(). 2. Chame mysql_thread_init() no manipulador de thread antes de chamar qualquer outra funo MySQL. ca 3. Na thread, chame mysql_thread_end() antes de chamar pthread_exit(). Isto ir a liberar a memria usada pelas variveis espec o a icas da thread do MySQL. Voc pode obter alguns erros devido a s e imbolos indenidos ao ligar seu cliente com libmysqlclient_r. Na maioria dos casos isto ocorre por no estar inclu a biblioteca a ida de threads na linha de ligao/compilao. ca ca
12.1.15 libmysqld, a Biblioteca do Servidor Embutido MySQL 12.1.15.1 Viso Geral da Biblioteca do Servidor MySQL a Embutido
A biblioteca do servidor MySQL embutido torna poss executar um servidor MySQL com ivel todos os recursos dentro de uma aplicao cliente. Os principais benef ca icios so o aumento a de velocidade e o gerenciamento mais simples de aplicaes embutidas. co
865
A biblioteca do servidor embutido baseada na verso cliente/servidor do MySQL, que e a e escrita em C/C++. Consequentemente, o servidor embutido tambm escrito em C/C++. e e No h nenhum servidor embutido dispon em outra linguagem. a a ivel A API idntica para a verso embutida do MySQL e a verso cliente/servidor. Para alterar e e a a uma aplicao em thread antiga para utilizar a biblioteca embutida, voc normalmente s ca e o precisa adicionar chamadas as seguintes funes: co Funo ca mysql_server_ init() mysql_server_end() mysql_thread_ init() mysql_thread_end() Quando chamar Deve ser chamada antes de qualquer outra funo MySQL, de ca preferncia no inicio da funo main(). e ca Deve ser chamada antes da sa do programa. ida Deve ser chamada em cada thread que voc criar que acessar e a o MySQL. Deve ser chamada antes de se chamar pthread_exit()
Voc deve ligar seu cdigo com libmysqld.a em vez de libmysqlclient.a. e o As funes acima mysql_server_xxx tambm esto inclu co e a idas em libmysqlclient.a para permitir a troca entre a verso embutida e a clienete/servidor apenas ligando sua aplicao a ca na biblioteca certa. Veja Seo 12.1.11.1 [mysql_server_init()], Pgina 859. ca a
866
MYSQL *db_connect(const char *dbname); void db_disconnect(MYSQL *db); void db_do_query(MYSQL *db, const char *query);
867
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~o mysql. ca Voc^ pode usar mysql_server_init(0, NULL, NULL), e iniciar e o servidor usando os grupos = { "server", "embedded", NULL }. Em seu arquivo $HOME/.my.cnf file, voc^ provavelmente deseja colocar: e
[test_libmysqld_SERVER] language = /path/to/source/of/mysql/sql/share/english * claro que voc^ poderia modifcar argc e argv antes de pass-los E e a * a esta fun~o. Ou poder criar novos do modo que preferir. Mas ca a * todos os argumentos em argv (exceto argv[0], que o nome do e * programa) devem ser op~es vlidas para o servidor MySQL. co a * * Se voc^ ligar este cliente em um biblioteca mysqlclient e * normal, esta fun~o n~o far nada. ca a a */ 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~es mysql*/ co mysql_server_end(); exit(EXIT_SUCCESS); }
868
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 critico pois o servidor n~o aceitar as op~es do e a a co * 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;
869
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
870
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
871
Se voc quiser instalar MyODBC em um Unix, voc precisar de um gerenciador ODBC. e e a MyODBC funciona com a maioria dos gerenciadores ODBC para Unix. Para instalar MyODBC no Windows, voc deve baixar o arquivo MyODBC .zip apropriado, e descompact-lo com WinZip ou algum programa parecido e executar o arquivo SETUP.EXE. a No Windows/NT/XP voc pode obter o seguinte erro ao tentar instalar o MyODBC: e 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 que algum outro progrma est utilizando ODBC e pela forma que e a como o Windows feito, voc pode, neste caso, no estar apto a instalar um novo driver e e a ODBC com programa de instao do ODBC da Microsoft. Neste caso voc pode continuar ca e selecionando Ignore para copiar o resto dos aerquivos ODBC e a instalao nal deve ca funcionar. Se no funcionar, a soluo reinicializar seu computador em modo seguro a ca e (Escolhendo-o ao pressionar F8 assim que seu computador iniciar o Windows durante a reinicializao), instalar MyODBC, e reiniciar em modo normal. ca Para conectar a uma mquina Unix de uma mquina Windows, com uma aplicao a a ca ODBC (uma que no tenha suporte nativo as MySQL), voc deve primeiro instalar a e MyODBC em uma mquina Windows. a O usurio mquina Windows devem ter privilgios para acessar o servidor MySQL a e a e na mquina Unix. Isto pode ser feito om o comando GRANT. Veja Seo 4.4.1 [GRANT], a ca Pgina 254. a Voc deve criar uma entrada ODBC DSN como a seguir: e Abra o painel de controle na mquina Windows. a D um duplo clique no icone Fonte de Dados ODBC 32-bit. e Clique na seo Usurio DSN. ca a Clique no boto Adicionar. a Selecione MySQL na tela Criar Nova Fonte de Dados e clique no boto Finalizar. a A tela de congurao padro do Driver MySQL mostrada. Veja Seo 12.2.2 ca a e ca [Administrador ODBC], Pgina 871. a Agora inicie a sua aplicao e selcione o driver ODBC com o DSN que voc especicou ca e no adminitrador ODBC. Verique se h outra opo de congurao na tela do MySQL (trace, no pergunta ao a ca ca a conectar, etc) que voc possa tentar se ocorrerem problemas. e
872
194.216.84.21 meu_nome_maquina Congure o PC para utilizar DNS. Exemplo de como preencher a configura~o do ODBC. ca 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 qualquer nome que seja unico em sua congurao e ca ODBC Windows. Voc no precisa especicar valores para os campos Server, User, Password, ou Port ina e a tela de congurao do ODBC. No entanto, se voc o zer, os valores sero utilizados como ca e a padro posteriormente ao se tentar fazer uma nova conexo. Voc tem a opo de alterar a a e ca os valores neste momento. Se o nmero da porta no dado, a porta padro (3306) utilizada. u a e a e Se voc especicar a opo Read options from C:\my.cnf, os grupos client e odbc sero e ca a lidos do arquivo C:\my.cnf. Voc pode utilizar todas as opes que so uteis a mysql_ e co a options(). Veja Seo 12.1.3.40 [mysql_options()], Pgina 809. ca a
873
O cliente no pode aceitar que MyODBC retorne a largura real de uma coluna. a O clinete n pode aceitr que MySQL retorne o valor real de colunas afetadas. a Se este parmetro for denido o MySQL retornar registros encontrados. E a a necessriop o MySQL 3.21.14 ou posterior para funcionar. a 4 Faz um log de depurao em c:\myodbc.log. E o mesmo que colocar MYSQL_ ca DEBUG=d:t:O,c::\myodbc.log no AUTOEXEC.BAT 8 No dene nenhum limite de pacote para resultados e parmetros. a a 16 No faz perguntas mesmo se o driver quisesse. a 32 Simula um driver ODBC 1.0 em alguns contextos. 64 Ignora o uso do nome de banco de dados bancodedados.tabela.coluna 128 Fora o usa de cursores de gerenciadores ODBC (experimental). c 256 Disabilita o uso de busca estendida (experimental). 512 Completa campos CHAR para tamanho de coluna cheias. 1024 SQLDescribeCol() retrnar nome de colunas totalmente qualicados. a 2048 Usa o protocolo cliente/servidor comprimido. 4096 Diz ao seridor para ignorar espaos aps nome de funes e antes de ( c o co (necessrio para PowerBuilder). Torna todos os nomes de funes palavrasa co chaves! 8192 Conecta com named pipes ao servidor mysqld executando no NT. 16384 Altera colunas LONGLONG para colunas INT (algumas aplicaes no podem co a tratar LONGLONG). 32768 Retorna user como Table qualier e Table owner para SQLTables (experimental) 65536 L parametros dos grupos client e odbc no my.cnf e a 131072 Adiciona algumas vericaes extras de segurana (no deve ser necessrio, co c a a mas...) Se voc quiser ter muitas opes, voc deve somar os parmetros acima! Por exemplo, e co e a denir a opo como 12 (4+8) lhe permite debugar sem limite de pacotes. ca O MYODBC.DLL padro compilado para um rendimento otimizado. Se voc quiser depurar a e e o MyODBC (por exemplo, habiliatr o trace), voc deve utilizar MYODBCD.DLL. Para instalar e este arquivo copie MYODBCD.DLL sobre o arquivo MYODBC.DLL instalado.
1 2
874
S utilize campos double oat. Alguns programa podem falhar quando comparam o oats simples. Se o exposto acima no ajudar, voc deve fazer um arquivo de rastreamento do MyODBC e a e tentar encontrar o que est dando errado. a
875
Delete o link a tabela e o recrie. Ele ainda mostra o registro anterior como #DELETADO#, mas novos registros adicionados/atualizados sero mostrados apropriadamente. a Se voc ainda obter o erro Another user has changed your data depois e de adicionar uma coluna TIMESTAMP, o seguinte truque pode lhe ajudar: N`o utilize visualizar planilha de dados da tabela. Crie um formulario com a os campos que voc quer, e use visulizar planilha de dados de formulrio. e a Voc deve denir a propriedade DefaultValue para a coluna TIMESTAMP e com NOW(). Esta pode ser uma boa idia para oculta a coluna TIMESTAMP e da visualizao para que seus usurios no quem confusos. ca a a Em alguns casos, o Access pode gerar consultas SQL invlidas a que o MySQL no entende. Voc pode arrumar isto selecionando a e "Query|SQLSpecific|Pass-Through" no menu do Access. No NT o Access ir mostrar colunas BLOB como OLE OBJECTS. Se voc a e quiser colunas MEMO, voc deve alterar a coluna para TEXT com ALTER e TABLE. O Access no pode sempre tratar colunas DATE apropriadamente. Se voc a e tiver um problema com isto, mude as colunas para DATETIME. Se voc tiver no Acces um coluna denida como BYTE, o Access tentar e a export-la como TINYINT em vez de TINYINT UNSIGNED. Isto lhe tar proba a lemas se voc tiver valores > 127 na coluna! e
ADO
Quando voc est codicando com a API ADO e MyODBC voc precisa ter e a e ateno com algumas propriedades padres que no so suportadas pelo ca o a a servidor MySQL. Por exemplo, usando CursorLocation Property como adUseServer retornar de RecordCount Property um resultado de -1. Para a ter o valor correto, voc precisa denir esta propriedade a adUseClient, como e mostrado no cdigo VB abaixo: o 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 utilizar uma instruo SELECT COUNT(*) e ca para uma consulta parecida para obter a contagem de registros correta.
876
Active server pages (ASP) Voc deve usar a opo Return matching rows. e ca Aplicaes BDE co Para faze-las funcionar, voc deve denir os seguintes parmetros: Dont e a optimize column widths e Return matching rows. Borland Builder 4 Qaundo voc inicia uma consulta, voc pode utilizar a propriedade Active ou e e utilizar o mtodo Open. Note que Active ir iniciar automaticamente execue a tando uma consulta SELECT * FROM ... que pode no ser algo bom se suas a tabelas forem grandes. ColdFusion (No Unix) A seguinte informaes tirada da documentao do ColdFusion: co e ca Utilize a seguinte informao para congurar o ColdFusion Server para ca Linux para utilizar o driver unixODBC driver com MyODBC para fonte de dados MySQL. Allaire vericou que o MyODBC Verso 2.50.26 funciona com a MySQL Verso 3.22.27 e ColdFusion para Linux. (Quqlquer verso mais a a nova tambm deve funcionar.) Voc pode fazer o download do MyODBC em e e http://www.mysql.com/downloads/api-myodbc.html ColdFusion Verso 4.5.1 lhe permite utilizar o Administrador ColdFusion para a adicionar a fonte de dados MySQL. No entanto o driver no est inclu com a a ido o ColdFusion Verso 4.5.1. Antes que o driver MySQL aparecer na lista dropa down de fonte de dados ODBC, voc deve construir e copiar o driver MyODBC e para /opt/coldfusion/lib/libmyodbc.so. O diretrio Contrib contm o programa mydsn-xxx.zip que lhe permite o e construir e remover o arquivo de registro DSN para o driver MyODBC em aplicaes Coldfusion. co DataJunction Voc tem que alter-lo para uma sa VARCHAR em vez de ENUM, ja que ele e a ida exporta o ultimo de uma maneira que cause um grief no MySQL. Excel Funciona. Algumas dicas: Se voc tiver problema com datas, tente selecion-las como strings utie a lizando a funo CONCAT(). Por exemplo: ca 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 propsito de CONCAT() neste exemplo enganar o ODBC fazendo-o o e pensar que a coluna do tipo string. Sem o CONCAT(), ODBC sabe que e a coluna do tipo time e o Excel no entende isto. e a Note que este um bug do Excel, pois ele converte automaticamente uma e string para um time. Isto seria timo se a fonte fosse um arquivo texto, o mas se torna um erro quando a fonte e uma conexo ODBC que relata a tipos exatos para cada coluna.
877
Word Para recuperar os dados do MySQL para documentos Word/Excel, voc precisa e 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 boto insira banco de dados. a Pressione o boto Obter Dados. a No moemnto certo, pressione o boto Ms Query na tela Obter Dados. a No Ms Query crie uma Nova Fonte de Dados utilizando o arquivo DSN my. Selecione a nova consulta. Selecione as colunas que voc deseja. e Crie um ltro de desejar. Faa um Ordenao se quiser. c ca Selecione Enviar Dados para o Microsoft Word. Clique em Finalizar. Clique em Inserir dados e selecione os registros. Clique OK e voc ver os registros no seu documento Word. e a odbcadmin Pograma teste para ODBC. Delphi Voc deve utilizar o BDE Verso 3.2 ou mais atual. Veja a opo i Dont e a ca optimize column width ao conectar no MySQL. Aqui est um cdigo de Delphi potencialmente util que congura uma entrada a o ODBC e uma entrada BDE para para MyODBC (a entrada BDE exige de um Editor de Alias BDE que gratuito em um site Delphi Super Page. (Obrigado e a Bryan Brunton [email protected] 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);
878
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 verso 3.0. O unico problema conhecido que quando o a e esquema de tabelas alterado, os campos da consulta no so atualizados. e a a O BDE, no entanto, parece no reconhecer chaves primrias, apenas o a a indice PRIMARY, mas isto ser um problema. a Vision Voc deve utilizar a opco Return matching rows. e a
Visual Basic Para estar apto para habilitar uma tabela, voc deve denir uma chave primria e a para a tabela. Visual Basic com ADO no pode manipular inteiros grandes. Isto signica a que algumas consultas como SHOW PROCESSLIST no iro funcionar apropriadaa a mente. A correo deinir a opo OPTION=16384 na string de conexo ODBC ca e ca a ou congurar a opo Change BIGINT columns to INT na tela de conexo do ca a MyODBC. Voc pode desejar denir a opo Return matching rows. e ca VisualInterDev Se voc obtem o erro [Microsoft][ODBC Driver Manager] Driver does not e support this parameter a razo pode ser que voc tem um BIGINT em seu a e resultado. Tente denir a opo Change BIGINT columns to INT na tela de ca conexo do MyODBC. a Visual Objects Voc deve utilizar a opo Dont optimize column widths. e ca
879
880
ftp://support.mysql.com/pub/mysql/secret/. Somente ns da MySQL AB teremos o acesso ao arquivo que voc enviar, a seremos bem discretos com os dados! e Se voc pode criar um programa que tambm mostre este problema, nos envie ele tambm. e e e Se o programa funciona com algum outro servidor MySQL, voc deve fazer um arquivo de e log do MyODBC onde voc faz exatamente a mesma coisa no ouuto servidor SQL. e Lembre-se que quanto mais informaes voc nos fornecer, mais satisfatria ser a soluo co e o a ca encontrada para o problema!
O driver Resin JDBC, que pode ser encontrado em http://www.caucho.com/projects/jdbc-mysql/in Para informao, consulte qualquer documentao JDBC, alm das documentao dos proca ca e ca prietrios de cada driver para recursos espec a icos do MySQL.
881
882
ChopBlanks
Controla de o mtodo fetchrow_* elimina os espaos e c em branco. NUM_OF_PARAMS O nmero de colchetes em uma instruo preparada. u ca NULLABLE Quais colunas podem ser NULL. trace Realiza rastreamento para depurao. ca Mtodos e Atributos especicos do MySQL e Descrio ca O ultimo valor AUTO_INCREMENT. Quais colunas so valores BLOB. a Quais colunas so chaves. a Quais colunas so numricas. a e Quais colunas so chaves primrias. a a Quais colunas NAO PODEM ser NULL. Veja NULLABLE. O tamanho mximo das colunas. a O tamanho mximo das colunas presentes no a resultado. Nomes de colunas. Nmero de campos retornados. u Nome de tabelas no resultado. Todos os tipos de colunas
Mtodo/Atributos e mysql_insertid is_blob is_key is_num is_pri_key is_not_null length max_length NAME NUM_OF_FIELDS table type
Os mtodos Perl so descritos em maiores detalhes nas sees seguintes. Variveis usadas e a co a em mtodos que retornam valor tem estes signicados: e $dbh $sth $rc $rv Manipulador do Banco de Dados Manipulador da Instruo ca Cdigo de Retorno (geralmente um status) o Valor de Retorno (geralmente um contador de linhas)
Mtodos e Atributos DBI Portteis e a connect($data_source, $username, $password) Usa o mtodo connect para fazer uma conexo do banco de dados a fonte de e a dados. O valor $data_source deve comear com DBI:driver_name:. Exemplo c 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 usurio e/ou senha no so denidos, DBI usa os valores das a a a variveis de anbiente DBI_USER e DBI_PASS, respctivamente. Se voc no esa e a pecicar um nome de mquina, ele utiliza o padro localhost. Se voc no a a e a especicar um nmero de porta, ele utiliza a porta padro do MySQL(3306). u a At o Msql-Mysql-modules Verso 1.2009, o valor $data_source permitia ala a guns modicadores:
883
mysql_read_default_file=file_name L file_name como um arquivo de opo. Para informao sobre e ca ca arquivo de opes veja Seo 4.1.2 [Option les], Pgina 216. co ca a mysql_read_default_group=group_name O grupo padro ao se ler uma arquivo de opes , normalamente, a co e o grupo [client]. Especicando a aopo mysql_read_default_ ca group, o grupo padro se torna o grupo [group_name]. a mysql_compression=1 Utiliza comunicao compactada enter o cliente e o servidor ca (MySQL Verso 3.22.3 ou posterior). a mysql_socket=/path/to/socket Especica o caminho do socket Unix que utilizado para se conectar e ao servidor (MySQL Verso 3.21.15 ou posterior). a Mliplos modicadores podem ser dados. Cada um deve ser precedido de ponto u e v irgula. Por exemplo, se voc quiser evitar colocar o nome de usurio e senha em um e a script DBI, voc pode busc-los em um arquivo de opo ~/.my.cnf do usurio e a ca a ao invs de escrever a sua chamada connect desta forma: e $dbh = DBI->connect("DBI:mysql:$database" . ";mysql_read_default_file=$ENV{HOME}/.my.cnf", $user, $password); Esta chamado ir ler opes dinidas pelo grupo [client] no arquivo de opes. a co co Se voc quiser fazer a mesma coisa mas utilizar opes especicadas no grupo e co [perl], voc pode fazer: e $dbh = DBI->connect("DBI:mysql:$database" . ";mysql_read_default_file=$ENV{HOME}/.my.cnf" . ";mysql_read_default_group=perl", $user, $password); disconnect O mtodo disconnect disconecta o manipulador de banco de dados do banco e de dados. Ele normalmente chamado pouco antes de voc sair do programa. e e Exemplo: $rc = $dbh->disconnect; prepare($statement) Prepara uma instruo SQL para execuo pelo mecanismo de banco de dados ca ca e retorna um manipulador de instruo ($sth), que voc pode utilizar para ca e chamar o mtodo execute. e Normalmente voc manipula a instruo SELECT (e instrues do tipo SELECT e ca co tais como SHOW, DESCRIBE, e EXPLAIN) atravs de prepare e execute. Exemplo: e $sth = $dbh->prepare($statement) or die "Cant prepare $statement: $dbh->errstr\n"; Se vo quiser ler grandes resultados em seu cliente, voc pode dizer ao Perl para e e utilizar mysql_use_result() com:
884
my $sth = $dbh->prepare($statement { "mysql_use_result" => 1}); execute O mtodo execute executa um instruo preparada. Para instruo noe ca ca a SELECT, execute retorna o nmero de linha afetadas. Se nenhuma linha foi u afetada, execute retorna "0E0", que o Perl trata como zero mas considera com true. Se um erro ocorrer, execute retorna undef. Para instrues SELECT, co execute apenas inicia a consulta SQL no banco de dados; voc precisa utilizar e um dos mtodos de fetch_* descritos aqui para recuperar dados. Exemplo: e $rv = $sth->execute or die "cant execute the query: " . $sth->errstr;
do($statement) O mtodo do prepara e executa uma instruo SQL e retorna o nmero linhas e ca u afetadas. Se nenhuma lina for afetada, do retorna "0E0", que o Perl trata como zero mas considera como true (verdadeiro). Este mtodo geralmente usado e e por instrues no-SELECT que no podem ser preparadas previamente (devida co a a a limitaes do driver) ou que no precisa ser esecutada mais que uma vez co a (inserts, deletes, etc.). Exemplo: $rv = $dbh->do($statement) or die "Cant execute $statement: $dbh- >errstr\n"; Geralamente a instruo do mais rpida (e prefer ca e a ivel) que prepare/execute para instrues que no contm parmetros. co a e a quote($string) O mtodo quote usada para "escapar" qualquer caracter especial contido na e e string e para adcionar as aspas necessrias na sa a ida. Exemplo: $sql = $dbh->quote($string) fetchrow_array Este mtodo busca a prxima linha de dados e a retorna como um vetor de a o valores de campo. Exemplo: while(@row = $sth->fetchrow_array) { print qw($row[0]\t$row[1]\t$row[2]\n); } fetchrow_arrayref Este mtodo busca a prxima linha de dados e a retorna como uma referncia e o e 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 mtodo busca uma linha de dados e retorna uma referncia a uma tabela e e hash contendo pares nome de campos/valores. Este mtodo no to eciente e a e a quanto utilizar referncias a vetor como demostrado acima. Exemplo: e while($hash_ref = $sth->fetchrow_hashref) { print qw($hash_ref->{firstname}\t$hash_ref->{lastname}\t\ $hash_ref->{title}\n);
885
} fetchall_arrayref Este mtodo usado para obter todos os dados (linhas) a serem retornados e e de uma instruo SQL. Ele retorna uma referncia a um vetor de referncias ca e e a vetores para cada linha. Voc acessa ou imprime dados utilizando um loop e 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 buscado para este manipulador de instruo. a ca Voc chama este mtodo para liberar o manipulador de instruo e qualquer e e ca recuros de sistema associado a ele. Exemplo: $rc = $sth->finish; Retorna o nmero de linhas alteradas (atualiadas, deletadas, etc.) pelo ultimo u comando. Ele normalmente utilizado aps uma instruo execute noe o ca a SELECT. Exemplo: $rv = $sth->rows; Retorna uma referncia a um vetor de valores que indicam se colunas podem e conter valores NULL. Os valores poss iveis para cada element do vetor 0 ou e uma string vazia se a coluna no puder ser NULL, 1 se puder e 2 se a o estado a NULL da coluna desconhecido. Exemplo: e $null_possible = $sth->{NULLABLE};
rows
NULLABLE
NUM_OF_FIELDS este atributi indica o nmero de campos retornados pela instruo SELECT ou u ca SHOW FIELDS. Voc pode us-la para vericar se uma instruo retornou um ree a ca sultado: Um valor zero indica uma intruo no-SELECT como INSERT, DELETE, ca a ou UPDATE. Exemplo: $nr_of_fields = $sth->{NUM_OF_FIELDS}; data_sources($driver_name) Este mtodo retorna um vetor contendo o nome dos bancos de dados dispon e iveis no servidor MySQL na mquina localhost. Exemplo: a @dbs = DBI->data_sources("mysql"); ChopBlanks Este atributo determina se o mtodo fetchrow_* ir apagar espaos em branco e a c no inicio ou no m dos valores retornados. Exemplo: $sth->{ChopBlanks} =1;
886
trace($trace_level) trace($trace_level, $trace_filename) O mtodo trace habilita ou disabilita o rastreamento. Quando chamado como e um mtodo da classe DBI, ele afeta o rastreamento em todos os manipuladores. e Quando chamado como um mtodo do manipulador de banco de dados ou e de instruo, ele afeta o rastreamento para o manipulador dado (e qualquer ca lho futuro do manipulador). Denir $trace_level com 2 fornece detalhes da informao do rastreamento. Denir $trace_level com 0 desabilita o rastreaca mento. A sa do rastreamento vai para a sa padro de erros por padro. Se ida ida a a $trace_filename for esecicado, o arquivo aberto no modo append e a sa e ida para todos manipuladores rastreados traced handles escrita neste arquivo. e 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~es co Voc tambm pode habilitar o rastreamento DBI congurando a varivel de e e a ambiente DBI_TRACE. Congur-la com um valor numrico o mesmo que a e e chamar DBI->(value). Congur-la com um caminhao o mesmo que chamar a e DBI->(2,value). Mtodos e Atributos Especicos do MySQL e Os mtodos mostrados aqui so espec e a icso do MySQL e no so parte do padro DBI. a a a Diversos mtodos j esto obsoletos: is_blob, is_key, is_num, is_pri_key, is_not_null, e a a length, max_length, e table. Quando existir uma alternativa no padro DBI, ela ser a a listada aqui: mysql_insertid Se voc utilizar o recurso AUTO_INCREMENT do MySQL, os novos valores autoe increment sero armazenados aqui. Exemplo: a $new_id = $sth->{mysql_insertid}; Com verses antigas da interface DBI, voc pode usar $sth->{insertid}. o e is_blob Retorna uma referncia a um vetor de valores booleanos; para cada elemento e do vetor, um valor TRUE indica que a respectiva coluna um BLOB. Exemplo: e $keys = $sth->{is_blob}; is_key Retorna um referncia a um vetor de valores booleanos; para cada elemento do e vetor, um valor de TRUE indica que a coluna respectiva uma chave. Exemplo: e $keys = $sth->{is_key}; is_num Retorna uma referncia a um vetor de valores booleanos; para cada elemento e do vetor, um valor de TRUE indica que a coluna respectiva contm valores e numricos. Exemplo: e $nums = $sth->{is_num};
887
is_pri_key Retorna uma referncia a um vetor de valores booleanos; para cada elemento do e vetor, um valor de TRUE indica que a respectiva coluna uma chave primria. e a Exemplo: $pri_keys = $sth->{is_pri_key}; is_not_null Retorna uma referncia para um vetor de valores booleanos; para cada elemento e 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 obsoleto; prefer utilizar o atributo NULLABLE (descrito a e ivel acima), porque ele um padro DBI. e a length max_length Cada um destes mtodos retornam uma refercia a um vetor com tamanho de e e colunas. O vetor length indica a tamanho mximo que cada coluna pode ter a (como declarado na descrio da tabela). O vetor max_length indica o tamanho ca mximo presente atualmente no resultado. Exemplo: a $lengths = $sth->{length}; $max_lengths = $sth->{max_length}; NAME table type Retorna um referncia a um vetor de nomes de colunas. Exemplo: e $names = $sth->{NAME}; Retorna um referncia a um vetor de nomes de tabelas. Exemplo: e $tables = $sth->{table}; Retorna uma referncia a um vetor com tipos de colunas. Exemplo: e $types = $sth->{type};
888
889
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
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
891
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
892
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
893
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
894
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
895
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
896
14 Estendendo o MySQL
14.1 MySQL Internals
Este cap itulo descreve vrias coisas que voc precisa saber ao trabalhar no cdigo do a e o MySQL. Se voc planeja contribuir com o desenvolvimento do MySQL, quiser ter acesso ao e cdigo entre verses, ou apenas deseja acompanhar o desenvolvimento, siga as instrues o o co em Seo 2.3.4 [Instalando a rvore de fontes], Pgina 100. Se voc est interessada nos ca a a e a MySQL internals, voc tambm deve se inscrever na nossa lista de emails internals. Esta e e lista relativamente de baixo trco. Para detalhes de como se inscrever, por favor veja e a Seo 1.7.1.1 [Mailing-list], Pgina 33. Todos os desenvolvedores na MySQL AB esto na ca a a lista internals e ns ajudamos outras pessoal que esto trabalhando no cdigo MySQL. o a o Esteja a vontade de utilizar esta tanto para perguntas sobre o cdigo qunato para enviar o patches com os auqis voc gostaria de contribui no projeto MySQL! e
897
parte dispon ivel publicamente de nosso processo de teste consistia de um teste crashme, um benchamrk Perl DBI/DBD encontrado no diretrio sql-bench e testes variadaos o localizadaos no diretrio tests. A falta de um um pacote de teste padronizado dispon o ivel publicamente tem criado diculdade para nosso usurios e para nossos desenvolvedores de a fazer teste de regresso no cdigo do MySQL. Para resolver este problema, ns criamos a o o um novo sistema de teste que inclu nas distribuies fonte e binria do Unix a partir e ido co a da verso 3.23.29. Os testes podem ser executados no Unix ou no Windows usando um a ambiente Cygwin. Eles no podem ser executados em um ambiente Windows nativo. a O conjunto de testes de atual no testa tudo no MySQL, mas deve pegar os bugs mais bvios a o no cdigo de processamento SQL, detalhes de SO/biblioteca, e bem compleo em teste de o e replicaes. Nosso objetivo eventual ter os testes cobrindo 100% do cdigo. Contibuies co e o co para o nosso pacote de teste so benvindas. Voc pode desejar contribuir com testes que a e examinam a funcionalidade critica ao seu sistema, o que ir assegurar que todas as futuras a verses do MySQL iro funcionar bem com suas aplicaes. o a co
898
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 fcil de gerar o arquivo resultante executar mysqltest -r < a e t/test-case-name.test do diretrio mysql-test, e ento editar o arquivo resultante o a gerado e, se necessrio, ajust-los a sa esperada. Neste caso, tenha cuidado de no a a ida a adicionar ou deletar quaisquer caracteres invis iveis - tenha certeza de apenas alterar o texto e/ou adicionar linhas deletadas. Se voc tiver que inserir uma linha, esteja certo e que os campos so separados com tabulao e que h uma tabulao no nal. Voc a ca a ca e pode querer utilizar od -c para ter certeza que seu editor de texto no bagunu nada a co durante a edio. Ns, claro, esperamos que voc nunca tenha que editar a sa de ca o e e ida mysqltest -r j que voc s dever faz-lo quando encontra um bug. a e o a e Para estar consistente com a nossa congurao, voc deve colocar seus arquivos ca e de resultados no diretrio mysql-test/r e o nomeie como test_name.result. Se o o teste produzir mais de um resultado, voc deve usar test_name.a.result, test_ e name.b.result, etc. Se uma instruo retornar um erro, voc eve espacicar na linha anterior a instruo ca e ca com --error error-number. O nmero do erro pode ser uma lista de nmeros de erros u u poss iveis separados com ,. Se voc estiver escrevendo em teste de replicao, voc deve coloca source e ca e include/master-slave.inc; na primeira linha do arquivo. Para trocar entre master e slave, utilize connection master; e connection slave;. se voc precisar fazer e alguma coisa em uma conexo alternativa, voc pode fazer connection master1; a e para o master e connection slave1; para o slave. Se voc precisar fazer alguma coisa em um loop, voc pode usar algo assim: e e let $1=1000; while ($1) { # do your queries here dec $1; } Para dormir entre consultas, use o comando sleep. Ele suporta fraes de um seco gundo, assim voc pode fazer sleep 1.3;, por exemplo, para dormir 1.3 segundos. e Para executar o slave com opes adicionais para o seu caso de teste, coloque-os na co 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 tiver uma questo sobre o pacote de testes, ou tiver um caso de teste para e a contribuir, envie um e-mail para lista de email internals do MySQL. Veja Seo 1.7.1.1 ca [Mailing-list], Pgina 33. Como a lista no aceita anexos, voc deve utilizar o ftp para a a e enviar os arquivos relevantes: ftp://support.mysql.com/pub/mysql/Incoming/
899
informaes sobre o seu sistema e a verso do MySQL. Veja Seo 1.7.1.3 [Relato de co a ca Erros], Pgina 36. a Esteja certo de inluir a sa de mysql-test-run, assim como o contedoi de todos os ida u arquivos .reject no diretrio mysql-test/r. o Se um pacote de teste falhar, verique se o teste tambm falha quando executado e sozinho: cd mysql-test mysql-test-run --local test-name Se falhar, voc deve congurar o MySQL com --with-debug e executar mysql-teste run com a opo --debug. Se into tambm falhar envie o arquivo de rastreamento ca e var/tmp/master.trace para ftp://support.mysql.com/pub/mysql/secret assim ns o podemos examin-los. Por favor, se lembre de tambm incluir uma descrio completa a e ca do seu sistema, a verso do binrio do mysqld e como voc o compilou. a a e Tente tambm executar mysql-test-run com a opo --force para ver se h qualquer e ca a outro teste que tenha falhado. Se voc prprio compilou o MySQL, verique nosso manual sobre como compilar o e o MySQL na sua platforma ou, de preferncia, use um dos binrios que ns compilamos e a o para voc no http://www.mysql.com/downloads/. Todos os seus binrios padres e a o devem passar no pacote de teste! Se voc obter um erro, como Result length mismatch ou Result content mismatch, e signica que a sa do teste no igual a sa esperada. Este pode ser um bug no ida a e ida MySQL ou que o seu verso do mysqld produz resultados um pouco diferentes sobre a certas circuntncias. a Resultado de testes que falharam so colocados em um arquivo com o mesmo nome a base que o arquivo de resultado com a extenso .reject. Se o seu caso de teste est a a falhando, voc deve fazer um di nos dois arquivos. Se voc no puder ver como els e e a so diferentes, examine ambos com od -c e tamb verique os seus tamanhos. a e Se um teste falhar totalmente, voc deve vericar os arquivos de log no diretrio mysqle o test/var/log para avisos sobre o que deu errado. Se voc tiver compilado o MySQL com depurao voc pode tentar depur-lo execue ca e a tando mysql-test-run com a opes --gdb e/ou --debug. Veja Seo E.1.2 [Criando co ca arquivos de rastreamento], Pgina 1080. a Se voc no tiver compilado o MySQL com depurao voc deve, provavelmente, faz-lo. e a ca e e Apenas especique a opo --with-debug no configure! Veja Seo 2.3 [Instalando ca ca o Fonte], Pgina 94. a
900
Voc pode adicionar as funes como uma funo nativa do MySQL. Funes nativas e co ca co so compiladas no servidor mysqld e cam dispon a iveis em uma base permanente. Cada mtodo tem suas vantagens e desvantagens: e Se voc escreve uma funo denida pelo usurio, voc deve instalar o arquivo objeto e ca a e no seu servidor. Se voc compilou a sua funao dentro do servidor voc no precisar e c e a a fazer isto. Voc pode adicionar UDFs para um distribuio binria MySQL. Funes nativas exe ca a co igem que voc modique a sua distribuio fonte. e ca Se voc atualizar a sua ditribuio MySQL, voc pode continuar a usar a sua UDF e ca e previamente instalada. Para funes nativas, voc deve repetir as suas modicaes a co e co cada vez que voc atualizar. e Seja qual for o mtodo que voc utilizou para adicionar novas funes, eles podem ser usados e e co como funes nativas tais como ABS() ou SOUNDEX(). co
901
arquivo sql/udf_example.cc que denem 5 novas funes. Consulte este arquivo para co ver como a conveno de chamadas UDF funciona. ca Para o mysqld estar apto a usar funes UDF, voc deve congurar o MySQL com --withco e mysqld-ldflags=-rdynamic. A razo que para muitas plataformas (incluindo Linux) a e voc pode carregar uma biblioteca (com dlopen()) de um programa ligado estaticamente, e que voc teria se estivesse usando --with-mysqld-ldflags=-all-static. Se voc quiser e e 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 deve ligar o programa com e -rdynamic (veja man dlopen). Se voc estiver usando uma verso precompilada do servidor, use o MySQL-Max, que sue a porta carregamento dinmico. a Para cada funo que voc deseja usar nas instrues SQL, voc deve denir funes C ca e co e co (ou C++) correspondente. Na discusso abaixo, o nome xxx usado um nome de funo a e ca exemplo. Para distinguir entre o uso de SQL e C/C++, XXX() (maiscula) indica a chamada u da funo SQL e xxx() (minscula) indica da chamada da funo C/C++. ca u ca Aa funes C/C++ que voc escreve para implemmentar a interface para XXX() so: co e a xxx() (exigido) A funo principal. E onde o resultado da funo computado. A correca ca e spondncia entre o tipo SQL e o tipo retornado da sua funo C/C++ mostrada e ca e aqui: Tipo SQL Tipo C/C++ STRING char * INTEGER long long REAL double xxx_init() (opcional) A funo de inicializao para xxx(). Ela pode ser usada para: ca ca Verica o nmero de argumentos para XXX(). u Verica se os argumentos so de um tipo exigido ou, alternativamente, diga a ao MySQL para converter os argumentos para o tipo desejado quando a funo principal chamada. ca e Aloca a memria exigida pela funo principal. o ca Especica o tamanho mximo do resultado. a Especica (para funes REAL) o nmero mximo de decimais. co u a Especica se o resultado pode ser NULL. xxx_deinit() (opicional) A funo de nalizao para xxx(). Ela deve liberar qualquer memria alocada ca ca o pela funo de inicializao. ca ca Quando uma instruo SQL invoka XXX(), o MySQL chama a funo de inicializao xxx_ ca ca ca init() para realizar qualquer congurao necessria, tais como vericao de argumentos ca a ca e alocao de memria. Se xxx_init() retorna um erro, a instruo SQL abortada com ca o ca e uma mensagem e as funes principais e de nalizao no so chamadas. Seno, a funo co ca a a a ca principal xxx() chamada uma vez para cada linha. Depois de todas as linhas tiverem e
902
sido processadas, a funo de nalizao xxx_deinit() chamada, podendo assim realizar ca ca e qualquer limpeza. Para funes agregadas (como SUM()), voc tambm deve fornecer as seguintes funes: co e e co 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 funes agregadas alocarem a memria necessria para co o a armazenar os resultados. 2. Ordena a tabela de acordo com a expresso GROUP BY. a 3. Para a primeira linha em um novo grupo, chama a funo xxx_reset(). ca 4. Para cada nova linha que pertence ao mesmo grupo, chame a funo xxx_add(). ca 5. Quando o grupo muda ou depois da ultima linha ter sido processada, chame xxx() para obter o resultado para o conjunto. 6. Repita 3-5 at que todas as linhas tenham sido processada. e 7. Chame xxx_deinit() para deixar a UDF liberar a memria alocada. o Todas as funes devem ser seguras com thread (no apenas a funo principal, mas tambm co a ca e as funes de inicializao e nalizao). Isto signica que voc no tem permisso para co ca ca e a a alocar qualquer varivel global ou esttica que alterou! Se voc precisa de memria, voc a a e o e deve aloc-la em xxx_init() e liber-la em xxx_deinit(). a a
903
O parmetro initid passado para todas as trs funes. Ela aponta para uma estrutura a e e co UDF_INIT que usada para passar informaes entre as funes. Os membros da estrutura e co co UDF_INIT so listados abaixo. A funo de inicializao deve estar em todos os menbros a ca ca que desejam ser alterados. (Para utilizar o padro para um membro, deixe-o inalterado.): a my_bool maybe_null xxx_init() deve denir maybe_null com 1 se xxx() pode retornar NULL. O valor padro 1 se qualquer um dos argumentos so declarados como maybe_ a e a null. unsigned int decimals Nmero de decimais. O valor padro o nmero mximo de deciamis no u a e u a argumento passado na funo principal. (Por exemplo, se a funo passada ca ca e function is passed 1.34, 1.345 e 1.3, o padro seria 3, pois 1.345 tem 3 a decimais. unsigned int max_length O tamanho mximo de um resultado string. O valor padro difere dependendo a a do tipo de resultado da funo. Para funes strings, o padro o temanho ca co a e do maior argumento. Para funes do tipo inteiro, o padro 21 digitos. Para co a e funes do tipo real, o padro 13 mais o nmero de decimais indicados por co a e u initid->decimals. (Para funes numricas, o tamanho inclui qualquer carco e acter de sinal ou ponto decimal.) Se voc quiser retornar um blon, voc pode den com 65K ou 16M; esta e e i-lo memria no alocada, mas usada para decidir qual tipo de coluna utilizar se o a e houver necessidade dese armazenar dados temporrios. a char *ptr Um ponteiro que a funo pode usar para o seus propsitos. Por exemplo, ca o funes pode usar initid->ptr para comunicar memrias alocadas entre co o funes. Na xxx_init(), aloca a memria e a atribui a este ponteiro: co o initid->ptr = allocated_memory; Em xxx() e xxx_deinit(), se rera a initid->ptr para usar ou liberar a memria. o
904
A seguinte funo s exigida pelo MySQL 4.1.1 e acima: ca o e char *xxx_clear(UDF_INIT *initid, char *is_null, char *error); Esta funo chamada quando o MySQL precisa de zerar o resumo dos resultados. Ele ca e ser chamado no comeo de cada grupo novo mas tambm pode ser chamado para zerar os a c e valores para uma consulta que no tiver registros coincidentes. is_null ser denido para a a apontar para CHAR(0) antes de chamar xxx_clear(). Voc pode usar o ponteiro error para armazenar um byte se alguma coisa der errado. e char *xxx_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error); Esta funo chamada por todas as linhas que pertencem ao mesmo grupo, exceto na ca e primeira linha. Nesta voc deve adicionar o valor em UDF ARGS a sua variavel sumria e a interna. A funo xxx() deve ser declarada da mesma forma que voc dene uam funo UDF ca e ca simples. Veja Seo 14.2.2.1 [Chamando UDF], Pgina 902. ca a A funo chamada quando todas as linhas no grupo tem sido processada. Normamente ca e voc nunca deve acessar a varivel args aqui mas retornar o seu valor baseado em sua e a varivel sumria interna. a a Todos os argumentos processados em xxx_reset() e xxx_add() devem ser feito de forma idntica as UDFs normais. Veja Seo 14.2.2.3 [Argumentos UDF], Pgina 904. e ca a O tratamento do valor de retorno em xxx() deve ser feito de forma idntica a uma UDF e normal. Veja Seo 14.2.2.4 [Valores de retorno UDF], Pgina 906. ca a O argumento ponteiro para is_null e error o mesmo para todas as chamadas xxx_ e reset(), xxx_clear(), xxx_add() e xxx(). Voc pode utilizar isto para lembrar que voc e e obteve um erro ou se a funo xxx() deve retornar NULL. Note que voc no deve armazenar ca e a uma string em *error! Ela um parmetro de apenas 1 byte! e a is_null zerado para cada grupo (antes de chamar xxx_clear()). error nunca zerado. e e Se isnull ou error so denidos depois de xxx() ento o MySQL retornar NULL como o a a a rsultado para a funo do grupo. ca
905
enum Item_result *arg_type Os tipos para cada argumento. Os valores de tipos poss iveis so STRING_ a RESULT, INT_RESULT, e REAL_RESULT. Para ter certeza que os argumentos so de um tipo dado e retornar um erro se a no forem, verique o vetor arg_type na funo de inicializao. Por exemplo: a ca ca 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 funo sejam de um ca tipo espec ico, voc pode usar a funao de inicializao para denir o elemento e c ca arg_type com o tipo que voc quiser. Isto faz com que o MySQL converta e argumentos para aqueles tipo a cada chamada de xxx(). Por exemplo, para fazer converso dos dois primeiros argumentos para string e integer, faa isto a c com xxx_init(): args->arg_type[0] = STRING_RESULT; args->arg_type[1] = INT_RESULT; char **args args->args informa a funo de inicializao sobre a natureza geral dos arca ca gumentos chamados com sua funo. Para um argumento constante i, argsca >args[i] aponta para o valor do argumento. (Veja abaixo sobre instrues co de como acessar o valor de forma apropriada). Para um argumento no cona stante, args->args[i] 0. Um argumento constante uma expresso uma e e a e expresso que utiliza apenas constante, tais como 3 ou 4*7-2 ou SIN(3.14). a Um argumento no constante uma expresso que refere a valores que podem a e a alterar a cada linha, tais como nomes de coluna ou funes que so chamadas co a com argumentos no contantes. a Para cada chamada da funo principal, args->args contm os argumentos ca e atuais que so passados pela linhas sendo processadas atualmente. a As funes podem se referir a um argumento i como a seguir: co Um argumento do tipo STRING_RESULT dado como um apontador e string mais um tamanho, para permitir o tratamento de dados binrios a de tamanho arbitrrio. Os contedo da string esto dispon a u a iveis como args->args[i] e o tamanho da string args->lengths[i]. Voc no e e a deve assumir aue as strings so terminadas em null. a Para um argumnto do tipo INT_RESULT, voc deve converter e 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 deve converter argse >args[i] para um valor double: double real_val;
906
real_val = *((double*) args->args[i]); unsigned long *lengths Para a funo de inicializao, o vetor lengths indica o tamanho mximo da ca ca a string para cada argumento. Voc no deve alter-los. Para cada chamada da e a a funo principal, lengths contm o tamanho atual de quaisquer argumentos ca e string que so passados para a linha sendo processada atualmente. Para argua mentos do tipo INT_RESULT ou REAL_RESULT, lengths ainda contm o tamanho e mximo do argumento (como para a funo de inicializao). a ca ca
907
udf_example.cc que inclu na distribuio fonte do MySQL. Este arquivo contm as e ido ca e seguintes funes: co metaphon() retorna uma string metafonica do argumento string. Ela algo como uma e string soundex, mas mais voltada para o ingls. e e 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 sequncia iniciando a partir de um nmero dado e u ou 1 se nenhum nmero for fornecido. u lookup() retorna o IP de um nome de mquina. a reverse_lookup() retorna o nome de mauina para um nmero IP. A funo pode ser u ca chamada com uma string "xxx.xxx.xxx.xxx" ou quatro nmeros. u A arquivo carregvel dinamicamente deve ser compilado como um arquivo objeto compara tilhvel usando um comando como este: a shell> gcc -shared -o udf_example.so myfunc.cc Voc pode encontrar facilmente as opes de compilador corretas para seu sistema execue co tando este comando no diretrio sql da sua rvore de fonte MySQL: o a shell> make udf_example.o Voc deve executar comando de compilador similar `quele que o make mostra, exceto que e a voc deve remover a opo -c prxima ao m da linha e adicionar -o udf_example.so. e ca o (Em alguns sistemas voc pode precisar deixar o comando -c.) e Uma vez que voc tenha compilado um objeto compartilhado contendo UDFs, voc e e deve instal-lo e avisar o MySQL sobre ele. Compilar um objeto compartilhado de a 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 diretrio o procurado com o ligador dinmico ld, tal como /usr/lib ou adicione o diretrio no a o qual voc colocou o objeto compartilhado ao arquivo de congurao do ligador (e.g. e ca /etc/ld.so.conf). Em muitos sistemas voc pode as variveis de ambiente LD_LIBRARY ou LD_LIBRARY_PATH e a para apontar para o diretrio onde se encontra os seus arquivos de funes UDF. A pgina o co a dlopen do manual diz a voc quais variveis voc deve utilizar em seu sistema. Voc e a e e deve congurar isto nos scripts de inicializao mysql.server ou mysqld_safe e reiniciar ca o mysqld. Depois da biblioteca ser instalada, notique mysqld sobre as novas funes com estes coco mandos: 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"; Funes podem ser deletadas utilizando-se DROP FUNCTION: co
908
As instrues CREATE FUNCTION e DROP FUNCTION atualizam a tabela de sistema func no co banco de dados mysql. O nome da funo, tipo e biblioteca compartilhada so salvas na ca a tabela. Voc deve ter os privilgios INSERT e DELETE para o banco de dados mysql para e e criar e deletar funes. co Voc no deve usar CREATE FUNCTION para adicionar uma funo que j tenha sido criada. e a ca a Se voc precisar reinstalar uma funo, voc deve remov-la com DROP FUNCTION e ento e ca e e a reinstal-la com CREATE FUNCTION. Voc precisaria fazer isto, por exemplo, se voc recoma e e pilar uma nova verso da sua funo, assim o mysqld obtem a nova verso. Por outro lado, a ca a o servidor continuar a utilizar a verso antiga. a a Funes ativas so recarregadas a cada vez que o servidor inicia, a menos que voc inicie co a e mysqld com a opo --skip-grant-tables. Neste caso, a a inicializao de UDF ignorada ca ca e e as UDFs cam indispon iveis. Uma funo ativa aquela que carregada com CREATE ca e FUNCTION e no removida com DROP FUNCTION.) a
909
double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str) Se voc herdar seu objeto de qualquer um dos itens padres (como Item_num_func), e o voc provavelmente s dever denir uma das funes acima e deixar os objetos pais e o a co cuidar das outras funes. Por exemplo, a classe Item_str_func dene uma funo co ca val() que executa atof() no valor retornado por ::str(). 5. Voc tambm deve, provavelmente, denir a seguinte funo objeto: e e ca void Item_func_newname::fix_length_and_dec() Esta funo deve pelo menos calcular max_length baseado nos argumentos dados. max_ ca length o nmero mximo de caracteres que a funo pode retornar. Esta funo e u a ca ca tambm deve denir maybe_null = 0 se a funo principal no puder retornar um e ca a valor NULL. A funo pode vericar se algum dos argumentos da funo pode retornar ca ca NULL vericando a varivel de argumentos maybe_null. Voc pode dar uma olhada em a e Item_func_mod::fix_length_and_dec para um exemplo t ipico de como fazer isto. Todas as funes devem ser seguras com thread (em outras palavras, no utilize qualquer co a varivel global ou esttica nas funes sem protege-las com mutexes). a a co Se voc retornar NULL, de ::val(), ::val_int() ou ::str() voc deve denir null_value e e com 1 e retornar 0. Para funes objetos ::str(), existem algumas consideraes adicionais das quais voc co co e deve estar ciente: O arguemto String *str fornece um buer string que pode ser utilizado para guardar o resultado. (Para mais informaes sobre o tipo String, d uma olhada no arquivo co e sql_string.h.) A funo ::str() deve retornar a string que guarda o resultado ou (char*) 0 se o ca resultado NULL. e Todas as funes string atuais tentam evitar a alocao de memria a menos que seja co ca o absolutamente necessrio! a
910
max elements (padro 256) o nmero mximo de valores distintos que analyse notia e u a car por coluna. Isto utilizado por analyse para vericar se o tipo timo da coluna a e o deve ser do tipo ENUM. max memory (padro 8192) a memria mxima que analyse deve alocar por coluna a e o a enquanto tenta encontrar todos os valores distintos. SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]])
911
912
Se depois de voc examinar todas as outras possibilidades e voc tiver conclu que o e e ido e cliente MySQL ou o servidor MySQL que est causando problemas, hora de fazer um a e relatrio de erro para a nossa lista de emails ou nossa equipe de suporte. No relatrio de o o erro, tente dar uma descrio bem detalhada de como o sistema se comporta e o que voc ca e acha que est acontecendo. Voc tambm deve dizer porque voc acha que o MySQL que a e e e e esta causando problemas. Lev em considerao todas as situaes neste cap ca co itulo. Indique qualquer problema exatamente como ele aparece quando voc examina o seu sistema. Use e o mtodo cortar e colar para qualquer sa e/ou mensagem de erro do programa e/ou e ida arquivos de log! Tente descrever em detalhes qual programa no est funcionando e todos os sintomas que a a voc v! Ns recebemos muitos relatrios de erros que apenas indicavam "o sistema no e e o o a funciona". Isto no nos fornece qualquer informao sobre o que poderia ser o problema. a ca Se um programa falhar, sempre util saber: e O programa em questo realizou um operao de segmentation fault (core dumped)? a ca O program aesta consumindo toda a CPU? Verique com top. Deixe o programa rodar por um tempo. Ele pode estar avaliando algo pesado. Se o servidor mysqld que est causando problemas, voc pode fazer um mysqladmin e a e -u root ping ou mysqladmin -u root processlist? O que o progrma cliente diz (tente com mysql, por exemplo) quando voc tenta conectar e ao servidor MySQL? O cliente travou? Voc obteve qualquer sa do programa? e ida Quando enviar um relatrio de erro, voc deve seguir o que descrito neste manual. Veja o e e Seo 1.7.1.2 [Fazendo perguntas], Pgina 35. ca a
913
Se voc tiver um script, voc s tem que executar a consulta novamente para o cliente e e o reconectar autometicamente. Voc normalmente pode obter os seguintes cdigos de erros neste caso (qual voc obter e o e a depender do SO): a Cdigo de erro o Descrio ca CR_SERVER_GONE_ERROR O cliente no pode enviar um pedido ao servidor. a CR_SERVER_LOST O cliente no obteve um erro ao escrever no servidor, a mas no obteve uma resposta completa (ou nenhuma rea sposta) a seu pedido. Voc tambm ir obter este erro se algum tiver matado a thread em execuo com kill e e a e ca #threadid#. Voc pode vericar que o MySQL no morreu executando mysqladmin version e examie a nando o tempo em execuo. Se o problema que o mysqld falhou voc deve descobrir a ca e e razo da falha. Voc deve neste caso iniciar vericando se executar a consulta novamente a e ir nalizar o MySQL novamente. Veja Seo A.4.1 [Falhas], Pgina 925. a ca a Voc tambm pode obter estes erros se voc enviar uma consulta incorreta ou muito grande e e e 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 conexo. Se voc precisa de grandes a e consultas (por exemplo, se voc est trabalhando com grandes colunas BLOB), voc pode e a e aumentar o limite da consulta iniciando o mysqld com a opo -O max_allowed_packet=# ca (padro 1M). A memria extra alocada sobre demanda, assim o mysqld alocar mais a o e a memria apenas quando voc executar uma grande consulta ou quando o mysqld deve o e retornar um grande registro de resultado! Voc tambm obter uma conexo perdida se voc estiver enviando um pacote >= 16M e e e a a e se seu cliente for mais antigo que a verso 4.0.8 e a verso do seu servidor 4.0.8 e acima a a e ou vice versa. Se voc quiser fazer um relatrio de erros descreendo este prolema, esteja certo de ter e o inclu as seguintes informaes: ido co Informe se o MySQL morreu ou no. (Voc pode encontrar into no arquivo a e hostname.err). Veja Seo A.4.1 [Falhas], Pgina 925. ca a Se uma cosulta espec ica matar o mysqld e as tabelas envolvidas foram vericadas com CHECK TABLE antes que voc zesse a consulta, voc pode fazer um caso de teste para e e isto? Veja Seo E.1.6 [Caso de testes reproduz ca iveis], Pgina 1084. a Qual o valor da varivel wait_timeout no servidor MySQL? mysqladmin variables e a lhe d o valor destas variveis. a a Voc tentou executar mysqld com --log e vericou se a consulta executada apareceu e no log? Veja Seo 1.7.1.2 [Fazendo perguntas], Pgina 35. ca a
914
so mais rpidos que TCP/IP mas s podem ser usados quando conectados ao servidor no a a o mesmo computador. Sockets Unix so usados se voc no especicar um nome de mquina a e a a ou se voc especicar o nome de mquina especial localhost. e a No Windows, se o servidor mysqld est rodando no 9x/Me, voc s pode conectar via a e o TCP/IP. Se o servidor estiver rodando no NT/2000/XP e o mysqld iniciado com -e enable-named-pipe, voc tambm pode conectar com named pipes. O nome do named e e pipes MySQL. Se voc no der um nome de mquina quando conectar ao mysqld, um e e a a cliente MySQL tentar conectar primeiro ao named pipe, e se isto no funcionar ele ir a a a conectar a porta TCP/IP. Voc pode forar o uso de named pipes no Windows usando . e c como nome de mquina. a O erro (2002) Cant connect to ... normalmente signica que no h um servidor MySQL a a rodando no sistema ou que voc est usando um arquivo socket ou porta TCP/IP errado e a ao tentar conectar so servidor mysqld. Inicie vericando (usando ps ou gerenciador de tarefas do Windows) que h um processo a chamado mysqld executando em seu sistema! Se no houver nenhum processo mysqld, voc a e deve iniciar um. Veja Seo 2.4.2 [Iniciando o servidor], Pgina 116. ca a Se um processo mysqld estiver em execuo, voc pode vericar o servidor tentando estas ca e diferentes conexes (o nmero da porta e o caminho do socket devem ser diferente em sua o u consigurao, claro): ca e 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 de hostname (que , o nome de mquina atual) para ser substitu no ida e a ido comando mysqladmin. Aqui esto algumas razes pela quais o erro Cant connect to local MySQL server pode a o ocorrer: mysqld no est rodando. a a Voc est rodando em um sistema que usa MIT-pthreads. Se voc estiver executando e a e em um sistema que no possui threads nativas, o mysqld usa o pacote MIT-pthreads. a Veja Seo 2.2.3 [Qual SO], Pgina 78. No entanto, nem todas as verses de MITca a o pthreads suportam sockets Unix. Em um sistema sem suporte a sockets voc sempre e deve especicar o nome de mquina explicitamente ao conectar ao servidor. Tente usar a este comando para vericar a conexo com o servidor: a shell> mysqladmin -h hostname version Algum removeu o socket Unix que o mysqld utiliza (por padro /tmp/mysqld.sock). e a Voc deve ter um trabalho cron que remove o socket MySQL (por exemplo, um tre balhoque remove arquivos antigos do diretrio /tmp). Voc sempre pode executar o e mysqladmin version e vericar que o socket que o mysqladmin est tentando usar a realmente existe. A correo neste caso alterar o trabalho cron para no remover ca e a mysqld.sock ou para colocar o socket em outro local. Veja Seo A.4.5 [Problemas ca com mysql.sock], Pgina 929. a
915
Voc iniciou o servidor mysqld com a opo --socket=/path/to/socket. Se voc e ca e alterar o caminho do socket para o servidor, voc tambm deve noticar o cliente e e MySQL sobre o novo caminho. Voc pode fazer isto fornecendo o caminho do socket e como um argumento para o cliente. Veja Seo A.4.5 [Problemas com mysql.sock], ca Pgina 929. a Voc est usando Linux e uma thread nalizou (core dumped). Neste caso voc deve e a e matar as outras threads mysqld (por exemplo, com o script mysql_zap antes de voc e poder iniciar um novo servidor MySQL. Veja Seo A.4.1 [Falhas], Pgina 925. ca a Voc pode no ter privilgios de leitura e escrita tanto no diretrio que guarda o arquivo e a e o de socket quanto no prprio arquivo de socket. Neste caso voc deve mudar o privilgio o e e do diretrio/arquivo ou reiniciar mysqld para que ele use um diretorio que voc possa o e utilizar. Se voc obter a mensagem de erro Cant connect to MySQL server on alguma_maquina, e voc pode tentar o seguinte para descobrir qual o problema: e e Verique se o servidor est funcionando fazendo telnet seu-servidor num-portaa tcp-ip e pressione Enter algumas vezes. Se houver um servidor MySQL em execuo ca nesta porta voc deve obter uma resposta que inclui o nmero da verso do servidor e u a MySQL em execuo. Se voc obter um erro como telnet: Unable to connect to ca e remote host: Connection refused, ento no h nenhum servidor rodando na porta a a a dada. Tente conectar ao daemon mysqld na mquina local e verique a porta TCP/IP que o a mysqld est congurado para usar (varivel port) com mysqladmin variables. a a Verique se o seu servidor mysqld no foi iniciado com a opo --skip-networking. a ca
916
SELECT * FROM mysql.user WHERE LEN(password) > 16; Para mais informaes sobre hash de senha e autenticao, veja Seo 4.3.11 [Password co ca ca hashing], Pgina 245. a
917
O caso mais comum em que isto acontece quando voc tenta criar uma tabela de um tipo e e que no suportado por seu binrio mysqld. Se o mysqld no suporta um tipo de tabela a e a a (ou se o tipo de tabela est disabilitado por uma opo de inicializao), ele criar a tabela a ca ca a com o tipo mais comumente usado em suas outras tabelas, que provavelmente o MyISAM. e Voc pode vericar o tipo de uma tabela fazendo: e SHOW TABLE STATUS LIKE nome_tabela. Veja Seo 4.6.8.2 [SHOW TABLE STATUS], ca Pgina 304. a Voc pode vericar as extenso que seu binrio mysqld suporta com: e a a show variables like have_%. Veja Seo 4.6.8.4 [SHOW VARIABLES], Pgina 309. ca a
918
mtodos diferentes de congurar esta varivel. Por favor, note que --set-variable est e a a obsoleta desde o MySQL 4.0, em seu lugar utilize --max-allowed-packet=8M. Voc pode utilizar o arquivo de opo para denir max_allowed_packet com um e ca tamanho maior no mysqld. Por exemplo, se voc est esperando armazenar o tamanho e a total de um MEDIUMBLOB em uma tabela, voc precisar iniciar o servidor com a opo e a ca set-variable=max_allowed_packet=16M. Voc tambm pode obter problemas estranhos com pacotes grandes se voc estiver usando e e e blobs grandes, mas voc no deu para mysqld accesso a memria suciente para tratar a e a o consulta. Se voc suspeita que este o caso, tente adicionar ulimit -d 256000 no inicio do e e script mysqld_safe e reinicie o mysqld.
919
TCP/IP mal congurado. Defeitos na rede, hub, switch, cabos, ... Isto pode ser diagnosticado de forma apropriada aomente atravs de reposio de hardware. e ca max_allowed_packet muito pequeno ou a consulta exige memria livre que voc e o e alocou para mysqld. Veja Seo A.2.9 [Packet too large], Pgina 917. ca a
920
[mysqld] tmpdir=C:/temp assumindo que o diretrioe c:\\temp existe. o Pgina 216. a Veja Seo 4.1.2 [Arquivos de opo], ca ca
Verique tambm o cdigo de erro que voc obteve com perror. Outra razo pode ser um e o e a erro de disco cheio; shell> perror 28 Error code 28: No space left on device
921
Note que como o MySQL utiliza diretrios e arquivos para armazenar banco de dados e o tabelas, o nome de banco de dados e tabelas so caso-sensitive! (No Windows o nome de a banco de dados e tabelas no so caso-sensitivo mas todas as referncias a uma dada tabela a a e dentro de uma consulta devem utilizar o mesmo caso!) Voc pode vericar quais tabelas existem no banco de dados atual com SHOW TABLES. Veja e Seo 4.6.8 [SHOW], Pgina 302. ca a
922
O problema aqui que mysqld est tentando manter aberto muitos arquivos simultanee a manete. Voc pode tambm dizer para o mysqld no abrir muitos arquivos de uma vez ou e e a aumentar o nmero de descritores de arquivos dispon u iveis para o mysqld. Para dizer para o mysqld manter aberto poucos arquivos por vez, voc pode tornar a cache e de tabela menor usando a opo -O table_cache=32 para mysqld_safe (o valor padro ca a 64). Reduzindo o valor de max_connections tambm reduzir o nmero de arquivos e e a u abertos (o valor padro 90). a e Para alterar o nmero de descritores de arquivos dispon u iveis para mysqld, voc pode usar a e opo --open-files-limit=# para mysqld_safe ou -O open-files-limit=# para mysqld. ca Veja Seo 4.6.8.4 [open_files_limit], Pgina 309. O modo mais fcil de fazer isto ca a a e adicioar a opo ao seu arquivo de opo. Veja Seo 4.1.2 [Arquivos abertos], Pgina 216. ca ca ca a Se voc tiver um verso antiga do mysqld que no suporte isto, voc pode editar o script e a a e mysqld_safe. Existe uma linha ulimit -n 256 comentada no script. Voc pode remover e o caracter # para descomentar esta linha, e altere o nmero 256 para afetar o nmero u u de descritores de arquivos dispon iveis para mysqld. ulimit (e open-files-limit) podem aumentar o nmero de descritorese de arquivo, mas u apenas at o limite imposto pelo sistema operacional. Tambm h um limite maior que s e e a o pode ser sobrescrito se voc iniciar o mysqld_safe ou mysqld como root (apenas se lembre e que voc tambm precisa usar a opo --user=... neste caso). Se voc precisa aumentar o e e ca e limite do SO no nmero dos descritores de arquivo disponiveis para cada processo, cosulte u a documentaco para ser sistema operacional. a Note que se voc rodar o shell tcsh, ulimit no funcioar! tcsh tambm relatar o valor e a a e a incorreto quando voc pergunta pelo limite atual! Neste caso voc deve iniciar mysqld_safe e e com sh!
Se voc obter erros de undefined reference (refer^ncia indefinida) para as funes e e co descompactadas ou compactadas, adicione -lz no nal sa sua linha de ligao e tente ca novamente!
923
Se voc obter erros de undefined reference (refer^ncia indefinida) para funes que e e co devem existir em seu sistema, como connect, verique a pgina do man sobre a funo em a ca questo para saber quais bibiotecas voc deve adicionar a sua linha de ligao! a e ca Se voc obter erros de undefined reference (refer^ncia indefinida) para funes que e e co no existem em seu sistema, como o seguinte a mf_format.o(.text+0x201): undefined reference to __lxstat normalmente signica que sua biblioteca compilada em um sistema que no 100% come a e pat ivel com o seu. Neste caso voc de fazer o download da ultima distribuio fonte e ca do MySQL e compil-la voc mesmo. Veja Seo 2.3 [Instalao da distribuio fonte], a e ca ca ca Pgina 94. a Se voc estiver tentando executar um programa e ento obter erros de s e a imbolos sem referncia que comeam com mysql_ ou que a biblioteca do mysqlclient no pode e c a encontrar, signica que seu sistema no pode encontrar a biblioteca compartilhada a libmysqlclient.so. A correo deste problema dizer ao seu sistema para buscar onde a biblioteca esta lacolca e izada usando um dos seguintes mtodos: e Adicione o caminho ao diretrio onde est o libmysqlclient.so ` varivel de ambio a a a ente LD_LIBRARY_PATH. Adicione o caminho ao diretrio onde est o libmysqlclient.so ` varivel de ambio a a a ente LD_LIBRARY. Copie libmysqlclient.so a algum local que pesquisado pelo seu sistema, como e /lib, e atualize a informao da biblioteca compartilhada executando ldconfig. ca OUtro modo de resolver este problema ligar o seu programa estaticamente, com -static, e ou removendo as bibliotecas dinmicas do MySQL antes de ligar o seu cdigo. Na prxima a o o vez voc deve estar certo que nenhum outro programa esta usando bibliotecas dinmicas! e a
924
do arquivo de opes /etc/my.cnf ou o arquivo de opes my.cnf no diretrio de co co o dados do servidor. Por exemplo: [mysqld] user=nome_usuario Neste ponto, seu processo mysqld deve estar executando bem e redondo como usurio nome_ a usuario do Unix. No entanto algo no altera: o contedo da tabela de permisses. Por a u o padro (logo depois de executar o script de instalao das tabelas de permisses mysql_ a ca o install_db), o usurio MySQL root o unico com permisso para acessar o banco de a e a dados mysql ou para criar ou apagar banco de dados. A menos que voc tenha alterado e estas permisses, elas ainda valem. Isto no deve imped de de acessar o MySQL como o a i-lo usurio root do MySQL quando voc est logado como outro usurio Unix deiferente de a e a a root; apenas especique a opo -u root ao programa cliente. ca Note que acessar o MySQL como root, fornecendo -u root na linha de comando diferente e de de executar o MySQL como o usurio root do Unix,or como outro Usurio Unix. A a a permisso de acesso e nome de usurios do MySQL esto completamente separados dos a a a nomes de usurio do Unix. A unica conexo com os nomes de usurio do Unix que se a a a e voc no utilizar a opo -u quando chamr o seu programa cliene, o cliente tentar conectar e a ca a usando seu nome de login do Unix como o seu nome de usurio do MySQL a Se a sua conta Unix no esta segura, voc deve pelo menos colocar uma senha no usurio a e a root do MySQL na tabela de acesso. Seno qualquer usurio com uma conta nesta mquina a a a poder executar mysql -u root nome_bd e fazer o que quiser. a
925
926
Finalize o daemon mysqld com mysqladmin shutdown, execute myisamchk --silent --force */*.MYI em todas as tabelas e reinicie o daemon mysqld. Isto ir assegurar a que voc est executando de um estado limpo. Veja Cap e a ptexi tulo 4 [Administrador de Banco de Dados MySQL], Pgina 207. a Use mysqld --log e tente determinar a partir da informao no log se alguma consulta ca especica nalizou o servidor. Aproximadamente 95% de todos os erros so relacionados a com um consulta em particular! Normalmente ela uma das ultimas consultas no e arquivo de log antes do MySQL reiniciar Veja Seo 4.10.2 [Registro de consultas], ca Pgina 373. Se voc puder nalizar o MySQL repetidamente com uma das consultas, a e mesmo quando voc tiver vericado todas as tabelas logo antes de realiz-la, ento e a a voc estar apto a localizar o bug e deve fazer um relatrio de bug para isto! Veja e a o Seo 1.7.1.3 [Relatrio de bugs], Pgina 36. ca o a Tente fazer um caso de teste que possamos utilizar para reproduzir o problema. Veja Seo E.1.6 [Caso de testes reproduz ca iveis], Pgina 1084. a Tente executar o teste incluso mysql-test e o benchmark do MySQL. Veja Seo 14.1.2 ca [Pacote de testes do MySQL], Pgina 896. Eles devem testar o MySQL bem. Voc a e tambm pode adicionar ao benchmark um cdigo que simule a sua aplicao! O benche o ca mark pode ser encontrado no diretrio bench na distribuio fonte ou, em uma diso ca tribuio binria, no diretrio sql-bench sob o diretrio de instalao do seu MySQL. ca a o o ca Experimente fork_test.pl e fork2_test.pl. Se voc congurar o MySQL para depuraao, ser muito mais fcil para obter ine c a a formaes sobre possiveis erros se alguma coisa der errado. Recongure o MySQL com co a opo --with-debug ou --with-debug=full no configure e ento recompile-o. Veja ca a Seo E.1 [Depurando o servidor], Pgina 1079. ca a Congurar o MySQL para depurao faz com que um alocador de memria seja inclu ca o ido para que se possa encontrar alguns erros. Ele tambm fornece muita informao sobre e ca o que est acontecendo. a Voc aplicou todas as ultimas correes para o seu sistema operacional? e co Use a opo --skip-external-locking com o mysqld. Em alguns sistemas, o gerencica ador de bloqueios lockd no funciona de forma apropriada; a opo --skip-externala ca locking faz com que mysqld no utilize bloqueio externo. (Isto signica que voc no a e a pode executar 2 servidores mysqld sobre o memo dado e que voc deve ser cuidadoso e ao utilizar myisamchk, mas pode ser instrutivo tentar a opo como teste). ca Voc tentou mysqladmin -u root processlist quando o mysqld parecia estar rodando e mas no respondia? Algumas vezes o mysqld no est <<comatose>> mesmo quando a a a voc acha que no. O problema pode ser que todas as conexes esto em uso, o pode e a o a haver algum problema interno de bloqueio. mysqladmin processlist normalmente estar apto a fazer uma conexo mesmo nestes casos e pode fornecer informao util a a ca sobre o nmero conexes atuais e os seus estados. u o Execute o comando mysqladmin -i 5 status ou mysqladmin -i 5 -r status ou em uma janela separada para produzir estat isticas enquanto voc executa outras consultas. e Experimente o seguinte: 1. Inicie o mysqld a partir do gdb (ou em outro depurador). Veja Seo E.1.3 [Usando ca gdb no mysql], Pgina 1081. a
927
2. Execute o seu script de testes. 3. Imprima o <<backtrace>> e as varveis locais nos 3 n a iveis mais baixos. No gdb voc pode faz-lo com o seguinte comando quando o mysqld falhar dentro do gdb: e e backtrace info local up info local up info local Com gdb voc tambm pode examinar quais threads existem com info threads e e e troca para uma thread espec ica com thread #, onde # a ID da thread. e Tente simular a sua aplicao com um script Perl para forar o MySQL a falhar o ca c mudar o seu comportamento. Envie um relatrio de bug normal. Veja Seo 1.7.1.3 [Relatrio de erros], Pgina 36. o ca o a 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 relacionado a suas bibliotecas de sistemas em particular). e Se voc tiver um problema em tabelas com registros do tamanho dinmico e voc no e a e a est usando colunas BLOB/TEXT (mas apenas colunas VARCHAR, voc pode tentar alterar a e todas as colunas VARCHAR para CHAR com ALTER TABLE. Isto forara o MySQL a usar c linhas de tamanho xo. Linhas de tamanho xo utilizam um pouco mais de espao c extra, mas so muito mais tolerante a corrompimento. a O cdigo de registro dinmico atual foi usado pela MySQL AB por pelo menos 3 anos o a em qualquer problema, mas por natureza os registro de tamanho dinmico so mais a a propensos a erros, assim pode ser uma boa idia tentar o exposto acima para ver se e ajuda.
928
4. Agora voc tambm pode parar o mysqld e reinici-lo normalmente, ou apenas carregue e e a a tabela de privilgios com: e shell> mysqladmin -h hostname flush-privileges 5. Depois disto, voc deve estar apto para conectar usando a nova senha. e De forma alternativa, voc pode denir a nova senha usando o cliente mysql: e 1. Finalize e reinicie o mysqld com a opo --skip-grant-tables com descrito acima. ca 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 deve estar apto a conectar usando a nova senha. e 5. Voc agora pode parar o mysqld e reinici-lo normalmente. e a
929
A.4.5 Como Proteger ou AlterarHow to Protect or Change the MySQL Socket File /tmp/mysql.sock
Se voc tiver problemas com o fato que de que qualquer um pode deletar o socket de comue nicao /tmp/mysql.sock do MySQL, voc pode, na maioria das verses Unix, protejer o ca e o seu sistema de arquivos /tmp denindo o bit sticky. Conecte como root e faa o seguinte: c shell> chmod +t /tmp Isto protejer o seu sistema de arquivos /tmp para que os arquivos s possam ser deletados a o pelo seus donos ou pelo superusurio (root). a Voc pode vericar se o bit sticky est setado executando ls -ld /tmp. Se o ultimo bit e a de permisso t, o bit est congurado a e a Voc pode alterar o local onde o MySQL usa/coloca o arquivo de socket da seguinte maneira: e Especique o caminho em uma arquivo de opo local ou global. Por exemplo, coloque ca em /etc/my.cnf:
930
[client] socket=path-for-socket-file [mysqld] socket=path-for-socket-file Veja Seo 4.1.2 [Arquivo de opes], Pgina 216. ca co a Especicando isto na linha de comando para o mysqld_safe e na maioria dos clientes com a opo --socket=path-for-socket-file. ca Especique o caminho para o socket na varivel de ambiente MYSQL_UNIX_PORT. a Denindo o caminho com a opo --with-unix-socket-path=path-for-socket-file ca do configure. Veja Seo 2.3.3 [congure options], Pgina 98. ca a Voc pode testar se o socket funciona com o seguinte comando: e shell> mysqladmin --socket=/path/to/socket version
931
932
O campo do dia ou ms pode ser zero. Isto conveniente se voc quiser armazenar e e e uma data de aniversrio em uma coluna DATE e voc no sabea parte da data. a e a Se a data no pode ser convertida para qualquer valor razovel, um 0 armazenado no a a e campo DATE, o qual ser recuperado como 0000-00-00. Isto uma questo tanto de vea e a locidade quanto de convenincia j que acreditamos que a responsabilidade do banco de e a dados recuperar a mesma data que voc armazenou (mesmo se a data no era logicamente e e a correta em todos os casos). Ns pensamos que papel da aplicao vericar as datas, e no o e ca a do servidor.
933
Ao usar ORDER BY, valores NULL so apresentados primeiro, ou por ultimo se voc especicar a e DESC para armazenar em ordem decrescente. Exceo: Nos MySQL 4.0.2 at 4.0.10, se voc ca e e armazenar em ordem decrescente usando DESC, valores NULL so apresentados por ultimo. a Ao usar GROUP BY, todos os valores NULL so considerados iguais. a Funes de agrupamento (resumo) como COUNT(), MIN() e SUM() ignoram valores NULL. co A exceo a isto COUNT(*), que conta linhas e no colunas individuais. Por exemplo, ca e a a seguinte instruo deve produzir duas contagens. A primeira a contagem do nmero ca e u de linhas na tabela e a segunda a contagem do nmero de valores diferentes de NULL na e u coluna age: mysql> SELECT COUNT(*), COUNT(age) FROM person; Para ajudar com o tratamento de NULL, voc pode usar os operadores IS NULL e IS NOT e NULL e a funo IFNULL(). ca Para alguns tipos de colunas, valores NULL so tratados de forma especial, Se voc inserir a e NULL na primeira coluna TIMESTAMP de uma tabela, a data e hora atual sero inseridos. Se a voc isere NULL em uma coluna AUTO_INCREMENT, o prximo nmero na sequncia inserida. e o u e e
934
rpido apenas delatando 100-1000 ids de colunas_relacionadas por consulta se colunas_ a relacionadas um e indice. Se colunas_relacionadas no um a e indice, a velocidadi e independente do nmero de argumentos na clusula IN. u a
935
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 correto. Embora parea que os primeiros cinco registros no devessem a c a passar no teste de comparao, eles deviam porque a diferena entre o nmero mostrado ca c u est na dcima casa decimal ou depende da arquitetura do computador. a e O problema no pode ser resolvido usando ROUND() (ou funo similar), porque o resultado a ca ainda um nmero de ponto utuante. Exemplo: e u 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 | +------+--------+-------+ E assim que o nmero da coluna a se parece: u 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 pode ou no ver resultados similares. Cada e a CPU pode avaliar um nmere de ponto utuante de forma diferente. Por exemplo, em u
936
alguma mquinas voc pode obter resultados corretos multiplicando ambos argumentos a e por 1, como no exemplo a seguir. AVISO: NUNCA CONFIE NESTE METODO EM SUAS APLICACOES, ESTE E UM 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 razo pela qual o mtodo acima parece funcionar que na mquina onde o teste foi a e e a realizado, a CPU de aritimtica de ponto utuante realizada arredondando nmeros para e e u serem iguais, mas no h nenhuma regra que qualquer CPU deva fazer assim, ento isto a a a no convel. a e a O modo correto de fazermos comparaes de ponto utuante primeiro decidir qual a co e e tolerncia desejada entre os nmeros e ento fazer a comparao com o nmero tolerado. a u a ca u Por exemplo, se ns concordarmos que nmeros de ponto utuante devem ser considerados o o u mesmo, se eles forem o mesmo com preciso de quatro casas deciamis (0.0001), a comparao a ca 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 ns quisermos obter registros onde os nmeros so o mesmo, o teste seria: o u a 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 | +------+-------+-------+
937
alguns casos o MySQL no tem informao suciente sobre os dados e precisa fazer alguns a ca palpites sobre os dados. Esta seo do manual direcionada para os casos nos quais o MySQL no faz isto corretaca e a mente. A ferramenta que se tem dispon para ajudar o MySQL a fazer as coisas certas so: ivel a EXPLAIN. Veja Seo 5.2.1 [EXPLAIN], Pgina 424. ca a ANALYZE TABLE. Veja Seo 4.6.2 [ANALYZE TABLE], Pgina 298. ca a USE INDEX, FORCE INDEX and IGNORE INDEX. Veja Seo 6.4.1 [SELECT], Pgina 562. ca a STRAIGHT JOIN a n de tabela e global. Veja Seo 6.4.1 [SELECT], Pgina 562. ivel ca a Congurar variveis espec a icas de threads. Veja Seo 4.6.8.4 [SHOW VARIABLES], ca Pgina 309. a
938
939
940
B.1 APIs
Perl Modules http://www.mysql.com/Downloads/Contrib/KAMXbase1.2.tar.gz Converte arquivos .dbf em tabelas do MySQL. Mdulo Perl escrito por Pratap o Pereira [email protected], expandido por Kevin A. McGrail [email protected]. Este conversor pode tratra campos MEMO. http://www.mysql.com/Downloads/Contrib/HandySQL-1.1.tar.gz HandySQL uma mdulo de acesso ao MySQL. Ele oferece uma interface C embutida em Perl e o e aproximadamente 20% mais rpida que o DBI regular. e a OLEDB http://www.mysql.com/Downloads/Win32/MyOLEDB3.exe Pacote de instalao ca MyOLEDB 3.0 da SWSoft. http://www.mysql.com/Downloads/Win32/mysql-oledb-3.0.0.zip Fonte do MyOLEDB 3.0. http://www.mysql.com/Downloads/Win32/MySamples.zip Exemplos e documentao do MyOLEDB. ca http://www.mysql.com/Downloads/Win32/MyOLEDB.chm Arquivos de ajuda do MyOLEDB. http://www.mysql.com/Downloads/Win32/libmyodbc.zip Biblioteca esttica a do MyODBC usada para construir o MyOLEDB. Baseada no cdigo MyODBC. o C++ http://www.mysql.com/Downloads/Contrib/mysql-c++-0.02.tar.gz Biblioteca wrapper C++ dp MySQL. Por Roland Haenel, [email protected].
941
http://www.mysql.com/Downloads/Contrib/MyDAO.tar.gz API C++ do MySQL. Por Satish [email protected]. Inspirado pela API C++ de Roland Haenel e pela biblioteca MyC de Ed Carp. http://www.mysql.com/products/mysql++/ API C++ do MySQL (mais que uma bibliteca wrapper). Originalmente criado por [email protected]. Mantido por Sinisa na MySQL AB. http://nelsonjr.homepage.com/NJrAPI/ Um biblioteca independente de banco de dados em C++ que suporta MySQL. Delphi http://www.mysql.com/Downloads/Contrib/DelphiMySQL2.zip Delphi para libmysql.dll, por [email protected]. Interface
http://www.mysql.com/Downloads/Contrib/Udmysql.pas Um wrapper para libmysql.dll para uso com Delphi. Por Reiner Sombrowsky. http://www.fichtner.net/delphi/mysql.delphi.phtml Uma interface Delphi para o MySQL, com cdigo fonte. Por Matthias Fichtner. o http://www.productivity.org/projects/tmysql/ TmySQL, uma biblioteca para utilizar o MySQL com Delphi. https://sourceforge.net/projects/zeoslib/ Zeos Library um conjunto e de componentes de banco de dados para MySQL, PostgreSQL, Interbase, MS SQL, Oracle e DB/2. Tambm inclui ferrementas de desenvolvimento tais como e Database Explorer e Database Designer. http://www.mysql.com/Downloads/Contrib/JdmMysqlDriver-0.1.0.tar.gz Um driver da VisualWorks 3.0 Smalltalk para MySQL. Por [email protected]. http://www.mysql.com/Downloads/Contrib/Db.py caching. Por [email protected]. Mdulo o python com
http://www.mysql.com/Downloads/Contrib/MySQLmodule-1.4.tar.gz Interface python para MySQL. Por Joseph Skinner [email protected]. Modicado por Joerg Senekowitsch [email protected]. http://www.mysql.com/Downloads/Contrib/mysqltcl-1.53.tar.gz Interface Tcl para o MySQL. Baseado no msqltcl-1.50.tar.gz. Para a verso 2.0 e a mais informaes, veja http://www.xdobry.de/mysqltcl/. co http://www.mysql.com/Downloads/Contrib/MyC-0.1.tar.gz Uma API com Visual Basic por Ed Carp. http://www.mysql.com/Downloads/Contrib/Vdb-dflts-2.1.tar.gz Esta e uma nova verso de um conjunto de bibliotecas utilitrias com a inteno de a a ca fornecer uma interface genrica para o mecanismo de banco de dados SQL para e que sua aplicao se torne de 3 camadas. A vantagem que voc pode facilmente ca e e trocar o mecanismo de banco de dados implementando um arquvo para o novo backend sem qualquer alterao em sua aplicao. Por [email protected]. ca ca http://www.mysql.com/Downloads/Contrib/DbFramework-1.10.tar.gz DbFramework uma coleo de classes para manipular o banco de dados MySQL. e ca As classes so baseadas no CDIF Data Model Subject Area. Por Paul Sharpe a [email protected].
942
http://www.mysql.com/Downloads/Contrib/pike-mysql-1.4.tar.gz Modulo MySQL para pike. Para uso com o servidor web Roxen. http://www.mysql.com/Downloads/Contrib/squile.tar.gz Mdulo o para guile que permite ao guile interagir com banco de dados SQL. Por Hal Roberts. http://www.mysql.com/Downloads/Contrib/stk-mysql.tar.gz Interface para o Stk. Stk o Tk widgets com Scheme em vez do Tcl. Por Terry Jones. e http://www.mysql.com/Downloads/Contrib/eiffel-wrapper-1.0.tar.gz Eiffel wrapper por Michael Ravits. http://www.mysql.com/Downloads/Contrib/SQLmy0.06.tgz FlagShip Replaceable Database Driver (RDD) para MySQL. Por Alejandro Fernandez Herrero. A homepage do Flagship RDD http://www.fship.com/rdds.html. e http://www.mysql.com/Downloads/Contrib/mydsn-1.0.zip Binrio e Fonte a para mydsn.dll. mydsn deve ser usado para construir e remover o arquivo de registro DSN para o driver MyODBC am aplicaes Coldfusion. Por Miguel co Angel Solrzano. o http://www.mysql.com/Downloads/Contrib/MySQL-ADA95_API.zip Uma interface ADA95 para a API do MySQL. Por Francois Fabien. http://www.mysql.com/Downloads/Contrib/MyTool-DLL_for_VB_and_ MySQL.zip Uma DLL com a API C do MySQL para Visual Basic. Por Ken Menzel [email protected]. http://www.mysql.com/Downloads/Contrib/MYSQLX.EXE Objeto ActiveX do MySQL para acesso direto do ser servidor MySQL atravs do IIS/ASP, VB, e VC++ evitando o ODBC que mais lento. Totalmente atualizvel, multi-thread e a com suporte total para todos os tipos de campos do MySQL (verso 2001.1.1). a Por SciBit http://www.scibit.com/. http://www.fastflow.it/mylua/ Site do MyLUA; como utilizar a linguagem LUA para escrever PROCEDURE MySQL que podem ser carregados em tempo de execuo. ca http://www.mysql.com/Downloads/Contrib/lua-4.0.tar.gz LUA 4.0 http://www.mysql.com/Downloads/Contrib/mylua-3.23.32.1.tar.gz Correo para o MySQL 3.23.32 para usar o LUA 4.0. Por Cristian Giussani. ca http://www.mysql.com/Downloads/Contrib/patched_myodbc.zip Correo ca (para suporte ao Omniform 4.0) para o driver MyODBC. Por Thomas Thaele [email protected]
B.2 Conversores
http://www.mysql.com/Downloads/Contrib/mssql2mysql.txt Conversor do MS-SQL para MySQL. Por Michael Koer. O site do mssql2mysql e http://www.kofler.cc/mysql/mssql2mysql.html. http://www.mysql.com/Downloads/Contrib/dbf2mysql-1.14.tar.gz Conversor de aruivos .dbf em tabelas MySQL. Por Maarten Boekhold ([email protected]), William Volkman, e Michael Widenius. Este conversor inclui suporte rudimentar a campos MEMO para somente-leitura.
943
http://www.mysql.com/Downloads/Contrib/dbf2mysql-1.13.tgz Converte arquivos .dbf em tabelas MySQL. Por Maarten Boekhold, [email protected], e Michael Widenius. Este conversor no a pode tratar campos MEMO. http://www.mysql.com/Downloads/Contrib/dbf2mysql.zip Converte arquivos FoxPro .dbf em tabelas MySQL no Windows. Por Alexander Eltsyn, [email protected] ou [email protected]. http://www.mysql.com/Downloads/Contrib/dbf2sql.zip Programa pequeno e simples que pode lhe ajudar a transportar os dados de uma tabela foxpro em uma tabela MySQL. Por Danko Josic. http://www.mysql.com/Downloads/Contrib/dump2h-1.20.gz Converte a sa ida de um mysqldump em um arquivo de cabealho (.h) do C. Por Harry Brueckner, c [email protected]. http://www.mysql.com/Downloads/Contrib/exportsql.txt Um script parecido com access_to_mysql.txt, exceto que ele totalmente congurvel, tem melhor e a converso de tipo (incluindo deteco de campos TIMESTAMP), fornece avisos e a ca sugestes enquanto converte, coloca todos os caracteres especiais em dados binrios o a e texto e assim por diante. Tambm converte para o mSQL v1 e v2, e no tem custo. e a Veja http://www.cynergi.net/exportsql/ para a ultima verso. Por Pedro Freire, a [email protected]. Note: N`o funciona com Access 2.0! a http://www.mysql.com/Downloads/Contrib/access_to_mysql.txt Cole esta funo em um mdulo Access de um banco de dados que possua as tabelas que voc ca o e deseja exportar. Veja tambm o exportsql. Por Brian Andrews. Nota: No funciona e a com Access 2.0! http://www.mysql.com/Downloads/Contrib/importsql.txt Um script que faz exatamente o contrrio do exportsql.txt. Ou seja, ele importa dados do MySQL a para um banco de dado no Access via ODBC. Ele bem acess e ivel quando combinado com exportsql, pois ele deixa voc uar o Access para todo desenvolvimento e e administrao do BD, e sincroniza com o seu servidor MySQL. Sem custos. Veja ca http://www.netdive.com/freebies/importsql/ para atualizaes. Criado por Lauco rent Bossavit da NetDIVE. Nota: no funciona com Access2! a http://www.mysql.com/Downloads/Contrib/mdb2sql.bas Conversor do Access97 para MySQL por Moshe Gurvich. http://www.mysql.com/Downloads/Contrib/msql2mysqlWrapper-1.0.tgz Um wrapper C do mSQL para MySQL. Por [email protected] http://www.mysql.com/Downloads/Contrib/sqlconv.pl Um script simples que pode ser usado para copiar campos de uma tabela MySQL para outro, em blocos. Basicamente voc pode rodar mysqldump e canaliz-lo para o script sqlconv.pl. e a O script analisar a sa do mysqldump e rearranjar os campos para que sejam a ida a inseridosd em uma nova tabela. Um exemplo quando voc quer criar uma nova e e tabela em local diferente do qual voc est trabalhando, mas a tabela apenas um e a e pouco diferente (isto - campos em ordem diferente, etc.). Por Steve Shreeve. e http://www.mysql.com/Downloads/Contrib/oracledump Progrma Perl para converter bancos de dados Oracle em MySQL. Tem o mesmo formato de sa do ida mysqldump. Por Johan Andersson.
944
http://www.mysql.com/Downloads/Contrib/excel2mysql Programa Perl para importar pastas de trabalho do Excel em um banco de dados MySQL. Por Stephen Hurd [email protected] http://www.mysql.com/Downloads/Contrib/T2S_100.ZIP. Programa Windos para converter arquivos textos em banco de dados MySQL. Por Asaf Azulay.
B.3 Utilitrios a
http://worldcommunity.com/opensource/utilities/mysql_backup.html MySQL Backup um script de backup para o MySQL. Por Peter F. Brown. e http://www.mysql.com/Downloads/Contrib/mysql_watchdog.pl Monitora a daemon do MySQL par poss iveis travamentos. Por Yermo Lamers, [email protected]. http://www.mysql.com/Downloads/Contrib/mysql_structure_dumper.tar.gz http://www.mysql.com/Downloads/Contrib/mysql_structure_dumper.tgz Exibe a estrutura de toda a tabela em um banco de dados. Por Thomas Wana. http://www.mysql.com/Downloads/Contrib/mysqlsync. Um script Perl para manter cpias remotas de uma banco de dados MySQL em sioncronia com uma cpia master o o central. Por Mark Jeftovic. [email protected]. http://www.mysql.com/Downloads/Contrib/MySQLTutor-0.2.tar.gz. MySQLTutor. Um tutorial MySQL para iniciantes. http://www.mysql.com/Downloads/Contrib/mysql_replicate.pl Programa Perl que trata replicaes. Por [email protected] co http://www.mysql.com/Downloads/Contrib/dbcheck Script Perlque tira backup de uma tabela antes de executar isamchk nelas. Por Elizabeth. http://www.mysql.com/Downloads/Contrib/mybackup. http://www.mswanson.com/mybackup (home page do mybackup) Wrapper para o mysqldump para backup de todos os bancos de dados. Por Marc Swanson. http://www.mysql.com/Downloads/Contrib/mdu.pl.gz Exibe o armazenamento usado em um banco de dados MySQL.
945
946
Algum para o Monty chamar no meio da noite que ele percebe que aquele e novo recurso funciona. Chefe "Open Sourcerer" (relaes na comunidade MySQL). co Jani Tolonen mysqlimport Diversas extenses dos clientes de linha de comando. o PROCEDURE ANALYSE() Sinisa Milivojevic Compactao (com zlib) no protocolo cliente/servidor. ca Hashing perfeito para fase do analisador lexicogrco. a INSERT multi-linhas Opo -e domysqldump ca LOAD DATA LOCAL INFILE Opo SQL_CALC_FOUND_ROWS do SELECT ca Opo --max-user-connections=... ca net_read e net_write_timeout GRANT/REVOKE e SHOW GRANTS FOR Novo protocolo cliente/servidor para 4.0 UNION na verso 4.0 a DELETE/UPDATE multi-tabelas Tabelas derivadas na verso 4.1 a Gernciamento de recursos do usurio e a Desenvolvedor inicial da APC C++ MySQL++ e do cliente MySQLGUI. Tonu Samuel (past developer) interface VIO (a fundao para o protocolo cliente/servidor criptografado). ca Sistema de arquivos do MySQL (um modo de usar banco de dados MySQL como arquivos e diretrios). o A expresso CASE. a As funes MD5() e COALESCE(). co Suporte RAID para tabelas MyISAM. Sasha Pachev Implementao inicial da replicao (at verso 4.0). ca ca e a SHOW CREATE TABLE. mysql-bench Matt Wagner Pacote de teste do MySQL Webmaster (at 2002). e Coordenador do desenvolvimento. c
947
Miguel Solorzano Desenvolvimento e contruo das distribuies Win32 ca co Cdigo do servidor Windows NT. o WinMySQLAdmin Timothy Smith (past developer) Suporte a conjunto de caracteres dinmicos. a congure, RPMs e outra partes dos sistemas constru idos. Desenvolvedor inicial do libmysqld, o servidor embutido.
Sergei Golubchik Pesquisa Full-text. Adioo de chaves ` biblioteca MERGE. ca a Jeremy Cole Indrek Siitan Design/programao de nossa interface web. ca Autor do nosso sistema de gerenciamento de newsletter. Jorge del Conde MySQLCC (MySQL Control Center) Desenvolvento do Win32 Implantao inicial do portal na web. ca Venu Anuganti Connector/ODBC (MyODBC) 3.51 Novo protocolo cliente/servidor para a verso 4.1 (para instrues a co preparadas). Arjen Lentz Responsvel pelo Manual de Referncia do MySQL a e Preparao da edio impressa do Manual. ca ca Alexander (Bar) Barkov, Alexey (Holyfoot) Botchkov, and Ramil Kalimullin Dados espaciais (GIS) e implementao de Arvores-R para verso 4.1 ca a Unicode e conjunto de caracteres para verso 4.1; documentao para os a ca mesmos. Oleksandr (Sanja) Byelkin Cache de consultas na verso 4.0 a Implementao de subconsultas (4.1). ca Aleksey (Walrus) Kishkin and Alexey (Ranger) Stroganov Anlise e desenho dos benchmarks. a Aprovao e edio deste manual. ca ca ALTER TABLE ... ORDER BY .... UPDATE ... ORDER BY .... DELETE ... ORDER BY ....
948
Manuteno do pacote de teste do MySQL. ca Zak Greant Advogado do Open Source, relaes da comunidade MySQL co Carsten Pedersen O programa de certicao do MySQL. ca Lenz Grimmer Engenharia de produo (contruo e distribuio) ca ca ca Peter Zaitsev Funes SHA1(), AES_ENCRYPT() e AES_DECRYPT(). co Depurao, pondo em ordem vrios recursos. ca a Alexander (Salle) Keremidarski Suporte. Depurao. ca Per-Erik Martin Desenvolvedor responsvel por stored procedures (5.0) e triggers. a Jim Winstead Lidera o desenvolvimento web Mark Matthews Driver do Connector/J (Java). Peter Gulutzan Adequao aos padres SQL-99, SQL:2003. ca o Documentao do algoritmo/cdigo existente do MySQL. ca o Documentao do conjunto de caracteres. ca Guilhem Bichot Replciao, a partir do MySQL verso 4.0. ca a Correo do tratamento de expoentes para DECIMAL. ca Autor do mysql_tableinfo. Antony T. Curtis MySQL Database para OS/2.
949
Irena Pancirov [email protected] Portabilidade para Win32 com compilador Borland. mysqlshutdown.exe e mysqlwatch.exe David J. Hughes Pelo esforo para fazer um banco de dados SQL shareware. Na TcX, a prec decessora da MySQL AB, iniciamos com mSQL, mas achamos que ele no poa dia satisfazer os nossos propositos assim escrevemos uma interface SQL para nossa aplicao Unireg. Os clientes mysqladmin e mysql so programas que ca a foram largamente inuenciados pelo mSQL. Nos esforamos muito tentando c fazer da sintaxe do MySQL um superconjunto do mSQL. Muitas das idias de e API eram emprestadas do mSQL para tornar fcil de se portar programas livres a para o mSQL para a API do MySQL. O programa MySQL no contm nena e hum cdigo do mSQL. Dois arquivos na distribuio (client/insert_test.c o ca e client/select_test.c) so baseados nos arquivos correspondentes (sem a direitos autorais) na distribuio do mSQL, mas so modicados como exemplo ca a mostrando as alteraes necessrias para converter um cdigo do mSQL para o co a 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 [email protected] 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 [email protected] Ordenao em esloveno. ca "TAMITO" [email protected] O macro do conjunto de caracteres _MB e os conjuntos de caracteres ujis e sjis. Joshua Chamas [email protected] Base para inseres concorrentes, sintaxe da data estendida, depurao no NT co ca resposta na lista de email do MySQL. Yves Carlier [email protected] mysqlaccess, um progrma para mostrar os direitos de acesso do usurio. a Rhys Jones [email protected] (e GWE Technologies Limited) Por um dos primeiros drives JDBC. Dr Xiaokun Kelvin ZHU [email protected] Desenvolvimento de um dos primeiros drivers JDBC e outras ferramentas Java relacionadas ao MySQL.
950
James Cooper [email protected] Por congurar um arquivo de lista de email com busca em seu site. Rick Mehalick [email protected] Pelo xmysql, um cliente grco X para o servidor MySQL. a Doug Sisk [email protected] Por fornecer pacotes RPM do MySQL para Linux Red Hat Diemand Alexander V. [email protected] Por fornecer pacotes RPM do MySQL para Linux Red Hat-Alpha. Antoni Pamies Olive [email protected] Por fornecer verses RPM de vrios clientes MySQL para Intel e SPARC. o a Jay Bloodworth [email protected] Por forncer verses RPM do MySQL verso 3.21. o a David Sacerdote [email protected] Ideias para vericao segura de nomes de mquinas DNS. ca a Wei-Jou Chen [email protected] Algum suporte para caracteres chineses (BIG5). Wei He [email protected] Diversas funcionalidades para o conjunto de casracteres chineses(GBK). Jan Pazdziora [email protected] Oredenao em Tcheco ca Zeev Suraski [email protected] Formatao de tempo FROM_UNIXTIME(), funes ENCRYPT() e conseleheiro do ca co bison. Membro ativo da lista de email. Luuk de Boer [email protected] Portado (e extendido) o pacote de benchmark para DBI/DBD. Tem sido de grande ajuda com o crash-me e benchmarks em execuo. Algumas novas ca funes de data. O script mysql_setpermissions. co Alexis Mikhailov [email protected] funes denidas por usurios (UDFs); CREATE FUNCTION e DROP FUNCTION. co a Andreas F. Bobak [email protected] A extenso AGGREGATE para funOes UDF. a c Ross Wakelin [email protected] Ajuda na congurao do InstallDhield para o MySQL-Win32. ca Jethro Wright III [email protected] A biblioteca libmysql.dll. James Pereria [email protected] Mysqlmanager, uma ferramenta Win32 GUI para administrao do servidor ca MySQL. Curt Sampson [email protected] Potabilidade de MIT-pthreads para NetBSD/Alpha e NetBSD 1.3/i386.
951
Martin Ramsch [email protected] 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. Atulizao do congure para Tru64, suporte a arquivos grandes e suporte a ca melhores wrappers TCP. John Birrell Emulacao do pthread_mutex() para OS/2. Benjamin Pugmann Exetnso de tabelas MERGE para tratar INSERTS. Membro ativo na lista de a emails do MySQL. Jocelyn Fournier Excelente ao mostrar e relatar inumerveis bugs. (especialmente no cdigo da a o subconsulta no MySQL 4.1) Marc Liyanage Manuteno dos pacotes do Mac OS X e fornecimento de feedbacks sobre como ca criar pacotes para Mac OS X. Robert Rutherford Por fornecer informaes e feedback sobre o port QNX. co 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, [email protected], [email protected], Ted Deppner [email protected], Mike Simons, Jaakko Hyvatti. E vrios relatos/correes de bugs do pessoal da lista de email. a co Um grande tributo vai `queles que nos ajudaram a responder dvidas na lista de email do a u MySQL. Daniel Koch [email protected] Congurao do Irix. ca Luuk de Boer [email protected] Dvidas de benchmark. u Tim Sailer [email protected] Questes do DBD-mysql. o Boyd Lynn Gerber [email protected] Questes relacionadas ao SCO. o Richard Mehalick [email protected] Questes relacionadas ao xmysql e questes bsicas de instalao. o o a ca
952
Zeev Suraski [email protected] Questes de congurao do mdulo Apache (log & autent) e questes relao ca o o cionadas ao PHP, questes relacionadas a sintaxe SQL e outras questes gerais. o o Francesc Guasch [email protected] Questes gerais. o Jonathan J Smith [email protected] Questes espec o icas do SO Linux, sintaxe SQL e outra coisas que podem precisar de algum trabalho. David Sklar [email protected] Usando o MySQL a partir de PHP e Perl. Alistair MacDonald [email protected] Ainda no especicado, mas ex e pode lidar com Linux e, talvez, HP-UX. a e ivel Tentar conseguir usurios para utilizar mysqlbug. a a John Lyon [email protected] Questes sobre instalao do MySQL em sistemas Linux, usando ou arquivos o ca .rpm ou compilando o fonter. Lorvid Ltd. [email protected] Assuntos simples de contas/licena/suporte/direitos autorais c Patrick Sherrill [email protected] Questes sobre interfaces ODBC e VisualC++. o Randy Harmon [email protected] Questes sobre DBD, Linux, e algumas sintxe SQL. o
953
Jay Flaherty [email protected] Grande parte da seo Perl DBI/DBD no manual. ca Paul Southworth [email protected], Ray Loyzaga [email protected] Aprovao do Manual de Referncia. ca e Therrien Gilbert [email protected], Jean-Marc Pouyot [email protected] Mensagens de erro em Francs. e Petr Snajdr, [email protected] Mensagens de erro em Tcheco. Jaroslaw Lewandowski [email protected] Mensagens de erro em Polons e Miguel Angel Fernandez Roiz Mensagens de erro em Espanhol Roy-Magne Mo [email protected] Mensagens de erro em noruegus e teste da verso 3.21.#. e a Timur I. Bakeyev [email protected] Mensagens de erro em russo. [email protected] & Filippo Grassilli [email protected] Mensagens de erro em italiano. Dirk Munzinger [email protected] Mensagens de erro em alemo. a Billik Stefan [email protected] Mensagens de erro en eslovaco. Stefan Saroiu [email protected] Mensagens de erro em romeno. Peter Feher Mensagens de erro em hungaro. Roberto M. Serqueira Mensagens de erro em portugus. e Carsten H. Pedersen Mensgens de erro em dinamarqus. e Arjen G. Lentz Mensagens de erro em holands, completando a traduo parcial mais cedo. e ca (tambm trabalhou na consistencia e graa). e
954
Fred Fish
Pela sua excelente depurao de C e biblioteca trace. Monty fez pequenas ca melhoras nesta biblioteca (velocidade e opes adicionais). co
Richard A. OKeefe Por sua biblioteca string de dom inio pblico. u Henry Spencer Pela sua biblioteca regex, usada em WHERE column REGEXP regexp. Chris Provenzano Pthreads portveis no n de usurio. Do direito de uso: Este produto inclui a ivel a software desenvolvido por Chris Provenzano, pela Univesidade da Califrnia, o Berkeley e colaboradores. Atualmente estamos usando a verso 1 60 beta6 a 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 memria) que usado quando voc o e 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).
955
Giovanni Maruzzelli [email protected] Por portar iODBC (ODBC para Unix). Xavier Leroy [email protected] O autor da LinuxThreads (usada pelo servidor MySQL no Linux).
956
FutureQuest --skip-show-database
957
958
Sintaxe INSERT ... ON DUPLICATE KEY UPDATE .... Ela lhe permite fazer um UPDATE de um registro existente se a insero criasse um valor duplicado em uma chave PRIMARY ca ou UNIQUE. (REPLACE lhe permite sobrescrever um registro existente, o que totalmente e diferente). Veja Seo 6.4.3 [INSERT], Pgina 579. ca a Uma nova funo de agrupamento GROUP_CONCAT(). Veja Seo 6.3.7 [Group by funcca ca tions and modiers], Pgina 555. a 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 vrios parmetros de ajustes. Voc a a e pode tem multiplas caches de cahves, indices precarregados em caches para batches ... Indices BTREE em tabelas HEAP. Suporte a OpenGIS (Dados Geogrcos). Veja Cap a ptexi tulo 10 [Spatial extensions in MySQL], Pgina 733. a SHOW WARNINGS exibe avisos para o ultimo comando. WARNINGS], Pgina 323. a Veja Seo 4.6.8.9 [SHOW ca
Protocolo binrio mais rpido com instrues prepardas e ligao de parmetros. Veja a a co ca a Seo 12.1.4 [C API Prepared statements], Pgina 828. ca a Agora voc pode executar vrias instrues com uma unica chamada a API C e de uma e a co vez e ento ler o resultado Veja Seo 12.1.8 [C API multiple queries], Pgina 855. a ca a 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 atualizaes, veja a seo de alteraes para cada distribuio co ca co ca 4.1.x individual.
959
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)
960
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. LIMIT no longer accepts negative arguments (they used to be treated as very big positive numbers before). 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.
961
Added new type values DAY_MICROSECOND, HOUR_MICROSECOND, MINUTE_MICROSECOND, SECOND_MICROSECOND, and MICROSECOND for DATE_ADD(), DATE_SUB(), and EXTRACT(). 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 funes COMPRESS(), UNCOMPRESS() e UNCOMPRESSED_LENGTH(). co Ao fazer SQL SQL_MODE=#, para um modo complexo (como ANSI) agora atualizamos a varivel SQL_MODE para incluir todas as opes que o modo exige. a co Adicionada a funo ROLLUP OLAP (Online Analytical Processing - Processamento ca Analitico Online), que lhe d um resumo para cada n GROUP BY. a ivel Adicionado os cdigos SQLSTATE para todos os erros do servidor. o Adicionado mysql_sqlstate() e mysql_stmt_sqlstate() que retornam o cdigo de o erro SQLSTATE para o ultimo erro. --lower-case-table-names=1 agora tambm faz a aliases caso insensitivo. (Bug e #534) Colunas TIME com valor de horas maior do que 24 eram retornadas incorretamente para o cliente. As instrues ANALYZE, OPTIMIZE, REPAIR e FLUSH so agora armazenados no log co a binrio e assim replicados para o slave. Este registro no ocorre se a palavra chave opa a cional NO_WRITE_TO_BINLOG (ou seu alias LOCAL) for usada. As excees so que FLUSH co a LOGS, FLUSH MASTER, FLUSH SLAVE e FLUSH TABLES WITH READ LOCK, no so registraa a dos no log em qualquer caso. Para uma sintaxe completa, veja Seo 4.6.4 [FLUSH], ca Pgina 299. a Nova varivel global RELAY_LOG_PURGE para habilitar ou desabilitar automaticamente a a remoo de relay logs. ca 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 no for respeitado. A tabela ainda criada como a e MyISAM, como antes. Muitas sub selectas so muito mais rpidas que antes. a a 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
962
Seconds_Behind_Master indicates the number of seconds by which the slave is late compared to the master. --lower-case-table-names=1 now also makes aliases case insensitive. (Bug #534) Bugs corrigidos: Fixed merging types and length of elds in UNION 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 ultimos caracteres na sa da funo (bug #447) ida ca Corrigido um erro de replicao raro quando um transao extendia em dois ou mais ca ca relay logs e o escravo era parada enquanto ele estava executando a parte da transao ca que estava no segundo relay log ou em um adicional. Ento a replicao parava no a ca 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() replicado apropriadamente (bug #177). e A nova funo PASSWORD() na verso 4.1 replicada apropriadamente (bug #344). ca a e
963
Corrigida a dupla liberao de memria ca o Corrigido um erro em UNION envolvendo tabelas temporrias. a Corrigido um erro de falha em DERIVED TABLES quando EXPLAIN usado em um e DERIVED TABLES com um join Corrigido um erro de falha no DELETE com ORDER BY e LIMIT causado pala inicializao ca do vetor do ponteiro de referncias. e Corrigido um erro na funo USER() causado pelo erro no tamanho da string alocada ca Corrigido um erro de falha quando se tentava criar uma tabela com coluna do tipo GEOMETRY com um mecanismo de armazenamenti que no a suporta. a Corrigido um erro de falha no UNION causado pela lista de select vazia e um campo no a existente sendo usado em algumas das instrues SELECTs individuais. co Corrigido um erro de replicao com um master na verso 3.23 e um slave na 4.0: o ca a slave perdia a replicao de tabelas temporrias se FLUSH LOGS era executado no master ca a (Bug #254). Corrigido um bug de segurana: Um servidor compilado ser suporte a SSL ainda perc mitia conexes de usurios que possuiam a opo REQUIRE SSL especicado para as o a ca suas contas. Quando um usurio indenido era usado em uma atualizao de consulta no master a ca (como INSERT INTO t VALUES(@a) onde @a nunca havia sido denido por esta conexo), a ento o slave podia replicar a consulta de forma incorreta se uma transao anterior a ca no master usava uma varivel de usurio de mesmo nome. (Bug #1331) a a Corrigido um erro com instrues preparadas: O uso do parmetro ? de instrues co a co preparadas como argumento de certas funes e clusulas fazia com que o servidor co a falhasse durante chamadas mysql_prepare(). (Bug #1500) Corrigido um erro com instrues preparadas: co depois da chamada de mysql stmt prepare, colchetes so permitidos em todas as instrues consequentes, a co mesmo se eles no forem preparados (bug #1946) a
964
Ajuda do lado do servidor para todas as funes do MySQL. Pode-se agora digitar co help week no cliente mysql e conseguir ajuda para a funo week(). ca Adionada a nova funo da API C mysql_get_server_version(). ca Corrigido um buh na libmysqlclient que buscava campos padres. o Corrigido um bug no cliente mysql.cc ao ignorar comentrios a Adicionado o mtodo record_in_range() para tabelas MERGE poderem escolher o e indice certo quando houverem muitos para serem escolhidos. A replicao agora funciona com RAND() e variveis de usurios @var. ca a a Permite-se alterar o modo para ANSI_QUOTES com o servidor no ar. Agora pode se matar EXPLAIN SELECT. Veja Seo 4.6.7 [KILL], Pgina 301. ca a Agora pode se matar REPAIR TABLE. Veja Seo 4.6.7 [KILL], Pgina 301. ca a Permiti-se especicar lista de chaves vazias para USE INDEX, IGNORE INDEX e FORCE INDEX. Agora DROP TEMPORARY TABLE apenas apaga tabelas temporrias e no naliza a a transaes. co Adicionado suporte para UNION em tabelas derivadas. Warning: Alterao imcompat ca ivel! TIMESTAMP agora retornado comi uma string do e tipo YYYY-MM-DD HH:MM:SS e tamanhos de timestamp diferentes no so suportados. a a Esta alterao era necessria para compatibilidade com o padro SQL. Em uma verso ca a a a futura, uma alterao adicional ser feita (compat ca a ivel co esta alterao), permitindo ca que o tamanho do timestamp indique o nmero de d u igitos desejado para a frao de ca segundos. Novo protocolo cliente/servidor mais rpido que suporta instrues preparadas, limitar a co parmetros e colunas de resultados, transferncia binaria de dados, avisos. a a 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 pode executar diversas consultas de uma vez e e ento ler o resultados. a Em CREATE TABLE foo (a INT not null primary key) a palavra PRIMARY agora ope cional. Em CREATE TABLE o atributo SERIAL agora um alias para BIGINT NOT NULL AUTO_ e INCREMENT UNIQUE. SELECT ... FROM DUAL um alias para SELECT .... (Para ser compat com alguns e ivel outros bancos de dados). Se criado um CHAR/VARCHAR muito grande, ele alterado automaticamente para TEXT e a ou BLOB; Ser exibido um aviso neste caso. a POde-se especicar os tipos BLOB/TEXT diferentes com a sintaxe BLOB(tamanho) e TEXT(tamanho). O MySQL ir alter-los automaticamente para um dos tipos internos a a BLOB/TEXT. CHAR BYTE um alias para CHAR BINARY. e VARCHARACTER um alias para VARCHAR. e Novos operadores inteiro MOD inteiro e inteiro DIV inteiro.
965
Adicionado SERIAL DEFAULT VALUE como um alias para AUTO_INCREMENT. Adicionado TRUE e FALSE como alias para 1 e 0, respectivamente. Agora aliases so forados em tabelas dferivadas, como no SQL-99. a c orrigido SELECT .. LIMIT 0 para retornar a contagem aproriada de linhas para SQL_ CALC_FOUND_ROWS. Pode-se especicar muitos diretrios temporrios para serem usados de modo roundo a robin 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 converso de valores strings entre conjunto a de caracteres. Indices BTREE em tabelas HEAP. Servidor embutido mais rpido (novo protocolo de comunicao interno). a ca Pode-se adicionar um comentrio por coluna em CREATE TABLE. a SHOW FULL COLUMNS FROM nome_tabela exibe os comentrios das colunas. a ALTER DATABASE. Suporte a GIS (dados geometricos). Veja Capptexi tulo 10 [Spatial extensions in MySQL], Pgina 733. a SHOW [COUNT(*)] WARNINGS exibe avisos sobre o ultimo 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~o nulo) SELECT b+1 AS a FROM bar; a expr SOUNDS LIKE expr o mesmo que SOUNDEX(expr)=SOUNDEX(expr). e Adicionada nova funo VARIANCE(expr) que retorna a varincia de expr ca a Pode se criar um tabela a partir de uma existente usando CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tabela (LIKE tabela). A tabela tambm pode ser normal ou teme porria. a Novas opes --reconnect e --disable-reconnect para o cliente mysql, para reco conectar automaticamente ou no se a conexo for perdida. a a START SLAVE (STOP SLAVE) no retorna mais um erro se o slave j est iniciado (parado); a a a ele retorns um aviso. SLAVE START e SLAVE STOP no mais aceitada pelo analisador de consulta; use START a e SLAVE e STOP SLAVE em seu lugar.
966
967
Fixed bug in range optimizer that caused wrong results for some not likely AND/OR queries. (Bug #1828) Fixed a crash in ORDER BY when ordering by expression and identier. (Bug #1945) 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 Seo 4.11.8.1 [CHANGE MASTER TO], Pgina 402. (Bug ca a #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.
968
Fixed bug with BIT_AND() still returning signed value for an empty set in some cases. (Bug #1972) 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)
969
Fixed a spurious error ERROR 14: Cant change size of file (Errcode: 2) on Windows in DELETE FROM table_name without a WHERE clause or TRUNCATE TABLE table_ name, when table_name is a MyISAM table. (Bug #1397) 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
970
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) 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)
971
Adicionada a opo --sql-mode=NO_DIR_IN_CREATE para tornar poss para os slaves ca ivel ignorarem as opes INDEX DIRECTORY e DATA DIRECTORY dadas para CREATE TABLE. co Quando ele est ligado, SHOW CREATE TABLE no exibir os diretrios dados. a a a o SHOW CREATE TABLE agora exibe as opes INDEX DIRECTORY e DATA DIRECTORY, se eles co fossem especicados quando a tabela era criada. A varivel do servidor open_files_limit agora exibe o limite de arquivos abertos real. a 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 instalao do Mac OS X agora incluem um pacote ca MySQLStartupItem.pkg adicional que habilita a inicializao automtica do MySQL ca a no boot do sistema. Veja Seo 2.1.3 [Mac OS X installation], Pgina 71. ca a A maioria da documentao inclu na distribuio tar do binrio (.tar.gz) foi ca ida ca a movida para o subdiretrio docs. Veja Seo 2.2.5 [Installation layouts], Pgina 83. o ca a O manual agora est inclu com um arquivo info tradicional na distribuio binria. a ido ca a (Bug #1019) A distribuio binria agora incluem a biblioteca do servidor embutido (libmysqld) ca a por padro. Devido a problemas de ligao com compiladores diferentes do gcc, ele no a ca a estava inclu em todos os pacotes da distribuio inicial da verso 4.0.15. Os pacotes ido ca a afetados forma reconstruidos e distribuidos como 4.0.15a. Veja Seo 1.5.1.2 [Nutshell ca Embedded MySQL], Pgina 24. a O MySQL agora pode usar o otimizador de faixa para BETWEEN com limites no cona stantes. (Bug #991) Mensagens de erro de replicao agora incluem o banco de dados padro, assim os ca a usurios podem vericar em qual banco de dados a consulta com erro est rodando. a a Uma alterao da documentao: Adicionado um pargrafo sobre como as opes ca ca a co binlog-do-db e binlog-ignore-db so testadas em um banco de dados no master a (veja Seo 4.10.4 [Binary log], Pgina 374), e um pargrafo sobre como replicateca a a do-db, replicate-do-table e opes anlogas so testadas em bancos de dados e co a a tabelas no slave (veja Seo 4.11.6 [Replication Options], Pgina 392). ca a Agora o slave no replica SET PASSWORD se estiver congurado para excluir o banco a de dados mysql da replicao (usando, por exemplo, replicate-wild-ignoreca table=mysql.%). Este j era o caso para GRANT e REVOKE desde a verso 4.0.13 a a (embora houvesse o Bug #980 nas verses 4.0.13 & 4.0.14, que foi corrigido na verso o a 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 Seo 4.11.3 [Replication Implementation Details], ca Pgina 381. a Adiciona um teste na replicao para detectar o caso no qual o master morre no meio ca da gravao de uma transao no log binrio; tal transao inacabada agora dispara ca ca a ca uma mensagem de erro no slave. Um comando GRANT que cria um usurio annimo (isto , uma conta com nome de a o e usurio vazio) no exige mais FLUSH PRIVILEGES para a conta ser conhecida no servidor. a a (Bug #473)
972
CHANGE MASTER agora descarrega o relay-log.info. Anteriormente isto era feito na prxima execuo de START SLAVE, assim se o mysqld fosse desligado no slave o ca depois de CHANGE MASTER sem executar START SLAVE, o nome e posio do relay log ca eram perdidos. Na reinicializao eles eram carregados a partir do relay-log.info, ca revertendo-os para seus valores antigos (incorretos) de antes do CHANGE MASTER, exibindo mensagens de erro (j que o relay log antigo no existia mais) e as threads a a slaves se recusavam a iniciar. (Bug #858) Bugs corrigidos: Corrigido o overow do buer no tratamewnto de senhas, que podia potencialmente ser explorardo pelo usurio MySQL com privilgios na tabela mysql.user para exea e cutar cdigo aleatrios para obter acessi com o UID do processo mysqld (obrgado a o o 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 do EXPLAIN. (Bug #1172) ida Corrigido o tratamento de permisso de tabelas/colunas - a ordenao apropriada (do a ca mais especico para o menos especico, veja Seo 4.3.10 [Request access], Pgina 242) ca a no era respeitada (Bug #928) a Corrigido um bug raro no MYISAM introduzido na verso 4.0.3 onde o handler do a arquivo de indice no era diretamente atualizado depois de um UPDATE de registros a dinamicos separados. Corrigido o erro Cant unlock file ao executar myisamchk --sort-index no Windows. (Bug #1119) Corrigido um poss deadlock ao alterar key_buffer_size enquanto a cache de chaves ivel era ativamente usada. (Bug #1088) Corrigido um bug de overow em MyISAM e ISAM quando um registro era atualiado na tabela com um grande nmero de colunas e pelo meno uma coluna BLOB/TEXT. u Corrigido um resultado incorreto ao fazer UNION e LIMIT #,# quando no era usado a parenteses na parte SELECT. Corrigido um resultado incorreto ao fazer UNION e ORDER BY .. LIMIT # quando no a usado parenteses na parte SELECT. Corrigido um problema com SELECT SQL_CALC_FOUND_ROWS ... UNION ALL ... LIMIT # onde FOUND_ROWS() retornava o nmero incorreto de linhas. u Corrigidos um erro de pilha indesejado quando tinhamos uma grande expresso do tipo a 1+1-1+1-1... de uma ceta combinao. (Bug #871) ca 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 unica aplicao ca conhecida que era afetada pelo comportamento anterior era o Borland dbExpress, que truncava a sa do comando. (Bug #1064) ida Corrigida a falha na comparao de strings usando o conjunto de caracteres tis620. ca (Bug #1116) Corrigido um bug do ISAM na otimizao de MAX(). ca
973
myisamchk --sort-records=N no marca mais a tabela como danicada se a ordenao a ca falhar devido a uma chave inapropriada. (Bug #892) Corrigido um erro no tratamento de tabelas MyISAM compactadas que algumas vezes torna imposs se reparar tabelas compactadas no modo "Repair by sort". "Repair ivel with keycache" (myisamchk --safe-recover) funcionad. (Bug #1015) Correo de um erro na propagao do nmero da verso do manual inclu no arquivo ca ca u a ido de distribuio. (Bug #1020) ca Corrigida um problema de ordenacao da chave (uma chave primria - PRIMARY a declarada em uma coluna que no explicitamente marcada como NOT NULL era ora e denada 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 compilao da biblioteca do servidor embutido da arquivo de especicao ca ca do RPM. (Bug #959) Adicionado alguns arquivos que faltavam na arquivo de especicao do RPM e corca rigido alguns erros de criao do RPM que ocorriam no Red Hat Linux 9. (Bug #998) ca Corrigida a avaliao incorreta de XOR na clusula WHERE. (Bug #992) ca a Corrigido um erro com processamento na cache de consultas com tabelas unidas a partir de mais de 255 tabelas. (Bug #930) Correo dos resultados incorretos da consulta outer join (ex. LEFT JOIN) quando a ca condio ON sempre falsa, e a faixa de busca usada. (Bug #926) ca e e Corrigido um erro causando resultados incorretos de MATCH ... AGAINST() em algumas joins. (Bug #942) Tabelas MERGE no ignoram mais "Using index" (da sa de EXPLAIN). a ida 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 verso 3.23) e comandos relaa cionados tais como CREATE INDEX. (Bug #712) Correo de segmentation fault resultante de LOAD DATA FROM MASTER quando o mestre ca estava executando sem a opo --log-bin. (Bug #934) ca Corrigido um erro de segurana: Um servidor compilado com suporte a SSL ainda c permitia conexes por usurios que tinham a opo REQUIRE SSL especicadas por o a ca suas contas. Corrigido um erro aleatrio: Algumas vezes o slave replicava consultas GRANT ou REVOKE o mesmo se estivesse congurado para excluir o banco de dados mysql da replicao (por ca exemplo, usando replicate-wild-ignore-table=mysql.%). (Bug #980) Os campos Last_Errno e Last_Error na sa ida de SHOW SLAVE STATUS agora so a limpadas por CHANGE MASTER e quando a thread slave de SQL inicia. (Bug #986) Um erro de documentao: ela dizia que RESET SLAVE no altera a informao de ca a ca conexo (master host, port, user e password), embora ela o zesse. A instruo retorna a ca estes valores para a opo de inicializao (master-host etc) se houvesse alguma. (Bug ca ca #985)
974
SHOW SLAVE STATUS agora exibe a informao correta (master host, port, user e passca word) depois de RESET SLAVE (isto , ela mostra os novos valores, que so copiados das e a opes de inicializao se houver alguma). (Bug #985) co ca Disabilitada a propagao da posio original do log do master para eventos porque ca ca isto gerava valores inesperados para Exec_Master_Log_Pos e problemas com MASTER_ POS_WAIT() em conguraes de replicao A->B->C. (Bug #1086) co ca 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 tambm ltra LOAD DATA INFILE (anteriormente, ele le trava 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 exibido apenas para informao, no para ser exee ca a cutado; mais tarde ele funcionava como LOAD DATA LOCAL com um nome de arquivo diferente, para execuo pelo mysql). (Bug #1096) ca binlog-do-db e binlog-ignore-db ltravam LOAD DATA INFILE incorretamente (ele era escrito parcialmente para o log binrio). Isto resultava em um corrompimento do a log binrio, que podia fazer o slave parar com um erro. (Bug #1100) a Quando, em uma transao, um tabela transacional (como uma tabela InnoDB) era ca atualizada, e posteriormente na mesma transao um tabela no transacional (como ca a um tabela MyISAM) era atualizada usando o contedo atualizado da tabela transacional u (com INSERT ... SELECT por exemplo), as consultas eram escritas no log binrio em a uma ordem incorreta. (Bug #873) Quando em uma transao, INSERT ... SELECT atualizava uma tabela no transaca a cional, e um ROLLBACK era executado, nenhum erro era atualizado para o cliente. Agora o cliente avisado que no se pode fazer roll back de algumas alteraes, como j era e a co a 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 transao, e ento CHANGE MASTER era usado para ca a direcionar para o slave para alguma instruo no transacional, a thread slave de SQL ca a cava confusa (porque ela ainda podia achar que estava em uma transao). ca
975
A opo SQL_CALC_FOUND_ROWS agora sempre retorna o nmero total de rgistro de ca u qulquer UNION. Removida a opo --table de mysqlbinlog para evitar repetir a funcionalidade ca mysqldump. Alterado levemente o otimizador para preferir busca de indice sobre busca em toda a tabela em alguns casos limites. Adicionado uma varivel especica da thread, max_seeks_for_key, que pode ser usada a para forar a otimizao para usar chaves em vez de varrer a tabela, mesmo se a c ca cardinalidade do indice for baixa. Adicionada a otimizao que converte LEFT JOIN para joins normais em alguns casos. ca Uma alterao da documentao: adicionado um pargrafo sobre falhas em replicao ca ca a ca (como usar um slave sobrevivente como um novo master, como resumir a congurao ca original). Veja Seo 4.11.9 [Replication FAQ], Pgina 410. ca a Uma alterao de documentao: adicionado avisos sobre uso seguro do comando ca ca CHANGE MASTER. Veja Seo 4.11.8.1 [CHANGE MASTER TO], Pgina 402. ca a O MySQL agora envia um aviso (e no um erro, como na verso 4.0.13) quando ele a a abre uma tabela que foi criada com o MySQL 4.1. Adicionada a opo --nice para mysqld_safe para permitir congurar a exatido do ca a processo mysqld. (Obrigado a Christian Hammers por fornecer o patch inicial.) (Bug #627) Adicionada a opo --read-only para que o mysqld no permita atualizaes, exceto ca a co da thread escrava ou de usurios com o privilgio SUPER. (Pacth original de Markus a e Benning). SHOW BINLOG EVENTS FROM x onde x menor que 4, agora converte silenciosamente x e para 4 em vez de exibir um erro. A mesma alterao foi feita para CHANGE MASTER TO ca MASTER_LOG_POS=x e CHANGE MASTER TO RELAY_LOG_POS=x. mysqld agora s adiciona um tratamento de interrupo para o sinal SIGINT se voc o ca e come-lo com a nova opo --gdb. Isto porque alguns usurios MySQL encontraram ca ca e a alguns problemas estranhos quando acidentalmente enviavam SIGINT para a threads mysqld. RESET SLAVE agora limpa os campos Last_Errno e Last_Error na sa de SHOW SLAVE ida STATUS. Adicionada a varivel max_relay_log_size; o relay log ser rotacionado automaticaa a mente quando seu tamanho exceder max_relay_log_size. Mas se max_relay_log_ size for 0 (o padro), max_binlog_size ser usado (como em verses mais antigas). a a o max_binlog_size ainda se aplica a logs binrios em qualquer caso de uso. a FLUSH LOGS agora rotaciona os relay logs em adio aos outros tipos de logs que ele j ca a rotacionava. Bugs corrigidos: Comparao/ordenao para o conjunto de caracteres latin1_de foi reescrita. O alca ca goritmo antigo no podia tratar casos como "s" > "a". Veja Seo 4.7.1.1 [German a a ca character set], Pgina 326. Em casos raros ela resultava em tabela corrompida. a Corrigido um problema com a prompt de senha no Windows. (Bug #683)
976
ALTER TABLE ... UNION=(...) para uma tabela MERGE agora permitida mesmo que e alguma tabela MyISAM seja somente leitura. (Bug #702) 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 memria ao se fazer REPAIR em uma tabela com uma chave o auto incremento multi-partes onde uma parte era um pacote CHAR. Corrigida uma provvel condio de corrida no cdigo da replicao que podia levar a ca o ca potencialmente a instrues INSERT no sendo replicadas no evento de um comando co a FLUSH LOGS ou quando o log binrio excede max_binlog_size. (Bug #791) a 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 operaes de cpia co o 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 opes do arquivo de opo. co ca (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 operaes UNION. co Corrigido um problema de segurana no qual usurios habilitados sem privilgios obtinc a e ham informaes na lista de banco de dados existentes usando SHOW TABLES e comandos co parecidos. Corrigido um problema de pilha no UnixWare/OpenUnix. Corrigido um problema de congurao UnixWare/OpenUNIX e OpenServer. ca Corrigido um problema de pilha cheia na vericao da senha. ca 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) Correo: SET CHARACTER SET DEFAULT fucniona. (Bug #462) ca 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 binrio estava desligado. (Bug #733) a Corrigido o problema de vericao de senha no Windows. (Bug #464) ca Corrigido um erro na comparao de uma coluna DATETIME e uma constante inteira. ca (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 expresso que a podia tomar o valor NULL.
977
Alterado o timeout em mysql_real_connect() para usar poll() em vez de select() para contornar problemas cmo muitos outros arquivos abertos no cliente. Corrigido resultados incorretos de MATCH ... AGAINST usado com uma consulta LEFT JOIN. Corrigido um bug que limitava o valor mximo para variveis mysqld em 4294967295 a a quando eles eram especicados na linha de comando. Corrigido um bug que algumas vezes causavam falsos erros de Access denied nas instrues HANDLER ... READ, quando uma tabela referenciada via um alias. co e 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 instruo INSERT DELAYED na mesma tabela. ca Corrigido um problema com converso da hora local para GMT onde algumas vezes a resultava em diferentes (mas corretos) timestamps. Agora o MySQL deve usar o menor valor de poss neste caso. (Bug #316) ivel Uma cache de consultas muito pequena podia fazer o mysqld falhar. (Bug #549) Corrigido um bug (acidentalemnte introduzida por ns mas presente apenas na verso o a 4.0.13) que faz INSERT ... SELECT em uma coluna AUTO_INCREMENT que no replica a bem. Este bug est no master, no no slave. (Bug #490) a a Corrigido um bug: Quando uma instruo INSERT ... SELECT inseria linhas em uma ca tabela no transacional, mas falhava no mesmo ponto (por exemplo, devido a erros de a Duplicate key), a consulta no era escrita no log binrio. Agora ela escrita no log a a e binrio, com seus cdigos de erros, como todas as outras cosultas so. Sobre a opo a o a ca slave-skip-errors para como tratar consultas completadas parcialmente no slave, veja Seo 4.11.6 [Replication Options], Pgina 392. (Bug #491) ca a SET FOREIGN_KEY_CHECKS=0 no era replicado apropriadamente. A correo provavela ca mente no ser feita para 3.23. a a Em um slave, LOAD DATA INFILE sem clusulas IGNORE ou REPLACE no master, era a replicada com IGNORE. Enquanto isto no for um problemase os dados do master e a slave so identicos (em LOAD que no produz conitos de duplicao no master no a a ca a produzir nada no slave de qualquer forma), o que verdade em operaes normais, a e co para depurao melhor no adicionar silenciosamente o IGNORE. Deste modo, voc ca e a e pode obter uma mensagem de erro no slave e descobrir que por alguma razo, os dados a no master e slave so diferentes e investigar o porque. (Bug #571) a Em um slave, LOAD DATA INFILE exibia uma mensagem incomplete Duplicate entry %-.64s for key %d (o nome e valor da chave no eram mencionados) no caso de a conito de duplicao (o que no acontece em operaes normais). (Bug #573) ca a co Quando usado um slave compilado com --debug, CHANGE MASTER TO RELAY_LOG_POS podia causar um falha de declarao da depurao. (Bug #576) ca ca Ao fazer um LOCK TABLES WRITE em uma tabela InnoDB, o commit podia no acontecer, a se a consulta no era escrita no log binrio (por exemplo, se --log-bin no era usado, a a a ou binlog-ignore-db era usado). (Bug #578) Se um master na verso 3.23 tivesse aberto tabelas temporrias que tinham sido replia a cadas para um slave na verso 4.0, e o log binrio rotacionado, estas tabelas temporrias a a a
978
eram automaticamente removidas pelo slave (o que causa problemas se o master os utiliza subsequecialmente). Este erro foi corrigido na verso 4.0.13, mas de um modo a que cria um incovenincia indesejada: se o master na verso 3.23 morrer brutalmente. e a (queda de fora), sem tempo suciente para escrever automaticamente instrues DROP c co TABLE em seu log binrio. ento o slave na verso 4.0.13 no noticaria que as tabelas a a a a temporrias tinham sido removidas, at o servidor mysqld slave ter sido reiniciado. a e Este pequeno incoveniente est corrigido na verso 3.23.57 e 4.0.14 (signicando que o a a master deve ser atualizado para a verso 3.23.57 e o slave para a 4.0.14 para remover a 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 cdigo de o erro (0, sem erro) como no master. Assim se o master tiver um erro na consulta (por exemplo, Duplicate entry em uma insero de mltiplas linhas), ento o slave parava ca u a e avisava que cdigo de erro no coincidia. (Bug #797) o a
979
A opo --new agora altera altera os itens binrios (0xFFDF) para serem tratados ca a como strings binrias em vez de nmeros por padro. Isto corrige alguns problemas a u a com conjunto de caracteres onde conveniente colocar a string como um item binrio. e a Depois destas alteraes voc deve converter a string binria para INTEGER com um co e a CAST se voc quiser comparar dois itens binrios, um com o outro, e saber qual e a e maior. SELECT CAST(0xfeff AS UNSIGNED) < CAST(0xff AS UNSIGNED). Este ser o a comportamento padro no MySQL 4.1. (Bug #152) a Habilitado delayed_insert_timeout no Linux (as bibliotecas glibc mais modernas tem um pthread_cond_timedwait corrigido). (Bug #211) No cria mais threads de insert delayed que o dado por max_insert_delayed_threads. a (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 restrio no ca nmero de linhas alteradas. u 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 de um falha em uma conexo segura (quando e a executando com --log-warnings). As opes --skip-symlink e --use-symbolic-links esto obsoletas e forma subco a stitu idas com --symbolic-links. A opo padro para innodb_flush_log_at_trx_commit foi alterada de 0 para 1 ca a para tornar tabelas InnoDB como ACID por padro. Veja Seo 7.5.3 [InnoDB start], a ca Pgina 644. a Adicionado o recurso para SHOW KEYS para mostrar chaves que esto disabilitadas pelo a comando ALTER TABLE DISABLE KEYS. Ao usar um tipo de tabela no existente com CREATE TABLE, primeiro v se o tipo de a e tabela padro existe antes de utilizar MyISAM. a Adicionado MEMORY como um alias para HEAP. Renomeada a funo rnd para my_rnd j que o nome era muito genrico e um s ca a e e imbolo exportado no libmysqlclient (obrigado a Dennis Haney pelo patch inicial). Correo de portabilidade: renomeado include/dbug.h para include/my_debug.h. ca mysqldump no deleta mais o log binrio sem aviso quando chamado com --mastera a data ou --first-slave; enquanto este comportamento era conveniente para alguns usurios, outros podia sofrer com ele. Agora deve perguntar explicitamente pela sua a deleo com a nova opo --delete-master-logs. ca ca Se o slave congurado (usando, por exemplo, replicate-wild-ignoree table=mysql.%) para ecluir mysql.user, mysql.host, mysql.db, mysql.tables_priv e mysql.columns_priv da replicao, ento GRANT e REVOKE no sero replicados. ca a a a 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 mtodo JOIN no era sempre e a
980
associoado com as tabelas envolvida no mtodo JOIN. Se voc tiver uma consulta que e e usa muitos RIGHT JOIN ou NATURAL ... JOINS voc deve vericar se eles funcionam e como voc espera depois de atualizar o MySQL para esta versa. (Bug #291) e o O cliente de linha de comando mysql no olha mais os comnados \* dentro de stringd a 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 usado um UPDATE multi-tabelas e a consulta exige um tabela e temporria maior que tmp_table_size. (Bug #286) a Executa mysql_install_db com a opo -IN-RPM para a instalao do Mac OS X no ca ca a falhar em sistemas com a congurao de nome de mquina feita de forma inapropriada. ca a LOAD DATA INFILE agora ir ler 000000 como uma data zerada em vez de "2000-00a 00". Corrigido um erro que fazia que DELETE FROM table WHERE const_expression sempre deletasse toda a tabela (mesmo se o resultado da expresso fosse falso). (Bug #355) a Corrigido um bug de core dump ao usar FORMAT(nan,#). (Bug #284) Corrigido um erro na resoluo do nome com HAVING ... COUNT(DISTINCT ...). ca Corrigido resultados incorretos da operao de truncamento (*) em MATCH ... ca 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.
981
Only ignore world-writeable my.cnf les that are regular les (and not, for example, named pipes or character devices). 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. (Bug #264) Fixed incorrect hostname for TCP/IP connections displayed in SHOW PROCESSLIST. 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 "").
982
983
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 Seo 3.6.9 [AUTO_INCREMENT on secondary column ca in a multi-column key], Pgina 201), when data was inserted with INSERT ... SELECT a 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).
984
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.
985
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.
986
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.
987
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.
988
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 Seo 6.1.3 [Name case sensitivity], Pgina 473. ca a 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.
989
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 Seo 6.3.1.2 [Comparison Operators], Pgina 504). ca a 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 Seo 7.5.16 [InnoDB change history], Pgina 680 in ca a 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.
990
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.
991
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.
992
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.
993
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 Seo 2.5.2 ca [Upgrading-from-3.23], Pgina 123. a Renamed --skip-locking to --skip-external-locking.
994
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. Seo 6.3.3.2 [Mathematical functions], Pgina 523. ca a 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).
995
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.
996
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).
997
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 Seo 6.3.5 [Cast ca Functions], Pgina 544. a 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 Seo 4.4.7 [User resources], Pgina 265. ca a Added mysql_secure_installation to the scripts/ directory.
ALTER TABLE
998
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.
999
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.
1000
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.
1001
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)
1002
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 Seo 7.5.3 [InnoDB start], Pgina 644. ca a 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)
1003
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.
1004
1005
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.
1006
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.
1007
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.
1008
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.
1009
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.
1010
1011
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.
1012
1013
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.
1014
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.
1015
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.
1016
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.
1017
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.
1018
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.
1019
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.
1020
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.
1021
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.
1022
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 Seo 4.8.3 [mysqld_multi], Pgina 333. ca a Added new script, mysql-multi.server.sh. Thanks to Tim Bunce [email protected] 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().
1023
and notee. Veja Seo 4.9.2 [mysql], Pgina 347, mysql --help and the interactive ca a 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.
1024
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.
1025
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.
1026
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 Seo 7.2 [MERGE], Pgina 638. ca a 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.
1027
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).
1028
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.
1029
1030
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.
1031
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.
1032
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 Seo 5.4.3 [MySQL indexes], Pgina 447. ca a 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).
1033
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.
1034
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.
1035
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 Tnu Samuel). o 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.
1036
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.
1037
1038
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.
1039
1040
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.
1041
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 [email protected].) 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 ([email protected]) 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.
1042
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 ([email protected]). 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.
1043
1044
1045
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.
1046
1047
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.
1048
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.
1049
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 [email protected]). 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.
1050
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.
1051
1052
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 Seo 5.4.3 [MySQL indexes], ca Pgina 447. a Lots of new benchmarks. A new C API chapter and lots of other improvements in the manual.
1053
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.
1054
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.
1055
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.
1056
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!
1057
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.
1058
1059
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
1060
1061
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.
1062
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.
1063
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.
1064
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.
1065
1066
1067
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.
1068
mysql now shows the thread ID when starting or doing a reconnect. Changed the default sort buer size from 2M to 1M.
1069
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
1070
1071
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).
1072
1073
1074
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).
1075
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().
1076
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.
1077
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.
1078
1079
./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 encontrar problemas com uma nova portabilidade, voc ter que fazer alguma e e depurao do MySQL! Veja Seo E.1 [Depurando o servidor], Pgina 1079. ca ca a Nota: antes de iniciar a depurao do mysqld, obtenha primeiro os programas de teste ca mysys/thr_alarm e mysys/thr_lock para funcionar. Isto asegurar que sus instalao da a ca thread tem pelo menos uma chance remota de funcionar.
1080
se voc estiver usando gcc ou egcs, a congurao recomendada : e ca 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 problemas com a biblioteca libstdc++ e com excees C++ (muitos compia co ladores tm problemas com excees C++ no cdigo da thread) e compila uma verso MySQL e co o a com suporte para todos os conjuntos caracter. Se voc suspeita de um erro despejo de memria, voc pode congurar o o MySQL com e o e --with-debug=full, que ir instalar vericar de alocao de memria (SAFEMALLOC). No a ca o entanto, a execuo com SAFEMALLOC um pouco lenta, assim se voc tiver problemas de ca e e desempenho voc deve iniciar o mysqld com a opao --skip-safemalloc. Isto disabilitar e c a a vericao de despejo de momria para cada chamada a malloc() e free(). ca o Se o mysqld parar de falhar quando voc compilar com --with-debug, voc provavelmente e e encontrou um erro de compilao ou erro de tempo dentro do MySQL. Neste caso voc pode ca e tentar adicionar -g `s variveis CFLAGS e CXXFLAGS acima e no usar --with-debug. Se a a a agora o mysqld morre, voc pode pelo menos execut-lo com gdb ou usar o gdb no arquivo e a core para descobrir que aconteceu. Quando voc congura o MySQL para depurao voc habilita automaticamente diversas e ca e funes de vericao de segurana extra que monitora a sade do mysqld. Se eles enconco ca c u trarem algo inesperado, uma entrada ser encrita no stderr, que mysqld_safe direciona a para o log de erros! Isto tambm signica que se voc estiver tendo alguns problemas inexe e perados com o MySQL e estiver usando uma distribuio fonte, a primeira coisa que voc ca e deve fazer congurar o MySQL para depurao! (A segunda coisa enviar uma mensagem e ca e para a lista de email do MySQL e pedir ajuda. Veja Seo 1.7.1.1 [Mailing-list], Pgina 33. ca a Por favor, use o script mysqlbug para todos os relatos de bug e questes referentes a verso o a do MySQL que voc est usando! e a Na distribuio do MySQL para Windows, mysqld.exe , por padro, compilado com ca e a suporte a arquivos trace.
1081
Depois disso voc pode usar a ferramenta de linha de comando mysql.exe em uma segunda e janela de console para reproduzir o problema. Voc pode nalizar o servidor mysqld acima e com mysqladmin shutdown. Note que o arquivo trace ser muito grande! Se voc quiser ter um arquivo trace menor, a e voc pode usar algo como: e mysqld --debug=d,info,error,query,general,where:O,/tmp/mysqld.trace que apenas exibe informaes com a maioria das tags interrassants em co /tmp/mysqld.trace. Se voc zer um relatrio de bug sobre isto, por favor s envie as linhas do trace para a lista e o o de email apropriada quando algo parecee estar errado! Se voc no puder localizar o local e a errado, voc pode fazer um ftp do arquivo trace, junto com um relatrio de bug completo, e o para ftp://support.mysql.com/pub/mysql/secret/ para que assim um desenvolvedor do MySQL possa dar uma olhada nele. O arquivo trace feito com o pacote DBUG de Fred Fish. Veja Seo E.3 [O pacote DBUG], e ca Pgina 1085. a
1082
handle SIGLWP nostop noprint handle SIGPIPE nostop handle SIGALRM nostop handle SIGHUP nostop handle SIGTERM nostop noprint Se voc tiver problemas depurando threads com gdb, voc deve fazer o download do gdb e e 5.x e experiment-lo. A nova verso do gdb tem um tratamento de threads bem melhorado. a a Aqui est um exemplo de como depurar o mysqld: a shell> gdb /usr/local/libexec/mysqld gdb> run ... backtrace full # Faa isto quando o mysqld falhar c acima e uma email gerado com mysqlbug e envie-o para lista de email do Inclua a saida MySQL. Veja Seo 1.7.1.1 [Mailing-list], Pgina 33. ca a Se o mysqld travar voc pode usar algumas ferramentas de sistema como strace ou e /usr/proc/bin/pstack para exeminar onde mysqld travou. strace /tmp/log libexec/mysqld Se voc estiver usando a interface Perl DBI, voc pode habilitar a informao de depuao e e ca ca usando o mtodo trace ou denindo a varivel de ambiente DBI_TRACE. Veja Seo 12.5.2 e a ca [Classe Perl DBI], Pgina 881. a
1083
0x80ee4bc 0x80c3c91 0x80c6b43 0x80c1fd9 0x80c1686 voc pode descobrir onde o mysqld nalizou fazendo o seguinte: e 1. Copie os nmeros acima em um arquivo, por exemplo mysqld.stack. u 2. Faa um arquivo de s c imbolos para o servidor mysqld: nm -n libexec/mysqld > /tmp/mysqld.sym Note que a maioria das distribuies binrias do MySQL (exceto para o pacotes de co a "depurao" onde as informaes so inclu ca co a idas dentro dos binrios) j possuem o ara a quivo acima, chamado mysqld.sym.gz. Neste caso voc pode simplesmente desempae cot-lo fazendo: a gunzip < bin/mysqld.sym.gz > /tmp/mysqld.sym 3. Execute resolve_stack_dump -s /tmp/mysqld.sym -n mysqld.stack. Isto exibir a onde o mysqld nalizou. Se isto no lhe ajuda a descobrir o porque o a a mysqld morreu, voc deve fazer um relato de erro e incluir a sa do comando acima e ida no relatrio. o Note no entanto que na maioria dos casos, termos apenas um stack trace, no nos a ajudar a encontrar a razo do problema. Para estarmos apto a localizar o erro ou a a fornecer um modo de contorn-lo, precisariamos, na maioria dos casos, conhecer a a consulta que matou o mysqld e de preferncia um caso de teste para que possamos e repetir o problema! Veja Seo 1.7.1.3 [Relato de erros], Pgina 36. ca a
E.1.5 Usando Arquivos de Log para Encontrar a Causa dos Erros no mysqld
Note que antes de iniciarmos o mysqld com --log voc deve vericar todas as suas tabelas e com myisamchk. Veja Capptexi tulo 4 [Administrao do Banco de Dados MySQL], ca Pgina 207. a Se o mysqld morre ou trava, voc deve iniciar o mysqld com --log. Quando o mysqld e morre de novo, voc pode examinar o m do arquivo de log para a consulta que matou o e mysqld. Se voc estiver usando --log sem um nome de arquivo, o log armazenado no diretrio e e o do banco de dados como nomemaquina.log. Na maioria dos casos a ultima consulta no e arquivo de log que matou mysqld, mas se poss ivel voc deve vericar isto reiniciando o e mysqld e executando a consulta encontrada por meio da ferramenta de linha de comando mysql. Se isto funcionar, voc tambm deve testar todas as consultas complicadas que no e e a completaram. Voc tambm pode tentar o comando EXPLAIN em todas as instrues SELECT que levam e e co muito tempo para assegurar que o mysqld est usando a indices apropriados. Veja Seo 5.2.1 ca [EXPLAIN], Pgina 424. a Voc pode encontrar as consultas que levam muito twempo para executar iniciando o mysqld e com --log-slow-queries. Veja Seo 4.10.5 [Log de consultas lentas], Pgina 377. ca a
1084
Se voc encontrar o texto mysqld restarted no arquivo de registro de erro (normalmente e chamado hostname.err) voc provavelmente encontrou uma consulta que provocou a falha e no mysqld. Se isto acontecer voc deve vericar todas as suas tabelas com myisamchk e (veja Cap ptexi tulo 4 [Administrao do Banco de Dados MySQL], Pgina 207) e testar ca a a consulta no arquivo de log do MySQL para ver se ela no funcionou. Se voc encona e trar tal consulta, tente primeiro atualizar para uma verso mais nova do MySQL. Se isto a no ajudar e voc no puder encontrar nada no arquivo de mensagem mysql, voc deve a e a e relatar o erro para uma lista de email do MySQL. As listas de email esto descritas em a http://lists.mysql.com/, que tambm possui os links para as listas de arquivos online. e Se voc iniciou o mysqld com myisam-recover, o MySQL vericar automaticamente e a e tentar reparar as tabelas MyISAM se elas estiverem marcadas como no fechadas a a apropriadamente ou com falha. Se isto acontecer, o MySQL ir escrever uma entrada a Warning: Checking table ... no arquivo nomemaquina.err, a qual seguida por e Warning: Repairing table se a tabela precisar ser reparada. Se voc obter vrios desses e a erros, sem que o mysqld nalize inesperadamente um pouco antes, ento algo est errado e a a precisa ser investigado melhor. Veja Seo 4.1.1 [Opes de linha de comando], Pgina 207. ca co a claro que no um bom sinal se o mysqld morreu inesperadamente, mas neste caso no se E a e a deve invwestigar as mensagens Checking table... e sim tentar descobrir por que o mysqld morreu.
1085
erros em http://bugs.mysql.com/. Se voc um consumidor com suporte, voc e e e tambm pode enviar um email para [email protected] para alertar a equipe do e MySQL sobre o problema e t-lo corr e igido o mais rpido poss a ivel.. Voc tambm pode usar o script mysql_find_rows para executar algumas das instrues e e co de atualizao se voc quiser estreitar o problema. ca e
1086
flag[,modifier,modifier,...,modifier] Os carcteres de parmetros atualmente reconhecidos so: a a Parmetro Descrio a ca d Habilita a sa de macros DBUG <N> para o estado atual. Pode ser seguido ida por uma lista de palavras chaves que selecionam a sa apenas para as macros ida DBUG com aquela palavra chave. Uma lista de palavras chaves vazia indica a sa para todas as macros. ida D Atraso depois de cada linha de sa do depurados. O argumento o nmero de ida e u dcimos de segundo do atraso, sujeito `s capacidades da mquina. Por exemplo, e a a -#D,20 atrasa em dois segundos f Limita a depurao e/ou rastreamento, e perlemento da lista de funes lisca co tadas. Note que uma lista nula disabilitar todas as funes. O parmetro "d" a co a ou "t" apropriado ainda deve ser dado, este parmetro s limita as suas aesse a o co eles estiverem habilitados. F Identica o nome do arquivo fonte para cada linha de sa da depurao ou ida ca rastreamento. i Identica o processo com o PID ou a ID da thread para cada linha de sa da ida depurao ou rastreamento. ca g Habilita a modelagem. Cria um arquivo chamado dbugmon.out contendo informaes que poder ser usadas para moldar o programa. Pode ser seguida por co uma lista de palavras chaves que selecionam a modelagem apenas para as funes co naquela lista. Uma lista nula indica que todas as funes sero consideradas. co a L Identica o nmero da linha do arquivo fonte para cada linha de sa da u ida depurao ou rastreamento. ca n Exibe a profundidade de aninhamento da funo atual para cada linha de sa ca ida da depurao ou rastreamento. ca N Nmero de cada linha de sa do dbug. u ida o Redireciona o uxo de sa do depurador para um arquivo espec ida ico. A sa ida padro stderr. a e O Igual a o, mas o arquivo realmente descarregado entre cada escrita. Quando e necessrio o arquivo fechado e reaberto entre cada escrita. a e p Limita as aes do depurador para um processo espec co ico. Um processo deve ser indenticado com a macro DBUG PROCESS e corresponder a um dos itens especicados na lista de aes do depurador que devem ocorrer. co P Exibe o nome do processo atual para cada linha de sa da depurao ou ida ca rastreamento. r Quando recebe um novo estado, no herda o n a ivel de aninhamento da funo ca do estado anterior. Util quando a sa iniciada na margem esquerda. ida e S Executa a funo sanity( le , line ) a cada funo depurada at que sanity() ca ca e retorne algo diferente de 0. (Geralmente usada com safemalloc para encontrar falhas de memria). o t Habilita a linhas do trace de chamada/sa de funes. Pode ser seguido ida co por uma lista (contendo apenas um modicador) dando um o n ivel numrico e ser exibida, tanto para mximo de rastreamento, alm do que nenhuma saida a e a a depurao quanto para macros trace. O padro uma opo de tempo de ca a e ca compilao. ca
1087
Alguns exemplos de strings de controle do depurador que podem aparecer em uma linha de comando do shell (o "-#" normalmente usado para introduzir uma string de controle a e um aplicativo) so: a -#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 opo d) so: enter,exit,error,warning,info ca a e loop.
1088
SELECT combinado com INSERT (e muito poucas instrues UPDATEs e DELETEs). co Muitas varreduras / GROUP BY em toda a tabela sem nenhuma escrita. Outra opes alm de bloqueios a n de pgina / registro: co e ivel a Versioning (como usamos no MySQL para inseres concorrentes) onde voc pode ter um co e escrita e vrias leituras ao mesmo tempo. Isto signica que o banco de dados/tabelas suporta a diferentes viiews para os dados dependendo de quando se comea a acess-lo. Outros nomes c a deste recurso so time travel, cia na escrita ou cpia por demanda. a o o Cpia por demanda em muitos casos muito melhor que bloqueio a n o e ivel de registro ou pgina; o piro caso, no entanto, usa muito mais memria que a usada em travamentos a o normais. Em vez de se usar bloqueio de registro pode-se usar bloqueios no aplicativo (como o get lock/release lock no MySQL). Isto s funciona em aplicaticos bem comportados. Em muitos casos pode se fazer um palpite sobre qual tipo de bloqueio melhor para a e aplicao. mas geralmente muito dif dizer que um dado tipo de bloqueio melhor que ca e icil e outro; tudo depende da aplicao e diferentes partes da aplicao podem exigir diferentes ca ca tipos de bloqueios. Aqui esto algumas dicas sobre travamento no MySQL: a A maioria das aplicaes web fazem diversos selects, muito poucas delees, atualizaoes co co principalmente nas chaves e inseres em tabelas espec co icas. A congurao base do MySQL ca bem sitonizada para esta nalidade. e Usurios concorrentes no so um problema se eles no misturam atualizaes com selees a a a a co co que precisam examinar muitas linhas na mesma tabela. Se misturado inseres e excluses na mesma tabela ento INSERT DELAYED pode ser de e co o a grande ajuda. Pode se tambm usar LOCK TABLES para aumentar a velocidade (muitas atualizaes com e co um travamento simples muito mais rpida que atualizaes sem travamento). Separar as e a co coisas em tabelas diferentes tambm ajudar. e a Se voc tiver problemas de velocidade com travamento de tabelas no MySQL, voc pode e e estar apto a resolver isto convertendo alguma de suas tabelas para tipos InnoDB ou BDB. Veja Seo 7.5 [InnoDB], Pgina 643. Veja Seo 7.6 [BDB], Pgina 698. ca a ca a A seo de otimizao no manual cobre diversos aspectos de como sintonizar a sua aplicao. ca ca ca Veja Seo 5.2.13 [Dicas], Pgina 440. ca a
1089
pthread_get_specific deve usar um argumento. sigwait deve usar dois argumentos. Diversas funes (pelo menos pthread_cond_wait, pthread_cond_timedwait) deve retornar co o cdigo do erro. Agora eles retornam -1 e conguram errno. o Outro problema que threads a nivel do usuario usam o sinal ALRM e isto aborta diversas e das funes (read, write, open...). O MySQL deve fazer uma nova tentativa de interrupo co ca em todos mas no facil de se verica isto. a e O maior problema no solucionado o seguinte: a e 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 no podemos a encontrar nenhuma soluo fcil. ca a Se algum quiser experimentar o MySQL com RTS threads sugerimos o seguinte: e Altere as funes que o MySQL usa da biblioteca de threads para POSIX. Isto no co a deve levar tanto tempo. Compile todas as bibliotecas com -DHAVE_rts_threads. Compile thr_alarm. Se houver alguma pequena diferena na implementao, elas devem ser corrigidas alc ca terando my_pthread.h e my_pthread.c. Execute thr_alarm. Se ele executar sem mensagens de aviso, erro ou aborto, voc e est na trilha certa. Aqui est uma execuo bem sucedidad no Solaris: a a ca 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
1090
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
1091
Em alguns sistemas, threads do kernel so gerenciadas threads de usurio integrads em a a bibkliotecas de sistemas. Nestes casos a troca de thread pode ser feita pela biblioteca de threads e o kernel no tm real conhecimento da thread. a e
1092
1093
1094
"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 instncias da sequncia abc. a e 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 ocorrncias de um tomo anterior. e a 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 tomo seguido por um limite contendo um inteiro i a e nenhuma virgula casa com uma sequncia de exatamente i combinaes do e co a tomo. Um tomo seguido por um limite contendo i e uma virgula casa com a uma sequncia de i ou mais combinaes do tomo. Um tomo seguido por e co a a um limite contendo dois inteiros i e j casa com uma seqquncia de i at j e e (inclusive) combinaes de tomos. co a Ambos os argumentos devem estar na faixa de 0 ate RE_DUP_MAX (padro a 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 no, se ^ usado) a, b, c, d a e 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 no tenha um signicado denido dentro de um para [] a no tem nenhum signicado especial e combina apenas com ele mesmo. a 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 sequncia de caracteres daquele elemento ordenado. A sequncia um unico e e e elemento da lista de expresses entre colchetes. Um expresso entre colchetes o a contendo um elemento ordenado multi-caracter pode ento combinar com mais a
1095
de um caracter, por exemplo, se a sequncia ordenada inclui um elemento ore denado ch, ento a expreso regular [[.ch.]]*c casa com os primeiros cinco a a caracteres de chchcc. [=classe_caracter=] Uma classe equivalente, procura pela sequncia de caracteres de todos elementos e ordenados equivalentes `quele, incluindo ele mesmo. a Por exemplo, se o e (+) so os membros de uma classe equivalente, ento a a [[=o=]], [[=(+)=]] e [o(+)] so todos sinnimos. Uma classe equivalente a o no pode ser o nal de uma escala. a [: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 padres so: o a Nome Nome Nome alnum digit punct alpha graph space blank lower upper cntrl print xdigit Ele procura pelas classes de caracteres denidas na pgina ctype(3) do manual. a Um local pode forncer outros. Uma classe de caracter no pode ser usada como a 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 denida como uma sequencia de caracteres de palavra os quais e no so nem precedido e nem seguidos por caracteres de palavras. Um caracter a a de palavra um caracter alfa numrico (como denido por ctype(3)) ou um e e 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
1096
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.
1097
1098
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
1099
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.
1100
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.
1101
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.
1102
<
< (menor que) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . << . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . << (deslocamento a esquerda) . . . . . . . . . . . . . . <= (menor que ou igual) . . . . . . . . . . . . . . . . . . . . <=> (Igual a) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . <> (diferente) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 201 546 506 506 506
"
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
%
% (meta caracter). . . . . . . . . . . . . . . . . . . . . . . . . . 469 % (modulo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
=
= (igual) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
> &
& (operado binrio AND) . . . . . . . . . . . . . . . . . . . 546 a && (AND lgico) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 o > (maior que) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 >= (maior que ou igual) . . . . . . . . . . . . . . . . . . . . 506 >> (deslocamento a direita) . . . . . . . . . . . . . . . 546
(
() (parenteses) . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 (Control-Z) \z . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
^
^ (operado binrio XOR) . . . . . . . . . . . . . . . . . . . 546 a
*
* (multiplica~o) . . . . . . . . . . . . . . . . . . . . . . . . . 522 ca
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
+
+ (adi~o) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522 ca
\
\" \ \\ \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 unrio) . . . . . . . . . . . . . . . . . . . . . . . . . . . a - (subtraao) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c~ -p op~es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co -password op~es . . . . . . . . . . . . . . . . . . . . . . . . . . co 523 522 267 267
.
.my.cnf file. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 .mysql_history, arquivo . . . . . . . . . . . . . . . . . . . 345 .pid (process ID), arquivo . . . . . . . . . . . . . . . . 292
|
| (operador binrio OR) . . . . . . . . . . . . . . . . . . . 546 a || (OR lgico) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 o
/
/ (divis~o) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522 a /etc/passwd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 /etc/passwd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
~
~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
1103
A
ABS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ACOS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ADDDATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ADDTIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . adi~o (+) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca AES_DECRYPT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AES_ENCRYPT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ALTER COLUMN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ALTER FUNCTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . ALTER PROCEDURE . . . . . . . . . . . . . . . . . . . . . . . . . . . ALTER TABLE . . . . . . . . . . . . . . . . . . . . . . . 608, 610, ANALYZE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AND lgico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o AND, operado binrio . . . . . . . . . . . . . . . . . . . . . . a Area() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753, aritimticas, fun~es . . . . . . . . . . . . . . . . . . . . . e co ARQUIVO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . arquivo .my.cnf . . . . . 135, 216, 218, 239, 253, 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 549 549 933 610 766 766 938 298 509 546 754 546 515 267 567 748 512 526 469 472 469 748 526 526 886 556
C
C:\my.cnf file . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 CALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 CASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510, 772 CAST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 CC variveis de ambiente . . . . . . . . . . . . . . . . . . . 98 a CC, varivel de ambiente . . . . . . . . . . . . . 105, 1092 a CEILING() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 Centroid() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754 CFLAGS, varivel de ambiente . . . . . . . . 105, 1092 a 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 CHECKSUM TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 ChopBlanks, mtodo DBI . . . . . . . . . . . . . . . . . . . . 885 e CLOSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771 COALESCE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508 coer~o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 ca Comentrio sintaxe . . . . . . . . . . . . . . . . . . . . . . . . 479 a COMMIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46, 615 compara~o, operadores de . . . . . . . . . . . . . . . . . 504 ca COMPRESS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 CONCAT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 CONCAT_WS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 connect(), mtodo DBI . . . . . . . . . . . . . . . . . . . . . 882 e CONNECTION_ID() . . . . . . . . . . . . . . . . . . . . . . . . . . . 552 Contains() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757 CONV() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513 CONVERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 ConvexHull() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755 COS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 COT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 COUNT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556 COUNT(DISTINCT) . . . . . . . . . . . . . . . . . . . . . . . . . . . 556 CRC32() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 CREATE DATABASE . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 CREATE FUNCTION . . . . . . . . . . . . . . . . . . . . . . . 764, 900 CREATE INDEX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 CREATE PROCEDURE . . . . . . . . . . . . . . . . . . . . . . . . . . 764 CREATE TABLE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598 CROSS JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 Crosses() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615, BENCHMARK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BETWEEN ... AND . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIGINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . binrias, fun~es . . . . . . . . . . . . . . . . . . . . . . . . . a co BINARY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482, BIT_AND() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT_COUNT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT_COUNT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT_LENGTH() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT_OR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT_OR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIT_XOR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BLOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486, BOOL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482, 469 277 743 744 743 744 767 553 507 482 512 546 521 486 558 201 546 512 201 558 558 498 486
1104
CURRENT_USER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 CURTIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 CXX varveis de ambiente . . . . . . . . . . . . . . . . . . . 98 a CXX, varivel de ambiente . . . . . . . . . . . . 105, 1092 a CXXFLAGS environment variable . . . . . . . . . . . . . . 99 CXXFLAGS, varveis de ambiente . . . . . . . . . . . . . 99 a CXXFLAGS, variavel de ambiente . . . . . . . . . . . . 105 CXXFLAGS, varivel de ambiente . . . . . . . . . . . 1092 a
D
data e hora, fun~es de . . . . . . . . . . . . . . . . . . . . 529 co data_sources(), mtodo DBI . . . . . . . . . . . . . . . . 885 e Database information, obtaining . . . . . . . . . . 302 DATABASE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 DATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484, 491, 931 DATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 DATE_ADD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 DATE_FORMAT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537 DATE_SUB() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 DATEDIFF() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536 DATETIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484, 491 DAY() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 DAYNAME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 DAYOFMONTH() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 DAYOFWEEK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 DAYOFYEAR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 DBI->{ChopBlanks} . . . . . . . . . . . . . . . . . . . . . . . . . 885 DBI->{is_blob} . . . . . . . . . . . . . . . . . . . . . . . . . . . . 886 DBI->{is_key} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 886 DBI->{is_not_null} . . . . . . . . . . . . . . . . . . . . . . . . 887 DBI->{is_num} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 886 DBI->{is_pri_key} . . . . . . . . . . . . . . . . . . . . . . . . . 886 DBI->{length} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887 DBI->{max_length} . . . . . . . . . . . . . . . . . . . . . . . . . 887 DBI->{mysql_insertid} . . . . . . . . . . . . . . . . . . . . 886 DBI->{NAME} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887 DBI->{NULLABLE} . . . . . . . . . . . . . . . . . . . . . . . . . . . 885 DBI->{NUM_OF_FIELDS}. . . . . . . . . . . . . . . . . . . . . . 885 DBI->{table} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887 DBI->{type} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887 DBI->connect() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 882 DBI->data_sources() . . . . . . . . . . . . . . . . . . . . . . . 885 DBI->disconnect . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 DBI->do() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884 DBI->execute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884 DBI->fetchall_arrayref . . . . . . . . . . . . . . . . . . . 885 DBI->fetchrow_array . . . . . . . . . . . . . . . . . . . . . . . 884 DBI->fetchrow_arrayref . . . . . . . . . . . . . . . . . . . 884 DBI->fetchrow_hashref . . . . . . . . . . . . . . . . . . . . 884 DBI->finish . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885 DBI->prepare() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 DBI->quote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 DBI->quote() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884 DBI->rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885 DBI->trace . . . . . . . . . . . . . . . . . . . . . . . . . . . 885, 1082 DBI_TRACE, varivel de ambiente . . . . . . . . . . . 886 a DBI_TRACE, varivel de ambiente . . . . 1082, 1092 a
DBI_USER, varivel de ambiente . . . . . . . . . . . 1092 a DEC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 DECIMAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 DECLARE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 DECODE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 DEGREES() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 DELAYED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582 DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585 DES_DECRYPT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 DES_ENCRYPT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549 DESC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614 DESCRIBE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192, 614 diferente (!=) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 diferente (<>) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 Difference() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755 Dimension() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749 disconnect, mtodo DBI . . . . . . . . . . . . . . . . . . . . 883 e Disjoint() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757 Distance() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758 DISTINCT . . . . . . . . . . . . . . . . . . . . . . . . . . 180, 434, 556 DIV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 diversas, fun~es . . . . . . . . . . . . . . . . . . . . . . . . . 547 co divis~o (/) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522 a DO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 do(), mtodo DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . 884 e DOUBLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 DOUBLE PRECISION . . . . . . . . . . . . . . . . . . . . . . . . . . 484 DROP DATABASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 DROP FUNCTION . . . . . . . . . . . . . . . . . . . . . . . . . 766, 900 DROP INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610, 614 DROP PRIMARY KEY . . . . . . . . . . . . . . . . . . . . . . . . . . . 610 DROP PROCEDURE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766 DROP TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 DROP USER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 DUMPFILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
E
ELT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513 ENCODE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 ENCRYPT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 EndPoint() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751 ENUM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487, 499 Envelope() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749 environment variable, CXXFLAGS . . . . . . . . . . . . . 99 Environment variable, LD_RUN_PATH . . . . . . . . 166 Equals() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757 escape (\\) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 execute, mtodo DBI . . . . . . . . . . . . . . . . . . . . . . . 884 e EXP() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 EXPLAIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 EXPORT_SET() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513 ExteriorRing() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753 EXTRACT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
1105
F
FALSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FETCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . fetchall_arrayref, mtodo DBI . . . . . . . . . . . . . e fetchrow_array, mtodo DBI . . . . . . . . . . . . . . . . e fetchrow_arrayref, mtodo DBI . . . . . . . . . . . . . e fetchrow_hashref, mtodo DBI . . . . . . . . . . . . . . e FIELD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FIND_IN_SET() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . finish, mtodo DBI . . . . . . . . . . . . . . . . . . . . . . . . e FIXED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FLOAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FLOAT(M,D) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FLOAT(precis~o) . . . . . . . . . . . . . . . . . . . . . . 483, a FLOOR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FLUSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . fluxo de controle, fun~es . . . . . . . . . . . . . . . . co FORCE INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . 563, FORMAT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FOUND_ROWS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FROM_DAYS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FROM_UNIXTIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . fun~es de data e hora . . . . . . . . . . . . . . . . . . . . . co fun~es de fluxo de controle . . . . . . . . . . . . . . co fun~es definidas pelo usurio . . . . . . . . . . . . co a fun~es matematicas . . . . . . . . . . . . . . . . . . . . . . . co fun~es string . . . . . . . . . . . . . . . . . . . . . . . . . . . . co fun~es, aritimticas . . . . . . . . . . . . . . . . . . . . . co e fun~es, binrias . . . . . . . . . . . . . . . . . . . . . . . . . co a fun~es, diversas . . . . . . . . . . . . . . . . . . . . . . . . . co fun~es, GROUP BY. . . . . . . . . . . . . . . . . . . . . . . . . . co functions de compara~o de string . . . . . . . . . ca 471 771 885 884 884 884 513 515 514 885 484 483 483 484 523 299 510 568 552 554 563 537 542 529 510 900 523 512 546 546 547 556 519
H
HANDLER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595 HEX() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 HOME varivel de ambiente . . . . . . . . . . . . . . . . . 345 a HOME, varivel de ambiente . . . . . . . . . . . . . . . 1092 a 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438, INSERT ... SELECT. . . . . . . . . . . . . . . . . . . . . . . . . . INSERT DELAYED . . . . . . . . . . . . . . . . . . . . . . . . . . . . INSERT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INSERT, cooncess~o de privilgios com a e instru~es . . . . . . . . . . . . . . . . . . . . . . . . . . . . co INSTR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . instru~es GRANT . . . . . . . . . . . . . . . . . . . . . . . . . . co instru~es INSERT . . . . . . . . . . . . . . . . . . . . . . . . . co INT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INTEGER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . InteriorRingN() . . . . . . . . . . . . . . . . . . . . . . . . . . . Intersection() . . . . . . . . . . . . . . . . . . . . . . . . . . . . Intersects() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INTERVAL() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IS NOT NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IS NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434, IS NULL, e ndices . . . . . . . . . . . . . . . . . . . . . . . . . i is_blob, mtodo DBI . . . . . . . . . . . . . . . . . . . . . . . e IS_FREE_LOCK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . is_key, mtodo DBI . . . . . . . . . . . . . . . . . . . . . . . . e is_not_null, mtodo DBI . . . . . . . . . . . . . . . . . . . e is_num, mtodo DBI . . . . . . . . . . . . . . . . . . . . . . . . e is_pri_key, mtodo DBI . . . . . . . . . . . . . . . . . . . . e IsClosed() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751, IsEmpty() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ISNULL() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ISOLATION LEVEL . . . . . . . . . . . . . . . . . . . . . . . . . . . IsRing() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IsSimple() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ITERATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 771 510 511 568 569 505 507 554 554 567 579 581 582 514 262 514 261 262 482 482 753 755 757 508 506 506 449 886 553 886 887 886 886 752 750 507 619 752 750 773
G
GeomCollFromText() . . . . . . . . . . . . . . . . . . . . . . . . GeomCollFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . GEOMETRY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GEOMETRYCOLLECTION . . . . . . . . . . . . . . . . . . . . . . . . GeometryCollection(). . . . . . . . . . . . . . . . . . . . . . GeometryCollectionFromText() . . . . . . . . . . . . . GeometryCollectionFromWKB() . . . . . . . . . . . . . . GeometryFromText() . . . . . . . . . . . . . . . . . . . . . . . . GeometryFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . GeometryN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GeometryType() . . . . . . . . . . . . . . . . . . . . . . . . . . . . GeomFromText(). . . . . . . . . . . . . . . . . . . . . . . . 742, GeomFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . 743, GET_FORMAT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GET_LOCK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GLength() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751, GRANT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GRANT, instru~o . . . . . . . . . . . . . . . . . . . . . . . . . . ca GRANT, instru~es . . . . . . . . . . . . . . . . . . . . . . . . . co GRANTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GREATEST() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743 744 742 742 745 743 744 742 743 754 749 748 748 539 553 752 254 273 261 322 528
1106
J
JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
M
maior que (>) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . maior que ou igual (>=) . . . . . . . . . . . . . . . . . . . . MAKE_SET() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MAKEDATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MAKETIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MASTER_POS_WAIT() . . . . . . . . . . . . . . . . . . . . 405, MATCH ... AGAINST() . . . . . . . . . . . . . . . . . . . . . . . matematicas, fun~es . . . . . . . . . . . . . . . . . . . . . . co MAX() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . max_length, mtodo DBI . . . . . . . . . . . . . . . . . . . . e MBRContains() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MBRDisjoint() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MBREqual() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MBRIntersects() . . . . . . . . . . . . . . . . . . . . . . . . . . . MBROverlaps() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MBRTouches() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MBRWithin() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MD5() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MEDIUMBLOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MEDIUMINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MEDIUMTEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . menor que (<) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . menor que ou igual (<=) . . . . . . . . . . . . . . . . . . . . menos unrio (-) . . . . . . . . . . . . . . . . . . . . . . . . . . . a 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~o (*) . . . . . . . . . . . . . . . . . . . . . . . . . ca MULTIPOINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MultiPoint() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MultiPointFromText(). . . . . . . . . . . . . . . . . . . . . . MultiPointFromWKB() . . . . . . . . . . . . . . . . . . . . . . . MULTIPOLYGON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MultiPolygon() . . . . . . . . . . . . . . . . . . . . . . . . . . . . MultiPolygonFromText() . . . . . . . . . . . . . . . . . . . MultiPolygonFromWKB() . . . . . . . . . . . . . . . . . . . . my_init() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . my_ulonglong, imprimindo valores . . . . . . . . . my_ulonglong, tipo C . . . . . . . . . . . . . . . . . . . . . . MySQL C type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 506 516 541 541 554 521 523 556 887 756 756 756 756 757 757 756 548 486 482 486 506 506 523 469 469 533 516 556 533 743 523 523 523 523 531 531 743 744 743 744 742 745 743 522 742 745 743 744 742 745 743 744 858 776 776 830
K
KILL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
L
LAST_DAY() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 LAST_INSERT_ID() . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 LAST_INSERT_ID([expr]) . . . . . . . . . . . . . . . . . . . 551 LCASE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 LD_RUN_PATH environment variable . . . . . . . . . 166 LD_RUN_PATH variveis de ambiente . . . . . . . . . 147 a LD_RUN_PATH, varivel de ambiente . . . 140, 1092 a LEAST() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 LEAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772 LEFT JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435, 567 LEFT OUTER JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 LEFT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 LENGTH() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 length, mtodo DBI . . . . . . . . . . . . . . . . . . . . . . . . 887 e LIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 LIKE, e ndices . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 i LIKE, e meta caracteres . . . . . . . . . . . . . . . . . . . 448 LIMIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437, 554 LineFromText() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743 LineFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744 LINESTRING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742 LineString() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745 LineStringFromText(). . . . . . . . . . . . . . . . . . . . . . 743 LineStringFromWKB() . . . . . . . . . . . . . . . . . . . . . . . 744 LN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 LOAD DATA FROM MASTER . . . . . . . . . . . . . . . . . . . . . . 404 LOAD DATA INFILE . . . . . . . . . . . . . . . . . . . . . . 588, 932 LOAD TABLE FROM MASTER . . . . . . . . . . . . . . . . . . . . 405 LOAD_FILE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 LOCALTIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 LOCALTIMESTAMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 LOCATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 LOCK TABLES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617 LOG() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 LOG10() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 LOG2() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 logico, operadores . . . . . . . . . . . . . . . . . . . . . . . . 508 LONG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498 LONGBLOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 LONGTEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 LOOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772 LOWER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 LTRIM() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
1107
MYSQL, tipo C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 776 mysql_affected_rows() . . . . . . . . . . . . . . . . . . . . 783 mysql_autocommit(). . . . . . . . . . . . . . . . . . . . . . . . 826 MYSQL_BIND, tipo C . . . . . . . . . . . . . . . . . . . . . . . . 828 mysql_bind_param() . . . . . . . . . . . . . . . . . . . . . . . . 836 mysql_bind_result() . . . . . . . . . . . . . . . . . . . . . . . 842 mysql_change_user() . . . . . . . . . . . . . . . . . . . . . . . 784 mysql_character_set_name() . . . . . . . . . . . . . . . 785 mysql_close() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786 mysql_commit(). . . . . . . . . . . . . . . . . . . . . . . . . . . . 825 mysql_connect() . . . . . . . . . . . . . . . . . . . . . . . . . . . 786 mysql_create_db() . . . . . . . . . . . . . . . . . . . . . . . . . 787 mysql_data_seek() . . . . . . . . . . . . . . . . . . . . . . . . . 787 MYSQL_DEBUG varivel de ambiente . . . . . . . . . . 345 a MYSQL_DEBUG varivel de ambiente . . . . . . . . . 1085 a mysql_debug() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788 MYSQL_DEBUG, varivel de ambiente . . . . . . . . 1092 a mysql_drop_db() . . . . . . . . . . . . . . . . . . . . . . . . . . . 788 mysql_dump_debug_info() . . . . . . . . . . . . . . . . . . 789 mysql_eof() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 790 mysql_errno() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791 mysql_error() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792 mysql_escape_string() . . . . . . . . . . . . . . . . . . . . 470 mysql_escape_string() . . . . . . . . . . . . . . . . . . . . 793 mysql_execute() . . . . . . . . . . . . . . . . . . . . . . . . . . . 837 mysql_fetch() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 846 mysql_fetch_field() . . . . . . . . . . . . . . . . . . . . . . . 793 mysql_fetch_field_direct() . . . . . . . . . . . . . . . 794 mysql_fetch_fields(). . . . . . . . . . . . . . . . . . . . . . 794 mysql_fetch_lengths() . . . . . . . . . . . . . . . . . . . . 795 mysql_fetch_row() . . . . . . . . . . . . . . . . . . . . . . . . . 796 MYSQL_FIELD, tipo C . . . . . . . . . . . . . . . . . . . . . . . 776 mysql_field_count() . . . . . . . . . . . . . . . . . . 797, 807 MYSQL_FIELD_OFFSET, tipo C . . . . . . . . . . . . . . . . 776 mysql_field_seek() . . . . . . . . . . . . . . . . . . . . . . . . 798 mysql_field_tell() . . . . . . . . . . . . . . . . . . . . . . . . 799 mysql_free_result() . . . . . . . . . . . . . . . . . . . . . . . 799 mysql_get_client_info() . . . . . . . . . . . . . . . . . . 800 mysql_get_client_version() . . . . . . . . . . . . . . . 800 mysql_get_host_info() . . . . . . . . . . . . . . . . . . . . 800 mysql_get_metadata. . . . . . . . . . . . . . . . . . . . . . . . 835 mysql_get_proto_info() . . . . . . . . . . . . . . . . . . . 801 mysql_get_server_info() . . . . . . . . . . . . . . . . . . 801 mysql_get_server_version() . . . . . . . . . . . . . . . 801 MYSQL_HISTFILE varivel de ambiente . . . . . . 345 a MYSQL_HISTFILE, varivel de ambiente . . . . 1092 a MYSQL_HOST, varivel de ambiemte . . . . . . . . . . 239 a MYSQL_HOST, varivel de ambiente . . . . . . . . . 1092 a mysql_info() . . . . . . . . . . . . . . . . . 581, 584, 595, 610 mysql_info() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 802 mysql_init() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803 mysql_insert_id() . . . . . . . . . . . . . . . . . . . . . . . . . . 49 mysql_insert_id() . . . . . . . . . . . . . . . . . . . . . . . . . 803 mysql_insertid DBI, atrinuto . . . . . . . . . . . . . . 886 mysql_kill() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804 mysql_list_dbs() . . . . . . . . . . . . . . . . . . . . . . . . . . 804 mysql_list_fields() . . . . . . . . . . . . . . . . . . . . . . . 805 mysql_list_processes() . . . . . . . . . . . . . . . . . . . 806
mysql_list_tables() . . . . . . . . . . . . . . . . . . . . . . . 806 mysql_more_results(). . . . . . . . . . . . . . . . . . . . . 826 mysql_next_result().. . . . . . . . . . . . . . . . . . . . . . 827 mysql_num_fields() . . . . . . . . . . . . . . . . . . . . . . . . 807 mysql_num_rows() . . . . . . . . . . . . . . . . . . . . . . . . . . 808 mysql_options() . . . . . . . . . . . . . . . . . . . . . . . . . . . 809 mysql_param_count() . . . . . . . . . . . . . . . . . . . . . . . 835 mysql_ping() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811 mysql_prepare() . . . . . . . . . . . . . . . . . . . . . . . . . . . 834 MYSQL_PS1, varivel de ambiente . . . . . . . . . . 1092 a MYSQL_PWD varivel de ambiente . . . . . . . . . . . . 345 a MYSQL_PWD, varivel de ambiente . . . . . . . . . . . 239 a MYSQL_PWD, varivel de ambiente . . . . . . . . . . 1092 a mysql_query() . . . . . . . . . . . . . . . . . . . . . . . . . 812, 861 mysql_real_connect(). . . . . . . . . . . . . . . . . . . . . . 813 mysql_real_escape_string() . . . . . . . . . . . . . . . 815 mysql_real_query() . . . . . . . . . . . . . . . . . . . . . . . . 816 mysql_reload() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817 MYSQL_RES, tipo C. . . . . . . . . . . . . . . . . . . . . . . . . . 776 mysql_rollback(). . . . . . . . . . . . . . . . . . . . . . . . . . 826 MYSQL_ROW, tipo C. . . . . . . . . . . . . . . . . . . . . . . . . . 776 mysql_row_seek() . . . . . . . . . . . . . . . . . . . . . . . . . . 818 mysql_row_tell() . . . . . . . . . . . . . . . . . . . . . . . . . . 818 mysql_select_db() . . . . . . . . . . . . . . . . . . . . . . . . . 819 mysql_send_long_data(). . . . . . . . . . . . . . . . . . . 851 mysql_server_end() . . . . . . . . . . . . . . . . . . . . . . . . 860 mysql_server_init() . . . . . . . . . . . . . . . . . . . . . . . 859 mysql_set_sever_option() . . . . . . . . . . . . . . . . . 819 mysql_shutdown() . . . . . . . . . . . . . . . . . . . . . . . . . . 820 mysql_sqlstate() . . . . . . . . . . . . . . . . . . . . . . . . . . 820 mysql_ssl_set() . . . . . . . . . . . . . . . . . . . . . . . . . . . 821 mysql_stat() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822 MYSQL_STMT, tipo C . . . . . . . . . . . . . . . . . . . . . . . . 828 mysql_stmt_affected_rows() . . . . . . . . . . . . . . . 842 mysql_stmt_close() . . . . . . . . . . . . . . . . . . . . . . . . 853 mysql_stmt_data_seek() . . . . . . . . . . . . . . . . . . . 844 mysql_stmt_errno() . . . . . . . . . . . . . . . . . . . . . . . . 854 mysql_stmt_error(). . . . . . . . . . . . . . . . . . . . . . . . 854 mysql_stmt_num_rows() . . . . . . . . . . . . . . . . . . . . 845 mysql_stmt_row_seek() . . . . . . . . . . . . . . . . . . . . 844 mysql_stmt_row_tell() . . . . . . . . . . . . . . . . . . . . 845 mysql_stmt_sqlstate() . . . . . . . . . . . . . . . . . . . . 855 mysql_stmt_store_result() . . . . . . . . . . . . . . . . 843 mysql_store_result() . . . . . . . . . . . . . . . . . 822, 861 MYSQL_TCP_PORT varivel de ambiente . . . . . . 345 a MYSQL_TCP_PORT, variavel de ambiente . . . . . 225 MYSQL_TCP_PORT, varivel de ambiente . . . . 1092 a mysql_thread_end() . . . . . . . . . . . . . . . . . . . . . . . . 858 mysql_thread_id() . . . . . . . . . . . . . . . . . . . . . . . . . 823 mysql_thread_init() . . . . . . . . . . . . . . . . . . . . . . . 858 mysql_thread_safe() . . . . . . . . . . . . . . . . . . . . . . . 859 MYSQL_UNIX_PORT varivel de ambiente . . . . . 345 a MYSQL_UNIX_PORT, varivel de ambiente . . . . 116 a MYSQL_UNIX_PORT, variavel de ambiente . . . . 225 MYSQL_UNIX_PORT, varivel de ambiente . . . 1092 a mysql_use_result() . . . . . . . . . . . . . . . . . . . . . . . . 824 mysql_warning_count(). . . . . . . . . . . . . . . . . . . . 825
1108
N
NAME, mtodo DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . e 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185, NULL, valor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NULLABLE, mtodo DBI . . . . . . . . . . . . . . . . . . . . . . e NULLIF() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NUM_OF_FIELDS, mtodo DBI . . . . . . . . . . . . . . . . . e NUMERIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NumGeometries() . . . . . . . . . . . . . . . . . . . . . . . . . . . NumInteriorRings() . . . . . . . . . . . . . . . . . . . . . . . . NumPoints() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887 485 567 567 567 567 485 507 507 520 508 521 469 541 469 932 472 885 511 885 484 754 753 751
PointOnSurface() . . . . . . . . . . . . . . . . . . . . . . . . . . PolyFromText() . . . . . . . . . . . . . . . . . . . . . . . . . . . . PolyFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . POLYGON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Polygon() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PolygonFromText() . . . . . . . . . . . . . . . . . . . . . . . . . PolygonFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . . POSITION() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . POW() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . POWER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . prepare(), mtodo DBI . . . . . . . . . . . . . . . . . . . . . e PRIMARY KEY . . . . . . . . . . . . . . . . . . . . . . . . . . . 602, PROCESSLIST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PURGE MASTER LOGS. . . . . . . . . . . . . . . . . . . . . . . . . .
754 743 744 742 745 743 744 517 525 525 883 610 320 400
Q
QUARTER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 QUOTE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 quote(), mtodo DBI . . . . . . . . . . . . . . . . . . . . . . . 884 e
R
RADIANS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 RAND() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 REAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 ref_or_null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 REGEXP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520 Related() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758 RELEASE_LOCK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 RENAME TABLE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 REPAIR TABLE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 REPEAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773 REPEAT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 REPLACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587 REPLACE ... SELECT . . . . . . . . . . . . . . . . . . . . . . . . 581 REPLACE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 REQUIRE GRANT, op~es . . . . . . . . . . . . . . . . . . . . . 273 co RESET MASTER. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 RESET SLAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405 RESTORE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 restri~es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 co retorno (\r). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 retorno de carro (\r) . . . . . . . . . . . . . . . . . . . . . . 469 REVERSE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 REVOKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 RIGHT JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 RIGHT OUTER JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 RIGHT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 RLIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520 ROLLBACK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46, 615 ROLLBACK TO SAVEPOINT . . . . . . . . . . . . . . . . . . . . . 616 ROLLUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 ROUND() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 rows, mtodo DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . 885 e RPAD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 RTRIM() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
O
OCT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 OCTET_LENGTH() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 OLD_PASSWORD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 op~es de configura~o, --with-charset . . . . 99 co ca op~es de configura~o, --with-extra-charset co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 op~es de linha de comando . . . . . . . . . . . . . . . . . 207 co OPEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771 operadores logicos . . . . . . . . . . . . . . . . . . . . . . . . 508 OPTIMIZE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 OR logico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 OR, operador binrio . . . . . . . . . . . . . . . . . . . . . . 546 a ORD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 ORDER BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610 Overlaps() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757
P
parenteses ( e ) . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 PASSWORD() . . . . . . . . . . . . . . . . . . . 240, 266, 547, 920 PATH, variavel de ambiente . . . . . . . . . . . . . . . . . 93 PATH, varivel de ambiente . . . . . . . . . . . . . . . 1092 a PERIOD_ADD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533 PERIOD_DIFF() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533 PI() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 POINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742 Point() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745 PointFromText() . . . . . . . . . . . . . . . . . . . . . . . . . . . 742 PointFromWKB() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744 PointN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752
1109
S
SAVEPOINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616 SEC_TO_TIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 SECOND() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533 SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 SELECT INTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768 SELECT INTO TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 SELECT, otimizando . . . . . . . . . . . . . . . . . . . . . . . . 424 SELECT, velocidade do . . . . . . . . . . . . . . . . . . . . . 431 SESSION_USER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 SET . . . . . . . . . . . . . . . . . . . . . . . . . . 460, 487, 500, 768 SET GLOBAL SQL_SLAVE_SKIP_COUNTER . . . . . . . . 405 SET OPTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460 SET PASSWORD, instru~es . . . . . . . . . . . . . . . . . . 266 co SET SQL_LOG_BIN . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 SET TRANSACTION . . . . . . . . . . . . . . . . . . . . . . . . . . . 619 SHA() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 SHA1() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 SHOW BINLOG EVENTS . . . . . . . . . . . . . . . . . . . . . . . . 401 SHOW COLUMNS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 SHOW CREATE FUNCTION . . . . . . . . . . . . . . . . . . . . . . 767 SHOW CREATE PROCEDURE . . . . . . . . . . . . . . . . . . . . . 767 SHOW CREATE TABLE . . . . . . . . . . . . . . . . . . . . . 302, 322 SHOW DATABASES . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 SHOW FIELDS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 SHOW FUNCTION STATUS . . . . . . . . . . . . . . . . . . . . . . 767 SHOW GRANTS . . . . . . . . . . . . . . . . . . . . . . . . . . . 302, 322 SHOW INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 SHOW KEYS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 SHOW MASTER LOGS . . . . . . . . . . . . . . . . . . . . . . 302, 401 SHOW MASTER STATUS . . . . . . . . . . . . . . . . . . . . 302, 401 SHOW PRIVILEGES . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 SHOW PROCEDURE STATUS . . . . . . . . . . . . . . . . . . . . . 767 SHOW PROCESSLIST . . . . . . . . . . . . . . . . . . . . . . 302, 320 SHOW SLAVE HOSTS . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 SHOW SLAVE STATUS . . . . . . . . . . . . . . . . . . . . . 302, 406 SHOW STATUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 SHOW TABLE STATUS. . . . . . . . . . . . . . . . . . . . . . . . . . 302 SHOW TABLE TYPES . . . . . . . . . . . . . . . . . . . . . . 302, 324 SHOW TABLES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 SHOW VARIABLES . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 SHOW WARNINGS . . . . . . . . . . . . . . . . . . . . . . . . . 302, 323 SIGN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 SIN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 SMALLINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 SOUNDEX() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518 SOUNDS LIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520 SPACE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518 SQL_CACHE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628 SQL_NO_CACHE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628 SQRT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 SRID() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749 START SLAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 START TRANSACTION . . . . . . . . . . . . . . . . . . . . . . . . . 615 StartPoint() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752 STD() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 STDDEV() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 STOP SLAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
STR_TO_DATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . STRAIGHT_JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . STRCMP() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . string, fun~es . . . . . . . . . . . . . . . . . . . . . . . . . . . co string, fun~es de compara~o de . . . . . . . . . . co ca SUBDATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SUBSTRING() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SUBSTRING_INDEX() . . . . . . . . . . . . . . . . . . . . . . . . . SUBTIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . subtra~o (-) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca SUM() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SymDifference() . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSDATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTEM_USER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
539 567 521 512 519 540 518 518 540 522 557 755 541 547
T
tab (\t) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 Table scan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 937 table, mtodo DBI. . . . . . . . . . . . . . . . . . . . . . . . . . 887 e table_cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 TAN() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 TEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486, 498 threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 TIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485, 495 TIME() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 TIME_FORMAT() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 TIME_TO_SEC() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 TIMEDIFF() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536 TIMESTAMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484, 491 TIMESTAMP() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 TINYBLOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 TINYINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 TINYTEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 TMPDIR, varivel de ambiente . . . . . . . . 116, 1092 a TO_DAYS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537 Touches() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757 trace DBI, mtodo. . . . . . . . . . . . . . . . . . . . . . . . . . 885 e trace, mtodo DBI . . . . . . . . . . . . . . . . . . . . . . . . 1082 e TRIM() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 TRUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 TRUNCATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587 TRUNCATE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 type, mtodo DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . 887 e TZ, varivel de ambiente . . . . . . . . . . . . . 930, 1092 a
U
UCASE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 UDF, fun~es. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900 co ulimit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922 UMASK, variavel de ambiente . . . . . . . . . . . . . . . 924 UMASK, varivel de ambiente . . . . . . . . . . . . . . 1092 a UMASK_DIR, varivel de ambiente . . . . . 924, 1092 a unrio, menos (-). . . . . . . . . . . . . . . . . . . . . . . . . . 523 a UNCOMPRESS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551 UNCOMPRESSED_LENGTH() . . . . . . . . . . . . . . . . . . . . 551
1110
uni~o (UNION) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 a UNION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 Union() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755 UNIQUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610 UNIX_TIMESTAMP() . . . . . . . . . . . . . . . . . . . . . . . . . . 542 UNLOCK TABLES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617 UNTIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773 UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584 UPPER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 USE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614 USE INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563, 568 USE KEY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563, 569 USER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 USER, varivel de ambiente . . . . . . . . . . . . . . . . 239 a USER, varivel de ambiente . . . . . . . . . . . . . . . 1092 a usurio, fun~es definidas por . . . . . . . . . . . . 900 a co 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 variveis de ambiente, CC . . . . . . . . . . . . . . . . . . 98 a variveis de ambiente, CXX . . . . . . . . . . . . . . . . . 98 a Variveis de ambiente, LD_RUN_PATH. . . . . . . . 147 a varivel de ambiente CC . . . . . . . . . . . . . . . . . . . 105 a Varivel de ambiente CC . . . . . . . . . . . . . . . . . . 1092 a varivel de ambiente CFLAGS . . . . . . . . . . . . . . . 105 a Varivel de ambiente CFLAGS . . . . . . . . . . . . . . 1092 a variavel de ambiente CXX . . . . . . . . . . . . . . . . . . 104 varivel de ambiente CXX . . . . . . . . . . . . . . . . . . 105 a Varivel de ambiente CXX . . . . . . . . . . . . . . . . . 1092 a varivel de ambiente CXXFLAGS . . . . . . . . . . . . . 105 a Varivel de ambiente CXXFLAGS . . . . . . . . . . . . 1092 a varivel de ambiente DBI_TRACE . . . . . . . . . . . . 886 a Varivel de ambiente DBI_TRACE . . . . . . . . . . . 1092 a Varivel de ambiente DBI_USER . . . . . . . . . . . . 1092 a Varivel de ambiente HOME . . . . . . . . . . . . . . . . 1092 a varivel de ambiente LD_RUN_PATH . . . . . . . . . . 140 a Varivel de ambiente LD_RUN_PATH . . . . . . . . . 1092 a Varivel de ambiente MYSQL_DEBUG . . . . . . . . . 1092 a Varivel de ambiente MYSQL_HISTFILE . . . . . 1092 a varivel de ambiente MYSQL_HOST . . . . . . . . . . . 239 a Varivel de ambiente MYSQL_HOST . . . . . . . . . . 1092 a
Varivel de ambiente MYSQL_PS1 . . . . . . . . . . . 1092 a varivel de ambiente MYSQL_PWD . . . . . . . . . . . . 239 a Varivel de ambiente MYSQL_PWD . . . . . . . . . . . 1092 a varivel de ambiente MYSQL_TCP_PORT . . . . . . 225 a Varivel de ambiente MYSQL_TCP_PORT . . . . . 1092 a varivel de ambiente MYSQL_UNIX_PORT . . . . . 225 a Varivel de ambiente MYSQL_UNIX_PORT . . . . . 116, a 1092 Varivel de ambiente PATH . . . . . . . . . . . . . . . . 1092 a Varivel de ambiente TMPDIR . . . . . . . . . . 116, 1092 a Varivel de ambiente TZ . . . . . . . . . . . . . . 930, 1092 a Varivel de ambiente UMASK . . . . . . . . . . . 924, 1092 a Varivel de ambiente UMASK_DIR . . . . . . 924, 1092 a varivel de ambiente USER . . . . . . . . . . . . . . . . . 239 a Varivel de ambiente USER . . . . . . . . . . . . . . . . 1092 a varivel de ambiente, DBI_TRACE . . . . . . . . . . 1082 a varivel de ambiente, HOME . . . . . . . . . . . . . . . . 345 a varivel de ambiente, MYSQL_DEBUG . . . . . . . . . 345 a varivel de ambiente, MYSQL_DEBUG . . . . . . . . 1085 a varivel de ambiente, MYSQL_HISTFILE . . . . . 345 a varivel de ambiente, MYSQL_PWD . . . . . . . . . . . 345 a variavel de ambiente, MYSQL_TCP_PORT . . . . . 225 varivel de ambiente, MYSQL_TCP_PORT . . . . . 345 a variavel de ambiente, MYSQL_UNIX_PORT . . . . 225 varivel de ambiente, MYSQL_UNIX_PORT . . . . 345 a varivel de ambiente, PATH . . . . . . . . . . . . . . . . . 93 a VERSION() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
W
WEEK() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 WEEKDAY() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 WEEKOFYEAR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532 WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432 WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774 Within() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758 without-server op~o . . . . . . . . . . . . . . . . . . . . . . . 98 ca
X
X() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750 XOR, logical. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 XOR, operado binrio . . . . . . . . . . . . . . . . . . . . . . 546 a
Y
Y() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750 YEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485, 496 YEAR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
Concept Index
1111
Concept Index
--with-raid, erros de ligaao . . . . . . . . . . . . . . . . 104 c APIs, lista de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954 APIs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 APIs, Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881 aplicando, patches . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 argumentos, processando . . . . . . . . . . . . . . . . . . . . 904 aritimticas, expresses. . . . . . . . . . . . . . . . . . . . . . 522 e o armazenamento de dados . . . . . . . . . . . . . . . . . . . . 446 armazenamento dos tipos de colunas, exigncias e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 arquivo config.cache . . . . . . . . . . . . . . . . . . . . . . . 103 arquivo de opoes . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 c arquivo no encontrado, mensagem . . . . . . . . . . . 924 a arquivo RPM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 arquivo temporrio, direito de escrita . . . . . . . . . 116 a arquivo texto, importando . . . . . . . . . . . . . . . . . . . 367 arquivo, log de atuliazao . . . . . . . . . . . . . . . . . . 373 ca arquivos de conguraao . . . . . . . . . . . . . . . . . . . . 253 c arquivos de log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377 arquivos de log, nomes . . . . . . . . . . . . . . . . . . . . . . 276 arquivos de script . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 arquivos log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Arquivos Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 arquivos my.cnf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 arquivos tmp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 arquivos, config.cache . . . . . . . . . . . . . . . . . . . . . 103 arquivos, limites de tamanho . . . . . . . . . . . . . . . . . 10 arquivos, log binario . . . . . . . . . . . . . . . . . . . . . . . . 374 arquivos, log de consultas . . . . . . . . . . . . . . . . . . . 373 arquivos, log de consultas lentas . . . . . . . . . . . . . 377 arquivos, mensagem de erros . . . . . . . . . . . . . . . . . 327 arquivos, permisses . . . . . . . . . . . . . . . . . . . . . . . . 924 o arquivos, reparando . . . . . . . . . . . . . . . . . . . . . . . . . 284 arredondamento, erros . . . . . . . . . . . . . . . . . . . . . . 529 arredondamento, erros de. . . . . . . . . . . . . . . . . . . . 483 rvores fonte de desenvolvimento . . . . . . . . . . . . . 100 a aspas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 aspas, em string . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 atualizaao, log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 c atualizando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 atualizando da 4.0 para 4.1 . . . . . . . . . . . . . . . . . . 121 atualizando da verso 3.20 para 3.21 . . . . . . . . . 129 a atualizando da verso 3.21 para 3.22 . . . . . . . . . 129 a atualizando da verso 3.22 para 3.23 . . . . . . . . . 127 a atualizando para uma arquitetura diferente . . . 131 atualizando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . 46 atualizando, 3.23 para 4.0 . . . . . . . . . . . . . . . . . . . 123 atualizando, releases do MySQL . . . . . . . . . . . . . . 84 atualizando, tabela de permisses . . . . . . . . . . . . 130 o aumentando a performance . . . . . . . . . . . . . . . . . . 412 aumentando a velocidade . . . . . . . . . . . . . . . . . . . . 378 AUTO-INCREMENT, ODBC . . . . . . . . . . . . . . . 879 AUTO INCREMENT. . . . . . . . . . . . . . . . . . . . . . . 201 AUTO_INCREMENT e valores NULL . . . . . . . . . . . . . . 933
A
abertas, tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 abortados, clientes . . . . . . . . . . . . . . . . . . . . . . . . . . 918 abortados, conexo . . . . . . . . . . . . . . . . . . . . . . . . . 918 a abrindo tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 access denied . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 912 accesso negado, erro . . . . . . . . . . . . . . . . . . . . . . . . 912 acesso, controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 acesso, privilgio . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 e ACID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 ACID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643 ACLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 ActiveState Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 adicionando conjunto de caracteres . . . . . . . . . . . 327 adicionando funoes nativas . . . . . . . . . . . . . . . . . 908 c adicionando novas funoes . . . . . . . . . . . . . . . . . . . 899 c adicionando novos privilgios de usurios . . . . . 261 e a adicionando novos usurios . . . . . . . . . . . . . . . . . . . 92 a adicionando, funoes denidas por usurio . . . . 900 c a adicionando, procedimentos . . . . . . . . . . . . . . . . . 909 administraao de servidor . . . . . . . . . . . . . . . . . . . 356 c ADO program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 875 agrupando, expresses . . . . . . . . . . . . . . . . . . . . . . . 504 o aliases, em clusulas GROUP BY . . . . . . . . . . . . . . . 562 a aliases, em clusulas ORDER BY . . . . . . . . . . . . . . . 562 a aliases, em expresses . . . . . . . . . . . . . . . . . . . . . . . 563 o aliases, nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 aliases, para expresses . . . . . . . . . . . . . . . . . . . . . . 562 o aliases, para tabelas . . . . . . . . . . . . . . . . . . . . . . . . . 564 alteraoes de colunas sem aviso . . . . . . . . . . . . . . 607 c alteraoes na verso 4.0 . . . . . . . . . . . . . . . . . . . . . 966 c a alteraoes na verso 4.1 . . . . . . . . . . . . . . . . . . . . . 957 c a alteraoes, log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957 c alteraoes, verso 5.0 . . . . . . . . . . . . . . . . . . . . . . . . 957 c a alterando a localizaao do socket . . . . . . . . 119, 929 c alterando a ordem das colunas . . . . . . . . . . . . . . . 938 alterando a tabela . . . . . . . . . . . . . . . . . . . . . . . . . . 610 alterando campos . . . . . . . . . . . . . . . . . . . . . . . . . . . 610 alterando localizao do socket . . . . . . . . . . . . . . . . 98 ca alterando tabelas . . . . . . . . . . . . . . . . . . . . . . . 608, 938 alterando, colunas . . . . . . . . . . . . . . . . . . . . . . . . . . 610 Ano 2000, assuntos referentes ao . . . . . . . . . . . . . 490 annimo, usurio . . . . . . . . . . . . . . . . . . . . . . . 240, 260 o a anonymous user . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 anonimo, usurio . . . . . . . . . . . . . . . . . . . . . . . . . . 243 o a ANSI modo, executando . . . . . . . . . . . . . . . . . . . . . . 42 Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 apagando, usurio . . . . . . . . . . . . . . . . . . . . . . . . . . 264 a API C, funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778 co API C, problemas com ligaao . . . . . . . . . . . . . . . 862 c
1112
B
backup de banco de dados . . . . . . . . . . . . . . 361, 366 backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 backups, banco de dados . . . . . . . . . . . . . . . . . . . . 277 banco de dados, backups . . . . . . . . . . . . . . . . . . . . 275 banco de dados, criando . . . . . . . . . . . . . . . . . . . . . 172 banco de dados, deletando . . . . . . . . . . . . . . . . . . . 597 banco de dados, descarregando . . . . . . . . . . 361, 366 banco de dados, exibindo . . . . . . . . . . . . . . . . . . . . 369 banco de dados, informaoes sobre . . . . . . . . . . . 192 c banco de dados, links simblicos . . . . . . . . . . . . . 466 o banco de dados, projetos . . . . . . . . . . . . . . . . . . . . 446 banco de dados, replicando . . . . . . . . . . . . . . . . . . 378 banco de dados, selecionando . . . . . . . . . . . . . . . . 173 banco de dados, usando . . . . . . . . . . . . . . . . . . . . . 172 bancos de dados relacionais, deniao . . . . . . . . . . 4 c bancos de dados, nomes . . . . . . . . . . . . . . . . . . . . . 472 barra invertida, caracter de escape . . . . . . . . . . . 469 batch, modo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 batch, mysql option . . . . . . . . . . . . . . . . . . . . . . . . 347 BDB, tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 BDB, tipo de tabela . . . . . . . . . . . . . . . . . . . . . . . . . . 630 benchmark, pacote . . . . . . . . . . . . . . . . . . . . . . . . . . 421 benchmarks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 BerkeleyDB, tipo de tabela . . . . . . . . . . . . . . . . . . 630 biblioteca do servidor embutido MySQL . . . . . . 864 biblioteca mysqlclient . . . . . . . . . . . . . . . . . . . . . . 775 bibliotecas, lista de . . . . . . . . . . . . . . . . . . . . . . . . . 953 Big5 Chinese, codicaao de caracteres . . . . . . . 930 c binario, log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 BitKeeper, rvores . . . . . . . . . . . . . . . . . . . . . . . . . . 100 a BLOB , valores padres em campos . . . . . . . . . . . . 498 o BLOB, indexando colunas. . . . . . . . . . . . . . . . . . . . . 603 BLOB, inserindo dados binrios . . . . . . . . . . . . . . . 470 a BLOB, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 blocking_queries, opao do mysqlcc option . . 355 c Borland Builder 4 . . . . . . . . . . . . . . . . . . . . . . . . . . 876 Borland C++, compilador . . . . . . . . . . . . . . . . . . . . 888 buer de cliente, tamanho . . . . . . . . . . . . . . . . . . . 775 bugs, banco de dados . . . . . . . . . . . . . . . . . . . . . . . . 36 bugs, conhecidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 bugs, relatando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 bugs.mysql.com . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
C
C API, tipos de dados . . . . . . . . . . . . . . . . . . . . . . 775 C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940 C++ Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878 C++, APIs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887 C++, compilador gcc . . . . . . . . . . . . . . . . . . . . . . . . . 98 C, funoes de instruoes preparadas da API . . . 831 c c cache de tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 caches, limpando . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 clculo de datas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 a campos, alterando . . . . . . . . . . . . . . . . . . . . . . . . . . 610 campos, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 caracteres de escape . . . . . . . . . . . . . . . . . . . . . . . . 469
caracteres multi-byte . . . . . . . . . . . . . . . . . . . . . . . . 330 caracteres, conjunto de . . . . . . . . . . . . . . . . . . 99, 325 carregando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . 176 case sensitivo, em vericaao de acesso . . . . . . . 234 c 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 . . . . . . . . . . . . . . . . 930 caso-sensitivo, em comparaao de string . . . . . . 519 c cast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 casts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 certicaao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 c ChangeLog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957 changes, version 3.19 . . . . . . . . . . . . . . . . . . . . . . . 1076 changes, version 3.20 . . . . . . . . . . . . . . . . . . . . . . . 1069 changes, version 3.21 . . . . . . . . . . . . . . . . . . . . . . . 1056 changes, version 3.22 . . . . . . . . . . . . . . . . . . . . . . . 1042 changes, version 3.23 . . . . . . . . . . . . . . . . . . . . . . . 1000 character-sets-dir, opao mysql . . . . . . . . . . . 347 c chaves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 chaves estrangeiras . . . . . . . . . . . . . . . . . . 50, 198, 611 chaves multi-column . . . . . . . . . . . . . . . . . . . . . . . . 450 chaves primrias, deletando . . . . . . . . . . . . . . . . . . 610 a chaves, pesquisando em duas . . . . . . . . . . . . . . . . 200 cheio, disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 928 Chinese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930 citando dados binrios . . . . . . . . . . . . . . . . . . . . . . 470 a cliente, depurando . . . . . . . . . . . . . . . . . . . . . . . . . 1085 clientes em threads . . . . . . . . . . . . . . . . . . . . . . . . . 863 clientes, construindo clientes . . . . . . . . . . . . . . . . . 862 coerao, operadores . . . . . . . . . . . . . . . . . . . . . . . . . 521 c colchetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 ColdFusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876 colunas alterando . . . . . . . . . . . . . . . . . . . . . . . . . . . 610 colunas, alterando . . . . . . . . . . . . . . . . . . . . . . . . . . 938 colunas, exibindo . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 colunas, exigncias de armazenamento . . . . . . . . 502 e colunas, indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 colunas, nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 colunas, outros tipos . . . . . . . . . . . . . . . . . . . . . . . . 502 colunas, selecionado . . . . . . . . . . . . . . . . . . . . . . . . . 179 comandos fora de sincronia . . . . . . . . . . . . . . . . . . 920 comandos SQL, replicaao do master . . . . . . . . . 400 c comandos SQL, replicaao do slave . . . . . . . . . . . 402 c comandos, lista de . . . . . . . . . . . . . . . . . . . . . . . . . . 350 comandos, para a distribuiao binria . . . . . . . . . 91 c a comandos, replicaao do master . . . . . . . . . . . . . . 400 c comandos, replicaao do slave . . . . . . . . . . . . . . . . 402 c comandos, sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 combinaao de padres . . . . . . . . . . . . . . . . . . . . . . 185 c o comentrios de colunas . . . . . . . . . . . . . . . . . . . . . . 602 a comentrios, adicionando . . . . . . . . . . . . . . . . . . . . 479 a comentrios, iniciando . . . . . . . . . . . . . . . . . . . . . . . . 51 a comercial, tipos de suporte . . . . . . . . . . . . . . . . . . . 17 compactadas, tabelas . . . . . . . . . . . . . . . . . . . 336, 635 companias colaboradoras, lista de . . . . . . . . . . . . 955 comparaao de string, case-sensitivo . . . . . . . . . . 519 c Compatibilidade com o Ano 2000 . . . . . . . . . . . . . 11
Concept Index
1113
compatibilidade com ODBC. . . . . . . . . . . . . 505, 506 compatibilidade com Oracle . . . . . . . . . . . . . . . . . 614 Compatibilidade com Oracle . . . . . . . . . . . . . . . . . . 45 compatibilidade com Sybase . . . . . . . . . . . . . . . . . 614 compatibilidade entre as verses do MySQL . . 121, o 123 compatibilidade entre verses do MySQL . . . . 127, o 129 compatibilidade padres . . . . . . . . . . . . . . . . . . . . . . 42 o compatibilidade, com ODBC . . . 473, 483, 568, 601 compatibilidade, com Oracle . . . . . . . . . . . . . 45, 558 compatibilidade, com padro SQL . . . . . . . . . . . . . 42 a compatibilidade, com PostgreSQL . . . . . . . . . . . . . 45 compatibilidade, with mSQL . . . . . . . . . . . . . . . . 520 compatibilidade, Y2K . . . . . . . . . . . . . . . . . . . . . . . . 11 compatibility, with ODBC . . . . . . . . . . . . . . . . . . 1063 compilaao, otimizando . . . . . . . . . . . . . . . . . . . . . 453 c compilaao, velocidade . . . . . . . . . . . . . . . . . . . . . . 456 c compilador C++ no pode criar executveis . . . 104 a a compilador, C++ gcc . . . . . . . . . . . . . . . . . . . . . . . . . 98 compilando funoes denidas por usurios . . . . 906 c a compilando no Windows . . . . . . . . . . . . . . . . . . . . 134 compilando, estaticamente . . . . . . . . . . . . . . . . . . . . 98 compilando, problemas . . . . . . . . . . . . . . . . . . . . . . 103 compress, opao do mysqlcc . . . . . . . . . . . . . . . . . 355 c compress, opao mysql . . . . . . . . . . . . . . . . . . . . . . 347 c concedendo privlgios . . . . . . . . . . . . . . . . . . . . . . . 254 e Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768 conectando ao servidor . . . . . . . . . . . . . . . . . 168, 238 conectando remotamente com SSH . . . . . . . . . . . 133 conectando, vericaao . . . . . . . . . . . . . . . . . . . . . . 239 c Conector/ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . 870 conexo abortada . . . . . . . . . . . . . . . . . . . . . . . . . . . 918 a confgurando senhas . . . . . . . . . . . . . . . . . . . . . . . . . 266 cong.cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 conguraao ps-instalaao . . . . . . . . . . . . . . . . . . 111 c o c conguraao, opoes de . . . . . . . . . . . . . . . . . . . . . . . 98 c c configure, executando depois da invocaao c anterior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 configure, script . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Conjunto de caracteres . . . . . . . . . . . . . . . . . . . . . . 710 conjunto de caracteres, adicionando . . . . . . . . . . 327 connect_timeout variable . . . . . . . . . . . . . . . . . . . 356 connect_timeout, varivel. . . . . . . . . . . . . . . . . . . 350 a connection_name, opao do mysqlcc . . . . . . . . . 355 c Connector/J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880 constante, tabela . . . . . . . . . . . . . . . . . . . . . . . 425, 432 construindo programs clientes. . . . . . . . . . . . . . . . 862 consultas lentas, log . . . . . . . . . . . . . . . . . . . . . . . . . 377 consultas, estimando performance . . . . . . . . . . . . 431 consultas, exemplos . . . . . . . . . . . . . . . . . . . . . . . . . 195 consultas, fazendo . . . . . . . . . . . . . . . . . . . . . . . . . . 169 consultas, log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 consultas, projeto de Estudo de Gmeos . . . . . . 202 e consultas, velocidade . . . . . . . . . . . . . . . . . . . . . . . . 423 consultoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 contando registros em uma tabela . . . . . . . . . . . . 188 contatos, informaao . . . . . . . . . . . . . . . . . . . . . . . . . 16 c
contribiao, programas . . . . . . . . . . . . . . . . . . . . . . 940 c controle de acesso . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 convenoes tipogrcas . . . . . . . . . . . . . . . . . . . . . . . . 2 c a convenoes, tipogrcas . . . . . . . . . . . . . . . . . . . . . . . 2 c a conversores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 942 copiando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600 copyrights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 crackers, segurana contra . . . . . . . . . . . . . . . . . . . 229 c crash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1079 crash-me . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 crash-me, programa . . . . . . . . . . . . . . . . . . . . 419, 421 criando banco de dados . . . . . . . . . . . . . . . . . . . . . 172 criando opoes de inicializaao padro . . . . . . . . 216 c c a criando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 criando, relatrios de bug . . . . . . . . . . . . . . . . . . . . . 36 o criptograa de senha, reversibilidade . . . . . . . . . 547 Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770 custos de suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 cvs, rvore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 a
D
dados, carregando em tabelas . . . . . . . . . . . . . . . . 176 dados, conjunto de caracteres . . . . . . . . . . . . . . . . 325 dados, importando . . . . . . . . . . . . . . . . . . . . . . . . . . 367 dados, recuperando . . . . . . . . . . . . . . . . . . . . . . . . . 177 dados, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 Data e Hora, Tipos . . . . . . . . . . . . . . . . . . . . . . . . . 489 data, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 database, opao do mysqlcc . . . . . . . . . . . . . . . . . 355 c database, opao mysql . . . . . . . . . . . . . . . . . . . . . . 347 c DataJunction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876 datas, calculando . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 date values, problems . . . . . . . . . . . . . . . . . . . . . . . 495 DATE, problemas com coluna . . . . . . . . . . . . . . . 931 DBI Perl, modulo . . . . . . . . . . . . . . . . . . . . . . . . . . . 881 DBI, interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881 DBI/DBD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887 DBUG, pacote . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1085 debug, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . . 347 c debug-info, opao mysql . . . . . . . . . . . . . . . . . . . . 349 c default-character-set, opao mysql . . . . . . . . 347 c deniao, bancos de dados . . . . . . . . . . . . . . . . . . . . . 4 c delayed insert limit . . . . . . . . . . . . . . . . . . . . . . . . . 583 deleao, mysql.sock . . . . . . . . . . . . . . . . . . . . . . . . 929 c deletando chaves primrias . . . . . . . . . . . . . . . . . . 610 a deletando funoes . . . . . . . . . . . . . . . . . . . . . . . . . . . 900 c deletando indices . . . . . . . . . . . . . . . . . . . . . . . 610, 614 deletando linhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933 deletando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 deletando usurio . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 a deletando usurios . . . . . . . . . . . . . . . . . . . . . . . . . . 264 a deletando, banco de dados . . . . . . . . . . . . . . . . . . . 597 Delphi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877, 941 depurando o cliente . . . . . . . . . . . . . . . . . . . . . . . . 1085 depurando o servidor . . . . . . . . . . . . . . . . . . . . . . 1079 derived tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 desatualizando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
1114
descarregando banco de dados . . . . . . . . . . . 361, 366 descarregando tabelas . . . . . . . . . . . . . . . . . . . . . . . 177 desconectando do servidor . . . . . . . . . . . . . . . . . . . 168 desenvolvedores, lista de . . . . . . . . . . . . . . . . . . . . . 945 desligando o server . . . . . . . . . . . . . . . . . . . . . 113, 114 dicas, otimizaao . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 c digitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 dinmicas, tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . 635 a direito de escrita no tmp . . . . . . . . . . . . . . . . . . . . 116 disco cheio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 928 disco, detalhes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464 discos, dividindo dados entre . . . . . . . . . . . . . . . . 468 display, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 distribuiao binria do MySQL . . . . . . . . . . . . . . . 80 c a distribuiao binria, instalando . . . . . . . . . . . . . . . 91 c a distribuiao binaria, on HP-UX . . . . . . . . . . . . . . 153 c distribuiao fontes do MySQL . . . . . . . . . . . . . . . . 80 c distribuioes binrias . . . . . . . . . . . . . . . . . . . . . . . . . 86 c a distribuioes binrias no Linux . . . . . . . . . . . . . . . 141 c a distribuioes fontes, instalando . . . . . . . . . . . . . . . . 94 c DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 download, fazendo . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
estrutura de diretrio, padro . . . . . . . . . . . . . . . . . 83 o a Estudos de Gmeos, consultas . . . . . . . . . . . . . . . 202 e etiqueta para a rede . . . . . . . . . . . . . . . . . . . . . . 35, 41 Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876 executando configure depois da invocaao c prioritria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 a executando consultas. . . . . . . . . . . . . . . . . . . . . . . . 169 executando mltiplos servidores . . . . . . . . . . . . . . 219 u executando um servidor web . . . . . . . . . . . . . . . . . . 20 executando, modo ANSI . . . . . . . . . . . . . . . . . . . . . . 42 executando, modo batch. . . . . . . . . . . . . . . . . . . . . 193 execute, opao mysql . . . . . . . . . . . . . . . . . . . . . . . 347 c exemplos de consultas . . . . . . . . . . . . . . . . . . . . . . . 195 exemplos de saida do myisamchk . . . . . . . . . . . . . 293 exemplos, tabelas compactadas . . . . . . . . . . . . . . 338 exibindo informaao de banco de dados . . . . . . . 369 c expresso, aliases . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 a expresses extendidas . . . . . . . . . . . . . . . . . . . . . . . 185 o expresses regulares, sintaxe . . . . . . . . . . . . . . . . 1093 o expresses, aliases . . . . . . . . . . . . . . . . . . . . . . . . . . 563 o extenses ao, padro SQL . . . . . . . . . . . . . . . . . . . . 42 o a extraindo datas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
E
Eiel Wrapper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888 emprego com MySQL . . . . . . . . . . . . . . . . . . . . . . . . 16 emprego, informaao para contatos . . . . . . . . . . . . 16 c enable-named-commands, opo mysql . . . . . . . . 348 ca endereo da mailing list . . . . . . . . . . . . . . . . . . . . . . . 2 c endereo eletrnico, para suporte ` clientes . . . . 41 c o a entre aspas, string . . . . . . . . . . . . . . . . . . . . . . . . . . 884 ENUM, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 Errcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 errno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 erro de aceeso negado . . . . . . . . . . . . . . . . . . . . . . . 912 erros comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 911 erros conhecidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 erros de arredondamento;. . . . . . . . . . . . . . . . . . . . 529 erros de ligao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922 ca erros internos de compilao . . . . . . . . . . . . . . . . . 103 ca erros, checksum error . . . . . . . . . . . . . . . . . . . . . . . 144 erros, conhecidos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 erros, directory checksum error . . . . . . . . . . . . . . 144 erros, linguagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 erros, lista de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 912 erros, relatando . . . . . . . . . . . . . . . . . . . . . . . . . . . 2, 36 erros, relatrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 o erros, tartamento para UDFs . . . . . . . . . . . . . . . . 906 erros, vericando tabelas . . . . . . . . . . . . . . . . . . . . 288 escolhendo tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 escolhendo, uma verso do MySQL . . . . . . . . . . . . 80 a espao de armazenamento, minimizando . . . . . . 446 c Espao, Extenao no MySQL . . . . . . . . . . . . . . . . 733 c c estabilidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 estaticamente, compilando . . . . . . . . . . . . . . . . . . . . 98 estimando performance de consultas . . . . . . . . . . 431 estrangeiras, chaves . . . . . . . . . . . . . . . . . . . . . . 50, 198
F
falhas repetidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925 falhas, recuperaao . . . . . . . . . . . . . . . . . . . . . . . . . 287 c fatal signal 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 fazendo consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 fazendo parceria com a MySQL AB . . . . . . . . . . . 15 fechando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 ferramenta de clientes . . . . . . . . . . . . . . . . . . . . . . . 775 ferramenta de linha de comando . . . . . . . . . . . . . 347 ferramentas, lista de . . . . . . . . . . . . . . . . . . . . . . . . 955 ferramentas, mysqld multi . . . . . . . . . . . . . . . . . . . 333 ferramentas, mysqld safe . . . . . . . . . . . . . . . . . . . . 331 ferramentas, safe mysqld . . . . . . . . . . . . . . . . . . . . 331 ush tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 force, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . . 348 c foreign key, restriao . . . . . . . . . . . . . . . . . . . . . . . . . 52 c foreign keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 FreeBSD, resolvendo problemas . . . . . . . . . . . . . . 105 full-text, pesquisa . . . . . . . . . . . . . . . . . . . . . . . . . . . 619 FULLTEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619 funoes binrias, exemplos . . . . . . . . . . . . . . . . . . . 201 c a funoes de data, compatibilidade Y2K . . . . . . . . . 11 c funoes denidas por usurio, adicionando . . . . 899 c a funoes denidas por usurios, adicionado . . . . 900 c a funoes nativas, adicionando . . . . . . . . . . . . . . . . . 908 c funoes para clusulas SELECT e WHERE . . . . . . . . 504 c a funoes, agrupando . . . . . . . . . . . . . . . . . . . . . . . . . 504 c funoes, API C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778 c funoes, deletando . . . . . . . . . . . . . . . . . . . . . . . . . . 900 c funoes, instruoes preparadas da API C . . . . . 831 c c funoes, novas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899 c fuso horrio, problemas . . . . . . . . . . . . . . . . . . . . . 930 a
Concept Index
1115
G
gcc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 gdb, usando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1081 General Public License . . . . . . . . . . . . . . . . . . . . . . . . 5 General Public License, MySQL . . . . . . . . . . . . . . 18 geoespacial, recurso . . . . . . . . . . . . . . . . . . . . . . . . . 733 geogrcos, reucursos . . . . . . . . . . . . . . . . . . . . . . . 733 a geometria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733 GIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733 globais, privilgios . . . . . . . . . . . . . . . . . . . . . . . . . . 254 e GPL, Licena Publica Geral . . . . . . . . . . . . . . . . 1096 c GPL, Licena P blica Geral do GNU . . . . . . . 1096 c u GPL, MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 graphical tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 gratis, licensiamento . . . . . . . . . . . . . . . . . . . . . . . . . 19 GROUP BY, aliases em . . . . . . . . . . . . . . . . . . . . . . . . 562 GROUP BY, extenses ao padro SQL . . . . . . . . . . 565 o a GROUP BY, extenses para o padro SQL . . . . . . 561 o a GUI tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
H
Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769 HEAP, tipo de tabela . . . . . . . . . . . . . . . . . . . . . . . . . 630 help, opao do mysqlcc . . . . . . . . . . . . . . . . . . . . . 355 c help, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . . . 347 c hints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43, 565 histria do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 o histrico, arquivo de . . . . . . . . . . . . . . . . . . . . . . . . 345 o history_size, opao do mysqlcc . . . . . . . . . . . . 355 c hora, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 host, opao do mysql . . . . . . . . . . . . . . . . . . . . . . . 355 c host, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . . . 348 c host, tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 HP-UX, distribuiao binaria . . . . . . . . . . . . . . . . . 153 c html, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . . . 348 c
inicializaao, parmetros . . . . . . . . . . . . . . . . . . . . 454 c a inicializando o servidor automaticamente . . . . . 118 iniciando o mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . 923 iniciando o servidor . . . . . . . . . . . . . . . . . . . . . . . . . 111 iniciando vrios servidores . . . . . . . . . . . . . . . . . . . 219 a iniciando, comentrios . . . . . . . . . . . . . . . . . . . . . . . . 51 a InnoDB, tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 InnoDB, tipo de tabela . . . . . . . . . . . . . . . . . . . . . . 630 inserao, velocidade . . . . . . . . . . . . . . . . . . . . . . . . . 438 c INSERT DELAYED . . . . . . . . . . . . . . . . . . . . . . . . 582 instalaao de pacotes, Mac OS X PKG . . . . . . . . 71 c instalaao, layouts de . . . . . . . . . . . . . . . . . . . . . . . . 83 c instalaao, viso geral . . . . . . . . . . . . . . . . . . . . . . . . 60 c a instalando o Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 instalando, distribuiao binria . . . . . . . . . . . . . . . 91 c a instalando, distribuioes fontes . . . . . . . . . . . . . . . . 94 c instalando, pacotes RPM do Linux . . . . . . . . . . . . 69 instalando, Perl no Windows . . . . . . . . . . . . . . . . 165 installing, funoes denidas por usurios . . . . . . 906 c a inteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 internals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896 Internet Relay Chat . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Internet Service Providers . . . . . . . . . . . . . . . . . . . . 19 interno, travamento . . . . . . . . . . . . . . . . . . . . . . . . . 443 IRC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 ISAM, tipo de tabela . . . . . . . . . . . . . . . . . . . . . . . . . 630 ISP servios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 c
J
Java, conectividade . . . . . . . . . . . . . . . . . . . . . . . . . 880 JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880
K
key space, MyISAM . . . . . . . . . . . . . . . . . . . . . . . . . 633 keys, foreign . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
I
ID unico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862 idade, calculando . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 ignore-space, mysql option . . . . . . . . . . . . . . . . . 348 importando dados . . . . . . . . . . . . . . . . . . . . . . . . . . 367 indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 indices e colunas BLOB . . . . . . . . . . . . . . . . . . . . . . . 603 ind ices e colunas TEXT . . . . . . . . . . . . . . . . . . . . . . . 603 ind ices e IS NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 indices e valores NULL . . . . . . . . . . . . . . . . . . . . . . . 603 indices multi-coluna . . . . . . . . . . . . . . . . . . . . . . . . . 450 indices multi-parte . . . . . . . . . . . . . . . . . . . . . . . . . . 613 indices, colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 indices, deletando . . . . . . . . . . . . . . . . . . . . . . 610, 614 indices, e LIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 indices, nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 indices, prexo mais a esquerda de . . . . . . . . . . . 448 indices, tamanho de blocos . . . . . . . . . . . . . . . . . . 314 ind ices, uso de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 informaoes gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 c
L
layouts de instalaao . . . . . . . . . . . . . . . . . . . . . . . . . 83 c libmysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864 Licena Pblica Geral (GPL) . . . . . . . . . . . . . . . . . . 5 c u licenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 c licenciamento, custo . . . . . . . . . . . . . . . . . . . . . . . . . . 17 licenciamento, exemplos . . . . . . . . . . . . . . . . . . . . . . 18 licenciamento, gratis . . . . . . . . . . . . . . . . . . . . . . . . . 19 licenciamento, informaao para contatos . . . . . . . 16 c licenciamento, pol iticas . . . . . . . . . . . . . . . . . . . . . . . 18 licenciamento, termos . . . . . . . . . . . . . . . . . . . . . . . . 17 ligaao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862 c ligaao, erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922 c ligaao, velocidade . . . . . . . . . . . . . . . . . . . . . . . . . . 456 c limitaoes de projeto . . . . . . . . . . . . . . . . . . . . . . . . 418 c limites, tamanho de arquivo . . . . . . . . . . . . . . . . . . 10 limpando caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 lingaao, problemas com . . . . . . . . . . . . . . . . . . . . 862 c l inguas, suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
1116
linha de comando, ferramentas . . . . . . . . . . . . . . . 347 linha de comando, histrico . . . . . . . . . . . . . . . . . . 345 o linha de comando, opao mysql . . . . . . . . . . . . . . 347 c linha de comando, opoes . . . . . . . . . . . . . . . . . . . 207 c linha de comando, opoes, mysqlcc . . . . . . . . . . . 355 c linhas, deletando . . . . . . . . . . . . . . . . . . . . . . . . . . . 933 links simblicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 o links symbolicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 Linux, distribuiao binrias . . . . . . . . . . . . . . . . . . 141 c a lista de colaboradores . . . . . . . . . . . . . . . . . . . . . . . 948 lista de discusso MySQL . . . . . . . . . . . . . . . . . . . . 33 a listas de discusso . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 a listas de email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 listas de mensagens, guias . . . . . . . . . . . . . . . . . . . . 41 listas de mensagens, localizaao dos arquivos . . . 35 c literais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 local-infile . . . . . . . . . . . . . . . . . . . . . . . . . . 350, 356 localizaao padro da instalaao . . . . . . . . . . . . . . 83 c a c lock de tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 lock de, registro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453 log, alteraoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957 c log, arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98, 377 logomarcas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
M
Mac OS X, instalaao . . . . . . . . . . . . . . . . . . . . . . . . 71 c make_binary_distribution . . . . . . . . . . . . . . . . . 331 mantendo, arquivos de log . . . . . . . . . . . . . . . . . . . 377 manual, convenoes tipogrcas . . . . . . . . . . . . . . . . 2 c a manual, formatos dispon iveis . . . . . . . . . . . . . . . . . . 2 manual, online location . . . . . . . . . . . . . . . . . . . . . . . . 2 manutenao, tabelas . . . . . . . . . . . . . . . . . . . . . . . . 292 c marcas registradas . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 master/slave, conguraao . . . . . . . . . . . . . . . . . . . 379 c max memory used . . . . . . . . . . . . . . . . . . . . . . . . . . 358 max_allowed_packet . . . . . . . . . . . . . . . . . . . 350, 356 max_join_size . . . . . . . . . . . . . . . . . . . . . . . . . 350, 356 MBR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 756 memria virtual, problemas quando compilando o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 memoria, uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457 memory use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 mensagem de erro, exibindo . . . . . . . . . . . . . . . . . 371 mensagem de erro, linguagem . . . . . . . . . . . . . . . . 327 mensagens de erro, arquivo no encontrado . . . 924 a MERGE, deniao de tabelas . . . . . . . . . . . . . . . . 638 c MERGE, tipo de tabela. . . . . . . . . . . . . . . . . . . . . . . . 630 meta caracteres, e LIKE . . . . . . . . . . . . . . . . . . . . . 448 meta caracteres, na tabela mysql.columns_priv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 meta caracteres, na tabela mysql.db . . . . . . . . . 243 meta caracteres, na tabela mysql.host . . . . . . . 243 meta caracteres, na tabela mysql.tables_priv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 metacaracteres, na tabela mysql.user . . . . . . . . 239 mtodos, travamento . . . . . . . . . . . . . . . . . . . . . . . 1087 e
Minimum Bounding Rectangle . . . . . . . . . . . . . . . 756 MIT-pthreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 modo ANSI, executando . . . . . . . . . . . . . . . . . . . . . . 42 modo batch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 mdulos, lista dos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 o monitor, terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 mostrando informaoes de banco de dados . . . . 369 c mostrando, informaoes, SHOW . . . . . . . . . . . . . . . . 303 c mostrando, status da tabela . . . . . . . . . . . . . . . . . 304 mSQL compatibilidade . . . . . . . . . . . . . . . . . . . . . . 520 msql2mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 mudana de privilgios . . . . . . . . . . . . . . . . . . . . . . 245 c e multi mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 multi-byte, caracteres . . . . . . . . . . . . . . . . . . . . . . . 330 multi-byte, conjunto de caracteres . . . . . . . . . . . . 921 multi-colunas, indices . . . . . . . . . . . . . . . . . . . . . . . 450 multi-parte, indice . . . . . . . . . . . . . . . . . . . . . . . . . . 613 mltiplos servidores . . . . . . . . . . . . . . . . . . . . . . . . . 219 u My, derivaao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 c my.cnf, arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 MyISAM, tabelas compactadas . . . . . . . . . . 336, 635 MyISAM, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . 503 MyISAM, tipo de tabela . . . . . . . . . . . . . . . . . . . . . . 630 myisamchk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100, 331 myisamchk, exemplos de sa . . . . . . . . . . . . . . . 293 ida myisamchk, opoes . . . . . . . . . . . . . . . . . . . . . . . . . . 282 c myisampack . . . . . . . . . . . . . . . . . . . . . . . 336, 608, 635 MyODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 870 MyODBC, relatando problemas . . . . . . . . . . . . . . 879 mysladmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346, 347 MySQL AB, deniao . . . . . . . . . . . . . . . . . . . . . . . . 12 c MySQL, certicaao . . . . . . . . . . . . . . . . . . . . . . . . . 14 c MySQL, consultoria . . . . . . . . . . . . . . . . . . . . . . . . . . 14 MySQL, denioes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 c MySQL, histria do . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 o MySQL, introduao . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 c mysql, opao de linha de comando . . . . . . . . . . . 347 c MySQL, pronncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 u MySQL, tipo de tabelas . . . . . . . . . . . . . . . . . . . . . 630 MySQL, treinamento . . . . . . . . . . . . . . . . . . . . . . . . . 14 MYSQL, verso do. . . . . . . . . . . . . . . . . . . . . . . . . . . 75 a mysql.sock, alterando localizaao do . . . . . . . . . . . 98 c mysql.sock, proteao . . . . . . . . . . . . . . . . . . . . . . . 929 c mysql_fix_privilege_tables . . . . . . . . . . . . . . . 250 mysql_install_db . . . . . . . . . . . . . . . . . . . . . . . . . . 331 mysql_install_db, script . . . . . . . . . . . . . . . . . . . 115 mysqlaccess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 mysqladmin . . . . . . . . . . 299, 301, 305, 346, 597, 598 mysqlbinlog . . . . . . . . . . . . . . . . . . . . . . . . . . . 346, 358 mysqlbug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 mysqlcc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346, 354 mysqlcc, opoes de linha de comando . . . . . . . . 355 c mysqlclient, biblioteca . . . . . . . . . . . . . . . . . . . . . 775 mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 mysqld , tamanho de buer do servidor . . . . . . . 454 mysqld, iniciando . . . . . . . . . . . . . . . . . . . . . . . . . . . 923 mysqld, opoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454 c
Concept Index
1117
mysqld-max . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mysqld_multi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mysqld_safe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mysqldump . . . . . . . . . . . . . . . . . . . . . . . . 132, 346, mysqlimport . . . . . . . . . . . . . . . . . . 132, 346, 367, mysqlshow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mysqltest, Programa de Tste do MySQL . . . . .
O
O que criptograa? . . . . . . . . . . . . . . . . . . . . . . . . 268 e O que um X509/Certicado? . . . . . . . . . . . . . . . 268 e objetivos do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . 5 obtendo o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 870 ODBC compatibilidade . . . . . . . . . . . . . . . . . . . . . 568 ODBC compatibility . . . . . . . . . . . . . . . . . . . . . . . 1063 ODBC, administrador . . . . . . . . . . . . . . . . . . . . . . . 871 ODBC, compatibilidade . . . . . . . . . . . . 473, 483, 601 ODBC, compatibilidade com . . . . . . . . . . . . 505, 506 odbcadmin program . . . . . . . . . . . . . . . . . . . . . . . . 877 OLEDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940 one-database, mysql option . . . . . . . . . . . . . . . . . 348 online location of manual . . . . . . . . . . . . . . . . . . . . . . 2 opao cong-le . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 c opao congure, with-low-memory . . . . . . . . . . 103 c opao de linha de comando mysql . . . . . . . . . . . . 347 c opao example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 c opao help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 c opao log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 c opao mysqladmin . . . . . . . . . . . . . . . . . . . . . . . . . . 334 c opao mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 c opao no-log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 c opao password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 c opao tcp-ip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 c opao user . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 c opao version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 c opaoes de inicializaao, padro . . . . . . . . . . . . . . 216 c c a opoes de linha de comando, mysqlcc . . . . . . . . 355 c opoes de reparo, myisamchk . . . . . . . . . . . . . . . . 284 c opoes de vericaa, myisamchk . . . . . . . . . . . . . 283 c c opoes frornecidas pelo MySQL . . . . . . . . . . . . . . 168 c opoes mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 c opoes padres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 c o opoes, conguraao . . . . . . . . . . . . . . . . . . . . . . . . . 98 c c opoes, myisamchk . . . . . . . . . . . . . . . . . . . . . . . . . . 282 c opoes, replicaao . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 c c Open Source, deniao . . . . . . . . . . . . . . . . . . . . . . . . 5 c open tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 OpenGIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733 opens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 OpenSSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 operaoes aritimticas . . . . . . . . . . . . . . . . . . . . . . . 522 c e operadores de coero . . . . . . . . . . . . . . . . . . 521, 522 ca optimizaoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432 c optimizando, tabelas . . . . . . . . . . . . . . . . . . . . . . . . 291 Oracle, compatibilidade . . . . . . . . . . . . . . . . . 558, 614 ordenaao, conjunto de caracteres . . . . . . . . . . . . 325 c ordenando dados . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 ordenando registros de tabelas . . . . . . . . . . . . . . . 180 ordenando strings . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 ordenando tabela de permisses . . . . . . . . . 241, 243 o ORDER BY, aliases em . . . . . . . . . . . . . . . . . . . . . . . . 562 otimizaao, dicas . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 c otimizando DISTINCT . . . . . . . . . . . . . . . . . . . . . . 434 otimizando, LEFT JOIN . . . . . . . . . . . . . . . . . . . . 435 otimizando, LIMIT . . . . . . . . . . . . . . . . . . . . . . . . . 437
N
named pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 no delimitadas, strings . . . . . . . . . . . . . . . . . . . . . 494 a no encontrados, regitros . . . . . . . . . . . . . . . . . . . . 934 a no pode criar/gravar arquivos . . . . . . . . . . . . . . 919 a no transacionais, tabelas . . . . . . . . . . . . . . . . . . . 916 a nativa, suporte de thread . . . . . . . . . . . . . . . . . . . . . 78 nativas, adicionando funoes . . . . . . . . . . . . . . . . . 908 c net_buffer_length . . . . . . . . . . . . . . . . . . . . 350, 356 NetWare. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74, 164 no-auto-rehash, opao mysql . . . . . . . . . . . . . . . 347 c no-beep, mysql option . . . . . . . . . . . . . . . . . . . . . . 347 no-named-commands, opao mysql . . . . . . . . . . . . 348 c no-pager, opao mysql . . . . . . . . . . . . . . . . . . . . . . 348 c no-tee, opo mysql . . . . . . . . . . . . . . . . . . . . . . . . 348 ca nome de mquina, armazenando em cache . . . . 459 a nome de maquinas padrao . . . . . . . . . . . . . . . . . . . 238 nome de usurios e senhas . . . . . . . . . . . . . . . . . . . 259 a 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, variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474 a NOT NULL, restries . . . . . . . . . . . . . . . . . . . . . . . 53 co notaao de mscara de rede, na tabela mysql.user c a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 Novell NetWare . . . . . . . . . . . . . . . . . . . . . . . . . 74, 164 novos procedimentos, adcionado . . . . . . . . . . . . . 909 novos usurios, adicionando . . . . . . . . . . . . . . . . . . 92 a NULL e colunas AUTO_INCREMENT . . . . . . . . . . . . . . 933 NULL e colunas TIMESTAMP . . . . . . . . . . . . . . . . . . . 933 NULL vs. valores vazios . . . . . . . . . . . . . . . . . . . . . . 932 NULL, teste para nulo . . . . . . . . . . . . . . . . . . . 508, 511 NULL, testes para nulo . . . . . . . . . . . . . . . . . . . . . . . 506 NULL, valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 NULL, valores e indices . . . . . . . . . . . . . . . . . . . . . . . 603 numericos, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 nmero de ponto utuante . . . . . . . . . . . . . . . . . . 483 u nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 u nmeros de release . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 u nmeros vlidos, exemplos. . . . . . . . . . . . . . . . . . . 471 u a
1118
P
pack_isam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 pacotes, lista de . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954 padrao do nome de maquinas . . . . . . . . . . . . . . . . 238 padro, privilgios . . . . . . . . . . . . . . . . . . . . . . . . . . 260 a e Padros SQL, diferenas do . . . . . . . . . . . . . . . . . . 258 a c padres, combinao . . . . . . . . . . . . . . . . . . . . . . . . 185 o ca padres, embutico . . . . . . . . . . . . . . . . . . . . . . . . . . 866 o pager, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . . 348 c palavras reservadas, exceoes de . . . . . . . . . . . . . 479 c palavras-chave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 par6ametros de inicializao, mysqlcc . . . . . . . . 355 ca paramentros de inicializaao, sintonia . . . . . . . . 453 c parmetros de inicialiazaao, mysql . . . . . . . . . . 347 a c parmetros, servidor . . . . . . . . . . . . . . . . . . . . . . . . 454 a parando o servidor . . . . . . . . . . . . . . . . . . . . . . . . . . 118 password, opao do mysqlcc . . . . . . . . . . . . . . . . . 355 c password, opao mysql . . . . . . . . . . . . . . . . . . . . . . 349 c patches, aplicando . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 performance, aumentando . . . . . . . . . . . . . . . 412, 446 performance, benchmarks . . . . . . . . . . . . . . . . . . . 423 performance, detalhes de disco . . . . . . . . . . . . . . . 464 performance, estimando . . . . . . . . . . . . . . . . . . . . . 431 Perl API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881 Perl DBI/DBD, problemas de instalaao . . . . . . 166 c Perl, instalando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Perl, instalando no Windows . . . . . . . . . . . . . . . . 165 Perl, modulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940 permisses de tabelas . . . . . . . . . . . . . . . . . . . . . . . 245 o perror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 pesquisa full-text . . . . . . . . . . . . . . . . . . . . . . . . . . . 619 pesquisando em duas chaves . . . . . . . . . . . . . . . . . 200 pesquisas e caso-sensitivito . . . . . . . . . . . . . . . . . . 930 PHP API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880 plugins_path, opao do mysqlcc . . . . . . . . . . . . 355 c ponto decimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 ponto utuante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 port, opao do mysqlcc . . . . . . . . . . . . . . . . . . . . . 355 c port, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . . . 349 c portabilidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 portabilidade, tipos . . . . . . . . . . . . . . . . . . . . . . . . . 502 portando para outros sistemas . . . . . . . . . . . . . . 1078 ps-instalao, conguraao e testes . . . . . . . . . . 111 o ca c ps-instalao, multiplos servidores. . . . . . . . . . . 219 o ca PostgreSQL, compatibilidade . . . . . . . . . . . . . . . . . 45 preo do suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 c prexo mais a esquerda de indices . . . . . . . . . . . . 448 PRIMARY KEY, restriao . . . . . . . . . . . . . . . . . . . 52 c privilgio de acesso . . . . . . . . . . . . . . . . . . . . . . . . . 226 e privilgio, mudana . . . . . . . . . . . . . . . . . . . . . . . . . 245 e c privilgio, sistemas de . . . . . . . . . . . . . . . . . . . . . . . 232 e privilgios de usurio, apagando . . . . . . . . . . . . . 264 e a privilgios de usurio, deletando . . . . . . . . . . . . . 264 e a privilgios globais . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 e privilgios, adicionando . . . . . . . . . . . . . . . . . . . . . 261 e privilgios, apagando . . . . . . . . . . . . . . . . . . . . . . . . 264 e privilgios, concedendo . . . . . . . . . . . . . . . . . . . . . . 254 e privilgios, deletando . . . . . . . . . . . . . . . . . . . . . . . . 264 e
privilgios, exibir . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 e privilegios, localizaao de informaoes . . . . . . . . 236 c c privilgios, padro . . . . . . . . . . . . . . . . . . . . . . . . . . 260 e a privilgios, revogando . . . . . . . . . . . . . . . . . . . . . . . 254 e problemas cc1plus . . . . . . . . . . . . . . . . . . . . . . . . . 103 problemas com bloqueios de tabela . . . . . . . . . . . 444 problemas com fuso horrio. . . . . . . . . . . . . . . . . . 930 a problemas de ligaao . . . . . . . . . . . . . . . . . . . . . . . . 922 c problemas e erros comuns . . . . . . . . . . . . . . . . . . . 911 problemas inicializando o servidor . . . . . . . . . . . . 116 problemas instalando no Solaris . . . . . . . . . . . . . . 144 problemas, colunas DATE . . . . . . . . . . . . . . . . . . . . . 931 problemas, compilando . . . . . . . . . . . . . . . . . . . . . . 103 problemas, erros de acesso negado . . . . . . . . . . . . 912 problemas, instalando no IBM-AIX . . . . . . . . . . 155 problemas, instalando Perl . . . . . . . . . . . . . . . . . . 166 problemas, ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . 879 problemas, relatando . . . . . . . . . . . . . . . . . . . . . . . . . 36 problems, date values . . . . . . . . . . . . . . . . . . . . . . . 495 procedimentos, adicionando . . . . . . . . . . . . . . . . . 909 procedures, stored . . . . . . . . . . . . . . . . . . . . . . . 49, 763 processando, argumentos . . . . . . . . . . . . . . . . . . . . 904 processos, exibindo . . . . . . . . . . . . . . . . . . . . . . . . . 320 processos, suporte de . . . . . . . . . . . . . . . . . . . . . . . . . 78 procurando, pginas web MySQL . . . . . . . . . . . . . 35 a produtos, vendendo . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Programa Access . . . . . . . . . . . . . . . . . . . . . . . . . . . 874 programa, crash-me . . . . . . . . . . . . . . . . . . . . . . . . . 419 programas clientes . . . . . . . . . . . . . . . . . . . . . . . . . . 862 programas, contribuiao . . . . . . . . . . . . . . . . . . . . . 940 c programas, lista de . . . . . . . . . . . . . . . . . . . . . 331, 345 projeto, limitaoes . . . . . . . . . . . . . . . . . . . . . . . . . . 418 c projetos, detalhes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 projetos, escolhas . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 prompt de comando . . . . . . . . . . . . . . . . . . . . . . . . . 353 prompt, mysql option . . . . . . . . . . . . . . . . . . . . . . . 347 prompts, signicados . . . . . . . . . . . . . . . . . . . . . . . . 171 pronncia, MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 u Protocol mismatch . . . . . . . . . . . . . . . . . . . . . . . . . . 129 protocol, mysql option . . . . . . . . . . . . . . . . . . . . . 349 protocol, mysql, opao . . . . . . . . . . . . . . . . . . . . . 368 c Protocolos no correspondetes . . . . . . . . . . . . . . . 129 a Provedores de Servios de Internet . . . . . . . . . . . . 19 c Python, API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888
Q
queries, exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Query Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625 query, opao do mysqlcc . . . . . . . . . . . . . . . . . . . . 355 c questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 questes, respondendo . . . . . . . . . . . . . . . . . . . . . . . . 41 o quick, mysql option . . . . . . . . . . . . . . . . . . . . . . . . 349
Concept Index
1119
R
RAID, erros de compilaao . . . . . . . . . . . . . . . . . . 104 c RAID, table type . . . . . . . . . . . . . . . . . . . . . . . . . . . 606 raw, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 c recongurando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 reconnect, mysql option . . . . . . . . . . . . . . . . . . . . 349 recriando tabelas de permisses . . . . . . . . . . . . . . 261 o recuperando dados de tabelas . . . . . . . . . . . . . . . . 177 recupraao em caso de falhas . . . . . . . . . . . . . . . . 287 c recursos do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 recursos principais do MySQL . . . . . . . . . . . . . . . . . 6 RedHat Package Manager . . . . . . . . . . . . . . . . . . . . 69 reduzindo o tamanho dos dados . . . . . . . . . . . . . . 446 referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611 e regex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1093 register, opao do mysqlcc . . . . . . . . . . . . . . . . . 355 c registro, lock de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 registro, ordenando . . . . . . . . . . . . . . . . . . . . . . . . . 180 registros no encontrados . . . . . . . . . . . . . . . . . . . . 934 a registros, contando . . . . . . . . . . . . . . . . . . . . . . . . . . 188 registros, secionando . . . . . . . . . . . . . . . . . . . . . . . . 178 relatando problemas com MyODBC . . . . . . . . . . 879 relatando, bugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 relatando, erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 relatrio de bug, critrio para . . . . . . . . . . . . . . . . . 38 o e relatrio, erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 o releases, atualizando . . . . . . . . . . . . . . . . . . . . . . . . . 84 releases, esquema de nomenclatura . . . . . . . . . . . . 81 releases, testando . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 reordenando colunas . . . . . . . . . . . . . . . . . . . . . . . . 938 repairando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . 289 replace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 replicaao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 c replicaao do master, comandos . . . . . . . . . . . . . . 400 c replicaao do slave, comandos . . . . . . . . . . . . . . . . 402 c Resolvendo problemas no FreeBSD . . . . . . . . . . . 105 Resolvendo problemas no Solaris . . . . . . . . . . . . . 105 respondendo `s questes, etiqueta . . . . . . . . . . . . . 41 a o Responsveis pela Documentaao, lista dos . . . 952 a c Retngulo de Limite M a inimo . . . . . . . . . . . . . . . . 756 revogando privlgios . . . . . . . . . . . . . . . . . . . . . . . . 254 e root, recuperando senha do . . . . . . . . . . . . . . . . . . 927 root, senha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 RTS-threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1088
S
safe-mode, comando . . . . . . . . . . . . . . . . . . . . . . . . 351 safe-updates, opao mysql . . . . . . . . . . . . . . . . . 349 c safe_mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Sakila . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 script mysqlbug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 script mysqlbug, localizao . . . . . . . . . . . . . . . . . . . 2 ca script, arquivos de . . . . . . . . . . . . . . . . . . . . . . . . . . 193 scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331, 333, 347 scripts mysql_install_db . . . . . . . . . . . . . . . . . . . 115 scripts, mysqlbug . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 segurana com transaao, tabelas . . . . . . . . . . . . 643 c c
segurana contra crackers . . . . . . . . . . . . . . . . . . . 229 c segurana de sistema . . . . . . . . . . . . . . . . . . . . . . . . 226 c selecionando banco de dados . . . . . . . . . . . . . . . . . 173 SELECT, Query Cache . . . . . . . . . . . . . . . . . . . . . . . 625 select_limit . . . . . . . . . . . . . . . . . . . . . . . . . . 350, 356 senha, conguraao . . . . . . . . . . . . . . . . . . . . . . . . . 462 c senha, usurio root . . . . . . . . . . . . . . . . . . . . . . . . . 260 a senhas esquecidas . . . . . . . . . . . . . . . . . . . . . . . . . . . 927 senhas seguras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 senhas, congurando . . . . . . . . . . . . . . . . . . . 257, 266 senhas, para usurios . . . . . . . . . . . . . . . . . . . . . . . 259 a senhas, recuperando . . . . . . . . . . . . . . . . . . . . . . . . 927 sequncia de chamadas para funoes agregadas, e c UDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 903 sequncia de chamadas para funoes simples, UDF e c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902 sequencia de emulaao . . . . . . . . . . . . . . . . . . . . . . 552 c server, opao do mysqlcc . . . . . . . . . . . . . . . . . . . 355 c servios, ISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 c servios, web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 c servidor web, executando . . . . . . . . . . . . . . . . . . . . . 20 servidor, administraao. . . . . . . . . . . . . . . . . . . . . . 356 c servidor, conectando . . . . . . . . . . . . . . . . . . . . 168, 238 servidor, depurando . . . . . . . . . . . . . . . . . . . . . . . . 1079 servidor, desligar o . . . . . . . . . . . . . . . . . . . . . 113, 114 servidor, disconectando. . . . . . . . . . . . . . . . . . . . . . 168 servidor, inicializando e parando . . . . . . . . . . . . . 118 servidor, iniciando o . . . . . . . . . . . . . . . . . . . . . . . . 111 servidor, problemas inicializando o . . . . . . . . . . . 116 servidores, mltiplos . . . . . . . . . . . . . . . . . . . . . . . . 219 u SET, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 set-variable, opao mysql . . . . . . . . . . . . . . . . . 348 c shell, sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 silent, mysql option . . . . . . . . . . . . . . . . . . . . . . . 349 simblicos, links . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 o sintaxe de expresses regulares, descriao . . . . 1093 o c sistema de privilgios . . . . . . . . . . . . . . . . . . . . . . . 232 e sistema de privilgios, dexcria . . . . . . . . . . . . . . . 232 e c sistema, otimizaao . . . . . . . . . . . . . . . . . . . . . . . . . 453 c sistema, segurana . . . . . . . . . . . . . . . . . . . . . . . . . . 226 c sistema, tabela de . . . . . . . . . . . . . . . . . . . . . . . . . . 425 sistema, variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . 475 a 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, opao mysql . . . . . . . . . . . . 348 c skip-line-numbers, mysql option . . . . . . . . . . . 348 slow queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 socket, alteraao localizaao dos . . . . . . . . . . . . . . 98 c c socket, opao do mysqlcc . . . . . . . . . . . . . . . . . . . 355 c socket, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . 349 c Solaris, problemas de instalaao . . . . . . . . . . . . . . 144 c Solaris, resolvendo problemas . . . . . . . . . . . . . . . . 105 SQL, deniao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 c SQL-92, extenses ao . . . . . . . . . . . . . . . . . . . . . . . . 42 o sql_yacc.cc problemas . . . . . . . . . . . . . . . . . . . . . 103
1120
SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 SSL e X509 Basicos . . . . . . . . . . . . . . . . . . . . . . . . . 268 SSL, opoes de linha de comando . . . . . . . . . . . . 274 c SSL, opoes relacionadas . . . . . . . . . . . . . . . . . . . . 273 c status, comando . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 status, resultado do comando . . . . . . . . . . . . . . . . 357 status, tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 stored procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . 763 stored procedures e triggers, deniao . . . . . . . . . 49 c string entre aspas . . . . . . . . . . . . . . . . . . . . . . . . . . . 884 string tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 string, ordenaao . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 c string, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 strings no delimitadas . . . . . . . . . . . . . . . . . . . . . . 494 a strings, caracteres de escape . . . . . . . . . . . . . . . . . 469 strings, deniao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 c striping, deniao . . . . . . . . . . . . . . . . . . . . . . . . . . . 464 c subqueries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570 subquery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570 subselects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570 sugestes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568 o superusurio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 a suporte a clientes, endereo eletrnico . . . . . . . . . 41 c o suporte ` thread no-nativa . . . . . . . . . . . . . . . . . 106 a a suporte tcnico, endereo eletrnico . . . . . . . . . . . 41 e c o suporte tcnico, licenciamento . . . . . . . . . . . . . . . . 18 e suporte, custo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 suporte, endereo eletrnico . . . . . . . . . . . . . . . . . . 41 c o suporte, licenciamento . . . . . . . . . . . . . . . . . . . . . . . 18 suporte, para sistemas operacionais . . . . . . . . . . . 78 suporte, termos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 suporte, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 supresso, valores padro . . . . . . . . . . . . . . . . . . . . . 99 a a supresso, valores padres . . . . . . . . . . . . . . . . . . . . 53 a o Sybase, compatibilidade . . . . . . . . . . . . . . . . . . . . . 614 syntax, opo do mysqlcc . . . . . . . . . . . . . . . . . . . 355 ca syntax_file, opo do mysqlcc . . . . . . . . . . . . . 355 ca
T
tabela db, ordenando . . . . . . . . . . . . . . . . . . . . . . . . tabela de permisses, ordenando . . . . . . . . . 241, o tabela de sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . tabela est cheia . . . . . . . . . . . . . . . . . . . . . . . . . . . . a tabela host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tabela host table, ordenando . . . . . . . . . . . . . . . . tabela user, ordenando . . . . . . . . . . . . . . . . . . . . . tabela, alterando . . . . . . . . . . . . . . . . . . . . . . . . . . . tabela, aumnetando performance . . . . . . . . . . . . . tabela, permisses . . . . . . . . . . . . . . . . . . . . . . . . . . o tabelas abertas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tabelas BDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tabelas Berkeley DB . . . . . . . . . . . . . . . . . . . . . . . . tabelas compactadas . . . . . . . . . . . . . . . . . . . . . . . . tabelas compactadas, formato . . . . . . . . . . . . . . . tabelas constantes . . . . . . . . . . . . . . . . . . . . . . . . . . tabelas de permisses, recriando . . . . . . . . . . . . . o tabelas dinmicas, caracter a isticas . . . . . . . . . . . . 243 243 425 919 244 243 241 610 446 245 451 698 698 336 635 432 261 635
tabelas HEAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642 tabelas ISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641 tabelas temporrias, problemas . . . . . . . . . . . . . . 939 a tabelas transacionais . . . . . . . . . . . . . . . . . . . . . . . . . 46 tabelas, abrindo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 tabelas, aliases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564 tabelas, alterando . . . . . . . . . . . . . . . . . . . . . . . . . . . 938 tabelas, alterando a ordem das colunas . . . . . . . 938 tabelas, atualizando . . . . . . . . . . . . . . . . . . . . . . . . . . 46 tabelas, carregando dados . . . . . . . . . . . . . . . . . . . 176 tabelas, constante. . . . . . . . . . . . . . . . . . . . . . . . . . . 425 tabelas, contando regitros . . . . . . . . . . . . . . . . . . . 188 tabelas, copiando . . . . . . . . . . . . . . . . . . . . . . . . . . . 600 tabelas, criando . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 tabelas, deletando . . . . . . . . . . . . . . . . . . . . . . . . . . 612 tabelas, deletando linhas . . . . . . . . . . . . . . . . . . . . 933 tabelas, descarregando . . . . . . . . . . . . . . . . . . 361, 366 tabelas, desfragmentaao . . . . . . . . . . . . . . . . . . . . 635 c tabelas, desfragmentar . . . . . . . . . . . . . . . . . . . . . . 292 tabelas, exibindo . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 tabelas, fechando . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 tabelas, fuso de . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638 a tabelas, ID unico para o ultimo registro . . . . . . 862 tabelas, informaoes . . . . . . . . . . . . . . . . . . . . . . . . 293 c tabelas, informaoes sobre . . . . . . . . . . . . . . . . . . . 192 c tabelas, laterando . . . . . . . . . . . . . . . . . . . . . . . . . . . 608 tabelas, mostrando status . . . . . . . . . . . . . . . . . . . 304 tabelas, muitas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453 tabelas, nomes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 tabelas, optimizando . . . . . . . . . . . . . . . . . . . . . . . . 291 tabelas, ordenando registros . . . . . . . . . . . . . . . . . 180 tabelas, recuperando dados . . . . . . . . . . . . . . . . . . 177 tabelas, regime de manutenao . . . . . . . . . . . . . . . 292 c tabelas, reparando . . . . . . . . . . . . . . . . . . . . . . . . . . 289 tabelas, selecinando colunas . . . . . . . . . . . . . . . . . 179 tabelas, selecionado registros . . . . . . . . . . . . . . . . 178 tabelas, tamanho mximo . . . . . . . . . . . . . . . . . . . . 10 a tabelas, tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630 tabelas, travamento . . . . . . . . . . . . . . . . . . . . . . . . . 443 tabelas, vericaao . . . . . . . . . . . . . . . . . . . . . . . . . . 283 c tabelas, vericando erros . . . . . . . . . . . . . . . . . . . . 288 table is full . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 table, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . . 349 c tables, desfragmentaao . . . . . . . . . . . . . . . . . . . . . 298 c tables, ush . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 tables, fragmentaao . . . . . . . . . . . . . . . . . . . . . . . . 298 c tables, multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 tables, RAID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606 tamanho das tabelas . . . . . . . . . . . . . . . . . . . . . . . . . 10 tamanho de buer do servidor mysqld . . . . . . . . 454 tamanho, display . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 tar, problemas no Solaris . . . . . . . . . . . . . . . . . . . . 144 Tcl, API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888 TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 tebela de permisses, atualizando . . . . . . . . . . . . 130 o tee, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 c tempo esgotado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 tempo excedido, connect_timeout varivel . . . 350 a
Concept Index
1121
tempo limite . . . . . . . . . . . . . . . . . . . . . . . . . . . 553, 583 terminal monitor, denio . . . . . . . . . . . . . . . . . . 168 ca testando a instalao . . . . . . . . . . . . . . . . . . . . . . . . 112 ca testando mysqld, mysqltest . . . . . . . . . . . . . . . . . . 896 testando o servidor . . . . . . . . . . . . . . . . . . . . . . . . . 112 testando, conectando ao servidor . . . . . . . . . . . . . 239 testando, releases do MySQL . . . . . . . . . . . . . . . . . 82 testes ps-instalaao . . . . . . . . . . . . . . . . . . . . . . . . 111 o c testing, installation . . . . . . . . . . . . . . . . . . . . . . . . . 112 Texinfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 TEXT , valores padres em campos . . . . . . . . . . . . 498 o TEXT, indexando colunas. . . . . . . . . . . . . . . . . . . . . 603 TEXT, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 texto, arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 thread, suporte de . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357, 896 threads, clientes em . . . . . . . . . . . . . . . . . . . . . . . . . 863 threads, diferenas entre pacotes . . . . . . . . . . . . 1090 c threads, exibindo . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 threads, RTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1088 timeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 timeout, connect_timeout variable. . . . . . . . . . . 356 TIMESTAMP e valores NULL . . . . . . . . . . . . . . . . . . . . 933 tipo, converso de . . . . . . . . . . . . . . . . . . . . . . . . . . 504 a tipos de campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 tipos de dados, C API . . . . . . . . . . . . . . . . . . . . . . 775 Tipos de data e hora . . . . . . . . . . . . . . . . . . . . . . . . 489 tipos de data, Y2K assuntos . . . . . . . . . . . . . . . . . 490 tipos de suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 tipos de tabela, escolhedo . . . . . . . . . . . . . . . . . . . 630 tipos string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 tipos strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 tipos, campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 tipos, data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 tipos, hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 tipos, numricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 e tipos, portabilidade . . . . . . . . . . . . . . . . . . . . . . . . . 502 ToDo list for MySQL . . . . . . . . . . . . . . . . . . . . . . . . 27 TODO, servidor embutido . . . . . . . . . . . . . . . . . . . 866 TODO, symlinks . . . . . . . . . . . . . . . . . . . . . . . . . . . 467 tools, graphical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 tools, GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 trabalhos no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 16 Tradutores, lista de . . . . . . . . . . . . . . . . . . . . . . . . . 952 transaoes, suporte . . . . . . . . . . . . . . . . . . . . . . 46, 643 c translations_path, opao do mysqlcc . . . . . . . 355 c tratando erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 906 travamento, mtodos . . . . . . . . . . . . . . . . . . . . . . . 1087 e treinamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 tutorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
ultimo registro, ID unico . . . . . . . . . . . . . . . . . . . . 862 unbuffered, opao mysql . . . . . . . . . . . . . . . . . . . . 348 c unico, ID. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862 Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710 UNIQUE, restriao . . . . . . . . . . . . . . . . . . . . . . . . . . 52 c unnamed views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 uptime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 URLS para download do MySQL . . . . . . . . . . . . . 75 usando multiplos discos para guardar dados . . . 468 user, opao do mysqlcc . . . . . . . . . . . . . . . . . . . . . 356 c user, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . . . 349 c uso de memria, myisamchk . . . . . . . . . . . . . . . . . 286 o uso, do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 usurio, funoes de nidas, adicionando . . . . . . 900 a c usurios, adicionando . . . . . . . . . . . . . . . . . . . . . . . . 92 a usurios, adicionando privilgios . . . . . . . . . . . . . 261 a e usurios, deletando . . . . . . . . . . . . . . . . . . . . . . . . . 264 a usurios, do MySQL . . . . . . . . . . . . . . . . . . . . . . . . 420 a usurios, funoes denidas por . . . . . . . . . . . . . . . 899 a c usuarios, root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 usurios, variveis . . . . . . . . . . . . . . . . . . . . . . . . . . 474 a a UTF-8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710 utilitrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 944 a
V
valor de retorno, UDFs . . . . . . . . . . . . . . . . . . . . . . 906 valores negativos. . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 valores padro, supresso . . . . . . . . . . . . . . . . . . . . . 99 a a valores padres . . . . . . . . . . . . . . . . . . . . 418, 579, 602 o valores padres em campos BLOB e TEXT . . . . . . 498 o valores padres, supresso . . . . . . . . . . . . . . . . . . . . 53 o a varveis de ambiente . . . . . . . . . . . . . . . . . . . . . . . . 216 a VARCHAR, tamanho . . . . . . . . . . . . . . . . . . . . . . . . . . 503 variveis de ambiente . . . . . . . . . . . . . . 253, 331, 345 a variveis de ambientes, lista . . . . . . . . . . . . . . . . 1092 a variveis de sistema . . . . . . . . . . . . . . . . . . . . . . . . . 475 a variveis de usurios . . . . . . . . . . . . . . . . . . . . . . . . 474 a a variaveis, mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . 454 variveis, status . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 a variveis, valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 a velocidade da inserao . . . . . . . . . . . . . . . . . . . . . . 438 c velocidade das consultas . . . . . . . . . . . . . . . . 423, 431 velocidade de compilaao . . . . . . . . . . . . . . . . . . . . 456 c velocidade de ligaao . . . . . . . . . . . . . . . . . . . . . . . . 456 c velocidade, aumentado . . . . . . . . . . . . . . . . . . . . . . 378 vendendo produtos . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 verbose, opao mysql . . . . . . . . . . . . . . . . . . . . . . . 349 c vericaao de permisses, efeito na velocidade c o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 vericando erros em tabelas . . . . . . . . . . . . . . . . . 288 verso, escolhendo . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 a verso, ultima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 a version, opao do mysqlcc . . . . . . . . . . . . . . . . . . 356 c version, opao mysql . . . . . . . . . . . . . . . . . . . . . . . 349 c vertical, opao mysql . . . . . . . . . . . . . . . . . . . . . . 347 c views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 viso geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 a
U
UCS-2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . UDFs, compilando . . . . . . . . . . . . . . . . . . . . . . . . . . UDFs, deniao . . . . . . . . . . . . . . . . . . . . . . . . . . . . c UDFs, valor de retorno . . . . . . . . . . . . . . . . . . . . . . 710 906 899 906
1122
W
wait, opao mysql . . . . . . . . . . . . . . . . . . . . . . . . . . c Well-Known Binary, formato . . . . . . . . . . . . . . . . Well-Known Text, formato . . . . . . . . . . . . . . . . . . Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Windows, assuntos em aberto . . . . . . . . . . . . . . . . Windows, atualizando . . . . . . . . . . . . . . . . . . . . . . . 349 741 740 870 136 132
Windows, compilando no . . . . . . . . . . . . . . . . . . . . Windows, versus Unix. . . . . . . . . . . . . . . . . . . . . . . WKB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WKT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . wrappers, Eiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
X
xml, mysql option . . . . . . . . . . . . . . . . . . . . . . . . . . . 348