Você está na página 1de 1156

MySQL Reference Manual

Copyright c 1997-2003 MySQL AB

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

Tutorial de Introduo Do MySQL . . . . . . . 168 ca


3.1 Conectando e Desconectando do Servidor . . . . . . . . . . . . . . . 168 3.2 Fazendo Consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 3.3 Criao e Utilizao de um Banco de Dados . . . . . . . . . . . . . 172 ca ca 3.3.1 Criando e Selecionando um Banco de Dados . . . . 173 3.3.2 Criando uma Tabela . . . . . . . . . . . . . . . . . . . . . . . . . . 174 3.3.3 Carregando dados em uma tabela . . . . . . . . . . . . . . 175 3.3.4 Recuperando Informaes de uma Tabela . . . . . . . 177 co 3.3.4.1 Selecionando Todos os Dados . . . . . . . . . 177 3.3.4.2 Selecionando Registros Espec icos . . . . . 178 3.3.4.3 Selecionando Colunas Espec icas . . . . . . 179 3.3.4.4 Ordenando Registros . . . . . . . . . . . . . . . . . 180 3.3.4.5 Clculo de Datas. . . . . . . . . . . . . . . . . . . . . 182 a 3.3.4.6 Trabalhando com Valores Nulos (NULL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 3.3.4.7 Combinao de padres. . . . . . . . . . . . . . . 185 ca o 3.3.4.8 Contando Registros . . . . . . . . . . . . . . . . . . 188 3.3.4.9 Utilizando Mltiplas Tabelas . . . . . . . . . . 190 u 3.4 Obtendo Informaes Sobre Bancos de Dados e Tabelas . . 192 co 3.5 Utilizando mysql em Modo Batch . . . . . . . . . . . . . . . . . . . . . . 193 3.6 Exemplos de Consultas Comuns . . . . . . . . . . . . . . . . . . . . . . . . 195 3.6.1 O Valor Mximo para uma Coluna . . . . . . . . . . . . . 195 a 3.6.2 O Registro que Armazena o Valor Mximo para uma a Coluna Determinada . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 3.6.3 Mximo da Coluna por Grupo . . . . . . . . . . . . . . . . . 196 a 3.6.4 As Linhas Armazenando o Group-wise Mximo de a um Certo Campo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 3.6.5 Utilizando Variveis de Usurio . . . . . . . . . . . . . . . . 198 a a

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

Administrao do Bancos de Dados MySQL ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207


4.1 Congurando o MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 4.1.1 Opes de Linha de Comando do mysqld . . . . . . . 207 co 4.1.2 Arquivo de Opes my.cnf . . . . . . . . . . . . . . . . . . . 216 co 4.2 Executando Mltiplos MySQL Servers na Mesma Mquina u a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 4.2.1 Executando Mltiplos Servidores no Windows . . 220 u 4.2.1.1 Iniciando Mltiplos Servidores na Linha de u Comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 4.2.1.2 Iniciando Mltiplos Servidores Como u Servios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 c 4.2.2 Executando Mltiplos Servidores no Unix . . . . . . 224 u 4.2.3 Usando Programas Clientes em um Ambiente Multi-Servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 4.3 Detalhes Gerais de Segurana e o Sistema de Privilgio de c e Acesso do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 4.3.1 Segurana Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 c 4.3.2 Como Tornar o MySQL Seguro contra Crackers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 4.3.3 Opes de Inicializao para o mysqld em Relao a co ca ca Segurana. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 c 4.3.4 Detalhes de Segurana com LOAD DATA LOCAL . . . 231 c 4.3.5 O Que o Sistema de Privilgios Faz . . . . . . . . . . . . 232 e 4.3.6 Como o Sistema de Privilgios Funciona . . . . . . . . 232 e 4.3.7 Privilgios Fornecidos pelo MySQL . . . . . . . . . . . . 236 e 4.3.8 Conectando ao Servidor MySQL . . . . . . . . . . . . . . . 238 4.3.9 Controle de Acesso, Estgio 1: Vericao da a ca Conexo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 a 4.3.10 Controle de Acesso, Estgio 2: Vericao da a ca Requisio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 ca 4.3.11 Hashing de Senhas no MySQL 4.1 . . . . . . . . . . . . 245 4.3.12 Causas dos Erros de Accesso Negado . . . . . . . . . 249 4.4 Gerenciamento das Contas dos Usurios no MySQL . . . . . . 254 a 4.4.1 A Sintaxe de GRANT e REVOKE . . . . . . . . . . . . . . . . . . 254 4.4.2 Nomes de Usurios e Senhas do MySQL . . . . . . . . 259 a 4.4.3 Quando as Alteraes nos Privilgios tem Efeito co e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260

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

Otimizao do MySQL . . . . . . . . . . . . . . . . . . . 418 ca


5.1 Viso Geral da Otimizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418 a ca 5.1.1 Limitaes do Projeto MySQL/Trocas . . . . . . . . . 418 co 5.1.2 Portabilidade. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 5.1.3 Para que Utilizamos o MySQL?. . . . . . . . . . . . . . . . 420 5.1.4 O Pacote de Benchmark do MySQL . . . . . . . . . . . . 421 5.1.5 Utilizando seus Prprios Benchmarks . . . . . . . . . . 422 o Otimizando SELECTs e Outras Consultas . . . . . . . . . . . . . . . . 423 5.2.1 Sintaxe de EXPLAIN (Obter informaes sobre uma co SELECT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 5.2.2 Estimando o Desempenho de uma Consulta. . . . . 431 5.2.3 Velocidade das Consultas que Utilizam SELECT . . 431 5.2.4 Como o MySQL Otimiza Clusulas WHERE . . . . . . 432 a 5.2.5 Como o MySQL Otimiza IS NULL . . . . . . . . . . . . . . 433 5.2.6 Como o MySQL Otimiza Clusulas DISTINCT . . . 434 a 5.2.7 Como o MySQL Otimiza LEFT JOIN e RIGHT JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435 5.2.8 Como o MySQL Otimiza Clusulas ORDER BY . . . 436 a 5.2.9 Como o MySQL Otimiza Clusulas LIMIT . . . . . . 437 a 5.2.10 Performance das Consultas que Utilizam INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 5.2.11 Performance das Consultas que Utilizam UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 5.2.12 Performance das Consultas que Utilizam DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 5.2.13 Mais Dicas sobre Otimizaes . . . . . . . . . . . . . . . . 440 co Detalhes sobre Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 5.3.1 Como o MySQL Trava as Tabelas . . . . . . . . . . . . . . 443 5.3.2 Detalhes sobre Lock de Tabelas . . . . . . . . . . . . . . . . 444 Otimizando a Estrutura de Banco de Dados . . . . . . . . . . . . . 446 5.4.1 Opes do Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 co 5.4.2 Deixando os Dados com o Menor Tamanho Poss ivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 5.4.3 Como o MySQL Utiliza Indices . . . . . . . . . . . . . . . . 447 5.4.4 Indices de Colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 5.4.5 Indices de Mltiplas Colunas . . . . . . . . . . . . . . . . . . 450 u 5.4.6 Como o MySQL Conta as Tabelas Abertas . . . . . 451 5.4.7 Como o MySQL Abre e Fecha as Tabelas . . . . . . . 451 5.4.8 Desvantagem em Criar um Nmero Grande de u Tabelas no Mesmo Banco de Dados . . . . . . . . . . . . . . 452 Otimizando o Servidor MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 453 5.5.1 Sintonia dos Parmetros em Tempo de a Sistema/Compilao e na Inicializao. . . . . . . . . . . . 453 ca ca 5.5.2 Parmetros de Sintonia do Servidor . . . . . . . . . . . . 453 a 5.5.3 Como a Compilao e a Ligao Afetam a ca ca Velocidade do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . 456 5.5.4 Como o MySQL Utiliza a Memria . . . . . . . . . . . . 457 o 5.5.5 Como o MySQL Utiliza o DNS . . . . . . . . . . . . . . . . 459

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

Referncia de Linguagem do MySQL . . . . . . 469 e


6.1 Estrutura da Linguagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 6.1.1 Literais: Como Gravar Strings e Numerais . . . . . . 469 6.1.1.1 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 6.1.1.2 Nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 u 6.1.1.3 Valores Hexadecimais . . . . . . . . . . . . . . . . 471 6.1.1.4 Valores NULL. . . . . . . . . . . . . . . . . . . . . . . . . 471 6.1.2 Nomes de Banco de dados, Tabela, Indice, Coluna e Alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 6.1.3 Caso Sensitivo nos Nomes . . . . . . . . . . . . . . . . . . . . . 473 6.1.4 Variveis de Usurio . . . . . . . . . . . . . . . . . . . . . . . . . . 474 a a 6.1.5 Variveis de Sistema . . . . . . . . . . . . . . . . . . . . . . . . . . 475 a 6.1.6 Sintaxe de Comentrios . . . . . . . . . . . . . . . . . . . . . . . 478 a 6.1.7 Tratamento de Palavras Reservadas no MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 6.2 Tipos de Campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481 6.2.1 Tipos Numricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 e 6.2.2 Tipos de Data e Hora . . . . . . . . . . . . . . . . . . . . . . . . . 489 6.2.2.1 Assuntos referentes ao ano 2000 (Y2K) e Tipos de Data . . . . . . . . . . . . . . . . . . . . . . . . . . . 490 6.2.2.2 Os Tipos DATETIME, DATE e TIMESTAMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491 6.2.2.3 O Tipo TIME. . . . . . . . . . . . . . . . . . . . . . . . . 495 6.2.2.4 O Tipo YEAR. . . . . . . . . . . . . . . . . . . . . . . . . 496 6.2.3 Tipos String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 6.2.3.1 Os Tipos CHAR e VARCHAR . . . . . . . . . . . . . 497 6.2.3.2 Os Tipos BLOB e TEXT . . . . . . . . . . . . . . . . 497 6.2.3.3 O Tipo ENUM. . . . . . . . . . . . . . . . . . . . . . . . . 499 6.2.3.4 O Tipo SET . . . . . . . . . . . . . . . . . . . . . . . . . . 500 6.2.4 Escolhendo o Tipo Correto para uma Coluna . . . 501 6.2.5 Usando Tipos de Colunas de Outros Mecanismos de Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 6.2.6 Exigncias de Armazenamento dos Tipos de Coluna e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 6.3 Funes para Uso em Clusulas SELECT e WHERE . . . . . . . . . 503 co a 6.3.1 Operadores e Funes de Tipos no Especicados co a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 6.3.1.1 Parenteses . . . . . . . . . . . . . . . . . . . . . . . . . . . 504

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

Tipos de Tabela do MySQL . . . . . . . . . . . . . . 630


7.1 Tabelas MyISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630 7.1.1 Espao Necessrio para Chaves . . . . . . . . . . . . . . . . 633 c a 7.1.2 Formatos de Tabelas MyISAM . . . . . . . . . . . . . . . . . . 634 7.1.2.1 Caracter isticas de Tabelas Estticas a (Tamanho Fixo) . . . . . . . . . . . . . . . . . . . . . . . . . 634 7.1.2.2 Caracter isticas de Tabelas Dinmicas . . 634 a 7.1.2.3 Caracter isticas de Tabelas Compactadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635 7.1.3 Problemas com Tabelas MyISAM . . . . . . . . . . . . . . . . 636 7.1.3.1 Tabelas MyISAM Corrompidas . . . . . . . . . 636 7.1.3.2 O Cliente est usando a tabela ou no a a a fechou de forma apropriada . . . . . . . . . . . . . . . 637 Tabelas MERGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637

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

Introduo ao MaxDB . . . . . . . . . . . . . . . . . . . 704 ca


8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 Historia do MaxDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Licenciamento e Suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conceitos Bsicos do MaxDB . . . . . . . . . . . . . . . . . . . . . . . . . . a Diferenas de Recursos entre o MaxDB e o MySQL . . . . . . c Interoperability Features between MaxDB and MySQL . . . Links Relacionados ao MaxDB . . . . . . . . . . . . . . . . . . . . . . . . . Palavras Reservadas no MaxDB . . . . . . . . . . . . . . . . . . . . . . . . Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co Tipos de Colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704 704 704 704 705 705 706 708 709

Conjunto de Caracteres Nacionais e Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710


Conjuntos de Caracteres e Collations em Geral . . . . . . . . . . 710 Conjunto de Caracteres e Collations no MySQL . . . . . . . . . 711 Determinando o Conjunto de Caracteres e Collation Padres o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711 9.3.1 Conjunto de Caracteres e Collations do Servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711 9.3.2 Conjunto de Caracteres e Collation de Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712 9.3.3 O Conjunto de Caracteres e Collations de Tabela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713 9.3.4 Conjunto de Caracteres e Collation de Colunas . . 713 9.3.5 Exemplos de Atribuies de Conjuntos de Caracteres co e Collation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714 9.3.6 Conjunto de Caracteres e Collation de Conexo a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715 9.3.7 Conjunto de Caracteres e Collation de Caracter de String Literal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716 9.3.8 Clusula COLLATE em Vrias Partes de uma Consulta a a SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717 9.3.9 Precedncia da Clusula COLLATE . . . . . . . . . . . . . . 717 e a 9.3.10 Operador BINARY . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718 9.3.11 Alguns Casos Especiais Onde a Determinao da ca Collation e Trabalhosa . . . . . . . . . . . . . . . . . . . . . . . . . . 718 9.3.12 Collations Devem Ser para o Conjunto de Caracteres Certo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719 9.3.13 Um exemplo do Efeito da Collation . . . . . . . . . . . 719 9.4 Operaes Afetadas pelo Suporte a Conjunto de Caracteres co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719 9.1 9.2 9.3

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

Extenses Espacias em MySQL . . . . . . . . . . 733 o


10.1 10.2 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca O Modelo Geomtrico OpenGIS . . . . . . . . . . . . . . . . . . . . . . . a 10.2.1 A Hierarquia da Classe Geometry . . . . . . . . . . . . . 10.2.2 Classe Geometry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.3 Classe Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.4 Classe Curve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.5 Classe LineString . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.6 Classe Surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.7 Classe Polygon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.8 Classe GeometryCollection . . . . . . . . . . . . . . . . . 10.2.9 Classe MultiPoint . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.10 Classe MultiCurve . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.11 Classe MultiLineString (Multi Linhas) . . . . . 10.2.12 Classe MultiSurface (Multi Superf icies) . . . . . 10.2.13 Classe MultiPolygon (Multi Pol igonos) . . . . . . 10.3 Formatos de Dados Espaciais Suportados . . . . . . . . . . . . . . 733 733 734 735 736 736 737 737 737 738 738 738 739 739 739 740

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

Stored Procedures e Funes . . . . . . . . . . . . 763 co


11.1 Sintaxe de Stored Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . 763 11.1.1 Manuteno de Stored Procedures . . . . . . . . . . . . 764 ca 11.1.1.1 CREATE PROCEDURE e CREATE FUNCTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764 11.1.1.2 ALTER PROCEDURE e ALTER FUNCTION . . 766 11.1.1.3 DROP PROCEDURE e DROP FUNCTION . . . . 766 11.1.1.4 SHOW CREATE PROCEDURE e SHOW CREATE FUNCTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 11.1.2 SHOW PROCEDURE STATUS e SHOW FUNCTION STATUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 11.1.3 CALL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 11.1.4 BEGIN ... END Compound Statement . . . . . . . . . 767 11.1.5 Instruo DECLARE . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 ca 11.1.6 Variables in Stored Procedures . . . . . . . . . . . . . . . 768 11.1.6.1 Varivel Local DECLARE . . . . . . . . . . . . . . 768 a 11.1.6.2 Instruo Varivel SET . . . . . . . . . . . . . . 768 ca a 11.1.6.3 Instruo SELECT ... INTO . . . . . . . . . . 768 ca 11.1.7 Condies e Handlers . . . . . . . . . . . . . . . . . . . . . . . . 768 co 11.1.7.1 DECLARE Conditions . . . . . . . . . . . . . . . . . 768 11.1.7.2 DECLARE Handlers . . . . . . . . . . . . . . . . . . . 769 11.1.8 Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770 11.1.8.1 Declaring Cursors . . . . . . . . . . . . . . . . . . . 771 11.1.8.2 Cursor OPEN Statement . . . . . . . . . . . . . . 771 11.1.8.3 Cursor FETCH Statement . . . . . . . . . . . . . 771 11.1.8.4 Cursor CLOSE Statement . . . . . . . . . . . . . 771 11.1.9 Flow Control Constructs . . . . . . . . . . . . . . . . . . . . . 771 11.1.9.1 IF Statement . . . . . . . . . . . . . . . . . . . . . . . 771 11.1.9.2 CASE Statement . . . . . . . . . . . . . . . . . . . . . 772 11.1.9.3 LOOP Statement . . . . . . . . . . . . . . . . . . . . . 772 11.1.9.4 LEAVE Statement . . . . . . . . . . . . . . . . . . . . 772 11.1.9.5 ITERATE Statement . . . . . . . . . . . . . . . . . 772 11.1.9.6 REPEAT Statement. . . . . . . . . . . . . . . . . . . 773 11.1.9.7 WHILE Statement . . . . . . . . . . . . . . . . . . . . 773

xxi

12

Ferramentas de Clientes e APIs do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775


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

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

Tratamento de Erros no MySQL . . . . . . . . . 889


13.1 Erros Retornados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 889

Estendendo o MySQL . . . . . . . . . . . . . . . . . . . 896


14.1 MySQL Internals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896 14.1.1 Threads MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896 14.1.2 Pacotes de Teste do MySQL . . . . . . . . . . . . . . . . . . 896 14.1.2.1 Executando o Pacote de Testes do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 897 14.1.2.2 Extendendo o Pacote de Teste do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 897 14.1.2.3 Relatando Bugs no Pacote de Teste do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 898 14.2 Adicionando Novas Funes ao MySQL . . . . . . . . . . . . . . . . 899 co 14.2.1 Sintaxe CREATE FUNCTION/DROP FUNCTION . . . . . 900 14.2.2 Adicionando Novas Funes Denidas Por Usurio co a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900 14.2.2.1 Sequncia de Chamadas UDF para e Funes Simples . . . . . . . . . . . . . . . . . . . . . . . . . 902 co 14.2.2.2 Sequncia de Chamadas UDF para e Funes Agregadas . . . . . . . . . . . . . . . . . . . . . . . 903 co 14.2.2.3 Processando Argumentos . . . . . . . . . . . . 904 14.2.2.4 Valor de Retorno e Tartamento de Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 906 14.2.2.5 Compilando e Instalando Funes co Denidas Por Usurio . . . . . . . . . . . . . . . . . . . . 906 a 14.2.3 Adicionando uma Nova Funo Nativa . . . . . . . . 908 ca 14.3 Adicionado Novos Procedimentos ao MySQL . . . . . . . . . . . 909 14.3.1 Anlise de Procedimento . . . . . . . . . . . . . . . . . . . . . 909 a 14.3.2 Escrevendo um Procedimento. . . . . . . . . . . . . . . . . 910

xxv

Apndice A Problemas e Erros Comuns . . . . . 911 e


A.1 A.2 Como Determinar o Que Est Causando Problemas . . . . . 911 a Erros Comuns Usando o MySQL . . . . . . . . . . . . . . . . . . . . . . . 912 A.2.1 Erro: Access Denied . . . . . . . . . . . . . . . . . . . . . . . . . 912 A.2.2 Erro: MySQL server has gone away. . . . . . . . . . . . 912 A.2.3 Erro: Cant connect to [local] MySQL server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 913 A.2.4 Erro: Client does not support authentication protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915 A.2.5 Erro: Host ... is blocked . . . . . . . . . . . . . . . . . 916 A.2.6 Erro: Too many connections . . . . . . . . . . . . . . . . . 916 A.2.7 Erro: Some non-transactional changed tables couldnt be rolled back . . . . . . . . . . . . . . . . . . . . . . . 916 A.2.8 Erro: Out of memory . . . . . . . . . . . . . . . . . . . . . . . . . 917 A.2.9 Erro: Packet too large . . . . . . . . . . . . . . . . . . . . . . 917 A.2.10 Erros de Comunicao / Comunicao Abortada ca ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918 A.2.11 Erro: The table is full . . . . . . . . . . . . . . . . . . . . 919 A.2.12 Erro: Cant create/write to file . . . . . . . . . . 919 A.2.13 Erro no Cliente: Commands out of sync . . . . . . . 920 A.2.14 Erro: Ignoring user . . . . . . . . . . . . . . . . . . . . . . . . 920 A.2.15 Erro: Table xxx doesnt exist . . . . . . . . . . . 920 A.2.16 Erro: Cant initialize character set xxx . . 921 A.2.17 Arquivo No Encontrado . . . . . . . . . . . . . . . . . . . . 921 a A.3 Assuntos Relacionados a Instalao . . . . . . . . . . . . . . . . . . . . 922 ca A.3.1 Problemas de Ligao com a Biblioteca do Cliente ca MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922 A.3.2 Como Executar o MySQL Como Um Usurio a Normal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 923 A.3.3 Problemas com Permisses de Arquivos . . . . . . . . 924 o A.4 Assuntos Relacionados a Administrao . . . . . . . . . . . . . . . . 924 ca A.4.1 O Que Fazer Se o MySQL Continua Falhando . . 925 A.4.2 Como Recuperar uma Senha de Root Esquecida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 927 A.4.3 Como o MySQL Trata de Discos Sem Espao . . 928 c A.4.4 Onde o MySQL Armazena Arquivos Temporrios a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 928 A.4.5 Como Proteger ou AlterarHow to Protect or Change the MySQL Socket File /tmp/mysql.sock . . . . . . . 929 A.4.6 Problemas Com Fuso Horrio . . . . . . . . . . . . . . . . . 930 a A.5 Assuntos Relacionados a Consultas. . . . . . . . . . . . . . . . . . . . . 930 A.5.1 Caso-Sensitivito em Pesquisas . . . . . . . . . . . . . . . . . 930 A.5.2 Problemas Usando Colunas DATE . . . . . . . . . . . . . . 930 A.5.3 Problemas com Valores NULL . . . . . . . . . . . . . . . . . . 932 A.5.4 Problemas com alias . . . . . . . . . . . . . . . . . . . . . . . . 933 A.5.5 Deletando Linhas de Tabelas Relacionadas . . . . . 933 A.5.6 Resolvendo Problemas Com Registros No a Encontrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934

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

Apndice B Contribuio de Programas . . . . . 940 e ca


B.1 B.2 B.3 APIs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940 Conversores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 942 Utilitrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 944 a

Apndice C Colaboradores do MySQL . . . . . . 945 e


C.1 C.2 C.3 C.4 C.5 C.6 C.7 Desenvolvedores do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . Coolaboradores do MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . Responsveis pela Documentao e Traduo . . . . . . . . . . . a ca ca Bibliotecas usadas e incluidas com o MySQL . . . . . . . . . . . . Pacotes que suportam o MySQL . . . . . . . . . . . . . . . . . . . . . . . Ferramentas que so usadas para criar o MySQL . . . . . . . . a Responsveis pelo Suporte do MySQL . . . . . . . . . . . . . . . . . . a 945 948 952 953 954 955 955

Apndice D Histrico de Alteraes do MySQL e o co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957


D.1 Alteraes na distribuio 5.0.0 (Development). . . . . . . . . . 957 co ca D.2 Alteraes na distribuio 4.1.x (Alpha) . . . . . . . . . . . . . . . . 957 co ca D.2.1 Alteraes na distribuio 4.1.2 (not released yet) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 958 D.2.2 Alteraes na distribuio 4.1.1 (01 de Dez de 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 959 D.2.3 Alteraes na distribuio 4.1.0 (03 Apr 2003: co ca Alpha) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963 D.3 Alteraes na distribuio 4.0.x (Production) . . . . . . . . . . . 965 co ca D.3.1 Alteraes na distribuio 4.0.17 (not released yet) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 966 D.3.2 Alteraes na distribuio 4.0.16 (17 Out 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 968 D.3.3 Alteraes na distribuio 4.0.15 (03 Sep 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 970 D.3.4 Alteraes na distribuio 4.0.14 (18 Jul 2003) . . 974 co ca D.3.5 Alteraes na distribuio 4.0.13 (16 May 2003) co ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 978 D.3.6 Alteraes na distribuio 4.0.12 (15 Mar 2003: co ca Production) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 981

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 E Portando para Outros Sistemas e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1078


E.1 Depurando um Servidor MySQL . . . . . . . . . . . . . . . . . . . . . . 1079 E.1.1 Compilando o MYSQL para Depurao . . . . . . . 1079 ca E.1.2 Criando Arquivos Trace (Rastreamento) . . . . . . 1080 E.1.3 Depurando o mysqld no gdb . . . . . . . . . . . . . . . . . 1081 E.1.4 Usando Stack Trace . . . . . . . . . . . . . . . . . . . . . . . . . 1082 E.1.5 Usando Arquivos de Log para Encontrar a Causa dos Erros no mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . 1083 E.1.6 Fazendo um Caso de Teste Se Ocorre um Corrompimento de Tabela . . . . . . . . . . . . . . . . . . . . . . 1084 Depurando um cliente MySQL. . . . . . . . . . . . . . . . . . . . . . . . 1085 O Pacote DBUG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1085 Mtodos de Lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1087 e Comentrios Sobre Threads RTS . . . . . . . . . . . . . . . . . . . . . . 1088 a Diferena en Entre Alguns Pacotes de Threads . . . . . . . . . 1090 c

E.2 E.3 E.4 E.5 E.6

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

Cap tulo 1: Informaes Gerais co

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

MySQL Technical Reference for Version 5.0.0-alpha

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 security@mysql.com.

1.1 Sobre Este Manual


Este o manual de referncia MySQL; ele documenta o MySQL at a verso 5.0.0-alpha. e e e a Mudanas funcionais so sempre indicadas com referncia a verso, assim este manual c a e a tambm pode ser utiliado caso voc esteja utilizando uma verso mais antiga do MySQL e e a (como 3.23 ou 4.0-produo). Tambm a referncias a verso 5.0 (desenvolvimento). ca e e a Sendo um manual de referncia, ele no fornece instrues gerais sobre SQL ou conceitos de e a co banco de dados relacionais. Como o Programa da Banco de Dados MySQL est sob constante desenvolvimento, o manual a tambm atualizado freqentemente. A verso mais recente deste manual est dispon e e u a a ivel em http://www.mysql.com/documentation/ em diferentes formatos, incluindo HTML, PDF, e verses HLP do Windows. o O documento original uma arquivo Texinfo. A verso HTML produzida automaticae a e mente usando uma verso modicada do texi2html. A verso texto e Info so produzidas a a a com makeinfo. A verso PostScript produzida usando texi2dvi e dvips. A verso PDF a e a produzida com pdftex. e Se voc tiver diculdades de encontrar informaes no manual, voc pode tentar nossa e co e verso com busca em http://www.mysql.com/doc/. a Se voc tiver qualquer sugesto a respeito de adies e correes neste manual, por favor e a co co envie-os para a equipe de documentao em docs@mysql.com. ca Este manual foi inicialmente escrito por David Axmark e Michael (Monty) Widenius. Atualmente mantido pela Equipe de Documentao da MySQL, que conta com Arjen e ca Lentz, Paul DuBois e Stefan Hinz. Para outros colaboradores, veja Apndice C [Credits], e Pgina 945. a A traduao deste manual foi feita por Daniel Coelho Teobaldo e Carlos Henrique Paulino c sob a superviso da EAC Software. a Os direitos autorais (2003) deste manual pertence a compania Sueca MySQL AB. Seo 1.4.2 [Direitos Autorais], Pgina 17. ca a Veja

1.1.1 Convenes Usadas Neste Manual co


Este manual utiliza algumas convenes tipogrcas: co a constant Fonte de largura xa usada para nomes de comandos e opes; instrues e co co SQL; nomes de bancos de dados, tabelas e colunas; cdigo C e Perl; e variveis o a

Cap tulo 1: Informaes Gerais co

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

MySQL Technical Reference for Version 5.0.0-alpha

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}

1.2 Viso Geral do Sistema de Gerenciamento de Banco de a Dados MySQL


MySQL, o mais popular sistema de gerenciamento de banco de dados SQL Open Source, e desenvolvido, distribu e tem suporte da MySQL AB. A MySQL AB uma empresa comercial, ido e fundada pelos desenvolvedores do MySQL, cujos negcios fornecer servios relacionados o e c ao sistema de gerenciamento de banco de dados MySQL. Veja Seo 1.3 [What is MySQL ca AB], Pgina 12. a O web site do MySQL (http://www.mysql.com/) fornece informaes mais recentes sobre e co programa MySQL e a MySQL AB. O MySQL um sistema de gerenciamento de bancos de dados. e Um banco de dados uma coleo de dados estruturados. Ele pode ser quale ca quer coisa desde uma simples lista de compras a uma galeria de imagens ou a grande quantidade de informao da sua rede coorporativa. Para adicionar, ca acessar, e processar dados armazenados em um banco de dados de um computador, voc necessita de um sistema de gerenciamento de bancos de dados e como o Servidor MySQL. Como os computadores so muito bons em lidar com a grandes quantidades de dados, o gerenciamento de bancos de dados funciona como a engrenagem central na computao, seja como utilitrios independentes ca a ou como partes de outras aplicaes. co O MySQL um sistema de gerenciamento de bancos de dados relacional. e Um banco de dados relacional armazena dados em tabelas separadas em vez de colocar todos os dados um s local. Isso proporciona velocidade e exibilo idade. A parte SQL do MySQL atenda pela Structured Query Language Linguagem Estrutural de Consultas. SQL linguagem padro mais comum e a usada para acessar banco de dados e denida pelo Padro ANSI/ISO SQL. (O e a padro SQL est vem evoluindo desde 1986 e existem diversas verses. Neste a a o manual, SQL-92 se refere ao padro liberado em 1992, SQL-99 se refere ao a padro liberado em 1999, e SQL:2003 se refere a verso do que esperamos que a a seja liberado no meio de 2003. Ns usamos o termo o padr~o SQL indicando o a a verso atual do Padro SQL em qualquer momento). a a O MySQL um software Open Source. e Open Source signica que poss para qualquer um usar e modicar o proe ivel grama. Qualquer pessoa pode fazer download do MySQL pela Internet e us-lo a sem pagar nada. Se voc quiser, voc pode estudar o cdigo fonte e alter-lo e e o a para adequ-lo `s suas necessidades. O MySQL usa a GPL (GNU General Public a a License - Licena Pblica Geral GNU) c u http://www.fsf.org/licenses, para denir o que voc pode e no pode fazer com o software em diferentes e a situaes. Se voc sentir desconforto com a GPL ou precisar embutir o MySQL co e

Cap tulo 1: Informaes Gerais co

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

1.2.1 Histria do MySQL o


Quando comeamos, t c inhamos a inteno de usar o mSQL para conectar `s nossas tabelas ca a (ISAM). Entretanto, depois de alguns testes, utilizando nossas rpidas rotinas de baixo nivel a chegamos a concluso que o mSQL no era rpido e nem ex a a a ivel o suciente para nossas necessidades. Isto resultou em uma nova interface SQL para nosso banco de dados, mas com praticamente a mesma Interface API do mSQL. Esta API foi escolhida para facilitar a portabilidade para cdigos de terceiros que era escrito para uso com mSQL para ser portado o facilmente para uso com o MySQL. A derivao do nome MySQL no bem denida. Nosso diretrio base e um grande nmero ca a e o u de nossas bibliotecas e ferramentas sempre tiveram o prexo my por pelo menos 10 anos. A lha de Monty tambm ganhou o nome My. Qual das duas originou o nome do MySQL e continua sendo um mistrio, mesmo para ns. e o

MySQL Technical Reference for Version 5.0.0-alpha

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.

1.2.2 As Principais Caracter isticas do MySQL


A seguinte lista descreve algumas das caracter isticas mais importantes do Progrma de Banco de Dados MySQL. Veja Seo 1.5.1 [MySQL 4.0 Nutshell], Pgina 22. ca a Portabilidade e Escrito em C e C++. Testado com um amplo faixa de compiladores diferentes. Funciona em diversas plataformas. Veja Seo 2.2.3 [Quais SO], Pgina 78. ca a Utiliza o GNU Automake, Autoconf, e Libtool para portabilidade. APIs para C, C++, Eiel, Java, Perl, PHP, Python, Ruby e Tcl esto a dispon iveis. Veja Cap ptexi tulo 12 [Clients], Pgina 775. a Suporte total a multi-threads usando threads diretamente no kernel. Isto signica que se pode facilmente usar mltiplas CPUs, se dispon u ivel. Fornece mecanismos de armazenamento transacional e no transacional. a Tabelas em disco (MyISAM) baseadas em rvores-B extremamente rpidas a a com compresso de a indices. E relativamente fcil se adicionar outro mecanismo de armazenamento. a Isto util se voc quiser adicionar uma interface SQL a um banco de e e dados caseiro. Um sistema de alocao de memria muito rpido e baseado em proca o a cesso(thread). Joins muito rpidas usando uma multi-join de leitura unica otimizada. a Tabelas hash em memria que so usadas como tabelas temporrias. o a a Funes SQL so implementadas por meio de uma biblioteca de classes co a altamente otimizada e com o mximo de performance. Geralmente no h a a a nenhuma alocao de memria depois da inicializao da pesquisa. ca o ca O cdigo do MySQL foi testado com Purify (um detector comercial de o falhas de memria) e tambm com o Valgrind, uma ferramenta GPL o e (http://developer.kde.org/~sewardj/). Dispon como verso cliente/servidor ou embutida(ligada). ivel a

Tipos de Coluna Aceita diversos tipos de campos: tipos inteiros de 1, 2, 3, 4 e 8 bytes com e sem sinal, FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET e ENUM. Veja Seo 6.2 [Tipos de Coluna], ca Pgina 482. a Registros de tamanhos xos ou variveis. a

Cap tulo 1: Informaes Gerais co

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.

MySQL Technical Reference for Version 5.0.0-alpha

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.

1.2.3 Estabilidade do MySQL


Esta seo discute as questes Quo estvel o MySQL? e Posso depender do MySQL ca o a a e neste projeto?. Tentaremos deixar claro estes assuntos e responder algumas das questes o mais importantes que dizem respeito a muito de nossos usurios. A informao nesta seo a ca ca baseada em dados colhidos da lista de discusso, que muito ativa na identicao de e a e ca problemas e assim como nos relatos de tipos de uso. Originalmente, o cdigo vem do in dos anos 80, fornecendo um cdigo estvel e o formato o icio o a de tabelas ISAM permanece compat com verses anteriores. Na TcX, a predecessora da ivel o MySQLAB, o MySQL vem trabalhando sem problemas em nossos projetos desde o meio de 1996. Quando o Programa de Banco de Dados MySQL foi disponibilizado para um pblico maior, u nossos novos usurios rapidamente encontraram algumas partes de cdigo sem testes. a o Desde ento, cada distribuio nova teve menos problemas de portabilidade (mesmo com a ca os novos recursos implementados em cada uma destas verses) o

Cap tulo 1: Informaes Gerais co

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

MySQL Technical Reference for Version 5.0.0-alpha

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

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


A Verso 3.22 do MySQL tem suporte para tabelas com limite de tamanho at 4G. Com a e o novo MyISAM no MySQL verso 3.23 o tamanho mximo foi expandido at 8 milhes de a a e o terabytes (2 ^ 63 bytes). Com este tamanho de tabela maior permitido, o tamanho mximo a efetivo das tabelas para o banco de dados MySQL normalmente limitado pelas restries e co do sistema operacional quanto ao tamanho dos arquivos, no mais por limites internos do a MySQL. A seguinte tabela lista alguns exemplos do limite do tamanho de arquivos do sistema operacional: Sistema Operacional Linux-Intel 32 bit Linux-Alpha Solaris 2.5.1 Solaris 2.6 Solaris 2.7 Intel Solaris 2.7 ULTRA-SPARC Limite do tamanho do arquivo 2G, muito mais usando LFS 8T (?) 2G (E poss 4GB com patch) ivel 4G (pode ser alterado com parmetro) a 4G 8T (?)

No Linux 2.2 voc pode ter tabelas maiores que 2 GB usando o patch LFS para o sistema e de arquivos ext2. No Linux 2.4 j existem patches para o sistema de arquivos ReiserFS para a ter suporte a arquivos maiores. A maioria das 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

Cap tulo 1: Informaes Gerais co

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

1.2.5 Compatibilidade Com o Ano 2000 (Y2K)


O Servidor MySQL no apresenta nenhum problema com o ano 2000 (Y2K compat a ivel) O Servidor MySQL usa funes de tempo Unix que tratam datas at o ano 2037 para co e valores TIMESTAMP; para valores DATE e DATETIME, datas at o ano 9999 so aceitas. e a Todas as funes de data do MySQL esto no arquivo sql/time.cc e codicadas com co a muito cuidado para ser compat com o ano 2000. ivel No MySQL verso 3.22 e posterior, o novo tipo de campo YEAR pode armazenar anos 0 e a 1901 at 2155 em 1 byte e mostr-lo usando 2 ou 4 d e a igitos. Todos os anos de 2 d igitos so considerados estar na faixa de 1970 at 2069; o que signica que se voc armazenar a e e 01 em uma coluna YEAR, O Servidor MySQL o tratar como 2001. a O seguinte demonstrao simples ilustra que o MySQL Server no tem nenhum problema ca a com datas at depois do ano 2030: e mysql> DROP TABLE IF EXISTS y2k; Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE y2k (date DATE, -> date_time DATETIME, -> time_stamp TIMESTAMP); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO y2k VALUES -> ("1998-12-31","1998-12-31 23:59:59",19981231235959), -> ("1999-01-01","1999-01-01 00:00:00",19990101000000), -> ("1999-09-09","1999-09-09 23:59:59",19990909235959), -> ("2000-01-01","2000-01-01 00:00:00",20000101000000), -> ("2000-02-28","2000-02-28 00:00:00",20000228000000), -> ("2000-02-29","2000-02-29 00:00:00",20000229000000), -> ("2000-03-01","2000-03-01 00:00:00",20000301000000), -> ("2000-12-31","2000-12-31 23:59:59",20001231235959), -> ("2001-01-01","2001-01-01 00:00:00",20010101000000), -> ("2004-12-31","2004-12-31 23:59:59",20041231235959), -> ("2005-01-01","2005-01-01 00:00:00",20050101000000), -> ("2030-01-01","2030-01-01 00:00:00",20300101000000), -> ("2050-01-01","2050-01-01 00:00:00",20500101000000); Query OK, 13 rows affected (0.01 sec) Records: 13 Duplicates: 0 Warnings: 0

12

MySQL Technical Reference for Version 5.0.0-alpha

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.

1.3 Viso Geral da MySQL AB a


MySQL AB a companhia dos fundadores e principais desenvolvedores do MySQL. A MySQL e AB foi estabelecida originalmente na Sucia por David Axmark, Allan Larsson e Michael e Monty Widenius.

Cap tulo 1: Informaes Gerais co

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.

1.3.1 O Modelo de Negcio e Servios da MySQL AB o c


Uma das dvidas mais comuns que encontramos : Como voc pode viver de algo que voc u e e e assim que fazemos. disponibiliza sem custo? E A MySQL AB ganha dinheiro com suporte, servios, licenas comerciais e royalties. Usc c amos estes rendimentos para patrocinar o desenvolvimento de produtos e para expandir os negcios da MySQL. o A compania tem sido luccrativa desde de sua criao. Em Outubro de 2001, aceitamos um ca nanciamento de risco de investidores Escandinavos e um pounhado de pessoas de negcio. o Este investimento usado para solidicarmos nosso modelo de negcio e construir um base e o para o crescimento sustentvel. a

14

MySQL Technical Reference for Version 5.0.0-alpha

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 sales@mysql.com.

1.3.1.2 Treinamento e Certicao ca


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

1.3.1.3 Consultoria
A MySQL AB e seus Parceiros Autorizados oferecem 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

Cap tulo 1: Informaes Gerais co

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 consulting@mysql.com.

1.3.1.4 Licenas Comerciais c


O banco de dados MySQL liberado sob a licena GNU General Public License (GPL). Isto e c signica que o programa MySQL pode ser usado sem custos sob a GPL. Se voc no deseja estar e a limitado pelos termos da GPL (tais como a exigncia de que a sua aplicao tambm deva ser e ca e GPL), voc pode comprar uma licena comercial para o mesmo produto da MySQL AB; veja e c http://www.mysql.com/products/pricing.html. Desde de que a MySQL AB dona dos e direitos do cdigo fonte do MySQL, estamos aptos a empregar o Licenciamento Dual, que o signica que o mesmo produto est dispon sob a GPL e sob uma licena comercial. Isto a ivel c no afeta o nosso comprometimento com o Open Source de forma alguma. Para detalhes a sobre quando uma licena comercial exigida, veja Seo 1.4.3 [MySQL licenses], Pgina 18. c e ca a

1.3.1.5 Parcerias
A MySQL AB tem um programa de parceria mundial que cobre cursos de treinamento, consultaria e suporte, 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 partner@mysql.com. 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

MySQL Technical Reference for Version 5.0.0-alpha

1.3.2 Informaes para Contato co

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 press@mysql.com. 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 sales@mysql.com. 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 training@mysql.com. 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 consulting@mysql.com. 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 licensing@mysql.com (para questes sobre licenciamento) ou para sales@mysql.com 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 partner@mysql.com. 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 trademark@mysql.com. 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 jobs@mysql.com. 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 security@mysql.com. 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 benchmarks@mysql.com.

Cap tulo 1: Informaes Gerais co

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 docs@mysql.com.

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 webmaster@mysql.com. A MySQL AB tem uma pol itica de privacidade que pode ser lida em http://www.mysql.com/company/privac Para qualquer questes a respeito desta pol o itica, envie um e-mail para privacy@mysql.com. Para todos os outros assunto, envie um e-mail para info@mysql.com.

1.4 Suporte e Licenciamento do MySQL


Esta seo descreve os contratos de licenciamento e suporte do MySQL. ca

1.4.1 Suporte Oferecido pela MySQL AB


O suporte tcnico do MySQL AB signica respostas individualizadas as seus problemas pare ticulares diretamente dos engenheiros de software que codicaram o MySQL. Tentamos ter uma viso ampla e inclusiva de suporte tcnico. Qualquer problema envola e vendo o MySQL importante par ns se for importante para voc. Normalmente os clientes e o e procuram ajuda em como comandos e utilitrios diferentes funcionam, remover gargalos de a desempenhos, restaurar sistemas com falhas, entender impactos do sistema operacional e rede no MySQL, congurar melhor prticas de backup e restaurao, utiluizaar APIs, e assim a ca por diante. Nosso suporte cobre apenar o servidor MySQL e nossos prprios utilitrios, e o a no produtos de terceirosque acessam o servidor MySQL, embora tentamos ajudar com eles a quando podemos. Informaes detalhadas sobre nossas vrias opes de suporte dado em co a co e Suporte tcnico como seguro de vida. Voc pode viver felizsem ele durante anos, mas e e e quando sua hora chegar ele de grande importncia, mas j muito tarde para adquir e a ae ilo. Se voc utiliza o MySQL Server para aplicaes importantes e encontrar diculdades e co repentinas, voc pode gastar horas tentando resolver os problemas sozinho. Voc pode e e precisar de acesso imediato aos responsveis pela soluo de problemas do MySQL dsipon a ca iveis, contratados pela MySQL AB.

1.4.2 Copyrights e Licenas Usadas pelo MySQL c


MySQL AB possui os direitos sobre o cdigo fonte do MySQL, as logomarcas e marcas rego istradas do MySQL e este manual. Veja Seo 1.3 [What is MySQL AB], Pgina 12. Diversas ca a licenas so relevantes a distribuio do MySQL: c a ca 1. Todo o cdigo espec o ico do MySQL no servidor, a biblioteca mysqlclient e o cliente, assim como a biblioteca GNU readline coberta pela GNU General Public License. e Veja Apndice H [GPL license], Pgina 1096. O texto desta licena podee ser encone a c trado no arquivo COPYING na distribuio. ca 2. A biblioteca GNU getopt coberta pela GNU Lesser General Public License. Veja e http://www.fsf.org/licenses/.

18

MySQL Technical Reference for Version 5.0.0-alpha

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 docs@mysql.com 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

1.4.3 Licenas do MySQL c

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

1.4.3.1 Usando o Programa MySQL Sob uma Licena Comercial c


A licena GPL contagiosa no sentido de que quando um programa ligado a um programa c e e GPL, todo o cdigo fonte para todas as partes do produto resultante tambm devem ser o e distribu idas sob a GPL. Se voc no seguir esta exigncia do GPL, voc quebra os termos da e a e e licena e perde o seu direito de usar o programa GPL inclu c ido. Voc tambm corre riscos. e e Voc precisar de uma licena comercial: e a c

Cap tulo 1: Informaes Gerais co

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 sales@mysql.com.

1.4.3.2 Usando o Programa MySQL Sem Custo Sob GPL


Voc pode utilizar o programa MySQL sem custo sob a GPL se voc concordar as condies do e e co GPL. Para detalhes adicionais, incluindo respostas a duvidas comuns sobre a GPL, veja o FAQ gencio da Free Software Foundation em http://www.fsf.org/licenses/gpl-faq.html. Usos comuns da GPL incluem: Quando voc distribui sua prpria aplicao e o cdigo fonte da MySQL com o seu e o ca o produto. Quando voc distribui o cdigo fonte do MySQL junto com outros programas que no e o a so ligados ou dependentes do sistema do MySQL para suas funcionalidades mesmo se a voc vender a distribuio comercialmente. Isto chamado agregao na licena GPL. e ca e ca c Quando voc no est distribuindo qualquer parte do sistema do MySQL, voc pode e a a e us-lo de graa. a c Quando voc for um Provedos de Servios de Internet (Internet Service Provider - ISP), e c oferecendo hospedagem web com serviodres MySQL para seus clientes. Encorajamos as pessoas a usarem provedroes que possuem suporte ao MySQL, j que isto lhes dar a a a conana qie seus provedores tero, de fato, os recursos para resolver qualquer problema c a que eles possam experimentar com a instalaao do MySQL. Mesmo se um provedor no c a tiver uma licena comercial ara o MySQL Server, seus clientes devem ter acesso de c leitura ao fonte da instalao do MySQL para que seus clientes veriquem que ela est ca a correta.

20

MySQL Technical Reference for Version 5.0.0-alpha

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 Logomarcas e Marcas Registradas da MySQL AB


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

1.4.4.1 O Logo Original do MySQL


O logo do golnho do MySQL foi desenhado pela Finnish advertising agency Priority em 2001. O golnho foi escolhido como um s imbolo para o baco de dados MySQL j que ele a esperto, rpido e um animal gil, se esforndo em navegar pelos oceanos de dados. Ns e a a a o tambm gostamos de golnos. e O logo original MySQL s podem ser usados pr representates da MySQL AB e aqueles que o possuem um acordo escrito permitndo-os de faz-lo. e

1.4.4.2 Logomarcas da MySQL que Podem Ser Usadas Sem 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.

Cap tulo 1: Informaes Gerais co

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 trademark@mysql.com 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.

1.4.4.4 Logomarcas dos Parceiros da MySQL AB


As logomarcas de parceria do MySQL podem ser usados apenas por companhias e pessoas que possuem um acordo de parceria por escrito com a MySQL AB. Parceiras incluem certicao ca com treinador ou consultor do MySQL. Para mais informaes, Seo 1.3.1.5 [Partnering], co ca Pgina 15. a

1.4.4.5 Usando a Palavra MySQL em Texto Impresso ou Apresentao ca


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

22

MySQL Technical Reference for Version 5.0.0-alpha

1.4.4.6 Usando a Palavra MySQL em Nomes de Companhias e Produtos


O uso da palavra MySQL em nomes de produtos ou companias ou em dominios de Internet no permitida sem permisso escrita da MySQL AB. a e a

1.5 Mapa de Desenvolvimento do MySQL


Esta seo fornece uma amostra do mapa de desenvolvimento do MySQL, incluindo princa cipais recursos imlementados ou planejados para o MySQL 4.0, 4.1, 5.0 e 5.1. A seguinte seo fornece informao para cada distribuio. O planejamento para alguns dos recursos ca ca ca mais requisitados esto listada na tabela a seguir. a Feature Unions Subqueries R-trees Stored procedures Views Cursors Foreign keys Triggers Full outer join Constraints MySQL version 4.0 4.1 4.1 (para tabelas MyISAM) 5.0 5.0 ou 5.1 5.0 5.1 (3.23 com InnoDB) 5.1 5.1 5.1

1.5.1 MySQL 4.0 in a Nutshell


Muito aguardado por nossos usurios, o MySQL Server 4.0 agora est dispon a a ivel em sua verso de produo. a ca O MySQL 4.0 est dispon a ivel para download em http://www.mysql.com/ e nossos sites mirrors. O MySQL tem sido testado por um grande nmero de usurios e est em uso em u a a mutios sites. Os principais novos recursos do MySQL Server 4.0 so trabalhados em conjunto com os a usurios corporativos e da comunidade, melhorando o programa de banco de dados MySQL a como uma soluo para misses cr ca o iticas e sistemas de bancos de dados de alta carga. Outros novos recursos visam os usurios de bancos de dados embutidos. a O MySQL 4.0 foi declarado estvel para uso em produo a partir da verso 4.0.12 em a ca a Maro de 2003. Isto signica que, no futuro, apenas correo de erros sero feitas para a c ca a distribuio da srie 4.0 e apenas correo de erros cr ca e ca iticos sero feitas para a antiga srie a e 3.23. Veja Seo 2.5.2 [Upgrading-from-3.23], Pgina 123. ca a Novos recursos para o MySQL est sendo adicionado ao MySQL 4.1 que tambm est a e a (verso alfa). Veja Seo 1.5.2 [MySQL 4.1 Nutshell], Pgina 24. disponivel a ca a

Cap tulo 1: Informaes Gerais co

23

1.5.1.1 Recursos Dispon iveis no MySQL 4.0


Aumento da velocidade O MySQL 4.0 tem uma cache de consultas que pode dar uma grande aumento na velocidade de aplicaes com consutas repetitivas. Veja Seo 6.9 co ca [Query Cache], Pgina 625. a A verso 4.0 aumenta a velocidade do MySQL Server em um nmero e a u reas tais como INSERTs em bloco, buscas em a indices empacotados, criao ca de indices FULLTEXT, e COUNT(DISTINCT). Introduo ao Servidor MySQL Embutido ca A nova biblioteca do Servidor Ebutido pode ser facilmente usada em aplicaes standalone e embarcadas. O servidor embutido fornce uma co alternativa para o uso do MySQL em um ambiente cliente/servidor. Veja Seo 1.5.1.2 [Nutshell Embedded MySQL], Pgina 24. ca a Mecanismo de armazenamento InnoDB como padro a O mecanismo de armazenamento InnoDB oferecido como um recurso e padro do servidor MySQL. Isto signica suporte a transaes ACID, chaves a co estrangeiras com UPDATE/DELETE em cacata e lock de registro agora so recursos padres. Veja Seo 7.5 [InnoDB], Pgina 643. a o ca a Novas fncionalidades A melhora das propriedades de busca FULLTEXT do MySQL Server 4.0 habilita indexao FULLTEXT de grandes partes de texto com linguagem ca natural e binria de lgica de busca. Voc pode personalizar o tamanho a o e minimo de palavras e denir a sua prpria lista de palavras de parasa em o qualquer linguagem humana, habilitando um novo conjunto de aplicaes co a serem constru idas no MySQL Server. Veja Seo 6.8 [Fulltext Search], ca Pgina 619. a Compatibilidade com os padres, portabilidade e migrao o ca Recursos para simplicar a migrao de outros sistemas de banco de dados ca para o MySQL Server incluem TRUNCATE TABLE (como no Oracle) Muitos usurios tambm caro satisfeitos ao perceber que o MySQL a e a Server agora suporta a instruo UNION, um recurso padro SQL muito ca a esperado. O MySQL agora pode ser executado nativamente na plataforma Novell NetWare 6.0. Veja Seo 2.6.8 [Novell NetWare], Pgina 164. ca a Internacionalizao ca Nossos usurios alemes, austr a a iacos e suios notaro que o MySQL agora c a suporta um novo conjunto de caracteres, latin1_de, que assegura que a Ordena~o em alem~o classicar palavras com umlauts na mesma ordem ca a a das agendas telefnicas alems. o a Aprimoramento da Usabilidade No porcesso de construo de recursos para novos usurios, no esquecemos os ca a a pedidos de nossa leal comunidade de usurios. a

24

MySQL Technical Reference for Version 5.0.0-alpha

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

1.5.1.2 Servidor Embutido MySQL


libmysqld faz o MySQL Server adequado para uma grande rea de aplicaes. Usando a a co biblioteca do servidor MySQL embutido, pode embarcar o MySQL Server em vrios aplicaa tivos e dispositivos eletrnicos, onde o usurio nal no tm conhecimento de possuir um o a a e banco de dados bsico. O servidor MySQL embutido ideal para uso nos bastidores em a e aplicaes de Internet, quiosques pblicos, responsvel por unidades de combinao hardco u a ca ware/software, servidores Internet de alta performance, banco de dados de auto-conteno ca distribu idos em CDROM, e assim por diante Muitos usurios da libmysqld se benciaro da iLicena Dual do MySQL. Para aqueles a a c que no desejam ser limitar pela GPL, o software tambem est dispon sob uma licena a e a ivel c comercial. A biblioteca embutida do MySQL tambm usa a mesma interface que a biblioteca e do cliente normal, sendo ento conveniente e fcil de usar. Veja Seo 12.1.15 [libmysqld], a a ca Pgina 864. a

1.5.2 MySQL 4.1 in a Nutshell


MySQL Server 4.0 prepara a criao de novos recursos como subqueries e Unicode (impleca mentado na verso 4.1) e o funcionamento de stored procedures do SQL-99 est sendo feito a a para a verso 5.0. Estes recursos esto no topo da lista de recursos desejados de muitos de a a nossos clientes. Com estas adies, os cr co iticos do MySQL Database Server devem ser mais imaginativos que nunca para apontar as decincias do MySQL Database Management System. J conhecido e a por sua estabilidadem velocidade e facilidade de uso, o MySQL Server estar apto a atender a as necessidades de vrios compradores exigentes. a

1.5.2.1 Recursos Dispon iveis no MySQL 4.1


Os recursos listados nesta seo esto implementados no MySQL 4.1. Outros poucos recurca a sos esto planejados para o MySQL 4.1. Veja Seo 1.6.1 [TODO MySQL 4.1], Pgina 27. a ca a

Cap tulo 1: Informaes Gerais co

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

MySQL Technical Reference for Version 5.0.0-alpha

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

1.5.2.2 Stepwise Rollout


Novos recursos esto sendo adicionados ao MySQL 4.1. A verso Alfa j st dispon para a a a a ivel download. Veja Seo 1.5.2.3 [Nutshell Ready for Immediate Use], Pgina 26. ca a O conjunto de recursos que esto sendo adicionados a verso 4.1 esto, na maioria, cora a a rigidos. Desenvolvimento adicional j est em andamento na verso 5.0. O MySQL 4.1 a a a passam pelos passos de Alfa (tempo no qual os novos recursos ainda podem ser adionados/alterados), Beta (quando j implementamos todos os recursos e apenas correes de a co erros so realizados0) e Gamma (indicando que ima distribuio de produo est quase a ca ca a pronta). No m deste processo, o MySQL 4.1 se tornar o nova distribuio de produo). a ca ca

1.5.2.3 Pronto para Uso em Desenvolvimento Imediato


O MySQL 4.1 est atualmente no estgio alfa e os binrios esto dispon a a a a iveis para download em http://www.mysql.com/downloads/mysql-4.1.html. Todas as distribuies binrias co a passaram por nossos extensivos teste sem nenhum erro na plataforma em que testamos. Veja Seo D.2 [Novidades na verso 4.1], Pgina 957. ca a a Para aqueles que desejam usar o fonte mais recente do desenvolvimento do MySQL 4.1, deixamos nosso repositrio do BitKeeper publicamente dispon o ivel. Veja Seo 2.3.4 [Installing ca source tree], Pgina 100. a

1.5.3 MySQL 5.0, A Prxima Distribuio de Desenvolvimento o ca


O novo desenvolvimento para o MySQL est focado na distribuio 5.0, comrecursos como a ca Stored Procedures entre outros. Veja Seo 1.6.2 [TODO MySQL 5.0], Pgina 27. ca a Para aqueles que desejam dar uma olhada no desenvolvimento do MySQL, deixamos o nosso repositrioo do BitKeeper para o MySQL verso 5.0 dispon publicamente. Veja o a ivel Seo 2.3.4 [Instalando a rvore fonte], Pgina 100. ca a a

Cap tulo 1: Informaes Gerais co

27

1.6 MySQL e o Futuro (o TODO)


Esta seo lista os recursos que planejamos impementar no MySQL Server. As listas so ca a apresentadas por verso, e os itens esto aproximadamente na ordem em que sero feitos. a a a Nota: Se voc um usurio corporativo com uma necessidade urgente de um recurso paree a ticular, por favor, contate sales@mysql.com para conversarmos sobre patroc inio. Financiamento feito por uma ou mais companhias nos permite alocar recursos adicionais para aquele propsito espec o ico. Um exemplo de um recurso patrocinado no passado a replicao. e ca

1.6.1 Novos Recursos Planejados Para a Verso 4.1 a


Os recursos abaixo ainda no esto implementados no MySQL 4.1, mass esto planejados a a a para implementao antes que o MySQL 4.1 v para a fase beta. Para uma lista do que j ca a a est feito no MySQL 4.1, veja Seo 1.5.2.1 [Nutshell 4.1 features], Pgina 24. a ca a Suporte OpenSSL estvel (o MySQL 4.0 tem suporte rudimentar ao OpenSSL, no a a testado 100%). Mais teste de instrues preparadas co Mais testes de mltiplos conjunto de caracteres para uma tabela. u

1.6.2 Novos Recursos Planejados Para a Verso 5.0 a


Os seguintes recursos esto planejados para incluso no MySQL 5.0. Note que como posa a suimos diversos desenvolvedores que esto trabalhando em diferentes projetos, havero a a tambm muitos recursos adicionais. H tambm um pequena chance qie alguns destes e a e recursos sejam adicionados ao MySQL 4.1. Para uma lista do que j est feito no MySQL a a 4.1, veja Seo 1.5.2.1 [Nutshell 4.1 features], Pgina 24. ca a Para aqueles que desejam dar uma olhada nas novidades do desenvolvimento do MySQL, deixamos nosso repositrio BitKeeper para o MySQL verso 5.0 publicamente dispon o a ivel. Veja Seo 2.3.4 [Instalando a rvore fonte], Pgina 100. ca a a Stored Procedures Stored procedures esto sendo implementadas atualmente. Este esforo a c e baseado no SQL-99, o que tem m sintaxe bsica similar (mas no idntica) a a a e do Oracle PL/SQL. Ns tambm implementaremos o framework do SQL-99 o e para enganchar em linguagens externas e (onde poss ivel) compatibilidade com p.ex. PL/SQL e T-SQL. Nova funcionalidade Suporte a cursores elementares. A habilidade de especicar explicitamente para tabelas MyISAM que um indice deve ser criado como um indice RTREE. Na verso 4.1, a indices RTREE so usados internamente para dados geomtricos (tipos de dados GIS), mas a e no podem ser criados no pedido. a Registros de tamanhos dinmicas para tabelas HEAP. a

28

MySQL Technical Reference for Version 5.0.0-alpha

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.

1.6.3 Novos Recursos Planejados Para a Verso 5.1 a


Novas funcionalidades Suporte FOREIGN KEY para todos os tipos de tabelas. Restries a n de colunas. co ivel Replicao seguro a falhas. ca Backup online com baixa queda de desempenho. O backup online tornar a mais fcil adicionar um novo slave de replicao sem desligar o master. a ca Aumento de velocidade Novo formato dos arquivos de denio e tabelas baseados em texto (arca quivos .frm) e uma cache de tabelas para a denio de tabelas. Isto nos ca permitir fazer consultas mais rpidas da estruturas de tabela e dar um a a suporte a chaves estrangeiras mais eciente. Otimizar o tipo BIT para gastar 1 bit (agora BIT gasta 1 byte; e tratado e como um sinnimo para TINYINT.) o Aprimoramento da usabilidade Adicionar opes ao protocolo cliente/servidor para obter notas de proco gresso para longos comandos em execuo. ca Implementar RENAME DATABASE. Para tornar isto seguro para todos os mecanismos de armazenamento, ele deve funcionar como a seguir:

Cap tulo 1: Informaes Gerais co

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.

1.6.4 Novos Recursos Planejados Para a Verso em um Futuro a Prximo o


Novas funcionalidade Comando como do Oracle CONNECT BY PRIOR ... para estruturas de busca tipo rvore (hierrquica) a a Adicionar todos os tipos que faltam do SQL-92 e ODBC 3.0. Adicionar SUM(DISTINCT). INSERT SQL_CONCURRENT e mysqld --concurrent-insert para fazer uma insero concorrente no m do arquivo se o arquivo tiver lock de leitura. ca Permitir a atualizao de variveis nas instrues UPDATE. Por exemplo: ca a co UPDATE TABLE foo SET @a=a+b,a=@a, b=@a+c. Alterar quando as variveis de usurios so atualizadas e assim pode se usa a a a las com GROUP BY, como no exemplo a seguir: SELECT id, @a:=COUNT(*), SUM(sum_col)/@a FROM nome_tabela GROUP BY id. Adicionar a opo IMAGE a LOAD DATA INFILE para no atualizar campos ca a TIMESTAMP e AUTO_INCREMENT. Adicionar a sintaxe LOAD DATA INFILE ... UPDATE que funciona assim: Para tabelas com chaves primrias, se o registro de entrada contm um a e valor de chave primria, linhas existentes correspondendo `s chaves a a primrias so atualizadas para o restante das colunas de entrada. No a a entanto, colunas faltosas na insero dos registros de entradas no ca a so alteradas. a Para tabelas com chaves primrias, se um registro de entrada no a a contm um valor de chave primria ou estr faltando alguma parte da e a a chave, o registro tratado como um LOAD DATA INFILE ... REPLACE e INTO. Fazer com que LOAD DATA INFILE entenda a sintaxe do tipo: LOAD DATA INFILE file_name.txt INTO TABLE tbl_name TEXT_FIELDS (text_field1, text_field2, text_field3) SET table_field1=CONCAT(text_field1, text_field2), table_field3=23 IGNORE text_field3 Isto pode ser usado para saltar colunas extras no arquivo texto, ou atualizar colunas baseadas nas expresses dos dados lidos. o

30

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 1: Informaes Gerais co

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

MySQL Technical Reference for Version 5.0.0-alpha

1.6.5 Novos Recursos Planejados Para a Verso em um Futuro a a Mdio Prazo e


Implementar funo: get_changed_tables(timeout,table1,table2,...) ca Alterar leitura atravs de tabelas para usar mapeamento de memria quando poss e o ivel. Atualmente somente tabelas compactadas usam mapeamento de memria. o Tornar o cdigo de timestamp automtico melhor. Adicionar timestamps para o log o a de atualizaes com SET TIMESTAMP=#; co Usar mutex de leitura/escrita em alguns lugares para obter maior velocidade. Views simples (inicialmente em uma tabela, depois em qualquer expresso). Veja a Seo 1.8.4.6 [ANSI di Views], Pgina 51. ca a Fechar algumas tabelas automaticamente se uma tabela, tabela temporria ou arquivos a temporrios obtiverem o erro 23 (no pode abrir arquivos sucientes). a a Melhor propagao de constantes. Quando uma ocorrncia de nome_col=n encontrada ca e e em uma expresso, para algumas constantes n, substitua outras ocorrncias de nome_ a e col dentro da expresso por n. Atualmente, isto feito somente para alguns casos a e simples. Alterar todas expresses const com expresses calculadas se poss o o ivel. Chave otimizadora = expresso. No momento somente a chave = campo ou a chave = a constante so otimizadas. a Melhorar o cdigo de algumas das funes de cpia o co o Alterar sql_yacc.yy para um analizador em linha para reduzir seu tamanho e obter melhores mensagems de erro (5 dias). Alterar o analisador para usar somente uma regra para diferentes nmeros de arguu mentos em uma funo. ca Utilizar nomes de clculo completos na parte de ordenao. (For ACCESS97) a ca MINUS, INTERSECT e FULL OUTER JOIN. (Atualmente UNION [na 4.0] e LEFT OUTER JOIN so suportados). a SQL_OPTION MAX_SELECT_TIME=# para colocar um limite de tempo em uma pesquisa. Fazer o log de atualizaes gravar em um banco de dados. co LIMIT negativo para recuperar dados do m. Alarmes em funes clientes de conexo, leitura e escrita. co a Por favor, perceba as alteraes ao mysqld_safe: de acordo com o FSSTND (que o co Debian tenta seguir) arquivos PID dever ir em /var/run/<progname>.pid e arquivos de log em /var/log. Seria timo se voc puder colocar o diretrio de dados na o e o primeira declarao de "pidle" e "log", para que a colocao destes arquivos possa ca ca ser alterada com uma simples instruo. ca Permitir um cliente requisitar log. Adicionar uso de zlib() a LOAD DATA INFILE, para permitir que as instrues leiam co arquivos compactados com gzip. Corrigir ordenao e agrupamento de colunas BLOB (parcialmente resolvida agora). ca Alterar para o uso de semforos quando contar threads. Devemos primeiro implementar a uma biblioteca de semforos para a MIT-pthreads. a

Cap tulo 1: Informaes Gerais co

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

1.6.6 Novos Recursos que No Planejamos Fazer a


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

1.7 Fontes de Informaes do MySQL co


1.7.1 Listas de Discusso MySQL a
Esta seo introduz a lista de deiscusso do MySQL e d algumas explicaes sobre como a ca a a co lista deve ser utilizada. Quando voc se inscreve na lista de discusso, voc receber, como e a e a mensagens de email, tudo o que enviado para a lista. Voc tambm poder enviar suas e e e a prprias dvidas e respostas para a lista. o u

1.7.1.1 As Listas de Discusso do MySQL a


Para se inscrever ou cancelar a inscrio de qualquer uma das listas de email descritas nesta ca seo, visite http://lists.mysql.com/. Por favor, no envie mensagem sobre inscrio ca a ca ou cancelamento para qualquer das listas de emasil, porque tais mensagens so distribu a idas automaticamente para milhares de outros usurios. a Seu site local pode ter muitas inscries para uma lista de email do MySQL. Se sim, o site co pode ter uma lista de email local, assim as mensagens enviadas para lists.mysql.com do seu site so propagadas para a lista local. Nestes casos, por favor, contate seu administrador a de sistema para adicionado ou excluido da lista local do MySQL. Se voc quiser que as mensagens da lista de discusso sejam enceminhadas para uma caixa e a de correio separada no seu programa de emails, congure um ltro com base nos cabealhos c das mensagens. Voc pode tambm usar os cabealhos List-ID: ou Entregar-Para: para e e c identicar suas mensagens. Existe tambm as seguintes listas de discusso sobre MySQL atualmente: e a announce Esta para anuncio de novas verses do MySQL e programas relacionados. e o Esta uma lista com baixo volume na qual todos usuarios do MySQL deveriam e se inscrever. A principal lista para discusses MySQL em geral. Note que alguns tpicos so o o a mais bem discutidos em listas mais especializadas. Se voc enviar para a lista e errada voc pode no obter resposta. e a

mysql

34

MySQL Technical Reference for Version 5.0.0-alpha

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.

win32-digest Uma verso resumida da lista win32. a

Cap tulo 1: Informaes Gerais co

35

myodbc

Lista para todos os tpicos relacionados a conectividade do MySQL com ODBC. o

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. mysql-france-subscribe@yahoogroups.com Lista de mensagens na l ingua francesa. list@tinc.net Lista de mensagens coreana. Envie subscribe mysql your@email.address para esta lista. mysql-de-request@lists.4t2.com Lista de mensagens alem~. a Envie subscribe mysql-de your@email.address para esta lista. Voc pode encontrar informaes sobre esta lista de mensagens em e co http://www.4t2.com/mysql. mysql-br-request@listas.linkway.com.br Lista de mensagens em portugus Envie subscribe mysql-br your@email.address para esta lista. e mysql-alta@elistas.net Lista de mensagens espanhola. Envie subscribe mysql your@email.address para esta lista.

1.7.1.2 Fazendo perguntas ou relatando erros


Antes de enviar um relato de erro ou uma questo, por favor faa o seguinte: a c Comece pesquisando o manual MySQL online em: http://www.mysql.com/doc/

36

MySQL Technical Reference for Version 5.0.0-alpha

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.

1.7.1.3 Como relatar erros ou problemas


Nosso banco de dados de bugs publico e pode ser pesquisado por qualquer um em e http://bugs.mysql.com/. Se voc logar no sistema, voc poder entrar novos relatrios. e e a o Escrever um bom relatrio de erro exige pacincia, e faz-lo de forma apropriada economiza o e e tempo para ns e para voc. Um bom relatrio de erros contendo um teste de caso para o o e o bug ir torn-lo muito mais fcil para corrig no prximo release. Esta seo ir ajud-lo a a a i-lo o ca a a a escrever seu relatrio corretamente para que voc no perca seu tempo fazendo coisas que o e a no iro ajudar-nos muito ou nada. a a Ns encorajamos todo mundo a usar o script mysqlbug para gerar um relato de erros (ou um o relato sobre qualquer problema), se poss ivel. mysqlbug pode ser encontrado no diretrio o scripts na distribuio fonte, ou, para uma distribuio binria, no diretrio bin no ca ca a o diretrio de instalao do MySQL. Se voc no puder utilizar o mysqlbug (por exemplo, o ca e a se voc o estiver executando no Windows), ainda de vital importncia que voc incluia e e a e todas as informaes necessrias listadas nesta seo (o mais importante uma descrio co a ca e ca do sistema operacional e a verso do MySQL). a O script mysqlbug lhe ajudar a gerar um relatrio determinando muitas das seguintes a o informaes automaticamente, mas se alguma coisa importante estiver faltando, por favor co fornea-o junto de sua mensagem! Por favor leita esta seo com cuidado e tenha certeza c ca que todas as informaes descritas aquie esto inclu co a idas no seu relatrio. o De preferncia, voc deve testar o problema usando a ultima verso de produo ou desene e a ca volvimento do Servidro MySQL antes do envio. Qualquer um deve estar apto a repetir o erro apenas usando mysql test < script no caso de teste incluido ou executando o script sheel ou Perl que inclu no relatrio de erros. e ido o Todos os erros enviados para o banco de dados dem bugs em http://bugs.mysql.com/ sero corrigidos ou documentados na prxma distribuio do MySQL. Se apenas pequenas a o ca mudanas de cdigo forem necessrias enviaremos um patch para corrigir o problema. c o a

Cap tulo 1: Informaes Gerais co

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 security@mysql.com. 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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 1: Informaes Gerais co

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 bugs@lists.mysql.com 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 bugs@lists.mysql.com. 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

MySQL Technical Reference for Version 5.0.0-alpha

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 mysql-licensing@mysql.com e perguntar por uma oferta para implement-lo! a Se o manual cobrir a sintaxe que voc estiver usando, mas voc tiver uma 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

Cap tulo 1: Informaes Gerais co

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 mysql-support@mysql.com 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!

1.7.1.4 Guia para responder questes na lista de discusso o a


Se voc considerar que sua respota possa ter um amplo interesse, voc pode querer post-la e e a para a lista de mensagens em vez de responder diretamente para a pessoa que perquntou. Tente deixar sua resposta da forma mais genrica poss e ivel para que outras pessoas alm e da que postou a pergunda possam se beneciar dela. Quando voc postar para a lista, por e favor tenha certeza que sua resposta no uma rplica de uma resposta anterior. a e e Tente resumir a parte essencial da questo na sua resposta, no se sinta obrigado a citar a a a mensagem original inteira. Por favor no poste mensagens a partir de seu browser com o modo HTML ligado! Muitos a usurios no leem e-mail com browser! a a

1.7.2 Suporte a Comunidade MySQL Atrvs do IRC (Internet e Relay Chat)


Em adio as diversas listas de email, voc pode pessoas experientes da comunidade no IRC ca e (Internet Relay Chat). Estes so os melhores canais atualmente conhecidos por ns: a o freenode (veja http://www.freenode.net/ para servidores) #mysql A princ so questes sobre o MySQL, mas dvidas sobre outros bancos ipio a o u de dados e SQL so bemvindas. a #mysqlphp Questes sobre MySQL+PHP, uma combinao popular. o ca #mysqlperl Questes sobre MySQL+Perl, outra combinao popular. o ca EFnet (veja http://www.efnet.org/ para servidores) #mysql Questes sobre MySQL. o Se voc est procurando por programas clientes de IRC para conectar a uma rede IRC, d e a e uma olhada no X-Chat (http://www.xchat.org/). X-Chat (licena GPL) est dispon c a ivel para as plataformas Unix e Windows.

42

MySQL Technical Reference for Version 5.0.0-alpha

1.8 Qual compatibilidade aos padres o MySQL oferece ? o


Esta seo descreve como o MySQL se relaciona aos padres ANSI/ISO SQL. O Servidor ca o MySQL tem muitas extenses aos padres SQL, e aqui voc descobrir quais so elas, e como o o e a a us-las. Voc ir tambm encontrar informao sobre falta de funcionalidade do Servidor a e a e ca MySQL, e como trabalhar com algumas diferenas. c Nosso objetivo no restringir, sem um boa razo, a usabilidade do MySQL Server para e a a qualquer uso. Mesmo se no tivermos os recursos para fazer o desenvolvimento para todos a os usos poss iveis, estamos sempre querendo ajudar e oferecer sugestes para pessoas que o esto tentando usar o MySQL Server em novos territrios. a o Um dos nossos principais objetivos com o produto continuar a trabalhar em acordo com e o padro SQL-99, mas sem sacricar velocidade e conana. No estamos receosos em a c a adicionar extenses ao SQL ou suporte para recursos no SQL se ele aumentar extremamente o a a usabilidade do MySQL Server para uma grande parte de nossos usurios. (A nova interface a HANDLER no MySQL Server 4.0 um exeemplo desta estratgia. Veja Seo 6.4.9 [HANDLER], e e ca Pgina 595.) a Continuaremos a suportar bancos de dados transacionais e no transacionais para satisfazer a tanto o uso pesado na web quanto o uso de misso cr a itica 24/7. O MySQL Server foi projetado inicialmente para trabalhar com bancos de dados de tamanho mdio (10-100 milhes de registros ou cerca de 100 MB por tabela) em sistemas computae o cionais pequenos. Continuaremos a extender o MySQL Server para funcionar ainda melhor com banco de dados na ordem de terabytes, assim como tornar poss compilar uma verso ivel a reduzida do MySQL mais apropriadas para handhels e uso embutido. O design compacto do servidor MySQL tornam ambas as direes poss co iveis sem qualquer conito na rvore a fonte. Atualmente no estamos buscando suporte em tempo real (mesmo se voc j puder fazer a e a muitas coisas com nossos servios de replicao). c ca Suporte a banco de dados em cluster est planejado para 2004 pela implementao de um a ca novo mecanismo de armazenamento. Estamos buscando melhoras no fornecimento de suporte a XML no servidor de banco de dados.

1.8.1 Qual Padro o MySQL Segue? a


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

1.8.2 Executando o MySQL no modo ANSI


Se voc inicializa o mysqld com a opo --ansi ou --sql-mode=ANSI, o seguinte compore ca tamento alterado no MySQL: e || um oprador de concatenao de strings em vez de um sinnimo para OR. e ca o

Cap tulo 1: Informaes Gerais co

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

mysql> SET GLOBAL sql_mode="ansi"; mysql> SELECT @@GLOBAL.sql_mode; -> "REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_

1.8.3 Extenses do MySQL para o Padro SQL-92 o a


O MySQL fornece algumas extenses que voc provavelmente no ir encontrar em alguns o e a a bancos de dados SQL. Fique avisado que se voc us-las, seu cdigo pode no ser mais e a o a portvel para outros servidores SQL. Em alguns casos, voc pode escrever cdigo que inclui a e o extenses MySQL, mas continua portvel, usando comentrios da forma /*! ...*/. Neste o a a caso, o MySQL ir analisar e executar o cdigo com o comentrio como ir fazer com a o a a qualquer outra instruo MySQL, mas outros servidores SQL iro ignorar as extenses. ca a o Por exemplo: SELECT /*! STRAIGHT_JOIN */ nome_campo FROM table1,table2 WHERE ... Se voc adicionar um nmero de verso depois do !, a sintaxe s ser executada se a e u a o a verso do MySQL igual ou maior que o nmero de verso usado: a e u a

44

MySQL Technical Reference for Version 5.0.0-alpha

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.

Cap tulo 1: Informaes Gerais co

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

MySQL Technical Reference for Version 5.0.0-alpha

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 Diferenas do MySQL em Comparao com o SQL-92 c ca


Ns tentamos fazer com que o MySQL siguisse os padres ANSI SQL (SQL-92/SQL-99) e o o o ODBC SQL, mas em alguns casos, o MySQL realiza operaes de forma diferente: co Para campos VARCHAR, expaos extras so removidos quando o valor armazenado. c a e Veja Seo 1.8.6 [Bugs], Pgina 54. ca a Em alguns casos, campos CHAR so alterados sem perguntas para o tipo de campo a VARCHAR. Veja Seo 6.5.3.1 [Silent column changes], Pgina 607. ca a Privilgios para uma tabela no so negadas automaticamente quando voc apaga uma e a a e tabela. Voc deve usar explicitamente um REVOKE para negar privilgios para uma e e tabela. Veja Seo 4.4.1 [GRANT], Pgina 254. ca a Para uma lista priorizada indicando quando novas extenses sero adio a cionadas ao MySQL voc deve consultar lista TODO online do MySQL em e http://www.mysql.com/doc/en/TODO.html. Esta a ultima verso da lista TODO neste e a manual. Veja Seo 1.6 [TODO], Pgina 27. ca a

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

1.8.4.2 SELECT INTO TABLE


O MySQL ainda no suporta a extenso SQL do Sybase: SELECT ... INTO TABLE .... a a MySQL suporta a sintaxe ANSI SQL INSERT INTO ... SELECT ..., que basicamente a e mesma coisa. Veja Seo 6.4.3.1 [INSERT SELECT], Pgina 581. ca a INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100; De maneira alternativa, voc pode usar SELECT INTO OUTFILE... ou CREATE TABLE ... e SELECT para resolver seu problema.

1.8.4.3 Transaoes e Operaes Atmicas c co o


O MySQL Server (verso 3.23-max e todas as verses 4.0 e acima) suportam transaes com a o co os mecanismos de armazenamento transacionais InnoDB e BDB. InnoDB fornece compatibilidade total com ACID. Veja Cap ptexi tulo 7 [Tipos de tabelas], Pgina 630. a

Cap tulo 1: Informaes Gerais co

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 1: Informaes Gerais co

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;

1.8.4.4 Stored Procedures e Triggers


Steored procedures esto sendo implementadas em nossa verso 5.0 na rvore de desenvolvia a a mento. Veja Seo 2.3.4 [Instalando da rvore de fontes], Pgina 100. ca a a Este esforo baseado no SQL-99, que tm uma sintaxe bsica similar (mas no idntica) ao c e e a a e Oracle PL/SQL. Em adio a isto, estamoas implementando o framework SQL-99 enganchar ca em linguagens externas. Uma Stored Procedure um conjunto de comandos SQL que podem ser compilados e e armazenados no servidor. Uma fez feito isso, os clientes no necessitam reescrever toda a a consulta mas podem fazer referncia ` stored procedure. Isto fornece melhor performance e a porque a query necessita ser analisada pelo servidor somente uma vez, e necessita menos informao para ser enviada entre o servidor e o cliente. Voc tambm pode elevar o ca e e

50

MySQL Technical Reference for Version 5.0.0-alpha

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

1.8.4.5 Chaves Estrangeiras


No MySQL Server 3.23.44 e posterior, tabelas InnoDB suportam vericao de restrio ca ca de chaves estrangeiras, incluindo CASCADE, ON DELETE, e ON UPDATE. Veja Seo 7.5.5.2 ca [Restries de chaves estrangeiras do InnoDB], Pgina 654. co a Para outros tipos de tabela, o MySQL Server atualmente apenas analisa a sintaxe de FOREIGN KEY no comando CREATE TABLE, mas no usa/armazena esta informao. Em a ca um futuro prximo esta implementao ser estendida para que assim a informao seja o ca a ca armazenada num arquivo de especicao de tabela e possa ser recuperado por mysqldump ca e ODBC. Em um estgio posterior, restries de chaves estrangeiras sero implementadas a co a para tabelas MyISAM. Note que as chaves estrangeiras no SQL no so usadas para ligar tabelas, mas so usadas a a a para vericar a integridade referencial. Se voc deseja obter resultados de mltiplas tabelas e u de uma instruo SELECT, voc pode fazer isto ligando tabelas: ca e SELECT * FROM table1,table2 WHERE table1.id = table2.id; Veja Seo 6.4.1.1 [JOIN], Pgina 567. Veja Seo 3.6.6 [Exemplos de chaves estrangeiras], ca a ca Pgina 198. a Quando usada como uma restrio, FOREIGN KEYs no precisa ser usado se a aplicao insere ca a ca duas linhas em tabelas MyISAM na ordem apropriada. Para tabelas MyISAM, voc pode contornar a falta de ON DELETE adicionando a instruo e ca DELETE apropriada a uma aplicao quando voc deletar registros de uma tabela que tem ca e uma chave estrangeira. Na prtica isto mais rpido e muito mais portvel que utilizar a e a a chaves estrangeiras. No MySQL Server 4.0 voc pode utilizar delees multi-tabela para apagar linha de muitas e co tabelas com um comando. Veja Seo 6.4.5 [DELETE], Pgina 585. ca a A sintaxe FOREIGN KEY sem ON DELETE ... usada geralmente por aplicaces ODBC para e o produzir clusulas WHERE automticas. a a Note que chaves estrangeiras so mal usadas com frequncia, o que pode causar graves a e problemas. Mesmo quando usado apropriadamente, o suporte a chaves estrangeiras no a e uma soluo mgica para o problema de integridade referncial, embora possa ajudar. ca a e Algumas vantagens das chaves estrangeiras: Assumindo o projeto apropriado das relaes, as restries de chaves estrangeiras co co tornaro mais dif para um programador introduzir uma inconsistncia no banco a icil e de dados. Usar atualizaes e delees em cascata pode simplicar o cdigo do cliente. co co o

Cap tulo 1: Informaes Gerais 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

1.8.4.7 -- como In icio de Comentrio a


Outros bancos de dados SQL usam -- para iniciar comentrios. O MySQL usa # como a o caractere para in de comentrio, mesmo se a ferramenta de linha de comando mysql icio a remover todas linhas que comeam com --. Voc tambm pode usar o comentrio no c e e a estilo C /*isto um comentrio*/ com o MySQL Server. Veja Seo 6.1.6 [Comentrios], e a ca a Pgina 479. a O MySQL Server verso 3.23.3 e superior suporta o estilo de comentrio -- somente se o a a comentrio for seguido por um caractere de espao (ou por um caracter de controle como a c uma nova linha). Isto ocorre porque este estilo de comentrio causou muitos problemas a

52

MySQL Technical Reference for Version 5.0.0-alpha

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

1.8.5 Como o MySQL Lida com Restries co


Como o MySQL lhe permite trabalhar com tabelas transacionais e no transacionais (que a no permitem rollback), o tratamento de restries um pouco diferente no MySQL que a co e em outros bancos de dados. Temos que tratar o caso quando voc atualiza diversos registros com uma tabela no transae a cional que no pode fazer rollback em erros. a A losoa bsica tentar obter um erro para qualquer coisa que possamos detectar em temp a e de compilao mas tentar recuperar de qualquer erro que abtemos em tempo de execuo. ca ca Fazemos isto na maiorioa dos casos, mas no para todos ainda. Veja Seo 1.6.4 [TODO a ca future], Pgina 29. a A opo bsica que o MySQL tem parar a instruo no meio ou fazer o melhor para se ca a e ca recuperar do problema e continuar. A seguir mostramos o que acontece com diferentes tipos de restries. co

1.8.5.1 Restrioes de PRIMARY KEY / UNIQUE c


Normalmente voc receber um erro quando tentar fazer um INSERT / UPDATE de um registro e a que cause uma violao de uma chave primria, chave unica ou chave estrangeira. Se voc ca a e

Cap tulo 1: Informaes Gerais co

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

1.8.5.2 Restrioes de NOT NULL c


Para poder suportar um fcil tratamento de tabelas no transacionais todos os campos no a a MySQL tm valores padro. e a Se voc inserir um valor errado em uma coluna como um NULL em uma coluna NOT NULL e ou um valor numrico muito grande em um campo numrico, o MySQL ir atribuir a coluna e e a o melhor valor poss ivel em vez de dar uma mensagem de erro. Para strings este valor e que possa estar na coluna. uma string vazia ou a maior string possivel Isto signica que se voc tentar armazenar NULL em uma coluna que no aceita valores NULL, e a o MySQL Server armazenar 0 ou (strig vazia) nela. Este ultimo comportamento pode, a para uma simples insero de registro, ser alterado com a opo de compilao -DDONT_ ca ca ca USE_DEFAULT_FIELDS.) Veja Seo 2.3.3 [Opes de congurao], Pgina 98. Isto faz com ca co ca a que as instrues INSERT gerem um erro a menos que voc explicite valores espec co e icos para todas as colunas que exigem um valor diferente de NULL. A razo para as regras acima que no podemos vericar estas condies antes da consulta a e a co comear a executar. Se encontrarmos um problema depois de atualizar algumas linahs, no c a podemos fazer um rollback j que o tipo de tabela no suporta isto. A opo de parar no a a ca a to boa como no caso em que a atualizao esteja feita pela metade que provavelmente e a ca e o pior cenrio poss a ivel. Neste caso melhor fazer o poss e ivel e ento continuar como se a nada tivesse acontecido. No MySQL 5.0 plenejamos melhorar into forncendo avisos para converses automticas de campo, mais uma opo para deixar voc fazer um rollback o a ca e das instrues que usam apenas tabelas transacionais no caso de tal instruo zer uma co ca denio de campo no permitida. ca a O mostrado acima signica que no se deve usar o MySQL para vericar o contedo dos a u campos, mas deve se faz-lo por meio da aplicao. e ca

54

MySQL Technical Reference for Version 5.0.0-alpha

1.8.5.3 Restries de ENUM e SET co


No MySQL 4.x ENUM no uma restrio real, mas um modo mauis eciente de armazenar a e ca campos que possam apenas conter um conjunto de valores dados. Isto devido as mesmas e razes pelas quais NOT NULL no respeitado. Veja Seo 1.8.5.2 [restries NOT NULL], o a e ca co Pgina 53. a Se voc inserir um valor errado em um campo ENUM, ele ser congurado com uma string e a vazia em um contexto string. Veja Seo 6.2.3.3 [ENUM], Pgina 499. ca a Se voc inserir uma opo errada em um campo SET, o valor errado ser ignorado. Veja e ca a Seo 6.2.3.4 [SET], Pgina 500. ca a

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

1.8.6.2 Open Bugs / Decincias de Projeto no MySQL e


Os seguintes problemas so conhecidos e tem prioridade muito alta para serem corrigidos: a FLUSH TABLES WITH READ LOCK no bloqueia CREATE TABLE ou COMMIT, que pode criar a um problema com a posio do log binrio ao se fazer um backup completo de tabelas ca a e do log binrio. a ANALYZE TABLE em uma tabela BDB pode, em alguns, casos inutilizar a tabela at que e se reinicie o servidor mysqld. Quando isto acontecer voc ir ver o seguinte tipo de e a erro no arquivo de erros do MySQL. 001207 22:07:56 bdb: log_flush: LSN past current end-of-log O MySQL aceita parenteses na parte FROM, mas os ignora sem aviso. A razo pela qual a no so retornados erros que muitos clientes que geram consultas automaticamente a a e adicionam parentesis na parte FROM mesmo onde eles no so necessrios. a a a Concatenar muitos RIGHT JOINS ou combinar joins LEFT e RIGHT na mesma consulta podem dar uma resposta incorreta ja que o MySQL s gera registros NULL para tabelas o que precedem um join LEFT ou antes de um join RIGHT. Isto ser corrigido na verso a a 5.0 junto com o suporte a parentesis na parte FROM.

Cap tulo 1: Informaes Gerais co

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 1: Informaes Gerais co

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

MySQL Technical Reference for Version 5.0.0-alpha

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.

Cap tulo 1: Informaes Gerais co

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

MySQL Technical Reference for Version 5.0.0-alpha

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.

2.1 Instalao rpida padro do MySQL ca a a


Este cap itulo cobre a instalao do MySQL em plataformas onde oferecemos pacotes usando ca oformato de empacotamento nativo da respectiva plataforma. No entanto, as distribuies co binrias do MySQL esto dispon a a iveis para muitas outras plataformas, veja Seo 2.2.9 ca [Installing binary], Pgina 91 para instrues gerais de instalao para estes pacotes que se a co ca aplicam a todas as plataformas. Veja Seo 2.2 [General Installation Issues], Pgina 75 para mais informaes sobre quais ca a co outras distribuies binrias esto dispon co a a iveis e como obt-las. e

2.1.1 Instalando o MySQL no Windows


O processo de instalao para o MySQL no Windows tem os seguintes passos: ca 1. Instale a distribuio. ca 2. Congure um arquivo de opo se necessrio. ca a 3. Selcione o servidor que voc quer usar. e 4. Inicie o servidor. O MySQL para Windows est dispon em dois formatos de distribuio: a ivel ca A distribuio binria contm um programa de instalao que instala que voc precisa ca a e ca e e assim possa iniciar o servidor imediatamente.

Cap tulo 2: Instalao do MySQL ca

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

2.1.1.1 Exigncias do Sistema Windows e


Para executar o MySQL no Windows, voc precisar do seguinte: e a Um sistema operacional Windows de 32 bits como 9x, ME, NT, 2000 ou XP. A fam ilia NT (Windows NT, 2000 e XP) lhe permite executar o servidor MySQL como um servio. Veja Seo 2.1.1.7 [NT start], Pgina 66. c ca a Suporte ao protocolo TCP/IP. Um cpia da distribuio binria do MySQL para Windows, o qual pode ser feito o ca a download em http://www.mysql.com/downloads/. Nota: A distribuio de arquivos so fornecidas no formato zip e recomendamos o ca a uso de um cliente FTP com opo de resumo para evitar corrompimento de arquivos ca durante o processo de download. Um programa ZIP para descompactar os arquivos da distribuio. ca Espao suciente em disco para descompactar, instalar e criar o banco de dados de c acordo com suas exigncias. e Se voc planeja se conectar ao servidor MySQL via ODBC, voc tambm precisar do e e e a dirver MyODBC. Veja Seo 12.2 [ODBC], Pgina 870. ca a Se voc precisa de tabelas com tamanho maior que 4GB, instale o MySQL em um e sistema de arquivos NTFS ou mais novo. No se esquea de usar MAX_ROWS e AVG_ROW_ a c LENGTH quando criar tabelas. Veja Seo 6.5.3 [CREATE TABLE], Pgina 598. ca a

2.1.1.2 Instalando uma Distribuio Binria do Windows ca a


Para instalar o MySQL no Windows usando uma distribuio binria, siga este procedica a mento: 1. Se voc estiver trabalhando em uma mquina Windows NT, 2000, ou XP, esteja certo e a de que voc est logado com um usurio com privileios de administrador. e a a 2. Se voc estiver fazendo uma atualizao de uma instalao MySQL mais nova, e ca ca e necessrio parar o servidor atual. Em mquinas com Windows NT, 200 ou XP, se a a voc estiver executando o servidor como um servio, pare-o com o comando: e c C:\> NET STOP MySQL Se voc planeja usar um servidor diferente depois da atualizao (por exemplo, se voc e ca e quiser executar o mysqld-max em vez do mysqld), remova o servio existente: c C:\mysql\bin> mysqld --remove 3. Voc pode reinstalar o servio com o servidor prprio depois de atualizar. e c o Se voc no estiver executando o servidor MySQL como um servio, pare desta forma: e a c

62

MySQL Technical Reference for Version 5.0.0-alpha

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

2.1.1.3 Preparando o Ambiente MySQL do Windows


Se voc precisar especicar opes de inicializao quando executar o servidor, voc pode e co ca e indentica-los na linha de comando ou coloc-los em um arquivo de opo. Par opes que a ca co so usadas sempre que o servidor iniciar, voc achar mais conveniente utilizar um arquivo a e a de opco para especicar a congurao do seu MySQL. Isto particularmente verdade sob a ca e as seguintes circunstncias: a A localizao do diretrio de instalao ou dados so diferentes dos locais padro ca o ca a a (c:\mysql e c:\mysql\data). Voc precisa ajustar as conguraes do servidor. Por exemplo, para usar as tabelas e co transacionais InnoDB no MySQL verso 3.23, voc deve criar manualmente dois novos a e diretrios para guardar os arquivos de dados e de log do InnoDB por exemplo, o c:\ibdata e c:\iblogs. Voc tambm poder adicionar algumas linhas extras ao e e a arquivo de opo, como descrito em Seo 7.5.3 [Iniciando o InnoDB], Pgina 644. (A ca ca a partir do MySQL 4.0, o InnoDB cria os seus arquivos de log e dados no diretrio de dao dos por padro. Isto signica que voc no precisa congurar o InnoDB explicitamente. a e a Voc ainda deve faz-lo se desejar, e um arquivo de opo ser util neste caso.) e e ca a No Windows, o instalador do MySQL coloca o diretrio de dados diretamente sob o diretrio o o onde voc instalou o MySQL. Se voc quisesse utilizar um diretrio de dados em um local e e o diferente, voc deve copiar todo o contedo do diretrios data para a nova localizao. Por e u o ca exemplo, por padro, o instalador coloca o MySQL em C:\mysql e o diretrio de dados a o em C:\mysql\data. Se voc quiser usar um diretrio de dados de E:\mydata, voc deve e o e fazer duas coisas: Mova o diretrio de dados de C:\mysql\data para E:\mydata. o Use uma opo --datadir para especicar a nova localizao do diretrio de dados ca ca o cada vez que voc iniciar o servidor. e Quando o servidor MySQL inicia no Windows, ele procura pelas opes em dois arquivos: co O arquivo my.ini no diretrio Windows e o arquivo chamado C:\my.cnf. O diretrio o o do Windows normalmente chamado C:\WINDOWS ou C:\WinNT. Voc pode determinar e e a sua localizao exata a partir do valor da varivel de ambiente WINDIR usando o seguinte ca a comando: C:\> echo %WINDIR%

Cap tulo 2: Instalao do MySQL 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

2.1.1.4 Selecionando um Servidor Windows


Iniciado com o MySQL 3.23.38, a distribuio Windows inclui ambos binrios, normal e o ca a MySQL-Max. Aqui est uma lista dos diferentes servidores MySQL dos quais voc pode a e escolher: Binario mysqld mysqld-opt mysqld-nt mysqld-max mysqld-max-nt Descrio ca Compilado com debugger integral e conferncia automtica de alocao e a ca de memria, links simblicos, BDB e tabelas InnoDB. o o Binrio otimizado. A partir da verso 4.0 o InnoDB est habilia a a tado. Antes desta verso, este servidor no tem suporte a tabelas a a transacionais. Binrio otimizado para NT/2000/XP com suporte para named pipes. a Binrio otimizado com suporte para links simblicos, tabelas BDB e a o InnoDB. Como o mysqld-max, porm compilado com suporte para named pipes. e

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

MySQL Technical Reference for Version 5.0.0-alpha

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

2.1.1.5 Iniciando o Servidor pela Primeira Vez


No Windows 95, 98, ou Me, cliente MySQL sempre se conecta ao servidor usando TCP/IP. Nos sistemas baseados no NT, como o Windows NT, 2000, ou XP, os clientes possuem duas opes. Eles podem usar TCP/IP, ou eles podem usar um named pipe se o servidor suportar co conexes named pipes. o Para informaes sobre qual servidor binrio executar, veja Seo 2.1.1.3 [Windows prepare co a ca environment], Pgina 62. a Esta seo lhe d um viso geral da inicializao de um servidor MySQL. A seguinte seo ca a a ca ca fornce informao mais espec ca ica para verses particulares do Windows. o Os exemplos nesta seo assumem que o MySQL est instalado sob a localizao padro, ca a ca a C:\mysql. Ajuste o caminho mostrado nos exemplos se voc tiver o MySQL instalado em e um local diferente. Fazer um teste a partir do prompt de comando do em uma janela de console (uma janela DOS) a melhor coisa a fazer porque o servidor mostra a mensagem de status que aparece e na janela do DOS. Se alguma coisa estiver errado com sua congurao, estas mensagens ca tornaro mais fcil para voc de identicar e corrigir qualquer problema. a a e Tenha certeza que voc est no diretrio onde o servidor localizado e ento entre este e a o e a comando: shell> mysqld --console Para servidores que incluem suporte InnoDB, voc deve ver as seguintes mensagens assim e que o servidor iniciar: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: The first specified datafile c:\ibdata\ibdata1 did not exist: a new database to be created! Setting file c:\ibdata\ibdata1 size to 209715200 Database physically writes the file full: wait... Log file c:\iblogs\ib_logfile0 did not exist: new to be created Setting log file c:\iblogs\ib_logfile0 size to 31457280 Log file c:\iblogs\ib_logfile1 did not exist: new to be created Setting log file c:\iblogs\ib_logfile1 size to 31457280 Log file c:\iblogs\ib_logfile2 did not exist: new to be created Setting log file c:\iblogs\ib_logfile2 size to 31457280 Doublewrite buffer not found: creating new Doublewrite buffer created creating foreign key constraint system tables foreign key constraint system tables created

Cap tulo 2: Instalao do MySQL ca

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:

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


No Windows 95, 98 ou Me, o MySQL usa TCP/IP para conectar um cliente a um servidor. (Isto permitir que qualquer mquina na sua rede se conecte a seu servidor MySQL.) Por a a isto, voc deve ter certeza de que o suporte TCP/IP est instalado na sua mquina antes e a a de iniciar o MySQL. Voc pode encontrar o TCP/IP no seu CD-ROM do Windows. e Note que se voc estiver usando uma verso antiga do Win95 (por exemplo, OSR2). E e a prefer que voc use um pacote antigo Winsock; para o MySQL necessrio o Winsock ivel e e a 2! Voc pode obter o Winsock mais novo em http://www.microsoft.com. O Windows 98 e tem a nova biblioteca Winsock 2, portanto no necessrio atualizar a biblioteca. a e a Para iniciar o servidor mysqld, voc deve iniciar uma janela do Prompt (Janela MS-DOS) e e digitar: shell> C:\mysql\bin\mysqld Isto ir iniciar o mysqld em segundo plano. Isto , depois do servidor iniciar, voc deve ver a e e outro prompt de comando. (Note que se voc iniciar o servidor deste modo no Windows e NT, 2000 ou XP, o servidor ir executar em segundo plano e nenhum prompt de comando a aparecer at que o servidor nalize. Por isto, voc deve abrir outro prompt de comando a e e para executar programas clientes enquanto o servidor estriver em execuo.) ca Voc pode nalizar o servidor MySQL executando: e shell> C:\mysql\bin\mysqladmin -u root shutdown Isto chama o utilitrio administrativo do MySQL mysqladmin para conectar ao servidor e a manda-lo nalizar. O comando conecta como root que a conta administrativa padro no e a sistema de permisses do MySQL. Por favor, note que o sistema de permisses do MySQL o o totalmente independente de qualquer login de usurio sob o Windows. e a Se o mysqld no iniciar, por favor, verique o log de erro para ver se o servidor escreveu a alguma mensagem que possa indicar a causa do problema. Voc pode tambm tentar iniciar e e o servidor com mysqld --console; neste caso, voc pode obter alguma informao util na e ca tela que pode ajudar a resolver o problema. A ultima opo iniciar o mysqld com --standalone --debug. Neste caso o mysqld ir ca e a escrever em um arquivo log C:\mysqld.trace que deve conter a razo pela qual o mysqld a no inicia. Veja Seo E.1.2 [Making trace les], Pgina 1080. a ca a Use mysqld --help para mostrar todas as opes que o mysqld entende! co

66

MySQL Technical Reference for Version 5.0.0-alpha

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


Na fam NT (Windows NT, 2000 ou XP) o modo recomendado de executar o MySQL ilia e instal-lo como um servio do Windows. O Windows ento inicia e para o servidor MySQL a c a automaticamente quando o Windows inicia e para. Um servidor instalado como um servio c tambm pode ser controlado a partir da linha de comando usando os comandos NET, ou e com o utilitrio grco Servios. a a c O utilitrio Servios (o Service Control Manager do Windows) pode ser encontrado no a c Painel de Controle do Windows (em Ferramentas Administrativas no Windows 2000). E recomendado que se feche o utilitrio Servios enquanto realiza a operaes de instalao a c co ca ou remoo do servidor a partir desta linha de comando. Isto evita alguns erros estranhos. ca Para ter o MySQL funcionando com TCP/IP no Windows NT 4, voc deve instalar o service e pack 3 (ou mais novo)! Antes de instalar o MySQL como um servio, voc deve primeiro parar o servidor atual em c e execuo usando o seguinte commando: ca shell> C:\mysql\bin\mysqladmin -u root shutdown Isto chama o utilitrio administrativo do MySQL mysqladmin para conectar ao servidor a e mand-lo parar. O comando conecta com root que a conta administrativa padro no a e a sistema de permisses do MySQL. Por favor, note que o sistema de permisses do MySQL o o totalmente independente de qualquer login de usurio sob o Windows. e a Agora instale o servidor como um servio: c shell> mysqld --install Se voc no denir um nome para o servio, ele instalado com o nome MySQL. Uma vez e a c e instalado, ele pode ser imediatamente iniciado a partir do utilitrio Servios, ou usando o a c comando NET START MySQL. (Este comando caso insensitivo). e Uma vez em execuo, o mysqld pode ser parado usando o utilitrio de Servios ou usando ca a c o comando NET STOP MySQL, ou o comando mysqladmin shutdown. Se voc tiver problemas instalando o mysqld como um servico usando apenas o nome do e servidor, tente instal-lo usando seu caminho compelto: a shell> C:\mysql\bin\mysqld --install A partir do MySQL 4.0.2, voc pode especicaro nome do servio depois da opo -e c ca install. A partir do MySQL 4.0.3, voc pode especicar uma opo --defaults-file e ca depois do nome do servio para indicar onde o servidor deve obter opes ao iniciar. A c co regras que determinam o nome do servio e os arquivos de opo que o servidor usa so as c ca a seguintes: Se voc no especicar um nome de servio, o servidor usa o nome padro do MySQL e e a c a o servidor l as opes do grupo [mysqld] no arquivo de opes padro. e co co a Se voc especicar um nome de servio depois da opo --install, o servidor ignora e c ca o grupo de opo [mysqld] em vez de ler opes do grupo que tem o mesmo nome que ca co o servio. O servidor le opes do arquivo de opes padro. c co co a Se voc especicar uma opo --defaults-file depois do nome de servio, o servidor e ca c ignora o arquivo de opes padro e l opes apenas a partir do grupo [mysqld] do co a e co arquivo indicado.

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

2.1.1.8 Executando o MySQL no Windows


O MySQL suporta TCP/IP em todas as plataformas Windows. Os servidores mysqld-nt e mysql-max-nt suportam named pipes no NT, 2000 e XP. No entanto, o padro usar a e TCP/IP, independente da plataforma: Named pipes atualmente mais lento que TCP/IP em muitas conguraes do Wine co dows. Alguns usurios encontraram problemas ao nalizar o servidor MySQL quando era a usado named pipes. A partir da verso 3.23.50, named pipes s est habilitado para o mysqld-nt e mysql-maxa o a nt se eles forem iniciados com a opo --enable-named-pipe. ca Voc pode forar que um cliente MySQL use named pipes especicando a opo --pipe ou e c ca especicando . como nome de mquina. Use a opo --socket para especicar o nome do a ca pipe. No MySQL 4.1, voc deve usar a opo --protocol=PIPE. e ca Voc pode testar se o MySQL est funcionando executando qualquer dos seguintes comane a dos: C:\> C:\> C:\> C:\> C:\mysql\bin\mysqlshow C:\mysql\bin\mysqlshow -u root mysql C:\mysql\bin\mysqladmin version status proc C:\mysql\bin\mysql test

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.

Cap tulo 2: Instalao do MySQL ca

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

2.1.2 Instalando o MySQL no Linux


O modo recomendado para instalar o MySQL no Linux usando um arquivo RPM. Os e RPMs do MySQL atualmente so construidos na verso 7.3 do sistema Suse Linux mas a a deve funcionar em outras verses de Linux que suportam rpm e usam glibc. o Se voc tiver problemas com um arquivo RPM (por exemplo, se voc receber o e e erro Sorry, the host xxxx could not be looked up), veja Seo 2.6.2.1 [Binary ca notes-Linux], Pgina 141. a Na maioria dos casos, voc s precisa instalar os pacotes servidor MySQL e o cliente e o MySQL para ter uma instalao funcional do MySQL. Os outros pacotes no so exigidos ca a a para uma instalao padro. Se voc quiser executar um servidor MySQL Max que tenha ca a e capacidades adicionais, voc deve instalar o RPM MySQL-Max depois de instalar o RPM e MySQL-server. Veja Seo 4.8.5 [mysqld-max], Pgina 343. ca a Se voc tiver um dependncia de falha ao tentar instalar os pacotes do MySQL 4.0 (ex.: e e error: removing these packages would break dependencies: libmysqlclient.so.10 is needed by ...), voc tambm deve instalar o pacote MySQL-shared-compat, e e

70

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

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

2.1.3 Instalando o MySQL no Mac OS X


A partir do MySQL 4.0.11, voc pode instalar o MySQL no Mac OS X 10.2 (Jaguar) e usando um pacote do binrio do Mac OS X PKG em vez da distribuio binrio em tarball. a ca a Note que verses mais antigas do Mac OS X (ex.: 10.1.x) no so suportadas por este o a a pacote. Este pacote est localizado dentro de um arquivo de imagem de disco (.dmg). que voc a e primeiro precisa montar com um duplo clique em sua icone no Finder. Ele deve ento a montar a imagem e exibir o seu contedo. u NOTA: Antes de proceder com a instalao, tenha certeza que voc nalizou todas as ca e instncias do MySQL em execuo usando o MySQL Manager Aplication (no Mac OS X a ca Server) ou via mysqladmin shutdown na linha de comando.

72

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

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

Agora voc deve conseguir se conectar ao servidor MySQL, ex.: e /usr/local/mysql/bin/mysql

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

MySQL Technical Reference for Version 5.0.0-alpha

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.

2.1.4 Instalando o MySQL no NetWare


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

2.1.4.1 Instalando o MySQL para Binrios do NetWare a


1. Se voc estiver atualizando de um instaao anterior, para o servidor MySQL. Isto e ca e feito a partir do console do servidor, usando: SERVER: mysqladmin -u root shutdown 2. Conecte-se no servidor alvo a partir de uma mquina cliente com acesso ao local onde a voc instalar o MySQL. e a 3. Extraia o pacote zip binrio em seu servidor. Tenha certeza de permitir que os caminhos a no arquivo zip sejam usados. E seguro simplesmente extrair os arquivos para SYS:\. Se voc estiver atualizando de uma instalando anterior, voc pode precisar copiar os e e diretrios de dados (ex.: SYS:MYSQL\DATA) agora, assim como my.cnf se voc o tiver o e costumizado. Voc pode ento deletar a cpia antiga do MySQL. e a o 4. Voc pode desejar renomear o diretrio para algo mais consistente e fcil de usar. e o a Recomendamos usar o SYS:MYSQL; exemplos no manual o usaro para se referir ao a diretrio de instalao em geral. o ca 5. No console do servidor, adicione um caminho de busca no diretrio contendo os NLMs o do MySQL. Por exemplo: SERVER: SEARCH ADD SYS:MYSQL\BIN 6. Instale o banco de dados inicial, se necessrio, digitando mysql_install_db no console a do servidor. 7. Inicie o servidor MySQL usando mysqld_safe no console do servidor.

Cap tulo 2: Instalao do MySQL ca

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

2.2 Detalhes Gerais de Instalao ca


2.2.1 Como obter o MySQL
Conra a homepage da MySQL homepage (http://www.mysql.com/) para informaes co sobre a verso atual e para instrues de download. a co Nosso principal espelho de download est localizado em: http://mirrors.sunsite.dk/mysql/. a Para uma lista atualizada completa dos mirrors de download da MySQL, veja http://www.mysql.com/downloads/mirrors.html. Voc tambm encontrar informao e e a ca sobre como se tornar um mirror do MySQL e como relatar um mirror ruim ou desatualizado.

2.2.2 Vericando a Integridade do Pacote Usando MD5 Checksums ou GnuPG


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

Vericando o MD5 Checksum


Depois de fazer o download do pacote, voc deve vericar se o MD5 checksum corresponde e a aquele fornecido na pgina de download do MySQL. Cada pacote tem um checksum a individual, que voc pode vericar com o seguinte comando: e shell> md5sum <pacote> Note que nem todos os sistemas operacionais suportam o comando md5sum - em alguns ele simplesmente chamado md5, outros no o possuem. No Linux, ele parte do pacote e a e GNU Text Utilities, que est disponivel para uma grande faixa de plataformas. Voc a e

76

MySQL Technical Reference for Version 5.0.0-alpha

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.

Vericao de Assinatura Usando GnuPG ca


Um mtodo de vericao de integridade de um pacote mais convel o uso de assie ca a e naturas criptografadas. A MySQL AB usa o GNU Privacy Guard (GnuPG), uma alternativa Open Source para o bem conhecido Pretty Good Privacy (PGP) de Phil Zimmermann. Veja http://www.gnupg.org/ and http://www.openpgp.org/ para mais informaes sobre co OpenPGP/GnuPG e como obter e instalar o GnuPG em seus sistema. A maioria das distribuies co de Linux j vm com o GnuPG instalado por padro. a e a A partir do MySQL 4.0.10 (Fevereiro de 2003), a MySQL AB comeou a assinar o seus c pacotes de download com GnuPG. Assinaturas criptografadas so um mtodo bem mais a e convel de vericao da integridade e autenticidade de um arquivo. a ca Para vericar a assinatura de um pacote espec ico, voc primeiro precisa obtter uma cpia e o da chave pblica GPG da MySQL AB (build@mysql.com). Voc tambm pode cort-la e u e e a col-la diretamente daqui ou obt-la em http://www.keyserver.net/. a e Key ID: pub 1024D/5072E1F5 2003-02-03 MySQL Package signing key (www.mysql.com) <build@mysql.com> Fingerprint: A4A9 4068 76FC BD3C 4567 70C8 8C71 8D3B 5072 E1F5 Public Key (ASCII-armored): -----BEGIN PGP PUBLIC KEY BLOCK----Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org mQGiBD4+owwRBAC14GIfUfCyEDSIePvEW3SAFUdJBtoQHH/nJKZyQT7h9bPlUWC3 RODjQReyCITRrdwyrKUGku2FmeVGwn2u2WmDMNABLnpprWPkBdCk96+OmSLN9brZ fw2vOUgCmYv2hW0hyDHuvYlQA/BThQoADgj8AW6/0Lo7V1W9/8VuHP0gQwCgvzV3 BqOxRznNCRCRxAuAuVztHRcEAJooQK1+iSiunZMYD1WufeXfshc57S/+yeJkegNW

Cap tulo 2: Instalao do MySQL ca

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) <build@mysql.com>"

A mensagem "Good signature" indica que est tudo certo. a

78

MySQL Technical Reference for Version 5.0.0-alpha

Vericando Assinatura Usando RPM


Para pacotes RPM, no h assinaturas separadas - pacotes RPM atualmente tm uma assia a e natura GPG inclu e MD5 checksum. Voc pode veric-los executando o seguinte comando: ida e a shell> rpm --checksig <package>.rpm Exemplo: shell> rpm --checksig MySQL-server-4.0.10-0.i386.rpm MySQL-server-4.0.10-0.i386.rpm: md5 gpg OK Nota: Se voc estiver usando RPM 4.1 e ele reclamar sobre (GPG) NOT OK (MISSING KEYS: e GPG#5072e1f5) (mesmo se voc a importou para detro de sua pasta de chaves publicas e GPG), voc precisa import-las para dentro de sua pasta de chaves RPM primeiro. RPM e a 4.1 no utiliza mais ias suas pastas de chaves GPG (e o prprio GPG), mas mantm sua a o e prpria pasta de chaves (porque ele um aplicativo do sistema e a pasta de chaves pblicas o e u do GPG um arquivo espec e ico do usurio). Para importar a chave pblica do MySQL em a u uma pasta de chaves RPM, use os seguintes comandos: shell> rpm --import <pubkey> Exemplo: shell> rpm --import mysql_pubkey.asc Caso voc note que as assinaturas MD5 checksum ou GPG no coincidem, tente primeiro fazer e a o download do pacote respectivo mais uma vez, talvez de outro site mirror. Se voc no e a obter sucesso na vericao da integridade do pacote repetidas vezes, notique-nos sobre ca tais incidentes incluindo o nome completo do pacote e o site que voc tem utilizado para e fazer o download pelos emails webmaster@mysql.com ou build@mysql.com.

2.2.3 Sistemas Operacionais suportados pelo MySQL


Ns ulitizamos o GNU Autoconf, para que seja poss o ivel portar o MySQL para todos sistemas operacionais modernos com threads Posix funcionando e um compilador C++. (Para compilar somente o cdigo cliente, um compilador C++ necessrio mas threads no.) Ns o e a a o mesmos usamos e desenvolvemos o software primeiramente no Linux (SuSE e red Hat), FreeBSD e Sun Solaris (Verses 8 e 9). o Perceba que para alguns sistemas operacionais, o suporte nativo a thread funciona somente nas ultimas verses. O MySQL compila com sucesso nas seguintes combinaes de sistema o co operacional/pacote de thread: AIX 4.x com threads nativas. Veja Seo 2.6.6.4 [IBM-AIX], Pgina 155. ca a Amiga. BSDI 2.x com o pacote inclu MIT-pthreads. Veja Seo 2.6.4.5 [BSDI], Pgina 151. ido ca a BSDI 3.0, 3.1 e 4.x com threads nativas. Veja Seo 2.6.4.5 [BSDI], Pgina 151. ca a SCO OpenServer with a recent port of the FSU Pthreads package. Veja Seo 2.6.6.9 ca [SCO], Pgina 161. a

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

2.2.4 Qual verso do MySQL deve ser usada a


A primeira deciso a ser feita se voc deve usar a ultima verso de desenvolvimento ou a a e e a ultima verso estvel: a a Normalmente, se voc estiver usando o MySQL pela primeira vez ou tentando porte a lo para algum sistema em que no exista distribuio binria, recomendamos o uso a ca a da verso estvel (atualmente Verso 5.0.0-alpha). Repare que todos os lanamentos a a a c do MySQL so conferidos com os testes comparativos de performance e um conjunto a extenso de testes antes de cada lanamento. c Seno, caso voc esteja trabalhando com um antigo sistema e quiser atualiz-lo, mas no a e a a que correr o risco com uma atualizao sem correes, voc deve faze-lo do mesmo ramo ca co e que voc est usando (onde aenas o ultimo nmero da verso mais novo que o seu). e a u a e Ns temos tentado corrigir somente erros fatais e torn-los menores, com alteraes o a co relativamente seguras para aquela verso. a

Cap tulo 2: Instalao do MySQL 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

MySQL Technical Reference for Version 5.0.0-alpha

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.

Cap tulo 2: Instalao do MySQL ca

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.

2.2.5 Layouts de Instalao ca


Esta seo descreve o layout padro dos diretrios criados pela instalo das distribuies ca a o ca co binria e fonte. a Uma distribuio binria instalada descompactando-a no local de instalao de sua escolha ca a e ca (tipicamente /usr/local/mysql) e cria os seguintes diretrios nesses locais: o Diretrio o Contedo do diretrio u o bin Programas clientes e o servidor mysqld data Arquivos Log, bancos de dados docs Documentao, Log de alteraes ca co include Arquivos de cabealho (headers) c lib Bibliotecas scripts mysql_install_db share/mysql Arquivos de mensagem de erro sql-bench Benchmarks - testes comparativos Uma distribuio baseada em cdigo fonte instalada depois de voc congur-la e compilca o e e a a la. Por padro, a instalao copia os arquivos em /usr/local, nos seguintes subdiretrios: a ca o Diretrio o Contedo do diretrio u o bin Programas clientes e scripts include/mysql rquivos de cabealho (headers) A c info Documentao no formato Info ca lib/mysql Bibliotecas libexec O servidor mysqld share/mysql Arquivos com mensagens de erros sql-bench Benchmarks e o teste crash-me var Bancos de dados e arquivos log Dentro de um diretrio de instalao, o layout de uma instalao baseada em fontes difero ca ca encia de uma instalao binria nas seguintes formas: ca a The mysqld server is installed in the libexec directory rather than in the bin directory. The data directory is var rather than data.

84

MySQL Technical Reference for Version 5.0.0-alpha

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.

2.2.6 Como e quando as atualizaes so lanadas? co a c


O MySQL est evoluindo muito rapidamente na MySQL AB e ns queremos compartilhar a o isto com outros usurios MySQL. Sempre que temos alguns recursos uteis que outros acham a necessio, tentamos fazer um release. a Tambm tentamos ajudar usurios que solicitam recursos que so de fcil implementao. e a a a ca Tomamos notas do que nossos usurios licenciados gostariam de ter,especialmente do que a nossos clientes com suporte extendido desejam e tentamos ajud-los. a No existe uma real necessidade para baixar uma nova release. A seo News ir dizer se a a ca a nova verso tem alguma coisa que voc precisa. Veja Apndice D [News], Pgina 957. a e e a Usamos a seguinte pol itica quando estamos atualizando o MySQL: Para cada pequena atualizao, o ultimo nmero na verso incrementado. Quando ca u a e tiver um maior nmero de novos recursos ou menor incompatibilidade com verses u o antigas, o segundo nmero na verso incrementado. Quando o formato de arquivo u a e altera, o primeiro nmero aumentado. u e Verses estveis testadas aparecem na mdia de uma a duas vezes por ano, mas se o a e pequenos bugs so encontrados, uma verso ser lanada apenas com as correes dos a a a c co erros. Releases funcionais aparecem na mdia a cada 4-8 semanas. e Distribuies binrias para algumas plataformas ser feita por ns somente para reco a a o leases mais importantes. Outras pessoas podem fazer distribuies binrias para outros co a sistemas mas provavelmente com menos frequencia. Ns normalmente disponibilizamos os patches logo que localizamos e corrigimos o pequenos bugs. Eles normalmente so imediatamente disponibilizados em nosso a repositrio publico do BitKeeper. Eles sero inclu o a idos na prxima distribuio. o ca Para bugs no criticos, mas irritantes, disponibilizamos patches se eles so enviados a a para ns. De qualquer forma, iremos combinar vrios deles em um patch maior. o a Se existitr, por algum motivo, um bug fatal numa verso criaremos uma nova release a o mais cedo poss ivel. Gostar iamos que outras empresas zessem isto tambm. e A verso estvel atual a 3.23; ns j mudamos o desenvolvimento em atividade para a a a e o a verso 4.0. Bugs contiuaro a ser corrigidos na verso estvel. No acreditamos em um a a a a a congelamento completo, pois isto abandona a correes de bugs e coisas que devem ser co feitas. Alguma coisa congelada signica que talvez possamos adicionar pequenas coisas que com certeza no afetar nada que j esteja funcionando. a a a O MySQL usa um esquema de nomes um pouco diferente da maioria dos outros produtos. Em geral relativamente seguro utilizar qualquer verso que tenha sido lanado a algumas e a c

Cap tulo 2: Instalao do MySQL ca

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

2.2.7 Filosoa das Distribuioes - Nenhum Bug Conhecidos nas c Distribuioes c


Colocamos muito tempo e esforo em tornar nossas distribuies livres de erros. Pelo nosso c co conhecimento, no liberamos uma unica verso do MySSQL com qualquer erro conhecido a a fatal. Um erro fatal algo que faz o MySQL falhar com o uso normal, traz respostas erradas para e consultas normais ou tem um problema de segurana. c Ns temos documentados todos os problemas conhecidos, bugs e assuntos que so depeno a dentes das decises de projeto. Veja Seo 1.8.6 [Bugs], Pgina 54. o ca a Nosso objeto corrigir tudo que poss e e ivel, mas sem correr o risco de tornarmos uma verso menos estvel. Em certos casos, isto signica que podemos corrigir um problema a a na(s) verso(es) de desenvolvimento, mas no o corrigirmos na verso estvel (produo). a o a a a ca Naturalmente, documentamos tais problemas para que o usurios esteja ciente. a Aqui est um descrio de como nosso processo de contruo funciona: a ca ca Monitoramos erros de nossa lista de suporte ao cliente, a lista de email externa do MySQL e o banco de dados de bugs em http://bugs.mysql.com/. Todos os erros relatados em verses usadas so inseridos nio banco de dados de bugs. o a Quando corrigimos um erro, sempre tentamos fazer um caso de teste para ele e inclu i-lo em nosso sistema de teste para assegurar que o erro nunca retornar. (Cerca de 90% a de todos os erros corrigidos tm um caso de teste.) e Tambm criamos casos de teste para todos os novos recursos adicionados ao MySQL. e Antes de comearmos a fazer uma nova distribuio do MySQL, asseguramos que todos c ca os erros repetitiveis relatados para a verso do MySQL (3.23.x, 4.0.x, etc) esto cora a rigidos. Se algo for imposs de corrigir (devido a alguma deciso de projeto interno ivel a no MySQL), documentaremos isto no manual. Veja Seo 1.8.6 [Bugs], Pgina 54. ca a Ns fazemos uma construo para todas as plataformas para as quais suportamos o ca binrios (mais de 15 plataformas) e executamos nosso pacote de teste e benchmarks a para todas elas. No publicaremos um binrio para uma plataforma na qual os testes do pacote de a a benchmarks falharam. Se for um erro geral na fonte, o corrigimos e fazemos as contrues mais os teste em todos os sistemas novamente. co Se ns, durante a o porcesso de construo e teste (que leva de 2 a 3 dias) recebermos um o ca relatrio sobre um erro fatal (por exemplo, um que cause um core dump), o corrigiremos o e reiniciaremos o processo de construo). ca Depois de publicarmos os binrios em http://www.mysql.com/, enviamos um email a de anncio nas listas de email mysql e announce. Veja Seo 1.7.1.1 [Mailing-list], u ca Pgina 33. A mensagem de anncio contm uma lista de todas as alteraes da disa u e co tribuio e qualquer problema conhecido com ela. (A seo problemas conhecidos na ca ca notas das distribuies s tem sido necessria em algumas da distribuies.) co o a co

86

MySQL Technical Reference for Version 5.0.0-alpha

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.

2.2.8 Binrios MySQL compilados pela MySQL AB a


Como um servio, ns na MySQL AB fornecemos um conjunto de distribuies binrias do c o co a MySQL que so compiladas no nosso site ou em sites onde os clientes cordialmente nos do a a acesso as suas mquinas. a Em adio aos binrios forncedios em formatos de pacotes espec ca a icos da plataforma (veja Seo 2.1 [Quick Standard Installation], Pgina 60), oferecemos distribuies binrios para ca a co a outras plataformas atravs de arquivos tar compactados (.tar.gz). e Estas distribuies so geradas usando o script Build-tools/Do-compile que compila co a o cdigo fonte e cria o arquivo binrio em tar.gz usando scripts/make_binary_ o a distribution. Estes binrios so congurados e constru a a idos com os seguintes compiladores e opes. co Binrios constru a idos no sistema de desenvolvimento da MySQL AB: Linux 2.4.xx x86 com gcc 2.95.3 CFLAGS="-O2 -mcpu=pentiumpro" CXX=gcc CXXFLAGS="-O2 mcpu=pentiumpro -felide-constructors" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --disable-shared --withclient-ldflags=-all-static --with-mysqld-ldflags=-all-static Linux 2.4.xx Intel Itanium 2 com ecc (Intel C++ Itanium Compiler 7.0) CC=ecc CFLAGS="-O2 -tpp2 -ip -nolib_inline" CXX=ecc CXXFLAGS="-O2 -tpp2 -ip -nolib_inline" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile Linux 2.4.xx Intel Itanium com ecc (Intel C++ Itanium Compiler 7.0) CC=ecc CFLAGS=-tpp1 CXX=ecc CXXFLAGS=-tpp1 ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex --enablethread-safe-client --enable-local-infile Linux 2.4.xx alpha com ccc (Compaq C V6.2-505 / Compaq C++ V6.3-006) CC=ccc CFLAGS="-fast -arch generic" CXX=cxx CXXFLAGS="fast -arch generic -noexceptions -nortti" ./configure -

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

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

2.2.9 Instalando uma Distribuio Binria do MySQL ca a


Este cap itulo cobre a instalao da distribuio binria do MySQL (.tar.gz Archives) para ca ca a vrias plataformas (veja MySQL binaries para uma lista detalhada). a Em adio a estes pacotes genricos, tambm oferecemos binrios em formatos de pacote ca e e a espec icos da plataforma para plataformas selecionadas. Veja Seo 2.1 [Quick Standard ca Installation], Pgina 60 para mais informaes sobre como\ intal-los. a co a As distribuies genricas do MySQL esto empacotados com arquivos GNU tar com comco e a pactao gzip (.tar.gz). Voc precisa das seguintes ferramentas para instalar um disca e tribuio binria do MySQL: ca a GNU gunzip para descompactar a distribuio. ca Um tar razovel para descompactar a distribuio. Sabemos que o GNU tar funciona. a ca Algumas implementaes tar que vm pr-instaladas como o sistema operacional (ex. co e e Sun tar) possuem problemas (com nome de arquivos grandes, por exemplo) Neste caso, voc deve instalar o GNU tar primeiro. e Se voc tiver problemas, sempre use mysqlbug ao enviar dvidas para a lista de email do e u MySQL. Mesmo se o problema no for um bug, mysqlbug colhe informaes do sistema que a co ajudaro os outros a solucionar o seu problema. Se no usar mysqlbug, voc ter diminu a a e a ida a probabilidade de conseguir a soluo do seu problema. Voc encontrar o mysqlbug no ca e a diretrio bin depois de descompactar a distribuio. Veja Seo 1.7.1.3 [Relato de erros], o ca ca Pgina 36. a Os comando bsicos que voc deve executar para instalar e usar uma distribuio binria a e ca a do MySQL so: a shell> groupadd mysql shell> useradd -g mysql mysql shell> cd /usr/local shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf shell> ln -s full-path-to-mysql-VERSION-OS mysql shell> cd mysql

92

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

2.3 Instalando uma distribuio com fontes do MySQL ca


Antes de voc continuar com as instalaes dos fontes, conra antes se nosso binrio est e co a a dispon para sua plataforma e se ela funcionar para voc. Ns colocamos muito esforo ivel a e o c para ter certeza que nossos binrios so contru a a idos com as melhores opes poss co iveis. Voc precisa das seguintes ferramentas para contruir e instalar o MySQL a partir do cdigo e o fonte: GNU gunzip para descompactar a distribuio. ca Um tar razovel para desempacotar a distribuio. Sabe-se que o GNU tar funciona. a ca Algumas implementaes tar que vm pr-instaladas como o sistema operacional (ex. co e e Sun tar) possuem problemas (com nome de arquivos grandes, por exemplo) Neste caso, voc deve instalar o GNU tar primeiro. e Um compilador ANSI C++ funcional. gcc >= 2.95.2, egcs >= 1.0.2 ou egcs 2.91.66, SGI C++, e SunPro C++ so alguns dos compiladores que sabemos que funcionam. a A libg++ no necessria quando o gcc for usado. gcc 2.7.x tem um bug que a e a torna imposs ivel compilar alguns arquivos C++ perfeitamente corretos, como o sql/sql_base.cc. Se voc possui somente o gcc 2.7.x voc deve atualiza-lo para e e conseguir compilar o MySQL. gcc 2.8.1 tambm conhecido por ter problemas em e e algumas plataformas portanto ele deve ser evitado se existir um novo compilador para a plataforma. gcc >= 2.95.2 recomendado quando compilar o MySQL Verso 3.23.x. e a Um bom programa make. GNU make sempre recomendado e algumas vezes e e necessrio. Se voc tiver problemas, recomendamos tentar o GNU make 3.75 ou mais a e novo. Se voc estiver usando uma verso recente de gcc, recente o bastante para entender a opo e a ca -fno-exceptions, MUITO IMPORTANTE que voc a use. De outra forma, voc pode e e e compilar um binrio que quebra randomicamente. Ns tambm recomendamos que voc use a o e e -felide-constructors e -fno-rtti juntas com -fno-exception. Se estiver com dvidas, u faa o seguinte: c CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions \ -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler \ --with-mysqld-ldflags=-all-static Na maioria dos sistemas voc ir obter um binrio rpido e estvel com essas opes. e a a a a co Se voc tiver problemas, SEMPRE USE mysqlbug quando postar questes para a lista de e o email do MySQL Mesmo se o problema no for um bug, mysqlbug recolhe informaes a co do sistema que facilitar aos outros resolverem seu problema. Por no suar mysqlbug, a a voc perde a vantagem de ter seu problema resolvido! Voc ir encontrar mysqlbug no e e a

Cap tulo 2: Instalao do MySQL ca

95

diretrio scripts depois de desempacotar a distribuio. Veja Seo 1.7.1.3 [Bug reports], o ca ca Pgina 36. a

2.3.1 Viso geral da instalao rpida a ca a


Os comandos bsicos que voc deve executar para instalar o MysQL a partir da distribuio a e ca fonte so: a shell> shell> shell> shell> shell> shell> shell> shell> shell> shell> shell> shell> shell> groupadd mysql useradd -g mysql mysql gunzip < mysql-VERSION.tar.gz | tar -xvf cd mysql-VERSION ./configure --prefix=/usr/local/mysql make make install scripts/mysql_install_db chown -R root /usr/local/mysql chown -R mysql /usr/local/mysql/var chgrp -R mysql /usr/local/mysql cp support-files/my-medium.cnf /etc/my.cnf /usr/local/mysql/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. 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

MySQL Technical Reference for Version 5.0.0-alpha

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.

Cap tulo 2: Instalao do MySQL ca

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

2.3.2 Aplicando patches


Algumas vezes patches aparecem na lista de mensagens ou so colocados na rea de patches a a do MySQL. (http://www.mysql.com/downloads/patches.html). Para aplicar um patch da lista de mensagens, salve a mensagem em que o patch aparece em um arquivo, mude para o diretrio raiz da sua distribuio fonte de seu MySQL e execute o ca estes comandos: shell> patch -p1 < patch-file-name shell> rm config.cache shell> make clean Patches do site FTP so distribu a idos como arquivos texto ou como arquivos compactados com gzip. Aplique um patch no formato texto como mostrado acima para patches da lista de mensagens. Para aplicar um patch compactado, mude para o diretrio raiz da rvore o a fonte do MySQL e execute estes comandos: shell> gunzip < patch-file-name.gz | patch -p1 shell> rm config.cache shell> make clean Depois de aplicar um patch siga as instrues para uma instalao normal a partir dos co ca fontes comeando com o passo ./configure. Depois de executar o passo make install, c reinicie seu servidor MySQL. Voc pode precisar derrubar algum servidor atualmente em execuo antes de executar make e ca install. (Use mysqladmin shutdown para fazer isto.) Alguns sistemas no lhe permitem a instalar uma nova verso do programa se ele substitui agum que estiver em execuo. a ca

98

MySQL Technical Reference for Version 5.0.0-alpha

2.3.3 Opes t co ipicas do configure


O script configure fornece uma grande gama de controle sobre como voc congura sua e distribuio MySQL. Normalmente voc faz isto usando opes na linha de comando do ca e co configure. Voc tambm pode alterar configure usando algumas variveis de ambiente. e e a Veja Apndice F [Environment variables], Pgina 1092. Para uma lista de opes suportadas e a co pelo configure, execute este comando: shell> ./configure --help Algumas das opes mais usadas normalmente com o configure esto descritas a seguir: co a Para compilar apenas as bibliotecas clientes do MySQL e programas clientes e no o a servidor, use a opo --without-server: ca shell> ./configure --without-server Se voc no possui um compilador C++, mysql no ir compilar (ele o programa e a a a e cliente que exige C++). Neste caso, voc pode remover o cdigo no configure que e o testa pelo compilador C++ e executar ./configure com a opo --without-server. ca O passo da compiao continuar tentaindo construir mysql, mas voc pode ignorar as ca a e advertncias sobre mysql.cc. (Se o make parar, tente make -k para continuar com o e resto da compilao mesmo se erros ocorrerem.) ca Se voc quiser uma biblioteca embutida do MySQL (libmysqld.a) voc deve usar a e e opo --with-embedded-server. ca Se voc no deseja que seus arquivos de logs e diretrios de bancos de dados quem e a o localizados sobre /usr/local/var, use o comando configure; algo parecido com um destes: shell> ./configure --prefix=/usr/local/mysql shell> ./configure --prefix=/usr/local \ --localstatedir=/usr/local/mysql/data O primeiro comando altera o diretrio instalao para que tudo seja instalado sobre o ca /usr/local/mysql em vez do padro /usr/local. O segundo comando preserva o a diretrio da instalao padro, mas altera a localizao padro para diretrios de bano ca a ca a o cos de dados (normalmente /usr/local/var) e altera para /usr/local/mysql/data. Depois de ter compilado o MySQL, voc pode alterar estas opoes com arquivos de e ca opes. Veja Seo 4.1.2 [Option les], Pgina 216. co ca a Se voc estiver usando Unix e deseja que o arquivo socket do MySQL que em um e diretrio diferente do padro (normalmente no diretrio /tmp ou /var/run) use o o a o comando configure da seguinte forma: shell> ./configure --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock Perceba que o arquivo fornecido deve ter um caminho absoluto ! Voc tambm pode, e e mais tarde, alterar a localizao de mysql.sock usando os arquivos de opes do ca co MySQL. Veja Seo A.4.5 [Problems with mysql.sock], Pgina 929. ca a Se voc deseja compilar programas linkeditados estaticamente (por exemplo, para criar e uma distribuio binria, obter mais velocidade, ou evitar problemas com algumas ca a distribuies Red Hat Linux), execute configure desta forma: co shell> ./configure --with-client-ldflags=-all-static \ --with-mysqld-ldflags=-all-static

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

2.3.4 Instalando pela rvore de fontes do desenvolvimento a


CUIDADO: Voc deve ler esta seo somente se voc estiver interessado em nos ajudar a e ca e testar nossos novos cdigos. Se voc s deseja deixar o MySQL funcionando em seus sistema, o e o voc deve usar uma distribuio padro (pode ser uma distribuio binria ou fonte). e ca a ca a Para obter noss mais nova rvore de desenvolvimento, use estas instrues: a co 1. Faa download do BitKeeper em http://www.bitmover.com/cgi-bin/download.cgi. c Voc precisar do Bitkeeper 3.0 ou posterior para acessar nosso repositrio. e a o 2. Siga as instrues para instal-lo. co a 3. Depois que o BitKeeper estiver instalado, primeiro v ao diretrio no qual voc deseja a o e trabalhar e ento use um dos seguintes comandos para clonar o ramo da verso MySQL a a de sua escolha:

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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 bugs@lists.mysql.com. 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

Cap tulo 2: Instalao do MySQL ca

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

2.3.5 Lidando com Problemas de Compilao ca


Todos programas MySQL compilam de forma limpa sem alertas no solaris usando gcc. Em outros sistemas, alertas podem ocorrer devido a diferenas em arquivos include dos c sistemas. Veja Seo 2.3.6 [MIT-pthreads], Pgina 106 para avisos que podem ocorrer ca a usando MIT-pthreads. Para outros problemas, conra a lista abaixo. A soluo para vrios problemas envolve recongurao. Se voc precisa recongurar, faa ca a ca e c notas do seguinte: Se configure executado depois dele j ter sido chamado, ele pode usar informao e a ca que foi colhida durante a chamada anterior. Esta informao armazenada no arca e quivo config.cache. Quando configure inicia, ele procura por este arquivo, l seu e contedo, se ele existir, assumindo que aquela informao continua correta. Essa conu ca jetura invlida quando voc recongurar. e a e Cada vez que voc executa configure, voc deve executar make de novo para ree e compilar. Entretanto, voc pode desejar remover primeiro antigos arquivos objeto de e construes anteriores, porque eles foram compilados usando diferentes opes de conco co gurao. ca Para prevenir antigas informaes de conguraes ou arquivos objetos de serem usados, co co execute estes comandos antes de re-executar configure: shell> rm config.cache shell> make clean Uma alternativa, seria executar make distclean A lista abaixo descreve alguns dos problemas compilando o MySQL que tem sido encontrados com mais frequencia: Se voc obtm erros quando sql_yacc.cc como os mostrados abaixo, voc provavele e e mente tem de falta de memria ou espao de swap: o c Internal compiler error: program cc1plus got fatal signal 11 ou Out of virtual memory ou Virtual memory exhausted O problema que gcc necessita de grande quantidade de memria para compilar e o sql_yacc.cc com funes inline. Tente executando configure com a opo --withco ca low-memory:

104

MySQL Technical Reference for Version 5.0.0-alpha

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:

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

2.3.6 Notas MIT-pthreads


Esta seo descreve alguns dos detalhes envolvidos no uso de MIT-pthreads. ca Note que no Linux voc N~O deve usar MIT-pthreads mas instalar LinuxThreads! Veja e A Seo 2.6.2 [Linux], Pgina 137. ca a Se seu sistema no fornece suporte nativo a thread, voc precisar construir o MySQL a e a usando o pacote MIT-pthreads. Isto inclui antigos sistemas FreeBSD, SunOS 4.X, Solaris 2.4 e anteriores entre outros. Veja Seo 2.2.3 [Qual SO], Pgina 78. ca a Note que a partir do MySQL 4.0.2, MIT-pthreads no fazem mais parte da distribuio a ca fonte. Se voc precisar deste pacote, voc precisa fazer o download dele separadamente em e e http://www.mysql.com/Downloads/Contrib/pthreads-1_60_beta6-mysql.tar.gz Depois do download, extraia este arquivo fonte no n mais alto do diretrio de fontes do ivel o MySQL. Ele criar um novo subdiretrio mit-pthreads. a o Na maioria dos sitemas, voc pode forar o uso de MIT-pthreads executando o e c configure com a opo --with-mit-threads: ca shell> ./configure --with-mit-threads Construo em um diretrio no fonte no suportado com o uso de MIT-pthreads, ca o a a e porque ns queremos minimizar nossas alteraes para este cdigo. o co o

Cap tulo 2: Instalao do MySQL ca

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

2.3.7 Instalando o MySQL a partir do Fonte no Windows


Estas instrues descrevem como construir o binrio do MySQL a partir do fonte paras co a verses 4.1 e acima no Windows. As instrues so fornecidas para construir binrios a o co a a partir de uma distribuio fonte padro ou a partir da rvore do BitKeeper que contm o ca a a e fonte do desenvolvimento mais atuais.

108

MySQL Technical Reference for Version 5.0.0-alpha

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

2.3.7.1 Construindo o MySQL Usando VC++


Nota: O MySQL 4.1 e arquivos do espeo de trabalho do VC++ so compat c a iveis com o Microsoft Visual Studio 6.0 e as edies acima (7.0/.NET) e testados pela equipe da MySQL co AB antes de cada distribuio. ca Siga este procedimento para construir o MySQL: 1. Crie um diretrio de trabalho (ex.: workdir). o 2. Descompacte a distribuio fonte no diretrio mencionado acima usando Winzip ou ca o outra ferramenta que possa ler arquivos .zip.

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

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


Para construir o ultimo pacote fonte do Windows a partir da arvor fonte atual do Bit e Keeper, use as seguintes instrues. Por favor, note que este procedimento deve ser realco izado em um sistema executando um sistema opercional Unix ou similar. (Sabe-se que este procedimento funciona bem com o Linux, por exemplo.) 1. Clone a rvore fonte do BitKeeper para o MySQL (verso 4.1 ou acima, como desea a jado). Para mais informaes sobre como clonar a rvore fonte veja as instrues em co a co Seo 2.3.4 [Installing source tree], Pgina 100. ca a 2. Congure e construa as distribuies para que voc tenha um binrio do servidor para co e a trabalhar. Um modo de se fazer isto executar o seguinte comando no diretrio de e o mais alto n de sua rvore fonte: ivel a shell> ./BUILD/compile-pentium-max 3. Depois de se certicar que o processo de construo foi completado com sucesso, execute ca o seguinte script utilitrio a a partir do diretrio de n mais alto da sua arvore fonte: a o ivel

Cap tulo 2: Instalao do MySQL ca

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

2.4 Conguraes e Testes Ps-instalao co o ca


Uma vez instalado o MySQL (de uma distribuio binria ou fonte), voc deve inicializar ca a e as tabelas de concesses, iniciar o servidor e ter certeza que o servidor est funcionando o a bem. Voc pode tambm desejar que o servidor inicie e pare automaticamente quando seu e e sistema iniciar e desligar. Normalmente voc instala as tabelas de concesses e inicia o servidor assim para instalaes e o co baseadas em uma distribuio fonte: ca shell> ./scripts/mysql_install_db shell> cd diretorio_instala~o_mysql ca shell> ./bin/mysqld_safe --user=mysql & Para uma distribuio binria (sem ser pacotes RPM ou PKG), faa isto: ca a c shell> cd diretorio_instala~o_mysql ca shell> ./bin/mysql_install_db shell> ./bin/mysqld_safe --user=mysql & O script mysql_install_db cria o banco de dados mysql que ir armazenar todos privilgios a e do banco de dados, o banco de dados test que voc poder usar para testar o MySQL e e a tambm entradas de privilgio para o usurio que usa o mysql_install_db e o usurio e e a a root. As estrandas so criadas sem senhas. O script mysqld_safe inicia o servidor mysqld. a (Se sua verso for anterior a 4.0, use safe_mysqld em vez de mysqld_safe.) a mysql_install_db no ir sobrescrever nenhuma tabela de privilgios antiga, ento deve a a e a ser seguro execut-lo em quaisquer circunstncias. Se voc no deseja ter o banco de dados a a e a test voc pode remov-lo com mysqladmin -u root drop test depois de iniciar o servidor. e e Testes so geralmente facilmente feitos de um diretrio raiz da distribuio MySQL. a o ca Para uma distribuio binria, este seu diretrio de instalao (normalmente algo como ca a e o ca

112

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

5. Verique que voc possa reiniciar o servidor. e chamado o mysqld diretamente. Por exemplo: shell> BINDIR/mysqld_safe --log &

Faa isto usando mysqld_safe ou c

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

Cap tulo 2: Instalao do MySQL ca

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

2.4.1 Problemas Executando o mysql_install_db


O propsito do script mysql_install_db gerar novas tabelas de privilgios. Ele no ir o e e a a afeter nenhum outro dado! Ele tambm no far nada se voc j tem a tabela de privilgio e a a e a e do MySQL instalada. Se voc deseja refazer suas tabelas de privilgios, voc deve desligar o servidor mysqld, se e e e ele j est executando, ento faa assim: a a a c mv diretorio-dados-mysql/mysql diretorio-dados-mysql/mysql-old mysql_install_db Esta seo relaciona alguns problemas que podem ser encontrados ao executar mysql_ ca install_db: mysql_install_db no instala as tabelas de permisses a o Voc pode descobrir que o mysql_install_db falha ao instalar as tabelas de e permisses e termina depois de mostrar as seguintes mensagens: o starting mysqld daemon with databases from XXXXXX mysql daemon ended Neste caso, voc deve examinar o arquivo de log com muito cuidado! O log deve e se encontrar no diretrio XXXXXX nomeado pela mensagem de erro, e deve o indicar porque mysqld no inicializa. Se voc no entende o que aconteceu, a e a inclua o log quando voc postar um relato de erro usando mysqlbug! Veja e Seo 1.7.1.3 [Bug reports], Pgina 36. ca a J existe um daemon mysqld sendo executado a Neste caso, provavelmente no ser necessrio executar o mysql_install_db. a a a Voc deve executar o mysql_install_db somente uma vez, quando voc instae e lar o MySQL da primeira vez. Instalair um segundo daemon mysqld no funciona quando um daemon a estiver em execuo. ca

116

MySQL Technical Reference for Version 5.0.0-alpha

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

2.4.2 Problemas Inicializando o Servidor MySQL


Se voc for usar tabelas que suportem transaes (BDB, InnoDB), primeiro deve-se criar e co um arquivo my.cnf e congurar opes de inicializao para os tipos de tabelas que voc co ca e planeja usar. Veja Cap ptexi tulo 7 [Table types], Pgina 630. a Geralmente, voc inicia o servidor mysqld de uma das trs maneiras: e e

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

2.4.3 Inicializando e parando o MySQL automaticamente.


Os scripts mysql.server e mysqld_safe podem ser usados para iniciar o servidor automaticamente na inicializao do sistema. mysql.server tambm pode ser usado para parar o ca e servidor. O script mysql.server pode ser usado para inicializar ou parar o servidor utilizando-o com os argumentos start ou stop:

Cap tulo 2: Instalao do MySQL ca

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

[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

2.5 Atualizando/Desatualizando o MySQL


Antes de fazer uma atualizao, voc deve fazer o backup de seus bancos de dados antigos. ca e Voc sempre pode mover os arquivos de formato e de dados do MySQL entre diferentes e verses na mesma arquitetura enquanto voc tiver verso base do MySQL. A verso base o e a a atual 4. Se voc alterar o conjunto de caracteres quando executar o MySQL, voc deve e e e executar myisamchk -r -q --set-character--set=charset em todas tabelas. De outra forma seus indices podem no ser corretamente ordenados, porque alterar o conjunto de a caracteres tambm pode alterar a ordenao. e ca Se voc tem receio de novas verses, voc sempre pode renomear seu antigo mysqld para e o e algo como mysqld-nmero-da-verso-antiga. Se o seu novo mysqld comportar de maneira u a inesperada, voc simplesmente pode desliga-lo e reiniciar com seu antigo mysqld! e Se depois de uma atualizao, voc tiver problemas com programas clientes recompilados ca e como Commands out of sync ou core dumps inexperados, voc provavelmente usou um e arquivo de cabealho ou de biblioteca antigo na compilao de seus programas. Neste caso c ca voc deve conferir a data de seu arquivo mysql.h e da biblioteca libmysqlclient.a e para vericar que eles so da nova distribuio MySQL. Se no, por favor, recompile seus a ca a programas! Se voc tiver problemas, como na inicializao do novo servidor mysqld ou caso voc no e ca e a consiga conectar sem uma senha, conra se o seu arquvo my.cnf o mesmo da antiga e instalao! Voc pode conferir com isto: nome-programa --print-defaults. Se isto no ca e a produzir outra sa alm do nome do programa, voc tem um arquivo my.cnf ativo que ida e e est afetando a operacionalidade do servidor! a E uma boa idia reconstruir e reinstalar o mdulo Perl DBD-mysql sempre que instalar uma e o nova verso do MySQL. O mesmo se aplica para outras interfaces MySQL, como Python a MySQLdb.

Cap tulo 2: Instalao do MySQL ca

121

2.5.1 Atualizando da Verso 4.0 para 4.1 a


Varias comportamentos vis iveis foram alteradas entre o MySQL 4.0 e o MySQL 4.1 para corrigir erros cr iticos e tornar o MySQL mais compat com o padro ANSI SQL. Estas ivel a alteraes podem afetar ` sua aplicao. co a ca Alguns dos comportamentos do MySQL 4.1 no 4.0 podem ser testados antes de realizar uma atualizao completa para a verso 4.1, adicionamos `s ultimas distribuies do MySQL 4.0 ca a a co (a paritr da 4.0.12) a opo de inicializao --new para o mysqld. ca ca Esta opo lhe d o comportamento da verso 4.1 para as alteraes mais cr ca a a co iticas. Voc e tambm pode habilitar estes comportamentos para a conexo de uma determinado cliente e a com o comando SET @@new=1, ou desabilit-lo se ele for iniciado com SET @@new=0. a Se voc acredita que algumas das alteraes da verso 4.1 o afetaro, recomendamos que e co a a antes de atualizar para a verso 4.1, voc faa o download da ultima distribuio do MySQL a e c ca 4.0 e o execute com a opo --new adicionando o seguinte ao seu arquivo de congurao: ca ca [mysqld-4.0] new Deste modo voc pode testar o novo comportamento com seus aplicativos na verso 4.0 para e a certicar-se que eles funcionam. Isto o ajudar a ter uma transio suave quando realizar a ca uma atualizao completa do MySQL 4.1. Fazendo isto do modo acima ir assegurar que ca a voc no execute acidentalemte a verso 4.1 com a opo --new mais tarde. e a a ca A seguinte lista descreve alteraes que podem afetar aplicaes e que voc deve observar co co e ao atualizar para a verso 4.1: a TIMESTAMP agora retornado como uma string com o formato YYYY-MM-DD HH:MM:SS. e (A opo --new pode ser usada a partir da verso 4.0.12 para fazer um servidor 4.0 ca a se comportar como 4.1 a este respeito.) Se voc quiser t-lo com um nmero (como a e e u Verso 4.0 faz) deve-se adicionar +0 a coluna TIMESTAMP a eles: a mysql> SELECT ts_col + 0 FROM tbl_name; Tamanhos de display para TIMESTAMP no so mais suportados. Por exemplo, se voc a a e declarar um coluna como TIMESTAMP(10), o (10) ignorado. e Esta mudana era necessria para compatibilidade com os padres SQL. Em uma verso c a o a futura. Em uma verso futura, uma alterao adicional ser feita (compat a ca a ivel com verses anteriores com esta mudaa), permitindo que o tamanho do timestamp indique o c o nmero desejado de d u igitos de fraes de um segundo. co Valores binrios (0xFFDF) agora so assumidos como strings em vez de nmeros. Isto a a u corrige o problema com conjunto de caracteres onde conveniente colocar a string como e um valor binrio. Com esta alterao voc deve usar CAST() se voc quiser comparar a ca e e valores binrios numericamente como inteiros: a SELECT CAST(0XFEFF AS UNSIGNED INTEGER) < CAST(0XFF AS UNSIGNED INTEGER) Se voc no usa CAST(), uma comparao lexicogrca da string ser feita: e a ca a a mysql> SELECT 0xFEFF < 0xFF; -> 1 Usando itens binrios em um contexto numrico ou comparando-os usando o operador a e = deve funcionar como antes. (A opo --new pode ser usado para fazer o servidor 4.0 ca se comportar como 4.1 a partir da verso 4.0.13.) a

122

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

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

2.5.2 Atualizando da Verso 3.23 para 4.0 a


Em geral, o que voc deve fazer atualizar para a verso 4.0 um verso mais nova do e e a a MySQL: Aps o upgrade, atualize a tabela de permisses para adicionar novos privilgios e o o e recursos. O procedimento usa o script mysql_fix_privilege_tables e est descrito a em Seo 2.5.6 [Upgrading-grant-tables], Pgina 130. ca a Edite qualquer script de inicializao ou arquivo de congurao para no utilizar ca ca a nenhuma das opes obsoletas listadas posteriormente nesta seo. co ca Converta seua arquivos ISAM antigos para arquivos MyISAM com o comando: mysql_ convert_table_format database. (Este um script Perl; ele exige que o DBI esteja e instalado). Paa converter a tabela em um dado banco de dados, use este comando: shell> mysql_convert_table_format database db_name Note que ele deve ser usado apenas se voc usar se todas as tabelas em um dado banco e de dados so ISAM ou MyISAM. Para evitar a converso de tabelas de outros tipos para a a MyISAM, voc pode listar explicitamente o nome de suas tabelas ISAM depois do nome e do banco de dados na linha de comando. Voc tambm pode executar uma instruo e e ca

124

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

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

2.5.3 Atualizando da verso 3.22 para 3.23 a


A Verso 3.23 do MySQL suporta tabelas do novo tipo MyISAM e do antigo tipo ISAM. Voc a e no necessita converter suas antigas tabelas para us-las com a verso 3.23. Por padro, a a a a todas novas tabelas sero criadas usando o tipo MyISAM (a menos que voc inicie o mysqld a e com a opo --default-table-type=isam). Voc pode converterr uma tabela ISAM para ca e uma formato MyISAM com ALTER TABLE nome_tabela TYPE=MyISAM ou com o script Perl mysql_convert_table_format. Os clientes verses 3.22 e 3.21 iro trabalhar sem quaisquer problemas com um servidor o a verso 3.23. a As seguintes listas dizem o que voc deve conferir quando atualizar para a verso 3.23: e a Todas tabelas que usam o conjunto de caracteres tis620 devem ser corrigidos com myisamchk -r ou REPAIR TABLE. Se voc zer um DROP DATABASE em um banco de dados ligado simbolicamente, a e ligao e o banco de dados original sero apagados. (Isto no acontece na 3.22 porque ca a a o configure no detecta a disponibilidade da chamada de sistema readlink). a OPTIMIZE TABLE agora funciona somente para tabelas MyISAM. Para outros tipos de tabelas, voc pode usar ALTER TABLE para otimizar a tabela. Durante o OPTIMIZE e TABLE a tabela , agora, bloqueada para prevenir que seja usada por outras threads. e O cliente MySQL mysql , agora, inicializado por padro com a opo --no-namede a ca commands (-g). Esta opo pode ser desabilitada com --enable-named-commands ca (-G). Isto pode causar problemas de imcompatibilidade em alguns casos, por exemplo, em scripts SQL que usam comandos sem ponto e v irgula! Comandos longos continuam funcionando. Funes de data que funcionam em partes de datas (como MONTH()) no retornar 0 co a a para datas 0000-00-00. (No MySQL 3.22 estas funes retornam NULL.) co Se voc estiver usando a ordem de classicaao de caracteres alem~ para tabelas ISAM, e c a voc deve reparar todas suas tabelas com isamchk -r, porque foram feitas alteraes e co na sua ordem de classicao! ca O tipo padro de retorno de IF() ir agora depender de ambos argumentos e no a a a apenas do primeiro argumento. Colunas AUTO_INCREMENT no devem ser usadas para armazenar nmeros negativos. A a u razo para isto que nmeros negativos causam problemas quando o -1 passa para 0. a e u

128

MySQL Technical Reference for Version 5.0.0-alpha

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.

Cap tulo 2: Instalao do MySQL ca

129

2.5.4 Atualizando da verso 3.21 para 3.22 a


Nada que afetaria a compatibilidade foi alterada entre a verso 3.21 e 3.22. A unica dia culdade que novas tabelas que so criadas com colunas do tipo DATE usaro a nova forma e a a de armazenar a data. Voc no pode acessar esses novos campos com uma verso antiga de e a a mysqld. Depois de instalar o MySQL verso 3.22, voc deve iniciar o novo servidor e depois executar a e o script mysql_fix_privilege_tables. Isto adicionar os novos privilgios que voc prea e e cisar para usar o comando GRANT. Se voc se esquecer disto, sera retornado o erro Access a e denied quando voc tentar usar ALTER TABLE, CREATE INDEX ou DROP INDEX. O procedie mento para atualizar a tabela de permisses est descrito em Seo 2.5.6 [Upgrading-granto a ca tables], Pgina 130. a A interface API C para mysql_real_connect() foi alterada. Se voc tem um programa e cliente antigo que chama essa funo, voc deve colocar um 0 para o novo argumento db (ou ca e recodicar o cliente para enviar o elemento db para conexes mais rpidas). Voc tambm o a e e deve chamar mysql_init() antes de chamar mysql_real_connect()! Esta alterao foi ca feita para permitir ` nova funo mysql_options() salvar opes na estrutura do manipua ca co lador do MYSQL. A varivel key_buffer do mysqld foi renomeada para key_buffer_size, mas voc ainda a e pode usar o antigo nome nos seus arquivos de inicializao. ca

2.5.5 Atualizando da verso 3.20 para 3.21 a


Se voc estiver executando uma verso mais antiga que a Verso 3.20.28 e deseja mudar e a a para a verso 3.21 voc deve fazer o seguinte: a e Inicie o servidor mysqld verso 3.21 com a opo --old-protocol para us-lo com clientes a ca a de uma distribuio da verso 3.20 Neste caso, a nova funo cliente mysql_errno() no ca a ca a ir retornar erro do servidor, somente CR_UNKNOWN_ERROR (mas isto funciona para erros de a clientes) e o servidor usa a forma funo password() anterior a 3.21 para vericao, ao ca ca invs do novo mtodo. e e Se voc NAO estiver usando a opo --old-protocol para mysqld, voc precisar fazer as e ca e a seguir alteraes: co Todo o cdigo cliente deve ser recompilado. Se voc usa o ODBC, deve obter o novo o e driver MyODBC 2.x. O script scripts/add_long_password deve ser executado para converter o campo Password na tabela mysql.user para CHAR(16). Todas as senhas devem ser reatribuidas na tabela mysql.user (para obter 62-bits no lugar de senhas 31-bits). O formato das tabelas no foi alterado, ento no preciso converter nenhuma tabela. a a a e A verso do MySQL 3.20.28 e superiores podem manipular o novo formato da tabela de a usurios sem afetar os clientes. Se voc tem uma verso do MySQL mais nova que 3.20.28, a e a senhas no iro mais funcionar se voc converter a tabela de usuaios. Por segurana, voc a a e c e primeiro deve fazer uma atualizao para a verso 3.20.28, pelo menos, e ento atualizar ca a a para a verso 3.21. a

130

MySQL Technical Reference for Version 5.0.0-alpha

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.

2.5.6 Atualizando a Tabela de Permisses o


Algumas distribuies introduzem alteraes a estrutura da tabelas de permisses (a tabela co co o no banco de dados mysql) para adicionar novos privilgios ou recursos. Para ter certeza e de que as suas tabelas de permisses esto corretas quando voc atualizar para uma nova o a e verso do MySQL, voc deve atualizar a sua tabela de permisso tambm. a e a e Em sistemas Unix ou semelhantes, atualize a tabela de permisses executando o script o mysql_fix_privilege_tables: shell> mysql_fix_privilege_tables Voc deve executar este script enquanto o servidor est em execuo. Ele tenta se conectar e a ca ao servidor na mquina local como root. Se sua conta root exige uma senha, indique a a senha na linha de comando. Para o MySQL 4.1 e acima, especique a senha assim: shell> mysql_fix_privilege_tables --password=senha_root Antes do MySQL 4.1, especique a senha desta forma: shell> mysql_fix_privilege_tables senha_root O script realiza mysql_fix_privilege_tables qualquer ao necessria para converter sua ca a tabela de permisses para o formato atual. Voc pode ver alguns avisos Duplicate column o e name, durante a execuo, eles podem ser ignorados. ca Depois de executar o script, pare o servidor e o reinicie. No Windows, no existe uma modo fcil de se atualizar a tabela de permisses at o MySQL a a o e 4.0.15. A partir desta verso, as distribuies do MySQL incluem um script SQL mysql_ a co fix_privilege_tables.sql que voc pode executar usando o cliente mysql. Se sua ine stalao do MySQL est localizada em C:\mysql, o comando se parecer com este: ca a a C:\mysql\bin> mysql -u root -p mysql mysql> SOURCE C:\mysql\scripts\mysql_fix_privilege_tables.sql

Cap tulo 2: Instalao do MySQL ca

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.

2.5.7 Atualizando para outra arquitetura


Se voc estiver usando o MySQL Verso 3.23, voc pode copiar os arquivos .frm, .MYI e a e e .MYD para tabelas MyISAM entre diferentes arquiteturas que suportem o mesmo formato de ponto utuante. (O MySQL cuida de cada detalhe de troca de bytes.) Veja Seo 7.1 ca [MyISAM Tables], Pgina 631. a Os arquivos ISAM de dados e indices (*.ISD e *.ISM respectivamente) so dependentes a da arquitetura e em alguns casos dependentees do Sistema Operacional. Se voc deseja e mover suas aplicaes para outra mquina que tem uma arquitetura ou SO diferentes da co a sua mquina atual, voc no deve tentar mover um banco de dados simplesmente copiando a e a os arquivos para a outra mquina. Use o mysqldump. a Por padro, o mysqldump ir criar um arquivo contendo declaraes SQL. Voc pode ento a a co e a transferir o arquivo para a outra mquina e aliment-la como uma entrada para o cliente a a mysql. Utilize mysqldump --help para ver quais opes esto dispon co a iveis. Se voc est movendo e a os dados para uma verso mais nova do MySQL, voc deve usar mysqldump --opt com a a e nova verso para obter uma descarga rpida e compacta. a a A mais fcil (mas no a mais rpida) forma para mover um banco de dados entre duas a a a mquinas executar os seguintes comandos na mquina em que o banco de dados se ena e a contra: shell> mysqladmin -h nome da outra maquina create nome_bd shell> mysqldump --opt nome_bd \ | mysql -h nome da outra maquina nome_bd Se voc deseja copiar um banco de dados de um mquina remota sobre uma rede lenta, e a pode ser usado: shell> mysqladmin create nome_bd shell> mysqldump -h nome de outra maquina --opt --compress nome_bd \ | mysql nome_bd O resultado pode tambm ser armazenado em um arquivo, depois transra o arquivo para a e mquina destino e carregue o arquivo no banco de dados. Por exemplo voc pode descarregar a e um banco de dados para um arquivo na mquina origem desta forma: a shell> mysqldump --quick nome_bd | gzip > nome_bd.contents.gz (O arquivo criado neste exemplo est compactado.) Transfria o arquivo contendo o contedo a u do banco de dados para a mquina destino e execute estes comandos: a

132

MySQL Technical Reference for Version 5.0.0-alpha

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

2.5.8 Atualizando o MySQL no Windows


Qaundo atualizar o MySQL no Windows, siga os passo abaixo: 1. Faa o download do ultima distribuio MySQL do Windows. c ca 2. Escolha uma hora do dia com pouco uso, onde a parada para manuteno aceitvel. ca e a 3. Alerte os usurios que ainda esto ativos para sua parada de manuteno. a a ca 4. Pare o Servidor MySQL em execuo (por exemplo, com NET STOP mysql ou com o ca utilitrio de Servios se voc estiver exeutando MySQL como um servio, ou com a c e c mysqladmin shutdown). 5. Finalize o programa WinMySQLAdmin se ele estiver em execuo. ca 6. Execute o script de instalao do arquivo de distribuio do Windows, clicando no ca ca boto "Install" no WinZip e seguindo os passos da instalao do script. a ca 7. Voc pode sobrescrever a sua instalao antiga do MySQL (normalmente em e ca C:\mysql), ou instal-la em um diretrio diferente, como C:\mysql4. Sobrescrever a a o instalao antiga o recomendado. ca e 8. Reinicie o servio MySQL Server (por exemplo, com NET START mysql se voc executar c e o MySQL como um servio, ou chamado o mysqld diretamente). c 9. Atualize a tabela de permisses. O procedimento est descrito em Seo 2.5.6 o a ca [Upgrading-grant-tables], Pgina 130. a Situaes de erros poss co iveis:

Cap tulo 2: Instalao do MySQL ca

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

2.6 Notas espec icas para os Sistemas Operacionais


2.6.1 Notas Windows
Esta seo descreve assuntos espec ca icos para usar MySQL no Windows.

2.6.1.1 Conectando em um MySQL Rematamente a Windows Utilizando SSH


Aqui temos notas sobre como conectar a um servidor MySQL atravs de uma conexo e a remota e segura usando o SSH (por David Carlson dcarlson@mplcomm.com: 1. Instale um cliente SSH na sua mquina Windows. Como um usurio, o melhor opo a a ca paga que encontrei o SecureCRT da http://www.vandyke.com/. Outra opo o fe ca e secure da http://www.f-secure.com/. Voc tambm pode encontrar algumas verses e e o livres no Google em http://directory.google.com/Top/Computers/Security/Products_ and_Tools/Cryptography/SSH/Clients/Windows/. 2. Inicie seu cliente SSH Windows. Congure Host_Name = IP_ou_Nome_servidormysql. Congure userid=seu_userid para logar no seu servidor. Este valor userid no pode a ser o mesmo do nome do usurio se sua conta MySQL. a 3. Congure a porta de acesso. E tambm faa um acesso remoto (Congure local_ e c port: 3306, remote_host: ip_ou_nomeservidormysql, remote_port: 3306 ) ou um acesso local (congure port: 3306, host: localhost, remote port: 3306). 4. Salve tudo, seno voc ter que refazer tudo da prxima vez. a e a o 5. Logue ao seu servidor com a sesso SSH que acabou de ser criada. a 6. Na sua mquina Windows, inicie algumas aplicaes ODBC (como o Access). a co 7. Crie um novo arquivo no Windows e ligue ao MySQL usando o driver ODBC da mesma forma que voc normalmente faz, EXCETO pelo fato de digitar localhost para a e mquina servidora MySQL no nomeservidormysql. a a Voc agora deve ter uma conexo ODBC ao MySQL, criptografada com SSH. e a

134

MySQL Technical Reference for Version 5.0.0-alpha

2.6.1.2 Compilando clientes MySQL no Windows


Em seus arquivos fontes, voc deve incluir my_global.h antes de mysql.h: e #include <my_global.h> #include <mysql.h> my_global.h inclui qualquer outro arquivo necessrio para compatibilidade de Windows a (como o windows.h) se o arquivo compilado no Windows. e Voc tambm pode ligar seu cdigo coma biblioteca dinmica libmysq.lib, que apenas e e o a e um wrapper para carregar em libmysql.dll sobre demanda, ou ligar com a biblioteca esttica mysqlclient.lib. a Perceba que como as bibliotecas clientes do MySQL so compiladas como bibliotecas a threaded, voc tambm deve compilar seu cdigo para ser multi-threaded! e e o

2.6.1.3 MySQL para Windows Comparado com o MySQL para Unix


O MySQL para Windows tem provado ser muito estvel. Esta verso do MySQL tem os a a mesmos recursos que sua verso correspondente Unix com as seguintes excees: a co Win95 e threads O Win95 perde aproximadamente 200 bytes de memria principal para cada o thread criada. Cada conexo no MySQL cria uma nova thread, portanto voc a e no deve executar o mysqld por um longo tempo no Win95 se seu servidor lida a com vrias conexes! WinNT e Win98 no sofrem deste bug. a o a Leituras simultneas a O MySQL depende das chamadas pread() e pwrite() para estar apto a misturar INSERT e SELECT. Atualmente ns usamos mutexes para emular o pread()/pwrite(). Ns iremos, a longo prazo, trocar o n da interface de o ivel arquivos com uma interface virtual para que ns possamos usar a interface o readfile()/writefile() no NT/2000/XP para obter mais velocidade. A implementao atual limita o nmero de arquivos abertos que o MySQL ca u pode usar para 1024, o que signica que voc no conseguir executar tantas e a a threads simultneas no NT/2000/XP como no Unix. a Leitura de blocos O MySQL usa uma leitura de blocos para cada conexo, que tem as seguintes a implicaes: co Uma conexo no ir ser disconectada automaticamente depois de 8 horas, a a a como acontece com a verso Unix do MySQL. a Se uma conexo trava, imposs a naliza-la sem matar o MySQL. a e ivel mysqladmin kill no ir funcionar em uma conexo adormecida. a a a mysqladmin shutdown no pode abortar enquanto existirem conexes a o adormecidas. Planejamos corrigir este problema quando nossos desenvolvedores Windows tiverem conseguido um boa soluo. ca

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

137

2.6.2 Notas Linux (Todas as verses) o


As notas abaixo a respeito da glibc aplicam-se somente na situao quando o MySQL ca e construido por voc mesmo. Se voc est executando Linux em uma mquina x86, na e e a a maioria dos casos muito melhor para voc usar nosso binrio. Ns ligamos nossos binrios e e a o a com a melhor verso alterada da glibc, podemos escolher as melhores opes do compilador, a co em uma tentativa de torn-la funcional para um servidor muito exigido. Para um usurio a a comum, mesmo para conguraes com vrias conexes concorrentes e/ou tabelas excedendo co a o o limite de 2 GB, nosso binrio , na maioria das vezes, a melhor escolha. Portanto se voc a e e ler o texto abaixo, e est em dvida sobre o que deve fazer, tente usar o nosso binrio a u a primeiro para ver se ele preenche suas necessidades, e preocupe-se com uma construo ca prpria apenas se voc descobrir que nosso binrio no bom o suciente para voc. Neste o e a a e e caso, ir iamos apreciar se fosse feito uma observao sobre isto, para que possamos fazer ca uma melhor verso binris da prxima vez. a a o O MySQL usa LinuxThreads no Linux. Se voc usa uma verso do Linux que no tenha e a a a glibc2, voc deve instalar LinuxThreads antes de tentar compilar o MySQL. Voc pode e e obter o LinuxThreads em http://www.mysql.com/downloads/os-linux.html. NOTA: Temos visto alguns problemas estranhos com o Linux 2.2.14 e MySQL em sistemas SMP; Se voc tem um sistema SMP, recomendamos a atualizao para o Linux 2.4! Seu e ca sistema car mais rpido e mais estvel. a a a Perceba que as verses da glibc iguais ou anteriores ` Verso 2.1.1 tem um bug fatal no o a a tratamento do pthread_mutex_timedwait, que usado quando voc executar instrues e e co INSERT DELAYED. Recomendamos no usar INSERT DELAYED antes de atualizar a glibc. a Se voc planeja ter mais de 1000 conexes simultneas, ser necessrio fazer algumas e o a a a alteraes na LinuxThreads, recompile-a e religue o MySQL ao novo libpthread.a. co Aumente PTHREAD_THREADS_MAX em sysdeps/unix/sysv/linux/bits/local_lim.h para 4096 e abaixe o STACK_SIZE no linuxthreads/internals.h para 256KB. Os caminhos so relativos ` raiz da glibc. Note que o MySQL no ser estvel com cerca de a a a a a 600-1000 conexes se o valor de STACK_SIZE for o padro de 2MB. o a Se voc tiver um problema com o MySQL, no qual ele no consiga abrir vrios arquivos ou e a a conexes, pode ser que voc no tenha congurado o Linux para lidar com o nmero de o e a u arquivos suciente. No Linux 2.2 e posteriores, voc pode conferir o valor para a alocao dos arquivos fazendo: e ca cat /proc/sys/fs/file-max cat /proc/sys/fs/dquot-max cat /proc/sys/fs/super-max Se voc possui mais de 16M de memria, deve ser adicionado o seguinte no seu script de e o boot (ex. /etc/rc/boot.local no SuSE Linux): echo 65536 > /proc/sys/fs/file-max echo 8192 > /proc/sys/fs/dquot-max echo 1024 > /proc/sys/fs/super-max Voc tambm pode executar os comandos acima da linha de comando como root, mas e e neste caso, os antigos limites voltaro a ser usados na prxima vez que o computador for a o reiniciado.

138

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

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 docs@mysql.com com os resultados - iremos inclu i-los neste manual. Existe outro detalhe que afeta muito a performance do MySQL, especialmente em sistemas multi processados. A 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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

141

2.6.2.1 Notas Linux para distribuies binrias co a


O MySQL necessita pelo menos do Linux verso 2.0 a Aviso: Percebemos que alguns usurios do MySQL tiveram serios problemas de estabilidade a com o MySQL e o kernel 2.2.14 do Linux. Se voc estiver usando este kernel voc deve e e atualiz-lo para o 2.2.19 (ou posterior) ou para o kernel 2.4. Se voc tiver um gabinete a e multi-cpu, ento voc deve considerar seriamente o uso do kernel 2.4 uma vez que ele lhe a e trar uma melhora signicante na velocidade. a A verso binria ligada com -static, que signica que voc normalmente no precisa se a a e e a preocupar com qual verso das bibliotecas do sistema voc tem. Voc no precisa instaa e e a lar LinuxThreads. Um programa ligado com a opo -static um pouco maior que um ca e programa ligado dinamicamente e tambm um pouco mais rpido (3-5%). Um problema, e a entretanto, que voc no pode usar funes denidas pelo usurio (UDF) com um proe e a co a grama ligado estaticamente. Se voc for escrever ou usar funes UDF (isto algo para e co e programadores C ou C++), voc deve compilar o MySQL, usando ligaes dinamicas. e co Se voc estiver usando um sistema baseado em libc (em vez de um sistema glibc2), voc, e e provavelmente, ter alguns problemas com resoluo de nomes de mquinas e getpwnam() a ca a com a verso binria. (Isto porque o glibc infelizmente depende de algumas bibliotecas a a e externas para resolver nomes de mquinas e getpwent(), mesmo quando compilado com a -static). Neste caso, voc provavelmente obter a seguinte mensagem de erro quando e a executar mysql_install_db: Sorry, the host xxxx could not be looked up ou o seguinte erro quando voc tentar executar mysqld com a opo --user: e ca getpwnam: No such file or directory Voc pode resolver este problema usando de um dos modos seguintes: e Obtenha uma distribuio fonte do MySQL (uma distribuio RPM ou tar.gz) e a ca ca instale. Execute mysql_install_db --force; Isto no executar o teste resolveip no mysql_ a a install_db. O lado ruim que voc no poder usar nomes de mquinas nas tabelas e e a a a de permisses; voc deve usar nmeros IP no lugar (exceto para localhost). Se voc o e u e estiver usando uma release antiga do MySQL que no suporte --force, voc deve a e remover o teste resolveip no mysql_install com um editor. Inicie mysqld com su no lugar de usar --user. As distribuies binrias Linux-Intel e RPM do MySQL so conguradas para o mximo co a a a de desempenho poss ivel. Ns sempre tentamos usar o compilador mais rpido e estvel o a a dispon ivel. Suporte MySQL ao Perl exige Perl Verso 5.004 03 ou mais novo. a Em algumas verses 2.2 do kernel Linux,voc pode obter o erro Resource temporarily o e unavailable quando voc faz vrias novas conexes para um servidor mysqld sobre e a o TCP/IP. O problema que o Linux tem um atraso entre o momento em que voc fecha um socket e e TCP/IP at que ele seja realmente liberado pelo sistema. Como s existe espao para um e o c nmero nito de slots TCP/IP, voc ir obter o erro acima se voc tentar fazer muitas novas u e a e

142

MySQL Technical Reference for Version 5.0.0-alpha

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

2.6.2.2 Notas Linux x86


O MySQL exige a verso 5.4.12 ou mais nova da libc. Sabe-se que funciona com a libc a 5.4.46. A verso 2.0.6 e posterior da glibc tambm deve funcionar. Existem alguns proba e lemas com os RPMs glibc da RedHat, portanto se voc tiver problemas, conra se existe e alguma atualizao! Sabemos que os RPMs glibc 2.0.7-19 e 2.0.7-29 funcionam. ca Se voc estiver usando o Red Hat 8.0 ou uma nova biblioteca glibc 2.2.x, voc deve iniciar o e e mysqld com a opo --thread-stack=192K (Use -O thread_stack=192K antes do MySQL ca 4). Se voc no zer isto o mysqld nlizar em gethostbyaddr() porque a nova biblioteca e a a glibc exige mais de 128K de memria na pilha para esta chamada. Este tamanho de pilha o o padro agora no MySQL 4.0.10 e acima. e a Se voc est usando o gcc 3.0 e acima para compilar o MySQL, voc deve instalar a e a e biblioteca libstdc++v3 antes de compilar o MySQL; se voc no zer isto, voc obter um e a e a erro sobre um s imbolo __cxa_pure_virtual perdido durante a ligao. ca Em algumas distribuies Linux mais antigas, configure pode produzir um erro como este: co Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file. See the Installation chapter in the Reference Manual. Faa apenas o que a mensagem de erro diz e adicione um caractere sublinhado para a macro c _P que tem somente um caractere sublinhado e ento tente novamente. a Voc pode obter alguns aviso quando estiver compilando; os mostrados abaixo podem ser e ignorados: mysqld.cc -o objs-thread/mysqld.o mysqld.cc: In function void init_signals(): mysqld.cc:315: warning: assignment of negative value -1 to long unsigned int mysqld.cc: In function void * signal_hand(void *): mysqld.cc:346: warning: assignment of negative value -1 to long unsigned int O mysql.server pode ser encontrado no diretrio share/mysql sob o diretrio de ino o stalao MySQL ou no diretrio support-files da rvore fonte MySQL. ca o a Se o mysqld sempre descarregar um core na inicializao, o problema pode ser que voc ca e tenha um antigo /lib/libc.a. Tente renome-lo depois remova sql/mysqld e faa um a c novo make install e tente novamente. Este problema foi relatado em algumas instalaes co Slackware. Se voc obter o seguinte erro quando ligar o mysqld, signica que seu libg++.a no est e a a instalado corretamente:

Cap tulo 2: Instalao do MySQL ca

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

2.6.2.3 Notas Linux SPARC


Em algumas implementaes, readdir_r() est quebrada. O sintoma que SHOW co a e DATABASES sempre retorna um conjunto vazio. Isto pode ser corrigido removendo HAVE_READDIR_R do config.h depois de congurar e antes de compilar.

2.6.2.4 Notas Linux Alpha


O MySQL Verso 3.23.12 a primeira verso do MySQL que testada no Linux-Alpha. Se a e a e voc planeja usar o MySQL no Linux-Alpha, voc deve ter certeza que possui esta verso e e a ou mais nova. Temos testado o MySQL no Alpha com nossos pacotes de benchmarks e testes, e ele parece funcinar muito bem. Quando ns compilamos o binrios MySQL padres, ns estvamos usando SuSE 6.4, kernel o a o o a 2.2.13-SMP, Compilador C Compaq (V6.2-504) e compilador C++ Compaq (V6.3-005) em uma mquina Compaq DS20 com um processador Alpha EV6. a Voc pode encontrar os compiladores acima em http://www.support.compaq.com/alpha-tools. e Usando estes compiladores, em vez do gcc, obtemos 9-14 % de melhora na performance com MySQL. Note que a linha de congurao otimiza o binrio para a CPU atual; isto signica que ca a voc s pode utilizar nosso binrio se voc tiver um processador Alpha EV6. Ns tambm e o a e o e compilamos estaticamente para evitar problemas de bibliotecas. A partir das prximas distribuies adicionamos o parmetro -arch generic em nossas o co a opes de compilao, o qual assegura que o binrio execute em todos os processadores co ca a Alpha. Ns tambm compilamos estaticamente para evitar problemas de bibliotecas. o e CC=ccc CFLAGS="-fast -arch generic" CXX=cxx \ CXXFLAGS="-fast -arch generic -noexceptions -nortti" \ ./configure --prefix=/usr/local/mysql --disable-shared \ --with-extra-charsets=complex --enable-thread-safe-client \ --with-mysqld-ldflags=-non_shared --with-client-ldflags=-non_shared Se voc deseja usar egcs a seguinte linha de congurao funcionou para ns: e ca o CFLAGS="-O3 -fomit-frame-pointer" CXX=gcc \ CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors \ -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql \ --disable-shared Alguns problemas conhecidos quando executamos o MySQL no Linux-Alpha: Debugar aplicaes baseadas em threads como o MysQL no ir funcionar com gdb co a a 4.18. Voc deve fazer download e usar o gdb 5.0! e

144

MySQL Technical Reference for Version 5.0.0-alpha

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.

2.6.2.5 Notas Linux PowerPC


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

2.6.2.6 Notas Linux MIPS


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

2.6.2.7 Notas Linux IA-64


Para conseguir compilar o MySQL no Linux Ia64, usamos a seguinte linha de compilao: ca Usando gcc-2.96: CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc \ CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors \ -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql \ "--with-comment=Official MySQL binary" --with-extra-charsets=complex No Ia64 os binrios do cliente MySQL esto usando bibliotecas compartilhadas. Isto a a signica se voc instalar nossa distribuio binrias em algum outro lugar diferente de e ca a /usr/local/mysql voc precisa modicar o /etc/ld.so.conf ou adicionar o caminho e da o diretrio onde est localizado o libmysqlclient.so na varivel de ambiente LD_ o a a LIBRARY_PATH. Veja Seo A.3.1 [Erros de ligao], Pgina 922. ca ca a

2.6.3 Notas Solaris

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

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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.#:

Cap tulo 2: Instalao do MySQL ca

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

2.6.3.1 Notas Solaris 2.7/2.8


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

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

MySQL Technical Reference for Version 5.0.0-alpha

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

2.6.3.2 Notas Solaris x86

No Solaris 8 no x86, mysqld ir descarregar um core se voc executar um strip no mesmo. a e Se voc estiver usando gcc ou egcs no Solaris X86 e voc tiver problemas com descarregos e e de core, voc deve utilizar o seguinte comando configure: e CC=gcc CFLAGS="-O3 -fomit-frame-pointer -DHAVE_CURSES_H" \ CXX=gcc \ CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -D ./configure --prefix=/usr/local/mysql Isto ir evitar problemas com a biblioteca libstdc++ e com 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

2.6.4 Notas BSD


Esta seo fornece informao para os vrios tipos de BSD, assim como a verso espec ca ca a a ica para eles.

2.6.4.1 Notas FreeBSD


FreeBSD 4.x ou mais novo recomendado para executao do MySQL uma vez que o pacote e ca thread muito mais integrado. e A mais fcil e portanto a forma preferida para instal-lo usar as portas mysql-server e a a e mysql-client dispon iveis em http://www.freebsd.org. Usando-as voc obtem: e

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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.

2.6.4.2 Notas NetBSD


Para compilar no NetBSD voc precisa do GNU make. De outra forma o compilador quee braria quando o make tentasse executar lint em arquivos C++.

2.6.4.3 Notas OpenBSD


No OpenBSD Verso 2.5, voc pode compilar o MySQL com threads nativas com as a e seguintes opes: co CFLAGS=-pthread CXXFLAGS=-pthread ./configure --with-mit-threads=no

2.6.4.4 Notas OpenBSD 2.8


Nossos usurios relataram que o OpenBSD 2.8 tem um bug nas threads que causa problemas a com o MySQL. Os desenvolvedores do OpenBSD j corrigiram o problema, mas em 25 de a Janeiro de 2001 a correo foi dispon ca ivel apenas no ramo -current. Os sintomas deste bug nas threads so: resposta lenta, alta carga, alto uso de CPU e quedas do servidor. a Se voc obter um erro como Error in accept:: Bad file descriptor ou erro 9 ao tene tar abrir tabelas ou diretrios, o problema provavelmente que voc no alocou memria o e e a o suciente para os descritores de arquivo do MySQL. Neste caso tente iniciar o mysqld_safe como root com as seguintes opes: co shell> mysqld_safe --user=mysql --open-files-limit=2048 &

Cap tulo 2: Instalao do MySQL ca

151

2.6.4.5 Notas BSDI Verso 2.x a


Se voc obter o seguinte erro quando estiver compilando o MySQL, seu valor ulimit para e memria virtual muito baixo: o e item_func.h: In method Item_func_ge::Item_func_ge(const Item_func_ge &): item_func.h:28: virtual memory exhausted make[2]: *** [item_func.o] Error 1 Tente usar ulimit -v 80000 e executar o make novamente. Se isto no funcionar e voc esa e tiver usando o bash, tente trocar para csh ou sh; alguns usurios BSDI relataram problemas a com bash e ulimit. Se voc utiliza gcc, voc pode tambm ter de usar a opo --with-low-memory para o e e e ca configure estar apto a compilar o sql_yacc.cc. Se voc tiver problemas com a data atual no MySQL, congurar a varivel TZ provavelmente e a ajudar. Veja Apndice F [Environment variables], Pgina 1092. a e a

2.6.4.6 Notas BSD/OS Verso 3.x a


Atualize para BSD/OS Verso 3.1. Se isto no for poss a a ivel, instale BSDIpatch M300-038. Use o seguinte comando quando congurar o MySQL: shell> env CXX=shlicc++ CC=shlicc2 \ ./configure \ --prefix=/usr/local/mysql \ --localstatedir=/var/mysql \ --without-perl \ --with-unix-socket-path=/var/mysql/mysql.sock O comeando seguinte tambm funciona: e shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 \ ./configure \ --prefix=/usr/local/mysql \ --with-unix-socket-path=/var/mysql/mysql.sock Voc pode alterar as localizaes dos diretrios se voc desejar, ou apenas usar os padres e co o e o no especicando nenhuma localizao. a ca Se voc tiver problemas com performance sob alta carga, tente usar a opo --skip-threade ca priority para mysqld! Isto ir executar todas as threads com a mesma prioridade; no BSDI a verso 3.1, isto fornece melhor performance (pelo menos at o BSDI corrigir seu organizador a e de threads). Se voc obter o erro virtual memory exhausted enquanto estiver compilando, deve tentar e usar ulimit -v 80000 e executar make novamente. Se isto no funcionar e voc estiver a e usando bash, tente trocar para csh ou sh; alguns usurios BSDI relataram problemas com a bash e ulimit.

152

MySQL Technical Reference for Version 5.0.0-alpha

2.6.4.7 Notas BSD/OS Verso 4.x a


O BSDI Verso 4.x tem alguns bugs relacionados `s threads. Se voc deseja usar o MySQL a a e nesta verso, voc deve instalar todas as correes relacionadas `s threads. Pelo menos a a e co a M400-23 deve estar instalada. Em alguns sistemas BSDI verso 4.x, voc pode ter problemas com bibliotecas compartila e hadas. O sintoma que voc no pode executar nenhum programa cliente, por exemplo, e e a mysqladmin. Neste caso voc precisa recongurar o MySQL, para ele no usar bibliotecas e a compartilhadas, com a opo --disable-shared. ca Alguns clientes tiveram problemas no BSDI 4.0.1 que o binrio do mysqld no conseguia a a abrir tabelas depois de um tempo em funcionamento. Isto porque alguns bugs relacionae dos a biblioteca/sistema fazem com que o mysqld altere o diretrio atual sem nenhuma o informao! ca A correo atualizar para a 3.23.34 ou depois de executar configure remova a linha ca e $define HAVE_REALPATH de config.h antes de executar o make. Perceba que com isso voc no pode fazer um link simblico de um diretrio de banco de e a o o dados para outro diretrio ou fazer um link simblico a uma tabela para outro banco de o o dados no BSDI! (Criar um link simblico para outro disco funciona). o

2.6.5 Notas Mac OS X 2.6.5.1 Mac OS X 10.x


O MySQL deve funcionar sem problemas no Mac OS X 10.x (Darwin). Voc no precisa e a dos patches pthread para este SO. Isto tambm se aplica ao Mac OS X 10.x Server. A compilao para a plataforma Server a e ca e mesma para a verso cliente do Mac OS X. No entanto note que o MySQL vem preinstalado a no Servidor ! Nosso binrio para Mac OS X compilado no Darwin 6.3 com a seguinte linha de cona e gurao: ca CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc \ CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors \ -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql \ --with-extra-charsets=complex --enable-thread-safe-client \ --enable-local-infile --disable-shared Veja Seo 2.1.3 [Instalao do Mac OS X], Pgina 71. ca ca a

2.6.5.2 Mac OS X Server 1.2 (Rhapsody)


Antes de tentar congurar o MySQL no MAC OS X server 1.2 (aka Rhapsody), primeiro voc deve instalar o pacote pthread encontrado em: e http://www.prnet.de/RegEx/mysql.html. Veja Seo 2.1.3 [Instalao do Mac OS X], Pgina 71. ca ca a

Cap tulo 2: Instalao do MySQL ca

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

2.6.6.2 Notas HP-UX Verso 10.20 a


Existem alguns pequenos problemas quando compilamos o MySQL no HP-UX. Ns reo comendamos que voc use o gcc no lugar do compilador nativo do HP-UX, porque o gcc e produz um cdigo melhor! o Ns recomendamos o uso do gcc 2.95 no HP-UX. No utilize opes de alta otimizao o a co ca (como -O6) ja que isto pode no ser seguro no HP-UX. a A seguine linha do configure deve funcionar com o gcc 2.95:

154

MySQL Technical Reference for Version 5.0.0-alpha

CFLAGS="-I/opt/dce/include -fpic" \ CXXFLAGS="-I/opt/dce/include -felide-constructors -fno-exceptions \ -fno-rtti" CXX=gcc ./configure --with-pthread \ --with-named-thread-libs=-ldce --prefix=/usr/local/mysql --disable-shared A seguinte linha do configure deve funcionar com o gcc 3.1: CFLAGS="-DHPUX -I/opt/dce/include -O3 -fPIC" CXX=gcc \ CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions \ -fno-rtti -O3 -fPIC" ./configure --prefix=/usr/local/mysql \ --with-extra-charsets=complex --enable-thread-safe-client \ --enable-local-infile --with-pthread \ --with-named-thread-libs=-ldce --with-lib-ccflags=-fPIC --disable-shared

2.6.6.3 Notas HP-UX Verso 11.x a


Para HP-UX Verso 11.x ns recomendamos o MySQL Verso 3.23.15 ou posterior. a o a Por causa de alguns bugs criticos nas bibliotecas padro do HP-UX, voc deve instalar as a e seguintes correes antes de tentar executar o MySQL no HP-UX 11.0: co PHKL_22840 Streams cumulative PHNE_22397 ARPA cumulative Isto ir resolver um problema que tem como retorno EWOLDBLOCK de recv() e EBADF de a accept() em aplicaes threads. co Se voc estiver usando gcc 2.95.1 em um sistema HP-UX 11.x sem correes, voc obter e co e a o erro: In file included from /usr/include/unistd.h:11, from ../include/global.h:125, from mysql_priv.h:15, from item.cc:19: /usr/include/sys/unistd.h:184: declaration of C function ... /usr/include/sys/pthread.h:440: previous declaration ... In file included from item.h:306, from mysql_priv.h:158, from item.cc:19: O problema que o HP-UX no dene consistentemente a pthreads_ e a atfork(). Ela tem prottipos coitantes em /usr/include/sys/unistd.h:184 o e /usr/include/sys/pthread.h:440 (detalhes abaixo). Uma soluo copiar /usr/include/sys/unistd.h em mysql/include e editar ca e unistd.h alterando-o para coincidir com a denio em pthread.h. Aqui est o di: ca a 183,184c183,184 < extern int pthread_atfork(void (*prepare)(), void (*parent)(), < void (*child)()); --> extern int pthread_atfork(void (*prepare)(void), void (*parent)(void), > void (*child)(void)); Depois disto, a seguinte linha congure deve funcionar:

Cap tulo 2: Instalao do MySQL ca

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

2.6.6.4 Notas IBM-AIX


Deteco automtica de xlC est faltando no Autoconf, portando um comando configure ca a a deste tipo necessrio quando estiver compilando o MySQL (Este exemplo usa o compilador e a IBM): export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 " export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192" export CFLAGS="-I /usr/local/include" export LDFLAGS="-L /usr/local/lib" export CPPFLAGS=$CFLAGS export CXXFLAGS=$CFLAGS ./configure --prefix=/usr/local \ --localstatedir=/var/mysql \ --sysconfdir=/etc/mysql \ --sbindir=/usr/local/bin \ --libexecdir=/usr/local/bin \ --enable-thread-safe-client \ --enable-large-files Acima esto as opes usadas para compilar a distribuio MySQL que pode ser encontrada a co ca em http://www-frec.bull.com/. Se voc alterar o -O3 para -O2 na linha de congurao acima, voc tambm deve remover e ca e e a opo -qstrict (isto uma limitao no compilador C da IBM). ca e ca Se voc estiver usando gcc ou egcs para compilar o MySQL, voc DEVE usar a opo -fnoe e ca exceptions, j que o manipulador de excees no gcc/egcs no seguro para threads! (Isto a co a e

156

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

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.

2.6.6.5 Notas SunOS 4


No SunOS 4, necessrio a MIT-pthreads para compilar o MySQL, o que signica que voc e a e precisa do GNU make. Alguns sistemas SunOS 4 tem problemas com bibliotecas dinmicas e libtool. Voc pode a e usar a seguinte linha do configure para evitar este problema: shell> ./configure --disable-shared --with-mysqld-ldflags=-all-static Quando compilando readline, voc pode obter alguns avisos sobre denies duplicadas e co que podem ser ignoradas. Ao compilar o mysqld, vo existir alguns alertas sobre implicit declaration of function a que tambm podem ser ignoradas. e

2.6.6.6 Notas Alpha-DEC-UNIX (Tru64)


Se voc est usando o egcs 1.1.2 no Digital Unix, voc atualizar par o gcc 2.95.2, j que o e a e a egcs no DEC tem vrios erros graves ! a Quando compilando programas com threads no Digital Unix, a documentao recomenda ca usar a opo -pthread para cc e cxx e as bibliotecas -lmach -lexc (em adio para ca ca lpthread). Voc deve executar o configure parecido com isto: e CC="cc -pthread" CXX="cxx -pthread -O" \ ./configure --with-named-thread-libs="-lpthread -lmach -lexc -lc" Quando compilando o mysqld, voc deve ver alguns avisos como estes: e mysqld.cc: In function void handle_connections(): mysqld.cc:626: passing long unsigned int * as argument 3 of accept(int,sockadddr *, int *) Voc pode ignorar estes altertas com segurana. Eles ocorrem porque o configure s pode e c o detectar erros e no alertas. a Se voc inicia o servidor diretamente da linha de comando, voc pode ter problemas com e e a nalizao do servidor ao sair (log out). (Quando voc sai, seu processo superior recebe ca e um sinal SIGHUP.) Se isto acontecer, tente iniciar o servidor desta forma: shell> nohup mysqld [options] & nohup faz com que o comando que o segue ignore qualquer sinal SIGHUP enviado pelo terminal. De forma alternativa, inicie o servidor executando mysqld_safe, o qual invoca o mysqld usando nohup por voc. Veja Seo 4.8.2 [mysqld_safe], Pgina 331. e ca a Se voc tiver problemas quando compilar mysys/get opt.c, apenas remova a linha #dene e NO PROTO do inicio do arquivo!

158

MySQL Technical Reference for Version 5.0.0-alpha

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

2.6.6.7 Notas Alpha-DEC-OSF1


Se voc tiver problemas com compilao e tem o DEC CC e o gcc instalados, tente executar e ca o configure desta forma: CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql Se voc tiver problemas com o arquivo c_asm.h, voc pode criar e usar um arquivo e e c_asm.h burro com: touch include/c_asm.h CC=gcc CFLAGS=-I./include \ CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql Perceba que os seguintes problemas com o programa ld pode ser corrigido fazendo o download do ultimo kit de atualizao da DEC (Compaq) de ca http://ftp.support.compaq.com/public/unix/.

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

2.6.6.8 Notas SGI Irix


Se voc estiver usando Irix Verso 6.5.3 ou mais novo, o mysqld s ir conseguir criar threads e a o a se voc execut-lo como um usurio com privilgios de CAP_SCHED_MGT (como root) ou dar e a a e ao servidor mysqld este privilgio com o seguinte comando shell: e shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld Voc pode precisar indenir alguns simbolos em config.h depois de executar configure e e antes de compilar. Em algumas implementaes Irix, a funo alloca() est quebrada. Se o servidor mysqld co ca a morrer em alguma instruo SELECT, remova as linhas de config.h que denem HAVE_ ca ALLOC e HAVE_ALLOC_H. Se mysqladmin create no funciona, remova a linha do config.h a que dene HAVE_READDIR_R. Voc tambm deve precisar remover a linha HAVE_TERM_H. e e

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

Cap tulo 2: Instalao do MySQL ca

161

2.6.6.9 Notas SCO

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 2: Instalao do MySQL ca

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.

2.6.6.10 Notas SCO Unixware Version 7.0


Voc deve usar uma verso de MySQL pelo menos to recente quando a Verso 3.22.13 e a a a e UnixWare 7.1.0 porque esta verso corrige alguns problemas de portabilidade sob o a Unixware. Ns temos compilado o MySQL com o seguinte comando configure no UnixWare Verso o a 7.1.x: CC=cc CXX=CC ./configure --prefix=/usr/local/mysql Se voc deseja usar o gcc, dever ser usado o gcc 2.95.2 ou mais novo. e a CC=gcc CXX=g++ ./configure --prefix=/usr/local/mysql 1. A SCO fornece Patches do Sistema Operacional em ftp://ftp.sco.com/pub/unixware7 para UnixWare 7.1.1 e 7.1.3 ftp://ftp.sco.com/pub/openunix8 para OpenUNIX 8.0.0 2. A SCO fornece informao sobre Security Fixes em ftp://ftp.sco.com/pub/security/OpenUNIX ca para OpenUNIX ftp://ftp.sco.com/pub/security/UnixWare para UnixWare

2.6.7 Notas OS/2


O MySQL usa poucos arquivos aberto. Por isto, voc deve adicionar uma linha parecida e com a abaixo em seu arquivo CONFIG.SYS: SET EMXOPT=-c -n -h1024 Se voc no zer isto, provavelmente vai ter o seguinte erro: e a File xxxx not found (Errcode: 24) Quando usar o MysQL com OS/2 Warp 3, o FixPack 29 ou superior necessrio. Com OS/2 e a Warp 4, FixPack 4 ou acima necessrio. Isto uma exigncia da biblioteca Pthreads. O e a e e MySQL deve estar instalado em uma partio que suporta nomes longos de arquivos como ca no HPFS, FAT32, etc. O script INSTALL.CMD deve ser executado pelo prprio CMD.EXE do OS/2 e opde no o a funcionar com shells substitutas como o 4OS2.EXE. O script scripts/mysql-install-db foi renomeado. Agora ele chamado install.cmd e e um script REXX, que ir atualizar as conguraes padres de segurana do MySQL e e a co o c criar os icones na WorkPlace Shell para o MySQL. Suporte a mdulos dinmicos compilado mas no totalmente testado. Mdulos dinmicos o a e a o a devem ser compilados usando a biblioteca run-time Pthreads.

164

MySQL Technical Reference for Version 5.0.0-alpha

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

2.6.8 Notas Novell NetWare


Portar o MySQL para NetWare foi um grande esforo da Novell. Os clientes da Novell estaro c a satisfeitos ao notarem que o NetWare 6.5 vir com os binrios do MySQL, completa com a a uma licena de uso comercial automatica para todos os servidores executando esta verso c a do NetWare. Veja Seo 2.1.4 [Instalao NetWare], Pgina 74. ca ca a MySQL para NetWare compilado usando um combinao do Metrowerks CodeWarrior e ca for NetWare e uma verso especial de compilaao cruzada do GNU autotools. Verique a c esta seo no futuro para mais informaes sobre construo e otimizao do MySQL para ca co ca ca NetWare.

2.6.9 Notas BeOS


Ns j falamos com alguns desenvolvedores BeOS que disseram que o MySQL est 80% o a a portado para o BeOS, mas ns no sabemos qual a situao no momento. o a ca

2.7 Comentrios de Instalao do Perl a ca


2.7.1 Instalando Perl no Unix
O suporte Perl para o MySQL fornecido pela interface cliente DBI/DBD. Veja Seo 12.5 e ca [Perl], Pgina 881. O cdigo do cliente Perl DBD/DBI exige Perl Verso 5.004 ou posterior. a o a A interface no funcionar se voc tiver uma verso mais do Perl. a a e a O suporte MySQL Perl tambm exige que voc tenha instalado o suporte a programao e e ca do cliente MySQL. Se voc instalou o MySQL a partir de arquivos RPM, os programas e cliente esto no cliente RPM, mas o suporte a programao do cliente est no RPM de a ca a desenvolvimento. Certique de se instalar este RPM posteriormente.

Cap tulo 2: Instalao do MySQL ca

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.

2.7.2 Instalaando ActiveState Perl no Windows


Para instalar o mdulo DBD do MySQL com ActiveState Perl no Windows, voc deve fazer o e o seguinte: Obter o ActiveState Perl em http://www.activestate.com/Products/ActivePerl/ e instal-lo. a Abrir um prompt do DOS. Se exigido, congurar a varivel HTTP_proxy. Por exemplo, voc pode tentar: a e set HTTP_proxy=my.proxy.com:3128 Inicie o progrma PPM: C:\> c:\perl\bin\ppm.pl Se voc j no o fez, instale o DBI: e a a

166

MySQL Technical Reference for Version 5.0.0-alpha

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

2.7.3 Problemas Usando a Interface Perl DBI/DBD


Se Perl informar que no pode encontrar o mdulo ../mysql/mysql.so, ento o a o a problema mais provvel que o Perl no pode localizar a biblioteca compartilhada a e a libmysqlclient.so. Voc pode corrigir isto por qualquer um dos seguintes mtodos: e e Compile a distribuio DBD-mysql com perl Makefile.PL -static -config em vez ca de perl Makefile.PL. Copie libmysqlclient.so para a diretrio onde sua bibliotecas compartilhadas esto o a localizadas (provavelmente /usr/lib ou /lib). No Linux voc pode adicionar o caminho do diretrio onde libmysqlclient.so est e o a localizado ao arquivo /etc/ld.so.conf. Adicione o caminho do diretrio onde libmysqlclient.so est localizada ` varivel o a a a de ambiente LD_RUN_PATH. Se voce receber os seguintes erros de DBD-mysql, voc provavelmente est usando gcc (ou e a usando um binrio antigo compilado com gcc): a /usr/bin/perl: cant resolve symbol __moddi3 /usr/bin/perl: cant resolve symbol __divdi3 Adicione -L/usr/lib/gcc-lib/... -lgcc ao comando de ligao quando a biblioteca ca mysql.so estiver constru (verique a sa de make para mysql.so quando voc ida ida e compilar o cliente Perl). A opo -L deve especicar o caminho do diretrio onde ca o libgcc.a est localizada no seu sistema. a Outra causa deste problema pode ser que Perl e o MySQL no so compilados com gcc. a a Neste caso, voc pode resolver o problema compilando ambos com gcc. e Se voc receber o seguinte erro de DBD-mysql quando executar o teste: e t/00base............install_driver(mysql) failed: Cant load ../blib/arch/auto/DBD/mysql/mysql.so for module DBD::mysql: ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169. signica que voc precisa adicionar a biblioteca compactada, -lz, a sua linha de ligao. e ca Isto pode ser feito com a seguinte alterao no arquivo lib/DBD/mysql/Install.pm: ca

Cap tulo 2: Instalao do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

3 Tutorial de Introduo Do MySQL ca


Este cap itulo fornece um tutorial de introduo ao MySQL demonstrando como usar o ca programa cliente mysql para criar e usar um banco de dados simples. mysql (algumas vezes apresentado como o terminal monitor ou apenas monitor) um programa interativo que e lhe permite conectar a um servidor MySQL, executar consultas e visualizar os resultados. mysql pode tambm ser executado em modo batch: voc coloca suas consultas em um e e arquivo, depois diz ao mysql para executar o contedo do arquivo. Cobrimos aqui ambas u as formas de utilizar o mysql. Para ver uma lista de opes conhecidas pelo mysql, chame-o com a opo --help: co ca shell> mysql --help Este cap itulo presume que o mysql est instalado na sua mquina e que um servidor MySQL a a est dispon a ivel para quem puder conectar. Se isto no for verdade, contate seu admina istrador MySQL. (Se voc o administrador, voc precisar consultar outras sees deste e e e a co manual.) Este cap itulo descreve todo o processo de congurao e uso de um banco de dados. Se ca voc estiver interessado em apenas acessar um banco de dados j existente, podera pular e a as sees que descrevem como criar o banco de dados e suas respectivas tabelas. co Como este cap itulo um tutorial, vrios detalhes so necessariamente omitidos. Consulte e a a as sees relevantes do manual para mais informaes sobre os tpicos cobertos aqui. co co o

3.1 Conectando e Desconectando do Servidor


Para conectar ao servidor, normalmente voc precisar fornecer um nome de usurio quando e a a o mysql for chamado e, na maioria dos casos, uma senha. Se o servidor executa em uma mquina diferente de onde voc est, voc tambm precisar especicar um nome a e a e e a de mquina. Contate seu administrador para saber quais parmetros de conexo voc deve a a a e usar para conectar (isto , qual mquina, usurio e senha usar). Uma vez que voc saiba e a a e quais os parmetros corretos, voc deve estar pronto para conectar da seguinte forma: a e shell> mysql -h servidor -u usuario -p Enter password: ******** Os asteriscos (********) representam sua senha; digite-a quando o mysql mostrar o prompt Enter password:. Se isto funcionar, voc deve ver algumas informaoes iniciais seguidas de um prompt mysql> e c shell> mysql -h host -u user -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 25338 to server version: 4.0.14-log Type help; or \h for help. Type \c to clear the buffer. mysql> O prompt lhe diz que o mysql est pronto para que voc digite os comandos. a e

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

3.2 Fazendo Consultas


Tenha certeza que voc est conectado ao servidor, como discutido na seo anterior. Isto e a ca feito, no ser selecionado nenhum banco de dados para trabalhar, mas no tem problemas. a a a Neste momento, mais importante saber um pouco sobre como fazer consultas do que j e a criar tabelas, carregar dados para elas, e recuperar dados delas. Esta seo descreve os ca princ ipios bsicos da entrada de comandos, usando diversas consultas voc pode tentar se a e familiarizar com o funcionamento do mysql. Aqui est um comando simples que solicita ao servidor seu nmero de verso e a data atual. a u a Digite-o como visto abaixo seguindo o prompt mysql> e digite a tecla RETURN: mysql> SELECT VERSION(), CURRENT_DATE; +--------------+--------------+ | version() | CURRENT_DATE | +--------------+--------------+ | 3.22.20a-log | 1999-03-19 | +--------------+--------------+ 1 row in set (0.01 sec) mysql> Esta consulta ilustra vrias coisas sobre o mysql: a Um comando normalmente consiste de uma instruo SQL seguida por um ponto e ca v irgula. (Existem algumas excees onde um ponto e v co irgula podem ser omitidos. QUIT mencionado anteriormente, um deles. Saberemos de outros mais tarde.) e Quando voc emite um comando, o mysql o envia para o servidor para execuo e e ca mostra os resultados, depois imprime outro prompt mysql> para indicar que est pronto a para outro comando. O mysql mostra a sa da consulta em forma tabular (linhas e colunas). A primeira ida linha contm rtulos para as colunas. As linhas seguintes so o resultado da consulta. e o a Normalmente, rtulos de colunas so os nomes das colunas que voc busca das tabelas o a e do banco de dados. Se voc est recuperando o valor de uma expresso no lugar de e a a uma coluna de tabela (como no exemplo j visto), o mysql rotula a coluna usando a a prpria expresso. o a

170

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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.

3.3 Criao e Utilizao de um Banco de Dados ca ca


Agora que voc j sabe como entrar com os comandos, hora de acessar um banco de dados. e a e Suponha que voc tenha diversos animais de estimao em sua casa (menagerie) e voc e ca e gostaria de ter o registro de vrios tipos de informaes sobre eles. Voc pode fazer isto a co e criando tabelas para armazenar seus dados e carreg-los com a informao desejada. Depois a ca voc pode responder diferentes tipos de questes sobre seus animais recuperando dados das e o tabelas. Esta seo mostrar como: ca a Criar um banco de dados Criar uma tabela Carregar dados na tabela Recuperar dados de uma tabela de vrias maneiras a Usar mltiplas tabelas u

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

3.3.1 Criando e Selecionando um Banco de Dados


Se o administrador criar seu banco de dados quando congurar as suas permisses, voc o e pode comear a us-lo. Seno, voc mesmo precisa cri-lo: c a a e a

174

MySQL Technical Reference for Version 5.0.0-alpha

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

3.3.2 Criando uma Tabela


Criar o banco de dados a parte fcil, mas neste ponto ele est vazio, como o SHOW TABLES e a a mostrar: a mysql> SHOW TABLES; Empty set (0.00 sec) A parte mais dif decidir qual a estrutura que seu banco de dados deve ter: quais tabelas icil e voc precisar e que colunas estaro em cada uma delas. e a a Voc ir precisar de uma tabela para guardar um registro para cada um de seus animais e a de estimao. Esta tabela pode ser chamada pet, e ela deve conter, pelo menos, o nome ca de cada animal. Como o nome por si s no muito interessante, a tabela dever conter o a e a outras informaes. Por exemplo, se mais de uma pessoa na sua fam tambm tem co ilia e animais, voc pode desejar listar cada dono. Voc pode tambm desejargravar algumas e e e informaes descritivas bsicas como espcie e sexo. co a e Que tal a idade? Pode ser do interesse, mas no uma boa coisa para se armazenar em um a e banco de dados. A idade muda ` medida em que o tempo passa, o que signica que voc a e sempre ter de atualizar seus registros. Em vez disso, melhor armazenar um valor xo a e como a data de nascimento. Ento, sempre que voc precisar da idade, basta voc calcul-la a e e a como a diferena entre a data atual e a data de aniversrio. O MySQL fornece funes para c a co fazer aritmtica de datas, ento isto no dif e a a e icil. Armazenando datas de aniversrio no a lugar da idade tambm oferece outras vantagens: e

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

3.3.3 Carregando dados em uma tabela


Depois de criar sua tabela, voc precisar povo-la. As instrues LOAD DATA e INSERT so e a a co a uteis para isto. Suponha que seu registro de animais possa ser descrito como abaixo: (Observe que o e MySQL espera datas no formato AAAA-MM-DD; isto pode ser diferente do que voc est e a acostumado.) name Fluy Claws Buy Fang Bowser Chirpy Whistler Slim owner Harold Gwen Harold Benny Diane Gwen Gwen Benny species cat cat dog dog dog bird bird snake sex f m f m m f m birth 1993-02-04 1994-03-17 1989-05-13 1990-08-27 1979-08-31 1998-09-11 1997-12-09 1996-04-29 death

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

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

3.3.4 Recuperando Informaoes de uma Tabela c


A instruo SELECT usada para recuperar informaes de uma tabela. A forma geral da ca e co instruo : ca e SELECT o_que_mostrar FROM de_qual_tabela WHERE condi~es_para_satisfazer; co o_que_mostrar indica o que voc deseja ver. Isto pode ser uma lista de colunas ou * para e indicar todas colunas. de_qual_tabela indica a tabela de onde voc deseja recuperar e os dados. A clusula WHERE opcional. Se estiver presente, condi~es_para_satisfazer a e co especicam as condies que os registros devem satisfazer para fazer parte do resultado. co

3.3.4.1 Selecionando Todos os Dados


A forma mais simples do SELECT recuperar tudo de uma tabela: mysql> SELECT * FROM pet; +----------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+--------+---------+------+------------+------------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Fang | Benny | dog | m | 1990-08-27 | NULL | | Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 | | Chirpy | Gwen | bird | f | 1998-09-11 | NULL | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | | Slim | Benny | snake | m | 1996-04-29 | NULL | | Puffball | Diane | hamster | f | 1999-03-30 | NULL | +----------+--------+---------+------+------------+------------+ Esta forma do SELECT util se voc deseja ver sua tabela inteira como agora, depois de e e voc acabar de carreg-la com os dados iniciais. Por exempo, voc pode pensar que a data e a e de nascimento do Bowser no est correta. Consultando seus papis originais de pedigree, a a e descobriu que o ano correto do nascimento deve ser 1989, no 1979. a Existem pelo menos duas formas de corrigir isto: Edite o arquivo pet.txt para corrigir o erro, depois limpe a tabela e recarregue-o usando DELETE e LOAD DATA: mysql> DELETE FROM pet; mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;

178

MySQL Technical Reference for Version 5.0.0-alpha

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

3.3.4.2 Selecionando Registros Espec icos


Como foi mostrado na seo anterior, fcil recuperar uma tabela inteira. Apenas omita ca e a a clusula WHERE da instruo SELECT. Mas normalmente voc no quer ver toda a tabela, a ca e a particularmente quando a tabela car grande. Em vez disso, voc estar mais interessado em e a ter a resposta de uma questo em particular, no qual voc especica detalhes da informao a e ca que deseja. Vamos ver algumas consultas de seleo nos termos das questes sobre seus ca o animais. Voc pode selecionar apenas registros espec e icos da sua tabela. Por exemplo, se voc deseja e vericar a alterao que fez na data de nascimento do Bowser, selecione o registro desta ca forma: mysql> SELECT * FROM pet WHERE name = "Bowser"; +--------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+-------+---------+------+------------+------------+ | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+-------+---------+------+------------+------------+ A sa conrma que o ano foi gravado corretamente agora como 1989 e no 1979. ida a Comparaes de strings normalmente so caso insensitivo, ento voc pode especicar o co a a e nome como "bowser", "BOWSER", etc. O resultado da pesquisa ser o mesmo. a Voc pode especicar condies em qualquer coluna, no apenas no name. Por exemplo, e co a se voc deseja saber quais foram os animais que nasceram depois de 1998, teste o campo e birth: mysql> SELECT * FROM pet WHERE birth >= "1998-1-1"; +----------+-------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+-------+ | Chirpy | Gwen | bird | f | 1998-09-11 | NULL | | Puffball | Diane | hamster | f | 1999-03-30 | NULL | +----------+-------+---------+------+------------+-------+ Voc pode combinar condies, por exemplo, para encontrar cadelas (dog/f): e co mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+ A consulta anterior utiliza o operador lgico AND (e). Existe tambm um operador OR (ou): o e

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

3.3.4.3 Selecionando Colunas Espec icas


Se voc no desejar ver todo o registro de sua tabela, especique as colunas em que voc e a e estiver interessado, separado por virgulas. Por exemplo, se voc deseja saber quando seus e animais nasceram, selecione as colunas name e birth: mysql> SELECT name, birth FROM pet; +----------+------------+ | name | birth | +----------+------------+ | Fluffy | 1993-02-04 | | Claws | 1994-03-17 | | Buffy | 1989-05-13 | | Fang | 1990-08-27 | | Bowser | 1989-08-31 | | Chirpy | 1998-09-11 | | Whistler | 1997-12-09 | | Slim | 1996-04-29 | | Puffball | 1999-03-30 | +----------+------------+ Para saber quem so os donos dos animais, use esta consulta: a mysql> SELECT owner FROM pet; +--------+ | owner | +--------+ | Harold |

180

MySQL Technical Reference for Version 5.0.0-alpha

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

3.3.4.4 Ordenando Registros


Voc deve ter percebido nos exemplos anteriores que os registros retornados no so mostrae a a da consulta quando os dos de forma ordenada. Normalmente mais fcil examinar a saida e a registros so ordenados com algum sentido. Para ordenar o resultado, utilize uma clusula a a ORDER BY. Aqui est o dia de nascimento dos animais, ordenado por data: a mysql> SELECT name, birth FROM pet ORDER BY birth; +----------+------------+

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

| 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

3.3.4.5 Clculo de Datas a


O MySQL fornece vrias funes que voc pode usar para realizar clculos em datas, por a co e a exemplo, para calcular idades ou extrair partes de datas. Para determinar quantos anos cada um do seus animais tem, compute a diferena do ano c da data atual e a data de nascimento (birth), depois subtraia se a o dia/ms da data atual e for anterior ao dia/ms da data de nascimento. A consulta seguinte, mostra, para cada e animal, a data de nascimento, a data atual e a idade em anos. mysql> SELECT name, birth, CURDATE(), -> (YEAR(CURDATE())-YEAR(birth)) -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) -> AS age -> FROM pet; +----------+------------+------------+------+ | name | birth | CURDATE() | age | +----------+------------+------------+------+ | Fluffy | 1993-02-04 | 2003-08-19 | 10 | | Claws | 1994-03-17 | 2003-08-19 | 9 | | Buffy | 1989-05-13 | 2003-08-19 | 14 | | Fang | 1990-08-27 | 2003-08-19 | 12 | | Bowser | 1989-08-31 | 2003-08-19 | 13 | | Chirpy | 1998-09-11 | 2003-08-19 | 4 | | Whistler | 1997-12-09 | 2003-08-19 | 5 | | Slim | 1996-04-29 | 2003-08-19 | 7 | | Puffball | 1999-03-30 | 2003-08-19 | 4 | +----------+------------+------------+------+ Aqui, YEAR() separa a parte do ano de uma data e RIGHT() separa os cinco caracteres mais a direita que representam a parte da data MM-DD. A parte da expresso que compara os a valores MM-DD resulta em 1 ou 0, o qual ajusta a diferena do ano um ano abaixo se CURDATE c ocorrer mais cedo, no ano, que birth. A expresso completa um tanto deselegante, ento a e a um apelido (age) usado para obter uma sa mais signicativa. e ida A consulta funciona, mas o resultado pode ser mais compreens ivel se os registros forem apresentados em alguma ordem. Isto pode ser feito adicionando uma clusula ORDER BY a pelo nome: name para ordenar a saida mysql> SELECT name, birth, CURDATE(),

Cap tulo 3: Tutorial de Introduo Do MySQL 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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

3.3.4.6 Trabalhando com Valores Nulos (NULL)


O valor NULL pode ser supreendente at voc us-lo. Conceitualmente, NULL signica valor e e a em falta ou valor desconhecido e tratado de uma forma diferente de outros valores. Para e testar o valor NULL, voc no pode usar os operadores de comparaes aritmticas como em e a co e =, <, ou !=. Para demonstrar para voc mesmo, tente executar a seguinte consulta: e mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL; +----------+-----------+----------+----------+ | 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL | +----------+-----------+----------+----------+ | NULL | NULL | NULL | NULL | +----------+-----------+----------+----------+ Claramente voc no obter resultados signicativos destas comparaes. Utilize os opere a a co adores IS NULL e IS NOT NULL no lugar: mysql> SELECT 1 IS NULL, 1 IS NOT NULL; +-----------+---------------+ | 1 IS NULL | 1 IS NOT NULL | +-----------+---------------+ | 0 | 1 | +-----------+---------------+ No MySQL, 0 ou NULL signica falso e o resto verdadeiro. O valor verdadeiro por o padro e a em uma operao booleana 1. ca e Este tratamento especial de NULL porque, na seo anterior, foi necessrio determinar e ca a quais animais no estavam mais vivos usando death IS NOT NULL no lugar de death <> a NULL. Dois valores NULL so considerados como iguais em um GROUP BY. a Ao fazer um ORDER BY, valores NULL so apresentados primeiro se voc zer ORDER BY ... a e ASC e por ultimo se voc zer ORDER BY ... DESC. e Note que o MySQL 4.0.2 a 4.0.10 sempre ordenam, incorretamente, valores NULL em primeiro independente da ordem escolhida.

3.3.4.7 Combinao de padres ca o


O MySQL fornece combinao de padres do SQL bem como na forma de combinao ca o ca de padres baseado nas expresses regulares extendidas similares `quelas usadas pelos o o a utilitrios Unix como o vi, grep e sed. a

186

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

3.3.4.8 Contando Registros


Bancos de dados normalmente so usados para responder a perguntas, Qual a frequncia a e que certo tipo de dados ocorre em uma tabela? Por exemplo, voc deve querer saber e quantos animais tem, ou quantos animais cada dono tem, ou voc pode querer fazer vrios e a outros tipos de operaes de censo com seus animais. co Contando o nmero total de animais que voc tem a mesma questo como em Quantos u e e a registros existem na tabela pet? porque existe um registro por animal. COUNT(*) conta o nmero de resultados no-NULL, portanto a pesquisa para contar seus animais parecer u a a com isto: mysql> SELECT COUNT(*) FROM pet; +----------+ | COUNT(*) | +----------+ | 9 | +----------+ Logo, voc recuperar os nomes das pessoas que possuam animais. Voc pode usar COUNT() e a e se voc desejar encontrar quantos animais cada dono possui: e

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

3.3.4.9 Utilizando M ltiplas Tabelas u


A tabela pet mantm informaes de quais animais voc tem. Se voc deseja gravar outras e co e e informaes sobre eles como eventos em suas vidas, tais como visitas ao veterinrio ou sobre co a suas crias, voc necessitar de outra tabela. Como esta tabela deve se parecer ? Ela precisa: e a Conter o nome do animal para que voc saiba a qual animal pertence o evento. e Uma data para que voc saiba quando ocorreu o evento. e

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

3.4 Obtendo Informaoes Sobre Bancos de Dados e Tabelas c


E se voc esquecer o nome de um banco de dados ou tabela, ou como a estrutura de e e uma certa tabela (por exemplo, como suas colunas so chamadas)? O MySQL resolve este a problema atravs de diversas instrues que fornecem informaes sobre os bancos de dados e co co e as tabelas que ele suporta. Voc j viu SHOW DATABASES, que lista os bancos de dados gerenciados pelo servidor. Para e a saber qual banco de dados est sendo usado atualmente, utilize a funo DATABASE(): a ca mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | menagerie | +------------+

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

3.5 Utilizando mysql em Modo Batch


Nas sees anteriores, voc usou mysql interativamente para fazer consultas e ver os reco e sultados. Voc pode tambm executar mysql no modo batch. Para fazer isto, coloque os e e comando que voc deseja executar em um arquivo, e diga ao mysqld para ler sua entrada e do arquivo: shell> mysql < batch-file Se voc estiver executando o mysql no Windows e tiver algum caracter especial no arquivo e que provocou o problema, voc pode fazer: e dos> mysql -e "source batch-file" Se voc precisa especicar parmetros de conexo na linha de comando, o comando deve e a a parecer com isto: shell> mysql -h host -u user -p < batch-file Enter password: ********

194

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 3: Tutorial de Introduo Do MySQL ca

195

Voc tambm pode utilizar scripts no prompt de linha de comando mysql usando o comando e e source: mysql> source filename;

3.6 Exemplos de Consultas Comuns


Aqui esto os exemplos de como resolver problemas comuns com o MySQL. a Alguns dos exemplos usam a tabela shop para armazenar o preo de cada c item (article) para certas revendas (dealers). Supondo que cada revenda tenha um preo xo por artigo, c ento (article, dealer) uma chave primria para os registros. a e a Inicie a ferramenta de linha de comando mysql e selecione um banco de dados: shell> mysql o-nome-do-seu-banco-de-dados (Na maioria das instalaes do MySQL, voc pode usar o banco de dados test). co e Voc pode criar e popular a tabela exemplo assim: e mysql> CREATE TABLE shop ( -> article INT(4) UNSIGNED ZEROFILL DEFAULT 0000 NOT NULL, -> dealer CHAR(20) DEFAULT NOT NULL, -> price DOUBLE(16,2) DEFAULT 0.00 NOT NULL, -> PRIMARY KEY(article, dealer)); mysql> INSERT INTO shop VALUES -> (1,A,3.45),(1,B,3.99),(2,A,10.99),(3,B,1.45),(3,C,1.69), -> (3,D,1.25),(4,D,19.95); Depois de executar as instrues a tabela deve ter o seguinte contedo: co u mysql> SELECT * FROM shop; +---------+--------+-------+ | article | dealer | price | +---------+--------+-------+ | 0001 | A | 3.45 | | 0001 | B | 3.99 | | 0002 | A | 10.99 | | 0003 | B | 1.45 | | 0003 | C | 1.69 | | 0003 | D | 1.25 | | 0004 | D | 19.95 | +---------+--------+-------+

3.6.1 O Valor Mximo para uma Coluna a


Qual o maior nmero dos e u itens? SELECT MAX(article) AS article FROM shop; +---------+ | article |

196

MySQL Technical Reference for Version 5.0.0-alpha

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

3.6.3 Mximo da Coluna por Grupo a


Qual o maior preo por e c item?

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

3.6.4 As Linhas Armazenando o Group-wise Mximo de um Certo a Campo


Para cada item, encontre o(s) fornecedor(s) com o maior preo. c No SQL-99 (e MySQL 4.1 ou superior), o problema pode ser solucionado com uma subconsulta como esta: SELECT article, dealer, price FROM shop s1 WHERE price=(SELECT MAX(s2.price) FROM shop s2 WHERE s1.article = s2.article); Em verses anteriores a do MySQL 4.1 melhor faz-lo em diversos passos: o e e 1. Obtenha a lista de pares (article,maxprice). 2. Para cada item, obtenha os registros correspondentes que tenham o maior preo. c Isto pode ser feito facilmente com uma tabela temporria e um join: a CREATE TEMPORARY TABLE tmp ( article INT(4) UNSIGNED ZEROFILL DEFAULT 0000 NOT NULL, price DOUBLE(16,2) DEFAULT 0.00 NOT NULL); LOCK TABLES shop READ; INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article; SELECT shop.article, dealer, shop.price FROM shop, tmp WHERE shop.article=tmp.article AND shop.price=tmp.price; UNLOCK TABLES; DROP TABLE tmp; Se voc no usar uma tabela TEMPORRIA, voc deve bloquear tambm a tabela tmp. e a A e e Posso fazer isto com uma unica query? Sim, mas somente com um truque ineciente chamado truque MAX-CONCAT:

198

MySQL Technical Reference for Version 5.0.0-alpha

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.

3.6.5 Utilizando Variveis de Usurio a a


Voc pode usar variveis de usurios no MySQL para lembrar de resultados sem a necessie a a dade de armazen-las em variveis no cliente. Veja Seo 6.1.4 [Variables], Pgina 474. a a ca a Por exemplo, para encontrar os itens com os preos mais altos e mais baixos voc pode fazer c e isto: select @min_price:=min(price),@max_price:=max(price) from shop; select * from shop where price=@min_price or price=@max_price; +---------+--------+-------+ | article | dealer | price | +---------+--------+-------+ | 0003 | D | 1.25 | | 0004 | D | 19.95 | +---------+--------+-------+

3.6.6 Utilizando Chaves Estrangeiras


No MySQL 3.23.44 e acima, tabelas InnoDB suportam vericao de restries de chaves ca co estrangerias. Veja Seo 7.5 [InnoDB], Pgina 643. Veja tambm Seo 1.8.4.5 [ANSI di ca a e ca Foreign Keys], Pgina 50. a Voc no precisa de chaves estrangeiras para unir 2 tabelas. Para outros tipos de tabela e a diferentes de InnoDB, As unicas coisas que o MySQL atualmente no faz so 1) CHECK, para a a ter certeza que as chaves que voc usa realmente existem na tabela ou tabelas referenciadas e e 2) apagar automaticamente registros da tabela com uma denio de chave estrangeira. ca Usando suas chaves para unir a tabela funcionar bem: a CREATE TABLE person ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

SELECT WHERE AND AND

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

3.6.7 Pesquisando em Duas Chaves


O MySQL ainda no otimiza quando voc pesquisa em duas chaves diferentes combinadas a e com OR (Pesquisa em uma chave com diferentes partes OR muito bem otimizadas). e SELECT field1_index, field2_index FROM test_table WHERE field1_index = 1 OR field2_index = 1 A razo que ns ainda no tivemos tempos para fazer este tratamento de uma maneira a e o a eciente no caso geral. (A manipulao do AND , em comparao, completamente geral e ca e ca funciona muito bem). No MySQL 4.0 e acimo, voc pode solucionar este problema ecientemente usando um UNION e que combina a sa de duas instrues SELECT separadas. Veja Seo 6.4.1.2 [UNION], ida co ca Pgina 569. Cada SELECT busca apenas uma chave e pode ser otimizada. a SELECT field1_index, field2_index FROM test_table WHERE field1_index = 1 UNION SELECT field1_index, field2_index FROM test_table WHERE field2_index = 1; Em verses do MySQL anteirores a 4.0, voc pode conseguir o mesmo efeito usando uma o e tabela TEMPORARY e instrues SELECT separadas. Este tipo de otimizao tambm muito co ca e e boa se voc estiver utilizando consultas muito complicadas no qual o servidor SQL faz as e otimizaes na ordem errada. co CREATE TEMPORARY TABLE tmp SELECT field1_index, field2_index FROM test_table WHERE field1_index = 1; INSERT INTO tmp SELECT field1_index, field2_index FROM test_table WHERE field2_index = 1; SELECT * from tmp; DROP TABLE tmp; A maneira descrita acima para resolver esta consulta uma unio (UNION) de duas consultas. e a

Cap tulo 3: Tutorial de Introduo Do MySQL ca

201

3.6.8 Calculando Visitas Dirias a

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

3.6.9 Usando AUTO_INCREMENT


O atributo AUTO_INCREMENT pode ser usado para gerar uma identicao unica para um ca novo registro: CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id) ); INSERT INTO animals (name) VALUES ("dog"),("cat"),("penguin"), ("lax"),("whale"),("ostrich"); SELECT * FROM animals; Que retorna: +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | lax | | 5 | whale | | 6 | ostrich | +----+---------+ Voc pode recuperar o valor AUTO_INCREMENT mais recente com a funo SQL LAST_INSERT_ e ca ID() ou a funo da API C mysql_insert_id(). Nota: para uma insero de vrias ca ca a

202

MySQL Technical Reference for Version 5.0.0-alpha

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

3.7 Consultas de Projetos Gmeos e


Em Analytikerna e Lentus, ns estamos fazendo os sistemas e trabalho de campo para um o grande projeto de pesquisa. Este projeto uma colaborao entre o Institudo de Medicina e ca Ambiental em Karolinksa Institutet Stockholm e a Seo de Pesquisa Cl ca inica em Envelhecimento e Psicologia na University of Southern California. O projeto envolve uma parte de seleo onde todos os gmeos na Sucia mais velhos que 65 ca e e anos so entrevistados por telefone. Gmeos que preenchem certos critrios passam para a e e o prximo estgio. Neste estgio posterior, gmeos que desejam participar so visitados o a a e a por uma equipe de doutores/enfermeiros. Alguns dos consultas incluem exames f isicos e neuropsicolgico, testes de laboratrio, imagem neural, determinao do estado psicolgico o o ca o

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

3.7.1 Encontrando Todos Gmeos No-distribu e a idos


A seguinte consulta usada para determinar quem vai na segunda parte do projeto: e SELECT CONCAT(p1.id, p1.tvab) + 0 AS tvid, CONCAT(p1.christian_name, " ", p1.surname) AS Name, p1.postal_code AS Code, p1.city AS City, pg.abrev AS Area, IF(td.participation = "Aborted", "A", " ") AS A, p1.dead AS dead1, l.event AS event1, td.suspect AS tsuspect1, id.suspect AS isuspect1, td.severe AS tsevere1, id.severe AS isevere1, p2.dead AS dead2, l2.event AS event2, h2.nurse AS nurse2, h2.doctor AS doctor2, td2.suspect AS tsuspect2, id2.suspect AS isuspect2, td2.severe AS tsevere2, id2.severe AS isevere2, l.finish_date FROM twin_project AS tp /* For Twin 1 */ LEFT JOIN twin_data AS td ON tp.id = td.id AND tp.tvab = td.tvab LEFT JOIN informant_data AS id ON tp.id = id.id AND tp.tvab = id.tvab LEFT JOIN harmony AS h ON tp.id = h.id AND tp.tvab = h.tvab LEFT JOIN lentus AS l ON tp.id = l.id AND tp.tvab = l.tvab /* For Twin 2 */ LEFT JOIN twin_data AS td2 ON p2.id = td2.id

204

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 3: Tutorial de Introduo Do MySQL ca

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

3.7.2 Mostrando uma Tabela sobre a Situao dos Pares Gmeos ca e


Cada entrevista termina com um cdigo da situao chamado event. A consulta mostrada o ca abaixa usada para mostrar uma tabela sobre todos pares gmeos combinados por evento. e e Ela indica em quantos pares ambos gmeos terminaram, em quantos pares um gmeo tere e minou e o outro foi recusado e assim por diante. SELECT t1.event, t2.event, COUNT(*) FROM lentus AS t1,

206

MySQL Technical Reference for Version 5.0.0-alpha

lentus AS t2, twin_project AS tp WHERE /* We are looking at one pair at a time */ t1.id = tp.id AND t1.tvab=tp.tvab AND t1.id = t2.id /* Just the sceening survey */ AND tp.survey_no = 5 /* This makes each pair only appear once */ AND t1.tvab=1 AND t2.tvab=2 GROUP BY t1.event, t2.event;

3.8 Utilizando MySQL com Apache


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

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

207

4 Administrao do Bancos de Dados MySQL ca


4.1 Congurando o MySQL
4.1.1 Opes de Linha de Comando do mysqld co
Na maioria dos casos voc deve gerenciar as opes do mysqld por meio dos arquivos de e co opes. Veja Seo 4.1.2 [Arquivos de opes], Pgina 216. co ca co a mysqld e mysqld.server lem opes dos grupos mysqld e server. mysqld_safe l as e co e opes dos grupos mysqld, server, mysqld_safe e mysqld_safe. Um servidor MySQL co embutido normalmente l opes do grupos server, embedded e xxxxx_SERVER, onde xxxxx e co o nome da aplicao. e ca mysqld aceita os seguintes opes de linha de comando. Aqui est uma lista das mais co a comuns. Para uma lista completa execute mysqld --help. As opes usadas para replicao co ca est`o listadas em uma seo separada, veja Seo 4.11.6 [Replication Options], Pgina 392. a ca ca a --ansi Utilizar a sintaxe ANSI SQL no lugar da sintaxe MySQL Veja Seo 1.8.2 [ANSI ca mode], Pgina 42. a

-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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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.

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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.

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

4.1.2 Arquivo de Opes my.cnf co


O MySQL pode, desde a verso 3.22, ler as opes padres de inicializao para o servidor a co o ca e para clientes dos arquivos de opes. co No Windows, o MySQL l opes padres dos seguintes arquivos: e co o Nome do Arquivo Windows-directory\my.ini C:\my.cnf Propsito o Opes globais co Opes globais co

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

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

4.2 Executando M ltiplos MySQL Servers na Mesma u Mquina a


Em alguns casos voc pode precisar de executar mltiplos servidores mysqld executando e u na mesma mquina. Voc pode desejar testar uma nova verso do MySQL enquanto a a e a deixa a sua instalao da verso de produo existente sem perturbao. Ou voc pode ca a ca ca e desejar dar acesso a diferentes usurios em diferentes servidores mysqld gerenciados por a eles mesmos. (Por exemplo, voc pode seu um provedor de servios de internet que quer e c fornecer instalaes independentes do MySQL para clientes diferentes). co Para executar mltiplos servidores em uma unica mquina, cada servidor deve ter valores u a unicos para diversos parmetros operacionais. Isto deve ser congurado na linha de co a mando ou em arquivos de opes. Veja Seo 4.1.1 [Command-line options], Pgina 207 e co ca a Seo 4.1.2 [Option les], Pgina 216. ca a Pelo menos as seguintes opes devem ser diferente para cada servidor: co --port=port_num --socket=path --shared-memory-base-name (apenas Windows; novo no MySQL 4.1) --pid-file=path (apenas Unix) --port controla o nmero da porta para conexes TCP/IP. --socket controla o caminho u o do arquivo de socket no Unix e o nome do named pipe no Windows. (E necessrio nomes de a pipes distintos no Windows apenas para aqueles servidores que suportam conexo named a pipes.) --shared-memory-base-name designa o nome da memria compartilhada por um servidor o Windows para permitir que o cliente se conecte via memria compartilhada. --pid-file o indice o nome do arquivo no qual o Unix gravar a ID do seu processo. Se voc usar as seguintes opes, elas deve ser diferentes para cada servidor: e co --log=path --log-bin=path --log-update=path

220

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

221

4.2.1 Executando M ltiplos Servidores no Windows u


Voc pode executar mltiplos servidor no Windows iniciando-os manualmente a partir e u da linha de comando, cada um com o parmetro operacional apropriado. Em sistemas a baseados no Windows NT, voc tambm tem a opo de instalar vrios servidores como e e ca a servios Windows e execut-los deste modo. Instrues gerais sobre a execuco de servic a co a dores MySQL a partir da linha de comando ou como servios so dados em Seo 2.6.1 c a ca [Windows], Pgina 133. Esta seo descreve como se certicar de que voc inicioou cada a ca e servidor com valores diferentes para aquelas opes de inicializao que devem ser unicas co ca por servidor, como o diretrio de dados. (Estas opes so descritas em Seo 4.2 [Multiple o co a ca servers], Pgina 219.) a

4.2.1.1 Iniciando M ltiplos Servidores na Linha de Comando u


Para iniciar vrios servidores manualmente na linha de comando, voc pode especicar a a e mais conveniente colocar opo apropriada na linha de comando ou no arquivo de opes. E ca co as opes em um arquivo de opo. Para fazer isto, crie uma arquivo de opo para cada co ca ca servidor e mostre ao servidor o nome do arquivo com a opo --defaults-file quando ca voc execut-lo. e a Suponha que voc queira executar o mysqld na porta 3307 com um diretrio de dados de e o C:\mydata1, e mysqld-max na porta 3308 com um diretrio de dados de C:\mydata2. o Para conseguir isto, crie dois arquivos de opes. Por exemplo, crie um arquivo chamado co C:\my-opts1.cnf que se parea com isto: c [mysqld] datadir = C:/mydata1 port = 3307 Crie um segundo arquivo chamado C:\my-opts2.cnf que se parea com isto: c [mysqld] datadir = C:/mydata2 port = 3308 Ento inicie cada servidor com seus prprios arquivos de opo: a o ca shell> mysqld --defaults-file=C:\my-opts1.cnf shell> mysqld-max --defaults-file=C:\my-opts2.cnf (No NT, o servidor iniciar em segundo plano, assim voc precisar enviar estes dois coa e a mandos em janelas de console separadas.) Para desligar o servidor, voc deve conectar a porta apropriada: e shell> mysqladmin --port=3307 shutdown shell> mysqladmin --port=3308 shutdown Servidores congurados como descrito permitir que clientes se conectem por TCP/IP. a Se voc tambm quiser permitir conexes named pipe, use os servidores mysqld-nt ou e e o mysqld-max-nt e especique as opo que habilitem o named pipe e especique os seus ca nomes. (Cada servidor que suporta conexes named pipes deve ter um nome unico). Por o exemplo, o arquivo C:\my-opts1.cnf pode ser escrito da seguinte maneira:

222

MySQL Technical Reference for Version 5.0.0-alpha

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

4.2.1.2 Iniciando M ltiplos Servidores Como Servios u c


Em sistemas baseados no NT, um servidor MySQL pode ser executado como um servio c Windows. O procedimento para instalao, controle e remoo de um unico servio MySQL ca ca c est descrito em Seo 2.1.1.7 [NT start], Pgina 66. a ca a A partir do MySQL 4.0.2, voc pode instalar vrios servidores como servios. Neste caso, e a c voc deve ter certeza de que cada servidor usa um nome de servio diferente junto com e c todos os outros parmetros que devem ser unico por servidor. a Para as seguintes instrues, assuma que voc queira executar o servidor mysqld-nt a co e partir de duas verses diferentes do MySQL que est instalado em C:\mysql-4.0.8 e o a C:\mysql-4.0.17, respectivamente. (Este pode ser o caso se voc estiver executando a e verso 4.0.8 como seu servidor de produo, mas queira testar o 4.0.17 antes de atualiz-lo.) a ca a Os seguintes principios so relevantes ao instalr um servio MySQL com a opo --install: a c ca Se voc no especicar o nome do servio, o servidor usa o nome padro do servio e a c a c (MySQL) e o servidor l as opes do grupo [mysqld] no arquivo de opes padro. e co co a Se voc especicar um nome de servio depois da opo --install, o servidor ignora e c ca o grupo de opo [mysqld] e l as opes do grupo que tem o mesmo nome que o ca e co servio. O servidor l as opes do arquivo de opo padro. c e co ca a Se voc especicar uma opo --defaults-file depois do nome do servio, o servidor e ca c ignora o arquivo de opes padro e l as opes apenas do grupo [mysqld] do arquivo co a e co chamado. Este princ ipios tambm se aplicam se voc intalar um servidor usando a opo --installe e ca manual. Baseado na informao anterior, voc tem diversos de congurar vrios servios. As ca e a c seguintes instrues descrevem alguns exemplos. Antes de tentar qualquer uma delas co esteja certo de que voc desligou e removeu qualquer servio MySQL existente primeiro. e c Especique as opes para todos os servios em um dos arquivos de opes padro. co c co a Para fazer isto, use um nome de servio diferente para cada servidor. Suponha que voc c e queira executar o mysqld-nt 4.0.8 usando o nome de servio [mysqld1] e o mysqldc nt 4.0.17 usando o nome de servio mysqld2. Neste caso voc pode usar o grupo c e [mysqld1] para o 4.0.8 e o grupo [mysqld2] para o MySQL 4.0.14. Por exemplo, voc e pode congurar o C:\my.cnf desta forma: # op~es para o servio mysqld1 co c [mysqld1]

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

4.2.2 Executando M ltiplos Servidores no Unix u


O modo mais fcil de executar diversos servidores no Unix compil-los com diferentes a e a portas TCP/IP e arquivos socket, assim cada um est escutando em diferentes interfaces de a rede. Tambm, compilando em diferentes diretrios bases para instalao, que automaticae o ca mente resulta em diferentes localizaes de diretrios de dados, arquivos log e arquivos PID co o para cada um dos seus servidores. Considere que um servidor existente est congurado para a porta e arquivo socket padres. a o Para congurar um novo servidor para ter parmetros operacionais diferentes, use um coa mando configure assim: shell> ./configure --with-tcp-port=port_number \ --with-unix-socket-path=nome_arquivo \ --prefix=/usr/local/mysql-4.0.17 Aqui nmero_porta e nome_arquivo deve ser diferente que o nmero da porta e o caminho u u do arquivo socket padres e o valor --prefix deve especicar um diretrio de instalao o o ca diferente daquele usado pelo servidor existente. Voc pode conferir o socket usado por qualquer servidor MySQL em execuo com este e ca comando: Se voc tem um servidor MySQL escutando em uma porta dada, voc pode usar o seguinte e e comando para descobrir quaie parmetros operacionais ele est usando para diversas a a variveis importantes congurveis, inclu a a indo o diretrio base e o nome do socket: o shell> mysqladmin --host=host_name --port=port_number variables Com a informao exibida por aquele comando, voc pode dizer quais valores de opo no ca e ca a usar ao congurar um servidor adicional. Note que se voc especicar localhost como o nome da mquina, mysqladmin ir por e a a padro usar uma conexo sockets Unix em vez de TCP/IP. No MySQL 4.1 voc tambm a a e e pode especicar o protocolo a ser usado com a opo --protocol={TCP | SOCKET | PIPE | ca MEMORY}.

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

4.2.3 Usando Programas Clientes em um Ambiente MultiServidor


Quando voc quiser conectar com um programa cliente a um servidor MySQL que est e a escutando diferentes interfaces de rede em vez daquelas compiladas em seu programa cliente, voc pode conectar usando um dos seguintes mtodos: e e Inicie o cliente com --host=nome_mquina --port=nmero_porta para conectar com a u TCP/IP a uma mquina remota, ou com --host=localhost --socket=nome_arquivo a para conectar a mquina local via um socket Unix ou um named pipe do Windowes. a No MySQL 4.1, inicie o cliente com --protocol=tcp para conectar via TCP/IP, -protocol=socket para conectar via socket Unix ou --protocol=pipe para conectar via named pipe, ou --protocol=memory para conectar via memria compartilhada. o Para conexes TCP/IP, voc tambm pode precisar especicar as opes --host e o e e co --port. Para outros tipos de conexes, voc pode precisar especicar uma opo o e ca --socket para denir um nome de socket ou named pipe name, ou uma opo -ca shared-memory-base-name para especicar o nome da memria compartilhada. o

226

MySQL Technical Reference for Version 5.0.0-alpha

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

4.3 Detalhes Gerais de Segurana e o Sistema de Privilgio c e de Acesso do MySQL


O MySQL tem um sistema de segurana/privilgios avanado mas no padro. A prxima c e c a a o seo descreve como ele funciona. ca

4.3.1 Segurana Geral c


Qualquer um usando o MySQL em um computador conectado ` internet deve ler esta seo a ca para evitar os erros de segurana mais comuns. c Discutindo segurana, ns enfatizamos a a necessidade de proteger completamente o servic o dor (no simplesmente o servidor MySQL) contra todos os tipos de ataques aplicveis: a a eavesdropping, altering, playback e denial of service. No cobriremos todos os aspectos de a disponibilidade e tolerncia a falhas aqui. a O MySQL utiliza a segurana baseado em Listas de Controle de Acesso (ACL) para todas c conexes, consultas e outras operaes que um usurio pode tentar realizar. Existe tambm o co a e algum suporte para conexes criptografadasSSL entre clientes MySQL e servidores. Vrios o a dos conceitos discutidos aqui no so espec a a icos do MySQL; as mesmas idias podem ser e aplicadas para a maioria das aplicaes. co Quando executando o MySQL, siga estes procedimentos sempre que poss ivel: nunca conceda a algum (exceto ao usurio root do mysql) acesso ` tabela user no e a a banco de dados mysql!. Isto perigoso. A senha criptografada a senha real no e e MySQL. Se voc conhece a senha listada na tabela user para um determinado usurio, e a voc pode facilmente logar como este usurio se tiver acesso ` mquina relacionada e a a a para aquela conta.

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 4: Administrao do Bancos de Dados MySQL 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

4.3.2 Como Tornar o MySQL Seguro contra Crackers


Quando voc conectar a um servidor MySQL, voc normalmente deve usar uma senha. A e e senha no transmitida em texto puro sobre a conexo, porm o algor a e a e itimo de criptograca no muito forte e com algum esforo um atacante engenhoso pode quebrar a senha se ele a e c conseguir capturar o trfego entre o cliente e o servidor. Se a conexo entre o cliente e o a a servidor passar por uma rede no convel, voc deve usar um tunnel SSH para criptografar a a e a comunicao. ca Todas outras informaes so transferidas como texto que podem ser lido por qualquer um co a que consiga ver a conexo. Se voc se preocupa com isto, voc pode usar o protocol de a e e compresso (No MySQL verso 3.22 e superiores) para tornar o trco muito mais dicil a a a de decifrar. Para deixar tudo ainda mais seguro voc deve usar ssh. Voc pode encontrar e e um cliente ssh open source em http://www.openssh.org, e um cliente ssh comercial em http://www.ssh.com. Com isto, voc pode obter uma conexo TCP/IP critografada entre e a um servidor MySQL e um cliente MySQL. Se voc estiver usando o MySQL 4.0, voc tambm pode usar o suporte interno OpenSSL e e e Veja Seo 4.4.10 [Conexes seguras], Pgina 268. ca o a Para deixar um sistema MySQL seguro, voc deve considerar as seguintes sugestes: e o Utilize senhas para todos os usurios MySQL. Lembre-se que qualquer um pode logar a como qualquer outra pessoa simplesmente com mysql -u outro_usurio nome_bd se a outro_usurio no tiver senha. Isto um procedimento comum com aplicaes a a e co cliente/servidor que o cliente pode especicar qualquer nome de usurio. Voc pode a e alterar a senha de todos seus usurios editando o script mysql_install_db antes de a execut-lo ou somente a senha para o usurio root do MySQL desta forma: a a shell> mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD(nova_senha) -> WHERE user=root; mysql> FLUSH PRIVILEGES; No execute o daemon do MySQL como o usurio root do Unix. Isto muito perigoso, a a e porque qualquer usurio com privilgios FILE estar apto a criar arquivos como o root a e a (por exemplo, ~root/.bashrc). Para prevenir esta situao, mysqld ir recusar a ca a execuo como root a menos que ele seja especicado diretamente usando a opo ca ca --user=root. O mysqld pode ser executado como um usurio normal sem privilgios. Voc pode a e e tambm criar um novo usurio Unix mysql para tornar tudo mais seguro. Se voc e a e executar o mysqld como outro usurio Unix, voc no precisar alterar o usurio root a e a a a na tabela user, porque nomes de usurio do MySQL no tem nada a ver com nomes a a

230

MySQL Technical Reference for Version 5.0.0-alpha

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

4.3.3 Opes de Inicializao para o mysqld em Relao a co ca ca Segurana. c


As seguintes opes do mysqld afetam a segurana: co c --local-infile[=(0|1)] Se algum usa --local-infile=0 ento no de pode usar LOAD DATA LOCAL e a a INFILE.

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

4.3.4 Detalhes de Segurana com LOAD DATA LOCAL c


No MySQL 3.23.49 e MySQL 4.0.2 (4.0.13 no Windows), adicionamos algumas novas opes co para lidar com possiveis detalhes de segurana junto ao LOAD DATA LOCAL. c Exstem dois problemas possiveis com o suporte a este comando: Como a leitura deste arquivo iniciada por um servidor, pode-se teoricamente criar um e servidor MySQL corrigido que poderia ler qualquer arquivo na mquina cliente na qual o a usurio atual tenha acesso, quando o cliente envia uma consulta a tabela. a Em um ambiente web onde os clientes esto conectados a um servidor web, um usurio a a poderia usar LOAD DATA LOCAL para ler qualquer arquivo no qual o processo do servidor web

232

MySQL Technical Reference for Version 5.0.0-alpha

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

4.3.5 O Que o Sistema de Privilgios Faz e


A funo primria do sistema de privilgios do MySQL autenticar um usurio a partir de ca a e e a uma determinada mquina e associar este usurio com privilgios a banco de dados como a a e como select, insert, update e delete. Funcionalidades adicionais incluem a habilidade de ter um usurio annimo e conceder a o privilgio para funes espec e co icas do MySQL como em LOAD DATA INFILE e operaes adco ministrativas.

4.3.6 Como o Sistema de Privilgios Funciona e


O sistema de privilgios do MySQL garante que todos usurios possam fazer exatamente as e a operaes que lhe permitido. Quando voc conecta a um servidor MySQL, sua identidade co e e e determinada pela maquina de onde voc conectou e o nome de usurio que voc especicou. e a e O sistema concede privilgios de acordo com sua identidade e com o que voc deseja fazer. e e O MySQL considera tanto os nomes de mquinas como os nomes de usurios porque existem a a poucas razes para assumir que um determinado nome de usurio pertence a mesma pessoa o a em todo lugar na Internet. Por exemplo, o usurio bill que conecta de whitehouse.gov no a a deve necessariamente ser a mesma pessoa que o usurio bill que conecta da microsoft.com a O MySQL lida com isto, permitindo a distino de usurios em diferentes mquinas que ca a a podem ter o mesmo nome: Voc pode conceder a bill um conjunto de privilgios para e e conexes de whitehouse.gov e um conjunto diferente de privilgios para conexes de o e o microsoft.com. O controle de acesso do MySQL composto de dois estgios: e a Estgio 1: O servidor confere se voc pode ter acesso ou no. a e a Estgio 2: Assumindo que voc pode conectar, o servidor verica cada requisio feita a e ca para saber se voc tem ou no privilgios sucientes para realizar a operao. Por e a e ca exemplo, se voc tentar selecionar linha de uma tabela em um banco de dados ou e

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

Create_tmp_ table_priv Lock_tables_ priv

Create_tmp_ table_priv Lock_tables_ priv

234

MySQL Technical Reference for Version 5.0.0-alpha

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

Campos privilgio e Outros campos

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)

(CHAR(60) para as tabelas tables_priv e columns_ priv)

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

4.3.7 Privilgios Fornecidos pelo MySQL e


Informaes sobre privilgios de usurios so armazenados nas tabelas user, db, host, co e a a tables_priv e columns_priv no banco de dados chamado mysql. O servidor MySQL l o e contedo destas tabelas quando ele inicia e sob as circunstncias indicadas em Seo 4.4.3 u a ca [Privilege changes], Pgina 260. a Os nomes usados neste manual que se referem-se aos privilgios fornecidos pelo MySQL e so vistos abaixo juntos com o nome da coluna associada com cada privilgio nas tabelas a e de permisso e o contexto em que o privilgio se aplica. Informaes adicionais sobre o a e co signicado de cada privilgio pode ser encontrado em Seo 4.4.1 [GRANT], Pgina 254. e ca a Privilgio e ALTER DELETE INDEX INSERT SELECT UPDATE CREATE DROP GRANT REFERENCES CREATE TEMPORARY TABLES EXECUTE FILE LOCK TABLES PROCESS RELOAD REPLICATION CLIENT REPLICATION SLAVE SHOW DATABASES Coluna Alter_priv Delete_priv Index_priv Insert_priv Select_priv Update_priv Create_priv Drop_priv Grant_priv References_ priv Create_tmp_ tabela_priv Execute_priv File_priv Lock_ tabelas_priv Process_priv Reload_priv Repl_client_ priv Repl_slave_ priv Show_db_priv Contexto tabelas tabelas tabelas tabelas tabelas tabelas banco de dados, tabelas, ou indices banco de dados ou tabelas banco de dados ou tabelas banco de dados ou tabelas administrao do servidor ca administrao do servidor ca acessa a arquivos no servidor administrao do servidor ca administrao do servidor ca administrao do servidor ca administrao do servidor ca administrao do servidor ca administrao do servidor ca

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

237

SHUTDOWN SUPER

Shutdown_ priv Super_priv

administrao do servidor ca administrao do servidor ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

4.3.8 Conectando ao Servidor MySQL


Programas clientes do MySQL geralmente necessitam de parmetros de conexo quando a a voc precisar acessar um servidor MySQL: a mquina na qual voc deseja se conectar, seu e a e nome de usurio e sua senha. Por exemplo, o cliente mysql pode ser iniciado desta forma a (argumentos opcionais so colocandos entre [ e ]): a shell> mysql [-h nome_mquina] [-u nome_usurio] [-psua_senha] a a Formas alternativas das opes -h, -u e -p so --host=nome_mquina, --user=nome_ co a a usurio e --password=sua_senha. Perceba que no existe espao entre -p ou --password= a a c e a senha que deve vir a seguir. NOTA: Especicar a senha na linha de comando no seguro! Qualquer usurio no seus a e a sistema pode saber sua senha digitando um comando do tipo: ps auxww. Veja Seo 4.1.2 ca [Option les], Pgina 216. a O mysql utiliza valores padro para parmetros de conexo que no so passados pela linha a a a a a de comando:

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

4.3.9 Controle de Acesso, Estgio 1: Vericao da Conexo a ca a


Quando voc tenta se conectar a um servidor MySQL, o servidor aceita ou rejeita a conexo e a baseado na sua identidade e se pode ou no vericar sua identidade fornecendo a senha a correta. Seno, o servidor nega o acesso a voc completamente. De outra forma, o servidor a e aceita a conexo, entra no estgio 2 e espera por requisiies. a a co Sua identidade baseada em duas partes de informao: e ca A mquina de onde est conectando a a Seu nome de usurio no MySQL a A conferncia da identidade feita utilizando os tres campos de escopo da tabela user e e (Host, User e Password). O servidor aceita a conexo somente se uma entrada na tabela a user coincidir com a mquina, nome de usurio e a senha fornecidos. a a Valores dos campos escopo na tabela user podem ser especicados como segue: Um valor Host deve ser um nome de mquina ou um nmero IP ou localhost para a u indicar a mquina local. a Voc pode utilizar os metacaracteres % e _ no campo Host. e

240

MySQL Technical Reference for Version 5.0.0-alpha

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 david@192.58.197.0/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

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

4.3.10 Controle de Acesso, Estgio 2: Vericao da Requisio a ca ca


Uma vez estabelecida uma conexo, o servidor entra no 2o estgio. Para cada requisio a a ca que vem na conexo, o servidor verica se voc tem privilgios sucientes para realiz-la, a e e a baseado nas operaes que voc deseja fazer. E aqui que os campos de concesses nas tabelas co e o de permisses entram em ao. Estes privilgios pode vir de qualquer uma das tabelas user, o ca e db, host, tables_priv ou columns_priv. As tabelas de permisses so manipuladas com o a os comandos GRANT e REVOKE. Veja Seo 4.4.1 [GRANT], Pgina 254. (Voc pode achar util ca a e fazer referencia a Seo 4.3.6 [Privileges], Pgina 232, que lista os campos presentes em ca a cada uma das tabelas de permisses.) o A tabela user concede privilgios que so especicados por voc em uma base global e que e a e se aplicam sem importar qual o banco de dados atual. Por exemplo, se a tabela user e

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

4.3.11 Hashing de Senhas no MySQL 4.1


As contas de usurios do MySQL esto lisatadas na tabela user do banco de dados mysql. a a Para cada conta do MySQL denida uma senha, no entanto o que est armazenado na e a coluna Password da tabela user no seja uma verso da senha em texto puro, mas um valor a a hash computado para ela. Valores hash de senha so calculados pela funo PASSWORD(). a ca O MySQL usa senhas em duas fases da comunicao cliente/servidor: ca Primeiro, quando um cliente tenta se conectar ao servidor, existe uma etapa de autenticao inicial na qual o cliente deve apresentar uma senha que combina com o valor ca hash armazenado na tabela de usurios para a conta que aquele cliente deseja usar. a Em segundo lugar, depois que o cliente conecta, ele pode congurar ou alterar o hash da senha para as contas listadas na tabela de usurio (se ele tiver privilgios sucientes).O a e cliente pode fazer isto usando a funo PASSWORD() para gerar uma hash da senha ca ou usando as instrues GRANT ou SET PASSWORD. co Em outra palavras, o servidor usa valores hash durante a autenticao quando um cliente ca tenta a primeira conexo. O servidor gera os valores hash se um cliente conectado chama a a funo PASSWORD() ou usa uma instruo GRANT ou SET PASSWORD para denir ou alterar ca ca uma senha. O mecanismo de hash da senha foi atualizado no MySQL 4.1 para fornecer melhor segurana c e reduzir os riscos de senhas serem roubadas. No entanto, Este novo mecanismo s o e interpretado pelo servidor 4.1 e clientes 4.1, que podem resultar em alguns problemas de compatibilidade. Um cliente 4.1 pode conectar a um servidor pre-4.1, porque o cliente entende tanto o antigo quanto o novo mecanismo hash de senha. No entanto, um cliente pre-4.1 que tentar se conectar a um servidor 4.1 pode encontrar diculdades. Por exemplo, um cliente mysql 4.0 que tentar se conectar a um servidor 4.1 pode falhar com a seguinte mensagem de erro: shell> mysql Client does not support authentication protocol requested by server; consider upgrading MySQL client

246

MySQL Technical Reference for Version 5.0.0-alpha

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.

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 4: Administrao do Bancos de Dados MySQL 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

Implicaoes de Alterao de Hashes de Senha para Aplicativos c ca


Um atualizao para o MySQL 4.1 para trazer problemas de compatibilidade para aplicaes ca co que usam PASSWORD() para gerar senha para os seus prprios propsitos. (Aplicativos o o no devem fazer isto, porque PASSWORD() deve ser usado paenas para gerenciar contas do a MySQL. Mas algumas aplicaes usam PASSWORD() para seus prprios propsitos.) Se voc co o o e atualizar para o MySQL 4.1 e executar o servidor sob condies onde ele gera hashes de co senha longo, uma aplicao que usa PASSWORD() para as suas prprias senhas ir falhar. O ca o a curso de ao recomendado modicar o aplicativo para usar outras funes como SHA1() ca e co ou MD5() para produzir valores de hash. Se isto no for poss voc pode utilizar a funo a ivel e ca OLD_PASSWORD(), que fornecida para gerar hashes curtos no formato antigo. (Mas note e que OLD_PASSWORD() pode vir a no ser mais suportado.) a Se o servidor est rodando sob circuntncias onde ele gera hashes de senha curtos, OLD_ a a mas equivalente a PASSWORD(). PASSWORD() est disponivel a e Hash de senhas no MySQL 4.1.0 difere do hash no 4.1.1 e acima. As diferenas da verso c a 4.1.0 so as seguintes: a Hashes de senhas de 45 bytes em vez de 41 bytes. A funo PASSWORD() no repetit ca a e ivel. Isto , com um dado argumento X, successivas e chamadas a PASSWORD(X) geram diferentes resultados.

250

MySQL Technical Reference for Version 5.0.0-alpha

4.3.12 Causas dos Erros de Accesso Negado


Se voc encontrar erros de Accesso Negado (Access denied) quando tentar conectar-se ao e servidor MySQL, a lista abaixo indica alguns caminhos que voc pode seguir para corrigir e o problema: Depois de instalar o MySQL, voc executou o script mysql_install_db para congurar e o contedo inicial das tabelas de permisses ? Se no, faa isto. Veja Seo 4.4.4 u o a c ca [Default privileges], Pgina 260. Testes os privilgios iniciais executando este comando: a e shell> mysql -u root test O servidor deve deixar voc conectar sem erros. Voc tambm deve assegurar que e e e exista o arquivo user.MYD no diretrio do banco de dados do MySQL. Normalmente o ele ca em CAMINHO/var/mysql/user.MYD. onde CAMINHO o caminho para a raiz da e instalao do MySQL. ca Depois de terminar uma instalao, voc deve conectar ao servidor e congurar seus ca e usurios e suas permisses de acesso. a o shell> mysql -u root mysql O servidor deve permitir a conexo pois o usurio root MySQL vem inicialmente a a congurado sem senha. Isto tambm um risco de segurana, portanto congurar e e c a senha do usurio root algo que deve ser feito enquanto voc congura os outros a e e usurios do MySQL. a Se voc tentar se conectar como root e obter este erro: e Access denied for user: @unknown to database mysql isto signica que voc no possui um registro na tabela user com o valor root no e a campo User e que o mysqld no pode rsolver o nome de mquina do cliente. Neste caso, a a voc deve reiniciar o servidor com a opo --skip-grant-tables e editar seu arquivo e ca /etc/hosts ou o \Windows\hosts para adicionar uma entrada para sua mquina. a Se voc obter um erro como o seguinte: e shell> mysqladmin -u root -pxxxx ver Access denied for user: root@localhost (Using password: YES) Signica que voc est usando uma senha incorreta. Veja Seo 4.4.8 [Passwords], e a ca Pgina 266. a Se voc esqueceu a senha de root, voc pode reiniciar o mysqld com a opo -e e ca skip-grant-tables para alterar a senha. Veja Seo A.4.2 [Resetting permissions], ca Pgina 927. a Se voc obter o erro acima mesmo se no tiver congurado uma senha, signica que e a voc tem algum arquivo my.ini congurado para passar alguma senha incorreta. Veja e Seo 4.1.2 [Option les], Pgina 216. Voc pode evitar o uso de arquivos de opes ca a e co com a opo --no-defaults, como a seguir: ca shell> mysqladmin --no-defaults -u root ver Se voc atualizou uma instalao existente do MySQL de um verso anterior e ca a a ` verso 3.22.11 para a Verso 3.22.11 ou posterior, voc executou o script a a e mysql_fix_privilege_tabels ? Se no faa isto. A estrutura das tabelas de a c permisses alteraram com a Verso 3.22.11 do MySQL quando a instruo GRANT se o a ca tornou funcional. Veja Seo 2.5.6 [Upgrading-grant-tables], Pgina 130. ca a

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

4.4 Gerenciamento das Contas dos Usurios no MySQL a


4.4.1 A Sintaxe de GRANT e REVOKE
GRANT priv_type [(column_list)] [, tipo_priv [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY [PASSWORD] password] [, user_name [IDENTIFIED BY [PASSWORD] password] ...] [REQUIRE NONE | [{SSL| X509}] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # | MAX_UPDATES_PER_HOUR # | MAX_CONNECTIONS_PER_HOUR #]] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} FROM user_name [, user_name ...] O comando GRANT implementado no MySQL verso 3.22.11 ou posterior. Para verses e a o anteriores do MySQL, a instruo GRANT no faz nada. ca a Os comandos GRANT e REVOKE permitem aos administradores do sistema criar usurios e a conceder e revogar direitos aos usurios do MySQL em quatro n a iveis de privilgios: e N Global ivel Privilgios globais aplicam para todos os bancos de dados em um determinado e servidor. Estes privilgios so armazenados na tabela mysql.user. GRANT ALL e a ON *.* e REVOKE ALL ON *.* concedero e revogaro apenas privilgios globais. a a e

Cap tulo 4: Administrao do Bancos de Dados MySQL 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

UPDATE USAGE GRANT OPTION

USAGE pode ser usado quando voc quer criar um usurio sem privilgios. e a e

256

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

259

Para uma descrio do uso de REQUIRE, veja Seo 4.4.10 [Secure connections], Pgina 268. ca ca a

4.4.2 Nomes de Usurios e Senhas do MySQL a


Existem vrias diferenas entre a forma que nomes de usurios e senhas so usados pelo a c a a MySQL e a forma que so usados pelo Unix ou Windows: a Nomes de usurios, como usado pelo MySQL para propsitos de autenticao, no tem a o ca a nenhuma relao com os nomes de usurios do Unix (nomes de login) ou nomes de ca a usurios Windows. A maioria dos clientes MySQL, por padro, tentam se conectar a a utilizando o nome de usurio atual do Unix como o nome de usurio no MySQL, mas a a isto existe somente por convenincia. Programas clientes permite especicar um nome e diferente com as opes -u ou --user. Isto signica que voc no pode tornar um co e a banco de dados seguro a menos que todos os usurios do MySQL possuam senhas. a Qualquer um pode tentar se conectar ao servidor utilizando qualquer nome, e eles se conectaro com qualquer nome que no possua uma senha. a a Nomes de usurios MySQL podem ter o tamanho de at 16 caracteres; Nomes de a e usurio Unix normalmente so limitados at 8 caracteres. a a e Senhas MySQL no tem nenhuma relao com senhas Unix. No existe nenhuma a ca a associao entre a senha em que voc utiliza para logar-se a uma mquina Unix e a ca e a senha que utilizada para acessar um banco de dados na mesma mquina. e a O MySQL criptografa senhas utilizando um algor itimo diferente que o utilizado pelo processo de login do Unix. Veja as descries das funes PASSWORD() e ENCRYPT() em co co Seo 6.3.6.2 [Miscellaneous functions], Pgina 547. Perceba que mesmo que a senha ca a e armazenada embaralhada, o conhecimento da sua senha embaralhada o suciente e para conseguir se conectar ao servidor MySQL! A partir da verso 4.1, o MySQL emprega um mecanismo de senha e login diferentes a que seguro mesmo se for feito um sni no pacote TCP/IP e/ou o banco de dados e mysql for capturado. Usurios MySQL e seus privilgios so criados normalmente com o comando GRANT, Veja a e a Seo 4.4.1 [GRANT], Pgina 254. ca a Quando voc se conecta a um servidor MySQL com um cliente de linha de comando e voc pode especicar a senha com --password=sua-senha. Veja Seo 4.3.8 [Connecting], e ca Pgina 238. a mysql --user=monty --password=guess nome_do_banco Se voc deseja que o cliente lhe solicite a senha, deve ser especicado o parmetro -e a password sem nenhum argumento mysql --user=monty --password nome_do_banco ou no formato curto: mysql -u monty -p nome_do_banco Perceba que no ultimo exemplo a senha no nome do banco. a e Se voc deseja usar a opo -p para fornecer uma senha voc deve fazer assim: e ca e mysql -u monty -pguess database_name

260

MySQL Technical Reference for Version 5.0.0-alpha

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.

4.4.3 Quando as Alteraoes nos Privilgios tem Efeito c e


Quando o mysqld inicia, todas o contedo das tabelas de permisses so lidos em memria u o a o e tem efeito neste momento. As modicaes das tabelas de permisses que voc realiza utilizando GRANT, REVOKE ou co o e SET PASSWORD so imediatamente reconhecidas pelo servidor. a Se voc alterar as tabelas de permisses manualmente (utilizando INSERT, UPDATE, etc), voc e o e deve executar a instruo FLUSH PRIVILEGES ou executar mysqladmin flush-privileges ca ou mysqladmin reload para dizer ao servidor para recarregar as tabelas de permisses. De o outra forma suas alteraes no tero efeito at que o servidor seja reiniciado. Se voc co a a e e alterar as tabelas de permisses manualmente mas se esquecer de recarregar os privilgios, o e suas alterao vo parecer no ter feito nenhuma diferena! ca a a c Quando o servidor reconhecer que as tabelas de permisses foram alteradas, conexes exiso o tentes so afetadas da seguinte forma: a Alteraes nos privilgios de tabelas e colunas fazem efeito com a prxima requisio co e o ca do cliente. Alteraes nos privilgios de bancos de dados fazem efeito no prximo comando USE co e o nome_bd. Alteraes nos privilgios globais e alteraes de senhas fazem efeito na prxima vez co e co o que o cliente conectar.

4.4.4 Congurando os Privilgios Iniciais do MySQL e


Depois de instalar o MySQL, voc congura os privilgios iniciais dos acessos executando e e scripts/mysql_install_db. Veja Seo 2.3.1 [Quick install], Pgina 95. O script mysql_ ca a install_db inicia o servidor mysqld, depois inicializa as tabelas de permisses com a o seguinte congurao dos privilgios: ca e O usurio root do MySQL criado como um superusurio que pode fazer qualquer a e a coisa. Conexes devem ser feitas atravs da mquina local. o e a NOTA: A senha inicial de root vazia, portanto qualquer um que conectar como root e sem senha ter direito a todos os privilgios. a e Um usurio annimo criado e pode fazer o que desejar com bancos de dados com a o e nome test ou iniciando com test_. Conexes devem ser feitas da mquina local. o a Isto signica que usurios locais podem se conectar sem senha e serem tratados como a usurios annimos. a o Outros privilgios so negados. Por exemplo, usurios normais no podem executar e a a a mysqladmin ou mysqladmin processlist. NOTA: Os privilgios padres so diferentes no Windows. Veja Seo 2.1.1.8 [Executando e o a ca o Windows], Pgina 68. a

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

4.4.5 Adicionando Novos Usurios ao MySQL a


Existem duas maneiras de adicionar usurios: utilizando instrues GRANT ou manipulando a co as tabelas de permisses do MySQL diretamente. O mtodo preferido utilizar instrues o e e co

262

MySQL Technical Reference for Version 5.0.0-alpha

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

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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 custom@whitehouse.gov IDENTIFIED BY obscure; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO custom@server.domain IDENTIFIED BY obscure;

Para congurar os 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 Technical Reference for Version 5.0.0-alpha

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;

4.4.6 Deletando Usurios do MySQL a


DROP USER nome_usuario Este comando foi adicionado ao MySQL 4.1.1.

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

4.4.7 Limitando os Recursos dos Usurios a


A partir do MySQL 4.0.2 pode se limitar certos recursos por usurios. a At ento, o unico mtodo dispon de limitao de uso do servidor MySQL era cangurar e a e ivel ca a varivel de inicializao max_user_connections para um valor diferente de zero. Mas a ca este mtodo estritamente global e no permite o gerenciamento de usurios individuais, e e a a o que pode ser de interresse particular do Provedor de Servios Internet. c Consequentemente, o gerenciamento de trs recursos introduzido no n de usurio ine e ivel a dividual: Nmero de todas as consultas por hora: Todos os comandos que podiam ser executados u por um usurio. a Nmero de todas as atualizaes por hora: Qualquer comando que altera qualquer u co tabela ou banco de dados. Nmeor de conexes feitas por hora: Novas conexes abertas por hora. u o o Um usurio no contexto mencionado acima uma unica entrada na tabela user, que a e e identicada unicamente por suas colunas user e host. Todos os usurios no so limitados por padro no uso dos recursos acima, a menos que a a a a os limites sejam garantidos a eles. Estes limites podem ser concedidos apenas atravs do e GRANT (*.*) global, usando esta sintaxe: GRANT ... WITH MAX_QUERIES_PER_HOUR N1 MAX_UPDATES_PER_HOUR N2 MAX_CONNECTIONS_PER_HOUR N3; Pode-se especicar qualquer combinao dos recursos acima. N1, N2 e N3 so inteiros e ca a signicam contagem/hora. Se os usurios alcanam o limite de conexes dentro de uma hora, no ser aceita mais a c o a a nenhuma conexo at o m desta hora. De forma parecida se o usurio alcana o limite do a e a c nmero de consultas ou atualizaes, consultas ou atualizaes adicionais sero rejeitadas u co co a at que a hora acabe. Em todos os casos, uma mensagem de erro apropriada enviada. e e

266

MySQL Technical Reference for Version 5.0.0-alpha

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

4.4.8 Congurando Senhas


Na maioria dos casos voc deve utilizar GRANT para congurar seus usurios e senhas, pore a tanto, as informaes exibidas a seguir so aplicadas somentes para usurios avanados. co a a c Veja Seo 4.4.1 [GRANT], Pgina 254. ca a Os exemplos nas sees precedentes ilustram um princ co ipio importante: quando voc are mazena uma senha no-vazia utilizando INSERT ou UPDATE voc deve utilizar a funo a e ca PASSWORD() para criptograf-la. Isto porque a tabela user armazena senhas na forma a e criptografada, e no como texto puro. Se voc esquecer deste fato, provvel que voc a e e a e possa tentar congurar senhas desta forma: shell> mysql -u root mysql mysql> INSERT INTO user (Host,User,Password) VALUES(%,jeffrey,biscuit); mysql> FLUSH PRIVILEGES; O resultado que o valor biscuit armazenado como a senha na tabela user. Quando e e o usurio jeffrey tentar se conectar ao servidor utilizando esta senha, o cliente mysql a a criptografa utilizando a funo PASSWORD(), gerando um vetor de autenticao baseado em ca ca uma senha criptografada e um nmero randmico, obtido do servidor, e envia o resultado u o ao servidor. O servidor usa o valor do campo password na tabela user (que o valor e biscuit no criptografado ) para realizar os mesmos clculos e comparar os resultados. a a A comparao falha e o servidor rejeita a conexo: ca a shell> mysql -u jeffrey -pbiscuit test Access denied As senhas devem ser criptografadas quando elas so inseridas na tabela user, portanto a a instruo INSERT deveria ter sido informada no seguinte formato: ca mysql> INSERT INTO user (Host,User,Password) VALUES(%,jeffrey,PASSWORD(biscuit)); Voc deve tambm utilizar a funo PASSWORD() quando utilizar instrues SET PASSWORD: e e ca co mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD(biscuit); Se voc congurar senhas utilizando a instruo GRANT ... IDENTIFIED BY ou o comando e ca mysqladmin password, a funo PASSWORD() desnecessria. Ambos tomam o cuidado de ca e a criptografar a senha para voc, ento voc deve especicar a senha biscuit desta forma: e a e

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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

4.4.9 Mantendo Sua Senha Segura


No aconselhvel especicar uma senha de uma forma que a exponha e possa ser descoberta a e a por outros usurios. Os mtodos que voc pode usar para especicar sua senha quando a e e executar programas clientes so listados abaixo, juntamente com as determinaes de riscos a co de cada mtodo: e Nunca fornea a um usurio normal acesso ` tabela mysql.user. O conhecimento de c a a uma senha criptografada possibilita a conexo como este usurio. As senhas s esto a a o a chegar ` senha real que foi usada (acontece embaralhadas para que no seja possivel a a muito a utilizao de senhas similares em outras aplicaes). ca co Uso da opo -psua_senha ou --password=sua_senha na linha de comando. Isto ca e conveniente mas inseguro, porque sua senha se torna vis ivel para programas de informao do sistema (como no ps) que pode ser chamado por outros usurios para ca a exibir linhas de comando. (clientes MySQL normalmente gravam zeros em cima do argumento da linha de comando durante sua sequncia de inicializao, mas ainda existe e ca um breve intervalo no qual o valor est visivel.) a Uso das opes -p ou --pasword (sem especicar o valor sua_senha). Neste caso, o co programa cliente solicita a senha do terminal: shell> mysql -u user_name -p Enter password: ******** Os caracteres * representam sua senha. E mais seguro digitar sua senha desta forma do que especic-la na linha de comando a porque ela no ca vis a outros usurios. Entretanto este mtodo de digitar uma a ivel a e senha vlido somente para programas que voc executa de forma interativa. Se voc e a e e deseja chamar um cliente de um script que no execute interativamente, no existir a a a oportunidade de digitar a senha do terminal. Em alguns sistemas, voc pode descobrir e que a primeira linha do seu script lida e interpretada (incorretamente) como sua e senha! Armazenar a sua senha em um arquivo de congurao. Por exemplo, voc pode listar ca e sua senha na seo [client] do arquivo .my.cnf no seu diretrio home: ca o [client] password=sua_senha Se voc armazenar sua senha em um arquivo .my.cnf, o arquivo no pode ser lido por e a seu grupo ou pelos outros usurios. Tenha certeza que o modo de acesso do arquivo a e 400 ou 600 Veja Seo 4.1.2 [Option les], Pgina 216. ca a Voc pode armazenar sua senha na varivel de ambiente MYSQL_PWD, mas este mtodo e a e deve ser considerado extremamente inseguro e no deve ser usado. Algumas verses a o de ps incluem uma opo para exibir o ambiente de processos em execuo; sua senha ca ca estaria em texto puro para a leitura para todos os usurios. Mesmo em sistemas sem a

268

MySQL Technical Reference for Version 5.0.0-alpha

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.

4.4.10 Usando Conexes Seguras o 4.4.10.1 Conceitos Basicos


A partir da verso 4.0.0, o MySQL tem suporte a conexes cri[ptografadas com SSL. Para a o entender como o MySQL usa SSL, necessrio explicar alguns conceits bsicos de SSL e e a a X509. A pessoal que j esto familiarizada com eles podem saltar esta parte. a a Por padro o MySQL no usa conexes criptografadas entre o cliente e o servidor. Isto a a o signica que qualquer um pode observar todo o trco e ver os dados enviados e recebidos. a Podiase at mesmo alterar os dados enquanto eles estavam em transito entre o cliente e o e servidor. Algumas vezes voc precisao mover informaes sobre redes pblicas de um modo e co u seguro; em tais casos, usar uma conexo sem criptograa inaceitvel. a e a SSL um protocolo que utiliza diferentes algor e itimos de criptograa para assegurar que os dados recebidos por uma rede pblica so conveis. Ele tem um mecanismo para detectar u a a qualquer alterao, perda ou reenvio de dados. SSL tambm incorpora algoritmos para ca e reconhecer e fornecer identidades de vericao usando o padro X509. ca a Criptograa o modo de tornar qualquer tipo de dado ileg e ivel. De fato, as prticas de a hoje precisam de muitos elementos de segurana adicionais para algoritmos de criptograa. c Eles devem resistir a muitos tipos de atques conhecidos como apenas alterando a ordem da mensagem criptografada ou emviando o dado duas vezes. X509 um padro que torna poss e a ivel identicar algum na Internet. Ele mais comue e mente usado em aplicaes e-commerce. Em termos bsicos, deve haver algumas empreco a sas (chamadas Autoridades de Certicao) que atribuem certicados eletrnicos para ca o qualquer um que precise deles. Os certicados se baseiam em algor itmos de criptograa assimtricos que possuem duas chaves de criptograa (uma chave pblica e uma chave secreta). e u Um proprietrio de certicado pode provar a sua identidade mostrnado este certicado para a outra parte. Um certicado consiste das chaves pblicas do proprietrio. Qualquer dados u a criptografado com esta chave pblica pode ser descriptografada apenas usando a chave u secreta correspondente, que guardada pelo dono do certicado. e O MySQL no utiliza conexes criptografadas por padro, porque fazendo isto tornaria o a o a protocolo cliente/servidor muito lento. Qualquer tipo de funcionalidade adiocional exige que o conputador faa um trabalho adicional e a criptograa de dados uma operao c e ca intensiva da CPU que exige tempo e pode atrasar o MySQL nas tarefas principais. Por padro o MySQL ajustado para ser o mais rpido poss a e a ivel. Se voc precisa de mais informaes sobre SSL, X509 ou criptograa, voc deve usar se e co e mecanismo de busca favorita na Internet para procurar sobre o assunto que est interessado. a

Cap tulo 4: Administrao do Bancos de Dados MySQL ca

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.

4.4.10.3 Congurando Certicados SSL para o MySQL


Aqui est um exemplo para congurar certicados SSL para o MySQL: a DIR=pwd/openssl PRIV=$DIR/private mkdir $DIR $PRIV $DIR/newcerts cp /usr/share/ssl/openssl.cnf $DIR replace ./demoCA $DIR -- $DIR/openssl.cnf # Crie os aarquivos necessrio: $database, $serial e o diretrio a o $new_certs_dir (opcional) touch $DIR/index.txt echo "01" > $DIR/serial # # Gera~o do Certificate Authority(CA) ca # openssl req -new -x509 -keyout $PRIV/cakey.pem -out $DIR/cacert.pem \ -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/private/cakey.pem Enter PEM pass phrase: Verifying password - Enter PEM pass phrase: -----

270

MySQL Technical Reference for Version 5.0.0-alpha

# # # # # # # # # # # # # #

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 c